AVR Tutorial: LCD Ansteuerung

#1742156
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.
#1742200
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.
Angehängte Dateien:
Gast #1742219
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.
#1742243
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 )
Gast #1742309
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.
#1742559
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.
Gast #1744718
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;)
#1744747
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.
#1745506
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.
Gast #1745524
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.
#1745890
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 :-/

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