Forum: Mikrocontroller und Digitale Elektronik Löschen von Bits mit ODER_GLEICH


von Set_reset (Gast)


Lesenswert?

Aus den Defines im Header File:

#define MC__UP   (1*0x10u)

#define MC__STOP (0*0x10u)


Der Programmcode:

TA0CTL  |= MC__UP;    // starten

TA0CTL  |= MC__STOP;  // stoppen


Frage:
Kann der Timer durch den "Oder-Gleich" Befehl MC__STOP gelöscht werden, 
wenn die Bits aufgrund eines vorhergehenden "MC__UP vorher gesetzt 
waren?

mfg

von Karl H. (kbuchegg)


Lesenswert?

Set_reset schrieb:

> Kann der Timer durch den "Oder-Gleich" Befehl MC__STOP gelöscht werden,
> wenn die Bits aufgrund eines vorhergehenden "MC__UP vorher gesetzt
> waren?

Nein.
Mit Oder kann man Bits nur auf 1 bringen, aber nicht wieder zurück auf 
0.
Das folgt schon aus der Logiktabelle der Oder-Operation

   Bit    Maske    Ergebnis (Bit | Maske)
    0       0          0
    0       1          1
    1       0          1
    1       1          1

Nur wenn das Bit schon 0 war und in der Maske auch ein 0 Bit vorliegt, 
nur dann ist auch das Ergebnis 0. In allen anderen Fällen, insbesondere 
in denen bei Bit bereits eine 1 vorliegt, ist das Ergebnis auf jeden 
Fall eine satte 1. In ordentlicher deutscher Sprache: Wenn das Bit 
bereits auf 1 ist, dann kannst du dich mit deiner Oder Operation brausen 
gehen, du bringst es nie wieder auf 0. Denn in der Operation 'Das 
Ergebnis ist dann 1, wenn entweder A ODER B ODER beide auf 1 sind' ist A 
ja schon auf 1. Und damit KANN das Ergebnis nur noch 1 sein, wenn A 
bereits auf 1 liegt. Und es spielt dann auch keine Rolle mehr, ob B auf 
1 oder auf 0 ist.


Bitmanipulation

von dr.prof.schlau (Gast)


Lesenswert?

Dafür bräuchtest du ein 'AND'
Gruß
Michael

von dr.prof.schlau (Gast)


Lesenswert?

Karl Heinz war mal wieder schneller... :-)

von Set_reset (Gast)


Lesenswert?

... gut, das bestätigt meine Vermutung, warum es in meinem Programm 
einfach nicht richtig funktioniert...

Das heiist also:

Starten mit

TA0CTL  |= MC__UP;    // starten



Beenden mit

TA0CTL &=~ MC_UP;

von troll (Gast)


Lesenswert?

Aber Vorsicht: Es gibt beim AVR und vielleicht wo anders IIRC Bits 
(irgendwelche Interruptflags glaube ich) die durch Schreiben einer 1 
gelöscht werden! Was Karl-Heinz schrieb ist natürlich vollkommen 
richtig, aber es gibt halt diesen Spezialfall wo die Hardware das Bit 
löscht wenn es mit 1 geschrieben wird (warum Atmel das auch immer so 
gemacht hat).

von Garden (Gast)


Lesenswert?

Guck mal,
hier gibt es ein Video dazu:

http://et-tutorials.de/1908/bitweise-manipulation/

von c-hater (Gast)


Lesenswert?

troll schrieb:

> Aber Vorsicht: Es gibt beim AVR und vielleicht wo anders IIRC Bits
> (irgendwelche Interruptflags glaube ich) die durch Schreiben einer 1
> gelöscht werden!

Richtig. Das sind sog. "Strobe-Bits". Und es gibt sie ganz sicher nicht 
nur bei Atmel.

> warum Atmel das auch immer so
> gemacht hat.

Aus denselben Gründen wie alle anderen auch. Kohärenz und Performance.

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.