Hallo Alle zusammen, ich habe eine Frage zum Preprozessor: ich möchte mir eine Headerdatei einbinden. Nennen wir sie mal "mydefs.h". Also im "main.c" = #include "mydefs.h" In der *.h möchte ich nun verschiedene Initialwerte definieren und setzen z.B. #define Datenport PORTB //Ausgang für Daten #define ON 5 // PB5 ist die "ON"- LED #define Start 6 // PB6 ist die "Start"-LED .... soweit... so gut! Jetzt möchte ich entweder im Programm (z.B. unter init_HW();) oder schon im Preprozessor auch die Datenrichtung automatisch setzen. Ich hab's probiert mit: #if Datenport==PORTA #define DDRA 0xFF #elif Datenport==PORTB #define DDRB 0xFF ... #endif funktioniert aber nich... Wie läßt sich so eine Abfrage elegant lösen? Danke und Gruß Holger
Du hast eine falsche Vorstellung davon, was der Präprozessor macht. Der Präprozessor macht reine Textersetzungen im Code. Mehr nicht. Im Grunde ist das ein Texteditor der seine Kommandos aus dem Text bezieht den er bearbeitet. Da aber die Programmierung der Datenrichtung an einem Port eine Aktion ist, die das Programm ausführen muss, muss das zwangsweise im Programm selbst als ausführbare Anweiung passieren.
Danke Karl Heinz! Da hab ich ja ein bischen falsch gelegen... Gruß Holger
Allerdings kann man den Präprozessor gut dafür benutzen, die entsprechenden Namen zusammenzusetzen. defines.h:
1 | ...
|
2 | /* HD44780 LCD port connections */
|
3 | #define HD44780_PORT A
|
4 | ...
|
hd44780.c:
1 | #include "defines.h" |
2 | |
3 | #define GLUE(a, b) a##b
|
4 | #define PORT(x) GLUE(PORT, x)
|
5 | #define PIN(x) GLUE(PIN, x)
|
6 | #define DDR(x) GLUE(DDR, x)
|
7 | |
8 | #define HD44780_PORTOUT PORT(HD44780_PORT)
|
9 | #define HD44780_PORTIN PIN(HD44780_PORT)
|
10 | #define HD44780_DDR DDR(HD44780_PORT)
|
11 | ...
|
12 | void
|
13 | hd44780_init(void) |
14 | {
|
15 | |
16 | HD44780_DDR = _BV(HD44780_RS) | _BV(HD44780_RW) | _BV(HD44780_E) |
17 | | HD44780_DATABITS; |
18 | ...
|
19 | }
|
Beispiele lesen bildet. ;-) Das war einfach nur aus dem stdiodemo der avr-libc zitiert. Ich hatte es mir dort ein für allemal verewigt, da man das ja hin und wieder mal braucht...
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.