[2021][Marzo][Problema3]

[2021][Marzo][Problema3]

de Felipe Gustavo Castellanos Alvarez -
Número de respuestas: 0

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;

    }

  }

  

}