Usando interrupcións de compiladores PIC C

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 – interrupcións), por exemplo, para activar a función de interrupción externa (RB0), teremos que substituír a “ext”. Seguindo o seguinte:

#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.

Deixa unha resposta

O teu enderezo electrónico non se publicará Os campos obrigatorios están marcados con *