;*****************************************
;*                                       *
;*            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
	
