E N D
Na čo slúži časová slučka? Časová slučka slúži na vytvorenie takého miesta v programe, pri ktorom sa používateľovi javí, že mikropočítač nerobí nič. Program však v mikropočítači beží stále a preto nemôžme jednoducho zastaviť jeho beh, ale v určitom mieste program „zacyklíme“ na požadovaný čas.
Vieme si presne zvoliť čas, počas ktorého sa bude vykonávať časová slučka? • Áno vieme. • Zo špecifikačného materiálu k procesoru od výrobcu je zrejmé, že jeden strojový cyklus (SC) trvá 12 hodinových cyklov. • Na skúšobnej doske máme pripojený k mikropočítaču 12MHz kryštál.
Vieme si presne zvoliť čas, počas ktorého sa bude vykonávať časová slučka? • Jeden hodinový cyklus trvá 1 / 12 000 000 sekundy teda 1 SC (ktorý trvá 12 hodinových cyklov) trvá 12 * 1 / 12 000 000 = 1 / 1 000 000 = 1 s. • Väčšina inštrukcií trvá 1 SC teda 1s, niektoré trvajú 2 SC teda 2s a niektoré dokonca 4 SC = 4s. Z použitých inštrukcií teda môžeme ľahko vypočítať operáciami plus a krát dĺžku trvania časovej slučky.
Krátka prestávka • Vypočítajte, ako dlho bude trvať program, zložený z 50 inštrukcií v dĺžke trvania 1 SC, 40 inštrukcií v dĺžke trvania 2 SC a 10 inštrukcií v dĺžke trvania 4 SC. Výsledok vyjadrite v milisekundách. Riešenie: (50 x 1s) + (40 x 2s) + (10 x 4s) = 50s+80s+40s = 170s = 0,17ms
Ako asi vyzerá naprogramovaná časová slučka? • Program časovej slučky sa veľmi podobá cyklu v JSI – jazyku symbolických inštrukcií (hovoríme mu tiež ASSEMBLER, aj keď tento výraz nie je veľmi správny nakoľko tento názov patrí prekladaču). • Štruktúru cyklu si popíšeme na ďalšom slajde.
Štruktúra cyklu v JSI • Nastavíme si počítadlo na takú hodnotu, koľko krát chceme, aby sa cyklus opakoval. Ako počítadlo využijeme jeden z registrov R0 – R7. • Určíme si návestie (ľubovoľné slovo), ktoré bude symbolizovať začiatok tela cyklu. • Samotné telo cyklu budú tvoriť inštrukcie, ktoré chceme opakovane vykonávať. • Na konci tela cyklu upravíme počítadlo (znížením jeho hodnoty o jednotku) a skočíme na začiatok tela cyklu ak sme ešte nespravili potrebný počet opakovaní ( po požadovanom počte opakovaní bude logicky v počítadle hodnota 0)
Praktická ukážka cyklu v JSI • MOV R0,#255 (1s) • telo_cyklu: (0s) • RR A (1s)RR A (1s) NOP (1s) • DJNZ R0, telo_cyklu (2s) Jednotlivé poradové čísla krokov zodpovedajú jednotlivým častiam štruktúry z predchádzajúceho slajdu.
Ako dlho bude takýto cyklus trvať? • Celý cyklus bude trvať 1 + (1+1+1+2)*255 = 1276s = 1,276 ms . • Problém je ale v tom, že celý cyklus trvá len tak krátko a my väčšinou potrebujeme aby trval aspoň takú dobu, aby sme boli schopní zachytiť zmenu na nejakom výstupe. • Ďalší problém je v tom že do registrov R0 – R7 môžeme vložiť max. hodnotu 255
Ako to vyriešiť? • Múdri programátori a programátorky si preto lámali hlavy nad riešením tohto problému až si jeden z nich buchol po hlave a zvolal: „Mám to. Šak my možeme dac tote cykly do sebe a tak to budze najľepšejši.“ • A ako povedali tak aj spravili. Dali pár cyklov do seba a na svete bola časová slučka, ktorá nerobila nič, len sa sama cyklila niekoľko milisekúnd, sekúnd ba aj minút.
Ako postupovali? • Naši programátori a programátorky postupovali asi takto: 1. napísali jeden najsamjednoduchší cyklus nasledovne a mali zdržanie 255*2s = 510s 0,5 ms
Čo potom? 2. zobrali druhy cyklus a „obalili“ nim prvý cyklus, takže vlastne prvý cyklus bol telom toho druhého mali zdržanie 0,5ms (z prvého cyklu) * 255 = 127,5 ms a k tomu ešte prirátali 0,5 ms ktoré vznikli pri DJNZ R1,c2 z druhého cyklu čiže dokopy 128 ms = 0,128 s.
Čo na to programátori? I povedali si, že by sa zišlo ešte aspoň toľko pozdržať beh programu aby z toho bola jedna sekunda. Zobrali ukrajinskú kalkulačku a opýtali sa jej: „Kalkulačka, kalkulačka povedz že nám koľko krát musíme vynásobiť 0,128 aby sme aspoň 1 dostali?“ A kalkulačka na nich vychrlila číslo 8. Tak zobrali to čo už spravili a rozhodli sa to ešte celé spraviť 8x a vyšlo im to, čo uvidíte na ďalšom slajde.
Odstránenie štvorcov • I pozrel sa jeden z nich na tie štvorce a povedal: „Hej chlapi šak odstráňme tote štvorce lebo dobré je to na pochopenie, ale vyzerá to veru veľmo škarede.“ A tak naši programátori odstránili tie divné štvorce a napísali všetky inštrukcie pod seba pekne a prehľadne. A takto vyzeral ich výsledný produkt: MOV R2,#8 c3: MOV R1,#255 c2: MOV R0,#255 c1: DJNZ R0,c1 DJNZ R1,c2 DJNZ R2,c3
O Janovi a podprograme Povedali si, že to už vyzerá dobre, ale zrazu jeden vstal i riekol: „Kua chuapi ale šak to nemóžeme takto furt písať dookola totú slučku časovú. Šak to by sme sa enem dačo napísali aj by sme pamäte veľa použili. Tóž navrhujem aby sme z tého podprogram nejak spravili a potom na to zavolali, že: „Hej ty podprogram časovej slučky, poďže nám pomócť a postoj troška v programe!“, a on príde a postojí. Hlasujme chuapi ale všetci ZA lebo vám jednu pribijem ako že sa Jano volám.“ Takže chlapi hlasovali za, lebo Jano bol väzba a všetci sa ho báli. Už vtedy niektorí z nich mysleli do budúcnosti a tak nazvali inštrukciu volania podprogramu CALL a inštrukciu návratu z podprogramu nazvali RET.
Čo bolo na podpivníku ... V tom Jano vstal a ukázal všetkým podpivník, aby sa len pozreli ako to bude vyzerať a tam bolo napísané toto: MOV P1,#01010101b ; tož akože LEDky na porte striedavo svietia CALL slucka ; tož akože slučku volám MOV P1,#00110011b ; tož akože LEDky na porte po dve svietia a dve nesvietia CALL slucka ; tož akože zasa slučku volám MOV P1,#00001111b ; tož akože polovica LEDiek svieti a druhá nie slucka: MOV R2,#8 c3: MOV R1,#255 c2: MOV R0,#255 c1: DJNZ R0,c1 DJNZ R1,c2 DJNZ R2,c3 RET
Koniec A chlapi tlieskali a prišiel kráľ a ponúkal mu pol kráľovstva i svoju dcéru za ženu za to čo vymyslel, ale i preto lebo sa ho bál, lebo Jano, ako sme už písali, bol väzba.