Etape 11 : Comment puis-je nous débarrasser du bouton ? Version 3
Il existe de nombreuses façons, que nous pourrions aller de l’avant. Tout d’abord, nous pourrions ajouter matériel pour se débarrasser du bouton. Par exemple nous pouvons essayer de mettre un transistor dans le circuit à la ligne de sortie de la keypress afin qu’il prendrait un petit filet du courant de la sortie et envoyer une impulsion de 5V sur la broche d’interruption PD2.
Cependant, qui serait probablement trop bruyant à tout le moins et au pire qu'il ne permettrait pas assez de temps pour une lecture de keypress précis puisque la tension de sortie du clavier n’aurait pas eu le temps de stabilze avant que l’ADC lecture est capturée.
Donc nous viendrait plutôt vers le haut avec une solution logicielle. Ce que nous voudrions faire, c’est ajouter une interruption sur la broche PD2 et écrire un gestionnaire d’interruption pour lui, qui appelle une seule lecture de l’axe du clavier. En d’autres termes, nous débarrasser de l’interruption de l’autotrigger de l’ADC et ajouter une interruption externe qui appelle l’ADC à l’intérieur. De cette façon, le signal de lire l’ADC vient après le signal PD2 a déjà eu lieu et cela pourrait donner des choses assez de temps pour se stabiliser à un voltage précis avant la broche PC0 est lu et converti. Nous aurions encore une réalisation ADC interrupt qui exporte le résultat à l’affichage de l’analyseur à la fin.
Donner un sens ? Eh bien nous allons le faire...
Jetez un oeil à nouveau code attaché.
Vous voyez les changements suivants :
- Nous avons ajouté un rjmp à .org adresse 0 x 0002 pour gérer les interruptions externes INT0
- Nous avons changé le registre EIMSK pour indiquer que nous voulons interrompre sur la broche de INT0
- Nous avons changé l’ADATE broche dans le registre ADCSRA pour désactiver autotriggering
- Nous nous sommes débarrassés des paramètres ADCSRB, car ils sont hors de propos quand ADATE est éteint
- Nous n’avons plus de réinitialiser l’indicateur de déclenchement externe car la routine d’interruption INT0 fait automatiquement quand il termine--auparavant nous n’avions pas une routine d’interruption, nous juste déclenché l’ADC hors d’un signal à la broche, donc nous avons dû effacer ce drapeau à la main.
Maintenant dans le gestionnaire d’interruption, nous demandons simplement une conversion simple de l’ADC.
Exercice 5: exécuter cette version et voir ce qui se passe.