Hola, parece que soy nueva en el foro, pero antes de registrarme he estado 3 meses consultándolo. Para hacer un controlador de acuarios, quería activar el motor del dispensador de comida a una hora o frecuencia programadas. Para ello he hecho un programa para el 16F877 que ajusta la hora del PCF 8583, luego la lee, la pasa a binario y la manda a un virtual terminal via rs 232, ayudándome de un código muy completo que encontré aquí de Oshow (muchas gracias por esa aportación).
Todo parecía que iba bien hasta que probé a ver como pasaba de las 15:00 a las 16:00, y cúal fue mi sorpresa al ver que marcaban las 96:00,
¿Puede ser algo de que hace falta ajustar la frecuencia? No paro de mirar del datasheet y el código y no le encuentro la lógica al problema. A ver si los expertos podéis echarme una mano.
Gracias por adelantado
Éste es el código. Además adjunto el .c, .hex y una captura de la simulación en proteus, ya que no puedo subir el archivo .DSN
#include <16f877A.h>
#use delay(clock=4000000)
#fuses XT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT
#use I2C(MASTER,SDA=PIN_C4,SCL=PIN_C3,SLOW)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define ClockWrite 0xA0
#define ClockRead 0xA1
#define Horas 14
#define Minutos 59
#define Segundos 50
byte s,m,h;
// Función para pasar de BCD a binario puro
byte bcd_a_bin(byte bcd)
{
return (((bcd >> 4)*10) + (bcd & 0x0F));
}
// Función para pasar de binario puro a BCD
byte bin_a_bcd(byte binario)
{
return (((binario/10) << 4) + binario%10);
}
// Función para ajustar la hora del reloj
void SetClock ()
{
byte seg, min, hr;
seg=bin_a_bcd(Segundos);
min=bin_a_bcd(Minutos);
hr=bin_a_bcd(Horas);
i2c_start();
i2c_write(ClockWrite);
i2c_write(0x01); // Se sitúa en las cent de seg
i2c_write(0x00); //cent=0
i2c_write(seg);
i2c_write(min);
i2c_write(hr);
i2c_stop();
}
// Función para leer la hora actual (h, min y seg) del reloj
void ReadClock()
{
i2c_start();
i2c_write(ClockWrite);
i2c_write(0x02); // Se sitúa en los seg
i2c_start();
i2c_write(ClockRead);
s=i2c_read();
m=i2c_read();
h=i2c_read();
i2c_stop();
s=bcd_a_bin(s);
m=bcd_a_bin(m);
h=bcd_a_bin(h);
}
void main(){
SetClock();
SetAlarm();
While(true){
ReadClock();
delay_ms(1000);
printf(" hora %u : %u : %u ", h, m, s);
}