Arduino nano every vs copie BUG - Nano-ordinateur, microcontrôleurs, FPGA - Electronique, domotique, DIY
Marsh Posté le 20-04-2023 à 13:42:45
Code :
|
Marsh Posté le 20-04-2023 à 16:42:47
T'as bien remis ton CD4543 je suppose? Dans le bon sens aussi?
Je vais regarder le code tout à l'heure si j'ai le temps. En attendant, si tu as un schéma du montage que tu peux poster...
Marsh Posté le 20-04-2023 à 19:31:22
Bon, y'a quelque soucis avec ce code...
Déjà ceci
for (byte i=5; i<6;i--) |
me paraît pas bon, mais surtout: Tes BP ont ce qu'on appelle du "bounce", autrement dit si tu appuies dessus en réalité tu as plusieurs petits appuis brefs à cause de la mécanique du bouton. Du coup si tu mets une interruption directement tu vas avoir l'interruption qui s'exécute plusieurs fois, le nombre exact étant imprévisible.
Il ne faut donc jamais mettre d'INT sur un BP (sauf pour réveiller un µC qui dort).
Je ne sais bien sûr pas si ton soucis vient de la mais c'est une possibilité. Je suppose que tu n'as pas d'oscilloscope? Alors rajoute un simple compteur dans chaque fonction INT et transmet le nombre (variable "volatile"!) dans la main par port série et regarde si ça déconne comme je décrivais plus haut.
Aussi les variables >8 bits faut faire du "atomic acess" en principe, sinon bonjour les bugs qui surviennent que rarement.
Marsh Posté le 30-05-2023 à 21:37:03
Je ne saurais plus dire pour arduino, j'y ai peu utilisé les interruptions.
Néanmoins il y a un problème de conception, dans une interruption, tu ne mets qu'un boolean et si tu veux vraiment être propre, tu désactives l'interruption dans l'interruption.
Cela permet de conserver le CPU pour le programme courant et cela évite le cas de figure décrit par rat.
Qui plus est, toutes les variables des interruptions doivent être en volatile (accès immédiat et changement possible en cours de scripts).
Là, mettons que tu ais des micro coupures sur les 2 boutons, t es pas dans la merde
---------
Je suis fainéant et j'ai pas envie de réécrire ton code, mais en gros, dans evenement_start() et evenement_reset(), tu ne mets que un truc genre "status_evenement_start_nommage_de_variable = true;cli();" (le cli est peut etre un peu trop trash mais faut ce qu'il faut ma bonne dame)
Et dans le loop, tu test si status_evenement_start_nommage_de_variable.
Si oui, tu fais tes actions puis tu relances l'interruption.
Si tu as des micro contacts, tu peux rajouter un petit delay();
----------
Sinon tu fais un compteur de bouton, donc dans l'interruption, tu fais juste un status_evenement_start ++; et tu remets à 0 dans ta boucle. Tu sauras déjà si ton bouton lance plusieurs fois l'INT ou pas
-------------
Ton utilisation des for "fonctionnent" mais sont conceptuellement faux. En faite quand i = 0 et que tu fais i--, i = 255, d'où l'arrêt.
Marsh Posté le 30-05-2023 à 21:44:18
froggycorp a écrit : tu désactives l'interruption dans l'interruption |
Attention, surtout pas pour les AVR, car c'est automatique! (Quand le µC exécute une INT il va désactiver le drapeau "I" dans le SREG et quand l'INT est terminée la dernière instruction "reti" mise par le compilateur va faire revenir le processeur là où il était ET réactiver les INT.)
EDIT:
Citation : Qui plus est, toutes les variables des interruptions doivent être en volatile (accès immédiat et changement possible en cours de scripts). |
et en atomic access pour les vars > 8 bits.
Marsh Posté le 30-05-2023 à 21:51:31
Le but c'est de désactiver l'INT jusqu'à ce qu'il l'a traite dans le loop pour éviter qu'elle ne soit activer plusieurs fois avant traitement Dans son cas de figure (ancien, encore une fois ...), cela n'a pas d'intérêt de compter le nombre de micro contact.
Je concède qu'on peut juster désactiver la dite interruption ^^
Marsh Posté le 20-04-2023 à 13:41:54
Bonjour,
J'étais tranquillement en train de bosser sur un projet de chronomètre géant lorsque la fatigue me frappa et me fit commettre l’irréparable, j'ai inter-changé mon CD4543 avec mon ULN2003 par mégarde et depuis mon arduino nano every ne fonctionne plus. Jusque-là rien de choquant, je vais racheter un arduino nano, pas un every et pas un original une copie de chez Whadda / Velleman
Je retourne dans l'appli arduino je reteleverse avec succès le même programme (joint en réponse) et là le chronomètre affiche bien les 0 du départ, mais aucune réaction lorsque j'actionne le BP qui contrôle le départ/l'arret !
Je mets des serial print pour voir ce qu'il se passe dans le programme et je vois que l'état du BP change bien, mais que les chiffres que je veux afficher reste bien à 0, je n'y comprends plus rien !
Je dois terminer ce projet absolument pour une compétition samedi prochain ! Si une âme charitable pleine de connaissance peut me venir en aide, j'en serai ravi )
Belle journée,
Clément.
Modifier le message