Interrup () sur un nano.

Bonjour,

Encore une question ce jour,

Je m'interresse au interrupt et malgre tous les tutos a ce sujet, je voulais être sur d'avoir bien compris.

Sur un Nano seul les INT0 et INT1 sont affecte ?

Il est impossible de faire un interrupt sur une entrée analogique dont la valeur changerais d'etat ????

Merci de me confirmer car j'ai l'impression de chercher pour rien !

Merci

Tu peux faire une interruption sur n'importe quelle entrée de l'atmega: voir pin change interrupt qui permet de brancher un circuit logique qui s'occupe des interruptions sur n'importe quelle broche du microcontrôleur.

Par contre le fonctionnement est un petit peu différent de PD2 et PD3 (INT0 et INT1).

Avec INT0 et INT1 les fronts montants ou descendants sont détectés en hardware, alors qu'avec PINCHANGEINTERRUPT tu es obligé de le faire en software.

Va faire un.tour dans le sous forum Tutos et cours, dernière page (la 3) tout à la fin tu trouvera un tuto appelé Interruptions sur Atméga 328p.

En résumé il existe 2 catégories d'interruptions : Interruptions1 0 et 1 qui sont les plus simples et les plus complètes. Ce sont les seules gérées par l'IDE arduino. Interruptions sur des ports complets : toutes les pins sont concernées mais il y a un tout petit plus de travail à faire. Seul le changement de niveau est géré.

Dans le tuto tu verra aussi qu'il n'est obligatoire d'utiliser attachInterrupt. La macro Armel "ISR" peut s'utiliser directement, c'est au choix du programmeur. Bien évidement il faudra consulter la datasheet du micro, à télécharger obligatoirement sur le site Armel pour être sûr d'avoir la dernière version.x

PS Armel = Atmel :)

Grrr j'ai écris d'une tablette avec un clavier qui pense pour les autres, va falloir chercher pour désactiver.

dont la valeur changerais d'etat

C'est assez vague - il est hyper fréquent que même pour une entrée relativement stable vous ayez une lecture +/- 1 d'une valeur analogique

la question de fond c'est que cherchez vous à faire?

si vous lisez l'anglais il y a un article vraiment à lire qui est très bien (rédigé par un des modérateurs du site anglophone Nick Gammon)

ça vous donnera bcp d'infos

Ah j'ai peut être pas compris, mais tu veux que genre si sur ton entrée analogique sa passe de 2.5V à 3V, sa te déclenche une interruption?

Je serais toi je mettrais un if (monEntreeAnalogique >= valeur) Alors tu exécutes un bout de code

C'est pas une interruption mais tout dépend des contraintes de ton projet?

si vous voulez déclencher une interruption sur un passage de seuil de valeur analogique dans un sens et/ou dans l'autre, c'est possible (soit avec une référence interne et/ou externe selon les cartes arduino) - cherchez "Analog Comparator" dans la datasheet ATMEL ou lisez cela ou aussi cela (en anglais)

il y a aussi une librairie analogComp que vous pouvez regarder pour avoir une idée du code et des concepts associés (mais c'est assez simple à mettre en place sans librairie, donc je ne l'ai jamais utilisée)

En faite j'ai 3 entree analogique dont la valeur est au repos entre 1024 et 1001. En desous de se seuil il m'est prioritaire de lancer une action rapide vers une sortie digital. Actuellement je fonctionne sur base d'un If (analogRead (A5) >=999 || analogRead (A6) ) etc et sa fonctionne, mais je me demandais si il ne serais pas plus rapide avec des interruptions !!! car dans la loop j'ai pas mal de condition les une après les autres et la plus importante est Verifier A5, A6, A7

;)

La question de fond c’est la vitesse de réaction que vous voulez - qu’est-ce qui est acceptable pour vous? Quelques millisecondes ou micros?

La milliseconde me conviens très bien. Mais la question du temps se calcul en fonction de mon Sketch, au plus il est long au plus ma loop prend du temps a être exécuter ! Pour calculer le temps qu'il faut pour que ma boucle soit exécuter il faut que je mette mon code en ligne et que quelqu'un se casse la tète a le calculer lolll trop de temps perdu pour rien !

;)

Encore une fois je ne connais pas votre projet, mais je pense que vous n’avez aucune inquiétude à avoir sur la rapidité de votre programme.

En 16Mhz et programmation C/C++ l’atmega328p peut faire 1000 pins toggling (changements d’états sur une pin) en 944 micros secondes (résultat que j’obtiens avec ma bibliothèque). Avec Arduino le pin toggling est un peu plus lent, multiplié environ par 4.7 (résultat d’après un test l’année dernière), c’est à dire environ 4400 micro secondes (4.4ms).

A noter que la boucle for que j’utilise pour faire 1000 toggle prend 442 micro secondes à vide (pour 1000 itérations).

Maintenant, si dans cette boucle je fait un truc dans le genre:

for (n = 0; n < 1000; n++)
{
	potar.read();
	
	if (potar.value >= 999)
	{
		led.toggle();
	}
}

C’est à dire lecture d’une entrée analogique, condition de test, et changement d’état d’une pin, 1000 itérations de ceci donne 18540 micro secondes (18.54ms).

Je pense que c’est plus long avec Arduino, mais je ne pense pas que ce soit catastrophique non plus.

Ici 18540 / 1000 donne 18.54 micro secondes pour 1 itération, y a de la marge pour ton projet? :slight_smile:

Le_Joebar: Pour calculer le temps qu'il faut pour que ma boucle soit exécuter il faut que je mette mon code en ligne et que quelqu'un se casse la tète a le calculer lolll trop de temps perdu pour rien !

;)

Votre arduino peut calculer le temps d'exécution lui même: mesurer micros() en debut et fin de loop() et affichez la différence.. Ensuite il y a des techniques de programmation (machine état) où vous décomposez ce qui prend longtemps à exécuter et le coupez en petits bouts, un bout étant exécuté à chaque loop ce qui vous laisse l'option de tester autre chose fréquemment

Merci pour vos réponses

Effectivement le problème est bien moindre que je ne pensais donc. Même si je fait une lecture toute les 100 ms se n'es pas grave puisque ma lecture se fait sur une entré dont le temps de bascule "maintien du niveau haut moyen" est de 1 Sec donc même avec 100 ms sa ferais 10 lecture par cycle donc pas de quoi inquiéter.

:)