<< Előző oldal Vissza a tartalomjegyzékhez Következő oldal >>
7.5. Regiszter-érték mentés
A közepes teljesítményű PIC mikrovezérlőknél megszakítás elfogadáskor csak a PC programszámláló értéke mentődik a verembe.
Megoldható viszont a W munkaregiszter valamint a STATUS regiszter értékének mentése a megszakításkezelő szubrutinból.
Az adott mikrovezérlő adatmemória-szervezésétől függően a mentésnek három különböző alapesete lehetséges:
ˇ
adatmemórialapok közös memóriaterülettel, amikor egy bizonyos általános regiszterterület minden lapról elérhető;
ˇ
adatmemórialapok közös terület nélkül;
ˇ
általános adatregiszter csak a 0. lapon.
A mentési feladatot megkönnyíti, hogy a STATUS regiszter mindegyik memórialapon megtalálható. Így a megszakításkezelő szubrutinnak nem kell arra ügyelnie, hogy a végén melyik memórialapot adja vissza a főprogramnak.
Regiszter-érték mentése közös memóriaterületre
A W munkaregiszter a W_TEMP, a STATUS regiszter pedig a STATUS_TEMP közös memóriaterületen definiált általános regiszterbe kerül mentésre, illetve visszaállításra a következő lépésekkel:
ˇ
a W átmásolása a W_TEMP regiszterbe;
ˇ
a STATUS regiszter átmásolása a STATUS_TEMP regiszterbe a SWAPF utasítással, amely ugyan felcseréli az első négy bitet a második négyre, de ennek eredménye a bitértékekre nincs hatással;
ˇ
a megszakítás kiszolgáló programrész végrehajtása;
ˇ
a STATUS regiszter visszaállítása, amivel a megszakítás előtt aktuális memórialap is újra kiválasztódik;
ˇ
a W munkaregiszter visszaállítása.
A fenti műveletsor a következő programrészlettel oldható meg:
... isr: movwf W_TEMP ;a W másolása a W_TEMP-be swapf STATUS,W ;a STATUS bitcserés másolása a W-be movwf STATUS_TEMP ;a W (STATUS) másolása a STATUS_TEMP-be ... ... ;megszakítás kiszolgáló programrész ... swapf STATUS_TEMP,W ;a STATUS_TEMP bitcserés másolása a W-be movwf STATUS ;a STATUS_TEMP másolása a STATUS-ba swapf W_TEMP,F ;a W_TEMP bitcseréje swapf W_TEMP,W ;a W_TEMP másolása a W-be retfie ;visszatérés a megszakításból ...
Regiszter-érték mentése közös terület nélkül
A W_TEMP tároló regisztert mindegyik memórialapon definiálni kell (vagyis a helyet fenntartani erre a célra), mivel a mentés előtt az aktuális lap ismeretlen. A W így egy előre nem ismert (a STATUS regiszter által megadott) helyre kerül. A STATUS_TEMP regisztert tetszőlegesen választott memórialapon kell elhelyezni.
A szükséges mentési és visszaállítási lépések a következőek:
ˇ
a W átmásolása az aktuális W_TEMP regiszterbe;
ˇ
a STATUS regiszter bitcserés átvitele a W munkaregiszterbe;
ˇ
átváltás a STATUS_TEMP regisztert tartalmazó (itt a 0.) memórialapra;
ˇ
a W (valójában STATUS) átmásolása a STATUS_TEMP regiszterbe;
ˇ
a megszakítás kiszolgáló programrész végrehajtása;
ˇ
a STATUS regiszter bitcserés visszaállítása, amivel a megszakítás előtt aktuális memórialap is újra kiválasztódik;
ˇ
a W munkaregiszter visszaállítása.
A műveletsor a következő programrészlettel valósítható meg:
... isr: movwf W_TEMP ;a W másolása a W_TEMP-be swapf STATUS,W ;a STATUS bitcserés másolása a W-be bcf STATUS,RP0 ;a 0. lap kiválasztása movwf STATUS_TEMP ;a W (STATUS) másolása a STATUS_TEMP-be ... ... ;megszakítás kiszolgáló programrész ... swapf STATUS_TEMP,W ;a STATUS_TEMP bitcserés másolása a W-be movwf STATUS ;a STATUS_TEMP másolása a STATUS-ba swapf W_TEMP,F ;a W_TEMP bitcseréje swapf W_TEMP,W ;a W_TEMP másolása a W-be retfie ;visszatérés a megszakításból ...
Regiszter-érték mentése a 0. lapra
Azok a mikrovezérlők, amelyeknek csak a 0. memórialapjukon van általános célú regiszter, csak két memórialapot tartalmaznak, így a lapválasztáshoz csupán az RP0 vezérlőbitre van szükség.
ˇ
az aktuális memórialap vizsgálata;
ˇ
ha a 0. lap az aktuális, akkor a legelső (közös memóriaterület) esetnek megfelelő mentési utasítások végrehajtása;
ˇ
ha az 1. lap az aktuális, akkor lapváltás az RP0 lapválasztó bit "0"-ra állításával (így a STATUS regiszter még a mentés előtt megváltozik);
ˇ
a STATUS regiszter bitcserés átvitele a W munkaregiszterbe;
ˇ
a W (valójában STATUS) átmásolása a STATUS_TEMP regiszterbe;
ˇ
az RP0 lapválasztó bit helyreállítása a STATUS_TEMP regiszterben;
ˇ
a megszakítás kiszolgáló programrész végrehajtása;
ˇ
a STATUS regiszter bitcserés visszaállítása, amivel a megszakítás előtt aktuális memórialap is újra kiválasztódik;
ˇ
az aktuális memórialap vizsgálata;
ˇ
ha a 0. lap az aktuális, akkor a W munkaregiszter visszaállítása;
ˇ
ha az 1. lap az aktuális, akkor lapváltás az RP0 lapválasztó bit "0"-ra állításával;
ˇ
a W munkaregiszter visszaállítása;
ˇ
az 1. lap visszaállítása.
A műveletsor a következő programrészlettel valósítható meg:
... int: btfss STATUS,RP0 ;az aktuális memórialap tesztelése goto b0-1 ;ugrás, ha a 0. lap az aktuális bcf STATUS,RP0 ;a 0. lap kiválasztása movwf W_TEMP ;a W másolása a W_TEMP-be swapf STATUS,W ;a STATUS bitcserés másolása a W-be movwf STATUS_TEMP ;a W (STATUS) másolása a STATUS_TEMP-be bsf STATUS_TEMP,1 ;a lapválasztó bit helyreállítása goto isr ;ugrás a megszakítás kiszogáló programrészre b0-1: movwf W_TEMP ;a W másolása a W_TEMP-be swapf STATUS,W ;a STATUS bitcserés másolása a W-be movwf STATUS_TEMP ;a W (STATUS) másolása a STATUS_TEMP-be isr: ... ... ;megszakítás kiszolgáló programrész ... swapf STATUS_TEMP,W ;a STATUS_TEMP bitcserés másolása a W-be movwf STATUS ;a STATUS_TEMP másolása a STATUS-ba btfss STATUS,RP0 ;az aktuális memórialap tesztelése goto b0-2 ;ugrás, ha a 0. lap az aktuális bcf STATUS,RP0 ;a 0. lap kiválasztása swapf W_TEMP,F ;a W_TEMP bitcseréje swapf W_TEMP,W ;a W_TEMP másolása a W-be bsf STATUS,RP0 ;az 1. lap kiválasztása retfie ;visszatérés a megszakításból b0-2: swapf W_TEMP,F ;a W_TEMP bitcseréje swapf W_TEMP,W ;a W_TEMP másolása a W-be retfie ;visszatérés a megszakításból ...
Tudomány és Technika (test@t-es-t.hu)
<< Előző oldal Vissza a tartalomjegyzékhez Vissza a lap tetejére Következő oldal >>