Timbre de puerta polifonico con pic 16F84 Door Chime
ASM
#include def84.asm
#include macro84.asm
errorlevel 2
org 0x0C ;start of RAM
;VARIABLES
;*********
masque res 1
masque1 res 1
compteur0 res 1
compteur1 res 1
compteur2 res 1
compteur3 res 1
note0 res 1
note1 res 1
note2 res 1
note3 res 1
play0 res 1
play1 res 1
play2 res 1
play3 res 1
accident res 1
duree res 1
vitesse res 1
c1 res 1
ptrmorceaul res 1
ptrmorceauh res 1
num_morceau res 1
num0 res 1
;CONSTANTES
;**********
#define fa0d .0 ;notes
#define sol0 .1
#define la0 .2
#define si0b .3
#define si0 .4
#define do0 .5
#define do0d .6
#define re0 .7
#define mi0 .8
#define fa1 .9
#define fa1d .10
#define sol1 .11
#define la1 .12
#define si1b .13
#define si1 .14
#define do1 .15
#define tcr .0 ;duration
#define dcr .1
#define cr .3
#define crp .5
#define n .7
#define np .11
#define b .15
#define bp .23
#define r .31
#define fin .1 ;event
#define tempo .2
; power on-off
#define power porta,0x03
;***********************************
org 0x0
Go_to_ Main;
org 0x04
;interrupt routine
;************************
Begin_
bcf intcon,toif
Move vitesse,timer
movlw 0xF0
bsf status,rp0 ; begin of charge capacitor program
iorwf trisb
bcf status,rp0
Dec duree ;decrement duration and test if zero
If_ zero then
Begin_
_ Morceau ;if duration=0 then call procedure morceau
Endif_
retfie
Procedure_ Morceau;
;*****************
Begin_
Movei 0xFF,masque1 ;prepare the capacitor mask
movlw 0x0F
_ Morceau0
Move wreg,accident ;get duration and pitch
Move wreg,duree
swapf accident
rrf accident
Andi accident,0x07
Andi duree,0x1F
Inc duree ; 1 to 32
bcf carry
rlf duree
bcf carry
rlf duree
If_eqi accident,fin then ;the end : power off
bcf power
la goto la
Endif_
If_eqi accident,tempo then
Move duree,vitesse
Addi 0x03,ptrmorceaul
If_ carry
Inc ptrmorceauh
Endif_
Go_to_ Morceau
Endif_
Inc ptrmorceaul ; get number of notes to interpret PLAY0...PLAY3
If_ zero
Inc ptrmorceauh
Endif_
_ Morceau0
Move wreg,play0
Move wreg,play1
swapf play0
Andi play0,0x0F
Andi play1,0x0F
Inc ptrmorceaul
If_ zero
Inc ptrmorceauh
Endif_
_ Morceau0
Move wreg,play2
Move wreg,play3
swapf play2
Andi play2,0x0F
Andi play3,0x0F
Inc ptrmorceaul
If_ zero
Inc ptrmorceauh
Endif_
Movei high Tabnote,pch ;get value for charging capacitors
Move play0,wreg
If_not zero then
_ Tabnote
Move wreg,note0
bcf masque1,0x7 ; capacitor 0
Endif_
Movei high Tabnote,pch
Move play1,wreg
If_not zero then
_ Tabnote
Move wreg,note1
bcf masque1,0x6 ; capacitor 1
Endif_
Movei high Tabnote,pch
Move play2,wreg
If_not zero then
_ Tabnote
Move wreg,note2
bcf masque1,0x5 ; capacitor 2
Endif_
Movei high Tabnote,pch
Move play3,wreg
If_not zero then
_ Tabnote
Move wreg,note3
bcf masque1,0x4 ; capacitor 3
Endif_
Move masque1,wreg ; update outputs RB4..RB7 for envelop generation
bsf status,rp0
And trisb,wreg
bcf status,rp0
End_
Procedure_ Write; ; Write to EEPROM
;***************
Begin_
bsf status,rp0
bsf eecon1,wren
Movei 0x55,eecon2
Movei 0xaa,eecon2
bsf eecon1,wr
Repeat_
Until_ eecon1,eeif
bcf eecon1,wren
bcf eecon1,eeif
bcf status,rp0
End_
Procedure_ Read; ; Read from EEPROM
;***************
Begin_
bsf status,rp0
bsf eecon1,rd
bcf status,rp0
bsf intcon,gie
Move eedata,wreg
End_
Procedure_ Init;
;**************
Begin_
Movei 0xF0,portb
Movei 0x00,porta
bsf power
bsf status,rp0 ;page 1 >0x80..
Movei 0x0,trisa
Movei 0xFF,trisb ;port B as input;
Clr intcon ; clear interrupts
Clr roption
bcf roption,psa ;timer divisor=max
bsf roption,ps0
bsf roption,ps1
bsf roption,ps2
bcf roption,t0cs ;timer 0 clock source=clock Q/4
bsf roption,rbpu ;
bcf status,rp0
Movei 0x00,eeadr ; read songnumber from EEPROM
_ Read
Move wreg,num0
Movei 0x01,eeadr
_ Read
xorwf num0,wreg
addlw 0x01
If_not zero then ; Error : rewrite songnumber
Begin_
Clr eeadr
Clr eedata
_ Write
Movei 0x01,eeadr
Movei 0xFF,eedata
_ Write
Else_
Inc num0 ;increment songnumber
If_eqi num0,0x08
Clr num0
Endif_
Move num0,eedata
Clr eeadr
_ Write ;save songnumber to EEPROM
comf num0,wreg
Move wreg,eedata
Inc eeadr
_ Write
Endif_
Movei high Tabmorceau,pch ; search for start of song to play
bcf carry
rlf num0,wreg
_ Tabmorceau
Move wreg,ptrmorceauh
Movei high Tabmorceau,pch
rlf num0,wreg
addlw 0x01
_ Tabmorceau
Move wreg,ptrmorceaul
bsf intcon,toie ; enable timer interrupt
Clr c1
Movei .1,duree
Movei 0xFF,timer
End_
Procedure_ Play;
;**************
Begin_
debut
bsf intcon,gie ; enable global interrupt (timer)
clrf masque ; initialize mask
bcf intcon,gie ; disable interrupt
Decf compteur0 ; decrement counter for note generation
btfsc zero ; if not zero:
goto a0 ; reload counter
b0 Dec compteur1 ; counter1
btfsc zero
goto a1
b1 Dec compteur2 ; counter2
btfsc zero
goto a2
b2 Dec compteur3 ; counter3
btfsc zero
goto a3
b3 Move masque,wreg
Bset banque1
Xor trisb,wreg ;invert selected outputs RBO..RB3 (square wave)
Bclr banque1
goto debut
a0 Move note0,compteur0 ; reload counter
bsf masque,0x00 ; update mask
goto b0
a1 Move note1,compteur1
bsf masque,0x01
goto b1
a2 Move note2,compteur2
bsf masque,0x02
goto b2
a3 Move note3,compteur3
bsf masque,0x03
goto b3
End_
Program_ Main;
;******************
Begin_
_ Init;
_ Play;
End_
#include morceau.asm
End__
HEX CARRILLON
:020000040000FA :02000000F728DF :080008000B111C088100F0300F :100010008316860483129B03031D0F2810200900FA :10002000FF308D000F3000219A009B009A0E9A0C31 :1000300007309A051F309B059B0A03109B0D031088 :100040009B0D01301A02031926282828851127281C :1000500002301A0203192D2835281B089C00033092 :100060009E07031C34289F0A10289E0A031D392866 :100070009F0A002196009700960E0F3096050F30CC :1000800097059E0A031D45289F0A002198009900A4 :10009000980E0F3098050F3099059E0A031D5128C0 :1000A0009F0A03308A00160803195928E02392009A :1000B0008D1303308A00170803196128E023930089 :1000C0000D1303308A00180803196928E0239400EF :1000D0008D1203308A00190803197128E023950056 :1000E0000D120D0883168605831208008316081565 :1000F00055308900AA3089008814081E7D2808110F :100100000812831208008316081483128B1708083C :100110000800F03086000030850085158316003019 :100120008500FF3086008B0181018111011481144B :100130000115811281178312003089008320A100EC :100140000130890083202106013E0319B02889016E :100150008801762001308900FF3088007620BF2892 :10016000A10A083021020319B628B728A1012108E5 :1001700088008901762021098800890A76200330C9 :100180008A000310210DC8239F0003308A00210D2F :10019000013EC8239E008B169D0101309B00FF305D :1001A000810008008B178C018B138E030319E6283E :1001B0008F030319EA2890030319EE28910303190A :1001C000F2280C08831686068312D22812088E00A5 :1001D0000C14D82813088F008C14DB281408900006 :1001E0000C15DE28150891008C15E12808008920DF :0401F000D220080011 :100200001F088A001E0882004A34003400340F346C :100210000034003405348134503461348034003487 :100220000334803400340334903400340734B13460 :100230005834073480340034053491344734013461 :10024000803400340334903400340334F034003408 :100250000F34E134473405347134403401347034A0 :1002600000340334703400340334803400340B34ED :10027000913447340334B03400340334E1349734D8 :100280000334C03400340334B034003403349034C5 :1002900000341F3485341B343F34003400340F34B1 :1002A000003400345F3400340034073480340034C8 :1002B0000F3405348B340734803400340F34053464 :1002C00081340734803400340734B5348B3403343C :1002D000B034003403348034003403340534003443 :1002E0000334803400340F3471344B340734903489 :1002F00000340F3441349B340734703400340F34ED :1003000017344B3407347034003407349134473495 :1003100003349034003403347034003403344034F4 :1003200000340334703400341F3451348F343F347C :10033000003400340F34003400340334703400349B :1003400003347034003407347A342C3407342034C6 :1003500000340334A03400340334A03400340734B0 :10036000A7342C3407347034003403347034003430 :100370000334A03400340B34C734AC340334C034F9 :1003800000340334B03400340334A03400348F34E8 :10039000823461340334803400340334A0340034B4 :1003A0008B34B23461340334B03400340334A034B9 :1003B00000340334803400340734AA342C34073436 :1003C000703400340334703400340334A034003407 :1003D0008734823461340734203400340334603489 :1003E00000340334803400341F3470342A343F34F2 :1003F000003400340F3400340034003450340034FE :100400000034803400340034B03400340334F53424 :100410008B340334B03400340334B0340034033448 :10042000B03400340334F03400340334B0340034D6 :100430000334B03400340334B03400340334F534BE :100440008B340334B03400340334B0340034033418 :10045000903400340F34803400340334503400348A :100460000334703400340334803400340334903463 :1004700000340734B53481340734B03400340334E5 :10048000C53409340334C03400340334E134473410 :100490000334E03400340F34F1348B343F3400340F :1004A00000340F34003400344A3400340034033450 :1004B000703400340334B03400340334B0340034C6 :1004C0000334E03400340334E03400340734B0340F :1004D0000034033470340034033470340034033493 :1004E000703400340334703400340134C0340034C8 :1004F0000134B03400340134A03400340134803489 :1005000000340B347034003403347034003403345A :10051000B13447340334B03400340334E0340034AD :100520000334E03400340734B134473403347034D6 :1005300000340334B03400340334A7342C34013491 :10054000803400340134A03400340334B2346834CD :100550000334603400340B3470342A343F340034B4 :1005600000340F340034003407348034003407344E :1005700025348C34033420340034033440340034C4 :10058000073452348C340334503400340334703420 :1005900000340734803400340734803400340734A6 :1005A00071344E340334B03400340334B034003486 :1005B0000F3482345C340334203400340334503438 :1005C00000340734713440341F3471344B343F34B9 :1005D000003400345434003400340F340034003418 :1005E0000334503400340334C03400340334C03492 :1005F00000340334C03400340334C2345934033477 :10060000C03400340334B53481340334B03400349E :100610000F3495342C340F34503400340334C03448 :1006200000340334C03400340334C03400340334A1 :10063000C03400340F34F13480340F34D13470348A :100640001F34C93452343F34003400345F34003432 :1006500000340F34003400340034403400340034AB :1006600050340034003460340034033474341034B3 :100670000F344034003403344034003403345034F5 :1006800000340334703400340034B03400340034A7 :10069000C03400340534E13447340734E0340034E6 :1006A0000F34B1347B3400344034003400345034DF :1006B00000340034603400340334743410340F34A4 :1006C00040340034033440340034033450340034B4 :1006D000033440340034073471344E3407347034FA :0E06E00000340F3452347C343F340034003484 :1007900082070134043401344F3401349A34013473 :1007A000FA34023451340234B1340234EA340334BA :0207B0002634ED :1007C0008207FE34F034D634CA34BE34B434AA348A :1007D000A0348F3487347F3478346B3465345F349D :0207E0005A3489 :00000001FF
Fuente: http://elektrobilim.org/forum/pic-yardim-soru-ve-istekler/2187-16f84-ile-polifonik-kapi-zili.html
|
|
![]() | 4 enero 2012 en Electronica | tags: Circuitos electrónicos, Electronica |























