Frecuencimetro y pantalla lcd con pic

Pues quita los delay
Modifiqué el código, retiré los delay y sigue sin darme de forma correcta la frecuencia.
C:
#include "Basic4550.h"

#define _XTAL_FREQ 48000000 // Reloj CPU

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include "LCD-1.h"

// Variables globales
char buffer[16] = "";    // Buffer de texto
unsigned long pulseCount = 0;
unsigned long freq = 0;
unsigned long timer0InterruptCount = 0;

void config_ptos(void);
void config_timers(void);

// Configuración de interrupciones
void __interrupt() isr()
{
    // Si se generó una interrupción por Timer0
    if (INTCONbits.TMR0IF)
    {
        timer0InterruptCount++;  // Incrementar el contador de interrupciones del Timer0

        // Borrar la bandera de interrupción y resetear Timer0
        INTCONbits.TMR0IF = 0;
        TMR0 = 61;  // Valor inicial para generar una interrupción cada 1 ms
    }

    // Si se generó una interrupción por Timer1
    if (PIR1bits.TMR1IF)
    {
        pulseCount++;  // Incrementar el contador de pulsos del Timer1

        // Borrar la bandera de interrupción y resetear Timer1
        PIR1bits.TMR1IF = 0;
        TMR1 = 0;
    }
}

void main(void)
{
    config_ptos();
    config_timers();
    lcd_init();
    lcd_cmd(_LCD_CURSOR_OFF);  // Apagar cursor

    while (1)
    {
        // Calcular frecuencia
        freq = pulseCount * (1000 / timer0InterruptCount);  // Multiplicar el número de pulsos por el tiempo de interrupción del Timer0 en microsegundos

        // Imprimir la cantidad de pulsos en el buffer del LCD:
        sprintf(buffer, "Pulsos: %lu", pulseCount);

        // Imprimir en la primera fila:
        lcd_out(1, 1, buffer);

        // Mostrar frecuencia en la segunda fila del LCD
        sprintf(buffer, "Frec: %lu Hz", freq);
        lcd_out(2, 1, buffer);
    }
}

void config_ptos(void)
{
    TRISD = 0x00;

    TRISA = 0xFF;
    LATA = 0x00;
    PORTA = 0x00;

    TRISB = 0b00000000;

    LATB = 0x00;
    PORTB = 0x00;

    PORTD = 0x00;
    LATD = 0x00;
    PORTCbits.RC0 = 0;
    LATCbits.LC0 = 0;
}

void config_timers(void)
{
    // Configurar Timer0
    T0CON = 0b10000011;   // Timer0 encendido, modo de 16 bits, incremento en transición de bajo a alto, prescaler 1:16
    INTCONbits.TMR0IE = 1;   // Habilitar la interrupción por Timer0

    // Configurar Timer1
    T1CON = 0b00000001;   // Timer1 encendido, incremento en transición de bajo a alto, prescaler 1:1
    PIE1bits.TMR1IE = 1;   // Habilitar la interrupción por Timer1

    // Configurar interrupciones
    INTCONbits.PEIE = 1;    // Habilitar interrupciones periféricas
    INTCONbits.GIE = 1;     // Habilitar interrupciones globales
}
 

Adjuntos

  • 1.PNG
    1.PNG
    77.3 KB · Visitas: 6
Última edición por un moderador:
Estimado Haret. En tu programa veo dos errores que hacen que tus resultados no tengan mucha precisión.

1) Usando el temporizador 0 como base de tiempo con una carga de 61, preescalador de 1:16 a 48MHz no consigues un tiempo de 1ms, así que tu base de tiempo no está bien.

2) Al habilitar la interrupción del temporizador 1 y usarlo como contador de pulsos no es una buena idea y está mal configurado. ya que según su configuración no está contando los pulsos externos.
adjunto una nota de aplicacion de microchip donde esta el programa de un frecuencimetro de
50 mhz en ensamblador, espero que alguien que sepa ensamblador explique un poco como funciona para hacerlo en c18 para un pic182525 que es el que tengo.

El documento que propone el usuario plantea un buen método para la elaboración de frecuencímetro.
 
Última edición:
Atrás
Arriba