Ai-je raison de penser que si vous avez deux broches provoquant la même interruption AVR PCINT (par exemple, le vecteur PCINT0 provoqué par les broches PCINT0 ou PCINT1 - je pense que le chevauchement des noms des vecteurs et des broches prête à confusion), la seule façon de déterminer quelle broche (s) a provoqué l'interruption est d'enregistrer leur état après chaque interruption et de comparer les valeurs précédentes et actuelles de toutes les broches qui sont activées dans PCMSKn?
avr
interrupts
atmel
Tom Davies
la source
la source
Réponses:
C'est!
La raison pour laquelle il existe 8 broches externes différentes pour un vecteur d'interruption est de faciliter la disposition du PCB ou d'utiliser une broche différente en cas de conflit avec une autre fonction de broche.
À peu près, disons que vous ne vous souciez que de PB0 (PCINT0) et PB1 (PCINT1). Ainsi, le masque d'activation de changement de broche PCMSK0 serait défini sur 0x03.
Donc, si
pins
c'est 0x01, vous savez que c'était PB0 ... Et si vous avez besoin de savoir ce qui a changé, vous devez le comparerpreviousPins
, à peu près exactement ce que vous pensiez.Gardez à l'esprit dans certains cas,
pins
peut ne pas être précis si la broche a changé d'état depuis l'interruption mais avantpins = (PINB & 0x03)
.Une autre option serait d'utiliser des vecteurs d'interruption séparés avec une broche de chaque vecteur pour que vous sachiez lequel est changé. Encore une fois, cela a aussi des problèmes, comme priorité d' interruption et une fois que l'unité centrale de traitement entre ISR, le bit global d' interruption permettent
I-bit
enSREG
sera effacé afin que toutes les autres interruptions sont désactivées, mais vous pouvez le mettre à l' intérieur de l'interruption si vous voulez, ce serait être une interruption imbriquée.Pour plus d'informations, consultez la note d'application d'Atmel Utilisation des interruptions externes pour les appareils megaAVR.
Mise à jour
Voici un exemple de code complet que je viens de trouver ici .
la source
Sur la nouvelle série ATTINY, le
INTFLAGS
registre vous indiquera quel bit de port a provoqué l'interruption.Voici un extrait de la fiche technique:
la source