Forum: Mikrocontroller und Digitale Elektronik Handy-Display an Mikrocontroller


von Tino (Gast)


Lesenswert?

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"

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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

von Tino (Gast)


Lesenswert?

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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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

von Igor (Gast)


Lesenswert?

Ein sehr kleines Display gibt's bei conrad ( I²C Bus).

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.