Autor Tema: Semáforo, máquina de estados finitos  (Leído 3308 veces)

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

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Semáforo, máquina de estados finitos
« 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. }
« Última modificación: 05 de Abril de 2020, 14:24:02 por mariacontenis »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Semáforo, máquina de estados finitos
« Respuesta #1 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.

Conectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Semáforo, máquina de estados finitos
« Respuesta #2 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.
« Última modificación: 05 de Abril de 2020, 12:53:20 por Eduardo2 »

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re:Semáforo, máquina de estados finitos
« Respuesta #3 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.

Desconectado Ruco

  • PIC12
  • **
  • Mensajes: 62
Re:Semáforo, máquina de estados finitos
« Respuesta #4 en: 19 de Abril de 2020, 10:00:27 »
  .
« Última modificación: 19 de Abril de 2020, 19:54:19 por Ruco »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Semáforo, máquina de estados finitos
« Respuesta #5 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.


 

anything