Ejemplo  interrupción externa en un pic16f887

Ejemplo interrupción externa en un pic16f887

Escrito Por: admin Publicado En: Fecha de Creación: 2014-08-23 visitas: 5465

Ejemplo  interrupción externa en un pic16f887

Ejemplo  interrupción externa en un pic16f887

Objetivos:

Mostrar como se maneja un interrupcion externa en un pic16f887 por medio de un boton conectado al pin RB0 

 

Introducción:

El manejo de interrupciones es una técnica de programación, basada en un mecanismo automático en el hardware del microcontrolador, que permite dar atención a algún periférico interno o externo, únicamente en el momento en que ésta se requiera. Una interrupción es en realidad una llamada a una subrutina, pero iniciada por el harware del propio periférico y no por la instrucción "CALL". La interrupción puede ocurrir en cualquier instante.

 

Desarrollo

 

En el ejemplo que se muestra es muy sencillo, consiste en generar un interrupcion externe al oprimir un boton conectado a puerto rb0, 

  • Se define un bandera ( por default su valor es 1)
  • Se define la subrutina de interrupcion ( cuando se oprime el boton se comuta el valor de la bandera)
  • En la rutina principal  el led parpadea si la bandera es 1 y si es 0 no lo hace

Diagrama Proteus

 

 

 

Programa en pic c

#include <16F887.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES LP                       //Low power osc < 200 khz
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOWRT                    //Program memory not write protected
#FUSES BORV40                   //Brownout reset at 4.0V
#use delay(clock=8000000)


BYTE blink = 0;    // bandera

#int_rb      //you use the pre-processor command ‘#int_xxxx’, where ‘int_xxxx’ is the individual interrupt you are using, followed by the interrupt handler function.
void button_isr() {  
   delay_ms (20);  //debounce  esperamos 20ms a dejar que se asiente estado del botón antes de que se lea
   if( !input(PIN_B0) && !blink )  // cambia el estado de la bandera de 0 a 1  ( para que empieze a parpadear el led)
      blink = 1;
   else if( !input(PIN_B0) && blink )   // cambia el estado de la bandera de 1 a 0  (para que deje de parpadear el led)
         blink = 0;
}

void main() {
   enable_interrupts(global);   // habilita interrupcion a nivel global
   enable_interrupts(int_rb0);   // habilita interrupcion a nivel individual por cambio en el pin rb0

   ext_int_edge( H_TO_L );   // la interrupcion se genera cuando el pin rbo cambia de un valor alta a un valor bajo

   do {
      if(blink){
         output_high(PIN_D1);
         delay_ms(500);
         output_low(PIN_D1);
         delay_ms(500);
      }
   } while (TRUE);
}