//************************************************************************
// SERVICIOS DE INTERRUPCION
//
//
//
// 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
{
lec_mpg=(PORTB && 0x00000011); // carga en mpg el valor leido del encoders MPG, que estara en codigo gray, de las entradas RB0 y RB1
// codigo gray
// 00 0
// 01 1
// 11 3
// 10 2
// 00 0
// ....
// convierte de gray a decimal
// codigo gray decimal
// 00 0 00 0
// 01 1 01 1
// 11 3 10 2
// 10 2 11 3
// 00 0 00 0
// .... ........
// para pasar de gray a decimal se vigila el bit de mayor peso, si es uno, se invierte el bit de menor peso, si no queda como estaba
if(((lec_mpg && 0x00000010))==2) // si el bit 1 de lec_mpg es ==1
{
if(((lec_mpg && 0x00000001)==0)) // si el bit 0 de lec_mpg es cero
bitset(lec_mpg,0); // hace 1 el bit 0 de valor
else
bitclr(lec_mpg,0); // hace cero el bit 0 de valor
// aqui lec_mpg es decimal
// calcula la diferencia entre el anterior y el actual
diferencia = lec_mpg - lec_mpg_old;
// si el bit 1 de diferencia es == 1 es que esta girando a derecha
if(((diferencia && 0x00000010)==2)) // 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 el valor actual
lec_mpg_old = lec_mpg;
}
INTF=0; // fin de la int para MPG a X1
}
// *****************************
// ACTIVAR INTERRUPCIONES
// *****************************
void setISR(void) /*Sets ISR bits */
{
GIE = 0;
PEIE = 0;
RCIE = 0;
SSPIE = 0;
EEIE = 0;
INTE= 1; // Activar interrupcion INT0
RBIE = 0; // DESActivar interrupciones on pin change del puerto B
MPG = 0; // Inicializa contador MPG
GIE = 1; // permite las ints (todas las activadas)
}