.include "m8def.inc"				; Atmega8 (extern 16 MHz Quarz)



.def temp = r16					; Registern Namen zuweisen
.def leds = r17
.def SubCount_1 = r18
.def SubCount_2 = r19
.def SubCount_3 = r20
.def SubCount_4 = r21
.def SubCount_5 = r22
.def RSMask = r23
.def PhiMask = r24
.def TestMask = r25


.org 0x0000					; hat mit Interrupts zu tun
	rjmp main
.org OVF0addr					; springt bei Timer0 Interrupt zu timer0_overflow
	rjmp timer0_overflow

main:						; Hauptprogramm
	ldi temp, LOW(RAMEND)
	out SPL, temp
	ldi temp, HIGH(RAMEND)
	out	SPH, temp

	ldi temp, 0xff
	out DDRB, temp

	ldi RSMask,  0b00000100
	ldi PhiMask, 0b00000011
;	ldi TestMask, 0b00100000
	

	ldi leds, 0b00000010                    ; ####### Starteinstellung der Ausgänge (Phi_2 invert zu phi_1)
;	ldi leds, 0b00111001
	out portb, leds
						; ####### Über die prescaler-Einstellung kann der Takt stufenweise schneller oder langsamer eingestellt werden
	ldi temp, 0b00000001			; ####### Timer0 prescaler: 0b00000101 = 1024 (langsamer Takt); ...0100 = 256; ...0011 = 64; ...0010 = 8; ...0001 = 1 (schneller Takt)
	out TCCR0, temp
	ldi temp, 0b00000001
	out TIMSK, temp
	ldi SubCount_1, 0b00000000		; während einem Auslesetakt werden Phi1 und Phi2 gegenläufig und RS mit Phi1 gleich, aber kürzer getaktet.
	ldi SubCount_2, 0b00000000		; Die SubCounts werden für die Zeitschleifen benötigt (244 x SubCount_2 und ca. 22 x SubCount_3 ergeben eine Anzahl von Auslesetakten von ca. 5370 Takten, was der Pixelanzahl des Linien-LCDs (ILX535K) entspricht)
	ldi SubCount_3, 0b00000000		; 
	ldi SubCount_4, 0b00000000		; SubCount_4 und SubCount_5 werden für den Zeitraum benötigt, in der das Linien-LCD eine Signalaufnahme macht.
	ldi SubCount_5, 0b00000000
	sei
loop: rjmp loop


;##########################################
timer0_overflow:                          ;########## Hier beginn die Taktgeneration in Abhängigkeit des Timerinterruptes

	cpi SubCount_4,1			; Vergleiche immediate den Zähler SubCount_4 mit 1. Das Ergebnis wird im nächsten Takt ausgewertet-->
	brge SubCount_4_inc			; Verzweige wenn größer oder gleich.
										;
	cpi SubCount_2, 10;244			; 244 x SubCount_2 und ca. 22 x SubCount_3 ergeben eine Anzahl von Auslesetakten von ca. 5370 Takten, was der Anzahl des Linien-LCDs (ILX535K) entspricht
;	breq SubCount_3_inc		; <--- Bitte Anpassen. Für Testzwecke werden nur 10 Auslesetakte zwischen der Sensorphase (nenne ich mal so, weil ich vermute, dass während der Taktfreien Zeit die belichteten Pixel ins Ausleseregister verschoben werden)
;	cpi SubCount_3, 22		; Im Normalbetrieb hier dann wieder Auscommentieren --> 244 x 22 = 5368 
	breq Signal_lesen			; wenn alle Pixel des CCDs ausgelesen sind wir das nächste Bild erfasst

Weiter:						; Ab hier werden Phi1-, Phi2- und RS-Takte generiert (siehe Datenblatt 5300 Pixel line CCD: ILX535K) 
	inc SubCount_1
	cpi SubCount_1, 125
	breq Phi_Takt
	cpi SubCount_1, 170
	breq RS_Takt
	cpi SubCount_1, 205
	breq RS_Takt
	cpi SubCount_1, 250
	breq Phi_Takt
	cpi SubCount_1, 251
	breq SubCount_2_inc
	reti

Phi_Takt:
	eor leds, PhiMask			; eor = exclusiv or: das leds-Register wird bei allen entsprechenden Bits, bei denen in der der PhiMask eine 1 gesetzt ist invertiert --> einfaches Blinken 
	out Portb, leds
	reti

RS_Takt:
	eor leds, RSMask
	out PORTB, leds
	reti


Signal_lesen:
	ldi leds, 0b00000010			; Taktausgabe zu Beginn der Sensorphase
	out PORTB, leds
	inc SubCount_4
	ldi SubCount_3, 0
	ldi SubCount_2, 0
	reti

SubCount_2_inc:
	inc SubCount_2
	ldi SubCount_1, 0
	reti

SubCount_3_inc:
	inc SubCount_3
	ldi SubCount_2, 0
	rjmp Weiter

SubCount_4_inc:
	inc SubCount_4
	cpi SubCount_4,40;250
	breq SubCount_5_inc
	reti

SubCount_5_inc:
	inc SubCount_5
	cpi SubCount_5, 3
	breq Sens_A
	cpi SubCount_5, 10
	breq Sens_B
	cpi SubCount_5, 13
	breq Sens_C
	ldi SubCount_4, 1
	reti

Sens_A:
	ldi leds, 0b00111010					
	out PORTB, leds
	ldi SubCount_4, 1
	reti

Sens_B:
	ldi leds, 0b00000010					
	out PORTB, leds
	ldi SubCount_4, 1
	reti

Sens_C:
	ldi SubCount_4, 0
	ldi SubCount_5, 0
	ldi leds, 0b00000010
	reti
