Wenn Du den C++-Compiler benutzt, mit einer Referenz:
1 | static inline void SetBit(volatile uint8_t& reg, uint8_t bit)
|
2 | {
|
3 | reg |= bit;
|
4 | }
|
Mit C geht es nicht, weil bei der gewünschten Schreibweise ja sonst nur
der Wert des Registers und nicht seine Adresse übergeben wird. Aus dem
Wert lässt sich aber normalerweise nicht auf die Adresse schließen ...
Bei Makros mit Parametern solltest Du bei der Definition übrigens
grundsätzlich Klammern um jeden Eingabewert machen. Ansonsten ist die
Auswertungsreihenfolge unter Umständen nicht das, was Du erwartest, da
das Makro ja praktisch nur eine Textersetung macht. Also besser:
1 | #define SetBit(PORT, BIT) ((PORT) |= (BIT))
|
Und noch eine letzte Bemerkung: Der Name SetBit ist verwirrend, da das
Makro nicht nur ein Bit, sondern eine ganze Bitmaske setzt. Ich hätte
bei dem Namen eher diese Definition erwartet:
1 | #define SetBit(PORT, BIT) ((PORT) |= 1 << (BIT))
|
Dein Makro wäre imo mit SetBits treffender benannt. Bzw. wenn man der
üblichen Konvention folgt, dass Makros in Großbuchstaben geschrieben
werden: SET_BITS.