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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.