I2C-LCD und Bascom

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • I2C-LCD und Bascom

      Ein freundliches Hallo in die Expertenrunde !
      Ich besitze ein I2C-LCD-Modul 20 x 4. Es trägt "huckepack" eine aufgelötete Platine mit dem PCF 8574.
      Prgrammiert mit der Arduino IDE funktioniert es am Arduino UNO auch tadellos.
      Aber, ich will ja mit Bascom programmieren.
      Dazu liegt SDA an Port C.4 und SCL an Port C.5. Habe ich auch mit LEDs ausgetestet - ist richtig.
      Ich bekomme jedoch das LCD nicht zum Anzeigen.
      In Forumbeiträgen und auf Internetseiten werden in den I2C-Beispielen stets die LCDs voll beschaltet.
      Bei I2C braucht man jedoch nur 2 Leitungen: Clock und Daten (natürlich auch +/- 5 V).
      Nun meine Frage und Bitte: Wer kann Hinweise geben oder hat Erfahrungen mit I2C-Displays gesammelt.
      Ein Traum wäre möglichst ein kleines Testprogramm zu geben.
      Ich sage im Voraus herzlichen Dank
      und Grüße vom Heiner
    • Hallo,
      erst ein Mal Danke für Eure Antworten, werde nachher alles testen.

      Aber an stefanhamburg eine Frage: Da keine Pullup-Widerstände eingebaut sind, wie groß müssen sie sein ?

      Noch etwas: In den Beispielcodes ist das Display voll beschaltet, ich habe aber für I2c nur 2 Drähte als Anschluss.

      Gruß Heiner
    • Hallo Heiner:

      Bei der Hardware ist noch wichtig, dass von den Pins SDA und SCL jeweils ein Widerstand (4k7) nach Plus geschaltet wird. Die Adresseingänge sollten außerdem immer auf festem Potential liegen, also entweder GND (0) oder VCC (1)

      Quelle hier: bascomforum.de/lexicon/index.p…/58-portexpander-pcf8574/, falls Du Dich mit dem I²C- Bus näher beschäftigen möchtest.

      Gruß Christian
      Wenn das die Lösung ist, möchte ich mein Problem wieder haben.
    • Für Bascom gibt es für diese Module eine Bibliothek zum einbinden (YwRobot_Lcd_i2c.lib). Wenn diese in dein Programm eingebunden ist, funktionieren alle BasCom-LCD-Befehle so wie wenn das Modul direkt angeschlossen wäre. Dies natürlich nicht in der gleichen Geschwindigkeit, da ja jetzt die entsprechenden Daten anstatt über acht oder vier Leitungen nur mehr über eine Leitung übertragen werden.
      Aber es funktioniert brauchbar. Selbst die Hintergrundbeleuchtung ist damit schaltbar.
      Die Module haben meistens die geforderten PullUp-Widerstände drauf. Dies solltest du kontrollieren weil wenn man da mehrere verschiedene I2C-Module anschließt (es gibt ja auch noch RTC, EEPROMs usw.) und jedes dieser Module diese Widerstände mitliefern (das ist eine Seuche in China, weil jeder denkt, nur sein Modul findet Verwendung), wird es sicher eng mit der Funktion weil der Widerstandswert durch die mehreren Module immer kleiner wird und auch wieder zu Störungen am I2C-Bus führen kann.
    • Hallo an Alle, die sich bemüht hatten mir zu helfen.
      Herzlichen Dank Euch für alle gegebenen Hinweise.
      Die Pullups muss ich noch nachmessen.
      Aber der Hinweis vom Zitronenfalter ergab die Lösung - alles funktioniert prima -DANKE dir !!!

      Damit ist dann auch dieses Problem gelöst. Danke und weiterhin viel Erfolg bei der Hilfe von Ratsuchenden.

      Bis zum nächsten Problem sagt Danke der
      Heiner
    • Hallo, stefanhamburg, eigentlich galt ja der Beitrag als beendet.
      Aber sehr gerne poste ich mein Programm, denn evtl. hilft es ja anderen bei diesem Problem -und wir wollen uns ja alle helfen.
      Also hier das komplette 4-zeilige LC-Display in dem in allen 4 Zeilen eine Variable hochgezählt wird.

      Ansonsten allen weiterhin viel Erfolg beim Programmieren mit Bascom und DANK an alle hilfreichen "Helfer".
      Viele Grüße von Heiner

      '##############################################################
      ' Ein "Vierzeiliges I2C-LCD" am "Arduino UNO" betreiben
      '##############################################################
      $regfile = "m328pdef.dat"
      $crystal = 16000000
      $hwstack = 64
      $swstack = 10
      $framesize = 40

      $lib "YwRobot_Lcd_i2c.lib"

      Const Pcf8574_lcd = 78 'Adresse des I2C-LCDs
      Dim _lcd_e As Byte
      _lcd_e = 128

      Dim A as Integer
      A = 0
      Dim B as Integer
      B = 50
      Dim C as Integer
      C = 100
      Dim D as Integer
      D = 150

      Const Pcf_d4 = 4 'Pinzuordnung PCF8574 -> LCD
      Const Pcf_d5 = 5
      Const Pcf_d6 = 6
      Const Pcf_d7 = 7
      Const Pcf_rs = 0
      Const Pcf_rw = 1
      Const Pcf_e2 = 3 '3./4. Zeile bzw. Backlight
      Const Pcf_e1 = 2 'E

      Config Scl = Portc.5 'Konfigurieren von I2C
      Config Sda = Portc.4

      Config Lcd = 20 * 4
      Config I2cdelay = 1
      Waitms 300

      Dim Lcd_backlight As Byte '1 = aus; 0 = an. Wird erst durch einen folgenden LCD-Befehl umgesetzt!
      Lcd_backlight = 0
      Locate 1, 1 'Damit Backlight-Zustand an LCD übermittelt wird

      Do

      Cls
      Locate 1, 1
      Lcd "Zeile 1:"
      Locate 1, 15
      LCD A
      Locate 2 , 1
      Lcd "Zeile 2:"
      Locate 2, 15
      LCD B
      Locate 3 , 1
      Lcd "Zeile 3:"
      Locate 3, 15
      LCD C
      Locate 4 , 1
      Lcd "Zeile 4:"
      Locate 4, 15
      LCD D
      Waitms 1000
      Incr A 'Hochzählen in den 4 Zeilen
      Incr B
      Incr C
      Incr D
      '
      Loop
      End
    • Moin,

      ich habe hier diese Lib gefunden und funktioniert bei mir auch ganz prima.
      Ich habe die zweite Lib benutzt. In dem verlinkten Forum ist ja die Rede von verschiedenen Belegungen und die dort als YwRobot bezeichnete Belegung scheint bei z.B. Amazon mittlerweile üblich zu sein.
      Was damit definitiv funktioniert ist im Bild anbei zu sehen.
      Die I2C Adresse ist wie in den Beispielen die Default-Adresse von dem PCF8574, dec 78 oder 0x4E (&H4E). Mit den Lötjumpern auf dem Adapter kann man die Bits A0 bis A2 auf 0 setzen und bekommt dann entsprechend die Adressen darunter. Bitte ins Datenblatt des PFC8574 schauen.
      In einem Beispiel in dem anderen Forum steht "Config Lcd = 16 * 2". Möööp, das muss sowas wie 16x2 sein. x und nicht *.
      Und unnötig ist das nicht, wenn man z.B. ein 20 x 4 benutzt. Damit funktioniert die Lib dann auch.
      I2C klappert bei 16MHz und "Config I2cdelay = 1" mit ca. 175kHz. Damit ist das wirklich arschlahm und ein 20x4-Display komplett vollzuschreiben dauert über 100ms. Die Bascom-Hilfe schreibt über das Delay da was völlig Anderes.
      Setzt man I2cdelay = 0 wird das langsamer, ca. 80kHz! Mit "Config I2cdelay = 2" sind es dann etwa 150kHz.
      Das Ganze krankt natürlich daran, daß das alle Soft-I2C ist und nicht die Hardware nutzt. Das war ja alles noch für den T2313 gemacht, der die Hardware gar nicht hat.

      Gruß,
      Norbert
      Dateien
    • Noerbe schrieb:

      I2C klappert bei 16MHz und "Config I2cdelay = 1" mit ca. 175kHz. Damit ist das wirklich arschlahm und ein 20x4-Display komplett vollzuschreiben dauert über 100ms. Die Bascom-Hilfe schreibt über das Delay da was völlig Anderes.
      Setzt man I2cdelay = 0 wird das langsamer, ca. 80kHz! Mit "Config I2cdelay = 2" sind es dann etwa 150kHz.
      Lt. Hilfe soll der Wert bei Config I2CDelay die Dauer bis zum nächsten Clock Puls bedeuten (SoftI2C).

      Ein Delay von 5 = 5µs und das sollte 1 / 5µs = 200kHz Takt ergeben.
      Man trägt also die gewünschte Dauer in µs ein.
      Bei 100kHz ist das 10µs also Wert 10.

      Der Wert 0 wird in der lib zuerst inkrementoert. Daher werden dann 256 µs Pro Puls draus. Daher am langsamsten.
      Müssten dann ca 3,9Khz Takt ergeben, du hast 80kHz?

      Das mit der Berechnung hat natürlich Grenzen. Steht auch in der Hilfe.
      Man braucht schon einen gewissen Mindest-System-Clock, damit die I2CDelay Function richtig arbeiten kann.

      Welchen Systemtakt hast du denn? Noch ein Teiler aktiv?
    • Noerbe schrieb:

      sind es dann etwa 150kHz
      Das ist schon grenzwertig. Der pcf ist für 100kHz ausgelegt. Wenn er gute Laune hat schafft er auch das doppelte a_448_c66dc889 aber zuverlässig ist anders :D
      Die 100ms sind annehmbar. Bedenkt man das Baskom recht großzügig beim Timing des LCDs ist und die Adresse sollte auch schon mal gesendet werden. Theoretisch könnte es es in ca 35ms voll haben: Pro Zeichen braucht's vier Byte, mal 80Zeichen wären ca 35ms (bei 100kHz)