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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.