Forum: Mikrocontroller und Digitale Elektronik AVR, Assemblerbefehle


von Valentin (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Marvin M. (Gast)


Lesenswert?

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.

von Valentin (Gast)


Lesenswert?

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.

von M. V. (-_-)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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

von Valentin (Gast)


Lesenswert?

Danke Jemand

Jetzt verstehe ich das alles besser.

MfG

von Oilaf (Gast)


Lesenswert?

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

von Valentin (Gast)


Lesenswert?

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!

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.