Mit #defne zwei Bits setzen

Gast #3522523
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. :)
#3522539
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.
#3522618
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.
Gast #3522728
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!
#3522814
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren