Hallo,
ich habe ein #define PINconf_SPI1_MISO 0x24 was heißt das SPI1 an Port B
Pin 4 hängt.
Jetzt möchte ich die Information im Programm nutzen und z.B
PIN_SPI1_MISO und PORT_SPI1_MISO verwenden.
Ich habe in einem Zentralen .h File alle PINconf* definiert, allerdings
möchte ich jetzt nicht bei allen Pins ein extra define für Port und Pin
machen.
Deswegen wollte ich das Problem so lösen:
DECLARE_PIN(SPI1_MISO, 0x24)
#define DECLARE_PIN(name,conf) { \
#define PIN_##name conf && msk_GPIO_PIN\
#define PORT_##name conf && msk_GPIO_PORT\
}
Dieser Ansatz verursacht diesen Fehler:
error: '#' is not followed by a macro parameter
ich habe dann gelesen, dass man in defines keine defines machen kann,
deswegen frage ich euch nach einem anderen Ansatz für mein Problem.
Habt ihr eine ander Idee?
PS: Ich programmiere einen Cortex M0 mit CoIDE
Makros sind ein Relikt aus (Makro-)Assemblern, die es nach C geschafft
haben. Man sollte sie einfach ganz weglassen. Du kannst beliebige
Datenstrukturen als Konstanten definieren:
Dr. Sommer schrieb:> Makros sind ein Relikt aus (Makro-)Assemblern, die es nach C geschafft> haben. Man sollte sie einfach ganz weglassen. Du kannst beliebige> Datenstrukturen als Konstanten definieren:>
1
structPin{
2
>uint8_tport;
3
>uint8_tpin;
4
>};
5
>
6
>staticconstPinSPI1_MISO{3,4};// Port 3, Pin 3
Hallo,
wenn ich aber soetwas machen möchte muss ich immer 8 bit werte
verwenden. Ich wollte es ungefähr so machen.
Franz F. schrieb:> wenn ich aber soetwas machen möchte muss ich immer 8 bit werte> verwenden.
Hä, wieso das? Du kannst natürlich auch uint16_t und uint64_t oder was
auch immer verwenden...
Franz F. schrieb:> Deswegen würde es sich anbieten im Präprozessor die Port und Pin als> eigene Defines zu definieren.
Voll kompliziert. Mach lieber ein Struct mit Portnummer, Pin-Nummer,
PuPd-Wert, Speed-Wert etc. Dann machst du dir eine Init-Funktion, die
diesen struct entgegennimmt und den Pin entsprechend initialisiert.
Der gcc schluckt das anstandslos. Vielleicht kannst Du dieses Verfahren
sinngemäß anpassen und anwenden. Der Trick besteht einfach im Umweg über
die Helper-Macros und der Textersetzung die bei der Auflösung der Makros
stattfindet und aus dem "scheinbar" nur einem Parameter und dem
geschickt eingesetzten Komma "automagisch" wieder zwei Parameter macht.
Franz F. schrieb:> Der Präprozessor kann anscheinend keine defines in makros ausführen:
So ist es. Und das war schon immer so. Weshalb dir Bernd eine
Alternative zu deinem Ansatz präsentierte.