.include "m8def.inc"

.def temp 		= r16
.def temp1	 	= r17
.def temp2		= r18
.def cv1 		= r19
.def cv2 		= r20 					
.def cv3 		= r21 				
.def cv4_7 		= r22
.def cv11 		= r23				
.def pwmcount	= r24

.org 0x000
	rjmp 	main

.org OVF2addr
	rjmp    timer2_overflow       					;Timer Overflow Handler

.cseg

main:

	ldi     temp, 		LOW(RAMEND)     			;Stackpointer initialisieren
    	out    SPL,		temp
   	ldi     temp, 		HIGH(RAMEND)
    	out    SPH, 		temp
	
	ldi    temp, 		$FF
	out   DDRC, 		temp              			;Port C0,C1,C2 als Ausgangsregister

	rcall 	readcvdata								;CV Werte aus eeProm lesen und in SRAM ablegen

main1:
	
	ldi	temp, 		(1<<CS20)					;CS00 setzen Teiler 1
	out	TCCR2,		temp

	ldi 	temp, 		(1<<TOIE2)     				;TOIE0: Interrupt bei Timer Overflow
	out 	TIMSK, 		temp
	
	ldi	temp,		$00
	sts	srPWMCount,   temp						;Zähler Timer Sram am Anfang null setzen
	
	sei		

loop:
	rjmp	loop

;pwm für portc für C0-C3

timer2_overflow:                      				;Timer 0 Overflow Handler
    lds 	pwmcount, 	srPWMCount  				;den PWM Zähler aus dem Speicher holen
    inc     pwmcount	              				;den PWM Zähler von 0 bis 127 zählen lassen
    cpi     pwmcount, 	255	          				;wurde 255 erreicht?
    brne    WorkPWM				  					;NEIN
    clr     pwmcount				  				;Ja: Zähler 0 setzen

WorkPWM:
	sts		srPWMCount, pwmcount		  			;den PWM Zähler wieder speichern
	ldi     temp, 		0b11111000      			;0 .. Led an, 1 .. Led aus
	lds		pwmcount, 	srPWMCount

	lds		temp1, 		srCV2
    cp      pwmcount, 	temp1         				;Ist der Grenzwert für Led 1 erreicht
    brlo    OneOn
    ori     temp, 		$01
 
OneOn:  
	lds		temp1, 		srCV3
    cp      pwmcount, 	temp1         				;Ist der Grenzwert für Led 2 erreicht
    brlo    TwoOn
    ori     temp, 		$02
		
TwoOn:  
    lds	 temp1, 	srCV11
    cp      pwmcount, 	temp1         				;Ist der Grenzwert für Led 3 erreicht
    brlo    SetBits
    ori     temp, 		$04
 
SetBits:                              				;Die neue Bitbelegung am Port ausgeben
    out     PORTC, 		temp
	
	reti                   

;daten der cv werte aus eeprom lesen und im sram ablegen

read_sram1:
	sts		srCV1, 		temp1	  					; Lade temp in SRAM Stelle srCV1
	inc		temp2
    rcall 	readcvdata

read_sram2:
	sts		srCV2,		temp1
	inc		temp2
    rcall 	readcvdata

read_sram3:
	sts		srCV3, 		temp1
	inc		temp2
    rcall 	readcvdata

read_sram4:
	sts		srCV4_7, 	temp1
	inc		temp2
    rcall 	readcvdata

read_sram5:
	sts		srCV11, 	temp1
	inc		temp2
    rcall 	readcvdata

readcvdata:    

	ldi     ZL, 		LOW(eeCV1)        			;Low-Byte der Adresse in Z-Pointer
   	ldi     ZH, 		HIGH(eeCV1)       			;High-Byte der Adresse in Z-Pointer
	cpi		temp2, 		0			  	;Vergleiche temp2 mit 0
	breq	EEPROM_read			  			;Wenn gleich dann EEPROM_read ausführen
	cpi		temp2, 		1
	breq	read_sram1

	ldi     ZL, 		LOW(eeCV2)        
    	ldi     ZH, 		HIGH(eeCV2)       
	cpi		temp2, 		2			 
	breq	EEPROM_read
	cpi		temp2, 		3
	breq	read_sram2

	ldi     ZL, 		LOW(eeCV3)        
    	ldi     ZH, 		HIGH(eeCV3)       
	cpi		temp2, 		4			 
	breq	EEPROM_read
	cpi		temp2, 		5
	breq	read_sram3
    
	ldi     ZL, 		LOW(eeCV4_7)      
    	ldi     ZH, 		HIGH(eeCV4_7)    
	cpi		temp2, 		6			 
	breq	EEPROM_read
	cpi		temp2, 		7
	breq	read_sram4
    
	ldi     ZL, 		LOW(eeCV11)      
    	ldi     ZH, 		HIGH(eeCV11)    
	cpi		temp2, 		8			 
	breq	EEPROM_read
	cpi		temp2,		9
	breq	read_sram5

	ldi		temp1,		0x00
	ldi		temp2,		0x00
	
	rcall	main1

EEPROM_read:
	sbic	EECR,		EEWE						;prüdfe ob der vprherige Schreibzugriff beendet ist
	rjmp	EEPROM_read								;NEIN nochmal prüfen
	out		EEARH, 		ZH							;Adresse laden
	out		EEARL, 		ZL
	sbi		EECR, 		EERE						;Lesevorgang aktivieren
	in		temp1, 		EEDR
	inc		temp2
	rcall	readcvdata
	
	ret

; eeprom daten, hier die Standart CV Werte
.eseg	
			eeCV1:		.db 0x01					;Adresse der Lok
			eeCV2:		.db $01						;Dimmung Ausgang C0 einstellbar zwischen 0x00 und 0xF7
			eeCV3:		.db 20						;Dimmung Ausgang C1 einstellbar zwischen 0x00 und 0xF7
			eeCV4_7:	.db 0x01 					;Richtungsabhängige Steuerung, Abschaltung und Steuerung Unterprogramme
			eecv11: 	.db $FF						;Dimmung Ausgang C3 einstellbar zwischen 0x00 und 0xF7
		
;sram daten
.dseg
			srPWMCount:	.BYTE 1						;Der PWM Counter (0 bis 127)
			srCV1:	    .BYTE 1						;5 Bytes für CV Daten
			srCV2:	    .BYTE 1
			srCV3:	    .BYTE 1
			srCV4_7:	.BYTE 1
			srCV11:	    .BYTE 1