nase
15.07.2008, 18: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
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