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:
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
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).
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??
Lesezeichen