Cales son as interrupcións?
Imaxina que está cociñando, colocou auga para ferver e licuar todo Necesidade e de súpeto tocar a campá da súa casa, están interrompendo vostede, entón a súa función nese momento será abrir a porta, asistir á persoa e pechar a porta, cando remate, volva a cociñar, pero non volva a Comezar, pero continúa a cociñar desde onde se atopou.
Activada unha interrupción, o microcontrolador deixará de facer o que está facendo para realizar a función de interrupción previamente declarada e despois volver a onde fora esquerda.
Unha interrupción pode verse como unha advertencia que pode ser activada por un proceso específico do microcontrolador (fin de conversión do ADC, a recepción de datos do módulo de Eusart, Evorde de Timer, etc.) ou por un cambio externo a el (cambio nalgúns Porto específico, cambio dun pin, etc.).
interrupcións compiladoras PIC C
Na páxina Vista do compilador PIC C podemos atopar unha caixa que di “interrompe”, En Ela terá a información das interrupcións que o noso microcontrolador conta. Por exemplo, para o caso de MIUVA (PIC 18F4550) atoparemos a seguinte lista:
- AD: Conversión completa de ADC
- Buscol: colisión de autobús
- ccp1: captura ou comparación na unidade 1
- CCP2: captura ou comparación na unidade 2
- comp: evento de comparación
- EEPROM: escrita completa
- ext: interrupción externa (RB0)
- ext1: interrupción externa (RB1)
- Ext2: interrupción externa (RB2)
- Lowvolt: baixa tensión detectado
- OSCF: Fallo no sistema oscilador
- RB: Cambios no porto B (RB4: RB7)
- RDA: Datos recibidos dispoñibles RS232
- RTCC: Timer0 Overflow (RTCC)
- spp: Retransmission Port Notel Writing / Reading
- SSP: SPI / I2C Actividade
- TBE: buffer de transmisión baleira RS232
- Timer0: Timer0 Overflow
- Timer1: Flip de Timer1
- Timer2: Timer2 Overflow
- Timer3: Evorde de temporizador 3
- USB: actividade USB
A forma de activar as interrupcións é moi similar en todos os casos, temos que “avisar” o compilador que a función de describir será Interrupción e posteriormente engade a función coma se fose outro. A partir do seguinte xeito:
O “xxxx” debe ser substituído polo nome da interrupción para usar (podemos atopalo na sección de vista –
#int_EXTvoid ext_isr(){ //Función de interrupción externa (RB0) }}
Dentro da nosa función principal, temos que activar as interrupcións coas seguintes liñas:
enable_interrupts(GLOBAL); //Habilita interrupcionesenable_interrupts(int_XXXX); //Habilita interrupción deseada
Seguindo o caso de interrupción externa:
enable_interrupts(GLOBAL); //Habilita interrupcionesenable_interrupts(int_EXT); //Habilita interrupción externa (RB0)
Por exemplo, o seguinte código, na súa función principal vai aumentar un 16- Counter e mostrando o seu valor no LCD, pero no momento en que a interrupción externa (RB0) está activada, investirá o valor dun LED situado no PIN E0. Despois de revertir o valor do LED volverá ao programa principal e continuará contando co número no que era.
#include <18f4550.h> // la librería del PIC#Fuses HSPLL, NOWDT, NOPROTECT, NOLVP, NODEBUG, USBDIV, PLL2, CPUDIV1, VREGEN#use delay (clock=48M) //Seleccionamos la frecuencia de reloj de 48MHz#use standard_io(b)#use standard_io(e)#include "MLCD.c"int16 contador = 0; #int_EXTvoid ext_isr(){ output_toggle(PIN_E0);}void main(){ lcd_init(); set_tris_b(0xFF); //Puerto b como entrada set_tris_e(0x00); //Puerto e como salida output_e(0x07); //Apaga led rgb enable_interrupts(GLOBAL); //Habilita interrupciones enable_interrupts(int_EXT); //Habilita interrupcion externa while(true){ contador++; printf(lcd_putc, "Cont = %5lu", contador); }}
Para obter máis información en que momento se active Cada unha das diferentes interrupcións é importante ler a folla de datos.
Niveis de interrupción
En moitas ocasións os nosos programas necesitan realizar varias tarefas e algúns poden ser máis importantes que outros, iso É por iso que cando traballamos con interrupcións, podemos declarar diferentes prioridades para eles, canto maior sexa a súa prioridade máis importante é a tarefa a facer, entón se unha interrupción de alta prioridade está activada, non importa o que está a facer o noso programa (aínda que estea a realizar Outra función de interrupción de baixa prioridade saltará á función correspondente e despois voltará a onde estaba.
Para activar os niveis de prioridade no compilador PIC C é necesario engadir a seguinte liña ao comezo do noso código:
#device HIGH_INTS=TRUE //Activamos niveles de prioridad
Posteriormente É necesario especificar cal das interrupcións que queremos configurar como alta prioridade, por iso, teremos que engadir “alto” despois de declarar que estará usando unha función de interrupción, do seguinte xeito:
#int_EXT1 HIGHvoid ext_isr(){ //Función de interrupción de alta prioridad }}
No seguinte código de mostra, definiremos dúas interrupcións, tanto externas, activadas polo PIN RB1 como o outro polo PIN RB2, xa que segundo a folla de datos do microcontrolador, ambos poden ser configurados a alta e baixa prioridade. O noso código terá tres contadores independentes, aumentará na función principal, outra cando se activa unha interrupción de baixa prioridade e a interrupción de alta prioridade está activada. Isto servirá para que o usuario corrobora o funcionamento do Niveis, xa que o valor dos 3 contadores mostrarase no LCD.
Cando as interrupcións non están activadas, o valor de, se a interrupción de baixa prioridade está activada (RB2) deixará de aumentar o valor da Contador principal e aumentará o valor do contador de función de baixa prioridade ata alcanzar os 10000 ou ata que se active a interrupción de alta prioridade que iniciará o seu propio contador ata que chegue a 10000.
Pódese notar que non hai nada Isto pode interromper a función de alta prioridade, polo tanto, só será posible deixar esa función ata que o contador alcance o valor definido (10000). A diferenza da función de baixa prioridade que pode ser pausada por alto. E a diferenza da función principal que pode ser pausada por prioridade baixa ou alta.