¿Estoy en lo cierto al pensar que si tiene dos pines que causan la misma interrupción AVR PCINT (por ejemplo, el vector PCINT0 causado por los pines PCINT0 o PCINT1? Creo que la superposición de nombres de vectores y pines es confusa) la única forma de determinar qué pin (s) causó la interrupción es registrar su estado después de cada interrupción y comparar los valores anteriores y actuales de todos los pines que están habilitados en PCMSKn?
avr
interrupts
atmel
Tom Davies
fuente
fuente
Respuestas:
¡Está!
La razón por la que hay 8 pines externos diferentes para un vector de interrupción es para facilitar el diseño de la PCB o usar un pin diferente si hay un conflicto con otra función de pin.
Más o menos, digamos que solo te importan PB0 (PCINT0) y PB1 (PCINT1). Por lo tanto, la máscara de habilitación de cambio de pin PCMSK0 se establecería en 0x03.
Entonces, si
pins
es 0x01, sabes que era PB0 ... Y si necesitas saber qué cambio necesitas compararpreviousPins
, más o menos exactamente lo que pensaste.Tenga en cuenta que en algunos casos,
pins
puede no ser preciso si el pin tiene cambios de estado desde la interrupción pero antespins = (PINB & 0x03)
.Otra opción sería usar vectores de interrupción separados con un pin de cada vector para que sepa cuál se cambia. Una vez más, esto también tiene algunos problemas, como la prioridad de interrupción y una vez que la CPU entra en el ISR, el mundial de interrupción bit de habilitación
I-bit
en laSREG
que se borrará de manera que el resto de las interrupciones están deshabilitadas, aunque se puede establecer dentro de la interrupción si quieres, que lo haría ser una interrupción anidadaPara obtener más información, eche un vistazo a la nota de la aplicación Atmel Uso de interrupciones externas para dispositivos megaAVR.
Actualizar
Aquí hay un ejemplo de código completo que acabo de encontrar aquí .
fuente
En el registro más reciente de la serie ATTINY
INTFLAGS
le dirá qué bit de puerto ha causado la interrupción.Aquí hay un extracto de la hoja de datos:
fuente