.include "m8def.inc" .def temp =r16 .def temp1 =r17 .def temp2 =r18 .equ CLOCK =4000000 ;UART definieren .equ BAUD =9600 .equ UBRRVAL =CLOCK/(BAUD*16)-1 .org 0x000 rjmp Main Main: ldi temp,HIGH(ramend) ;init Stack Pointer out SPH,temp ldi temp,LOW(ramend) out SPL,temp rcall UART_init ;UART aktivieren rcall I2C_init ;I2C aktivieren ldi temp,1 ;Port B0 auf Ausgang als out DDRB,temp ;Trigger fürs Oszi sei ;Interupts einschalten ;_____________________________________________________________________________________________________ ; Schleife fürs Oszi Loop: ldi temp,0xff ;Triggersignal out PORTB,temp rcall warten ;Wartezeit um die Durchgänge unterscheiden zu können ldi temp,0x0 ;Triggersignal out PORTB,temp rcall schleife_read ;Als erstes habe ich ein schleife_write laufen lassen ldi temp,'N' ;Nur zur Ausgabe am UART um zu sehen das ein neuer Datensatz beginnt rcall UART_send ldi temp,10 rcall UART_send ldi temp,13 rcall UART_send rcall I2C_stop ;Übertragung deaktivieren rjmp loop ;_____________________________________________________________________________________________________ ; Test Schleife Schleife_read: rcall I2C_start ;Startsignal wir vom SPeicher mit ACK beantwortet ldi temp,0b10100100 ;Adresse des Speichers 0 für schreiben am Ende rcall I2C_send ;Ack als Antwort ; Adresse zum Lesen in SPeicher schreiben ldi temp,0 ;Register festlegen High-Byte =1 rcall i2c_send ldi temp,32 ;Register festlegen Low-Byte =0 ist eins weniger als die Beschriebene Adresse rcall i2c_send rcall I2C_start ;Neustart des Speichers ldi temp,0b10100101 ;zum Lesen öffnen rcall I2C_send rcall i2c_read ;Dreimal auslesen einer drunter bis einer drüber rcall i2c_read rcall i2c_read ret Schleife_write: rcall I2C_start ;Speicher neu starten ldi temp,0b10100100 ;zum schreiben öffnen rcall I2C_send ldi temp,0 ;Adresse übergeben Hig Byte=1 rcall i2c_send ldi temp,32 ;low Byte=1 rcall i2c_send ldi temp,0b11100111 ;Testwert ausgene- in den Speicher Schreiben rcall I2C_send ret ;_____________________________________________________________________________________________________ ; I2C Subs I2C_init: ;Bus Frequenz=f_cpu/(16+2*TWBR*4^TWPS) ;Normal sind 100kHz - 400kHz ;eventuell Interrupts einschalten (sei) ldi temp,0xa ;TWI Clock 0-FF = TWBR out TWBR,temp ldi temp,0x2 ;TWI prescalar 0-3 = TWPS out TWSR,temp ;factors (1 4 16 64) ret I2C_start: ldi r16,(1<