Reloj con DS1307 no arranca en la práctica

Después de liar concienzudamente con los puertos, se hizo la luz, espero que a alguien le sirva. Al configurar los puertos con #Use fast_io(X), permite trabajar con los pines I/O y un puerto serial.
En cuanto se hace uso de un segundo puerto serial, el resto de pines I/O queda inutilizados.
Bastaba con borrar el #Use fast_io(X) para que por defecto tomara el #Use standar_io(X) o para verlo mejor, prescindir de esas directivas y recurrir a las sentencias de nuestro assembler elemental;) asi:
#BYTE TRISA=0X85
#BYTE TRISB=0X86
#BYTE TRISC=0X87
#BYTE PORTA=0X05
#BYTE PORTB=0X06
#BYTE PORTC=0X07
.
.
.
void main()
{ PORT_B_PULLUPS(0x0F);// pullup a las entradas
// desactivo el comparador y el ADC
setup_comparator(NC_NC_NC_NC);
SETUP_ADC(ADC_OFF);
// Desactivo el SPI
SETUP_SPI( SPI_SS_DISABLED);

//______________________________________________________________

TRISA=0XF0;
PORTA=0X00; // Para determinar el estado inicial
TRISB=0X1F;
TRISC=0X84;
ds1307_init();//se inicializa el ds1307
.
.
.
 
Saludos.
Si alguna librería la vas a utilizar en varios proyectos, puedes agregarla dentro de la carpeta Drivers.
Así ya no tienes que copiar la o las librerías dentro de cada carpeta de proyecto.
Esta carpeta se encuentra en el directorio de instalación del PCWHD Compiler de CCS

Suerte.
Buen día. Tengo una pregunta algo similar.
He estado tratando de poder modificar la hora del DS1307 para un proyecto que quiero hacer, después de tanto batallar por fin lo logré.

El problema es que ahora después de modificarle la fecha, el reloj funciona bien pero después de un rato dejándolo simulando, el reloj pone valores extraños (comenzando por el año)

Ya no sé dónde esté el error. He checado la librería del DS1307 y está bien.
No sé si tenga que añadir algo más. (El problema solamente me sucede con la fecha)

Espero puedan ayudarme a ver mi error.
Muchas gracias.

Adjunto código en C de CCS y la simulación.:cry:
 

Adjuntos

  • hora+temp+luxPWM+VENTILADORES.rar
    230.9 KB · Visitas: 25
Última edición por un moderador:
Olvidaste incluir la librería "DS1307.c" que es donde puede estar el error, y también la librería "Flex_LCD.c", aunque ésta última no es muy importante porque se puede usar la librería "lcd420.c" que viene con el compilador.
 
Olvidaste incluir la librería "DS1307.c" que es donde puede estar el error, y también la librería "Flex_LCD.c", aunque ésta última no es muy importante porque se puede usar la librería "lcd420.c" que viene con el compilador.

Es cierto, una disculpa, aqui adjunto los archivos.
No eh modificado nada en la librería, solo eh copiado los comandos para enviar info al ds1307 y reescribir sus datos pero tal vez este pasando algo por alto, gracias por responder darkbytes, buen inicio de fin de semana
 

Adjuntos

  • Desktop.rar
    164.6 KB · Visitas: 20
Hay bastantes problemas con el programa, tantos, que en la simulación se muestran las advertencias continuamente.
Mira las siguientes imágenes:

Advertencias en ISIS
Proteus Simulation Log 001.jpg

Advertencias del Compilador
PIC C Compiler Warnings.jpg

Las primeras se deben a que estás comparando valores menores a 0 usando variables sin signo. "Unsigned"
Las restantes se deben a que estas ingresando retardos en la rutina interrupción externa y usando instrucciones que también los usan.

Todas esas estructuras que usas en la rutina de interrupción, las debes usar en otras subrutinas o dentro del bucle principal.
Y usar el servicio de interrupción, para establecer cambios en banderas, incremento de variables, etc.
Pero no usarlo para procesar rutinas completas y mucho menos con retardos.

Si yo lo compilo, ni siquiera me muestra datos la pantalla.
Y eso se debe a que uso una versión más actual del compilador, de la que tú tienes.
Ahora PIC C Compiler es más estricto en cuanto a la inicialización de instrucciones nativas.

Entonces deberás corregir esos problemas y separar las rutinas.
También te recomiendo que te bases en el programa del post #10
Y para el cambio de hora y fecha, puedes usar la rutina de éste post: Arduino UNO + RTC
 
Última edición:
TSSSSS, Muchisimas gracias Darkbytes, intentare todo lo que me dices para sacar adelante el programa, checare principalmente lo de los mensajes de error ya que sinceramente en algunos no sabia por que razon me los arrojaba, actualizare mi versio del compilador:D e intentare lo mencionado, muchas racias por tus utiles consejos, ya me has ayudado anteriormente y de verdad agradezco mucho tus aportes, en caso de tener otro error espero me puedas aconsejar, muchas gracias(y)
 
Buenas noches.

Hace un par de meses que he empezado con este tema de los PIC.

Lo primero que he hecho ha sido un Reloj basado en el DS1307.

Este proyecto está sacado del libro...

"MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
E. Palacios, F. Remiro y L. López.
Editorial Ra-Ma. www.ra-ma.es

En el proyecto viene la Librería (muy documentada) para manejar el DS1307

No se si las normas del Foro permiten publicarla, en el libro no he visto nada que lo impida, es más, invita a modificar todos los archivos que vienen como ejemplo.

Si crees que puede ser de utilidad, y si está permitido, la publicaría.

Sal U2
 
Buenas noches.

Hace un par de meses que he empezado con este tema de los PIC.
Eso es muy bueno, me da mucho gusto que te introduzcas al mundo de los microcontroladores.

Lo primero que he hecho ha sido un Reloj basado en el DS1307.

Este proyecto está sacado del libro...

"MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
E. Palacios, F. Remiro y L. López.
Editorial Ra-Ma. www.ra-ma.es

En el proyecto viene la Librería (muy documentada) para manejar el DS1307
Muy buen libro y bien explicado para iniciarse con los PIC, en lenguaje ensamblador.

No sé si las normas del Foro permiten publicarla, en el libro no he visto nada que lo impida, es más, invita a modificar todos los archivos que vienen como ejemplo.

Si crees que puede ser de utilidad, y si está permitido, la publicaría.
El libro que ya va en su 3a edición, no se puede publicar porque contiene derechos de autor y aún están a la venta.
Sin embargo, el mismo autor muestra los ejemplos públicamente y también se pueden descargar.
Microcontrolador PIC16F84. Desarrollo de proyectos

Ahí también se muestran las modificaciones que se deben realizar para que las simulaciones en Proteus funcionen.
 
Hay bastantes problemas con el programa, tantos, que en la simulación se muestran las advertencias continuamente.
Mira las siguientes imágenes:

Advertencias en ISIS

Advertencias del Compilador
Ver el archivo adjunto 144249

Las primeras se deben a que estás comparando valores menores a 0 usando variables sin signo. "Unsigned"
Las restantes se deben a que estas ingresando retardos en la rutina interrupción externa y usando instrucciones que también los usan.

Todas esas estructuras que usas en la rutina de interrupción, las debes usar en otras subrutinas o dentro del bucle principal.
Y usar el servicio de interrupción, para establecer cambios en banderas, incremento de variables, etc.
Pero no usarlo para procesar rutinas completas y mucho menos con retardos.

Si yo lo compilo, ni siquiera me muestra datos la pantalla.
Y eso se debe a que uso una versión más actual del compilador, de la que tú tienes.
Ahora PIC C Compiler es más estricto en cuanto a la inicialización de instrucciones nativas.

Entonces deberás corregir esos problemas y separar las rutinas.
También te recomiendo que te bases en el programa del post #10
Y para el cambio de hora y fecha, puedes usar la rutina de éste post: Arduino UNO + RTC

!!HOLA NUEVAMENTE, BUENOS DIAS!!
Darkbytes eh modificado mi código según tus recomendaciones, hice los siguientes cambios:

-actualicé mi compilador (ccs) a una versión mas reciente
-las variables las puse tipo signed para que no me arrojara advertencias de valores menores a cero
-elimine la interrupción que tenia la rutina de modificación de hora y toda esa rutina la puse dentro del bucle principal (while).

Con estas modificaciones el compilador ya no me arroja todas las advertencias que me arrojaba pero al simular después de un corto tiempo sigo teniendo el error de que aparecen valores extraños en la hora y la fecha.

Después de esto intente colocar tu código ejemplo (está adjunto en la carpeta) pero no pude colocarlo bien ya que ahi tienes una función para escribir y leer el ds1307 que no enconté pero aparte de eso no entiendo porque se modifican los valores del ds1307, no eh modificado su rutina:cry:
adjunto imagenes, librerias y codigo con simulacion.
MUCHAS GRACIAS
 

Adjuntos

  • hora+temp+luxPWM+VENTILADORES.rar
    376.4 KB · Visitas: 14
Yo pienso que el problema se encuentra en la rutina de conversión a BCD, pero no está incluida la librería de esa rutina.
También sigue faltando la librería flex_lcd.

La rutina para leer el DS1307 está dentro de la librería DS1307.c
De hecho tiene las rutinas básicas que se requieren.

 
Buenas arturkick
Estuve analizando tu código :unsure:, y veo que lo estas complicando demasiado, ya en tu librería ds1307.c tienes todas las funciones de leer y escribir la rtc, solo la tienes que llamar desde tu programa principal.
por ejemplo:
PHP:
#include <16f887.h>
#fuses XT,noprotect,nomclr
#use delay(clock=4M)
#include <DS1307.c>
#use standard_io(B)
#use standard_io(D)
#define LCD_ENABLE_PIN  PIN_B0                                    ////
#define LCD_RS_PIN      PIN_B1                                    ////
#define LCD_RW_PIN      PIN_B2                                    ////
#define LCD_DATA4       PIN_B4                                    ////
#define LCD_DATA5       PIN_B5                                    ////
#define LCD_DATA6       PIN_B6                                    ////
#define LCD_DATA7       PIN_B7  
#include <LCD420.c>
void main (void){ 
   signed int sec2,min2,hora2,dia2,mes2,anio2,dow2; //se establece la fecha inicial a mostrar por medio del valor de las variables
   ds1307_init(); //inicia la rtc ds1307 (funciones de la libreria)
   lcd_init();// inicia la lcd
 while(true){  
   delay_ms(1000);
   ds1307_get_date(dia2,mes2,anio2,dow2);//funcion de la libreria para leer dia, mes , año, dia almacenada en la rtc.
   ds1307_get_time(hora2,min2,sec2);//funcion de la libreria para leer hora, minutos, segundos almacenadas en la rtc
   lcd_gotoxy(13,1);//posicion en el lcd
   printf(lcd_putc,"\%02d:\%02d:\%02d",hora2,min2,sec2);
   lcd_gotoxy(1,1);
 printf(lcd_putc,"%02u/%02u/20%02d",dia2,mes2,anio2);
}
}
//PD: esta funcion sirve para guardar los datos en la rtc:
//ds1307_set_date_time(dia2,mes2,anio2,dow2,hora2,min2,sec2);
 
hola tengo una duda a cerca si se puede modificar la fecha, la hora desde hyperterminal (comunicacion serial) estoy atorado y no se que puedo hacer, entiendo que para cambiar fecha, hora es necesario modificar en la libreria dando valor a las variables de hora, min, sec, day, daw,month, year, pero no se como podria cambiar dichos valores desde una comunicacion serial
 

Adjuntos

  • ds1307.txt
    4.6 KB · Visitas: 10
  • Main.txt
    3.7 KB · Visitas: 9
  • Proteus.rar
    24.2 KB · Visitas: 7
Establece un menú de opciones por RS-232 en el cual se pidan los datos de fecha y hora.
Para eso no es necesario modificar la librería, únicamente pasa los datos obtenidos a las rutinas de la librería.
 
Si, perdón. Después de postear vi que no es necesario modificar toda la librería, simplemente modificando esta parte del programa se puede.

ds1307_set_date_time(7,6,16,3,9,20,00);

Ahora lo que pretendo es hacer lo siguiente:

ds1307_set_date_time(day2,mth2,year2,dow2,hr2,min2,sec2);

Lo que ya no me queda claro, es si está bien que los declare como int8.
Y que si del puerto serial es posible enviar valores enteros, o es mejor pasarlos de ASCII.
¿Cómo me aconsejan que haga la asignación de los valores, con un for, o mediante un arreglo?
 
Última edición por un moderador:
Repito, no tienes que modificar la librería, sólo tienes que pasarle parámetros.

Si la rutina te pide los datos como byte = int = int8, debes proporcionarlos como byte.
Código:
void ds1307_set_date_time([B]BYTE[/B] day, [B]BYTE[/B] mth, [B]BYTE[/B] year, [B]BYTE[/B] dow, [B]BYTE[/B] hr, [B]BYTE[/B] min, [B]BYTE[/B] sec)
Por RS-232 no se puede enviar un valor superior a 255 = 8 Bits = 1 Byte.
Se pueden enviar valores superiores, pero en partes (Bytes) que después integrarás para obtener el valor.
Por lo tanto, todo lo que envías por RS-232 es en ASCII.
Si envías el número 255, (como entero) realmente se envía como ASCII. 255 en ASCII = ÿ
Si lo envías como cadena, se envía (2.JPG5.JPG5.JPG) O sea, el equivalente de cada carácter en ASCII.

Para la asignación de valores puedes usar un arreglo o variables únicas.
Para la estructura de recepción, puedes usar un bucle while, que posiblemente use bucles for.
 
Yo pienso que el problema se encuentra en la rutina de conversión a BCD, pero no está incluida la librería de esa rutina.
También sigue faltando la librería flex_lcd.

La rutina para leer el DS1307 está dentro de la librería DS1307.c
De hecho tiene las rutinas básicas que se requieren.

HOLA buenos días, gracias por responder,por carga de trabajo me pause un poco con este programa pero ya volviendo, me puse a intentar con las instrucciones propias de la librería ds1307 y cuando quiero modificar los datos (hora, minuto, día, año, mes) si se modifican pero solo funciona bien por unos pocos segundos pues después me arroja datos muy extraños, realmente me eh bloqueado en ese paso, otra cosa que hice fue hacerlo con una memoria externa (no necesario pero por desesperación :cry: ) y para que te comento; mejor regrese a lo mismo. quiero que este programa sea un aporte, así que cuando quede (después de añadirle otras funciones) lo subiré al foro. Una disculpa por haber olvidado incluir algunos archivos, ahora si los adjunto, quedo pendiente y AGRADEZCO MUCHO TU AYUDA

arturkick dijo:
HOLA buenos días, gracias por responder,por carga de trabajo me pause un poco con este programa pero ya volviendo, me puse a intentar con las instrucciones propias de la librería ds1307 y cuando quiero modificar los datos (hora, minuto, día, año, mes) si se modifican pero solo funciona bien por unos pocos segundos pues después me arroja datos muy extraños, realmente me eh bloqueado en ese paso, otra cosa que hice fue hacerlo con una memoria externa (no necesario pero por desesperación :cry: ) y para que te comento; mejor regrese a lo mismo. quiero que este programa sea un aporte, así que cuando quede (después de añadirle otras funciones) lo subiré al foro. Una disculpa por haber olvidado incluir algunos archivos, ahora si los adjunto, quedo pendiente y AGRADEZCO MUCHO TU AYUDA

aqui dejo los archivos correspondientes:D
 

Adjuntos

  • hora+temp+luxPWM+VENTILADORES.rar
    269.6 KB · Visitas: 10
Me parece que debes tener más cuidado al programar, ya que tienes varios problemas.

  • En la rutina "temperatura" no estás defiendo el canal a usar. Hace falta: setup_adc_ports(sAN2);
  • Sigues comparando una variable sin signo con un valor menor a 0: if(menu<0)menu=6;
  • Debes ver que parte de tu programa genera contenciones lógicas en los pines RD4, RD5, RD6 y RD7
Logic contentions.jpg

Todo esto puede provocar que el microcontrolador no opere correctamente y por consecuencia fallen las rutinas del DS1307.

Te sugiero que realices pruebas independientes de tus rutinas y cuando las tengas funcionando sin problemas, las incluyas a tu programa principal.​
 
Me parece que debes tener más cuidado al programar, ya que tienes varios problemas.

  • En la rutina "temperatura" no estás defiendo el canal a usar. Hace falta: setup_adc_ports(sAN2);
  • Sigues comparando una variable sin signo con un valor menor a 0: if(menu<0)menu=6;
  • Debes ver que parte de tu programa genera contenciones lógicas en los pines RD4, RD5, RD6 y RD7
Ver el archivo adjunto 145142

Todo esto puede provocar que el microcontrolador no opere correctamente y por consecuencia fallen las rutinas del DS1307.

Te sugiero que realices pruebas independientes de tus rutinas y cuando las tengas funcionando sin problemas, las incluyas a tu programa principal.​
muchas gracias, ya anteriormente había probado por separado las cosas y funcionaban pero con esto que me dices me doy cuenta de que vengo arrastrando esos problemas sin haberme dado cuenta en su momento, tendre mas cuidado y voy a verificar entonces la estructura de mi programa, muchas gracias nuevamente y si ya lo puedo realizar todo de una vez pues estaré subiéndolo.
lo que no entiendo es a que te refieres con "contenciones lógicas" en los pines?, a que se debe o que lo causa?, la verdad quise investigar acerca de ello pero no encontré referencias(excepto una tuya donde explicas un problema con el programa de una lavadora entro del foro :unsure:). !!!!!!MUCHAS GRACIAS POR LA AYUDA DARKBYTES :apreton: ¡¡¡¡
 
Lo que no entiendo es a que te refieres con "contenciones lógicas" en los pines.
¿A qué se debe, o qué lo causa? La verdad quise investigar acerca de ello pero no encontré referencias (excepto una tuya donde explicas un problema con el programa de una lavadora entro del foro :unsure:)
Una contención lógica es cuando dos o más terminales (pines) entran en corto circuito.
Esto sucede más en sistemas bidireccionales, cuando ambas se comportan como salidas y sus niveles lógicos son opuestos.

En tu programa lo que puede estar causando esa falla, es la librería que estás usando para la pantalla.
Al no cumplir con los tiempos adecuados de I/O (Entrada y salida) para el bus de datos, entran en colisión.

Solución: Modificar los tiempos de I/O, o usar la librería que viene con el compilador. "lcd420.c"
 
Atrás
Arriba