
.include "m32def.inc"

.equ CompareVal = 62	; Valoarea de comparare in registrul OCR0 pentru Timer0


; redefinirea registrilor
 .def flags = r2 
 .def temp  = r16
 .def cnt  =r18
 .def Itmp = r17
 .def cntL = r26
 .def cntH = r27 

.cseg	; segmentul de cod 
.org	0x0000
	rjmp	RESET	; Salt neconditionat

.org	INT0addr	; External Interrupt0 Vector Address
	reti

.org	INT1addr	; External Interrupt1 Vector Address
	reti

.org	INT2addr	; External Interrupt2 Vector Address
	reti
.org	OC2addr	    ; Output Compare2 Interrupt Vector Address
	reti 
.org	OVF2addr	; Overflow2 Interrupt Vector Address
	reti
.org	ICP1addr	; Input Capture1 Interrupt Vector Address
	reti
.org	OC1Aaddr	; Output Compare1A Interrupt Vector Address
	reti
.org	OC1Baddr	; Output Compare1B Interrupt Vector Address
	reti
.org	OVF1addr	; Overflow1 Interrupt Vector Address
	reti
.org	OC0addr	    ; Output Compare0 Interrupt Vector Address
	rjmp CompareSub
.org	OVF0addr	; Overflow0 Interrupt Vector Address
	reti
.org	SPIaddr	     ; SPI Interrupt Vector Address
	reti
.org	URXCaddr	; USART Receive Complete Interrupt Vector Address
	reti
.org	UDREaddr	; USART Data Register Empty Interrupt Vector Address
	reti
.org	UTXCaddr	; USART Transmit Complete Interrupt Vector Address
	reti
.org	ADCCaddr	; ADC Interrupt Vector Address
	reti
.org	ERDYaddr	; EEPROM Interrupt Vector Address
	reti
.org	ACIaddr 	; Analog Comparator Interrupt Vector Address
	reti
.org    TWIaddr   ; Irq. vector address for Two-Wire Interface
	reti
.org	SPMRaddr	; Store Program Memory Ready Interrupt Vector Address
	reti

//---------------------------------------------------------------
CompareSub:    ;Subrutina de prelucrare a intreruperii
 		; comenzi pentru subruta data
		in flags, SREG
/*		
		ADIW cntL,1
		out PORTA, cntL
 	    out PORTB, cntH
*/
		out SREG, flags
	 reti

; Programul principal
//--------------------------------------------------------------	 
RESET:	 
     ldi temp, Low(RAMEND) 	; initializam stiva
	 out SPL, temp
	 ldi temp, High(RAMEND) 
	 out SPH, temp
 
	 CLR temp				;resetam temp
	 		; Setam ca intrare PORTA 	
	 out DDRD, temp			; Setam ca intrare PORTD


	 SER temp
	 out DDRA, temp
	 out DDRB, temp		; Setam ca iesire PORTC


	 out PORTC, temp		; Setam ca input cu PullUp
	 out PORTD, temp

	 clr cntL
	 clr cntH

	ldi temp, CompareVal
	out OCR0, temp
	ldi temp,(1<<WGM01)|(0<<WGM00)|(0<<COM01)|(1<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00) ;alegem prescalerul 1/64
	out TCCR0, temp 

	ldi temp,(1<<OCIE0); permitem intreruperea la compare match
	out TIMSK, temp 
	sei


	ldi ZL, low(table<<2)
	ldi ZH, High(table<<2)
 MAIN: ; programul principal
	

	LPM temp, Z+
	out OCR0, temp
	andi ZL, 0xE0
	nop
	nop
	nop
	rcall Delay

 rjmp main

Delay:
	ldi cnt, 100
 ext_loop:
	push cnt
	ldi cnt, 250
 	cnt_loop:
 		nop
		nop
		nop
		nop
		nop
		nop
		nop
		dec cnt
	brne cnt_loop		
	pop cnt
 dec cnt
 brne ext_loop
	ret

 ;tabelul cu valori 
.org 0x0f00
table: 
	.db 0x05, 0x54, 0x00, 0x13, 0x88, 0x62, 0xf0, 0x0c 
	.db 0x15, 0x70, 0x30, 0x18, 0x18, 0x6f, 0xff, 0x1c 
	.db 0x85, 0x60, 0x3f, 0x18, 0xA8, 0x6f, 0x0a, 0x5c 
	.db 0x15, 0x70, 0x10, 0xc8, 0x18, 0x20, 0x1f, 0xB0


   
