Vissza a főoldalra    Vissza a PIC főoldalra

<< 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).

Vissza a lap tetejére

      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 STARTStartstart.)
      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.)

Vissza a lap tetejére

      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.

Vissza a lap tetejére

      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 >>

Vissza a főoldalra    Vissza a PIC főoldalra