- 12V Akku mit 280 Ah bauen         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 27

Thema: I²C Eeprom 24LC16

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    33
    Beiträge
    601
    Anzeige

    E-Bike
    Hi,

    ich habe mal so ein bisschen im DB:
    http://www.kr.tuwien.ac.at/staff/egl...eet/24lc16.pdf
    gestöbert und mir ist eingefallen, dass in der Schrieb Sub:

    1*Controllbyte(1010, Blockbytes 111, 0 für Schreiben) 1* (Word Addres)
    1* Data.


    Beim Lesen aber nur:

    1*Controllbyte(1010, Blockbytes 111, 1 für Lesen) , 1* Data.

    Also fehlt beim Lesen die Word Addres. Wenn das Eeprom den ganzen
    Block ausgibt sind das mehr als 1 Byte.

    Zusätzlich was bedeutet dieses "NACK" am ende des :
    I2crbyte Lesen , Nack

    Hier noch mal was aus der Wiki:
    https://www.roboternetz.de/wissen/in...und_I2C_EEprom
    Grüße Furtion

  2. #12
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Vergleich mal den Teil zum Auslesen, es muss erst die (Speicher-)Adresse dem Slave per Write übergeben werden, danach ein Restart, und dann erst kann man das Byte lesen. Da war ich auch nicht ganz bei der Sache, hab das übersehen.
    Übernimm mal das Beispiel vom lesen in die Function.

    Das NACK bedeuted hier, das dies das letzte Byte ist, und danach ein Stop kommt, man könnte hier auch weiter lesen (mit ACK), und mehr Bytes holen als nur eins. Die EEproms zählen die Adresse normalweise selber weiter.

  3. #13
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    So,
    in Sachen Read funktionierts so:
    Code:
    Declare Function Read_eeprom(byval Adress As Byte) As Byte 
    
    '...
        Lesen = Read_eeprom(addres) 
    '...
    
    Sub Write_eeprom(byval Addres As Byte , Byval Wert As Byte)
        I2cstart                                      'start condition
        I2cwbyte &HA0                                 ' Bausteinadresse
        I2cwbyte Addres                               ' Adresse im IC
        I2cwbyte Wert                                 ' Byte schreiben
        I2cstop                                       ' Stopbedingung
    End Sub
    
    Function Read_eeprom(byval Adress As Byte )
       I2cstart                                       'Start I2C
       I2cwbyte &HA0                                  'sende Slave Adresse
       I2cwbyte Adress                                'sende Speicheradresse
    
       I2cstart                                       'Start I2C
       I2cwbyte &HA1                                  'sende Slave Adresse +1 für lesen
       I2crbyte Read_eeprom , Nack                    'lese Adresse vom EEprom
       I2cstop                                        'Stop I2C
    End Function Read_eeprom
    Auch auf die I2C-Slaveadresse achten, ob die zu der Einstellung des 2416 passt.

    Nach dem schreiben eines Wertes, ist das EEprom für ein paar ms nicht erreichbar weil es das Byte erst ins EEprom schreibt, hierfür erstmal ins DB schauen wie lange das ist, können ca. 5ms sein.
    Das bedeuted, wenn man sofort nachdem man einen Wert ans EEprom übergeben hat gleich wieder etwas davon lesen will, muss man erst warten. Macht man sowieso was anderes, was länger dauert als diese Zeit, braucht man natürlich nicht extra zu warten.

  4. #14
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    33
    Beiträge
    601
    Hi,

    die Freude ist groß es funzelt !!!

    Erst mal danke der Chip ließt den Wert wunderbar aus.

    Hier mal der Code, wenn jemand sich noch einmal mit dem Teil auseinander
    setzt:

    Code:
    $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 Adress 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(addres)
    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
        I2cwbyte &HA0                                 ' Bausteinadresse
        I2cwbyte Addres                               ' Adresse im IC
        I2cwbyte Wert                                 ' Byte schreiben
        I2cstop                                       ' Stopbedingung
            Waitms 10
        Locate 1 , 4
        Lcd Chr(122)                                            ' int. Schreibzeit abwarten
    
    
    End Sub
    
    Function Read_eeprom(byval Adress As Byte )
       I2cstart                                       'Start I2C
       I2cwbyte &HA0                                  'sende Slave Adresse
       I2cwbyte Adress                                'sende Speicheradresse
    
       I2cstart                                       'Start I2C
       I2cwbyte &HA1                                  'sende Slave Adresse +1 für lesen
       I2crbyte Read_eeprom , Nack                    'lese Adresse vom EEprom
       I2cstop
           Waitms 10
        Locate 2 , 1
        Lcd "I = " ; Read_eeprom
        Waitms 1000
                                            'Stop I2C
    End Function Read_eeprom
    Eine Frage wäre noch, wie man 2 gleiche Eeproms ansteuert, an einem
    Dart geht ja nicht, weil jedes Eeprom denkt es sei gemeint und in beiden
    steht das gleiche.

    Geht es villeicht mit:

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

    Config Sda = Portd.3 #2
    Config Scl = Portd.2 #2

    I2cstart #1

    Wie bei dem Soft-Uart oder gibt es da was anders?
    Grüße Furtion

  5. #15
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Wenn Du mehr gleiche ansprechen willst, musst Du nur die Adresse am EEprom einstellen (Jumper, oder fest verkabeln), wenn nix eingestellt ist, haben die die Adresse $A0.

    Man kann 8 von diesen am Bus betreiben. Edit: (Stimmt nicht beim 24C16 !! siehe übernächsten Beitrag !)

    Das ist der Vorteil von I2C, man braucht nur einen Anschluss am µC, da es ein Bus ist, alle Slaves kommen an diese beiden Leitungen, les mal die Artikel dazu im Wiki durch, und das Datenblatt der 2416 usw.

  6. #16
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    33
    Beiträge
    601
    Hi,

    hat das was mit den A0,A1 und A2 Eingängen zu tun?

    PS: Das ist mein 250 Beitrag^^
    Grüße Furtion

  7. #17
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Es hat mit den A wie Adresseingänge zu tun, aber Du musst ins DB schauen, ob das bei deinem EEprom auch geht (das richtige DB des Herstellers, nicht irgendeins [-X ).
    Die 24C16 die ich hier habe, da geht es nicht, die haben keine Adressleitungen nach aussen !
    Das heisst dann, man kannnur eins dieser Bausteine am I2C anschliessen !

    Da das 24C16 2KByte hat, werden die unteren 3 Bit der I2C-Slaveadresse als die oberen 3 Bits der Speicheradresse im EEprom angesehen !
    So ist es möglich mit der Slaveadresse die 8 Blöcke des EEproms anzusprechen.

    PS:
    mein 1965. Beitrag, obwohl wir fast gleichlang im RN eingetragen sind

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

    also wenn man die nach ausengeführten Addres eingänge A0-A2 nicht
    nehmen kann, und die anderen ( 1010 (Blockadresse) 0) für die Block-
    addresse sind, was soll man dann nehmen um die irgenwie voneinander
    zu unterschieden?


    PS:

    Nun ist das mein 252ter Eintrag^^
    Grüße Furtion

  9. #19
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    33
    Beiträge
    601
    Hi,

    aber was ist, wenn man einmal den Soft und ein mal den Hard I2C nimmt,
    dann könte man das doch irgendwie hinbiegen oder?
    Grüße Furtion

  10. #20
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Du willst also unbedingt mehrere solcher am AVR haben
    Dann könnte es mit Hard- und SoftI2C im Prinzip gehen, ich weiss aber nicht ob das Bascom so kann, eher nicht
    Denn die Ports werden beim compilieren von Bascom Fest ins Programm eingesetzt und können nicht so einfach geändert werden. Man müsste sich eigene Libs schreiben, die das unterstützen.

    Oder Du nimmst grössere EEproms, die das können, zB. 24C32, aber dann hat man schon von vornherein mehr Platz in einem davon. Hiervon kann man dann 8 am I2C-Bus betreiben.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

12V Akku bauen