TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Francirius en 05 de Agosto de 2011, 17:14:51

Título: RTC en Proteus funciona, en la vida real no...ayuda
Publicado por: Francirius en 05 de Agosto de 2011, 17:14:51
Hola amigos, he estado practicando con el DS1307 y varios micros (f877, f628, f84), pero ahora que lo kiero llevar a la vida real no pasa nada.
Inicialmente me compre un ds1307 SOIC, y le hice una pcb muy buena, pero no paso nada. Ahora lo estoy armando en una proto con un integrado DIP, pero tampoco nada
le lei las señales al micro a ver sie estaba mandando las señales y si las manda. El programa es resimple, configura el RTC para que quede generando la onda de 1 Hz, y como
les digo, en proteus me funciona impeque.
Ya le he cambiado como 5 cristales y ya llevo probados 3 integrados
Espero su ayuda, muchas gracias
Título: Re: RTC en Proteus funciona, en la vida real no...ayuda
Publicado por: korpaztk en 05 de Agosto de 2011, 20:02:13
lo has hecho en proteus?, podrías subir tu código??, aquí en el foro hay muchos temas que están relacionados con ese integrado... si mal no me equivoco entre las lineas de scl y sda iban 2 resistencias de pull-up...

Saludos.-
Título: Re: RTC en Proteus funciona, en la vida real no...ayuda
Publicado por: rivale en 05 de Agosto de 2011, 22:06:13
como tienes armado tu circuito, hay cosas que en proteus no son necesarias, pero en la vida real si
Título: Re: RTC en Proteus funciona, en la vida real no...ayuda
Publicado por: Francirius en 10 de Agosto de 2011, 18:45:06
Aqui estan los archivos con los que estoy trabajando, tambien la simulacion de proteus.
Este es el codigo, en los adjuntos esta la libreria que uso para comunicarme con el rtc
Código: C++
  1. #include <16F628.h>
  2.  #fuses INTRC,NOMCLR,NOWDT,NOPUT,NOPROTECT
  3.  #use delay(clock=4000000)
  4.  #use standard_io(A)
  5.  #use i2c(Master,sda=PIN_A1,scl=PIN_A2)
  6.  #include <RTC_DS1307.C>
  7.  
  8.  //Programa para configurar el registro de opcion del rtc, y que comience a parpaderar cada 1 sg.
  9.  //La escritura del RTC es como sigue:
  10. //* Primero el uC envia la condicion de START.
  11. //* Luego envia la direccion del rtc en modo escritura (b'11010000' o 0xD0).
  12. //* A continuacion el maestro envia un puntero con la primera direccion del registro a escribir.
  13. //* Despues se transmiten los datos a escribir. La direccion del registro se incrementa automaticamente.
  14. //* Cuando se termina de escribir el uC maestro envia la condicion de STOP.
  15.  void main(){
  16.             delay_ms(500);             //Se comienza con un retardo para ver el efecto de la configuracion.
  17.             i2c_start();
  18.             i2c_write(0xD0);
  19.             i2c_write(0x07);           //Registro de control.
  20.             i2c_write(0b00010000);     //Palabra para configurar la señal de salida de 1 Hz (SQWE=1, RS1=RS2=0).
  21.             i2c_stop();
  22.  }
Espero puedan ayudarme, saludos!
Título: Re: RTC en Proteus funciona, en la vida real no...ayuda
Publicado por: Suky en 10 de Agosto de 2011, 19:16:28
Debe existir un bucle infinito, sino el microcontrolador al terminar las instrucciones que corresponden a i2c_stop() se resetea. Con un while(1); después de esa función alcanza.


Saludos!
Título: Re: RTC en Proteus funciona, en la vida real no...ayuda
Publicado por: Francirius en 11 de Agosto de 2011, 16:40:52
mmm pero como lo entiendo yo eso no es necesario, por que el micro configura el rtc y de ahi son independientes, la configuracion deja la onda cuadrada a la salida.
De hecho esta es la idea para que con esa onda actualice los registros del pic cuando se hace el reloj.
Título: Re: RTC en Proteus funciona, en la vida real no...ayuda
Publicado por: Suky en 11 de Agosto de 2011, 17:21:00
Pero si se resetea a cada instante se re-configura y nunca lo dejas en "paz" al RTC  :D
Título: Re: RTC en Proteus funciona, en la vida real no...ayuda
Publicado por: Francirius en 12 de Agosto de 2011, 03:01:48
pero la instruccion "i2c_stop()" no resetea el rtc, solamente termina la comunicacion entre master y slave.
mira este es un codigo de otro programa que me ha funcionado en proteus, y la configuracion no va dentro de un loop:
Código: C++
  1. void main() {
  2.    port_b_pullups(TRUE);   //Pull-up para RB0
  3.    configura();
  4.    enable_interrupts(int_ext);          //Habilita int. RB0…
  5.    ext_int_edge(L_TO_H);              //por flanco de subida
  6.    enable_interrupts(GLOBAL);    //Habilita int. general
  7.    lcd_init();
  8.  
  9. while (1){            //Bucle infinito de espera
  10.       lcd_gotoxy(5,1);
  11.       printf(lcd_putc,"%02u:%02u:%02u\n%s %02u-%02u-20%u",hr,min,sec,dia_txt,dia,mes,ano);   //Visualiza la hora, se actualiza segun los reg del pic
  12.             }
  13.       }
  14. }
la instruccion "configura()" es que configura el ds1307.
Título: Re: RTC en Proteus funciona, en la vida real no...ayuda
Publicado por: jeremylf en 12 de Agosto de 2011, 03:14:14
Pero te falta "capturar", "decirle" al rtc que de esos datos, simplemente estas poniendo variables que nunca se actualizan.
Título: Re: RTC en Proteus funciona, en la vida real no...ayuda
Publicado por: Suky en 12 de Agosto de 2011, 12:06:49
pero la instruccion "i2c_stop()" no resetea el rtc, solamente termina la comunicacion entre master y slave.

Si, eso está clarisimo. Utiliza el buscador, hay varios ejemplos para que puedas aprender a programar con CCS  ;-) Una vez más te comento, debes colocar un while(TRUE) al primer código que mostraste  :)
Título: Re: RTC en Proteus funciona, en la vida real no...ayuda
Publicado por: tannke en 12 de Agosto de 2011, 12:29:17
jeje, creo que no os está entendiendo lo que le quereis decir.... de todos modos también puede poner un "asm sleep" (no se como es la intruccion en ccs para poner asm) despues del i2c_stop();

Saludos
Título: Re: RTC en Proteus funciona, en la vida real no...ayuda
Publicado por: Francirius en 12 de Agosto de 2011, 16:21:08
Pero te falta "capturar", "decirle" al rtc que de esos datos, simplemente estas poniendo variables que nunca se actualizan.
Las variables se actualizan cada 1 sg, ya que primero se configuro el ds1307 para generar la señal de 1 Hz, esta va conectada a RB0, y al habilitar la interrupcion
actualiza los registros, y el programa principal solo se encarga de desplegar los datos.
jeje, creo que no os está entendiendo lo que le quereis decir.... de todos modos también puede poner un "asm sleep" (no se como es la intruccion en ccs para poner asm) despues del i2c_stop();

Saludos
Voy a intentar lo que me comentan, pero no me convence mucho, por que en la simulacion en Proteus me funciono excelente.
Saludos y gracias!
Título: Re: RTC en Proteus funciona, en la vida real no...ayuda
Publicado por: Suky en 12 de Agosto de 2011, 16:54:38
...por que en la simulacion en Proteus me funciono excelente.

Ese es el problema, es una simulación  ;-)


Saludos!
Título: Re: RTC en Proteus funciona, en la vida real no...ayuda
Publicado por: Francirius en 23 de Agosto de 2011, 17:09:36
...por que en la simulacion en Proteus me funciono excelente.

Ese es el problema, es una simulación  ;-)
Saludos!
Primero que todo gracias por darse el tiempo de ayudarme, finalmente resolvi el problema.
En esta ocasion fui terco y seguro de lo que habia programado le hice unas modificaciones, para asegurar que el el bit CH (clock halt) estuviera activado,
pero lo que yo creo que sucedio fue la protoboard, lo arme en una placa con los componentes soldados, y voila! funciono de maravilla.
Les adjunto el codigo modificado, para el que lo quiera:
Código: [Seleccionar]
#include <16F628.h>
 #fuses INTRC,NOMCLR,NOWDT,NOPUT,NOPROTECT
 #use delay(clock=4000000)
 #use standard_io(A)
 #use i2c(Master,sda=PIN_A1,scl=PIN_A2)
//#include <RTC_DS1307.C>
//Programa para configurar el registro de opcion del rtc, y que comience a parpaderar cada 1 sg.
//La escritura del RTC es como sigue:
//* Primero el uC envia la condicion de START.
//* Luego envia la direccion del rtc en modo escritura (b'11010000' o 0xD0).
//* A continuacion el maestro envia un puntero con la primera direccion del registro a escribir.
//* Despues se transmiten los datos a escribir. La direccion del registro se incrementa automaticamente.
//* Cuando se termina de escribir el uC maestro envia la condicion de STOP.
 void main(){
            //delay_ms(1000);            //Se comienza con un retardo para ver el efecto de la configuracion.
            i2c_start();
            i2c_write(0xD0);                      //Direccion del RTC en modo escritura.
            i2c_write(0x00);                      //Registro de de los segundos, bit 7 es CH.
            i2c_write(0b00000000);           //Se resetea, si CH=0, se activa el reloj.
            i2c_stop();
            i2c_start();
            i2c_write(0xD0);
            i2c_write(0x07);                 //Registro de control.
            i2c_write(0b00010000);     //Palabra para configurar la señal de salida de 1 Hz (SQWE=1, RS1=RS2=0).
            i2c_stop();
 }
Creo que era problema con el reloj...
Título: Re: RTC en Proteus funciona, en la vida real no...ayuda
Publicado por: Suky en 23 de Agosto de 2011, 17:43:10
Y seguís sin colocar un while(1); al final  :undecided: Al no colocarlo el micro se resetea, puede que no afecte pero hay que entenderlo  ;-)


Saludos!

Título: Re: RTC en Proteus funciona, en la vida real no...ayuda
Publicado por: Francirius en 23 de Agosto de 2011, 22:42:26
Y seguís sin colocar un while(1); al final  :undecided: Al no colocarlo el micro se resetea, puede que no afecte pero hay que entenderlo  ;-)
Saludos!

Mmm, creo que me falto explicar que este programa es una practica para comprobar la configuracion del DS1307, a futuro forma parte de un codigo mas grande, por lo que en este programa
me es irrelevante que el micro luego de configurar el rtc detenga el programa (a mi entender no se resetea, solamente termina de ejecutar el codigo).
la idea de este codigo es luego incluirlo en una libreria, en la cual solamente con una llamada (configura_ds()) va a configurar el rtc, para despues usar la señal de la onda cuadrada para "disparar"
una interrupcion del micro que va actualizar y desplegar los datos (en este punto si se usa el loop infinito para que despliegue los datos). Esto da independencia al micro.
Esto funciona por que ya lo he comprobado, el problema que tenia era que al implementarlo no funcionaba, ahora comprobe que era algun problema de conexion o cristal del ds1307.
Ahora me queda seguir avanzando el proyecto, me inspire en el reloj que sale en el libro "Microcontrolador PIC16F84-Desarrollo de proyectos" que estaba en ASM, y lo estoy llevando al C, para entenderlo y
practicarlo.
Saludos compañeros y gracias por la ayuda!