www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik define mit abhängigkeit


Autor: markus jung (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie kann ich soetwas machen?

#define A y=4
#define B y=5

#define ERSETZE(x) ? ?


ERSETZE(0);//diese zeile wird im c code geschrieben
A;
y=4;   //soll letztendlich ausgeführt werden

ERSETZE(1);//diese zeile wird im c code geschrieben
B;
y=5;   //soll letztendlich ausgeführt werden

ich möchte in abhängigkeit des parameters x ein bestimmtes define 
"anwählen" ist dies möglich?

Gruß,
markus

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

Bewertung
0 lesenswert
nicht lesenswert
Ich denke du suchst gerade nach einer möglichst eleganten "Wie schiesse 
ich mir selber ins Knie" Lösung.

Sprich: Ich glaube du gehst dein Problem falsch an.
Was ist dein eigentliches Problem?

(Deine Problemlösung scheitert daran, dass der Präprozessor keine 
anderen unausgewerteten Präprozessoranweisungen eintauschen kann.
Es gibt zwar
#ifdef
#if
aber das hilft dir in dem Fall nicht viel.

Eventuell könnte man mit einer Kombination aus #define #undef #include 
und #if was erreichen (spukt nur so als Gedanke bei mir im Kopf rum).

: Wiederhergestellt durch Moderator
Autor: Rene H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es mit:

#define ERSETZE(b) b == 0 ? y = 4 : y = 5

Autor: markus jung (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define ON            |=
#define OFF           &=~
#define P3            3

#define PORTB_P3_ON   PORTB ON (1<<P3)
#define PORTB_P3_OFF  PORTB OFF(1<<P3)

#define PORTB_P3(x)   ????

PORTB_P3(0);
PORTB_P3(1);

ich wollte die lösungen mit bitfeldern/unions usw. umgehen. Ich denke 
diese shift methode ist immer noch die (schnellste) auch wenn ich noch 
nicht nachgesehen habe was bei einer lösung mit einem bitfeld 
letztendlich aus dem code wird....

PORTB.7=0; //als beispiel

letztendlich kommt es mir darauf an, möglichst flexibel vieles zuvor 
einstellbar zu machen, und dennoch keinen assembler auswuchs mehr 
deswegen zu erzeugen...

gruß,
markus

Autor: markus jung (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann könnte ich also schreiben:

#define ON            |=
#define OFF           &=~
#define P3            3

#define PORTB_P3_ON   PORTB ON (1<<P3)
#define PORTB_P3_OFF  PORTB OFF(1<<P3)

#define PORTB_P3(x)   x==0 ? PORTB_P3_OFF : PORTB_P3_ON

PORTB_P3(0);   //PB PIN 3 aus
PORTB_P3(1);   //PB PIN 3 an

ist das jetzt alles blödsinnig, oder ergibt es einen sinn.

gruß,
markus

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
markus jung schrieb:

> ich wollte die lösungen mit bitfeldern/unions usw. umgehen. Ich denke
> diese shift methode ist immer noch die (schnellste) auch wenn ich noch
> nicht nachgesehen habe was bei einer lösung mit einem bitfeld
> letztendlich aus dem code wird....

Da wird genau das gleiche draus:
sbi/cbi

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

Bewertung
0 lesenswert
nicht lesenswert
markus jung schrieb:
> dann könnte ich also schreiben:
>
> #define ON            |=
> #define OFF           &=~
> #define P3            3
>
> #define PORTB_P3_ON   PORTB ON (1<<P3)
> #define PORTB_P3_OFF  PORTB OFF(1<<P3)
>
> #define PORTB_P3(x)   x==0 ? PORTB_P3_OFF : PORTB_P3_ON
>
> PORTB_P3(0);   //PB PIN 3 aus
> PORTB_P3(1);   //PB PIN 3 an

Ja. Aber der Laufzeitvergleich von x bleibt nach wie vor drinn. Es sei 
denn der Optimizer wirft ihn raus (was er könnte und wahrscheinlich auch 
tun wird)

Dein eigentliches Ziel, dass

  PORTB_P3(0)

zu

  PORTB &= ( 1 << 3 );

expandiert, hast du so noch nicht erreicht. Allerdings stehen die 
Chancen gut, dass im Endeffekt nach ein paar Optimizerdurchgängen genau 
das herauskommt.

Autor: markus jung (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@benedikt

das hoffe ich dann immer nur, danke für die bestätigung.

@KHB
...hast du so noch nicht erreicht

1)warum nicht?Das habe ich noch nicht ganz verstanden

2)kann x eigentlich auch eine variable sein!?

also ich will das natürlich nicht, aber gesetz dem fall es wäre eine...

es soll übrigens natürlich

PORTB &=~ ( 1 << 3 ); daraus werden.

gruß,
markus

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

Bewertung
0 lesenswert
nicht lesenswert
markus jung schrieb:
>
> 1)warum nicht?Das habe ich noch nicht ganz verstanden

Nachdem der Präprozessor seinen Teil erledigt hat, bleibt
    ...
    0==0 ? PORTB &=~ (1 << 3) : PORTB |= (1<<3);
    ...

übrig.
Es obliegt jetzt dem Optimizer zu erkennen, dass 0==0 immer wahr ist und 
der ganze Ausdruck daher zu
     PORTB &=~ (1 << 3);

vereinfacht werden kann. Eventuell wird er auch eine Warnung schmeissen: 
"Comparison always true" oder so ähnlich.

> 2)kann x eigentlich auch eine variable sein!?

in dem Fall ja.

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.