Trato de utilizar el Timer 1 del Pic18f887 para medir frecuencias por el método de flanco de subida, cuando compilo no me marca error, pero a la hora de ejecutar, no me marca la frecuencia. Quise ver si era problema de la función interrupt por lo que si se ejecuta esta, debería cambiar el estado de un led, pero, parece que no funciona la función interrupt.
Adjunto mi programa
#define _XTAL_FREQ 8000000
#include <xc.h>
#include "Pantalla.h"
#include "Setup.h"
#include <stdio.h>
#include <stdlib.h>
void config();
unsigned int conteo=0;
char bandera=0;
float frequencia;
void config(void){
OSCCONbits.IRCF=0b110;
ANSEL=0;
ANSELH=0;
TRISBbits.TRISB0=1;
TRISBbits.TRISB1=0;
TRISD=0x00;
//LCD
LCD_Init();
INTCON=0b1000000;
T1CON=0; //Almacenar Ancho de Pulso
//Configurando Preescaler a 1
T1CONbits.T1CKPS0=0;
T1CONbits.T1CKPS0=0;
//Limpiando Timer
TMR1L=0;
TMR1H=0;
//Pausando Timer
T1CONbits.TMR1ON=0;
//Flanco de Subida
OPTION_REGbits.INTEDG=1;
//Limpiando Bandera
INTCONbits.INTF=0;
//Habilitando Interrupción
INTCONbits.INTE=1;
//Habilitando Interrupción
INTCONbits.GIE=1;
}
void main(void)
{
config();
char buffer [20];
LCD_Clear();
while(1)
{
LCD_XY(1,1);
LCD_Cadena("Frequencia");
if (bandera==0){
frequencia=0;
}
else {
frequencia=8*1e6/(conteo*4.0);
}
sprintf(buffer, "%1.1f Hz",frequencia);
LCD_XY(2,1);
LCD_Cadena(buffer);
}
return;
}
void __interrupt() isr(void) {
if(INTCONbits.INTF==1){
conteo=(TMR1H<<8)|TMR1L;
bandera=1;
TMR1H=0;
TMR1L=0;
T1CONbits.TMR1ON=1;
}
INTCONbits.INTF=0;
PORTBbits.RB1+=1; //Si se ejecuta esta instrucción debería prender y apagar un led
}
Cuando lo ejecuto en proteus, no me marca la frecuencia y no me cambia el estado de un led en RB1
Este código es una calca de otro que encontré en Youtube