Forum: Mikrocontroller und Digitale Elektronik Bitmanipulation: Schreibfehler oder Möglichkeit?


von Stephan (Gast)


Lesenswert?

Hallo!

Ich bin im Tutorial über Bitmanipulation auf eine Zeile gestoßen, dessen 
Syntax ich nicht nachvollziehen kann. Ich hielte es für einen 
Schreibfehler- habe aber das Gefühl die schon mal gesehen zu haben.

Am Beispiel der Timereinstellung:


Dieser Code ist nachvollziehbar:
   TCCR2B |= (1 << CS21) | (1 << CS21);  //Prescaler 256

Dieser (ohne ODER-Verknüpfung) nicht...
   TCCR2A = (1 << WGM21);                //CTC Modus

...da es in der nächsten Zeile wieder nach alter Manier heißt
   ASSR |= (1 << AS2);                   //Asynchron Mode einschalten

von Walter T. (nicolas)


Lesenswert?

Stephan schrieb:
> TCCR2A = (1 << WGM21);                //CTC Modus

Es wird einfach nichts verodert, sondern die alte Konfiguration komplett 
überschrieben.

von Stephan (Gast)


Lesenswert?

Walter Tarpan schrieb:
> Es wird einfach nichts verodert, sondern die alte Konfiguration komplett
> überschrieben.

Sprich- wenn man nur ein Bit setzen will und der Rest null werden soll, 
macht man das so?

von Karl H. (kbuchegg)


Lesenswert?

wenn du willst, dass i den Wert 5 hast, schreibst du
1
  i = 5;

nichts von den vorher in i gesetzten Bits überlebt diese Zuweisung.

von Walter T. (nicolas)


Lesenswert?

Genau. Es wird WGM21 gesetzt und der Rest gelöscht. Ob das Absicht, 
Versehen oder einfach nur egal ist weiß nur der Autor des Quelltextes 
(meist ist es das letztere).

von Stephan (Gast)


Lesenswert?

Knut, weiß Bescheid, danke!

von Walter T. (nicolas)


Lesenswert?

Stephan schrieb:
> Sprich- wenn man nur ein Bit setzen will und der Rest null werden soll,
> macht man das so?

Genau. Es wird WGM21 gesetzt und der Rest gelöscht. Ob das Absicht, 
Versehen oder einfach nur egal ist weiß nur der Autor des Quelltextes 
(meist ist es das letztere).

Edit: Und Karl-Heinz ist mir mal wieder zuvorgekommen. Ich finde es 
immer wieder bewundernswert, wieviel Zeit und Energie Du in 
Anfängerfragen stecken kannst.

von Stephan (Gast)


Lesenswert?

Walter Tarpan schrieb:
> Anfängerfragen

Fühle mir geschmeichelt

von Walter T. (nicolas)


Lesenswert?

Stephan schrieb:
> Fühle mir geschmeichelt

Eigentlich war die Anerkennung ja an KHB gerichtet. Und auch weniger 
wegen der (über jeden Zweifel erhabenen) Fachkenntnisse sondern wegen 
der Geduld. Was ich in den letzten Wochen da geleseh habe - in über mehr 
als 100 Postings einen Arduino-Programmer in Betrieb genommen, in einem 
seitenlangen Thread ein Grafik-LCD initialisiert oder auch nur ein 
"putc" wieder in einen funktionierenden Ausgangszustand 
zurückzuversetzen - ist fast übermenschlich zu nennen.

von Ulrich (Gast)


Lesenswert?

Die normale Form zur Initialisierung ist die mit dem =.

Die Form mit dem |= kann man nutzen wenn einige Bis erhalten bleiben 
sollen oder man weiss was vorher im Register steht. Beliebt ist die 
Schreibweise beim AVR, weil sie ggf. etwas schneller geht, wenn nur 1 
oder 2 Bits gesetzt werden.

von Walter T. (nicolas)


Lesenswert?

1
  TCCR1B  = (0<<ICNC1)|(0<<ICES1)|(1<<WGM13)|(1<<WGM12)|(0<<CS12)|(1<<CS11)|(0<<CS10);
2
    3bd6:  8a e1         ldi  r24, 0x1A  ; 26
3
    3bd8:  80 93 81 00   sts  0x0081, r24

Ich wüßte nicht, wie man das durch SBIs beschleunigen könnte.

von Stephan (Gast)


Lesenswert?

Walter Tarpan schrieb:
> Eigentlich war die Anerkennung ja an KHB gerichtet.

Da ist sie auch hingegangen.

Walter Tarpan schrieb:
> Anfängerfragen

Nur das hat mich Gebauchpinselt.

von cybmorg (Gast)


Lesenswert?

Stephan schrieb:
> Nur das hat mich Gebauchpinselt.

Warum?

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.