Jít k navigaci - Jít k vyhledávání


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
Kód: Assembler pro PIC10F20x - Blikač

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.



Autor
Jiří Chytil

Jiří Chytil24 let

Šéfredaktor 8bitu.cz. V současné době je studentem prvního ročníku magisterského studia na Fakultě elektrotechické na VUT v Brně. Mezi jeho koníčky patří elektrotechnika, bastlení, programování a hudba. Pracuje na částečný úvazrek ve společnosti Honeywell HTS ACS.

Diskuse ke článku (0)

- Žádné příspěvky -

Přidat první komentář »


Novinky Další novinky

[10. 03.]  Tak jsem pro Vás připravil novou anketu. A snažím se pokračovat na projektu jehož výsledky bych zde rád zveřejnil, ale poněkud mě brzdí diplomová práce a práce.
[30. 01.]  Omlouvám se za nečinnost způsobenou značným nedostatkem času. Nevím, ale jestli se mi to podaří změnit. To víte, člověk stárne a jeho čas je potřeba jinde než na internetu.
[07. 03.]  Po dlouhé době jsme pro vás přichystali novou anketu - najdete ji níže v pravém panelu.
[12. 12.]  Zajímavý počin v oblasti měřící techniky jsou Real-time spektrální analyzátory - odkaz
[07. 12.]  Sice již starší video, ale stále mě uchvacuje. Výroba elektronek "doma" - odkaz

Reklama

Morphy Richards elektronika Okruháři.cz

Programujte.com

Léčivé obrazy - enkaustika Lenka Blažíková

Keramika Věra Coufalová - užitková keramika

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í