-         

Ergebnis 1 bis 2 von 2

Thema: 24c128 24c256

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240

    24c128 24c256

    Anzeige

    Für diejenigen, die wie ich Probleme mit dem Umgang mit I2C EEPROM haben hab ich mal mein Ergebniss hier rein gestellt, auf dass es anderen helfen möge.

    Bausteine: 24c128 , 24c256

    Code:
    
    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
    
    ' Wires from the I2C address that are not connected will default to 0 in most cases!
    
    '   I2cstart      'start condition
    '   I2cwbyte &B1010_0000      'slave address
    '   I2cwbyte H      'high address
    '   I2cwbyte L      'low address
    '   I2cwbyte Value     'value to write
    '   I2cstop     'stop condition
    '   Waitms 10

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.01.2004
    Beiträge
    135
    Ich weiß nich obs an mir liegt jedenfalls hat diese lösung mit sehr viel hin und herprobieren immernoch nicht funktioniert. Habs nu mit bisschen rumsuchen und probieren anders gelöst. Deshalb meine Lösung nochmal damit sich nich noch mehr leute damit rumärgern müssen wenns nich geht
    Code:
    'Hardware: AT Mega 32
    $regfile = "m32def.dat"
    $crystal = 7372800
    
    'I2C konfigurieren
    Config Sda = Porta.7
    Config Scl = Porta.6
    
    Dim Wert As Byte
    Dim Adresse As Word
    Dim Temp As Byte
    
    'Funktionen deklarieren
    Declare Sub Read_byte(byval Ee_adresse As Word, Value As Byte)
    Declare Sub Write_byte(byval Ee_adresse As Word , Byval Ee_daten As Byte)
    
    'Hauptprogramm===================================
    Print "EEPROM schreiben...";
    Do
    
    For Adresse = 1 To 5                                        ' die ersten 5 Byte schreiben
       Wert = Adresse + 100                                     'Beginnend mit Zahlenwert 105 um Verwechslungen zu vermeiden
       Call Write_byte(adresse , Wert)                          'Daten schreiben
    Next
    
    Wait 1
    Print "*2";
    Print "EEPROM lesen: ";
    Print "*3";
    
    For Adresse = 1 To 5                                        'die geschriebenen 5 Byte auslesen
       Call Read_byte(adresse , Wert)                         'auslesen
       Print Str(wert);                                         'Ausgabe an UART
    Next
    
    Loop
    
    
    'Funktionen=============================
    
    'Routine zum schreiben von Daten in das EEPROM
    Sub Write_byte(byval Ee_adresse As Word , Byval Ee_daten As Byte)
        Temp = High(ee_adresse)                                 'MSB von ee_adresse speichern
        I2cstart                                                'generate start
        I2cwbyte &B10100000                 'write addres of24C65
        I2cwbyte Temp                       'write high adress
        I2cwbyte Ee_adresse                 'write low adress
        I2cwbyte Ee_daten                   'write daten
        I2cstop                                                 'Stop senden zum schreiben
    End Sub
    
    'Routine zum lesen von Daten aus dem EEPROM
    Function Read_byte(byval Ee_adresse As Word , Value As Byte)
        Temp = High(ee_adresse)             'MSB von ee_adresse speichern
        I2cstart                            'generate start
        I2cwbyte &B10100000                 'write addres of 24C65
        I2cwbyte Temp                       'write high adress
        I2cwbyte Ee_adresse                 'write low adress
        I2cstart                            'generate repeated start
        I2cwbyte &B10100001                                     'write read commando
        I2crbyte Value , Nack
        I2cstop
    End Function

Berechtigungen

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