mikrocontroller.net

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


Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.Füßer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei mehreren Bits:

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

Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
genau, oder + statt |

Autor: A.Füßer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Andreas

Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: A.Füßer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.Füßer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A.Füßer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jonas (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.