Vektoros megszakítások

PIC18F45K42

Jó leírás linkje: http://esca.atomki.hu/PIC24/interrupts.html

Adatlap (pdf): PIC18F(L)xxK42.pdf
 

 

ISR_TMR0:  CODE       0x8C0                  ; ISR code at 0x08C0 in PFM
BANKSEL        PIR0                   ; Select bank for PIR0
BCF            PIR3, TMR0IF           ; Clear TMR0IF
BTG            LATC, 0, ACCESS        ; Code to execute in ISR
RETFIE          1                      ; Return from ISR
InterruptInit:
BANKSEL        INTCON0                ; Select bank for INTCON0
BSF            INTCON0, GIEH          ; Enable high priority interrupts
BSF            INTCON0, GIEL          ; Enable low priority interrupts
BSF            INTCON0, IPEN_INTCON0  ; Enable interrupt priority
BANKSEL        PIE0                   ; Select bank for PIE0
BSF            PIE3, TMR0IE           ; Enable TMR0 interrupt
BSF            PIE4, TMR1IE           ; Enable TMR1 interrupt
BCF            IPR3, TMR0IP           ; Make TMR0 interrupt low priority
RETURN         1
VectorTableInit:
; Set IVTBASE (optional - default is 0x000008)
MOVLW          0x00                   ; This is optional
MOVWF          IVTBASEU, ACCESS       ; If not included, then the
MOVLW          0x40                   ; hardware default value of
MOVWF          IVTBASEH, ACCESS       ; 0x0008 will be taken.
MOVLW          0x08
MOVWF          IVTBASEL, ACCESS
; TMR0 vector at IVTBASE + 2*(TMR0 vector number i.e. 31) = 0x4046
MOVLW          0x00                   ; Load TBLPTR with the
MOVWF          TBLPTRU, ACCESS        ; PFM memory location to be
MOVLW          0x40                   ; written to.
MOVWF          TBLPTRH, ACCESS
MOVLW          0x46
MOVWF          TBLPTRL, ACCESS
; Write the contents of TMR0 vector location 
; ISR_TMR0_ADDRESS >> 2 = 0x08C0 >> 2 = 0x0230
MOVLW          0x30                   ; Low byte first
MOVWF          TABLAT, ACCESS
TBLWT*+                               ; Write to temp table latch
MOVLW          0x02                   ; High byte next
MOVWF          TABLAT, ACCESS
TBLWT*+                               ; Write to temp table latch
; Write to PFM now using NVMCON
BANKSEL        NVMCON1                ; Select bank for NVMCON1        D:210
MOVLW          0x84                   ; Setting to write to PFM
MOVWF          NVMCON1
MOVLW          0x55                   ; Required unlock sequence
MOVWF          NVMCON2
MOVLW          0xAA
MOVWF          NVMCON2
BSF             NVMCON1, WR            ; Start writing to PFM
BTFSC          NVMCON1, WR            ; Wait for write to complete
GOTO           $-2
RETURN         1

 

 

 

 

D: 133 példaprogram http://ww1.microchip.com/downloads/en/AppNotes/Vectored%20Interrupt%20Co...
9.0--> D:115
MEGSZAKÍTÓ SZABÁLYOZÓ
A Vectored Interrupt Controller modul csökkenti a perifériás megszakítási kérésekre vonatkozó jeleket egy CPU megszakítási kérelmére. Ez a modul a következő főbb jellemzőket tartalmazza:
• Megszakítási vektortáblázat (IVT) egy egyedi vektorral minden megszakítási forráshoz
• Fix és megszakított késleltetés
• Programozható alapcím a zárolás megszakítási vektortáblához (IVT)
• Két felhasználó által választható prioritási szint - kiemelt és alacsony prioritású
• A környezetvédelem két szintje
• Megszakítja az állapotállapot bitjeit az áram jelzésére
a CPU végrehajtási állapota A megszakításvezérlő modul összeszereli az összes megszakítási kérés jelét és megszünteti a megszakításokat
(vagyis a megszakítási vektortáblázat alapján), és egy felhasználó által megadott prioritást (vagyis az IPRx regiszterek határozzák meg), ezáltal kiküszöbölik a megszakítási források beolvasását.
 
9.0
INTERRUPT CONTROLLER
The Vectored Interrupt Controller module reduces the numerous peripheral interrupt request signals to a single interrupt request signal to the CPU. This module includes the following major features:
•  Interrupt Vector Table (IVT) with a unique vector for each interrupt source
•  Fixed and ensured interrupt latency
•  Programmable base address for Interrupt Vector Table (IVT) with lock
•  Two user-selectable priority levels – High priority and Low priority
•  Two levels of context saving
•  Interrupt state status bits to indicate the current 
execution status of the CPU The Interrupt Controller module assembles all of the interrupt request signals and resolves  the  interrupts
based on both a fixed natural order  priority  (i.e., determined by the Interrupt Vector Table), and a userassigned priority   (i.e., determined by the IPRx registers), thereby elimin ating scanning of interrupt sources.
 
9.1
Megszakításvezérlő és állapotregiszterek
A család eszközei a következő regisztereket hajtják végre a megszakításvezérlő számára:
• INTCON0, INTCON1 ellenőrzési nyilvántartások
• PIRx - perifériás megszakítás állapotregiszterek
• PIEx - Perifériás megszakítás engedélyezése regiszterek
• IPRx - perifériás megszakítás elsőbbségi nyilvántartása
• IVTBASE <20: 0> Címregiszterek
• IVTLOCK nyilvántartás
A globális megszakítási vezérlési funkciókat és a külső megszakításokat az INTCON0 regiszter vezérli. Az INTCON1 regiszter tartalmazza a megszakítási vezérlő állapotjelzőit.
A PIRx regiszterek tartalmazzák az összes megszakítási kérelmet jelző zászlót. Minden megszakítási forrásnak van egy állapotbitje, amelyet a megfelelő perifériák vagy külső jelek állítanak be, és szoftverrel törlődik.
A PIEx regiszterek tartalmazzák az összes megszakítási engedélyező bitet. Ezek a vezérlõ bitek arra szolgálnak, hogy egyidejûleg engedélyezzék a perifériák vagy a külsõ jelek megszakítását.
Az IPRx regiszterek a megszakítási forrás megszakítási prioritási szintjének beállítására szolgálnak. Minden egyes felhasználói megszakítási forrás hozzárendelhető egy magas vagy alacsony prioritáshoz.
Az IVTBASE regiszter felhasználó által programozható, és meghatározza a megszakítási vektortáblázat kezdési címét, és az IVTLOCK regisztert használják az IVTBASE regiszterbe történő bármilyen lezáratlan irat megakadályozására.
Két másik konfigurációs bit van, amely szabályozza a megszakítási vezérlő beállítását.
• CONFIG2L <3>, MVECEN bit
• CONFIG2L <4>, IVT1WAY bit
A CONFIG2L MVECEN bit határozza meg, hogy a Vektortábla meghatározza-e a megszakítási prioritásokat.
• Ha az IVT1WAY meghatározza, hogy hányszor lehet az IVTLOCKED bit törölni és beállítani az eszköz Reset után. A részleteket lásd a 9.2.3 szakaszban "Megszakítás vektortáblázat (IVT) cím számítás".
9.1
Interrupt Control and Status Registers
The devices in this family implement the following registers for the interrupt controller:
•  INTCON0, INTCON1 Control Registers
•  PIRx – Peripheral Interrupt Status Registers
•  PIEx – Peripheral Interrupt Enable Registers
•  IPRx – Peripheral Interrupt Priority Registers
•  IVTBASE<20:0> Address Registers
•  IVTLOCK Register
Global interrupt control functions and external interrupts are controlled from the INTCON0 register. The INTCON1 register contains the status flags for the Interrupt controller.
The PIRx registers contain all of the interrupt request flags. Each source of interrupt has a status bit, which is set by the respective peripherals or an external signal and is cleared via software.
The PIEx registers contain all of the interrupt enable bits. These control bits are used to individually enable interrupts from the peripherals or external signals.
The IPRx registers are used to set the Interrupt Priority Level for each source of interrupt. Each user interrupt source can be assigned to either a high or low priority.
The IVTBASE register is user programmable and is used to  determine the start address of the Interrupt Vector Table and the IVTLOCK register is used to prevent any unint ended writes to the IVTBASE register.
There are two other configuration bits that control the way the interrupt controller can be configured. 
•  CONFIG2L<3>, MVECEN bit
•  CONFIG2L<4>, IVT1WAY bit
The MVECEN bit in CONFIG2L determines whether the Vector table is used to determine the interrupt priorities. 
•  When the IVT1WAY determines the number of times the IVTLOCKED bit can be cleared and set after a device Reset. See Section 9.2.3 “Interrupt Vector Table (IVT) address calculation” for details.
 

9.2
Megszakítási vektortáblázat (IVT) A megszakításvezérlő támogatja az Interrup vektortáblát (IVT), amely tartalmazza a vektor cím helyét minden megszakítási kérelem forráshoz. A megszakítási vektortáblázat (IVT) a programmemóriában található, az IVTBASE regiszter által meghatározott címhelytől kezdődően; Lásd a 9-36 regiszter 9-37 regisztrálása és regisztrálás 9-38 a részletekért. Az IVT 68 vektorot tartalmaz, minden egyes megszakítási forrást. Minden megszakítási vektor helyszín tartalmazza a kapcsolódó megszakítási szolgáltatás rutin (ISR) kezdőcímet.
A MVECEN bit a 2L konfigurációs szóban szabályozza a vektortábla elérhetőségét.
9.2.1
INTERRUPT VECTOR TABLE BASE CÍM (IVTBASE)
A vektortábla kezdőcíme az IVTBASE regisztereken keresztül programozható. A felhasználónak biztosítania kell, hogy a kezdőcím olyan legyen, hogy a program memóriájában belül a teljes vektortáblát el tudja távolítani.
Minden vektor cím egy 16 bites szó (vagy két címhely a PIC18 eszközökön). Tehát n megszakítási források esetén 2n cím helyek szükségesek ahhoz, hogy a táblázat az első helyről az IVTBASE-ből induljon. Tehát az IVTBASE bámuló címét úgy kell megválasztani, hogy az IVTBASE (IVTBASE + 2n-1) címtartomány a program flash memóriájába beletartozhasson. Például a K42 eszközök a legmagasabb vektorszámmal rendelkeznek: 81. Ezért az IVTBASE-t úgy kell megválasztani, hogy (IVTBASE + 0xA1) kisebb legyen, mint az utolsó memóriahely a program flash memóriájában.
A programozható vektortábla-alapcím hasznos helyek, amelyek az alkalmazás függvényében váltanak át különböző vektortáblák között. Használható akkor is, ha az alkalmazásnak frissítenie kell a meglévő vektortáblát (vektor cím értékeit).

-------------------------
Megjegyzés: A helyes működés érdekében a felhasználónak egyenlőnek kell lennie az IVTBASE regiszterhez.

9.2
Interrupt Vector Table (IVT) The interrupt controller support an Interrup  Vector Table (IVT) that contains the vector address location for each interrupt request source. The Interrupt Vector Table (IVT) resides in program memory, starting at address location determined by the IVTBASE registers; refer to Register 9-36 Register 9-37and Register 9-38 for details. The IVT contains 68 vectors, one for each source of interrupt. Each interrupt vector location contains the starting address of the associated Interrupt Service Routine (ISR).
The MVECEN bit in Configuration Word 2L controls the availability of the vector table.
9.2.1
INTERRUPT VECTOR TABLE BASE ADDRESS (IVTBASE)
The start address of the vector table is user programmable through the IVTBASE registers. The user must ensure the start address is such that it canencompass the entire vector table inside the program memory. 
Each vector address is a 16-bit word (or two address locations on PIC18 devices). So for n interrupt sources, there are 2n address locations necessary to hold the table starting from IVTBASE as the first location. So the staring address of IVTBASE should be chosen such that the address range form IVTBASE to (IVTBASE+2n-1) can be encompassed inside the program flash memory. For example, the K42 devices have the highest vector number: 81. So IVTBASE should be chosen such that (IVTBASE + 0xA1) is less than the last memory location in program flash memory.
A programmable vector table base address is useful insituations to switch between different sets of vector tables, depending on the application. It can also be used when the application program needs to update the existing vector table (vector address values). 

-------------------------
Note: It is required that the user assign an even address to the IVTBASE register for correct operation.

9.2.2
MEGSZAKÍTÁSA VECTOR TÁBLÁZAT TARTALMA
MVECEN = 0
Ha az MVECEN = 0, az IVTBASE regiszterek által jelölt cím helyzete GOTO utasítással rendelkezik egy kiemelt prioritású megszakításhoz. Hasonlóképpen a megfelelő kis prioritású vektori helynek van egy GOTO utasítás is, amelyet kis prioritású megszakítás esetén hajtanak végre.
MVECEN = 1
Ha az MVECEN = 1, az egyes megszakítások vektortáblájában szereplő érték a megszakítási szolgáltatás rutin első utasításának címére utal.
ISR Location = megszakítási vektortáblázat << 2.
 

9.2.2
INTERRUPT VECTOR TABLE CONTENTS
MVECEN = 0
When MVECEN = 0, the address location pointed by the IVTBASE registers has a GOTO instruction for a high priority interrupt. Similarly, the corresponding low priority vector location also has a GOTO instruction, which is executed in case of a low priority interrupt.
MVECEN = 1
When MVECEN = 1, the value in the vector table of each interrupt, points to the address location of the first instruction of the interrupt service routine.
ISR Location = Interrupt Vector Table entry << 2.

9.2.3
MEGSZAKÍTÓ VECTOR TÁBLÁZAT (IVT) CÍM SZERKESZTÉSE
MVECEN = 0
Amikor az MVECEN bit a 2L konfigurációs szóban (5-3. Regiszter) törlődik, akkor az IVTBASE regiszterek által jelölt címet kiemelt prioritású megszakítási vektor címként használják. Az alacsony prioritású megszakítási vektorcím az IVTBASE regiszterek címéből nyolc utasításszót tartalmaz. A PIC18 eszközök esetében az IVTBASE az alapértelmezett értéket 00 0008h-ra rögzíti, a kiemelt prioritású megszakítási vektor cím 00 0008h, és az alacsony prioritású megszakítási vektor cím 00 008h.
MVECEN = 1
Minden megszakításnak van egy egyedi vektorszáma, amely a 9-2. Táblázatban meghatározott módon van társítva. Ezt a vektorszámot használjuk a megszakítási vektor helyének kiszámításához egy adott megszakítási forrás számára.
Megszakítási vektoros cím = IVTBASE + (2 * vektorszám). Ez a számított megszakítási vektoros cím értékét az IVTAD <20: 0> regiszterek tárolják, ha megszakítás érkezik (9-39-ről 9-41-ig). Az IPRx regiszterrel hozzárendelt felhasználói hozzárendelt szoftver prioritás nem befolyásolja a címek kiszámítását, és csak az egyidejű megszakítások megoldására szolgál.
-----------------------------------
Ha valamilyen okból az ISR címét nem lehetett a vektortábláról lekérni, akkor a rendszer visszaállítja és törli a PCON1 regiszterben (6-3-as regiszter) a memória-végrehajtás megszegés jelzőjét (! MEMV bit). Ez a következők bármelyikének köszönhető:
• A vektortáblán a megszakításra vonatkozó bejegyzés a végrehajtható PFM területen kívül helyezkedik el (a SAF terület nem végrehajtható, ha SAFEN = 1).
• A vektortábla által mutatott ISR a végrehajtható PFM területen kívül helyezkedik el (a SAF terület nem végrehajtható, ha SAFEN = 1).
9.2.3
INTERRUPT VECTOR TABLE (IVT) ADDRESS CALCULATION
MVECEN = 0
When the MVECEN bit in Configuration Word 2L(Register 5-3) is cleared, the address pointed by IVTBASE registers is used as the high priority interrupt vector address. The low priority interrupt vector address is offset eight instruction words from the address in IVTBASE registers. For PIC18 devices the IVTBASE registers default to 00 0008h, the high priority interrupt vector address will be 00 0008h and the low priority interrupt vector address will be 00 0018h.
MVECEN = 1
Each interrupt has a unique vector number associated with it as defined in Table 9-2. This vector number is used for calculating the location of the interrupt vector for a particular interrupt source.
Interrupt Vector Address = IVTBASE + (2*Vector Number). This calculated Interrupt Vector Address value is stored in the IVTAD<20:0> registers when an interrupt is received (Registers 9-39 through 9-41). User-assigned software priority assigned using the IPRx registers does not affect address calculation and is only used to resolve concurrent interrupts.
-----------------------------------
If for any reason the address of the ISR could not be fetched from the vector table, it will cause the system to reset and clear the memory execution violation flag (!MEMV bit) in PCON1 register (Register 6-3). This occurs due to any one of the following:
•  The entry for the interrupt in the vector table lies outside the executable PFM area (SAF area is non-executable when SAFEN = 1).
•  ISR pointed by the vector table lies outside the executable PFM area (SAF area is non-executable when SAFEN = 1).
------------------------------------