Vėlinimas  (0)

Programoje labai svarbus aspektas "laiko tempimas", ypač kai rašomą programą reikia suderinti su išoriniai įrenginiais, pavyzdžiui, programuojant periodiškai mirksinčią lemputę ar rašant šviesoforo valdymo programą.


Prisijunk prie technologijos.lt komandos!

Laisvas grafikas, uždarbis, daug įdomių veiklų. Patirtis nebūtina, reikia tik entuziazmo.

Sudomino? Užpildyk šią anketą!

Vėlinimas programavime yra labai svarbus. Jis reikalingas kai reikia sudaryti tam tikrus laiko tarpus tarp vykdomų komandų. Tarkim programuojame kad mirksėtų lemputė tam tikru dažniu (kad mirksėjimą būtų galima pamatyti plika akimi). MV PIC16F84A, prie kurio yra prijungtas 4MHz kvarcinis rezonatorius, vieno ciklo atlikimo laikas yra 1µS. Norint matyti mirksinčią lemputę, reikėtų daryti laiko tarpus tarp lemputės uždegimo bent 0.3 s. Taip pat analogiška situacija susidaro kitoje pritaikymo srityje - galima programuoti šviesoforą, kurio mirksėjimo periodas yra net dešimtys sekundžių.  

Vėlinimus galima atlikti keliais būdais: atliekant tuščias operacijas, sekant TMR0 persipildymą, naudojant pertraukimą ar sukuriant patiems skaitliuką ir stebint jo persipildymą.

Neilgam vėlinimui atlikti yra naudojama tuščia eigos komanda nop.

nop                  ;suvelina 1cikla = 1uS
nop
                  ;suvelina 1cikla = 1uS
...                    ...

 Kad nereiktų rašyti kelis kartus tą pačią komandą galima užsukti į ciklą pasinaudojant cikline while komanda (n - reikia apsibžti programos pradžioje):

n      set    0

Tada rašomas programos tekstas:

 while n<.5         	   ;skaicius 5 nurodo, kad ciklas bus prasuktas 5 kartus 
             nop                      ;tuscios eigos komanda 
             n=n+1                  ;skaitliuko didinimas 1
             endw                    ;while ciklo pabaiga  

Šis programos tekstas atitinka 50 kartų parašyta tuščios komandos komanda NOP.

Norint sumažinti tuščios komandos kiekį siekiant kuo efektyviau išnaudoti programos atmintį galima pasinaudoti  stebint skaitliuko TMR0 persipildymą. TMR0 skaitliukas skaičiuoja priklausomai nuo ciklų skaičiaus. Šiuo atveju reikia stebėti TMR0 skaitliuko persipildymą, kurį nurodo INTCON registro T0IF bitas. T0IF – pertraukties požymio (interrupt flag), įvykus laikmačio TMR0 perpildymui, bitas. Jei „1“ perpildymas įvyko, jei „0“ perpildymas neįvyko. Stebint T0IF bitą galima parašyti vėlinimo programą, naudojantis:

 wait          btfsc INTCON,T0IF         ;tikrinamas TMR0 persipildymas
                 goto wait                       ;TMR0 nepersipilde, griztam i wait

TMR0 skaitliuko skaičiavimo dažnį nustato OPTION_REG registro PS0, PS1, PS2. Šie bitai nustato atitinkamai dalijimo koeficientus (pateikti 1 paveikslėlyje) skaitliukui TMR0.

TMR0 dalinimo koeficientai 

1 pav. Dalijimo koeficientai skaitliukui TMR0

Pavyzdžiui: jeigu yra nustatytas yra nustatytas 0,0,0 (PS2, PS1, PS0) tai TMR0 skaitliukas skaičiuos kas 2 ciklus, jeigu 0,1,1 tai TMR0 skaitliukas skaičiuos kas 16 ciklų.

Šis nustatymas leidžią sudaryti ilgesnio laiko tarpo vėlinimą neišnaudojant programos atminties.

Dar galima panaudoti decfsz komanda vėlinimui atlikti. Ši komanda iš f ar w registro atima vienetą ir įrašo į pasirinktą registrą, jeigu atėmus vienetą rezultate gaunamas nulis tai yra praleidžiama komanda. Pavyzdžiui:

 atimti                                         ;nustatyta programos žymė
decfsz REG,f
               ;iš REG registro atimamas vienetas ir įrašomas į REG registrą
                                   ;jei rezultate gaunamas nulis peršoka komanda
goto atimti
                    ;jei rezultatas ne nulis pereina į žyme „atimti“
goto pabaiga                ; jei rezultatas nulis pereina į žyme „pabaiga“ 

Pavyzdys, kaip naudojantis decfsz komenda sudaryti vėlinimą:

             movlw .250                              ;irasomi duomenys
            movwf count1                          ;skaitliuko uzpildymas
zyme
    nop                                         ; velinamas vienas ciklas
            nop                                         ; velinamas vienas ciklas
            nop                                         ; velinamas vienas ciklas
            nop                                         ; velinamas vienas ciklas
            nop                                         ; velinamas vienas ciklas
            decfsz count1,f              ;skaitliuko mazinamas 1 ir jai 0 persoka
            goto zyme          

Vykdomos programos laikui ar ciklams skaičiuoti naudojamasi stopwatch darbo langu, kuris yra pavaizduotas 2 paveikslėlyje. Jį galima rasti: Debugger> stopwatch

Programos laiko skaitliukas

2 pav. Laiko ir ciklo skaičiavimo langas

Pasidalinkite su draugais
Aut. teisės: www.technologijos.lt
(0)
(0)
(0)

Komentarai (0)

Susijusios žymos: