Problem mit #define

Gast #4789435
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.
Gast #4789494
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.
#4789537
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.
Gast #4789648
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.
#4789650
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.