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!
>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.
@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
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...
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
>@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.
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
// ... und beim nächsten Befehl zeigt das Display nur einen Balken!
11
lcd_string("o Welt");
12
13
while(1);
14
return0;
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
>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?
>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?
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
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.
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
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
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
@ 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.
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
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.
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