Autor Tema: DS1307 no graba datos [desatado]  (Leído 2495 veces)

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

Desconectado asignori

  • PIC10
  • *
  • Mensajes: 3
DS1307 no graba datos [desatado]
« en: 19 de Agosto de 2011, 13:24:35 »
Hola amigos,  tengo problemas para grabar los dados de la RTC, el reloj funciona perfectamente, pero no registra el tiempo. ¿Dónde está el error en el programa? Me estoy volviendo loco, porque he intentado varias veces y nada. Muchas Gracias a todos.

Sigue el codigo:
Citar
#include <16F877.h>

#FUSES XT,NOWDT,NOPROTECT,PUT,NOLVP

#use delay(clock=4000000)

#use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3)

#include "lcd.c"
#include "C:\Documents and Settings\Administrador\Desktop\todopic\ds1307.c"
void main()
{
byte sec;
   byte min;
   byte hrs;
   byte day;
   byte month;
   byte year;
   byte dow;

lcd_init();  //initialize lcd

//initialize 1307

  ds1307_init();

  ds1307_set_date_time(18,12,9,3,10,30,55); //day, month,year,dow,hr,min.sec
  while(1)
  {
   ds1307_get_date(day,month,year,dow);
   ds1307_get_time(hrs,min,sec);
  lcd_gotoxy(1,1);
     printf(lcd_putc,"Data : %02d:%02d:%02d",day,month,year);

    lcd_gotoxy(1,2);

 printf(lcd_putc,"Time : %02d:%02d:%02d",hrs,min,sec);

                 if (!input(PIN_c0) ) // controla el puerto C pin0 incrementa horas

                          {

                          while(!input(pin_c0)){}



                      if (hrs>23)

                              hrs=0;

                          else hrs++;

                               i2c_start();

                               i2c_write(0xD0);

                               i2c_write(0x02);

                               i2c_write(bin2bcd(hrs));

                               i2c_stop();

                          delay_ms(50);

                          }



                if (!input(PIN_c1) ) // controla el puerto C pin1 incrementa minutos

                          {

                          while(!input(pin_c1)){}



                          if (min>58)

                              min=0;

                          else min++;

                          i2c_start();

                          i2c_write(0xD0);

                          i2c_write(0x01);

                          i2c_write(bin2bcd(min));

                          i2c_stop();

                          delay_ms(50);

                          }




  }


}





Sigue la libreria:

Citar
//#define RTC_SDA  PIN_C4
//#define RTC_SCL  PIN_C3

//#use i2c(master, sda=RTC_SDA, scl=RTC_SCL)

//BYTE bin2bcd(BYTE binary_value);
//BYTE bcd2bin(BYTE bcd_value);

int8 bin2bcd(int8 binary_value)
{
  int8 temp;
  char retval;

  temp = binary_value;
  retval = 0;

  while(1)
  {
    // Get the tens digit by doing multiple subtraction
    // of 10 from the binary value.
    if(temp >= 10)
    {
      temp -= 10;
      retval += 0x10;
    }
    else // Get the ones digit by adding the remainder.
    {
      retval += temp;
      break;
    }
  }

  return(retval);
}

// Input range - 00 to 99.
char bcd2bin(char bcd_value)
{
  char temp;

  temp = bcd_value;
  // Shifting upper digit right by 1 is same as multiplying by 8.
  temp >>= 1;
  // Isolate the bits for the upper digit.
  temp &= 0x78;

  // Now return: (Tens * 8) + (Tens * 2) + Ones

  return(temp + (temp >> 2) + (bcd_value & 0x0f));
}

void ds1307_init(void)
{
   BYTE seconds = 0;

   i2c_start();
   i2c_write(0xD0);      // WR to RTC
   i2c_write(0x00);      // REG 0
   i2c_start();
   i2c_write(0xD1);      // RD from RTC
   seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307
   i2c_stop();
   seconds &= 0x7F;

   delay_us(3);

   i2c_start();
   i2c_write(0xD0);      // WR to RTC
   i2c_write(0x00);      // REG 0
   i2c_write(bin2bcd(seconds));     // Start oscillator with current "seconds value
   i2c_start();
   i2c_write(0xD0);      // WR to RTC
   i2c_write(0x07);      // Control Register
   i2c_write(0x80);     // Disable squarewave output pin
   i2c_stop();

}

void ds1307_set_date_time(BYTE day, int8 mth, BYTE year, BYTE dow, BYTE hr, BYTE min, BYTE sec)
{
  sec &= 0x7F;
  hr &= 0x3F;

  i2c_start();
  i2c_write(0xD0);            // I2C write address
  i2c_write(0x00);            // Start at REG 0 - Seconds
  i2c_write(bin2bcd(sec));      // REG 0
  i2c_write(bin2bcd(min));      // REG 1
  i2c_write(bin2bcd(hr));      // REG 2
  i2c_write(bin2bcd(dow));      // REG 3
  i2c_write(bin2bcd(day));      // REG 4
  i2c_write(bin2bcd(mth));      // REG 5
  i2c_write(bin2bcd(year));      // REG 6
  i2c_write(0x80);            // REG 7 - Disable squarewave output pin
  i2c_stop();
}

void ds1307_set_time(byte hr, byte min, byte sec)
{
  sec &= 0x7F;
  hr &= 0x3F;
  i2c_start();
  i2c_write(0xD0);            // I2C write address
  i2c_write(0x00);            // Start at REG 0 - Seconds
  i2c_write(bin2bcd(sec));      // REG 0
  i2c_write(bin2bcd(min));      // REG 1
  i2c_write(bin2bcd(hr));      // REG 2
  //i2c_write(0x80);            // REG 7 - Disable squarewave output pin
  i2c_stop();
}

void ds1307_set_date(byte day, byte mth, byte year, byte dow)
{

  i2c_start();
  i2c_write(0xD0);            // I2C write address
  i2c_write(0x03);            // Start at REG 0 - Seconds
  i2c_write(bin2bcd(dow));
  i2c_write(bin2bcd(day));
  i2c_write(bin2bcd(mth));
  i2c_write(bin2bcd(year));
  i2c_write(0x80);            // REG 7 - Disable squarewave output pin
  i2c_stop();
}

void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow)
{
  i2c_start();
  i2c_write(0xD0);
  i2c_write(0x03);            // Start at REG 3 - Day of week
  i2c_start();
  i2c_write(0xD1);
  dow  = bcd2bin(i2c_read() & 0x7f);   // REG 3
  day  = bcd2bin(i2c_read() & 0x3f);   // REG 4
  mth  = bcd2bin(i2c_read() & 0x1f);   // REG 5
  year = bcd2bin(i2c_read(0));            // REG 6
  i2c_stop();
}

void ds1307_get_time(BYTE &hr, BYTE &min, BYTE &sec)
{
  i2c_start();
  i2c_write(0xD0);
  i2c_write(0x00);            // Start at REG 0 - Seconds
  i2c_start();
  i2c_write(0xD1);
  sec = bcd2bin(i2c_read() & 0x7f);
  min = bcd2bin(i2c_read() & 0x7f);
  hr  = bcd2bin(i2c_read(0) & 0x3f);
  i2c_stop();

}
« Última modificación: 22 de Agosto de 2011, 16:04:06 por asignori »

Desconectado asignori

  • PIC10
  • *
  • Mensajes: 3
Re: DS1307 no graba datos [desatado]
« Respuesta #1 en: 22 de Agosto de 2011, 16:05:28 »
problema resuelto

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: DS1307 no graba datos [desatado]
« Respuesta #2 en: 22 de Agosto de 2011, 18:37:01 »
¿Y que era?
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado asignori

  • PIC10
  • *
  • Mensajes: 3
Re: DS1307 no graba datos [desatado]
« Respuesta #3 en: 22 de Agosto de 2011, 23:04:53 »
¿Y que era?
Biblioteca equivocada :?

Desconectado Francirius

  • PIC10
  • *
  • Mensajes: 32
Re: DS1307 no graba datos [desatado]
« Respuesta #4 en: 23 de Agosto de 2011, 22:47:05 »
jaja cosas que pasan...a parte en esta biblioteca que mostraste, habian 2 funciones "ds1307_set_date_time" a lo mejor creaba algun conflicto

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: DS1307 no graba datos [desatado]
« Respuesta #5 en: 24 de Agosto de 2011, 09:53:39 »
¿Y que era?
Biblioteca equivocada :?

Como dijo Francirius, son cosas que pasan.
Gracias
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.


 

anything