desktop

Reloj con DS1307 no arranca en la práctica

¿Podría explicarme por qué cuando está funcionando mi reloj tiempo real en el lcd se aprecia el tiempo que transcurre así: 10:10:10? pero solo por momentos.
Ah, otra cosita, quisiera que lo revise a ver si es normal que mi declaración eeprom 0,[6,0] , read 0, hora_al (pause 10) y read 1, min_al (pause 10) vallan dentro del bucle programa. ¿No habrá ningún problema?
Posiblemente al mostrarse 10:10:10 se deba a incompatibilidad de formatos.
Prueba haciendo depuraciones del programa usando como debug la salida serial sobre las variables que tengas duda, ya que PBP 2.60x no puede crear archivos *.cof y así dar un seguimiento al problema.

No te recomiendo que la escritura de la memoria EEPROM la estés realizando dentro del bucle principal del programa.
Recuerda que se trata de un reloj y que estarás de esa forma escribiendo en la memoria cada segundo por mucho tiempo, así pronto se dañará la memoria.
Si solo vas a escribir un valor constante, realiza esa escritura antes de entrar al bucle del programa.

Saludos.
 
Última edición:
Hola amigo Darkbytes, queria agradecerle por su ayuda prestada por medio de este magnifico foro; a la vez quisiera postear el programa fuente del reloj, para que lo revise, a ver si es así como funcionaria mejor con las variables antes mencionadas y la eeprom fuera del bucle programa.
https://www.forosdeelectronica.com/f24/reloj-ds1307-arranca-practica-79541-post899549/#post899549
Ademas quisiera hacerle otra consulta, ah este reloj_alarma quisiera agregarle otras funciones,como encendido de leds de manera alternada,el programa que adjunto se llama programa sem y mi pregunta seria si se puede aumentar este programa sem como lo presento ahí con (pauses 1000) dentro del programa del reloj o quizás hay que utilizar alguna interrupcion? adjunto esquemas en proteus y programa fuente en pbp.
Gracias...
 

Adjuntos

  • archivo1.rar
    37.7 KB · Visitas: 49
Última edición:
a este reloj_alarma quisiera agregarle otras funciones, como encendido de leds de manera alternada, el programa que adjunto se llama programa sem y mi pregunta sería, ¿si se puede aumentar este programa sem como lo presento ahí con (pauses 1000) dentro del programa del reloj o quizás hay que utilizar alguna interrupción?
No entiendo bien que es lo que quieres hacer con el programa de fases, pero no debes agregar retardos tan largos dentro del programa.
Recuerda nuevamente que se trata de un reloj y que si incluyes retardos vas a tener lecturas desincronizadas.

Una posible forma de hacerlo, sería con el TMR1 y que desborde cada segundo, pero se necesita el oscilador externo con cristal de 32768Hz, y éste va conectado a los pines RC0/T10S0 y RC1/T10SI.

El procedimiento que te menciono está por aquí: Temporizador con TMR1

Suerte.
https://www.forosdeelectronica.com/...c-picbasic-pro-20658/index124.html#post789960
 
Claro Amigo Darkbytes, quisiera insertar este (programa sem) a mi reloj, dicho sea de paso lo adjunto solo el programa sem en isis, y eh entendido que tendria que ser con interrupciones tmr.


Eh ido a la dirección que ud, me envio ( Temporizador con TMR1, arriba) sobre interrupciones y Ud, me recomienda cambiar el oscilador por otro de 32768, para mas presición pero le pregunto, podria hacer interrupción con el mismo cristal de mi proyecto que es de 20 mhz? si ? ya que me conformaria con este si es que me aproximara lo mas cerca a la frec de 1 mhz?

Le agradezco su ayuda amigo Darbytes, si es que me enviara a una direccion que pueda hacerme el ciclo que hacen mis dos fases que estan en isis con interrupciones?
Gracias
 

Adjuntos

  • ESQUEMA.rar
    13.4 KB · Visitas: 31
He ido a la dirección que ud, me envió ( Temporizador con TMR1, arriba) sobre interrupciones y Ud, me recomienda cambiar el oscilador por otro de 32768, para mas precisión pero le pregunto, podría hacer interrupción con el mismo cristal de mi proyecto que es de 20 mhz? si ? ya que me conformaría con este si es que me aproximara lo mas cerca a la frec de 1 mhz?
No tienes que cambiar el cristal de 20MHz, tienes que poner otro cristal de 32768Hz.
se necesita el oscilador externo con cristal de 32768Hz, y éste va conectado a los pines RC0/T10S0 y RC1/T10SI.
Así que, no tienes porque cambiar el cristal de 20MHz por otro de 32768Hz.
Este otro oscilador será el que se sincronizará externamente con el TMR1 para obtener 1Hz.
¿No sé si quisiste decir 1Hz en vez de 1MHz.?
¿si es que me enviara a una dirección que pueda hacerme el ciclo que hacen mis dos fases que están en isis con interrupciones?
Lo que tienes que hacer, es incluir tus rutinas dentro de la rutina que atiende la interrupción por desborde del TMR1 y realizar conteos para ir cambiando la fases.
Sólo recuerda que no debes usar retardos, únicamente conteos y cada conteo avanzará una vez por segundo.

Mira bien los ejemplos del enlace que puse, ahí verás como sincronizar el timer para obtener 1Hz.

También puedes usar la salida que genera el DS1307 y hacer uso de la interrupción por RB0.

Suerte.
 
Hola amigo Darkbytes, estuve analizando su programa de tmr1 con crystal externo de 32768, pero aun no logro masticar bien el programa, estuve intentando interrumpir con tm0 y bueno mi led rojo enciende, mi led amarillo también , mi led verde también, pero no! regresa al inicio para volver hacer la secuencia, Que estara pasando verdad? Adjunto mi programita y mi esquema,en isis.
 

Adjuntos

  • timer.rar
    18.4 KB · Visitas: 26
Hola amigo Darkbytes, estuve analizando su programa de tmr1 con crystal externo de 32768, pero aun no logro masticar bien el programa, estuve intentando interrumpir con tm0 y bueno mi led rojo enciende, mi led amarillo también , mi led verde también, pero no! regresa al inicio para volver hacer la secuencia
Te adjunto un ejemplo usando el TMR1 para que entiendas sobre los conteos que te mencioné.
Así de esta forma solo tienes que hacer conteos basados en segundos.
Por ejemplo, si quieres un retardo de 3 minutos: 3 x 60 = 180 segundos.
Entonces cargas las constantes del programa con los segundos que requieras para el encendido de los LED.

Usando este método puedes generar las secuencias sin que afecten al programa principal.

Suerte.
 

Adjuntos

  • 16F628A TMR1 1Seg para semáforo.rar
    17.1 KB · Visitas: 40
Hola amigos Darbytes todo este tiempo estuve queriendo hacer funcionar el programita antes mencionado mostrado es decir 16F628A TMR1 1Seg para semáforo con pic 16f877a pero no me sale nada , ya estoy varios dias en esto , seguro que alguna interrupción de 16f628a es distinta con 16f877a. ¿por que?
 
seguro que alguna interrupción de 16f628a es distinta con 16f877a. ¿por que?
Nop, la configuración de registros es la misma, lo que debes tener en cuenta, es que en el 16F877A, el cristal va conectado en los pines 15 y 16 (RC0 y RC1)
Para convertir los pines en entradas digitales, en el 16F628A se configura el registro CMCON y en el 16F877A es el registro ADCON1, obviamente también cambia la palabra de configuración.

De ahí en fuera, lo demás para hacer funcionar ese programa es lo mismo.
 
Última edición:
Hola amigo darkbytes otra vez por aqui por este foro despues de un tiempo ausente, quisiera agradecerte por tus ayudas antes mencionadas poor este foro.
Mira estoy queriendo ya plasmar el reloj que me enseñastes al principio de este foro con pic 16f628a, lcd 16x2, y rtc 1607 con battery de 3v, speaker de telefono fijo, entonces, lo que pasa es que estoy queriendo acondicionarlo en una cajita especial pequeña en donde no cabe un transformador pequeño y lo estoy haciendo con una fuente directa de 220v,diodos puente de 1A, zener 12v, (adjunto imagen de la fuente), se que es muy peligrosa pero doy fe que soy muy cuidadoso con ello, queria saber si ud, aprueba mi diseño de tarjeta con fuente s/n trafo, ademas queria saber si tiene algun afecto en el trabajo del rtc (efectos de retrazo o adelanto),lcd,pic,rele ademas si trabajaria bien con ese relay de 12v o es mejor un triac y un moc? por favor amigo darkbytes gracias por su respuesta.
Adjunto imagenes de mi proyecto
Gracias
 

Adjuntos

  • imagenes.rar
    77.7 KB · Visitas: 26
No sé si ya probaste el esquema de la fuente de poder "fuente.png" lo digo por qué no pusiste la capacidad del diodo Zener.

Tienes únicamente un diodo Zener de 5V. y no especificas los Watts de trabajo, el capacitor de 0.22uF está bien, el de filtraje deberías aumentarlo a unos 470uF .
Debes calcular y poner una resistencia para limitar la corriente de consumo, o adiós diodo Zener y todo lo demás.

Lo demás lo veremos después.
 
Última edición:
La fuente de la imagen (la fuente .png) trae un diodo zener de 5v, pero a este dido zener quiero sustituirlo por otro Diodo zener de 12v para levantar el rele, y de la misma por medio de un resistor de 0.47 ohm al regulador 7805, sin alterar los valores de los demás componentes de la fuente antes mencionada, no se si estaré haciendo bien.
El watiaje del zener seria de mas o menos 1.2 watts.



Con respecto a la resistencia que protega al zener te refieres a esta verdad?
 

Adjuntos

  • fuente corregida [640x480].jpg
    fuente corregida [640x480].jpg
    25.1 KB · Visitas: 22
Última edición:
Amigo D@rkbytes y con respecto a los demás componentes su funcionamiento ¿afectan? ¿cambio el rele por un triac o está bien ahí el diseño?
En ambos casos está bien, pero todo depende lo que quieras controlar.
Si no necesitas alta velocidad de conmutación, el relevador está bien mientras la fuente pueda con todo.
Así que necesitas hacer un cálculo aproximado sobre el consumo total del circuito para saber por qué optar.
 
Hola amigos acudo a ustedes por varias dudas que tengo en el proyecto que estoy realizando, siempre agradecido por que en este foro y sus participantes he aprendido mucho y siempre me han prestado ayuda :)

Es primera vez que trabajo con el i2c y este ds1307, pero me he documentado bastante y he estado luchando con el codigo..

Mi programa consiste en configurar un ds1307 con un pic16f877a, configuro la hora actual por medio de programacion... sin lcd ni teclado ni nada... teniendo el pic ubicado en el tiempo, hora actual dia, mes, año y todo eso... quiero hacer unas alarmas para encender un timbre escolar... el timbre lograra encenderse por lo menos 5 segundos, a las 8am, 10am 4pm.. esta se ubicara en el puerto C,1.
Este se encender todo el año.. menos los días sábado y domingo y en el mes de agosto que es seguro que el colegio esta de vacaciones.. por que el inicio y final de clases varia cada año asi que pensé que cuando se fuera de vacaciones solo desconectaran el pic(su alimentacion) y que siga trabajando el ds1307, y cuando regresen conecten el pic(por medio de un switch) y asi pueda encender el timbre normal mente...

El led que coloque es para checar a cada rato si el reloj esta activo(funcionando) si no esta el led en portc,0 encenderá, por si deja de funcionar la cosa.. se que es el ds1307.

Pero tengo varios dias y noches luchando con el código pero aun no me da lo que quiero.

Como hacer para que cuando enciendan el pic saber si el reloj ya esta trabajando(ya configurado) por que si hay un apagon el pic configurara una hora que no es y cuando regresen de vacaciones. ?

una pregunta tonta.. cuando configuro el rtc, para escribir los segundos, minutos, etc, es decir sus registros, tengo que enviar los datos en binario y cuando los leo están en bcd???... o yo le envio datos en bcd(al reloj) y el me envia datos en bcd. ???????

Leyendo el hilo del tema me di cuenta que cuando leo los registros y los guardo en las variables para luego comparar si es la hora y dia correcto para encender el timbre podría ser mi error.. sera cierto??.. y como hago para comparar 2 números en bcd ?. O sera que tengo que llevar ese bcd a binario para comparar después??

no lo trabajo con interrupciones por que como soy principiante nunca he trabajado con ellas.. seria mejor hacer el programa con interrupciones?

Adjunto mi esquema en proteus y el codigo. Espero que puedan ayudarme

Gracias de atemano... :apreton:
 

Adjuntos

  • Ejercicio I2C con Ds1307.rar
    71 KB · Visitas: 48
El led que coloqué es para checar a cada rato si el reloj esta activo(funcionando) si no está, el led en portc,0 encenderá.
Por si deja de funcionar la cosa, sé que es el ds1307.
Para eso puedes utilizar el pin de salida de onda cuadrada (SQW/OUT) del DS1307.
Debes inicializarlo con el comando para que se obtenga una señal de onda cuadrada por ese pin.
¿Cómo hacer para que cuando enciendan el pic, saber si el reloj ya está trabajando (ya configurado) porque si hay un apagón el pic configurará una hora que no es.
¿Y cuando regresen de vacaciones?
Si no quieres usar LCD eso se complica, pero si el DS1307 tiene pila no se deben perder los datos iniciales.
También puedes usar una conexión RS-232 para ajustar y verificar la hora.
Puedes usar un FT232RL para trabajar con RS-232 y comunicarte con una LAPTOP o PC por USB.
Una pregunta tonta. ¿Cuando configuro el rtc para escribir los segundos, minutos, etc, es decir sus registros, tengo que enviar los datos en binario y cuando los leo están en bcd o yo le envio datos en bcd (al reloj) y el me envía datos en bcd?
Eso viene en la hoja de datos del DS1307, tanto envío como recepción de datos son en BCD.
Leyendo el hilo del tema me di cuenta que cuando leo los registros y los guardo en las variables para luego comparar si es la hora y día correcto para encender el timbre ¿Podría ser mi error? ¿Será cierto? ¿Y cómo hago para comparar 2 números en bcd?
O será que tengo que llevar ese bcd a binario para comparar después?
Para eso tienes que usar rutinas de conversión de decimal a BCD y viceversa.
Mira más ejemplos por el foro, pues existen programas en ensamblador para el DS1307.
No lo trabajo con interrupciones porque como soy principiante nunca he trabajado con ellas.
¿Sería mejor hacer el programa con interrupciones?
Claro que sería mejor que trabajaras el programa con interrupciones.
De esa forma puedes actualizar la hora cada segundo usando el pin SQW/OUT y la interrupción por RB0.

Suerte.
 
Gracias por responder, algo puedo rescartar del codigo que adjunte?,quisiera saber que tiene malo ese código, no se si lo revisaste... me desvelare tratando que funcione, si no comenzare desde cero haciendo con interrupciones y a documentarme bastante..

Gracias
 
Última edición:
¿Algo puedo rescatar del código que adjunté?
Quisiera saber que tiene malo ese código, ¿no sé si lo revisaste?
Me desvelaré tratando que funcione, si no, comenzaré desde cero haciéndolo con interrupciones y a documentarme bastante.
Lo que puedes rescatar y posteriormente modificar si lo piensas reescribir, son las rutinas principales.
Como la inicialización del RTC y las que creas necesarias.

Lo que veo que tienes que corregir, son las rutinas donde regresas con goto en vez de return.
Trata de darle una mejor estructura al programa para que tú mismo logres una mejor comprensión.
 
Hola yo nuevamente neciandolos jajja

Me puse manos a la obra y leyendo mas en san google, viendo mas ejemplos, logre que me funcionara el reloj con interrupción por Rb0, configuro la hora mediante el programa y funciona perfectamente y hasta con ayuda de un ejemplo muestro el tiempo del reloj en una lcd :D

Pero ahora tengo un problema con las alarmas, es que cuando debería de encenderme el timbre no enciende, simule un circuito con un rele, para encender una lampara en proteus que seria el timbre. 1 = timbre apagado, 0=timbre encendido. por unos 6 o 7 segundos

escribí un codigo para poner el portD,0 encendido cuando sean las 8, 10horas, y 16horas, en punto, pero no se porque no funciona.

Si alguien me podria echar una mano con esto si no es mucha molestia estaría agradecido:apreton:

adjunto lo que llevo hasta hora
 

Adjuntos

  • ds1307 con interrupcion.rar
    24.6 KB · Visitas: 34
Atrás
Arriba