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
Natürlich nicht. Aber was ist der Grund dafür? Schau mal in Dein C Buch unter "Ausdrücke".
#define LEDS_PINS ( (1 << PD3) | (1 << PD4) ) #define SW_LEDS_ON() ( PORTD |= LED_PINS ) so mach ich es immer...
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.
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 )
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.
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!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.