Editando
C10 - Finite State Machine
(sección)
Ir a la navegación
Ir a la búsqueda
Advertencia:
no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición. Si
inicias sesión
o
creas una cuenta
, tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.
Comprobación antispam. ¡
No
rellenes esto!
== Ej. Máquina cuenta 1s == <br> Tenemos un sistema que lee por un puerto bits (0 o 1). El sistema cuenta cuantos bits 1 ha leido y por un output escribe 1 si el número de 1s es impar y 0 si es par<br> <br> === Definición FSM === *Input - 1 bit que puede ser 0 o 1 *Output - 1 bit que puede ser 0 o 1 *States - 2 estados **nº de 1 par **nº de 1 impar *State Transition Graphic **Los círculos expresan los estados y las flechas expresan las transiciones **En el estado par ***Si recibimos un 0 nos quedamos en el estado porque el número de 1 no ha cambiado ***Si recibimos un 1 pasamos al estado impar **En el estado impar **Si recibimos un 0 nos quedamos en el estado porque el número de 1 no ha cambiado **Si recibimos un 1 pasamos al estado par [[File: edx-odd-stg.png | 300px]]<br> *Output **Como estamos haciendo una FSM de Moore cada estado tiene un output **Los outputs son los números azules del gráfico **Cuando estamos en el estado par ponemos un 0 en el output **Cuando estamos en el estado impar ponemos un 1 en el output <br> === Programación estados === Código que plasma el STG que vemos mas arriba en un struct.<br> <br> //Construimos el "contenedor" de cada estado struct State{ unsigned char out; //Aqui va la salida que tendrá cada estado (los numero azules del dibujo) unsigned long wait; //Entre cada estado esperaremos un tiempo para que pueda leer la entrada unsigned char next[2]; //En cada estado almacenamos los posibles estados siguientes } typedef struct State SType; #define Even 0 //Lo hago para que sean más claros los estados #define Odd 1 //Creamos los estados y los inicializamos //En primer el estado el output sera 0, en el segundo estado sera 1 //El tiempo que esperaremos para cambiar de estado sera de 100ms en los dos estados //En el primer estado si obtenemos un 0 nos mantenemos en el y si obtenemos un 1 cambiamos a Odd //En el segundo estado si obtenemos un 0 nos mantenemos en el y si obtenemos un 1 cambiamos a Even Stype fsm[2]={ {0,100,{Even, Odd}}, {1,100,{Odd, Even}} }; <br> === Programación controlador FSM === El controlador de la máquina de estados finita es le encargado de leer las entradas, escribir las salidas y cambiar entre los diferentes estados.<br> Este controlador se programa en el main y se sigue este esquema: *Escribo el output *Espero *Leo input *Cambio de estado según el input y el estado en el que estoy <br> Nota:<br> No entiendo porqué no se hace así: *Leo input *Cambio estado según input y estado actual *Escribo output *Espero <br> El código de este ejemplo quedaria:<br> unsigend char cState; void main(void){ unsigned char input; //Inicializar puertos //Inicializar SysTick para función delay cState = Even; while(1){ GPIO_PORT... = Fsm[cState].out; //Escribimos el output del estado actual delay(); //Esperamos input = GPIO_PORT...; //Leemos input cState = Fsm[cState].next[input]; //Cambiamos de estado según el input. Si el input //es 0 vamos al estado Even y si el input es 1 vamos al estado Odd //y también según el estado en el que estamos (la variable //cState es la que nos indica en que estado estamos) } }
Resumen:
Ten en cuenta que todas las contribuciones a Proyectos se consideran publicadas bajo la Creative Commons Atribución-CompartirIgual (véase
Proyectos:Derechos de autor
para más información). Si no deseas que las modifiquen sin limitaciones y las distribuyan libremente, no las publiques aquí.
Al mismo tiempo, asumimos que eres el autor de lo que escribiste, o lo copiaste de una fuente en el dominio público o con licencia libre.
¡No uses textos con copyright sin permiso!
Cancelar
Ayuda de edición
(se abre en una ventana nueva)
Menú de navegación
Herramientas personales
No has accedido
Discusión
Contribuciones
Crear una cuenta
Acceder
Espacios de nombres
Página
Discusión
español
Vistas
Leer
Editar
Ver historial
Más
Buscar
Navegación
Página principal
Cambios recientes
Página aleatoria
Ayuda sobre MediaWiki
Páginas especiales
Herramientas
Lo que enlaza aquí
Cambios relacionados
Información de la página