Forum: Compiler & IDEs Mit #defne zwei Bits setzen


von Wolfgang (Gast)


Lesenswert?

Hallo,

ich habe eine kleine Frage zum #define.
Man kann ja mit #define den Pins "neue" Namen geben, damit man nicht den 
Überblick verliert.
Z.B. bei 3 LEDs

#define LED1 PD3
#define LED2 PD4
#define LED3 PD5

Nun würde ich gerne zwei Pins zusammen nehmen
Z.B.

#define LED12 PD3 PD4

Somit bräuchte ich um beide LEDs auf High zu setzen nur

PORTD |= (1 << LED12)

zu schreiben anstatt

PORTD |= (1 << LED1)
PORTD |= (1 << LED2)

Nun meine Frage:
Ist das überhaupt möglich?
Und wenn ja, wie lautet der korrekte Befehl dafür?

#define LED12 PD3 PD4

funktioniert natürlch irgendwie nicht. :)

: Verschoben durch User
von holger (Gast)


Lesenswert?

#define LED12 (1<<PD3)+(1<<PD4)

von Bitflüsterer (Gast)


Lesenswert?

Natürlich nicht. Aber was ist der Grund dafür?
Schau mal in Dein C Buch unter "Ausdrücke".

von Daniel (Gast)


Lesenswert?

#define LEDS_PINS ( (1 << PD3) | (1 << PD4) )
#define SW_LEDS_ON() ( PORTD |= LED_PINS )

so mach ich es immer...

von Karl H. (kbuchegg)


Lesenswert?

Wolfgang schrieb:

> zu schreiben anstatt
>
> PORTD |= (1 << LED1)
> PORTD |= (1 << LED2)

Hö, hö, hö. Immer langsam mit den jungen Pferden

Um 2 LED in einer Anweisung gemeinsam zu setzen, schreibst du das ja 
nicht so, sonder so
1
  PORTD |= (1 << LED1) | (1<<LED2);

also brauchst du einen Textersatz für
1
  .... (1 << LED1) | (1 << LED2) ...

und genau den machst du dir


Ein #define ersetzt einfach nur einen Text durch einen anderen Text. 
Wenn du also wissen willst, wie das Makro auszusehen hat, überlegst du 
dir einfach, wie das Endergebnis ohne Makro aussehen würde, suchst dir 
davon dann den Teil aus, den du per Makro in der SChreibweise 
vereinfachen willst und machst dir das entsprechende #define dafür.

von Wolfgang (Gast)


Lesenswert?

Karl Heinz schrieb:
> Um 2 LED in einer Anweisung gemeinsam zu setzen, schreibst du das ja
> nicht so, sonder so

Stimmt, da hast du recht, das habe ich falsch, bzw. unschön gemacht. :)

Also schreibe ich einfach nur

#define LED12 ( 1 << PD3 ) | ( 1 << PD4 )

von Til H. (turakar)


Lesenswert?

Ja.

von Lutz M. (themroc)


Lesenswert?

Wolfgang schrieb:
> Karl Heinz schrieb:
>> Um 2 LED in einer Anweisung gemeinsam zu setzen, schreibst du das ja
>> nicht so, sonder so
>
> Stimmt, da hast du recht, das habe ich falsch, bzw. unschön gemacht. :)
>
> Also schreibe ich einfach nur
>
> #define LED12 ( 1 << PD3 ) | ( 1 << PD4 )

Besser:

#define LED12 ( ( 1 << PD3 ) | ( 1 << PD4 ) )

Kostet nix und erspart u.U. ne Menge Stress.

von gnagflow (Gast)


Lesenswert?

Wolfgang schrieb:
> #define LED1 PD3
> #define LED2 PD4
> #define LED3 PD5

Sorry, diese Atmel Seuche "<<" muss mir Einer erklären. ;-P

Ein #define dient der besseren Lesbarkeit. Warum werden dann die 
Portpins nicht gleich richtig umschrieben:
1
#define PD_0   0x01
2
#define PD_1   0x02
3
#define PD_2   0x04
4
#define PD_3   0x08
Das macht man nur ein einziges Mal und hat für immer Ruhe!

Das angefragte Beispiel sieht dann so aus:
1
#define LED1    PD_3
2
#define LED2    PD_4
3
#define LED1_2  (LED1 | LED2)
4
5
PORTD |= LED1 | LED2;
6
PORTD |= LED1_2;
Das ist gut lesbar!

von Karl H. (kbuchegg)


Lesenswert?

gnagflow schrieb:

> Sorry, diese Atmel Seuche "<<" muss mir Einer erklären. ;-P

Weil es trivial ist, aus der Bitnummer eine entsprechende Maske zu 
generieren.
Aber die Umkehrung ist nicht so trivial. Braucht man die Bitnummer (aus 
welchem Grund auch immer), dann hat man anders rum ein Problem

Aber ich geb dir recht. Man hätte in den Header Files neben den #defines 
für die Bitnummern auch #defines für fertige Masken mit aufnehmen 
können.

von Rolf Magnus (Gast)


Lesenswert?

Karl Heinz schrieb:
> Braucht man die Bitnummer (aus welchem Grund auch immer), dann hat man
> anders rum ein Problem

Die AVR-Header sind meines Wissens so ausgelegt, daß sie auch mit 
Assembler+Preprocessor funktionieren. Dort braucht man aber tatsächlich 
öfters mal die Bitnummern.

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.