Perdon, eso fue por usar el codigo tuyo al implementar el mio. Ese codigo trae un problema al usarlo en muchas salidas. Como vistes antes yo procedi a usar 2 indices, uno para cada motor, La idea es que tengas solo 2 arrays con los valores de salida de lso bobinados y te manejes con el indice nomas... Me explico:
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 && motor1_Yp){ indiceY++; } // motor2 eje Y con giro horario
else if(motorY_Fn && motor2_Yp){ 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.
// Indice X
if(indiceX == sizeof pap_m1) { indiceX = 0; }
else if (indiceX > sizeof pap_m1) {indiceX = 3;}
// Indice Y
if(indiceY == sizeof pap_m1) { indiceY = 0; }
else if (indiceY > sizeof pap_m1) {indiceY = 3;}
// Actualizamos las salidas:
output_d(pap_m1[indiceX] | pap_m2[indiceY]);
}
motorY_Fp , motorY_Fn, motorX_Fp, motorX_Fn son 4 finales de carrera. Cada uno en su sentido.
Usualmente lo que se hace en estos casos es usar solo 2 finales de carrera (aunque los 4 estarian buenos como para proteccion). Asi al comienzo te vas a X=0 Y=0, que seria el punto donde ambos finales de carrera se activan. Y de alli te moves en X o en Y, esto seria relativo a la posicion 0,0. Esto no se tuvo en cuenta en el codigo. Pero al ser manejado con botones no creo que te preocupe.
El codigo que pase, hace que primero se revise el final de carrera y luego el boton. Hay que tener consideracion de cuando se presionan ambos botones al mismo tiempo, seria bueno tener una condicion extra que se asegure que solo 1 boton se encuentra presionado.
Otra de las cosas es que siempre estan activas las bobinas del PaP. En tu codigo veo que eso no es asi.