Je fais une remarque préalable très importante : de quel microcontroleur tu parles ?
L'exemple que tu donnes utilise une propriété des microcontrôleurs Atmel architecture avr.
C'est à dire ceux qui équipent les cartes Uno, nano, mini-pro, Mega, Leonardo, micro.
Ce n'est pas portable avec tous les microcontrôleurs.
Je n'ai pas vérifié mais rien ne prouve que ce sera valable avec les microcontrôleurs Atmel ARM32 de la série MKR, ni avec les micros Espressif.
Il faut contrôler dans les datasheets.
Avec les avr le fait d'écrire un "1" sur une entrée (quelle soit en mode digital ou analogique) mets en service les résistances de pull-up. C'est la construction interne des circuits de sortie qui le permet.
Le code :
Arduino (Atmega) pins configured as INPUT with pinMode() are said to be in a high-impedance state. Pins configured as INPUT make extremely small demands on the circuit that they are sampling, equivalent to a series resistor of 100 Megohms in front of the pin. This makes them useful for reading a sensor.
[...]
Pins Configured as INPUT_PULLUP
The Atmega microcontroller on the Arduino has internal pull-up resistors (resistors that connect to power internally) that you can access. If you prefer to use these instead of external pull-up resistors, you can use the INPUT_PULLUP argument in pinMode().
Cela concerne les Uno et les Mega? Non?
Je sais qu'avec une UNO pour lire le touchpad, j'ai deux lignes qui me permettent de lire l'entrée analogique A2:
pinMode(A2, INPUT);
digitalWrite(A2, LOW);
J'ai bien entendu supprimé la deuxième. Mais j'ai des erreurs de lecture. J'ai donc remis la ligne.
Et cela fonctionne.
pinMode(A2, INPUT); Mettrait-il une résistance? Dans le programme A2 est par ailleurs utilisé en sortie digitale. J'appelle des fois pinMode(A2, INPUT); des fois pinMode(A2, OUTPUT); mais jamais pinMode(A2, INPUT_PULLUP); Si au démarrage il y en avait une comme la lecture est en boucle, je ne verrais le probème qu'une fois; Or il est quasi systématique.
Oui.
C'est parce que le module électronique qui active cette résistance est totalement indépendant du reste du micro et est directement placé au niveau de la connexion sur le boîtier.
Ce module n'appartient ni au module numérique, ni pour A0-A5 au module analogique.
Seule limite il ne peut pas être activé si la pin est en mode sortie, ce serait idiot la "pull-up" serait court-circuitée quand la sortie est à l'état haut.
Autre particularité, à vérifier pour chaque micro mais valable pour atmega328p (uno,nano,mini-pro) ce qu'Arduino appelle improprement des entrées analogique A0 à A5 sont en fait des E/S numériques comme les autres.
Elles ont simplement la particularité d'avoir une seconde fonction "mesure analogique" qui n'est activée qu'avec l'appel à analogRead().
C'est parce que ce sont des E/S numériques comme les autres que A0 à A5 ont cette résistance de pull-up.
Pour A0-A5 il y a un aiguillage en entrée, l'appel de digitalRead/Write aiguille vers un port numérique, l'appel d'analogRead() aiguille vers une entrée du multiplexeur analogique.
Dans les boîtiers CMS du même micro il y a la possibilité de sortir 2 entrées analogiques de plus A6 et A7.
Mais attention ces deux entrées analogiques ne sont pas reliées à un port numérique, elles sont seulement reliées à une entrée du multiplexeur analogique, elles n'ont donc pas de résistances de pull-up.
C'est une particularité des micro avr et pour cela la doc arduino n'est vraiment ce qu'il faut lire en premier. Le juge de paix est la datasheet Atmel.
L'universalité et la cohérence des fonctions arduino ont des limites.
Des différentes sont obligatoires à partir du moment où différentes architecture ont été introduites.
Certains micros n'ont que des pull-up, d'autres ont pull-up et pull-down.
La déclinaison des fonctions est cohérentes du mieux qu'il est possible de faire, un gros boulot est accompli.
Il n'empêche qu'il faut rester vigilants, tout n'est pas toujours possible.
Je suppose, pour un Uno, que quand on fait pinMode(A2, INPUT); le compilateur
met la broche en entrée
envoie LOW sur la broche
et quand on fait pinMode(A2, INPUT_PULLUP); le compilateur
met la broche en entrée
envoie HIGH sur la broche
En fait le problème que j'avais (j'ai recopié un code) est que je n'appelais pas pinMode mais que j'accédais directement au DDRD.
Comme quoi quand cela ne fonctionne pas, c'est toujours de ma faute.
Je n'avais pas vu que le bit qui autorise de façon général les pullup était unique et qu'en plus il est initialisé à "autorisation". Je pensais, comme chaque entrée peut être en pullup ou pas, que c'était ce bit qui commandait la résistance. En fait comme mon code marchait, je ne suis pas allé plus loin.