USo una interrupcion para contar puloso de un MPG y no funciona bien,
No detecta el sentido de giro correctamente. Esta escrito en Hitec y el original, que no funciona bien es esta rutina
// GESTION DEL MPG POR INTERRUCION SE USA INT0
// LA INTERRUPCION DETECTA EL SENTIDO DE GIRO Y MANTIENE UN CONTADOR
//************************************************************************
void interrupt Isr(void)
{
if (SSPIF)
{
SSPIF = 0;
isrEnd = 1;
}
if (INTF) // interrupcion mpg2 pines rb0(a) y rb1(b) la resolucion es X1
{
(RB1) ? MPG++: MPG--; // esto es un if un poco raro jejeje
INTF=0; // fin de la int para MPG a X1
}
}
YO la he modificado asi, pero tampoco detecta el sentido , si los pulsos, es decir como la anterior.
//************************************************************************
// Funcion que verifica el valor de un bit de una variable
// Devuelve el valor del bit que se chequea
//************************************************************************
int bittest(var,bitno){
int var_int=0;
if(bitno==0)
var_int = var & 0x00000001;
if(bitno==1)
var_int= var &0x00000010;
return var_int;
}
//************************************************************************
// SERVICIOS DE INTERRUPCION
//
//
//
// GESTION DEL MPG POR INTERRUCION SE USA INT0
// LA INTERRUPCION DETECTA EL SENTIDO DE GIRO Y MANTIENE UN CONTADOR
//************************************************************************
//como hacer un test de un bit
// variable_aux = variable & 0b00000010;
// si el bit 1 de variable estaba en 1, el resultado de la and es 2.
// if (variable_aux == 2) ....
// evaluo el valor, para saber si el bit estaba en 1
void interrupt Isr(void)
{
if (SSPIF)
{
SSPIF = 0;
isrEnd = 1;
}
if (INTF) // interrupcion mpg2 pines rb0(a) y rb1(b) la resolucion es X1
{
lec_mpg=(RB1*2)+RB0; // carga en mpg el valor en gray de las entradas RB0 y RB1
if(bittest(lec_mpg,1)==1) // si el bit 1 de valor es 1
{
if(bittest(lec_mpg,0)==0) // invierte el bit 0 de valor
bitset(lec_mpg,0); // hace 1 el bit 0 de valor
else
bitclr(lec_mpg,0); // hace cero el bit 0 de valor
}
if(lec_mpg!=lec_mpg_old){
diferencia =lec_mpg-lec_mpg_old;
if(bittest(diferencia,0) == 0) // si se ha producido un error se habra puesto a cero el bit 0
{
}
else
{
if(bittest(diferencia,1) == 1) // chequea el bit de sentido de giro que sera 1 girando a derecha
MPG++; // si es hacia un lado incrementa el contador
else
MPG--; // hacia el otro lo decrementa
}
// memoriza en anterior_Z el estado actual
lec_mpg_old = lec_mpg;
}
Podeis echarme una mano, no se casi nada de hitec, por no decir nada. Siempre he trabajado en CCS.
Gracias