- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 17

Thema: i²c eeprom 24c265

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte Avatar von Rage_Empire
    Registriert seit
    10.03.2005
    Ort
    Pforzheim
    Beiträge
    710
    Hab hier was für dich....kann Bytes, Words und Singles in einem EEPRom schreiben und lesen. Du kannst die Datei einfach per Include laden und dann bequem die Subs und Funcs verwenden. Verwendet wird hier der Hardware-TWI, kann auch für Soft-TWI geändert werden. Ist zwar für ein 24c64 EEPROM, geht jedoch auch mit größeren...mußt evtl. die Adresse des EEProms ändern.

    Code:
    $lib "i2c_TWI.lib"
    Config Scl = Portc.0                                        'PINs für I2C Bus
    Config Sda = Portc.1
    I2cinit
    
    Config Twi = 400000
    
    Dim Eehead(2) As Byte
    Dim Eebyte(4) As Byte
    Dim Eesingle As Single At Eebyte Overlay
    Dim Eeword(2) As Word At Eesingle Overlay
    Dim Eebanz As Byte
    Dim Ee_adresse01 As Word At Eehead Overlay
    Dim Eead As Word
    
    Const 24c64w = &B10100000
    Const 24c64r = &B10100001
    
    
    'Definition der Funktionen ++++++++++++++++++++++++++++++++++++++++++++++++++++
    Declare Function Loadbyte(byval Ee_adresse As Word) As Byte
    Declare Function Loadword(byval Ee_adresse As Word) As Word
    Declare Function Loadsingle(byval Ee_adresse As Word) As Single
    Declare Sub Savebyte(byval Ee_daten As Byte , Byval Ee_adresse As Word)
    Declare Sub Saveword(byval Ee_daten As Word , Byval Ee_adresse As Word)
    Declare Sub Savesingle(byval Ee_daten As Single , Byval Ee_adresse As Word )
    
    Goto 001
    
    Sub Savebyte(byval Ee_daten As Byte , Byval Ee_adresse As Word)
    Eebyte(1) = Ee_daten
    Ee_adresse01 = Ee_adresse
    Eebanz = 1 : Gosub Write_ee
    End Sub
    
    Sub Saveword(byval Ee_daten As Word , Byval Ee_adresse As Word)
    Eeword(1) = Ee_daten
    Ee_adresse01 = Ee_adresse
    Eebanz = 2 : Gosub Write_ee
    End Sub
    
    Sub Savesingle(byval Ee_daten As Single , Byval Ee_adresse As Word )
    Eesingle = Ee_daten
    Ee_adresse01 = Ee_adresse
    Eebanz = 4 : Gosub Write_ee
    End Sub
    
    
    Function Loadbyte(byval Ee_adresse As Word) As Byte
    Ee_adresse01 = Ee_adresse
    Eebanz = 1 : Gosub Read_ee
    Loadbyte = Eebyte(1)
    End Function
    
    Function Loadword(byval Ee_adresse As Word) As Word
    Ee_adresse01 = Ee_adresse
    Eebanz = 2 : Gosub Read_ee
    Loadword = Eeword(1)
    End Function
    
    Function Loadsingle(byval Ee_adresse As Word) As Single
    Ee_adresse01 = Ee_adresse
    Eebanz = 4 : Gosub Read_ee
    Loadsingle = Eesingle
    End Function
    
    
    
    
    
    
    'Routine zum schreiben von Daten in das EEPROM ++++++++++++++++++++++++++++++++
    Write_ee:
        'Disable Interrupts
        Eead = Eead + Eebanz
        Eebanz = Eebanz + 2
        I2csend 24c64w , Eehead(1) , Eebanz
        'Waitms 10
        'Enable Interrupts
    'If Err = 1 Then Call Error(55)
    
    Return
    
    
    'Routine zum lesen von Daten aus dem EEPROM ++++++++++++++++++++++++++++++++++++
    Read_ee:
        'Disable Interrupts
        Eead = Eead + Eebanz
        I2csend 24c64w , Eehead(1) , 2
        'Waitms 10
        I2creceive 24c64r , Eebyte(1) , 0 , Eebanz
        'Waitms 1
        'Enable Interrupts
    'If Err = 1 Then Call Error(55)
    
    Return
    
    001:
    
    Dim Ins As Single
    Dim Inw As Word
    Dim Inb As Byte
    Dim I As Word
    
    Do
    Input "Single: " , Ins
    For I = 20 To 100 Step 4
    Call Savesingle(ins , I)
    Next I
    Print "gespeicherter Wert: " ; Ins
    Ins = Loadsingle(20)
    Print "geladener Wert: " ; Ins
    
    Input "Word: " , Inw
    Call Saveword(inw , 10)
    Print "gespeicherter Wert: " ; Inw
    Inw = Loadword(10)
    Print "geladener Wert: " ; Inw
    
    Input "Byte: " , Inb
    Call Savebyte(inb , 30)
    Print "gespeicherter Wert: " ; Inb
    Inb = Loadbyte(30)
    Print "geladener Wert: " ; Inb
    Loop
    For I = 10 To 410 Step 4
    Call Savesingle(0 , I)
    Next I

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.11.2013
    Ort
    Home
    Beiträge
    213

    Bascom i²c eeprom 24c265

    Hallo Forum,
    habe von „Rage_Empire“ ein guten Code gefunden wie ein I²C Eeprom St24c64 beschreiben und gelesen werden kann. Mit Input Eingabe für eine Singlevariable alles bestens. Siehe dessen Code. Aber nun mein Problem...
    Möchte 6 Singlevariablen mit 1.Tastendruck schreiben und mit 2. Tastendruck diese anhängen. Aber das Anhängen(Fortschreiben) sowie lesen bringt nur den Inhalt des ersten Tastendruck.Nach ca. 800 Versuche fast ans Aufgeben. Denn in mein aktuelles Projekt mit Mega32 den int. Eeprom, sogar mit Strings, zu beschreiben und lesen funktioniert.Bin für jeglichen Hinweis dankbar
    Mit freundlichen Grüßen
    fredred

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.11.2013
    Ort
    Home
    Beiträge
    213
    Hallo Experten,
    habe Problem mit Fortschreiben gelöst aber nur mit Byte-Variablen.

    Nun meine Bitte für Hilfe. Wie kann ich auch Single-Variablen speichern und lesen.
    Finde einfach keine Lösung. Hier mein Code.


    '****************** Test-Platine *************************
    '* ist ein Testmodul für Data extern EEprom als Speicher *
    '* am I²C Bus ein 24c64 angeschlossen zum speichern *
    '* und lesen der Variablen *
    '* *
    '* alle Auswertungen für Test nur über Terminal anzeigen *
    '************************************************* ********

    $regfile "m32def.dat"
    $crystal = 16000000
    $hwstack = 32
    $swstack = 32
    $framesize = 40
    $baud = 19200

    'gibt den Erstellungszeitpunkt im europäischen Format DD-MM-YY hh:nn:ss aus
    Print "Erstellt am " ; Version(1)
    Print
    Waitms 100


    $lib "i2c_TWI.lib"
    Config Twi = 100000 ' Takt 100kHz
    Const 24c64w = &B10100000
    Const 24c64r = &B10100001
    Dim Adresse As Word
    Dim Adresse_l As Byte At Adresse Overlay
    Dim Adresse_h As Byte At Adresse + 1 Overlay
    Dim Wert As Byte
    Dim Aktionen As Byte 'nur für Test
    '!!!!! ist nur für Test mit Taster !!!!
    Config Pinc.3 = Input 'Taster für EEprom schreiben
    Portc.3 = 1 'Port auf H schalten
    Taster_s Alias Pinc.3 'Taster ein Namen geben
    Config Pinc.2 = Input 'Taster für EEprom lesen
    Portc.2 = 1 'Port auf H schalten
    Taster_l Alias Pinc.2 'Taster ein Namen geben
    'Config Portc.4 = Output
    'Eepvoll Alias Portc.4 'LED-Warnung für EEprom voll
    '+++ zu Test ob I²C Hardware OK ist +++
    Gosub I2c_test
    '++++++++++++++++++++++++++++++++++++++
    '------- nach Reset lesen ---------------------------------------
    For Adresse = 1 To 6
    I2cstart
    I2cwbyte 24c64w
    I2cwbyte Adresse_h
    I2cwbyte Adresse_l
    I2cstart
    I2cwbyte 24c64r
    I2crbyte Wert , Nack
    I2cstop
    Print "Adresse >" ; Adresse ; "< ist mit >" ; Wert ; "< gelesen!"
    Next
    '+++++++++ Hauptschleife ++++++++++++++++
    Do
    '--- hier zu Daten schrieben ----
    If Taster_s = 0 Then 'wenn Taste gedrückt schreiben
    Waitms 100 'nur für Test
    Incr Aktionen
    Gosub Schreiben
    End If
    '--- hier zu Daten lesen --------
    If Taster_l = 0 Then 'wenn Taste gedrückt lesen
    Waitms 100 'nur für Test
    Gosub Lesen
    End If
    Loop
    '++++++++++++++++++++++++++++++++++++++++
    End 'end program

    ' ################################################## ###########################
    Lesen:
    Print ""
    Print "EEPROM auslesen..."
    Print ""
    'Input "Speicherbereich angeben: " , In_s
    'Adresse = Val(in_s)
    For Adresse = 1 To 6
    I2cstart
    I2cwbyte 24c64w
    I2cwbyte Adresse_h
    I2cwbyte Adresse_l
    I2cstart
    I2cwbyte 24c64r
    I2crbyte Wert , Nack
    I2cstop
    Print "Adresse >" ; Adresse ; "< ist mit >" ; Wert ; "< gelesen!"
    Next
    Return
    ' ################################################## ###########################
    Schreiben:
    Print ""
    Print "EEPROM beschreiben..."
    Print ""
    For Adresse = 1 To 6
    I2cstart
    I2cwbyte 24c64w
    '!!! für Test !!!!!!!!!!!!!!!!!!!!
    If Adresse = 1 Then Wert = Aktionen
    If Adresse = 2 Then Wert = 110
    If Adresse = 3 Then Wert = 120
    If Adresse = 4 Then Wert = 130
    If Adresse = 5 Then Wert = 140
    If Adresse = 6 Then Wert = 150
    '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    I2cwbyte Adresse_h
    I2cwbyte Adresse_l
    I2cwbyte Wert
    I2cstop
    Print "Adresse >" ; Adresse ; "< wurde mit >" ; Wert ; "< belegt!"
    Next
    Return
    '-----------------------------------------------------
    I2c_test:
    Dim Busaddress As Byte
    Dim Busaddress_read As Byte
    Dim Chipaddress As Byte
    Print "I2C Scan start"
    'I²C Porterweiterung testen
    'Alle Adresen Suche und Anzeigen
    'Step 2 soll nur IC Adresse aufrufen für lesen
    For Chipaddress = 0 To 254 Step 2 ' IC's am I²C-Bus erkennen
    I2cstart 'send start
    I2cwbyte Chipaddress 'sende Addresse auf Bus
    If Err = 0 Then 'Chip gefunden
    If Chipaddress = 24c64w Then
    Print "gefunden " ; Hex(chipaddress) ; " b " ; Bin(chipaddress)
    End If
    End If
    Next
    Waitms 200
    I2cstop
    Return
    '---------------------------------------------------------

    Für jeglichen Hinweis bin ich sehr Dankbar.


    Mfg
    fredred

Berechtigungen

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

Labornetzteil AliExpress