Bonjour, je suis en train actuellement de réaliser une station météo mais je rencontre un petit problème avec la mesure de temps séparant deux impulsions de mon anémomètre qui peut être éviter mais ne comprenant pas d'ou il vient je pose la question ici
J'utilise la fonction micro et l'interruption de la pin D2 en front montant
De manière aléatoire le temps minimum mesuré à une valeur totalement incohérente sachant que j'ai réalisé un debounce du vecteur d'interruption de la pin D2 à l'aide du timer 2 qui me génère lui même une interruption ou bout d' 1ms afin de réactiver l'interruption du port D2 et 1 ms en us ça fait 1000 mais j'arrive à avoir des valeur inférieur à la centaine!
Votre double interruption avec le timer c’est vraiment l’arme lourde... pour éviter le rebond testez juste dans l’ISR si millis() ou micros() est suffisamment plus tard que la dernière interruption ou mettez un Condo
Les maths sur unsigned long devraient être effectués avec une copie des variables de l’ISR obtenue en bloquant les interruptions le temps de la copie
corrigez votre post ci dessus et rajoutez les code tags autour du code: [code]`` [color=blue]// votre code ici[/color] ``[/code].
ça doit ressembler à cela:// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l’IDE avant de copier le code pour qu’il soit indenté correctement)
C'est bien le cas où pour éviter l'effet des rebonds la solution 100% matérielle est préférable.
Un simple condensateur de 100nF céramique connecté en parallèle sur le contact et c'est fini.
L'anti rebond est totalement indépendant de la programmation, plus de prise de tête.
Le condensateur est déjà installé mais ce n est jamais assez fiable il faut toujours limité la mesure de n'importe quelle grandeur d ailleurs au niveaux logiciel.
Je vais essayer la manip de ne pas faire d interruption lors de mon calcul
Je vais aussi essayer de concaténer la fonction micro en 16 bits ne manipuler que des int
Pourquoi cela est vraiment important de mettre volatil arduino n est pas dérivé du c/cpp?
A toi de dimensionner la constante de temps en fonction de tes rebonds.
Pourquoi cela est vraiment important de mettre volatil arduino n est pas dérivé du c/cpp?
Non, Arduino est du C / C++.
volatil te garantit que dans une boucle par exemple, le code recharge la valeur de la variable à chaque fois qu'elle est utilisée, au lieu de la stocker dans un registre. comme elle est modifiée par une interruption, elle peut changer de valeur au sein d'une boucle.
Dans ton cas, cela ne devrait pas être utile, mais c'est une bonne habitude à prendre.
Je persiste un anti rebond matériel ne suffit pas!
C'est bien la première fois que je vois ça !
C'est que tu ne sais pas l'utiliser.
L'anti rebond logiciel ne consiste qu'à cacher la poussière sous le tapis --> il bloque le programme jusqu'à ce qu'il n'y ait plus de rebond détectés. Tu n'es pas à l'abri d'une non détection de rebond et plus le contact est pourri plus le programme est bloqué longtemps.
Alors qu'avec l'anti rebond matériel il suffit de calibrer le couple R C en fonction du contact et l'information toujours disponible immédiatement.
Mais bon puisque tu es sur de toi continue à t'embêter avec l'anti rebond logiciel.
Mais bon puisque tu es sur de toi continue à t'embêter avec l'anti rebond logiciel.
Surtout avec un anti-rebond logiciel dans une interruption !
Il faut déjà tester ta gestion de timer seule pour voir si elle marche vraiment.
J'ai déjà fait ça pour une librairie de boutons. J'ai aussi utilisé le timer2 comme anti-rebond.
J'utilisais cette librairie : Arduino Playground - MsTimer2
68tjs:
C'est bien la première fois que je vois ça !
C'est que tu ne sais pas l'utiliser.
L'anti rebond logiciel ne consiste qu'à cacher la poussière sous le tapis --> il bloque le programme jusqu'à ce qu'il n'y ait plus de rebond détectés. Tu n'es pas à l'abri d'une non détection de rebond et plus le contact est pourri plus le programme est bloqué longtemps.
Alors qu'avec l'anti rebond matériel il suffit de calibrer le couple R C en fonction du contact et l'information toujours disponible immédiatement.
Mais bon puisque tu es sur de toi continue à t'embêter avec l'anti rebond logiciel.
Il ne bloqué pas le programme puisque le timer permet justement de désactiver l interruption pendant 1ms
effectivement le debounce du pauvre delay(15); bloque le programme. Mais correctement fait (c'est à dire avec une machine à état qui ignore les rebonds pendant un certains temps) alors ça mange du temps CPU mais ça ne bloque pas le programme
toujours la vieille discussion des softeux versus les hardeux mais je n’ai pas vu une solution hard proprement dimensionnée ne pas amortir les rebonds
Il ne bloqué pas le programme puisque le timer permet justement de désactiver l interruption pendant 1ms
Comment peut-il fonctionner en faisant autrement que d'attendre que les rebonds cessent ?
Si ce n'est pas un blocage strict comme la fonction delay() c'est quand même un blocage car pour utiliser l'information du bouton il faut attendre que la lame cesse de rebondir.
Le principe matériel fonctionne sur deux constantes de temps :
A l'appui sur le bouton : Constante de temps de décharge du condensateur proche de 0s -> résistance de décharge > 1ohm
Au rebond : Constante de temps à la charge suffisamment grande (Résistance de charge >= 10 k) pour que le signal sur l'entrée numérique ne puisse pas dépasser le niveau du seuil de commutation.
Conclusion : la lame peut rebondir sans problème l'information est disponible dès l'appui.
Je pense que tu n'as pas bien digéré tes lectures où que tu as consulté des sites d'auto-proclamés experts qui "causent bien" mais qui en savent moins que toi.
@J-M-L
Que notre poseur de question veuille faire un anti-rebond logiciel ne me dérange pas, c'est son droit.
Ce qui me dérange c'est qu'il le fasse dans une interruption et qu'il s'étonne d'avoir des problèmes, c'est donner des bâtons pour se faire battre, et surtout ce qui me dérange c'est les affirmations fausses.
Je ne voudrai pas relancer la guerre filtrage hard/filtrage soft (tiens suis-je en train de le faire ? ;D), mais dans le cas d'un filtrage soft l'info est disponible dès l'appui.
if (digitalRead(button)==HIGH)
{
// Traitement immédiat ici sans aucune attente
delay(20);
}
Si on ne veut pas attendre qq ms, on peut utiliser millis().
Je vois trois problèmes dans ton filtrage des interruptions.
1-Même si tu dévalides l'interruption, lorsque l'interruption apparaît elle est latchée. Il faudrait donc acquitter l'interruption avant de la réautoriser.
2-Il peut y avoir des rebonds à l'ouverture des contacts, il faut donc interdire les interruptions aussi en cas d'ouverture, donc faire une routine d'interruption sur CHANGE.
3-La méthode que tu utilises me parait assez compliquée (quoique fonctionnelle), il suffit d'utiliser micros() lors de l'interruption et faire un retour immédiat si le temps depuis l'interruption précédente est inférieur à 1000µs.