Forum: Mikrocontroller und Digitale Elektronik problem mit #define


von D. K. (kirsche)


Lesenswert?

Hallo, ich habe ein problem mit "#define"

ich will mehrere PINs und PORTs definieren. wie kann man den das machen?

zb:

#define NULL PORTC = 0b00000001 PORTB = 0b00000001

lg

von Oliver S. (z0ttel)


Lesenswert?

Wenn es nur darum geht, dass Du in Deinen Code NULL schreibst und daraus 
die beiden Anweisungen PORTC = 0b00000001 und PORTB = 0b00000001 werden 
sollen, kannst Du das so machen:
1
#define NULL \
2
PORTC = 0b00000001; \
3
PORTB = 0b00000001;

von Karl H. (kbuchegg)


Lesenswert?

D. Kirschner schrieb:
> Hallo, ich habe ein problem mit "#define"
>
> ich will mehrere PINs und PORTs definieren. wie kann man den das machen?
>

Ich denke, dein Problem liegt ganz woanders:
Dir ist nicht klar, was ein #define eigentlich macht.

Ein #define ist nichts anderes als ein Textersatz, den der Compiler (der 
Präprozessor) durcchführt, anstatt das du das im Editor mit 
Suchen&Ersetzen machst. Mehr steckt da nicht dahinter. Text "A" wird 
durch Text "B" ersetzt.

D.h. wie dein #define auszusehen hat, richtet sich in erster Linie nach 
der verwendenden Stelle. Wenn die verwendende Stelle in letzter 
Konsequenz so aussehen soll

   i = 8 * 60;

und du anstelle der 60 einen 'stärkeren' Hinweis im Code haben möchtest, 
dass es sich bei dieser Berechnung um Minuten handelt, dann kannst du 
definieren

#define MINUTEN * 60

und damit dann schreiben

    i = 8 MINUTEN;

Denn wenn du jetzt den Text 'MINUTEN' durch seinen Textersatz '* 60' 
tatsächlich austauschst, dann kommt da wieder das zu erzielende

    i = 8 * 60;
raus.


Mehr steckt nicht hinter einem #define.
Ok, nicht ganz. Man kann einem #define auch Argumente mitgeben, die es 
dann in den zu ersetzenden Text einbaut. So wird aus

#define MIN(x,y)   x < y ? x : y

und der verwendenden Stelle

    j = MIN( 8, 5 );

durch die Textersetzung und durch das ersetzen von x mit 8 und das 
ersetzen von y mit 5 dieser Text:

     j = 8 < 5 ? 8 : 5;

den sich dann der eigentliche C-Compiler zur Übersetzung vornimmt.


Das bedeutet auch:
Wenn du ein Makro schreiben willst, dann muss dir am Anfang klar sein, 
wie denn das Ergebnis aussehen soll. Ohne Benutzung eines Makros.

    if( irgendwas ) PORTC |= (1<<PC1); else PORTC &= ~(1<<PC1);

nachdem dieses klar ist, überlegst du dir, welchen Text du statt dessen 
an dieser Stelle haben willst. Und du überlegst dir, wie man das eine in 
das andere überführen kann, und zwar nur durch Textersetzungen, wobei 
einige Dinge aus der 'Zielanweisung' übernommen werden können.
Du möchtest zb. anstatt obigem gerne schreiben

     SWITCH_ERROR_LED( irgendwas );

dann muss deine Textersetzung daher diese Gestalt haben
1
#define SWITCH_ERROR_LED(x)   if(x) PORTC |= (1<<PC1); else PORTC &= ~(1<<PC1);

von search machine helper (Gast)


Lesenswert?


von D. K. (kirsche)


Lesenswert?

danke für eure antworten.

jetzt gehts =)

lg

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.