Hallo zusammen,
ich arbeite mit einem Atmega48PA und möchte gerne meine Pin-Lese, -Setz
und -Lösch Aktionen etwas generischer darstellen. Mein Traum ist, dass
z.B. in einer HwSwInterface c oder h Datei etwas steht wie:
1 | /* die Funktionen mit den entsprechenden Pins des uC mappen: */
|
2 | #define BUTTON 2 /* Pin 2 */
|
3 | #define LED1 3 /* Pin 3 */
|
4 | #define LED2 4 /* Pin 4 */
|
5 | /* das soll das Pin Tauschen vereinfachen und die Zuordnung übersichtlich machen */
|
6 | ...
|
7 | /* die uC Pins auf die Pinnamen mappen(uC-spezifisch, bleibt dann fest): */
|
8 | PortLetterOfPin[1] = 'C';
|
9 | PortNumberOfPin[1] = '6';
|
10 | PortLetterOfPin[2] = 'D';
|
11 | PortNumberOfPin[2] = '0';
|
12 | /* z.B. Pin1 = PC6 */
|
13 | ...
|
und an anderer Stelle sag ich dann nur noch
1 | var = READ_PIN(BUTTON);
|
2 | SET_PIN(LED1);
|
3 | ...
|
Ich hab mich schon mit "Token Pasting" und "Stringize" dran versucht,
aber bekomme nicht das, was ich will - entweder ist PIN undeclared oder
der compiler verwendet die Namen der Defines anstatt dem Wert dahinter
(PINPortLetterOfPinBUTTON anstatt PIND usw.) :(
1 | /* o=pOrt, i=pIn */
|
2 | #define CmdReadPin(o, i) PIN#o & (1<<PIN#o#i)
|
3 | #define CmdSetPin(o, i) PORT##o |= (1<<PORT##o##i)
|
4 | #define CmdResetPin(o, i) PORT##o &= ~(1<<PORT##o##i)
|
5 | ...
|
6 | #define MacReadPin(n) CmdReadPin(PortLetterOfPin#n, PortNumberOfPin#n)
|
Wann muss ich ## benutzen und wann #? Muss ich Variablen anlegen für die
Zuordnungen oder kann man es nur über defines lösen?
Ich hab schon gegoogelt, aber finde nichts. Sowas muss es doch schon
geben, ich weiß nur nicht wie es heißt...