Guten Tag allerseits,
ich habe einen Arduino Uno und ein übliches 16x2 LCD-Display, welches
meistens in den Lernsets enthalten ist.
Nun möchte ich dieses Display aus Interesse OHNE die Arduino Funktionen
wie z.B. lcd.print ansteuern. Mir würde es am Anfang reichen, einfach
nur ein Zeichen beispielsweise ein "Z" anzuzeigen.
Kann mir dabei jemand weiterhelfen oder gibt es dazu schon ein passendes
Tutorial?
mompf schrieb:> Kann mir dabei jemand weiterhelfen oder gibt es dazu schon ein passendes> Tutorial?
Gibt es. Aber was in an Abkupfern so interessant.
Nimm dir das Datenblatt und einen Logikanalysator/Oszi - und dann gehts
los.
Tom schrieb:> Nimm dir das Datenblatt und einen Logikanalysator/Oszi - und dann gehts> los.
Habe kein Oszi/Logikanalysator und konnte auch nicht das passende
Datenblatt zu meinem Display finden. Diese war bei einem Set von
Sainsmart dabei, allerdings weiß ich nicht genau, wie dieses heißt.
mompf schrieb:> Habe kein Oszi/Logikanalysator und konnte auch nicht das passende> Datenblatt zu meinem Display finden.
Ein kleiner Logikanalysator kostet in der Bucht weniger als 7€. Das kann
doch wohl nicht das Problem sein. Und wenn du nicht mal weißt, was du da
für ein Display vor dir hast, wie sollen andere dann helfen.
Du kannst mir aber nicht erzählen, dass Sainsmart dafür keine
Infos/Support bereit stellt.
Danke soweit. Aber ich checke immer noch nicht ganz durch. Wichtig wäre
auch noch, dass ich die 4-Bit Variante verwenden muss.
Ich würde nun folgendermaßen vorgehen. Zuerst schaue ich in der Tabelle
nach, welche Bist ich für ein "Z" benötige.
http://www.learningaboutelectronics.com/images/Character-table-for-HD44780-LCD-module.png
"Z" = 10100101
Bei der 8-Bit Variante, die ich nicht benutzen kann, würde ich das dann
folgendermaßen machen:
1
digitalWrite(RS,HIGH);
2
digitalWrite(RW,LOW);
3
digitalWrite(E,HIGH);
4
digitalWrite(DB0,HIGH);
5
digitalWrite(DB1,LOW);
6
digitalWrite(DB2,HIGH);
7
digitalWrite(DB3,LOW);
8
digitalWrite(DB4,LOW);
9
digitalWrite(DB5,HIGH);
10
digitalWrite(DB6,LOW);
11
digitalWrite(DB7,HIGH);
Würde dies soweit ohne weitere Einstellungen funktionieren? Aber wie
mache ich das nun bei der 4-Bit Variante?
mompf schrieb:> Danke soweit. Aber ich checke immer noch nicht ganz durch. Wichtig> wäre auch noch, dass ich die 4-Bit Variante verwenden muss.>> Ich würde nun folgenderma> folgendermaßen machen:digitalWrite(RS,HIGH);> digitalWrite(RW,LOW);> digitalWrite(E, HIGH);> digitalWrite(DB0,HIGH);> digitalWrite(DB1,LOW);> digitalWrite(DB2, HIGH);> Würde dies soweit ohne weitere Einstellungen funktionieren? Aber wie
datenblatt nehmen und zuerst funktionen für init und daten schreiben
aufbauen.
Flip B. schrieb:> datenblatt nehmen und zuerst funktionen für init und daten schreiben> aufbauen.
Wie gesagt, weiß ich nicht welches Datenblatt wirklich das richtige ist.
Aber ich müsste ja eigentlich die meisten von den LCDs mit HD44780
verwenden können?
Was soll die Funktion für init alles beinhalten? Die Funktionen für
Daten schreiben will ich erst später machen, ich will zuerst einfach mal
ein Zeichen darstellen lassen und darauf lässt sich dann aufbauen.
Stefan U. schrieb:> Indem du nur vier der 8 Bits verwendest.
Mir ist nicht klar, wie ich mit 4 Bit die 8 Bit übertragen soll.
mompf schrieb:> Aber ich müsste ja eigentlich die meisten von den LCDs mit HD44780> verwenden können?
Ja, das vom chip an sich sollte aber auch reichen.
>> Was soll die Funktion für init alles beinhalten?
das sagt dir das Datenblatt. BZW. schaue dir an, wie es andere
realisieren, aber bitte nicht unverstanden kopieren!
mompf schrieb:> Daten schreiben will ich erst später machen, ich will zuerst einfach mal> ein Zeichen darstellen lassen und darauf lässt sich dann aufbauen.
Wie geil ist das denn?
mompf schrieb:> Würde dies soweit ohne weitere Einstellungen funktionieren?
Nein, die Datenübernahme erfolgt mit der fallenden Flanke von E. Guck
einfach mal ins Datenblatt, da stehen die Impulsdiagramme
mompf schrieb:> Mir ist nicht klar, wie ich mit 4 Bit die 8 Bit übertragen soll.
Nacheinander - immer 4 und 4.
mompf schrieb:> Bei der 8-Bit Variante, die ich nicht benutzen kann, würde ich das dann> folgendermaßen machen:> digitalWrite(RS,HIGH);> digitalWrite(RW,LOW);
Aber ein paar Beiträge vorher hast du geschrieben:
mompf schrieb:> Nun möchte ich dieses Display aus Interesse OHNE die Arduino Funktionen> wie z.B. lcd.print ansteuern.
Also was jetzt ..... mit oder ohne Arduino Funktionen?
mompf schrieb:> Mir ist nicht klar, wie ich mit 4 Bit die 8 Bit übertragen soll.
Maaaaaaaaann, steht aaaaaaalles im Datenblatt und im erwähnten
Tutorial.
Flip B. schrieb:> das sagt dir das Datenblatt. BZW. schaue dir an, wie es andere> realisieren, aber bitte nicht unverstanden kopieren!
Ich komme gerade überhaupt nicht weiter. Jeder schreibt nur ich soll ins
Datenblatt schauen, welches ich nicht haben.
Nehmen wir mal an, dass ich hier das passende Datenblatt habe:
http://oomlout.com/parts/LCDD-01-datasheet.pdf
Dort wird mir nicht erklärt (und auch bei anderen die ich mir angeschaut
habe) wie man es zum Laufen bekommt. Dort werden immer nur die Bits für
die einzelnen Funktionen (Löschen, Cursor bewegen, usw.) und die Bits
für die Zeichen angegeben.
Wie ihr vielleicht gemerkt habt, tue ich mir gerade ziemlich schwer.
Deshalb würde ich mich freuen, wenn mir jemand erklären könnte, wie ich
nun anfangen soll. Dann kann ich Schritt für Schritt arbeiten.
Mitlesa schrieb:> Also was jetzt ..... mit oder ohne Arduino Funktionen?
Habe ich falsch ausgedrückt. Mit Arduino Funktionen aber ohne die
LCD-Library für den Arduino.
mompf schrieb:> Ich komme gerade überhaupt nicht weiter.
Du hast einen Controler namens HD44870 genannt bekommen. Du wirst doch
mit Hilfe einer Suchmaschine dir ein Datenblatt herunterladen können?
> Nehmen wir mal an, dass ich hier das passende Datenblatt habe:> http://oomlout.com/parts/LCDD-01-datasheet.pdf>> Dort wird mir nicht erklärt (und auch bei anderen die ich mir angeschaut> habe) wie man es zum Laufen bekommt.
Top beispiel! Schau mal auf Seite 34.
>Dort werden immer nur die Bits für> die einzelnen Funktionen (Löschen, Cursor bewegen, usw.) und die Bits> für die Zeichen angegeben.
ja, die Kommandos auch.
Dafúr denkst du dir dann ein System aus, wie du die funktionen bequem
einsetzen kannst.
>Habe ich falsch ausgedrückt. Mit Arduino Funktionen aber ohne die>LCD-Library für den Arduino.
Spar dir das lieber. die Pinfuntkionen sind schnarchlangsam. Schau ins
datenblatt deines controllers und setze das richtig um.
mompf schrieb:> Deshalb würde ich mich freuen, wenn mir jemand erklären könnte, wie ich> nun anfangen soll.
Also gut. Ich erkläre es dir:
Du nimmst das erwähnte Tutorial. Dann:
- Lese den ersten Abschnitt und verstehe ihn
- Lese den zweiten Abschnitt und verstehe ihn
- Lese den dritten Abschnitt und verstehe ihn
- Lese den vierten Abschnitt und verstehe ihn
und so weiter, und so weiter .....
Guten Tag,
vielleicht nimmst Du diese Anleitung als Einstieg in das Thema LCD
Ansteuerung.
# http://www.sprut.de/electronic/lcd/
Und schaust dann noch mal in das Datenblatt deines LCD, auf dem muss
eine Kennung sein und damit wird man sicherlich fündig.
Bitte mach mal hochauflösende Bilder von beiden Seiten und bitte mit
genügend Licht.
mompf schrieb:> Das Problem ist ich habe das Display schon verbaut
So wie du dich dauernd gibst scheinst du darauf zu warten dass
dir die gebratenen Tauben in den Mund fliegen.
Hallo,
Du kannst auch mit der ArduinoIDE das GCC-LCD-Tutorial durcharbeiten
wenn Du willst.
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
Einen leeren Sketch aufmachen, alles im Fenster löschen und statt dessen
den C-Code reinkopieren.
Compilieren und Flashen dann wie üblich.
Ausgelagerte .h und .c - Dateien in den Projektordner kopieren, die
tauchen dann als Tabs auf. Einziges Zugeständnis: die .c-Datei mit der
main() muß wie der Projektordner .ino heißen, alle sonstigen .c Dateien
in .ino umbenennen.
Letzteres muß nicht sein, als .c müssen aber die .h angepasst werden
sonst gibt es Fehlermeldungen.
Diese Version hat den Vorteil, daß man sich nicht an eine andere IDE
gewöhnen muß und trotzdem C-Tutorials gut nachvollzeihen und
ausprobieren kann. Du kannst dann aber keine C++ oder
Arduino-spezifischen Klassen nutzen.
pinMode(), digtalWrite(), analogRead() usw. usw. sind dann unbekannt,
Arduino-Libs kannst Du so auch nicht einbinden.
Man auch dieses kombinieren, das ist aber am Anfang nicht zu empfehlen,
man hat dann zuviele Baustellen...
Gruß aus Berlin
Michael
Michael U. schrieb:> Du kannst dann aber keine C++ oder Arduino-spezifischen Klassen nutzen.
Der auf die gebratenen Tauben Wartende hat keine Ahnung was eine
Klasse beim Arduino ist.
Er kennt aber vermutlich eine Schulklasse.
Mitlesa schrieb:> Also gut. Ich erkläre es dir:>> Du nimmst das erwähnte Tutorial. Dann:>> - Lese den ersten Abschnitt und verstehe ihn> - Lese den zweiten Abschnitt und verstehe ihn> - Lese den dritten Abschnitt und verstehe ihn> - Lese den vierten Abschnitt und verstehe ihn>> und so weiter, und so weiter .....Mitlesa schrieb:> So wie du dich dauernd gibst scheinst du darauf zu warten dass> dir die gebratenen Tauben in den Mund fliegen.Mitlesa schrieb:> Der auf die gebratenen Tauben Wartende hat keine Ahnung was eine> Klasse beim Arduino ist.>> Er kennt aber vermutlich eine Schulklasse.
Wenigstens versuchen hier noch einige zu helfen. Deine letzen Beiträge
haben mich nicht wirklich vorangebracht.
Ich kann mit dem Code aus deinem Tutorial einfach nichts anfangen. Ich
habe bisher nur mit dem Arduino programmiert und will deshalb auch die
Funktionen wie digitalWrite verwenden.
Wie ihr gemeint habt, soll die Anleitung auf Seite 34 die richtige sein.
Dann würde ich nun einfach so "abtippen".
1. Die jeweiligen Bits auf HIGH/LOW setzen
2. delay(15)
3. die jeweiligen Bits auf HIGH/LOW setzen
4. delay(4.1)
...
Und denn die Init abgeschlossen ist, die Bits für das "Z" auf HIGH oder
LOW setzen
mompf schrieb:> Ich kann mit dem Code aus deinem Tutorial einfach nichts anfangen.
Guck mal hier, da hat jemand das ganz genau
erklärt:http://erik-bartmann.de/component/attachments/download/15.html
Aber Achtung, Auszug aus dem Buch: "Bevor wir uns an die Arbeit
machen, ist es unabdingbar, dass jeweilige Datenblatt zu studieren.
Andernfalls können wir die
Sache vergessen,..."
;)
mompf schrieb:> 4. delay(4.1)
Damit wirst du nun so gar kein Glück haben. Guck dir mal an, was delay()
für ein Argument benötigt. Dem Compiler irgendetwas vorzuwerfen und zu
hoffen, dass der es schon richten wird, führt leicht dazu, dass das
Programm hinterher etwas anderes tut, als du erwartest.
https://www.arduino.cc/en/Reference/Delay
Auch wenn gegen deine Vorgehenweise prinzipiell nix einzuwenden ist, du
hast 3 von 4 Baustellen zuviel offen.
Um das "Datenblattlesen" (inkl. Verstehen!) hilft es das LCDisplay auf
dem Steckbrett zu verschalten und NUR Schalter (nicht Taster, 4 f.d.
richtigen Datenleitungen + 3-4 f.d. Steurleitungen), Pullupwiderstände,
Kontrastpoti und Versorgungsspannung.
Die händische Geschwindigkeit spielt keine Rolle beim HD44780.
Damit lassen sich einzelne Buchstaben z.B. "Z" anzeigen.
Nach überwinden dieser Verständnishürde klappt es dann mit Code im
"digitalWrite(...);"-Stil.
Hallo,
für 'E' würde ich einen Taster nehmen mit Widerstand gegen GND nehmen.
Bei Datenblättern dieser Art generell: Logiktabellen lesen und verstehen
lernen, Timingdiagramme lesen und verstehen lernen und lernen, daß die
kleinen Texte zu den winzigen Anmerkungsziffern oft die wichtigsten
sind...
Gruß aus Berlin
Michael
mompf schrieb:> Mir würde es am Anfang reichen, einfach> nur ein Zeichen beispielsweise ein "Z" anzuzeigen.>> Kann mir dabei jemand weiterhelfen oder gibt es dazu schon ein passendes> Tutorial?
Irgendwie scheinst Du das Pferd vom Schwanz her aufzäumen zu wollen.
Diese Textmode-Displays haben im Prinzip zwei verschiedene Betriebsarten
8-Bit-Mode (8 Datenleitungen, 2 Steuerleitungen) und 4-Bit-Mode (4
Datenleitungen, 2 Steuerleitungen).
Und je nachdem mit wie vielen Leitungen Du Dein Display am
Mikrocontroller anschließen möchtest (10 Leitungen oder 6 Leitungen),
wäre der Anfang bei der softwaretechnischen Ansteuerung:
- Display-Controller resetten
- Display-Controller auf 8-Bit-Mode oder 4-Bit-Mode initialisieren
Und wenn das dann soweit funktioniert hat (der 4-Bit Mode ist
komplizierter zu initialisieren), kannst Du am Ende dann entweder mit
einem Befehl (8-Bit Mode) an das Display (oder mit zwei Befehlen (jedes
4-Bit Nibble getrennt im 4-Bit-Mode) ein Zeichen an das Display senden,
das das Zeichen dann anzeigt.
Kommentierten AVR-Code zur Ansteuerung solcher Displays, die quasi
Tutorial-Charakter haben, findest Du auf dieser Website.
Aber die Arduino-IDE bringt auch mit der LiquidCrystal-Library eine auf
Arduino-Boards direkt einsetzbare Library mit extrem einfach
verständlichem Befehls-Interface dafür mit. Das ist Dir zu einfach?
Jürgen S. schrieb:> Irgendwie scheinst Du das Pferd vom Schwanz her aufzäumen zu wollen.
Nicht gecheckt?
Du schreibst dir hier die Finger wund und mompf hat schon längst
aufgegeben. Wenn du die Beiträge alle gelesen und verstanden
hättest wäre auch dir klar dass er nur darauf wartet dass ihm
gebratene Tauben in den Mund fliegen.
Ja ich habe zwischenzeitlich aufgegeben und bin auch jetzt noch bei
Null.
Wenigstens habe ich nun aber das Datenblatt des Displays gefunden. Ich
habe ein EA W162-X3LW.
http://cdn-reichelt.de/documents/datenblatt/A400/DS_OLED_EA.pdf
In dem Datenblatt findet man ein Initialisierungsbeispiel für den 8-Bit
Modus. Die Funktionen void initDisplay(void) und void WriteIns(char
instruction) würde ich nun "einfach so" runterprogrammieren.
Allerdings würde ich digitalWrite (RS, HIGH) statt RS_DD=1 schreiben,
ganz nach den Arduino Funktionen eben.
Leider kann ich aber mit CheckBusy() in der Funktion WriteIns nichts
anfangen. Das muss doch irgendwo definiert sein.
Und anstatt DATE_PORT_DD würde ich einfach die einzelnen Datenleitungen
(DB0-DB7) entweder auf HIGH oder eben auf LOW setzen.
Passt dies soweit??? Nun müsste die Initalisierung abgeschlossen sein
und ich kann mich an das Senden von Zeichen machen?
Was ist DATE_PORT_DD ?
Es gibt doch genügend fertiger Code, den kannst Du verstehen und dann
deinen eigenen schreiben.
Nun Arduino ist nicht die letzte Weisheit, auch in Bezug auf der
Geschwindigkeit - sie sind sehr langsam.
Lerne AVR Gcc von Grundauf ohne die Arduino Welt.
Alles andere bedeutet ein nicht verstehen der Materie.
Hallo,
was CheckBusy() bedeuten soll ist im Datenblatt unter
"Read Busy Flag and Address" beschrieben.
Gemeint ist da Bit mit der Bezeichnung BF mit der Bitnummer 7.
Also in etwa so, wenn man read_lcddata() geschrieben hat.
mompf schrieb:> Ja ich habe zwischenzeitlich aufgegeben und bin auch jetzt noch bei> Null.
herrjemine, wie dieses bloß?
Im Prinzip bauchst du dochbloß genau das zu tun, was auf der Seite 5 des
von dir selbst angegebenen Manuals beschrieben ist.
Das kann doch wohl nicht so schwer sein. Im 4 Bit Modus mußt du zuerst
das höherwertige Nibble und dann das niederwertige Nibble ausgeben. Zum
ganz blutigen Anfang braucht so ein zweizeiliges Alpha-Display einen
ganz bestimmten Befehl, an dem es erkennen kann, ob da nur 2x 4 Bit oder
1x 8 Bit ankommen. Ansonsten ist eigentlich alles gleich.
mompf schrieb:> digitalWrite (RS, HIGH)
Laß doch bloß solches Zeugs bleiben. Du hast einen µC, der µC hat Pins,
diese sind (allervermutlichst) zu Ports zusammengefaßt und irgendwo hat
auch dein µC ein paar Register in seiner Hardware, wo man einstellen
kann, ob an einem Pin eine HW-Funktion (UART, SPI, I2C, Counter use.)
anliegen soll oder ob dieses Pin ein simpler digitaler Ein- oder Ausgang
sein soll.
Nun guckst du dir die Pins aus, wo du dein Display anschließen willst
und initialisierst dir die dafür benötigten Pins als simple digitale
Ausgänge.
Dann schreibst du dir ein paar ganz einfache Funktionen selber, nämlich
sowas:
void SetRS_hi(void)
{ hier eben das Portregister bemühen, was zum Pin für das R/S Signal
führt
}
void SetRS_lo(void)
{ hier eben das Portregister bemühen, was zum Pin für das R/S Signal
führt
zum Beispiel PtB.18 oder wie das bei deinem µC denn so heißen mag
}
void SetE_hi(void)
{ dito... }
void SetE_lo(void)
{ ebenso}
void SetRW_hi(void)
{ ebenso}
void SetRW_lo(void)
{ebenso}
und
void NibbleAus(char B)
{ long i;
B = B & 0xF; // nur low-nibble übriglassen
// wenn deine 4 Daten an PtB.24 bis PtB.27 rauskommen sollen
i = PtB & (0xF << 24);
PtB = i | (B << 24);
SetE_hi();
Delay(irgendwas); // deine simple Delayfunktion
SetE_lo();
}
und zum Schluß
void (ByteAus(char B)
{ NibbleAus(B>>4);
NibbleAus(B);
}
So. den Rest suchst du dir aus der in dem Manual angegebenen Tabelle
selbst raus. Du hast mit den obigen Primitivst-Funktionen die
eigentliche HW soweit abstrahiert, daß du alle beteiligten Signale per
selbsterklärender Funktion so einstellen kannst, wie du es brauchst.
Und zum "CheckBusy()" ist z sagen, daß dies einfach nur ne Abfrage des
Bit 7 ist, was anzeigt, ob das Display bereit ist oder nicht. Das kannst
du dir sparen, wenn du die in der Tabelle angegebenen Zeiten mittels
deiner Delay-Funktion einhältst.
Also stell dich nicht so jungfräulich an, wenn man erst mal nen Blick in
das eigentliche Manual zum µC und zum Display getan hat, ist das alles
viel einfacher als irgendwelche schwülstigen Blabla-Funktionen aus
vorgekautem Zeugs.
W.S.
Nachtrag:
W.S. schrieb:> PtB = i | (B << 24);
bei manchen popligen Achtbittern führt das zu nix, weil die nicht <<24
schieben können. Aber das war ja auch nur ein Beispiel, häufig genug
wird das Ganze so gehandhabt, daß ein 8 Bit Port hergenommen wird, wo
dann Port.4 bis Port.7 für das Nibble genommen wird und Port.0 bis 3
dann für die restlichen Signale nach Gusto.
W.S.
Guten Abend,
für Anfänger finde ich das Tutorial von Peter (peda) sehr gut zu
gebrauchen.
http://www.avrfreaks.net/forum/tutc-lcd-tutorial-1001
Wenn man hier mit auch noch C mehr versteht, dann sollte man auch noch
die paar Anpassungen für das OLED Display machen können. Denn es hat
etwas andere Konfiguration.