Care sunt întreruperile?
Imaginați-vă că vă gătiți, ați plasat apă să fierbeți și să vă lichefiază totul nevoie și să atingeți brusc clopotul casei dvs., vă întrerupeți, atunci funcția dvs. în acel moment va fi să deschideți ușa, să frecventați persoana și să închideți ușa, când terminați, reveniți la bucătărie, dar nu vă întoarceți la Începeți, dar continuați să gătiți de unde ați stat.
O întrerupere este activată, microcontrolerul va înceta să facă ceea ce face pentru a efectua funcția de întrerupere care a fost declarată anterior și apoi reveniți la locul unde a fost stânga.
O întrerupere poate fi văzută ca un avertisment care poate fi activat atât de un procedeu specific al microcontrolerului (capătul conversiei ADC, primirea de date a modulului Eusart, Evorde de Timer etc.) sau printr-o schimbare externă la aceasta (schimbare în unele Port specific, schimbarea unui PIN, etc.).
Pic C Întreruperea compilatorului
pe fila de vizualizare a compilatorului PIC C putem găsi o cutie care spune „întreruperea”, În ea va avea informațiile despre întreruperile pe care le spune microcontrolerul nostru. De exemplu, pentru cazul Miuva (PIC 18F4550) vom găsi următoarea listă:
- anunț: Full ADC Conversie
- Buscol: Bus Collision
- CCP1: Captură sau comparație în unitatea 1
- CCP2: Captură sau comparație în unitatea 2
- comp: Eveniment comparativ
- EEPROM: Scriere completă
- ext: întrerupere externă (RB0)
- ext1: întrerupere externă (RB1)
- ext2: întrerupere externă (RB2)
- Li> LowVolt: Tensiune redusă Detectate
- OSCF: Eroare în sistemul oscilator
- rb: Modificări în portul B (RB4: RB7)
- RDA: Datele primite RS232
- RTCC: Timer0 Overflow (RTCC)
- spp: Port de retransmisie Parall paralel scris / lectură
- SSP: SPI / i2C Activitate
- Tbe: Tampon de transmisie gol RS232
- Timer0: Timer0 Overflow
- Timer1: Flip de la Timer1
- Timer2: Timer2 Overflow
- Timer3: Evorde de Timer 3
- USB: Activitatea USB
Calea de a activa întreruperile este foarte asemănătoare în toate cazurile, trebuie să „avertizăm” compilatorul pe care funcția de a descrie va fi Întreruperea și adăugați ulterior funcția ca și cum ar fi oricare altul. După cum urmează:
„xxxx” trebuie înlocuit cu numele întreruperii de utilizare (o putem găsi în secțiunea de vizualizare – > Întreruperi), de exemplu, pentru a activa funcția de întrerupere externă (RB0), va trebui să înlocuim „ext”. După cum urmează:
#int_EXTvoid ext_isr(){ //Función de interrupción externa (RB0) }}
În cadrul funcției noastre principale, trebuie să activăm întreruperile cu următoarele linii:
enable_interrupts(GLOBAL); //Habilita interrupcionesenable_interrupts(int_XXXX); //Habilita interrupción deseada
în urma întreruperii externe:
enable_interrupts(GLOBAL); //Habilita interrupcionesenable_interrupts(int_EXT); //Habilita interrupción externa (RB0)
De exemplu, următorul cod, în funcția sa principală va crește un 16- Bitul contor și arătând valoarea sa în LCD, dar la momentul activării întreruperii externe (RB0), va investi valoarea unui LED situat pe pinul E0. După inversarea, valoarea LED-ului se va întoarce la programul principal și va continua să se bazeze pe numărul în care a fost.
iv id = „5821902EF3”
Pentru mai multe informații la ce oră activează Fiecare dintre diferitele întreruperi este important să citiți fișa tehnică.
Nivelurile de întrerupere
În multe ocazii, programele noastre trebuie să îndeplinească mai multe sarcini, iar unele pot fi mai importante decât altele, este motivul pentru care lucrăm cu întreruperi, putem declara diferite priorități pentru ele, cu atât mai mare este cea mai importantă prioritate este că sarcina de a fi făcută, atunci dacă o întrerupere prioritară este activată, indiferent de ce face programul nostru (chiar dacă se desfășoară O altă funcție de întrerupere cu prioritate scăzută) va sări la funcția corespunzătoare și apoi va reveni la locul în care a fost.
Pentru a activa nivelurile prioritare în compilatorul PIC C, este necesar să adăugați următoarea linie la începutul codului nostru:
DIV ID = „A673B126C1”>
ulterior Este necesar să se precizeze care dintre întreruperile vom dori să configuram ca o prioritate ridicată, pentru că va trebui să adăugăm „înălțime” după ce declarăm că veți folosi o funcție de întrerupere, după cum urmează:
#int_EXT1 HIGHvoid ext_isr(){ //Función de interrupción de alta prioridad }}
În următorul cod de probă, vom defini două întreruperi, ambele externe, una activată de știftul RB1 și celălalt de PIN-ul RB2, deoarece în conformitate cu fișa tehnică a microcontrolerului, Ambele pot fi configurate atât prioritate ridicată, cât și cu prioritate scăzută. Codul nostru va avea trei contabili independenți, unul va fi crescut în funcția principală, altul când este activată o întrerupere prioritară scăzută, iar întreruperea prioritară este activată. Acest lucru va servi că utilizatorul coroborează funcționarea Niveluri, deoarece valoarea celor 3 contoare va fi afișată în LCD.
Când întreruperile nu sunt activate, valoarea, dacă întreruperea prioritară scăzută este activată (RB2) va înceta să crească valoarea Contor principal și va crește valoarea contorului de funcții cu prioritate scăzută până la atingerea a 10000 sau până când este activată întreruperea cu prioritate ridicată, care va porni propriul contor până când ajunge la 10000.
Se poate observa că nu există nimic Acest lucru poate întrerupe funcția de prioritate ridicată, prin urmare, va fi posibilă la lăsarea acelei funcții până când contorul ajunge la valoarea definită (10000). Spre deosebire de funcția de prioritate scăzută care poate fi întreruptă de mare. Și spre deosebire de funcția principală care poate fi întreruptă cu prioritate scăzută sau înaltă.
DIV id = „F27F4C973”>