/*
* File: noisegenmain.c
* Author: Hans Mikelson
*
* Created on February 13, 2015, 2:42 PM
* Revised February 22, 2015
* This program creates a random sequence of various types of noises
* ranging from computer game like noises to white like noise.
* These are all based on random or periodic on off pulses from the
* microcontroller. This program uses the 12f683 microcontroller but
* should be adaptable to other brands of microcontroller.
*/
#if defined(__XC)
#include <xc.h> /* XC8 General Include File */
#elif defined(HI_TECH_C)
#include <htc.h> /* HiTech General Include File */
#endif
#include <stdint.h> /* For uint8_t definition */
#include <stdbool.h> /* For true/false definition */
#include <stdlib.h> /*rand()*/
#pragma config MCLRE=OFF,CP=OFF,WDTE=OFF,FOSC=INTOSCIO
#define _XTAL_FREQ 4000000
uint8_t sGPIO;
void init()
{
//Configure GPIO Port
ANSEL = 0b00000000; //Configure all GPIO pins as digital
TRISIO = 0b11000100; //Set GP1-5 as outputs and the rest as inputs
OPTION_REGbits.nGPPU = 0;
WPU = 0b00000100; //Enable weak pullups on GP2
//Configuer AD Convertor
ADCON0 = 0x00; //AD disabled
ADRESH = 0x00; //Init the AD Register
//Configure Comparator
CMCON0 = 0xFF; // Comparator is turned off
CMCON1 = 0x00; // Comparator is turned off
//Interrupt configuration
INTCON = 0x00; //Disable all interrupts
}
void vdelay(int n)
{
int i;
for (i=0;i<=n;i++)
{
__delay_us(1);
}
}
void noise1(uint8_t r3) // PWM sweep high f to low f
{
int i,j,r1,r2;
r1=rand() & (r3-1);
r2=r3/r1;
for (j=0;j<r1;j++)
{
for (i=0;i<j;i++)
{
GPIO = 0b11110111;
vdelay(i*r2);
GPIO = 0b11000000;
vdelay((j-i)*r2);
}
for (i=0;i<j;i++)
{
GPIO = 0b11110111;
vdelay((j-i)*r2);
GPIO = 0b11000000;
vdelay(i*r2);
}
}
}
void noise4(uint8_t r3) // PWM sweep low f to high f
{
int i,j,r1,r2;
r1=rand() & (r3-1);
r2=r3/r1;
for (j=r1;j>0;j--)
{
for (i=0;i<r1-j;i++)
{
GPIO = 0b11110111;
vdelay(i*r2);
GPIO = 0b11000000;
vdelay((j-i)*r2);
}
for (i=0;i<r1-j;i++)
{
GPIO = 0b11110111;
vdelay((j-i)*r2);
GPIO = 0b11000000;
vdelay(i*r2);
}
}
}
void noise2(uint8_t r3) //PWM sweep down, laser
{
int i,j,r1,r2;
r1=rand() & (r3-1);
r2=r3/r1;
for (j=r2;j<r1;j++)
{
for (i=0;i<j;i++)
{
GPIO = 0b11110111;
vdelay(r2);
GPIO = 0b11000000;
vdelay((j-i)*r2);
}
}
}
void noise3(uint8_t r3) // Pulse noise with different frequencies
{
int j,r1,r2;
r1=rand() & 2047;
r2 = 32*r3/r1;
for (j=0;j<r2;j++)
{
GPIO = 0b11110111;
vdelay(rand() & (r3-1));
GPIO = 0b11000000;
vdelay(rand() & (r3-1));
}
}
void noise5(uint8_t r3) // Long random clicks
{
int j,r1;
r1=rand() & (r3-1);
for (j=0;j<r1/4;j++)
{
GPIO = 0b11110111;
vdelay(r3*8);
GPIO = 0b11000000;
vdelay(rand());
}
}
void noise6(uint8_t r3) // Short random clicks
{
int j,r1;
r1=rand() & (r3-1);
for (j=0;j<r1/2;j++)
{
GPIO = 0b11110111;
vdelay(r3*2);
GPIO = 0b11000000;
vdelay(rand() & 8191);
}
}
void noise7(uint8_t r3) // PWM sweep low f to high f
{
int i,j,r1,r2;
r1=(rand() & (r3-1))/4;
r2=r3/r1;
for (j=r1;j>0;j--)
{
for (i=0;i<r1-j;i++)
{
GPIO = 0b11110111;
vdelay(i*r2);
GPIO = 0b11000000;
vdelay((j-i)*r2);
vdelay(rand() & ((r3-1)/4));
}
for (i=0;i<r1-j;i++)
{
GPIO = 0b11110111;
vdelay((j-i)*r2);
vdelay(rand() & ((r3-1)/4));
GPIO = 0b11000000;
vdelay(i*r2);
}
}
}
void main()
{
uint8_t ra[8]={2,4,4,8,16,32,64,128};
int r,r4;
init();
r=0;
while(1)
{
//r = rand()&7;
if (GPIObits.GP2 == 0)
{
r=(r+1)%7;
vdelay(1000000);
}
r4=rand()&7;
switch (r)
{
case 1:
noise1(ra[r4]);
//vdelay(rand());
break;
case 2:
noise2(ra[r4]);
//vdelay(rand());
break;
case 3:
noise3(ra[r4]);
//vdelay(rand());
break;
case 4:
noise1(ra[r4]);
noise4(ra[r4]);
//vdelay(rand());
break;
case 5:
noise5(ra[r4]);
//vdelay(rand());
break;
case 6:
noise6(ra[r4]);
//vdelay(rand());
break;
default:
noise7(ra[r4]);
//vdelay(rand());
}
}
}
No comments:
Post a Comment