É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 ?