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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.