I2C-LCD

    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!

    • Erstaunlich das es sich compillieren ließ. Bei mir verweigert er wegen fehlendem Backlight, Auch die Position ist nicht richtig. Versuch mal ob sich das Ergebniss ändert mit
      Dim Lcd_backlight As Byte
      und einem
      Initlcd
      Das Lcd kann Schrittgeschwindigkeit jedoch kann es innerhalb Bascoms zu seltsamen Ergebnissen kommen wenn $Crystal nicht die richtige Clockfrequenz angibt. Ee errechnet daraus das notwendige Timing von Baud,I2C ... Es setzt nicht den AVR-Clock, das muß mit den Fuses/Quarz gemacht werden.
    • hallo Gemeinde erstmal danke für die mühe
      backlight ... ind initlcd ist nicht dasproblem.
      ausserdem läift es ja auch ausser mit einer vatiable...

      habe jetzt erst mal paar megas mit externem clock zu setzen da ich nicht mehr ran komme.

      habe mal ne led blinken lassen und breth boart mit externem quarz ist ja bissi nicht so toll.
      komischer weise läuft die anzeige mit externem quarz garnicht habe aber auch nur 8 und 12 mhz da
      pulups habe ich externe drann

      naja und die led die ich blinken lies blinkt nicht wenn ich die i2c lib lade

      muss also dort der hund begraben sein

      aber habe jetzt erstmal koa luscht mehr

      muss mal drüber schlafen mach den maga dann mal auf ne lochraster mit quarz

      ausserdem sehe ich jetzt den mega in bascom pin out nicht mehr könnt ko...

      schönen sonntag euch noch

      Gruß Bernd
    • So ich habe das mal mit der Lib getestet und es funktioniert ohne Probleme mit einer String-Variable.

      BASCOM-Quellcode

      1. $regfile = "m8def.dat" 'specify the used micro
      2. $crystal = 8000000 'used crystal frequency
      3. $hwstack = 50 'default use 32 for the hardware stack
      4. $swstack = 50 'default use 10 for the SW stack
      5. $framesize = 50 'default use 40 for the frame space
      6. $lib "YwRobot_Lcd_i2c.lib"
      7. Const Pcf8574_lcd = 78 'Adresse des I2C-LCDs
      8. Dim _lcd_e As Byte
      9. Dim Lcd_backlight As Byte
      10. _lcd_e = 128
      11. Dim Test As String * 17
      12. Const Pcf_d4 = 4 'Pinzuordnung PCF8574 -> LCD
      13. Const Pcf_d5 = 5
      14. Const Pcf_d6 = 6
      15. Const Pcf_d7 = 7
      16. Const Pcf_rs = 0
      17. Const Pcf_rw = 1
      18. Const Pcf_e2 = 3 '3./4. Zeile bzw. Backlight
      19. Const Pcf_e1 = 2 'E
      20. '****************** Initialisierung ***********************
      21. 'Ddrb = &B11111111 'Standardbelegung der DDRs
      22. 'Ddrd = &B01110000
      23. 'Portd = &B10001111
      24. Config Scl = Portc.5 'Konfigurieren von I2C
      25. Config Sda = Portc.4
      26. Config Lcd = 16 * 2
      27. Config I2cdelay = 1
      28. 'warte bis Kondensator bei Ta0 geladen, auch für LCD-Init:
      29. Waitms 300
      30. Lcd_backlight = 1
      31. Test = "Hallo Bascom."
      32. '**********************************************************
      33. '******************** Hauptprogramm ***********************
      34. Cls
      35. Lcd "Hello world!"
      36. Locate 2 , 1
      37. Lcd "2. row..."
      38. Wait 5
      39. Cls
      40. Do
      41. Locate 1 , 1
      42. Lcd Test
      43. Loop
      44. End
      Alles anzeigen
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Hallo,
      welches Display ist das genau, hat es einen PCF8574 I2C Port Expander?
      Ich hatte auch mal Probleme damit, habe dann herausgefunden, dass die Belegung des PCF8574
      eine Andere ist, als von BasCom verwendet wird.
      Im Anhang die Beschreibung wie es funktioniert, inklusive einem kleinen Testprogramm.
      Am besten mal die Belegung vergleichen.
      Vermutlich wurde versucht mit der lib, die geänderte Belegung zu korrigieren.BasCom_I2C_LCD_01.pdf
    • Hallo Djmsc habe jetzt mal dein Programm genommen nur Prozessor da ich nen 8a habe und Display Adresse geändert

      genau das gleiche Problem anfang schreibt er bis zur test variablen dann macht er mit dem ersten zeichen vermute des ascii codes das Display voll. wäre möglich das meine lib nen fehler hat.
      und somit die variable als endlos string sieht

      kannst du mir mal bitte deine lib schicken
      Display ist ein Phico D-0 0727 94V-0
      i2c expanter PCF8574AT


      ps weshalb es am anfang mit quarz nicht ginge war einfach Blödheit ein pin verutscht und PB7 kann ich ja dann eh nicht nutzen

      BASCOM-Quellcode

      1. $regfile = "m8adef.dat" 'specify the used micro
      2. $crystal = 8000000 'used crystal frequency
      3. $hwstack = 50 'default use 32 for the hardware stack
      4. $swstack = 50 'default use 10 for the SW stack
      5. $framesize = 50 'default use 40 for the frame space
      6. $lib "YwRobot_Lcd_i2c.lib"
      7. Const Pcf8574_lcd = 126 'Adresse des I2C-LCDs
      8. Dim _lcd_e As Byte
      9. Dim Lcd_backlight As Byte
      10. _lcd_e = 128
      11. Dim Test As String * 17
      12. Const Pcf_d4 = 4 'Pinzuordnung PCF8574 -> LCD
      13. Const Pcf_d5 = 5
      14. Const Pcf_d6 = 6
      15. Const Pcf_d7 = 7
      16. Const Pcf_rs = 0
      17. Const Pcf_rw = 1
      18. Const Pcf_e2 = 3 '3./4. Zeile bzw. Backlight
      19. Const Pcf_e1 = 2 'E
      20. '****************** Initialisierung ***********************
      21. 'Ddrb = &B11111111 'Standardbelegung der DDRs
      22. 'Ddrd = &B01110000
      23. 'Portd = &B10001111
      24. Config Scl = Portc.5 'Konfigurieren von I2C
      25. Config Sda = Portc.4
      26. Config Lcd = 20 * 4
      27. Config I2cdelay = 1
      28. 'warte bis Kondensator bei Ta0 geladen, auch für LCD-Init:
      29. Waitms 300
      30. Lcd_backlight = 1
      31. Test = "5"
      32. '**********************************************************
      33. '******************** Hauptprogramm ***********************
      34. Cls
      35. Lcd "Hello world!"
      36. Locate 2 , 1
      37. Lcd "2. row..."
      38. Wait 5
      39. Cls
      40. Do
      41. Locate 1 , 1
      42. Lcd Test
      43. Locate 2 , 1
      44. Lcd "werte"
      45. Loop
      46. End
      Alles anzeigen

    • Muss man denn I2CInit nicht mehr aufrufen, um den Bus zu initialisieren?

      Und woher weis eigentlich Bascom. was für ein Display dran hängt?
      Ich meine es könnte ein 16x2 sein, aber auch ein 20x4 Display.

      Ich denke da fehlt noch die Angabe
      Config Lcd=Lcd-Typ

      Die Initialisierung fürs Display (Command-Bytes) kommt ja von Bascom. Jedes Display braucht eine andese Initialisierung. In der Lib werden vermutlich nur die Daten auf den I2C-Bus umgeleitet.

      Ich habe sowas vor jahren auch mal gemacht. Da hatte ich das so gemacht, damit alle Bascom Befehle wie gewohnt funktionieren.
      Nur das Display ist eben an I2C-Bus gehangen.
    • Aslo irgendwie sieht das alles komisch aus, hier ein beispiel von mir,
      Den timer ignoriert mal, der war für ne ladungspumpe an 3,3V Betrieb, könnt ihr aber erstmal drin lassen

      Quellcode

      1. $regfile = "m8def.dat"
      2. $crystal = 8000000
      3. $hwstack = 32
      4. $swstack = 10
      5. $framesize = 40
      6. '$lib "i2c_twi.lbx" ' we do not use software emulated I2C but the TWI
      7. $lib "YwRobot_Lcd_i2c.lib" 'YwRobot Treiber für LCD
      8. Const Pcf8574_lcd = 112 'Adresse des I2C-LCDs
      9. Dim Lcd_backlight As Byte '1 = an; 0 = aus. Wird erst durch einen LCD-Befehl umgesetzt!
      10. Config Scl = Portc.5 'Konfigurieren von I2C
      11. Config Sda = Portc.4
      12. Dim Vari1 As Byte
      13. dim durchl as byte
      14. Config Portb.1 = Output
      15. Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1
      16. Compare1a = 128 '50%
      17. 'Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
      18. 'Config Lcd = 16 * 2
      19. 'Verwendet wird ein 16x2 Display im Pin mode
      20. 'Cursor Off Noblink 'Cursor abschalten
      21. cls 'LCD inhalt löschen und auf Home Position zurücksetzen
      22. Deflcdchar 1 , 28 , 16 , 28 , 32 , 32 , 32 , 32 , 32 ' CHR(1) als copyright symbol festlegen
      23. Deflcdchar 2 , 1 , 32 , 4 , 14 , 21 , 4 , 2 , 1 ' rpm links
      24. Deflcdchar 3 , 28 , 2 , 1 , 1 , 1 , 1 , 2 , 28 ' rpm rechts
      25. cls 'nach der definition der Eigenen character muss ein CLS durchgeführt werden, Deflcdchar 0 wird nicht definiert da es nicht mit einer Variable benutzt werden kann
      26. Locate 1,1 'Oberste Zeile, erstes digit von links wählen
      27. LCD "LCD Test1"
      28. Locate 2,1
      29. LCD CHR(1); "Bascomforum.de"
      30. Wait 5
      31. 'Kreis ausgeben
      32. cls
      33. Upperline
      34. Lcd "Kreis " ; Chr(2);CHR(3)
      35. wait 5
      36. ' ausgabe aller Zeichen ausser chr(0)
      37. for Vari1 = 1 to 255
      38. Cls
      39. Locate 1 , 1
      40. Lcd "Symbol-1 " ; Chr(vari1)
      41. Lowerline
      42. Lcd "Char nummer " ; Vari1
      43. Waitms 500
      44. next Vari1
      45. Wait 5 ' ausgabe aller Zeichen ausser chr(0), diesmal ohne flackern
      46. for Vari1 = 1 to 255
      47. Locate 1,10
      48. LCD SPC(6)
      49. Locate 1 , 1
      50. Lcd "Symbol-2 " ; Chr(vari1)
      51. Locate 2,13
      52. LCD SPC(3)
      53. Locate 2,1
      54. Lcd "Char nummer " ; Vari1
      55. Waitms 500
      56. next Vari1
      57. wait 5
      58. 'einmal variable bis 10 durchlaufen lassen was passiert beim 2ten durchlauf?
      59. cls
      60. for durchl = 1 to 2 '2 durchläufe
      61. for vari1 = 0 to 10
      62. Locate 1,1
      63. LCD "Variable1 ";VARI1
      64. locate 2,1
      65. LCD "Durchlauf " ; durchl
      66. wait 2
      67. Next vari1
      68. wait 2
      69. next durchl
      70. wait 5
      71. 'einmal variable bis 10 durchlaufen lassen jetzt passt es auch beim 2ten durchlauf
      72. cls
      73. for durchl = 1 to 2
      74. for vari1 = 0 to 10
      75. Locate 1,1
      76. If vari1 < 10 then
      77. LCD "Variable1 ";" ";VARI1
      78. Else
      79. LCD "Variable1 ";VARI1
      80. End if
      81. locate 2,1
      82. LCD "Durchlauf " ; durchl
      83. wait 2
      84. Next vari1
      85. wait 2
      86. next durchl
      87. wait 5
      88. cls
      89. Locate 1 , 1
      90. lcd "123456781234567812345678123456781234567812345678"
      91. wait 5
      92. cls
      93. locate 1,1
      94. LCD "Programm ende"
      95. end
      Alles anzeigen
    • djmsc schrieb:

      es funktioniert ohne Probleme
      Glück gehabt. Die meißten Displays benötigen ein init damit sie wissen das nur 4 bit gesendet werden.
      Die Const sind nur informativ und werden nicht von der lib genutzt. Ein I2C init ist nie verkehrt stellt aber nur das DDR richtig. Beim Config LCD= a x b habe ich noch keine Auswirkungen festgestellt. Bascom sendet was es bekommt. Ist das zuviel liegts am Display was mit den "Überlaufdaten" passiert. Oft bekommt die 3/4. Zeile was in der 1/2. zuviel war.

      Mitch64 schrieb:

      kommt ja von Bascom.
      In dem Fall ist das init in der lib
    • Mitch64 schrieb:

      Muss man denn I2CInit nicht mehr aufrufen, um den Bus zu initialisieren?
      Ich glaube schon, dass man das weglassen kann. Denn selbst in den Beispielen von Bascom (lcd_i2c_demo.bas) ist es nicht drin.

      Mitch64 schrieb:

      Ich denke da fehlt noch die Angabe
      Config Lcd=Lcd-Typ
      Ist doch drin. In meinem Beispiel auf Zeile 35 und im Beispiel von @Weichmacher auf Zeile 60.

      Pluto25 schrieb:

      Die meißten Displays benötigen ein init damit sie wissen das nur 4 bit gesendet werden.
      Wenn ich das richtig sehe geschieht das schon durch die LIB. Und auch in vielen Beispielen im Netz wird das nicht gemacht.

      forum.g-heinrichs.de/viewtopic.php?t=73
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.