TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: jorgevert 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
-
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