Choď na obsah Choď na menu
 

PIC10

Škola programování PIC 10

Přerušení

Přerušení je funkce, která po předem nastavené akci přeruší aktuální činnost procesoru a vykoná danou práci. Poté se procesor vrátí zpět a pokračuje kde skončil. Jinými slovy procesor dokončí právě rozdělanou instrukci a skočí na 4 řádek programu! Zde se nachází rutina, která do pomocných registrů uloží pracovní registr W a další tři důležité registry - STATUS, PCLATH a FSR a skočí na podprogram obsluhy přerušení. Zde se obvykle zjistí jaký typ přerušení proběhl (pokud nepoužíváte jen jedno) a provede se příslušná akce. Při návratu z přerušení se opět obnoví uložené registry a příkazem RETFIE se procesor vrátí přesně do místa kde byl před přerušením a pokračuje zde dál.

Zdrojů přerušení je samozřejmě víc. Zapnou se jen ty, co jsou zrovna potřeba. Takže přerušení lze provést od:
- změny na pinu RB0/INT
- změny na pinech RB4 - RB7
- přetečení TMR0
- TMR1
- TMR2
- změny stavu komparátoru
- USART
- CCP

A vlastní sytém přerušení vypadá takhle:

A k čemu je to vlastně dobrý? Nemusíte neustále hlídat stav těchto "věcí". Například máte na pinech RB4 až RB7 tlačítka, nemusíte se tedy neustále dotazovat na jejich stav. Jednoduše nastavíte příslušné přerušení a vše proběhne automaticky.
Přerušení od přetečení některého z časovačů se používá na tvorbu přesných časů, atd.

Takže se podíváme na programovou obsluhu:
W_save equ 20h
Sta_sav equ 21h
PCL_sav equ 22h
FSR_sav equ 23h


V úvodu nastavíme názvy "záložních" registrů.

org 00h
goto INIT

org 04h
movwf W_save
movf STATUS,W
clrf STATUS
movwf Sta_sav
movf PCLATH,w
movwf PCL_sav
movf FSR,w
movwf FSR_sav
GOTO PRERUS

Těmito příkazy se na první řádek paměti s programem vloží skok na začátek vlastního programu a na 4 řádek se vloží rutina k přerušení. Touto rutinou, jak už bylo uvedeno v úvodu se do pomocných registrů uloží hodnoty nejdůležitějších registrů. Poté se provede skok na podprogram PRERUS.

PRERUS BTFSC PIR1,0
    GOTO PRET1
    GOTO PRERKON

    PRET1 BCF PIR1,0
     NOP
    GOTO PRERKON


Zde se zjistí zdroj přerušení a vykonají se požadované příkazy (momentálně NOP).

PRERKON BSF STATUS,RP0
MOVLW B'00000001'
MOVWF PIE1
MOVLW B'11000000'
MOVWF INTCON
BCF STATUS,RP0
clrf STATUS

movf FSR_sav,w
movwf FSR
movf PCL_sav,w
movwf PCLATH
movf Sta_sav,w
movwf STATUS
swapf W_save,f
swapf W_save,w
retfie


No a nakonec se musí znovu povolit požadovaná přerušení, tedy přesně těchhle prvních sedm řádků je přítomno i v místě kde se nastavují I/O piny a podobně. Poté se obnoví zpět uložené registry a procesor se vrátí na původní adresu.

V následujícím jednoduchém příkladu je přerušení využito ke snímání stisku tlačítka. Tedy funkce jako v Prvním příkladu, jedním stiskem zapne, druhým vypne.


Schéma zapojení

Odkazy & Download:
Preruseni.asm
Preruseni.hex