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