Hola gente, antes que nada me presento, mi nombre es Sebastian y soy nuevo en el foro, como asi tambien en la proframacion de PIC!
Estaba realizando un reloj alarma con el 16f877A pero tengo problemas con la configuracion del timer 1, ya que lo quiero usar con un cristal externo de 32768 para poder hacer una interrupcion precisa de 1 seg.
Ahora bien, en el proteus jamas pude hacerlo funcionar..lei en otros temas que es un problema del proteus que no simula cristales y que se solucionaba con un generador de funciones en la pata 16 (T1OSI) pero a mi esto tampoco me funciono.
Al pasarlo al protoboard si realiza la instruccion pero la temporizacion esta mal echa...mas rapido que un segundo...queria saber si alguien me podria ayudar porque ya estoy perdido.... aca les dejo parte del codigo:
#include <16F877A.h>
#fuses XT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOWDT
#device adc = 10 // seteo del conversor en 8 bits
#use delay(clock=4000000)
#include "flex_lcd.c"
#include "pic16f8xx.h"
void muestra_lcd(void);
void scan_teclado(void);
void setup_tmr1(void);
float temperatura(long val);
signed char hora=0, minuto=0, segundo=0, menu=1;
signed char horaal=0, minutoal=0, segundoal=0;
const long escala = 1024;//factor de escala
const float v_max = 5;// rabgo máximo de la tensión de la escala
float temp;
#INT_TIMER1
void isr_timer1(void)
{
set_timer1(57344);
segundo++;
if(segundo==60)
{
segundo=0;
minuto++;
}
if(minuto==60)
{
minuto=0;
hora++;
}
if(hora==24)
{
hora=0;
}
}
void main(void)
{
long valor;
setup_adc(adc_clock_div_32); //Enciende conversor
setup_adc_ports(AN0); //Selecciona terminales
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_CLK_OUT);
set_timer1(57344);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_8);
set_timer0(168);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
lcd_init();
while(1)
{
set_adc_channel(0); // Selecciona canal
valor=read_adc(); // Conversión AD
temp=temperatura(valor);
muestra_lcd();
scan_teclado();
delay_ms(10);
}
}
ven algo raro???
Bueno desde ya, muchas gracias