- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 27

Thema: I²C Eeprom 24LC16

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    32
    Beiträge
    601

    I²C Eeprom 24LC16

    Anzeige

    Powerstation Test
    Hi,

    ich habe wieder mal meine porbleme mit dem I²C Bus und Eeproms.
    Ich habe hier mal ein bischen Code für den 24LC16 aber der funktionirt
    nicht.

    Code:
    $regfile = "2313def.dat"                                    ' specify the used micro
    $crystal = 1000000                                          ' used crystal frequency
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 10                                               ' default use 10 for the SW stack
    $framesize = 40                                             ' default use 40 for the frame space
    
    Declare Sub Write_eeprom
    Declare Sub Read_eeprom
    
    Config Sda = Portd.1
    Config Scl = Portd.0
    Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portb.0 , Db6 = Portb.1 , Db7 = Portb.2 , E = Portb.3 , Rs = Portb.4
    Dim I As Bit
    Config Lcd = 16 * 2                                         'configure lcd screen
    Dim Addres As Byte
    Dim Wert As Byte                                            'clear the LCD display
    Dim Lesen As Byte
    Cls
    Do
    
    
    Cls
    
    Locate 1 , 1
    Lcd Chr(122)                                                'display this at the top line
    
    If I = 0 Then
    Addres = 1
    Wert = 122
    Call Write_eeprom
    I = 1
    Wert = 0
    End If
    
    If I = 1 Then
    Call Read_eeprom
    Locate 2 , 1
    Lcd Chr(lesen)
    End If
    
    
    
    Loop
    
    
    End
    
    
    
    
    
    Sub Write_eeprom(byval Addres As Byte , Byval Block As Byte , Byval Wert As Byte)
        I2cstart                                                'start condition
        Waitms 1
        I2cwbyte &B10100000                                     ' Bausteinadresse
        Waitms 1
        I2cwbyte Addres                                         ' Adresse im IC
        Waitms 1
        I2cwbyte Wert                                           ' Byte schreiben
        Waitms 1
        I2cstop                                                 ' Stopbedingung
        Waitms 10                                               ' int. Schreibzeit abwarten
    End Sub
    
    
    Sub Read_eeprom(byval Addres As Byte , Byval Block As Byte , Byval Lesen As Byte)
        I2cstart                                                'start condition
        Waitms 1
        I2cwbyte &B10100001                                     ' Bausteinadresse
        Waitms 1
        I2crbyte Lesen
        Waitms 1
        I2cstop                                                 ' Stopbedingung
        Waitms 10                                               ' int. Schreibzeit abwarten
    End Sub
    
    Verbesserungsvorschläge sind wilkommen

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hall,

    das mit den Subs haut so nicht hin,
    oben bei Declare muss die gleiche Zeile wie unten in der Zeile beim beginn der Sub stehen, mit allen Argumenten usw.
    Die Argumente müssen dann auch beim Aufrufe mitgegeben werden !

    Code:
    Declare Sub Write_eeprom(byval Addres As Byte , Byval Block As Byte , Byval Wert As Byte) 
    
    
    Call Write_eeprom (Addres, Block , Wert )
    Beim Read ist es evtl. auch besser eine Function zu machen, um den Wert zurückzugeben.

    Hier hab ich die Tage in 'nem Thread auch irgendwo ein ähnliches Beispiel gelesen, musst mal suchen.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    32
    Beiträge
    601
    Hi,

    ich habe mal den Code modivieziert. Funktuniert aber auch nicht:

    Code:
    $regfile = "2313def.dat"                                    ' specify the used micro
    $crystal = 1000000                                          ' used crystal frequency
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 10                                               ' default use 10 for the SW stack
    $framesize = 40                                             ' default use 40 for the frame space
    
    
    Declare Sub Read_eeprom(byval Lesen As Byte)
    
    Declare Sub Write_eeprom(byval Addres As Byte , Byval Wert As Byte)
    
    Config Sda = Portd.1
    Config Scl = Portd.0
    Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portb.0 , Db6 = Portb.1 , Db7 = Portb.2 , E = Portb.3 , Rs = Portb.4
    Dim I As Bit
    Config Lcd = 16 * 2                                         'configure lcd screen
    Dim Addres As Byte
    Dim Wert As Byte                                            'clear the LCD display
    Dim Lesen As Byte
    Cls
    Waitms 1000
    Addres = 1
    Wert = 122
    
    Locate 1 , 2
    Lcd Chr(121)
    Waitms 1000
    Call Write_eeprom(addres , Wert )
    I = 1
    Wert = 0
    
    
    
    Do
    
    
    
    Locate 1 , 1
    Lcd Chr(122)                                                'display this at the top line
    
    
    If I = 1 Then
    Call Read_eeprom(lesen)
    Locate 2 , 1
    Lcd "I = " ; Lesen
    Locate 2 , 6
    Lcd Chr(113)
    Waitms 1000
    Cls
    End If
    
    
    
    Loop
    
    
    End
    
    
    
    
    
    Sub Write_eeprom(byval Addres As Byte , Byval Wert As Byte)
        Locate 1 , 3
        Lcd Chr(122)
        I2cstart                                                'start condition
        Waitms 1
        I2cwbyte &B10101110                                     ' Bausteinadresse
        Waitms 1
        I2cwbyte &B11111111                                     ' Adresse im IC
        Waitms 1
        I2cwbyte Wert                                           ' Byte schreiben
        Waitms 1
        I2cstop                                                 ' Stopbedingung
        Waitms 10
        Locate 1 , 4
        Lcd Chr(122)                                            ' int. Schreibzeit abwarten
    End Sub
    
    
    Sub Read_eeprom(byval Lesen As Byte)
        Locate 1 , 5
        Lcd Chr(122)
        I2cstart                                                'start condition
        Waitms 1
        I2cwbyte &B10100001                                     ' Bausteinadresse
        Waitms 1
        I2crbyte Lesen
        Waitms 1
        I2cstop                                                 ' Stopbedingung
        Waitms 10
        Locate 1 , 6
        Lcd Chr(122)                                            ' int. Schreibzeit abwarten
    End Sub
    Meine Fragen wären noch:

    Sind 22k gegen Plus in Ordnung?
    Gibt es ein Unterscheid zwischen Hard und Software I²C?

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Was benutzt Du genau für einen AVR, einen Tiny oder AT90 ?
    Beim AT90 passt das $regfile, für den Tiny nicht !

    Die haben beide kein TWI onboard, also bleibt erstmal nur Soft-I2C.
    Der Tiny hat USI, das kann auch so tun wie I2C, beim AT90 bleibt nur die Softwarelösung.

    Ich hab hier mal eine Lib gebaut, die das USI verwendet, dazu muss man aber auch die vorgesehen Ports verwenden !
    https://www.roboternetz.de/phpBB2/ze...ag.php?t=26774

    In Sachen Pullups wird sonst gerne etwas um die 10k verwendet, hab auch schon 4k7 gesehen, mit den 22k sollte es aber erstmal auch gehen.

    Das mit dem Read haut so immer noch nicht hin, Du bekommst so den Wert nicht wieder ins Hauptprogramm !
    Mach mal einen Function draus:

    Code:
    Declare Function Read_eeprom(byval Lesen As Byte) As Byte
    und in der Function am ende:
    Code:
    Read_eeprom = Lesen
    ' oder gleich 
    I2crbyte Read_eeprom

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    32
    Beiträge
    601
    Hi,

    also ich habe mal das mit der Funktion asprobiert, funktioniert aber auch nicht
    Ich denke es liebt an der Verbindung. Also ich habe ein Atiny2313 und
    benzute zurzeit nur das:

    'Config Sda = Portd.1
    'Config Scl = Portd.0

    Ich denke mal das das falsch ist oder leige ich da falsch?
    Grüße Furtion

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Wenn Du den Tiny hast, musst Du eine andere Datei bei $regfile angeben, denn diese ist für den AT90 !
    $regfile = "ATtiny2313.DAT"

    Wenn Du Soft-I2C verwendest, ist es egal wo Du die anschliesst, das muss halt mit den Configs zusammenpassen.

    Zeig mal wie das Programm jetzt ausschaut.

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    32
    Beiträge
    601
    Hi,

    hat dieses Congig was mit dem Usi zu tun, da ich die Lib nicht verwede.

    Hier mal das neue Prog mit der Funktion:

    Code:
    $regfile = "Attiny2313.dat"                                 ' specify the used micro
    $crystal = 1000000                                          ' used crystal frequency
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 10                                               ' default use 10 for the SW stack
    $framesize = 40                                             ' default use 40 for the frame space
    Waitms 1000
    '$lib "i2c_usi.lbx"
    
    
    
    
    Declare Function Read_eeprom(byval Lesen As Byte) As Byte
    Declare Sub Write_eeprom(byval Addres As Byte , Byval Wert As Byte)
    'Declare Sub Read_eeprom(byval Lesen As Byte )
    
    Config Sda = Portd.1
    Config Scl = Portd.0
    
    'Config Scl = Portb.7                                        ' Ports fuer I2C-Bus
    'Config Sda = Portb.5
    
    Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portb.0 , Db6 = Portb.1 , Db7 = Portb.2 , E = Portb.3 , Rs = Portb.4
    Dim I As Bit
    Config Lcd = 16 * 2                                         'configure lcd screen
    Dim Addres As Byte
    Dim Wert As Byte                                            'clear the LCD display
    Dim Lesen As Byte
    Dim Read_eeprom As Byte                                     'clear the LCD display
    I2cinit
    Cls
    Waitms 1000
    Addres = 1
    Wert = 122
    
    Locate 1 , 2
    Lcd Chr(121)
    Waitms 1000
    Call Write_eeprom(addres , Wert )
    
    
    I = 1
    Wert = 0
    
    
    
    Do
    
    
    
    Locate 1 , 1
    Lcd Chr(122)                                                'display this at the top line
    
    
    If I = 1 Then
    
    Lesen = Read_eeprom(lesen)
    Locate 1 , 5
    Lcd Chr(122)
    Locate 2 , 1
    Lcd "I = " ; Lesen
    Locate 2 , 6
    Lcd Chr(113)
    Waitms 1000
    Cls
    End If
    
    
    
    Loop
    
    
    End
    
    
    
    
    
    Sub Write_eeprom(byval Addres As Byte , Byval Wert As Byte)
        Locate 1 , 3
        Lcd Chr(122)
        I2cstart                                                'start condition
        Waitms 1
        I2cwbyte &B10101110                                     ' Bausteinadresse
        Waitms 1
        I2cwbyte &B11111111                                     ' Adresse im IC
        Waitms 1
        I2cwbyte Wert                                           ' Byte schreiben
        Waitms 1
        I2cstop                                                 ' Stopbedingung
        Waitms 10
        Locate 1 , 4
        Lcd Chr(122)                                            ' int. Schreibzeit abwarten
    End Sub
    
    Function Read_eeprom(byval Lesen As Byte )
        I2cstart                                                'start condition
        Waitms 1
        I2cwbyte &B10100001                                     ' Bausteinadresse
        Waitms 1
        I2crbyte Read_eeprom
        Waitms 1
        I2cstop                                                 ' Stopbedingung
        Waitms 10
        Lesen = Read_eeprom
    End Function Read_eeprom
    Grüße Furtion

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    32
    Beiträge
    601
    Hi,

    also ich habe hier noch mal die Lese/Schreib Vorgänge aus dem Datenblatt.
    Nur das ich keinen Denkfehler in der Interpretation habe:

    Lesen:

    I2cstart 'start condition
    Waitms 1
    I2cwbyte &B10100001 ' Bausteinadresse
    Waitms 1
    I2crbyte Read_eeprom
    Waitms 1
    I2cstop ' Stopbedingung
    Waitms 10


    Schreiben:

    I2cstart 'start condition
    Waitms 1
    I2cwbyte &B10101110 ' Bausteinadresse
    Waitms 1
    I2cwbyte &B11111111 ' Adresse im IC
    Waitms 1
    I2cwbyte Wert ' Byte schreiben
    Waitms 1
    I2cstop ' Stopbedingung
    Waitms 10
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken write.gif   read.gif  
    Grüße Furtion

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hi,

    mach mal die ganzen Wait's raus (zwischen I2cstart und stop), da schläft ja jeder Slave ein in der Zeit

    Das USI musst Du nicht verwenden, aber wenn Du es doch willst, musst Du auch die richtigen Ports dafür verwenden !
    Du hast aber schon PortD.0 und 1 angeben, da ist kein USI, deshalb geht das nur per Software-I2C, ist aber kein Problem.

    Wie läuft das jetzt, tut sich schon was ?

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    32
    Beiträge
    601
    Hi,

    also es passiert nicht (außer das I immer 0 ist).

    Wenn ich Read_eeprom aber auf 5 setze bleibt es 5. Daruas müsste
    folgen, dass der Befehl "I2crbyte Read_eeprom" nichts bringt an Daten,
    weder eine 0 noch was anderes(meine Überlegung wäre nämlich, was ist,
    wenn das Byte zu wenigt ist( das Eeprom liefert mehr Daten als max. 255)).

    Kann es sein, das ich einfach einen Befehl wie I2cinit vergessen habe?
    Grüße Furtion

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress