Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
Miren estro esta en un tema que Hizo rash yo aproveche y subi un frecuencimetro pruebenlo:
https://www.forosdeelectronica.com/...nado-electronico-19782-post530512/#post530512
El programa se ese frecuencimetro está en el libro microcontroladores de cekit.
Frecuencimetro del libro de microcontroladores cekit
#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 / timer0InterruptCount; // Dividir el número de pulsos por el tiempo de interrupción del Timer0
// 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", 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
}
Soy extremadamente novato en dicho tema, por eso mismo estoy buscando la ayudaJajajajajaja y más ja.
Debes saber que los delay están prohibidos en interrupciones.