Sunteți pe pagina 1din 4

Sistemul de ntreruperi al familiei de mocrocontrolere

PIC.
Datorit existenei unei singure uniti aritmetice i logice, microcontroler-ul poate executa o
singur operaie pentru un anumit interval de timp. Astfel, codul main va rula sub forma
unei structuri secveniale. Totui, exist situaii neprevzute n care trebuie s executm o alt
activitate fa de cea care ruleaz n momentul respectiv. Acest tip de eveniment poate fi
executat cu ajutorul sistemului de ntreruperi. Astfel, fiecrui eveniment i se asociaz o
ntrerupere. Apariia evenimentului respectiv va provoca executarea unor rutine de cod
special scrise de programator (rutine de deservire a ntreruperii).
ntreruperile sunt des utilizate n corelare cu ndeplinirea
unei condiii exterioare. Spre deosebire de sistemul de
intrare oferit de modulul PORT, ntreruperile permit
executarea codului indiferent de momentul apariiei
evenimentului. ntreruperile ofer flexibilitate n scrierea
i rularea programelor. Cererea de ntrerupere apare la
nivel hardware, deci nu este necesar coordonarea rutinei
de ctre programator, microcontrolerul fiind cel care
gestioneaz aceast cerere.
Uzual, n cadrul microcontrolerelor pot exista urmtoarele surse de ntrerupere:
-

ntreruperi externe;
ntreruperi provocate de timere;
ntreruperi provocate de porturi;
ntreruperi provocate de comparator;
ntreruperi provocate de modulul USART.

Particular, pentru microcontrolerul PIC 16F917 pot fi definite urmtoarele tipuri de


ntreruperi:
- ntreruperi externe RB0/INT/SEG0;
- ntrerupere provocat de depirea lui TMR0 ;
- ntrerupere provocat de modificri pe portul PORTB ;
- 2 ntreruperi provocate de comparator;
- ntrerupere provocat de ADC;
- ntrerupere provocat de depirea lui Timer1 ;
- ntreruperi provocate de scrierea de date n EEPROM ;
- ntreruperi provocate de Fail-Safe Clock Monitor;
- ntrerupere provocat de LCD;
- ntrerupere provocat de PLVD (programmable low-voltage detect);
- ntrerupere provocat de USART;
- ntrerupere provocat de CCP1 i CCP2(Capture 1 input/Compare 1 output/PWM 1
output.);
- ntrerupere provocat de TMR2.
1

Totui, pentru a se putea utiliza o ntrerupere trebuie s modificm o serie de registre. Primul
pe list este registrul INTCON, care nregistreaz apariia ntreruperilor prin intermediul unor
flag-uri. n primul rnd pentru a se putea accesa o ntrerupere trebuie s activm bitul 7,
intitulat GIE (global interrupt enable), fapt ce valideaz modulul de ntrerupere. Din registrul
INTCON pot fi activate sau dezactivate principalele tipuri de ntreruperi. De exemplu, prin
validarea bitului 4 (INTE) vor fi activate ntreruperile exterioare, iar prin activarea bitului 5
este activat ntreruperea de depire a timer-ului 0. Pentru detalii referitoare la registrele
modulului de ntrerupere consultai tabelul 1.
Tabelul 1. Registre importante din cadrul modulului de ntreruperi.

n cazul apariiei unei ntreruperi, microcontroler-ul prsete automat programul principal


(salvnd adresa instruciunii curente n stiv) i realizeaz un salt la adresa unic a vectorului
de ntrerupere ( 0x04). Oricare ar fi sursa ntreruperii, sistemul realizeaz saltul la aceast
adres. O dat rulat rutina de deservire a ntreruperilor, sursa ntreruperii poate fi
determinat prin interogarea fanioanelor din INTCON. Dup aceast interogare, bitul GIE
este resetat pentru a inhiba executarea altei ntreruperi n decursul executrii ntreruperii
curente. Mai departe, adresa de ntoarcere este salvat n stiv. Stiva este o memorie tampon,
de dimensiune mic, n care sunt salvate temporar o serie de date manipulate de
A.L.U.(unitatea aritmetic i logic). Urmtorul pas este ncrcarea n registrul PC (program
counter) a adresei 0x04 pentru a permite executarea rutinei din ntrerupere. Trebuie subliniat
faptul c este datoria programatorului de a reseta fanionul corespunztor ntreruperii.
Resetarea software va permite executarea rutinei doar o singur dat, n caz contrar,
microcontroler-ul va executa la infinit ntreruperea. Dup executarea rutinei, se ncarc din
stiv adresa de ntoarcere, iar dup aceast operaie se revine la executarea codului main
din punctul de unde a aprut ntreruperea.
Un exemplu de utilizare al unei ntreruperi exterioare este prezentat n codul urmtor:
Void interrupt()
{
if(INTCON.RBIF)
{
directie++;
INTCON.RBIF=0;
delay_ms(200);
}
if(INTCON.INTF)

// resetez flag-ul de ntrerupere


// daca a aprut o trecere din 0 in 1
atuncea incrementeaz fante i reseteaz
flagul de ntrerupere

{
fante++;
INTCON.INTF=0;
}
INTCON.RBIF=0;
}

Pentru o nelegere mai uoar a sistemului de ntrerupere putei consulta schema logic
urmtoare:

Figura 2. Schema logic a ntreruperilor.


n continuare sunt prezentate principalele surse de ntrerupere:
Intreruperea RB0/INT
ntreruperea generat de pinul RB0/INT (PORTB<0>) este determinat de modificarea
frontului semnalului aplicat pe acest pin: fie cresctor, dac bitul
INTEDG
(OPTION_REG<6>) este setat, fie descresctor, dac INTEDG este resetat. Cnd un front
valid apare pe pinul RB0/INT, fanionul INTF (INTCON<1>) este setat. Aceast ntrerupere
poate fi dezactivat prin resetarea bitului de control INTE (INTCON<4>). Fanionul INTF

trebuie resetat prin software n rutina de deservire a ntreruperii (Interrupt Service Routine),
nainte de reactivarea acestei ntreruperi.
ntreruperea TMR0
O depire a timer-ului pe 8 bii TMR0 (tranziia de la 0xFF la 0x00) va seta bitul T0IF
(INTCON<2>). ntreruperea poate fi activat / dezactivat prin setarea / resetarea bitului de
control T0IE (INTCON<5>).
ntreruperea PORTB
O schimbare a strii logice a oricruia dintre pinii 47 ai PORTB (pini configurai ca
intrare!!!) seteaz bitul RBIF (INTCON<0>). ntreruperea poate fi activat / dezactivat prin
setarea / resetarea bitului de control RBIE (INTCON<3>).

S-ar putea să vă placă și