Generování ASM souborů pro přesné čekací smyčky pro PIC.

Tento program vznikl z potřeby neustále psát různé přesné čekací smyčky pro PIC, hlavně pro aplikace, kde se počítá čas provádění instrukcí a je potřeba čas buď přesně doplnit o x cyklů nebo doplnit jednotlivé větve programu tak, aby průběhy jednotlivými větvemi trvaly stejně.

DOWNLOAD

Jak se to použije ?

Program stačí rozbalit ze zip souboru a spustit. Je určen pro Win32 (např. Win95/98). Do editačního okénka za slovo delay napište kolik cyklů má trvat půběh výsledným kódem. Pak stiskněte tlačítko podle své volby, tedy potřebujete-li udělat čekání maximálně do Vámi zadaného času, pak stiskněte jedno z tlačítek Delay <= Input. Pokud se Vám výsledek nelíbí, můžete zkusit druhé tlačítko. Je jasné, že ne každý čas je možné takto vygenerovat úplně přesně a tedy můžete vzít řešení s dobou provádění o něco kratší a doplnit jej připsáním instrukcí NOP pro prodloužení o jeden cyklus, nebo GOTO $+1 pro prodloužení o 2 cykly. Pokud požadujete raději delší dobu provádění stiskněte Delay >= Input. Okénka s řešením jsou 3. První pro jednosmyčkové řešení, druhé pro dvousmyčkové a třetí pro třísmyčkové. Program do okének vypíše hodnotu nejbližší Vašemu zadání schopnou vyřešit v programu předdefinovanými způsoby. Je jasné, že při pokusu např. vytvořit čekání 500000 cyklů tlačítkem Delay <= Input, bude mít jednosmyčkové řešení značnou odchylku, protože vypíše maximální možnou hodnotu, kterou lze v rámci tohoto kódu dosáhnout a pokud požadujete řešení Delay >= Input, pak vypíše že to prostě nelze v příslušném okénku.

Jak to vložit do svého kódu ?

To co se vygeneruje, jen zkopírujete do svého editoru kam potřebujete. V každém okénku s řešením je jako poznámka uvedeno, jak dlouho bude ono smyčkování trvat a také TMPx proměnné, které je potřeba nadefinovat do nějakých univerzálně použitelných registrů tak, aby se Vám nepřepisoval nějaký registr, který v programu používáte, ale to je myslím jasné.

Jaký postup nejlépe zvolit pro psaní kódu ?

Nastíním zde postup, jak to dělám, tedy jak jsem zvyklý. Prostě napíšu program bez přemýšlení nad tím, co kde kolik trvá a veškeré odskoky do různých větví řeším tak, aby bylo možné buď každou větev dorovnat na čas dopsáním kusu kódu pro čekání, nebo to tak udělám rovnou, když jde o krátkou a jasnou konstrukci. Potom si spočítám kde která větev kolik trvá a dorovnám všechny větve kódu tak, abych si všude udělal stejný čas. K tomu můžete právě použít generování kódu z tohoto programu, tedy když zjistíte že je potřeba doplnit třeba 5000 cyklů, zadáte tu hodnotu, naklepnete tlačítko a vezmete si vygenerovaný kód do svého kódu jako doplnění onoho času.

Jednoduchý příklad.

Budeme chtít udělat program pro blikání LED, která má přesně po půl sekundě nesvítit a svítit. V aplikaci použijeme interní oscilátor 4MHz, což pro PIC znamená 1 instrukční cyklus za 1us, pro skoky 2us. Jistě že lepší přesnosti dosáhneme použitím 4MHz krystalu, ale tím se nyní zabývat nebudeme. Tedy napíšeme si kostru programu a v ní bude po nastavení PICu hlavní smyčka programu ve které bude zhasnutí LED, rozsvícení LED a skok GOTO na zhasnutí LED. Teď ještě potřebujeme doplnit časy. Tedy po zhasnutí LED se musí LED rozsvítit za 500000 cyklů. 1 cyklus trvá zhasnutí, tedy po zhasnutí musíme ještě počkat 499999 cylů, takže si tu pauzu vygenerujeme a vložíme za zhasnutí LED. Vyjde nám to přesně tlačítkem Delay <= Input (v.1), takže nemusíme nic dalšího doplňovat. Teď ještě potřebujeme doplnit čas po rozsvícení LED. Dva cykly trvá GOTO na zhasnutí a jeden zhasnutí, takže doplníme 499997 cyklů. Ve třetím okénku nám to stejným tlačítkem jako předtím vyjde zase přesně, takže jen za rozsvícení LED vložíme onen kód ze třetího okénka a program je hotov a je i časování přesně, takže jsme vyrobili časovou základnu s kmitočtem 1Hz a střídou dokonale 1:1. Pro lepší představu uvádím i kód programu k nahlédnutí jako onehz.asm. Je mi jasné, že zkušený programátor napíše pro tuto úlohu kratším stylem, ale toto má být jasný příklad i pro začátečníky, takže jsem raději zvolil naprosto názorný příklad, kde není potřeba mít ještě v těchto věcech nadhled.

Oscilátory a generátory pulsů.

Myslím, že každý začátečník pochopil z příkladu, že je možné touto jednoduchou cestou vyrobit velice lehce oscilátor na nějaké frekvenci z jednochipu a pokud vezmeme v úvahu cenu okolo 50Kč (v dubnu 2002) v maloobchodě i s DPH za PIC12C508A, jistě to není ani finančně špatné nehledě na fakt, že lze jednoduše připsat i další funkce, např. přepínání frekvencí některým pinem. Pokud použijete zapojení s krystalem místo zapojení s interním oscilátorem, je možné si i zvolit vhodný kmitočet pro práci PIC a také bude i taktování krystalově přesné. Tedy tam kde se požaduje opravdu přesný kmitočet je nanejvýše vhodné použít krystal či krystalový oscilátor. Pokud potřebujete vyrábět různé průběhy (pulsy) na pinu nastaveném jako výstupním podle stavu vstupních pinů, jistě se Vám bude možnost si vygenerovat pauzy dle požadavku a tedy také správně dlouhé pulsy také líbit.

Čekací podprogramy a optimalizace programů.

Pokud budete čekací smyčku využívat v programu vícekráte, jistě je z hlediska použitého místa programové paměti lepší ji napsat jako podprogram a volat pomocí CALL. V tom případě si vygenerujte pomocí programu čekání o 4 cykly kratší než potřebujete, protože volání CALL a návrat RETURN na konci programu vezme přesně 4 cykly navíc. Další věcí, kterou můžete občas vidět a která začátečníka občas nenapadne hned je to, že když napíše podprogram, nemusí se ze všech míst programu volat od počátku, ale může se volat i někam do jeho středu, když to je potřeba. Uvedu příklad.

CEKEJ9	GOTO $+1
	NOP
CEKEJ6  GOTO $+1
        RETURN

Tady je jasné, že se voláním CALL CEKEJ9 provede všechno od CEKEJ9 až po RETURN a bude to i s voláním pomocí CALL a návratem RETURN trvat 9 cyklů. GOTO $+1 je jen skok na další řádek programu, takže vlastně udělá totéž jako NOP, ale trvá to 2 cykly místo jednoho. Volání CALL CEKEJ6 je asi jasné a je také jasné, že se ušetřilo místo oproti tomu, než mít každý podprogram zvlášt. Hezké je také v místě, kde potřebujete čekat 4 cykly, volat pomocí CALL nějaký RETURN od libovolného podprogramu, takže je to navíc jen jedno paměťové místo pro 4 cykly dlouhou pauzu. Pokud má program jen na základě stažení pinu vždy vygenerovat nějaký průběh na výstupu, nemusíte ani příliš přemýšlet o tom, jak to udělat úsporně, protože pokud se Vám to do PICu vejde, nikdo neocení rozdíl mezi tím, když program zabere jen např. 50 bajtů oproti celé paměti, když funkčnost chipu je stejná.

Licence.

Pokud program ponecháte bez jakýchkoli úprav, můžete jej používat, šířit, umisťovat na své stránky a co Vás napadne jak se Vám zlíbí. Za tento program nelze požadovat žádnou odměnu, tedy je šiřitelný pouze bezplatně. Můžete jej naprosto volně využívat i komerčně pro tvorbu svých aplikací bez jakýchkoli omezení.

Ikona.

Pokud by se Vám zalíbila ikonka z tohoto programu, není nutné ji pracně trhat, nabízím Vám ji naprosto volně k libovolnému použití. Stáhněte si ji pak jako ic.ico

Jednochipy PIC.

Bude možno v dohledné době zakoupit i v kusovém množství za rozumné ceny na náměstí Jiřího z Lobkovic v Praze. Bližší informace na http://www.rotta.cz .

Autor: Jiří Bezstarosti