Forum: Mikrocontroller und Digitale Elektronik Wie wird "elegant" ein BIT in Timer-Register gesetzt ?


von UBoot-Stocki (Gast)


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

von Jonas (Gast)


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

von A.Füßer (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Bei mehreren Bits:

sbr r16, (1<<BITBLA)|(1<<ABCD)

von Jonas (Gast)


Lesenswert?

genau, oder + statt |

von A.Füßer (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Stop: zu mehr Code führt hier gar nichts. Die Berechnung wird ganz 
alleine vom Assembler durchgeführt, nicht im AVR.

Andreas

von Jonas (Gast)


Lesenswert?

genau...

ob + zu fehlern führt weiß ich nicht... höchstens dass was überläuft, 
aber auch nur, wenn sowieso schon ein fehler gemacht wurde...

von A.Füßer (Gast)


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

von A.Füßer (Gast)


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

von Jonas (Gast)


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.

von A.Füßer (Gast)


Lesenswert?

danke für die Erklärung. Wenn man die Konstruktion "(1<<   )" im 
geistigen Auge ausblendet, dann isses gar nicht so schlimm. :-)


André.

--
CAN@home - http://www.CANathome.de - Hausautomation mit AVR + CAN

von UBoot-Stocki (Gast)


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

von Jonas (Gast)


Lesenswert?

nein.
| oder
& und
^ xor
~ einerkomplement (= bitweises negieren)
<< bitweises linksschieben (d.h. aus 0b00010100 wird 0b00101000)
>> rechtsschieben
+ addieren (wie im matheunterricht).

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.