Mogren, Eine ganz kleine Frage zu sbr: Wenn ich sbr r16, 0x01 schreibe wird das erste Bit gesetzt. Was passiert mit den bits die davor in dem selben Register gesetzt waren? werden gelöscht? Label 1: sbrc r16,Bit3 rjmp,NixTun1: sbrs r16,Bit3 cbi PortB,0x03 Label 2: sbrs r16,Bit1 rjmp NixTun2 sbrc r16,Bit1 sbi PortB,0x03 ldi Temp1,CS12 out TCCR1B,Temp1 sbr r16,Bit2 Tim1OFISR: sbr r16, Bit3;an dieser stelle möchte dass Bit1,Bit2 gelöscht werden ldi Temp1,CS12 OUT TCCR1B, Temp1 clr Temp1
Dieter schrieb: > passiert mit den bits die davor in dem selben Register gesetzt waren? > werden [die] gelöscht? Nein, wie ein Blick ins Instruction Set oder in den Simulator verraten hätte.
>Wenn ich sbr r16, 0x01 schreibe wird das erste Bit gesetzt
Nein du schreibst 0b0000.0001 in das Register 16, also explizit Null in
die anderen Bits des Registers.
Schau dir mal den Artikel zur Bitmanipulation an ;) http://www.mikrocontroller.net/articles/Bitmanipulation
Im Instruction Set Seite 127 http://www.atmel.com/Images/doc0856.pdf
1 | sbr r16,3 ; Set bits 0 and 1 in r16 |
Rene Schube schrieb: >>Wenn ich sbr r16, 0x01 schreibe wird das erste Bit gesetzt > > Nein du schreibst 0b0000.0001 in das Register 16, also explizit Null in > die anderen Bits des Registers. Huh ? Das SBR ist nur eine andere Bezeichnung für ein ORI, da wird nix überschrieben.
Rene Schube schrieb: >>Wenn ich sbr r16, 0x01 schreibe wird das erste Bit gesetzt > > Nein du schreibst 0b0000.0001 in das Register 16, also explizit Null in > die anderen Bits des Registers. immer wieder gern genommen: http://www.youtube.com/watch?v=vNc6mIwH9lI
Dieter schrieb: > Mogren, > > Eine ganz kleine Frage zu sbr: > > Wenn ich sbr r16, 0x01 schreibe wird das erste Bit gesetzt. > ... > SBR – Set Bits in Register Diese Befehle haben mich auch schon wahnsinnig gemacht (sbr, cbr, sbi, cbi, sbrs, sbrc, sbis, sbic ). Ein kleines Detail erklärt beim Befehl SBR einiges, nämlich Set Bit ( s )in Register. Was z.B. bedeutet das sbr r16,$03 nicht Bit3, sondern Bit0 und Bit1 setzt und die anderen so läßt wie sie waren. Description: Sets specified bits in register Rd. Performs the logical ORI between the contents of register Rd and a constant mask K and places the result in the destination register Rd. Bernd_Stein
Empfehlung: SBR/CBR vermeiden und ORI/ANDI verwenden. Weshalb Atmel das so zweifelhaft definiert hat ist mir auch nicht klar. Mit einer Bitnummer, die vom Assembler in die Maske umgerechnet worden wäre, hätten diese Aliase einen Sinn ergeben. So wie sie definiert sind dienen sie nur zur Verwirrung.
Bernd Stein schrieb: > Diese Befehle haben mich auch schon wahnsinnig gemacht Der gesamte Befehlssatz der AVRs treibt mich auf Grund der teilweise nicht vorhandenen Logik öfters in Richtung Wahnsinn, vor allem, wenn man von den 8051ern kommt. Der ist darauf ausgelegt, die Entwickler zu Hochsprachen zu nötigen. Thomas
Hi >Der gesamte Befehlssatz der AVRs treibt mich auf Grund der teilweise >nicht vorhandenen Logik öfters in Richtung Wahnsinn, vor allem, wenn man >von den 8051ern kommt. Warum? MfG Spess
Thomas P. schrieb: > Der ist darauf ausgelegt, die Entwickler zu > Hochsprachen zu nötigen. Nein. Dann hätte man die Aliasnamen SBR, CBR, CLR und dergleichen auch gleich ganz weglassen können. Ein Compiler hat keine Bauchschmerzen oder Dokumentationsprobleme damit, ein Bit mit dem Befehl ORI zu setzen oder ein Register mit XOR rd,rd zu löschen. Der Mischmasch zwischen Bitnummern und Bitmasken ist dagegen in der Tat Mist, auch und gerade aus Sicht der Hochsprache. Es wäre viel einfacher gewesen, die Bits alle als Masken zu definieren (also PB0 als 0x01 statt als 0, PB1 als 0x02 statt 1 usw.), denn das ist das, was man in C ohnehin benutzen muss. Für ein "SBI PORTB, PB0" hätte der Assembler ja problemlos die Bitmaske in die für den Opcode notwendige Bitnummer umrechnen können und sich ggf. dann beschweren, wenn im Operanden etwas anders steht als eine Zahl, die genau ein Bit gesetzt hat. Ist aber nun leider zu spät.
Es gibt noch andere Pseudo-Befehle. Wenn man sich mal die Opcodes der ganzen bedingten Sprünge (BRCC, BRSH, ... BRIE) anschaut, stellt man fest, dass das Variationen von BRBC und BRBS sind. Ich denke, das hat Marketing-Gründe. "133 Powerful Instructions" klingt halt toll. Ich schlag vor, diesen Thread zu löschen, da er mehrfach falsche Informationen enthält und den völligen Neuling, der ihn vielleicht in google findet, mehr verwirrt als hilft.
Philipp Klostermann schrieb: > Ich denke, das hat Marketing-Gründe. "133 Powerful Instructions" klingt > halt toll. Wobei Microchip bei den 8-Bit PICs die Anzahl der Befehle extra runterrechnet, um mit möglichst wenig Befehlen werben 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.