As interrupções INT1 e INT0 podem ser ativadas por edge ou nível, já INT2 apenas por edge, INT1 e INT0 são configuradas em MCUCR, bits ISC1x e ISC2x, para a interrupção INT0:
Além de alterar o modo como se entra na interrupção, em GICR há a máscara das três interrupções, o bit INT0 habilitará essa interrupção.
Nesse exemplo foi utilizado um encoder para uso com knob's, ele tem 5 pinos, 2 referentes à chave que é NA, e outros três relativos ao encoder, que é modula

Ou seja, em uma saída do encoder foi colocada a interrupção, como na entrada será após o edge negativo, o estado dessa entrada é conhecido (0), e a direção será o valor da outra entrada, nesse caso foi colocada em PD3, logo ao lado do INT0.
Esse tipo de encoder é comum para encoders óticos, onde existe um disco impresso por processo fotográfico, onde há diversas divisões pretas, radiamente ao disco, e dois sensores óticos, localizados entre si de tal forma que haja a codificação por quadratura, como no encoder para knob, que pode ser encontrado desde em aparelhos de som até no meu osciloscópio, são 6 deles.
Foi usada a mesma rotina para o Timer0 e displays que na parte anterior, poucas coisas mudaram nesse exemplo, além da adiçã
A foto do encoder é mostrada logo ao lado, os capacitores são de mesmo valor que os ilustrados num datasheet de encoder similar da Panasonic, apenas por falta de espaço não adicionei os resistores em série, necessários para diminuir a corrente quando o estado da chave sofrer uma mudança de 1->0 ou seja edge negativo, onde a energia armazenada no capacitor se dissipa nos contatos do encoder (que suportam uma corrente baixa a ponto de se precisar de resistor em série).
Os capacitores são de 10nF, mas se você observar a figura anterior não há resistor de pullup, o que foi utilizado são os dois resistores de pullup do ATMEGA16, eles são ativos individualmente conforme explicado na parte anterior sobre portas.
Observe que o estado de SFIOR & _BV(PUD) após a inicialização é 0, logo os pullups estão ativos na inicialização e permanecerão.
Foto tirada do osciloscópio, com o encoder sendo girado rapidamente:

Na próxima figura são mostradas as diferenças entre o exemplo anterior e este, observe que a variável encoder é global, sua declaração foi omitida por falta de espaço.

Além de saber como inicializar as interrupções, é preciso estar atento ao nome dos vetores, já que as interrupções no AVR são vetoradas, para o AVR-GCC uma fonte dessa informação é dada a seguir:
http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
Por enquanto é só, comente!!!
0 comentários:
Postar um comentário