Forum: Mikrocontroller und Digitale Elektronik sbr,cbr.sbrs,sbrc


von Moni (Gast)


Lesenswert?

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?

von Benedikt (Gast)


Lesenswert?

Genau, bin anfangs auch draufrein gefallen...

von Mark Hämmerling (Gast)


Lesenswert?

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

von Lukas -. (lukas)


Lesenswert?

aber wie kann ich denn nun z.B nur das Bit nummer 4  im register 16 
(r16) setzen? ohne die anderen Bits zu beeinflussen?

von A.K. (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

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?

...

von Lukas -. (lukas)


Lesenswert?

ha, das ja cool, kannte ich noch garnicht.

danke!

von Hannes L. (hannes)


Lesenswert?

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

...

von Peter D. (peda)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

Moin, moin!
Ja, ich bin auch darauf reingefallen ...

von wakbit (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von (prx) A. K. (prx)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

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
Noch kein Account? Hier anmelden.