char newA, newB;
int *variavel;//ponteiro que vai inc ou deinc variavel do momento
//Separa os dois bits relativos a A e B do encoder incremental
temp = (((char *)&IOPIN0)[1]&0x0C)>>2;
//na verdade, você pode fazer da seguinte forma.
// SE pino A = 1 então variavel pino A = 1 senão variavel pino A = 0;
// SE pino B = 1 então variavel pino B = 1 senão variavel pino B = 0;
// DEsta segunda forma voce pode apontar pra qualquer pino do processador, não necessariamente no mesmo port.
//faz teste de valor atual com anterior, descobre se houve movimento
if(temp != oldtemp){
//internamente é testado a posição anterior dos bits e a atual
//desta forma descobre-se se houve movimento incremental ou decremental
//assim incrementa-se duas chars, cada uma relativa ao movimento citado
//no fim do tratamento, compara-se a variavel de acumulo de incremento ou decremento,
//com um valor de sensibilidade, que é relativo a quantidade de movimentos executados.
//se valor de acumulo de movimento > sensibilidade, então incrementa ou decrementa
//o valor da variavel de valor associado a logica do sistema.
if(oldtemp==3 && temp ==2)
newA++;
if(oldtemp==3 && temp ==1)
newB++;
if(oldtemp==2 && temp ==0)
newA++;
if(oldtemp==2 && temp ==3)
newB++;
if(oldtemp==0 && temp ==1)
newA++;
if(oldtemp==0 && temp ==2)
newB++;
oldtemp = temp;
if(newA>sensi){
newA=0;
*variavel+=1;
}
if(newB>sensi){
*variavel-=1;
newB=0;
}
}
// 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...
}
Voltar para NXP (ex-FreeScale (ex-Motorola))
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante