You are on page 1of 20

Iuseim Faryda

grupa 432 B

-PROIECT 2-
Tema nr 12

Automat finit care realizeaza functia de recunoastere a


codului de trei biti 010 cu fereastra glisanta

Facultatea de Electronica, Telecomunicatii si Tehnologia Informatiei


Universitatea Politehnica Bucuresti

1
Date initiale de proiectare

Sa se simuleze si sa se realizeze organigrama de implementare pe PICkit 1


FLASH Starter Kit a unui automat finit care realizeaza functia de recunoastere a
codului de trei biti 010, cu fereastra glisanta.

Diagrama starilor care descrie functionarea automatului:

0/1
1/0 0/0 1/0
0 1 2
0/0

1/0

Starile automatului sunt 0,1,2 iar tranzitia de la o stare la cealalta se face


conform cu starea intrarii IN.
Schema electronica se va sintetiza cu bistabile D, conform ecuatiilor de
comanda:

D0= IN; D1= Q0*IN;

Ecuatia de iesire care comanda deschiderea usii:

OUT= Q1* IN;

Pentru implementarea pe kit:


- Se va folosi acceasi diagrama de stare;
- Intrarea IN este conectata la pinul GP5;
- Citirea variabilei de intrare se va face dupa apasarea switch-ului de pe
placa;
- Afisarea starii de recunoastere cod corect (OUT=1) se va face cu LED D6
cu o frecventa de 25 Hz obtinuta cu Timer1.

2
CUPRINS

Date de Proiectare…………………………………..2

Rezumatul proiectului………………………………4

Cuprins………………………………………………….3

Cap.I: Introducere teoretica………………………5

Cap.II: Proiectare si Simulare…………………….9


II.1. Etapa pregatitoare……………………………...9
II.2. Etapa de simulare……………………………….10

Cap.III: Implementarea pe kit……………………13


III.1 Organigrama programului…………………..13
III.2 Definirea variabilelor de program………….15
III.3 Initializare……………………………………….15
III.4 Configurarea porturilor……………………….15
III.5. Explicitarea automatului…………………….15
III.6. Codul sursa………………………………………16

CAP.IV: Concluzii si observatii personale………20

Bibliografie……………………………………………..20

3
REZUMATUL PROIECTULUI

Acest proiect urmareste implementarea pe microcontrollerul PIC 12F675 a


unui automat finit care realizeaza functia de recunoastere a codului de trei biti
010, cu fereastra glisanta. Pentru mai buna intelegere a unei persoane care n-a
mai utilizat niciodata un microcontroller am inclus in proiect o introducere
teoretica ce face o scurta prezentare a lui PIC12F675 si a arhitecturii lui Harvard.
Am structurat aceasta implementare in trei etape:

- prima etapa este proiectarea circuitului in mediul de lucru Orcad, si simularea


functionarii lui.

- a doua etapa este conceperea organigramei pe baza careia vom scrie efectiv
programul, cu explicarea exacta a fiecarui bloc si precizarea schimbarilor care au
loc in automat la schimbarea semnalelor de intrare

-a patra etapa este scrierea codului programului si simularea acestuia in


simulatorul MPLAB

4
CAPITOLUL I: INTRODUCERE TEORETICA

Microcontrollere sunt circuite integrate special concepute, in general


pentru aplicatii de tipul comanda si control, specifice sistemelor
dedicate(inglobate). Firma MICROCHIP pune la dispozitia utilizatorilor o gama
larga de microcontollere. Din familia de microcontrollere a firmei MICROCHIP am
ales pentru acest proiect varianta PIC 12F675 deoarece este un microcontroller
cu arhitectura RISC prevazut cu o memorie de program de tip FLASH.
PIC 12F62 este un microcontroler de 8 biti realizat intr-o tehnologie
CMOS echipat cu o memorie de tip FLASH si este incorporat intr-o capsula
minidip(cu 8 terminale). Kit-ul de dezvoltare este echipat cu microcontrolelrul PIC
12F675 care are in structura interna un convertor A/D de 10 biti.
Unitatea centrala de prelucrare a microcontrollerullui este
caracterizata prin
-arhitectura RISC;
-35 de instructiuni executabile intr-un singur ciclu masina cu exceptia
instructiunilor de salt;
-durata minima a unui ciclu masina este de 200ns;
-facilitati de a lucra in intreruperi inclusiv intereruperi generate la schimbarea
semnalelor de pe pini
-memorie stiva de 8 nivele realizata hardware
Cele mai importante parti ale microcontrollerului:
Contorul de instructiuni( PC – Program counter) este legat printr-o
magistrala de 13 biti de memoria program. TOt PC comunica cu o memorie
stiva(realizata hardware) de 8 nivele nutilizata pentru stocarea adreselor de
revenire in program in cazul unor intreruperi sau salturi la subrutine.
Memoria program FLASH este organizata pe cuvinte de 14 biti si va
comunica cu exteriorul – Registrul de instructiuni printr-o magistrala de 14 biti.
Unitatea de comanda va genera toate comenzile necesare executiei
instructiunii, pe baza codului operatiei, dupa ce acesta a fost decodificat.
Memoria de date comunica cu restul componentelor interne prin
intermediul unei magistrale de 8 biti.
Unitatea aritmeitca logica este conectata cu magistrala de date cu
registrul de instructiuni, cu registrul W si cu Reigstrul de stare. Registrul W joaca
un rol deosebit deoarece fluxul de date este gandit sa treaca aproape in totalitate
prin acest registru, deci are rol de acumuluator cu deoseibrea ca daca unul dintre
opereanzi este luat din registrul W, rezultatul operatiei efectuate de ALU poate fi
memorat fie in W, fie intr-un alt registru intern.
Cel de-al doilea operand pentru ALU poate proveni din insctructiunea care
se va executa sau de la oricare alta componenta legata l amagistrala interna de
date. In functie de rezultatul operatiei efectuata de ALU, in Registrul de stare
sunte setati sau nu anumiti biti.

5
De magistrala interna de 8 biti sunt legate si celelalte componente ale
sisstemului: cei 6 pini multifunctionali(GP0.. GP5) care constituie portul general
de intrare-iesire, Comparatorul analogic si referinta, Convertorul analog-numeric
cu patru canale de itnrare, circuite temporizatoare Timer0 si Timer1 precum si
Memoria suplimentara de date(EEPROM).
Circuitul mai contine Oscilatorul intern, Generatorul de secvente de timp
precum si o serie de componente suplimentare: Temporizatorul de alimentare,
Temporizatorul de pornire a oscilatorului, Circuitul de resetare la
alimentare(Power-on Reset), Temporizatorul circuit de supraveghere(Watchdog
Timer) si Detectorul de avarie a tensiunii de alimentare.
Memoria este organizata in memorie de program si memorie de date.
Memoria de program: Microcotnrollerul contine un contor de
instructiuni(PC) pe 13 biti capabil a adresa un spatiu de 8KX14 de memorie de
program. La microcontrollerul 12F675 numai 1K din acest spatiu este fizic
implementat(de la 0000H la 3FFH. Vectorul de initializare(prima instructiune
executate dupa o operatie de resetare hardware)(RESET) se afla stocat la adresa
0000H iar vectorul de intrerupere la adresa 0004H. Memoria stiva de 8 nivele
este implementata pe o zona speciala de memorie cu 8 locatii interconectate
pentru a realiza functia LIFO(Last In First Out) necesara memoriei stiva.
Memoria de date este de tip SRAM, organizata pe cuvinte de 8 biti si
formata din doua bancuri. Fiecare banc contine in primele 32 de locatii(adresele
de la 00H la 1FH, respectiv 80H la 9FH) registre cu functii speciale(Special
Function Register) iar pe urmatoarele 64 locatii sunt realizate registrele de uz
general(aceleasi in ambele bancuri) de la adresa 20H la 5HF
Selectarea bancului de lucru se face cu ajutorul bitului 5 din registrul de
stare(STATUS,5) notat cu RP0, avand urmatoarea semnificatie:
RP0 = 0 Bancul 0 este selectat
RP0 = 1 Bancul 1 este selectat
Registrele cu functii speciale sunt foosite de CPU respectiv de circuitiele de
intrare-iesire(periferice) pentru a selecta anumite optiuni si a asigura in felul
acesta buna functionare a microcontrolerului. Registrele cu functii speciale pot fi
impartite in doua categorii:

Registre cu functii speciale de baza, in care intra registrele STATUS


register, Option register, Interrupt Control register, peripheral interrupt register,
power control register, oscilator calibration register si registre cu functii speciale
pentru circuitele de intrare-iesire.

PICkit 1 FLASH Starter Kit este un sistem de dezvoltare proiectat


pentru programarea microcontrollerelor PIC de 8/14 pini si pentru
rularea/verificarea programelor de aplicatii.
In figura de mai jos este prezentata o vedere de sus a PICkit 1 FLASH
Starter Kit.

6
In PICkit 1 FLASH Starter Kit sunt incluse urmatoarele blocuri componente:
- Un soclu de evaluare(Evaluation Socket) pentru PIC 12F675(capsula
miniDIP de 8 pini) si pentru PIC 16F630/676(Capsula DIP de 14 pini)
- Bloc hardware pentru programarea microcontrollerelor din soclu cu
procedura ICSP (In-Circuit-Serial-Programming);
- Matrice de 8 LED-uri pentru afisarea unor variabile de iesire, matrice
comandata de 4 pini ai portului general de intrare-iesire;
- Doua LED-uri de semnalizare: un LED rosu pentru semnalizarea prezentei
alimentarii pe placa, un LED galben pentru semnalizarea faptului ca o operatie de
programare, verificare sau citire este in curs de desfasurare;
- Un microswitch SW1, cablat pe intrarea GP3 (RA3), utilizat ca intrare de
date logice pentru o serie de aplicatii;
- Un potentiometru semireglabil RP1, cablat pe GP0 (RA0), utilizat pentru
reglarea unui semnal analogic de intrare, in cazul utilizarii convertorului A/D;
- Accesorii de intrare-iesire: mufa pentru cablu USB, conector J1, necesar
pentru cuplarea la calculatorul gazda, conector J3 pentru acces din exterior la
pinii microcontrollerului.
In afara acestor componente existente, placa are si o arie de extindre pe care
pot fi implementate: un alt tip de microcontroller in capsula DIP de 14 pini, o
sursa de tensiune continua integrata (circuitul LM7805 sau unul echivalent) si un
conector DB9 cu circuit de interfata serial tip RS 232.

Blocul de programare

Schema blocului de programare a PIC-ului din soclul de evaluare,


prezentata in figura este realizata cu microcontrollerul PIC 16C745 in care este
implementat un program propriu de gestionare a resurselor hardware ale
sistemului.

7
Rolul componentelor din aceasta schema este:
 Obtinerea unei tensiuni de 13V necesara pentru programare (circuitul
format din L1, C, Q2, si D13) si comutarea ei ON/OFF la intrarea GP3 – V pp
doar in timpul desfasurarii operatiei de programare (folosind tranzistoarele
Q3 si Q4).
 Generarea de tact, pe GP1, si date, pe GP0, pentru transferul fisierului
direct executabil al aplicatiei in timpul operatiei de programare.
 Comutarea ON/OFF a tensiunii de alimentare VDD (cu trenzistorul Q1)
pentru a asigura resetarea microcontrollerului din soclu.

Matricea de LED-uri
PICkit 1 FLASH Starer Kit are prevazuta o matrice de afisare de 12 LED-
uri, dar sunt implementate efectiv doar 8 dintre acestea. Toate cele 12 LED-uri
sunt comandate de 4 pini ai portului de intrare-iesire GPIO (GP1, GP2, GP4,
GP5).
Aprinderea lor se face cu semnalul logic 1 (in anod si simultan semnalul
logic 0) pe catod. Stingerea lor se face punand pinii afereni in stare de
impedanta mare.
Asa cum rezulta din figura de mai jos, schema nu permite comanda
aprinderii simultane a doua LED-uri, cu alte cuvinte, la un moment dat, nu poate
fi aprins decat un singur LED.

8
CAPITOLUL II : SIMULARE ORCAD

II.1 Etapa pregatitoare

Se doreste implementarea automatului cu porti NAND cu 2 intrari si cu


inversoare. Pentru aceasta am folosit ecuatiile DeMorgan pentru a modifica
ecuatiile de stare date initial pentru proiectare:

Formulele De-Morgan a + b + c +... = a * b * c * ...

a * b * c *... = a + b + c +...

iar ecuatiile mele de stare sunt :

D0= IN;
D1= Q0*IN => Prin negarea de 2 ori a acestei ecuatii obtin portile NAND

=> D1 = Q0*IN

Pentru iesiri se aplica de asemenea formulele De-Morgan:

OUT= Q1* IN => Prin negarea de 2 ori a acestei ecuatii obtin portile NAND

=>
OUT= Q1* IN;

9
II.2 Etapa de simulare

Urmarindu-se ecuatiile obtinute mai sus se proiecteaza circuitul in mediul Orcad:

10
Setarile pe care le-am facut pentru definirea stimulilor:

11
Mai jos se pot observa formele de unda rezultate in urma simularii :

12
CAPITOLUL III: IMPLEMENTAREA PE KIT

III.1 Organigrama programului

START

Setari,configurare microcontroller
Definiri ale variabilelor de program

INITIALIZE

Stingerea LED-urilor aprinse


Initializarea registrelor utilizate
Configurarea GP0,GP1,…,GP5 ca I/O digitale

STATE_MACHINE

Subrutina BUTTON_PRESS

Incarcarea registrului PCL cu


adresa starii curente

STATE0 STATE1 STATE2 STATE3

Citire intrari Citire intrari Citire intrari C_LED


D6_ON
(OK)
NU DA NU DA ->Stare0
NU DA
in in
in
=1 =1
=0
State2 State3 State0
State0 State1 State1

13
Subrutina
BUTTON_PRESS

DEBOUNCE_2 NU DEBOUNCE_1
DA
STATE_DEBOUNCE=0

NU GP3=1 DA DA NU
GP3=
0

Resetare STATE_DEBOUNCE Incrementare STATE_DEBOUNCE

TEMP

Initializarea registrelor
COUNTH si COUNTL

DA NU
TEMP=10ms

NU DA
STATE_DEBOUNCE=0

RETURN

14
III.2 Definirea variabilelor de program
-cu ajutorul directivei CBLOCK se defineste registrul COD_STARE in care este
memorat numarul starii curente
-se definesc variabilele de program pentru comanda ledului D6
-se definesc registrii folositi pentru temporizare si alti registrii folositi in program

III.3 Initializare
-Sunt stinse ledurile aprinse si sunt initializate registrele utilizate.
-se dezactiveaza convertorul A/D
-se dezactiveaza comparatorul
-se reseteaza registrul COD_STARE

III.4 Configurarea porturilor


Intrarea IN este un microswitch extern care se va lega la GP5. Iesirea OUT este
setata pe Ledul D6, aprinderea lui reprezinta recunoasterea bitilor 010.

III.5. Explicitarea automatului


State 0-initializare

-sunt stinse toate ledurile aprinse si sunt initializate registrele utilizate


-citeste Intrarea IN(GP5) -daca valoarea lui este 0, STATE_COUNTER este setat
pe State1
-daca valoarea lui este 1, STATE_COUNTER este
setat pe State0

State1

-citeste Intrarea IN(GP5) -daca valoarea lui este 0, STATE_COUNTER este setat
pe State1
-daca valoarea lui este 1, STATE_COUNTER este
setat pe State2

State2

-citeste Intrarea IN(GP5) - daca este 0, STATE_COUNTER este setat pe State3


- daca este 1, STATE_COUNTER este setat pe
State0
State3 – OK

-aprinde Ledul D6.

15
III.6. Codul sursa
list p=12f675 ;directiva de definire a procesorului
#include <p12f675.inc>
errorlevel -302 ;elimina mesajul de tip 302 din fisierul list

__CONFIG
_CP_OFF&_CPD_OFF&_BODEN_OFF&_MCLRE_OFF&_WDT_OFF&_PWRTE_ON&_
INTRC_OSC_NOCLKOUT

cblock 0x20
STATE_COUNTER
STATE_DEBOUNCE
CountA
CountH
CountL
FLAGS
endc

#define TRIS_D6_ON B'00111001' ;definirea variabilei TRIS_D6_ON in binar


#define TRIS_D6_OFF B'11111111'
#define D6_ON B'00000100' ;atribuirea valorii binare
#define BANK1 banksel 0x80 ;Selecteaza BANK1 si BANK2
#define BANK0 banksel 0x00
org 0x000
nop

goto Initialize
org 0x004

Timer1Interrupt
movlw 0xB1
movfw TMR1H
movlw 0xE1
movfw TMR1L
btfss FLAGS, 6
goto LEDON
bcf FLAGS, 6
bsf STATUS, RP0
movlw TRIS_D6_OFF
movwf TRISIO
bcf STATUS, RP0
movwf GPIO
goto RET_I

16
LEDON
bsf FLAGS, 6
bsf STATUS, RP0
movlw TRIS_D6_ON
movwf TRISIO
bcf STATUS, RP0
movlw D6_ON
movwf GPIO

RET_I
bcf STATUS, RP0
bcf PIR1, TMR1IF
retfie

Initialize
call 0x3FF ;restabilirea factorului de calibrare
bsf STATUS, RP0 ;selectare BANK1
movwf OSCCAL ;incarcarea registrului OSCAL cu valoarea factorului de
calibrare
movlw 0x7f
movwf OPTION_REG ;validare weak pull-up general
bsf INTCON,PEIE ;Activare intreruperi generate de periferice
bcf INTCON,T0IF ;Resetare flag de intreruperi
bsf INTCON,GIE ;Activare intreruperi generale
movlw B'00111111'
movwf TRISIO
movwf WPU
clrf ANSEL
clrf VRCON

bcf STATUS, RP0


clrf GPIO
movlw B'00000111'
movwf CMCON
clrf STATE_COUNTER
clrf STATE_DEBOUNCE
clrf CountA
clrf CountH
clrf CountL

STATE_MACHINE
call Button_Press ; apelarea subrutinei Button_Press
movf STATE_COUNTER, w

17
andlw B'00000011' ;mascarea ultimilor 2 biti din STATE_COUNTER
addwf PCL, f
goto State0 ; apelarea rutinei State0
goto State1 ; apelarea rutinei State1
goto State2 ; apelarea rutinei State2
goto State3 ; apelarea rutinei State3

State0
bcf STATUS, RP0 ; se trece in bancul 0 de memorie
btfsc GPIO, 5 ; se verifica bitul de intrare de la GP5
goto STATE_MACHINE ; daca e 1, ramane in starea 0
incf STATE_COUNTER, f ; daca e 0, se incrementeaza contorul
de program
goto STATE_MACHINE ; si se trece in starea 1

State1
bcf STATUS, RP0 ; se trece in bancul 0 de memorie
btfss GPIO, 5 ; se verifica bitul de intrare de la GP5
goto STATE_MACHINE ; daca e 0, ramane in starea 1
incf STATE_COUNTER, f ; daca e 1, se incrementeaza contorul
de program
goto STATE_MACHINE ; si se trece in starea 2

State2
bcf STATUS, RP0 ; se trece in bancul 0 de memorie
btfss GPIO, 5 ; se verifica bitul de intrare de la GP5
goto State20 ; daca e 0, apeleaza subrutina State20
clrf STATE_COUNTER ; daca e 1, se incrementeaza
contorul de program
goto STATE_MACHINE ; si se trece in starea 0

State20
clrf STATE_COUNTER ; se decrementeaza contorul de program pentru a
se trece in starea 1

goto State3
;goto STATE_MACHINE

State3
;goto Timer20ms ; se apeleaza subrutina

Timer20ms pentru aprinderea Ledului D6


BANK0
movlw 0xB1

18
movwf TMR1H
movlw 0xE1
movwf TMR1L
movlw b'10000001'
movwf T1CON
clrf STATE_COUNTER
goto STATE_MACHINE

Button_Press
btfss STATE_DEBOUNCE, 0
goto Debounce_1
goto Debounce_2

Debounce_1
bcf STATUS, RP0
btfsc GPIO, 3 ;SW apasat?
goto Debounce_1 ;Nu, salt la Debounce_1
incf STATE_DEBOUNCE, f ;Da, decrementeaa STATE_DEBOUNCE

Temp
movlw 0x01 ;initializarea registrelor folosite dupa temporizare
movwf CountH
M1
movlw 0x03
movwf CountL
M2
decfsz CountL, f ;se decrementeaza CountL
goto M2
decfsz CountH, f ;se decrementeaza CountH
goto M1
btfss STATE_DEBOUNCE, 0
goto Button_Press
retlw 0

Debounce_2
bcf STATUS, RP0
btfss GPIO, 3 ;SW neapasat?
goto Debounce_2 ;Nu, salt la Debounce_2
clrf STATE_DEBOUNCE ;Da, reseteaza registrul STATE_DEBOUNCE
goto Temp

; Realizarea Timer-ului cu perioada de 40 ms (25 Hz), cu semiperioada de 20 ms


; (20000 microsecunde): FFFFH + 1 - 04E20H = 0B1E1H

19
Timer20ms
movlw 0xB1
movfw TMR1H ;se reinitializeaza TMR1H
movlw 0xE1
movfw TMR1L ;se reinitializeaza TMR1L
movlw B'10000001'
movwf T1CON

END

CAPITOLUL IV: Concluzii si observatii


personale
Pentru prima parte a acestui proiect, faza de descriere si simulare a
automatului, am folosit programul Orcad Family Release 9.2 Lite Edition.
Pentru a doua parte a acestui proiect, cea de implementare a automatului in
limbajul de programare assembler, am folosit mediul integrat de programare
MPLAB si kit-ul cu programul de interfata PICkit 1 FLASH Starter Kit.
Acest lucru m-a ajutat sa invat sa folosesc programul de simulare
Orcad,cat si sa programez microcontrolerul cu ajutorul Mplab-ului si m-a ajutat
sa inteleg mai bine functionarea lui PIC 12f675.
Acest PIC este o alegere buna pentru acest gen de aplicatii simple datorita
faptului ca firma MICROCHIP comercializeaza un sistem de dezvoltare PICkit 1
FLASH Starter Kit impreuna cu mediul de programare MPLAB la un pret accesibil
studentilor, sistem pe care acestia isi pot dezvolta primele aplicatii.

Bibliografie:
“Aplicatii hardware si software cu microcontrolerul PIC 12F675”
Autori: Elisabeta Buzoianu , Istvan Sztoianov, Sever Pasca
Editura Cavallioti, Bucuresti 2008

20

You might also like