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
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