TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Emil_98 en 28 de Abril de 2020, 17:57:27

Título: No se como configurar el void interrupt
Publicado 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

Código: [Seleccionar]
#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
Título: Re:No se como configurar el void interrupt
Publicado por: esperanzachat en 28 de Abril de 2020, 19:47:01
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);