Forum: Mikrocontroller und Digitale Elektronik LCD (HD44780, Displaytech 162C) macht Probleme


von Simon H. (sim_h)


Lesenswert?

Hallo,
ich versuche derzeit, mit einem ATmega16A ein LCD (Displaytech 162C) 
anzusteuern. Dazu benutze ich die Routinen aus dem hiesigen 
LCD-Tutorial, die eigentlich auch sehr gut funktionieren, nur kann ich, 
wenn ich mich in der 2. Zeile befinde, nur 4 Zeichen ausgeben. Gebe ich 
mehr aus, zeigt das Display wieder nur einen Balken an. Die 1. Zeile 
funktioniert super.

Beispielcode:
1
// Hier funktioniert alles ...
2
lcd_init();
3
lcd_string("Hallo Welt!");
4
lcd_setcursor(0, 2);
5
lcd_string("Hall");
6
// ... und beim nächsten Befehl zeigt das Display nur einen Balken!
7
lcd_string("o Welt");

Danke im Voraus!

sim_h

von Soldat (Gast)


Lesenswert?

1
lcd_setcursor(0, 1);

Probiers mal damit, vermutlich bist du mit der 2 auf der nicht 
vorhandenen dritten Zeile ;-)

von dummy (Gast)


Lesenswert?

>nur kann ich,
>wenn ich mich in der 2. Zeile befinde, nur 4 Zeichen ausgeben. Gebe ich
>mehr aus, zeigt das Display wieder nur einen Balken an.

Dein RAM ist alle.

von Simon H. (sim_h)


Lesenswert?

@Soldat: Hilft auch nichts. Zeile 0 und 1 sind anscheinend dieselben.
@dummy: Welcher RAM? Der vom Displaycontroller, der von den Treibern, 
der vom ATmega16A, mein Kurzzeitgedächtnis?

sim_h

von Ingo (Gast)


Lesenswert?

Überprüf mal deine Adressendefines!

von c-hater (Gast)


Lesenswert?

Simon H. schrieb:

> Danke im Voraus!

Lerne daraus, das es nicht genügt, unverstandenen fremden Code zu 
kompilieren, um Programmierierer zu sein und Programme zu schreiben.

Man sollte den fremden Code immer zumindest soweit begreifen, daß man in 
der Lage ist, ihn korrekt zu konfigurieren (soweit er die erforderliche 
Konfiguration unterstützt) oder ihn zu ändern/erweitern, wenn das nicht 
der Fall ist.

Dazu gehört im vorliegenden Fall, daß man grundsätzlich zumindest einen 
ungefähren Plan davon hat, wie ein HD44780-kompatibler Controller tickt, 
was DDRAM ist und wie dessen Addressierung mit der Position der 
dargestellten Zeichen zusammenhängt...

von Simon H. (sim_h)


Lesenswert?

c-hater schrieb:
> Simon H. schrieb:
>
>> Danke im Voraus!
>
> Lerne daraus, das es nicht genügt, unverstandenen fremden Code zu
> kompilieren, um Programmierierer zu sein und Programme zu schreiben.
>
> Man sollte den fremden Code immer zumindest soweit begreifen, daß man in
> der Lage ist, ihn korrekt zu konfigurieren (soweit er die erforderliche
> Konfiguration unterstützt) oder ihn zu ändern/erweitern, wenn das nicht
> der Fall ist.
>
> Dazu gehört im vorliegenden Fall, daß man grundsätzlich zumindest einen
> ungefähren Plan davon hat, wie ein HD44780-kompatibler Controller tickt,
> was DDRAM ist und wie dessen Addressierung mit der Position der
> dargestellten Zeichen zusammenhängt...

Habe ich je behauptet, in den Augen eines anonymen "c-hater"s ein 
"richtiger Programmierer" zu sein?
Natürlich habe ich mir den Quellcode angesehen, natürlich verfüge ich 
über ein gewisses Grundlagenwissen in Sachen HD44780. Und doch bin ich 
es aus der objektorientierten DENKWEISE (die durchaus auch in C 
funktioniert) gewohnt, eine Bibliothek als eine Blackbox zu sehen, die 
funktioniert/funktionieren muss. Aus früheren Fehlern konnte ich jedoch 
lernen, dass dies auf Mikrocontroller nur begrenzt anwendbar ist. Du als 
jemand, der NATÜRLICH den kompletten Code verstanden hat und sämtliche 
Datenblätter sämtlicher Displaycontroller NATÜRLICH verstanden hat, wird 
doch garantiert noch etwas Konstruktives zur Diskussion beitragen 
können, oder?

Außerdem verstehe ich den Bereich, den du von meiner Aussage zitiert 
hast, überhaupt nicht.

sim_h

: Bearbeitet durch User
von Simon H. (sim_h)


Lesenswert?

@Ingo:
Das sind die folgenden:
1
#define LCD_DDADR_LINE1         0x00
2
#define LCD_DDADR_LINE2         0x40
Tausche ich im obigen Code jedoch die SetCursors aus,
funktioniert es auch nicht. Also liegt es wohl doch nicht an den Zeilen.

sim_h

von holger (Gast)


Lesenswert?

>@dummy: Welcher RAM? Der vom Displaycontroller, der von den Treibern,
>der vom ATmega16A, mein Kurzzeitgedächtnis?

Er meint das RAM von deinem ATmega.

Wurde überhaupt der richtige Controller in deinem Projekt eingestellt?
Wie sieht dein komplettes Programm aus? Keiner weiss was
du da noch so getrieben hast.

Am besten gleich das gesamte Projektverzeichnis als ZIP anhängen.
Alles andere ist nur sinnloses rumraten das niemanden
weiterbringt.

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

statische Strings im Flash ablegen und von dort in einen Puffer kopieren
Parameter im EEProm speichern
RAM dient nur als Puffer und wird möglichst sparsam für statische 
Variablen verwendet.

Die Hauptnutzung von RAM sollten der Stack und lokale variablen sein.

Werden variable Daten zwischen mehreren Routinen ausgetauscht ist das 
nutzen einiger globaler Variablen sinnvoll.

ach ja eventuell überlebt auch eine lokale variable einen Interrupt 
nicht wenn sie nicht "static" deklariert wird

???

Namaste

von Simon H. (sim_h)


Lesenswert?

Hier mal meine komplette main.c:
1
#include <avr/io.h>
2
#include "lcd-routines.h"
3
int main(void)
4
{
5
// Hier funktioniert alles ...
6
lcd_init();
7
lcd_string("Hallo Welt!");
8
lcd_setcursor(0, 2);
9
lcd_string("Hall");
10
// ... und beim nächsten Befehl zeigt das Display nur einen Balken!
11
lcd_string("o Welt");
12
13
  while(1);
14
  return 0;
15
}
Sonst ist da nur noch die aus dem Wiki kopierte lcd-routines.c, und die 
lcd-routines.h, die ich auch aus dem Wiki habe, bei der ich jedoch noch 
die Zeilenkonstanten und natürlich XTAL angepasst habe.

sim_h

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

>Hier mal meine komplette main.c:

Das sind wir ja wieder da wo wir angefangen haben.
Es geht nicht um deinen Codeschnipsel.
Dort hast du nichts falsch gemacht.

Wo ist das komplette Projekt?

von Simon H. (sim_h)


Lesenswert?

Das IST neben den beiden Dateien aus dem Wiki das komplette Projekt.

sim_h

von Dieter F. (Gast)


Lesenswert?

Hallo,

vielleicht lohnt ein Blick auf die Entwicklungsumgebung.

Es gab da mal Beitrag "AVR: Fehler bei Ausgabe von Strings auf LCD"

ein nicht ganz unähnliches Problem.

Gruß

von holger (Gast)


Lesenswert?

>Das IST neben den beiden Dateien aus dem Wiki das komplette Projekt.

Wo sind die Compilereinstellungen in deinen Dateien?
Die stehen da nicht drin. Ein komplettes Projekt sieht
also anders aus.

Würde mich aber nicht wundern wenn deine Schaltung
einfach nur Müll ist und wie üblich die Abblockkondensatoren
vergessen wurden. Oder nicht alle VCC GND angeschlossen.

Wie sieht noch mal dein Schaltplan aus?

von Simon H. (sim_h)


Lesenswert?

holger schrieb:
> Würde mich aber nicht wundern wenn deine Schaltung
> einfach nur Müll ist und wie üblich die Abblockkondensatoren
> vergessen wurden. Oder nicht alle VCC GND angeschlossen.
Das kann auch ich natürlich nicht ausschließen, mit einem anderen LCD 
von der Firma Aureate funktioniert es aber. Und ich habe auch einen 
Abblockkondensator, sowie beide GNDs angeschlossen.

Getestet habe ich das ganze mit 2 veschiedenen Entwicklungsumgebungen:
1. RPi mit avr-gcc 4.7.2 und den GPIO als Programmer
1
avr-gcc -mmcu=atmega16a x -o x.elf -Os -std=c99
2. Atmel Studio 6.1 mit Standardeinstellungen und AVRISP mkII

sim_h

von c-hater (Gast)


Lesenswert?

Simon H. schrieb:

> Natürlich habe ich mir den Quellcode angesehen, natürlich verfüge ich
> über ein gewisses Grundlagenwissen in Sachen HD44780.

Prüfungsfragen: Was ist denn nun DDRAM? Und wie ist der Zusammenhang der 
DDRAM-Adressen mit der Zeichenposition?

> Und doch bin ich
> es aus der objektorientierten DENKWEISE (die durchaus auch in C
> funktioniert) gewohnt, eine Bibliothek als eine Blackbox zu sehen, die
> funktioniert/funktionieren muss.

Ja. Wenn man die Properties, die ihr Verhalten steuern, mit den 
korrekten Werten belegt, bevor man sie benutzt. Z.B. Dot.Net's 
System.IO.Ports.Serialport wird (bestenfalls) nur dann von allein 
korrekt kommunizieren, wenn dein Kommunikationspartner zufällig an COM1 
angeschlossen ist und zufällig auch in jeder Beziehung mit den 
Defaultwerten der Serialport-Klasse für Zahl der Daten- und Stopbits, 
für die Parity und das Handshake übereinstimmt. "Bestenfalls" deshalb, 
weil es noch ein oder zwei üblicherweise seltener bedeutende Parameter 
gibt, die bei für den Kommunikationspartner unpassender Einstellung 
ebenfalls die Funktion der Sache insgesamt verhindern könnten.

Und genau so, wie das bei dieser SerialPort-Klasse ist, ist das 
notwendigerweise auch bei einer Bibliothek für HD44780-kompatible 
Displays. Einfach deshalb, weil es so viele verschiedene Displays 
gibt.

Wenn solange du das nicht begreifst, dann bist du nicht nur kein 
Programmierer, sondern wirst obendrein auch keiner werden. So einfach 
ist das.
Und wenn du dich deshalb angepißt fühlst, bist du obendrein auch noch 
lernresistent und wirst niemals ein Programmierer werden.

von Simon H. (sim_h)


Lesenswert?

c-hater schrieb:
> Simon H. schrieb:
>
>> Natürlich habe ich mir den Quellcode angesehen, natürlich verfüge ich
>> über ein gewisses Grundlagenwissen in Sachen HD44780.
>
> Prüfungsfragen: Was ist denn nun DDRAM? Und wie ist der Zusammenhang der
> DDRAM-Adressen mit der Zeichenposition?
Lächerlich. Selbst wenn ich es nicht wissen würde, ein einfaches 
Copy+Paste von einer anderen Seite (z. B. 
http://www.sprut.de/electronic/lcd/index.htm) würde reichen, um deine 
"Prüfung" zu bestehen.

>> Und doch bin ich
>> es aus der objektorientierten DENKWEISE (die durchaus auch in C
>> funktioniert) gewohnt, eine Bibliothek als eine Blackbox zu sehen, die
>> funktioniert/funktionieren muss.
>
> Ja. Wenn man die Properties, die ihr Verhalten steuern, mit den
> korrekten Werten belegt, bevor man sie benutzt. Z.B. Dot.Net's
> System.IO.Ports.Serialport wird (bestenfalls) nur dann von allein
> korrekt kommunizieren, wenn dein Kommunikationspartner zufällig an COM1
> angeschlossen ist und zufällig auch in jeder Beziehung mit den
> Defaultwerten der Serialport-Klasse für Zahl der Daten- und Stopbits,
> für die Parity und das Handshake übereinstimmt. "Bestenfalls" deshalb,
> weil es noch ein oder zwei üblicherweise seltener bedeutende Parameter
> gibt, die bei für den Kommunikationspartner unpassender Einstellung
> ebenfalls die Funktion der Sache insgesamt verhindern könnten.
>
> Und genau so, wie das bei dieser SerialPort-Klasse ist, ist das
> notwendigerweise auch bei einer Bibliothek für HD44780-kompatible
> Displays. Einfach deshalb, weil es so viele verschiedene Displays
> gibt.
Ja, und? Das habe ich versucht, leider hat es nicht geklappt, weswegen 
ich hier um Hilfe gebeten habe.
Und dein Vergleich hinkt sowieso: Aber das Wissen darum, dass es in C 
eben keine Exceptions gibt, die einem wie in C# bei der Fehlersuche 
helfen, kann man von jemandem der sich "c-hater" nennt, ebenso wenig 
erwarten, wie dass man jmd., der sich schon in anderen Threads 
offensichtlich als Anfänger bezeichnet hat, weismachen will, dass er 
sich vor der Benutzung des übrigens sehr gut dokumentierten Sourcecodes 
aus dem Wiki doch bitte mit jedem kleinsten Detail des HD44780 zu 
beschäftigen und am besten die Datenblätter von ihm und sämtlichen 
seiner Kompatiblen auswendig lernen soll.

> Wenn solange du das nicht begreifst, dann bist du nicht nur kein
> Programmierer, sondern wirst obendrein auch keiner werden. So einfach
> ist das.
> Und wenn du dich deshalb angepißt fühlst, bist du obendrein auch noch
> lernresistent und wirst niemals ein Programmierer werden.
Und nein, ich fühle mich nicht "angepißt", und habe auch immer noch die 
Hoffnung nicht aufgegeben, dass sich ein echter Profi (so wie Du) meines 
Problems in technischer und objektiver Weise annimmt.

Übrigens Danke an alle anderen Poster, die dies bereits getan haben!

sim_h

von Simon H. (sim_h)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe hier mal ein Bild meines Breadboards angehängt.
sim_h

von Sinus T. (micha_micha)


Lesenswert?

Schick, so ein Board.
Mal im Ernst: C-Hater hat das für ein zartes Gemüt vielleicht etwas zu 
krass ausgedrückt, hat aber in allen Punkten vollkommen Recht.

Also, hast du das Datenblatt des Displaycontrollers durchgekaut, hast du 
dir das Datenblatt deines Displays angeschaut, speziell die Adressierung 
der Zeichen? Weißt du, wie die I/O-Programmierung des AVR funktioniert? 
Hast du die Quellen der von dir verwendeten Bibliothek angeschaut und 
verstanden?

Wenn du zu dir selbst ehrlich bist und nur eine dieser Fragen mit "nein" 
beantwortest, dann hole das nach und du wirst alleine auf die Lösung 
kommen und darauf auch noch stolz sein dürfen.

Die Ansteuerung solcher Displays ist nämlich wirklich nicht kompliziert.

Gruss Micha

: Bearbeitet durch User
von towika (Gast)


Lesenswert?

Hallo,

bin zwar auch nur Gast hier, aber ich wundere mich manchmal über die 
Umgangsformen hier...

In vielen Threads wird wie oben verlangt oder vorausgesetzt, daß man bei 
Fragenstellungen erstmal die Datenblätter zu Mikroprozessoren, Displays 
und anderen Dokumenten so lange durchkaut, bis man ein Wissen auf Abruf 
parat hat, daß mit dem der hier nach Hilfe gefragten mithalten kann - 
siehe "Prüfungsfrage". Erst dann läßt sich scheinbar mancher erst dazu 
herab, mit dem Fragenden zu kommunizieren.

Wäre dieser Fragende jedoch auf dem hier manchmal erwarteten Level der 
geistigen Erleuchtung angelangt, müßte er diese Frage vermutlich nicht 
stellen.

Was bleibt also: Entweder, man ist bereit, eine Antwort zu geben, oder 
man läßt es eben. Aber dieses ständige von oben herab ist mehr als nur 
lästig.

Mal folgendes Szenario: Einer dieser geistigen Überflieger, die Hardware 
fressen und Software im Blut haben, würde sich eines Tages darüber 
ärgern, daß sein durch sein immenses Wissen erwirtschafteter Rasen im 
Garten nicht so wächst wie er soll. An sich ein lächerlich geringes 
Problem.
Nun geht der Gute zum Gartenbauer und fragt, was man denn da machen 
könne. Was wird der Gartenbauer antworten? Er würde fragen: Welche 
Rasensaat haben sie denn genau, wie ist der Boden beschaffen (am besten 
Bodengutachten bereithalten), mit was haben sie bisher gedüngt? Aber 
bevor ich Ihnen antworte, können Sie überhaupt ein Botanikstudium 
vorweisen, oder eine Ausbildung zu Gärtner / Landschaftsbauer? Nein? Das 
ist schlecht! Lesen Sie erstmal die Datenblätter der Düngemittel, 
Herbizide, Pestizide, Studien zu den unterschiedlichen 
Bodenbeschaffenheiten, und DANN können wir gerne weiterreden und 
vielleicht sogar auch eine Lösung anbieten!
Solange von Ihrer Seite als Fragesteller nicht wirklich ALLES getan 
wurde, um sich alles erdenklich Wissenswerte zu dem Thema beigebracht zu 
haben, hat es keinen Sinn, auch nur ein helfendes Wort zu verlieren.

Das Beispiel geht überall, wo sich mancher Programmierer schwertut: 
Arbeiten am und im Haus; am Auto; Origami, what ever.

Auch der Programmierer wird einmal in Foren nach Hilfe suchen, zu 
Themen, von denen er eben nicht die absolut erschöpfende Ahnung hat / 
haben kann. Auch er wäre froh, wenn ihm einmal jemand unter Arme greifen 
würde, einfach nur so.

Dieser Post richtet sich natürlich nicht an alle in diesem Thread, aber 
ich denke, man weiß an wen er adressiert ist...

Besten Gruß

Tobias

von Klaus (Gast)


Angehängte Dateien:

Lesenswert?

@ Simon H

Ich hoffe es ist das richtige Datenblatt für dein Display.

Auf deinem Foto meine ich zu erkennen, dass du das Backlight,ohne
Vorwiderstand angeschlossen hast. In dem fall könnten die Leds zerstört 
sein.

Die Kontrasteinstellung, so wie ich es aus dem Datenblatt entnehme, 
sollte
an VDD (+) angeschlossen sein und nicht an Vss (-). Ich würd da mal ein
Poti 10K anschliessen.

Welchen zweck haben die Brücken am LCD (siehe dein Bild)?

Noch was zum Aufbau, der sieht schrecklich und unübersichtlich aus.
Das kannst du besser.

von John (Gast)


Lesenswert?

Klaus schrieb:
> Die Kontrasteinstellung, so wie ich es aus dem Datenblatt entnehme,
> sollte an VDD (+) angeschlossen sein und nicht an Vss (-).
> Ich würd da mal ein Poti 10K anschliessen.

Im Datenblatt ist die Differenz zwischen Betriebsspannung und 
Kontrastspannung angegeben [VDD - VO] z.b. für 25°C: 4,5V…5,1V.
Bezogen auf Masse sind das für VO: -0,1V…0,5V (bei VDD=5V).

Klaus schrieb:
> Welchen zweck haben die Brücken am LCD (siehe dein Bild)?

Er hat DB0…DB3 an Masse gelegt. Und keiner weiß warum.

Gruß
John

von W.S. (Gast)


Lesenswert?

towika schrieb:
> bin zwar auch nur Gast hier, aber ich wundere mich manchmal über die
> Umgangsformen hier...
>
> In vielen Threads wird wie oben verlangt oder vorausgesetzt, daß man bei
> Fragenstellungen erstmal die Datenblätter zu Mikroprozessoren, Displays
> und anderen Dokumenten so lange durchkaut, bis man ein Wissen auf Abruf
> parat hat, daß mit dem der hier nach Hilfe gefragten mithalten kann -
> siehe "Prüfungsfrage". Erst dann läßt sich scheinbar mancher erst dazu
> herab, mit dem Fragenden zu kommunizieren.

Ja.
So ist es.
Eigentlich ist es in jedem Falle, wo jemand irgend eine Art 
Entwicklungsarbeit an einem im Prinzip seit langem bekannten Bauteil 
beginnt, die Regel, daß er weiß, was er tut, bevor er es tut. Genau so 
herum ist das, was man gemeinhin "Ernsthaftigkeit" nennt.

Und wenn jemand merkt, daß er mit seinem Kenntnisstand der selbst 
gestellten Aufgabe nicht gerecht wird, dann verlangt unsereiner als 
ernsthafter Professioneller, daß derjenige sich zunächst aus eigener 
Kraft um die Verbesserung seines Kenntnisstandes bemüht.

Aber hier sehen wir fast täglich Leute, die da meinen, durch simples 
Kopieren ohne Verstehen ihr Vorhaben vollbringen zu können. Nun, wenn's 
klappt, ist das ja fein für den Betreffenden, aber wenn's nicht klappt, 
dann wird hier bisweilen in einem Ton nachgefragt, der anderen Leuten 
wie z.B. dem c-hater wie ein Tritt auf den Schlips vorkommt - mir 
übrigens auch.

Zur Sache: Der TO hat einfach ein paar Quellen kopiert und sich dabei 
nur gedacht "das sind Bibliotheken, die haben zu funktionieren und 
werden von mir als Blackbox betrachtet." Er hat sich offensichtlich 
keinerlei eigene Gedanken gemacht, woran es denn nun liegen könnte, 
daß er die zweite Zeile nicht so recht benutzen kann - und daß es 
vielleicht daran liegen könnte, daß man eine universelle Treiberquelle 
eben in einigen Feinheiten an unteschiedliche Hardware anpassen muß.

Der c-hater hat ihm zunächst recht dezent den kompletten Lösungsweg 
dargestellt, er hätte dies bloß lesen und verstehen müssen - aber 
stattdessen hat er den Hochmütigen herausgekehrt, der da schrieb:

"Natürlich habe ich mir den Quellcode angesehen, natürlich verfüge ich
über ein gewisses Grundlagenwissen in Sachen HD44780. Und doch bin ich
es aus der objektorientierten DENKWEISE (die durchaus auch in C
funktioniert) gewohnt, eine Bibliothek als eine Blackbox zu sehen, die
funktioniert/funktionieren muss."

Soso. Man ist es gewohnt, daß...

So, towika, verstehst du es nun, daß angesichts eines so großen Klotzes 
jemand eben zum groben Keil greift?

Nebenbei: Die Startadressen der Zeilen im Display-Ram unterscheiden sich 
von Display zu Display, je nach Zeilenlänge und -anzahl. Man muß dieses 
IMMER im Treiber richtig einstellen, sonst geht nur Zeile 1, weil die 
bei 0 losgeht.

W.S.

von Simon H. (sim_h)


Lesenswert?

Klaus schrieb:
> @ Simon H
>
> Ich hoffe es ist das richtige Datenblatt für dein Display.
Ja, danke, sollte das Richtige sein.

> Auf deinem Foto meine ich zu erkennen, dass du das Backlight,ohne
> Vorwiderstand angeschlossen hast. In dem fall könnten die Leds zerstört
> sein.
Ich habe das Modell ohne Hintergrundbeleuchtung, die Brücken sind nur 
angeschlossen, um das Ganze mal schnell mit einem anderen Display 
versuchen zu können.

> Die Kontrasteinstellung, so wie ich es aus dem Datenblatt entnehme,
> sollte
> an VDD (+) angeschlossen sein und nicht an Vss (-). Ich würd da mal ein
> Poti 10K anschliessen.
Das war's! Hatte ich eigentlich ausgeschlossen, weil es bis zu einer 
gewissen Zahl an Zeichen ja ging.

> Welchen zweck haben die Brücken am LCD (siehe dein Bild)?
Wie gesagt, ein anderes LCD funktionierte sonst nicht

> Noch was zum Aufbau, der sieht schrecklich und unübersichtlich aus.
> Das kannst du besser.
Hatte nicht mehr genug von den direkt anliegenden Brücken.

sim_h

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.