www.mikrocontroller.net

Forum: Compiler & IDEs Präprozessor und infix-operator


Autor: Marco Schwalm (Gast)
Datum:

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

Autor: leo9 (Gast)
Datum:

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

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.