Tutoriel d’assembleur AVR 7 (7 / 12 étapes)

Étape 7: Écrire le gestionnaire d’interruption

Dans la dernière étape, nous avons vu que nous avons mis en place afin qu’un front montant détecté sur PD2 déclenchera un analogique/digital conversion sur PC0 et lorsque cette conversion est terminée, il lèvera une interruption complète de Conversion ADC. Maintenant, nous voulons faire quelque chose avec cette interruption.

Si vous examinez le tableau 12-6 à la page 65, vous pourrez voir une liste des interruptions possibles. Nous avons déjà vu l’interruption RESET à l’adresse 0 x 0000 et l’interruption Timer/Counter0 déborder à l’adresse 0 x 0020 dans les tutoriels précédents. Maintenant, nous voulons regarder l’interruption ADC où l'on voit par la table est à l’adresse 0x002A. Ainsi, au début de notre code en langage assembleur, nous aurons besoin une ligne qui se lit :

 .org 0x002Arjmp ADC_int 

qui passera à notre gestionnaire d’interruption étiquetée ADC_int chaque fois que l’ADC a terminé une conversion. Alors, comment est-ce que nous devrions écrire notre gestionnaire d’interruption ?

La façon dont fonctionne l’ADC est en effectuant le calcul suivant :

 ADC = Vin x 1024 / Vref 

Alors nous verrons ce qui se passe si je pousse le bouton « redial » sur le clavier. Dans ce cas la tension sur PC0 va changer à une valeur, dites 1.52V, et comme Vref est à 5V nous aurons :

 ADC = (1.52V) x 1024 / 5V = 311.296 

et donc il pourrait apparaître comme un 311. Si nous voulions convertir ce retour à une tension que nous serait tout simplement inverser le calcul. Nous n’aurez pas besoin pour ce faire toutefois puisque nous ne sommes pas intéressés par les tensions réelles juste à faire la distinction entre eux.

Lorsque la conversion est terminée, le résultat est stocké dans un nombre de 10 bits, placé dans des registres ADCH et ADCL et nous avons amenée à être « gauche ajusté » ce qui signifie que les 10 bits commencent à bit 7 de ADCH et aller vers le bas à bit 6 de ADCL (il y a 16 bits total dans ces deux registres et nous n’utilisons que 10 d'entre eux c'est-à-dire 1024 canaux). Nous pourrions avoir le résultat « droite ajusté » si nous voulions en désactivant le ADLAR bit dans le registre ADMUX. La raison pour laquelle nous choisissons gauche ajusté est parce que nos signaux est assez éloignés que les deux derniers chiffres du numéro de canal ne sont pas pertinentes et sont probablement que du bruit donc on distinguera les pressions sur les touches en utilisant seulement les 8 chiffres supérieurs, en d’autres termes, nous ne devrons regarder ADCH pour déterminer quel bouton a été enfoncé.

Donc notre gestionnaire d’interruption devrait simplement lire le nombre hors du Registre ADCH, convert qui COMP en une valeur de clavier et ensuite envoyer cette valeur à notre analyseur de Registre LED afin que nous pouvons vérifier que pousser un « 9 » dire, entraînera les LED correspondant à "00001001" s’allume.

Avant que nous aller aussi loin, mais nous devons d’abord voir ce qui se présente en ADCH quand on pousse les différents boutons. Nous allons donc il suffit d’écrire un gestionnaire d’interruption simple qui envoie juste le contenu de ADCH à l’affichage de l’analyseur.

Voici donc ce qu’il faut :

 ADC_int:lds analyzer, ADCH ;load the value of ADCH into our analyzersbi EIFR,0 ; clear the external interrupt flag so that it is ready to go againreti 

Maintenant, vous devriez être capable de juste copier le code de notre analyseur dans tutoriel 5 et ajouter cette interruption et les paramètres de la bascule et exécutez-le.

Exercice 2: Écrire le code et l’exécuter. Voir que vous obtenez l’ADCH affichant à l’écran de l’analyseur. Essayer de pousser le keypress même plusieurs fois. Avez-vous toujours la même valeur dans ADCH ?

Articles Liés

Tutoriel d’assembleur AVR 11

Tutoriel d’assembleur AVR 11

Bienvenue au didacticiel 11 !Dans ce bref didacticiel, nous allons enfin construire la première partie de notre projet final.La première chose que vous devriez faire est d'aller à la toute dernière étape de ce tutoriel et voir la vidéo. Puis revenez
Tutoriel d’assembleur AVR 1

Tutoriel d’assembleur AVR 1

J'ai décidé d'écrire une série de tutoriels sur la façon d'écrire des programmes de langage d'assemblage pour le Atmega328p qui est le microcontrôleur utilisé dans l'Arduino. Si les gens restent intéressées, je vais continuer à mettre un une semaine
Tutoriel d’assembleur AVR 8

Tutoriel d’assembleur AVR 8

Bienvenue au didacticiel 8 !Dans ce bref didacticiel, nous allons prendre un peu d'une déviation de l'introduction de nouveaux aspects de la programmation en langage assembleur pour montrer comment déplacer nos composants de prototypage pour un circu
Tutoriel d’assembleur AVR 6

Tutoriel d’assembleur AVR 6

Bienvenue au didacticiel 6 !Tutoriel d'aujourd'hui sera un court où nous mettrons au point une méthode simple pour transmettre des données entre un atmega328p et un autre à l'aide de deux ports qui les relient. Nous puis prendre dés rouleau de tutori
Tutoriel d’assembleur AVR 9

Tutoriel d’assembleur AVR 9

Bienvenue au didacticiel 9.Aujourd'hui nous allons montrer comment piloter un afficheur 7 segments, mais aussi un affichage à 4 chiffres à l'aide de notre code en langage assembleur ATmega328P et AVR. Ce faisant cela que nous allons devoir prendre de
Tutoriel d’assembleur AVR 2

Tutoriel d’assembleur AVR 2

Ce tutoriel est une continuation de "tutoriel d'assembleur AVR 1"Si vous n'avez pas passé par 1 tutoriel, vous devez arrêter maintenant et faire celui-là en premier.Dans ce tutoriel, nous allons poursuivre notre étude de programmation en langage
Tutoriel d’assembleur AVR 10

Tutoriel d’assembleur AVR 10

Bienvenue au didacticiel 10 !Désolé, qu'il a fallu si longtemps pour sortir cette nouvelle tranche mais c'est un moment assez intense de l'année. En tout cas, ici c'est !Nous avons parcouru un long chemin et vous êtes probablement déjà assez compéten
Tutoriel d’assembleur AVR 5

Tutoriel d’assembleur AVR 5

Aujourd'hui nous allons regarder de plus près aux divers emplacements mémoire dans le microcontrôleur Atmega328p et voir si nous pouvons mieux comprendre comment les choses sont stockés, où ils sont stockés et comment les pointeurs et les tables de r
Tutoriel d’assembleur AVR 4

Tutoriel d’assembleur AVR 4

Bienvenue au didacticiel numéro 4 !Dans ce tutoriel, nous allons construire un circuit qui simulera l'enroulement des deux dés. Ensuite, nous allons tout d'abord écrire un programme de force brute qui fait le travail. Puis nous permettra de simplifie
Tutoriel d’assembleur AVR 3

Tutoriel d’assembleur AVR 3

Bienvenue au didacticiel numéro 3 !Avant que nous commencions, je tiens à faire un point philosophique. N'ayez pas peur d'expérimenter avec les circuits et le code que nous construisons dans ces tutoriels. Changer les câbles près, ajouter de nouveaux
MRETV - vidéo, stéréo Sound et beaucoup plus d’un Arduino standard !

MRETV - vidéo, stéréo Sound et beaucoup plus d’un Arduino standard !

MRETV - vidéo, stéréo Sound et beaucoup plus d'un Arduino standard !Maintenant mis à jour pour Arduino 1.6.6 novembre 2015 !Utiliser seulement deux résistances et deux diodes pour générer la vidéo plein écran. Texte 47 x 29 de 8 x 8 caractères, doubl
Comment charger des programmes à un Arduino UNO de Atmel Studio 7

Comment charger des programmes à un Arduino UNO de Atmel Studio 7

Dans ce court Instructable, nous allons apprendre à charger un programme à une carte Arduino UNO utilisant Atmel Studio au lieu de l'IDE Arduino. Cela est utile lorsque vous avez besoin élaborer un programme à l'aide de plusieurs fonctions avancées o
Star Trek sonnette Hack

Star Trek sonnette Hack

J'ai toujours été un fan de la Star Treks et comme tel, j'étais très excité lorsque mon colocataire ramené un panneau la comm série style Star Trek original. Je n'avais jamais vu l'un d'entre eux, mais une recherche rapide nous a pris sur le site de
Carte de développement pour microcontrôleurs Attiny84

Carte de développement pour microcontrôleurs Attiny84

Il s'agit d'une carte de développement pour microcontrôleur Attiny84. Tha Attiny84 puce possède 11 broches adressables avec l'IDE Arduino, 8k de mémoire flash pour le stockage de programme et 512 octets de mémoire vive disponible pour les variables d