PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C EEPROM bringt programm zum absturz



Keksdose
13.02.2006, 11:57
Ich versuche mit dem Code aus diesem Artikel: https://www.roboternetz.de/phpBB2/viewtopic.php?t=12086
ein 256kb eeprom anzusteuern. Angeschlossen ist es richtig und die SCL und SDA ports sind auch richtig konfiguriert. Hab den fehler schon soweit eingegrenzt das ich sagen kann das es daran liegt das sich das programm komplett aufhängt sobald mit Call Write_eeprom(1 , A , Value) die Sub aufgerufen wird.
Woran liegt das ? Ist der code falsch ? Hab auch schon andere sachen probiert und in die sub n return eingebaut usw. aber das bringt nix. Hängt sich einfach auf das ding...
Hat jemand ne ahnung und kann mir helfen ? 8-[

uwegw
13.02.2006, 12:04
sieht auf den ersten Blick so aus, als würde das EEPROM nicht auf deinen Befehl reagieren, und weil die Routine anscheinend ne Rückmeldung erwartet und kein Timeout eingebaut hat, wartet sie nun ewig und drei Tage...

sicher, dass aucgh die Adress am EEPROM richtig eingestellt ist?

gibt es in Bascom einen Befehl, mit dem man feststellen kann, ob unter einer bestimmten Adresse überhaupt ein Slave vorhanden ist und antwortet?

Keksdose
13.02.2006, 13:15
Also die 2 Adress Pins sind jetzt unbeschaltet also 0
Hab auch schon beide auf Masse gelegt aber das hilft auch nichts. Hab auch das EEPROM schon ausgetauscht weil ich schon dachte es wär kaputt. Hab zum glück 2 bestellt...
Pullup Widerstände hab ich auch (10k) an SDA und SCL aber funzt weder mit noch ohne...
Benutzt der I2C befehl von bascom vielleicht nen Timer und das liegt daran das ich beide Timer schon benutze ?

Vitis
13.02.2006, 13:31
hi, dein eeprom ist auch das 24c256 oder 24c128 ?

ne, n timer wird da nicht benutzt, ich hab die auch fast alle
in betrieb bei der Routine die ich da eingestellt habe.

ich tippe darauf, das du nicht high und lowbyte der
speicherzelle sendest und der eeprom dann einfach nix macht.

oops, ich hatte ja die generierung der adresse im codebeispiel nicht drinne,
hab ich nachgebessert, nun müssts funktionieren

PS: der Speicherbeich der Adressdaten ist dem jeweiligen Baustein anzupassen, aber bascom meckert schon wenn der bereich schon belegt ist. Dann einfach weiter probieren bis ein freier gefunden ist. wichtig: die overlay-variablen sind auch anzupassen.

Keksdose
13.02.2006, 14:26
Mein eeprom ist das 24c256. Aber nu versteh ich gar nix mehr: Was sind overlay variablen ?
Das mit den high und lowbytes der Adresse hab ich glaub ich wohl verstanden. Kannste vielleicht n code posten der für den 24c256 funzt ? Und mir erklären was overlay variablen sind ?

Keksdose
13.02.2006, 17:10
Hm hab mehrere fehler bei mir gefunden: Im datenblatt hab ich übersehen das da "Bottom View" drunterstand und ich hab gedacht das wär von oben gesehen. War also total falsch angeschlossen.
Da ich beide von meinen eeproms aber schon mit falschem anschluss ausprobiert hab, hab ich gedacht das die nu schrott sind.
Bis ich auf die geniale idee gekommen bin und die eeproms in der c-control ausprobiert hab. Da gehen die beide aber noch.
Also muss das an der software liegen.
Werd nu mal das 8kb-eeprom aus der c-control in meinen robby einbauen und mit dem bascom sample testen. Wenns dann geht is gut dann lass ich das erst so.
8kb sollten eigentlich erst mal ausreichen...

Vitis
13.02.2006, 21:25
hab den code in dem von dir angeführten Artikel geändert:






Declare Sub Write_eeprom(byval Adresh As Byte , Byval Adresl As Byte , Byval Value As Byte)
Declare Sub Read_eeprom(byval Adresh As Byte , Byval Adresl As Byte , Value As Byte)

' Adresse erzeugen:
' Pin A0 und A1 sind intern mit Pulldowns versehen, sind also
' wenn extern nicht beschaltet 0
' Die Der Baustein halt serienmäßig die Adresse Binär:
' 1 0 1 0 0 A1 A0 R/W
' also, angenommen man möcht bei A0 = 0 und A1=0 schreiben:
' Adresse: 10100000 = 160
' Lesen Adresse: 10100001 = 161
'
' der 24c128 und 24c256 brauchen für die Adressierung 2 Byte
' Den High-Byte der Adresse und den Lowbyte der Adresse.
' Einfach, da die soviel Speicher habn :o)

Const Addressw = 160 'slave write address
Const Addressr = 161 'slave read address

Dim B1 As Byte
Dim Value As Byte 'dim byte
dim Adresse as word at &HA0 ' Der Speicherbereich ist dem jeweiligen Baustein anzupassen, muß aber den overlayvariablen gleich sein
Dim Adresh As Byte at &HA1 overlay 'Highbyte der Adresse

Dim Adresl As Byte at &HA0 overlay 'Lowbyte der Adresse
Dim A As Byte 'allgemeine Variable für Berechnungen

For Adresse = 1 To 5 ' die ersten 5 Byte schreiben
Value = Adresse + 100 'Beginnend mit Zahlenwert 105 um Verwechslungen zu vermeiden
Call Write_eeprom(1 , Adresse , Value) 'Daten schreiben
Next Adresse

For Adresse = 1 To 5 'die geschriebenen 5 Byte auslesen
Call Read_eeprom(1 , Adresse , Value) 'auslesen
Print Value 'Ausgabe an UART
Next Adresse

Sub Write_eeprom(byval Adresh As Byte , Adresl As Byte , Value As Byte)
I2cstart 'start condition
I2cwbyte Addressw 'slave address
I2cwbyte Adresh 'asdress H of EEPROM
I2cwbyte Adresl 'asdress L of EEPROM
I2cwbyte Value 'value to write
I2cstop 'stop condition
Waitms 10 'wait for 10 milliseconds
End Sub

Sub Read_eeprom(byval Adresh As Byte , Adresl As Byte , Value As Byte)
I2cstart 'generate start
I2cwbyte Addressw 'slave adsress
I2cwbyte Adresh 'asdress H of EEPROM
I2cwbyte Adresl 'asdress L of EEPROM
I2cstart 'repeated start
I2cwbyte Addressr 'slave address (read)
I2crbyte Value , Nack 'read byte
I2cstop 'generate stop
End Sub


overlayvariablen sind einfach variablen, die sich den speicherbereich teilen, sie greifen auf die gleichen sram-adressen zu