Forum: Mikrocontroller und Digitale Elektronik Toggle Bit in Register


von Julien M. (Gast)


Lesenswert?

Hi,

für eine Statusabfrage möchte ich folgendes realisieren.

bei jedem Aufruf des Programms soll ein Bit0 im Register (status)
seinen Wert ändern.

d.h.

1. Programmaufruf: 0x00000000
2. Programmaufruf: 0x00000001
3. Programmaufruf: 0x00000000

...

Eigentlich recht simpel, leider konnte ich keinen passenden Befehl
finden und auch die Suche ergab keine Treffer.

Software: Assembler
Hardware: ATmega8515

Gruß Julien

von Benedikt (Gast)


Lesenswert?

temp ist ein beliebiges Register, togglebit das zu toggelnde:

ldi temp, 1
eor togglebit, temp

von Julien M. (Gast)


Lesenswert?

hi,

jo hast recht, es ist so einfach wenn man darauf kommt. :)
Danke es funktioniert.

von Santa Klaus (Gast)


Lesenswert?

Und wenn Du Dich fragst, ob es vielleicht auch ohne
"temp"-Hilfsregister geht: Ja, und zwar so:

inc  togglebit
andi togglebit, 1


Aber geht es auch ohne "temp" und ohne "1"-Konstante? Wieder ja!
Auch so kannst Du immer zwischen 0 und 1 hin- und herschalten:

dec  togglebit
neg  togglebit


Zwischen den beiden obigen Sequenzen gibt es jedoch einen theoretischen
Unterschied.  Falls togglebit bei Eintritt in die dec-neg-Sequenz weder
den Wert 0 noch den Wert 1 hat, dann hat es am Schluß einen Wert, der
ebenfalls weder 0 noch 1 ist (Beispiel: bei 73 rein kommt -72 raus).
Die dec-neg-Sequenz verhält sich also "Garbage-In-Garbage-Out"-mäßig.
 Die inc-andi-Sequenz ist dagegen "gutmütig": Am Ende steht in
togglebit stets entweder 0 oder 1, auch wenn togglebit vorher gleich 29
war.

von Julien M. (Gast)


Lesenswert?

Allerdings stellt sich mir die Frage, ob all die lösungen noch
funktionieren wenn die restlichen Bits dieses Status-Registers auch
schon einen Wert angenommen haben.

Bsp. Statusregister

0x01001101

Bit 0 soll hierbei das Togglebit sein.
Hinweis: Die Bits 1-7 können durch andere Unterprogramme gesetzt bzw.
gelöscht werden. Ich denke man benötigt dafür eine Art Maske, die man
über dieses Register legt.

Gruß Julien

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was haltet Ihr vom XOR?

von TravelRec. (Gast)


Lesenswert?

Die EOR BitX Variante funktioniert auch dann. Wenn Du ein anderes Bit
als Bit 0 oder mehrere toggeln willst, machst Du hinter dem EOR für
jedes zu toggelnde Bit eine 1 in die Bitmaske, also

EOR 0b00100011

es toggeln Bit 0, 1 und 5.

von Santa Klaus (Gast)


Lesenswert?

>Allerdings stellt sich mir die Frage, ob all die lösungen noch
>funktionieren wenn die restlichen Bits dieses Status-Registers auch
>schon einen Wert angenommen haben.

Die Frage habe ich eigentlich schon beantwortet: Nein, in diesem Fall
funktionieren meine Lösungen nicht. Für die Anforderung "ein oder
mehrere Bits sollen togglen und die restlichen sollen unverändert
bleiben" gibt es nur eine "elegante" Lösung, und das ist die
EOR-Variante (siehe Beitrag von TravelRec).

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.