mikrocontroller.net

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


Autor: Moni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau, bin anfangs auch draufrein gefallen...

Autor: Mark Hämmerling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lukas -- (lukas)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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?

...

Autor: Lukas -- (lukas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ha, das ja cool, kannte ich noch garnicht.

danke!

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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...

...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin, moin!
Ja, ich bin auch darauf reingefallen ...

Autor: wakbit (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.