Vous êtes sur la page 1sur 11

1 Automate finite

Un automat este definit ca fiind un algoritm ce se afl la un moment dat ntr-o stare, numrul total de stri fiind finit. O stare determin relaia dintre semnalele de intrare cu cele de ieire i starea urmtoare. n practic se urmrete un numr ct mai mic de stri. 1.1 TIPURI Deosebim 2 tipuri de automate: Moore atunci cnd ieirile depind de starea curent Mealy atunci cnd ieirile depind de starea curent i de ntrri
Mealy

Intrare

Circuit logic pentru determinarea strii urmtoare

Registru stare curent

Circuit logic pentru determinarea ieirii

Ieire

Resetare sincron

Clock

Resetare asincron

Figura 1-1 structura unui automat (circuit secvenial) n ambele cazuri starea urmtoare depinde de starea curent i intrri.

1.2

IMPLEMENTARE N C

Este foarte important definirea unui automat pe hrtie, sub forma unei diagrame, i apoi scrierea codului surs corespunztor (lucru care este foarte simplu). Diagrama unui automat va cuprinde: strile (remarcnd starea iniial) n fiecare din ele: ieirea automatului tranziiile pe fiecare din ele: condiia de tranziie i aciunile specifice, dac ele exist Not: ieirea automatului include, ntr-un sens mai larg, i aciunile asociate anumitor evenimente, de exemplu: operaiile pe tranziii.

Modelul general de implementare a unui automat ntr-un limbaj de programare procedural este dat n figura 1-2.
Start

Citete intrarea

n funcie de starea curent: decide starea urmtoare

n funcie de tranziie (adic de starea urmtoare): efectueaz operaia specific acestei tranziii

n funcie de starea curent: scrie ieirea

Figura 1-2 structura unui automat (program) Starea curent se conine de regul ntr-o variabil de tip enumerare:
typedef enum {GEAR_DOWN = 0, WAITING_FOR_TAKE_OFF} State_type; State current_state;

Punctul central al automatului va fi o specificaie de tipul:


while (1) { // read input {...} state_table[current_state](); }

unde state_table este un tablou de pointeri la funcii. Fiecare funcie va gestiona tranziia ctre starea urmtoare i variabilele ce reprezint ieirile automatului. Toate funciile vor avea aceeai semntur. Exist posibilitatea de a implementa un automat cu un bloc de control de tip switch. Astfel se poate elimina overhead-ul datorat apelurilor de funcie. Acest lucru ar fi un avantaj important. Totui apare i un dezavantaj un bloc

de tip switch nseamn salturi condiionate, ceea ce implic un timp de execuie variabil. Acest lucru nu ar deranja, ns odat cu numrul de stri timpul de execuie se mrete (liniar). 1.3 TESTAREA Pentru aceasta trebuie de verificat fiecare tranziie. Complexitatea unui automat poate fi msurat avnd n vedere numrul de stri. 1.4 AUTOMATE IERARHICE Ideea principal a unui automat ierarhic este dac un sistem se afl ntr-o stare sa, atunci el se afl implicit ntr-o super-stare sA. Se mai poate spune c sa este o sub-stare din starea sA. Modelul de gndire al automatelor ierarhice nu ascunde pur i simplu complexitatea, ci, prin abstractizare, reduce sistemul la ceva mai uor de gndit i de implementat.

2 Apsarea unei taste


2.1 CONSIDERENTE MECANICE I ELECTRICE Sistemele de natur electric, mecanic, etc. conin nenumrate comutatoare dedicate controlului, msurilor de securitate, etc. Cele mai comune comutatoare sunt de tip tast, acestea fiind i cele mai simple. Structura unui astfel de switch este format din 2 terminale la care se conecteaz linia de electricitate dorit a fi controlat de acesta, intern gsinduse 2 lamele mobile, fiecare ataate de cte un terminal. Una dintre lamele este conectat la butonul comutatorului astfel nct atunci cnd acesta este apsat s intre n contact cu lamela fix, realiznd nchiderea circuitului. Fiecare switch se poate gsi n 2 stri, ON i OFF, de unde provine i denumirea acestuia de switch on-off sau toggle. Natura i comportamentul unui astfel de comutator este afectat n mod variabil, uneori drastic cu repercusiuni grave asupra sistemelor care le conin datorit uzurii n timp, mediului nepropice n care se afla, factorilor de natur electric i mecanic, etc. Cei mai importani parametri ai unui comutator sunt:

impedana ca orice element pasiv, comutatorul introduce o impedan cu efecte asupra amplitudinii de tensiune ce cade peste comutator i ntr-un caz mai grav introduce o defazaj intre tensiunea i curentul ce trec prin ramura switch-ului. n sistemele embedded, controlul impedanei totale peste circuit este critic pentru buna funcionare a sistemului. De exemplu, un defazaj mare poate duce la comportamente neprevzute, chiar i la distrugerea componentelor fizice. inductana dac avem de-a face cu cureni mari prin circuit, se poate avea n vedere faptul c odat cu nchiderea comutatorului se va genera un flux magnetic ce poate afecta componentele vecine. Aceasta este o problem a circuitului i nu a comutatorului n sine, dar putem avea n vedere faptul c suprafaa lamelelor i structura i starea switch-ului afecteaz aceast mrime electric. fiabilitatea n funcie de unde sunt plasate, comutatoarele sufer pe parcurs un anumit grad de uzur ce duce la modificarea comportamentului acestuia i implicit al circuitului ce l conine. Productorul garanteaz fiecrui switch un anumit numr de apsri n care acesta nu i modific comportamentul, dar pot aprea probleme datorit mediului ostil n care acestea sunt plasate

(umiditate, temperaturi extreme, cureni mari, etc), sau a factorului uman.

2.2

FENOMENUL DE COMUTARE MULTIPL (BOUNCING)

Este poate cea mai important trstur a unui switch mecanic. Lamelele sunt fabricate din metal elastic, care atunci cnd este apsat comutatorul sunt forate s intre n contact. Cnd contactul are loc, n momentul imediat urmtor datorit elasticitii, acestea se ndeprteaz una de cealalt pentru o scurt perioad de timp. Ca rezultat semnalul de la ieirea comutatorului nu efectueaz o tranziie ferm ctre un nivel logic invers, ci o serie de tranziii, numite i spike-uri. A se vedea un exemplu n figura urmtoare:

Figura 2-3 exemplu tranziie din 0 n 1 logic n sistemele analogice, cum ar fi aprinderea unui bec sau pornirea unui motor, contactul realizat la apsarea comutatorului nu este relevant. ns, dac switch-ul face parte dintr-un sistem digital, fenomenul de bouncing are o mare importan. Motivul este faptul c timpul pn ce contactul se stabilizeaz este de ordinul milisecundelor, iar circuitele digitale pot rspunde n timpi de

ordinul microsecundelor. Incertitudinea intrrii duce de obicei la rezultate eronate. O alt problem ar fi faptul c tensiunea produs la comutare poate uneori depi specificaiile de tensiune ale circuitului. Astfel avem ca rezultat cazuri de metastabilitate, condiii de curs, etc. 2.3 2.3.1 PROBLEM

Enun S se creeze o aplicaie care s citeasc o tast conectat la un pin al microprocesorului, filtrnd comutaiile multiple (n mod software). 2.3.2 Montaj

Figura 2-4 2.3.3 Rezolvare Enunul problemei specific faptul ca metoda de filtrare s fie software, deoarece n practic se poate aplica i o metod hardware pur i simplu conectnd ntre tast i pinul de intrare un filtru trece-jos. Acest lucru simplific programul, ns, introducerea unui filtru trece-jos (ceea ce implic cel puin un condensator n plus), mrete costul circuitului. Exist o soluie software aparent insernd doar nite ntrzieri care s acopere regimul de comutaie, s-ar prea c se poate rezolva problema aceast metod ns nu poate fi utilizat ntr-o aplicaie embedded normal, unde timpul de rspuns trebuie s fie ct mai mic. Soluia software adevrat const n utilizarea unui automat finit corepunztor tastei.

2.3.4

Automatul Automatul se poate gndi n felul urmtor: exist 2 stri mari tast liber i tast apsat tranziiile se ntre aceste 2 stri mari se fac indirect, prin intermediul a 2 stri de tranziie, finite n timp
x=0 reset timer x=0 x = 1 and t <

Start

Released /0

x=1

Transition low-high /0

glitch x = 0 and t > Input variables: x (value from pin) t (timer) (time constant) glitch x= 1 Transition high-low /1 x= 0 Pressed /1 x = 1 and t >

reset timer x = 0 and t < x=1

Diagrama 1-1 Stri:

released tasta nu este apsat transition low-high s-a nregistrat apsarea tastei, dar se ateapt stabilizarea contactului pressed tast apsat transition high-low s-a nregistrat eliberarea tastei, dar se ateapt stabilizarea contactului Not: n strile de tranziie se are n vedere un timp minim caracteristic comutatorului pentru stabilizarea contactului, notat .

2.3.5

Cod surs

comportamentul fiecrei stri este coninut ntr-o funcie separat (exist alternativ de a utliza un bloc switch pentru ntreg automatul) timer software nu se execut nici o aciune la apsarea tastei programul este demonstrativ semnific intervalul de timp dup care se presupune c fenomenul de bouncing s-a terminat. Valoarea lui efectiv trebuie s fie de ordinul a 10 milisecunde (este specific fiecrui tip de comutator). Valoarea lui n program este un numr ntreg egal cu raportul dintre timpul dup care se consider contact stabilit i timpul dup care timer-ul avanseaz cu o unitate. timpul dup care timer-ul avanseaz cu o unitate (sau intervalul de timp la care automatul poate trece n alt stare) este suficient s fie de ordinul milisecundelor (nu mai mic pentru c am consuma timpul de procesor). main.c
#include <iom16.h> // possible states typedef enum {RELEASED = 0, TRANSITION_LOW_HIGH, PRESSED, TRANSITION_HIGH_LOW} State_type; // current state State_type current_state = RELEASED; // constant quantities const unsigned long eps = 100000; // input unsigned char x = 0; unsigned long timer = 0; // output unsigned char button; void void void void released(void); transition_low_high(void); pressed(void); transition_high_low(void);

// glitch statistics

unsigned short int glitch_low_high; unsigned short int glitch_high_low; typedef void (*fptr)(void); int main( void ) { DDRA = 0x00; // input PORTA = 0x00; fptr state_table[] = {released, transition_low_high, pressed, transition_high_low}; while (1) { x = PINA >> 7; state_table[current_state](); } //return 0; } void released(void) { // next state if (1 == x) { current_state = TRANSITION_LOW_HIGH; timer = 0; // reset timer } else { //current_state = RELEASED; // keep current state } // output button = 0; } void transition_low_high(void) { // run timer; timer++; // next state if (1 == x && timer < eps) { current_state = PRESSED; //glitch_high_low = 0; } else { if (0 == x) { current_state = RELEASED; glitch_low_high++;

} else { if (1 == x && timer < eps) { //current_state = TRANSITION_LOW_HIGH; // keep current state } } } // output button = 0; } void pressed(void) { // next state if (0 == x) { current_state = TRANSITION_HIGH_LOW; timer = 0; // reset timer } else { if (1 == x) { //current_state = PRESSED; // keep current state } } // output button = 1;

void transition_high_low(void) { // run timer timer++; // next state if (0 == x && timer > eps) { current_state = RELEASED; //glitch_low_high = 0; } else { if (1 == x) { current_state = PRESSED; glitch_high_low++; }

if (0 == x && timer < eps) { //current_state = TRANSITION_HIGH_LOW; // keep current state } } } // output button = 1;

else {

2.3.6

Considerente de timp

Timer-ul pe care l-am folosit (variabila t) este unul de tip software. Adic el este reprezentat de un numr ntreg valorea cruia se mrete periodic. Modificarea lui se face n ciclul while {}, deci rezoluia timerului va fi egal cu intervalul de timp (fie acesta T) n care se execut blocul while {}. De aici rezult un dezavantaj: T poate s varieze; i o constrngere: T trebuie s fie relativ mic (de ordinul milisecundelor). Tot n ciclul while {} are loc citirea pinului la care este legat tasta, n variabila x. Aadar x nu va reflecta cu exactitate tensiunea (valoarea logic) de pe pin, ceea ce nseamn c nu vom vedea toate glitch-urile. De fapt, acest lucru nu deranjeaz.

Vous aimerez peut-être aussi