Arizona Chris
Joined: 20 Dec 2014 Posts: 69 Location: Arizona
|
Robot / Pic Project Sound Generator Chip - RS232 |
Posted: Sun Sep 13, 2015 12:47 pm |
|
|
This allows you to take the load off your main processor and generate 13 different interesting chirps, peeps, whoops and sirens with your PIC project. I developed these over the years building various robots. The sound chip is a standard PIC16F628a processor and can be addressed with a single byte from any master processor using RS232 protocol and 9600kb speed.
I also have a complete web write up, with schematics and a sound clip:
http://www.schursastrophotography.com/PICprojects/soundchip.html
Here is an example of what the master processor would send over a single wire to the PIC sound chip for a sound:
Code: |
#use rs232(baud=9600, xmit=Pin_B2, bits=8, parity=N,STREAM=SOUND)
s=2 //can be 1 - 13
fputc(s,SOUND);
|
Next, here is the actual code for the sound chip - a standard 16F628a. You can see how much ROM space we are saving on our main processor!
Code: |
//****************************************************************************
//Chris Schur
//(soundchp 16F628)
//Date: 9/7/15
//****************************************************************************
/*Description of this Program:
This program sends out 13 different robot sounds via serial selection from another processor.
*/
//I/O Designations ---------------------------------------------------
// RA0:
// RA1:
// RA2:
// RA3:
// RA4: (Open Collector output)
// RA5: (MCLR)
// RA6: Xtal Output
// RA7: Xtal Input
// RB0: SERIAL INPUT
// RB1:
// RB2:
// RB3: SOUND OUT
// RB4:
// RB5:
// RB6:
// RB7:
//--------------------------------------------------------------------
//Include Files:
#include <16F628.h> //Normally chip, math, etc. used is here.
//Directives and Defines:
#fuses NOPROTECT,HS,NOWDT //xtal is used
#use delay(crystal=10MHz) //xtal speed
#use fast_io(ALL) //must define tris below in main when using this
#use rs232(baud=9600, rcv=Pin_B0, bits=8, parity=N)
#define SPKR Pin_B3
//****************************************************************************
//Global Variables:
int16 n; //counting var
int16 d; //sound delay var
int8 x; //counting var
int8 sound = 0; //selection for sound produced
//****************************************************************************
//Functions/Subroutines, Prototypes:
void beep1(void);
void beep2(void);
void beep3(void);
void euro1(void);
void euro2(void);
void rampdn(void);
void rampup(void);
void tripplewhoop(void);
void siren(void);
void cricket(void);
void tripplecricket(void);
void twodutybeeps(void);
void twodutybeeps2(void);
//****************************************************************************
//-- Main Program
//****************************************************************************
void main(void) {
// Set TRIS I/O directions, define analog inputs, comparators:
set_tris_A(0b01111110);
set_tris_B(0b11110001);
//(analog inputs digital by default)
//Initialize variables and Outputs: --------------------------------------
output_low(SPKR);
//Setup for timers, PWM, and other peripherals:
//----------------------------------------------------------------
//MAIN LOOP:
while (true) {
sound = getc();//select sound
switch (sound) {
case 0:
output_low(SPKR);
break;
case 1:
beep1();
sound = 0;
break;
case 2:
beep2();
sound = 0;
break;
case 3:
beep3();
sound = 0;
break;
case 4:
euro1();
sound = 0;
break;
case 5:
euro2();
sound = 0;
break;
case 6:
rampdn();
sound = 0;
break;
case 7:
rampup();
sound = 0;
break;
case 8:
tripplewhoop();
sound = 0;
break;
case 9:
siren();
sound = 0;
break;
case 10:
cricket();
sound = 0;
break;
case 11:
tripplecricket();
sound = 0;
break;
case 12:
twodutybeeps();
sound = 0;
break;
case 13:
twodutybeeps2();
sound = 0;
break;
} //switch
} //while
} //main
//********* Functions which have prototypes at top of program ****************
//Beep 1: //Short single beep
void beep1(void) {
for(n=1; n<=50; n=n+1) {
output_high(SPKR);
delay_ms(1);
output_low(SPKR);
delay_ms(1);
}
return; }
//Beep2: //double beep
void beep2(void) {
beep1();
delay_ms(50);
beep1();
return; }
//Beep3: //Low tone beep
void beep3(void) {
for(n=1; n<=25; n=n+1) {
output_high(SPKR);
delay_ms(2);
output_low(SPKR);
delay_ms(2); }
return; }
//Euro Beep1: //fast Two tone three times
void euro1(void) {
beep1();
beep3();
beep1();
beep3();
beep1();
beep3();
return; }
//Euro Beep2: //standard slow beep
void euro2(void) {
for(n=1; n<=400; n=n+1) {
output_high(SPKR);
delay_us(650);
output_low(SPKR);
delay_us(650);
}
for(n=1; n<=200; n=n+1) {
output_high(SPKR);
delay_us(1200);
output_low(SPKR);
delay_us(1200); }
for(n=1; n<=400; n=n+1) {
output_high(SPKR);
delay_us(650);
output_low(SPKR);
delay_us(650);
}
for(n=1; n<=200; n=n+1) {
output_high(SPKR);
delay_us(1200);
output_low(SPKR);
delay_us(1200); }
for(n=1; n<=400; n=n+1) {
output_high(SPKR);
delay_us(650);
output_low(SPKR);
delay_us(650);
}
for(n=1; n<=200; n=n+1) {
output_high(SPKR);
delay_us(1200);
output_low(SPKR);
delay_us(1200); }
return; }
//Ramping tones -----------------------------
void rampdn(void) { //high tone to low ramp
d=1500;
for(n=1; n<=500; n=n+1) {
output_high(SPKR);
delay_us(d);
output_low(SPKR);
delay_us(d);
d++; }
return; }
void rampup(void) { //low tone to high ramp
d=1500;
for(n=1; n<=500; n=n+1) {
output_high(SPKR);
delay_us(d);
output_low(SPKR);
delay_us(d);
d--; }
return; }
void tripplewhoop(void) { //go 1200 to 600 us
for(x=1; x<=3; x++) {
d=1200;
for(n=1; n<=200; n=n+1) {
output_high(SPKR);
delay_us(d);
output_low(SPKR);
delay_us(d);
d = d-3;
}
delay_ms(100);
}
return; }
void siren(void) { //sort of a sick sounding up down wail
rampup();
rampdn();
}
// CREATURE SOUNDS:
void cricket(void) { //single chirp
for (x=0; x<=10; x++) {
output_high(SPKR);
delay_us(250);
output_low(SPKR);
delay_us(250); }
delay_ms(20);
for (x=0; x<=10; x++) {
output_high(SPKR);
delay_us(312);
output_low(SPKR);
delay_us(312); }
delay_ms(20);
for (x=0; x<=10; x++) {
output_high(SPKR);
delay_us(312);
output_low(SPKR);
delay_us(312); }
delay_ms(20);
for (x=0; x<=10; x++) {
output_high(SPKR);
delay_us(312);
output_low(SPKR);
delay_us(312); }
delay_ms(20);
for (x=0; x<=10; x++) {
output_high(SPKR);
delay_us(312);
output_low(SPKR);
delay_us(312); }
delay_ms(20);
}
void tripplecricket(void) {
cricket();
delay_ms(600);
cricket();
delay_ms(600);
cricket(); }
void twodutybeeps(void) { //1 khz beeps
//first beep 50% duty:
for(n=1; n<=100; n=n+1) {
output_high(SPKR);
delay_us(500);
output_low(SPKR);
delay_us(500); }
//second beep 10% duty:
for(n=1; n<=100; n=n+1) {
output_high(SPKR);
delay_us(25);
output_low(SPKR);
delay_us(975); }
}
void twodutybeeps2(void) { //1 khz beeps
//first beep 50% duty:
for(n=1; n<=200; n=n+1) {
output_high(SPKR);
delay_us(250);
output_low(SPKR);
delay_us(250); }
//second beep 10% duty:
for(n=1; n<=200; n=n+1) {
output_high(SPKR);
delay_us(25);
output_low(SPKR);
delay_us(475); }
}
|
|
|