- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 39

Thema: I2C Einstieg

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2012
    Beiträge
    511
    H-Pegel auf L-Ausgang macht sich nicht so gut!
    Das stimmt wohl

    So, ich habe jetzt mal mit dem 24C16 weitergemacht. Dieser hat gleich funktioniert. Doch habe ich noch ein paar Fragen (Verständnis) :

    Ist das richtig, dass beim 24C16 Typ die Adressenanschlüsse nicht intern beschaltet sind, sodass ich nur eine Adresse habe und auch nicht ändern kann (so stand es irgendwo)??

    Wie ist der 24C16 genau aufgebaut ?? Damit meine ich wie viele Datenstellen und was passt in jede Stelle ?? Kann ich in eine Stelle auch ein Wort schreiben oder nur eine gewisse länge von Zahlen/Bits ??

    Das ist das Programm :

    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    $baud = 9600
    $hwstack = 200
    $swstack = 200
    $framesize = 400
    
    Config Portd.7 = Output
    
    
    'TWI konfigurieren
    Config Sda = Portc.1
    Config Scl = Portc.0
    Config Twi = 100000
    
    
    Dim X As Byte
    Dim A As Byte
    Dim B As Byte
    Dim Lesen As Byte
    
    
    Sound Portd.7 , 400 , 450
    Sound Portd.7 , 400 , 250
    Sound Portd.7 , 400 , 450
    Wait 1
    
    
    Do
    '---- schreibe in EEprom ----
    For A = 1 To 10
    Incr X                                                      '1 bis Überlauf zählen
    
    I2cstart                                                    'Start I2C
    I2cwbyte &HA0                                               'Sende Slave Adresse
    I2cwbyte A                                                  'Sende Speicheradresse
    I2cwbyte X                                                  'Sende Wert
    I2cstop                                                     'Stop I2C
    Waitms 10                                                   'warte 10ms
    
    Print "ins EEprom = " ; X ; "  "                            ' Ausgabe der geschriebenen Werte
    Waitms 500
    Next A
    
    
    '--- lesen vom EEprom ----
    For B = 1 To 10
    
    I2cstart                                                    'Start I2C
    I2cwbyte &HA0                                               'sende Slave Adresse
    I2cwbyte B                                                  'sende Speicheradresse
    
    I2cstart                                                    'Start I2C
    I2cwbyte &HA1                                               'sende Slave Adresse +1 für Lesen
    I2crbyte Lesen , Nack                                       'lese Adresse vom EEprom
    I2cstop                                                     'Stop I2C
    
    Print "Lese  EEprom= " ; Lesen ; "  "                       'Ausgabe der EEprom Werte
    Waitms 500
    Next B
    
    Loop
    End
    Wieso muss ich bei der For B = 1 To 10 Schleife erst einmal den I2C Bus öffnen
    Dann das schreiben : (was bedeutet das dann ??)
    I2cstart 'Start I2C
    I2cwbyte &HA0 'sende Slave Adresse
    I2cwbyte B

    Und dann den Bus nicht schließen, aber noch mal öffnen ??:
    I2cstart 'Start I2C
    I2cwbyte &HA1 'sende Slave Adresse +1 für Lesen
    I2crbyte Lesen , Nack 'lese Adresse vom EEprom
    I2cstop

    Und noch eine Frage : Wie kann man das mit den Adressen herausfinden ?? Wie funktioniert das mit dieser Hex Zahl oder der Bin Darstellung ??

    Ich hoffe ihr könnt mir meine ganzen Fragen beantworten ..... Denn wie immer freue ich mich über Antworten sehr
    Der Einsteiger

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    35
    Beiträge
    3.501
    Blog-Einträge
    9
    Hey,

    ja das 24C16 hat keine Adresspins -> ergo nur eine Adresse möglich!
    Das 24C16 ist ein 8Bit EEPROM, sprich jede Speicherzeille ist 8Bit breit...ein Integer würde also zwei Zellen benötigen.
    Stell dir das EEPROM wie eine Tabelle mit 2000 Zeilen vor, wovon jede Zeile 8 Spalten hat
    Das Programm schreibt bei der ersten Schleife 10 Werte in 10 Zellen (Schleife mit der Variable A) und ließt diese dann aus (Schleife mit der Variable B).
    I2Cstart erzeugt eine Startbedingung um eine Kommunikation einzuleiten. Dadurch wird jedes Device am Bus "aufgeweckt" und horcht auf den Master.
    Dann sendet I2Cwbyte die Adresse um ein(!) einzelnes IC anzusprechen. Und danach wird die Registeradresse (in deinem Fall die Adresse der Speicherzelle) gesendet.
    Das zweite I2cstart erzeugt eine NEUE Startbedingung (kannst glaube ich auch repeat oder so verwenden...ka wie der Befehl heißt).
    Die genaue Kommunikation siehst du hier (Seite 16 u. 18 ):

    http://www.farnell.com/datasheets/1700034.pdf

    Auf Seite 18 steht "Random Access Read"...das ist dein Fall und dann siehst du, dass das IC nach der Adresse eine zweite Startbedingung haben will.
    Die Adresse steht im Datenblatt (bei dem EEPROM auf S. 13)...da du keine Adresspins hast, sind diese automatisch 0.
    Deine Adresse wäre also 1010 (der feste Teil für alle EEPROMs der Reihe) + drei Adresspins die bei dir 0 sind, da nicht vorhanden + das RW Bit.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2012
    Beiträge
    511
    Vielen Dank für deine Antwort Kampi. Das hat mir echt geholfen es zu verstehen. Doch eine Frage fehlte noch :

    Wie funktioniert das mit dieser Hex Zahl oder der Bin Darstellung ??
    Das verstehe ich ja noch :
    Deine Adresse wäre also 1010 (der feste Teil für alle EEPROMs der Reihe) + drei Adresspins die bei dir 0 sind, da nicht vorhanden + das RW Bit.
    Aber ich weiß nicht wie ich jetzt auf den Hex wert (in diesem Fall auf &HA0 komme)
    ich hoffe die Frage kannst du mir auch noch beantworten

  4. #4
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    35
    Beiträge
    3.501
    Blog-Einträge
    9
    Für faule Leute:

    http://www.arndt-bruenner.de/mathe/s...lensysteme.htm

    Ansonsten normale Binär-Hex Umwandlung
    Deine Adresse ist zum schrieben:

    1010 0000

    Du fängst von links an:

    1010 = 10 (1*(2^3) + 0*(2^2) + 1*(2^1) + 0*(2^0)) aber 10 ist im Hexsystem = A

    Und bei "0000" machst du es genau so
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2012
    Beiträge
    511
    Ok, danke, aber da fällt mir gleich noch eine Frage zum PCF ein :
    Programm für Eingänge:

    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    $hwstack = 200
    $swstack = 200
    $framesize = 400
    
    Config Portd.7 = Output
    
    'TWI konfigurieren
    Config Sda = Portc.1
    Config Scl = Portc.0
    Config Twi = 100000                                         'TWI Frequenz
    
    'Adresse des PCF
    Const Pcf8574w = &H40
    Const Pcf8574r = &H41
    
    Dim Meinevariable As Byte
    
    Sound Portd.7 , 400 , 450
    Sound Portd.7 , 400 , 250
    Sound Portd.7 , 400 , 450
    Wait 1
    
    'I²C initialisieren
    I2cinit
    
    Sound Portd.7 , 400 , 450
    
    Do
    
    I2cstart
    I2cwbyte Pcf8574r
    I2crbyte MeineVariable, Nack
    I2cstop
    
    Print Meinevariable
    Print
    
    Waitms 500
    
    Loop
    End
    Warum erhalte ich da nur 255 und wenn ich einen Taste drücke 127 ? Wie mache ich das richtig ? Was ist dieses Nack (das habe ich in der Bascom Hilfe nicht gefunden) ?

  6. #6
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    35
    Beiträge
    3.501
    Blog-Einträge
    9
    Ganz einfach....der PCF gibt 1 BYTE an Daten raus, wovon jedes Bit einen IO darstellt, sprich Bit 0 = IO 0 etc.
    Hier ist was zum Thema ACK/NACK:

    http://de.wikipedia.org/wiki/I%C2%B2C
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2012
    Beiträge
    511
    Ok. Danke funktioniert jetzt und ich habe es verstanden .
    Doch jetzt noch was : irgendeiner sagte ein paar Beiträge zuvor, dass man einen Eingang vorher auf 1 stellen muss, da es sonst nicht funktioniert. Muss man das ? bei mir hat es nämlich auch ohne funktioniert mit dem Code aus Beitrag 22.

Ähnliche Themen

  1. Problem mit I2C Sensor DRMOD-I2C-RVI
    Von muerzi im Forum Sensoren / Sensorik
    Antworten: 23
    Letzter Beitrag: 22.02.2010, 18:29
  2. I2C Overview für den Einstieg
    Von Vbxler im Forum Elektronik
    Antworten: 0
    Letzter Beitrag: 19.05.2008, 18:30
  3. Problem: Zwei MEGA8 via I2C-Bus koppeln (mit I2C-slave-Lib)
    Von Ulfens im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 11.01.2006, 15:25
  4. *I2C* maximale eingänge per i2c auf 8 digitale Pins
    Von Christian Sturm im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 22.06.2004, 19:44
  5. Grundlegendes zum Einstieg mit I2C / AVR / RN-Control etc.
    Von Trabukh im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 31
    Letzter Beitrag: 20.06.2004, 09:58

Berechtigungen

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

Labornetzteil AliExpress