Nous interrompons ce programme pour vous apporter un tutoriel d'interruption Arduino

Ah oui ... le monde merveilleux et souvent mal compris des interruptions microcontrôleur. Vous cherchez à construire un projet qui repose sur le calendrier très précis ou doit réagir rapidement à une entrée? Ensuite, ne changent pas ce canal, mon ami. Dans ce tutoriel, nous allons couvrir ce que les interruptions sont, ce qu'ils font, et comment les utiliser.
Qu'est-ce qu'une interruption?
ISR? Signaux? Qu'est-ce que toutes ces absurdités pour?
Si vous êtes nouveau dans le monde du développement logiciel, on peut se demander pourquoi toute cette complication est nécessaire juste pour répondre à des événements extérieurs. Après tout, vous pouvez vérifier l'état des broches externes à tout moment, ou créer vos propres minuteries, non?
Vous pouvez certainement faire toutes ces choses dans votre code principal, mais les interruptions vous donner un avantage clé - ils sont asynchrones. Un événement asynchrone est quelque chose qui se produit en dehors du flux régulier de votre programme - il peut arriver à tout moment, peu importe ce que votre code est crissait sur le moment. Cela signifie que, plutôt que de vérifier manuellement si votre événement souhaité est arrivé, vous pouvez laisser votre AVR faire la vérification pour vous.
Utilisons un exemple réel. Imaginez que vous êtes assis sur votre canapé, en appréciant une bière givrée et regarder un film après une longue journée. La vie est belle. Il n'y a qu'un seul problème: vous attendez un paquet très important d'arriver, et vous en avez besoin le plus tôt possible. Si vous étiez un programme normal AVR ou un croquis Arduino, vous auriez à arrêter à plusieurs reprises votre film, se lever et aller vérifier la boîte aux lettres toutes les 5 minutes pour vous assurer que vous saviez quand le paquet était là.
Au lieu de cela, imaginez si le colis a été envoyé Fedex ou UPS avec accusé de réception. Maintenant, l'homme de livraison ira à votre porte d'entrée et sonner à la porte dès qu'il arrive. C'est votre déclencheur d'interruption. Une fois que vous obtenez le déclencheur, vous pouvez mettre en pause votre film et aller accord avec le paquet. C'est votre routine de service d'interruption. Dès que vous avez terminé, vous pouvez prendre le film où vous l'avez laissé, sans temps supplémentaire gaspillé. C'est la puissance des interruptions.
Les puces AVR utilisées dans la plupart Arduinos ne sont pas capables de traitement en parallèle, à savoir qu'ils ne peuvent pas faire plusieurs choses à la fois. En utilisant le traitement asynchrone via des interruptions nous permet de maximiser l'efficacité de notre code, donc nous ne perdons pas de cycles d'horloge précieux sur les boucles de vote ou attendre que les choses se produire. Interruptions sont également bonnes pour les applications qui nécessitent un timing précis, parce que nous savons que nous allons attraper notre événement le moment où il se produit, et ne manqueront pas accidentellement quoi que ce soit.
Types d'Interruptions
Il existe deux principaux types d'interruptions:
- Les alarmes de processus, qui se produisent en réponse à un événement externe, comme une broche d'entrée passe haut ou bas
- les interruptions de logiciel, qui se produisent en réponse à une instruction envoyée dans le logiciel
comme ceux qui alimentent les panneaux les plus Arduino, processeurs AVR 8 bits, ne sont pas capables d'interruptions logicielles (bien que vous pouvez les imiter en changeant l'état d'épingle dans le logiciel). Nous allons nous concentrer sur le matériel pour l'instant. La plupart des tutoriels là-bas parlent de la gestion des interruptions externes comme les changements de broches. Si vous utilisez un Arduino, qui est le seul type d'interruption les supports Arduino « langage », en utilisant la fonction attachInterrupt (). Très bien, mais il y a une toute autre catégorie d'interruptions matérielles qui dépendent de l'AVR construit dans minuteries, qui peut être très utile. Nous allons couvrir les interruptions externes dans ce tutoriel, passe ensuite sur les interruptions du minuteur dans un tutoriel de suivi, car il y a suffisamment d'informations pour justifier les choses de se séparer.
Comment obtenir une interruption pour faire ce que nous voulons - Interrompre service Routines
Chaque processeur AVR a une liste de sources d'interruption, ou des vecteurs. qui comprennent le type d'événements qui peuvent déclencher une interruption. Lorsque les interruptions sont activées et l'un de ces événements se produisent, le code sautera à un emplacement spécifique dans la mémoire de programme - le vecteur d'interruption. En écrivant un ISR, puis en plaçant un lien vers elle à l'emplacement de la mémoire du vecteur d'interruption, nous pouvons dire à notre code pour faire quelque chose de spécifique quand une alarme est déclenchée.
Implémentons cette aide d'un exemple simple: détecter quand un bouton-poussoir a été enfoncé, et effectuer une action en fonction de cette presse. Dans ce tutoriel, nous allons utiliser une carte standard Arduino pour rendre les choses cohérentes lorsque nous faisons référence aux broches et notre configuration du programme. Vous pouvez utiliser ces techniques avec trop AVR simple, il vous suffit de vérifier la fiche technique pour vous assurer que vous savez que les broches dont vous avez besoin. Voici notre exemple de circuit:

La mise en œuvre d'une interruption dans un programme
Pour utiliser avec succès une interruption, nous aurons besoin de faire trois choses:
- Set Interruptions validation globale de l'AVR bit du registre d'état
- Définissez l'interruption bit de validation pour notre vecteur d'interruption spécifique (chaque vecteur a son propre interrupteur marche / arrêt)
- Ecrire un ISR et le joindre à notre vecteur d'interruption cible
A partir de la première étape, nous allons inclure la bibliothèque d'interruption de avr-libc, puis utilisez une fonction-libc AVR définir notre interruption globale bit de validation. Ensuite, nous devons activer l'interruption que nous voulons. La plupart des 8 bits AVR comme les ATMega328 ont 2 interruptions matérielles, INT0 et INT1. Si vous utilisez une norme Arduino, ceux-ci sont liés aux broches numériques 2 et 3, respectivement. Nous allons permettre INT0 afin que nous puissions détecter un changement d'entrée sur la broche 2 d'un bouton ou un commutateur.
Enfin, nous allons définir un ISR qui exécute notre tâche souhaitée. Chaque ISR est défini comme suit:
où est le nom de notre vecteur d'interruption choisi. Encore une fois, les noms de ces vecteurs sont définis dans la feuille de données du processeur; ici, celui que nous voulons est EXT_INT0. Pour cet exemple, nous allons utiliser ISR pour activer la LED intégrée sur la broche 13.
Avec notre code LED ajouté, voici à quoi il ressemble tous ensemble:
Double-cliquez dans ce code pour le sélectionner afin que vous pouvez copier et coller dans vos propres croquis.
Notez que nous pouvons utiliser la boucle principale du programme () pour faire tout ce que nous voulons dans l'intervalle, et cela n'affectera pas la fonctionnalité de notre bascule LED.
fonctionnalité d'interruption Arduino
Pour notre exemple, nous pourrions utiliser la fonction attachInterrupt () pour activer la même interruption dans la configuration ():
Dans ce cas, nous définissons notre propre ISR sur mesure (pin2ISR) et passe comme un argument. pin2ISR () serait tout simplement prendre la place de l'ISR (EXT_INT0_vect). Cela est souvent un peu plus simple que d'utiliser les fonctions de libc-premières RVA, et il ne abstraire aucune différence dans les modèles de puces. Cependant, les méthodes d'AVR décrites plus haut peuvent être utilisés avec tout vecteur d'interruption, alors que attachInterrupt () fonctionne uniquement avec des interruptions externes.
Mettre tous ensemble
Il y a quelques dernières choses à garder à l'esprit lors de la mise en œuvre des interruptions.
Tout d'abord, gardez à l'esprit que ce que vous utilisez votre ISR pour, il est bon de le garder court, car alors que le ISR est en cours d'exécution, il tient le reste de votre programme. Si vous avez beaucoup d'interruptions, cela peut ralentir les choses à une exploration. En outre, par « le reste de votre programme », nous faisons tout dire. fonctions Arduino comme Millis () ne seront pas augmenter, et le retard () ne fonctionnera pas dans un ISR.
Enfin, les interruptions sont normalement globalement désactivées à l'intérieur d'un ISR (c'est pourquoi retard () et Millis () ne fonctionnent pas). Cela signifie que si plusieurs événements d'interruption se produisent avant que votre ISR a terminé, votre programme ne sera pas les attraper. Ceci est une autre raison de garder ISRs court.
Emballer
C'est à ce sujet pour les bases. Si vous êtes prêt à continuer, consultez notre article sur les interruptions de suivi minuterie. Il se fonde sur les concepts abordés ici et vous aide à utiliser les minuteries intégrées de l'AVR à faire des choses utiles. En attendant, la mise en œuvre cet exemple et plongez dans les Atmel pour découvrir Datasheets d'autres vecteurs d'interruption. Ils ciel est la limite!
Si vous avez apprécié ce tutoriel, assurez-vous de vous inscrire à nos mises à jour afin que vous puissiez avoir accès à tous nos matériels conseils et astuces de piratage. hacking heureux!