Czy mam rację, myśląc, że jeśli masz dwa piny powodujące to samo przerwanie AVR PCINT, (np. Wektor PCINT0 spowodowany przez piny PCINT0 lub PCINT1 - myślę, że nakładanie się nazw wektorów i pinów jest mylące), jedynym sposobem ustalenia, który pin (s) spowodował, że przerwanie ma rejestrować swój stan po każdym przerwaniu i porównywać poprzednie i bieżące wartości wszystkich pinów, które są włączone w PCMSKn?
avr
interrupts
atmel
Tom Davies
źródło
źródło
Odpowiedzi:
To jest!
Powodem, dla którego istnieje 8 różnych styków zewnętrznych dla wektora przerwań, jest ułatwienie ułożenia płytki drukowanej lub użycie innego styku w przypadku konfliktu z inną funkcją styku.
Powiedzmy, że dbasz tylko o PB0 (PCINT0) i PB1 (PCINT1). Zatem maska włączania zmiany pinów PCMSK0 byłaby ustawiona na 0x03.
Więc jeśli
pins
jest 0x01, wiesz, że to był PB0 ... A jeśli chcesz wiedzieć, co się zmieniło, musisz to porównaćpreviousPins
, prawie dokładnie to, co myślałeś.Pamiętaj, że w niektórych przypadkach
pins
może być niedokładny, jeśli pin ma stan zmian od momentu przerwania, ale wcześniejpins = (PINB & 0x03)
.Inną opcją byłoby użycie oddzielnych wektorów przerwań z jednym pinem z każdego wektora, abyś wiedział, który jest zmieniany. Ponownie, to ma również pewne problemy, takie jak przerwania priorytetu i raz CPU wchodzi do ISR, globalny przerwania umożliwić bit
I-bit
wSREG
zostaną usunięte tak, że wszystkie inne przerwania są wyłączone, chociaż można ją ustawić wewnątrz przerwania jeśli chcesz, to byłoby być zagnieżdżonym przerwaniem.Aby uzyskać więcej informacji, zapoznaj się z notatką aplikacji firmy Atmel Korzystanie z zewnętrznych przerwań dla urządzeń megaAVR.
Aktualizacja
Oto kompletny przykład kodu, który właśnie tu znalazłem .
źródło
W nowszej serii ATTINY
INTFLAGS
rejestr powie ci, który bit portu spowodował przerwanie.Oto fragment arkusza danych:
źródło