Liebe Experten,
seit ein paar Tagen mache ich erste Experimente mit externen EEPROMs, und habe mir hierzu einen 24C65 gekauft.
Um mit dieser neuen Materie vertraut zu werden, wollte ich als erstes einfach nur ein einziges Byte an einem bestimmten Speicherplatz ablegen, es anschließend wieder auslesen und auf einem LCD anzeigen.
Mein Code hierfür sieht so aus:
Allerdings läuft alles in extremster Zeitlupe ab - Zwischen den LCD-Meldungen "Lesen" und "Schreiben" vergehen Minuten (!), und für die ausgelesene Variable Z wird 255 angezeigt (obwohl der Wert "5" in den Speicher geschrieben werden soll).Code:$regfile = "m8def.dat" $crystal = 1000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0 Initlcd Cursor = Off Cls Config Sda = Portd.3 Config Scl = Portd.2 I2cinit Dim Z As Byte Do Cls Locate 1 , 1 Lcd "Schreiben:" Waitms 500 I2cstart I2cwbyte &B10100000 '24C65, A2-A0 = 0, Schreiben I2cwbyte &B00000000 'H-byte Speicheradresse I2cwbyte &B00000010 'L-Byte Speicheradresse I2cwbyte 5 I2cstop Locate 1 , 1 Lcd "Lesen:" Waitms 500 I2cstart I2cwbyte &B10100000 '24C65, A2-A0 = 0, Schreiben I2cwbyte &B00000000 'H-byte Speicheradresse I2cwbyte &B00000010 'L-Byte Speicheradresse I2cstart I2cwbyte 10100001 '24C65, A2-A0 = 0, Lesen I2crbyte , Z , Nack I2cstop Cls Locate 1 , 1 Lcd Z Wait 1 Loop
Die Taktfrequenz stimmt, ich habe versuchsweise mal eine LED-Blinksequenz mit 1Hz vor die Do-Loop-Schleife gesetzt, die läuft korrekt ab.
Beim 24C65 habe ich die Adresseingänge A2-A0 auf GND gelegt, und die SDA-Leitung über 2k2 auf +5V. Interessanterweise sehe ich mit dem Oszi keinerlei "Traffic" auf den SDA- und SCL-Leitungen. Ich habe SDA und SCL auch schon mal auf andere Ports des Mega8 gelegt - genau das gleiche. Das DDR-Register des SCL-Ausganges habe ich auch versuchsweise mal auf 1 gesetzt (obwohl das ja mit "I2CINIT" schon erledigt sein sollte) - ebenfalls ohne Erfolg.
Hat jemand irgendeine Idee, was ich falsch mache??







Zitieren

Lesezeichen