Forum: Compiler & IDEs Preprozessor bedingte Verknüpfung


von Holger Gerwenat (Gast)


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

von Karl H. (kbuchegg)


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.

von Holger Gerwenat (Gast)


Lesenswert?

Danke Karl Heinz!

Da hab ich ja ein bischen falsch gelegen...

Gruß Holger

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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
}

von Holger Gerwenat (Gast)


Lesenswert?

Genial! Das sieht doch mal übersichtlich aus. Danke Jörg!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.