Autor Tema: Error al pasar de una hora a hora con un PCF 8583  (Leído 1582 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado IsaHarvar

  • PIC10
  • *
  • Mensajes: 12
Error al pasar de una hora a hora con un PCF 8583
« en: 10 de Noviembre de 2010, 08:19:48 »
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,  :shock:

¿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);
   }

Desconectado IsaHarvar

  • PIC10
  • *
  • Mensajes: 12
Re: Error al pasar de una hora a hora con un PCF 8583
« Respuesta #1 en: 12 de Noviembre de 2010, 07:53:35 »
He conseguido hacer un programa que funcione, extrayendo del programa y la librería de Oshow las funciones para leer y ajustar la hora. Os pongo el código por si a alguien le puede servir de ayuda.

Ahora intentaré configurar alarmas que activen la interrupción externa que parece más complicado que lo anterior. Si alguien tiene un ejemplo, se agradecería.



 

anything