Ese
case con ese
while(true) para la lectura del teclado, están mal planteados.
Aparte de que no es nada bueno, para que el programa se entienda, anidar tantas cosas, mucho mejor trocear y crear funciones. También conviene identar mejor.
Si todo lo que tienes en los dos while anidados superiores, se tiene que ejecutar para cada lectura del teclado, entonces el while(true) sobra. No creo que el break del default: te saque del while(true), pruébalo con un debug.
Modifica tu fuente así, y prueba. Al menos ahora cada vez que pulses un comando distinto, te responderá, otra cosa es que la lógica del resto del programa esté bien planteada (que yo creo que no).
while (true)
{
teclado = getc();
switch (teclado)
{
case 'p':
sentido = 'p';
parar();
delay_ms(500);
puts(" control de motor");
puts(" (p) Parar el motor");
output_low(pin_b5);
output_low(pin_b4);
delay_us(500);
delay_us(500);
break;
case 'i':
encendido();
sentido = 'i';
estrella();
puts(" control de motor");
puts(" Motor en estrella");
output_high(pin_b5);
delay_ms(500);
delay_ms(2500);
delta();
sentido = 'd';
puts(" control de motor");
puts(" Motor al maximo de sus funciones");
break;
default:
mensaje();
break;
}
}