Forum: Compiler & IDEs Ganz kurz - Die richtige Art ein Bit zu setzen


von Somnatic (Gast)


Lesenswert?

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 ?

von Alex (Gast)


Lesenswert?

PORTD |= _BV(0);   //kannst statt 0 auch PD0 schreiben

Wenn du es löschen willst:

PORTD &= ~_BV(0);

Im Wiki müsste sich sowas auch finden lassen oder vielleicht auch hier:

http://mc-project.de/Pages/AVR/avrgcc/programmierung.html

von Somnatic (Gast)


Lesenswert?

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 ...

von Dirk (Gast)


Lesenswert?

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

von Jörg Wunsch (Gast)


Lesenswert?

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).

von OldBug (Gast)


Lesenswert?

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!

von Ospar Lastoren (Gast)


Lesenswert?

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);
???

von Jörg Wunsch (Gast)


Lesenswert?

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.

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.