www.mikrocontroller.net

Forum: Compiler & IDEs Variable defines erstellen


Autor: Norbert S. (norton)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich würde gerne über nur eine define änderung zwichen 
verschiedenen Countern umschalten können (es werden teilw. verschiendene 
Prozessoren verwendet).

Ich hätte mir das ganze zirka so vorgestellt:
#define MV_TIMER 3

#define MV_TIMER_COMPA_VECT   TIMER##MV_TIMER##_COMPA_vect  
#define MV_TIMER_COMPB_VECT   TIMER##MV_TIMER##_COMPB_vect
#define MV_TIMER_OVF_VECT   TIMER##MV_TIMER##_OVF_vect

das Problem ist, dass MV_TIMER nicht aufgelöst wird.

Gibt es ergendwie die Möglichkeit einfach umzustellen ohne jede Zeile 
einzeln zu ändern?

Gruß Norton

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> (es werden teilw. verschiendene Prozessoren verwendet).

Da sind dann aber auch die Namen teilweise leicht unterschiedlich.

Warum nicht einfach so?
#if defined (__AVR_ATmega48__)

#  define MV_TIMER_COMPA_VECT   TIMER0_COMPA_vect
#  define MV_TIMER_COMPB_VECT   TIMER0_COMPB_vect
#  define MV_TIMER_OVF_VECT     TIMER0_OVF_vect

#elif defined (__ATtiny26__)

#  define MV_TIMER_COMPA_VECT   TIMER1_CMPA_vect
#  define MV_TIMER_COMPB_VECT   TIMER1_CMPB_vect
#  define MV_TIMER_OVF_VECT     TIMER1_OVF1_vect

#elif defined ...

...

#endif

So funktioniert die Umstellung sogar automatisch, je nach dem halt, was 
man beim Compilieren als mcu verwendet.

Autor: Norbert S. (norton)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Prozessoren sind soweit ich es benötige kompatibel.

die Lösung mit den "#if defined ..." ist mir bewusst, wollte ich aber 
nicht verwenden weil wenn eine Änderung nötig ist, muss ich für alle 
Zweige (Prozessoren) die Änderung vornehmen.

Außerdem dachte ich mir eigentlich, dass der Austausch der Zahlen kein 
Problem darstellen sollte. (jetzt denke ich anders)

Aber danke für den Rat

Autor: Mino (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
laut meinen bisherigen programmierkentnissen ist es bei 
präprozessordirektiven nicht anders möglich als "#if defined ..." bzw. 
"#ifdef ..." zu benutzen.

mfg. Mino

Autor: Norbert S. (norton)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich währe auch mit einer Makrolösung zufrieden, aber auch diese Variante 
funktioniert leider nicht.

so inetwa:
#define SET_TIMER_NR (TimerNr)   \
   #define MV_TIMER_COMPA_VECT   TIMER##TimerNr##_COMPA_vect   \
   #define MV_TIMER_COMPB_VECT   TIMER##TimerNr##_COMPB_vect

SET_TIMER_NR(3)

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was gehen würde, ist folgendes:
#define MV_TIMER 3

#define MV_TIMERCOMPAVECT(x)   TIMER ## x ## _COMPA_vect
#define MV_TIMER_COMPA_VECT(x) MV_TIMERCOMPAVECT(x)

...
...

ISR(MV_TIMER_COMPA_VECT(MV_TIMER))

Autor: Norbert S. (norton)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

das Funktioniert zwar, aber es währe schön gewesen, wenn es einfacher 
und übersichtlicher funktioniert hätte.

Ich dachte, da es ja nur um eine Textersetzung geht sollte es einfacher 
sein "Zeichen" auszutauschen.

Mal sehen wie ich das machen werde.

Oder hat jemand noch eine andere Idee?

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist noch eine Möglichkeit, die auf dem gleichen Grundgedanken wie
Stefans Vorschlag beruht. Man kann damit Makros definieren, die aus
beliebigen drei Teilen zusammengesetzt sind, von denen jeder vor dem
Zusammenfügen expandiert wird.

Statt
#define m a##b##c

schreibst du
#define m CONCAT3(a, b, c)

In deinem Beispiel:
#define MV_TIMER 3

#define MV_TIMER_COMPA_VECT CONCAT3(TIMER, MV_TIMER, _COMPA_vect)
#define MV_TIMER_COMPB_VECT CONCAT3(TIMER, MV_TIMER, _COMPB_vect)
#define MV_TIMER_OVF_VECT   CONCAT3(TIMER, MV_TIMER, _OVF_vect)

// CONCAT3 expandiert die drei Argumente und fügt sie zu einem Token
// hintereinander
#define CONCAT3H(arg1, arg2, arg3) arg1##arg2##arg3
// CONAT3H ist ein Hilfsmakro für CONCAT3
#define CONCAT3(arg1, arg2, arg3) CONCAT3H(arg1, arg2, arg3)

ISR(MV_TIMER_COMPA_VECT) {
}

ISR(MV_TIMER_COMPB_VECT) {
}

ISR(MV_TIMER_OVF_VECT) {
}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> das Funktioniert zwar, aber es währe schön gewesen, wenn es einfacher
> und übersichtlicher funktioniert hätte.

Schön finde ich das auch nicht, deshalb habe ich dir ja erst was 
anderes vorgeschlagen. Ich sehe übrigens immer noch nicht, was dir daran 
nicht gefällt. Du musst ja nicht auf Basis des Typs unterscheiden, du 
kannst ja auch nach MV_TIMER unterscheiden:
#define MV_TIMER 3

#if (MV_TIMER == 0)

...

#elif (MV_TIMER == 1)

...

#elif ...

...

#endif

Autor: Norbert S. (norton)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke an alle!

Ich habe die "CONCAT3" Variante gewählt. Ist für meine Zwecke die 
schönste.

@Stefan Ernst
Ich bin dabei eine Art "Library" (.c .h files mit Funktionen) zu 
erstellen. Diese Funktionen sollen von allen verwendet werden. Und nur 
durch Parametrierung angepasst werden.
Wenn ich eine Funktion habe möchte ich grundsätzlich nur an einer Stelle 
Anpassungen machen müssen wenn eine Änderung nötig ist.
Weiters habe ich extra eigene Defines verwendet um von der HW unabhängig 
zu sein (HAL). Würde ich eine Änderung am Timer vornehmen müssen müsste 
ich das bei der #ifdef Variante bei allen nachziehen müssen so nur 
einmal.
Weiters bin ich so mit dem derzeitigen Print sehr schnell im Stande den 
Timer zu wechseln -> ist jetzt ja nur noch ein Define.
Ich weiß nicht ob ich mein Anliegen verständlicher gemacht habe, aber 
ich hoffe doch.

Ich bedanke mich nochmals recht herzlich bei allen die Vorschläge 
gemacht haben.

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.