proiect 2 andrei
TRANSCRIPT
-
8/6/2019 Proiect 2 Andrei
1/15
PROIECT 2
TEMA NR. 15
-
8/6/2019 Proiect 2 Andrei
2/15
DOBRE ALEXANDRU
TEMA NR. 15
Enun:
S se simuleze Pspice funcionarea unui automat finit care realizeaz funcia
de recunoatere a codului de trei biti 010, cu fereastr fix.
Diagrama strilor de funcionare:
Ecuaii de comand:
0
1 2
3 4
/0
1/0
/0
0/0
0/0
1/0
1/00/1
-
8/6/2019 Proiect 2 Andrei
3/15
Implementarea pe kitul C8051F320 DK
CERINTE:
Intrarea X este conectata la pinul P2.5, denumit in program InputX;
Citirea variabilei se face dupa apasarea switch-ului S3 (P2.1), denumit in
program BTN;
Afisarea starii de recunoastere a codului corect de intrare se va face cu
LED-ul D2 (P2.3), denumit LED2 in program, care va clipi cu o frecventa
de 19 Hz obtinuta cu Timer1
Contorul de stare este registrul R0 din bank-ul 2 de registre de uz general;
MODIFICARI SUPLIMENTARE:
Dupa fiecare apasare a switch-ului S3 se apeleaza subrutina Show_state
care foloseste LED-ul D1 (P2.2) pentru a afisa starea curenta prin clipirea
led-ului de un numar de ori egal cu numarul starii curente. Clipirea led-uluiD1 se face cu o frecventa de aproximativ 2 Hz obtinuta printr-o bucla de
intarziere.
DETALIEREA ORGANIGRAMEI FOLOSIND SECVENTE DE COD
1) Declaratii de definire a microcontrolerului, definirea intrarilor si iesirilor,vectori de reset si intrerupere, selectarea bank-ului de registre de uz
general
-
8/6/2019 Proiect 2 Andrei
4/15
cseg AT 0x001B ;vector de intrerupere pentru Timer 1 overflow
ljmp timer1IRR ;rutina de raspuns la intrerupere pentru Timer 1 overflow
codeSeg segment CODE ;definirea segmentul principal de cod
rseg codeSeg ;selectarea segmentului
using 2 ;selectarea bank-ului 2 de registre de uz general
main: acall init ;rutina principala de program: se apeleaza subrutina de initializare
-
8/6/2019 Proiect 2 Andrei
5/15
2) Subrutina de initializare (WDT,XBR,porturi,timer,stingerea LED-urilor)
init:
clr EA ;dezactivare globala a intreruperiloranl PCA0MD,#0xBF ;dezactivare WDT (Watchdog Timer) PCA0MD.6 = 0
mov XBR1,#0x40 ;activarea crossbar-ului XBR1.6 = 1
orl P2MDOUT,#0x0C ;pinii P2.2(LED1) P2.3(LED2) ca iesiri digitale modul push-pull
orl P2MDIN,#0x22 ;pinii P2.1(switch-ul S2) si P2.5(InputX) nu sunt intrari
analogice
orl CKCON,#0x00 ;pentru CKCON.3=0 clock-ul Timer-ului 1 este dat de bitii
CKCON.1 si CKCON.0 care
;atunci cand iau ambii valoarea 0 Timer-ul 1 functioneaza la frecventa
SYSCLK/12.
;clock-ul sistemului (SYSCLK) este implicit preluat de la oscilatorul
intern de 12Mhz care este
;idivizat cu 8. Deci Timer-ul 1 functioneaza la frecventa f=12MHZ/8/12
= 125KHz careia ii
;corespunde o perioada de 8s
orl TMOD,#0x10 ;TMOD .5=0 TMOD.4=1 -> Timer-ul 1 functioneaza in modul
16 bit counter/timer
mov TH1,#0xF3 ;pt. a obtine perioada frecventa de clipire de 19hz careia ii
corespunde o perioada T=52632us
mov TL1,#0x27 ;T/2=26316 s (jumatate de perioada LED2 sta stins si cealalta
jumatate e aprins)
;avand In vedere perioada Timer-ului 1 de 8 s este nevoie de
-
8/6/2019 Proiect 2 Andrei
6/15
ret ;revenire la instructiunea urmatoare apelarii subrutinei Init
3) Subrutina de prelucrare a raspunsului la apasarea switch-ului 3(DEBOUNCE)
mainLoop: ;bucla principala a programului
acall Debounce; ;apelarea subrutinei Debounce care asteapta apsarea si
relaxarea switch-ului S3
Aceasta subrutina se apeleaza la inceputul buclei principale a programului si
are rolul de a elimina problemele introduse de scurtele momente de oscilatie
produse din cauza contactului imperfect la apsarea sau relaxarea unui buton de
pe placa de dezvoltare. Aceste oscilatii dureaza aproximativ 15 ms si de aceea
citirea corecta nu se face la prima schimbare a valorii ci dupa o intarziere de cel
putin 15ms, obtinandu-se astfel un semnal dreptunghiular corespunzator apasariisi relaxarii butonului.
-
8/6/2019 Proiect 2 Andrei
7/15
Debounce: jb BTN,Raised ;daca BTN=1, butonul este relaxat si se sare la eticheta Raised altfel
se executa instr. urmatoare
jnb BTN,$ ;daca BTN=0 (apasat) se asteapta pana cand BTN=1 (relaxat) (se sare
la instructiunea curenta $)
sjmp Delay ;salt la bucla de intarziere Delay de durata aprox. 16ms
Raised: jb BTN,$ ;daca BTN=1(relaxat) se asteapta pana cand BTN=0
(apasat)
Delay: mov R2,#0x30 ;bucla de de intarziere de ((2*+4)*+2)*8/12M =
((2*256+4)*48+2)*8/12M=0.0165133s
Loop: mov R1,#0x00djnz R1,$
djnz R2,Loop
jnb BTN,Debounce ;daca switch-ul este apasat se reia subrutina Debounce
ret ;daca switch-ul a fost apasat si apoi relaxat se revine la instructiunea
imediat uramtoare apelarii
Debounc
e
BTN=
0 ?
BTN= BTN=Delay
DA
NU DADA
NU
-
8/6/2019 Proiect 2 Andrei
8/15
la inceputul careia se compara continutul registrului R0 cu numarul starii
respective. In caz de egalitate se executa instructiunile specifice starii, in caz
contrar se sare la urmatoarea eticheta si se face din nou comparatia.
-
8/6/2019 Proiect 2 Andrei
9/15
State0: cjne R0,#0x00,State1 ;daca R0=0 se executa instructiunea imediat
urmatoare, in caz contrar
se sare la Eticheta State1
(instructiuni specifice starii 0)
State1: cjne R0,#0x01,State2 ;daca R0=1 se executa instructiunea imediat
urmatoare, in caz contrar
;se sare la Eticheta State2
(instructiuni specifice starii 1)
State2: cjne R0,#0x02,State3 ;daca R0=2 se executa instructiunea imediat
urmatoare, in caz contrar;se sare la Eticheta State3
(instructiuni specifice starii 2)
State3: cjne R0,#0x03,State4 ;daca R0=3 se executa instructiunea imediat
urmatoare, in caz contrar
;se sare la Eticheta State4
(instructiuni specifice starii 3)
State4: cjne R0,#0x04,StateOK ;daca R0=4 se executa instructiunea imediat
urmatoare, in caz contrar
;se sare la Eticheta StateOK
(instructiuni specifice starii 4)
StateOK: (instructiuni specifice starii OK) ;fiind ultima stare posibila (R0=5) nu mai
este nevoie de comparatie
5) M d l d f i l l i b l i i l d
-
8/6/2019 Proiect 2 Andrei
10/15
diagramei de stari
sjmp show_state ;se sare la rutina de afisare a starii curente
State1: cjne R0,#0x01,State2 ;Daca suntem in starea 1 se executa instructiunea
urmatoare, daca nu se sare la starea 2
jnb InputX,$+7 ;daca InputX=1 se executa instr. urmatoare, daca nu se sare
peste urmatoarele 2 instructiuni
mov R0,#0x02 ;suntem in cazul InputX=1, se trece in starea 2 conform
diagramei de stari
sjmp show_state ;se sare la rutina de afisare a starii curente
mov R0,#0x04 ;suntem in cazul InputX=1, se trece in starea 4 conformdiagramei de stari
sjmp show_state ;se sare la rutina de afisare a starii curente
State2: cjne R0,#0x02,State3 ;Daca suntem in starea 2 se executa instructiunea
urmataore, daca nu se sare la starea 3
jnb InputX,$+7 ;starea 2 ;daca InputX=1 se executa instr. urmatoare , daca nu se sare
peste urmatoarele 2 instructiuni
mov R0,#0x00 ;x=1 ;suntem in cazul InputX=1, se trece in starea 0 conform diagramei de
stari
sjmp mainLoop ;se sare la inceputul buclei principale, nu este nevoie de
afisare (suntem in starea 0)
mov R0,#0x05 ;suntem in cazul InputX=0, se trece in starea OK si se incepe
clipirea LED-ului D2 cu f=19HZ
setb TR1 ;se porneste timer-ul 1 (Timer1 Run=1)
sjmp show_state ;se sare la rutina de afisare a starii curente
State3: cjne R0 #0x03 State4 ;Daca suntem in starea 3 se executa instructiunea
-
8/6/2019 Proiect 2 Andrei
11/15
6) Subrutina de raspuns la intreruperea generata de Timer1
Aceasta subrutina este apelata automat atunci cand valoarea din registrele
TH1 si TL1 depaseste valoarea FFFFh si trece in 0000h. Flagul TF1 este resetat
automat de hardware la intrarea in subrutina. TH1 si TL1 trebuie incarcate din
nou cu valorile specifice frecventei necesare.
timer1IRR:
mov TH1,#0xF3 ;se incarca valoarea necesara obtinereii frecventei de clipire de
19Hz in octetul superior
mov TL1,#0x27 ;TH1 si octetul inferior TL1 al timerului 1. Timerul incepe sa
numere de la aceasta valoare
;pana cand depaseste valoarea FFFFh moment in care se genereaza
intreruperea.
cpl LED2 ;LED2 ia valoarea complementului sau (0->1 1->0)
reti ;se iese din rutina de intrerupere si se reia executia normala a
programului
;din punctul in care se afla inainte de producerea intreruperii
;nu este nevoie sa resetam flagul de overflow TF1, acesta este resetat
automat
-
8/6/2019 Proiect 2 Andrei
12/15
7) Subrutina de afisare a starii curente folosind LED-ul D1
Subrutina Show_state foloseste o bucla de de intarziere pentru a clipi ledul D1
(LED1) de un numar de ori egal cu numarul starii curente aflat in registrul contorde stare R0. Durata intarzierii se poate calcula dupa formula:
(*(*(R5*2+4)+4)+2)*8/12M=(3*(256*(256*2+4)+4)+2)*8/12M=0.2
6420133 s
Show_state:
mov A,R0 ;se incarca in acumulator valoarea starii curente din registrul contor
de stare R0
rl A ;se rotesc la stanga bitii acumulatorului (inmultire cu 2)
mov R4,A ;se incarca valoarea din acumulator in registrul R4
;Loop2 se va executa de un numar de ori egal cu dublul numarului
starii curente
;LED1 se aprinde si se stinge cu factor de umplere 50% de un numar
de ori egal cu
;numarul corespunzator starii curente
Loop2: cpl LED1 ;se complementeaza valoarea pinului LED1
mov R3, #0x03 ;bucla exterioara se executa de 3 ori, mov 2 perioade
Loop1: mov R2, #0x00 ;bucla intermediara se executa de 256 ori, mov 2 perioade
Loop0: mov R1, #0x00 ;bucla interioara se executa de 256 ori mov 2 perioade
-
8/6/2019 Proiect 2 Andrei
13/15
Codul complet al programului:
$NOMOD51
$include (c8051f320.inc)
A equ P1.5
B equ P2.0
LED2 equ P2.3
SW3 equ P2.1
cseg AT 0x0000
ljmp main
cseg AT 0x001Bljmp timer1IRR
codeSeg segment CODE
rseg codeSeg
using 2
main: acall init
mainLoop: acall button_press
mov A,R3jz STATE0subb A, #0x01jz STATE1subb A, #0x01jz STATE2subb A, #0x01jz STATE3
STATE0:jnb A,testB0
mov R3,#0x01
sjmp mainLoop
testB0: jnb B,mainloop
mov R3,#0x03
sjmp mainloop
STATE3: setb TR1
sjmp mainloop
init: clr EA
mov WDTCN, #0xDE
mov WDTCN, #0xAD
mov SFRPAGE, #CONFIG_PAGEmov XBR1,#0x40
orl P1MDIN, #0x20; P1.5
orl P2MDIN, #0x03; P2.0&P2.1
and P2MDOUT, #0x04 ; P2.3
orl CKCON,#0x00
orl TMOD,#0x10
mov TH1,#0xF3mov TL1,#0x27
setb EA
setb ET1
clr LED2
mov R3,#0x00
ret
button_press: jb SW3,Raised
jnb SW3,$
sjmp Delay
Raised: jb SW3,$
-
8/6/2019 Proiect 2 Andrei
14/15
-
8/6/2019 Proiect 2 Andrei
15/15
START
Stingerea ledurilor aprinse D1 si
D2
4) Cautarea starii curenteconform cu continutul registrului
contor de stare R0 din bank-ul 2
X=
1?
X=
1?
X=
1?
3)Debounce
Citeste XCiteste X Citeste X
Starea
3Starea
1 Starea
4
Starea2
Starea
OK
Starea
0
Starea
0
Starea
1
Starea
2
Starea
3
Starea
4Starea OK
Starea
4
Starea
0
Starea
0
1) Declaratii de
definire amicrocontrolerului
DOBRE
ALEXANDRU
435B
TEMA NR 15
Arata starea curenta folosind
LED-ul D1
2)
Init
5)
7)