Juan Alvarez wrote: >last year somebody posted a massage in which there was a little code >that could implement a number of sounds like "siren" police, telephone >ring, alrms sounds etc. Here it is, untouched, I never did try it out... Dave Johnson ---------------------------- ; ;PROJECT :Siren Driver Module on 16c84 pic ;DONE BY :MARK E'SILVA ;COMPANY :DIGITRON ;ASSEMBLER :MPALC ;DATE :2/3/1998 ;-------------------------------------------------------------------------- --- ;LABLE OPCODE OPERAND COMMENTS list R=DEC ;Set radix to decimal list P=16c84 ;Set device to pic16c84 list F=INHX8m ;Set format intel 8 bit merged ; list F=picice ;picice format ;-------------------------------------------------------------------------- ---- ;SETTING UP LABLES ; port_a equ 5h ;equate port a port_b equ 6h ;equate port b same equ 1 ;same register _pc equ 02h ;program counter _rtcc equ 01h ;rtcc indirect equ 00h ;indirect address contents _fsr equ 04h ;file select register _status equ 03h ;status register _carry equ 0 ;carry flag _zero equ 2 ;zero flag ; equ 10h ; ; equ 11h ; ; equ 12h ; _lenth equ 13h ; ; equ 17h ; temp1 equ 14h ; temp2 equ 15h ; temp3 equ 16h ; temp4 equ 1Ah ; temp5 equ 1Bh ; dipval equ 1Ch ; ; equ 1Dh ; ; equ 1Eh ; ; equ 1Fh ; ; equ 0Fh ; ; equ 0Dh ; ; equ 0Bh ; ; equ 09h ; ; equ 08h ; ; equ 0Ah ; ; equ 0Eh ; _flags equ 0Ch ;flag register ; equ 18h ; ; equ 19h ; ;-------------------------------------------------------------------------- --- ;port b pin definitions ;-------------------- ; equ 3 ; ; equ 2 ; ; equ 1 ; sir equ 0 ;siren drive out ;-------------------------------------------------------------------------- ---- ;flags ; 0 0=siren sweep off ; 1=siren sweep on ;-------------------------------------------------------------------------- ---- ; 1 0= ; 1= ;-------------------------------------------------------------------------- ---- ; 2 0= ; 1= ;-------------------------------------------------------------------------- ---- ; 3 0= ; 1= ;-------------------------------------------------------------------------- ---- ; 4 0= ; 1= ;-------------------------------------------------------------------------- --- ; 5 0= ; 1= ;-------------------------------------------------------------------------- ---- ; 6 0= ; 1= ;-------------------------------------------------------------------------- ---- ; 7 0= ; 1= ;-------------------------------------------------------------------------- ---- ;page 0 ;-------------------------------------------------------------------------- ---- ORG 000h ;originate code here ;-------------------------------------------------------------------------- ---- ;Codes start here init movlw B'01111111' ;7 output tris port_b ; clrf port_b ;resetting port b movlw B'11111111' ; tris port_a ; clrf port_a ;resetting port a movlw B'00001111' ;setup wdt 128:1 option ;pul ups off int clock enabled clrf _flags ;clear all flags ;-------------------------------------------------------------------------- -- diptest movf port_b,w ;get dip value movwf dipval ; comf dipval,same ; bcf dipval,7 ;mask bcf dipval,6 ; bcf dipval,5 ; bcf dipval,4 ; movlw 15 ; subwf dipval,w ; btfsc _status,_carry ;set is pos goto op ; movlw 14 ; subwf dipval,w ; btfsc _status,_carry ;set is pos goto op14 ; movlw 13 ; subwf dipval,w ; btfsc _status,_carry ;set is pos goto op13 ; movlw 12 ; subwf dipval,w ; btfsc _status,_carry ;set is pos goto op12 ; movlw 11 ; subwf dipval,w ; btfsc _status,_carry ;set is pos goto op11 ; movlw 10 ; subwf dipval,w ; btfsc _status,_carry ;set is pos goto op10 ; movlw 9 ; subwf dipval,w ; btfsc _status,_carry ;set is pos goto op9 ; movlw 8 ; subwf dipval,w ; btfsc _status,_carry ;set is pos goto op8 ; movlw 7 ; subwf dipval,w ; btfsc _status,_carry ;set is pos goto op7 ; movlw 6 ; subwf dipval,w ; btfsc _status,_carry ;set is pos goto op6 ; movlw 5 ; subwf dipval,w ; btfsc _status,_carry ;set is pos goto op5 ; movlw 4 ; subwf dipval,w ; btfsc _status,_carry ;set is pos goto op4 ; movlw 3 ; subwf dipval,w ; btfsc _status,_carry ;set is pos goto op3 ; movlw 2 ; subwf dipval,w ; btfsc _status,_carry ;set is pos goto op2 ; movlw 1 ; subwf dipval,w ; btfsc _status,_carry ;set is pos goto op1 ; goto op ; ;-------------------------------------------------------------------------- - op bsf _flags,0 ;fast sweep movlw 250 ; movwf temp2 ;sweep = 255 movlw 5 ;255 /10 th = variable rate 5 movwf _lenth ; movlw 3 ; movwf temp3 ;pitch preset to 25 siren bsf port_b,7 ;beeper on call pit ;variable pitch bcf port_b,7 ;beeper off call pit ;variable pitch decfsz temp2,same ;sweep timer goto var ; movlw 250 ;reset sweep timer movwf temp2 ; goto tog ;toggle if sweep over ;-------------------------------------------------------------------------- tog btfsc _flags,0 ;test if sweep off goto down ;pitch down goto up ;pitch up down bcf _flags,0 ; goto siren ; up bsf _flags,0 ; goto siren ; ;-------------------------------------------------------------------------- - var decfsz _lenth,same ; goto siren ; btfsc _flags,0 ;test if sweep up or down goto re ; decfsz temp3,same ; goto qw1 ; bsf _flags,0 ; qw1 movlw 5 ;reset /10 5 movwf _lenth ; goto siren ; re incf temp3,same ; movlw 5 ; movwf _lenth ;reset /10 5 goto siren ; ;-------------------------------------------------------------------------- - pit movf temp3,w ; movwf temp4 ; g clrwdt ;kick dog decfsz temp4,same ; goto g ; retlw 0 ; ;-------------------------------------------------------------------------- ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- - op1 bsf _flags,0 ;very slow sweep movlw 230 ; movwf temp2 ;sweep = 255 movlw 3 ;255 /10 th = variable rate movwf _lenth ; movlw 85 ; movwf temp3 ;pitch preset to 25 siren1 bsf port_b,7 ;beeper on call pit ;variable pitch bcf port_b,7 ;beeper off call pit ;variable pitch decfsz temp2,same ;sweep timer goto var1 ; movlw 230 ;reset sweep timer movwf temp2 ; goto tog1 ;toggle if sweep over ;-------------------------------------------------------------------------- tog1 btfsc _flags,0 ;test if sweep off goto down1 ;pitch down goto up1 ;pitch up down1 bcf _flags,0 ; goto siren1 ; up1 bsf _flags,0 ; goto siren1 ; ;-------------------------------------------------------------------------- - var1 decfsz _lenth,same ; goto siren1 ; btfsc _flags,0 ;test if sweep up or down goto re1 ; decf temp3,same ; movlw 3 ;reset /10 movwf _lenth ; goto siren1 ; re1 incf temp3,same ; movlw 3 ; movwf _lenth ;reset /10 goto siren1 ; ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- - op2 bsf _flags,0 ;medium sweep movlw 10 ; movwf temp3 ;pitch preset to 25 siren2 bsf port_b,7 ;beeper on call pit ;variable pitch bcf port_b,7 ;beeper off call pit ;variable pitch goto var2 ; ;-------------------------------------------------------------------------- - var2 btfsc _flags,0 ;test if sweep up or down goto re2 ; decfsz temp3,same ; goto siren2 ; bsf _flags,0 ; incf temp3,same ; goto siren2 ; re2 incf temp3,same ; movlw 150 ; subwf temp3,w ; btfsc _status,_carry ;set if pos bcf _flags,0 ; goto siren2 ; ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- - op3 bsf _flags,0 ;police siren movlw 5 ;sweep delay timer movwf temp1 ; movlw 255 ; movwf temp2 ;sweep = 255 movlw 255 ; movwf temp3 ;pitch preset to 25 siren3 bsf port_b,7 ;beeper on call pit ;variable pitch bcf port_b,7 ;beeper off call pit ;variable pitch decfsz temp1,same ;delay sweep goto siren3 ; movlw 5 ;reset delayed sweep movwf temp1 ; btfsc _flags,0 ;test if up or down sweep goto m1 ; goto m2 ; m1 decfsz temp2,same ;sweep timer goto var3 ; goto tog3 ;toggle if sweep over m2 movlw 5 ; subwf temp2,same ; movf temp2,w ; btfsc _status,_zero ; goto var3 ; goto tog3 ;toggle if sweep over ;-------------------------------------------------------------------------- tog3 btfsc _flags,0 ;test if sweep off goto down3 ;pitch down goto up3 ;pitch up down3 bcf _flags,0 ; goto siren3 ; up3 bsf _flags,0 ; goto siren3 ; ;-------------------------------------------------------------------------- - var3 btfsc _flags,0 ;test if sweep up or down goto re3 ; decf temp3,same ; goto siren3 ; re3 movlw 255 ; subwf temp3,w ; btfsc _status,_carry ;set is positive bcf _flags,0 ; incf temp3,same ; goto siren5 ; ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- - op4 bsf _flags,0 ;slow rise movlw 6 ;sweep delay timer movwf temp1 ; movlw 255 ; movwf temp2 ;sweep = 255 movlw 255 ; movwf temp3 ;pitch preset to 25 siren4 bsf port_b,7 ;beeper on call pit ;variable pitch bcf port_b,7 ;beeper off call pit ;variable pitch decfsz temp1,same ;delay sweep goto siren4 ; movlw 6 ;reset delayed sweep movwf temp1 ; btfss _flags,0 ;test if up or down sweep goto m3 ; goto m4 ; m3 decfsz temp2,same ;sweep timer goto var4 ; goto tog4 ;toggle if sweep over m4 movlw 5 ; subwf temp2,same ; movf temp2,w ; btfsc _status,_zero ; goto var4 ; goto tog4 ;toggle if sweep over ;-------------------------------------------------------------------------- tog4 btfsc _flags,0 ;test if sweep off goto down4 ;pitch down goto up4 ;pitch up down4 bcf _flags,0 ; goto siren4 ; up4 bsf _flags,0 ; goto siren4 ; ;-------------------------------------------------------------------------- - var4 btfsc _flags,0 ;test if sweep up or down goto re4 ; decf temp3,same ; goto siren4 ; re4 movlw 255 ; subwf temp3,w ; btfsc _status,_carry ;set is positive bcf _flags,0 ; incf temp3,same ; goto siren5 ; ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- - op5 bsf _flags,0 ;ultra low sweep (air raid) movlw 20 ;sweep delay timer movwf temp1 ; movlw 255 ; movwf temp2 ;sweep = 255 movlw 255 ; movwf temp3 ;pitch preset to 25 siren5 bsf port_b,7 ;beeper on call pit ;variable pitch bcf port_b,7 ;beeper off call pit ;variable pitch decfsz temp1,same ;delay sweep goto siren5 ; movlw 20 ;reset delayed sweep movwf temp1 ; decfsz temp2,same ;sweep timer goto var5 ; goto tog5 ;toggle if sweep over ;-------------------------------------------------------------------------- tog5 btfsc _flags,0 ;test if sweep off goto down5 ;pitch down goto up5 ;pitch up down5 bcf _flags,0 ; goto siren5 ; up5 bsf _flags,0 ; goto siren5 ; ;-------------------------------------------------------------------------- - var5 btfsc _flags,0 ;test if sweep up or down goto re5 ; decf temp3,same ; goto siren5 ; re5 movlw 255 ; subwf temp3,w ; btfsc _status,_carry ;set is positive bcf _flags,0 ; incf temp3,same ; goto siren5 ; ;-------------------------------------------------------------------------- -- ;-------------------------------------------------------------------------- -- ;-------------------------------------------------------------------------- - op6 bsf _flags,0 ;two tone high pitch movlw 2 ;sweep delay timer movwf temp1 ; movlw 255 ; movwf temp2 ;sweep = 255 movlw 50 ; movwf temp3 ;pitch preset to 25 siren6 bsf port_b,7 ;beeper on call pit ;variable pitch bcf port_b,7 ;beeper off call pit ;variable pitch decfsz temp1,same ;delay sweep goto siren6 ; movlw 2 ;reset delayed sweep movwf temp1 ; decfsz temp2,same ;sweep timer goto siren6 ; btfsc _flags,0 ;test if high or low goto m5 ; goto m6 ; m5 movlw 20 ; movwf temp3 ; bcf _flags,0 ; goto siren6 ; m6 movlw 50 ; movwf temp3 ; bsf _flags,0 ; goto siren6 ; ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- -- op7 bsf _flags,0 ;continues movlw 40 ; movwf temp3 ;pitch preset to 25 siren7 bsf port_b,7 ;beeper on call pit ;variable pitch bcf port_b,7 ;beeper off call pit ;variable pitch goto siren7 ; ;-------------------------------------------------------------------------- -- ;-------------------------------------------------------------------------- -- ;-------------------------------------------------------------------------- -- op8 movlw 40 ;telephone movwf temp3 ;pitch preset to 25 movlw 100 ; movwf _lenth ;lenth timer siren8 bsf port_b,7 ;beeper on call pit ;variable pitch bcf port_b,7 ;beeper off call pit ;variable pitch decfsz _lenth,same ; goto siren8 ; movlw 100 ;reset lenth timer movwf _lenth ; movlw 50 ; movwf temp3 ;pitch preset to 25 siren9 bsf port_b,7 ;beeper on call pit ;variable pitch bcf port_b,7 ;beeper off call pit ;variable pitch decfsz _lenth,same ; goto siren9 ; movlw 100 ;reset lenth timer movwf _lenth ; goto op8 ; ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- - op9 movlw 40 ;buzzer movwf temp3 ;pitch preset to 25 movlw 2 ; movwf _lenth ;lenth timer siren10 bsf port_b,7 ;beeper on call pit ;variable pitch bcf port_b,7 ;beeper off call pit ;variable pitch decfsz _lenth,same ; goto siren10 ; movlw 2 ;reset lenth timer movwf _lenth ; movlw 255 ; movwf temp3 ;pitch preset to 25 siren11 bsf port_b,7 ;beeper on call pit ;variable pitch bcf port_b,7 ;beeper off call pit ;variable pitch decfsz _lenth,same ; goto siren11 ; movlw 2 ;reset lenth timer movwf _lenth ; goto op9 ; ;-------------------------------------------------------------------------- -- ;-------------------------------------------------------------------------- -- ;-------------------------------------------------------------------------- - op10 bsf _flags,0 ;laser shoot fast movlw 1 ;sweep delay timer movwf temp1 ; movlw 255 ; movwf temp2 ;sweep = 255 movlw 255 ; movwf temp3 ;pitch preset to 25 siren12 bsf port_b,7 ;beeper on call pit ;variable pitch bcf port_b,7 ;beeper off call pit ;variable pitch decfsz temp1,same ;delay sweep goto siren12 ; movlw 1 ;reset delayed sweep movwf temp1 ; btfsc _flags,0 ;test if up or down sweep goto m11 ; goto m12 ; m11 decfsz temp2,same ;sweep timer goto var11 ; goto tog13 ;toggle if sweep over m12 movlw 5 ; subwf temp2,same ; movf temp2,w ; btfsc _status,_zero ; goto var11 ; goto tog13 ;toggle if sweep over ;-------------------------------------------------------------------------- tog13 btfsc _flags,0 ;test if sweep off goto down13 ;pitch down goto up13 ;pitch up down13 bcf _flags,0 ; goto siren12 ; up13 bsf _flags,0 ; goto siren12 ; ;-------------------------------------------------------------------------- - var11 btfsc _flags,0 ;test if sweep up or down goto re13 ; decf temp3,same ; goto siren12 ; re13 movlw 255 ; subwf temp3,w ; btfsc _status,_carry ;set is positive bcf _flags,0 ; incf temp3,same ; goto siren12 ; ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- - op11 bsf _flags,0 ;laser shoot slow movlw 2 ;sweep delay timer movwf temp1 ; movlw 255 ; movwf temp2 ;sweep = 255 movlw 255 ; movwf temp3 ;pitch preset to 25 siren13 bsf port_b,7 ;beeper on call pit ;variable pitch bcf port_b,7 ;beeper off call pit ;variable pitch decfsz temp1,same ;delay sweep goto siren13 ; movlw 2 ;reset delayed sweep movwf temp1 ; btfsc _flags,0 ;test if up or down sweep goto m13 ; goto m14 ; m13 decfsz temp2,same ;sweep timer goto var13 ; goto tog14 ;toggle if sweep over m14 movlw 5 ; subwf temp2,same ; movf temp2,w ; btfsc _status,_zero ; goto var13 ; goto tog14 ;toggle if sweep over ;-------------------------------------------------------------------------- tog14 btfsc _flags,0 ;test if sweep off goto down14 ;pitch down goto up14 ;pitch up down14 bcf _flags,0 ; goto siren13 ; up14 bsf _flags,0 ; goto siren13 ; ;-------------------------------------------------------------------------- - var13 btfsc _flags,0 ;test if sweep up or down goto re14 ; decf temp3,same ; goto siren13 ; re14 movlw 255 ; subwf temp3,w ; btfsc _status,_carry ;set is positive bcf _flags,0 ; incf temp3,same ; goto siren13 ; ;-------------------------------------------------------------------------- ;-------------------------------------------------------------------------- -- ;-------------------------------------------------------------------------- -- op12 bsf _flags,0 ;continues pulsed movlw 40 ; movwf temp3 ;pitch preset to 25 movlw 255 ;pulse timer movwf temp5 ; siren14 bsf port_b,7 ;beeper on call pit ;variable pitch bcf port_b,7 ;beeper off call pit ;variable pitch decfsz temp5,same ; goto siren14 ; qw3 clrwdt ;kick dog call pit ; decfsz temp5,same ; goto qw3 ; decfsz temp3 ; goto qw3 ; goto op12 ; ;-------------------------------------------------------------------------- ;-------------------------------------------------------------------------- ;-------------------------------------------------------------------------- op13 bsf _flags,0 ;double sweep fast movlw 200 ; movwf temp3 ;pitch preset to 25 siren15 bsf port_b,7 ;beeper on call pit ;variable pitch bcf port_b,7 ;beeper off call pit ;variable pitch decfsz temp3,same ; goto siren15 ; movlw 200 ; movwf temp3 ; goto siren15 ; ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- - ;-------------------------------------------------------------------------- - op14 bsf _flags,0 ; movlw 10 ; movwf temp3 ;pitch preset to 25 siren16 bsf port_b,7 ;beeper on call pit ;variable pitch bcf port_b,7 ;beeper off call pit ;variable pitch movlw 1 ; addwf temp3,same ; goto siren16 ; ;-------------------------------------------------------------------------- -- org 3ffh ; goto init ; END ;