Automat finit folosit în sincronizarea unui semafor la o trecere de pietoni

16
Universitatea POLITEHNICA București Facultatea de Electronică, Telecomunicații și Tehnologia Informației PROIECT 2 Automat finit folosit în sincronizarea unui semafor la o trecere de pietoni Student: Coordonator știintific:

description

Proiectul constă în implementarea unui automat cu stări finite

Transcript of Automat finit folosit în sincronizarea unui semafor la o trecere de pietoni

Page 1: Automat finit folosit în sincronizarea unui semafor la o trecere de pietoni

Universitatea POLITEHNICA BucureștiFacultatea de Electronică, Telecomunicații și Tehnologia Informației

PROIECT 2

Automat finit folosit în sincronizarea unui semafor la o trecere de pietoni

Student: Coordonator știintific:

Necșulescu Remus as. ing. Bogdan FLOREAgrupa 435B

An universitar2011-2012

Page 2: Automat finit folosit în sincronizarea unui semafor la o trecere de pietoni
Page 3: Automat finit folosit în sincronizarea unui semafor la o trecere de pietoni
Page 4: Automat finit folosit în sincronizarea unui semafor la o trecere de pietoni

Rezumatul proiectului

Proiectul constă în implementarea unui automat cu stări finite

Proiectul trebuie implementat prin două metode, (1) folosind bistabili D, inversoare și porți ȘI-NU și (2) cu ajutorul unui microcontroller PIC.

Placa de dezvoltare PIC 18F4XK20 Starter Kit echipată cu PIC 18F46K20

Pentru implementarea cu ajutorul bistabililor D și a circuitelor logice combinaționale, vom calcula diagramele Karnaugh aferente fiecărui circuit logic combinațional după care aplicăm forumulele lui de Morgan și simplificăm ecuațiile obținute.

După această etapă, implementăm circuitul în PSpice pentru a-l simula și testa, urmand ca ulterior sa-l implementam pe PIC.

Page 5: Automat finit folosit în sincronizarea unui semafor la o trecere de pietoni

Aspecte teoretice ale proiectului

Ecuatiile lui DeMorgan:

D0 = Q1 I + Q0 I = Q1 I∗Q0 I

D1= Q0 I+Q1 I=Q0 I∗Q1 I

Y 0=Q0Q1+Q0Q1=Q0Q1∗Q0Q

Y 1=Q0Q1=Q0Q1

Implementarea cu bistabili de tip D și cu porți ȘI-NU și INVERSOARE

Elemente de OrCAD:

Page 6: Automat finit folosit în sincronizarea unui semafor la o trecere de pietoni

OrCAD 16.2 este o suită de programe produse de Cadence, care conține Capture ( și variațiile acestuia ), utilitarul specializat pe desenarea schemelor electronice, Layout, utilitarul specializat în proiectarea placilor electronice imprimate ( PCB ), PSpice ( și variațiunile acestuia ), utilitarul în care se pot simula scheme electronice sub diverși parametri.

PSpice poate simula circuite analogice în domeniul timp ( regim tranzitorilu ), în domeniul frecvență ( AC Sweep ), poate calcula PSF-ul ( punctul static de funcționare ) al circuitului, sub diverși parametri de testare. De asemenea, se pot simula și circuite digitale, dar și variațiuni ale circuitelor analogice cu cele digitale.

Captura din simularea PSpice:

Elemente despre microcontrollerul PIC:

Page 7: Automat finit folosit în sincronizarea unui semafor la o trecere de pietoni

PIC este microcontrollerul produs de Microchip Technology.

PICkit 3 – ultima versiune a celui mai ieftin programator de la Microchip, impreună cu o plac de dezvoltare cu microcontroller PIC, produsă tot de Microchip

PIC-ul are 3 familii de microcontrollere: familia de 8 biți, de 16 biți și familia de 32 de biți. Cele mai cunoscute și frecvent utilizate microcontrollere sunt PIC-urile pe 8 biți, ele fiind o solutie ieftină și eficientă.

PIC-ul are foarte multe module și protocoale cum ar fi: oscilatorul intern, Timere-le, convertoare Analog-Digital, UART, I2C, One-Wire, SPI, Real Time Clock sustenabil pe baterie, și suportă o gamă foarte largă de dispozitive ( LCD-uri, GLCD, senzori, etc ) precum și oscilator extern.

Microchip pune la dispoziție două versiuni de C și o versiune de assembler, dar terțe părți pun la dispoziție o serie de alte limbaje: altă versiune de C, Pascal, Basic, etc.

Microcontrollerele PIC18FXXXX au la bază arhitectura Harvard, ceea ce înseamnă ca memoria de date și meoria de program sunt separate. Acest lucru permite rularea mult mai rapidă, deoarece bus-urile de date și de program sunt dedicate și separate. De asemenea, adresa de return are memoria ei dedicată.

Codul programului:

;Program de implementare a automatului finit TUTORIAL;Automatul are 4 stãri

Page 8: Automat finit folosit în sincronizarea unui semafor la o trecere de pietoni

;STATE0 = stinge orice LED aprins = citeste Inputal; - dacã este 0, seteazã STATEO; - dacã este 1, seteazã STATEI;STATE1

;Aprinde led d6; asteapta 5 secunde dupa care trece in STATE 2 ;STATE2 =;Aprinde led D7 ;Asteapta 20 de sec dupa care trece in state 3; ;STATE3 - Aprinde led d6; asteapta 5 secunde dupa care trece in STATE 1 ;

;

list p=12f675 ;Directiva de definire a procesorului#include <p12f675.inc>

errorlevel -302 ;Eliminã mesajul de tip 302 din fisierul list

__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT

;Directiva '__CONFIG' pentru configurarea perifericelor în fiºierul sursã

;Semnificaþia bitilor de configurare:;CP_OFF - Cod Protection;WDT_OFF - WatchDog Timer;BODEN ON - Brown-Out Detect ENable;PWRTE_ON - PoWeR-up Timer Enable;INTRC_OSC_NOCLKOUT - INTernal RC_OSCilator;MCLRE_OFF - Master CLeaR Enable;CPD_OFF - Data Code Protection

;Adresele acestor biþi se gãsesc în fiºierul p12f675.inc

;Definirea unor registre specifice aplicaþiei cu directiva CBLOCK

cblock 0x20STATE_COUNTER ;Registru de numãrare a stãrilor automatuluiSTATE_DEBOUNCE ;Registru de numãrare a stãrilor debounceCountHCountL ;CountH si CountL sunt registre utilizate în subrutina DEBOUNCEFLAGSDelayCountendc

;Definirea variabilelor de program pentru comanda LED-urilor D6 si D7 cu directiva DEFINE

#define TRIS_D6_D7 B'00111001' ;Definirea variabilei TRIS_D6_D7 prin valoarea ei binara #define TRIS_D6_D7_OFF B'00111111'

Page 9: Automat finit folosit în sincronizarea unui semafor la o trecere de pietoni

#define D6_ON B'00000100' ;Atribuirea valorii binare variabilei D6_ON (LED-OK aprins)#define D7_ON B'00000010' ;La fel pentru D7_ON (LED-ERR)

;Initialize: secventa de initializare a SFR-urilor si a registrelor de uz general

ORG 0x000nopgoto InitializeORG 0x004 ;Adresa vectorului de interupere

Timerl_Interruptmovlw 0xBEmovwf TMR1H ;Reinitializam TMR1H cu valoarea de inceputmovlw 0x0E6movwf TMR1Lbtfss FLAGS,6 ;Testare bitul de stare al ledului din registrul FLAGSgoto LED_D6_ON ;Salt la surutina do aprins ledul D6bcf FLAGS,6 ;Resetare flag D6bsf STATUS,RP0movlw TRIS_D6_D7_OFFmovwf TRISIO ;Stingere led D6bcf STATUS,RP0movwf GPIOgoto RET_I ;Salt la subrutina de resetare a flagului de întreruperi

LED_D6_ON bsf FLAGS,6 ; Setare flag 06bsf STATUS,RP0movlw TRIS_D6_D7movwf TRISIO ; Activare D6 D7bcf STATUS,RP0movlw D6_ONmovwf GPIO ; Aprindere led D6

RET_Ibcf STATUS,RP0bcf PIR1,TMR1IF ; Resetare flagului de întreruperi a circuitului Timerlretfie

Initialize

; call 0x3FF ;Restabilirea factorului de calibrare; instructiune comentariu necesarã în cazul utilizãrii simulatorului

bsf STATUS,RP0 ;Selectare Bank 1movwf OSCCAL ;încãrcarea registrului OSCCAL cu valoarea factorului de calibraremovlw 0x7fmovwf OPTION_REG ;Validare Weak pull-up generalmovlw B'00111111'movwf TRISIO ;Configurarea pinilor l/O ca intrãrimovwf WPUclrf ANSEL ;Dezactivare convertor A/D - setare intrãri/ieºiri digitale

bcf STATUS,RP0 ;Selectare Bank 0clrf GPIOmovlw B'00000111'

Page 10: Automat finit folosit în sincronizarea unui semafor la o trecere de pietoni

movwf CMCON ;Dezactivare comparator - setare intrãri/ieºiri digitale

movlw B'10000111'movwf OPTION_REG ;Setare functie Timer (T0CS=0), cu prescaler (PSA=0)

;factor de divizare 1/256 (PS2=PS1=PS0=1)bsf STATUS,RP0clrf VRCON ; Setare Vref Offbsf PIE1,TMR1IE ; Validare intreruperi generate de Timerlbcf STATUS,RP0movlw 0x07bsf INTCON,PEIE ; Se activeaza întreruperile generate de catre perifericebcf PIR1,TMR1IF ; Rcsctarc flag întreruperi Timerlbsf INTCON,GIE ; Activare întreruperi generalemovlw 0xBEmovwf TMR1H ; incarcare registre Timerl cu valorile iniþiale pentru a obþine

; frecventa de 30Hzmovlw 0xE6movwf TMR1Lclrf STATE_COUNTER ; Resetarea registrelor folosite de cãtre program clrf STATE_DEBOUNCE clrf CountH clrf CountLclrf FLAGS

;State_Machine: Implementeazã un automat finit cu 4 stãri State_Machine

call Button_Press ;Apelare de subrutinãmovf STATE_COUNTER,wandlw B'00000111' ;Se mascheazã ultimii trei biþi din STATE_COUNTER

addwf PCL, f ;Program Counter (PCL) este încãrcat cu adresa stãii curente; prin intermediul acumulatorului

(WORKREGISTER)

goto StateOgoto State1goto State2goto State3

StateO

;Stinge LED-uri si executã citire Inputal;Seteazã trecerea la starea urmãtoare (Statei) dacã Inputal = 1 sau rãmâne în StateO dacã este 0

clrf T1CONbsf STATUS,RP0movlw b'00111111'movwf TRISIObcf STATUS,RP0

Page 11: Automat finit folosit în sincronizarea unui semafor la o trecere de pietoni

btfss GPIO,4 ;Citeºte Inputal ºi sare instrucþiunea urmãtoare dacã Inputal=1goto State_Machineincf STATE_COUNTER,f ;Seteazã State1goto State_Machine

State1

bsf STATUS,RP0movlw b'00111111'movwf TRISIO ;Configurarea pinilor l/O ca intrãribcf STATUS,RP0

movlw TRIS_D6_D7movwf TRISIO ; Configurarea pinilor pentru aprinderea ledului D6 BANKOmovlw 0x1movwf T1CON ; Activarea circuitului Timerl movlw 0x0

Delay_10ms movlw D'20' movwf DelayCountDelayLoop1 movlw D'100'DelayLoop2 nop addlw -450 btfss STATUS, Z goto DelayLoop2decfsz DelayCount, F; Intarziere de 5 sec Total delay = 1+1+(20x500)+[(19x1)+2]+(19x2)+2=10,063*Ti goto DelayLoop1 return

incf STATE_COUNTER,f ;Seteazã State2goto State_Machine

State2

bsf STATUS,RP0movlw b'00111111'movwf TRISIObcf STATUS,RP0

bsf STATUS,RP0 ;Bank 1movlw TRIS_D6_D7movwf TRISIO ;încarcã valoarea definitã pentru TRIS_D6_D7 în TRISIObcf STATUS,RP0 ;Bank 0movlw D7_ONmovwf GPIO ;încarcã valoarea definitã pentru D7_ON în GPIO

Delay_20s movlw D'20' movwf DelayCountDelayLoop11 movlw D'100'DelayLoop22 nop addlw -9000 btfss STATUS, Z goto DelayLoop22

Page 12: Automat finit folosit în sincronizarea unui semafor la o trecere de pietoni

decfsz DelayCount, F; Intarziere de 20 sec Total delay = 20s goto DelayLoop11 return

incf STATE_COUNTER,f ;Seteazã State3goto State_Machine

State3

bsf STATUS,RP0movlw b'00111111'movwf TRISIO ;încarcã valoarea binarã din instrucþiunea precedentã în TRISIObcf STATUS,RP0movlw TRIS_D6_D7movwf TRISIO ; Configurarea pinilor pentru aprinderea ledului D6 BANKOmovlw 0x1movwf T1CON ; Activarea circuitului Timerl movlw 0x0

Delay_10ms11 movlw D'20' movwf DelayCountDelayLoop111 movlw D'100'DelayLoop222 nop addlw -450 btfss STATUS, Z goto DelayLoop222decfsz DelayCount, F; Intarziere de 5 sec Total delay = 1+1+(20x500)+[(19x1)+2]+(19x2)+2=10,063*Ti goto DelayLoop111 return

clrf STATE_COUNTER ; Seteaza StareOgoto State_Machine

;Button_Press: testeazã starea microswitch-ului (SW), executã temporizarea de 10 ms ; la schimbarea ;stãrii ºi se întoarce în programul principal la sesizarea stãrii de apãsare a lui

Button_Press

btfss STATE_DEBOUNCE,0goto Debounce_1goto Debounce_2

Debounce_1

bcf STATUS, RP0btfsc GPIO,3 ;SW este apãsat?goto Debounce_1 ;Nu, salt la Debounce_1incf STATE_DEBOUNCE, f ;Da, incrementeazã STATE_DEBOUNCE

Page 13: Automat finit folosit în sincronizarea unui semafor la o trecere de pietoni

Tempmovlw 0x21 ;începe iniþializarea registrelor folosite pentru temporizaremovwf CountH ;Se încarcã registrul CountH cu constanta 33D

M1movlw 0x63movwf CountL ;Se încarcã registrul CountL cu constanta 99D

M2decfsz CountL,f ;Se executã decrementarea registrului CountL

;Când conþinutul acestuia ajunge la 00H, se sare instrucþiunea

;urmãtoare (goto M2) goto M2 ;Dacã conþinutul lui CountL este diferit de 0, se executã salt la M2 decfsz CountH,f ;Decrementare CountH pânã când conþinutul acestui registru este 00H

;situaþie în care se sare instrucþiunea urmãtoare (goto M1)goto M1

;Temporizarea obþinutã cu aceastã secvenþã de program este ;Temp = 2 + 33*(5+3*99) us

btfss STATE_DEBOUNCE,0goto Button_Pressretlw 0 ;întoarce în programul principal cu conþinutul

acumulatorului egal 0

Debounce_2

bcf STATUS,RP0btfss GPIO,3 ;SW este relaxat?

goto Debounce_2 ;Nu, salt la Debounce_2

clrf STATE_DEBOUNCE ;Da, reseteazã registrul STATE_DEBOUNCE

goto Temp

end ;directiva 'end' a programului