Probleme sortie à 0 au demarrage

Bonjour,
Mes pins sont définis en sortie et directement mises à 1.
Des leds sont branchées entre le 5V et ces sorties via une résistance.
Lors du démarrage de ma R4 wifi, je vois mes leds clignoter très brièvement indiquant que les sorties sont reliées à la masse lors de l’initialisation.
Est ce un comportement normal ?

Je crois que par défaut les broches de la R4 WiFi et de nombreux micros sont en entrée et flottent, c’est-à-dire qu’elles ne sont reliées ni à 0V ni à 5V. Tant qu’elles ne sont pas configurées en sortie et mises à 1 par votre programme, une LED branchée entre 5V et la broche via une résistance peut s’allumer brièvement au démarrage.

Il est possible que ce comportement soit le même qu’avec une Uno. A l’initialisation pas mal de registres sont à Zéro et les broches sont en entrée sans résistance de pull up. Si on fait, comme beaucoup:

pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH); 

La première instruction met la broche en sortie, et comme le registre des données est à zéro, on a un état bas tant que la deuxième instruction n’est pas terminée.

Je conseille donc de faire par défaut

digitalWrite(pin, HIGH);
pinMode(pin, OUTPUT);

La première instruction met le registre des données à HIGH, ce qui fait que la deuxième instruction fait passer la broche d’entrée à sortie directement à HIGH sans passer par l'état bas. Avec une uno, la première instruction met en fait la broche en INPUT_PULLUP, ce qui fait un état haut avec une led. On a la succession

// Broche en entrée -> HIGH par le montage extérieur
digitalWrite(pin, HIGH); // Broche en INPUT_PULLUP -> HIGH par la résistance et le montage extérieur
pinMode(pin, OUTPUT); // Broche en OUTPUT à HIGH

C’est a vérifier selon le micro, cela fonctionne bien avec des avr comme la Uno R1 à R3. La R4 je ne connais pas.

Je n’ai pas reussi a le faire, ni avec un rp2040, ni avec un esp32.
Notez bien que je ne dis pas que c’est pas possible, je dis que je n’ai pas réussi.

Le micro de la Uno R4 est plus classique, il y a de l’espoir que cela fonctionne..

Pour des dels, un bref clignotement au lancement du programme n’est pas grave.
Pour des objets, par exemple liés à la sécurité, il faire avec le comportement naturel des composants et ajouter l’électronique qui va bien avec le sujet.

En électronique la pin Raz (reset) sert a fixer l’ordre de démarrage des circuits intégrés dans la phase d’établissement de la tension d’alimentation. Il suffit de jouer sur la valeur des composants R et C.

Un grand merci pour vos réponses.

Résultat des tests

Origine

pinMode(pin1, OUTPUT);
pinMode(pin2, OUTPUT);
pinMode(pin3, OUTPUT);
pinMode(pin4, OUTPUT);

digitalWrite(pin1, HIGH);
digitalWrite(pin2, HIGH);
digitalWrite(pin3, HIGH);
digitalWrite(pin4, HIGH);

Les 4 leds clignotent brièvement au démarrage.

En inversant les deux blocs

digitalWrite(pin1, HIGH);
digitalWrite(pin2, HIGH);
digitalWrite(pin3, HIGH);
digitalWrite(pin4, HIGH);

pinMode(pin1, OUTPUT);
pinMode(pin2, OUTPUT);
pinMode(pin3, OUTPUT);
pinMode(pin4, OUTPUT);

Toutes les sorties sont à 0 donc les 4 leds allumés jusqu’à ce que mon programme change les états. La mise en high avant le pinmode n’est pas pris en compte.

Par contre en faisant

pinMode(pin1, OUTPUT);
digitalWrite(pin1, HIGH);

pinMode(pin2, OUTPUT);
digitalWrite(pin2, HIGH);

pinMode(pin3, OUTPUT);
digitalWrite(pin3, HIGH);

pinMode(pin4, OUTPUT);
digitalWrite(pin4, HIGH);

cela fonctionne parfaitement sans clignotement… Pourquoi ? je n’en sais rien.

Problème résolu même si je n’ai pas compris la cause.

Je pense à un temps d'exécution associée à la permanence rétinienne
Un digitalWrite prend un nombre de cycles horloge qui n'est pas négligeable.
Mais quelle horloge ?
Avec un bon "vieux" avr l'horloge est unique, celle obtenue avec le quartz.
Avec un micro moderne, c'est beaucoup plus compliqué.

Donc à cause de la persistance rétinienne, quand tu fais les digitalWrite un par un, tu as plus de mal à voir les clignotements que quand tu les fais tous les uns après les autres. Ce n'est pas parce que tu ne les vois pas qu'ils n'existent pas.

Pour le vérifier, il existe un petit objet bien pratique : un analyseur logique.
Sur Ali on en trouve entre 5 et 10 €. Ce sont des clones d'un modèle qui n'est plus commercialisé par Saleae.
Le logiciel Saleae de gestion est gratuit, il existe aussi un logiciel opensource : Pulseview

Effectivement, les clignotements des leds étaient visible à l’oeil. Cela aurait été que pour de la visue (ce qui est le cas pour les 3 premières) cela ne m’aurait pas dérangé. Le problème se trouvait sur la led 4 qui est un octocoupleur et qui commande par impulsion un circuit de mémorisation des sorties. C’est cette partie qui était génante pour moi. Depuis la modification, et après tests plus de problème de fonctionnement.

Quels tests ?
Le juge de paix est le test à l'oscillo.
Les seuls tests visuels relèvent de "ça tombe en marche".

D'autres solutions sont possibles qui utilisent le défaut en jouant sur le câblage de l'opto coupleur (puisque maintenant, on sait que tu as un optocoupleur).

Le problème :
L'opto est probablement monté en inverseur (montage M1) qui est le montage le plus fréquement rencontré.
Pour avoir un niveau bas en sortie, il faut que la commande soit à l'état haut. Mais la pin de commande passe un court instant à l'état bas, le temps que le digitalWrite agisse.

Il y a plusieurs façons d'utiliser un optocoupleur.
Voyons ce qu'il se passe au démarrage des 4 montages.
Note : dans les montages 1 et 2 le phototransistor est monté en émetteur commun, qui est un montage inverseur.
Dans les montages 3 et 4 le phototransistor est monté en collecteur commun, qui n'est pas un montage inverseur.

M1 :
Quand la pin Et est à 0, il ne passe aucun courant dans la del (led) d'entrée.
Le transistor est bloqué et en sortie, on a un niveau haut.

M2 :
Quand la pin Et est à 0, cette fois la del d'entrée est alimentée, le phototransistor est passant saturé et délivre en sortie un niveau bas.

M3
Quand la pin Et est à 0, la del d'entrée n'est pas alimentée, le transistor est bloqué et sa sortie est à l'état bas.

M4 :
Quand la pin Et est à 0, la del d'entrée est passante, le transistor est passant, sa sortie est à l'état haut.

Si on résume si on veut au démarrage un niveau 0 en sortie d'opto coupleur les montages M2 et M3 conviennent "naturellement".

Dans les montages M2 et M3 une résistance de tirage à la masse (pull-down) sécuriserait le maintien au niveau bas.

Je pense que c'est mieux que de baser sur des temps de traversée de circuit intégré qui sont très variables avec la température.