;***************************************** ;* * ;* MSSE IR-8BC-TRI * ;* * ;***************************************** ; ; Manuel Schreiner Software & Elektronic ; InfraRed-8BitCode-TransReciverInterface ; ;*****************Protocoll*************** ;* * ;* Startbit, 8Bit-Code, 8Bit-Data * ;* * ;***************************************** ; ;*******************PINS****************** ;* * ;* PIN FUNCTION Port * ;* ------------------------------------- * ;* 1 : System-Reset | RESET * ;* 2 : RxD --> RS232 | PD0 * ;* 3 : TxD --> RS232 | PD1 * ;* 4- 5: Quarz | XTAL * ;* 6 : IR-Receive | PD2 * ;* 7 : IR-Transmit | PD3 * ;* 8 : Receive-LED | PD4 * ;* 9 : Transmit-LED | PD5 * ;* 10 : Ground | GND * ;* 11 : DTR | PD6 * ;* 12-19: 8Bit-DIP-Switch | PORTB * ;* 20 : VCC | VCC * ;* ------------------------------------- * ;* designed for AT2313 * ;* * ;***************************************** ; ; ; .include "2313def.inc" .equ CODE=PORTB .equ IR_IN=PIND2 .equ IR_OUT=PIND3 .equ DTR=PIND6 .equ T_LED=PIND5 .equ R_LED=PIND4 .def temp=r16 .def bitcounter=r17 .def data=r18 .def codedata=r19 .def Timercounter=r20 .def timer=r21 .def statusone=r22 .def sendcount=r23 .def rdatacount=r24 ; r25 .def status=r0 .cseg .org $000 rjmp init .org $001 rjmp read_ir .org $005 rjmp freq .org $006 rjmp freq .org $007 rjmp read_uart .org $00b init: ldi temp,low(RAMEND) out SPL,temp ; Set stack pointer to last internal RAM location clr rdatacount clr statusone ldi r16,0b01111000 out PORTD,r16 out DDRD,r16 cbi PORTD,T_LED cbi PORTD,R_LED cbi PORTD,IR_OUT sbi PORTD,DTR in codeData,PINB ldi temp,25 out UBRR,temp ldi r16,0b00011000 out UCR,r16 out UDR,codedata ldi r16,0b10011000 out UCR,r16 ldi timer,0 ldi r25,0x02 out TCCR0,r25 ldi r25,247 out TCNT0,r25 ldi temp,0b00000010 out TIMSK,temp sei main: SBRC statusone,2 rjmp senddata SBIS PIND,IR_IN rjmp read_ir rjmp main read_ir: clr rdatacount clr XH clr XL rcall reset_timer ldi r16,0b00011000 out UCR,r16 cbi PORTD,DTR startir: rcall reset_timer waitstart: SBIS PIND,IR_IN rjmp waitstart cpi timer,90 brlo Wait_Send_Loop ldi bitcounter,0 clr codedata readcode: inc bitcounter rcall reset_timer waithi: cpi timer,40 brsh Wait_Send_loop SBIC PIND,IR_IN rjmp waithi rcall reset_timer waitlo: SBIS PIND,IR_IN rjmp waitlo cpi timer,32 brlo lowbit sec rjmp nextbit lowbit: clc nextbit: ror codedata cpi bitcounter,8 brne readcode in temp,PINB cp codedata,temp brne Wait_Send_loop sbi PORTD,R_LED clr bitcounter clr data readdata: inc bitcounter rcall reset_timer waithi2: cpi timer,40 brsh Wait_Send_loop SBIC PIND,IR_IN rjmp waithi2 rcall reset_timer waitlo2: SBIS PIND,IR_IN rjmp waitlo2 cpi timer,32 brlo lowbit2 sec rjmp nextbit2 lowbit2: clc nextbit2: ror data cpi bitcounter,8 brne readdata st X+,data inc rdatacount rcall reset_timer Wait_Send_loop: cpi timer,255 breq Data_Out SBIC PIND,IR_IN rjmp Wait_Send_loop cpi timer,200 brlo startir cpi timer,200 brsh Data_out rjmp Wait_send_loop Data_out: cpi rdatacount,0 breq END_IR clr ZH clr XH clr YH clr temp mov ZL,rdatacount subi ZL,-1 search: clr temp cpi ZL,1 breq endsearch ld r19,-Z mov XL,ZL searchloop: ld r18,-X cp r19,r18 breq inctemp rjmp nextsearch inctemp: inc temp nextsearch: cpi temp,3 breq realdataout cpi XL,0 breq search rjmp searchloop endsearch: cpi temp,3 brlo END_IR realdataout: out UDR,data END_IR: cbi PORTD,R_LED sbi PORTD,DTR ldi r16,0b10011000 out UCR,r16 rjmp main read_uart: in r0,SREG ldi sendcount,9 rcall reset_timer in data,UDR sbr statusone,0b00000100 out SREG,r0 reti senddata: sbi PORTD,T_LED cbi PORTD,DTR cbr statusone,0b00000100 ldi r16,0b00011000 out UCR,r16 sendloop: mov temp,data in codedata,PINB rcall sendStart clr bitcounter codesend: inc bitcounter ror codedata brcc c_losend rcall sendhi rjmp c_nextsend c_losend: rcall sendlo c_nextsend: cpi bitcounter,8 brne codesend clr bitcounter datasend: inc bitcounter ror data brcc d_losend rcall sendhi rjmp d_nextsend d_losend: rcall sendlo d_nextsend: cpi bitcounter,8 brne datasend rcall reset_timer tmwait: cpi timer,120 brne tmwait dec sendcount mov data,temp brne sendloop rcall reset_timer tmwait2: cpi timer,250 brne tmwait2 cbi PORTD,T_LED sbi PORTD,DTR ldi r16,0b10011000 out UCR,r16 rjmp main SendStart: rcall IR_SEND_ON rcall reset_timer sswait: cpi timer,96 brne sswait rcall IR_SEND_OFF rcall lowait ret SendHi: rcall IR_SEND_ON rcall reset_timer shwait: cpi timer,56 brne shwait rcall IR_SEND_OFF rcall lowait ret SendLo: rcall IR_SEND_ON rcall reset_timer slwait: cpi timer,28 brne slwait rcall IR_SEND_OFF rcall lowait ret lowait: cbi PORTD,IR_OUT rcall reset_timer lwwait: cpi timer,28 brne lwwait ret reset_timer: ldi timer,0 ldi r25,0x02 out TCCR0,r25 ldi r25,247 out TCNT0,r25 ret freq: in r1,SREG inc timer ldi r25,0x02 out TCCR0,r25 ldi r25,247 out TCNT0,r25 SBRS statusone,0 rjmp LED_OFF SBRS statusone,1 rjmp LED_ON LED_OFF: cbr statusone,0b00000010 cbi PORTD,IR_OUT out SREG,r1 reti LED_ON: sbr statusone,0b00000010 sbi PORTD,IR_OUT out SREG,r1 reti IR_SEND_ON: sbr statusone,0b00000001 ret IR_SEND_OFF: cbr statusone,0b00000001 ret