Bonjour,
Je me retrouve actuellement face à un problème.
Voyez vous, je commande les menus de mon afficheur LCD avec un BP connecté à un microprocesseur ATMEGA328p
Je le programme sous Arduino 1.0.5.
Le problème, c'est les rebonds à l'appuie et au relâchement du BP.
Tout d'abord mon BP est un NF. il est branché avec une résistance PULL-DOWN. Voici un petit schéma explicatif :
Umes1 est la tension que j'aimerais envoyer dans le µC.
Umes2 représente la solution Hardware que sans doute des gens m'auraient proposé. Mais vu que je vais pas m'amuser a acheter 1 résistance de 100k et 1 condensateur de 100nF, je refuse cette solution.
Passons coté Software. Utilisant Arduino j'ai donc essayé plusieurs solutions.
Les interruptions du µC, mais je ne m'en sort pas avec l'anti rebond & l'interruption. logiciellement, pour supprimer un rebond, il faut juste retarder la prise en compte du signal d'une centaine ou deux de ms. Mes tentatives d'utilisation de temporisation dans mes interruptions sont des échecs.
- Delayms() ne fonctionne pas (normal)
- j'ai fais une tempo avec millis() mais ca n'a pas fonctionné.
- j'ai essayé d'utiliser une combinaison de attachInterrupt(...) et detachInterrupt(...) mais même après un detachInterrupt(...) le µC garde en mémoire un rebond et relance une interruption après le attachInterrupt(...). Il y a une histoire de "FLAG" et d'aller bidouiller dans les registre mais je n'ai pas réellement compris.
Je suis aller chercher une bibliothèque "Bounce" mais cela ne me plait pas puisque ça ne passe pas par une interruption. du coup l'appuie du bouton n'est pas réactif.
Si vous pouviez m'aider à résoudre ce problème, je vous en serait reconnaissant.
Voila le code de la méthode des attach /detach :
Cordialement, b.bCode:unsigned long int attente; void setup() { Serial.begin(9600); pinMode(2,INPUT); digitalWrite(2,HIGH); attachInterrupt(0,menu, FALLING); } void loop() { if(millis() > attente+200) { attachInterrupt(0, menu, FALLING); } } void menu(void) { Serial.println("je change de menu"); detachInterrupt(0); attente = millis(); }
PS : si vous avez besoin de plus de détails pour le code par exemple, demandez moi.
-----