<< Előző oldal Vissza a tartalomjegyzékhez Következő oldal >>
11.5.8. Programformátum
A forráskód formátuma
Forráskód példák
Az MPASM forráskód ajánlott szerkezete
Forráskód példa
Az MPASM assemblerhez írt forráskód négy információ-típust tartalmaz, amelyek elhelyezése és sorrendisége részben kötött:
ˇ
CÍMKÉK - programsor azonosítók;
•
programelágazások esetében a címkére való hivatkozással a program végrehajtása a címke által megjelölt sorral folytatódik;
•
egyéb hivatkozások esetében a címke a címke által megjelölt programsor programmemória-helyének címét jelenti;
•
természetesen egy címke csak egyetlen programsor előtt szerepelhet, de hivatkozásként tetszőleges számban használható;
•
a címkéket a program első oszlopában kell elhelyezni;
•
a címkék után kettőspontnak, szóköznek, tabulátornak vagy sorvége jelnek kell következnie;
•
a címke utáni kettőspont nem része a címkének, hivatkozáskor nem kell használni;
•
a címkéknek betűvel vagy aláhúzás karakterrel kell kezdődniük, majd betűket és számokat is tartalmazhatnak;
•
a címkék maximális hossza 32 karakter lehet;
•
alapbeállításban a címkék feldolgozásakor a kis és nagybetűk eltérőnek számítanak.
ˇ
UTASÍTÁS AZONOSÍTÓK - (mnemonikok) mikrovezérlő utasítások rövid jelei, fordításvezérlő utasítások (direktívák) és makró hívások;
•
a mikrovezérlő utasítások és fordításvezérlő utasítások kis- és nagybetűvel is írhatók;
•
a második oszlopban kell kezdődniük;
•
előttük csak címke állhat, de betűközzel, tabulátorral vagy kettősponttal el kell választani őket.
ˇ
UTASÍTÁS PARAMÉTEREK - (operandusok) programmemória-címek, adatmemória-címek, regiszteren belüli bitcímek, számadatok (vagy ezek azonosítói), amelyek az utasítás számára kijelölik a művelet alanyát, célját vagy egyik kiinduló értékét;
•
az utasítás-azonosítók után kell következniük; szóközzel vagy tabulátorral elválasztva tőlük;
•
egy utasításhoz több paraméter is tartozhat, ezeket vesszővel kell elválasztani egymástól.
ˇ
MEGJEGYZÉSEK - a program szöveges fejléce és működési magyarázatai;
•
pontosvesszővel kell kezdődniük;
•
a pontosvesszőtől a sorvége jelig terjedő karaktereket a fordítóprogram figyelmen kívül hagyja;
•
nem állhat (egy soron belül) címkék, utasítás azonosítók vagy utasítás paraméterek előtt;
•
(az ASCII kód adatformátum természetesen tartalmazhat pontosvessző karaktert, ilyenkor a fordítóprogram az utána következő részt nem veszi megjegyzésnek).
Egy szépen tagolt (csak a formai bemutatást szolgáló) példaprogram:
;példaprogram ;*************************************** processor 16f84a START movlw 0x01 ;W = 1 movlw 0x02 ;W = 2 movlw 0x03 ;W = 3 movlw 0x04 ;W = 4 goto START ;visszalép a START címkére end
Megfigyelhető a címkék, utasítások, paraméterek és megjegyzések oszlopokba rendezése, ami nem kötelező, de szemléletessé és jól olvashatóvá teszi a programot. (Az, hogy az utasítások kis- vagy nagybetűsek a fordítási folyamatot nem befolyásolja. A címkék esetében viszont alapbeállításban a START ≠ Start ≠ start.)
Ez a programpélda egyben a minimálisan szükséges, kötelező programrészeket is bemutatja.
Egyetlen MPASM forráskódból sem hiányozhat a mikrovezérlő típusának megadása, amely a PROCESSOR vagy a LIST fordításvezérlő utasítások segítségével lehetséges. (Például: processor 16f84a vagy list p=16f84a.)
Nem hiányozhat a program végét jelző END fordításvezérlő utasítás sem.
Ezek figyelembevételével az egyik legrövidebb folyamatosan futó PIC mikrovezérlő program:
processor 16f84a START goto START ;visszalép a START címkére end
(Ez a program egy végtelen ciklus, amely csak annyit tesz, hogy folyamatosan visszalép a programmemória első sorára. Így a mikrovezérlő működése folyamatos, de kifelé nem történik kommunikáció.)
Az első példaprogram rendezetlenebb változata:
;példaprogram
;***************************************
processor 16f84a
START movlw 0x01 ;W=1
movlw 0x02 ;W=2
movlw 0x03 ;W=3
movlw 0x04 ;W=4
goto START ;visszalép a START címkére
end
Ez a forráskód fordítási eredmény szempontjából egyenértékű a fent már bemutatott oszlopokba rendezett programmal, de látható, hogy a címkével jelölt sor elveszik a többi között. (A program fordítása során az első oszlopban elhelyezett utasítások figyelmeztető üzenetet generálnak.)
Az MPASM assembler programok ajánlott felépítését mutatja be a következő felsorolás, amely a teljességre törekszik, így számos elhagyható elemet tartalmaz, de természetesen igény szerint bővíthető is.
PROGRAM AZONOSÍTÓ fájlnév verziószám utolsó módosítás dátuma szerző cég a program leírása a hardverkörnyezet leírása a program módosítás-története dátumozva FORDÍTÁSI ÉS PROGRAMOZÁSI ADATOK mikrovezérlő típus megadása csatolt deklarációs fájlok megadása mikrovezérlő azonosító mező beállítása konfigurációs bitek állapotának megadása DEKLARÁCIÓK I/O kivezetések azonosítása állandók megadása a változókat tároló regiszterek megadása makrók megadása PROGRAM reset-vektor: a főprogramra ugrás megszakításvektor: megszakítás feldolgozás főprogram kezdete megszakítások engedélyezése, tiltása kivezetések irányának beállítása regiszter alapértékek betöltése perifériák beállítása programkód SZUBRUTINOK feladat leírása ki- és bemenetek azonosítása a felhasznált adatregiszterek megadása programkód A MARADÉK MEMÓRIATERÜLET FELTÖLTÉSE |
A fenti címszavakról bővebben:
ˇ
Fájlnév - a forrásfájl neve, amely *.asm formátumú kell, hogy legyen, és az MPASM program verziójától függően hosszú fájlnév vagy 8.3 karakteres fájlnév is lehet. Itt célszerű megadni a programot vagy a gyártmányt azonosító fantázianevet is.
ˇ
Verziószám - a program fejlesztése és elkészülte utáni módosításai során folyamatosan növekvő azonosító szám. A nagyobb szám természetesen újabb verziót jelent. Elterjedten használatosak az x.y vagy x.y.z többszámos formátumok, ahol a számjegyek pontokkal vannak egymástól elválasztva. Például 1.4, ahol kisebb változtatások esetén a második számjegyet, nagyobbak esetén az első számjegyet kell növelni. Célszerűen egy harmadik számjegy használható a programon végzett változtatások számlálására, amelyet minden egyes módosítás során növelni kell eggyel.
ˇ
Utolsó módosítás dátuma - a legújabb verzió elkészültének ideje. Ezt a dátumot a program módosítás-történetében is célszerű szerepeltetni.
ˇ
Szerző, cég - a program, mint szellemi termék, tulajdonosának azonosítására szolgál. Tartalmazhat címet, telefonszámot és E-mail címet is.
ˇ
A program leírása - tartalmazza a programot működtető gyártmány nevét, a céláramkör feladatát, a program feladatait és ezek megoldására vonatkozó információkat.
ˇ
A hardverkörnyezet leírása - tartalmazza a céláramkör kapcsolási rajzának azonosítószámát; a mikrovezérlő típusát, órajelének frekvenciáját, az utasításciklus hosszát; a felhasznált program- és adatmemória mennyiségét; a mikrovezérlő hardverbeállításait: a WDT és BOR áramkörök engedélyezettségét, az oszcillátor üzemmódot, a kivezetések szerepét és a perifériabeállításokat.
ˇ
A program módosítás-története - tartalmaz minden egyes javítást annak dátumával együtt. Példa egy bejegyzésre: 2005.02.15. v.1.4. A/D eredmény eltolása.
ˇ
A mikrovezérlő típusának megadása - a fordítóprogram számára a PROCESSOR vagy a LIST fordításvezérlő utasítások segítségével lehetséges. Például: processor 16f84a vagy list p=16f84a. Ennek megadása kötelező is, hiszen az MPASM fordítóprogram ez alapján ellenőrzi a programmemória hosszát és ez alapján végzi az automatikus memória-lapozást.
ˇ
A csatolt deklarációs fájlok megadása - a fordítóprogram számára az INCLUDE fordításvezérlő utasítás segítségével lehetséges. Például: include "p16f84a.inc". A gyártó minden egyes mikrovezérlő típushoz elkészítette a *.inc csatolható deklarációs segédfájlt, ami mentesíti a programozót az adat- és vezérlő-regiszterek, valamint a vezérlő bitek megadása alól. A fájl tartalma belefordítódik a programba, úgy, mintha sorai közvetlenül az include utasítás helyére lennének beírva. A deklarációs segédfájlban a mikrovezérlő vezérlő regiszterei és ezek vezérlő bitjei a gyári jelölésekkel vannak azonosítva, így ezek azonosítására már csak akkor lehet szükség, ha a gyári jelölésektől eltérő azonosítókkal kerülnek felhasználásra.
ˇ
Az azonosító mező megadása - a programozást vezérlő program számára az __IDLOCS fordításvezérlő utasítás segítségével lehetséges, ami alapján a megadott azonosítók a mikrovezérlő programmemóriájában elhelyezett azonosító mezőbe íródnak. Például: __idlocs H'1234'.
ˇ
A konfigurációs bitek megadása - a programozást vezérlő program számára a __CONFIG fordításvezérlő utasítás segítségével lehetséges, ami alapján a megadott beállítások a mikrovezérlő programmemóriájában elhelyezett konfigurációs szóba íródnak. Például: __config H'FFFF' vagy szemléletesebben __config _WDT_ENABLE_ON & _CP_OFF & _BODEN_ON. (Az utóbbi megadási mód csak a *.inc gyári definíciós fájl mellett alkalmazható.)
ˇ
Az I/O kivezetések azonosítása - a fordítóprogram számára az EQU fordításvezérlő utasítás segítségével lehetséges. Például: PORTB equ 0x06. Így a forrásprogramban már csupán a PORTB azonosítóval lehetséges a 0x06 címen levő, a B-port kivezetéseit megtestesítő regisztert írni vagy olvasni.
ˇ
Az állandók megadása - a fordítóprogram számára az EQU fordításvezérlő utasítás segítségével lehetséges. Például: KONSTANS equ 0xA2. Ezen a módon megadható 8-bites adatkonstans és maximálisan 13-bites adat- vagy programmemóriacím-konstans is.
ˇ
A változókat tároló adatregiszterek megadása - a fordítóprogram számára az EQU fordításvezérlő utasítás segítségével lehetséges. Például: ADAT1 equ 0x21. A változóknak így a továbbiakban egy-egy adat- vagy programmemória-cím felel meg, vagyis az egyes változókra való hivatkozás címek helyett szemléletes azonosítókkal is lehetséges.
ˇ
A makrók megadása - a fordítóprogram számára a MACRO és ENDM fordításvezérlő utasítások segítségével lehetséges. Ezek közé kell elhelyezni a programban többször is előforduló feladatok programsorait. Így a főprogramban elegendő csupán a makróra hivatkozni, és a hivatkozás helyére a makró teljes tartalma befordítódik.
ˇ
Reset-vektor - a programmemória első, illetve nulladik (H'0000') sora. Reset folyamatok után a programvégrehajtás itt kezdődik. Ha a program megszakításkezelésre épül, akkor még a megszakítás vektor (H'0004') helyén kezdődő megszakítás-kezelő programrész megkezdése előtt át kell térni a főprogramra.
ˇ
Megszakításvektor - a programmemória ötödik sora (H'0004'). Megszakítás-elfogadás után a program erről a címről folytatódik, tehát innen kezdődően kell elhelyezni a megszakítás(ok) feldolgozását végző programrészt.
ˇ
A főprogram kezdete - ha a program nem tartalmaz megszakítás-kezelési megoldásokat, akkor a programmemória első sora (H'0000'). Megszakítás-kezelés esetén a H'0004' címen kezdődő megszakítás-kezelés utáni első sor.
ˇ
Megszakítások engedélyezése, tiltása - megszakítás-kezelés esetén szükség lehet a megszakítás(ok) időleges tiltására, illetve bizonyos feltételektől függően azok engedélyezésére. A program elején elhelyezett mikrovezérlő inicializáló rész ideje alatt célszerű a megszakításokat szoftveresen is letiltani (,habár a Reset-folyamat végén a megszakítások globálisan és egyenként is tiltva vannak).
ˇ
Kivezetések irányának beállítása - a kimenetek és bemenetek kiválasztása. (A Reset-folyamat után minden Port-kivezetés bemenetként funkcionál, vagyis nagyimpedanciás állapotú.)
ˇ
Regiszter alapértékek betöltése - a program helyes működéséhez szükséges alapértékek (általában nulla) beállítása. (Például: számláló és eredmény regiszterek.)
ˇ
Perifériák beállítása - a nem használt perifériák kikapcsolása, alap- és osztási értékek beállítása, a kívánt működések indítása.
ˇ
Programkód - a mikrovezérlőt működtető főprogramrész (szubrutinhívásokkal, megszakítás tiltásokkal és engedélyezésekkel, WDT nullázással).
ˇ
Szubrutinok - a részfeladatokra bontott program minden jól elkülöníthető részfeladatát célszerű szubrutinokkal megoldani a főprogram egyszerűsítése (áttekinthetősége) miatt. A szubrutinokat a főprogram után célszerű elhelyezni a programmemóriában, amely a fenti programozási sorrend megtartásával meg is valósul.
ˇ
A szubrutin feladatának leírása - egyértelműen meghatározza annak feladatát, utalva a használt módszerekre, algoritmusokra (hasonlóan a teljes program leírásához).
ˇ
A szubrutin ki- és bemenő regisztereinek azonosítása - megkönnyíti az adatmemória felosztását és elkerülhetővé teszi a memóriaütközéseket.
ˇ
A szubrutin által felhasznált adatregiszterek megadása - megkönnyíti az adatmemória felosztását és elkerülhetővé teszi a memóriaütközéseket. (Segédregiszterek: számlálóregiszterek, részeredményeket tároló regiszterek.)
ˇ
Programkód - a szubrutin feladatának megvalósítása. (Figyelembe kell venni, hogy a szubrutinok bármely programmemória-lapról hívhatóak, és hívásukkor az éppen aktív adatmemória-lap sem ismert.)
ˇ
A maradék memóriaterület feltöltése - a programtárolásra nem használt memóriaterületet célszerű teljes egészében a Reset-vektorra ugró utasítással (goto H'0000') feltölteni. Ez egyszerűen megoldható a FILL fordításvezérlő utasítás használatával. Így a programszámláló (PC) hibás értéke esetén a program újra kezdődik.
Az, hogy a fentiek közül mely részek kerülnek be egy programba, a program felépítése és bonyolultsága határozza meg.
A program azonosító rész megírása célszerű a későbbi munka könnyítésére, de a program ennek egyszerűsítése vagy elhagyása esetén is működőképes lesz.
A kötelező részeket az előző fejezetrész mutatja be.
A fent bemutatott szerkezet megvalósítására példa a következő programvázlat, amely minden program kiindulási alapjának tekinthető.
;PROBA.ASM 1.4.23 2005.01.23.
;********************************************************************
;Szerző: Szabó István test@t-es-t.hu
;Cég: Tudomány és Technika
;********************************************************************
;UPRO-PC-8 univerzális programozó készülék működtető program
;az áramkör a vezérlő IBM-PC kompatibilis számítógép felől
;RS-232 soros átvitellel érkező parancsoknak megfelelően vezérli
;a programozó kivezetéseket; az áramkör önálló funkciókkal nem
;rendelkezik, csak a parancsokat hajtja végre:
;1db parancs = 1db kivezetés szintváltás
;********************************************************************
;kapcsolási rajz: UP8-05-01
;mikrovezérlő: PIC16F648A-I/P
;oszcillátor típusa: belső RC oszcillátor
;órajel: 4MHz
;utasítás ciklus: 1000ns
;programmemória: 214 sor
;adatmemória: 14 bájt
;WDT működése: tiltva
;BOR működése: engedélyezve
;LVP működés: tiltva
;PWRT működése: engedélyezve
;MCLR kivezetés: I/O
;kódvédelem: nincs
;USART: aszinkron RS-232 9600 bit/s
;Kivezetések kiosztása:
;RA0 - ... ; RB0 - ... ;
;RA1 - ... ; RB1 - ... ;
;RA2 - ... ; RB2 - ... ;
;RA3 - ... ; RB3 - ... ;
;RA4 - ... ; RB4 - ... ;
;RA5 - ... ; RB5 - ... ;
;RA6 - ... ; RB6 - ... ;
;RA7 - ... ; RB7 - ... ;
;Módosítás-történet:
;2005.01.12. 1.0 - első verzió;
;2005.01.15. 1.1 - ... ;
;2005.01.16. 1.2 - ... ;
;2005.01.21. 1.3 - ... ;
;2005.01.23. 1.4 - ... ;
;********************************************************************
;FORDÍTÁSI ADATOK
;********************************************************************
processor 16f648a ;a mikrovezérlő típusa include "p16f648a.inc" ;a definíciós csatolt fájl
;********************************************************************
;PROGRAMOZÁSI ADATOK
;********************************************************************
__idlocs H'0032' ;mikrovezérlő azonosító __config H'2150' ;konfigurációs szó
;********************************************************************
;DEKLARÁCIÓK
;********************************************************************
;I/O kivezetések azonosítása-----------------------------------------
Aport equ 0x05 ;A Port azonosítója Bport equ 0x06 ;B Port azonosítója K00 equ 0x00 ;A Port 0. bit azonosítója K01 equ 0x01 ;A Port 1. bit azonosítója K02 equ 0x02 ;A Port 2. bit azonosítója K03 equ 0x03 ;A Port 3. bit azonosítója K04 equ 0x04 ;A Port 4. bit azonosítója K05 equ 0x05 ;A Port 5. bit azonosítója K06 equ 0x06 ;A Port 6. bit azonosítója K07 equ 0x07 ;A Port 7. bit azonosítója K08 equ 0x00 ;B Port 0. bit azonosítója K09 equ 0x03 ;B Port 3. bit azonosítója K10 equ 0x04 ;B Port 4. bit azonosítója K11 equ 0x05 ;B Port 5. bit azonosítója K12 equ 0x06 ;B Port 6. bit azonosítója K13 equ 0x07 ;B Port 7. bit azonosítója
;Állandók megadása---------------------------------------------------
BRate equ 0x19 ;adatátviteli sebesség
;Változók megadása---------------------------------------------------
TEMP equ 0x20 ;ideiglenes tároló regiszter ADAT1 equ 0x21 ;ideiglenes tároló regiszter ADAT2 equ 0x22 ;ideiglenes tároló regiszter
;Makrók megadása-----------------------------------------------------
rendez macro ;adatrendezés makró ... ... endm  
;********************************************************************
;PROGRAM
;********************************************************************
clrf PCLATH ;a lapozó bitek törlése clrf INTCON ;a megszakítások tiltása clrf STATUS ;a lapozó bitek törlése goto START ;átlépi a megszakítás kezelést
;Megszakítás kezelés-------------------------------------------------
... ... ... ...
;Főprogram-----------------------------------------------------------
START ... ... ;a főprogram kezdete ... ...
;Szubrutinok---------------------------------------------------------
... ... ... ... ... return fill H'0000',H'0F2A' ;a maradék sorok feltöltése end
Tudomány és Technika (test@t-es-t.hu)
<< Előző oldal Vissza a tartalomjegyzékhez Vissza a lap tetejére Következő oldal >>