.def cntr1 =r1 .def cntr2 =r2 .def cntr3 =r3 .def buf1 =r4 .def buf2 =r5 .def buf3 =r6 .def tonecnt =r7 .def repcnt =r8 .def ttlcnt =r9 .def rxdcnt =r10 .def rxdbuf =r11 .def irmode_pntr =r12 .def irmode =r13 .def nnir =r14 .def opmode =r15 .def irdatai =r23 .def irdataj =r24 .def txcnt =r25 .include "2313def.inc" .equ NIR =8 ;IRデータの個数(MAX) .equ RXDLEN =6 ;rxdの長さ .equ TS =152 ;TS/152(sec)...6.5536ms(25.6us*256)*152=1s ;PORTB .equ SW_T =0 .equ RLY =1 .equ pIRIN =PINB .equ IRIN =2 .equ BZZ =3 .equ IROUT =4 .equ pSW_P =PINB .equ SW_P =7 .include "avrlib.inc" ; SRAM領域定義 .dseg .org RAMTOP irtab: .byte 8 rxd: .byte 6 ; プログラムコード .cseg ; Interrupt Vectors (AT90S2313) goto reset ; Reset .include "avrlib.asm" .include "avrtxlib.asm" .include "avrrxlib.asm" .include "avrtxset.asm" ledtab: .db 0x79,0x24,0x30,0x19,0x12,0x02,0x58,0x00,0x10,0x40 ; 1 2 3 4 5 6 7 8 9 0 tonetab: .db 149, 133, 118, 112, 100, 89, 79, 75 ; 1911.1, 1702.6, 1516.8, 1431.7, 1275.5, 1136.4, 1012.4, 955.6(us) ; 523.25, 587.33, 659.26, 698.46, 783.99, 880.00, 987.77, 1046.50(Hz) reset: outi SPL,RAMEND ;SP 初期化 outi PORTB,0xf3 ;pull up b7-5, b4=1, b3=0, b1=1, b0=1 outi DDRB, 0x1b ;ixxooioo outi PORTD,0x7e ;LED消灯 outi DDRD, 0x7e ;xooooooi outi TCCR1B,4 ;CK1=25.6us main0: sbi PORTB,IROUT ;IROUT=1(off) cbi PORTB,BZZ ;BZZ=0 outi PORTD,0x7e ;LED消灯 sbi PORTB,0 ;LED消灯 rcall t_100ms rcall irtab_restore ;プリセット情報を復元 main: cbic PINB,SW_P,irpreset ;SW_Pon~|_なら rcall irpreset jbis PIND,SW_T,main clr irdatai ;irdatai=0 irscantx1: cbrs opmode,0,beep ;manual mode なら rcall beep rcall waitSW_Toff ;SW_T offを待つ mvi cntr2,3 ;manualの場合は3secで終了 clriow TCNT1 ;TCNT1=0 lpmtab ledtab,irdatai sbrc r0,0 sbi PORTB,0 ;LED消灯 sbrs r0,0 cbi PORTB,0 ;LED点灯 mov acc,r0 cbr acc,1 ;bit0=0 out PORTD,acc ;LED点灯 lpmtab tonetab,irdatai mov tonecnt,r0 ;set tonecnt mov cntr1,r0 ;set cntr1 irloop: in acc,TCNT1L ;acc=TCNT1L jeq acc,buf1,irloop ;25.6us sync mov buf1,acc ;buf1=TCNT1L mov acc,tonecnt lsr acc ;acc=tonecnt/2 jlt cntr1,acc,bzz1 cbi PORTB,BZZ ;if(cntr1>tonecnt/2) BZZ=0 goto bzz0 bzz1: sbi PORTB,BZZ ;if(cntr1