- Materiais requisitados:
- O que são interrupções e onde usá-las:
- Diagrama de circuito e explicação:
- Simulação de interrupções no microcontrolador PIC:
- Explicação do código:
- Trabalho de interrupções PIC16F877A:
Neste tutorial, aprenderemos como usar uma interrupção externa no microcontrolador PIC e por que / onde precisaremos deles. Esta é uma parte da sequência de Tutoriais PIC em que começamos a aprender Microcontroladores PIC do zero; portanto, este tutorial presume que você esteja familiarizado com como programar um PIC MCU usando MPLABX e como fazer a interface de um LCD com o PIC. Se não, por favor, volte para seus respectivos links e leia-os através, pois estarei pulando a maioria das informações que já foram abordadas lá.
Materiais requisitados:
- PIC16F877A Perf Board
- Display LCD 16x2
- Botão de apertar
- Fios de conexão
- Tábua de pão
- PicKit 3
O que são interrupções e onde usá-las:
Antes de entrar em como programar interrupções de microcontroladores PIC, vamos entender o que realmente é uma interrupção e onde precisaríamos usá-la. Além disso, existem muitos tipos de interrupções no Microcontrolador e o PIC16F877A tem cerca de 15 deles. Não vamos confundi-los todos em nossa cabeça por enquanto.
Então! o que é uma interrupção em microcontroladores?
Como todos sabemos, microcontroladores são usados para executar um conjunto de ativações pré-definidas (programadas) que acionam as saídas necessárias com base na entrada. Mas, enquanto o seu microcontrolador está ocupado executando uma parte do código, pode haver uma situação de emergência em que outra parte do seu código precisa de atenção imediata. Essa outra parte do código que precisa de atenção imediata deve ser tratada como uma interrupção.
Por exemplo: vamos considerar que você está jogando seu jogo favorito no seu celular e o controlador (suposição) dentro do seu telefone está ocupado jogando todos os gráficos necessários para que você aproveite o jogo. Mas, de repente, sua namorada liga para o seu número. Agora, a pior coisa que pode acontecer é o controle do seu celular negligenciar a ligação de suas namoradas, pois você está ocupado jogando um jogo. Para evitar que esse pesadelo aconteça, usamos algo chamado interrupções.
Essas interrupções sempre serão uma lista ativa para que algumas ações em particular aconteçam e, quando ocorrem, executam um trecho de código e, em seguida, voltam à função normal. Essa parte do código é chamada de rotina de serviço de interrupção (ISR). Um projeto prático em que a interrupção é obrigatória é “Velocímetro digital e circuito de odômetro usando microcontrolador PIC”
Em Microcontroladores, existem dois tipos principais de interrupções. Eles são Interrupção Externa e Interrupção Interna. As interrupções internas ocorrem dentro do microntrolador para realizar uma tarefa, por exemplo, interrupções de temporizador, interrupções de ADC etc. Essas interrupções são acionadas pelo software para completar a operação de temporizador ou operação de ADC respectivamente.
A interrupção externa é aquela que pode ser acionada pelo usuário. Neste programa, aprenderemos como usar uma interrupção externa usando um botão para acionar uma interrupção. Usaremos um LCD para exibir números incrementando de 0 a 1000 e quando uma interrupção for acionada, devemos notificar sobre isso a partir do ISR de rotina de serviço de interrupção e, em seguida, continuar a incrementar os números.
Diagrama de circuito e explicação:
O diagrama de circuito para usar interrupções PIC16F877 é dado na imagem acima. Você simplesmente tem que conectar o LCD ao PIC como fizemos no tutorial de interface do LCD.
Agora, para conectar o pino de interrupção, devemos dar uma olhada no datasheet para saber qual pino do PIC é usado para interrupção externa. No nosso caso i n PIC16F877A a 33 estr pino RBO / INT é utilizada para interrupção externa. Você não pode usar qualquer outro pino que não seja este pino. A conexão do pino para este diagrama de circuito é mostrada na tabela abaixo.
S.No: |
Número do PIN |
Nome do Pin |
Conectado a |
1 |
21 |
RD2 |
RS de LCD |
2 |
22 |
RD3 |
E de LCD |
3 |
27 |
RD4 |
D4 de LCD |
4 |
28 |
RD5 |
D5 de LCD |
5 |
29 |
RD6 |
D6 de LCD |
6 |
30 |
RD7 |
D7 de LCD |
7 |
33 |
RBO / INT |
Botão de apertar |
Habilitamos resistores pull up internos na PORTA B, portanto, podemos conectar diretamente o pino RB0 ao terra por meio de um botão. Portanto, sempre que este pino ficar BAIXO, uma interrupção será acionada.
As conexões podem ser feitas em uma placa de pão conforme mostrado abaixo.
Se você tem seguido nossos tutoriais, deve ter se familiarizado com este Perf Board que usei aqui. Se não, você não precisa pensar muito sobre isso, simplesmente siga o diagrama de circuito e você fará as coisas funcionarem.
Simulação de interrupções no microcontrolador PIC:
A simulação para este projeto é feita usando Proteus.
Ao simular o projeto, você deverá ver uma sequência de números sendo incrementados no visor LCD. Isso acontece dentro do loop principal e sempre que o botão é pressionado, o LCD deve exibir que entrou no ISR. Você pode fazer suas modificações no código e tentar testá-lo aqui.
Explicação do código:
O código completo para este projeto pode ser encontrado no final deste tutorial. No entanto, o programa está dividido em partes importantes e explicadas a seguir para sua melhor compreensão.
Como todos os programas, temos que começar o código definindo a configuração de pinos para os pinos que usamos em nosso programa. Também aqui precisamos definir que estamos usando RB0 / INT como um pino de interrupção externa e não como um pino de entrada ou saída. A linha de código abaixo habilita o resistor pull-up interno na porta B, tornando o 7º bit 0.
OPTION_REG = 0b00000000;
Então habilitamos as interrupções globais / periféricas e declaramos que estamos usando RB0 como um pino de interrupção externa.
GIE = 1; // Habilita interrupção global PEIE = 1; // Habilita a interrupção periférica INTE = 1; // Habilita RB0 como pino de interrupção externa
Uma vez que o pino RB0 é definido como um pino de interrupção externa, cada vez que ele ficar baixo, o sinalizador de interrupção externa INTF se tornará 1 e o código dentro da função de interrupção void será executado, uma vez que a Rotina de Serviço de Interrupção (ISR) será chamada.
void interrupt ISR_example () {if (INTF == 1) // Interrupção externa detectada {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("ISR inserido"); INTF = 0; // limpa o sinalizador de interrupção após terminar __delay_ms (2000); Lcd_Clear (); }}
Como você pode ver, chamei a função de interrupção de ISR_example. Você pode nomeá-lo de acordo com seu desejo. Dentro da função de interrupção, verificaremos se o sinalizador INTF está alto e realizaremos as ações necessárias. É muito importante limpar o sinalizador de interrupção depois de concluir a rotina. Só então o programa retornará à função void principal. Esta limpeza deve ser feita por software usando a linha
INTF = 0; // limpar o sinalizador de interrupção após terminar com ele
Dentro da função principal, apenas incrementamos um número a cada 500 ms e o exibimos na tela LCD. Não temos nenhuma linha específica para verificar o estado do pino RB0. A interrupção sempre permanecerá ativa e sempre que o botão for pressionado, ela sairá do void main e executará as linhas no ISR.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Dentro do Loop 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 ++;
Trabalho de interrupções PIC16F877A:
Depois de entender como a interrupção funciona, você pode experimentá-la no hardware e mexer nela. Este programa fornecido aqui é um exemplo muito básico de interrupção externa onde ele apenas muda a exibição da tela LCD quando uma interrupção é detectada.
O funcionamento completo do projeto pode ser encontrado no vídeo abaixo. Espero que você tenha entendido sobre as interrupções e onde / como usá-las. Se você tiver alguma dúvida, pode entrar em contato comigo pelos fóruns ou pela seção de comentários.