ProjetoII-77_2

Exemplo de interrupção externa sensível a borda de subida ou de descida.

Posted on Posted in Eletrônica, Microcontroladores, Tutorial

Exemplo de interrupção externa (INT_EXT) sensível a borda de subida ou de descida

Neste exemplo mostramos o tratamento de interrupção externa para o PIC16F628A que pode ser configurado como sensível a borda de subida ou de descida.

A habilitação de  interrupções é feita pelo seguinte comando:

enable_interrupts(GLOBAL | INT_EXT); // Habilita interrupção Global e Int_Ext

onde temos GLOBAL habilitação geralde interrupções e INT_EXT habilitação da interrupção externa.

Logo após podemos habilitar qual o tipo de borda a interrupção poderá responder se por borda de subida ou por borda de descida.

ext_int_edge(L_TO_H);      // Int_Ext sensível a borda de subida
ext_int_edge(H_TO_L);      // Int_Ext sensível a borda de descida

Estes dois comandos alteram amenira como são detectados os eventos da Interrupção Externa com relação à borda.

Bordas de sinal

Onde temos:

  • Rising-edge: Borda de Subida;
  • Falling-edge: Borda de Descida.

Abaixo temos um exemplo de código que aproveita esse recurso simulado em Proteus 7.7 SP2 e serve de base para outros projetos que podem ser adaptados deste código.

Esquema elétrico do circuito  de teste de borda de interrupção

Esquema elétrico para teste de borda de interrupção

O código fonte para este exemplo é este  que segue.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/* Código de exemplo de Interrupção Externa sensível a borda de subida  *
 * ou de descida. Para ser compilada com o PICC-CCS                     *
 * Autor: Nelson Camilo de Almeida                                      *
 * www.pictronics.com.br                                                *
 * Data 02/02/2011                                                      */
 
#include "main628a.h"
 
#int_EXT                   // Habilita interrupção externa
void  EXT_isr(void)        // Trata interrupção externa
{
   output_high (pin_b7);   // Acende LED para demonstrar
   delay_ms    (250);      // que houve interrupção
   output_low  (pin_b7);   // após 250 ms apaga LED
}
 
void main()
{
 
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(GLOBAL|INT_EXT); // Habilita interrupção Global e Int_Ext
 
   ext_int_edge(L_TO_H);      // Int_Ext sensível a borda de subida
   //ext_int_edge(H_TO_L);      // Int_Ext sensível a borda de descida
 
 
   while (true);              // Aguarda por uma interrupção
}

O código fonte completo e o circuito para este exemplo podem ser baixados aqui.

Deixe uma resposta

O seu endereço de e-mail não será publicado.