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.
mompf schrieb: > Nun möchte ich dieses Display aus Interesse OHNE die Arduino Funktionen > wie z.B. lcd.print ansteuern. http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD ..... und du hast ein LCD mit Controller HD44780 !
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: > Aber wie > mache ich das nun bei der 4-Bit Variante? Englisch vorrausgesetzt:http://www.instructables.com/id/Step-By-Step-LCD-wiring-4-Bit-Mode-and-Programmi/ Steht aber im Prinzip auch in dem Vorschlag: Mitlesa schrieb: > http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD > > ..... und du hast ein LCD mit Controller HD44780 !
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.
Auf der letzten Seite steht es doch schon ideal. 4-Bit Modus usw - alles da! Was brauchst du denn noch?!
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.
Karl M. schrieb: > Bitte mach mal hochauflösende Bilder von beiden Seiten und bitte mit > genügend Licht. Das Problem ist ich habe das Display schon verbaut und auf den Bildern könntest du nun nichts mehr erkennen. Aber hier ist das Set, bei welchem der LCD dabei war. http://www.amazon.de/SunFounder-Project-Starter-Arduino-Mega2560/dp/B00D9M4BQU/ref=sr_1_2?ie=UTF8&qid=1455825487&sr=8-2&keywords=sunfounder
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
:
Bearbeitet durch User
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,..." ;)
:
Bearbeitet durch User
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
:
Bearbeitet durch User
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.
1 | bool_t CheckBusy() |
2 | {
|
3 | uint8_t read_data = read_lcddata(); |
4 | return (read_data & (1<<7)); /*Busy Flag gesetzt ?*/ |
5 | }
|
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.