Étape 2: Structuration minuteur interrompt
Code d’installation minuterie se fait à l’intérieur de la fonction setup() de {} dans une esquisse de l’Arduino.
Le code pour configurer les interruptions de minuterie est un peu intimidant à regarder, mais il n’est pas réellement difficile. J’ai assez beaucoup plus simplement copier le même morceau principal du code et changer le Prédiviseur et comparer le registre de correspondance pour définir la fréquence d’interruption correcte.
La structure principale de la configuration d’interruption ressemble à ceci :
Notez comment la valeur de OCR #A (la valeur de correspondance comparer) change pour chacune de ces configurations de minuterie. Comme expliqué dans la dernière étape, il a été calculé selon l’équation suivante :
comparer le registre de correspondance = [16 000, 000Hz / (prescaler * désiré fréquence interrupt)] - 1
n’oubliez pas que lorsque vous utilisez des minuteries 0 et 2 ce nombre doit être inférieure à 256 et inférieure à 65536 de timer1
Notez également comment les configurations entre les trois minuteries diffèrent légèrement dans la ligne qui active le mode de la CCT :
TCCR0A | = (1 << WGM01); //for timer0
TCCR1B | = (1 << WGM12); //for timer1
TCCR2A | = (1 << WGM21); //for timer2
Cela découle directement de la feuille de données de l’ATMEL 328/168.
Enfin, remarquez comment le programme d’installation pour les convertisseurs suit les tableaux dans la dernière étape (la table pour le timer 0 est répétée plus haut),
TCCR2B | = (1 << CS22) ; Jeu CS #2 bit pour 64 Prédiviseur pour minuterie 2
TCCR1B | = (1 << CS11) ; Jeu CS #1 bit pour 8 Prédiviseur pour minuterie 1
TCCR0B | = (1 << CS02) | (1 << CS00) ; Définissez les bits de CS #2 et CS #0 pour 1024 Prédiviseur pour le timer 0
Remarquez dans la dernière étape qu’il existe différents prescaling des options pour les temporisations différentes. Par exemple, timer2 n’a pas l’option de 1024 Prédiviseur.
Les commandes à exécuter au cours de ces interruptions de minuterie sont trouvent dans le sketch Arduino encapsulé dans ce qui suit :
ISR(TIMER0_COMPA_vect) {//change 0 à 1 pour timer1 et 2 pour timer2
Interrupt commandes ici
}
Ce morceau de code doit être placé en dehors des fonctions setup() et loop(). Aussi, essayez de garder la routine d’interruption aussi courte que possible, surtout si vous êtes interrompu à une fréquence élevée. Il peut même être utile abordant les ports/broches de la puce ATMEL directement au lieu d’utiliser les fonctions digitalWrite() et digitalRead(). Vous pouvez trouver plus d’infos sur ce ici.
Exemple-l’esquisse suivante configure et exécute 3 interruptions de minuterie :
Les images ci-dessus montrent les résultats de ces interruptions de minuterie. Fig. 1 montre une onde carrée oscillant entre 0 et 5 v à 1kHz (interruption timer0), Fig. 2 montre la LED attachée à la broche 13 allumer pendant une seconde puis éteindre pendant une seconde (timer1 interrupt), Fig. 3 montre une onde de pouls, oscillant entre 0 et 5V à une fréquence de 4khz (timer2 interrupt).