Wie wird "elegant" ein BIT in Timer-Register gesetzt ?

Gast #11359
Lesenswert?

Hallo,

dummerweise funktionieren die SBI und CBI -Befehle nicht mit den 
Timer-Registern wie z.B. TCCR1B.

Jetzt möchte ich aber z.B. das BIT ICES1 setzen oder löschen. Ich habe 
es so gelöst:

in R16, TCCR1B
ori R16, 0b01000000 ; BIT setzen
out TCCR1B, R16

in R16, TCCR1B
andi R16, 0b10111111; BIT löschen
out TCCR1B, R16

so richtig übersichtlich und lesbar ist das ja nicht ... .

Besonders spannend ist es, wenn man das BIT "togglen" möchte, d.h. wenn 
es 1 ist auf 0 setzen und imgekehrt. Dazu habe ich ein Flag mitlaufen 
lassen ... So richtig "schön" ist das nicht ...

Wer hat eine Idee ?

Wie kann man es denn noch lösen ?

Gruß

UBoot-Stocki
Gast #11360
Lesenswert?

schreibe statt 0b01000000 einfach 1<<7

und statt 0b10111111 ~(1<<7) (das ~ ist c, geht das auch in asm?)

dann isses übersichtlicher.

statt der 7 kannste dann auch den Namen des bits schreiben
Gast #11361
Lesenswert?

> schreibe statt 0b01000000 einfach 1<<7
das geht noch, aber was wenn mehrere Bits gesetzt werden sollen (ich 
finds dann lang und unübersichtlich).
Ich verwende Hex.darstellung 0x01. Für die Invertierung entprechend 
~0x01.
ExklusivesOder/XOR (Assemblerbefehl "EOR") kann zum toggeln benutzt 
werden.
a = a^0x01;  toggelt/kippt das unterste Bit

André.

--
CAN@home - http://www.CANathome.de - Hausautomation mit AVR + CAN
Gast #11364
Lesenswert?

> genau, oder + statt |
Da kann aber das ganze Byte versaut werden, wenn da ein Fehler in 
einem Klammerausdruck ist. Sicherer ist "oder" - da können dann max. 
2Bit falsch sein. Und "+" dürfte auch zu mehr Code führen... (habs nicht 
ausprobiert).

André.

--
CAN@home - http://www.CANathome.de - Hausautomation mit AVR + CAN
Gast #11367
Lesenswert?

Sorri, natürlich wird der Code vom Assembler/Präprozessor verarbeitet, 
ich war falsch.

> ob + zu fehlern führt weiß ich nicht...
+ führt nicht zu Fehlern, aber wenn ich in einer Klammer einen Fehler 
mache, dann kann jedes einzelne Bit des Bytes gekippt werden. Wenn die 
einzelnen Bits unterschiedliche Funktionen haben (z.B. plötzlich anderer 
Timerteilerfaktor dadurch eingestellt ist...) dann suchst du den Fehler 
überall, nur nicht in der Klammer-"+"-Konstruktion. Mit "|" kann ein 
Bit falsch gesetzt werden, ein anderes dafür eventuell nicht gesetzt 
werden. Immernoch ärgerlich, aber mit der Chance auf geringeren 
Suchaufwand - bilde ich mir zumindest ein ;-)
Meine Absicht war nur allgemein auf den Unterschied hinzuweisen.

André.

--
CAN@home - http://www.CANathome.de - Hausautomation mit AVR + CAN
Gast #11368
Lesenswert?

Ich habe weiter oben erwähnt, daß mir die Schreibweise:
timer1b = (1<<ICNC1)|(1<<CTC1)|(1<<CS11);
nicht sonderlich zusagt. Warum setzt sich aber nicht eine solche 
Schreibweise durch?:
timer1b = (ICNC1 | CTC1 | CS11);
so ist auch sofort ersichtlich welche Bits gesetzt werden sollen. Die 
Definitionen der Bitnamen muß natürlich dafür ausgelegt sein. Gibts hier 
Nachteile/Gründe?

André.

--
CAN@home - http://www.CANathome.de - Hausautomation mit AVR + CAN
Gast #11369
Lesenswert?

ja, gibt es. so musst du nämlich jedes bit 2x deklarieren:

1 mal als maske, damit du timer1b = (ICNC1 | CTC1 | CS11) machen kannst:

#define ICNC1 0x40 (oder 0b01000000)

und dann nochmal als bitnummer, also wie's bisher ist. sonst kannste die 
bezeichnungen ja nicht in funktionen wie z.B. cbi oder sbi verwenden.
Gast #11371
Lesenswert?

Hi,

mal ne blöde Frage: "|" bedeutet oder, "+" bedeutet und, "~" bedeutet 
negieren und "^" bedeutet exor ? Ist das richtig ? Wo steht was << 
bdeutet ? Gibt es auch ein >> ???

Jetzt sinds doch 3 geworden ;-)

UBoot-Stocki

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