TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: mariacontenis en 05 de Abril de 2020, 11:34:56

Título: Semáforo, máquina de estados finitos
Publicado por: mariacontenis en 05 de Abril de 2020, 11:34:56
Estudiando un sobre la maquina de estados en especifico un articulo del Dr.  Jon Valvano, http://users.ece.utexas.edu/~valvano/Volume1/E-Book/C10_FiniteStateMachines.htm me encontré un código que esta ahora en xc.h


Código: C#
  1. #include <xc.h>
  2. #include "config.h"
  3.  
  4. #define _XTAL_FREQ 32000000
  5.  
  6. struct State{
  7.     unsigned long Out;
  8.     unsigned long Time;
  9.     unsigned Next[4];};
  10.     typedef const struct State Styp;
  11.    
  12. #define goN 0
  13. #define waitN 1
  14. #define goE 2
  15. #define waitE 3
  16.    
  17. //definir estructura maquina de estados
  18.     Styp FSM[4]={
  19.         {0x21,3000,{goN,waitN,goN,waitN}},
  20.         {0x22,500,{goE,goE,goE,goE}},
  21.         {0x0c,3000,{goE,goE,waitE,waitE}},
  22.         {0x14,500,{goN,goN,goN,goN}}};
  23.    
  24.     unsigned char actual;
  25.     unsigned input;
  26.    
  27.  
  28.  
  29. void main(void) {
  30.     int x;
  31.     //Oscilador
  32.     OSCCONbits.IRCF=0b1110;
  33.     OSCCONbits.SCS=00;
  34.     //Puertos
  35.     ANSELB=0;//Puerto A digital
  36.     TRISB=0;//Puerto B salidas
  37.     TRISC=255;//PuertoC entradas
  38.     //*****************
  39.     actual=goN;
  40.     while(1){
  41.         //FSM engine
  42.         LATB=FSM[actual].Out;
  43.         for(x=0;x<FSM[actual].Time;x++)
  44.             __delay_ms(1);
  45.         input=PORTC;
  46.         actual=FSM[actual].Next[input];
  47.            
  48.     }
  49.    
  50.     return;
  51. }
Título: Re:Semáforo, máquina de estados finitos
Publicado por: KILLERJC en 05 de Abril de 2020, 12:03:27
Citar
Queriendo pasarlo a ccs c veo que no muchas cosas son compatibles; como esta funcion:

Eso no es una funcion... Siemplemente esta diciendo que Styp de ahora en adelante va a ser un tipo igual a "const struct State" , es decir una estructura que se va a mantener constante (no se puede sobreescribir) y de la forma definida anteriormente.

Es para no escribir:

Código: C
  1. const struct State FSM[4]={

Citar
como vi que no se podía en ccs lo puse como un array asi:

Y así cambiaste enteramente toda la estructura del array... lo que vas a tener que cambiar completamente la definición de la estructura y de tu programa.

Citar
Alguien me puede orientar para pasarlo a CCS por favor, ahora estoy haciendo esto en ccs.

Esto es C comun y corriente,  CCS no debería tener ningún problema en asociarlo.. Por lo que no entiendo porque es el problema que te esta dando. Incluso copie y pegue sobre otro compilador y no tengo problemas con esas definiciones. Lo probe sobre un compilador online y no me tiro ni un warning/error, y pude acceder a todos los datos.
Título: Re:Semáforo, máquina de estados finitos
Publicado por: Eduardo2 en 05 de Abril de 2020, 12:50:00
...
pero me tira error en:

Código: C#
  1. PORTB=FSM[actual].Out;
  2.  
  3. for(x=0; x<FSM[actual].Time; x++)
  4. actual=FSM[actual].Next[input];


-   FSM la tenés declarada como:  const unsigned char FSM[4][6]={
   Asi no es una estructura,  no tiene como miembros a Out y Time
 
   Debe ser:  const struct State FSM[]={

-  "input" es una función en CCS , cambiale el nombre.
Título: Re:Semáforo, máquina de estados finitos
Publicado por: mariacontenis en 05 de Abril de 2020, 14:37:39

Tenían razón como siempre..

Bueno, lo que comenta KILLER y Eduardo soluciona las cosas.

En el codigo:

Código: C#
  1. typedef const struct State Styp;

para compilarlo en ccs c hay que quitar el const para que quede asi y se pueda compilar la struct correctamente:

Código: C#
  1. typedef struct State Styp;

Gracias por sus respuestas.
Título: Re:Semáforo, máquina de estados finitos
Publicado por: Ruco en 19 de Abril de 2020, 10:00:27
  .
Título: Re:Semáforo, máquina de estados finitos
Publicado por: KILLERJC en 19 de Abril de 2020, 19:34:35
Generalmetne cuando marcan errores por ; es por otra cosa... Veo que pusiste algunos espacios en algunas partes.. no se si eso afectara.

Código: C
  1. {&Avance_N,3000,{goN,waitN,goN,waitN}},
vs

Código: C
  1. {& Avance_N,3000,{goN,waitN,goN,waitN}},


Obviamente esto:

         (FSM[actual].void &funcionPt)();


Esta muy mal,, asi que deberías dejarlo como estaba. No debería darte ningún problema.