- Materials necessaris:
- Què són les interrupcions i on utilitzar-les:
- Diagrama del circuit i explicació:
- Simulació d'interrupcions en el microcontrolador PIC:
- Explicació del codi:
- Funcionament de PIC16F877A Interrupcions:
En aquest tutorial aprendrem com utilitzar una interrupció externa al microcontrolador PIC i per què / on els necessitarem. Aquesta és una part de la seqüència de tutorials PIC en què vam començar a aprendre microcontroladors PIC des de zero; per tant, aquest tutorial suposa que esteu familiaritzat amb la manera de programar un MCU PIC mitjançant MPLABX i la manera d'interfocar una pantalla LCD amb PIC. En cas contrari, torneu als seus respectius enllaços i llegiu-los a continuació, ja que saltaré la major part de la informació que ja s’hi tractava.
Materials necessaris:
- PIC16F877A Tauler de perfils
- Pantalla LCD de 16x2
- Polsador
- Connexió de cables
- Taula de pa
- PicKit 3
Què són les interrupcions i on utilitzar-les:
Abans d’ explicar com programar les interrupcions del microcontrolador PIC, entenem què és realment una interrupció i on hauríem d’utilitzar-les. A més, hi ha molts tipus d’interrupcions al microcontrolador i PIC16F877A en té aproximadament 15. No els confonguem ara per ara a tots.
Tan! què és una interrupció als microcontroladors?
Com tots sabem, els microcontroladors s’utilitzen per realitzar un conjunt d’actius predefinits (programats) que activen les sortides necessàries en funció de l’entrada. Però, mentre el microcontrolador està ocupat amb l’execució d’un fragment de codi, és possible que hi hagi una situació d’emergència en què un altre fragment del vostre codi necessiti atenció immediata. Aquest altre fragment de codi que necessita atenció immediata s’ha de tractar com una interrupció.
Per exemple: considerem que esteu jugant al vostre joc favorit al mòbil i que el controlador (suposat) que hi ha al telèfon està ocupat llançant tots els gràfics necessaris perquè gaudiu del joc. Però, de sobte, la teva xicota truca al teu número. Ara, el pitjor que passa és que el controlador de mòbils descarta les trucades de les vostres amigues, ja que esteu ocupat jugant a un joc. Per evitar que es produeixi aquest malson, fem servir una cosa que s’anomena interrupcions.
Aquestes interrupcions sempre seran una llista activa perquè es produeixin algunes accions concretes i, quan es produeixin, executen un tros de codi i després tornen a la funció normal. Aquest fragment de codi s’anomena rutina de servei d’interrupció (ISR). Un projecte pràctic en què la interrupció és obligatòria és "Circuit de velocímetre digital i comptaquilòmetres amb microcontrolador PIC"
Als microcontroladors hi ha dos tipus principals d’interrupcions. Són interrupció externa i interrupció interna. Les interrupcions internes es produeixen a l'interior del microcontrolador per realitzar una tasca, per exemple, les interrupcions del temporitzador, les interrupcions ADC, etc. Aquestes interrupcions són activades pel programari per completar l'operació del temporitzador o l'operació ADC respectivament.
La interrupció externa és la que pot activar l'usuari. En aquest programa aprendrem a utilitzar una interrupció externa mitjançant un botó polsador per activar una interrupció. Utilitzarem una pantalla LCD per mostrar números que augmentin de 0 a 1000 i, quan s’activi una interrupció, hauríem de notificar-ho des de la ISR de rutina de servei d’interrupció i després continuar incrementant els números.
Diagrama del circuit i explicació:

El diagrama de circuits per utilitzar interrupcions PIC16F877 es dóna a la imatge anterior. Simplement heu de connectar la pantalla LCD al PIC, tal com vam fer al tutorial de pantalla LCD.
Ara per connectar el pin d'interrupció, hauríem de mirar el full de dades per saber quin pin del PIC s'utilitza per a la interrupció externa. En el nostre cas i n PIC16F877A el 33 rd pin RBO / INT s'utilitza per a la interrupció externa. No podeu utilitzar cap altre pin que no sigui aquest pin. La connexió Pin d’aquest diagrama de circuits es mostra a la taula següent.
|
S. No: |
Número de pin |
Nom del pin |
Connectat a |
|
1 |
21 |
RD2 |
RS de LCD |
|
2 |
22 |
RD3 |
E de pantalla LCD |
|
3 |
27 |
RD4 |
D4 de pantalla LCD |
|
4 |
28 |
RD5 |
D5 de pantalla LCD |
|
5 |
29 |
RD6 |
D6 de pantalla LCD |
|
6 |
30 |
RD7 |
D7 de pantalla LCD |
|
7 |
33 |
RBO / INT |
Polsador |
Hem habilitat resistències internes de pujada al PORT B, per tant, podem connectar directament el pin RB0 a terra mitjançant un botó polsador. Per tant, sempre que aquest pin baixi, es produirà una interrupció.
Les connexions es poden fer en un tauler de pa com es mostra a continuació.

Si heu seguit els nostres tutorials, hauríeu d’estar familiaritzats amb aquest Perf Board que he utilitzat aquí. Si no, no cal pensar-hi gaire, només cal que seguiu el diagrama del circuit i que les coses funcionin.
Simulació d'interrupcions en el microcontrolador PIC:
La simulació d’aquest projecte es fa mitjançant Proteus.

Quan simulis el projecte, hauries de veure una seqüència de números que s’incrementen a la pantalla LCD. Això passa dins del bucle principal i, sempre que es prem el botó, la pantalla LCD hauria de mostrar que ha entrat a ISR. Podeu fer les vostres modificacions al codi i provar-lo aquí.
Explicació del codi:
El codi complet d’aquest projecte es troba al final d’aquest tutorial. No obstant això, el programa es divideix en trossos importants i s'explica a continuació per a una millor comprensió.
Com tots els programes, hem de començar el codi definint la configuració dels pins que fem servir al nostre programa. Aquí també hem de definir que estem utilitzant RB0 / INT com a pin d'interrupció extern i no com a pin d'entrada o sortida. El sota de la línia de codi permet a la resistència pull-up interna a PORTB fent que el 7 èsim bit com 0.
OPTION_REG = 0b00000000;

A continuació, activem les interrupcions globals / perifèriques i declarem que estem utilitzant RB0 com a pin d'interrupció extern.
GIE = 1; // Activa la interrupció global PEIE = 1; // Activeu la interrupció perifèrica INTE = 1; // Activeu RB0 com a pin d'interrupció extern
Una vegada que el pin RB0 es defineix com un pin d'interrupció extern, cada vegada que es baixa, la bandera d'interrupció externa INTF es convertirà en 1 i s'executarà el codi dins de la funció d'interrupció del buit, ja que es cridarà la rutina de servei d'interrupció (ISR).
void interrupt ISR_example () {if (INTF == 1) // Interrupció externa detectada {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("ISR introduït"); INTF = 0; // esborreu el senyal d'interrupció després de fer-ho __delay_ms (2000); Lcd_Clear (); }}
Com podeu veure, he anomenat la funció d'interrupció com a ISR_exemple. Podeu anomenar-lo segons el vostre desig. Dins de la funció d'interrupció comprovarem si el senyalador INTF és alt i realitzarem les accions necessàries. És molt important esborrar el senyal d'interrupció un cop hàgiu acabat la rutina. Només llavors el programa tornarà a la funció principal nul·la. Aquesta compensació s’ha de fer mitjançant un programari que utilitza la línia
INTF = 0; // esborreu el senyal d'interrupció després de fer-ho
Dins de la funció principal, només incrementem un número per cada 500 ms i el mostrem a la pantalla LCD. No tenim cap línia específica per comprovar l'estat del pin RB0. La interrupció sempre es mantindrà activa i, sempre que es prem el botó, saltarà del buit principal i executarà les línies de la ISR.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Interior del bucle principal"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Número:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __delay_ms (500); número ++;
Funcionament de PIC16F877A Interrupcions:
Un cop hàgiu entès el funcionament de la interrupció, podeu provar-ho al maquinari i jugar al voltant. Aquest programa que es presenta aquí és un exemple molt bàsic d’interrupció externa on només canvia la visualització de la pantalla LCD quan es detecta una interrupció.

El funcionament complet del projecte es troba al vídeo que es mostra a continuació. Espero que entengueu les interrupcions i on / com utilitzar-les. Si teniu dubtes, podeu contactar-me a través dels fòrums o a través de la secció de comentaris.
