Professional Documents
Culture Documents
P01 FSM
P01 FSM
modelatge,
simulació i
introducció a la implementació
Lluís Ribas Xirgo
102791 Sistemes Encastats
Universitat Autònoma de Barcelona
Màquines d’estat com a controladors
• Controlador
– Sistema controlat (caixa negra)
– Sistema de control
Controlador
NO_PLE
PLE
OBERTA
/ OBRIR
NO_PLE
http://shades.uab.cat/ribas/edu/books/FC
Problema 1: Especificació
• Sistema ESTACIÓ DE SERVEI %
d’avís { APAGAR_TIMBRE (0) ,
ACTIVAR_TIMBRE (1) }
d’entrada
de vehicles vehicle
en una
estació de
pols segon pols,
servei pols de pas
per banda d’activació
del timbre
sense
efecte
timbre
vehicle
clk
Temps
http://shades.uab.cat/ribas/edu/books/FC
Problema 1: Model
• Màquina d’estats finits del controlador de
l’alarma pols de pas
per banda
pols
d’activació
del timbre
segon pols,
sense
efecte
timbre
VEHICLE vehicle
clk
estat
/ acció acció = 0 (APAGAR_TIMBRE) Temps
acció = 1 (ACTIVAR_TIMBRE)
http://shades.uab.cat/ribas/edu/books/FC
Controladors en hardware
• Arquitectura HW d’una FSM
m m n n
- Entrades Estat A
m–1 SORTIDES
- ESTAT SEGÜENT R
m–2 n k
-
-
load E clear
1 reset k–1
m–3 REG (ESTAT)
- -
clk
S
m–4 k–2
- n -
http://shades.uab.cat/ribas/edu/books/FC
Problema 1: Descripció HW
• Implementació amb portes lògiques i registres
v
+ -
load E clear
1 reset
REG (ESTAT)
clk
S
3
- -
1 2
http://shades.uab.cat/ribas/edu/books/FC
Controladors en software
• Preparació o setup
• Superbucle o super-loop
– Lectura d’entrades
– Lògica de control
– Escriptura de sortides
• Referència bàsica:
– Michael J. Pont (2002). Embedded C. Addison-
Wesley (Pearson Education Ltd.), GB. [Capítol 1]
Patró bàsic d’una màquina d’estats
en Lua, seguint el problema 1
-- Preparació:
INACTIU=0; POLS_1=1; ACTIU=2; ESPERA=3; POLS_2=4; ATURADA=-1
state = INACTIU
v = nil; t = false
while state ~= ATURADA do -- ATURADA només per simulació
v = get_vehicle_sensor()-- Lectura d’entrades
if v == nil then state = ATURADA end -- Cas especial d’aturada
-- Lògica de control:
if state == INACTIU then
-- Entrada:
function get_vehicle_sensor()
io.write( " v = " )
local x = io.read("*n")
if x == nil or x < 0 or x > 1 then
x = nil
else
if x > 0 then x = true else x = false end
end -- if
return x
end -- function get_vehicle_sensor()
-- Sortida:
function set_alarm( t )
if t then io.write( " t = 1\n" ) else io.write( " t = 0\n" ) end
end -- function set_alarm()
Problema 1:
Observació, monitoratge
function monitor(state)
if state == INACTIU then io.write( "state = INACTIU " )
elseif state == POLS_1 then io.write( "state = POLS_1 " )
elseif state == ACTIU then io.write( "state = ACTIU " )
elseif state == ESPERA then io.write( "state = ESPERA " )
elseif state == POLS_2 then io.write( "state = POLS_2 " )
elseif state == ATURADA then io.write( "state = ATURADA " )
else io.write( "state = ERROR! " )
end -- if chain
end -- function monitor(state)
Exercici 1:
Reconeixement de marques laterals
• Especificació
– Generar un esdeveniment (mark) cada cop que es detecti una marca.
– La detecció de la marca es fa detectant seqüències de 11, 01, ... 01, 11
en els sensors laterals superior i inferior, respectivament
Exercici 1:
Reconeixement de marques laterals
• Mòdul de detecció de marques laterals
– Entrades (top, bottom)
Sensors d’infrarojos superior i inferior
– Sortides (mark)
Succés o ‘event’ que s’activi en el moment en què
s’ha reconegut una marca
• Etapes
– Disseny de la màquina d’estats del reconeixedor
– Programació en Lua
Exercici 1.a:
Reconeixement de “marques”
• Disseny de la màquina d’estats del reconeixedor
entrades
{top, bottom}
exemple
indicador
d’estat estat
inicial state REPÒS
/ mark / 0 11
sortides
Exercici 1.b:
Reconeixement de “marques”
• Programació en Lua
function read_IRsensors()
io.write( " top(0/1), bottom(0/1) [xx] = " )
local s = io.read()
local t, b = nil, nil -- multiple value assignment (!)
if string.sub( s, 1, 1 ) == '0' then t = false end
if string.sub( s, 1, 1 ) == '1' then t = true end
if string.sub( s, 2, 2 ) == '0' then b = false end
if string.sub( s, 2, 2 ) == '1' then b = true end
return t, b -- returning multiple values,
-- must be assigned to variables, like above
end -- function read_IRsensors()
function warn( m )
if m then io.write( " mark = 1\n" ) else io.write( " mark = 0\n" ) end
end -- function warn()
-- SETUP
-- MAIN LOOP