J'essaie de créer une interruption temporisée avec Arduino. Je voudrais utiliser la fonction interrupts (), car c'est une interruption interne.
Exemple: Disons, je voudrais faire un clignotement léger allumé et éteint, avec seulement le temps de l'interruption.
Il existe un exemple de code, mais il utilise des interruptions externes (attachInterrupt ()). Je voudrais continuer à utiliser les interruptions internes.
arduino
microcontroller
interrupts
Aléatoire
la source
la source
Réponses:
Le blog de Noah Stahl a un exemple de clignotement d'une LED avec Timer2 . Avec cela et la fiche technique, vous devriez être en mesure de l'adapter à l'interruption que vous souhaitez utiliser - c'est-à-dire l'interruption dont vous pouvez vous permettre d'abandonner la fonction normale ou que vous êtes prêt à modifier. Timer2 est généralement utilisé pour certaines fonctions PWM.
Son exemple cite l'ATmega2560; Je peux confirmer qu'il fonctionne également avec un ATmega328p. Parcourez son site pour des exemples d'interruptions Arduino plus utiles.
Éditer:
Voici ma version légèrement modifiée - principalement dans les commentaires - du code de Noah. Appelez Timer2init () à partir de la fonction de configuration Arduino () après avoir initialisé toutes les structures de données ou le matériel associés, car le chronométrage - et l'interruption - commencera une fois que vous le ferez.
F / ex, je l'ai utilisé pour multiplexer un affichage à 3 chiffres à 7 segments, donc avant d'initialiser la minuterie, j'ai initialisé les registres d'E / S d'affichage et effacé les données d'affichage à l'endroit où l'ISR le recherchera.
Il y a un tableau dans les commentaires de quelques données de synchronisation utiles de la fiche technique et mes propres calculs pour référence pour mettre en place un autre schéma de synchronisation.
La macro ISR () prend soin de créer un code d'entrée et de sortie d'interruption pour un ISR à la place de l'entrée et de la sortie d'une fonction normale, et de le lier avec le vecteur d'interruption approprié. Le reste de cette fonction est 1) le code à exécuter à chaque interruption, et 2) le code de code pour réinitialiser le temporisateur pour la prochaine interruption.
Tel qu'il est écrit, cela devrait se retrouver dans une esquisse .pde ou .ino (ou un fichier .cpp, si vous utilisez eclipse, f / ex). L'esquisse doit # définir LEDPIN, et setup () doit appeler Timer2init (). La fonction de boucle peut être vide ou non; la LED devrait commencer à clignoter au téléchargement (enfin, littéralement, après l'appel de Timer2init ()).
la source
La fonction attachInterrupt () attache en fait une interruption à un changement d'état externe sur une broche, elle n'a pas d'autres options.
Sur la même page, les options de mode sont répertoriées comme:
Désolé d'être porteur de mauvaises nouvelles, c'est aussi une des premières choses que j'ai recherchées.
la source
Cet article sur PWM clarifiera beaucoup de vos doutes concernant l'utilisation des minuteries Arduino. Il y a deux temporisateurs 8 bits et un temporisateur 16 bits sur Arduino. Il n'y a pas d'API de haut niveau pour accrocher la fonction ISR directement sur les temporisateurs, qui est livrée avec le SDK Arduino (c'est-à-dire en tant que bibliothèque standard), mais une méthode de niveau un peu plus bas pour définir les registres de fonctions spéciales et l'arithmétique des bits / opérations sur eux. Cependant, il existe une bibliothèque contribuée par l'utilisateur appelée Timer one .
la source
Arduino utilise les trois temporisateurs dans ATMega328.
Timer1
(16 bits) est utilisé pour les fonctions commedelay()
etmillis()
et pour la sortie PWM sur les broches 5 et 6. Les deux autres temporisateurs -Timer0
etTimer2
sont utilisés pour la sortie PWM sur les broches 3, 9, 10, 11.Il n'y a donc pas de fonction Arduino pour l'interruption de la minuterie. Mais il y a un moyen. Vous pouvez utiliser ce code pour activer l'interruption du minuteur sur
Timer2
:J'ai écrit ce code sans tester, il est donc possible que j'ai fait une erreur. Dans ce cas, consultez la fiche technique, p.156 .
Si vous souhaitez changer la fréquence de la minuterie (pré-échelle), changez simplement le registre
TCCR2A
. Pour plus d'informations, consultez la fiche technique page 153. Mais si vous changez la fréquence de la minuterie, vous changez également la fréquence du signal PWM sur deux broches de sortie!la source
Timer0
etTimer2
sont 8 bits et seulementTimer1
16 bits.