Forum: Mikrocontroller und Digitale Elektronik Problem mit #define


von Tim (Gast)


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.

von Stefan F. (Gast)


Lesenswert?

Lass den Quatsch mit verschachtelten Makros. Wie du siehst sind sie 
schwer zu debuggen. Verwende lieber online Funktionen. Die sind fast 
genau so effizient. Der Unterschied ist marginal.

von ErsterMai (Gast)


Lesenswert?

Mach's Dir einfach, Peter Dannegger hat das so gelöst:

https://www.mikrocontroller.net/attachment/60772/sbit.h

LG

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Aha, du machst also:
1
DDRPort |= (1UL << B);
2
PORTPort &= 0xFFFFFFFBUL;

Und wo ist jetzt B definiert?

von Wilhelm M. (wimalopaan)


Lesenswert?

Schreib Dir eine Textdatei, in der Du definierst, welche Pins an welchen 
Ports inputs oder Outputs sind und welchen Namen sie bekommen sollen. 
Diese Datei parsed Du mit etwa awk/sed und generierst daraus eine .h 
Datei, wo alles drin steht. Dann das ganze in ein Makefile.

von Achim (Gast)


Lesenswert?

Also entweder hast du die Wirkungsweise des präprozessors für defines 
nicht verstanden oder den Code falsch kopiert.

PORTREG braucht doch den Port als argument, _Bv doch immer nur den Pin.

von (prx) A. K. (prx)


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);

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.