Leggere e scrivere un pin velocemente

Ciao a tutti, vorrei sapere come posso leggere/scrivere su un pin a basso livello senza usare la digitalR/W.

Ad esempio per mettere a 1 il PD4 attualmente uso

PORTD=PORTD | B00010000;

Ma così faccio una operazione anche su altri pin, anche se senza effetto.

Per portare alto il PD4 direttamente invece? E per leggerlo?

Grazie

Leggi qui → http://www.leonardomiliani.com/2013/manipoliamo-direttamente-le-porte-logiche-di-una-mcu/

E ricorda che ci sono dei #define su Arduino.h che ti semplificano la vita.

#define lowByte(w) ((uint8_t) ((w) & 0xff))
#define highByte(w) ((uint8_t) ((w) >> 8))

#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))

#define bit(b) (1UL << (b))

Non so a cosa servono qui define, non li ho mai usati e mai visti, se mi puoi delucidare ti ringrazio. Ora leggo il link, grazie.

In definitiva scriverai

bitSet(PORTD, 5);

che corrisponde a

PORTD |= B00010000;

che è uguale al tuo

PORTD=PORTD | B00010000;

Puoi anche scrivere bitWrite(PORTD, 5, 1); senza pensare se usare Set o Clear.

Ok grazie, ma in termini di velocità, quale risulta il metodo più veloce?

Sono tutti equivalenti, perché in fase di compilazione il codice, tramite i #define, viene riscritto. Naturalmente scrivendo il codice in questo modo perdi in portabilità, perchè su altri micro i registri potrebbero essere differenti. Ad esempio passando dalla Arduino UNO alla Leonardo, il codice potrebbe non funzionare correttamente, mentre un digitalWrite funziona in entrambi i casi anche se più lento. In effetti il core di Arduino è stato creato per aumentare la portabilità del codice, anche se introduce un calo delle prestazioni a causa dei necessari controlli per far funzionare il codice stesso su diversi micro con diverse architetture.

Ok molto chiaro, grazie Paolo :)