Correspondance entre PORTx et pin des cartes Arduino

Bonjour à toutes et à tous,

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 :

void pinToPort(uint8_t pin, bool sens, uint8_t* port, uint8_t* bit);

Ça vous dit quelque chose ?

Cordialement.

Pierre

Salut,

j'ai retrouvé ceci :

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

#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )
#define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) )
#define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) )
#define analogInPinToBit(P) (P)
#define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) )
#define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + (P))) )
#define portModeRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_mode_PGM + (P))) )

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.

Merci à tous pour ces réponses pertinentes. Cela m'aide bien.

Je suis plus qu'en virons :wink: content.

Cordialement.

Pierre