domingo, 18 de diciembre de 2011

Reloj/Calendario


Hola a todos, en esta entrada os voy a explicar cómo hacer un reloj calendario. Puesto que vamos a utilizar para ello un PCF8583 y el I2C, vamos a ir explicando las características que he sacado de un documento PDF. En primero lugar las del I2C.

Características I2C:
Bus de comunicación síncrono.
􀂄 La comunicación es controlada por una señal de reloj común.
􀂄 Bus formado por 2 hilos:
􀂄 SDA (Serial DAta Line): datos
􀂄 SCL (Serial CLock line): reloj
􀂄 También es necesaria una referencia común de masa.
􀂄 Velocidad de transmisión.
􀂄 Standard: hasta 100 Kbits/s.
􀂄 Fast: hasta 400 Kbits/s.
􀂄 High-speed: hasta 3,4 Mbits/s.
􀂄 Cada dispositivo del bus tiene una dirección única.
􀂄 7 bits, I2C estándar
􀂄 11 bits, I2C mejorado.
􀂄 Distancia y número de dispositivos
􀂄 Limitado por la capacidad del bus (inferior a 400pF). Normalmente 2 o 3 metros.
􀂄 Drivers para largas distancias (centenares de metros).
􀂄 Protocolo de acceso al bus:
􀂄 Maestro – esclavo.
􀂄 I2C soporta protocolo multimaestro.

Características del PCF8583:
Este componente es un reloj calendario que posee en su interior una RAM de 2048 bits que a su vez están organizados en 256 palabras, cada una de 8 bits. Sus datos son transferidos mediante la conexión del BUS i2c.
Este es su esquema:


Os adjunto el datasheet del PCF, también podeis echarle un vistazo en mi biblioteca en la barra superior
DATASHEET : PCF8583


Bueno, esta práctica está diseñada para hacerse en proteus, en primer lugar, os enseñaré las partes de las que consta.
Obviamente, el pic, en nuestro caso el 18f4550:




En este caso, no he puesto un reset, pero es importante reflejarlo, es decir, el diseño en proteus no importa, sin embargo, si queremos poner en práctica este proyecto, deberéis ponerlo. Y recordad que debéis poner una resistencia inmediatamente después del pin, ya que si programamos ése pin como salida, podríamos generar un corto, y en el peor de los casos, romper el PIC.
En siguiente lugar, el LCD, en este caso un LCD alfanumérico 2x16:



El debugger I2C que nos ayudará a depurar el programa:




Y por último el PCF 8583, el reloj calendario. Que deberemos colocar con sus 2 pullups. En este ocurre algo parecido que con el reset. Como lo voy a simular en proteus, simplemente, no he colocado un oscilador que debería colocar si fuese a construirlo en la realidad. Además de una pila para que el reloj no pierda la temporización, ni tampoco se pierda la RAM, esto es como una pila en el ordenador para que el reloj, en caso de apagado, mantenga la hora real al encenderse.



Y una vez que tenemos todos los componentes neesarios es hora de pasar a los códigos:
Este código es el que nos mostrará la fecha y la hora:

////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
//   NOMBRE: Gabi                                                         diciembre/2011
////////////////////////////////////////////////////////////////////////////////////
//   PROGRAMA: ESTUDIO PCF 8583 (RELOJ-CALENDARIO-RAM)                                                                                                   
//   DISPOSITIVO: PIC 18F4550                  COMPILADOR:    CCsc
//   Entorno IDE: MPLAB IDE v8.56               SIMULADOR:    Proteus 7.7 SP2
//   TARJETA DE APLICACIÓN:            DEBUGGER:    ICD3
////////////////////////////////////////////////////////////////////////////////////
//        .-Configurar calendario y hora
//        .-Grabar datos en RAM
//        .-Leer calendario y hora y visualizarlo
//        .-Leer RAM y visualizarlo
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
     
////////////////////////////////////////////////////////////////////////////////////
// CABECERA ////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
#include
//#fuses INTHS                                                               //Selecciona el oscilador interno
#FUSES HS                         //External clock
#FUSES MCLR                   //Master Clear pin enabled
#use delay(clock=20000000)
//#use delay(internal=1Mhz)   // Selecciona la velocidad del oscilador interno
//#use i2c(Master, sda=pin_B0, scl=pin_B1) ***esto lo tiene la librería del PCF8583***
#include
#include
#include
//#byte ucfg= 0xf6f //Para poder utilizar RC4 y RC5 (en modo TTL, sólo pueden ser entradas)

////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void main()
{
char weekday[10]; //Array de string para escribir el nombre del día de la semana
date_time_t dt;               //Para que la entrada de la estructura 'date_time-t' se pase por valor
                                                               //bit_set(ucfg,3); //Para utilizar RC4 y RC5 como entradas
                                                               //set_tris_C(0xf0); // RC7-RC4 entradas, RC3-RC0 salidas (Para el uso del teclado)


lcd_init();
PCF8583_init(); 
//-------------------------------------------------------------
// Configuramos el chip en hora y calendario
//utilizamos '.' porque arriba pusimos 'date_time_t dt;'
dt.month   = 11;    // November
dt.day     = 14;    // 14
dt.year    = 11;    // 2011
dt.hours   = 23;    // 23 hours (11pm in 24-hour time)
dt.minutes = 59;    // 59 minutes
dt.seconds = 55;    // 55 seconds
dt.weekday = 3;     // 0 = Sunday, 1 = Monday, etc.

PCF8583_set_datetime(&dt); 
//------------------------------------------------------------- 
  
PCF8583_read_datetime(&dt);  

strcpy(weekday, weekday_names[dt.weekday]); //Leemos el nombre de la semana en la estructura y lo
                                                                                                                                                                            //copiamos en nuestro array de string

printf(lcd_putc,"%s, %u/%u/%02u",weekday, dt.day, dt.month, dt.year);

  while(1)
  { delay_ms(1000);
                lcd_gotoxy(1,2);
                PCF8583_read_datetime(&dt);                               //leemos el PCF8583 para actualizar la hora
                printf(lcd_putc,"%u:%02u:%02u  ",dt.hours, dt.minutes, dt.seconds);
  }

}

Simulación:
Una vez le damos a simulación nuestro programa empieza a establecer la fecha y la hora. Como os muestro a continuación.


Además de eso, si le damos a “debu” y “terminal” nos aparcerá una ventana donde nos señalará las transmisiones que se hacen a través del bus i2C.




Con esto ya tendríamos nuestro reloj terminado, esta práctica, en sí es la mitad de una mayor, en la que debo guardar una secuencia de números en la ram, para eso necesitaré otro programa, el cual subiré en estos días, por lo pronto, el reloj calendario ya lo tenéis. Espero que os sirva de ayuda, nos vemos!

No hay comentarios:

Publicar un comentario