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

riesen

Mitglied
10. Sep. 2010
108
1
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
Anhang anzeigen LCD_Arduino_Mini168_I2C_universal.bas
Anhang anzeigen I2C_LCD_universal.bas
Anhang anzeigen I2C_LCD_universal_declare.bas
 
  • Like
Reaktionen: Lordcyber
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 ?
 
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
 
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:
Eine formatierte Anzeige (LCD FUSING) ist damit aber anscheinend nicht möglich

formatierte Anzeige (LCD FUSING) ? :stupido2:


Sorry, aber das verstehe ich nicht.

Grüße,
Cassio
 
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.
 
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
 
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
 
Hallo Thomas,
jetzt läuft alles einwandfrei mit Deiner Software. Nochmal Danke dafür !
Ich wünsche Dir schöne Feiertage.
Ulrich
 
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:

Hallo LCD-Fans
.....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....
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
 
Hi Joachim,

Wie kann ich die Zeitanzeige zu einem String machen? Das sind ja zweistellige, variable Zahlenwerte. Muß ich dann jeweils "Str*2" schreiben oder wie?

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

6.364 STR
Action
Returns a string representation of a number.
Syntax
var = STR( x)

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

Gruß
Dino
 
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
 
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
 
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
 
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
 
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
 
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
 
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
 
JUHU vielen Dank.
Dank deiner Arbeit habe ich endlich mein Display auch ans laufen bekommen.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)