; casovac

.nolist
.include "m32def.inc"
.list

.cseg
.org 0x0000
	rjmp RESET
.org OVF0addr
	rjmp TIMER0_OVF

; hlavny program
RESET:
	.equ POCET_PRERUSENI=61 ; 2 pre ladenie
	.def TEMP=R16	; pracovny register
	.def COUNT=R17	; pocitadlo preruseni

	; zapis vrcholu zasobnika
	ldi TEMP, high(ramend)
	out SPH, TEMP
	ldi TEMP, low(ramend)
	out SPL, TEMP

	; definovanie portov
	ldi TEMP, 0xFF
	out DDRC, TEMP
	ldi TEMP, 0x0F
	out PORTC, TEMP

	; definovanie casovaca TIMER0
	; WGM Normal, COM Normal - OC0 disconected
	; CS Prescaler 1024 (priblizne 61x 8-bit preteceni za 1 sekundu)
	ldi TEMP, 1<<CS02 | 1<<CS00
;	ldi TEMP, 1<<CS00 ; pre ladenie
	out TCCR0, R16

	; povolenie prerusenia pretecenia pre casovac TIMER0
	ldi TEMP, 1<<TOIE0
	out TIMSK, R16

	; globalne povolenie preruseni
	sei

	; vymazanie pocitadla preruseni
	clr COUNT		

LOOP:
	rjmp LOOP
	
	

; rutina prerusenia
TIMER0_OVF:
	; ulozenie aktualnej hodnoty registrov
	push TEMP		; ulozenie hodnoty registra R16
	in TEMP, SREG	; ulozenie hodnoty SREG
	push TEMP

	; vlastny kod rutiny (moze lubovolne menit R16 a SREG)
	INC COUNT
	cpi COUNT, POCET_PRERUSENI	; porovnanie	
	brlo SKOK

		clr COUNT		; vymazanie pocitadla preruseni
		in TEMP, PINC	; 
		COM TEMP
		out PORTC, TEMP

SKOK:
	; obnovenie registrov do stavu pred vykonanim rutiny prerusenia
	pop TEMP		; obnovenie hodnoty SREG
	out SREG, TEMP
	pop TEMP		; obnovenie hodnoty registra R16

	reti			; ukoncenie rutiny prerusenia


