AVR-Assembler+Byte "zersägen"

Gast #628003
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
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.