î2C LCD funktioniert mit Arduino Mega - mit UNO nicht

    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!

    • î2C LCD funktioniert mit Arduino Mega - mit UNO nicht

      Hallo zusammen,

      ich versuche 2 i2C LCD 20x4 (Sunfounder + SainSmart) in Betrieb zu nehmen. Nach anfänglichen Schwierigkeiten und einiger Zeit des Suchens habe ich es Dank Hilfe von Google und unserem Forum geschafft. Beide Displays funktionieren mit Bascom an dem Arduino Mega.

      Bascom_Mega_2 LCD.jpg


      Beim UNO zeigen beide LCD's das an.
      LCD Bascom.jpg


      Die Pins für SDA und SCL habe ich richtig, glaube ich zumindest. Zumindest erhalte ich mit dem i2cscan.bas von MCS mit dem Mega und UNO im Terminal:


      Bascom
      Scan start
      Slave at : 78 hex : 4E bin : 01001110
      End Scan


      Mit dem Testprogramm habe ich die Ansteuerung der LCD's probiert - hier für den Arduino Mega (1. Bild)

      BASCOM-Quellcode

      1. 'https://bascomforum.de/index.php?thread/391-i2c-lcd/
      2. ' vielleicht auch hier https://www.mcselec.com/index.php?option=com_content&task=view&id=82&Itemid=57
      3. '$regfile = "m328pdef.dat"
      4. $regfile = "m2560def.dat"
      5. $crystal = 16000000
      6. $hwstack = 100
      7. $framesize = 80
      8. $swstack = 100
      9. $baud = 9600
      10. $lib "i2c_twi.lbx"
      11. $lib "YwRobot_Lcd_i2c.lib"
      12. Config Twi = 100000 'DS3231 mag nicht mehr!!!
      13. Config Clock = User
      14. Config Date = Dmy , Separator = . 'German
      15. '**************************** Hardware-Definitionen
      16. 'Config Scl = Portc.5 ' I2C Scl (Pin A5)
      17. 'Config Sda = Portc.4 ' I2C Sda (Pin A4)
      18. Config Scl = Portd.0 ' I2C Scl (Pin A5) ' we need to provide the SCL pin name
      19. Config Sda = Portd.1 ' I2C Sda (Pin A4)
      20. Config Lcd = 20x4
      21. Const Pcf8574_lcd = 78 '0x27 mit Arduino
      22. 'Pcf8574 = 78
      23. 'Pcf8574A = 126
      24. Dim Lcd_backlight As Byte
      25. Dim Count As Integer
      26. Initlcd
      27. Config I2cdelay = 1
      28. Waitms 300
      29. '******************** Hauptprogramm ***********************
      30. 'Alive = 1 ' "alive"-LED einschalten
      31. Lcd_backlight = 1
      32. 's.a https://avrhelp.mcselec.com/index.html?config_lcd.htm
      33. Cls ' LCD leeren/initialisieren und schon mal "festen" Text ausgeben
      34. 'Cursor Off Noblink
      35. Locate 1 , 4
      36. Print "Test"
      37. Lcd "Test"
      38. Locate 2 , 5
      39. Wait 3
      40. Lcd "Zeile 2"
      41. Print "Zeile 2"
      42. Locate 3 , 5
      43. Wait 3
      44. Lcd "Zeile 3"
      45. Print "Zeile 3"
      46. Locate 4 , 5
      47. Wait 3
      48. Lcd "Zeile 4"
      49. Print "Zeile 4"
      50. End
      Alles anzeigen
      ps. Anfänglich bin ich fast verzweifelt, hatte mit dem UNO das versucht und egal was ich gemacht habe immer die gleiche Anzeige. Habe das ganze auch mit der Arduino IDE probiert und bekomme auf mit dem UNO (und mit dem Mega) auf beiden LCDS

      LCD Arduino.jpg

      Weil ich mit Bascom kein Erfolg hatte dachte ich an einen Adressenkonflikt und habe mit dem Arduino i2C Scan Scetch nach der i2C-Adresse gesucht und das brachte mir übrigens:

      Arduino
      Scanning...
      I2C device found at address 0x27 !
      done


      Nachdem ich das in Bascom mit der Adresse 78 probiert, hatte ja wie gesagt nicht funktioniert

      BASCOM-Quellcode

      1. Const Pcf8574_lcd = 78 '0x27 mit Arduino

      habe ichs dann mit der Adresse 0x27 in Bascom versucht und das hatte natürlich erst recht kein Erfolg.
      Aber wieso mit Bascom i2C Tester 78 und mit Arduino 27 ? - würde mich interessieren.

      Vielleicht kann mir jemand mit dem LCD am UNO Anschlußproblem weiter und auf die Srünge helfen.
      Wäre schön wenns funktionieren würde.

      Gruß
      emb
    • emb schrieb:

      Aber wieso mit Bascom i2C Tester 78 und mit Arduino 27 ? - würde mich interessieren.
      27 hex ist die Hälfte von 78 dez.
      Adressen bei I2C beziehen sich auf die oberen 7 Bit einer 8Bit Zahl.
      Weil bei I2C das unterste Bit für die Unterscheidung schreiben oder lesen benutzt wird.
      C (Arduino) benutzt die Adresse (0x27) und scxhreibt sie in die oberen 7 Bit, das ergibt 78 dezimal.
      In Bascom wird die Adresse als ganzes Byte mit 8 Bit betrachtet.
    • ... und es geht doch

      Hallo zusammen,

      ich habe nicht aufgegeben.

      Das hier hatte ich nun gefunden

      you need pull up R of 10K on the SDA and SCL line

      aber nicht wirklich verstanden. Einen 10K Widerstand einbauen zwischen SDA und SDL, aber wie/ wo.

      Vielleicht zu Erklärung, ich komme über die Modellbahn zu Attinys/ Atmegas bzw. weils für mich eben einfacher ist, zu den Arduinos.
      Meine bescheidenen Erkenntnisse habe ich aus diesem Forum, ergoogelt oder aus Stefans Bascom Buch.

      Die Lösung für mein Problem mit den UNO's und auch testweise mit einem NANO habe ich letztendlich hier gefunden.

      mcselec.com/index2.php?option=…viewtopic&p=71954%2371954

      .... also check if there is a pull up on the bus.
      if not you could activate the internal pull up by writing a 1 to scl and sda pins.

      hab dann das noch in mein obigen Code eingefügt

      BASCOM-Quellcode

      1. 'mit internem PullUp-Widerstand
      2. Portc.5 = 1 'interner Pullup aktiovieren
      3. Portc.4 = 1 'interner Pullup aktiovieren
      und meine beiden i2C LCD's funktionieren nun auch am Arduino UNO und NANO.

      Gruß
      emb

      p.s. zu den 10k- Widerständen habe ich jetzt noch das gefunden, womit mein anfängliche Verständnisfrage auch gelöst ist:

      please make a resistor 10k between +5V and SDA
      and an second resistor 10k between +5V and SCL

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von emb ()

    • Michael schrieb:

      emb schrieb:

      Aber wieso mit Bascom i2C Tester 78 und mit Arduino 27 ? - würde mich interessieren.
      27 hex ist die Hälfte von 78 dez.Adressen bei I2C beziehen sich auf die oberen 7 Bit einer 8Bit Zahl.
      Weil bei I2C das unterste Bit für die Unterscheidung schreiben oder lesen benutzt wird.
      C (Arduino) benutzt die Adresse (0x27) und scxhreibt sie in die oberen 7 Bit, das ergibt 78 dezimal.
      In Bascom wird die Adresse als ganzes Byte mit 8 Bit betrachtet.
      Hallo Michael,

      danke für die Erkärung.

      Gruß
      emb
    • emb schrieb:

      Die Lösung für mein Problem mit den UNO's und auch testweise mit einem NANO habe ich letztendlich hier gefunden.
      Die internen Widerstände sind nur eine Notlösung und es wäre besser, wenn du das gleich wieder vergisst ;)
      Die Widerstände im AVR haben nämlich Werrte zwischen 50-80k und liegen damit etwa Faktor 10 über der empfohlenen Größe von 5-10k
      Dass es trotzdem funktioniert, liegt vielleicht an den Laborbedingungen, im Alltag, gerade im Modellbahnbereich, ist mit erheblichen Störungen zu rechnen, die bei den korrekten Widerstandswerten kaum noch auftreten.
    • Michael schrieb:

      Die internen Widerstände sind nur eine Notlösung ...
      Ich habe jetzt jeweils zwischen 5V und SDA bzw. SCL einen 10K Widerstand. Die internen Pullups sind aus.
      Am Anfang kam Kauderwelsch.

      Die Änderung von I2cdelay auf 10 brachte Erfolg

      BASCOM-Quellcode

      1. Config I2cdelay = 10
      Danke für den Hinweis.

      Gruß
      emb