define mit Platzhalter

OP #1498813
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
Gast #1498837
> 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...
OP #1498946
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
#1498953
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.
#1498961
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)) )
OP #1498967
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.
#1499116
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;

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.