Nach längerem hin und her habe ich mich entschieden, das es an der Zeit ist mich mal mit I2C zu befassen und weil ich das Protokoll / den Bus auch verstehen möchte, will ich dies zunächst ohne zusätzliche Bibliotheken ausprobieren. Ich habe im m8 Datenblatt die TWI Kapitel (die Grundlagen) gelesen und daraus folgenden Programmcode erstellt, der eine Verbindung mit einem 24C02 herstellen soll - bis zum ersten ACK des Speichers - dieses kommt jedoch nicht und ich weiss nicht warum.
Mein 24C02 ist wie folgt mit meinem Mega8 verbunden
<pre>GND-|°-- |-VCC
GND-| |-nix
GND-| |-SCK
GND-|----|-SDA</pre>
Folglich müsste die 7bit Adresse des Speichers doch 1010000 sein und das erste zu sendende Byte 10100000 bzw 0xA0 sein. Ein gelungener Schritt wird durch ein Blinken an PB0 signalisiert.
4xBlinken müsste bedeuten, dass alles richtig ist, 5 mal, das kein Ack vom Slave eingegangen ist. Dies ist bei mir immer der Fall und ich kann es mir nicht erklären. Die Adressierung müsste mit 10100000 doch richtig sein für die genannte Beschaltung.Code:#include <avr/io.h> #include <util/delay.h> #define START 0x08 #define SLAVE_OK 0x18 #define F_CPU 8000000UL void blink(){ _delay_ms(300); PORTB |= (1<<PB0); _delay_ms(300); PORTB = 0; } int main(void) { DDRB = 0xFF; PORTB = 0; TWBR = 0x20; TWCR = (1<<TWINT); TWCR |= (1<<TWSTA); TWCR |= (1<<TWEN); while (bit_is_clear(TWCR, TWINT)){ }; blink(); if ((TWSR & 0xF8) == START){ blink(); } TWDR = 0xA0; TWCR = (1<<TWINT) | (1<<TWEN); while (bit_is_clear(TWCR, TWINT)){ }; blink(); if ((TWSR & 0xF8) != SLAVE_OK){ blink(); } else { blink(); blink(); } //hier ginge es dann mit den Daten weiter }
Vielen dank für eure Hilfe[/code]
Lesezeichen