Ganz kurz - Die richtige Art ein Bit zu setzen

Gast #178518
So ...
Langsam blick ichs nimmer ...

Welches ist denn nun die richtige Art ein Bit eines Ports zu setzen (am
Beispiel eines atmega8).

Sagen wir ich will an PORT D, das 0te Bit auf 1 setzen .. Wie mache ich
das ..

cbi und sbi ist ja veraltet (lt. Doku), und loop_until_bit_is_set ist
glaub ich nicht das was ich suche, oder ?
Gast
ahhhhhhh... das geht also auch bei Ports so einfach ...

irgendwie ja logisch .. ich schreib ja auch nur was in ein Register wie
beim TIMSK oder TCCRx

Dank dir vielmals ...
Gast
Hi,

ich bevorzuge diese schreibweise:

DDRC |=(1<<DDRC0)
DDRC &= ~(1<DDRC0)

man sieht gleich welches BIT im Register gesetzt oder geloescht ist
z.B. :

ADCSRA |= (1<<ADEN) | (1<<ADPS2);

hier sieht man es eindeutig das nur ADEN und ADPS2 im Register ADCSRA
gesetzt werden.

man kann ich sich auch kleine makros machen, aber die C Schreibweise
kann jeder lesen.

Mfg
Dirk
Gast
Naja, und der kleine Makro, der in der avr-libc eben mitgeliefert
wird, heißt _BV().  Er macht exakt das, also _BV(0) löst auf nach
(1 << 0).
Gast
Schon, nur ich find's auch Praktischer, wenn man die "K&R"-Version
benutzt :)
Das versteht wirklich jeder C-Programmierer. Und wenn man mal Hilfe
braucht, bei dem es nicht um Hardwarespezifische Sachen geht, dann muss
der Helfende sich entweder auch bereits mit der AVR-Toolchain befassen,
oder der Hilfesuchende muss es ihm erklären.
Ich habe eine Zeitlang auch _BV verwendet, aber es nachher doch wieder
ersetzt...

Allerdings: jedem Pott seinen Deckel, soll heissen: jeder so, wie er es
mag!
Gast
Ich blicks auch nicht, kann mir jemand erklären was der Unterschied
ist:
1. TIMSK = _BV(TOIE0); //ich dachte ich setze das bit (=1)?
2. TIMSK |= _BV(TICIE1); //bit löschen (=0) ?
3. TIMSK &= _BV(TICIE1); //was passiert jetzt?

4. TIMSK = _BV(TOIE0);
ist das gleiche wie
   TIMSK = (1<<TOIE0);
???
Gast
1.) nur das Bit TOIE0 wird gesetzt -- alle anderen werden gelöscht
(effektiv ein OUT, sofern die Parameter das zulassen und Optimierung
aktiv ist)

2.) das Bit TICIE1 wird gesetzt, alle anderen bleiben unverändert
(effektiv ein SBI, sofern ... wie oben)

3.) eine wenig sinnvolle Operation; in TIMSK werden alle Bits gelöscht
außer TICIE1, das bleibt erhalten

Sinnvoller wäre:

TIMSK &= ~_BV(TICIE1);

Das TICIE1-Bit in TIMSK wird gelöscht (effektiv ein CBI, sofern...)

4.) Ja.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.