Autor Tema: AYUDA MAQUINA DE ESTADO  (Leído 3683 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado quijano930a

  • PIC10
  • *
  • Mensajes: 7
AYUDA MAQUINA DE ESTADO
« en: 13 de Diciembre de 2014, 17:24:42 »
Bueno basicamente tengo un lio con mi maquina de estado y no puedo encontrar la falla  basicamente el SW0 que es el encargado del blink anda siempre peroo cuando aprieto el otro SW1 que es el q me cambia la frecuencia  , este la cambia pero cuando quiero volver a apretar el SW0 para el blinkoff ya deja de andar en que me estoy equivocando
PD: soy nuevo en esto :P


include    "main.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
void TareaA(void)
{
enum {E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10}; //ctes maquina de estados
static unsigned char estado=0; //contiene el valor del estado
static unsigned char periodo[]={100,50,25};
static unsigned char tiempo[]={50,25,12};
static unsigned char i=0;

    switch(estado){
//-----------------------------------------------
        case E0:
            if(SWbits.SW0==1){
                BlinkOn(tiempo,periodo);
                estado++;
            }
        break;
//-----------------------------------------------
        case E1:
            if(SWbits.SW0==0){
                estado++;
            }
        break;
//-----------------------------------------------
        case E2:
            if(SWbits.SW0==1){
                BlinkOff();
                estado++;
            }
            if(SWbits.SW1==1){ // segundo switch cambio de frecuencia
                if(i<3)
                i++;
                BlinkOn(tiempo,periodo);
                __delay_ms(500);
                estado=E4;
                NOP();

            }
        break;
//-----------------------------------------------
        case E3:
            if(SWbits.SW0==0){
                estado=0;
            }
           
        break;



//-----------------------------------------------
        case E4:
            if(SWbits.SW1==0){
               
                estado=E2;
                NOP();
            }


        break;

//-----------------------------------------------

//-----------------------------------------------

}//switch
}//TareaA
////////////////////////////////////////////////////////////////////////////////////////////////////

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: AYUDA MAQUINA DE ESTADO
« Respuesta #1 en: 13 de Diciembre de 2014, 18:55:45 »
Lo que no se si funciona bien es

Código: [Seleccionar]
estado=E4;
Probaste directamente en ves de usar una constante, probar con un numero ? y no utilizas enum ni nada por el estilo?

Por que todos los ejemplos que veo son generalmente algo asi:
enum state {E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10}; //ctes maquina de estados
state estado = E0; // Asi comienza por E0

YO decia que probaras con numeros para saber si es ese el problema. No veo que otra cosa pueda ser el problema al menos el codigo que pasaste.

Desconectado quijano930a

  • PIC10
  • *
  • Mensajes: 7
Re: AYUDA MAQUINA DE ESTADO
« Respuesta #2 en: 13 de Diciembre de 2014, 19:28:11 »
probe sacando el enum pero sigue igual al apretar el sw1 ya deja de funcionar el sw0

Desconectado quijano930a

  • PIC10
  • *
  • Mensajes: 7
Re: AYUDA MAQUINA DE ESTADO
« Respuesta #3 en: 13 de Diciembre de 2014, 19:30:00 »
me cago en las maquinas de estado jajaj

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: AYUDA MAQUINA DE ESTADO
« Respuesta #4 en: 13 de Diciembre de 2014, 20:02:37 »
Saca:

enum {E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10}; //ctes maquina de estados
static unsigned char estado=0; //contiene el valor del estado
static unsigned char periodo[]={100,50,25};
static unsigned char tiempo[]={50,25,12};
static unsigned char i=0;

fuera, o al menos el estado y i, sino cada ves que entre los estaria poniendo a 0 ?, por que con el break saldria del switch y terminaria la funcion TareaA(); al entrar nuevamente define todos las cosas de nuevo.
Es la otra que se me ocurre, y si no anda, entonces alguien vendra y te salvara xD

Desconectado quijano930a

  • PIC10
  • *
  • Mensajes: 7
Re: AYUDA MAQUINA DE ESTADO
« Respuesta #5 en: 13 de Diciembre de 2014, 21:20:25 »
cuando las declaras static no pierden su valor al salir de la funcion

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: AYUDA MAQUINA DE ESTADO
« Respuesta #6 en: 14 de Diciembre de 2014, 01:26:32 »
cuando las declaras static no pierden su valor al salir de la funcion
pero al entrar nuevamente se les asigna el valor nuevamente ?, si no es exactamente lo mismo que una variable global.
pregunto por que lo vi varias veces pero no se como se comporta ( o lo toma el compilador )

En fin si no las asigna de nuevo entonces, puede que tengas otro problema que no sea tu maquina de estado.

Tambien si ocurre eso, esta parte del codigo:
Código: [Seleccionar]
            if(SWbits.SW1==1){ // segundo switch cambio de frecuencia
                if(i<3)
                i++;
                BlinkOn(tiempo,periodo);
                __delay_ms(500);
                estado=E4;
                NOP();

            }

Va a entrar 3 veces y no va a entrar nunca mas ahi, estoy viendo un codigo de un I2C hecho con maquinas de estado y esta igual a esto excepto que el enum se encuentra fuera del switch
http://www.avrfreaks.net/forum/i2c-state-machine

todo lo demas esta igual, desde la asignacion de estados etc.
Con lo que me hace pensar que sea eso o un error dentro de cada estado. La condiciones de los switch/pulsadores si tienen antirebote en hardware estaria garantizada y lo que queda es lo de adentro
« Última modificación: 14 de Diciembre de 2014, 01:48:13 por KILLERJC »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: AYUDA MAQUINA DE ESTADO
« Respuesta #7 en: 14 de Diciembre de 2014, 09:56:42 »
  KILLERJC, yo creo recordar lo siguiente respecto de la diferencia de comportamiento..... las variables estáticas no pierden su valor, pero no se comportan como las globales ya que una variable global podría cambiar su valor tanto en el MAIN como en la función, pero las variables estáticas sólo pueden cambiar su valor dentro del ámbito que hayan sido declaradas.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: AYUDA MAQUINA DE ESTADO
« Respuesta #8 en: 14 de Diciembre de 2014, 10:46:25 »
Hola.


Tambien si ocurre eso, esta parte del codigo:
Código: [Seleccionar]
           if(SWbits.SW1==1){ // segundo switch cambio de frecuencia
                if(i<3)
                i++;
                BlinkOn(tiempo,periodo);
                __delay_ms(500);
                estado=E4;
                NOP();

            }

Va a entrar 3 veces y no va a entrar nunca mas ahi,

el codigo del if seria
Código: [Seleccionar]
 if(i<3)
                i++;  
Por no tener las llaves el if solo afecta a la sigiente instruccion. Creo que lo que ha querido hacer acá es una demora (supongo que al no funcionar ha probado con eso, como con el delay y el NOP, quizas para el antirebote).

quijano930a, por que no probas encender otro led (como testigo o alcaguete)  en esta parte de tu programa
Código: [Seleccionar]
/-----------------------------------------------
        case E4:
            if(SWbits.SW1==0){
              
                estado=E2;
                NOP();
            }


        break;

//-----------------------------------------------
Un led en otra salida que no estes usando. Para ver si pasa por esta parte del codigo. Que quede prendido hasta resetear el micro.
Las variables globales static solo son "vistas" por el archivo donde se han creado. En este caso se comportan como variables globales.
Por ahora esto.

Saludos.
  
Edito: el if lo estaria utilizando para ir cambiando el tiempo y el periodo con el indice i, pero no ha implementado el indice ( no lo esta usando), por lo tanto el tiempo y el periodo no esta cambiando.
Código: [Seleccionar]
BlinkOn(tiempo,periodo);     equivale a
BlinkOn(tiempo[0],periodo[0]);

« Última modificación: 14 de Diciembre de 2014, 11:26:44 por Darkman_A »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: AYUDA MAQUINA DE ESTADO
« Respuesta #9 en: 14 de Diciembre de 2014, 11:29:49 »
Edito: el if lo estaria utilizando para ir cambiando el tiempo y el periodo con el indice i, pero no lo esta usando, por lo tanto no esta cambiando.
Código: [Seleccionar]
BlinkOn(tiempo,periodo);     equivale a
BlinkOn(tiempo[0],periodo[0]);

Primero que nada no se como no se me ocurrio el tema de las llaves del IF, estaba metido viendo la maquina de estados.
Yo no hice referencia a eso por que como no tenia el codigo de blinkOn, podria haber estado pasandole el puntero del array y no su valor. pero al no tener el codigo termine poniendo:
Citar
Con lo que me hace pensar que sea eso o un error dentro de cada estado. La condiciones de los switch/pulsadores si tienen antirebote en hardware estaria garantizada y lo que queda es lo de adentro

Citar
Las variables globales static solo son "vistas" por el archivo donde se han creado. En este caso se comportan como variables globales.
Eso lo entiendo pero esto quiere decir que si pasa nuevamente dentro de la funcion los valores no sean asignados nuevamente?. Por que al entrar a la funcion los pone a 0 a algunos, al estar definidos esto se sigue ejecutando ?

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: AYUDA MAQUINA DE ESTADO
« Respuesta #10 en: 14 de Diciembre de 2014, 11:43:34 »
Edito: el if lo estaria utilizando para ir cambiando el tiempo y el periodo con el indice i, pero no lo esta usando, por lo tanto no esta cambiando.
Código: [Seleccionar]
BlinkOn(tiempo,periodo);     equivale a
BlinkOn(tiempo[0],periodo[0]);

Primero que nada no se como no se me ocurrio el tema de las llaves del IF, estaba metido viendo la maquina de estados.
Yo no hice referencia a eso por que como no tenia el codigo de blinkOn, podria haber estado pasandole el puntero del array y no su valor. pero al no tener el codigo termine poniendo:
Citar
Con lo que me hace pensar que sea eso o un error dentro de cada estado. La condiciones de los switch/pulsadores si tienen antirebote en hardware estaria garantizada y lo que queda es lo de adentro

Citar
Las variables globales static solo son "vistas" por el archivo donde se han creado. En este caso se comportan como variables globales.
Eso lo entiendo pero esto quiere decir que si pasa nuevamente dentro de la funcion los valores no sean asignados nuevamente?. Por que al entrar a la funcion los pone a 0 a algunos, al estar definidos esto se sigue ejecutando ?

Hola KILLERJC.
Creo, como bien le mensionas acá, que la definicion de las variables deben ir fuera de la funcion TareaA (la que tendria que se el Main), o sea:
Código: [Seleccionar]

enum {E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10}; //ctes maquina de estados
static unsigned char estado=0; //contiene el valor del estado
static unsigned char periodo[]={100,50,25};
static unsigned char tiempo[]={50,25,12};
static unsigned char i=0;

// void TareaA(void)
void Main(void)
{

    switch(estado){
..............................
etc, etc, etc

} // Fin del Main

Edito: Ademas le falta algo que haga el loop, como ser un While. porque sino ejecuta el Switch y termina.
Al final, de a poco le estamos haciendo la "Tarea A"

Bueno basicamente tengo un lio con mi maquina de estado y no puedo encontrar la falla  basicamente el SW0 que es el encargado del blink anda siempre peroo cuando aprieto el otro SW1 que es el q me cambia la frecuencia  , este la cambia pero cuando quiero volver a apretar el SW0 para el blinkoff ya deja de andar en que me estoy equivocando
PD: soy nuevo en esto :P
Por los errores encontrados, lo que he resaltado no es del todo cierto.

Saludos.
« Última modificación: 14 de Diciembre de 2014, 12:08:43 por Darkman_A »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: AYUDA MAQUINA DE ESTADO
« Respuesta #11 en: 14 de Diciembre de 2014, 12:27:34 »
Edito: Ademas le falta algo que haga el loop, como ser un While. porque sino ejecuta el Switch y termina.

Tambien lo pense, pero el while podria estar en su main. Con lo cual me llevo a mas dudas.
Y hay cosas que realmente no comprendo de C ( por que nunca las use ), estoy muy acostumbrado a pasarle variables a una funcion (generalmente de otro archivo) y que la funcion dentro solo defina variables que son "volatiles" me refiero a que no me importan si se pierden o no.

Aqui eso no ocurre, ya que debes mantener la variable "estado", por mas que sea static, si la definimos antes o en su .h imagino que sera distinto.
Has probado si se mantiene el valor al hacer lo mismo que hizo el?
« Última modificación: 14 de Diciembre de 2014, 14:43:53 por KILLERJC »