Vissza a főoldalra    Vissza a PIC főoldalra

<< 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
  ...    
Vissza a lap tetejére

 

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
  ...    
Vissza a lap tetejére

 

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

Vissza a főoldalra    Vissza a PIC főoldalra