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
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;
|
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);
|
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.