Hallo, mich nerven die ewig langen Header Dateien zur GPIO Konfiguration, daher will ich Konstanten PINC, PORTC und DDRC umrechnen. Im Header File soll nur noch eine Konstante stehen, der Präprozesser soll die Schreibarbeit machen. Hab zwei Ansätze, bin jedoch noch mit keinem zu einer Lösung gekommen. Version 1 (leider schon gelöscht, hier das Prinzip): #define _DDR(port) ( (port==PORTB)?DDRB:((port==PORTC)?DDRC:0) ) Das kann man natürlich ewig fortsetzen,... Nachteil: mann muss sich was für die nicht definierten PORTA,... überlegen, welche villeicht bei anderen AVRs vorhanden sind. Habe diese mit #ifndef ... definiert, ist aber keine besonders saubere Lösung. Version 2: #define _DDR(index) DDR##index #define _PORT(index) PORT##index #define _PIN(index) PIN##index in dem Headerfile stehen dann nur noch Buchstaben wie z.B. #define LED_PName B Hier sagt er mir aber ständig, dass B nicht definiert ist (logisch). Hat jemand ne Idee - oder noch besser, ne Lösung? *Ich will keine Kniffe über Speicherplatz-Abstandsrechnungen machen, da das bei anderen AVRs in die Hose gehen könnte. Mit freundlichen Grüßen, Kjartan Ferstl
Hab ich hier aus dem Forum. Frage bitte nicht von wem das Original stammt. Werner
Kjartan Ferstl schrieb: > #define _DDR(index) DDR##index > #define _PORT(index) PORT##index > #define _PIN(index) PIN##index so hätte ich mir das ja auch gedacht, aber wie funktioniert das in den Headerdateien dann? Hier nochmal mein Beispiel mit der Fehlermeldung (#defines von oben gelten): // Defines für eine LED #define LED_PName D #define LED_PNum 1 ... _DDR(LED_PName)|=1<<LEDReady_PNum; Error: ../sourcefiles/TEST00.c: In function 'main': ../sourcefiles/TEST00.c:237: error: 'DDRLED_PName' undeclared (first use in this function) ../sourcefiles/TEST00.c:237: error: (Each undeclared identifier is reported only once ../sourcefiles/TEST00.c:237: error: for each function it appears in.) Das Problem: #define LED_PName D GCC sucht jetzt vergeblich nach einer Konstanten namens D, diese findet er nicht, also setzt er einfach den Namen des #defines ein. Daher entsteht: DDRLED_PName|=1<<LEDReady_PNum; statt DDRD|=1<<LEDReady_PNum;
Wenn du es genau so übernehmen würdest, wie es in der geposteten Datei steht (nämlich mit Zwischenschritt), dann würde es auch gehen. Also z.B. so:
1 | #define xDDR(x) DDR##x
|
2 | |
3 | #define _DDR(index) xDDR(index)
|
tatsächlich, DANKE! Wiso das jetzt funktioniert ist mir jedoch noch ein Rätzel, hat wer ne Idee?
Kjartan Ferstl schrieb: > Wiso das jetzt funktioniert ist mir jedoch noch ein Rätzel, hat wer ne > Idee? Das Zusammenfügen muss um einen Durchgang verzögert werden, damit erst LED_PName durch D ersetzt werden kann. Wenn sofort zusammengefügt wird, kann LED_PName ja nicht mehr ersetzt werden. Es entsteht dann DDRLED_PName und der Präprozessor ersetzt nur komplette Worte und keine Teilworte.
Eine Möglichkeit wäre auch: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=91304 Peter
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.