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.
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
2 pav. Laiko ir ciklo skaičiavimo langas