Bascom Bascom I2C LCD mit PCF8574: Universelle Ansteuerung (inkl. DEFLCDCHAR) ohne LIB

Dieses Thema im Forum "LED + LCD" wurde erstellt von riesen, 20. Dezember 2012.

  1. riesen

    riesen Mitglied

    Registriert seit:
    10. September 2010
    Beiträge:
    108
    Zustimmungen:
    1
    Punkte für Erfolge:
    16
    Hallo LCD-Fans

    Vor einiger Zeit hat hier im Forum Cassio einige Routinen zum Ansteuern eines LCD's mit
    Standard-Controller HD44780 über I2C ohne entsprechende Bascom-LIB veröffentlicht.
    Der Code funktioniert super, es fehlt aber eine DEFLCDCHAR-Funktion und die Anpassung
    an andere PCF8574-Pin-Belegungen durch die direkte Hex-Wert-Ansteuerung der Pins ist
    immer eine gewisse "Rechnerei" erforderlich.

    Meine Idee war, einen universellen Code zu schreiben, in welchem die Pin-Belegung per
    Definition frei festgelegt werden kann. Die Befehle und Daten werden einzeln geschickt
    und nicht in Paketen zusammengefasst. Das Programm wird so besser nachvollziehbar.
    Einen Geschwindigkeitsnachteil konnte ich nicht feststellen.

    Es ist auch eine DEFLCDCHAR-Funktion enthalten. Die Zeichen können mit dem Bascom
    LCD-Designer erstellt werden und die daraus resultierenden Werte in die DATA-Zeilen
    kopiert werden. Das Zeichen Chr(0) kann nicht verwendet werden, muss aber in der
    DATA Zeile trotzdem aufgeführt sein, die Werte sind unwichtig. Chr(0) wird als String-
    Ende interpretiert und kann somit nicht dargestellt werden. Es stehen somit noch die
    Werte Chr(1) bis Chr(7) zur Verfügung.

    Einziger Nachteil gegenüber der Standard Bascom-LIB ist, dass Zahlenwerte zuerst in
    einen String umgewandelt werden müssen. Die dafür gewonnene Freiheit und Funktions-
    Sicherheit ist aber doch auch was.

    Für Anregungen und Verbesserungen bin ich sehr dankbar!

    Grüsse aus der Schweiz
    Thomas
    Den Anhang LCD_Arduino_Mini168_I2C_universal.bas betrachten
    Den Anhang I2C_LCD_universal.bas betrachten
    Den Anhang I2C_LCD_universal_declare.bas betrachten
     
    Lordcyber gefällt das.
  2. Uddo

    Uddo Neues Mitglied

    Registriert seit:
    23. November 2010
    Beiträge:
    6
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Sprachen:
    BascomAVR, Pascal
    Werde ich nachher mal mit meinem sainsmart I2C LCD Modul testen welches ich bisher nicht ans Laufen bekam. Eine formatierte Anzeige (LCD FUSING) ist damit aber anscheinend nicht möglich soweit ich Deinen Code überflogen habe ?
     
  3. Cassio

    Cassio Aktives Mitglied

    Registriert seit:
    29. Oktober 2008
    Beiträge:
    4.027
    Zustimmungen:
    16
    Punkte für Erfolge:
    38
    Sprachen:
    BascomAVR
    Hallo Thomas!

    Glückwunsch, zur "neuen" Version! :)
    Das Thema scheint dich ja gar nicht mehr los zu lassen. :D

    Ich habe dafür im Moment leider absolut keine Zeit.
    Wenn es die Weihnachtstage erlauben, kann ich deinen Programmcode ja mal ausprobieren. :wink:
    Den Testaufbau mit dem Display habe ich hier jedenfalls noch liegen.


    Was mich aber wundert......
    Warum kannst du das CHR(0) nicht verwenden? :hmmmm:

    Das CHR(0) liegt doch im Displayspeicher an Adresse &H40!
    Es dürfte daher doch keine Probleme geben?
    Oder sendest du die Werte über die Stringvariablen? :hmmmm:
    So spontan fällt mir jetzt nicht ein, warum es dabei zu Problemen kommt.
    Ich muss mir deinen Programmcode deisbezüglich wohl doch mal genauer ansehen.


    Bis dahin erst mal.....
    Cassio
     
  4. Cassio

    Cassio Aktives Mitglied

    Registriert seit:
    29. Oktober 2008
    Beiträge:
    4.027
    Zustimmungen:
    16
    Punkte für Erfolge:
    38
    Sprachen:
    BascomAVR
    Hallo Uddo!

    Willkommen im AVR-Praxis Forum! :ciao:

    Probiere doch die aktuelle Version von Thomas mal aus.
    Scheint eine gute Möglichkeit zu sein, wie er meinen alten Programmcode umgebaut hat.

    Damit solltest du dein Modul wohl zum Laufen bewegen können.
    Tja und falls nicht......
    wir sind ja auch noch da. :wink:


    Eine Frage habe ich allerdings gleich!
    Was meinst du mit:
    formatierte Anzeige (LCD FUSING) ? :stupido2:


    Sorry, aber das verstehe ich nicht.

    Grüße,
    Cassio
     
  5. Uddo

    Uddo Neues Mitglied

    Registriert seit:
    23. November 2010
    Beiträge:
    6
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Sprachen:
    BascomAVR, Pascal
    Hallo cassio,
    ja sorry, Fusing ist ja eine Formatierungs-Funktion für einen String.
    Ich habe den Code jetzt mal mit meinem I2C Modul an einem Standard 1602 LCD Modul getestet.
    http://www.ebay.de/itm/IIC-I2C-TWI-...92886?pt=Motoren_Getriebe&hash=item3f1f97f876
    Dabei gibt es seltsame Efekte:
    Die Schrift erscheint nicht hell sondern dunkel auf dem Display, das Ein/Ausschalten des Displays ist invertiert.
    Das Display ist bei direkter paralleler Ansteuerung (also nicht mit dem I2C) absolut in Ordnung.
    Die Invertierung Ein/Aus ist ja an sich kein Problem und kann im Parameter File leicht korrigiert werden.
    Bei der Text-Invertierung / negativ-Darstellung weiss ich jetzt auch nicht weiter.
    Ich werde noch was dran rumbasteln.
     
  6. Cassio

    Cassio Aktives Mitglied

    Registriert seit:
    29. Oktober 2008
    Beiträge:
    4.027
    Zustimmungen:
    16
    Punkte für Erfolge:
    38
    Sprachen:
    BascomAVR
    Hallo Uddo!

    Hast du ggf mal ein Anschlussbild (Schaltplan) von deinem I2C-Modul?

    Solltest du weiterhin Probleme mit dem Modul haben, dann eröffne doch bitte ein eigenes Thema!
    Wäre sonst schade, wenn wir den Thread von Thomas dafür "missbrauchen".

    Hier geht es ja schließlich nur um die Software. :wink:


    Grüße,
    Cassio
     
  7. riesen

    riesen Mitglied

    Registriert seit:
    10. September 2010
    Beiträge:
    108
    Zustimmungen:
    1
    Punkte für Erfolge:
    16
    Hallo Uddo
    Hallo Cassio

    Bezüglich der Invertierung habe ich spontan auch keine Idee. Es scheint eher ein Problem mit dem Kontrast zu
    sein, oder ev. der Versorgungsspannung. Den Parameter für das Ein-/Ausschalten der Hintergrundbeleuchtung
    hast du ja selber schon gefunden, den habe ich vergessen zu beschreiben. Was das "Fusing" anbelangt, nichts
    einfacher als das. Bascom kennt ja den Befehl "Fusing", hier kannst du direkt eine numerische Variable in einen
    formatierten String umwandeln. Schau dir doch dazu die Hilfe in Bascom an.

    Das I2C-Modul von mjkdz habe ich übrigens auch im Einsatz, das war auch der Auslöser, wieso ich das mit der
    freien Pin-Konfiguration in Angriff genommen habe. Was hast du hier für ein LCD dran? Ich habe sicher über
    10 verschiedene Typen, auch solche für $2.80, getestet, bei mir klappt es.

    @Cassio:
    Mit dem Befehl "Lcd4_Data 0" wird das Zeichen korrekt angezeigt, aber bei der Verwendung des Chr(0) in einem
    String wird dieser als Text-Ende verstanden. Für Ideen bin ich aber sehr dankbar!

    Viele Grüsse
    Thomas
     
  8. Uddo

    Uddo Neues Mitglied

    Registriert seit:
    23. November 2010
    Beiträge:
    6
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Sprachen:
    BascomAVR, Pascal
    Hallo Thomas,
    jetzt läuft alles einwandfrei mit Deiner Software. Nochmal Danke dafür !
    Ich wünsche Dir schöne Feiertage.
    Ulrich
     
  9. joho63

    joho63 Neues Mitglied

    Registriert seit:
    13. September 2013
    Beiträge:
    2
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hallo Thomas!
    Ich bin zwar als "Späteinsteiger" jetzt erst auf diesen Thread gestoßen, finde das aber trotzdem immernoch sehr interessant und hilfreich.
    Ich habe als Anfänger schon sehr viel hier gelernt. Deine Dateien hab ich für mich angepaßt und sie laufen problemlos.
    Nun möchte ich aber eine Uhr damit betreiben, und das packe ich einfach nicht. Es geht um das hier:

    Wie kann ich die Zeitanzeige zu einem String machen? Das sind ja zweistellige, variable Zahlenwerte. Muß ich dann jeweils "Str*2" schreiben oder wie?
    Kannst Du mal ein kurzes Beispiel dafür zeigen bitte, ich glaub, dann komm ich alleine weiter. Ich kann auch gerne mein Uhrenprogramm hier reinstellen,
    wenn das hilft.
    Joachim
     
  10. dino03

    dino03 Aktives Mitglied

    Registriert seit:
    27. Oktober 2008
    Beiträge:
    6.695
    Zustimmungen:
    14
    Punkte für Erfolge:
    38
    Sprachen:
    BascomAVR, Assembler
    Hi Joachim,

    sieh dir in der Bascom-Referenz mal folgendes an ...

    Das wandelt den Inhalt einer numerischen Variable in den Inhalt einer Textvariablen.

    Gruß
    Dino
     
  11. monkye

    monkye Neues Mitglied

    Registriert seit:
    9. November 2014
    Beiträge:
    5
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    LCD Modul wird nicht initialisiert

    Hallo Zusammen,

    sorry das ich den alten Thread nochmal ausgrabe, aber die Idee fand ich Klasse. Für ein kleines Projekt baue ich Platinen mit einem Attiny45, welche die Temperatur und die Luftfeuchtigkeit einsammeln und stündlich per Funk an den Master weitergeben.
    An der Messstelle selbst soll ein Display die aktuellen Werte anzeigen, wenn der Benutzer eine Taste drückt. (10 Sekunden, Energiesparen)

    Ja, und da wollte ich diese Ansteuerung einsetzen. Die I2C-Platine ist vom Chinamann (inkl. Schaltplan) und die nötige Anpassung bzgl. der Anschlüsse habe ich auch gemacht. (xxx_universal_declare.bas) Leider zuckt das Teil nicht ein bisschen. Eine Klötzchenzeile im Display bedeutet ja, dass die Initialisierung nicht stattgefunden hat.

    Das Display und auch die I2C-Platine ist OK, weil diese an einem Arduino das tun was sie sollen.

    Tja, und nun sind mir die Ideen ausgegangen. Der eingeschränkte "Hello World" Test ohne Schnickschnack funktioniert auch nicht. Und ein Delay habe ich auch probiert.

    Habe ich grundlegend etwas übersehen?

    Danke vorab,

    Uwe
     
  12. riesen

    riesen Mitglied

    Registriert seit:
    10. September 2010
    Beiträge:
    108
    Zustimmungen:
    1
    Punkte für Erfolge:
    16
    Hallo Uwe

    Tja, nun sollten wir wohl etwas mehr über deine Hardware wissen. Die Software wurde schon so
    oft von mir andern erfolgreich eingesetzt, so ein grundlegendes Problem kann diese nicht mehr
    haben.

    Stell doch mal das Schema deiner Hardware und die Software hier ein .... dann schauen wir mal.

    Gruss
    Thomas
     
  13. monkye

    monkye Neues Mitglied

    Registriert seit:
    9. November 2014
    Beiträge:
    5
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    Schaltung Attiny45

    Hallo Thomas,

    die Schaltung ist simpel, siehe Bildchen. Die Software ist im Original von der ersten Beitragsseite, getauscht wurde nur das Display 16x2 in der Definitionsdatei (es ist ein Datavision, die Anschlüsse sind wie bei Pollin).

    ATTiny45-an-I2C_LCD.PNG

    EDIT:
    Die Schaltung der Interfaceplatine scheint nicht zu passen, denn mit einem Logicanalyser kam am Ausgang nix an. Habe dann die Standardadresse &H4E verwendet und schon wackelt was am Ausgang. Die Signale sind aber alle völlig chaotisch, z.B. ist der gewollte Impuls an E viel zu lang und zeitlich ungleichmäßig.

    Komischerweise funktioniert die Ausgabe mit &H20 und dem Arduino.... begreife ich irgendwie nicht. Und das obwohl in der vom Chinamann mitgelieferten Arduino Software scheinbar das "Gleiche" gemacht wird...

    Grüße,

    Uwe
     
  14. monkye

    monkye Neues Mitglied

    Registriert seit:
    9. November 2014
    Beiträge:
    5
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    Nachtrag

    Guten Morgen Zusammen,

    sehr wahrscheinlich ist die Schaltung vom Chinamann falsch dargestellt. Werde heute Abend nochmal alles durchklingeln und dann wirds bestimmt passen. Vermutlich habe ich hier vorausgesetzt, dass ein PCF8574 zur Anwendung kommt - und da passen die im Beispiel aufgeführten I2C-Adressen einfach nicht. Wer weiß wer die Dokumentation geschrieben und zusammengestellt hat.

    C'est la vie.

    Grüße,

    Uwe
     
  15. riesen

    riesen Mitglied

    Registriert seit:
    10. September 2010
    Beiträge:
    108
    Zustimmungen:
    1
    Punkte für Erfolge:
    16
    Hallo Uwe

    Deine Fehleranalyse verstehe ich nicht ganz. Es gilt sicher mal zwei Dinge zu klären:
    - Ist wirklich ein PCF8574 im Einsatz?
    - Wenn ja, auf welche Adresse ist dieser eingestellt?

    Wahrscheinlcih wird beim Arduino-Programm die 7Bit-Adresse angegeben, da fehlt das Bit 0, welches
    angibt, ob geschrieben oder gelesen wird. In meiner Software wird nur geschrieben, somit ist das Bit 0
    immer 1. Ein Blick ins Datenblatt könnte so allgemein auch nicht schaden.

    PCF8574.JPG

    Am PCF874 ist an den Pin's 1,2,3 die Adresse "angelegt", miss doch mal ob die an VCC oder GND liegen.
    Weiter gibt es hier im Forum ein kleines Bascom-Programm, mit welchem die Adressen der angeschlossenen
    I2C-Systeme ausgegeben werden können. Ein Blick ins Datenblatt könnte so allgemein auch nicht schaden.

    Gruss
    Thomas
     
  16. monkye

    monkye Neues Mitglied

    Registriert seit:
    9. November 2014
    Beiträge:
    5
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    Nachtrag II

    Hallo Thomas,

    es ist ganz, ganz wirklich der PCF8574 (ohne A) im Einsatz. Und die Adresse ist wie berichtet 0x4E (64 ist fix vom Hersteller vorgegeben und die Pins A2, A1 und A0 hängen über 1k Widerständen an +5V, damit ergibt sich 64 + 8 + 4 + 2 = 78 --> = 0x4E).

    Die Arduino Adresse 0x27 ist wie Du schon schreibst die Adresse ohne das Bit 0, das bekanntlich zwischen Schreiben (=0) und Lesen (=1) umschaltet. Einmal nach links schieben und schon habe ich 0x4E.

    Ins Datenblatt gucke ich im Allgemeinen immer, aber bei einer Kauflösung mit Schaltplan zweifle ich erst einmal nicht gleich - da gucke ich erst in meinem Stall :).

    Inzwischen gehe ich davon aus das die Anschlüsse anders liegen und ich neu sortieren muss. Die gesendeten Daten passen auf jeden Fall zur Software, dass habe ich per Logicanalyzer geprüft.

    Heute Abend wird sicher die "feierliche Illumination" des Displays stattfinden.

    Danke für Deine Bemühungen,

    Uwe
     
  17. monkye

    monkye Neues Mitglied

    Registriert seit:
    9. November 2014
    Beiträge:
    5
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    Herzlichen Dank !

    Wie heute Morgen vermutet war die Beschaltung falsch. Inzwischen läuft das Display zuverlässig. Es gab anfänglich Probleme mit der Geschwindigkeit des I2C-Taktes, aber das war schnell abgestellt.

    Interessant ist, dass die meisten Displays auf Anhieb laufen und 1, 2 weigern sich beständig. Naja, das löse ich auch noch.

    Die Lösung ohne LIB ist Klasse, weil ich mit wenig Aufwand schnell diverse Hardware einbinden kann.

    In dem Sinne: Besten Dank für die geleistete Arbeit.

    Einen schönen Abend noch,

    Uwe
     
  18. Lordcyber

    Lordcyber Neues Mitglied

    Registriert seit:
    8. August 2016
    Beiträge:
    3
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    JUHU vielen Dank.
    Dank deiner Arbeit habe ich endlich mein Display auch ans laufen bekommen.
     
  • Über uns

    Unsere immer weiter wachsende Community beschäftigt sich mit Themenbereichen rund um Mikrocontroller- und Kleinstrechnersysteme. Neben den Themen Design von Schaltungen, Layout und Software, beschäftigen wir uns auch mit der herkömmlichen Elektrotechnik.

    Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  • Coffee Time

    Unser makerconnect-Team arbeitet hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und unser eigener makerconnekt-Server regelmäßig gewartet wird. Wir nehmen das Thema Datensicherung und Datenschutz sehr ernst und sind hier sehr aktiv, auch sorgen wir uns darum, dass alles Drumherum stimmt!

    Dir gefällt das Forum und die Arbeit unseres Teams und du möchtest es unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft, unser Team freut sich auch über eine Spende für die Kaffeekasse :-)
    Vielen Dank!
    Dein makerconnect-Team

    Spende uns! (Paypal)
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren und die Seite optimal für dich anzupassen. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden