Hola a todos. Tengo un problema con la interrupción externa por RB0. Lo que quiero realizar es que cuando se termine de ejecutar la interrupción por RB0 la misma sea deshabilitada, y luego habilitarla cuando yo lo desea. Lo que hice fue poner al final de la rutina de la interrupcion la instrución para desabilitarla, pero funciona muy mal.. la pila de desborda y no entiendo por que.. no puedo descubrir por que hace eso...
#include <16f882.h>
#device adc=10
#fuses xt,MCLR,nowdt,noput,nobrownout,nolvp,noprotect
#use delay(clock=4000000)
#use STANDARD_IO(B)
int16 TFB; // Tiempo flanco de bajada
float AP,AP1; // Valor final del ancho de pulso
int nuevopulso=0; // Entra otro pulso
int cambio=0; // Cambio de flanco de disparo
#define _FLEX_LCD
#define LCD_DB4 PIN_C0
#define LCD_DB5 PIN_C1
#define LCD_DB6 PIN_C2
#define LCD_DB7 PIN_C3
#define LCD_RS PIN_C4
#define LCD_RW PIN_C5
#define LCD_E PIN_C6
#include "flex_lcd.c"
#int_ext
void funcion_ext_int(){ //Función Interrupción
if(cambio==0){ // Flanco de Subida
set_timer1(0); //Inicializa TMR1
// ext_int_edge(0,H_TO_L); // Configurar para flanco bajada
cambio=1; // Control de cambio de flanco
} else { // Flanco de Bajada
TFB=get_timer1(); //Valor del Timer1 para el Flanco de bajada
ext_int_edge(0,L_TO_H); //Configurar para flanco subida
cambio=0; //Control de cambio de flanco
if(nuevopulso==0){ //Fin de pulso...
nuevopulso=1; //Pulso a calcular
disable_interrupts(int_ext);
}
}
}
void main() {
lcd_init();
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); // Configuración TIMER1
ext_int_edge(0,L_TO_H); // Configurar para flanco subida
cambio = 0; // Control de cambio de flanco
enable_interrupts(int_ext); //Habilitación interrupción RB0
enable_interrupts(global); //Habilitación general
do {
if(nuevopulso==1){ // ¿Pulso nuevo?
AP = (TFB*0.000001); // Ancho de pulso en microsegundos de Timer1…
// a 4MHZ el T=1us*Timer1
AP1= 1/AP;
printf(lcd_putc,"\f%4.0f ", AP1); //Visualiza medida en LCD
nuevopulso=0; //Pulso medido
ext_int_edge(0,L_TO_H);
enable_interrupts(int_ext);
}