#define motor1_Xp !input(PIN_B0)
#define motor1_Xn !input(PIN_B1)
#define motor2_Yp !input(PIN_B2)
#define motor2_Yn !input(PIN_B3)
#define motorX_Fp !input(PIN_B4)
#define motorX_Fn !input(PIN_B5)
#define motorY_Fp !input(PIN_B6)
#define motorY_Fn !input(PIN_B7)
int indiceX = 0; // Indice para el motor X
int indiceY = 0; // Indice para el motor Y
const unsigned int pap_m1[4]={1,2,4,8};
const unsigned int pap_m2[4]={16,32,64,128};
#INT_TIMER0
void isr_timer0(void)
{
set_timer0(56161); // recargamos el timer0 para 200ms aprox.
// Revisamos si debemos avanzar o no
// Motor en X, primero revisamos que no estemos al final sea cual sea las 2 puntas
if(motorX_Fp && motor1_Xp) { indiceX++; } // motor1 eje X con giro horario
else if(motorX_Fn && motor1_Xn) { indiceX--; } // motor1 eje X con giro antihorario
// Motor Y
if(motorY_Fp && motor2_Yp){ indiceY++; } // motor2 eje Y con giro horario
else if(motorY_Fn && motor2_Yn){ indiceY--; } // motor2 eje Y con giro anti-horario
// Ahora procedemos a corregir los indices en caso de que superen los valores permitidos.
// Si es igual al tamaño del array ( 4 ) entonces se paso ( era 3 y se incremetno en 1) y hay que hacerlo 0.
// Si es mayor a eso, quiere decir que era 0 y se resto 1, por lo tanto su indice ahora debe ser 3.
if(indiceX == sizeof pap_m1) { indiceX = 0; } // Indice X
else if (indiceX > sizeof pap_m1) {indiceX = 3;}
if(indiceY == sizeof pap_m2) { indiceY = 0; } // Indice Y
else if (indiceY > sizeof pap_m2) {indiceY = 3;}
output_d(pap_m1[indiceX] | pap_m2[indiceY]); // Actualizamos las salidas:
}
void main()
{
porta=0x00; portb=0x00; portc=0x00; portd=0x00; porte=0x00;
set_tris_a(0b11111111);
set_tris_b(0b00000000);
set_tris_c(0b11111111);
set_tris_d(0b00000000);
set_tris_e(0b11111111);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
set_timer0(56161); // recargamos el timer0 para 200ms aprox.
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
while(true)
{
output_toggle(pin_c0); delay_ms(200);
}
}