www.mikrocontroller.net

Forum: Compiler & IDEs PINC, PORTC, DDRC "umrechnen"


Autor: Kjartan Ferstl (Gast)
Datum:

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

Autor: Werner B. (werner-b)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich hier aus dem Forum. Frage bitte nicht von wem das Original 
stammt.

Werner

Autor: Kjartan Ferstl (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
#define xDDR(x)  DDR##x

#define _DDR(index)  xDDR(index)

Autor: Kjartan Ferstl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tatsächlich,

DANKE!

Wiso das jetzt funktioniert ist mir jedoch noch ein Rätzel, hat wer ne 
Idee?

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Möglichkeit wäre auch:

http://www.avrfreaks.net/index.php?name=PNphpBB2&f...


Peter

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.