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