Hola a todos los del foro... resulta que estoy en una pequeña disputa con mi ds1307 y no logro dar en que estoy haciendo mal... implemento dos funciones una para inicializar el ic anterior al while(1) y la otra para leer los datos del ic, utilizo un cristal de 20Mhz y el pic 18f67j10 sin embargo aca estoy varado.
void RTF(void)
{
unsigned char sec, min, hr, mon, year, date, day;
OpenI2C1(MASTER,SLEW_OFF);
SSPADD =0x31;
IdleI2C1(); StartI2C1(); IdleI2C1();
if (!DataRdyI2C1())
WriteI2C1(0b11010000); //address of DS1307.
IdleI2C1();
if (!DataRdyI2C1())
WriteI2C1(0x00); // Position the address pointer to 0.
IdleI2C1();
if (!DataRdyI2C1())
WriteI2C1(0x00); // Clear seconds register and CH bit.
IdleI2C1();
StopI2C1();
//**************** Date and Time ********************//
hr = 0b01100111; // Set to 12 hour format.
min = 0b00000011;
sec = 0b00000000; // Oscillator enabled.
day = 0b00000001; // Set 1 = Sunday.
date= 0b00000001; // Date set to 1st.
mon = 0b00000001; // Month set to January.
year= 0b00000100; // Year set to 2008.
//**************** Transmit Time and Date ********************//
StartI2C1();
IdleI2C1();
if (!DataRdyI2C1())
WriteI2C1(0b11010000); //address of DS1307.
IdleI2C1();
if (!DataRdyI2C1())
WriteI2C1(0x00); // Position the address pointer to 0.
IdleI2C1();
if (!DataRdyI2C1())
WriteI2C1(sec);
IdleI2C1();
if (!DataRdyI2C1())
WriteI2C1(min);
IdleI2C1();
if (!DataRdyI2C2())
WriteI2C1(hr);
IdleI2C1();
if (!DataRdyI2C1())
WriteI2C1(day);
IdleI2C1();
if (!DataRdyI2C1())
WriteI2C1(date);
IdleI2C1();
if (!DataRdyI2C1())
WriteI2C1(mon);
IdleI2C1();
if (!DataRdyI2C1())
WriteI2C1(year);
IdleI2C1();
if (!DataRdyI2C1())
WriteI2C1(0x00);
IdleI2C1();
StopI2C1();
}
y la funcion para leer es
void RTC(void)
{
unsigned char seconds,minutes,hours,day,date,month,year,dow;
StartI2C1();
IdleI2C1();
if (!DataRdyI2C1())
WriteI2C1(0xd0); //address of DS1307.
IdleI2C1();
if (!DataRdyI2C1())
WriteI2C1(0x00); // Position the address pointer to 0.
IdleI2C1();
StartI2C1();
IdleI2C1();
if (!DataRdyI2C1())
WriteI2C1(0xd1); // Direction bit set to read.
IdleI2C1();
//*********************** Reception *********************//
if (DataRdyI2C1())
seconds = ReadI2C1(); IdleI2C1(); AckI2C1(); IdleI2C1();
if (DataRdyI2C1())
minutes = ReadI2C1(); IdleI2C1(); AckI2C1(); IdleI2C1();
if (DataRdyI2C1())
hours = ReadI2C(); IdleI2C1(); AckI2C1(); IdleI2C1();
if (DataRdyI2C1())
day = ReadI2C1(); IdleI2C1(); AckI2C1(); IdleI2C1();
if (DataRdyI2C1())
date = ReadI2C1(); IdleI2C1(); AckI2C1(); IdleI2C1();
if (DataRdyI2C1())
month = ReadI2C1(); IdleI2C1(); AckI2C1(); IdleI2C1();
if (DataRdyI2C1())
year = ReadI2C1(); IdleI2C1(); NotAckI2C1(); IdleI2C1();
StopI2C1();
deco(16,seconds);
}
la funcion deco lo unico que hace es desgoblar en 8 bits y mostrarlos en un glcd bit x bit... el problema es que cuando inicio el pic leeo 0000 0000 y al segundo leo 0000 0001... pero queda ahi y se que no esta tildado porque se ven actualizan otras cosas en el glcd cosa que sigue funcionando el codigo...
Cualquier ayuda sera bienvenida y perdon si revivo el post! es q despues de unas cuantas horas y de probar codigos ya no se que puede ser... este pic tiene 2 I2C los use a los dos tambien utilice las configuraciones DDRDbits.RD6=1; DDRDbits.RD5=1; y DDRCbits.RC4=1; DDRCbits.RC3=1;
Saludos