www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik define mit Platzhalter


Autor: Siegfried Saueressig (dieleena)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stört dich was an der Art, wie so was sonst gemacht wird?

#define my_set_BIT(var,bit)  (var) |= (1<<(bit))

my_set_Bit(*FifoZeiger,FifoPortBit);

Autor: Klaus (Gast)
Datum:

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

Autor: Siegfried Saueressig (dieleena)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Siegfried Saueressig (dieleena)
Datum:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht 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.

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

Bewertung
0 lesenswert
nicht 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
#define SET_BIT(var,bit)  ( (var) |=   (1<<(bit)) )
#define DEL_BIT(var,bit)  ( (var) &= ~ (1<<(bit)) )
#define TEST_BIT(var,bit) ( (var) &    (1<<(bit)) )

Autor: Siegfried Saueressig (dieleena)
Datum:

Bewertung
0 lesenswert
nicht 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.

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

Bewertung
0 lesenswert
nicht 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;

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.