Académique Documents
Professionnel Documents
Culture Documents
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
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 tranziie (adic de starea urmtoare): efectueaz operaia specific acestei tranziii
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;
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.
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
2.2
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 >
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.