www.mikrocontroller.net

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


Autor: Somnatic (Gast)
Datum:

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

Autor: Alex (Gast)
Datum:

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

Autor: Somnatic (Gast)
Datum:

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

Autor: Dirk (Gast)
Datum:

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

Autor: Jörg Wunsch (Gast)
Datum:

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

Autor: OldBug (Gast)
Datum:

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

Autor: Ospar Lastoren (Gast)
Datum:

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

Autor: Jörg Wunsch (Gast)
Datum:

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

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.