Translate

jueves, 8 de enero de 2009

Añadiendo un RTC DS1307

Un reloj de tiempo real (RTC por sus siglas en ingles), es un dispositivo que nos ayuda a llevar la cuenta de la fecha y la hora, además que gracias a su tecnología aun sin la prescencia de la energía principal del circuito puede guardar la fecha y hora con exactitud, además de seguir tomándola, para ello se ayuda de una bateráa de 3V.

El RTC que vamos a usar es el de la casa maxim-ic el DS1307, aquí tenemos el diagrama básico de conexión:



Este dispositivo se comunica mediante el protocolo I2C, por lo que solo necesitamos 2 lineas del PIC, además de que el PIC18f4520 posee le modulo I2C por Hardware. Como se aprecia en la imagen los pines que se conectan al PIC son SDA y SCL y estos deberán llevar cada uno una resistencia de pullup para que el bus I2C  funcione correctamente.


El DS1307 funciona en modo esclavo solamente, es decir, solo responde a peticiones externas y este no manda ninguna petición. La forma de pedir los datos al DS1307 es generando una condición de inicio al bus I2C, posteriormente enviando la dirección del esclavo que corresponde al DS1307 y de manera secuencial los registros internos a escribir. Esto se ve mejor en la siguiente imagen:



Y del mismo modo para la lectura solo que cambiando el bit de RW:



Así que podemos notar que la dirección de un DS1307 es 0b11010000 que equivale a 208 decimal o 0xD0 hexadecimal, este valor es de suma importancia pues es el identificador del dispositivo en el bus I2C.


Es importante notar que la información que va a ser leída o escrita en los registros del DS1307 debe ser BCD o hexadecimal, los registros y sus direcciones del RTC son los siguientes:



Como se aprecia en la imagen la primer columna es la dirección del registro a escribir y los bits que mas importan son los bit0:bit3 que es el valor del registro a grabar, y la ultima columna nos habla del rango máximo de cada registro.


Con esta información podemos empezar a programar. Lo único que se desea es añadir la fecha y hora en que se hizo la lectura de la temperatura, para esto usaremos la librería i2c.h.


Esta librería posee un 2 instrucciones que nos van a servir para evitar un largo procedimiento de inicio, las instrucciones que vamos a usar son EEByteWrite();  EERandomRead();


Antes de utilizar estas instrucciones es necesario inicializar el BUS y esto se hace con la función OpenI2C(); Esta función lleva como argumento el tipo de esclavo o maestro a usar y se define si el slew rate se habilita o no, para nuestro caso sera en maestro y con slew off ya que pretendemos usar un bus a 100Khz.


EEByteWrite();


Esta instrucción envía a una dirección especifica, un valor. Mediante el protocolo I2C. y sus argumentos son: dirección de dispositivo, dirección de registro, datos. Por ejemplo:


   EEByteWrite(0xd0, 0x00, 128);       // dummy byte


EERandomRead();


Esta función lee los datos del dispositivo especificado, en  la posición de memoria indicada. Sus argumentos son: dirección de dispositivo, dirección de registro. Un ejemplo es:


  Sec = EERandomRead(0xd0,0x00);  // Leemos Los Segundos


Así pues podemos basarnos en el siguiente código para nuestros programas:
 


Hay que notar que cuando enviamos el valor al terminal se envía en modo HEX para poder leer correctamente la fecha y la hora, es decir que concuerde con formato humano.

El circuito propuesto es el siguiente:



Y el vídeo de la simulación descargar de aquí.

3 comentarios:

  1. Excelente trabajo, muy util, estoy empezando a programar pic de la gama media y me quiero decantar por alguna de las siguientes herrameintas de mas alto nivel que el asm, PWC de CSS, C18, o MikroBasic, y las estoy evaluando. Me gusta mucho que pongas los videos de las simulaciones en Proteus. Y ya que hiciste las simulaciones en Proteus me preguntaba si las podias disponer para sus descarga. Muchas gracias.Ivan.

    ResponderEliminar
  2. me gustaria q me colaborars con las librerias del proteus de este microcontrolador ya quq no las poseeo gracias

    o en viarmelas al correo

    orduzandres02@hotmail.com

    ResponderEliminar