Estou correto ao pensar que, se você tiver dois pinos causando a mesma interrupção AVR PCINT (por exemplo, vetor PCINT0 causado por pinos PCINT0 ou PCINT1 - acho que a sobreposição de nomes de vetores e pinos é confusa), a única maneira de determinar qual pino (s) causou a interrupção é registrar seu estado após cada interrupção e comparar os valores anteriores e atuais de todos os pinos que estão habilitados no PCMSKn?
avr
interrupts
atmel
Tom Davies
fonte
fonte
Respostas:
Isto é!
A razão pela qual existem 8 pinos externos diferentes para um vetor de interrupção é facilitar o layout da PCB ou usar um pino diferente se houver um conflito com outra função de pino.
Basicamente, digamos que você só se preocupa com PB0 (PCINT0) e PB1 (PCINT1). Portanto, a máscara de habilitação de alteração de pino PCMSK0 seria definida como 0x03.
Então, se
pins
0x01, você sabe que foi PB0 ... E se você precisa saber o que mudou, precisa compará-lo compreviousPins
, exatamente o que você pensou.Lembre-se de que, em alguns casos,
pins
pode não ser preciso se o pino mudar de estado desde a interrupção, mas antespins = (PINB & 0x03)
.Outra opção seria usar vetores de interrupção separados com um pino de cada vetor, para que você saiba qual deles foi alterado. Mais uma vez, isso também tem alguns problemas, como prioridade de interrupção e uma vez que a CPU entra no ISR, o mundial de interrupção bit de habilitação
I-bit
emSREG
serão apagados de forma que todas as outras interrupções estão desativadas, mas você pode configurá-lo dentro da interrupção, se quiser, que ser uma interrupção aninhada.Para obter mais informações, consulte a nota do aplicativo da Atmel, Usando interrupções externas para dispositivos megaAVR.
Atualizar
Aqui está um exemplo de código completo que acabei de encontrar aqui .
fonte
No registro mais recente da série ATTINY,
INTFLAGS
será informado qual bit de porta causou a interrupção.Aqui está um trecho da folha de dados:
fonte