AVR-Assembler+Byte "zersägen"

Gast #628003
Lesenswert?
• ▲
▼
Hallo
Ich habe hier ein LCD-Display, was im 4-Bit Modus an PB0-PB3 eines 
Atmega16
betrieben werden soll. Der Controller (HD44780) verlangt, daß das Byte 
des anzuzeigenden Zeichens in 2 "Etappen" je 4 Bit übertragen werden 
muß.
So lese ich jedenfalls das Datenblatt.

Angenommen, ich hätte das Register R16 mit dezimal 65 geladen, was dem 
Buchstaben "A" entspricht. Jetzt möchte ich in R18 die  oberen 4 Bit 
davon
und in R17 die unteren haben. Dann muß ich den Inhalt beider Register 
nacheinander auf PB0-PB3 ausgeben.

Ich habe in Assembler keine Idée, wie ich das Byte "zersägen" soll.
Kann mir mal jemand auf die Sprünge helfen?
Im 8-Bit Modus möchte ich nicht dran, weil das zwar einfacher wäre, aber 
ich brauche den "Rest" des Ports B noch für andere Sachen.

Ratlos
Paul
Gast #628005
Lesenswert?
• ▲
▼
Hallo Paul,

diese Art der Aufbereitung ist standard und es gibt zig Beispiele. Im 
Prinzip maskierst Du das 1. Nibble und gibst es aus, dann "swapst" Du 
die Nibbles, maskierst und gibst wieder aus.

Gruss Otto
#628006
Lesenswert?
• ▲
▼
Schau Dir am besten mal den swap-Befehl an.
Bsp.:
1
mov r17, r16       ;r16 nach r17 kopieren
2
andi r17, 0x0F     ;High-Nibble 0 setzen
3
mov r18, r16       ;r16 nach r18 kopieren
4
swap r18           ;Byte "umdrehen" (High- und Low-Nibble vertauschen)
5
andi r18, 0x0F     ;wie oben: High-Nibble 0 setzen
(Schuss aus der Hüfte, ohne Gew(a)ehrleistung...)
Gast #628037
Lesenswert?
• ▲
▼
Danke für Eure Tips.

Habe ich eben probiert:
$asm
ldi r16, 65     Lade `R16 mit dez.65
mov r17, r16    Schiebe den Inhalt von R16 in R17
andi r17, 0x0F  Setze die oberen 4 Bits auf 0
mov r18, r16    Schiebe den Inhalt von R16 in R18
swap r18        Vertausche die unteren4 und oberen4 Bits in R18 
miteinander
andi r18, 0x0F  Setze die oberen 4 Bits auf 0
$end Asm

End

Was passiert im Simulator? Zum Schluss steht in R16 noch dez. 65 und in 
den
R17 und R18 steht 0!  Ich denke, daß in R17 zum Schluss dez.1 stehen 
müßte und in R18 dez.4   Wo ist der Denkfehler? (Oder ist der Simulator 
ein Spitzbube ;-))

MfG Paul
Gast #628072
Lesenswert?
• ▲
▼
Das kommt davon, wenn man das Rad nochmal erfinden will. ;-) Meine 
eigene
Initialisierungsroutine sieht fast so aus, wie die aus dem Tutorial...


Trotzdem wundere ich mich über das Simulationsergebnis von dem Codestück 
weiter oben. Mal sehen, ob das AVR-Studio auch deas gleiche Resultat 
zeigt.

MfG Paul
Gast #628133
Lesenswert?
• ▲
▼
So, im AVR-Studio funktioniert es wie es soll. Der Simulator von Bascom
hat einen Bug: Der ANDI-Befehl setzt in dem Byte alle Mann zu null, 
nicht nur die oberen 4 Bit. :-(
...da kann ich lange suchen.

MfG Paul
#628225
Lesenswert?
• ▲
▼
Paul Baumann wrote:
> So, im AVR-Studio funktioniert es wie es soll. Der Simulator von Bascom
> hat einen Bug: Der ANDI-Befehl setzt in dem Byte alle Mann zu null,
> nicht nur die oberen 4 Bit. :-(
> ...da kann ich lange suchen.
>
> MfG Paul

Soviel zum Thema "ordentliches Werkzeug"...

Gruß in die Mitte Deutschlands, Troll Blaubär

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.