mikrocontroller.net

Forum: Compiler & IDEs Präprozessor frage...


Autor: Chriss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Leute..

Will ein Makro setzen, abhängig von einem anderen.


#define start_timer()    TCCR1B |= (1<<CS10);

#if   start_timer() == TCCR1B |= (1<<CS10);
      #define USED_PRESCALER 1
#elif   start_timer() == TCCR1B |= (1<<CS11);
      #define USED_PRESCALER 8
#elif start_timer() == TCCR1B |= (1<<CS11) | (1<<CS10);
      #define USED_PRESCALER 64
#elif start_timer() == TCCR1B |= (1<<CS12);
      #define USED_PRESCALER 256
#endif

was mache ich da falsch?

schöne grüße

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> was mache ich da falsch?

Du willst einen Zeichenkettenvergleich.  Das geht nicht.  Der
Präprozessor kann nur Ganzzahl-Arithmetik.  Makros mit Argumenten
(also mit Klammern) kann er überhaupt nicht selbst benutzen für
die Arithmetik.

Autor: Chriss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie könnte man das ganze dann umschreiben das es so funktioniert?

Hab mir diesen stil aus nem sourcecode abgeschaut.
finde ich deshalb cool weil es die übersichtlichkeit erhöht.

Was ich da genau mache ist mir nicht unbedingt klar. vl kann mir das 
jemand noch genau erklären.


#define start_timer()    TCCR1B |= (1<<CS10);

so kann ich diesen aufruf dann mit
start_timer(); ausführen...


geht das ganze auch ohne der klammer? so:
#define start_timer    TCCR1B |= (1<<CS10);
und dann ausführung mit:

start_timer;

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chriss wrote:
> Wie könnte man das ganze dann umschreiben das es so funktioniert?
>
> Hab mir diesen stil aus nem sourcecode abgeschaut.
> finde ich deshalb cool weil es die übersichtlichkeit erhöht.
>
> Was ich da genau mache ist mir nicht unbedingt klar. vl kann mir das
> jemand noch genau erklären.
>
>
> #define start_timer()    TCCR1B |= (1<<CS10);
>
> so kann ich diesen aufruf dann mit
> start_timer(); ausführen...

Ja.
Nimm aber den ; hier weg
#define start_timer()    TCCR1B |= (1<<CS10);

                                            ^
>
>
> geht das ganze auch ohne der klammer? so:
> #define start_timer    TCCR1B |= (1<<CS10);
> und dann ausführung mit:
>
> start_timer;

Sicher.

Der Präprozessor macht nur Textersetzungen. Dort wo
jetzt

   start_timer;

steht, ersetzt er den Text "start_timer" mit dem Text, den
du im #define angegeben hast. Da entseht dann

   TCCR1B |= (1<<CS10);;

da draus (Und jetzt siehst du auch, warum du im Makro den ;
weglassen solltest)

Du könntest zb Folgendes machen

#define PRESCALER_1   ( 1 << CS10 )
#define PRESCALER_8   ( 1 << CS11 )
#define PRESCALER_64  ( 1 << CS11 ) | ( 1 << CS10 )
#define PRESCALER_256 ( 1 << CS12 )

#define start_timer(x)  TCCR1B |= (x)


und benutzt das dann in der Form

   start_timer( PRESCALER_64 );

Wenn du selbst wieder mal Präprozessor spielst:
start_timer durch den im Makro angegebenen Text ersetzen. Das
Makroargument x wird dabei zu PRESCALER_64. Also liefert die
Ersetzung:

   TCCR1B |= (PRESCALER_64);

Nun ist aber PRESCALER_64 seinerseits wieder ein Makro. Dessen
Ersetzung liefert den Text "( 1 << CS11 ) | ( 1 << CS10 )".
Den anstelle von PRESCALER_64 eingesetzt, liefert dann

  TCCR1B |= (( 1 << CS11 ) | ( 1 << CS10 ));

genau das, was du haben willst.

Autor: Chriss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger <----- deine comments sind immer sehr genau 
erklärt.. BESTEN DANK für deine Mühen. Mach weiter so.... DANKE

schöne Grüße

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.