Forum: Mikrocontroller und Digitale Elektronik AVR Tutorial: LCD Ansteuerung


von Bene R. (psychodead)


Lesenswert?

Hallo zusammen!

Ich weiss, "schon wieder einer mit ner typischen Anfängerfrage". Aber 
ich hab die Forensuche benutzt und bin zu keinem Ergebnis gekommen.

Aaaalso: Ich brauche für einen bestimmten Zweck einen Atmega8 mit LCD. 
Dazu hab ich mir das STK500 mit ausreichend ATmega8s, falls ich was 
fraggen sollte und ein HD44780-"kompatibles" Display mit Controller vom 
Pollin besorgt ( 
http://www.pollin.de/shop/dt/MDg0OTc4OTk-/Bauelemente/Aktiv/Displays/LCD_Modul_DATAVISION_DV_20208.html 
Pinbelegung unter http://www.pollin.de/shop/downloads/D120519D.PDF ). 
Diese weicht etwas vom Standard ab.

Nun ein 8pin-Datenkabel entsprechend der Anleitung im Tutorial und den 
Angaben auf dem pdf verlötet und auf PortD aufgesteckt. Die Routinen zur 
Ansteuerung und ausgabe des "test"-Textes auf den Controller gepackt und 
ablaufen lassen.

Erwartungsgemäß hat es nicht auf Anhieb funktioniert. Was passiert ist 
Folgendes: Nach Einschalten des LCDs wird die obere Zeile schwarz 
(uninitialisierter Zustand, soweit ok). Resette ich den atmega8 und 
lasse mein Programm laufen, so wird das Display geleert, also ein 
Display clear ausgeführt. Keine Anzeige, kein Cursor, nix.

Zuerst habe ich die Wartefunktion verlängert, um träges reagieren 
auszuschliessen, hat nix gebracht. Dann habe ich mein Debugging so 
versucht, dass ich die relevanten Befehle in der Funktion "lcd_init" 
einzeln auskommentiert und geändert habe. Ich rufe nur die "lcd_init" 
auf, um andere Sachen auszuschliessen. Nach dem dreifachen 
Initialisieren des LCD wird "0b00000010" (4bit modus) und "0b00101000" 
als Befehl gesendet. Danach ist das display leer. Es wird keine 
"display_clear" ausgeführt.
Versuche, den Cursor an und blinkend zu schalten ("0b00001111" nach dem 
init mit 4bit, 5x7 Zeilen) oder irgendwas auszugeben, erbrachten kein 
Resultat.

Könnt ihr mir bitte helfen? Bin nach ca 1 Woche rumtüfteln echt ratlos.

von avr (Gast)


Lesenswert?

Das Display hat 20 Pins, PortD hat 8, eine Versorgung min.2.

Aber wer ist mit wem verbunden?

Poste Schaltbild und Code damit man weis über was man redet ;)

avr

von Bene R. (psychodead)


Angehängte Dateien:

Lesenswert?

Sorry, du hast natürlich recht.
Die lcd_routines ist bis auf lcd_init unverändert aus dem Tutorial 
übernommen.
Pinbelegung sollte selbsterklärend sein. Ich hab ein Steckbrett mit 9V 
batterie, mach mir mit Vorwiderstand 5,7v fürs backlight, Kontrast auf 
Masse, kann man gut erkennen. die 5V-Schiene mache ich mir mit der 
Stromversorgung aus Tutorial 1.1.2.

von Hubert G. (hubertg)


Lesenswert?

Wenn du den Kontrast direkt auf GND hast ist die Wahrscheinlichkeit das 
du nichts siehts sehr groß.
Ich nehme an das im Tutorial da ein Poti eingezeichnet ist.

von R. F. (rfr)


Lesenswert?

contrast ist auf GND??
Nix gut!!
Gruss
Robert

von holger (Gast)


Lesenswert?

Gehts nur mir so oder sieht man den ASM Code wirklich durch die
rosa Brille;) Wie kommt das 0xFF 0xFE an den Anfang der Datei?

von holger (Gast)


Lesenswert?

>Gehts nur mir so oder sieht man den ASM Code wirklich durch die
>rosa Brille;) Wie kommt das 0xFF 0xFE an den Anfang der Datei?

Boah und eine Million Nullbytes;) Schick das lcd_routines.asm nochmal.

von Falk B. (falk)


Lesenswert?

@  Bene Ries (psychodead)

>Die lcd_routines ist bis auf lcd_init unverändert aus dem Tutorial
>übernommen.

Dir ist hoffentlich klar, dass dein Programm KEINERLEI Textausgabe 
macht.
Nur den Init, der löscht das LCD.

MFG
Falk

von Bene R. (psychodead)


Lesenswert?

Okay, danke für die Antworten
1. Kontrast auf GND: Sollte kein Problem sein, ich seh genug (schwarzer 
balken zu Beginn). Da muss scheints nur Spannung drauf, wenns zu dunkel 
ist.

@holger: Ihr sprecht in Rätseln! Nullbytes sind leere Zeilen oder watt?

@Falk: Eigentlich sollte lcd_init mit Zeile 137:
            ldi   temp1,    0b00001111   ; Display on, Cursor on, Cursor 
blink
doch einen blinkenden Cursor hinterlassen? Auch wenn ich danach mit 
lcd_data irgendwas ausgeben will, wie das im Tut vorgeführt ist, tut 
sich nüscht.  ( 
http://www.mikrocontroller.net/sourcecode/tutorial/lcd-test.asm )

von holger (Gast)


Lesenswert?

>@holger: Ihr sprecht in Rätseln! Nullbytes sind leere Zeilen oder watt?

Deine lcd_routines.asm ist im Arsch. Die geht so nie und nimmer durch
den Assembler. Womit hast du die bearbeitet?

von Bene R. (psychodead)


Angehängte Dateien:

Lesenswert?

Ähm, das AVM studio, textedit, notepad++ .

Ich hab beide Dateien mit den Originalen aus dem Tut ersetzt. Ändert 
aber nichts am Ergebnis. Sind die so okay?

von holger (Gast)


Lesenswert?

>Sind die so okay?

Jetzt kann man sie lesen!

von holger (Gast)


Lesenswert?

Originalroutine:

lcd_data:
           mov temp2, temp1             ; "Sicherungskopie" für
                                        ; die Übertragung des 2.Nibbles
           swap temp1                   ; Vertauschen
           andi temp1, 0b00001111       ; oberes Nibble auf Null setzen
           sbr temp1, 1<<4              ; entspricht 0b00010000 (Anm.1)
           out PORTD, temp1             ; ausgeben
           rcall lcd_enable             ; Enable-Routine aufrufen
                                        ; 2. Nibble, kein swap da es 
schon
                                        ; an der richtigen stelle ist
           andi temp2, 0b00001111       ; obere Hälfte auf Null setzen
           sbr temp2, 1<<4              ; entspricht 0b00010000
           out PORTD, temp2             ; ausgeben
           rcall lcd_enable             ; Enable-Routine aufrufen
           rcall delay50us              ; Delay-Routine aufrufen
           ret                          ; zurück zum Hauptprogramm


Deine Routine:
lcd_data:
           push  temp2
           push  temp3
           mov   temp2, temp1            ; "Sicherungskopie" für
                                         ; die Übertragung des 2.Nibbles
           swap  temp1                   ; Vertauschen
           andi  temp1, 0b00001111       ; oberes Nibble auf Null setzen
           sbr   temp1, 1<<PIN_RS        ; entspricht 0b00010000
           in    temp3, LCD_PORT
           andi  temp3, 0x80
           or    temp1, temp3
           out   LCD_PORT, temp1         ; ausgeben
           rcall lcd_enable              ; Enable-Routine aufrufen
                                         ; 2. Nibble, kein swap da es 
schon
                                         ; an der richtigen stelle ist
           andi  temp2, 0b00001111       ; obere Hälfte auf Null setzen
           sbr   temp2, 1<<PIN_RS        ; entspricht 0b00010000
           or    temp2, temp3
           out   LCD_PORT, temp2         ; ausgeben
           rcall lcd_enable              ; Enable-Routine aufrufen
           rcall delay50us               ; Delay-Routine aufrufen

           pop   temp3
           pop   temp2
           ret                           ; zurück zum Hauptprogramm

Am besten steigst du mal auf das Original um und versuchst dann erstmal
zu verstehen was da gemacht wird.

von holger (Gast)


Angehängte Dateien:

Lesenswert?

Funktioniert die HEX Datei im Anhang?
Ist für dein Pinout compiliert.

von Bene R. (psychodead)


Lesenswert?

Naja, die Funktion von lcd_data ist ja schön erklärt: die beiden Teile 
des zu übertragenden Bytes einzeln in 4bit-Brocken an den Controller 
schicken. Der Unterschied (die zweite Funktion ist auch original, nur 
nach dem "Code aufräumen" Einschub) ist eben die Benutzung der 
Konstanten PIN_RS, die aber auch 4 ist. Aber worauf willst du hinaus? 
Sie tun im Prinzip doch dasselbe?

Bei deiner .hex passiert Folgendes: nach ca 4 sec wird das Display 
gelöscht, der Ursprungszustand mit der oberen Zeile komplett schwarz 
erscheint nach weiteren 3sec wieder.

von Bene R. (psychodead)


Lesenswert?

Irgendjemand noch eine Idee?

von Bene R. (psychodead)


Lesenswert?

Ich tu mir generell schwer dabei, die Sache zu debuggen. Wie kann ich 
denn dabei vorgehen?
Der Code scheint ja iO zu sein, aber wie kann man schrittweise dem 
hd44780-Controller seine Initialisierung beibringen und Prüfen, ob die 
Einzelschritte erfolgreich waren?

von holger (Gast)


Lesenswert?

>Der Code scheint ja iO zu sein, aber wie kann man schrittweise dem
>hd44780-Controller seine Initialisierung beibringen und Prüfen, ob die
>Einzelschritte erfolgreich waren?

Wenn zwei verschiedene Programme nicht laufen, liegt es wohl nahe
das das LCD nicht korrekt angeschlossen ist. Meine HEX Datei kommt
von einem C Programm;)

von Karl H. (kbuchegg)


Lesenswert?

Bene Ries schrieb:
> Ich tu mir generell schwer dabei, die Sache zu debuggen. Wie kann ich
> denn dabei vorgehen?

Du könntest zb die LCD Leitungen mit zusätzlichen LED bestücken (zb 
direkt am LCD) und dann im Programm nach jeder Ausgabe aufs Port eine 
Wartezeit von ein paar Sekunden einbauen.
Das ist dann ein 'Poor mans Logic-Analyzer'. Aber seis drum: Zumindest 
kannst du nachverfolgen welche Signale in welcher Reihenfolge kommen und 
daraus dann deine Schlüsse ziehen.

von Bene R. (psychodead)


Lesenswert?

Also ich habe die Verdrahtung des LCDs nochmals überprüft und auch 
durchgemessen, ob keine kalten Lötstellen oder so drin sind. Das ist 
soweit alles iO.
Einen neuen Atmega8 hab ich auch eingesetzt, um einen beschädigten 
Controller auszuschliessen. Beim Test mit Holgers Code und dem 
Originalcode trat etwas Merkwürdiges auf: Nach dem Initialisieren zeigte 
Das Display kurzzeitig in beiden Reihen einige Zeichen, ne Menge "<" 
sowie anderen Kram. Dieses Verhalten konnte ich aber nicht 
reproduzieren. Sehr merkwürdig...?!

Da es mir langsam schlicht zu dumm wird, hab ich mir Displays mit 
Original HD44780 und nicht nur "kompatiblen" Controller bestellt. 
Irgendwie hab ich das Ding im Verdacht, dass es nicht genau das macht 
was es soll.

von holger (Gast)


Lesenswert?

>Bei deiner .hex passiert Folgendes: nach ca 4 sec wird das Display
>gelöscht,

Das könnte das Delay mit 255ms sein. Programmiert für 16MHz.
Falls dein uC mit internem 1MHz RC läuft passt die Zeit.
Das Display wird gelöscht, also ist die Reset Sequenz in Ordnung.

> der Ursprungszustand mit der oberen Zeile komplett schwarz
>erscheint nach weiteren 3sec wieder.

Vieleicht macht dein 9V Block mit der Hintergrundbeleuchtung
nach kurzer Zeit schlapp. Mach die mal ab. Und dann stell mal
eine Kontrastspannung < 1V ein. Nicht direkt an Masse! Dann ist
alles schwarz.

von Bene R. (psychodead)


Lesenswert?

Hallo Holger!
AFAIK hab ich den auf 4Mhz laufen, kann mich aber auch irren.
Ich hab die Hintergrundbeleuchtung weg und mit ner Spannungsweiche an 
den Kontrast 0,45V gelassen. Ergebnis dasselbe. Ich kann durchaus 
Zeichen erkennen, siehe das merkwürdige Zahlengehäxel. Daran liegts also 
nicht. Hab den 9V mal im betrieb durchgemessen, der hatte noch 7,8V (ist 
ein Akku, kann auch voll aufgeladen nur 8,4V haben.

Danke für Deine Hilfe, hoffentlich klappts mit dem Original-hd44780!

P.S.: Die Fußball-WM-Verrückten auf der Strasse vor meiner Wohnung 
beginnen mir mit ihrem Geschrei langsam auf den Sack zu gehen :-/

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.