Forum: Mikrocontroller und Digitale Elektronik LCD Initialisierung


von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich versuche gerade das LCD 161 A zu initialisieren und bin dabei der 
Anleitung aus dem Tutorial gefolgt. Nur ist meine Pinbelegung etwas 
anders:
RS:  PD0
E:   PD1
DB4: PD4
DB5: PD5
DB6: PD6
DB7: PD7
und habe die LCD Routine entsprechend abgeändert (s. u.). Nun sende ich 
das Programm an den µC und die vormals 8 dunklen Kästchen verschwinden 
und das gesamte Display füllt sich mit helleren Kästchen. Zwar ist das 
Forum voll mit Beiträgen zu dieser Art Fehler, auch bei gleichem 
Display, aber leider hat mir keiner der Beiträge helfen können.
Ich nehme mal an, dass ich beim Umschreiben irgendetwas vertauscht habe. 
Ich kann aber leider nicht finden was, obwohl ich schon einige Male das 
Programm durchgelesen habe. Im Datenblatt finde ich leider nichts zur 
4bit Initialisierung, die Anweisung auf S. 6 ( 
http://www.microcontroller-online.de/microcontroller/datenbl%E4tter/PDF/LCD161A.pdf 
) scheinen nur für den 8bit Modus zu gelten.

Hier ist das Test-Programm, die LCD Routine ist im Anhang:
.include "m8def.inc"

.def tmp1 = r16
.def tmp2 = r17
.def tmp3 = r18

           ldi tmp1, LOW(RAMEND)      ; LOW-Byte der obersten 
RAM-Adresse
           out SPL, tmp1
           ldi tmp1, HIGH(RAMEND)     ; HIGH-Byte der obersten 
RAM-Adresse
           out SPH, tmp1

           ldi tmp1, 0xFF    ; Port D = Ausgang
           out DDRD, tmp1

           rcall lcd_init     ; Display initialisieren
           rcall lcd_clear    ; Display löschen

           ldi tmp1, 'T'     ; Zeichen anzeigen
           rcall lcd_data

           ldi tmp1, 'e'     ; Zeichen anzeigen
           rcall lcd_data

           ldi tmp1, 's'     ; Zeichen anzeigen
           rcall lcd_data

           ldi tmp1, 't'     ; Zeichen anzeigen
           rcall lcd_data

loop:
           rjmp loop

.include "LCD_routines.asm"            ; LCD-Routinen werden hier 
eingefügt

von Alex (Gast)


Lesenswert?

Alles klar, habe meinen Fehler gefunden, habe an den Stellen in der LCD 
Routine an denen ein Unterprogramm aufgerufen wurde, auch die Bits 
vertauscht, als wenn sie auf das PortD ausgegeben werden....

Ic hätte aber noch eine andere Frage, in der LCD_Test.asm Datei aus dem 
Tutorial werden oben die Stackpointer definiert:
 ldi tmp1, LOW(RAMEND)      ; LOW-Byte der obersten RAM-Adresse
 out SPL, tmp1
 ldi tmp1, HIGH(RAMEND)     ; HIGH-Byte der obersten RAM-Adresse
 out SPH, tmp1

Nach dem ich den Artikel Stack gelesen habe, ist dieses wohl notwendig, 
damit das Programm weiß, wo es nach den "rcall" aufrufen im 
Hauptprogramm weiter geht. Läßt man die Pointer weg, erscheint auf dem 
Display: TEST||||
(wobei | für einen Balken steht). Müsst das Display nicht eigentlich 
leer sein, da das Programm nicht über das "rcall lcd_init" hinweg kommt?
Vielleicht könnt mir jemand erklären, wie das Programm ohne den 
Stackpointer abläuft.
Danke schon mal.

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.