PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 24C512 read / write geht nicht - brauche Hilfe, bitte!



dl1akp
29.02.2008, 10:14
Hallo Leute,

Habe aus dem RN-Wissen ein paar Codeschnipsel entnommen zum Lesen und schreiben von I2c-EEPROMs. Habe den EEPROM auch richtig angeschlossen, auch die Pull-Ups sind dran.

Aber es geht nicht. Als gelesenen Wert erhalte ich immer "255".
Hier mein Code:

Was mache ich falsch??
Bitte helft mir auf die Sprünge

Danke, Andreas
$regfile = "m8def.dat" ' Chip auswählen
$crystal = 3686400 'hier Taktfrequenz eintragen
$baud = 9600 'Baudrate RS232
'
Config Lcd = 16 * 2 'LCD-Display configurieren
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.6 , Db7 = Portd.5 , E = Portb.1 , Rs = Portb.2
'
Config Scl = Portc.5 'PINs für I2C Bus
Config Sda = Portc.4
I2cinit
'
Dim X As Byte
Dim A As Word 'der wert, welcher ins EEPROM geschrieben werden soll
Dim B As Word
Dim Schreiben As Byte
Dim Lesen As Byte

'Die Adresse muß als Word-Variable definiert werden (Word=16Bit=0...65535)
'Damit kann ein EEPROM mit 256KBit (24C256) angesprochen werden (Adressen von 0...32768)
'und auch einer mit 512KBit (24C512). Adressbereich hier 0...65535
Dim Adresse As Word At $160 'Die Adresse als Word-Variable
Dim Low_adresse As Byte At $160 Overlay 'Zeiger auf das erste Byte
Dim High_adresse As Byte At $161 Overlay 'Zeiger auf das zweite Byte
'
Config Adc = Single , Prescaler = Auto 'AD-Wandler starten
Start Adc
'
Ddrb = &B00000000 'Ein-Ausgänge definieren
'Ddrc = &B00000000
Ddrd = &B00010000
'
Initlcd 'LCD initialiesieren
Cursor Off
Cls
'
'
Upperline
Lcd " Hallo AVR"
Wait 2
Cls



'===================Hauptprogramm================= ==============================
'Do

'----schreiben----
For Adresse = 1 To 10 'Adresse geht über die Byte-Grenze
Incr X '1 bis Überlauf
'
'Disable Interrupts
I2cstart 'Start
I2cwbyte &HA0 'Sende Slavadresse
I2cwbyte High_adresse 'Sende Speicheradresse High
I2cwbyte Low_adresse 'Sende Speicheradresse LOW
I2cwbyte X 'Sende Wert
I2cstop 'stop
Waitms 10
'Enable Interrupts
'
Locate 1 , 1
Lcd "->Adr." ; Adresse ; "Wert=" ; X ; " " 'Anzeige vom schreiben
Waitms 500
Next Adresse

'---lesen----
'Disable Interrupts
For Adresse = 1 To 10
I2cstart 'Start
I2cwbyte &HA0 'Sende Slavadresse +1 für Schreiben
I2cwbyte High_adresse 'Sende Speicheradresse High
I2cwbyte Low_adresse 'Sende Speicheradresse Low

I2cstart 'Start
I2cwbyte &HA1 'Sende Slavadresse +1 für Lesen
I2crbyte Lesen , Nack 'Lese Adresse vom EEprom
I2cstop 'Stop
'Enable Interrupts
'
Locate 2 , 1
Lcd "<-Adr." ; Adresse ; "Wert=" ; Lesen ; " " 'Anzeige vom lesen
Waitms 500
Next Adresse

'loop
End

Rofo88
29.02.2008, 19:07
Hallo dl1akp,

hast Du das Pollin Evo Board??

dl1akp
29.02.2008, 20:10
Hallo, Rofo88,

nein, ich habe ein selbst gebautes Board. Den 24C512 habe ich über Drähte angeschlossen. Es ist alles richtig konfiguriert und angeschlossen.

MfG

Drifter2006
01.03.2008, 18:08
Hello,
I think you forgot an I2C Stop
See the code below.
Greetings,
Drifter2006


$regfile = "m8def.dat" ' Chip auswählen
$crystal = 3686400 'hier Taktfrequenz eintragen
$baud = 9600 'Baudrate RS232
'
Config Lcd = 16 * 2 'LCD-Display configurieren
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.6 , Db7 = Portd.5 , E = Portb.1 , Rs = Portb.2
'
Config Scl = Portc.5 'PINs für I2C Bus
Config Sda = Portc.4
I2cinit
'
Dim X As Byte
Dim A As Word 'der wert, welcher ins EEPROM geschrieben werden soll
Dim B As Word
Dim Schreiben As Byte
Dim Lesen As Byte

'Die Adresse muß als Word-Variable definiert werden (Word=16Bit=0...65535)
'Damit kann ein EEPROM mit 256KBit (24C256) angesprochen werden (Adressen von 0...32768)
'und auch einer mit 512KBit (24C512). Adressbereich hier 0...65535
Dim Adresse As Word At $160 'Die Adresse als Word-Variable
Dim Low_adresse As Byte At $160 Overlay 'Zeiger auf das erste Byte
Dim High_adresse As Byte At $161 Overlay 'Zeiger auf das zweite Byte
'
Config Adc = Single , Prescaler = Auto 'AD-Wandler starten
Start Adc
'
Ddrb = &B00000000 'Ein-Ausgänge definieren
'Ddrc = &B00000000
Ddrd = &B00010000
'
Initlcd 'LCD initialiesieren
Cursor Off
Cls
'
'
Upperline
Lcd " Hallo AVR"
Wait 2
Cls



'===================Hauptprogramm================= ==============================
'Do

'----schreiben----
For Adresse = 1 To 10 'Adresse geht über die Byte-Grenze
Incr X '1 bis Überlauf
'
'Disable Interrupts
I2cstart 'Start
I2cwbyte &HA0 'Sende Slavadresse
I2cwbyte High_adresse 'Sende Speicheradresse High
I2cwbyte Low_adresse 'Sende Speicheradresse LOW
I2cwbyte X 'Sende Wert
I2cstop 'stop
Waitms 10
'Enable Interrupts
'
Locate 1 , 1
Lcd "->Adr." ; Adresse ; "Wert=" ; X ; " " 'Anzeige vom schreiben
Waitms 500
Next Adresse

'---lesen----
'Disable Interrupts
For Adresse = 1 To 10
I2cstart 'Start
I2cwbyte &HA0 'Sende Slavadresse +1 für Schreiben
I2cwbyte High_adresse 'Sende Speicheradresse High
I2cwbyte Low_adresse 'Sende Speicheradresse Low

I2cstop '<<<<<<<<<<<<<<<<<<<---------------------------------HERE'

I2cstart 'Start
I2cwbyte &HA1 'Sende Slavadresse +1 für Lesen
I2crbyte Lesen , Nack 'Lese Adresse vom EEprom
I2cstop 'Stop
'Enable Interrupts
'
Locate 2 , 1
Lcd "<-Adr." ; Adresse ; "Wert=" ; Lesen ; " " 'Anzeige vom lesen
Waitms 500
Next Adresse

'loop

dl1akp
03.03.2008, 08:09
Hello Drifter2006,

thanks for the hint. I really forgot the i2cstop.
But it still isn't working!

Geht trotzdem nicht, auch mit i2cstop drin, wo es fehlte.

Hat denn keiner eine Idee??
Bitte Hilfe!

MfG, Andreas

dl1akp
03.03.2008, 08:30
Hi Leute,

jetzt ist mir endlich ein Lichtausfgegangen!!!
Konnte nicht gehen.
Ich hatte im Code noch die Adresse vom 24C16 drin, anstatt umzuändern auf den 24C512!!! ](*,)

Sorry, kann ja mal passieren! Jetzt gehts.

MfG, Andreas