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
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
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...)
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
Hi Paul, schau mal hier: http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD#Assembler MfG, Troll BlauBär
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.