Forum: Mikrocontroller und Digitale Elektronik verändern von Bits


von Stevko (Gast)


Lesenswert?

Ein Hallo

an alle Mitstreiter in diesem Forum. Auch wenn die Frage simpel
erscheint bitte ich Euch mir mal kurz zu helfen, da meine Unterlagen zu
Hause sind.
Folgendes Problem:
In einem Register(nicht I/O) z.B. R16 muß ich in der Bitfolge ein
einzelnes Bit setzen(Bit3 soll "1" sein). Alle anderen dürfen nicht
verändert werden. Natürlich wird dieses später im Programm wieder
gelöscht, also das gleiche Problem nochmal. In diesem Byte sind die
Statusbits von meinem Programm enthalten.
Fragen:
*Gibt es dafür ein Befehl wie SBI oder muß ich eine zweite Bitmaske
addieren.
*Könnte ich den Statusbits Namen verpassen(z.B. Time_Flag_1) um die
Sache zu vereinfachen?

Gruß Stevko

von OldBug (Gast)


Lesenswert?

Hi!

Welcher Prozessor?

von obiwan (Gast)


Lesenswert?

Hi Stevco
Für das verändern von Bits innerhalb von Registern gibts wie bei den
Ports auch 2 befehle.
Register setzen ,  SBR rh,k255
Register löschen,  CBR rh,k255

Das funktioniert nur mit den Registern 16-31 (rh)
k255 steht für die Bitmaske. Jedes bit , das in der Maske gesetzt ist
wird entsprechend des Befehls gesetzt bzw. gelöscht.
Du kannst den Bits auch Namen geben.

.equ Time_Flag_1=0b00000001 wäre dann Bit 0
SBR flags,time_flag_1   würde dann Bit 0 setzen

aber achtung. Wenn du aufgrund der bits springen willst, zB. mit
SBRC flags,... kannst du den Namen nicht verwenden , da man da explizit
das Bit angeben muss und keine maske. Würde also heissen:
SBRC flags,0

von Stevko (Gast)


Lesenswert?

Hallo OldBug

ich habe einen ATMega32 mit 8MHz. Wäre es möglich die Statusbits zu
benennen? Das Byte ist aber im SRAM abgelegt, muß ich erst mit lds ins
R16 laden. Gibt es eine bessere Lösung?

Gruß Stevko

von obiwan (Gast)


Lesenswert?

ach so , ja . Die befehle gibts zumindest bei den Atmel at90s1200 und
90s2313

von Peter D. (peda)


Lesenswert?

"Das Byte ist aber im SRAM abgelegt, muß ich erst mit lds ins
R16 laden."

Im SRAM kann nichts gemacht werden. Du mußt also immer erst ein
Register laden und auch wieder abspeichern.


"Gibt es eine bessere Lösung?"

In Assembler kannst Du Dir doch Register für bestimmte Sachen
reservieren.

Eine andere Möglichkeit sind nicht benutzte IOs, z.B. wenn du den
EEPROM nicht brauchst, kannst Du EEDR und EEAR nehmen.


Peter

von Stevko (Gast)


Lesenswert?

Vielen Dank für die schnelle Hilfe!

obiwan:
Die Befehle gibt es auch im ATMega32. Hatte in der falschen Rubrik
gesucht.

peter:
Im EEPROM liegen später mal meine Sterndaten, als das wird wohl nix
werden.

schönen Tag noch
   Stevko

von thkais (Gast)


Lesenswert?

"Wäre es möglich die Statusbits zu benennen?"

Jep, z.B. so:

.equ Status_1 = 3
.equ Status_2 = 7

SBR R16,(1<<Status_1|1<<Status_2)

CBR R16,(1<<Status_1)

von ...HanneS... (Gast)


Lesenswert?

Hi...

Zurück zur Frage. Du wolltest einzelne Bits im Register setzen/löschen,
ohne die anderen zu beeinflussen. Dazu fällt mir erstmal SBR/CBR ein
(oder ANDI/ORI). Das geht, wie oben schon erwähnt nur in den obreren
Registern.

Wenn du den Bits (nenne die aber bitte nicht "Statusbits", denn da
denkt man schmell an die Flags im Statusregister) eigene Namen geben
willst, dann weist du den Namen die Bitnummer (0...7) zu.

Zum Setzen/Löschen brauchst du aber die Maske (0...255), dies erreichst
du durch Linksschieben einer 1 um den Wert des Bits.

Beispiel:

.equ deinbit=3            ;Bit 3 heißt nun "deinbit"
...
sbr r16,1<<deinbit        ;Bit 3 (Maske=8) wird in R16 gesetzt
...
sbrs r16,deinbit          ;hupft wenn Bit 3 gesetzt ist
...
cbr r16,1<<deinbit        ;Bit 3 (Maske=8) wird gelöscht

Ich hoffe, das hilft dir weiter...

Bit- & Bytebruch...
...HanneS...

von ...HanneS... (Gast)


Lesenswert?

Da war Thkais schneller... ;-))

von Stevko (Gast)


Lesenswert?

Vielen Dank noch mal an alle Helfer. Habe das Problemchen wie folgt
gelöst:

.equ OT_Time_Flag_Reg = $84 ;Flagregister für die Ortszeit
.equ OT_New_Time_Flag = 0   ;Neue Ortszeit von Timer

...laber, laber

lds r16,OT_Time_Flag_Reg
sbr r16,1<<OT_New_Time_Flag
sts OT_Time_Flag_Reg, R16

Jetzt kommt aber noch ein Problem mit der Sternzeit, da ein Sterntag
ca. 4min kürzer ist.
Eröffnet man für die Frage einen neuen Thread oder bleibt man im
alten?

Gruß Stevko

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.