J'ai vu, mais je n'arrive pas à remettre la main dessus, une fonction qui établit la correspondance entre le n° de pin d'une carte Arduino et le n° du PORT et le n° du bit concerné de ce PORT. Du genre :
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
En gros, digitalPinToBitMask(pin) renvoie un octet contenant un seul bit à 1, équivalent à 1 << N°duBit, digitalPinToPort(pin) renvoie un numéro utilisable dans portOutputRegister() qui lui, renvoie un pointeur vers le PORTx correspondant, et portInputRegister() qui renvoie un pointeur vers le PINx correspondant. C'est une belle usine à gaz...
Petite confusion cette correspondance n'est pas dans le fichier io*.h mais dans le fichier Arduino.h
Le fichier io*.h définie les "paramètres" pour Atmel et Atmel n'a rien à faire d'arduino.
Ce que tu cherches sont des macros qui sont définies dans le fichier Arduino.h
Le fichier Arduino.h est ici :
arduino-1.8.x/hardware/arduino/avr/cores/arduino
Les fichier io*.h provenant d'Atmel sont ici :
arduino-1.8.x/hardware/tools/avr/avr/include/avr
Si tu cherches à lire les I/O de manière rapide en utilisant l'accés aux PORT tout en conservant la numérotation arduino je te conseille de regarder la bibliothèque pour le DHT22 de Rob Tilaart.
Tu aura un exemple d'utilisation de ces macros. Un bon exemple vaut mieux qu'un long discours.
Note quand même que même si c'est plus rapide que digitalRead(), "en virons" 65 cycles horloge, cela reste plus long que l'accès direct aux registres. La "perte" se situe dans le traitement des macro.
DigitalRead() "en virons" 65 cycles horloge (plus si la sortie peut faire de la PWM, pourquoi ?)
Macros arduino "en virons" 30 cycles horloge
Registres direct "en virons" 8 cycles horloge.
J'utilise le "viron" comme unité depuis que je me suis rendu compte que les résultats changent avec la version du compilateur.