Mini curso sobre AVR parte 8 - Gerando interrupções com um encoder

Mais um post do mini curso, hoje sobre as interrupções externas ao ATMEGA16, existem três pinos de interrupção, INT2, INT1 e INT0, todos estão no capítulo External Interrupts do datasheet.

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:

Abaixo, a interrupção nesse caso será ativada por falling Edge, ISC01 e 00=1.

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 é modulado em quadratura, logo dado algum edge, o sentido de rotação é dado pelo valor do outro bit.

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ção de outro ISR e a mudança no main.

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