Fórum témák

» Több friss téma
Cikkek » PIC16F kontroller: Mit tegyek, ha betelt a 2K?
PIC16F kontroller: Mit tegyek, ha betelt a 2K?
Szerző: Hp41C, idő: Feb 17, 2011, Olvasva: 14285, Oldal olvasási idő: kb. 3 perc
Lapozás: OK   3 / 5

Adatterületek:

A programban az alábbi ábrán látható változókat használjuk. A mentési regiszterek közül csak a W regiszterhez tartozót helyeztem a közös memória területre (a 0x70.. 0x7F címterületre), a többi regisztert a Bank2 -be mentjük.

Megszakítás kezelő rutin:

A megszakítás kezelő rutin három fő részből áll:

- Regiszterek mentése,

- Megszakítási okok azonosítása, kezelése, az ok törlése,

- Regiszterek visszaállítása

Regiszterek mentése:

A mentés célja, hogy a kényszerűségből használt regiszterek olyan állapotban legyenek a megszakítások kezelése után, mint akkor voltak, amikor a megszakításkérést a kontroller elfogadta. Menteni minden olyan regisztert kell, amit felhasználunk a kérések kiszolgálásánál, és megváltozásuk nem kívánatos. A  példaprogram csak a legfontosabb regiszterek mentésére terjed ki : W más néven WREG, STATUS, PCLATH, FSR.

A W regiszter mentése kötelező, hiszen adatokat mozgatni csak a W regiszteren keresztül lehet. Már a STATUS regiszter mentésénél elrontjuk a W tartalmát. A STATUS regiszter mentése a jelzőbitek állapotának megőrzése érdekében szükséges, de a STATUS regiszterben vannak az adat memória Bank kiválasztó bitjei is (RP0, RP1, IRP). Ha a programunk nem csak a 0 lapot (Page0-t) használja, vagy a megszakítási rutinban kiszámított ugrás van, menteni kell a PCLATH regisztert is. Az FSR mentése már nem kötelező, de hasznos lehet. Az indirekt címzéssel más Bankot is elérhetünk, mint ami az RP0 és RP1 bitekkel aktuálisan ki van választva.

Első lépésként a W regiszter tartalmát mentjük. A mentés a Bank kiválasztásától független, hiszen a közös memória tartományba mentjük. Azután a STATUS regisztert a W regiszterbe mentjük, elvégezzük a Bank váltást a további mentési regiszterek elérése érdekében. Mentjük a STATUS másolt értékét, a PCLATH, FSR regiszterek értékét, és a 0. lapot (Page0) és a Bank0-t választjuk ki. A Page0 beállítása szükséges, hiszen a PCLATH értéke nem ismert, az első ugrás (goto vagy call) előtt arra a lapra kell állítani, amire hivatkozni szeretnénk. A megszakítás-kiszolgálás elejétől a PCLATH 0. lapra történő állítása közé goto vagy call utasítást elhelyezni nem szabad!

Nagyon fontos, hogy a további megszakításkéréseket a kontroller tiltja, nem kell programból törölni a globális megszakítás engedélyezést (az INTCON,GIE  bitet).

Megszakítási ok azonosítása:

Ha a programban használt megszakítások közül némelyik időszakosan tiltva lehet, nem elegendő a megszakítási ok (...IF bit) vizsgálata), hanem azt is meg kell nézni, hogy a megszakítás engedélyezett-e. A megszakítási ok bitek akkor is jelezhetnek, ha a hozzájuk tartozó engedélyező bit 0 értékű. A megszakítás kérését a kiszolgálás során mindenképen törölni kell. Amennyiben az okhoz tartozó megszakítás nem engedélyezett, nem kell törölni az okot jelző bitet. Az okok között vannak olyanok, amit külön utasítással kell törölni (pl.: T0IF), és vannak olyanok, amelyek esetén az adat olvasása automatikusan törli az okot (pl.: az RCIF jelzőbitet törli az RCREG olvasása). Amennyiben nem töröljük egy engedélyezett megszakítás okát, a megszakítási rutinból való kilépés után ismét megszakítást okoz, és minduntalan a kiszolgáló rutin fog lefutni. Még egy lehetőség van a megszakítás kérés megszüntetésére: az adott eszköz engedélyezését töröljük: (pl. megszakításos kezelésű soros illesztő adási kérését tiltjuk, ha nincs több adásra váró adatunk).

A Timer0 esetén egyszerű a vizsgálat, mindkét bit az INTCON regiszterben van, ami bármelyik Bank-ból elérhető. A Timer2 esetén az engedélyezés a Bank1-beli PIE1 regiszterben van. Az indirekt elérés egyszerűbbé teszi a programot (FSR regisztert mentettük).

A példaprogramban a megszakítás kezelő programrészek csak a megszakítási okot törlik.

Regiszterek visszaállítása:

A visszaállítást fordított sorrendben végezzük, előbb az FSR és a PCLATH értékét állítjuk vissza. Itt használható a movf utasítás. A STATUS visszaállítása a megszakítás kiszolgálása előtti Bank kiválasztást is visszaállítja. A STATUS regiszter visszaállítása után a W következik. A W visszaállításánál nem használhatjuk a movf utasítást, mivel elrontaná a már visszaállított Z jelzőbit értékét. A PCLATH visszaállítása és a retfie utasítás között goto vagy call utasítást elhelyezni nem szabad!

Nagyon fontos, hogy nem állítjuk a globális megszakítás engedélyező bitet (INTCON, GIE), ezt a feladatot a retfie utasítás fogja elvégezni. A GIE 1-re állítása azonnal érvényre jutna, még a visszatérés előtt. A retfie végrehajtása előtt újra a stack -re mentené az aktuális címet és a megszakítási rutinra ugrana, a kontroller belső stack -je csak 8 szintű... Az pedig végkép rossz működéshez vezet, ha a regiszeterek visszaállítása előtt, vagy közben engedélyeznénk a megszakításokat - a mentett értékeket felülírná a megszakítási rutinban beállított értékekkel.


A cikk még nem ért véget, lapozz!
Következő: »»   3 / 5
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem