Olha... eu tomei uma surra por causa desses encoders...
Porque eu comprei um punhado e o vendedor me mandou um datasheet dizendo que, bastaria pegar uma interrupção, por exemplo na borda de subida; aí testava o outro pino, se estivesse em 0 era um sentido; se estivesse em 1 era outro... só que não funcionava! Aí eu dei uma pesquisada e descobri que o maldito funcionava por um tal código Gray. Pronto! O código de teste que eu fiz aqui num protoboar com z8 encore @ 18MHz é o seguinte:
- Código: Selecionar todos
// Interrupção em ambas bordas de PC0.
#pragma interrupt
void Int_PC0(void)
{
unsigned char cnt;
for(cnt=250; cnt; cnt--) asm("nop"); // Tempinho.
if(ENC_INT)
{
if(ENC_IN) encoder++;
else encoder--;
}
/* else
{
//if(!ENC_IN) encoder++;
//else encoder--;
}*/
for(cnt=50; cnt; cnt--) asm("nop"); // Tempinho.
IRQ2 &= 254; // Limpo o flag de interrupção...
}
Se descomentar o else do meio do código ele capta dois incrementos a cada "tic" no giro do benedito...