Arduino Display ohne fertige Funktion ansteuern

Gast #4474487
Lesenswert?

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?
Gast #4474498
Lesenswert?

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.
Gast #4474503
Lesenswert?

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.
Gast #4474588
Lesenswert?

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?
#4474611
Lesenswert?

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.
Gast #4474632
Lesenswert?

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.
Gast #4474703
Lesenswert?

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.
Gast #4474712
Lesenswert?

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.
#4474725
Lesenswert?

> 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.
Gast #4474731
Lesenswert?

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 .....
Gast #4474750
Lesenswert?

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
#4474760
Lesenswert?

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
Gast #4474779
Lesenswert?

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
#4474798
Lesenswert?

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,..."

;)
Gast #4475074
Lesenswert?

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.
#4475091
Lesenswert?

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
#4479712
Lesenswert?

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?
Gast #4479721
Lesenswert?

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.
Gast #4488363
Lesenswert?

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?
Gast #4488370
Lesenswert?

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.
Gast #4488382
Lesenswert?

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
}
Gast #4488426
Lesenswert?

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.
Gast #4488438
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren