Reloj con DS1307 no arranca en la práctica

Uh Gracias!!!! aprendi algo nuevo, no sabia eso de proteus, no es como en la vida real que pones las resistencias en I2C y funcionan? uyo habia pensado que si. Yo porque no tengo aun el display, porque si lo pronbaba en protoboard seguramente no tendria problemas capaz. Muchgas Gracias!!!
 
Hola, buenas noches, tengo un problema con mi codigo, y es que no se por que, no recibe la señal por bluetooth, estoy simulandolo en proteus con un virtual terminal, pero no importa lo que mande, no lo lee, se queda estancado en esa parte del codigo esperando el numero, no se que problema pueda haber

CSS:
#include <16F877A.h>
#FUSES XT, NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8 )
#include <lcd.c>
#include <ds1307.c>                                        //Libreria para reloj en tiempo real ds1307
#include <stdlib.h>                                        //Libreria stdlib
#include <math.h>                                          //Libreria math
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)                     ///   con esta instruccion evitamos que
#use fast_io(D)                     ///   se este configurando cada vez que usamos
#use fast_io(E)                     ///   alguna instruccion de entrada o salida
#byte portc = 7                     /// se definen direcciones de memoria
#byte portd = 8
#BYTE TRISB = 0X86
#BYTE PORTB=0X06
#BYTE TRISA = 0X85
#BYTE PORTA=0X05
#int_RDA
char valor;
 RDA_isr()
 {
 valor=getc;
 }
int sec;                           //Da de alta lo senteros sec,min,hrs,day,month,yr,dow etc
int min;
int hrs;
int8 seg, seg1, seg2;             //Segundos
int8 min3, min1, min2;            //Minutos
int8 hrs3, hrs1, hrs2;            //Horas
int8 sem, sem1, sem2;             //Semanas
int8 dia, dia1, dia2;             //Dias
int8 mes, mes1, mes2;             //Meses
int8 a, a1, a2;                   //Años
int8 i,j;       

void main(){                      //Programa principal
   TRISB=0x00;
   TRISA=0xFF;
                       //Declara el caracter k
   int8 unidad;  //idk cosa del display
   char data[6];                  //Declara el caracter data con 6 digitos
   char data2[8];                 //Declara el caracter data2 con 8 dígitos
   byte const DISPLAY[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
   ds1307_init ();                //se inicializa el ds1307
 
   set_tris_a (0xff) ;           //Declara porta como salida,d como entrada, b como entrada, c y e mixto
   set_tris_d (0x00) ;
   set_tris_b (0x00) ;
   set_tris_c (0x04) ;
   set_tris_e (0x01) ;
   port_b_pullups (true) ;       //Activa resistencia pull up
   lcd_init ();                  //inicializamos lcd
enable_interrupts(int_RDA);
enable_interrupts(GLOBAL);
inicio:
 data[0]=0;                      //Declara los valores iniciales de todas las variables en 0
 data[1]=0;
 data[2]=0;
 data[3]=0;
 data[4]=0;
 data[5]=0;
 data2[0]=0;
 data2[1]=0;
 data2[2]=0;
 data2[3]=0;
 data2[4]=0;
 data2[5]=0;
 data2[6]=0;
 data2[7]=0;
 
 seg=0, seg1=0, seg2=0;
 min3=0,min1=0, min2=0;
 hrs3=0,hrs1=0,hrs2=0;
 sem=0, sem1=0, sem2=0;
 dia=0, dia1=0, dia2=0;
 mes=0, mes1=0, mes2=0;
 a=0, a1=0, a2=0;
 i=0, j=0;
 printf(lcd_putc, "\f");                     // Limpiar LCD




 while (TRUE){                               //Ciclo infinito

  lcd_gotoxy(1,1);                           //Indica posicion en que se mostrara el mensaje
  printf(lcd_putc, "\fInserte hr:mi:seg");   //Pide escribir la hora  en la lcd
   lcd_gotoxy(1,2);                           //Indica posicion en que se mostrara el mensaje
  printf(lcd_putc, "no sale %c",valor);   //Pide escribir la hora  en la lcd
  delay_ms(700);                             //Retardo 700ms
   while(i<=5){                              //Mientras i es menor o igual a 5
    valor=getc();                           // Lee el teclado
    data[i]=valor;                              // Valor data[i]= caracter introducido por teclado
     i++;                                    // Incrementar i
     lcd_gotoxy(1,1);                        //Indica posicion donde se mostrara el mensaje
     printf(lcd_putc, "Inserte hra:mi:seg");  //Pide  escribir la hora
     lcd_gotoxy(1,2);                        //Indica la posicion donde se mostrara el mensaje
     printf(lcd_putc,"%c%c:%c%c:%c%c",data[0],data[1],data[2],data[3],data[4],data[5]);  //Muesta la hora segun lo seleccionado en el teclado   
     delay_ms(500);                          //Retardo 500 ms
              
           }
  ////////////////////////////////////Lo mismo para la fecha, solo ultiliza los valores en data2 y con j
  delay_ms(700);       
    hrs1= data[0] - 48;   // Convertir data[0] de ASCII a valor numérico
    hrs2= data[1] - 48;   // Convertir data[1] de ASCII a valor numérico
    min1= data[2] - 48;   // Convertir data[2] de ASCII a valor numérico
    min2= data[3] - 48;   // Convertir data[0] de ASCII a valor numérico
    seg1= data[4] - 48;
    seg2= data[5] - 48;
    hrs3= ((hrs1*10)+ hrs2);    //Convierte los numeros individuales en su valor combinado, es decir al teclear 12 son valores separados 1,2 no 12 aqui hacemos q 1,2 sea 12
    min3= ((min1*10)+ min2);
    seg= ((seg1*10)+ seg2);
    printf(lcd_putc, "\f");            //Borra lo mostrado en la lcd
////////////////////////////////////////////////////////////////////////////////   
   ds1307_set_date_time (dia, mes , a, sem, hrs3, min3 , seg); // Guarda en el reloj la hora que se establece con el teclado 
   WHILE (1){                          //Ciclo infinito
      delay_ms (100) ;                 //Retardo 100ms
      ds1307_get_time (hrs, min, sec);   //se obtiene la hora
      lcd_gotoxy (1, 2) ;               //Indica la posicion donde se mostrara el mensaje
      printf (lcd_putc, " %02d:%02d:%02d  ", hrs,min,sec); ///se despliegan los datos   
      PORTB=DISPLAY[unidad];
      delay_ms(50);
      PORTA=0b011111;
      unidad=hrs1; //hora 1 en display izquierda
      delay_ms(50);
       PORTA=0b101111;
      unidad=hrs2;//hora 2 en display derecha
      delay_ms(50);
       PORTA=0b110111;https://www.forosdeelectronica.com/threads/reloj-con-ds1307-no-arranca-en-la-pr%C3%A1ctica.79541/page-6
      unidad=min1;//min1 en display izquierda
      delay_ms(50);
       PORTA=0b111011;
      unidad=min2;//min2 en display derecha
      delay_ms(50);
       PORTA=0b111101;
      unidad=seg1;//seg 1 en display izquierda
      delay_ms(50);
       PORTA=0b111110;
      unidad=seg2;//seg 2 en display derecha
      delay_ms(50);
   }
  
}
}
 

Adjuntos

  • Screenshot_1.png
    Screenshot_1.png
    60.3 KB · Visitas: 10
no importa lo que mande, no lo lee, se queda estancado en esa parte del codigo esperando el numero
Veo el código bastante conflictivo y con muchas cosas innecesarias.

Adjunto un ejemplo que te puede servir.
El programa original fue realizado por el amigo Shawn Johnson para el compilador BoostC
Hace algún tiempo me dí a la tarea de migrarlo a PCWHD Compiler de CCS.

Nota: El retardo de 50 mS. que estás usando para multiplexar los displays, es excesivo, con 1 o 2 mS. sería suficiente.
 

Adjuntos

  • 16F628A DS1307 RS-232.rar
    68.5 KB · Visitas: 14
Buenas tardes D@rkbytes, por que veo sos un experto en esto de la programación..!!
Voy a pedir un poco de ayuda .. Soy técnico electrónico pero con poco conocimiento en este campo..:confused:

He descargado un reloj con pic16f628, programado en C (lenguaje que conozco un poco), y quiero modificarlo para usarlo con el pic16f876a que tiene un puerto más, para poder usarlo con salidas de alarma p.e.
No se por qué no funciona. Adjunto la simulación, el código fuente y el hex.. Desde ya muchas gracias..!!;)
 

Adjuntos

  • reloj 7 seg_4 dígitos (16F876A).rar
    87.9 KB · Visitas: 12
Buenas tardes @D@rkbytes, por que veo sos un experto en esto de la programación..!!
Voy a pedir un poco de ayuda .. Soy técnico electrónico pero con poco conocimiento en este campo..:confused:
Saludos. Siento mucho no poder colaborar en este momento, ya que me cambié de ciudad y aún estamos montando el taller.
Mañana instalan el Internet en el local y ya con eso podré usar mi computadora.
Sin embargo, aún quedan muchas cosas por hacer que me mantienen muy ocupado.

Mientras tanto, esperemos que otros miembros del Foro te puedan brindar ayuda, ya que aquí existen muchas personas que también tienen amplios conocimientos en programación.
 
Graaaaandeeee roberttorresss..... funciona!!!!! :aplauso:

Ahora qué significa??

Gracias roberrtorres y D@rkbytes por responder..!

Otra consulta muchachos... fíjense que la pata 10 del pic aparece como si no funcionara..:unsure: Me faltará algo en la programación? Acuérdense que está hecho para el 16f628..
 
Otra consulta muchachos... fíjense que la pata 10 del pic aparece como si no funcionara..:unsure: Me faltará algo en la programación? Acuérdense que está hecho para el 16f628
El pin 10 del PIC16F876A es la salida de reloj del oscilador a cristal y únicamente si esa opción está configurada en los fuses.
No tiene otra función de E/S porque ese PIC no tiene oscilador interno.
 
No, te falta definir el tipo de oscilador en los fuses.
XT para un cristal de hasta 4 MHz y HS desde 4 hasta 20 MHz.
#fuses XT

En PIC C de CCS se puede definir más sencillo de esta forma:
#use delay(crystal = 4 MHz)
Con eso el compilador establece el fuse XT_OSC automáticamente.

Si requieres otras cosas como las protecciones de código y EEPROM, lo declaras en los fuses.
 
Atrás
Arriba