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 haben1 | #define SWITCH_ERROR_LED(x) if(x) PORTC |= (1<<PC1); else PORTC &= ~(1<<PC1);
|