Summary

Acest document oferă o introducere în conceptul de întreruperi în programarea microcontrolerelor. Explică ce sunt întreruperile, cum funcţionează şi cum sunt gestionate. Conţine exemple simple pentru a ilustra modul în care se utilizează funcționalitatea de întreruperi la nivelul unui sistem.

Full Transcript

ÎNTRERUPERILE Ce este o întrerupere? O întrerupere este un semnal care le spune procesorului (CPU) să oprească ceea ce face în prezent și să treacă la executarea unei alte sarcini. Acest lucru se întâmplă când apare un eveniment important care necesită atenție imediată. Cum funcționează o întreru...

ÎNTRERUPERILE Ce este o întrerupere? O întrerupere este un semnal care le spune procesorului (CPU) să oprească ceea ce face în prezent și să treacă la executarea unei alte sarcini. Acest lucru se întâmplă când apare un eveniment important care necesită atenție imediată. Cum funcționează o întrerupere? 1. Evenimentele și CPU-ul: - Evenimentele (cum ar fi apăsarea unei taste sau primirea unui dată de la o unitate externă) sunt semnale care informează sistemul că trebuie să facă ceva. - Aceste evenimente sunt gestionate de CPU, care trebuie să decidă cum să reacționeze la fiecare eveniment. 2. Tipuri de evenimente: - Evenimente interne: Sunt generate de către CPU sau alte componente interne ale sistemului. - Evenimente externe: Sunt generate de către dispozitive externe, cum ar fi tastatura, mouse-ul sau alte periferice. Cum se gestionează o întrerupere? 1. Identificarea sursei: - Când apare o întrerupere, CPU-ul trebuie să afle de unde provine. Acest lucru se face cu ajutorul unor semnale numite \"flag-uri\" (semnalizatoare). 2. Determinarea ordinii de servire: - Dacă apar mai multe întreruperi în același timp, CPU-ul trebuie să decidă care să fie gestionată primul. Acest lucru se face folosind un vector de întreruperi, care este o listă de priorități. Bitul 7 din SREG - SREG este un registru special în microcontrolere care controlează diferite setări și stări ale sistemului. - Bitul 7 din acest registru este folosit pentru a activa sau dezactiva sistemul de întreruperi. Cum funcționează? 1. Activarea întreruperilor: - Dacă bitul 7 (I) din SREG este setat la 1 (**SREG.7 = 1**), atunci sistemul de întreruperi este activat. Acest lucru se face cu instrucțiunea **SEI** (Set Interrupts). - Asta înseamnă că microcontrollerul este pregătit să răspundă la întreruperi. 2. Dezactivarea întreruperilor: - Dacă bitul 7 (I) din SREG este setat la 0 (**SREG.7 = 0**), atunci sistemul de întreruperi este dezactivat. Acest lucru se face cu instrucțiunea **CLI** (Clear Interrupts). - Asta înseamnă că microcontrollerul nu va răspunde la întreruperi. Cum se gestionează o întrerupere? 1. Bitul individual de validare: - Fiecare întrerupere are un bit individual care trebuie setat pentru a activa acea întrerupere specifică. 2. Condițiile de întrerupere: - Dacă bitul I (bitul 7 din SREG) și bitul individual de validare sunt ambele setați, atunci condițiile pentru întrerupere sunt îndeplinite. - Când o întrerupere este activată, programul curent este întrerupt, și se execută o subrutină specifică pentru acea întrerupere. 3. Înapoi la programul principal: - După ce subrutina de întrerupere a fost executată, procesorul se întoarce la programul principal. - În unele cazuri, procesorul poate intra într-un mod de economisire a energiei (de exemplu, modul sleep) după ce a gestionat întreruperea. Exemplu simplu: Imaginează-ți că ai un alarma la casă. Alarma are un buton de activare/dezactivare (bitul 7 din SREG). - Dacă butonul este activat (**SEI**), alarma este pregătită să sună dacă cineva intră (întrerupere). - Dacă butonul este dezactivat (**CLI**), alarma nu va sună chiar dacă cineva intră. Bitul 7 din SREG - SREG este un registru special în microcontrolere care controlează diferite setări și stări ale sistemului. - Bitul 7 (I) din acest registru este folosit pentru a controla executarea întreruperilor. Cum funcționează? 1. Executarea unei întreruperi: - Când o întrerupere este activată, bitul I din SREG este setat automat la 0. Asta înseamnă că alte întreruperi nu pot fi servite până când întreruperea curentă nu a fost finalizată. - Asta se întâmplă pentru a evita situațiile în care mai multe întreruperi ar putea interfera una cu alta. 2. Rutina de Servire a Întreruperii (ISR): - Odată ce o întrerupere este activată (prin apelul **SEI**), se execută o rutină specială numită Rutină de Servire a Întreruperii (ISR). - În timpul executării acestei rutine, alte întreruperi pot fi imbricate (nested interrupts), dar acest lucru depinde de setările specifice ale sistemului. Executarea unei subrutine de întrerupere: - Când o subrutină de întrerupere este executată, ea trebuie să salveze starea curentă a programului principal. - Registrul SREG trebuie salvat în corpul subrutinei, iar la finalul subrutinei, se execută instrucțiunea **RETI** pentru a reveni la programul principal și pentru a restaura starea registrului SREG. Exemplu simplu: Imaginează-ți că ești la o petrecere și sună telefonul (Întrerupere 1). Tu oprești conversația (programul principal) și răspunzi la telefon. După ce ai terminat apelul, te întorci la conversație. Dacă sună telefonul din nou (Întrerupere 2) în timp ce ești la telefon, trebuie să decizi cum să gestionezi ambele apeluri. 1. ând o întrerupere este generată, urmează un proces specific pentru a gestiona acea întrerupere. Iată pașii principali: 2. Tratarea unei întreruperi: - Dispozitivul periferic generează cererea de întrerupere: Un dispozitiv, cum ar fi o tastatură sau un senzor, generează un semnal de întrerupere. - Se finalizează executia instrucțiunii curente: Procesorul termină executarea instrucțiunii pe care o executa în momentul în care a primit întreruperea. - Contorul programului (Program Counter) se salvează pe stivă (Stack): Adresa următoarei instrucțiuni care trebuie executată este salvată pe stivă. Aceasta se face pentru a putea reveni la programul principal după ce întreruperea a fost gestionată. - **PC = PC - 2** - Se accesează adresa vectorului specific tipului de întrerupere: Procesorul accesează o tabelă de vectori de întreruperi pentru a determina adresa subrutinei de întrerupere care trebuie executată. - Executia saltului la Procedura de Tratare a Întreruperii (Interrupt Service Routine-ISR): Procesorul sare la adresa subrutinei de întrerupere. - Blocarea flag-urilor întreruperi -- CLI: Întreruperile sunt blocate pentru a evita alte întreruperi în timp ce una este în curs de gestionare. - Executia ISR: Subrutina de întrerupere este executată. Aceasta conține codul specific pentru gestionarea evenimentului care a generat întreruperea. - Revenirea din ISR -- RETI: După ce subrutina de întrerupere a fost executată, procesorul revine la programul principal. - **PC = PC + 2** - Activarea flag-urilor întreruperi -- SEI: Întreruperile sunt reactivațate, permițând gestionarea altor întreruperi. - Continuarea executiei programului principal: Procesorul continuă executarea programului principal de la locul în care a fost întrerupt. Ce este o întrerupere externă? O întrerupere externă este un semnal care poate fi generat de un dispozitiv extern conectat la un pin al microcontrolerului. Când acest semnal este detectat, microcontrolerul întrerupe execuția programului principal și execută o rutină specială de întrerupere. Tipuri de întreruperi externe Microcontrolerele AVR, cum ar fi ATMega328, pot avea mai multe întreruperi externe, dar cele mai comune sunt: - INT0 (Pin Change Interrupt 0) - Pinul 7 (PCINT7) - INT1 (Pin Change Interrupt 1) - Pinul 8 (PCINT8) - INT2 (Pin Change Interrupt 2) - Pinul 2 (PCINT2) Cum se activează o întrerupere externă? Pentru a activa o întrerupere externă, trebuie să configurați pinul corespunzător ca intrare și să setați modul de declanșare a întreruperii. Acest lucru se face prin setarea unor regiștri specifici în microcontroler. Cum funcționează? Când un semnal extern este detectat pe pinul configurat (de exemplu, PD7), microcontrolerul întrerupe execuția programului principal și execută rutina de întrerupere **ISR(INT0\_vect)**. După ce rutina de întrerupere este executată, microcontrolerul revine la execuția programului principal. Utilizări practice - Senzori: Detectarea evenimentelor de la senzori, cum ar fi butoane sau senzori de mișcare. - Comunicație: Gestionarea semnalelor de comunicare între dispozitive. - Control: Controlul unor dispozitive externe bazat pe evenimente specifice. Întreruperi externe Se pot seta să fie declanșate de: - Crescător: Când semnalul de la pinul de intrare crește de la nivel scăzut la nivel înalt. - Descrescător: Când semnalul de la pinul de intrare scădează de la nivel înalt la nivel scăzut. - Schimbare de stare: Când orice schimbare de stare a semnalului de la pinul de intrare este detectată. Întreruperi pe nivel - Nivel logic: Întreruperea este declanșată când semnalul de la pinul de intrare este la un anumit nivel logic (de exemplu, nivel înalt sau nivel scăzut).

Use Quizgecko on...
Browser
Browser