Forum: Mikrocontroller und Digitale Elektronik [AVRASM] LCD Tutorial


von Tortillia (Gast)


Lesenswert?

Hallo alle zusammen,

ich habe begonnen mit Hilfe des AVR-ASM Tutorials mir Assembler 
beizubringen. Ich verwende das AVR Studio 4 und einen ATmega8.

Leider bin ich von dem Tutorial etwas erschlagen, da ich nicht alles 
direkt nachvollziehen kann. Allerdings konnte ich mir mit viel Zeit und 
mit Hilfe des Datenblattes fast alles erklären. Jedoch komme ich hier 
einfach nicht mehr weiter:

Der folgende Code ist aus dem Download ganz unten im LCD Tutorial aus 
dem Unterprogramm lcd_data bzw. lcd_command
1
in    temp3, LCD_PORT
2
andi  temp3, 0x80
3
or    temp1, temp3

Den Code an sich verstehe ich ja:
1. Zeile: Inhalt von "LCD_PORT" in temp3 laden
2. Zeile: temp3 mit 0x80 verunden (alles wird 0 bis auf das MSB(sofern 
MSB in temp3 = 1))
3. Zeile: temp1 und temp3 verodern

Hier im zusammenhang mit lcd_data:
1
lcd_data:
2
           push  temp2
3
           push  temp3
4
           mov   temp2, temp1            ; "Sicherungskopie" für
5
                                         ; die Übertragung des 2.Nibbles
6
           swap  temp1                   ; Vertauschen
7
           andi  temp1, 0b00001111       ; oberes Nibble auf Null setzen
8
           sbr   temp1, 1<<PIN_RS        ; entspricht 0b00010000
9
           in    temp3, LCD_PORT
10
           andi  temp3, 0x80
11
           or    temp1, temp3
12
           out   LCD_PORT, temp1         ; ausgeben
13
           rcall lcd_enable              ; Enable-Routine aufrufen
14
                                         ; 2. Nibble, kein swap da es schon
15
                                         ; an der richtigen stelle ist
16
           andi  temp2, 0b00001111       ; obere Hälfte auf Null setzen 
17
           sbr   temp2, 1<<PIN_RS        ; entspricht 0b00010000
18
           or    temp2, temp3
19
           out   LCD_PORT, temp2         ; ausgeben
20
           rcall lcd_enable              ; Enable-Routine aufrufen
21
           rcall delay50us               ; Delay-Routine aufrufen
22
23
           pop   temp3
24
           pop   temp2
25
           ret                           ; zurück zum Hauptprogramm

Aber welchen Sinn hat das ganze bei lcd_data und lcd_command? In den 
ersten Beispielen ist dieser Schnipsel nicht zu finden. Weiterhin ist 
der PortD7 (der vielleicht mal durch diesen Schnipsel geschaltet werden 
würde) noch nichtmal angeschlossen!

Ich hoffe das man versteht was ich meine und das mir das jemand erklären 
kann, ich bin momentan echt ratlos. Falls ich es besser beschreiben 
soll, sagt bitte bescheid.

Vielen Dank!

MFG Tortillia

von spess53 (Gast)


Lesenswert?

Hi

>Weiterhin ist
>der PortD7 (der vielleicht mal durch diesen Schnipsel geschaltet werden
>würde) noch nichtmal angeschlossen!

Das ist die Vorkehrung, das sich der Inhalt von LCD_PORT.7 nicht ändert, 
wenn dort etwas angeschlossen ist. Es werden also nur die Portpins 
verändert, die auch wirklich an der LCD-Ansteuerung beteiligt sind. 
Erspart u.U. langwierige Fehlersuche.

MfG Spess

von Tortillia (Gast)


Lesenswert?

Hallo Spess,

danke für die schnelle Antwort. Soweit konnte ich mir das auch erklären, 
jedoch frage ich mich warum man nur das MSB "geschützt" hat? Im Tutorial 
wird ja LCD_PORT.6 auch nicht benutzt. Dann hätte ich da nämlich
1
andi  temp3, 0xC0

erwartet. Aber gut, das ist warscheinlich nur zu Demonstrationszwecken 
mit LCD_PORT.7 gemacht. Oder man ging davon aus das PD6 für R/W vom LCD 
genutzt wird.

Ab und zu sollte man sich doch auf seine ersten Gedankengänge verlassen 
und sich nicht selbst verwirren :)

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Tortillia schrieb:
> Im Tutorial wird ja LCD_PORT.6 auch nicht benutzt. Dann hätte ich da
> nämlich
>
>
1
andi  temp3, 0xC0
>
> erwartet.
>
Da es aber nur um das Bit 7 geht, also beim LCD um das DB7,
erinnert mich dies an eine BUSY-FLAG abfrage. Also ob das LCD fertig 
bzw. Bereit ist.
Scheint aber einfach aus irgend einem anderen Programmteil hier 
hineinkopiert worden zu sein, da es gar nicht ausgewertet wird.
Also ein COPY & PASTE Fehler.

Aus dem Tutorial :

RW legt fest, ob geschrieben oder gelesen werden soll. High bedeutet 
lesen, low bedeutet schreiben. Wenn man RW auf lesen einstellt und RS 
auf Befehl, dann kann man das Busy-Flag an DB7 lesen, das anzeigt, ob 
das LCD den vorhergehenden Befehl fertig verarbeitet hat. Ist RS auf 
Daten eingestellt, dann kann man z. B. den Inhalt des Displays lesen - 
was jedoch nur in den wenigsten Fällen Sinn macht. Deshalb kann man RW 
dauerhaft auf low lassen (= an GND anschließen), so dass man noch ein 
IO-Pin am Controller einspart. Der Nachteil ist, dass man dann das 
Busy-Flag nicht lesen kann, weswegen man nach jedem Befehl ca. 50 µs 
(beim Return Home 2 ms, beim Clear Display 20 ms) warten sollte, um dem 
LCD Zeit zum Ausführen des Befehls zu geben. Dummerweise schwankt die 
Ausführungszeit von Display zu Display und ist auch von der 
Betriebsspannung abhängig. Für professionellere Sachen also lieber den 
IO-Pin opfern und Busy abfragen.

Bernd_Stein

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.