Löschen von Bits mit ODER_GLEICH

Gast #3137453
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
#3137457
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
Gast #3137462
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;
Gast #3137480
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).
Gast #3137808
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren