pablos:
Come potrei compilare una piccola macro che faccia questo
if (bitRead(gr_PORT_C, 0) == 1) bitWrite(PORTC,0,comm01);
"gr_PORT_C" è un byte su eprom dove è scritto quali pin del registo C sono ENABLE alla commutazione
"comm01" è il bit 0 opure 1
per la prima parte l'ho fatto ma la scrittura come posso farla visto che il bit da scrivere può essere 1 o 0?
#define bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit))
if(bit_is_set(gr_PORT_C, 0)) bitWrite(PORTC,0,comm01);
se devo inserire un if per controllare il "comm01" allora allungo i tempi ....
Non ho capito bene. Così ad intuito ti chiedi quello che tempo addietro mi sono chiesto io, cioè una unica macro o funzione che mi permetta di impostare
un solo bit di una variabile indifferentemente che lo voglia impostare a 0 o a 1, se si tratta di questo tempo addietro postai in merito e vennero fuori delle macro interessanti, ora il post è caduto nel dimenticatoio.
Comunque io uso questa funzione inline:
inline void __bit_set_to(uint8_t *d_ptr, uint8_t bit, uint8_t bit_value)
{
*d_ptr ^= (-bit_value ^ *d_ptr) & (1 << bit);
}
E si usa così:
__bit_set_to(&PORTA, 7, 1) // Imposta il bit 7 ad 1
__bit_set_to(&PORTA, 7, 0) // Imposta il bit 7 ad 0
Per la funzione inline ho dovuto usare per forza il puntatore, mentre per la macro non è necessario.
La macro potrebbe essere qualcosa di simile:
#define bit_set_to(reg, bit, bitValue) d_ptr ^= (-bitValue ^ d_ptr) & (1 << bit)
Correzione della macro:
#define bit_set_to(reg, bit, bitValue) reg ^= (-bitValue ^ reg) & (1 << bit)
occhio che richiede ; alla fine
Fammi sapere se lavora.
Ciao.