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