Autor Tema: reloj de tiempo real mcp79410 reemplazo del ds1307  (Leído 2369 veces)

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

Desconectado francpa

  • PIC10
  • *
  • Mensajes: 16
reloj de tiempo real mcp79410 reemplazo del ds1307
« en: 17 de Octubre de 2013, 17:19:43 »
hola a todos

Quisiera hacerles una consulta, cualquier ayuda estaría muy agradecido.

 estoy usando el reloj de tiempo real de microchip mcp79410, uso la libreria del ds1307, existente en la web y posteado en este mismo foro, con la diferencia de que reemplace el 0xd0 y el 0xd1 para escritura y lectura del ds1307 por 0xde y 0xdf de escritura y lectura del mcp79410, al configurar una fecha y hora me la muestra pero realiza el conteo de segundos se queda estático, he intentado de todo pero o he tenido suerte

adjunto la librería, lo único que que ha funcionado es el cambio de registro de escritura y lectura reconoce la fecha configurada pero no corre el tiempo

cualquier ayuda muchas gracias

saludos

Código: [Seleccionar]
#define RTC_SDA  PIN_B4
#define RTC_SCL  PIN_B6

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

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

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(0xDE);      // WR to RTC
   i2c_write(0x00);      // REG 0
   i2c_write(bin2bcd(seconds));     // Start oscillator with current "seconds value
   i2c_start();
   i2c_write(0xDE);      // WR to RTC
   i2c_write(0x07);      // Control Register
   i2c_write(0x80);     // Disable squarewave output pin
   i2c_stop();

}

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

  i2c_start();
  i2c_write(0xDE);            // 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_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow)
{
  i2c_start();
  i2c_write(0xDE);
  i2c_write(0x03);            // Start at REG 3 - Day of week
  i2c_start();
  i2c_write(0xDF);
  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(0xDE);
  i2c_write(0x00);            // Start at REG 0 - Seconds
  i2c_start();
  i2c_write(0xDF);
  sec = bcd2bin(i2c_read() & 0x7f);
  min = bcd2bin(i2c_read() & 0x7f);
  hr  = bcd2bin(i2c_read(0) & 0x3f);
  i2c_stop();

}

BYTE bin2bcd(BYTE binary_value)
{
  BYTE temp;
  BYTE 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.
BYTE bcd2bin(BYTE bcd_value)
{
  BYTE 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));
}

Desconectado aldoMO

  • PIC10
  • *
  • Mensajes: 18
Re: reloj de tiempo real mcp79410 reemplazo del ds1307
« Respuesta #1 en: 03 de Junio de 2015, 19:15:26 »
hola francpa, pudiste solucionar el problema? ami me pasa exactamente lo mismo..
Estuve investigando, pero no he podido dar aun con la solución.
La verdad no se cual sera el problema.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: reloj de tiempo real mcp79410 reemplazo del ds1307
« Respuesta #2 en: 03 de Junio de 2015, 21:11:32 »
Me parece que se estan equivocando en como mandar los datos

Segun los datasheet el ds1307 los datos a enviar son:

Start - Direccion (7bits) + 1 bit R/W - Datos
Pagina 12
http://datasheets.maximintegrated.com/en/ds/DS1307.pdf


Mientras que el MCP79410 dice:

Start - Comando - 0 + Direccion(7bit) - Datos
Pagina 36
http://ww1.microchip.com/downloads/en/DeviceDoc/20002266F.pdf

Donde el Comando son 4 bits que indican la SRAM/RTCC o EEPROM , 3 bits que son siempre 1, y el ultimo que es R/W
« Última modificación: 03 de Junio de 2015, 21:15:48 por KILLERJC »

Desconectado aldoMO

  • PIC10
  • *
  • Mensajes: 18
Re: reloj de tiempo real mcp79410 reemplazo del ds1307
« Respuesta #3 en: 04 de Junio de 2015, 20:55:58 »
Antes que nada, Gracias por responder KILLERJC.
La verdad estoy un poco perdido con esto.
Entonces, después de start, debo escribir el comando que es DE o DF, según vaya a leer o escribir, y después la dirección y por ultimo el dato?
De ser así, la dirección es la misma que el comando?
Leí la hoja de datos, y eso es lo que entendí.
Es correcto o estoy mal?   

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: reloj de tiempo real mcp79410 reemplazo del ds1307
« Respuesta #4 en: 04 de Junio de 2015, 21:33:55 »
Por lo que entendi seria:

Para un byte nomas, leer registro 0x06:

Start
0xDE (escribir)
0x06
Start
0xDF (leer)
// Aqui llega dato del registro 0x06 de la RAM
Stop


Si quisiera leer varios, suponiendo que quiero leer del registro 0x00 a 0x06

Start
0xDE (escribir)
0x00 (direccion 0x00)
Start
0xDF
Leer (0x00)
Leer (0x01)
Leer (0x02)
Leer (0x03)
Leer (0x04)
Leer (0x05)
Leer (0x06)
Stop


Para escribir

Un dato, supongo registro 0x05 y les escribo 0x15:

Start
0xDE (escribir)
0x05 (registro)
0x15 (dato)
Stop

Multiple datos

Start
0xDE (escribir)
0x00 (direccion 0x00)
Escribir dato ( registro 0x00)
Escribir dato ( registro 0x01)
Escribir dato ( registro 0x02)
Escribir dato ( registro 0x03)
Escribir dato ( registro 0x04)
Escribir dato ( registro 0x05)
Escribir dato ( registro 0x06)
Stop

Y si... la direccion de esclavo es justamente 0x6F (7 bits, cuando lo multipicas por 2 te da el 0xDE )
Y ahora que veo la libreria parece estar bien xD, excepto la funcion de inicializacion que escribe otra cosa, pero que no se si usas. yo note esa diferencia pero es basicamente igual, puede que algun registro este mal ?
No encuentro otra cosa que pueda ser
« Última modificación: 04 de Junio de 2015, 21:39:48 por KILLERJC »