Forum: Mikrocontroller und Digitale Elektronik Mit Wire.h über I2C auf LCD-Display 1602 zugreifen


von Guido (gui)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe einen Nucleo-L152RE Mikrocontroller und ein LCD-Display 1602. 
Ich möchte in der Arduino-IDE Zeichen über I2C zum Display schicken (im 
Beispiel den Buchstaben "A".

Leider wird auf dem Display nichts angezeigt. Die Verbindung selbst ist 
korrekt.

Der Quellcode ist im Anhang.

Ich wäre sehr dankbar, wenn mir jemand meinen Quellcode korrigieren 
könnte.

Guido

von Frank E. (ffje)


Lesenswert?

Ich habe auch ein 1602-LCD.
2 Zeilen, je 16 Zeichen, es wird mit SPI angesteuert.
Daten?
mfG  fE

von Karl B. (gustav)


Lesenswert?

Guido schrieb:
> LCD-Display 1602

Hat das I2C überhaupt?
Meistens die übliche Parallelbus Ansteuerung HD44780.
Bei mir geht das bei I2C nur über Portadapter PCF8574.

ciao
gustav

von Wolfgang S. (wolfgang_s278)


Lesenswert?

Init LCD ?

von Guido (gui)


Lesenswert?

Ja, es hat 2 Zeilen zu je 16 Zeichen.

Es ist das LCD-Display: LCD 1602 + I2C HD44780 Modul

Man kann es also definitiv auch über I2C ansteuern.

Alternativ zu Wire.h kann man z. B. auch über das Library 
LiquidCrystal_PCF8574.h ansteuern. Das klappt bei mir auch.

Aber jetzt möchte ich eben mit Wire.h über I2C auf das Display zugreifen 
und Zeichen ausgeben ... was eben nicht klappt.

von Guido (gui)


Lesenswert?

Und wie kann ich das über Wire.h das LCD-Display initialisieren? Ich 
dachte, das macht die Zeile:

Wire.begin ();

von Steve van de Grens (roehrmond)


Lesenswert?

Du kannst nicht einfach auf diese Weise Buchstaben an das Display 
senden.

Das Display muss für 4 Bit Kommunikation initialisiert werden. Dann 
musst du die Buchstaben in 4 Bit zerlegen und die Steuerleitungen des 
Display ansteuern.

Also lies das Datenblatt von HD44780 und von dem Port-Expander, der 
damit verbunden ist.

Da das kein Job für Anfänger ist, empfehle ich dir die Verwendung eines 
Display ohne Portexpander. Dann hast du einen Chip weniger beteiligt, 
was die Sache sehr vereinfacht.

> Wire.begin ();

Initialisiert weder den LCD Controller noch den Portexpander, sondern 
nur die I2C Schnittstelle des Mikrocontrollers.

: Bearbeitet durch User
von Peter (pittyj)


Lesenswert?

Guido schrieb:
> Alternativ zu Wire.h kann man z. B. auch über das Library
> LiquidCrystal_PCF8574.h ansteuern. Das klappt bei mir auch.
>
Wenn es geht, warum muss das dann die andere Bibliothek sein??

Dann nimm doch die funktionierende Bibliothek und analysiere auf 
Sourcecode Ebene, was sie auf den Bus schickt. Dann brauchst du nur das 
gleiche schicken. Der Sourcecode sollte ja vorhanden sein.

Alternativ ein Scope mit I2C Analysator anschliessen. Das teilt dir 
genau mit, was alles gesendet werden muss.

Also letztendlich eine Aufgabe von 10 Minuten.

von Wolfgang S. (wolfgang_s278)


Lesenswert?

Für INIT musst du eine Folge von Bytes (s. Datenblatt) an das LCD 
senden.
Das geht auch über I2C.
Pausen aber einhalten !

von Steve van de Grens (roehrmond)


Lesenswert?

Peter schrieb:
> Also letztendlich eine Aufgabe von 10 Minuten.

Laber keinen Blödsinn!

von Rainer W. (rawi)


Lesenswert?

Guido schrieb:
> Es ist das LCD-Display: LCD 1602 + I2C HD44780 Modul
>
> Man kann es also definitiv auch über I2C ansteuern.

Stimmt die I2C-Adresse, d.h. antwortet dein I2C-Bus Expander, wenn du 
ihn unter der im Code eingetragenen Adresse ansprichst?

: Bearbeitet durch User
von Peter (pittyj)


Lesenswert?

Steve van de Grens schrieb:
> Peter schrieb:
>> Also letztendlich eine Aufgabe von 10 Minuten.
>
> Laber keinen Blödsinn!

Kein Blödsinn: Scope nehmen. SDA,SCL und GND verbinden. I2C Analysemodus 
einschalten. Einmal mit LyquidCristal hochfahren. Und alles steht im 
Scope.

Alternativ LiquidCristal Sourcecode nehmen. In der Senderoutine (die 
selbst wahrscheinlich Wire benutzt) die Sendebytes mit printf 
herausschreiben. Dann steht alles auf der Konsole.

Ist doch kein Hexenwerk.

von Steve van de Grens (roehrmond)


Lesenswert?

Peter schrieb:
> Ist doch kein Hexenwerk.

Danach kann er immer noch keine Buchstaben an das Display senden, so wie 
er sich das vorstellt.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Steve van de Grens schrieb:
> Da das kein Job für Anfänger ist,
Wire.h hört sich nach Arduino an!
Dann sollte das Thema eigentlich fix durch sein.

Ein I2c Scanner zeigt einem die Adresse.
Libraries gibt es einige.

von Steve van de Grens (roehrmond)


Lesenswert?

Arduino F. schrieb:
> Libraries gibt es einige.

Die will er ja nicht benutzen!

von J. S. (jojos)


Lesenswert?

https://www.mikrocontroller.net/articles/HD44780
Lesen.
Das Display hat ein Parallel Interface, der I2C Expander macht nur die 
Umsetzung serielles I2C auf Daten- und Steuerleitungen. Da müssen die 
richtigen Sequenzen ausgegeben werden, einfach ein ‚A‘ ausgeben reicht 
nicht.

von Peter (pittyj)


Lesenswert?

J. S. schrieb:
> https://www.mikrocontroller.net/articles/HD44780
> Lesen.
> Das Display hat ein Parallel Interface, der I2C Expander macht nur die
> Umsetzung serielles I2C auf Daten- und Steuerleitungen. Da müssen die
> richtigen Sequenzen ausgegeben werden, einfach ein ‚A‘ ausgeben reicht
> nicht.

Ja, und von daher wäre es doch etwas einfaches, die funktionierende 
LyquidCristal zu nehmen, und Reverse Engineering zu betreiben.

Ich habe letztens erst so ein Display mit einen FPGA bedient, weiss 
also, was man für Codes hinschicken muss, und wo man welche Wartezeiten 
beachten muss.

von J. S. (jojos)


Lesenswert?

Das ist schön, aber erstmal sollte dem TO klar werden warum es nicht so 
einfach geht und sich die Hardware sowie Datenblatt des Displays dazu 
ansehen.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Steve van de Grens schrieb:
> Die will er ja nicht benutzen!
Von mir aus.

Zumindest kann man ja da rein schauen.

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

J. S. schrieb:
> Das ist schön, aber erstmal sollte dem TO klar werden warum es nicht so
> einfach geht und sich die Hardware sowie Datenblatt des Displays dazu
> ansehen.

Bei I2C muss man Instructions "maskieren", da ja keine "Hardware"-Pins 
für R/W, RS und Enable da sind. Das macht entweder der Portadapter oder 
das Display hat die Ansteuermöglichkeit I2C.

Im Beispiel wie der Enable-Impuls "maskiert" wird.

ciao
gustav

von Axel R. (axlr)


Lesenswert?

1
#include <LiquidCrystal_I2C.h>
2
3
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 column and 2 rows
4
5
void setup()
6
{
7
  lcd.init(); // initialize the lcd
8
  lcd.backlight();
9
}

Das, was
>LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 column and 2
da macht, musst du herausfinden und selbst nachbasteln.
bei VSCode und Platformio markierst Du lcd und drückst F12, um in die 
Bibliothek zu gelangen. dort kannst Du dir ansehen, wie die eigentliche 
Initialisierung aussehen muss.
Also: Eine möglichkeit.
Du kannst auch mit Wire.write() nacheinander, meinethablen untereinder 
geschrieben, alle Bytes rausschicken, die dein LCD benötigt, BEVOR es in 
der Lage ist, ein "A" darzustellen.

oder eben komplett zu Fuß. Das kann man ja leicht abwandeln. 
UNterscheiden musst Du halt nur, ob du ein KOMMANDO oder DATEN 
schicken willst. Also zB <Cursor links> oder "HALLO".
 Hier machen die das für einen STM32.
https://controllerstech.com/i2c-lcd-in-stm32/

von Manfred P. (pruckelfred)


Lesenswert?

Steve van de Grens schrieb:
> Da das kein Job für Anfänger ist,

Wie habe ich das bloß 2015 bei meinem ersten ernsthaften Arduino-Gerät 
gemacht? Das lief nicht auf Anhieb, weil unterschiedliche I2C-Boards im 
Umlauf sind. Klar ist auf jeden Fall, dass neben "Wire.h" auch die 
"LiquidCrystal_I2C.h" eingebunden werden muß. Soweit ich mich erinnere, 
muß die "LiquidCrystal_I2C.h" zum I2C-Board passen.

Es finden sich im Netz massenhaft Beispiele, aus denen man abmalen kann.

> empfehle ich dir die Verwendung eines
> Display ohne Portexpander. Dann hast du einen Chip weniger beteiligt,
> was die Sache sehr vereinfacht.

Auch das muss initialisiert und bedient werden, dafür bindet man die 
"LiquidCrystal.h" ein. Finde ich irgendwie doof, weil das Display mehr 
Portleitungen belegt.

Axel R. schrieb:
> Das, was
>>LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 column and 2
> da macht, musst du herausfinden und selbst nachbasteln.

Hier sieht das anders aus:
1
#include <Wire.h>
2
#include <LiquidCrystal_I2C.h>
3
4
String Version = "V 2015-11-13 01";
5
6
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
7
lcd.begin(16,2); // initialize the lcd
8
// Cursor Position: CHAR, LINE) start at 0  
9
 lcd.setCursor(0,0); //Start at character 0 on line 0
10
 lcd.print("Loetstation mk  ");
11
 lcd.setCursor(0,1);
12
 lcd.print(Version);
13
 delay(1500);
14
15
// ab hier läuft dann das Programm los

von Harry L. (mysth)


Lesenswert?


von Guido (gui)


Lesenswert?

Vielen Dank euch allen für eure Rückmeldungen.

Eigentlich hatte ich mir gewünscht und auch erhofft, dass ich den 
Quellcode für ein einfaches, aber funktionierendes Beispiel bekomme. Und 
auf diesem wollte ich dann aufbauen und dieses erweitern.

Sieht aber so aus, als ob mein Wunsch nicht in Erfüllung geht und ich 
mich doch wesentlich eingehender damit beschäftigen muss.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Guido schrieb:
> Eigentlich hatte ich mir gewünscht und auch erhofft, dass ich den
> Quellcode für ein einfaches, aber funktionierendes Beispiel bekomme.

Die Arduino LCD Libraries sind funktionierende Beispiele.

Guido schrieb:
> Und auf diesem wollte ich dann aufbauen und dieses erweitern.
Was hindert dich?

Guido schrieb:
> Sieht aber so aus, als ob mein Wunsch nicht in Erfüllung geht und ich
> mich doch wesentlich eingehender damit beschäftigen muss.

Drei Möglichkeiten du hast!
1. Selber lernen macht selber schlau
2. verwende, was es schon gibt.
3. aufgeben.

von Wastl (hartundweichware)


Lesenswert?

Guido schrieb:
> Sieht aber so aus, als ob mein Wunsch nicht in Erfüllung geht und ich
> mich doch wesentlich eingehender damit beschäftigen muss.

Wenn du dich endlich von Arduino trennen könntest und eine
richtige IDE verwenden würdest (z.B. Atollic Truestudio oder
STM CubeIDE) könnte dir leicht geholfen werden. Aber dazu
müsste "man" halt richtig programmieren können und nicht nur
ein paar "Libs" zusammen kopieren und nicht verstehen was
da eigentlich passiert. Nachdem du aber nicht den Anschein
erweckst dich vom oben Erwähntem lösen zu können mache ich
auch keine Anstalten dir was vorzuschlagen.

von Steve van de Grens (roehrmond)


Lesenswert?

Guido schrieb:
> Eigentlich hatte ich mir gewünscht und auch erhofft, dass ich den
> Quellcode für ein einfaches, aber funktionierendes Beispiel bekomme

Das Display wurde dazu konzipiert, an den Adress- und Datenbus eine 
klassischen 8 Bit Mikroprozessors angeschlossen zu werden. Dann wäre es 
relativ einfach einfach gewesen. Dann hättest du es im 8 Bit Modus 
verwenden können und sowohl die Initialisierungs-Befehle als auch die 
Buchstaben einfach 1:1 an das Display senden können.

Aber bei deiner Hardware muss der Bus (da nicht vorhanden) durch 
Software simuliert werden. Weil bei dir auch noch ein I²C Portexpander 
dazwischen hängt, wird es noch eine Nummer komplexer.

Ein
> einfaches, aber funktionierendes Beispiel
kann es nicht geben. Eine funktionierende Bibliothek hast du.

Lies die Datenblätter der beiden Mikrochips. Probiere sie einzeln 
unabhängig voneinander aus. Solche Displays gibt es ohne Portexpander 
(mit paralleler Bus-Schnittstelle) zu kaufen. Die Portexpander kannst du 
mit ein paar LEDs und Schaltern ausprobieren. Erst wenn du mit beiden 
vertraut bist, solltest du sie miteinander kombinieren.

So eine Software baut man in Schichten eine nach der anderen auf, damit 
es einfacher zu verstehen ist.

: Bearbeitet durch User
von Wastl (hartundweichware)


Lesenswert?

Steve van de Grens schrieb:
> Aber bei deiner Hardware muss der Bus (da nicht vorhanden) durch
> Software simuliert werden.  Weil bei dir auch noch ein I²C Portexpander
> dazwischen hängt, wird es noch eine Nummer komplexer.

Nein, natürlich könnte er sein 1602 Display direkt an sein
Nucleo-L152RE Board hängen. "Bus" wäre sozusagen vorhanden,
aber auch mit diesem muss man erst mal umgehen (können). Ob
das aus der Arduino IDE überhaupt vorgesehen ist weiss ich
nicht, kann mir es nicht so recht vorstellen.

Ideal wäre es sich erst mal vom Nucleo-L152RE zu verabschieden
und ein gängiges Arduino Board zu verwenden, das ist alles
(fast) ganz einfach.

von Steve van de Grens (roehrmond)


Lesenswert?

Wastl schrieb:
> ein gängiges Arduino Board zu verwenden, das ist alles
> (fast) ganz einfach.

Ich bin ziemlich sicher, den TO richtig verstanden zu haben: Er möchte 
ausdrücklich nicht die fertigen Arduino Bibliotheken verwenden, 
sondern es auf niedrigerer Ebene selbst programmieren.

von Wastl (hartundweichware)


Lesenswert?

Steve van de Grens schrieb:
> Ich bin ziemlich sicher, den TO richtig verstanden zu haben:

Ich bin ziemlich sicher dass der TO zwar viel möchte, aber wenig
kann. Er muss noch viel lernen. Mich bringt meine Annahme dazu
wenn ich sehe wie er mit der Arduino IDE "arbeitet" und mit
existierenden Lösungen nichts zustande bringt. Siehe:

Guido schrieb:
> Ich möchte in der Arduino-IDE Zeichen über I2C zum Display schicken (im
> Beispiel den Buchstaben "A".

Da ist der Weg sehr weit sich von fertigen Arduino Bibliotheken zu
trennen und auf eigenen Beinen zu stehen. Insbesondere dann wenn
es sich um einen Arduino-fremden Controller handelt. Auch wenn
es dazu (fast) fertige Lösungen gibt.

Harry L. (mysth) hat eine fertige Lösung für STM32 Controller
hier präsentiert, ich finde sie nur auf die Schnelle nicht.

von Wastl (hartundweichware)


Lesenswert?

Wastl schrieb:
> Harry L. (mysth) hat eine fertige Lösung für STM32 Controller
> hier präsentiert, ich finde sie nur auf die Schnelle nicht.

Hier ist der Thread dazu:

Beitrag "[STM32/HAL] generischer Treiber für die beliebten I²C-Text-Displays"

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Steve van de Grens schrieb:
> Er möchte
> ausdrücklich nicht die fertigen Arduino Bibliotheken verwenden,
> sondern es auf niedrigerer Ebene selbst programmieren.

Ihm möchte ein Beispiel und dieses erweitern.
Ich kann keinen Wunsch nach "Grundlagenarbeit" erkennen.

von Steve van de Grens (roehrmond)


Lesenswert?

Steve van de Grens schrieb:
> Lies die Datenblätter der beiden Mikrochips. Probiere sie einzeln
> unabhängig voneinander aus.

Wastl schrieb:
> Ich bin ziemlich sicher dass der TO zwar viel möchte, aber wenig
> kann. Er muss noch viel lernen

Arduino F. schrieb:
> Ich kann keinen Wunsch nach "Grundlagenarbeit" erkennen.

Ich denke, die Notwendigkeit haben wir ihm deutlich genug gesagt. Jetzt 
kommt es darauf an, was er daraus macht. Sprüche wie

"Ich bin ziemlich sicher dass der TO ... wenig kann."

wirken dabei eher kontraproduktiv. Lasst ihn die nächsten Schritte 
wagen, die er sich zutraut. Wenn ihr freundlich seid, wird er sich dabei 
weiter von euch beraten lassen.

von J. S. (jojos)


Lesenswert?

Guido schrieb:
> Aber jetzt möchte ich eben mit Wire.h über I2C auf das Display zugreifen
> und Zeichen ausgeben ... was eben nicht klappt.

Wire ist Arduino. Wenn man die LCD Komponente nicht verwenden möchte 
aber Wire dann ist das völlig schizophren.

von Wastl (hartundweichware)


Lesenswert?

J. S. schrieb:
> Wire ist Arduino. Wenn man die LCD Komponente nicht verwenden möchte
> aber Wire dann ist das völlig schizophren.

Soviel zum Könnens- und Wissensstand des TO ....

Klare Vorstellungen und Äusserungen was man eigentlich machen
möchte wären wünschenswert.

von Sven B. (mainframeosx)


Lesenswert?

Also mit Wire.h kommste bei einem I2C lCD nicht weit, du musst die 
besagte Library mit I2C Ansteuerung nehmen alles andere ist Mehrarbeit.
Beim STM gibt es im übrigen mehrere I2C Ports auch hier musste den 
richtigen aussuchen. Ich hatte das gleiche Problem.Zudem würde ich erst 
einen Portscanner aufspielen, damit kannst du im übrigen auch den I2C 
Port ausfindig machen.

von Rahul D. (rahul)


Lesenswert?

Sven B. schrieb:
> Zudem würde ich erst
> einen Portscanner aufspielen, damit kannst du im übrigen auch den I2C
> Port ausfindig machen.

Der zeigt aber nur die Adresse des Portexpanders, der I²C auf parallel 
umwandelt, an; nicht das Display.
Mit dem Portexpander könnte man auch ein x-beliebiges anderes 
(paralleles) Display ansteuern.

von Frank O. (frank_o)


Lesenswert?

Karl B. schrieb:
> Guido schrieb:
>> LCD-Display 1602
>
> Hat das I2C überhaupt?

Da gibt es fertige Module, die du dran löten kannst.

von Rahul D. (rahul)


Lesenswert?

Frank O. schrieb:
> Da gibt es fertige Module, die du dran löten kannst.

Bei manchen ist es schon am Display angelötet ;) (kostet ca. 50 Cent 
mehr)

Das ist doch "einfach nur" ein I²C-Parallel-Konverter (aka 
"Portexpander") auf einer Platine, die auf die Anschlüsse eines 
"Standard-" Displays passt.

Zum Ansteuern gibt es die og. LCD-Library, die (vermutlich) wiederum auf 
der Wire-Library aufbaut (bzw. sie nutzt).

von Frank O. (frank_o)


Angehängte Dateien:

Lesenswert?

Die funktioniert definitiv.
Kopiere dir raus, was du brauchst.
Ich hatte nämlich auch vor kurzem so eine Platine dran gelötet und das 
ausprobiert.
Nur mit wire.h geht das auch nicht.
Du musst schon noch das Display drin haben.
Wire.h schickt das raus, aber wo hin?

: Bearbeitet durch User
von Frank O. (frank_o)


Angehängte Dateien:

Lesenswert?

Dann noch gleich eine hinterher.
Wenn du ein Oled Display SSD1306 nehmen willst.
Hier auch noch eine Testdatei.
Die sind viel schöner.
Da steht jetzt nur der Text drin. Das war nur der Test, ob es klappt und 
bekomme ich alle Informationen angezeigt.
Da lohnt es sich auch, sich in die Bibliothek einzuarbeiten.

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Guido schrieb:
> Sieht aber so aus, als ob mein Wunsch nicht in Erfüllung geht und ich
> mich doch wesentlich eingehender damit beschäftigen muss.

Das Leben ist kein Wunschkonzert und Weihnachten ist noch ein bisschen 
hin.

Krieg den A.sch hoch und fang an. Oder kauf dir einen fertig passend 
programmierten µC mit Display, bei dem du dann mit dafür bezahlst, dass 
andere die Arbeit für dich machen. Ingenieurbüros, die diesen Job gerne 
übernehmen, gibt es genug, wenn du mit den passenden Scheinen winkst.

scnr

von Frank O. (frank_o)


Lesenswert?

Frank O. schrieb:
> Wenn du ein Oled Display SSD1306

Noch ein Video dazu.

https://www.youtube.com/watch?v=HtuWLufEt9g

von Obelix X. (obelix)


Lesenswert?

Guido schrieb:
> Sieht aber so aus, als ob mein Wunsch nicht in Erfüllung geht und ich
> mich doch wesentlich eingehender damit beschäftigen muss.

Macht euch doch nicht so viel Arbeit. Guido ist doch schon lange Raus 
aus dem Thema.

von Axel R. (axlr)


Lesenswert?

Hier steht drin, wie das Display initialisiert wird
https://github.com/lucasmaziero/LiquidCrystal_I2C/blob/master/LiquidCrystal_I2C.cpp
und hier diese "komischen Konstanten", also die ganzen Vereinbarten 
Wörter, damits nicht zu unübersichtlich wird:
https://github.com/lucasmaziero/LiquidCrystal_I2C/blob/master/LiquidCrystal_I2C.h

Jetzt musste doch "nur" die Reihenfolge raussuchen und mit wire.write ( 
oder was es da gibt) die Bytes nacheinander rausschicken.
Weil das eben niemand zu Fuß beim Arduino macht (warum auch?) gibt es 
das fertig in der besagten Bibliothek. Wenn Du nicht nehmen willst, 
musst du es eben zu Fuß machen. Niemand wird sich jetzt hinsetzen und 
das für dich tun.

https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

statt "lcd_out" musst Du das eben durch wire.write() ersetzen, einfach 
gesprochen.

https://controllerstech.com/interface-lcd-16x2-with-stm32-without-i2c/
hier gibt es die Init-Sequenz auch.

Das sollte ja nun einfach sein, das auf I2C umzustricken.

von Frank O. (frank_o)


Lesenswert?

Axel R. schrieb:
> Das sollte ja nun einfach sein, das auf I2C umzustricken.

Meins funktioniert doch. Kann er so nehmen.

von Manfred P. (pruckelfred)


Lesenswert?

Frank O. schrieb:
>> Hat das I2C überhaupt?
> Da gibt es fertige Module, die du dran löten kannst.

Ja, und am besten richtigherum.

Zu allem Überfluß sind nicht alle I2C-Module gleich, die LCD-Library 
samt Initialisierung muß dazu passen.

Frank O. schrieb:
> Wenn du ein Oled Display SSD1306 nehmen willst.

Ganz tolle Sache, wenn man spielen will. Die Dinger brauchen im µC 
dermaßen viele Ressourcen, dass ernsthafte Anwendungen kaum noch machbar 
sind, hat mich an einem ATMega328 angeschissen.

> Die sind viel schöner.

Vor allem sind sie bei starkem Umgebungslicht nicht mehr ablesbar und 
deren Lebensdauer beglückt auch nicht.

von Jack V. (jackv)


Lesenswert?

Manfred P. schrieb:
> Ganz tolle Sache, wenn man spielen will. Die Dinger brauchen im µC
> dermaßen viele Ressourcen, dass ernsthafte Anwendungen kaum noch machbar
> sind, hat mich an einem ATMega328 angeschissen.

Wie das? Sobald die mit Daten beschickt sind, muss man sich nicht mehr 
drum kümmern, und beim Beschicken brauchen sie nicht mehr Ressourcen, 
als andere Monochromdisplays mit der jeweiligen Auflösung.

von Sven B. (mainframeosx)


Lesenswert?

Rahul D. schrieb:
> Sven B. schrieb:
>> Zudem würde ich erst
>> einen Portscanner aufspielen, damit kannst du im übrigen auch den I2C
>> Port ausfindig machen.
>
> Der zeigt aber nur die Adresse des Portexpanders, der I²C auf parallel
> umwandelt, an; nicht das Display.
> Mit dem Portexpander könnte man auch ein x-beliebiges anderes
> (paralleles) Display ansteuern.

Das Display ist am Portexpander angeschlossen oder? Also wird mit dieser 
Adresse das LCD angesprochen oder? Das geht das über die sogenannte 
Liquid library mit I2C support.

Ich verstehe die Frage jetzt selber nicht die du mir damit gegeben 
hast.Wenn du aber meinst das es nicht so ist, dann bitte. Ich selber 
habe schon ziemlich viele von den LCD in der Schublade liegen und in 
gebrauch. Entweder über I2C oder Paralell.
Beides geht mit der entsprechenden Library.

von Rahul D. (rahul)


Lesenswert?

Sven B. schrieb:
> Das Display ist am Portexpander angeschlossen oder? Also wird mit dieser
> Adresse das LCD angesprochen oder? Das geht das über die sogenannte
> Liquid library mit I2C support.
Jups.

> Ich verstehe die Frage jetzt selber nicht die du mir damit gegeben
> hast.Wenn du aber meinst das es nicht so ist, dann bitte. Ich selber
> habe schon ziemlich viele von den LCD in der Schublade liegen und in
> gebrauch. Entweder über I2C oder Paralell.
> Beides geht mit der entsprechenden Library.
Das verstehe ich nun wieder nicht.

Man ändert mit dem Portexpander einfach nur die Schnittstelle.
Um die Konfiguration und "Ansteuerung" (z.B. Löschen des Displays o. 
dergl.) muss man sich weiterhin kümmern bzw. das übernimmt die 
LCD-Library.
Die könnte vermutlich auch mit einem anderen Schnittstellentreiber 
(Software wie die wire.h) ein Display ansteuern.
Klassischer Fall eine Abstraktionsebene.

von Steve van de Grens (roehrmond)


Lesenswert?

>> Wenn du ein Oled Display SSD1306 nehmen willst.

Manfred P. schrieb:
> Ganz tolle Sache, wenn man spielen will. Die Dinger brauchen im µC
> dermaßen viele Ressourcen, dass ernsthafte Anwendungen kaum noch machbar
> sind, hat mich an einem ATMega328 angeschissen.

Dann hast du vielleicht eine unpassende Bibliothek verwendet. Ein Font 
braucht etwa 500 Byte Flash, und wenige 100 Bytes für den Code. 
Pufferspeicher im RAM ist gar keiner nötig.

Für gemischte Text/Grafik Ausgabe kann ich dir meine Klasse als 
Alternative zu der deutlich größeren von Adafruit anbieten. Ihr 
Speicherbedarf passt zum ATmega328.
http://stefanfrings.de/arduino_oled/

von Rainer W. (rawi)


Lesenswert?

Jack V. schrieb:
> Wie das? Sobald die mit Daten beschickt sind, muss man sich nicht mehr
> drum kümmern, und beim Beschicken brauchen sie nicht mehr Ressourcen,
> als andere Monochromdisplays mit der jeweiligen Auflösung.

Eben, der TO will ein monochromes 2x16 7-Segment Display mit 
integriertem Zeichengenerator ansteuern (32 Byte Daten), du redest von 
einem farbigen 128 x 64 Pixel Graphikdisplay mit lupenverdächtiger 
Schriftgröße.

Sven B. schrieb:
> Das Display ist am Portexpander angeschlossen oder? Also wird mit dieser
> Adresse das LCD angesprochen oder?

Jein, über I2C wird genau der Portexpander angeschlossen und darüber 
muss man dann die 4-Bit Parallelschnittstelle mit Control-Port vom 
Display per Bit-Banging emulieren. Das LCD besitzt keine Adresse, 
sondern nur seinen Parallelport.

Sven B. schrieb:
> Entweder über I2C oder Paralell.

Da war doch irgendwas mit Doppel-'l' :-(

: Bearbeitet durch User
von Sven B. (mainframeosx)


Lesenswert?

Also wenn du das über wire.h machen willst, dann musst du die Adresse 
vom Portexpander wissen. Die einzelnen Pins vom Portexpander zum LCD 
must du dann auch wissen, und welches Bit was macht muss du auch wissen. 
Diese Kombination von Init mit der Initalisierung musst du natürlich von 
hand dann nach und nach auf den Portexpander schieben, damit das Display 
weiß wie es funktionieren soll.

Ein blick in die LiquidCrystal_I2C.cpp und in die LiquidCrystal_I2C.h 
offenbart das Geheimnis

#ifndef LiquidCrystal_I2C_h
#define LiquidCrystal_I2C_h

#include <inttypes.h>
#include "Print.h"
#include <Wire.h>

// commands
#define LCD_CLEARDISPLAY 0x01
#define LCD_RETURNHOME 0x02
#define LCD_ENTRYMODESET 0x04
#define LCD_DISPLAYCONTROL 0x08
#define LCD_CURSORSHIFT 0x10
#define LCD_FUNCTIONSET 0x20
#define LCD_SETCGRAMADDR 0x40
#define LCD_SETDDRAMADDR 0x80

Wenn du jetzt cpp kannst, dann verstehst, kannst du die Initaliesierung 
ganz leicht selber herauslesen.

Und ich klinke mich dann mal aus.
Hier hilft vieleicht etwas Lesen und das Verständniss wie was geht.

von Rainer W. (rawi)


Lesenswert?

Sven B. schrieb:
> Also wenn du das über wire.h machen willst, dann musst du die Adresse
> vom Portexpander wissen.

Bei der Nutzung mit anderen Libraries oder eigenen Funktionen ist das 
nicht anders.
Für einen PCF8574 gibt es 8 verschiedene Möglichkeiten, die Adresse zu 
konfigurieren. Die in der SW angesprochene Adresse muss zu der 
Beschaltung auf dem I2C-Board passen.

von Sven B. (mainframeosx)


Lesenswert?

Rainer W. schrieb:
> Sven B. schrieb:
>> Also wenn du das über wire.h machen willst, dann musst du die Adresse
>> vom Portexpander wissen.
>
> Bei der Nutzung mit anderen Libraries oder eigenen Funktionen ist das
> nicht anders.
> Für einen PCF8574 gibt es 8 verschiedene Möglichkeiten, die Adresse zu
> konfigurieren. Die in der SW angesprochene Adresse muss zu der
> Beschaltung auf dem I2C-Board passen.

Ich glaube nicht das du mir das erklären mußt. Siehe Post weiter oben. 
Ich habe Erfahrung mit den I2C Lcd Expander. Hatte ein von Pollin und 
musste die Library anpassen.

von Frank O. (frank_o)


Lesenswert?

Steve van de Grens schrieb:
> Für gemischte Text/Grafik Ausgabe kann ich dir meine Klasse als
> Alternative zu der deutlich größeren von Adafruit anbieten. Ihr
> Speicherbedarf passt zum ATmega328.
> http://stefanfrings.de/arduino_oled/

Hallo Stefan!
Neuer Name?
Werde mir deinen ZIP auch ansehen. Danke dafür!

von Frank O. (frank_o)


Lesenswert?

Für alle anderen hier, die auf mich wegen des Displays losgegangen sind. 
Das war nur ein Vorschlag. In allen Büchern und Tutorials werden diese, 
höchstens zweizeilige, LCD Displays gezeigt. Diese OLEDs sind günstig, 
können viel mehr anzeigen und benutzen I²C.
Wenn der TO möchte, kann er das benutzen.
Zuerst hatte ich eine funktionierende Datei geschickt, die sein Display 
funktionieren lässt. Das andere war nur ein Angebot, auch im eine andere 
Richtung zu schauen.
Viel wichtiger, beides funktioniert definitiv.
Und Ressourcenverbrauch, klar, wenn man die Adafruit nimmt. Aber das ist 
eine geänderte lib.

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Sven B. schrieb:
> Ich glaube nicht das du mir das erklären mußt.

Das war eine Ergänzung für den TO, da dein Beitrag sich so anhörte, als 
ob das nur bei Nutzung der wire.h erforderlich ist.

von Sven B. (mainframeosx)


Lesenswert?

Rainer W. schrieb:
> Sven B. schrieb:
>> Ich glaube nicht das du mir das erklären mußt.
>
> Das war eine Ergänzung für den TO, da dein Beitrag sich so anhörte, als
> ob das nur bei Nutzung der wire.h erforderlich ist.

Dann bitte an denjenigen schreiben den es Betrifft, ich hatte mich 
angesprochen gefühlt.

Wenn das so ist, entschuldige ich mich.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Frank O. schrieb:
> Für alle anderen hier, die auf mich wegen des Displays losgegangen sind.
Tut mir leid, damit kann ich nicht dienen.
Erfülle aber gerne deine Erwartungshaltung.

Mir scheint es recht egal zu sein, ob man mit einem Opel oder einem VW 
zum Supermarkt fährt. Es wäre allerdings gut, wenn man das Fahrzeug 
bedienen kann und darf.

Gut, für ein Display braucht man keinen Führerschein, aber eben doch die 
nötigen Fähigkeiten.

Soweit bisher ersichtlich, möchte der TO keine weitere Lib zwischen 
Display und Wire, sondern diese Schicht selber bauen. Leider scheint 
dabei eine Überforderung aufgetreten zu sein....

Meinst du nicht, dass das bei einem OLED um Größenordnungen komplexer 
wird?
Also noch mehr Überforderung.



--------------

Zudem halten die billigen LCD durchaus eine Generation durch.
Ein OLED kann nach 1/2 Jahr schon halb blind sein.

von Steve van de Grens (roehrmond)


Lesenswert?

Arduino F. schrieb:
> Meinst du nicht, dass das bei einem OLED um
> Größenordnungen komplexer wird?

Wahrscheinlich. Dabei entfällt zwar der Portexpander, dafür muss man 
sich mit Pixeln beschäftigen, anstatt mit einfachen ASCII Zeichen.

von Frank O. (frank_o)


Lesenswert?

Arduino F. schrieb:
> Soweit bisher ersichtlich, möchte der TO keine weitere Lib zwischen
> Display und Wire, sondern diese Schicht selber bauen. Leider scheint
> dabei eine Überforderung aufgetreten zu sein....

Das stand nicht in seinem Eingangspost. Irgendwer, ich schaue jetzt 
nicht nach, hat das so interpretiert und ich sehe es nicht so. Außerdem 
hat der TO sich nicht dagegen geäußert.
Trotzdem kann er anhand dieser funktionierenden Beispiele lernen und 
dann selbst seine Lib schreiben, wenn man will.
Kann natürlich auch an Hand vom Datenblatt alles selbst raus finden. 
Aber da er schon bei wire nicht weiter wusste, wird das schwer.

von Steve van de Grens (roehrmond)


Lesenswert?

>> Soweit bisher ersichtlich, möchte der TO keine weitere Lib zwischen
>> Display und Wire, sondern diese Schicht selber bauen. Leider scheint
>> dabei eine Überforderung aufgetreten zu sein....

Frank O. schrieb:
> Das stand nicht in seinem Eingangspost. Irgendwer, ich schaue jetzt
> nicht nach, hat das so interpretiert und ich sehe es nicht so. Außerdem
> hat der TO sich nicht dagegen geäußert.

Ich war das. Ich helfe dir ma auf die Sprünge:

Guido schrieb:
> Alternativ zu Wire.h kann man z. B. auch über das Library
> LiquidCrystal_PCF8574.h ansteuern. Das klappt bei mir auch.

> Aber jetzt möchte ich eben mit Wire.h über I2C auf das Display zugreifen
> und Zeichen ausgeben ... was eben nicht klappt.

Das ist doch eindeutig, finde ich.

von Frank O. (frank_o)


Angehängte Dateien:

Lesenswert?

Arduino F. schrieb:
> Zudem halten die billigen LCD durchaus eine Generation durch.
> Ein OLED kann nach 1/2 Jahr schon halb blind sein.

Ich habe jetzt eines von den großen Displays (2,42") drei Tage, also so 
um die 70 Stunden durchlaufen lassen und es funktioniert noch.
Generationen benutzt du vielleicht (ich auch; mein Firmentelefon wurde 
jetzt nach 8 Jahren ausgetauscht, weil der Akku kaputt ist), aber in der 
Regel ist nach ein paar Jahren doch Schluss.
Und selbst wenn, dann bestellt er gleich zwei und die halten dann 
zusammen eine Generation.
Aber nochmal, es war nur ein Angebot, dass es da mehr gibt, als die in 
den Büchern beschriebenen Displays. Wenn man sowieso auf I²C gehen will.

P.S.: Wenn jemand diese Dinger nehmen will, da muss man ein bisschen was 
umbauen.

: Bearbeitet durch User
von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Frank O. schrieb:
> Ich habe jetzt eines von den großen Displays (2,42") drei Tage, also so
> um die 70 Stunden durchlaufen lassen und es funktioniert noch.
> ....
> dann bestellt er gleich zwei und die halten dann
> zusammen eine Generation.

Ich bewundere deine Rechenkünste.

von Frank O. (frank_o)


Lesenswert?

Steve van de Grens schrieb:
> Das ist doch eindeutig, finde ich.

Ist es! Da habe ich wohl drüber gescrollt.
Asche auf mein Haupt.
Teilweise lese ich auf dem Mobiltelefon. Vielleicht hatte ich es deshalb 
überlesen.
Dann sind meine Beiträge sicher nutzlos für den TO.
Tut mir leid, den Faden hier verbogen zu haben.

von Frank O. (frank_o)


Lesenswert?

Arduino F. schrieb:
> Ich bewundere deine Rechenkünste.

Hahaha! (Bin ja auch kein Ing.)
Aber wo ich dich hier so gerade dran habe. Weißt du noch, vor Jahren, 
wie wir hier Arduino verteidigen mussten?
Da hat sich in meiner zeitweise Abwesenheit einiges getan.

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Frank O. schrieb:
> Ich habe jetzt eines von den großen Displays (2,42") drei Tage, also so
> um die 70 Stunden durchlaufen lassen und es funktioniert noch.

Doch schon so lange?

Bei OLED geht es, genauso wie bei LEDs, nicht um 
funktioniert/funktioniert nicht, sondern um die Abnahme des 
Wirkungsgrades mit der Betriebszeit. Meist wird die Lebensdauer als die 
Halbwertszeit der Leuchtdichte definiert.

LG gibt für seine neusten OLED Panele eine Lebensdauer von 100000 
Stunden an. Bin gespannt, was dein Display nach so einer 
Betriebsstundenzahl noch so von sich gibt. Berichte bitte mal.

: Bearbeitet durch User
von Frank O. (frank_o)


Lesenswert?

Rainer W. schrieb:
> Doch schon so lange?

Ironie nicht erkannt?

Rainer W. schrieb:
> LG gibt für seine neusten OLED Panele eine Lebensdauer von 100000
> Stunden an. Bin gespannt, was dein Display nach so einer
> Betriebsstundenzahl noch so von sich gibt. Berichte bitte mal.

Das wären ~ 11 Jahre. Bis dahin bin ich ganz sicher tot. Wenn ich diese 
Jahr überhaupt überlebe ...

von Steve van de Grens (roehrmond)


Lesenswert?

Ich habe zwei Datenblätter für diese kleinen OLED vorliegen. Eun 
Markenhersteller verspricht 10000 Stunden. Ein China Nachbau nur 4000.

Es scheint mir klug, die Helligkeit nur so hoch wie nötig einzustellen.

von Frank O. (frank_o)


Lesenswert?

Steve van de Grens schrieb:
> Ich habe zwei Datenblätter für diese kleinen OLED vorliegen.

Hast du mal einen Link oder kannst du die schicken?

von Steve van de Grens (roehrmond)



Lesenswert?

Frank O. schrieb:
> Hast du mal einen Link oder kannst du die schicken?

Ich hatte die Zeiten falsch in Erinnerung. Es sind 10.00 vs. 50.000 
Stunden.

von Frank O. (frank_o)


Lesenswert?

Klasse Stefan!
Die werden mir sehr weiter helfen. Vor allem das zweite, das wird wohl 
100% zu den billigen Dingern passen.
Da werde ich mich in Zukunft sehr genau mit befassen.
Und was die Zeiten anbetrifft. Wenn's kaputt ist, kommt ein neues dran.

Stefan, ich lebe schon seit 1,5 Jahren auf Kredit. Im Moment geht es mir 
auch nicht so gut. Morgen erfahre ich was das MRT sagt. Ich muss nichts 
mehr für eine ferne Zukunft machen. Obwohl ich so weiter lebe (so gut es 
halt geht), als wäre das Ende in normaler Entfernung (aber was ist schon 
noch normal, nach den Spritzen; kippen doch alle um), so weiß ich was 
die Statistik sagt.
Ich nehme die Chemo jeden Tag und werde mich hüten eine Tablette zu 
vergessen, trotzdem ist das keine Garantie.
Mein Leben lang habe ich wie irre gearbeitet (arbeiten bin ich immer 
noch), für mich das Wenigste ausgegeben. Scheiß auf so ein doofes 
Display. So wie ich die Umwelt geschont habe, schon seit meiner Jugend, 
da kann ich im Zweifel so ein Display austauschen.

von Steve van de Grens (roehrmond)



Lesenswert?

Frank O. schrieb:
> Da werde ich mich in Zukunft sehr genau mit befassen.

Dann brauchst du wohl noch das Datenblatt des SSD1306 COG.

Ich habe dir auch die Datenblätter der größeren Displays angehängt.

: Bearbeitet durch User
von Frank O. (frank_o)


Lesenswert?

Ja, auf jeden Fall!
Habe das gerade kurz angesehen.
Kann ich die Adresse ändern?
1
Slave address bit (SA0)
2
SSD1306 has to recognize the slave address before transmitting or receiving any information by the
3
I
4
2
5
C-bus. The device will respond to the slave address following by the slave address bit (“SA0” bit)
6
and the read/write select bit (“R/W#” bit) with the following byte format,
7
b7 b6 b5 b4 b3 b2 b1 b0
8
0 1 1 1 1 0 SA0 R/W#
9
“SA0” bit provides an extension bit for the slave address. Either “0111100” or “0111101”, can be
10
selected as the slave address of SSD1306. D/C# pin acts as SA0 for slave address selection.
11
“R/W#” bit is used to determine the operation mode of the I2
12
C-bus interface. R/W#=1, it is in read
13
mode. R/W#=0, it is in write mode.
Angenommen ich will zwei Displays anschließen, die unterschiedliche 
Daten ausgeben.
Ah, hab gerade gelesen, dann muss man die Adresse wohl erst ins Data 
Command Register schreiben.
Hast du da was fertig?
Danke erstmal für die Datenblätter!

: Bearbeitet durch User
von Steve van de Grens (roehrmond)


Lesenswert?

Frank O. schrieb:
> Hast du da was fertig?

Siehe oben: http://stefanfrings.de/arduino_oled/

> Angenommen ich will zwei Displays anschließen,
> die unterschiedliche Daten ausgeben.

Dann musst du bei einem die SA0 Leitung (= D/C#) auf High setzen, und 
beim anderen auf Low. Fraglich ist, auf welchen Modulen die dazu nötigen 
Lötbrücken oder Pins erreichbar sind.

: Bearbeitet durch User
von Manfred P. (pruckelfred)


Lesenswert?

Frank O. schrieb:
> Diese OLEDs sind günstig, können viel mehr anzeigen und benutzen I²C.

Es gibt sie auch mit SPI. Der SSD1306 kann beides, die verbreiteten 
0,96"-Chinesen bestücken ein paar Brücken abweichend.

von Frank O. (frank_o)


Lesenswert?

Ein paar Beiträge höher habe ich ein Bild von einem 2,42" Display 
eingestellt. Das hat auch SPI. Man muss für I²C ein wenig was ändern.
Steht aber alles in Stefans Beitrag.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.