mikrocontroller.net

Forum: www.mikrocontroller.net Unterschiedliche Codeversionen im Tutorial


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, ich hab mal eine Kleine Frage zum AVR-Tutorial (Assembler)

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


aber in der kompletten Version
lcd_data:
           push  temp2
           push  temp3
           mov   temp2, temp1            ; "Sicherungskopie" für
                                         ; die Übertragung des 2.Nibbles
           swap  temp1                   ; Vertauschen
           andi  temp1, 0b00001111       ; oberes Nibble auf Null setzen
           sbr   temp1, 1<<PIN_RS        ; entspricht 0b00010000
           in    temp3, LCD_PORT
           andi  temp3, 0x80
           or    temp1, temp3
           out   LCD_PORT, temp1         ; ausgeben
           rcall lcd_enable              ; Enable-Routine aufrufen
                                         ; 2. Nibble, kein swap da es schon
                                         ; an der richtigen stelle ist
           andi  temp2, 0b00001111       ; obere Hälfte auf Null setzen 
           sbr   temp2, 1<<PIN_RS        ; entspricht 0b00010000
           or    temp2, temp3
           out   LCD_PORT, temp2         ; ausgeben
           rcall lcd_enable              ; Enable-Routine aufrufen
           rcall delay50us               ; Delay-Routine aufrufen

           pop   temp3
           pop   temp2
           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?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.