mikrocontroller.net

Forum: Compiler & IDEs nested #if makro


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: nest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie macht man sowas hier richtig?
#define LED_SET_ON(PRT,PIN,INV)\
  #if(INV == 0)\
    PORT##PRT |= (1<<PIN)\
  #else\
    PORT##PRT &=~(1<<PIN)

#define LED_SET_OFF(PRT,PIN,INV)\
  #if(INV == 1)\
    PORT##PRT |= (1<<PIN)\
  #else\
    PORT##PRT &=~(1<<PIN)

Im code bzw. in weiteren makros will ich es so nutzen:
LED_SET_ON(D,5,1);  // PD5 low  -> LED an
LED_SET_ON(D,6,0);  // PD6 high -> LED an
(...)
LED_SET_OFF(D,5,1); // PD5 high -> LED aus
LED_SET_OFF(D,6,0); // PD6 low  -> LED aus

Die LED-Markos sind noch falsch definiert, sodass der Compiler einen 
Fehler wirft:
myfile.c:203:31: error: '#' is not followed by a macro parameter
daher werden die Markos auch im code als Funktionen mit Parametern 
interpretiert:
LED_SET_OFF(D,5,1)
myfile.c:223:16: error: 'D' undeclared (first use in this function)

Autor: nest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stromlauf, falls man es sich nicht schon aus dem Code-Beispiel herleiten 
kann:
uC
 ........
 .      .    LED1
 .  PD5 o-----|<|--R---Vcc
 .      .
 .      .
 .      .    LED2
 .  PD6 o-----|>|--R---GND
 .      .
 ........

Autor: nest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok ... hab es doch selbst gefunden:
#define LED_SET_ON( PRT,PIN,INV) ((INV)==0)?(PORT##PRT|=(1<<PIN)):(PORT##PRT&=~(1<<PIN))
#define LED_SET_OFF(PRT,PIN,INV) ((INV)!=0)?(PORT##PRT|=(1<<PIN)):(PORT##PRT&=~(1<<PIN))

Autor: Keiner N. (nichtgast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum brauchst du zwei Makros, die eigentlich das gleiche tun?

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man meint, das zu brauchen, könnte man auch einfach schreiben:
#define LED_SET_OFF(PRT,PIN,INV) LED_SET_ON(PRT, PIN, !(INV))

Autor: Peter D. (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nest schrieb:
> wie macht man sowas hier richtig?

#if Statements sind so nicht anwendbar. Sie wirken zum Zeitpunkt der 
Makrodefinition, nicht bei der Verwendung des Makros.

Autor: Eric B. (beric)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define DEFINE_LED(NAME,PRT,PIN,INV)   \
  inline void Led_##NAME_Off() {       \
    if(INV) PORT##PRT |= (1<<##PIN);   \
    else    PORT##PRT &= (1<<##PIN); } \
  inline void Led_##NAME_On()  {       \
    if(INV) PORT##PRT &= (1<<##PIN);   \
    else    PORT##PRT |= (1<<##PIN); }

DEFINE_LED(Warning,D,5,true)
DEFINE_LED(Power,  D,6,false)

...
Led_Warning_Off();
Led_Power_On();
Und dann hoffen, dass der Compiler alles schön inline-t ;-)

Hat wenigstens den Vorteil dass
* ich mich nur an einer Stelle drum kümmern muss ob eine LED mit 
Negativ-Logik angesprochen werden soll
* ich mich nicht Port und Pin merken muss im Code, sondern eine 
sinnvolle Name benutzen kann,
* und nicht definierte LEDs zur Compile-time schon gefunden werden.

: Bearbeitet durch User

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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.