Usando interrupções do compilador PIC

Quais são as interrupções?

Imagine que você está cozinhando, você colocou água para ferver e liqueva tudo o que você Precisa e de repente tocar na campainha da sua casa, estão interrompendo você, então sua função naquele momento será abrir a porta, assistir a pessoa e fechar a porta, quando terminar, volte para cozinhar, mas não volte para Comece, mas você continua cozinhando de onde você ficou.

Uma interrupção é ativada, o microcontrolador vai parar de fazer o que ele está fazendo para realizar a função de interrupção que foi declarada anteriormente e, em seguida, retornar para onde estava esquerda.

Uma interrupção pode ser vista como um aviso que pode ser ativado por um processo específico do microcontrolador (final da conversão do ADC, recepção de dados do Módulo EUSAt, Evorde de Temporizador, etc) ou por uma mudança externa para ela (mudar em alguns Porta específica, mudança de um pino, etc.).

interrupção do compilador PIC C

Na guia Exibir do compilador PIC, podemos encontrar uma caixa que diz “interrupções”, Em ela terá a informação das interrupções que nosso microcontrolador fala. Por exemplo, para o caso de Miuva (Pic 18F4550), encontraremos a seguinte lista:

    anúncio: Conversão completa do ADC

  • BUSCOL: Colisão de ônibus
  • CCP1: captura ou comparação na unidade 1
  • ccp2: captura ou comparação na unidade 2
  • comp: comparação evento
  • eeprom: redação completa
  • ext: interrupção externa (RB0)
  • ext1: interrupção externa (RB1)
  • ext2: interrupção externa (rb2)
  • lowvolt: baixa tensão detectado
  • oscf: falha no sistema de oscilador
  • rb: alterações na porta B (RB4: RB7)
  • rdA: dados recebidos disponíveis RS232
  • rtcc: timer0 estouro (RTCC)
  • spp: Retransmission porta paralela escrita / leitura
  • ssp: spi / i2c atividade
  • tbe: tampão de transmissão vazio RS232
  • timer0: Timer0 Overflow
  • timer1: flip do timer1
  • timer2: Timer2 Overflow
  • temporizador3: Evorde de temporizador 3
  • USB: atividade USB

A maneira de ativar as interrupções é muito semelhante em todos os casos, temos que “avisar” o compilador que a função para descrever será Interrupção e posteriormente adicionar a função como se fosse qualquer outra. Da seguinte forma:

O “xxxx” deve ser substituído pelo nome que a interrupção usa (podemos encontrá-la na seção de visão – > Interrupts), por exemplo, para ativar a função de interrupção externa (RB0), teremos que substituir “ext”. Após o seguinte:

#int_EXTvoid ext_isr(){ //Función de interrupción externa (RB0) }}

dentro da nossa função principal, temos que ativar interrupções com as seguintes linhas:

enable_interrupts(GLOBAL); //Habilita interrupcionesenable_interrupts(int_XXXX); //Habilita interrupción deseada

Após o caso de interrupção externa:

enable_interrupts(GLOBAL); //Habilita interrupcionesenable_interrupts(int_EXT); //Habilita interrupción externa (RB0)

Por exemplo, o seguinte código, em sua função principal estará aumentando um Contador de bits e mostrando seu valor no LCD, mas no momento em que a interrupção externa (RB0) é ativada, ela investirá o valor de um LED localizado no PIN E0. Depois de reverter, o valor do LED retornará ao programa principal e continuará contando no número no qual foi.

#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 mais informações a que horas ativam Cada uma das diferentes interrupções é importante ler a folha de dados.

Níveis de interrupção

Em muitas ocasiões Nossos programas precisam realizar várias tarefas e alguns podem ser mais importantes que outros, que É por isso que quando trabalhamos com interrupções, podemos declarar prioridades diferentes para eles, maior a sua prioridade mais importante é a tarefa a ser feita, então, se uma alta interrupção prioritária estiver ativada, não importa o que nosso programa está fazendo (mesmo que esteja realizado Outra função de interrupção de baixa prioridade) irá pular para a função correspondente e, em seguida, retornar para onde estava.

Para ativar os níveis de prioridade no compilador PIC C, é necessário adicionar a seguinte linha no início do nosso código:

#device HIGH_INTS=TRUE //Activamos niveles de prioridad

subseqüentemente É necessário especificar quais das interrupções que quereremos configurar como uma alta prioridade, pois isso teremos que adicionar “alta” depois de declarar que você estará usando uma função de interrupção, da seguinte forma:

#int_EXT1 HIGHvoid ext_isr(){ //Función de interrupción de alta prioridad }}

No seguinte código de exemplo, definiremos duas interrupções, ambas externas, uma habilitadas pelo PIN RB1 e outra pelo pino RB2, desde que de acordo com a folha de dados do microcontrolador, Ambos podem ser configurados prioridade alta e baixa. Nosso código terá três contadores independentes, um será aumentado na função principal, outro quando uma interrupção de baixa prioridade é ativada e a interrupção de alta prioridade será ativada. Isso servirá para que o usuário corrobora a operação do Níveis, uma vez que o valor dos 3 contadores será exibido no LCD.

Quando as interrupções não estiverem ativadas, o valor de, se a interrupção de baixa prioridade for ativada (RB2) parará de aumentar o valor do valor do Contador principal e aumentará o valor do contador de funções de baixa prioridade até atingir 10000 ou até que a interrupção de alta prioridade seja ativada, que iniciará seu próprio contador até que ele atinja 10000.

Pode ser notado que não há nada Isso pode interromper a função de alta prioridade, portanto, será possível deixar essa função até que o contador atinja o valor definido (10000). Ao contrário da função da baixa prioridade que pode ser pausada por alta. E ao contrário da função principal que pode ser pausada por baixa ou alta prioridade.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *