.INCLUDE "tn2313def.inc" 		; include file for your device	

.DEF	counter = R24

.CSEG							; start of code segment
.ORG 0 							; interrupt vectors
	rjmp 	RESET 				; reset interrupt
	rjmp	IRQ0				; external IRQ0
	reti						; external IRQ1
	reti						; TIM1_CAPT 
	reti						; TIM1_COMPA
	rjmp	TIM1_OVF			; TIM1_OVF
	reti						; TIM0_OVF
	rjmp	USART0_RX			; USART0_RX
	rjmp	USART0_DRE			; USART0_DRE
	reti						; USART0_TX
	reti						; ANA_COMP
	reti						; PCINT interrupt
	reti						; TIM1_COMPB
	reti						; TIM0_COMPA
	reti						; TIM0_COMPB
	reti						; USI_STR
	reti						; USI_OVF
	reti						; EE_RDY
	reti						; WDT interrupt
 
RESET:							; start of main code
	ldi		R25, LOW(RAMEND)	; initilize stack pointer
	out		SPL, R25

	ldi		R25, 0x1F			; PORTS SETUP
	out		PORTD, R25
	ldi		R25, 0x20	
	out		DDRD, R25			; configure PORTD5 for output
	clr		R25
	out		PORTB, R25		
	out		PORTA, R25
	ser		R25
	out		DDRB, R25			; configure PORTB, PORTA for output
	out		DDRA, R25

	ldi		R25, 0x80			; CLOCK SETUP
	out		CLKPR, R25			; set master clock 8 MHz
	clr		R25					
	out		CLKPR, R25			

	ldi		R25, 0x02			; TIMER1 SETUP
	out		TCCR1A, R25			; fast PWM mode 14
	ldi		R25, 0x18
	out		TCCR1B, R25
	ldi		R25, 0x1E
	out		ICR1H, R25
	ldi		R25, 0x84			; set click duration
	out		ICR1L, R25
	ldi		R25, 0x80			; enable TIM1_OVF 
	out		TIMSK, R25			; interrupt
	ser		R25
	out		TIFR, R25			; clear interrupt flags

	ldi		R25, 0x98			; UART SETUP
	out		UCSRB, R25			; enable Tx, Rx interrupts 
	ldi		R25, 0x06			; 8-bit 1 stop, no parity
	out		UCSRC, R25
	ldi		R25, 0x00
	out		UBRRH, R25			; baud rate 9600
	ldi		R25, 51
	out		UBRRL, R25

	ldi		R25, 0x22			; set falling edge interrupt
	out		MCUCR, R25			;  and enable sleep
	ldi		R25, 0x40			; enable INT0 interrupt
	out		GIMSK, R25
	ser		R25					; clear interrupt flag
	out		EIFR, R25

	ldi		R23, 'A'			; character to send through UART
	sei							; enable interrupts globally
loop:							; main loop
	sleep						; put MCU into sleep mode
	rjmp	loop

;=================================================================
IRQ0:							; button interrupt
	ldi		counter, 200		; send 200 bytes
	sbi		UCSRB, 5			; enable interrupt
	out		UDR, R23			; send first byte
	reti

;-----------------------------------------------------------------
TIM1_OVF:						; Timer1 ISR
	ldi		R25, 0x18
	out		TCCR1B, R25			; stop timer
	sbi		PORTD, 5			; LED on
	reti

;-----------------------------------------------------------------
USART0_RX:						; USART receive complete ISR
	cbi		PORTD, 5			; LED off
	in		R25, UDR			; read received data

	clr		R25					; clear timer counter
	out		TCNT1H, R25
	out		TCNT1L, R25

	ldi		R25, 0x1D			; start timer
	out		TCCR1B, R25
	reti

;-----------------------------------------------------------------
USART0_DRE:						; USART transmit ready ISR
	dec		counter				; decrement counter
	breq	L1					
	out		UDR, R23			; send another byte
	reti
L1:	cbi		UCSRB, 5			; disable interrupt
	reti


