- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 3 von 3

Thema: Benötige Hilfe beim IC2 EEprom

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    18.03.2007
    Ort
    NRW
    Beiträge
    62

    Benötige Hilfe beim IC2 EEprom

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    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:

    Code:
    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.
    #ifndef MfG
    #define MfG

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    18.03.2007
    Ort
    NRW
    Beiträge
    62
    Zitat Zitat von Jaecko
    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:

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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress