mikrocontroller.net

Forum: Compiler & IDEs Preprozessor bedingte Verknüpfung


Autor: Holger Gerwenat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Holger Gerwenat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Karl Heinz!

Da hab ich ja ein bischen falsch gelegen...

Gruß Holger

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Allerdings kann man den Präprozessor gut dafür benutzen, die
entsprechenden Namen zusammenzusetzen.

defines.h:
...
/* HD44780 LCD port connections */
#define HD44780_PORT A
...

hd44780.c:
#include "defines.h"

#define GLUE(a, b)     a##b
#define PORT(x)        GLUE(PORT, x)
#define PIN(x)         GLUE(PIN, x)
#define DDR(x)         GLUE(DDR, x)

#define HD44780_PORTOUT    PORT(HD44780_PORT)
#define HD44780_PORTIN     PIN(HD44780_PORT)
#define HD44780_DDR        DDR(HD44780_PORT)
...
void
hd44780_init(void)
{

  HD44780_DDR = _BV(HD44780_RS) | _BV(HD44780_RW) | _BV(HD44780_E)
    | HD44780_DATABITS;
...
}

Autor: Holger Gerwenat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genial! Das sieht doch mal übersichtlich aus. Danke Jörg!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.