proiect 2 andrei

Upload: diana-alexandra-papancea

Post on 08-Apr-2018

243 views

Category:

Documents


0 download

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)