.include "2313def.inc" .def temp1 = r16 .def data = r17 .def tx = r18 .equ SCL = 0 .equ SDA = 1 .cseg rjmp start ; Reset Handler reti ; IRQ0 Handler reti ; IRQ1 Handler reti ; Timer1 Capture Handler reti ; Timer1 Compare Handler reti ; Timer1 Overflow Handler reti ; Timer0 Overflow Handler reti ; UART RX Complete Handler reti ; UDR Empty Handler reti ; UART TX Complete Handler reti ; Analog Comparator Handler start: ldi temp1,RAMEND ; LOW-Byte der obersten RAM-Adresse out SPL,temp1 sbi UCR,TXEN ;TX aktivieren ldi temp1,4000000/(9600*16)-1 ;Baudrate (z.B. 9600) einstellen (bei 4MHz) out UBRR,temp1 sbi DDRB,SCL ; SCL ist Ausgang sbi DDRB,SDA ; SDA ist Ausgang sbi PortB,SCL ; SCL HIGH sbi PortB,SDA ; SDA HIGH rjmp MainLoop ; Ab ins Programm!!! reti serout: sbis USR,UDRE ;Warten, bis UDR für das nächste Byte bereit ist rjmp serout out UDR, tx ret ;zurück zum Hauptprogramm I2C_Wait: ; ============================= ; Warteschleifen-Generator ; 4000 Zyklen: ; ----------------------------- ; warte 3999 Zyklen: ldi R29, $1F WGLOOP0: ldi R30, $2A WGLOOP1: dec R30 brne WGLOOP1 dec R29 brne WGLOOP0 ; ----------------------------- ; warte 1 Zyklus: nop ; ============================= ret MainLoop: rcall I2C_Wait ;Start cbi PortB,SDA rcall I2C_Wait ;Adresse senden cbi PortB,SCL rcall I2C_Wait sbi PortB,SDA sbi PortB,SCL rcall I2C_Wait cbi PortB,SCL rcall I2C_Wait cbi PortB,SDA sbi PortB,SCL rcall I2C_Wait cbi PortB,SCL rcall I2C_Wait sbi PortB,SDA sbi PortB,SCL rcall I2C_Wait cbi PortB,SCL rcall I2C_Wait cbi PortB,SDA sbi PortB,SCL rcall I2C_Wait cbi PortB,SCL rcall I2C_Wait cbi PortB,SDA sbi PortB,SCL rcall I2C_Wait cbi PortB,SCL rcall I2C_Wait cbi PortB,SDA sbi PortB,SCL rcall I2C_Wait cbi PortB,SCL rcall I2C_Wait cbi PortB,SDA sbi PortB,SCL rcall I2C_Wait cbi PortB,SCL rcall I2C_Wait cbi PortB,SDA sbi PortB,SCL rcall I2C_Wait ;Ack.-Bit lesen cbi DDRB,SDA ; SDA ist nun Eingang rcall I2C_Wait cbi PortB,SCL rcall I2C_Wait sbi PortB,SCL rcall I2C_Wait ; hier lesen ldi tx,66 ;------------------------------------ sbis PinB,SDA ; Hier müßte der Pin doch LOW sein!!! ldi tx,65 ;------------------------------------ rcall serout sbi DDRB,SDA ; SDA ist nun wieder Ausgang ; rcall I2C_Stop rjmp MainLoop