Hallo dl1akp,
hast Du das Pollin Evo Board??
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, AndreasCode:$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
Hallo dl1akp,
hast Du das Pollin Evo Board??
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
Hello,
I think you forgot an I2C Stop
See the code below.
Greetings,
Drifter2006
Code:$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
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
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
Lesezeichen