A regarder, excellent cours :
Du coup comme il parle au début d'un tuto pour détecter les appuis sur le BP en utilisant une interruption :
A regarder, excellent cours :
Du coup comme il parle au début d'un tuto pour détecter les appuis sur le BP en utilisant une interruption :
salut,
(arrivé trop tard, @J-M-L a déjà répondu)
en fait il faut savoir (voir le chapitre ''Alternate Port Functions'' de la doc) que quelle que soit la direction choisie dans DDRx, l'activation de la fonction ''alternative'' de la pin (ici TX ou RX) prend le dessus : la direction ''réelle'' n'apparaît pas dans DDRx, ou plutôt DDRx n'est pas modifié, simplement dans le but de réattribuer son sens à la pin à la désactivation de la fonction alternative.
(la phrase est longue, mais je l'espère suffisamment claire)
Ah enfin quelqu'un qui pense comme moi............ et surtout qui le dit.
C'est valable pour l'antirebond, mais aussi pour le filtrage d'alimentation.
Pour "purifier" une tension d"alimentation placer un condensateur entre le Vcc et la masse sur un composant ne sert à rien s'il n'y a pas en série sur l'alim un composant qui fait pont diviseur avec le condensateur.
En numérique à consommation variable il est difficile de placer une résistance comme on le fait couramment en analogique, mais il faut bien qu'il y ait quelque chose, même si ce n'est qu'un élément parasite du câblage.
Toute la théorie électronique est basée sur l'affirmation qu'une source de tension continue est un court-circuit parfait pour " les signaux qui bougent" (j'ai volontairement refusé d'employer le terme sinusoïdal).
Or en pratique ce n'est pas vrai, les alim sont imparfaites.
On les améliore en plaçant en parallèle un condensateur qui est un court-circuit pour "les signaux qui bougent".
Ce sont deux applications totalement différentes même si les deux utilisent un condensateur.
La problématique est la même : filtrer les fluctuations rapide de tension... C’est sûr que toute la théorie derrière (Bode et le tralala) n'est pas la partie la plus rigolote de l'électronique.
Donc, si je résume :
Pour les tutos sur le pullup et pulldown :
Pour les interruptions :
Je pense que tous les messages de ce topic sont des solutions
![]()
Cordialement
Pandaroux007 ![]()
Pour moi, quand la broche est en sortie à HIGH, un transistor tire la broche à 5V avec une RDSon d'environ 25Ω (on perd 0.5V pour 20mA)

Si on la branche à 0V, il passe un courant de 200mA si on est encore dans la zone linéaire du transistor, moins si on n'est plus dans cette zone.
En gros, le transistor essaie de maintenir 5V, le fil impose 0V et c'est lui qui va gagner!
On risque simplement de détruire la sortie, en particulier si il y a 200mA, cela fait1W à dissiper.
J'ai testé le programme du post#85 mais avec D2 en entrée pullup, cela fonctionne presque. J'obtiens
interruption car LOW sur D2
interruption car LOW sur D2
interruption car LOW sur D2
interruption car LOW sur D2
Mais de temps en temps j'ai:
interruption car LOW sur D2
interruption car LOW sur D2
interruption car LOWinterruption car LOW sur D2
interruption car LOW sur D2
interruption car LOW sur D2
Que je ne sais pas expliquer. C'est régulier et il manque toujours les mêmes caractères.
Autre chose que je ne sais pas expliquer, c'est pourquoi cela fonctionne. J'aurais dit que di D est LOW, dès que 'on sort de l'INT0, on y rentre de nouveau. Les autres interruptions ne fonctionnent pas. On peut le vérifier si on met:
ISR(INT0_vect)
{
Serial.println(millis());
}
millis() ne s'incrémente qu'en dehors de l'ISR
En toute logique, l'interruption de l'USART ne doit jamais être appellée et on ne devrait rien voir sur la console.
Bonjour @68tjs et @ProfesseurMephisto,
Sur mes montages qui utilisent un ATmega328p (la puce uniquement), j'ai placé un condensateur céramique de 100nf sur pin 7 VCC et pin 8 GND, dois-je comprendre que ça ne sert à rien ?
J'ai fait un micro wokwi, pour visualiser sur le moniteur les rebonds, mais mon code perd l'état du bouton(appuyé/relaché).
Quelqu'un peut me mettre le doigts dans l'œil ?
J'en arrive à la conclusion qu'il est impossible de gérer les rebonds d'un BP en passant par une interruption externe de type pin 2 ou 3 sur les cartes AVR avec 328p.
pourquoi cela est impossible ?
J'ai loupé un truc ?
Ben tu as la solution ? pas moi.
C'est ce que je voulais faire dans un deuxièmes temps sur le wowki car je n'ai pas accès rapidement à mon matérielle.
Mais il n'y a pas de raison objective que l'on ne puisse pas traiter dans la loop, le changement d'état de la broche et prendre en compte uniquement celle supérieur à 50ms?
Dans la loop() oui mais pas dans l'ISR d'une interruption ...
Pourquoi veut tu absolument différentier la loop et l'ISR?
Les interruptions ne sont pas vraiment là pour faire un traitement, mais le mettre en place, pour moi
Il suffit par exemple de noter l'heure d'entrée dans l'ISR et de sortir sans rien faire si le temps précédent diffère de moins de 50ms.
On fait ce que l'on veut. C'est quand même pas la carte qui décide! Perso, j'ai eu besoin d'écrire un bibliothèque pour faire tourner des pas à pas et la mise en place est faite dans loop, et c'et l'ISR qui fait tout le traitement.
Je gère aussi des objets variés (boutons, horloges, pas à pas, servos) uniquement dans des interruptions, y compris les fonctions callback. Et dans pas mal de cas, setup et loop restent vides.
Il suffit de prendre les bonnes précautions.
Un truc dans ce genre ?
const int ledPin = 12; // LED
const int interruptionPin = 3; // pin d'interruption
void setup() {
Serial.begin(9600);
pinMode(interruptionPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
attachInterrupt(digitalPinToInterrupt(interruptionPin), fonctionBp, FALLING); //front descendant car pullup
}
void loop() {}
void fonctionBp () {
static unsigned long tempsprecedent; //static pour ne pas perdre la valeur de la dernière transition
unsigned long temps = millis(); // temps au moment d'entrer dans l'ISR
if ((temps - tempsprecedent) >= 50) { //Gestion des rebonds à 300 millis
//code qui s'execute lors de l'appuie sur le BP
digitalWrite(ledPin, !digitalRead(ledPin));
}
tempsprecedent = temps;
}
On est presque d'accord, l'ISR bloquant le traitement d'autre partie du programme, on ne fait pas exactement ce que l'on veut ![]()
Oui tu as raison @vileroi ,
Un truc comme ça ça fonctionne par contre le changement d'état de la led ne s'effectue qu'au moment du relâché du BP :
const int ledPin = 12; // LED
const int interruptionPin = 3; // pin d'interruption
volatile boolean etat = LOW;
void setup() {
Serial.begin(9600);
pinMode(interruptionPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
attachInterrupt(digitalPinToInterrupt(interruptionPin), fonctionBp, CHANGE); //front descendant car pullup
}
void loop() {}
void fonctionBp () {
static unsigned long tempsprecedent; //static pour ne pas perdre la valeur de la dernière transition
unsigned long temps = millis(); // temps au moment d'entrer dans l'ISR
if ((temps - tempsprecedent) >= 50 ) { //Gestion des rebonds à 300 millis
//code qui s'execute lors de l'appuie sur le BP
etat = !etat;
if (etat == LOW) digitalWrite(ledPin, !digitalRead(ledPin));
//tempsprecedent = temps;
}
tempsprecedent = temps;
}
et il faut utiliser CHANGE et non FALLING.
Si c'est préconisé par le fondeur, il faut les mettre. Il n'a peut-être pas eu la place pour l'intégrer dans la puce... et la « résistance » existe : c'est celle d'entrée (grande probablement)