;********************************************************* ; File: ir1.a51 ; Autor: M. Birchmeier (& M. Lüdin) ; Zweck: infrarot rc empfänger sony standard ;********************************************************* ; an die beiden externen interrupts komlementär ausgänge des ir-empfängers ; valir (p3.7) high, wenn gültiger code empfangen, 8bit des codes am p1, ; die restlichen 4 oder 7 bits in select, 12 oder 15 bit signalwahl mit nbit. ;********************************************************* $mod51 ;SFR Deklarationen einlesen ;*** Variabeln ******************************************* irsb data 30h irh data 36h irl data 37h ;********************************************************* ;*** PIN Belegung ************************************** valir set p3.7 ;high, wenn gültiger ir-command empfangen ;********************************************************* ;*** Konstanten ***************************************** ; Gelten nur für 1Mhz Systemtakt (ca 12MHz Quarz) irsynl equ 00h ;t>1.8ms irsynh equ 07h irovll equ 00h ;t>2.7ms irovlh equ 0bh irhl equ 00h ;t>0.8ms irhh equ 03h irll equ 00h ;t>0.3ms irlh equ 01h nbit equ 0ch ;n-bit rc-code (12 oder 15) select equ 00001000b ;gerät: cd-player (bits >8 des rc-codes) ;*************************************************************** ;*** Reset Code ************************************************ CSEG org 0 ;reset vector ajmp Reset org 03h ;ExtInterrupt0 ajmp ISRext0 org 0BH ;T0 Vector ajmp ISRtimer0 org 13h ;ExtInterrupt1 ajmp ISRext1 org 1BH ;T1 Vector ajmp ISRtimer1 ;*** Startup Code ********************************************** Reset: mov sp,#6fH ;Stack: 70..7f mov TMOD,#00010001B ;T0,T1: Mode 1 (16 Bit) setb TR0 ;enable Timer0 setb ET0 ;enable timer0 interrrupt setb EA ;enable interrupts setb tr1 ;enable timer1 setb et1 ;enable timer1 interrupt setb ex0 ;enable ext interrupt0 setb it0 ;interrupt0 flankengesteuert setb ex1 ;enable ext interrupt1 setb it1 ;interrupt1 flankengesteuert MOV irsb,#0h mov irl,#0h mov irh,#0h mov p1,#0h ;*** Main ************************************************ Main: jnb valir,main mov a,irl cjne a,#10111000b,eins mov p1,#00h jmp wrel eins: cjne a,#10000000b,zwei cpl p1.0 jmp wrel zwei: cjne a,#10000001b,drei cpl p1.1 jmp wrel drei: cjne a,#10000010b,vier cpl p1.2 jmp wrel vier: cjne a,#10000011b,five cpl p1.3 jmp wrel five: cjne a,#10000100b,sex cpl p1.4 jmp wrel sex: cjne a,#10000101b,seven cpl p1.5 jmp wrel seven: cjne a,#10000110b,acht cpl p1.6 jmp wrel acht: cjne a,#10000111b,neun cpl p1.7 jmp wrel neun: cjne a,#10001000b,zehn clr p3.4 jmp wrel zehn: cjne a,#10100000b,emain clr p3.5 jmp wrel wrel: jb valir,wrel emain: setb p3.4 setb p3.5 jmp Main ;*** Timer 0 ***(stellt nach gültigem signal nach ablauf von t0 werte zurück)*** ISRtimer0: push ACC push b PUSH PSW clr tr0 mov irl,#00h mov irh,#0h mov irsb,#00h clr valir pop PSW pop b pop ACC reti ;*** EXTinterrupt0 ***(misst zeit zwischen steigender und fallender flanke und wertet aus)*** ISRext0: push ACC PUSH PSW clr tr1 clr cy mov a,tl1 subb a,#irovll mov a,th1 subb a,#irovlh jnc cancelIR ;k.o.-bedingung zu langer impuls clr cy mov a,tl1 subb a,#irsynl mov a,th1 subb a,#irsynh jnc syncIR ;sync empfangen mov a,irsb anl a,#10000000b jz cancelIR ;kein sync am anfang clr cy mov a,tl1 subb a,#irhl mov a,th1 subb a,#irhh jnc irbit1 ;1 empfangen clr cy mov a,tl1 subb a,#irll mov a,th1 subb a,#irlh jnc irbit0 ;0 empfangen cancelIR: jmp resetIR ;k.o.-bedingung zu kurzer impuls ;-------------------------------------------------------------- irbit0: mov tl1,#00h ;timer1 neustarten mov th1,#00h setb tr1 inc irsb push irsb anl irsb,#00001111b mov a,#00h setb cy loop0: ;bitschieber für lowbyte rlc a jc byteofl djnz irsb,loop0 cpl a anl irl,a ;bit maskieren und löschen jmp bit0ok byteofl: ;bitschieber für highbyte rlc a djnz irsb,byteofl cpl a anl irh,a ;bit maskieren und löschen bit0ok: pop irsb jmp endisrIR ;---------------------------------------------------------------- irbit1: mov tl1,#00h ;timer1 neustarten mov th1,#00h setb tr1 inc irsb push irsb anl irsb,#00001111b mov a,#00h setb cy loop1: ;bitschieber für lowbyte rlc a jc byteof1 djnz irsb,loop1 orl irl,a ;bit maskieren und setzen jmp bit1ok byteof1: ;bitschieber für highbyte rlc a djnz irsb,byteof1 orl irh,a ;bit maskieren und setzen bit1ok: pop irsb jmp endisrIR ;----------------------------------------------------------------- syncIR: mov irsb,#10000000b jmp t1go ;----------------------------------------------------------------- resetIR: mov irsb,#00h t1go: mov tl1,#00h ;timer1 neustarten mov th1,#00h setb tr1 endisrIR: mov a,irsb anl a,#00001111b cjne a,#nbit,bitko ;noch nicht genügend bits mov a,#select cjne a,irh,bitko ;falsches gerät (obere bits) setb valir ;ausgang setzen orl irsb,#01000000b ;ok-bit im irsb setzen mov tl0,#00h mov th0,#00h setb tr0 ;timer0 neustarten bitko: pop PSW pop ACC reti ;*** timer1 ***(überlauf nach zu langer signalpause)*** ISRtimer1: push ACC PUSH PSW mov irsb,#00h mov irh,#00h pop PSW pop ACC reti ;*** EXTinterrupt1 ***(misst zeit zw fallender und steigender flanke)*** ISRext1: push ACC PUSH PSW clr tr1 clr cy mov a,tl1 subb a,#irhl mov a,th1 subb a,#irhh jnc abortIR ;k.o.-bedingung zu lange pause clr cy mov a,tl1 subb a,#irll mov a,th1 subb a,#irlh jnc noabort ;pausendauer ok abortIR: mov irsb,#00h noabort: mov tl1,#00h ;timer1 neustarten mov th1,#00h setb tr1 pop PSW pop ACC reti ;*** Programm Ende *** end