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. Semaforos == <br> El siguiente ejemplo es sobre un cruce que tiene dos semáforos para controlar el tráfico. Hay dos sensores que detectan si hay coches en la calle 1 o en la calle 2. Dependiendo de donde hayan los coches se pone el semáforo en rojo o verde.<br> <br> [[File: Edx-fsm-semaforo.png | 300px]]<br> <br> === Definicion FSM === Imagen STG<br> <br> La tabla muestra la misma información que el gráfico. Es un resumen de la funcionalidad de la máquina de estados<br> {| class="wikitable" ! colspan="9" style="text-align: center;" | ! colspan="4" style="text-align: center; font-weight: bold;" | Input |- | colspan="2" style="text-align: center; font-weight: bold;" | Estados | style="text-align: center;" | | colspan="6" style="text-align: center; font-weight: bold;" | Output | style="text-align: center; font-weight: bold;" | S2S1 | style="text-align: center; font-weight: bold;" | S2S1 | style="text-align: center; font-weight: bold;" | S2S1 | style="text-align: center; font-weight: bold;" | S2S1 |- | style="text-align: center; font-weight: bold;" | Descripción | style="text-align: center; font-weight: bold;" | Nombres | style="text-align: center; font-weight: bold;" | Tiempo | style="text-align: center; font-weight: bold;" | V1 | style="text-align: center; font-weight: bold;" | A1 | style="text-align: center; font-weight: bold;" | R1 | style="text-align: center; font-weight: bold;" | V2 | style="text-align: center; font-weight: bold;" | A2 | style="text-align: center; font-weight: bold;" | R2 | style="text-align: center; font-weight: bold;" | 00 | style="text-align: center; font-weight: bold;" | 01 | style="text-align: center; font-weight: bold;" | 10 | style="text-align: center; font-weight: bold;" | 11 |- | Calle 1 verde. Calle 2 rojo | style="text-align: center;" | C1 | style="text-align: center;" | 30 | style="text-align: center;" | 1 | style="text-align: center;" | 0 | style="text-align: center;" | 0 | style="text-align: center;" | 0 | style="text-align: center;" | 0 | style="text-align: center;" | 1 | style="text-align: center;" | C1 | style="text-align: center;" | C1 | style="text-align: center;" | W1 | style="text-align: center;" | W1 |- | Calle 1 amarillo. Calle 2 rojo | style="text-align: center;" | W1 | style="text-align: center;" | 5 | style="text-align: center;" | 0 | style="text-align: center;" | 1 | style="text-align: center;" | 0 | style="text-align: center;" | 0 | style="text-align: center;" | 0 | style="text-align: center;" | 1 | style="text-align: center;" | C2 | style="text-align: center;" | C2 | style="text-align: center;" | C2 | style="text-align: center;" | C2 |- | Calle 1 rojo. Calle 2 verde | style="text-align: center;" | C2 | style="text-align: center;" | 30 | style="text-align: center;" | 0 | style="text-align: center;" | 0 | style="text-align: center;" | 1 | style="text-align: center;" | 1 | style="text-align: center;" | 0 | style="text-align: center;" | 0 | style="text-align: center;" | C2 | style="text-align: center;" | W2 | style="text-align: center;" | C2 | style="text-align: center;" | W2 |- | Calle 1 rojo. Calle 2 amarillo | style="text-align: center;" | W2 | style="text-align: center;" | 5 | style="text-align: center;" | 0 | style="text-align: center;" | 0 | style="text-align: center;" | 1 | style="text-align: center;" | 0 | style="text-align: center;" | 1 | style="text-align: center;" | 0 | style="text-align: center;" | C1 | style="text-align: center;" | C1 | style="text-align: center;" | C1 | style="text-align: center;" | C1 |} Inputs: *Coche calle 1 - S1 *Coche calle 2 - S2 Outputs: *V1 A1 R1 <math>\Rightarrow</math> semáforo calle 1 que cuenta con verde, amarillo y rojo *V2 A2 R2 <br> <b>Estado1 - C1</b> *Verde en calle 1 y rojo en calle 2, por lo tanto las salidas son V1 A1 R1 V2 A2 R2 1 0 0 0 0 1 *Siempre que S1 se mantenga en 1 nos quedamos en este estado *Si no hay ningún coche en las dos calles también nos mantenemos en este estado *Para pasar al siguiente estado S2 tiene que valer 1 <b>Estado2 - W1</b> *Es un estado de transición entre el verde y el rojo. Hemos de pasar por el amarillo y el estado tiene una duración máxima de 5ms *La salida es 010001 <math>\Rightarrow</math> Activamos A1 porque vamos a cambiar de V1 a R1 *Cualquier input nos hace pasar al siguiente estado <b>Estado3 - C2</b> *Rojo calle 1 y verde calle 2 <math>\Rightarrow</math> 001100 *Siempre que S2 se mantenga en 1 nos quedamos en este estado *Si no hay ningún coche en las dos calles también nos mantenemos en este estado *Para pasar al siguiente estado S1 tiene que valer 1 <b>Estado4 - W2</b> *Es un estado de transición entre el verde y el rojo. Hemos de pasar por el amarillo y el estado tiene una duración máxima de 5ms *La salida es 001010 <math>\Rightarrow</math> Activamos A2 porque vamos a cambiar de V2 a R2 *Cualquier input nos hace pasar al siguiente estado <br> === Programación estados === //Contenedor de cada estado struct State{ unsigned long out; unsigned long wait; unsigned long next[4]; }; typedef struct State SType; #define C1 0 //Estado con el sensor de la calle 1 activo #define W1 1 //Estado de transición de C1 a C2 #define C2 2 //Estado con el sensor de la calle 2 activo #define W2 3 //Estado de transición de C2 a C1 //Definición estados Stype fsm[4]={ {0x21, 3000, {C1,W1,C1,W1}}, {0x11, 500, {C2,C2,C2,C2}}, {0x0C, 3000, {C2,C2,W2,W2}}, {0x0A, 500, {C1,C1,C1,C1}} }; <br> === Programación controlador FSM === <br> El código del controlador de la fsm es igual al del ejemplo anterior:<br> S = goN; //Colocamos el primer estado while(1){ LIGHT = FSM[S].Out; //Escribimos la salida SysTick_Wait10ms(FSM[S].Time); //Esperamos Input = SENSOR; //Leemos S = FSM[S].Next[Input]; //Pasamos al siguiente estado según los inputs leidos } <br>
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