Hallo, Ich möchte ein möglichst kleines Display mit einem Mikrocontroller ansteuern. Ich denke da an ein Handy-Display, dazu habe ich schon bei einem Anbieter von Ersatz-Displays nachgefragt, der konnte mir aber nicht weiterhelfen. Das Display sollte sich einfach ansteuern lassen (HD44780-Befehlssatz). Dann habe ich noch ein anderes Problem: Ich habe für den 4433 ein Programm für eine Intervall-Schaltung mit LCD-Menue geschrieben. In der asm-Datei habe ich Aufrufe für die lcd.inc mit dem Menue-Programm und ein weiterer inc-Datei-Aufruf für die Binär-BCD-Wandlung. Wenn ich das Programm starte funktioniert es nicht. Ich dachte schon an den Stack, habe alles mögliche probiert. Wenn ich aber die inc-Dateien weglasse und alles in die asm-Datei schreibe läuft es ohne Probleme. Braucht ein Programmaufruf noch zusätzlichen Speicher? Reicht möglicherweise der Stack-Speicher nicht aus? Oder wo liegt das Fehler? Da ich auf dem Gebiet der Mikrocontroller noch Anfänger bin kenne ich mich mit der Speichernutzung auch noch nich so aus. Wo werden denn die Daten bei dieser LCD-Routine, die in Tabelle1 und Tabelle2 stehen, gespeichert ? Gruß Tino ldi counter,9 ldi ZL,LOW(Tabelle1*2) ldi ZH,HIGH(Tabelle1*2) loop_msg1: lpm mov buffer,zeichen rcall write_data adiw ZL,1 ;16-Bit Zeiger erhoehen dec counter ;alle Zeichen gesendet? brne loop_msg1 ;Sende naechstes Zeichen ;Holt Text 'LCD-Routine' aus Tabelle und schreibt diesen ;in die zweite Zeile der Anzeige ldi buffer,0b11000000 ; 2.Zeile rcall write_instr ;sende Befehl ldi counter,11 ;Zeichenzaehler ldi ZL,LOW(Tabelle2*2) ldi ZH,HIGH(Tabelle2*2) loop_msg2: lpm mov buffer,zeichen rcall write_data adiw ZL,1 ;16-Bit Zeiger erhoehen no_carry2: dec counter ;alle Zeichen gesendet? brne loop_msg2 ;Sende naechstes Zeichen ;Endlosschleife. AVR zuruecksetzen, um Programm erneut zu starten loop: rjmp loop ;"AT90S2313" in die 1.Zeile schreiben Tabelle1: .DB "AT90S2313" ;"LCD-Routine" in die 2.Zeile schreiben Tabelle2: .DB "LCD-Routine"
Hallo, wenn das Handy-Display wirklich HD44780-kompatibel ist (was ich SEHR stark bezweifle), solltest du dafür genug Programm im Internet finden. Zu deinem 2. Problem: So wie dein Programm hier steht kann es nicht funktionieren. Der Befehl "rcall" legt die Rücksprungadresse auf dem Stack ab, wenn der Stackpointer nicht initialisiert ist geht das in die Hose. Siehe http://www.mikrocontroller.net/tutorial3.htm. Die Tabellen (eigentlich sind es Zeichenketten) werden im Programmspeicher (Flash-ROM) abgespeichert, ansonsten könntest du den Befehl lpm nicht verwenden. Die Längenangabe des Strings kannst du dir sparen, wenn du statt Tabelle1: .DB "AT90S2313" das hier verwendest: Tabelle1: .DB "AT90S2313",0 Dadurch wird die Zahl 0 (nicht 0 als Zeichen!) drangehängt, und du musst in der Schleife einfach testen ob der gelesene Wert 0 ist oder nicht. Wenn ja, ist der String zu ende. Ein Beispielprogramm (sendet eine Zeichenfolge über das UART an den PC) findest du im Anhang. Es ist für den AT90S2313 geschrieben, wenn du einen anderen Controller verwendest musst du die include-Datei ändern. Und darauf achten, dass z.B. beim AT90S4433 das Bit UDRE nicht im Register USR sondern woanders zu finden ist (siehe Datenblatt). Der Kommentar "Endlosschleife. AVR zuruecksetzen, um Programm erneut zu starten" stimmt nicht. "loop: rjmp loop" springt zur Marke "loop:" und damit immer wieder auf sich selber, das Programm dreht also Däumchen. Damit es wirklich wiederholt wird, musst du "loop:" an den Anfang des Programms schreiben. MfG Andreas
Hallo Andreas, erstmal Danke für deine schnelle Antwort, aber bei meiner Frage wegen dem Handy-Display hast du mich wohl etwas falsch verstanden. Ich möchte ein Handy-Display ansteuern. Da ich aber noch nicht weiß wie ich solch ein Grafik-Display ansteuere und mir auch ein Anbieter von Ersatz-LCDs nicht weiterhelfen konnte, hoffe ich, dass du mir da vielleicht einen Tip geben könntest. Das LCD-Programm hat bei mir funktioniert, das hatte ich aus einem AVR-Buch so übernommen, auch den Stack hatte ich eingerichtet. Es lief aber nur, wenn ich das ganze Programm in der asm-Datei stehen hatte. Mit der LCD-Steuerung in der inc-Datei und Aufruf durch .include lief nichts. Muss ich bei einem .include-Befehl etwas beachten oder gibt es da keine Probleme. > Die Längenangabe des Strings kannst du dir sparen, wenn du statt > Tabelle1: .DB "AT90S2313" > das hier verwendest: > Tabelle1: .DB "AT90S2313",0 > Dadurch wird die Zahl 0 (nicht 0 als Zeichen!) drangehängt, und du musst in > der Schleife einfach testen ob der gelesene Wert 0 ist oder nicht. Wie prüfe ich denn ob der Wert 0 ist, aus dem UART-Beispiele werde ich nicht so ganz schlau. Da ich mich erst seit kurzem mit Mikrocontrollern beschäftige kenne ich mich leider auch noch nicht so gut aus. viele Grüße Tino
Hallo, wenn beim include-Befehl "lcd.inc" steht, dann muss sich die lcd.inc im gleichen Verzeichnis wie das Hauptprogramm befinden. Leider habe ich bei meinem Posting den Anhang vergessen, wird hiermit nachgeholt. Das Programm ist kommentiert, wenn es dennoch Probleme gibt schreib einfach nochmal. MfG Andreas
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.