Ladies and Gents,
I'll ask the question first then expand. Why will the first program, ImperialMarch.bas, play the notes only one time through and requires a reprogram for the notes to be played again and the second, This works, play the notes without having to reprogram the chip? I know the first is set up to loop and the second is triggered but why does the first require a reprogram to play the music?
Background: Someone asked if I could write a program simulating the sounds of the Imperial Death March using a PIC. I had a12F683 a piezo speaker and some time and this is what I came up with. Other than the speaker hooked up to gpio.2 there is a resistor pulling gpio.5 high or low as needed and a resistor pulling gpio.3 high. The first program is just a loop, or it should be, and the second is triggered by a switch.
The first program, imperailmarch.bas, will play the sounds when programmed then won't play them again until the chip is reprogrammed. It will, if left alone long enough, intermittently make a scratchy sound like a modems initial negotiation for speed.
Code:'**************************************************************** '* Name : ImperialMarch.BAS * ''**************************************************************** ' This version will only play one time through and stop. clear @ device mclr_off @ device bod_off @ device fcmen_off @ device ieso_off @ device intrc_osc_noclkout @ device pwrt_on @ device protect_off define osc4 osccon = %01100111 ansel = 0 ' set all ports digital cmcon0 = 7 ' comparators off adcon0 = 0 ' adc off '------------------------variables c con 91 ' converting values to frequency and musical notes a con 105 dsH con 112 f con 99 fH con 114 fsH con 115 gs con 104 cs con 92 d con 95 ds con 96 notta con 97 e con 98 aH con 117 cH con 109 eH con 113 gsh con 116 gH con 115 aS con 106 b con 108 ' end of music speaker var gpio.2 '-------------------------------------------finally the program main: goto playsong pause 1000 goto main ' do it forever playsong: sound speaker, [a,50] sound speaker, [a,50] sound speaker, [a,50] sound speaker, [f,40] sound speaker, [cH,20] sound speaker, [a,50] sound speaker, [f,43] sound speaker, [cH,20] sound speaker, [a,65] pause 150 sound speaker, [eH,40] sound speaker, [eH,40] sound speaker, [eH,40] sound speaker, [fh,30] sound speaker, [cH,12] sound speaker, [gS,40] sound speaker, [f,33] sound speaker, [cH,12] sound speaker, [a,55] pause 150 return end ' supposed to put an end to the program
The second program, This works.bas, will play the notes anytime I drag GPIO.5 low.
If anyone can expound upon why one works and the other doesn't I'd appreciate your input.Code:'**************************************************************** '* Name : thisworks.BAS * * '**************************************************************** ' This version will replay the march each time gpio.5 is brought low. ' It draws less than 40uA typically but if allowed to rest long enough ' it will wander up to around 200uA. Why it changes I also don't understand. ' *** clear @ device mclr_off @ device bod_off @ device fcmen_off @ device ieso_off @ device intrc_osc_noclkout @ device pwrt_on @ device protect_off define osc4 osccon = %01100111 ansel = 0 ' set all ports digital cmcon0 = 7 ' comparators off adcon0 = 0 ' adc off '------------------------variables c con 91 ' converting values to frequency corresponding to musical notes a con 105 dsH con 112 f con 99 fH con 114 fsH con 115 gs con 104 cs con 92 d con 95 ds con 96 notta con 97 e con 98 aH con 117 cH con 109 eH con 113 gsh con 116 gH con 115 aS con 106 b con 108 ' end of music speaker var gpio.2 '-----------------------------begin program main: If gpio.5 = 0 then sound speaker, [a,40,a,40,a,40,f,30,cH,12,a,40,f,33,cH,12,a,55] pause 150 sound speaker, [eH,40,eH,40,eH,40,fh,30,cH,12,gS,40,f,33,cH,12,a,55] endif nap 5 goto main end ' supposed to put an end to the program




Bookmarks