Forum: Mikrocontroller und Digitale Elektronik AVR-Assembler+Byte "zersägen"


von Paul Baumann (Gast)


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

von Otto (Gast)


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

von Johannes M. (johnny-m)


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...)

von Paul Baumann (Gast)


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

von Troll B. (blaubeer)


Lesenswert?


von Paul Baumann (Gast)


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

von Paul Baumann (Gast)


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

von Troll B. (blaubeer)


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

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.