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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.