Anunțuri

O întrerupere este un semnal către procesor emis de hardware sau software care indică un eveniment ce necesită atenție imediată. Ori de câte ori apare o întrerupere, controlerul finalizează execuția instrucțiunii curente și începe execuția unei rutine de serviciu de întrerupere (ISR) sau a unui gestionar de întreruperi. ISR spune procesorului sau controlerului ce trebuie să facă atunci când apare întreruperea. Întreruperile pot fi fie întreruperi hardware, fie întreruperi software.

Interupție hardware

O întrerupere hardware este un semnal electronic de alertă trimis către procesor de la un dispozitiv extern, cum ar fi un controler de disc sau un periferic extern. De exemplu, atunci când apăsăm o tastă de pe tastatură sau mișcăm mouse-ul, acestea declanșează întreruperi hardware care determină procesorul să citească apăsarea tastei sau poziția mouse-ului.

Interupție software

O întrerupere software este cauzată fie de o condiție excepțională, fie de o instrucțiune specială din setul de instrucțiuni care provoacă o întrerupere atunci când este executată de procesor. De exemplu, dacă unitatea logică aritmetică a procesorului execută o comandă de împărțire a unui număr la zero, pentru a provoca o excepție de împărțire la zero, determinând astfel calculatorul să abandoneze calculul sau să afișeze un mesaj de eroare. Instrucțiunile de întrerupere software funcționează similar cu apelurile de subrutină.

Ce este polling?

Starea de monitorizare continuă este cunoscută sub numele de polling. Microcontrolerul continuă să verifice starea altor dispozitive; și în timp ce face acest lucru, nu face nicio altă operațiune și își consumă tot timpul de procesare pentru monitorizare. Această problemă poate fi rezolvată prin utilizarea întreruperilor.

În metoda întreruperii, controlerul răspunde numai atunci când apare o întrerupere. Astfel, controlerul nu este nevoit să monitorizeze în mod regulat starea (stegulețe, semnale etc.) a dispozitivelor interfațate și încorporate.

Interruperi v/s Polling

Iată o analogie care diferențiază o întrerupere de polling –

Interrupere Polling
O întrerupere este ca un vânzător. Dacă cineva are nevoie de un serviciu sau de un produs, se duce la el și îl înștiințează de nevoile sale. În cazul întreruperilor, atunci când stegulețele sau semnalele sunt primite, ele notifică controlerului că trebuie să fie deservite. Metoda de interogare este ca un vânzător. Vânzătorul merge din ușă în ușă cerând în același timp să cumpere un produs sau un serviciu. În mod similar, controlerul continuă să monitorizeze stegulețele sau semnalele, unul câte unul, pentru toate dispozitivele și oferă servicii oricărei componente care are nevoie de serviciul său.

Rutine de servire a întreruperilor

Pentru fiecare întrerupere, trebuie să existe o rutină de servire a întreruperilor (ISR), sau un manager de întreruperi. Atunci când apare o întrerupere, microcontrolerul execută rutina de servire a întreruperii. Pentru fiecare întrerupere, există o locație fixă în memorie care conține adresa rutinei sale de servire a întreruperii, ISR. Tabelul de locații de memorie puse deoparte pentru a păstra adresele ISR-urilor se numește Interrupt Vector Table.

Executarea programelor

Interrupt Vector Table

Există șase întreruperi, inclusiv RESET în 8051.

Interruperi Locația CD-ROM (Hex) Pin
Interruperi Locația CD-ROM (HEX)
Serial COM (RI și TI) 0023
Interruperi temporizator 1 (TF1) 001B
Interrupere HW externă 1 (INT1) 0013 P3.3 (13)
Interupție HW externă 0 (INT0) 0003 P3.2 (12)
Timer 0 (TF0) 000B
Reset 0000 9
  • Când pinul de resetare este activat, 8051 sare la locația de adresă 0000. Aceasta este resetarea la pornire.

  • Două întreruperi sunt puse deoparte pentru temporizatoare: una pentru temporizatorul 0 și una pentru temporizatorul 1. Pozițiile de memorie sunt 000BH și, respectiv, 001BH în tabelul vectorilor de întreruperi.

  • Două întreruperi sunt rezervate pentru întreruperile externe hardware. Pinul nr. 12 și pinul nr. 13 din portul 3 sunt pentru întreruperile hardware externe INT0 și, respectiv, INT1. Pozițiile de memorie sunt 0003H și respectiv 0013H în tabelul vectorilor de întreruperi.

  • Comunicarea serială are o singură întrerupere care aparține atât recepției cât și transmiterii. Locația de memorie 0023H aparține acestei întreruperi.

Pași pentru executarea unei întreruperi

Când o întrerupere devine activă, microcontrolerul parcurge următorii pași –

  • Microcontrolerul închide instrucțiunea în curs de execuție și salvează adresa următoarei instrucțiuni (PC) în stivă.

  • De asemenea, salvează intern starea curentă a tuturor întreruperilor (de ex, nu pe stivă).

  • Saltă la locația de memorie din tabelul vectorilor de întreruperi care conține adresa rutinei de servire a întreruperilor.

  • Microcontrolerul obține adresa ISR din tabelul vectorilor de întreruperi și sare la aceasta. Acesta începe să execute subrutina de servire a întreruperilor, care este RETI (return from interrupt).

  • La executarea instrucțiunii RETI, microcontrolerul se întoarce la locația în care a fost întrerupt. În primul rând, acesta obține adresa contorului de program (PC) din stivă prin extragerea octeților de sus din stivă în PC. Apoi, începe să execute de la acea adresă.

Declanșare pe muchie vs. Declanșare pe nivel

Modulele de întrerupere sunt de două tipuri – declanșate pe nivel sau pe muchie.

Declanșat pe nivel Declanșat pe muchie
Un modul de întrerupere declanșat pe nivel generează întotdeauna o întrerupere ori de câte ori nivelul sursei de întrerupere este afirmat. Un modul de întrerupere declanșat pe muchie generează o întrerupere numai atunci când detectează o muchie afirmată a sursei de întrerupere. Frontul este detectat atunci când nivelul sursei de întrerupere se schimbă efectiv. Ea poate fi detectată și prin eșantionare periodică și detectarea unui nivel afirmat atunci când eșantionul anterior a fost dezactivat.
Dacă sursa de întrerupere este încă afirmată atunci când gestionarul de întreruperi al firmware-ului tratează întreruperea, modulul de întrerupere va regenera întreruperea, determinând ca gestionarul de întreruperi să fie invocat din nou. Modulele de întrerupere declanșate pe muchie pot fi acționate imediat, indiferent de modul în care se comportă sursa de întrerupere.
Interruperile declanșate de nivel sunt greoaie pentru firmware. Interruperile declanșate de margine mențin complexitatea codului firmware-ului la un nivel scăzut, reduc numărul de condiții pentru firmware și oferă mai multă flexibilitate atunci când sunt gestionate întreruperile.

Activarea și dezactivarea unei întreruperi

La resetare, toate întreruperile sunt dezactivate chiar dacă sunt activate. Întreruperile trebuie activate cu ajutorul software-ului pentru ca microcontrolerul să răspundă la aceste întreruperi.

Registrul IE (interrupt enable) este responsabil pentru activarea și dezactivarea întreruperii. IE este un registru adresabil pe biți.

Registrul de activare a întreruperii

EA -. ET2 ES ET1 EX1 ET0 EX0
  • EA – Activare/dezactivare globală.

  • – – Nedefinit.

  • ET2 – Activează întreruperea temporizatorului 2.

  • ES – Activează întreruperea portului serial.

  • ET1 – Activează întreruperea temporizatorului 1.

  • EX1 – Enable External 1 interrupt.

  • ET0 – Enable Timer 0 interrupt.

  • EX0 – Enable External 0 interrupt.

Pentru a activa o întrerupere, urmăm următorii pași –

  • Bit-ul D7 din registrul IE (EA) trebuie să fie la nivel înalt pentru a permite ca restul registrului să aibă efect.

  • Dacă EA = 1, întreruperile vor fi activate și se va răspunde la ele, dacă biții lor corespunzători din IE sunt la nivel înalt. Dacă EA = 0, nici o întrerupere nu va răspunde, chiar dacă pinii lor asociați din registrul IE sunt la nivel înalt.

Prioritatea întreruperilor în 8051

Potem modifica prioritatea întreruperilor prin atribuirea priorității mai mari oricăreia dintre întreruperi. Acest lucru se realizează prin programarea unui registru numit IP (interrupt priority).

În figura următoare sunt prezentați biții registrului IP. La resetare, registrul IP conține toate cifrele 0. Pentru a da o prioritate mai mare oricăreia dintre întreruperi, facem ca bitul corespunzător din registrul IP să fie ridicat.

PT1 PX1 PT0 PX0
IP.7 Nu este implementat.
IP.6 Nu este implementat.
IP.5 Nu implementat.
IP.4 Nu implementat.
PT1 IP.3 Define nivelul de prioritate al întreruperii Timer 1.
PX1 IP.2 Define nivelul de prioritate al întreruperii externe 1.
PT0 IP.1 Define nivelul de prioritate al întreruperii Timer 0.
PX0 IP.0 Define nivelul de prioritate al întreruperii externe 0.

Interupție în interiorul întreruperii

Ce se întâmplă dacă 8051 execută un ISR care aparține unei întreruperi și se activează o altă întrerupere? În astfel de cazuri, o întrerupere de prioritate mare poate întrerupe o întrerupere de prioritate mică. Acest lucru este cunoscut sub numele de întrerupere în interiorul întreruperii. În 8051, o întrerupere de prioritate joasă poate fi întreruptă de o întrerupere de prioritate înaltă, dar nu și de o altă întrerupere de prioritate joasă.

Declanșarea unei întreruperi prin software

Există momente în care trebuie să testăm un ISR prin simulare. Acest lucru se poate face cu ajutorul instrucțiunilor simple pentru a seta întreruperea la nivel înalt și a determina astfel ca 8051 să sară la tabelul de vectori de întrerupere. De exemplu, setați bitul IE la 1 pentru temporizatorul 1. O instrucțiune SETB TF1 va întrerupe 8051 în ceea ce face și îl va forța să sară la tabela de vectori de întrerupere.

Anunțuri

.