Forum: www.mikrocontroller.net Unterschiedliche Codeversionen im Tutorial


von Gast (Gast)


Lesenswert?

Hi, ich hab mal eine Kleine Frage zum AVR-Tutorial (Assembler)

Im Tutorial zum LCD heißt es im Beispielcode auf der Seite
1
lcd_data:
2
           mov temp2, temp1             ; "Sicherungskopie" für
3
                                        ; die Übertragung des 2.Nibbles
4
           swap temp1                   ; Vertauschen
5
           andi temp1, 0b00001111       ; oberes Nibble auf Null setzen
6
           sbr temp1, 1<<4              ; entspricht 0b00010000 (Anm.1)
7
           out PORTD, temp1             ; ausgeben
8
           rcall lcd_enable             ; Enable-Routine aufrufen
9
                                        ; 2. Nibble, kein swap da es schon
10
                                        ; an der richtigen stelle ist
11
           andi temp2, 0b00001111       ; obere Hälfte auf Null setzen 
12
           sbr temp2, 1<<4              ; entspricht 0b00010000
13
           out PORTD, temp2             ; ausgeben
14
           rcall lcd_enable             ; Enable-Routine aufrufen
15
           rcall delay50us              ; Delay-Routine aufrufen
16
           ret

aber in der kompletten Version
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


Wozu sind die zusätzlichen Zeilen? Wiso lässt man da den Port noch mal 
einlesen?

Bin grad irgendwie irritiert, auch da bei mir nur die zweite Version 
funktioniert. Ich kann den Sinn dahinter jedoch nicht erkennen, und weiß 
auch nicht, ob das der Fehler bei mir ist.

Weiß jemand bescheid, wiso die zusätzlichen Anweisungen eingefügt 
wurden?

von Hannes L. (hannes)


Lesenswert?

Die kleine Version geht davon aus, dass am Port nur das LCD hängt und 
überschreibt ungenutzte Bits einfach mit 0. Die große Version nimmt 
Rücksicht auf die unbenutzten Bits, indem sie den Port einliest und nur 
die Bits verändert, die für das LCD notwendig sind, die anderen 
(unbenutzten) Bits werden unverändert zurückgeschrieben.

...

von Gast (Gast)


Lesenswert?

Ok, Danke, dann müsste es also mit beiden Versionen gehen (bei mir hängt 
nur das Lcd am Port), dann ist also was anderes falsch.

von Hannes L. (hannes)


Lesenswert?

Gast wrote:
> Ok, Danke, dann müsste es also mit beiden Versionen gehen (bei mir hängt
> nur das Lcd am Port), dann ist also was anderes falsch.

Ich habe das Tutorial vor einigen Jahren gelesen, da war es allerdings 
gegenüber heute noch seeeeeehhhhhr dürftig. Heute verfolge ich das 
Tutorial (bzw. die fast täglich stattfindenden Ergänzungen und 
Erweiterungen) nicht mehr regelmäßig, da ich versuche, in einem anderen 
Stil zu programmieren, der mit dem Stil im Tutorial nicht so recht 
zusammen passt. Das soll jetzt keinesfalls heißen, dass der Stil im Tut 
falsch wäre, er richtet sich halt an Anfänger und soll die ersten 
Schritte erleichtern.

Die damals vorgestellte LCD-Routine funktionierte bei mir auch nicht auf 
Anhieb. Durch Anneliese (äähh Analyse) der Routinen und des Datenblattes 
brachte ich sie aber schnell zum Laufen und konnte sie dann an meine 
persönlichen Bedürfnisse anpassen. Eine nicht ganz aktuelle Version, die 
aber noch kleine Fehler enthält, findest Du hier:
Beitrag "Re: Hilfe! LCD-Ansteuerung"
Wenn Du den ganzen Thread liest, werden vermutlich weitere Fragen 
beantwortet, die sich Dir mit Sicherheit bald stellen werden. Die 
Routine ist zwar für ein LCD mit 2 Controllern, aber zum Ergründen der 
Funktionsweise sollte sie geeignet sein.

Vermutlich wirst Du aber nur ein Timing-Problem (bei der 
Initialisierung?) haben. Überprüfe mal Deine Taktfrequenz und Deine 
Delays.

...

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.