Buenas, haciendo este ejercicio lo encaré distinto a la solución, programando la lógica en el main en lugar del timer y un estado de mas que diferencia en que dirección se disminuye el frenado. Dejo abajo mi solución para ver que les parece.
Podrían corroborar si esta hecho de forma correcta o tiene algún error?
Desde ya muchas gracias,
Saludos,
Felipe
#define ANDANDO 0
#define FRENANDO 1
#define FRENANDO_IZQ 2
#define FRENANDO_DER 3
#define ms100 1000
#define PRESMAX
#define estado_pedal 0x80
tics_izq=tics_der=0;
vel_izq=vel_der=0;
bool pedal = false;
int presion_izq,presion_der=0;
int potencia_resta = 1;
void interrupt giro_der(){
vel_der=tics_der;
tics_der = 0;
}
void interrupt giro_izq(){
vel_izq=tics_izq;
tics_izq=0;
}
void interrupt timer(){
tics_izq++;
tics_der++;
if(tics<ms100)
tics++;
}
void main(){
//instalar interrupciones
enable();
while(true){
if(tics>=ms100)
{
pedal=in(PEDAL) & estado_pedal;
if(!pedal) {estado = andando}
switch(estado){
case andando:
if(pedal)
estado = frenando;
out(FRENO_IZQ,PRESMAX);
out(FRENO_DER,PRESMAX);
else{
out(FRENO_IZQ,0);
out(FRENO_DER,0);
}
break;
case frenando:
presion_izq = PRESMAX;
presion_der = PRESMAX;
potencia_resta = 1;
if(vel_izq>vel_der){
presion_izq = presion_izq - potencia_resta;
potencia_resta = potencia_resta << 1;//2
out(FRENO_IZQ,presion_izq);
out(FRENO_DER,presion_der);
estado=frenando_izq;
}
else if(vel_izq<vel_der){
presion_der = presion_der - potencia_resta;
potencia_resta = potencia_resta << 1;//2
out(FRENO_IZQ,presion_izq);
out(FRENO_DER,presion_der);
estado=frenando_der,
}
break;
case frenando_izq:
if(vel_izq>vel_der){
if(presion_izq>0){
presion_izq = presion_izq - potencia_resta;
if(presion_izq>=0){
out(FRENO_IZQ,presion_izq);
potencia_resta = potencia_resta << 1;//2
} else
out(FRENO_IZQ,0);
} else
out(FRENO_IZQ,0);
} else {
estado=frenando;
out(FRENO_IZQ,PRESMAX);
out(FRENO_DER,PRESMAX);}
break;
case frenando_der:
if(vel_izq<vel_der){
if(presion_der>0){
presion_der = presion_der - potencia_resta;
if(presion_der>=0){
out(FRENO_DER,presion_der);
potencia_resta = potencia_resta << 1;//2
} else
out(FRENO_DER,0);
} else
out(FRENO_DER,0);
} else {
estado=frenando;
out(FRENO_IZQ,PRESMAX);
out(FRENO_DER,PRESMAX);}
break;
}
tics=0;
}
}
}