Autor Tema: Como se configura un ds1305?  (Leído 2087 veces)

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

Desconectado jorgevert

  • Moderadores
  • PIC10
  • *****
  • Mensajes: 30
Como se configura un ds1305?
« en: 18 de Mayo de 2005, 23:41:00 »
Hola muchachos llevo algunos dias sin poder lograr hacer funcionar el ds1305 aqui les dejo el codigo si alguien puede ayudarme

#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
#use delay(clock=4000000)
#use fixed_io(C_outputs=PIN_C0, PIN_C1,PIN_C3)
#use rs232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7,errors)
#DEFINE  CE              PIN_C0                    //pin de habilitacion de ds1305
#DEFINE  SCK            PIN_C1                    //pin de señal de reloj
#DEFINE  SDI             PIN_C2                   //pin de entrada de datos serial
#DEFINE  SDO            PIN_C3                   //pin de salida de datos serial
#DEFINE  RETARDO    DELAY_US(10)

VOID WRITE_DS1305_BYTE(BYTE CMD)    //definicion de funcion de escritura      
{
BYTE I;

   FOR(I=0;I<=7;++I)
   {
      output_bit(SDO, shift_right(&CMD,1,0) );  //envio dato serial por el pin c3
      output_high(SCK);                         //genero señal de reloj
      RETARDO;
      output_low(SCK);
   }
}

VOID WRITE_DS1305(BYTE CMD, BYTE DATA)       //funcion de escritura cmd indica la direccion y data el dato a enviar
{
   output_high(CE);                          // realizo habilitacion de ds1305
   RETARDO;
   WRITE_DS1305_BYTE(CMD);                   //envio direccion    
   WRITE_DS1305_BYTE(DATA);                  //envio dato
   output_low(CE);
}

BYTE READ_DS1305(BYTE CMD) {                 //definicion de funcion de lectura
   BYTE I,DATA;

   output_high(CE);                            
   RETARDO;
   WRITE_DS1305_BYTE(CMD);                   //envio direccion    
   for(I=0;I<=7;++I) {
      shift_right(&DATA,1,input(SDI));       //cargo dato serial por el pin c2
      output_high(SCK);
      delay_us(2);
      output_low(SCK);
      delay_us(2);
   }
   RETARDO;
   output_low(CE);
   return(DATA);
}

void RTC_SET_DATETIME(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min) {
   WRITE_DS1305(0x84,day);      
   WRITE_DS1305(0x85,mth);
   WRITE_DS1305(0x86,year);
   WRITE_DS1305(0x83,dow);
   WRITE_DS1305(0x82,hr);
   WRITE_DS1305(0x81,min);
   WRITE_DS1305(0x80,0X05);
}

VOID RTC_INIT()               //funcion de inicializacion de ds1305
{
   BYTE x;
   output_low(CE);            
   delay_us(2);
   output_low(SCK);
   WRITE_DS1305(0x8F,0X00);   //escribo en el registro de control para habilitar el oscilador
   WRITE_DS1305(0x91,0xa6);   //configuro el registro trickle charger
}

VOID MAIN()
{
BYTE DATO;

   RTC_INIT();                //inicializo ds1305
   RTC_SET_DATETIME(0X01,0X05,0X90,0X01,0X05,0X05);   //escribo la fecha y la                 //hora Lunes, 1 de mayo del año 90 , 5:05:00
   DATO=READ_DS1305(0X06); // realizo lectura del añ0
   PUTC(DATO);             //envio dato en bcd por el puerto serial (siempre sale cero)
   WHILE(TRUE);
}

el dato que me llega al puerto serial siempre es cero
con respecto al circuito en el ds1305 en vez de usar un cristal de 32.768khz estoy generando una señal de reloj mediante un pic 16f84 el cual genera una señal de 32.81Khz la cual conecto al pin3 del ds1305 dejando flotando el pin4 de este.
el pin9 del ds1305 se encuentra en gnd.
si alguien puede decirme cual es el error estaria muy agradecido
Gracias


Desconectado JorgitoFRyOle

  • PIC12
  • **
  • Mensajes: 79
RE: Como se configura un ds1305?
« Respuesta #1 en: 26 de Mayo de 2005, 16:00:00 »
Buenas:

No se exactamente a lo que te refieres con tu pregunta. Yo tengo el mismo problema, llevo un tiempo trabajando con dicho reloj y no he conseguido trabajar correctamente con el.

A ver si alguien que lo haya conseguido nos hecha una mano, y todos conseguimos solucionar el problema.

1saludo a tos. Gracias


 

anything