Preprozessor bedingte Verknüpfung

Gast #712157
Lesenswert?

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
#712178
Lesenswert?

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.
Moderator Persönliche Seite #712746
Lesenswert?

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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren