;//////////////////////////////////////////////////////
;//
;// Diese Quellcodedatei wurde automatisch erzeugt.
;// SiSy SPRG CodeGenerierung
;//
;//////////////////////////////////////////////////////
;///<ObjektNummer>15</ObjektNummer>        GoToSiSy:o:15


;+-----------------------------------------------------------------------------
;| Title      : Assembler Grundgerüst für ATmega8
;+-----------------------------------------------------------------------------
;| Funktion   : ...
;| Schaltung  : ...
;+-----------------------------------------------------------------------------
;| Prozessor  : ATmega8
;| Takt       : 3,6864 MHz
;| Sprache    : Assembler
;| Datum      : ...
;| Version    : ...
;| Autor      : ...
;+-----------------------------------------------------------------------------
.include        "AVR.H"
;------------------------------------------------------------------------------
begin:
    rjmp    main                        ; RESET External Pin, Power-on Reset, Brown-out Reset and Watchdog Reset
    reti                                ; INT0 External Interrupt Request 0
    reti                                ; INT1 External Interrupt Request 1
    reti                                ; TIMER2 COMP Timer/Counter2 Compare Match
    reti                                ; TIMER2 OVF Timer/Counter2 Overflow
    reti                                ; TIMER1 CAPT Timer/Counter1 Capture Event
    reti                                ; TIMER1 COMPA Timer/Counter1 Compare Match A
    reti                                ; TIMER1 COMPB Timer/Counter1 Compare Match B
    reti                                ; TIMER1 OVF Timer/Counter1 Overflow
    reti                                ; TIMER0 OVF Timer/Counter0 Overflow
    reti                                ; SPI, STC Serial Transfer Complete
    reti                                ; USART, RXC USART, Rx Complete
    reti                                ; USART, UDRE USART Data Register Empty
    reti                                ; USART, TXC USART, Tx Complete
    reti                                ; ADC ADC Conversion Complete
    reti                                ; EE_RDY EEPROM Ready
    reti                                ; ANA_COMP Analog Comparator
    reti                                ; TWI 2-wire Serial Interface
    reti                                ; SPM_RDY Store Program Memory Ready
;------------------------------------------------------------------------------

;r16 = Arbeitsregister
;r17 = wert (Testfall: 0b00000011 damit alle 3 LED's leuchten)
;r18 = daten
;r19 = Adress Low Byte
;r20 = Adress High Byte




;Port D Pin 2: Taster Daten senden
;Port D Pin 3: Taster Daten abrufen




;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


main:
   			ldi r16,hi8(RAMEND)                	; Main program start
   			out SPH,r16                   		; Set Stack Pointer to top of RAM
   			
   			ldi r16,lo8(RAMEND)
   			out SPL,r16
   			
   			ldi r16,0b11111111
   			out DDRB,r16						;PORT B als Ausgang konfigurieren
   			
   			ldi r16,0b00000000
   			out DDRC,r16						;PORT C als Eingang konfigurieren   
   			
   			ldi r16,0b11111111					;PULL-UP Widerstände aktivieren 
   			out PORTC,r16   
   			
   			ldi r16,0b00000000
   			out DDRD,r16
   			
   			ldi r16,0b11111100
   			out PORTD,r16
   			    			 
    			ldi r17,0b00000011 					;Der zu übertragende Wert
       			    			
    			ldi r19,0b00000000
    			 
    			ldi r20,0b00000000
    			
    			ldi r16,0b00000001					;
   			out TWBR,r16						;Baud Rate festlegen
   			
   			ldi r18,0b00000000
   			
    			
;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


mainloop:			wdr
   
		 	
		 	
			sbis PIND,2
			rcall External_EEPROM_Write 
	
			sbis PIND,3
			rcall External_EEPROM_Read
			
				
			
			rjmp mainloop
    
    
    
;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------   
     	

External_EEPROM_Write:	ldi r16,0b10100100			;
    			out TWCR,r16				;Start Bedingung Erzeugen
    		
			rcall wait 					;Warten bis Vorgang abgeschlossen -> TWINT Flag gesetzt
    			    			
    			in r16,TWSR					;Lädt Status aus TWSR Register in R16
    			andi r16,0b11111000
			cpi r16,0b00001000			;Vergleicht die Werte im Register R16 mit der Konstante 0x08 (Status Code für "Start Transmitted")
			brne ERROR					;Rücksprung falls keine Übereinstimmung.
			
			ldi r16,0b10100000			;Laden der Adresse und Write Anfrage
			out TWDR,r16				;Übergabe an I²C Daten-Register   
			ldi r16,0b10000100			;
			out TWCR,r16 				;Senden der Adresse und der Write Anfrage
			
			rcall wait 					;Warten bis Vorgang abgeschlossen -> TWINT Flag gesetzt 
						
			in r16,TWSR					;Lädt Status aus TWSR Register in R16
			cpi r16,0x18				;Vergleicht die Werte im Register R16 mit der Konstante 0x18 (Status Coder für Write request transmitted and Acknowledged) 
			brne ERROR				    ;Rücksprung falls keine Übereinstimmung 
			
			out TWDR,r20				;Übertragen High Adress Byte in I²C Datenregister
			ldi r16,0b10000100			;
			out TWCR,r16				;Start Übertragung des High Adress Byte's
			
			rcall wait 					;Warten bis Vorgang abgeschlossen -> TWINT Flag gesetzt 
						
			in r16,TWSR					;Lädt Status aus TWSR Register in R16
			cpi r16,0x28				;Vergleicht die Werte im Register R16 mit der Konstante 0x28 (Status Code für Data Byte transmitted and Acknowledged)
			brne ERROR 
			
			out TWDR,r19				;Übertragen Low Adress Byte in I²C Datenregister
			ldi r16,0b10000100			;
			out TWCR,r16				;Start Übertragung des Low Adress Byte's
			
			rcall wait					;Warten bis Vorgang abgeschlossen -> TWINT Flag gesetzt
			
			in r16,TWSR					;Lädt Status aus TWSR Register in R16
			cpi r16,0x28				;Vergleicht die Werte im Register R16 mit der Konstante 0x28 (Status Code für Data Byte transmitted and Acknowledged)
			brne ERROR 
			
			out TWDR,r17				;Übertragen des Wertes in I²C Datenregister
			ldi r16,0b10000100			;
			out TWCR,r16				;Start Übertragung des Wertes
			
			rcall wait
			
			in r16,TWSR					;Lädt Status aus TWSR Register in R16
			cpi r16,0x28				;Vergleicht die Werte im Register R16 mit der Konstante 0x28 (Status Code für Data Byte transmitted and Acknowledged)
			brne ERROR 
			
			ldi r16,0b10010100			;
			out TWCR,r16				;STOP Bedingung erzeugen
			
			ret 		
	
;------------------------------------------------------------------------------


;Warten auf TWINT Reset

wait:			in r16,TWCR 
			sbrs r16,7
			rjmp wait 
			ret
      
           			
;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
           			
ERROR:            			
           			sbi PORTB,3			
			ret            			
           			
           			
;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

External_EEPROM_Read: 	ldi r16,0b10100100			;
    			out TWCR,r16				;Start Bedingung Erzeugen  
    		
			rcall wait 					;Warten bis Vorgang abgeschlossen -> TWINT Flag gesetzt
    		
    			in r16,TWSR					;Lädt Status aus TWSR Register in R16
			cpi r16,0x08				;Vergleicht die Werte im Register R16 mit der Konstante 0x08 (Status Code für "Start Transmitted")
			brne ERROR					;Rücksprung falls keine Übereinstimmung.
			
			ldi r16,0b10100000			;Laden der Adresse und Write Anfrage
			out TWDR,r16				;Übergabe an I²C Daten-Register   
			ldi r16,0b10000100			;
			out TWCR,r16 				;Senden der Adresse und der Write Anfrage
			
			rcall wait 					;Warten bis Vorgang abgeschlossen -> TWINT Flag gesetzt 
			
			in r16,TWSR					;Lädt Status aus TWSR Register in R16
			cpi r16,0x18				;Vergleicht die Werte im Register R16 mit der Konstante 0x40 (Status Coder für "SLA+R transmitted and Acknowledged) 
			brne ERROR				    ;Rücksprung falls keine Übereinstimmung 
			
			out TWDR,r20				;Übertragen High Adress Byte in I²C Datenregister
			ldi r16,0b10000100			;
			out TWCR,r16				;Start Übertragung des High Adress Byte's
			
			rcall wait 					;Warten bis Vorgang abgeschlossen -> TWINT Flag gesetzt 
			
			in r16,TWSR					;Lädt Status aus TWSR Register in R16
			cpi r16,0x28				;Vergleicht die Werte im Register R16 mit der Konstante 0x28 (Status Code für Data Byte transmitted and Acknowledged)
			brne ERROR 
			
			out TWDR,r19				;Übertragen Low Adress Byte in I²C Datenregister
			ldi r16,0b10000100			;
			out TWCR,r16				;Start Übertragung des Low Adress Byte's
			
			rcall wait					;Warten bis Vorgang abgeschlossen -> TWINT Flag gesetzt
			
			in r16,TWSR					;Lädt Status aus TWSR Register in R16
			cpi r16,0x28				;Vergleicht die Werte im Register R16 mit der Konstante 0x28 (Status Code für Data Byte transmitted and Acknowledged)
			brne ERROR 
			
			ldi r16,0b10100100			;
    			out TWCR,r16				;Start Bedingung Erzeugen  
    		
			rcall wait 					;Warten bis Vorgang abgeschlossen -> TWINT Flag gesetzt
    		
    			in r16,TWSR					;Lädt Status aus TWSR Register in R16
			cpi r16,0x10				;Vergleicht die Werte im Register R16 mit der Konstante 0x08 (Status Code für "Start Transmitted")
			brne ERROR					;Rücksprung falls keine Übereinstimmung.
			
			ldi r16,0b10100001			;Laden der Adresse und Read Anfrage
			out TWDR,r16				;Übergabe an I²C Daten-Register   
			ldi r16,0b10000100			;
			out TWCR,r16 				;Senden der Adresse und der Write Anfrage
			
			rcall wait 					;Warten bis Vorgang abgeschlossen -> TWINT Flag gesetzt 
			
			in r16,TWSR					;Lädt Status aus TWSR Register in R16
			cpi r16,0x40				;Vergleicht die Werte im Register R16 mit der Konstante 0x40 (Status Coder für "SLA+R transmitted and Acknowledged) 
			brne ERROR				    ;Rücksprung falls keine Übereinstimmung 
			
			ldi r16,0b10010100			;STOP Bedingung erzeugen
			out TWCR,r16				;STOP Bedingung erzeugen
			
			in r18,TWDR					;Daten aus I²C Daten Register in Register "daten" übertragen
			
			out PORTB,r18				;Daten am PORT B ausgeben 
			
			ret
			

;---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
