Guten Abend zusammen
Ich beschäftige mich seit ein paar Wochen mit Assembler, und verstehe
den Sinn mancher Befehle nicht so ganz. Das AVR-Tutorial hier im
mikrocontroller.net habe ich mir durchgelesen. Wieso gibt es aber
mehrere identische Befehle, wie BRCS und BRLO, die den gleichen Opcode
haben, und beide den Carry-Bit testen?! Und wieso gibt es die 16
Befehle, mit denen man alle Bits im Statusregister setzen und löschen
kann, wenn die beide Befehle BSET und BCLR vorhanden sind?! Außerdem ist
mir unklar, wie man mit dem Befehl SBI, Bits in den 64 I/O-Registern
setzen kann, wenn für A 5 Bits im Opcode zu verfühgung stehen?!
Ich wäre jedem sehr Dankbar der mich aufklären könnte.
Die doppelten Mnemonics sind eigentlich nur zur besseren Lesbarkeit da.
Einen tieferen Sinn hat das nicht.
Wo steht geschrieben, dass mit SBI 64 I/O-Register beeinflusst werden
können? In meiner Befehlsreferenz steht 0 <= A <= 31.
Bei AVRs, die mehr als 32 I/O-Register haben, geschieht der Zugriff auf
die oberen ganz normal über Speicherzugriff.
Danke für die schnelle Antwort Marvin.
Also in dem Anhang unter dem Befehl SBI steht auch irgendwas über 32
I/O-Register, aber bei meinem ATmega16 habe ich 64. Ich habe im
Datenblatt nachgesehen, dass manche von ihnen nur lesbar sind, aber die
meisten sind auch beschreibbar. Also frage ich mich, wie soll das gehen,
wenn im Opcode nur 32 I/O-Register adressiert sind.
Was du mit Speicherzugriff meinst, verstehe ich nicht.
>Also frage ich mich, wie soll das gehen,>wenn im Opcode nur 32 I/O-Register adressiert sind.
Ganz einfach:
Es geht eben nicht.
Bei diesen Registern, bei denen diese speziellen Bit-Setz/Lösch/Test
Befehle nicht funktionieren, muss man einen kleinen Umweg über die
General-Purpose-Register machen. Also das Ggesamte IO-Register in ein
solches kopieren, dann dort die entsprechenden Operationen durchführen
und danach zurückkopieren.
Bei AtMega16:
Datenblatt Seite 21 und 331.
@ Valentin (Gast)
>I/O-Register, aber bei meinem ATmega16 habe ich 64. Ich habe im
Und nicht nur der.
>meisten sind auch beschreibbar. Also frage ich mich, wie soll das gehen,>wenn im Opcode nur 32 I/O-Register adressiert sind.
Dann muss man halt andere Befehle nutzen. Z.B.
1
in r16, TIMSK ; SFR laden
2
ori r16, 0b00101000 ; Bits setzen
3
out TIMSK,r16 ; zurückschreiben
Sieh auch Bitmanipulation
MIt sbi/cbi kann man alle Register mit Adresse 0..31 ansprechen. Mit den
in/out Befehlen kann man alle Register von 0..63 ansprechen. Einige
grosse AVRs haben sogar NOCH mehr als 64 Register. Dort muss man dann
alle mit der Adresse>63 über die Befehle sts/lds ansprechen. Und um die
Sache noch einwenig zu komplizieren, muss man dann aufpassen, dass
sts/lds mit RAM-adressen arbeiten, in/out aber mit I/O Adressen, wobei
gilt
RAM-Adresse = I/O Adresse + 0x20
Allerdings hat Atmel das schon in den Definitionsdatein ???def.inc
berücksichtigt. Also z.B wird dann auf den gröseren AVRs das Register
TIMSK5 so angesprochen
1
lds r16, TIMSK5 ; SFR laden
2
ori r16, 0b00101000 ; Bits setzen
3
sts TIMSK5,r16 ; zurückschreiben
Die Registernamen dürfen und können dann nicht mehr mit in/out Befehlen
verwendet werden.
Alle Klarheiten beseitigt? ;-)
MFg
Falk
P.S. Ist alles halbsowild.
Hallo,
mir geht es gerade genau so wie Valentin (Gast), schreibe auch gerade
das erste Programm in AVR-Assembler. Wenn man, wie ich, vom 8051 kommt,
dann empfindet man AVR-Assembler an vielen Stellen als Zumutung. Aber es
gibt auch positives zu berichten, wenn man z.B. zwei 16 bit-werte ohne
Tranferbefehl von einander abziehen kann.
Gruß Oilaf
Ich Danke auch dir Falk Brunner für die super gute Aufklärung.
Ich merke schon, dass ich richtig Englisch lernen muss, um das ganze
Verstehen zu können!