Problem mit #define

Gast #4789435
Lesenswert?
• ▲
▼
Hallo,
ich möchte gerne über Makros meine Ports als Ausgang definieren und 
diese ein/ausschalten.
1
#define _BV(b) (1UL << (b))
2

3
#define CONCAT(a, b)            a ## b
4
#define PORTREG  CONCAT( PORT, Port )
5
#define DDRREG   CONCAT( DDR,  Port )

in der Funktion habe ich deklariert
1
#define dataPort B
2
#define dataPin  2
3
...
4

5
DDRREG  |=  _BV( dataPort ); // enable output
6
PORTREG &= ~_BV( dataPin ); // output low

allerdings kann ich es so nicht kompilieren. Der Fehler liegt in dem 
define von PORTREG. Die Ausgabe des Compilers ist:
'B' was not declared in this scope

Ziel wäre es, mit dem define PORTREG und DDRREG den entsprechenden Pin 
als Ausgang zu initialisiern und auf low zu schalten.

ist das irgendwie anders möglich? Weil so könnte ich das ganze globaler 
halten um eventuelle änderungen leichter durchzuführen.
#4789650
Lesenswert?
• ▲
▼
Geht aber nur bei C Compilern, deren Präprozessor völlig korrekt 
arbeitet. Tut nicht jeder, ein älterer Microchip-Compiler für deren 
8-Bitter scheiterte an dieser Technik:
1
#define GLUE(a, b) a##b
2
#define PORT(x)    GLUE(PORT, x)
3
#define PIN(x)     GLUE(PIN, x)
4
#define DDR(x)     GLUE(DDR, x)
5

6
#define setBits(port,mask) do{ (port) |=  (mask); }while(0)
7
#define clrBits(port,mask) do{ (port) &= ~(mask); }while(0)
8
#define tstBits(port,mask) ((port) & (mask))
9

10
#define LCD_SCLK_PORT B
11
#define LCD_SCLK_PIN  (1<<PB3)
12

13
   setBits(DDR(LCD_SCLK_PORT), LCD_SCLK_PIN);

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