mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Tutorial: LCD Ansteuerung


Autor: Bene Ries (psychodead)
Datum:

Bewertung
0 lesenswert
nicht 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-/Baueleme... 
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.

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bene Ries (psychodead)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: R. Freitag (rfr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
contrast ist auf GND??
Nix gut!!
Gruss
Robert

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bene Ries (psychodead)
Datum:

Bewertung
0 lesenswert
nicht 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... )

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Bene Ries (psychodead)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Sind die so okay?

Jetzt kann man sie lesen!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert die HEX Datei im Anhang?
Ist für dein Pinout compiliert.

Autor: Bene Ries (psychodead)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bene Ries (psychodead)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendjemand noch eine Idee?

Autor: Bene Ries (psychodead)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bene Ries (psychodead)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bene Ries (psychodead)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.