mal ne kleine Rückfrage zur Absicherung. Ich hatte heute beim Proggen mit den oben genannten Befehlen zu tun und hatte prompt Probleme. Ich versuchte ein einzelnes Bit in einem Register zu setzen, um es dann als Sprungbedingung zu verwenden. Natürlich habe ich beim Setzen die Bitstelle angegeben, was natürlich falsch war. Es sieht so aus, als ob man da die Wertigkeit des Bits angibt, aber bei sbrs und sbrc wieder die Bitstelle. Hab ich das jetzt geschnallt? Und warum diese Verwirrung?
Salut, die Verwirrung haben die Ingenieure bei Atmel sicher nicht absichtlich eingebaut. Fakt ist, daß man mit sbr/cbr ganze Bitmasken verwenden kann, also gleichzeitig mehrere Bits setzen/löschen kann - eine Angabe der Wertigkeit kommt da also nicht in Frage. Hingegen testen die Befehle sbrs/sbrc nur auf ein bestimmtes Bit - nehmen daher die Wertigkeit eben dieses Bits als Argument. Viel verwirrender fand ich persönlich aber immer den Unterschied bei sbr/cbr und sbi/cbi. Letztere nehmen nämlich auch nur eine Wertigkeit als Argument, da man bei I/O-Ports mittels dieser Befehle nur ein einzelnes Bit setzen/löschen kann - und das obwohl sie namentlich mit sbr/cbr eng verwandt sind. Ich erinnere mich aber, daß irgendwo in den Datenblättern bzw. in der Opcode-Liste ein expliziter Hinweis diesbezüglich gestanden hat. Aber mach Dir nix draus, da sind schon viele drüber gestolpert. :) Du hast es ja auch schon verstanden. Gruß, Mark
aber wie kann ich denn nun z.B nur das Bit nummer 4 im register 16 (r16) setzen? ohne die anderen Bits zu beeinflussen?
Die Befehle SBR/CBR sind nur andere Bezeichnungen für die (hoffentlich) wohlbekannten Befehle ANDI/ORI. Ich pflege die Namen SBR/CBR nicht zu verwenden, sie sorgen nur für Verwirrung.
Lukas Ho wrote: > aber wie kann ich denn nun z.B nur das Bit nummer 4 im register 16 > (r16) setzen? ohne die anderen Bits zu beeinflussen? sbr r16,1<<4 Wenn r16 zuvor einen sinnvollen Namen bekommen haben sollte: .def statusflags=r16 und Bit Nummer 4 z.B. ein Flag für "aktiv" sein soll: .equ aktiv=4 dann kann man das Flag setzen mit: sbr statusflags,1<<aktiv löschen mit: cbr statusflags,1<<aktiv und überprüfen mit: sbrs statusflags,aktiv oder sbrc statusflags,aktiv Alles kloar? ...
Lukas Ho wrote: > ha, das ja cool, kannte ich noch garnicht. > > danke! Nix zu danken... Und somit kannst Du auch in ASM "sprechenden Code" schreiben... ...
Mark Hämmerling wrote: > Ich erinnere mich aber, daß irgendwo in den Datenblättern bzw. in der > Opcode-Liste ein expliziter Hinweis diesbezüglich gestanden hat. Ja, steht in jedem Include am Anfang als Kommentar drin. Peter
sbr,sbc wo fangt der bitname an bei 0 oder bei 1? Guten Tag wenn ich z.B. mit sbr das bit1 setzen will was mache ich da? ;bit 76543210 .equ temp = r16 .equ bit0 = 0b00000001 ; MSB - LSB .equ bit1 = 0b00000010 ; .equ bmask_0 = 0 .equ bmask_1 = 1 bit_reinschreiben: sbr temp,bit1 ;bit1=1 sbr temp,bit0 ;bit0=1 ich will die einzeln setzen und nicht zugleich ;Stimmt das nun so? oder ist das bit0 das bit1? bit_abfragen: sbrc temp,bmask_0 ;spring wenn bit0=0 rjmp end_frage sbrc temp,bmask_1 ;spring wenn bit1=0 end_frage: ;usw.... Danke weaktbit
Umgedreht wird ein Schuh draus... Die Bitnummern gehen von 0 bis 7, die Bitmasken von 0 (kein Bit gesetzt) bis 255 (alle Bits gesetzt). Selbstverständlich kannst Du die Bitmasken (Wertigkeiten der Bitnummern) vordefinieren und Dir damit die (für den Neuling ungewohnte) an C angelehnte Notation (1<<x) ersparen. Doch Du verschenkst dadurch die Möglichkeit, das Bit bei allen Operationen und Vergleichen mit einunddemselben Namen ansprechen zu können. ...
Man tut sich m.E. mit den SBR/CBR Befehlen keinen Gefallen und Atmel hätte diesen Unfug besser sein gelassen, jedenfalls in dieser Form. Verwendet man explizit die tatsächlich vom Assembler dafür codierten ANDI und ORI Befehle, dann gerät man erst gar nicht nicht in Versuchung, Bitnummern zu verwenden.
Es geht doch nicht darum, ob man ANDI oder SBR, sowie ORI oder CBR (mit invertiertem Wert) benutzt, sondern dass man für das Manipulieren (ANDI, ORI) und das bedingte Verzweigen (SBRC, SBRS) *dieselben Bitnamen* benutzen kann obwohl das Manipulieren die Bitmaske verlangt, das Verzweigen aber die Bitnummer. ...
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.