desktop

Reloj con DS1307 no arranca en la práctica

Muy buenas tardes a todos,
primera vez que escribo y es para preguntar , mil disculpas pero como dicen quien no pregunta nunca aprende
monte en proteus el reloj con ds1307 y corre perfectamente,pero al pasar al protoboard no arranca , porlo que he leido me falta iniciar el ds1307 con el bit 7 ch=0,pero ese es problema parami donde lo inserto en el programa

adjunto el programa en proton es el que medio he aprendido a usar AGRADECERE LA AYUDA

Código:
Device 16F628A
 Config  INTRC_OSC_NOCLKOUT,WDT_OFF,PWRTE_ON,CP_OFF,BODEN_OFF,LVP_OFF,MCLRE_OFF
CMCON=7 
TRISB=%11
TRISA =%111 ;el puerto A.0 es de entrada
define lcd_dreg PORTB
define lcd_dbit 4
define lcd_rsreg PORTB
define lcd_rsbit 3
define lcd_ereg
define lcd_ebit 2
define I2C_SCLOUT 1 ;para que no necesite resistencia pull-up en SCL
CPIN VAR PORTA.1 ;pin señal de reloj I2C
DPIN VAR PORTA.0 ;pin de datos I2C

segu VAR Byte ;definir tamaño de variable segundos 1 a 255
minu VAR Byte ;variable para los minutos
hora VAR Byte ;variable para las horas
diaS VAR Byte ;variable día de la semana
diaF VAR Byte ;variable día fecha del mes
mes VAR Byte ;variable mes
anio VAR Byte ;variable año de 2 dígitos
actualizado VAR Bit ;variable para almacenar un 1 o 0
EData 0, 0 ;memoria 0 con el valor inicial 0, sirve para
          ;indicar que nunca ha corrido este programa
actualizado=ERead 0 ;carga el valor de la memoria EEPROM dirección 0
If actualizado =0 Then grabarRTC ;si es la 1ra vez que corre ir a grabar RTC
;caso contrario sólo leer el RTC


INICIO:

I2Cin DPIN,CPIN,%11010000,0,[segu] ;leer los datos de mem. 0,
I2Cin DPIN,CPIN,%11010000,1,[minu] ;1,2,..y guardarlos en sus
I2Cin DPIN,CPIN,%11010000,2,[hora] ;respectivas variables
I2Cin DPIN,CPIN,%11010000,3,[diaS]
I2Cin DPIN,CPIN,%11010000,4,[diaF]
I2Cin DPIN,CPIN,%11010000,5,[mes]
I2Cin DPIN,CPIN,%11010000,6,[anio]
Print $fe,1, HEX2 hora,":", HEX2 minu,":", HEX2 segu,
Print $fe,$c0 ;saltar a la 2da línea del LCD
;mostrar día de la semana

If diaS=$1 Then Print "Dom."
If diaS=$2 Then Print "Lun."
If diaS=$3 Then Print "Mar."
If diaS=$4 Then Print "Mie."
If diaS=$5 Then Print "Jue."
If diaS=$6 Then Print "Vie."
If diaS=$7 Then Print "Sab."

Print $fe,$c5, HEX2 diaF,"/" ;mostrar el día del mes /
Print $fe,$cB,"/20", HEX2 anio ; mostrar año /20 + 04
Print $fe,$c8 ;pasar a la casilla 8

If mes=$1 Then Print "ene" ;mostrar el mes
If mes=$2 Then Print "feb"
If mes=$3 Then Print "mar" 
If mes=$4 Then Print "abr"
If mes=$5 Then Print "may"
If mes=$6 Then Print "jun"
If mes=$7 Then Print "jul"
If mes=$8 Then Print "ago"
If mes=$9 Then Print "sep"
If mes=$10 Then Print "oct"
If mes=$11 Then Print "nov"
If mes=$12 Then Print "dic"
 DelayMS 500

GoTo INICIO

 ; ************************ subrutina grabar *********************
grabarRTC:

I2Cout DPIN,CPIN,%11010000,0,[$00] ;setear 00 segundos
DelayMS 10 ;retardo para finalizar grabación
I2cout DPIN,CPIN,%11010000,1,[$30] ;setear 30 minutos
DelayMS 10
I2Cout DPIN,CPIN,%11010000,2,[$22] ;setear las 13 horas
DelayMS 10
I2Cout DPIN,CPIN,%11010000,3,[$3] ;setear día lunes, D=1,L=2
DelayMS 10 ;M=3, M=4, J=5, V=6, S=7
I2Cout DPIN,CPIN,%11010000,4,[$12] ;setear día 27 del mes
DelayMS 10
I2Cout DPIN,CPIN,%11010000,5,[$6] ;setear mes septiembre
DelayMS 10
I2Cout DPIN,CPIN,%11010000,6,[$12] ;setear año 04
DelayMS 10
I2Cout DPIN,CPIN,%11010000,7,[$10] ;control %00010000 para
DelayMS 10 ;encender el led cada 1 seg.
EWrite 0,[1] ;escribe en la memoria 0 el valor de 1 para que no
;se vuelva a grabar otra vez estos datos en el RTC


GoTo INICIO ;ir a presentar los datos en el LCD
 
Última edición:
Muy buenas tardes a todos,
primera vez que escribo y es para preguntar , mil disculpas pero como dicen quien no pregunta nunca aprende
monte en proteus el reloj con ds1307 y corre perfectamente,pero al pasar al protoboard no arranca , porlo que he leido me falta iniciar el ds1307 con el bit 7 ch=0,pero ese es problema parami donde lo inserto en el programa
Saludos juanc08.
Revise el programa que adjuntas, y existen varias cosas por modificar.
La sintaxis que usas en algunas partes del programa, son para MCS con PICBasic Pro.
Y se supone que el programa esta escrito para usar el PICBasic de Proton.
Así que debes de empezar por corregir esos detalles.

En el programa existen variables que no están declaradas.
La configuración del LCD para Proton es diferente a la que usas, y otros detalles más.

Por aquí en el foro existe un tutorial de Proton. [Tutorial] y manejo de proton IDE
Dale una leída y posteriormente realiza las correcciones necesarias a tu programa.

En cuanto al DS1307, también hay que realizar algunos cambios al programa para que funcione.

Suerte.
 
hola amigo
te agradezco tu respuesta , agradeceria medijeras lo que hay que corregir en la programacion del ds1307 para que ala hora de montarlo en el protoboard me funcione ,adjunto el .bas y el .dsn
veras que funciona en proteus
 

Adjuntos

  • reloj.rar
    41 KB · Visitas: 355
Última edición:
hola amigo
te agradezco tu respuesta , agradeceria medijeras lo que hay que corregir en la programacion del ds1307 para que ala hora de montarlo en el protoboard me funcione ,adjunto el .bas y el .dsn
veras que funciona en proteus
Saludos nuevamente juanc08
No dudo que funcione en el simulador, muchas cosas funcionan en el, y en la realidad no.
Este programa hay que tomarlo por pasos, ya que el programa que adjuntas,
es un programa en el cual muchos programas para PICBasic están basados.
Y he visto varias adaptaciones del programa que adjuntas, para otros PIC.

En tu diseño, aparte de querer tener un calendario con RTC, también quieres implementar un termómetro.
Con el PIC que usas (PIC16F628A) Eso no es posible directamente.
Ya qué el 16F628A no tiene ningún conversor de analógico a digital.
Este PIC solo tiene comparadores analógicos.
Por lo tanto, la lectura del LM35 en tu proyecto no podrá ser leída directamente por el PIC.
(Programa no la incluye, diseño si)
Para eso bien podrías usar un PIC16F88 y caso LM35 resuelto, con sus correspondientes rutinas.
PIC16F88 + DS1307 + LM35 = True ;)

Si miras bien tu programa verás que al iniciar graba la EEPROM del PIC con una variable tipo Flag.
Para indicar si el programa es por primera vez ejecutado o no. Y pasa a escribir los datos iniciales.
Después continúa con un Loop. Esa escritura y su verificación se tiene que modificar o eliminar.
Lo que se debe hacer es establecer datos iniciales y posteriormente poder actualizarlos.
Esto no está en tu programa. Pero en otros basados en tal programa, si tienen esta posibilidad.

Resumiendo diseño y programa, adjunto las correspondientes modificaciones en *.DSN y *.BAS
Esperando funcione realmente con Proton. Ya qué el proyecto para el DS1307 lo tengo en ensamblador.

Suerte.
 

Adjuntos

  • 16F628A DS1307.rar
    19.6 KB · Visitas: 465
Última edición:
nome cansare de agradecer tus respuestas, me dispongo a probar el circuito y estamos en contacto:D:apreton:



amigo d@arkbytes con el programa que me enviaste me corre de maravilla en el protoboard:aplauso::aplauso::aplauso:
 
Última edición:
nome cansare de agradecer tus respuestas, me dispongo a probar el circuito y estamos en contacto:D:apreton:



amigo d@arkbytes con el programa que me enviaste me corre de maravilla en el protoboard:aplauso::aplauso::aplauso:
Perfecto!. ;)
Ahora solo te resta agregar las opciones para poder modificar los datos.

En lo que te podamos ayudar, cuenta con ello.

Mucha suerte y hasta pronto. :apreton:
 
Estoy realizando un proyecto de un reloj digital programable con alarmas para una escuela
estoy utilizando un rtc, lcd 16x2 y un pic 16f628A , el problema esta en los incrementos de las horas y minutos cuando llega al numero 10 decimal en la lcd sale en hexadecimal (hex2)
tanto en horas y minutos sucede lo mismo , el otro problema es poner el rtc en modo de 12 horas pongo el bit 6 en modo de 12 horas pero en la simulación sigue estando en 24 horas.
 

Adjuntos

  • LCD.rar
    20.6 KB · Visitas: 125
Última edición por un moderador:
estoy realizando un proyecto de un reloj digital programable con alarmas para una escuela
estoy utilizando un rtc, lcd 16x2 y un pic 16f628A , el problema esta en los incrementos de las horas y minutos cuando llega al numero 10 decimal en la lcd sale en hexadecimal (hex2)
tanto en horas y minutos sucede lo mismo , el otro problema es poner el rtc en modo de 12 horas pongo el bit 6 en modo de 12 horas pero en la simulación sigue estando en 24 horas.

Hola...revisa la hoja de datos del DS1307 y mira aquí https://www.forosdeelectronica.com/tutoriales/conversion-codigos.htm en la parte BCD que es el formato que trabaja el RTC por eso es que todo te funciona bien hasta el numero decimal 9 porque solo hasta ahí es igual la representación decimal y la BCD.
Saludos.

Ric.
 
Hola muchachos yo tambien trabajo con el DS1307 y funciona correctamente, mi programacion esta en CCS y en la simulacion funciona al igual que el el circuito armado, Mi problema es que estaba trabajando desde las 16:50:00 hasta las 17:30:20 y de repente se sallto la hora a las 19:51:85
en esta ultima hora ya no avanza. incluyo mi codigo aunque no creo que el problema este aqui. Mi cristal del DS1307 esta aterrizado a tierra desde la carcasa.
Saludos cordiales

Código:
// Cicuito lee reloj tiempo real y temperatura con LM35
#include <16F876A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#device adc=10
#use delay(clock=4000000)
#use standard_io(a)
#use standard_io(c)
#use i2c(Master,sda=PIN_C4,scl=PIN_C3)
#define RELAY1 PIN_C0
#define RELAY2 PIN_C1
#define RELAY3 PIN_C2
#define LED    PIN_C5

#include<lcd.c>
#include<_ds1307.c>
int hr,min,sec,day,mth,year,dow;
float temper, medicion;

void caratula(){
 printf(lcd_putc,"\f");
 ds1307_get_time(hr,min,sec);
 ds1307_get_date(day,mth,year,dow);
 lcd_gotoxy(1,1);
 printf(lcd_putc,"Fecha:%2u/%2u/%2u",day,mth,year);
 lcd_gotoxy(1,2);
 printf(lcd_putc,"Hora:%2u:%2u:%2u",hr,min,sec);
 delay_ms(800);
}
void medicion_temp(){
printf(lcd_putc,"\f");
lcd_putc("Temperatura\n");
lcd_gotoxy(12,2);
lcd_putc("C");
lcd_gotoxy(8,2); //Acomoda el cursor
lcd_putc("");    //Limpia el sector de pantalla
lcd_gotoxy(8,2); //Acomoda el cursor
medicion=read_adc();
temper=medicion*(0.48875);  //Pasa Binario a C
printf(lcd_putc,"%02.1f",temper);
delay_ms(2000);
}
void main(){ 
 enable_interrupts(global);              //Habilita las interrupciones globales
 setup_adc(adc_clock_internal);
 setup_adc_ports(all_analog);
 set_adc_channel(0);                     //Elige canal a medir A/D RA0
 lcd_init();                             //Inicializa el LCD           
 ds1307_init();                          //Inicializa el Reloj
 printf(lcd_putc,"\f");
 lcd_gotoxy(2,1);
 printf(lcd_putc,"GRUPO  NUBECOR");
 lcd_gotoxy(3,2);
 printf(lcd_putc,"Reloj y Fecha");
 delay_ms(2000);   
 printf(lcd_putc,"\f");
 int cont=0;
while(1){
for(cont=0; cont<=5; cont++){
caratula();
}
cont=0;  
 medicion_temp();
 }
}
 
Última edición por un moderador:
Saludos.
Te has olvidado colocar un esquema de tu proyecto, así como también incluir la librería que utilizas.
Es recomendable que siempre coloquen sus esquemas, ya que no somos adivinos. Normas del Foro 03 y 12

Por si en dado caso fuera algún problema de software, "librería o programa", aquí adjunto un ejemplo.
Está realizado con una librería directa de CCS para trabajar con el DS1307
El código para el sensor LM35 ya es cosecha mía. ;)

Espero te sirva y suerte con tu proyecto.
 

Adjuntos

  • 16F876A DS1307 + LM35.rar
    21.8 KB · Visitas: 317
Última edición:
Como podemos agregar esta librería al copilador C? O cada vez que valla a realizar un programa debo copiarla?

Saludos!
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.
 
Buenas amigos, ya les he escrito antes y estoy muy agradecido con su ayuda.
Esta vez les escribo por otra duda. Tengo un código en ensamblador que conseguí en internet sobre como leer y escribir un ds1307 en un pic 16f877a, el programa funciona perfecto hasta que se le modifica algo que ya voy a explicar.
Para escribir datos de tiempo en el DS1307 el creador del programa usaba movlw B'00101000' y luego llama a una instrucción para grabar el dato, yo cambie ese movlw B'00101000' a movlw DATO2e para poder modificar esa variable en un futuro, pero el numero que realmente tiene DATO2e no es el que envía al reloj.
Suponiendo que DATO2e tenga en binario 00010011 cuando carga eso en los minutos no se acerca en nada a ese número.
Es realmente algo extraño. Si alguien me pudiera ayudar estaría realmente agradecido.

Este es el código completo del programa.

Código:
;;; programme communication entre pic16f877a et circuit rtc DS1307 viaI2C;;;;
    list p=16f877a
        #include<p16f877a.inc>
        org 0x00
        DATA0 equ  PORTA
        DATA1 equ   PORTB
    DATA2 equ    PORTD
DATA3 equ    0X0C
DATA4 equ    0X0E
DATA5 equ    0X0F
DATA6 equ    0X1F
;; programme principale;;

        bsf STATUS,RP0  ;bank 1
           bcf STATUS,RP1   ;;bank 1
        clrf TRISB    
        clrf TRISD
        clrf TRISA
        bsf TRISC,RC4 
        bsf TRISC,RC5
        BCF SSPSTAT,CKE ;;Control des niveaux de tension à l'entrée, 0 : I2C, 1 : SMBUS ** travaille avec I2c;;
        Bsf SSPSTAT,SMP;;Control de frq signal: 1 pour 100 kHz et 1 MHz, 0 pour 400 kHz ( la signal que on utilise pour SCL c'est 100 KHz or 1MHz;;
        movlw 0X02
        movwf SSPADD ;; on calcul  la valeur avec cette relation ={ Fosc-4*F(scl)}-1
           bcf STATUS,RP0 ;; bank 0
           bcf STATUS,RP1  ; bank 0
        movlw 0X28
        movwf SSPCON ;;1110 : I2C master, adresse 7 bits, interruption sur START et STOP
        clrf PORTD
        CLRF PORTB
debut   call  I2C_start  ;; cofiguration de i2c debut " mais  dans ce programme je utilise juste une seul adresse donc "je crois" nous sommes pas obliger de ecrire une adresse 
                                ;;mais dans notr projet on doit met adresse parece que on utiliseront 3 circuit DS18B20/DS1307/.. 3 bus one wire 
            ;;    MOVLW 0X00
            ;;    call I2C_ecrire   ;; appele fonction d'ecrire qui'est base sur copie le donne ou la adresse dans registre SSPBUF et lui occupe de reste..
;;;;;;;;;;;;;;;;;;;;;;;;    
    ; Ecriture dans le registre de contrôle (adresse 0x07) du DS1307
movlw B'0110110'
movwf DATA2        
call I2C_start
movlw B'11010000' ; 8 bits à écrire (7 bits d'adresse + bit 0 Write)
call I2C_write
call I2C_ACK_slave_to_master
movlw B'00000000' ; 8 bits à écrire
call I2C_write
call I2C_ACK_slave_to_master 
movlw B'00100111' ; 8 bits à écrire
call I2C_write
call I2C_ACK_slave_to_master
movlw DATA2 ; 8 bits à écrire
call I2C_write
call I2C_ACK_slave_to_master
movlw B'00100111' ; 8 bits à écrire
call I2C_write
call I2C_ACK_slave_to_master
movlw B'00000001' ; 8 bits à écrire
call I2C_write
call I2C_ACK_slave_to_master
movlw B'00000101' ; 8 bits à écrire
call I2C_write
call I2C_ACK_slave_to_master
movlw B'00101001' ; 8 bits à écrire
call I2C_write
call I2C_ACK_slave_to_master
movlw B'00101001' ; 8 bits à écrire
call I2C_write
call I2C_ACK_slave_to_master
call I2C_stop

;;;;;;;;;;;;;;
    call I2C_start
  movlw B'11010000' ; 8 bits à écrire (7 bits d'adresse + bit 0 Write)
    call I2C_write
    call I2C_ACK_slave_to_master
    movlw B'00000000' ; 8 bits à écrire
    call I2C_write
   call I2C_ACK_slave_to_master
   call I2C_Repeated_Start
   movlw B'11010001' ; 8 bits à écrire (7 bits d'adresse + bit 1 Read)
    call I2C_write
    call I2C_ACK_slave_to_master
    call I2C_read
    movwf DATA0 ; les 8 bits lus sont transférés dans le registre d'usage général DATA0
    call I2C_ACK_master_to_slave
    call I2C_read
    movwf DATA1 ; les 8 bits lus sont transférés dans le registre d'usage général DATA1
     
    call I2C_ACK_master_to_slave
    call I2C_read
    movwf DATA2 ; les 8 bits lus sont transférés dans le registre d'usage général DATA2
    call I2C_ACK_master_to_slave
    call I2C_read
    movwf DATA3 ; les 8 bits lus sont transférés dans le registre d'usage général DATA
    call I2C_ACK_master_to_slave
    call I2C_read
    movwf DATA4 ; les 8 bits lus sont transférés dans le registre d'usage général DATA4
    call I2C_ACK_master_to_slave
   call I2C_read
   movwf DATA5 ; les 8 bits lus sont transférés dans le registre d'usage général DATA5
    call I2C_ACK_master_to_slave
    call I2C_read
    movwf DATA6 ; les 8 bits lus sont transférés dans le registre d'usage général DATA6
     
    call I2C_NOACK
     
    call I2C_stop


I2C_idle
        bsf STATUS , RP0 ; passage en banque 1
        bcf STATUS , RP1 ; passage en banque 1
I2C_idle0
        btfsc SSPCON2 , ACKEN
        goto I2C_idle0 ; le bit ACKEN n'est pas nul
        btfsc SSPCON2 , RCEN
        goto I2C_idle0 ; le bit RCEN n'est pas nul
        btfsc SSPCON2 , PEN
        goto I2C_idle0 ; le bit PEN n'est pas nul
        btfsc SSPCON2 , RSEN
        goto I2C_idle0 ; le bit RSEN n'est pas nul
        btfsc SSPCON2 , SEN
        goto I2C_idle0 ; le bit SEN n'est pas nul
        btfsc SSPSTAT , R_W
        goto I2C_idle0 ; le bit R_W n'est pas nul
        bcf STATUS , RP0 ; passage en banque 0
        bcf STATUS , RP1 ; passage en banque 0
        return


 
I2C_start
    call I2C_idle ; on attend que le bus I2C soit libre
    bsf STATUS , RP0 ; passage en banque 1
    bcf STATUS , RP1 ; passage en banque 1
    bsf SSPCON2 , SEN ; SEN = 1 (lancement d'une opération Start)
    bcf STATUS , RP0 ; passage en banque 0
    bcf STATUS , RP1 ; passage en banque 0
    return


I2C_read
        
        call I2C_idle ; on attend que le bus I2C soit prêt
        bsf STATUS , RP0 ; passage en banque 1
        bcf STATUS , RP1 ; passage en banque 1
        bsf SSPCON2 , RCEN ; on lance la réception
I2C_read0
        btfsc SSPCON2 , RCEN 
        goto I2C_read0 ; on attend la fin de la réception
        bcf STATUS , RP0 ; passage en banque 0
        bcf STATUS , RP1 ; passage en banque 0
        movf SSPBUF ,0
        return


I2C_stop
    call I2C_idle ; on attend que le bus I2C soit prêt
    bsf STATUS , RP0 ; passage en banque 1
    bcf STATUS , RP1 ; passage en banque 1
    bsf SSPCON2 , PEN ; PEN = 1 (lancement d'une opération Stop)
    bcf STATUS , RP0 ; passage en banque 0
    bcf STATUS , RP1 ; passage en banque 0
    return
    
I2C_write    
    call I2C_idle ; on attend que le bus I2C soit prêt
    movwf SSPBUF
    call I2C_ACK_slave_to_master    
    return



I2C_Repeated_Start
    call I2C_idle ; on attend que le bus I2C soit prêt
    bsf STATUS , RP0 ; passage en banque 1
    bcf STATUS , RP1 ; passage en banque 1
    bsf SSPCON2 , RSEN ; RSEN = 1 (lancement d'une opération Repeated Start)
    bcf STATUS , RP0 ; passage en banque 0
    bcf STATUS , RP1 ; passage en banque 0
    return


I2C_ACK_slave_to_master    
    call I2C_idle ; on attend que le bus I2C soit prêt
    bsf STATUS , RP0 ; passage en banque 1
    bcf STATUS , RP1 ; passage en banque 1
I2C_ACK_slave_to_master0
    btfsc SSPCON2 , ACKSTAT
    goto I2C_ACK_slave_to_master0 ; on attend la réception du bit ACK
    bcf STATUS , RP0 ; passage en banque 0
    bcf STATUS , RP1 ; passage en banque 0
    return

I2C_NOACK 
    call I2C_idle ; on attend que le bus I2C soit prêt
    bsf STATUS , RP0 ; passage en banque 1
    bcf STATUS , RP1 ; passage en banque 1
    bsf SSPCON2 , ACKDT ; ACKDT = 1
    bsf SSPCON2 , ACKEN ; ACKEN = 1 (lancement d'une opération Acknowledge)
    bcf STATUS , RP0 ; passage en banque 0
    bcf STATUS , RP1 ; passage en banque 0
    return

I2C_ACK_master_to_slave
    call I2C_idle ; on attend que le bus I2C soit prêt
    bsf STATUS , RP0 ; passage en banque 1
    bcf STATUS , RP1 ; passage en banque 1
    bcf SSPCON2 , ACKDT ; ACKDT = 0
    bsf SSPCON2 , ACKEN ; ACKEN = 1 (lancement d'une opération Acknowledge)
    bcf STATUS , RP0 ; passage en banque 0
    bcf STATUS , RP1 ; passage en banque 0
    return



END
 
Hola amigos del foro. Nuevamente estoy por aquí para molestarlos una vez mas disculparan pero creo que con esto termino, eso creo jeje.
Estoy haciendo un proyectito de control de semáforos de dos fases con tiempo real ds1307.
Las funciones que le estoy pidiendo hacer a mi pic16f877a es que por medio de una interrupción b.0 se pueda entrar a un menú de configuración y se pueda variar el tiempo de la fase 1, y de la fase 2.
Además que ajuste en horas y minutos; la hora de intermitencia, hora de apagado y hora de encendido.
Bueno les cuento que cuando configuro el tiempo de fase 1 y 2 , el programa me funciona correctamente, pero con respecto a la igualación de hora de int , hora apag, hora de encendido no me funciona.
En mi programa que adjunto está en la etiqueta contexto ya que creo que es porque cuando ajusto dichos términos están en sistema dec y el tiempo real en sistema hex.
¿Alguien pude revisar mi código que esta en pbp, y decirme que es lo que esta pasando?
Les agradecería bastante amigos del Foro.
 

Adjuntos

  • PRUEBA001.rar
    3.3 KB · Visitas: 69
Última edición por un moderador:
Hola:

Fig2403_DS1307.gif


http://pic16f84a.org/proteus.html#Proteus_Capitulo_24

Un saludo.
 
Hola amigos de este foro magnifico.
Antes que nada quisiera saludarlos muy atentamente por su foro que creo yo que es el mejor de todos, y eso gracias a sus moderadores y sabios, expertos electrónicos.
Bien, estoy haciendo un reloj con alarma, claro el reloj es con un RTC DS1307 que encontré en este foro gracias a cesar_8k; https://www.forosdeelectronica.com/posts/188954/ Le estoy agregando un menú para configurar la hora de alarma y el minuto de alarma, y ademas le estoy agregando una sentencia para que cuando se cumpla esta me active el led que está en el pin 02 (RA3), pero ahí va el problema que no va, no obedece, ¿No sé si está mal propuesta la sentencia o me falta agregar otra dirección?
Es por eso que necesito su ayuda amigos, a ver si me dan una luz, les agradecería de antemano. Adjunto mi circuito en isis y mi programación en PICBasic Pro.
 

Adjuntos

  • archivo.rar
    26.7 KB · Visitas: 75
Última edición por un moderador:
Bien, estoy haciendo un reloj con alarma, claro el reloj es con un RTC DS1307 que encontré en este foro gracias a cesar_8k; https://www.forosdeelectronica.com/posts/188954/ Le estoy agregando un menú para configurar la hora de alarma y el minuto de alarma, y ademas le estoy agregando una sentencia para que cuando se cumpla esta me active el led que está en el pin 02 (RA3), pero ahí va el problema que no va, no obedece, ¿No sé si está mal propuesta la sentencia o me falta agregar otra dirección?
El problema que debes tener, es al comparar sistema decimal con sistema decimal codificado en binario (BCD).
Que es el sistema con el que trabaja el RTC DS1307.

Voy a adjuntar un ejemplo no terminado del programa que mencionas para que tengas una idea de cómo realizar la comparación con el sistema BCD.
A este programa le falta agregar la configuración de la alarma. (Es para que tengas una idea.)

Tal vez con este programa puedas terminar el que por ahora no te funciona.

Nota:
El programa está escrito con PICBasic Pro X 3 de MicroCode Studio X (Para obtener el archivo *.cof)
Pero también se incluye la palabra de configuración para PBP 2.6XX y el código es compatible.

Suerte.
 

Adjuntos

  • 16F628A RTC DS1307 con alarma.rar
    111.5 KB · Visitas: 158
Hola Amigo Darkbytes, antes que nada te agradezco por el apoyo que me das con tu programación.

Estuve queriendo entender un poco mas , pero admito que Ud, es un genio, mire con respecto a la conversión del sistema hex a bcd, no casi me entra, pero mas o menos voy así como mi código adjunto, espero , estar cerca de lo que quiero, le agradecería si por ahí le da una chequeadita.

¡Estoy experimentando la conversión primero con las eehoras_al , a ver si mas o menos es asi?...
Ah dígame si es necesario cambiar mi esquema como Ud, lo ha hecho para trabajar mejor o no?

GRACIAS
 

Adjuntos

  • prog01.rar
    42 KB · Visitas: 60
Estoy experimentando la conversión primero con las eehoras_al.
¿A ver si mas o menos es así?
El problema en tu programa es que todas la variables involucradas deben tener el mismo formato.
Una forma fácil de lograr esto es usando variables espejo.
Esto es que una variable llevará un conteo decimal mientras la otra será convertida a BCD a partir del valor que lleva la variable de conteo.
La desventaja de usar esta técnica es que se consume mucha memoria y para lograr el programa completo que incluya la configuración de la hora de alarma, ya no alcanzará con el PIC16F628A.
Pero no se me ocurre una forma fácil de lograr este objetivo de una manera más sencilla.
Por lo tanto para realizar el programa usando la técnica del ejemplo que adjunto cambié al 16F88.
No adjunto el programa completo porque lo escribí en PICBasic de Proton IDE y las instrucciones son algo diferentes.
Pero adjunto un ejemplo para que puedas entender como cambiar y establecer la hora.
Usando la función de conversión de este programa ya podrás mantener las variables con el mismo formato BCD que usa el RTC DS1307 y posteriormente podrás realizar la comparación de las variables para la hora de alarma y la hora que regresa el DS1307 sin problemas.
El programa que adjunto no está muy comentado porque está fácil de entender. ;)
¿Dígame si es necesario cambiar mi esquema como Ud, lo ha hecho para trabajar mejor o no?
Si optas por utilizar la técnica que empleé para la conversión, usar las resistencias pull-up internas para las líneas SDA y SCL, más actualizar la hora por medio del pin de salida de onda cuadrada del DS1307, si tendrás que cambiar el diseño y cómo el programa completo requerirá mas memoria, tendrás que cambiar al 16F88.

Espero que este ejemplo que adjunto te pueda servir para realizar tu proyecto.

Suerte.
 

Adjuntos

  • 16F628A Conversión DecToBCD para RTC DS1307.rar
    21.5 KB · Visitas: 106
Hola amigo Darkbytes, estuve analizando el proyecto ayuda que me pasaste, y bueno parece que por fin logre comprender un poco sobre la conversión de dec a bcd pasando por bin, aquí le dejo mi modificación del reloj con alarma y tiempo real ds1307 y lcd 16x2, ah! Cambie pic 16f88 por un pic 16f877, ah si no fuera mucha molestia, podría explicarme porque cuando está funcionando mi reloj tiempo real en el lcd se aprecia el tiempo que transcurre asi: 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?
Por favor, Gracias
Adjunto firmware y simulación en isis proteus.
 

Adjuntos

  • software.rar
    52 KB · Visitas: 57
Atrás
Arriba