

.NOLIST

.INCLUDE "m8def.inc"

.LIST



.def currentB= r0						; der alte Wert am PortB
.def currentD= r1						; der alte Wert am PortD
.def soll_1  = r2						; software timer für 10, 20 oder 30 sec einstellen
.def soll_2  = r3						; software timer für 120            sec einstellen		
.def control = r16                      ; Hilfsregister
										; 0= ControlBit Ein/Aus
										; 1= CH aus enable
										; 2=
										; 3= 
										; 4= Timer1 activ
										; 5= Timer2 activ
										; 6= Timer3 activ
										; 7= Timer4 activ
.def todoB   = r17						; Was muss an PortB abgearbeitet werden...
.def todoD   = r18						; Was muss an PortD abgearbeitet werden...
.def timer1  = r19						; software timer für 10, 20 oder 30  sec 
.def timer2  = r20						; software timer für 120             sec 				
.def nextB   = r21						; aktueller Wert an PortB
.def nextD   = r22						; aktueller Wert an PortD
.def timer0  = r23						; softwarezähler für 100ms
.def mp      = r23						; Init Hilfsregister		



 
; Interruptvektor

    RJMP  Reset                         ; Reset/Initialisierung
    RETI                            ; Externer Interrupt 0
    RETI                            ; Externer Interrupt 1
	RETI	                            ; Timer2 Compare Match 
	RETI	                            ; Timer2 Overflow 
	RETI    	 		                ; Timer1 Capture 
	RETI                                ; Timer1 Compare Match A
    RETI    			                ; Timer1 Compare Match B
	RJMP  Timer1Int                     ; Timer1 Overflow
	RJMP  Timer0Int                     ; Timer0 Overflow
    RETI                                ; SPI Serial Transfer Complete
    RETI                                ; USART, Rx complete
    RETI                                ; USART, Data Register empty
    RETI                                ; USART, Tx complete
    RETI                                ; ADC Conversion complete
    RETI		                		; EEPROM Ready Handler
    RETI                                ; Analog Comparator
	RETI		                		; 2 wire Serial Interface
    RETI                                ; Store Program Memory Ready



Reset:


 	LDI   mp,    low(RAMEND)			; Stackpointer initialisieren	
    OUT   SPL,   mp                    
    LDI   mp,    high(RAMEND)
    OUT   SPH,   mp
										; ports initialisieren
	LDI   mp,    0x00       			; 0x00 ins Arbeitsregister temp laden
    OUT   DDRB,  mp         			; Inhalt von temp ins IO-Register DDRB ausgeben
	LDI   mp,    0xFF       			; 0xFF ins Arbeitsregister temp laden
    OUT   DDRC,  mp         			; Inhalt von temp ins IO-Register DDRC ausgeben
	LDI   mp,    0x01      				; 0x01 ins Arbeitsregister temp laden, bit0 ausgang
    OUT   DDRD,  mp      				; Inhalt von temp ins IO-Register DDRD ausgeben

	SEI
	LDI   mp,    0x01                 	; Initiate Timer0 Vorteiler 1024
	OUT   TCCR0, mp 					; jede 65ms erfolgt ein Interrupt
	LDI   mp,    0x01
	OUT   TIMSK, mp		    			; Timer0 aktiviert...fängt er jetzt auch an??´stoppt man ihn durch löschen??
    
Main:
    SLEEP
	RJMP   Main

ControlRoutine:							; Bei Änderung an einem der Eingangs-Ports:
    SBRC   todoB,    7
	RCALL  x11					 
    SBRC   todoB,    6
	RCALL  x10			 
   	SBRC   todoB,    2
	RCALL  x9				 
    SBRC   todoB,    1
	RCALL  x8				 
    SBRC   todoB,    0
	RCALL  x7			 
    SBRC   todoD,    7
	RCALL  x6				 
    SBRC   todoD,    6
	RCALL  x5		 
	SBRC   todoD,    5
	RCALL  x4		 
    SBRC   todoD,    4
	RCALL  x3			 
    SBRC   todoD,    3
	RCALL  x2				 
	SBRC   todoD,    2
	RCALL  x1					 
	
	MOV    currentB, nextB          	; Neuen Wert von PortB übernehmen!!
	MOV    currentD, nextD          	; Neuen Wert von PortD übernehmen!!
    RET	

Timer0int:
	PUSH   mp							; Schreibe Registerinhalt vom temp auf den Stack
	IN     nextB, PortB					; schreibe PortB in Register nextB
	IN     nextD, PortD					; schreibe PortB in Register nextB
	MOV    todoB, nextB
	MOV    todoD, nextD
	EOR    todoB, currentB
	EOR    todoD, currentD
	MOV    mp,    todoB
	OR     mp,    todoD
	CPI    mp,    0x00
	BREQ   Timer0end
	RCALL  ControlRoutine	
	POP    mp		 					; Temp wird wiede hergestellt.
Timer0end:	
	RETI


x11:
	ANDI   todoB,   0b01111111
	RET
x10:
	ANDI   todoB,   0b10111111
	RET
x9:
	ANDI   todoB,   0b11111011
	RET
x8:
	ANDI   todoB,   0b11111101
	RET
x7:
	ANDI   todoB,   0b11111110
	RET
x6:
	ANDI   todoD,   0b01111111
	RET
x5:
	ANDI   todoD,   0b10111111
	RET
x4:
	ANDI   todoD,   0b11011111
	RET
x3:
	ANDI   todoD,   0b11101111
	RET
x2:
	ANDI   todoD,   0b11110111
	RET
x1:
	ANDI   todoD,   0b11111011
	RET


