UNIDAD 15: RELOJ I2C

 

OBJETIVO

 

El objetivo de la unidad es mostrar a través de un sencillo ejemplo, como configurar la hora y los minutos

en el reloj I2C y visualizarlos de forma interactiva con una aplicación realizada en LabVIEW.

 

FUNDAMENTOS TEÓRICOS

El reloj I2C requiere de muy pocos dispositivos externos para realizar sus funciones.Mientras se mantenga alimentado

el circuito integrado,éste guardará la hora a modo de reloj, y podrá ser leida en cualquier momento.

La dirección hardware A0 ofrece la posibilidad de emplear dos PCF8583 colgados de un mismo bus I2C.En nuestro caso

hemos empleado sólo un dispositivo configurando esta dirección hardware como 0v o masa.

Necesita una señal externa de reloj, que puede configurarse para una frecuencia de 32.768kHz o de 50Hz,programable

en el registro control/status.

Todo el proceso de lectura /escritura se realiza a través de los registros del dispositivo y de un bit especial que indica

al dispositivo I2C si se va a leer (R=1) /escribir (W=0).

En la gráfica aparece el byte de la dirrección del esclavo, función que realiza el dispositivo I2C; la función de master

generalmente la realiza el microcontrolador, que es el encargado de generar la señal de clock (SCL) usada para establecer

la comunicación entre los dispositivos.

Se puede observar que los 4 primeros bits (group 1) son : 1010.Éstos son fijos para cada tipo de dispositivo I2C.

Si, por ejemplo, se tiene conectada a masa el pin A0, y se quiere leer el dispositivo (R=1), el byte a enviar en hexadecimal

será 0xA1 que equivale a 1010 0001.

Para escribir en el dispositivo I2C las tramas sería las indicadas en el gráfico siguiente.

Tras la condición de Start iniciada por el microcontrolador se envía el primer byte conteniendo la dirección

del dispositivo I2C con el que se quiere comunicar y en el último bit aparece el 0 indicando que se va a escribir,

la información pasa del microcontrolador al dispositivo I2C. Le sigue a esta trama el bit de acknowledgement generado

por el esclavo para confirmar la correcta recepción de byte anterior.

El byte siguiente se refiere a la dirección o registro del dispositivo I2C donde se quiere escribir o enviar el dato

desde el microcontrolador.

A partir del tercer byte, se envían los datos de forma sucesiva, y es el dispositivo I2C el que va autoincrementando la

dirección de memoria donde se guarda el dato recibido.Se finaliza la comunicación con el bit de parada.

Para leer datos del dispositivo I2C, la secuencia es la siguiente.

Inicia el dispositivo master la comunicación a través del bit de Start.Despues viene la dirección del esclavo al que se dirige,

indicando que va realizar la lectura del mismo (bit R/W=0). Después se envía la dirección del esclavo en la que se inicia la

lectura (slave addres),es la dirreción de un registro,con el último bit (R/W a 1) indicando la lectura de dicho registro.En este

caso, el dispositivo I2C también va realizando un autoincremento del registro a leer.

 

ESQUEMA ELECTRÓNICO

Master transmiter es en nuestro caso el microcontrolador T89C51AC2 (o RB2/RD2).

El valor del cristal es de 32.768kHz, y el condensador es de 22pF.La conexión es tal y como aparece en el gráfico,

recordando que en el bus I2C hay que colocar un par de resistencias de aproximadamente 2k2 Ohmios.

 

C

#include <i2c.h>
//Incluyo aquí los #define para que tengan efecto sobre
//las funciones a incluir del fichero i2c.c
//#define ADC
//#define CADENA

#include <i2c.c>

void saca_hora()

{
    char valor;
    int i;
    PutcharIIC(0xA0,0x04);
    GetcharIIC(0xA1,&valor);
    printf("h%x",valor);
    for(i=0;i<9900;i++){}
    PutcharIIC(0xA0,0x03);
    GetcharIIC(0xA1,&valor);
    printf("m%x",valor);
    for(i=0;i<9900;i++){}
}

 

void main(void)

{
    char modificar;
    int hora,minutos;
    IICInit();
    serie();
    saca_hora();
    printf("\nLa quieres modificar?(s)");
    modificar=getchar();
    if(modificar=='s')

    {
         printf("\nDime la hora a cargar:");
         scanf("%x",&hora);
         printf("\nDime los minutos:");
         scanf("%x",&minutos);
         //Usando las funciones realizadas para la eeprom
         //manejamos los registros del reloj:Direccion dispositivo,registro,valor a cargar.
         PutcharEeprom(0xA0,0x03,minutos);        /*Con el tercer argumento metemos los minutos*/
         PutcharEeprom(0xA0,0x04,hora);        /*igual, pero la hora*/
         do{
                  saca_hora();
         }while(1);
    }
        else
        for(;;)

         {
         saca_hora();

         }
}

main_reloj.c

reloj_i2c.hex

En estos programas el bus I2C está implementado en los pines P1.6->SCL; y P1.7->SDA.

 

LabVIEW

El programa en LabVIEW recibe primero la hora y los minutos que tiene almacenados el PCF8583, y los muestra.

Recibe un texto preguntando si se quieren modificar ; en caso negativo (se escribe cualquier caracter que no sea 's')

continua mostrando la hora y minutos, en caso afirmativo ( se escribe 's') y nos pide hora y minutos y se van introduciendo.

El panel frontal es:

La velocidad del puerto serie COM1 está configurada a 4800 baudios , los mismos a los que se ha programado el

microcontrolador.En la parte de string read aparece el texto enviado por el microcontrolador.

En HORAS y MINUTOS, aparecen respectivamente las horas y minutos que tiene almacenados el PCF8583.

Cuando se quiere escribir en el microcontrolador, se pone el caracter, o número en string to write y se pulsa el

botón ESCRIBIR.

La parte de programación de LabVIEW es la siguiente.

La configuración del puerto serie es la misma que en aplicaciones anteriores (secuence 0 y 2).

Hay dos subvi que extraen y presentan el valor de las horas:

Y de los minutos:

Identificandolos de la cadena que recibe por el puerto serie.Dichos valores van precedidos por un char(caracter);

'h' para las horas y 'm' para los minutos.De este modo podemos diferenciar los dos valores que envía el microcontrolador

por el puerto serie.

Se hace uso de una función sumamente útil Scan From String

Permite seleccionar la inromación que más nos interesa del string recibido.

Todos los archivos se encuentran es esta libreria de LabVIEW.

I2C_RELOJ.LLB