Sunteți pe pagina 1din 13

Universitatea POLITEHNICA Bucureti Facultatea de Electronic, Telecomunicaii i Tehnologia Informaiei

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

Student: Neculescu Remus grupa 435B

Coordonator tiintific: as. ing. Bogdan FLOREA

An universitar 2011-2012

Rezumatul proiectului

Proiectul const n implementarea unui automat cu stri finite Proiectul trebuie implementat prin dou metode, (1) folosind bistabili D, inversoare i pori 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 combinaionale, vom calcula diagramele Karnaugh aferente fiecrui circuit logic combinaional dup care aplicm forumulele lui de Morgan i simplificm ecuaiile obinute. Dup aceast etap, implementm circuitul n PSpice pentru a-l simula i testa, urmand ca ulterior sa-l implementam pe PIC.

Aspecte teoretice ale proiectului

Ecuatiile lui DeMorgan:

D0 = I + =

Implementarea cu bistabili de tip D i cu pori I-NU i INVERSOARE

Elemente de OrCAD:
OrCAD 16.2 este o suit de programe produse de Cadence, care conine Capture ( i variaiile acestuia ), utilitarul specializat pe desenarea schemelor electronice, Layout, utilitarul specializat n proiectarea placilor electronice imprimate ( PCB ), PSpice ( i variaiunile acestuia ), utilitarul n care se pot simula scheme electronice sub diveri parametri. PSpice poate simula circuite analogice n domeniul timp ( regim tranzitorilu ), n domeniul frecven ( AC Sweep ), poate calcula PSF-ul ( punctul static de funcionare ) al circuitului, sub diveri parametri de testare. De asemenea, se pot simula i circuite digitale, dar i variaiuni ale circuitelor analogice cu cele digitale. Captura din simularea PSpice:

Elemente despre microcontrollerul PIC:


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 bii, de 16 bii i familia de 32 de bii. Cele mai cunoscute i frecvent utilizate microcontrollere sunt PIC-urile pe 8 bii, 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 dispoziie dou versiuni de C i o versiune de assembler, dar tere pri pun la dispoziie 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 stri ;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 #include errorlevel -302 p=12f675 <p12f675.inc> ;Directiva de definire a procesorului

;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 fiierul surs ;Semnificaia 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 bii se gsesc n fiierul p12f675.inc ;Definirea unor registre specifice aplicaiei cu directiva CBLOCK cblock 0x20 STATE_COUNTER STATE_DEBOUNCE CountH CountL FLAGS DelayCount endc

;Registru de numrare a strilor automatului ;Registru de numrare a strilor debounce ;CountH si CountL sunt registre utilizate n subrutina DEBOUNCE

;Definirea variabilelor de program pentru comanda LED-urilor D6 si D7 cu directiva DEFINE #define TRIS_D6_D7 B'00111001' #define TRIS_D6_D7_OFF #define D6_ON B'00000100' #define D7_ON ;Definirea variabilei TRIS_D6_D7 prin valoarea ei binara B'00111111' ;Atribuirea valorii binare variabilei D6_ON (LED-OK aprins) B'00000010' ;La fel pentru D7_ON (LED-ERR)

;Initialize: secventa de initializare a SFR-urilor si a registrelor de uz general ORG nop goto ORG 0x000 Initialize 0x004

;Adresa vectorului de interupere

Timerl_Interrupt movlw 0xBE movwf TMR1H ;Reinitializam TMR1H cu valoarea de inceput movlw 0x0E6 movwf TMR1L btfss FLAGS,6 ;Testare bitul de stare al ledului din registrul FLAGS goto LED_D6_ON ;Salt la surutina do aprins ledul D6 bcf FLAGS,6 ;Resetare flag D6 bsf STATUS,RP0 movlw TRIS_D6_D7_OFF movwf TRISIO ;Stingere led D6 bcf STATUS,RP0 movwf GPIO goto RET_I ;Salt la subrutina de resetare a flagului de ntreruperi LED_D6_ON bsf FLAGS,6 ; Setare flag 06 bsf STATUS,RP0 movlw TRIS_D6_D7 movwf TRISIO ; Activare D6 D7 bcf STATUS,RP0 movlw D6_ON movwf GPIO ; Aprindere led D6 RET_I bcf STATUS,RP0 bcf PIR1,TMR1IF ; Resetare flagului de ntreruperi a circuitului Timerl retfie Initialize ; call bsf movwf movlw movwf movlw movwf movwf 0x3FF ;Restabilirea factorului de calibrare ; instructiune comentariu necesar n cazul utilizrii simulatorului STATUS,RP0 ;Selectare Bank 1 OSCCAL ;ncrcarea registrului OSCCAL cu valoarea factorului de calibrare 0x7f OPTION_REG ;Validare Weak pull-up general B'00111111' TRISIO ;Configurarea pinilor l/O ca intrri WPU

clrf

ANSEL

;Dezactivare convertor A/D - setare intrri/ieiri digitale ;Selectare Bank 0

bcf STATUS,RP0 clrf GPIO movlw B'00000111' movwf CMCON movlw B'10000111' movwf OPTION_REG bsf clrf bsf bcf movlw bsf bcf bsf movlw movwf

;Dezactivare comparator - setare intrri/ieiri digitale

;Setare functie Timer (T0CS=0), cu prescaler (PSA=0) ;factor de divizare 1/256 (PS2=PS1=PS0=1)

STATUS,RP0 VRCON ; Setare Vref Off PIE1,TMR1IE ; Validare intreruperi generate de Timerl STATUS,RP0 0x07 INTCON,PEIE ; Se activeaza ntreruperile generate de catre periferice PIR1,TMR1IF ; Rcsctarc flag ntreruperi Timerl INTCON,GIE ; Activare ntreruperi generale 0xBE TMR1H ; incarcare registre Timerl cu valorile iniiale pentru a obine ; frecventa de 30Hz movlw 0xE6 movwf TMR1L clrf STATE_COUNTER ; Resetarea registrelor folosite de ctre program clrf STATE_DEBOUNCE clrf CountH clrf CountL clrf FLAGS ;State_Machine: Implementeaz un automat finit cu 4 stri State_Machine call Button_Press ;Apelare de subrutin movf STATE_COUNTER,w andlw B'00000111' ;Se mascheaz ultimii trei bii din STATE_COUNTER addwf PCL, f (WORKREGISTER) goto goto goto goto StateO State1 State2 State3 ;Program Counter (PCL) este ncrcat cu adresa stii curente ; prin intermediul acumulatorului

StateO ;Stinge LED-uri si execut citire Inputal ;Seteaz trecerea la starea urmtoare (Statei) dac Inputal = 1 sau rmne n StateO dac este 0 clrf T1CON

bsf STATUS,RP0 movlw b'00111111' movwf TRISIO bcf STATUS,RP0 btfss goto incf goto State1 GPIO,4 ;Citete Inputal i sare instruciunea urmtoare dac Inputal=1 State_Machine STATE_COUNTER,f ;Seteaz State1 State_Machine

bsf STATUS,RP0 movlw b'00111111' movwf TRISIO ;Configurarea pinilor l/O ca intrri bcf STATUS,RP0 movlw TRIS_D6_D7 movwf TRISIO ; Configurarea pinilor pentru aprinderea ledului D6 BANKO movlw 0x1 movwf T1CON ; Activarea circuitului Timerl movlw 0x0 Delay_10ms movlw D'20' movwf DelayCount DelayLoop1 movlw D'100' DelayLoop2 nop addlw -450 btfss STATUS, Z goto DelayLoop2 decfsz DelayCount, F; Intarziere de 5 sec Total delay = 1+1+(20x500)+[(19x1)+2]+(19x2)+2=10,063*Ti goto DelayLoop1 return

incf goto State2

STATE_COUNTER,f ;Seteaz State2 State_Machine

bsf STATUS,RP0 movlw b'00111111' movwf TRISIO bcf STATUS,RP0 bsf STATUS,RP0 movlw TRIS_D6_D7 movwf TRISIO bcf STATUS,RP0 movlw D7_ON movwf GPIO Delay_20s movlw D'20' movwf DelayCount ;Bank 1 ;ncarc valoarea definit pentru TRIS_D6_D7 n TRISIO ;Bank 0 ;ncarc valoarea definit pentru D7_ON n GPIO

DelayLoop11 movlw D'100' DelayLoop22 nop addlw -9000 btfss STATUS, Z goto DelayLoop22 decfsz DelayCount, F; Intarziere de 20 sec Total delay = 20s goto DelayLoop11 return

incf goto State3

STATE_COUNTER,f ;Seteaz State3 State_Machine

bsf STATUS,RP0 movlw b'00111111' movwf TRISIO ;ncarc valoarea binar din instruciunea precedent n TRISIO bcf STATUS,RP0 movlw TRIS_D6_D7 movwf TRISIO ; Configurarea pinilor pentru aprinderea ledului D6 BANKO movlw 0x1 movwf T1CON ; Activarea circuitului Timerl movlw 0x0 Delay_10ms11 movlw D'20' movwf DelayCount DelayLoop111 movlw D'100' DelayLoop222 nop addlw -450 btfss STATUS, Z goto DelayLoop222 decfsz 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 StareO goto State_Machine

;Button_Press: testeaz starea microswitch-ului (SW), execut temporizarea de 10 ms ; la schimbarea ;strii i se ntoarce n programul principal la sesizarea strii de apsare a lui Button_Press btfss goto goto Debounce_1 STATE_DEBOUNCE,0 Debounce_1 Debounce_2

bcf btfsc goto incf Temp

STATUS, RP0 GPIO,3 Debounce_1 STATE_DEBOUNCE, f

;SW este apsat? ;Nu, salt la Debounce_1 ;Da, incrementeaz STATE_DEBOUNCE

movlw 0x21 movwf CountH M1 movlw 0x63 movwf CountL M2 decfsz CountL,f 00H, se sare instruciunea

;ncepe iniializarea registrelor folosite pentru temporizare ;Se ncarc registrul CountH cu constanta 33D

;Se ncarc registrul CountL cu constanta 99D

;Se execut decrementarea registrului CountL ;Cnd coninutul acestuia ajunge la

;urmtoare (goto M2) goto M2 ;Dac coninutul lui CountL este diferit de 0, se execut salt la M2 decfsz CountH,f ;Decrementare CountH pn cnd coninutul acestui registru este 00H ;situaie n care se sare instruciunea urmtoare (goto M1) goto M1 ;Temporizarea obinut cu aceast secven de program este ;Temp = 2 + 33*(5+3*99) us btfss STATE_DEBOUNCE,0 goto Button_Press retlw 0 acumulatorului egal 0 Debounce_2 bcf btfss
goto clrf

;ntoarce n programul principal cu coninutul

STATUS,RP0 GPIO,3
Debounce_2 STATE_DEBOUNCE

;SW este relaxat?


;Nu, salt la Debounce_2 ;Da, reseteaz registrul STATE_DEBOUNCE

goto

Temp

end

;directiva 'end' a programului