TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Emil_98 en 28 de Abril de 2020, 17:57:27
-
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
-
Lo que pasa es que no habiltaste la interrupcion del pin (interrupcion externa) y no configuraste si queres detectar el flanco de subida o bajada.Algo como esto:
enable_interruption(RB0);
configuracion flanco;////busca cual es la instruccion.
enable_interruption(global);