j'ai l'impression que ce sujet a largement dérivé.
Qu'est-ce que le code est censé faire ou démontrer?
Version imprimable
j'ai l'impression que ce sujet a largement dérivé.
Qu'est-ce que le code est censé faire ou démontrer?
Bonsoir
Mon problème d'origine était une détection supplémentaire d'interruption non dû à priori à un rebond du switch.
Delias m'a fait faire différentes manoeuvres pour essayer de solutionner ce problème.
Voilà pourquoi nous sommes repartis sur un sketch simple pour le localiser.
Il m'a orienté vers les registres et flags gérant les interruptions AVR.
Donc il n'y a pas dérive, et peut-être que la solution a été trouvé. J'attends la réponse de Delias.
Bonsoir à tous
C'est exactement cela pour la réponse à Jay M
Par contre le code, cela devrait être EIFR (le flag) pas EIMSK (le masque) qui résout le problème, car l'essai d'avant montre un résultat attendu (une interruption arrivée pendant la coupure de l'interruption est mise en mémoire dans le flag pour être exécutée au lancement.)
D'autant plus que le code de attachInterrupt écrit dans EIMSK.
Si tu utilises le _delay_ms(); je pense même que tout le code est transférable dans la fonction d'interruption. A modifier par petits pas et vérifier à chaque fois que cela n'a rien cassé.
Bonne suite
Delias
Bonjour Delias
Je suis tout à fait d'accord avec toi : c'est le flag du registre EIFR qui doit être remis à 0.
Je viens de faire l'essai en remplaçant EIMSK |= 1<<INT0; par EIFR &= ~(1<<INTF0); et effet bizarre, je retrouve mon problème de doublement de la détection !
Bonjour
Je me suis fais ba...é par la description du registre
Si le Flag est à un, il déclenche l'interruption, mais il faut écrire un 1 pour le faire passer à 0.Citation:
When an edge or logic change on the INT0 pin triggers an interrupt request, INTF0 becomes set (one). If the I-bit in SREG
and the INT0 bit in EIMSK are set (one), the MCU will jump to the corresponding interrupt vector. The flag is cleared when
the interrupt routine is executed. Alternatively, the flag can be cleared by writing a logical one to it.
Remplacer EIFR &= ~(1<<INTF0); par EIFR |= 1<<INTF0;.
Avec cette astuce, on est dans un des cas où la fonction bit() peut poser problème. Car c'est un des registres où la lecture n'est pas égale à l'écriture.
Si EIMSK |= 1<<INT0; fonctionne c'est que attachInterrupt lie la fonction passée en paramètre à l'interruption et detachInterrupt retire ce lien. Donc quand on fait cela, l'interruption est lancée, mais il n'y a plus de fonction à exécuter. Je suis étonné que cela ne plante pas simplement le micro (que cela provoque un Reset ou un fonctionnement aléatoire). Cela je ne l'ai vu que hier soir après ma réponse et j'ai compris l'implication que maintenant.
Delias
Bravo Delias. C'est bien ça, maintenant cela fonctionne parfaitement.
Je dois avouer que j'ai lu et relu les datasheets et que je n'ai rien vu.
J'ai intégré la solution dans mon projet final et c'est ok.
Cela me permet de gagner un switch sur mon montage donc un I/O car au lieu d'avoir un bouton pour le ON et un bouton pour le OFF, je n'en ai plus qu'un qui fait alternativement les fonctions .
Je te remercie pour ton aide précieuse et la transmission de ton savoir.
Bien cordialement
Michel