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
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
> 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
Bei mehreren Bits: sbr r16, (1<<BITBLA)|(1<<ABCD)
> 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
Stop: zu mehr Code führt hier gar nichts. Die Berechnung wird ganz alleine vom Assembler durchgeführt, nicht im AVR. Andreas
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...
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
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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.