Forum: Compiler & IDEs Frage zu einem Makro


von lex (Gast)


Lesenswert?

Servus,

jeder kennt ja bestimmt Makros wie z.B.
1
#define LED_PORT               PORTB
2
#define LED_AN(NUMMER)         (LEDPORT |= (1 << NUMMER))

Jetzt würde ich gern ein Makro schreiben, dass mir einen Port oder 
Register auf einen bestimmten Wert setzt, z.B.
1
#define  WRITE_REGISTER(REGISTER, VALUE)    (REGISTER = VALUE)

Soweit kein Problem. Funktioniert (Der Nutzen sei mal dahingestellt).

Wenn ich aber Value erst berechnen muss, wie krieg ich dann so ein Makro 
hin?

Beispiel:
1
WRITE_REGISTER(PORTA, var1 | var2);

Sowas nimmt er mir nicht.
Ich denke dass die Lösung nicht so schwer ist, nur steh ich grad aufn 
Schlauch. Klammern um den Ausdruck bringen auch nichts.

Kann mir wer weiterhelfen?

Grüße,
lex

von Udo S. (urschmitt)


Lesenswert?

42

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

lex schrieb:
> Sowas nimmt er mir nicht.

Wenn du den Makro richtig schreibst, schon:
1
#define  WRITE_REGISTER(REGISTER, VALUE)    (REGISTER) = (VALUE)
2
3
WRITE_REGISTER(PORTA, var1 | var2);
1
$ avr-cpp -mmcu=atmega1281
2
#include <avr/io.h>
3
4
#define  WRITE_REGISTER(REGISTER, VALUE)    (REGISTER) = (VALUE)
5
6
WRITE_REGISTER(PORTA, var1 | var2);
7
^D
8
...
9
# 2 "<stdin>" 2
10
11
12
((*(volatile uint8_t *)((0X02) + 0x20))) = (var1 | var2);

von Honk (Gast)


Lesenswert?

Wenn du grad dabei bist:
1
#define ISTGLEICH    =
2
#define BITWEISEODER |
3
#define SEMIKOLON    ; 
4
5
#define  WRITE_REGISTER(REGISTER, VALUE)    (REGISTER) ISTGLEICH (VALUE)
6
7
WRITE_REGISTER(PORTA, var1 BITWEISEODER var2)SEMIKOLON
8
9
boolean ilovehonk = true SEMIKOLON

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
Noch kein Account? Hier anmelden.