Clock DS1307 con micro motorola y LCD

hola, para mi proyecto final de secundaria, tengo que controlar un lcd inteligente y ya lo logre con el microcontrlador motorola, ahora, tengo que mostrar la fecha actualizada en el mismo, y compre un DS1307, estoy estudiando su funcionamiento y agradeceria si me explicaran como actualizarlo y luego leer los datos que entrega. En lo posible realizandolo con micro motorola
gracias!
 
Hola gersm:
Mira el DS1307 (Dallas-MAxim) es un RTC (Reloj de tiempo real) que se comunica en modo serie y usa el protocolo I2C. Asi que para empezar debes estudiar como funciona este protocolo, esto lo puedes encontrar en un montón de lugares (pero como Philips lo inventó supongo que es el mejor lugar para buscar información). Luego estoy casi seguro que el micro que usas "Motorola" no tiene incorporado un puerto I2C, por lo tanto tendrás que crear un puerto I2C usando 2 pines de entrada/salida y un software que haga cumplir el protocolo.
Por si te sirve de algo te digo que existen otros RTCs de Dallas-Maxim ( el DS12887 paralelo) que usa directamente el sistema de direccionamiento de memoria de Motorola (motorola bus timing) entonces puedes manejarlo como si fuera una memoria más, o sea que es totalmente transparente.
De todos modos simular un bus I2C mediante I/Os y Soft no es tan complicado.

Cualquier duda estoy a tu disposición.

Saludos

Walter C. L. - Salta - Argentina
 
wacalo dijo:
Hola gersm:
Mira el DS1307 (Dallas-MAxim) es un RTC (Reloj de tiempo real) que se comunica en modo serie y usa el protocolo I2C. Asi que para empezar debes estudiar como funciona este protocolo, esto lo puedes encontrar en un montón de lugares (pero como Philips lo inventó supongo que es el mejor lugar para buscar información). Luego estoy casi seguro que el micro que usas "Motorola" no tiene incorporado un puerto I2C, por lo tanto tendrás que crear un puerto I2C usando 2 pines de entrada/salida y un software que haga cumplir el protocolo.
Por si te sirve de algo te digo que existen otros RTCs de Dallas-Maxim ( el DS12887 paralelo) que usa directamente el sistema de direccionamiento de memoria de Motorola (motorola bus timing) entonces puedes manejarlo como si fuera una memoria más, o sea que es totalmente transparente.
De todos modos simular un bus I2C mediante I/Os y Soft no es tan complicado.

Cualquier duda estoy a tu disposición.

Saludos

Walter C. L. - Salta - Argentina






haber si entendi... segun lo que lei, el protocolo I2C es una comunicacion entre dos dispoditivos.
ahora, para realizar dicha comunicacion, el maestro (en este caso micro motorola) debe especificar la direccion del esclavo (ds1307), luego indicar que se va a transferir (escribir), especificar la direccion donde va a transferirse el dato, escribir el dato y parar.
En el caso de recepsion de datos, la comunicacion es similar, solo que hay que especificar que se va a recibir.
Lo que no entiendo es por cual de los 2 pines (scl y sda) se realiza la transmisión o recepcion de datos.
Otra cosa, en el caso de direccion del esclavo, r/w, ack(bit de indicaion de comunicacion), no encuentro como adaptarlo al ds1307.
espero respuespuesta..
gracias
 
Hola gersm:
SDA: es la línea por la que se envían y reciben los datos
SCL: es la linea del clock de sincronismo (siempre la maneja el maestro)
De todas maneras para aprenderte bien el protocolo I2C te va llevar más de 1 día (quizás entre 3 y 5 días). Te adjunto un pequeño archivo pdf (en español) para que leas algo al respecto.
Por si te interesa existe el DS1305 (primo del DS1307) que se comunica por medio de un bus SPI que la mayoría de los micros motorola lo tienen.
En fin tu verás.
Saludos. A tu disposición.

Walter C.L. - Salta - Argentina.
 

Adjuntos

  • el_bus_i2c_214.pdf
    33.8 KB · Visitas: 230
necesito hacer un rtc con un AT89C51 y un DS12C887 , ya estudié el manual del fabricante que proporciona dallas, es solo que no sé como inicializarlo, por lo que leí necesita una serie de códigos al igual que la HD74480 para su inicialización: ¿qué códigos necesito enviar al DS12C887 para su inicialización y poder empezar a trabajar en base a eso?
 
Buenos días estimados foristas,

Estoy en estos días viendo cómo programar en lenguaje C, que es nuevo para mí, un PIC 16F877 (generosos recursos, de sobra) para que me escriba el RTC DS1307 con la fecha, día de la semana y la hora ,min y seg; y lo pase, al LDC para ser visualizado (LCD de 16*2).No sé si haya que pasarlo a código ASCII.

Como es sabido, en los foros ya comentados, he leído partes de programa en C y la hoja comercial del DS1307, especialmente la de los Registros del tiempo D/M/A/H/min/seg, pero no tengo muy claro cómo accedo a esos registros para escribirlos desde el micro y que según entiendo , debo inicializar primero el conteo con el Bit 7 en seconds que llaman CH.

Ahora, he visto una parte de la escritura como:


void rtc_ Start();
{
i2c_ WriteTO(0XD0); /* supongo que es la dirrección de algún registro, no sé cual */
i2c_ PutByte (0x00); /*
i2c_ PutByte (dec2bdc(S)); /* no sé si esa ese de segundos, sea una dirreción en una librería y
i2c_ PutByte (dec2bdc(m)); ni cómo se pone*/
i2c_ PutByte (dec2bdc(h));
i2c_ PutByte (dec2bdc(dds));
i2c_ PutByte (dec2bdc(dia));
i2c_ PutByte (dec2bdc(mes));
i2c_ PutByte (dec2bdc(anyo));
i2c_ Stop();
}


El circuito final es uno con tres pulsadores al micro que hacen reset, elección de variable (mode) y el de incremento de variable, mejor dicho, vamos a usar ese micro para escribir por medio de pulsadores el reloj que se visualizará en LCD, como cuando ajustamos esos relojes de mesa.

Si, soy un neófito, pero he leído todo lo que he podido de C y del relojito. A propósito, trabajo con el compilador CCS.

Adjunto la hoja comercial del DS1307 en la que estoy viendo lo del los registros Timekeeper y eso de que transmite por I²C y los modos del esclavo (DS1307 en este caso pienso yo; y como queda el circuito final, con la corrección de que faltan los pulsadores de cambios.

Gracias de nuevo, de antemano.
 

Adjuntos

  • reloj con DS1307.rar
    248.1 KB · Visitas: 785
Última edición:
Buenas tardes, pido perdón por mi terrible inconsistencia. Si yo debo montar el circuito que me permita ajustar el RTC DS1307 por pulsadores, no tengo que preocuparme por escribirlo (no por medio del programa), como enuncié con esa muestra del segmento de un programa en C.

Ahora, corrijo. Mi interés es diseñar el programa en lenguaje C para que utilizando I²C , pueda leer el RTC y visualizarlo en display LDC (2*16). Además, debo ajustar manualmente los tiempos.

Al poner en marcha el programa este me debe permitir cambiar la hora (seg, min, hora) y la fecha (dia de la sem, no. día del mes, mes, año) al oprimir (3) pulsadores; el pulsador respectivo de modo(escoger variable a cambiar), el de incremento del valor de la variable (s,min,h, día sem , núm de día, mes, año) y el de reinicio de conteo.
 
Última edición:
Hola compañero, mira yo tb he investigado harto sobre este display, y te puedo ayudar un poco.

void rtc_ Start();
{
i2c_ WriteTO(0XD0); /* esta es la direccion del dispositivo. Cuando escribe es 0:LOL:0, y cuando lee la dir es 0:LOL:1. Si te fijas en el archivo ke adjuntaste, en la figura 4 (escritura) y la 5 (lectura) sale explicado por ke despues del Start se debe enviar la direccion (7 bits 1101000) mas el bit ke indike si es R o W.*/
i2c_ PutByte (0x00); /* En esta direccion va a comenzar a escribir, me imagino ke los datos ke esten cargados en el registro S hacia el RTC (no se bien la funcion i2c_PutByte)
i2c_ PutByte (dec2bdc(S));
i2c_ PutByte (dec2bdc(m));
i2c_ PutByte (dec2bdc(h));
i2c_ PutByte (dec2bdc(dds));
i2c_ PutByte (dec2bdc(dia));
i2c_ PutByte (dec2bdc(mes));
i2c_ PutByte (dec2bdc(anyo));
i2c_ Stop(); //cada vez ke el pic escribe en el rtc, el registro se incrementa automaticamente, por lo ke lo ke hace esto es escribir en todos los registros y luego termina la comunicacion.
}

Eso compañero, yo estoy tratando de agragarle una alarma a este integrado.
Ah, y te recomiento los libros "Microcontrolador PIC16F84-Desarrollo de proyectos"
"Microcontroladores Pic, diseño practico de aplicaciones, 1a parte."
y "Compilador C CCS y simulador PROTEUS para microcontroladores PIC"
Ahi encontre mucha info.
Chao, ke te vaya bien.:apreton:
 
De verdad gracias, de hecho y casualmente, si tengo ese pdf y lo consulto con cierta regularidad en estos días.
Buena suerte también.

Hola de nuevo estimados foristas,

Ahora he tratado de editar por mis propios esfuerzos e ideas (lo que no es garantía ) el código para la lectura del DS1307 con el PIC16F877A y visualización en LCD 16x2 en el compilador CCS. Por favor si alguno puede indicarme que puede estar mal u omitido, mientras adquiero algo de destreza en ello. Es esto:

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Este código lee el contenido del RTC DS1307 mediante el PIC 16F877A y lo visualiza en un ldc 16X2. //
// Rutina de lectura a un dipositivo conectado al i2c //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#use i2c (MASTER, SDA=PIN_C4, SCL= PIN_C3)/* configuración principal del i2c, pic es maestro,y
configuración de pins sda y scl en C4 y C3*/


int i2c_read(int i2c 110100) //rutina de lectura, no sé si poner 0X68 que es la//
dirección en hexa, creo, del RTC DS1307, en lugar de 1101000*/
{
int read (0X01); // direction bit 1, para lectura.//
i2c_start(); //inicio de i2c//
i2c_write(i2cdev); // no sé muy bien poque hay un "escribir" aquí.//
i2c_read(); //inicia lectura//
i2c_stop(); /* acaba la lectura
return(read); e inicia leyendo de nuevo*/
}

Tengo la duda de si inicié bien el protocolo i²c, ya que es un error (que indica el compilador al ejecutar build all), con ese "#use i2c" y que definí las patillas SCL y SDA.

Estoy confundido acerca de como acceder, primero al DS1307, luego leer todos su registros de tiempo, d, ds,m,a,h,min,seg; y luego creo que debe pasar de BDC a decimal y enviarlo al display LCD para visualizar. Luego hay que escribirlo con pulsadores, y ponerlo a contar desde lo que yo le cargue con ellos en sus registros por medio del micro.
 
Última edición:
Buenas tardes, esta vez encontré el programa , después de algo de dedicación y colaboración,
#include <16f877a.h>
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
#use delay(clock=4000000)

#include "lcd.c"
#use standard_io (D)


#use fast_io (b)

#use i2c(MASTER, SDA=PIN_b1, SCL=PIN_b0,slow)

//Registros DS1307
#define ds_seconds 0x00
#define ds_minutes 0x01
#define ds_hours 0x02
#define ds_day 0x03
#define ds_date 0x04
#define ds_month 0x05
#define ds_year 0x06
#define ds_control 0x07

//DS1307
//Vbat a tierra

void main(void)
{

int16 retardo; //Cada cuando actualiza lectura en LCD

//Dato en registro ds, a mandar o leer
int seconds,minutes,hours,day,date,month,year,control;

retardo=250; //ms a tardar entre lectura y lectura

//Justo cuando prende circuito, la fecha que establece es la siguiente
seconds= 0x00;
minutes= 0x38;
hours = 0x15; //modo 24 hrs
day = 0x05; //1 es domingo
date = 0x13;
month = 0x01;
year = 0x05;
control= 0x00; //OUT=0 SQWE=0 RS0-1=0 no hay onda cuadrada


//Establece fecha y hora
i2c_start(); //Inicia I2C
i2c_write(0xd0); //Direcciona DS1307 write
i2c_write(ds_seconds); //Indica que empiece en registro ds_seconds
//Aquí establece fecha y hora respecto a la puesta arriba
i2c_write(seconds);
i2c_write(minutes);
i2c_write(hours);
i2c_write(day);
i2c_write(date);
i2c_write(month);
i2c_write(year);
i2c_write(control);
i2c_stop(); //Ya puso la hora y fecha
//El RTC ya está marcando el tiempo y fecha

//Rutina LCD
lcd_init(); //Inicia LCD
lcd_putc("f"); //Limpia LCD
lcd_putc("Real Time Clock
"); //rtc
lcd_putc(" DS1307");
delay_ms(3000);

while(1)
{

delay_ms(retardo); //Usuario lee


//Obtiene datos de DS1307
i2c_start(); //Inicia I2C
i2c_write(0xd0); //Direcciona DS1307 write
i2c_write(ds_seconds); //Indica que ponga registro en ds_seconds
i2c_stop();

i2c_start();
i2c_write(0xd1); //Lee DS1307
seconds = i2c_read();
minutes = i2c_read();
hours = i2c_read();
day = i2c_read();
date = i2c_read();
month = i2c_read();
year = i2c_read(0); //no ack
i2c_stop();

//Representa datos en la LCD
printf(lcd_putc,"f%2x-%2x-20%2x
",date,month,year); //dd-mm-year
printf(lcd_putc,"%2x:%2x:%2x",hours,minutes,seconds); //23:59:59
}
}

Por otro lado es como la mitad de mi proyecto, y requiero ahora de saber cómo poner esos tres pulsadores que me van a seleccionar la variable de tiempo del RTC (D/M/A/ dia sem/H/MIN/SEG) será el MODE , el que hace incremento de esos registros (D/M/A/ dia sem/H/MIN/SEG) y claro, el restart que inicia conteo de nuevo, desde lo que le haya cargado en los registros al DS1307 con los dos primeros pulsadores.

Por favor, sabe alguien si al comenzar con el "MODE" (escoger variable o registro a cambiar), el reloj DS1307 se puede "parar" o si debo detener lectura del microcontrolador,el PIC 16F877A. ¿Cómo debo plantear eso?.

Ahora, los pulsos que le de al pulsador "MODE" según las veces, debe direccionar desde el registro 0x00(seg) hasta el registro 0x06(año) ¿cómo lo logro, contador que me cargue eso en una rutina?


Y si el primer pulsador me detiene conteo (eso no me consta), pero entonces si así fuera, el tercer pulsador RESTART, activa la rutina de conteo desde los datos fijados.
 
Hola.
Adjunto el codigo en ccs de una matriz de leds que usa un ds1307,se cambian los datos con pulsadores,debes quitar la parte de la matriz y usar lo que necesites,están también las librerías.
Espero te sirva,un saludo.
 

Adjuntos

  • Matriz en C.rar
    171.1 KB · Visitas: 579
He tenido que dedicar bastante tiempo a esto, especialmente en lo que refiere a herramientas de CCS y ese protocolo i2c, además de los detalles del código. Por fortuna sus aportes han guiado mi trabajo.

Gracias, Francirius y 1jabato1.
Lo siento, volveré a molestarlos.
Saludos.

Buenas tardes, foristas,

Tengo un problema con el código de escritura y lectura en LDC del DS1307, pues cuando cargo el archivo.hex en el PIC16F877A y simulo en proteus, tengo que la fecha y hora aparacen, pero EL Día NO. Además estos datos siempre se desplazan a la izquierda despues de que se visualizan por un breve instante y en medio de su lectura (el microcontrolador vuelve y lee cada 250ms según el código) es decir, hay una hora, el tiempo pasa , se lee de nuevo y así es que la hora va cambiando en el LDC según en el DS1307, pero entre cada lectura de la hora y/o fecha me aparecen fffffff-ffffff, por ejemplo:
08/11/2010ffffffffff08/11/2010
y la hora igual:
10:23:18 ff:fff:ff 10:23:19 ff:ff:ff
conecto Vdd a V+
Vss a 0V
E1,RS, y RW a unos pins del puerto D del micro.(D0,D1,D2)
y uso los los D4-D7 del puerto D para las patillas D4-D7 del display LDC. pense´qué tal vez podría ser el retardo entre lectura y lectura del DS1307 (250ms), pero ahora no es tan obvio qué pueda estar mal.
Adjunto la sim de lo que me pasa, espero que sea una nimiedad y que se me pasó algo por alto que tal vez no conozca bien aún.

De antemano, gracias.
 

Adjuntos

  • Simulación de l DS1307 y LCD.rar
    260.9 KB · Visitas: 495
Última edición:
Buen dìa foristas, ya resolvì el detalle. Tengo que ajustar otro para que su operaciòn sea correcta y cuando lo haga, y mil disculpas; me gustarìa que me orientaran còmo puedo trabajar para cargarle la hora y fecha l DS1307 por medio de pulsadores que arranquen rutinas en el microcontrolador para que èl las cargue en el DS1307 y lo lea, tal cual ajustamos los relojes de mano u otros en casa.

Segùn escuchè puede que trabaje con interrupciones y debo resolver que no tenga errores como llegar a cargar un dìa 00 o mes00 que no es vàlido.

Graciass y nos escribiremos cuando quede mejor la parte de escritura por programa y su repectiva lectura.
 
ok, respetados foristas, ya tengo todo marchando bien, es decir, grabo el DS1307 desde el microcontrolador y lo leo en LCD sin problema.

Ahora, recurro de nuevo a su eminente asistencia, resultó que,:

yo utilicé el puerto B como entrada/salida en el i²c, y ahora para la parte de escritura pulsadores me dicen que debo usar una interrupción ( y he usado ya el Rb1/INT):

#use fast_io (b)

#use i2c(MASTER, SDA=PIN_b1, SCL=PIN_b0,slow), lo que me obliga a cambiar los pins para el i²c , ya sea para usar otros del puerto B, o los que dicen SDA y SCL , que son del puerto C, procedimiento que me hace dudar.Cosa qu etenga que ver con la biblioteca del lcd.c, creo.

La otra opción, quizás más cómoda y que también es de mi ignorancia, es implementar otra entrada de interrupción por software( en una rutina del programa) que se me sugirió.

La idea es que la entrada que quede como interrupción recibirá el pulso del reloj DS1307 a 1Hz que será la frecuencia de lectura, en la qque se actualiza el tiempo en el diplay LCD.

Lamento molestarlos de nuevo, necesito de sus indicaciones que cuando resulte, será un gusto, que bien editado quede para todos los usuarios.

De antemano gracias.
 
Buenos días estimados foristas,

De nuevo los molesto con algo, espero no los aburra. El asunto es que pretendo inicializar cada rutina de MODE, SET, y RESTART con el pulso de los botones, pero tengo el incoveniente de que al dar el pulso para inicar esa rutina, uso un

do{
if (input(PIN_B))
....................;
}
while (true);
y es un problema porque , yo pulso, pasa de 0 a 1 y eso activa la rutina respectiva, más me hace que le repita mientras esté en alto, (se ejecuta varias veces la misma acción sin control y un incremento puede ser toda una lucha).
Tengo la idea de implementar interrupciones, no sé si es válido llamarlas así ya que quiero es que me manden a esa rutina, es decir, la condición del pulso se cumple y se ejecuta una vez por pulso.

do{XXXXX
ifXXXX
}
while (true);

Mi idea es implementar por software la "captura o detección de flanco ascendente" que me ayuda a distinguir el pulso, y no su duración, así para otro cambio, se debe por fuerza, dar otro pulso.

He visto que se trabaja el pin RB0/INT , pero ese es de hardware y yo quiero tres entradas de pulsador que me detecten flanco ascendente por software, asignar los tres pins, y enviar a las rutinas de servicio a la interrupción , respectivas.

No sé si puedo usar el CCP1 para las tres entradas, he visto algo como:

#INT_CCP1
enable_interrupts(GLOBAL);// también hay INT_EXT, de hecho una de esta forma:

#INT_CCP1
#INT_EXT
setup_ccp1(CCPCAPTURE_RE);//configuro modulo CCP para flanco ascendente
enable_interrupts (int_ext);// activo as interrupciones externas (RB0/INT) que no quiero usar
ext_int_edge(L_TO_H);// configuro la interrupción cuando esté en alto
enable_interrupts(INT_CCP);//activo interrupción por CCP1
enable_ interruppts(GLOBAL);//activo todas las interrupciones.

Mi pregunta es si puedo hacer algo así, sin usar al RB0:

#INT_CCP1


setup_ccp1(CCPCAPTURE_RE);//configuro modulo CCP para flanco ascendente
enable_interrupts(INT_CCP);//activo interrupción por CCP1
enable_ interruppts(GLOBAL);//activo todas las interrupciones.

y la otra es como hago eso una señal para que me active el
do{...

if
}
while(true);

¿acaso debo usar flags para cada interrupción, comprobar estado de flag por if, y ejecutar la rutina?
, una manera de trnasferir lo que pasa en esa entrada de pulso a la señal de inicio de la rutina respectiva.
¿Hay que borrar el flag una vez se realice rutina para evitar ineterrupciones falsas, cierto?
otra ideas es usar CCP1, CCP2 y RB0, en caso de que necesite un mecanismo para cada rutina.

Por favor, de verdad estoy confundido, gracias por su ayuda.
 
Última edición:
Hola, me meto al tema...
- Sabes que es el CCP??? como trabaja y que funciones cumple? o solo lo has visto y quieres probar sin saber como trabaja...
- Veo que tu problema es con el control de los pulsadores, eso es todo un tema y hay técnicas; haber que tal así:

Código:
if(input(PIN_B)){   // Entra si el flanco es alto
     while(input(PIN_B));  // Espera a que sea 0 (pase a flanco bajo)...
     delay_ms(20);  // Una forma de evitar el efecto debounce que provocan las partes mecánicas del pulsador.
     ...
     ...
     // Resto de código
}

saludos.
 
En realidad conozco muy poco del módulo de captura,comparación y pulso mod, pero es que ví que con él se podía hacer lo del flanco ascendente.
Ahora que me lo dices, también alguien me dijo que puedo usar algo que me evalúe estado del pin, si es alto, entra a rutina qu elo ví en un programita de pulsasor y encendido de led, en otro pin distinto del de pulsador.
Pero si eso que em escribes es lo que pienso de que evalúa estado, está en alto y pasa a flanco bajo, es decir espera a que se cumpla el pulso desde inicio hasta que lo suelto, y hace el antirebote que es típico de estas aplicaciones en digitales, creo que me sacas de apuros.
Todo es porque es mi primer programa de C y bueno, ya verás no soy un virtuoso aún.
 
El while y delay_ms también lo puedes poner al final antes de salir de IF, eso para que ejecute el código al pulsar y solo espere a que suelten el pulsador... para ambos (al principio o final de IF) solo pasará una vez por la rutina dentro de IF cada vez que pulses.

En CCP en modo captura permite capturar el valor que tiene en registro TMR1 cuando ocurre un evento especial en la terminal usado por el CCP (puedes usarlo con el pulsador pero como hay rebotes va suceder la interrupción varias veces...).
 
Última edición:
Hola foreros, ahora tengo que realizar el manejo de un reloj, para esto se utilizara un ds1307, por el momento lo estoy simulando en el proteus
pero un problema y es que se ha hecho muy lento el programa, y apenas tengo unas cuantas lineas, aunque estoy estoy leyendo todos los datos que me puede dar, es demasiado lento....

Digo esto por que en el proteus al simular, me aparece otra pantalla con los datos del reloj (ds1307), y el lcd, ambos cambian simultaneamente, pero despues de como 10 seg reales avanza un segundo estos 2 relojes.

Esta es la programacion que tengo, si alguien tiene alguna libreria, lo agradeceria mucho.

Esta es la libreria:

//Subrutina para DS1307

int BCDaBIN(int bcd){
int varia;
varia = bcd;
varia >>= 1;
varia &= 0x78;
return(varia + (varia >> 2) + (bcd & 0x0f));
}

void tiempo(byte &hor, byte &min, byte &sec, byte &diasem, byte &fecha, byte &mes, byte &anio){
i2c_start(); //Escritura
i2c_write(0:LOL:0); //Código de escritura
i2c_write(0x00); //Puntero a la primera dirección
i2c_start(); //Lectura
i2c_write(0:LOL:1); //Código de lectura
sec = BCDaBIN(i2c_read()&0x7f);
min = BCDaBIN(i2c_read()&0x7f);
hor = BCDaBIN(i2c_read()&0x3f);
diasem = BCDaBIN(i2c_read()&0x07);
fecha = BCDaBIN(i2c_read()&0x3f);
mes = BCDaBIN(i2c_read()&0x1f);
anio = BCDaBIN(i2c_read(0));
i2c_stop();
}

Y esta es la programacion:

#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use i2c(Master,sda=PIN_C4,scl=PIN_C3)
#include <lcd.c>
#include <ds1307.c>
int hr,min,sec,diasem,fecha,mes,anio;

void main() {
lcd_init();
while(1){

tiempo(hr,min,sec,diasem,fecha,mes,anio); //Lee tiempo del DS1307
lcd_gotoxy(1,1);printf(lcd_putc,"%2u:%2u:%2u",hr,min,sec); //Visualiza en LCD la hora
lcd_gotoxy(1,2);printf(lcd_putc,"%2u:%2u:%2u:%2u",diasem,fecha,mes,anio); //Visualiza en LCD la hora

}
}

David Nunez.
 
Atrás
Arriba