PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Benötige Hilfe beim IC2 EEprom



nase
15.07.2008, 17:48
Versuche einen Datenlogger zu basteln mit einem Atmega 8 und als Datenspeicher ein EEprom I2C 24c64.
Nun hab ich es hinbekommen ins EEprom zu schreiben und auch wieder auszulesen, allerdings kann ich nur 256 Adressen beschreiben, auch wenn ich ein EEprom z.B. 24c128 nehme kann ich nur 256 Adressen benutzen.
Wenn mir jemand helfen kann , dann bitte für den Laien verständlich.
Danke.

gruß Nase

Hier ein Auszug aus dem Programm:

'-------------------- Datenlogger Version 1a --------------------------------------------'

'
'------------------------------------------------------------------------------
' '
'Testprogramm für ATmega8 '
'Der gesendete Text kann mit dem Hyperterminal von Windows angezeigt werden' '
'Einstellungen am Hyperterminal: '
' Bits pro sekunde: 9600 '
' Datenbits : 8 '
' Parität : keine '
' Stoppbits : 1 '
' Flusssteuerung : keine '
'Display an folgenden Pins
'B5 = Enable
'B4 = RS
'B3 = DB7
'B2 = DB6
'B1 = DB5
'B0 = DB4

'Ic2 EEprom 24C64

'************************************************* ******************************
$regfile = "m8def.dat" 'Definiert den Atmega 8
$crystal = 3686400 ' Definiert Quarz von 3,686400 MHz
Ddrd = &B10100000 'Port D5 un D7 als Ausgänge Rest als Eingang
Portd = &B00001100 ' Pull up aktivieren von d2 und d3
Config Sda = Portc.4 'Definiert die i2C Datenleitung
Config Scl = Portc.5 'Definiert die I2c Tacktleitung


'-------------- Variable für EEprom Prozedur ----------------------------------
Dim Taste As Byte ' Varable für Tastendruck der PC Tastatur
Dim L As Word ' Variable für Adress Schleife beim Lesen
Dim Lesen As Word
Dim S As Word ' Variable für Adresse (Speichen EEprom)
Dim Y As Word ' Variable für Löschprozedure
Dim Y2 As Word ' Varable für Komplettes auslesen des EEproms
Dim Y1 As Word
Dim S1 As Word

'********************* Hauptprogramm *****************************************
Print " Mit L EEprom Lesen"
Print " Mit S EEprom beschreiben"

Do
Taste = Inkey() ' Liest Tastendruck über Rs232 ein

If Taste = 108 Then Gosub Lesen '(taste L) Zum Untermenü Lesen
If Taste = 115 Then Gosub Schreiben '(Taste S ) zum Untermenü schreiben
Loop
End

'********************* EEprom schreiben *********************************************
schreiben:
'Y1 ist der Wert der ins EEprom geschrieben wird
Y1 = 0
For Y = 0 To 260
I2cstart ' IC2 Start
I2cwbyte &HA0 ' Geräteadresse für EEprom senden
I2cwbyte 1 ' High Speicheradresse senden
I2cwbyte Y ' Low Speicheradresse Senden
I2cwbyte Y1 ' Epprom mit 255 überschreiben ( löschen)
I2cstop

Print "Schreibe in Adresse " ; Y
Print "den Wert " ; Y1
Waitms 30 ' Pause um Zeit zum Speichen zu lassen
Incr Y1
Next Y


Return
'************************* EEprom auslesen **************************
lesen:

For Y2 = 1 To 260 ' Schleifenanfang
I2cstart
I2cwbyte &HA0 'Slave Adresse senden Binär 1010 0000 , Dezi =160
I2cwbyte 1 'High Speicheradresse senden
I2cwbyte Y2 ' Low Specheradresse senden
I2cstart 'Start I2C
I2cwbyte &HA1 'Slave Adresse senden Binär 1010 0001 , Dezi =161
I2crbyte Lesen , Nack ' Lese von EEprom
I2cstop ' I2C Stop
Waitms 30
Print "Lese aus Adresse " ; Y2 ' Gelesener Wert aus EEprom auf Display anzeigen
Print "den Wert "
Print Lesen
Waitms 30
Next Y2
Return

Jaecko
17.07.2008, 06:42
Dass du da nur 256 Adressen kriegst, ist bei dem Programm normal, da du als High-Address immer 1 sendest.

Wenn du bei nem grossen Speicher (z.B: 24ST512) alle Adressen ansprechen willst, dann müsste deine Schreibroutine z.B. so aussehen:



For Y_Hi = 0 To 255
For Y_Lo = 0 To 255 ' Maximal nur 255!!
I2cstart ' IC2 Start
I2cwbyte &HA0 ' Geräteadresse für EEprom senden
I2cwbyte Y_Hi ' High Speicheradresse senden
I2cwbyte Y_Lo ' Low Speicheradresse Senden
I2cwbyte Y1 ' Epprom mit 255 überschreiben ( löschen)
I2cstop
Next Y_Lo
Next Y_Hi


Der schreibt dir dann hier alle Adresse von 0 - 65535 mit dem Wert Y1 voll.

Noch als Tip: Wenn du sequentiell schreiben willst, muss du nicht jedes Mal IC2_Start, Adresse Senden etc. machen.
Es reicht, wenn du die Startadresse schickst und danach die Bytes, die du speichern willst. Geht schneller als so.
Mach ich z.B. beim "formatieren" solcher EEPROMs.
Beim Lesen genau so: wenn du nach dem aktuellen noch ein Byte willst, mit ACK bestätigen; wird das letzte geholt, dann NACK.

nase
21.07.2008, 22:20
Dass du da nur 256 Adressen kriegst, ist bei dem Programm normal, da du als High-Address immer 1 sendest.

Wenn du bei nem grossen Speicher (z.B: 24ST512) alle Adressen ansprechen willst, dann müsste deine Schreibroutine z.B. so aussehen:



For Y_Hi = 0 To 255
For Y_Lo = 0 To 255 ' Maximal nur 255!!
I2cstart ' IC2 Start
I2cwbyte &HA0 ' Geräteadresse für EEprom senden
I2cwbyte Y_Hi ' High Speicheradresse senden
I2cwbyte Y_Lo ' Low Speicheradresse Senden
I2cwbyte Y1 ' Epprom mit 255 überschreiben ( löschen)
I2cstop
Next Y_Lo
Next Y_Hi


Der schreibt dir dann hier alle Adresse von 0 - 65535 mit dem Wert Y1 voll.

Noch als Tip: Wenn du sequentiell schreiben willst, muss du nicht jedes Mal IC2_Start, Adresse Senden etc. machen.
Es reicht, wenn du die Startadresse schickst und danach die Bytes, die du speichern willst. Geht schneller als so.
Mach ich z.B. beim "formatieren" solcher EEPROMs.
Beim Lesen genau so: wenn du nach dem aktuellen noch ein Byte willst, mit ACK bestätigen; wird das letzte geholt, dann NACK.

Ja , vielen Dank für deine Hilfe, hat mir sehr geholfen.
Wenn ich jetzt die obere Adresse auch anspreche, kann ich auch mehr Adressen verwalten, und die Sache mit dem speichern hat auch prima geklappt.
gruß Nase