estoy armando esta fuente con cronometro con pic 16f883 lcd 4x16 funciona pero se tilda por momentos y se vuelve la cuenta lenta, subo el código en c
...
Código:
#include <16f883.h>
#device ADC=10
#use delay (internal = 8MHz)
#define use_portb_lcd true
#fuses NOFCMEN, NOIESO,INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT,
#include <lcd420.c>
#include <Button.c>
#define pulsador pin_c3
int8 horas=0,minutos=0,segundos=0,milisegundos=0;
#INT_TIMER1
void sid_Timer1 (void)
{
set_timer1(0xD8F0); // Recargar el Timer 1 para 10ms. @ 4MHz.
if(++milisegundos > 99) // Incrementar "milisegundos" y Si "milisegundos" es mayor a 59...
{
milisegundos = 0; // Entonces limpiar "milisegundos"
if(++segundos > 59) // Incrementar "segundos" y si "segundos" es mayor a 59...
{
segundos = 0; // Entonces limpiar "segundos"
if(++minutos > 59) // Incrementar "minutos" y si "minutos" es mayor a 59...
{
minutos = 0; // Limpiar "minutos"
if(++horas > 11) // Incrementar "horas" y si "horas" es mayor a 11...
{
horas = 0; // Limpiar "horas", "minutos" y "segundos"
minutos = 0;
segundos = 0;
}
}
}
}
}
void main(){
long int var1=0, var2=0;
float valor,volt,valor2,amper;
int1 flag = 0;
int8 B0 = 0;
int16 contador = 0;
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
setup_adc_ports(sAN0|sAN3);
setup_adc(ADC_CLOCK_INTERNAL );
//Se inicia la LCD
lcd_init();
lcd_gotoxy(2,1);
lcd_putc("Cargando datos");
delay_ms(1000);
lcd_gotoxy(7,2);
lcd_putc("LPK");
delay_ms(500);
lcd_putc("\\f");
lcd_gotoxy(2,1);
lcd_putc("Volt Amper");
delay_ms(1000);
while (true)
{
set_adc_channel(0);
delay_us(20);
volt=0;
for(var1=0;var1<500;var1++)
{
volt=volt+ read_adc();
delay_us(62);
}
valor = volt / 500;
valor = valor * 50 / 1023;
lcd_gotoxy(2,2);
printf(lcd_putc,"%4.1f",valor);
set_adc_channel(3);
delay_us(20);
amper=0;
for(var2=0;var2<500;var2++)
{
amper=amper+ read_adc();
delay_us(62);
}
valor2 = amper / 500;
valor2 = valor2 * 19 / 1023;
lcd_gotoxy(11,2);
printf(lcd_putc,"%4.1f",valor2);
if (button(pulsador,0,255,10,B0,1)) // Si se presiona el pulsador...
{
while(!input(pulsador)) // Mientras esté pulsado...
{
++contador; // Incrementar "contador"
delay_ms(1); // Retardo de 1ms.
if(contador == 3000) // Si "contador" llegó a 3000 (3 segundos)...
{
setup_timer_1(T1_DISABLED); // Deshabilitar Timer1
horas = 0; // Limpiar "horas"
minutos = 0; // Limpiar "minutos"
segundos = 0; // Limpiar "segundos"
milisegundos = 0; // Limpiar "milisegundos"
flag = 1; // Mantener "flag" en 1 (Para que el soltar el pulsador no avance el conteo)
lcd_gotoxy(1,4);
lcd_putc("00:00:00:00"); // Poner en ceros la pantalla.
}
}
contador = 0; // Limpiar "contador"
if(!flag) // Si "flag" = 0...
{
flag = 1; // Poner "flag" en 1 y
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); // Timer1 con sincronización interna y prescaler 1:1
set_timer1(0xD8F0); // Cargar el Timer 1 para 10ms. @ 4MHz.
}
else if(flag) // Pero si "flag" = 1...
{
flag = 0; // Poner "flag" en 0 y
setup_timer_1(T1_DISABLED); // Deshabilitar Timer1
}
}
// Mostrar el tiempo en pantalla.
lcd_gotoxy(1,4);
printf(lcd_putc,"%02u:%02u:%02u:%02u",horas,minutos,segundos,milisegundos);
}
}