TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: Tempus en 16 de Febrero de 2009, 10:50:44
-
hola estoy intentando hacer un reloj y un termometro para que aparezcan en una lcd el termometro ya lo tengo echo pero a la hora de hacer el reloj no e va y creo k la interrupcion la tengo bien echa y no encuentro el fallo.
Gracias de antemano
Pd: Adjunto libreria lcd, esquematico en proteus y codigo c en ccs c
-
Hola Tempus, veo que tienes algunos errores, te lso estoy corrigiendo, algunos son solo para que veas mejor el código, yo creo que verás las diferencias con tu código
lo más importante:
*después de seleccionar el canal no menos de 20us de retardo, eso dice la hoja de datos, en realidad es 19,... para tu micro, directamente 20us.
*las definición de algunas variables en la interrupción no me parece la mejor idea, mejor como globales
*algunas instrucciones del lcd pueden ir dentro del printf, la instrucción \f lleva a la posición 1,1 del lcd, al inicio
*cual es el calculo que hiciste para tu timer0?
y bueno con eso ahorita te cuelgo el código que corregí, un saludo
-
ya estuve haciendo las modificaciones que me as comentado y el calculo mañana cuando regrese a las clases te lo subo xk no tengo aki las cuentas.
aver si veo tu programa para ver como funciona y aprender un poco mas que este año y con vosotros estoy aprendiendo mas que en todos los años de carrera.
-
Hola tempus, acá te dejo algunas correcciones que hice a tu código:
#include <16F876.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include <lcd.c>
int segundos,minutos,horas,temperatura;
int seg=0;
//INTERRUPCION//
#int_rtcc //Habilita interrupción timer0
void interrupt_timer(void){
seg++;
if(seg==125){ //Condición de cambio
segundos++; // cuenta 1 segundo
seg=0; // qeu no se te olvide reiniciar cuenta
}
set_timer0(131); //Inicializa Timer0
}
void main(void){
setup_adc_ports(RA0_ANALOG);// configura RA0 como entrada analogica
set_tris_a(0xff);
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); //Configura timer0 y prescaler
set_timer0(131); //Inicializa timer0
enable_interrupts(INT_RTCC); //Habilita interrupción timer0
enable_interrupts(GLOBAL); //Habilita Interrupciones
lcd_init();// inicializa el LCD
set_adc_channel(0);
delay_us(20);
while(true){
temperatura=read_adc();//lee valor analogico
if(segundos>59){
segundos=0;
minutos++;
if(minutos>59){
minutos=0;
horas++;
if(horas>24)
horas=0;
}
}
printf (lcd_putc,"\f%02u:%02u Temp:%d C" ,minutos,segundos,temperatura*2); // ya no hace falta el gotoxy ni el \f fuera del printf
delay_ms(100);
}
}
Hay un ligero retraso en la cuenta, para lo que te recomiendo ver un poco más en el foro, para que intentes minimizar el retraso, pues hay muchas opciones, como la de utilizar un IC RTC, como el DS1307 u otro parecido, o un cristal de 32.768KHz en el T1CKI y T1CKO
Espero pueda servirte por ahora, cualquier cosa paso por acá, un saludo. No te olvides buscar en el foro y tener orden al crear temas
-
Gracias nuevamente si no te preokupes k ahora k me explicaste hare todo con mas orden y metiendo todo en este hilo asi sera mas facil para todo entre hoy y mañana lo que hare sera con dos botones uno de horas y otro de minutos poder modificar la hora .
Gracias nuevamente y cuando kieras estas invitado por estos parajes aunke no son tan lindos como la laguna, el cristo....
-
ok amigo, cuídate y no creo que pueda ir por allá :D me gusta ir al cristo y a la laguna :mrgreen:
un saludo