Documente Academic
Documente Profesional
Documente Cultură
DE GARAJ
CUPRINS
si
implementarea
automatului
finit
INTRODUCERE
De cele mai multe ori ,solicitarea pentru realizarea unui automat finit
vine din partea unui client care nu are cunostintele de specialitate necesare,
si, in consecinta, va formula problema doar din punctul sau de vedere , ca de
exemplu: Doresc un sistem de activare a usii garajului printr-o telecomanda.
Din formularea sumara a clientului, inginerul proiectant trebuie sa
completeze descrierea automatului astfel ca specificatiile lui sa acopere
DIAGRAME DE STARE
Se elaboreaza pentru inceput diagram starilo cu denumiri simbolice. Ne propunem sa
realizam aplicatia intr-o variant de automat de tip Moore,si dupa o codificare convenabila a
starilor, rezulta diagram starilor codificate prezentate mai jos.
7404
U 17A
2
7400
D S TM 1
S 1
U 31A
Q
C LK Q
5
6
C LR
7474
1
PR E
STIM
;
;
;
;
;
;
;
;
CPD_OFF -Data Code Protection
;Adresele acestor biti se gasesc n fisierul Pic12F675.inc
; Definirea unor registre specifice aplicatiei cu directiva CBLOCK
cblock
0x20
STATE_COUNTER
;Registru de numarare a starilor automatului
STATE_DEBOUNCE
;Registru
de
numarare
a
starilor
debounce
CountH
CountL
; CountH si CountL sunt registre utilizate n
subrutina DEBOUNCE
endc
; Definirea variabilelor de program pentru comanda LED-urilor D6 si D7 cu
directiva DEFINE
#define TRIS_D6_D7
B'00011011'
;Definirea variabilei TRIS_D6_D7
prin valoarea ei binara
#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 celor de uz general
org 0x005
; Adresa de Start a memoriei program
Initialize
;call 0x3FF
; Restabilirea factorului de calibrare - instructiune
comentariu necesara n cazul ;utilizarii simulatorului.
bsf STATUS,RP0
; selectare Bank 1
movwf
OSCCAL
; ncarcarea registrului OSCCAL cu valoarea
factorului de
; calibrare
movlw
0x7f
movwf
OPTION_REG
; Validare Weak pull-up general
movlw
B'00111111'
movwf
TRISIO
; Configurarea pinilor I/O ca intrari
movwf
WPU
clrf ANSEL
;
Dezactivare
convertor
A/D
setare
intrari/iesiri digitale
bcf STATUS,RP0
; Selectare Bank 0
clrf GPIO
movlw
B'00000111'
movwf
CMCON
; Dezactivare comparator - setare intrari /
iesiri digitale
clrf STATE_COUNTER ; Resetare registru numarator de stare
clrf STATE_DEBOUNCE
clrf CountH
clrf
CountL
btfss
Inputa1=1
goto
incf
goto
GPIO,4
State_Machine
STATE_COUNTER,f
State_Machine
;Seteaza State2
State2
; Stinge LED-uri si executa citire Inputa1. Seteaza trecerea la starea
urmatoare (State1) daca ;Inputa1=1, sau ramne n State0 daca este 0
bsf STATUS, RP0
; Selectare Bank 1
movlw
TRIS_D6_D7
movwf TRISIO
; ncarca valoarea binara definita pentru TRIS_D6_D7
n TRISIO
bcf STATUS, RP0
; Selectare Bank 0
movlw
D6_ON
movwf
GPIO
; ncarca valoarea definita pentru
D6_ON n GPIO
bsf STATUS,RP0
movlw
b'00111111'
movwf
TRISIO
bcf STATUS,RP0
btfss GPIO,0
; citeste Inputa1 si sare instructiunea urmatoare daca
Inputa1=1
goto State_Machine
incf STATE_COUNTER,f
;Seteaza State3
goto State_Machine
State3
; Stinge LED-uri si executa citire Inputa1. Seteaza trecerea la starea
urmatoare (State1) daca ;Inputa1=1, sau ramne n State0 daca este 0
bsf STATUS,RP0
movlw
b'00111111'
movwf
TRISIO
bcf STATUS,RP0
btfss GPIO,5
; citeste Inputa1 si sare instructiunea urmatoare daca
Inputa1=1
goto State_Machine
clrf STATE_COUNTER
goto State_Machine
; Button_Press: testeaza starea microswitch-ului (SW), executa temporizarea
de 10ms la ;schimbarea starii si ntoarce n programul principal la sesizarea
starii de apasare a lui.
Button_Press
btfss STATE_DEBOUNCE,0
goto Debounce_1
goto Debounce_2
Debounce_1
bcf
STATUS,RP0
btfsc GPIO,3
goto Debounce_1
incf STATE_DEBOUNCE, f
; SW este apasat?
; Nu, salt la Debounce_1
; Da, incrementeaza STATE_DEBOUNCE
Temp
movlw
0x21
;ncepe initializarea registrelor folosite
pentru temporizare.
movwf
CountH
;Se ncarca reg. CountH cu
const.33D
M1
movlw
0x63
movwf
CountL
;Se ncarca reg. CountL cu
const. 99D
M2
decfsz
CountL,f
; Se executa decrementarea registrului CountL.
Cnd continutul
;acestuia ajunge 00H, se sare instructiunea urmatoare
("goto M2")
goto M2
;Daca continutul lui CountL este diferit de 0, se executa
salt la M2
decfsz
CountH,f
;Decrementare CountH pna cnd continutul
acestui registru este 00H
; situatie n care se sare instructiunea urmatoare ("goto
M1")
goto M1
;Temporizarea
obtinuta cu aceasta secventa de program este:
; Temp = 2 + 33*(5+3*99) usec
btfss STATE_DEBOUNCE,0
goto Button_Press
retlw 0
;ntoarce n programul principal cu continutul
acumulatorului egal 0
Debounce_2
bcf STATUS,RP0
btfss GPIO,3
; SW este relaxat
goto Debounce_2
; Nu, salt la Debounce_2
clrf STATE_DEBOUNCE
;Da, reseteaza registrul
STATE_DEBOUNCE
goto Temp
end
; directiva 'end' a programului
In urma deschiderii programului MPLAB liniile de cod se salveaza intrun nou director cu extensia .asm. Se deschide Project Wizard, se urmaresc
pasii, iar dupa executarea acestora se alege Build All. In urma acestei
optiuni, programul compileaza liniile de cod si afiseaza BUILD SUCCEEDED.
Din meniul Debugger se alege functia Stimulus in care se introduc:
GP3, GP0 pentru intrarea f, GP4 pentru intrarea o si GP5 pentru intrarea z.
GP3 va fi intotdeauna setat Toggle in timp ce GP0, GP4, GP5 vor fi setate, in
functie de necesitate, High sau Low.