Habe ich Recht , wenn Sie zwei Pins haben, die denselben AVR-PCINT-Interrupt verursachen (z. B. PCINT0- Vektor , der entweder durch PCINT0- oder PCINT1-Pins verursacht wird - ich denke, die Namensüberlappung von Vektoren und Pins ist verwirrend), ist der einzige Weg, um zu bestimmen, welcher Pin (s) verursacht, dass der Interrupt ihren Status nach jedem Interrupt aufzeichnet und die vorherigen und aktuellen Werte aller Pins vergleicht, die in PCMSKn aktiviert sind?
avr
interrupts
atmel
Tom Davies
quelle
quelle
Antworten:
Es ist!
Der Grund, warum es 8 verschiedene externe Pins für einen Interrupt-Vektor gibt, besteht darin, das Layout der Leiterplatte zu vereinfachen oder einen anderen Pin zu verwenden, wenn ein Konflikt mit einer anderen Pin-Funktion besteht.
Nehmen wir an, Sie interessieren sich nur für PB0 (PCINT0) und PB1 (PCINT1). Die Pinwechsel-Aktivierungsmaske PCMSK0 würde also auf 0x03 gesetzt.
Wenn
pins
also 0x01 ist, wissen Sie, dass es PB0 war ... Und wenn Sie wissen müssen, was sich geändert hat, müssen Sie es vergleichenpreviousPins
, ziemlich genau das, was Sie dachten.Beachten Sie in einigen Fällen, dass dies
pins
möglicherweise nicht genau ist, wenn der Status des Pins seit dem Interrupt geändert wurde, jedoch vorherpins = (PINB & 0x03)
.Eine andere Möglichkeit wäre, separate Interrupt-Vektoren mit einem Pin von jedem Vektor zu verwenden, damit Sie wissen, welcher geändert wird. Auch dies hat auch einige Probleme, wie Interrupt - Priorität und wenn die CPU die ISR eintritt, der globale Interrupt - Freigabebit
I-bit
inSREG
wird so gelöscht werden , dass alle anderen Interrupts deaktiviert sind, obwohl Sie es innerhalb der Interrupt einstellen können , wenn Sie wollen, das wäre ein verschachtelter Interrupt sein.Weitere Informationen finden Sie in Atmels App-Hinweis Verwenden externer Interrupts für MegaAVR-Geräte.
Aktualisieren
Hier ist ein vollständiges Codebeispiel, das ich gerade hier gefunden habe .
quelle
Im neueren
INTFLAGS
Register der ATTINY-Serie erfahren Sie, welches Portbit den Interrupt verursacht hat.Hier ist ein Auszug aus dem Datenblatt:
quelle