Forum: Mikrocontroller und Digitale Elektronik define mit Platzhalter


von Siegfried S. (dieleena)


Lesenswert?

Hallo,
besteht eine Möglichkeit,
define mit Platzhalter zu versehen ?

#define my_set_BIT    |=  (1 <<
#define my_del_BIT    &= ~(1 <<

*FifoZeiger my_del_BIT FifoPortBit);
*FifoZeiger my_set_BIT FifoPortBit);

Habe es so geschrieben, ist aber Murks.

Funktioniert, Compiler meckert nicht.

etwa so
#define my_set_BIT   &= ~(1 <<  Platzhalter )
und so
*FifoZeiger my_set_BIT FifoPortBit;


Gruß Siegfried

von Stefan E. (sternst)


Lesenswert?

Stört dich was an der Art, wie so was sonst gemacht wird?

1
#define my_set_BIT(var,bit)  (var) |= (1<<(bit))
2
3
my_set_Bit(*FifoZeiger,FifoPortBit);

von Klaus (Gast)


Lesenswert?

jedes handelsübliche C-Buch, oder online C-Tutorial wird dir diese Frage 
mit Leichtigkeit beantworten.

von Siegfried S. (dieleena)


Lesenswert?

Hallo,
Danke für die schnelle Antwort.
möchte mich gerne immer an die Regeln halten.

es ist für mich übersichtlicher.
Die Variante von @Stefan Ernst ist gut.

Gruß Siegfried

von Klaus (Gast)


Lesenswert?

> Die Variante von @Stefan Ernst ist gut.

Oh ja, da hat Stefan Ernst sich ja wirklich was geniales ausgedacht! 
Warum machen das nicht alle auf die Art? Oh, Moment, das tun sie ja 
schon...

von Siegfried S. (dieleena)


Lesenswert?

Hallo,

#define SET_BIT(var,bit)  (var) |=   (1<<(bit))
#define DEL_BIT(var,bit)  (var) &= ~ (1<<(bit))
#define TEST_BIT(var,bit) (var) &    (1<<(bit))

unsigned int    *FifoAdresse[MaxFifoBuffer];
unsigned char   FifoPortBitNr[MaxFifoBuffer];
unsigned char   BusSpiInput[MaxBusSpiInOut];
unsigned int    *FifoZeiger;
unsigned char   FifoPortBit;

SET_BIT(*FifoZeiger,FifoPortBit);
DEL_BIT(*FifoZeiger,FifoPortBit);

Habe aber jetzt ein Problem.
jeweils in einem Array liegt die Adresse bzw. die Bit-Nummer.
Bit 0 bis Bit 6 funktioniert einwandfrei zu setzen/löschen.
jedoch Bit 7 bereitet Probleme.
Es wird dann immer die nächste Adresse auf 0xFF bzw 0x00 gesetzt.

Gruß Siegfried

von Karl H. (kbuchegg)


Lesenswert?

Siegfried Saueressig schrieb:

> jeweils in einem Array liegt die Adresse bzw. die Bit-Nummer.

Das ist keine gute Idee

   1 << i;

ist für deinen AVR eine 'komplizierte' Operation.

Leg ins Array besser gleich die fertigen Masken (also zb den Wert 1<<6) 
ab.

> Bit 0 bis Bit 6 funktioniert einwandfrei zu setzen/löschen.
> jedoch Bit 7 bereitet Probleme.
> Es wird dann immer die nächste Adresse auf 0xFF bzw 0x00 gesetzt.

Ohne Code ist das schwer zu sagen.

von Karl H. (kbuchegg)


Lesenswert?

Siegfried Saueressig schrieb:

> #define SET_BIT(var,bit)  (var) |=   (1<<(bit))
> #define DEL_BIT(var,bit)  (var) &= ~ (1<<(bit))
> #define TEST_BIT(var,bit) (var) &    (1<<(bit))

Zur Sicherheit solltest du da noch Klammern rundum setzen. Zumindest 
beim TEST_BIT kann das sonst fatal sein
1
#define SET_BIT(var,bit)  ( (var) |=   (1<<(bit)) )
2
#define DEL_BIT(var,bit)  ( (var) &= ~ (1<<(bit)) )
3
#define TEST_BIT(var,bit) ( (var) &    (1<<(bit)) )

von Siegfried S. (dieleena)


Lesenswert?

Hallo,
hier der Code

FifoDelay[i]      = FifoTimeOff[i];
FifoZeiger        = FifoAdresse[i];
FifoPortBit       = FifoPortBitNr[i];
DEL_BIT(*FifoZeiger,FifoPortBit);
ablauf_status[i]  = WaitOn;

probiere es noch mit den zusätzlichen Klammern.

Gruß Siegfried

Problem bleibt auch mit den zusätzliche Klammern.


hier passe ich.
Leg ins Array besser gleich die fertigen Masken (also zb den Wert 1<<6)
ab.


Nachtrag:
in der von FifoZeiger adressierten Adresse wird Bit 7 korrekt behandelt.

von Karl H. (kbuchegg)


Lesenswert?

Das hier
unsigned int    *FifoAdresse[MaxFifoBuffer];
unsigned int    *FifoZeiger;

sollten Zeiger auf unsigned char sein.

unsigned char*  FifoAdresse[MaxFifoBuffer];
unsigned char   FifoPortBitNr[MaxFifoBuffer];
unsigned char   BusSpiInput[MaxBusSpiInOut];
unsigned char*  FifoZeiger;

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.