Präprozessor und infix-operator

Gast #77278
Hallo erst mal.

Eine Frage bezüglich der Vereinfachung von Sourcecode. Gegeben sei das
Problem der Ansteuerung eines LCD-Displays mit einem AVR unter der
Programmiersprache C. Wird auf das LCD gelesen und geschrieben, so muss
z. B. zum Schreiben PORTC, für die Richtung DDRC, zum Lesen PINC und
für die Position im Byte PC2 angegeben werden. Das ganze definier ich
mir zur Vereinfachung folgendermassen:

#define  LCD_D4_OUT  PORTC
#define  LCD_D4_IN  PINC
#define  LCD_D4_DR  DDRC
#define  LCD_D4_DB  PC2,

um dann im eigentlichen Code z. B.. mit

sbi(LCD_D4_DR, LCD_D4_DB);

agieren zu können.

Nun ist hierzu allerdings 4 mal #define angegeben, wobei nur zwei
Informationen notwendig wären (es geht um Port C, es geht um Bit 2).
Als wollte ich dass elegant vereinfachen, indem ich

#define   LCD_D4_PORT  C
#define  LCD_D4_BIT  2

angebe, um mit weiteren Makros die eigentlichen LCD_D4_OUT/IN/DR/DB zu
erzeugen. In der Literatur habe ich den Infix-Operator gefunden:

#define  cat(x, y)  x##y

Zusammen mit der Definition

#define  LCD_D4_OUT  cat(PORT, LCD_D4_PORT)

erhalt ich die Fehlermeldung:

avr-gcc -g -Wall -O1 -mmcu=atmega8 -c display.c
display.c: In function `lcd_set_bits':
display.c:285: error: `PORTLCD_D4_PORT' undeclared (first use in this
function)
display.c:285: error: (Each undeclared identifier is reported only once

display.c:285: error: for each function it appears in.)
make: *** [display.o] Error 1
*** fehlgeschlagen ***

Die Anweisung
#define  LCD_D4_OUT  cat(PORT, C)
funktioniert hingegen.

Wie biege ich die Präprozessor-Anweisungen um, so dass nur zwei Angaben
(C, 2) notwendig sind?
Compiler: avr-gcc (GCC) 3.3 20030512 (prerelease)

Gruß
Marco
Gast #77279
ich mag zwar komplett daneben liegen, aber vielleicht hilft dir folgende
Idee: PIN und DDR haben ja einen konstanten "offset" zum PORT.

möglicherweise funktionierts so:
#define  LCD_D4_OUT PORTC
#define  LCD_D4_DB  PC2,
#define  LCD_D4_IN  LCD_D4_OUT - 2
#define  LCD_D4_DR  LCD_D4_OUT - 1

und bitte nicht hauen, c ist für mich eine Fremdsprache.

grüsse leo9

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 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.