Seriál - PIC10F20x - 4 - Blikač
09. 06. 08 - 11:41. Napsal Jiří Chytil. Přečteno 3876x. Žádné komentáře
V této kapitole si řekneme něco málo o pár instrukcích a sestavíme si první program.
Na prvním programu si ukážeme některé základní isntrukce a to co by měl program obsahovat.
processor 10F200
include P10F200.INC
__CONFIG _IntRC_OSC & _WDT_OFF & _CP_OFF & _MCLRE_OFF
W1 EQU h'10' ;definování proměnných
W2 EQU h'11'
MOVLW b'00000000' ;piny jako výstupní
TRIS GPIO
Start BSF GPIO,0 ;GPIO do log 1
CALL cekej ;volání podprogramu cekej
BCF GPIO,0 ;GPIO do log 0
CALL cekej ;volání podprogramu cekej
GOTO Start ;skok na navěstí start
cekej MOVLW h'ff' ;podprogram čekání
MOVWF W2
wait2 MOVLW h'ff'
MOVWF W1
wait1 DECFSZ W1,1
GOTO wait1
DECFSZ W2,1
GOTO wait2
RETLW 0
end
Na prvním řádku je typ používaného MCU. Na druhém řádku se nachází instrukce INCLUDE, která do kódu vkládá obsah souboru P10F.INC. Tento soubor v sobě obsahuje deklarace konstant. Pro příklad kousek uvedu:
Dále tam máme jakousi čáru za středníkem, tato je komentářem a překladač ji vůbec nebere v potaz, to co je na jednom řádku za středníkem prostě ignoruje
;tu může být cokoliv
Zápis za středníkem slouží krom toho, že s ním můžeme program úhledně rozdělit do částí a hlavně k tomu, aby si programátor mohl do programu okomentovat činnost uP. Někomu se tato činnost může jevit zbytečná, ale právě u JSA je to jedna z nejdůležitějších věcí vůbec. U ostatních jazyků se kódem pročteme, ale u JSA je to šílená dřina a práce. A někdy je to skoro nereálné. Proto na vás apeluji hned na začátku abyste svůj, ač jednoduchý, kód komentovali. Když nebudete komentovat každý řádek tak komentujte alespoň bloky kódu s určitou činností nebo kratší úseky kódu. Jinak se v tom už nikdo nevyzná. A po čase nepoužívání ani vy.
V řádku dalším máme onu slíbenou direktivu EQU. Ta je tu také jako něco co programátorovy značně usnadňuje život. My totiž nějakému textovému řetězci můžeme přiřadit konstantní hodnotu. Například zde:
NULA EQU 0
Přiřazujeme pinu GPIO0 hodnotu 0. A teď když kdekoliv v kódu napíšeme NULA a nebo 0 vyjde to nastejno. Ted si možná mnozí řeknete, co je to za blbost takto tvořit konstanty. Já vám ale hned vyvrátím, že to vůbec blbost není. Protože v PICech se data a nastavení uchovávají zásadně v paměti na některé z adres a je potřeba udržet si přehled o tom, co která adresa obsahuje. A toho právě můžeme dosáhnout pomocí tohoto zápisu.
TEMP EQU h'36'
V programu tedy již nemusíme psát, že chceme přesunout data do h'36', ale můžeme napsat, že je chceme přesunout na adresu reprezentovanou sloven TEMP. To výrazně zvýší přehlednost programu. To samé zde platí pro piny portů. Stejně jako můžu napsat, že chci do logické 1 nastavit pin GPIO1 tak můžu využít služeb EQU:
ANODA2 EQU 1
A napsat, že chci do logické 1 nastavit anodu 2. zápis tak bude mnohem přehlednější a srozumitelnější. A když se podíváme na soubor P10F200.INC zjistíte, že se skládá jen ze samých EQU.
Nyní bych značnou část kódu přeskočil a vrhl bych se na poslední řádek a ten obsahuje text END to je další z direktiv pro překladač. Říká mu, že tady už má skončit s překladem. A musí ji obsahovat každý program. V tomto programu je to direktiva poslední. Mezi direktivy běžné se však ještě řadí ORG. O té si ovšem povíme později, až to bude nutné.
Vraťme se ale k hlavní výkonné části programu, ta přesto, že se skládá jen z několika řádků umí přepínat hodnoty na výstupu pinu RB0. Kód je tedy následující:
MOVLW b'00000000' ;piny jako výstupní
TRIS GPIO
Start BSF GPIO,0 ;GPIO do log 1
CALL cekej ;volání podprogramu cekej
BCF GPIO,0 ;GPIO do log 0
CALL cekej ;volání podprogramu cekej
GOTO Start ;skok na navěstí start
V kódu máme tedy prvních pár instrukcí. První dvě instrukce sloučí pro práci s pracovním registrem W. To je takový hlavní registr a odehrává se přes něj velká spousta instrukcí. První instrukce:
MOVLW b'00000000'
Přesune do pracovního registru W binární hodnotu 00000000. Je to instrukce bytová pracuje totiž s celým bytem. A zároveň je to instrukce přesunová. Instrukce tedy do registru W vkládá konstantu.
TRIS GPIO
Obsah registru W se přesune do registru TRIS. Registr tris nastavuje piny portu jak vstupní nebo jako výstupní, kde nuly definují port jako výstupní a jedničky jako vstupní.
Instrukce podobná instrukci tris je MOVWF, ta umožňuje vložení obsahu pracovního registru W nějakého jiného registru a pokud použiji zápis:
MOVWF GPIO
tak se mi nenastaví porty jako vstupní nebo výstupní, ale na portech pokud jsou výstupní se objeví buď logická jedna nebo logická nula podle obsahu pracovního registru W jehož obsah do GPIO vkládáme.
Instrukce jsou zapsány tzv. mnemonickým značením, písmeny tedy většinou nahrazují části slov. Je to z toho důvodu aby se nám název instrukce a její činnost dobře pamatovali. MOVLW tedy znamená MOVE Jako pohyb, L jako litera a W jako pracovní registr W. Instrukci tedy můžeme zapsat také jako:
k → W
V instrukci MOVWF jde o přesun (MOVE) z pracovního registru W na adresu F, která je dána parametrem.
W → F
MCU řady 10F20x mají pouze 4 piny, a tak josu horní čtyři bity ignorovány. Po restartu se všechny nastaví jako vstupy.
MOVLW b'----1000' TRIS GPIO
V tomto příkladu je pin R3 nastaven jako výstup a ostatní piny R0 až R2 jsou nastaveny jako vstupy, na hodnotách horních čtyř bitů tedy nezáleží a je jedno, zdali tam vložíte jedničku nebo nulu.
Následující řádek začíná návěstím. Návěstí je slovní označení místa v programu, na které můžeme přejít při vykonávání programu, aniž bychom znali adresu příkazu, který je na řádku s návěstím. V přímé souvislosti s návěstím je zde i na konci použitý příkaz GOTO. Za ním následuje název návěstí, na které se chod programu přemístí. GOTO je příkaz nepodmíněného skoku, znamená to, že skok se vykoná pokaždé, když program provádí instrukci GOTO.
GOTO start
S instrukcí GOTO se dostáváme k PC, tentokráte to není Personal Computer, ale Program Counter. Je to registr, který obsahuje adresu instrukce, která se bude vykonávat. Tato adresa, kterou my "dosadíme" instrukcí GOTO, je obsažena v názvu navěstí, ale to je převážně starostí překladače.
k → PC
Takto je instrukce GOTO zapsána rovnicí. Instrukce GOTO je instrukcí skokovou. Tato instrukce trvá dva hodinové cykly. Interval operandu (konstanty k) je od 0 do 2047. To je maximální možná délka programu.
Program za návěstím pokračuje instrukcí BSF. Tato instrukce je instrukcí bitovou. Bitová instrukce mění jen jediný bit.
BSF GPIO,0
Pokud instrukce vypadá takto, nastaví bit GPIO,0 do log 1. S instrukcí BCF se pracuje naprosto stejně jako s BSF. Odlišná je pouze její funkce. Nastaví totiž vybraný bit do log0. Zápis instrukce je také obdobný:
BCF GPIO,0
Program jako celek tedy pracuje tak, že si první nastaví jako výstup registr TRISGPIO. Poté se začne vykonávat hlavní část programu.
Start BSF GPIO,0 ;GPIO do log 1 CALL cekej ;volání podprogramu cekej BCF GPIO,0 ;GPIO do log 0 CALL cekej ;volání podprogramu cekej GOTO Start ;skok na navěstí start
Vynecháme-li instrukce
CALL cekej ;volání podprogramu cekej
bude program fungovat následovně, hlavní část začíná navěstím, za ním následují instrukce BSF a BCF, které na jeden strojový cyklus, to je při krystalu 4MHz 1us, nastaví pin GPIO0 do log1. Následuje instrukce GOTO Start a ta vrátí program na návěstí Start. Vytvoří se 3us dlouhá prodleva a opět 1us kdy pin GPIO0 bude v log1. A to se bude neustálo opakovat, takže jsem vytvořili generátor periodického signálu. Tento signál má ovšem poměrně vysokou frekvenci. A kdybychom na pin připojili LED diodu blikla by za jedinou vteřinu 250000 to je 250kHz. To je doba, kterou lidské oko nemůže postřehnout, vždyť už frekvence o několik řádů nižší člověk nepostřehne. Proto jsou zde instrukce volání podprogramu zpoždění, který mnohonásobně prodlouží doby trvání svitu i zhasnutí tak, že je lidské oko schopné toto zaregistrovat. Ale o zpožděních si povíme v příštím díle.
Novinky Další novinky
Anketa
Jaký obchod preferujete při nákupu součástek?
TME
GES
GME
Farnell
SOS electronic
TIPA
EZK
PS Electronic
Mouser
Buček
Denkl Electronic
FK Technics
Hadex
Conrad
Jiný český
Jiný zahraniční
Poslední komentáře