Choď na obsah Choď na menu
 

PIC8

Škola programování PIC 8

Zpoždění - delay.

Snad nejčastějšími rutinami používanými u procesorů jsou čekací smyčky. Procesor totiž běží většinou na 4MHz což je poměrně dost a často je potřeba ho chvíli zdržet. Klasickým použitím může být například odstranění zákmitů na tlačítkách, nebo i jen tvorba určitého kmitočtu či časové prodlevy. Problém je ale v tom, že procesor nezná žádné příkazy typu delay() a podobně, běží stále dál a dál. Jediný příkaz na zdržení je NOP, ten však čeká jen jeden instrukční cyklus což při 4MHz oscilátoru je 1us a při potřebě čekání 1s by jich bylo potřeba jeden milión!

U procesorů se tedy dělají již zmíněné čekací smyčky. To je část programu, kterou procesor běží několikrát za sebou a tím se zdrží:)
Konkrétně se to dělá tak, že do jednoho nebo více registrů se vloží určité číslo, od kterého se pak při každém průběhu smyčkou odečte jednička. Lze to však samozřejmě udělat i opačně, že se registr vynuluje a postupně se přičítá.

Tady je první příklad:

Nejedná se samozřejmě o celý program, ale jen o uvedenou rutinu.
Takže co program dělá:
Nejprve zhasne LED, poté vymaže registr s názvem CISLO. Pak k tomuto registru postupně přičítá jedničku a čeká na jeho naplnění, kdy znovu rozsvítí LED.

INCFSZ CISLO,1 - tento příkaz funguje tak, že přičte jedničku k registru CISLO a novou hodnotu uloží zpět do tohoto registru (to ta jednička na konci, při nule zůstane výsledek jen v pracovním registru a CISLO se nezmění). Pokud se nic neděje, pokračuje procesor na následujícím řádku příkazem GOTO. Pokud se však již registr CISLO naplnil a přetekl (256), přeskočí se následující příkaz a skočí se až na ten v pořadí druhý. V našem případě tedy až na BSF LED.

Při počítání zpoždění vynecháme vše před a vše za a vezmeme pouze dva hlavní řádky: řádek s INCFSZ zabere jeden strojový cyklus a řádek s GOTO zabere dva = 3 strojový cykly * maximální velikost registru 255 = zpoždění 765 strojových cyklů.
To není mnoho, při 4MHz krystalu je to 765us.

Nic však nebrání použití dvou registrů, kdy od jednoho budeme stále odečítat (přičítat) jedničku a až přeteče, přičteme jedničku k tomu druhému. A zase budeme počítat s tím prvním:

Takhle jsme dosáhli zpoždění zhruba 196000 strojových cyklů.
Pokud by jste chtěli ještě víc, můžete přidat ještě další registry na počítání.

Jako třetí příklad tedy uvedu již celý program na zpoždění zhruba 1s. Zapojení bude stejné jako v minulém díle Školy PIC a LED zde bude blikat zhruba v 1s intervalech (1s zapnuta, 1s vypnuta).
Čítačem jsem měřil periodu blikání je 2 , 072 606 s.

Zde je ke stažení:

ASM
HEX

Uvedené rutiny lze použít i pro odstranění zákmitů tlačítek. V tom případě však je potřeba ještě u záložky ZPET příkaz na přičítání posunout o řádek níž a zde testovat zda je ještě tlačítko sepnuto. Pokud ano, vrátí se procesor zpět a tak čeká až na definitivní puštění tlačítka, po kterém jeste uvedenou dobu čeká zda se nejedná jen o zákmit a nemá se tedy znovu vrátit a počítat znovu.

Uvedená rutina může vypadat třeba takto:

A vložená do Prvního programu je zde ke stažení:

ASM
HEX

Můžete si vyzkoušet, že na další stisk reaguje až po chvíli klidu.