LCD Initialisierung

Gast #1156937
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
Angehängte Dateien:
Gast #1156989
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.