Autor Tema: Real Time Clock x1205 de INTERSIL visualizado en LCD  (Leído 1698 veces)

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

Desconectado zagoaristides

  • PIC12
  • **
  • Mensajes: 99
    • deportes de contacto y fitness
Real Time Clock x1205 de INTERSIL visualizado en LCD
« en: 08 de Noviembre de 2007, 04:15:56 »
Bueno gente abro este posto porque estoy tratando de hacer una librería para los muy completos RTC de INTERSIL de la serie X1205. Agradecería mucho la ayuda de gente que haya trabajado con relosjes de tiempo real ya que por el momento no puedo hacer funcionar el que tengo. Desde ya posteo la librería que estuve tratando de armar para el X1205S8 aunque son todos iguales en sus registros. La fui armando en base a una para el DS1307 que hay en este foro. Espero sus aportesy el que me ayude le regalo un RTC como este. Un abrazo

    ////////////////////////////////////////////////////////////////////////////
    ////                         libreria X1205.c                                      ////
    ////                 Driver para RTC i2c de INTERSIL                     ////
    ////                                                                                     ////
    ////                                                                                     ////
    ////                                                                                     ////
    ////                                                                                     ////
    ////                                                                                     ////
    ////                       Aristides E. E. Zago                                  ////
    ////                                                                                     ////
    ////////////////////////////////////////////////////////////////////////////



    ////////////////////////////////////////////////////////////////////////////////
    //Prototipos del reloj:                                                                             //
    //    -ajustar_fecha_hora(): Escribimos via i2c la hora, fecha, mes, año...   //
    //    -leer_hora_fecha(): Leemos via i2c todos los datos del reloj               //
    //    -bin2bcd(): Rutina para convertir de binario a bcd                             //
    //    -bcd2bin(): Rutina para convertir de bcd a binario                             //
    ////////////////////////////////////////////////////////////////////////////////

    void ajustar_hora_fecha(void);
    void leer_hora_fecha(void);
    char bin2bcd(char valor_binario);
    char bcd2bin(char valor_bcd);




    ////////////////////////////////////////////////////////////////////////////////
    //    Registros definiciones y variables usadas por el reloj, para almacenar  //
    //    registros, comandos y funciones.                                                      //
    ////////////////////////////////////////////////////////////////////////////////

    /*
    Registros del reloj, los valores de éstos estan siempre en bcd
    Según la posicion dentro del array almacenamos distintos registros:

       SEGUNDOS             registros_x1205[0]
       MINUTOS              registros_x1205[1]
       HORAS                registros_x1205[2]
       FECHA                registros_x1205[3]
       MES                  registros_x1205[4]
       AÑO                  registros_x1205[5]       
       DIA DE LA SEMANA     registros_x1205[6]

    */
   
    //Para direccionar dentro del array
   
    #define segundos 0
    #define minutos 1
    #define horas 2
    #define fecha 3
    #define mes 4
    #define anio 5
    #define dia_semana 6

    ////////////////////////////////////////////////////////////////////////////////
    //     Registros del x1205                                                              //
    ////////////////////////////////////////////////////////////////////////////////

    #define dir_segundos 0x30
    #define dir_minutos 0x31
    #define dir_horas 0x32
    #define dir_fecha 0x33
    #define dir_mes 0x34
    #define dir_anio 0x35
    #define dir_dia_semana 0x36
    #define dir_status 0x3F

    ////////////////////////////////////////////////////////////////////////////////
    /// Direcciones para leer/escribir al reloj.                                       //
    ////////////////////////////////////////////////////////////////////////////////

    #define dir_x1205_write 0b11011110 //1101: access the CCR - 111: device select bits - 0: Write
    #define dir_x1205_read 0b11011111  //1101: access the CCR - 111: device select bits - 1: Read

     ////////////////////////////////////////////////////////////////////////////////
    //    Con este array visualizamos el mes actual en formato texto.             //
    ////////////////////////////////////////////////////////////////////////////////

    const char meses_text[12][4]=
       {
          "Ene",
          "Feb",
          "Mar",
          "Abr",
          "May",
          "Jun",
          "Jul",
          "Ago",
          "Sep",
          "Oct",
          "Nov",
          "Dic"
        };

    ////////////////////////////////////////////////////////////////////////////////
    //    Esta es la variable global donde irán almacenados                     //
    //    los registros del reloj.                                                             //
    ////////////////////////////////////////////////////////////////////////////////

    char registros_x1205[7]; //array de 7 elementos


    ////////////////////////////////////////////////////////////////////////////////
    //  Esta función convierte un valor comprendido entre 0 y 99 de binario a BCD //
    ////////////////////////////////////////////////////////////////////////////////

    char bin2bcd(char valor_binario)
    {
          char temp;
          char retval;

          temp = valor_binario;
          retval = 0;

          while(1)
             {
                   // coge las decenas y les resta 10
                   // para obtener unidades
                   if(temp >= 10)
                      {
                         temp -= 10;
                         retval += 0x10;
                      }
                   else
                      {
                         retval += temp;
                         break;
                      }
             }

       return(retval);
    }

    ////////////////////////////////////////////////////////////////////////////////
    // Esta función convierte un valor comprendido entre 0 y 99 de BCD a binario  //
    ////////////////////////////////////////////////////////////////////////////////

    char bcd2bin(char valor_bcd)
    {
          char temp;

          temp = valor_bcd;

          temp >>= 1;

          temp &= 0x78;



       return(temp + (temp >> 2) + (valor_bcd & 0x0f));

    }



    ////////////////////////////////////////////////////////////////////////////////
    //    Con esta función escribimos la hora y la fecha mediante i2c en el reloj //
    //    x1205.                                                                                             //
    //                                                                                                          //
    //    Primero convertiremos los valores de binario a BCD para poder           //
    //    almacenarlos, seguidamente desactivaremos las interrupciones            //
    //    para no interrumpir la transmision, y los enviaremos con las               //
    //    funciones del compilador para el manejo de i2c.                                 /7
    ////////////////////////////////////////////////////////////////////////////////


    void ajustar_hora_fecha(void)
    {
          char i;


          for(i = 0; i < 7; i++)
             {
                registros_x1205 = bin2bcd(registros_x1205);
             }

          //Para seleccionar modo 12/24 horas se escribe en el bit 7 del registro HR
          registros_x1205[horas] |= 0b10000000; //enmascaramos para escribir un uno ==> 24 hs.

          disable_interrupts(GLOBAL);

///----- Inicializacion del registro Status para poder escribir en CCR -----\\\

          i2c_start();
         
          //ponemos la dirección del x1205
          i2c_write(dir_x1205_write);   

          // para escribir en los CCR
          //primero escribimos un 1 en WEL del registro de status
          i2c_write(dir_status);
          i2c_write(0x02);
          i2c_stop();
         
          i2c_start();
          i2c_write(dir_x1205_write);
          i2c_write(dir_status);
          i2c_write(0x06);
          i2c_stop();
         
///-- Fin de inicializacion del registro Status para poder escribir en CCR --\\\         
         
         
          i2c_start();
          i2c_write(dir_x1205_write);         
         
          //se empieza poniendo la direccion
          i2c_write(dir_segundos);   //del registro segundos

          // y luego se escriben 7 bytes más....
          //con los segundos, minutos, horas, día, etc....
          for(i = 0; i < 7; i++)
             {
                i2c_write(registros_x1205);
             }
             
          i2c_stop();
         
          //delay_ms(10);
         
          //Para terminar con la escritura
          i2c_start();         
          i2c_write(dir_x1205_write);   
          // reseteamos el status
          i2c_write(dir_status);
          i2c_write(0x00);
          i2c_stop();                 

          enable_interrupts(GLOBAL);
    }

    ////////////////////////////////////////////////////////////////////////////////
    //    Con esta función leemos la hora y la fecha mediante i2c del array           //
    //    global que contiene todos los registros en BCD                                      //
    //                                                                                                             //
    //    Primero desactivaremos las interrupciones para evitar que interrumpan  //
    //    la transmision, seguidamente usamos las funciones del compialdor        //
    //    para el manejo de i2c y por último convertiremos de BCD a binario       //
    //    para poder visualizarlas correctamente.                                               //
    ////////////////////////////////////////////////////////////////////////////////
    //    Los valores almacenados en el array podrán estar comprendidos entre:   //
    //                                                                                                             //
    //    Segundos       0-59                                                                              //
    //    Minutos        0-59                                                                                //
    //    Horas          0-23                                                                                 //
    //    Dia semana     1-7                                                                               //
    //    Dia            1-31                                                                                  //
    //    Mes            1-12                                                                                 //
    //    Año            00-99 (a partir del año 2000)                                              //
    ////////////////////////////////////////////////////////////////////////////////

    void leer_hora_fecha(void)
    {
          char i;
          disable_interrupts(GLOBAL);

          i2c_start();
          i2c_write(dir_x1205_write);
          // empezamos leyendo los segundos
          i2c_write(dir_segundos);

          i2c_start();
          i2c_write(dir_x1205_read);

          // leemos los 7 bytes restantes. hacemos mascaras para los
          //bits que no usamos

          registros_x1205[segundos] = i2c_read() & 0x7f;
          registros_x1205[minutos] = i2c_read() & 0x7f;
          registros_x1205[horas] = i2c_read() & 0x1f;         
          registros_x1205[fecha] = i2c_read() & 0x3f;
          registros_x1205[mes] = i2c_read() & 0x1f;
          registros_x1205[anio] = i2c_read(0); //QUE CARAJO QUIERE DECIR EL 0 !!!
          registros_x1205[dia_semana] = i2c_read() & 0x07;

          i2c_stop();

          enable_interrupts(GLOBAL);

          // como los registros están en BCD, debemos convertirlos a binario

          for(i = 0; i < 7; i++)
             {
                registros_x1205 = bcd2bin(registros_x1205);
             }

    }


////Ahora el programa que una la librería


#include <16F876A.h>
#fuses XT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD
#use delay (clock=4000000)
#use i2c( master , SDA=PIN_C4, SCL=PIN_C3,force_hw)
#include <lcd2.c>
#include <x1205.c>

void main( void )
{

  lcd_init();
  lcd_putc("Empezando...");
  delay_ms(2000);

//escribimos la fecha en los registros

      registros_x1205[0] = 15;   // segundos
      registros_x1205[1] = 24;   // minutos
      registros_x1205[2] = 17;   // horas
      registros_x1205[3] = 0;
      registros_x1205[4] = 6;    // dia
      registros_x1205[5] = 9;    // Mes
      registros_x1205[6] = 04;   // año

// Escribir valores al x1205
      ajustar_hora_fecha();

  while ( TRUE )
  {

      leer_hora_fecha();

     
      printf(lcd_putc,"\f%02u:%02u:%02u",registros_x1205[horas],registros_x1205[minutos],registros_x1205[segundos]);
      delay_ms(1000);
      printf(lcd_putc,"\f%02u%s%02u",registros_x1205[fecha],meses_text[registros_x1205[mes]-1],registros_x1205[anio]);
      delay_ms(1000);
  }
}
Nadie nació sabiendo...Que genio ese Nadie!!!


 

anything