Hola foro que tal?
Perdón por revivir el post viejo, pero eh estado leyendo y no encuentro nada acerca de mi problema, necesitaria una mano, si es posible,claro está.
El problema es el siguiente, hace unos dias compre un modulo ds1307, y empecé a jugar junto con un pic 16f873a, y un modulo hc 06 el cual conecto al celular y lo configuro desde allí al modulo, todo funciona bien, o casi del todo bien, lo puedo configurar correctamente, cuenta bien los segundos y todos los datos del modulo, pero a la hora de cumplir su función principal, que es mantener la hora una vez desconectado el modulo, no sigue con la cuenta! al volver a alimentar todo y leer los registro los encuentro en 00(en realidad en la cantidad de segundos desde que lo volvi a conectar, es decir apenas lo alimento comienza a contar desde cero) ya le di mil vueltas al codigo y no encuentro solucion, ya me leí todo el datasheet, medi la tension de la bateria,es superior a 3v, medí la salida de SQ con un osciloscopio configurado par que parpadee a 1 hz y mientras está alimentado lo hace correctamente, al desconectar vcc(obviamente la pila sigue conectada) estos pulsos comienzas a disminuir su amplitud hasta que desaparece, voy a postear el código tal cual lo tengo, supongo que será algo muy basico que se me está pasando, pero no logro descubrirlo.
MUCHAS GRACIAS!
y perdón por revivir este post que ya lleva algunos meses inactivo..
Dejo el código:
#include <16f873a.h>
#fuses HS,NOWDT,PUT,NOBROWNOUT,NOLVP,NOCPD,NODEBUG,NOPROTECT
#use delay (clock=20000000)
#use rs232(baud=9800,XMIT=pin_C6,RCV=pin_C7)
#use STANDARD_IO(a)
#use STANDARD_IO(b)
#use FAST_IO(c)
#use I2C(MASTER,SDA=pin_C4,SCL=pin_C3)
/////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
//||||||||||||||||||||||||||||||||||||||||||||FUNCIONES PARA DS1307|||||||||||||||||||||||||||||||||||||||||||||
//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\//////////////////////////////////////////////////////
//**************************REGISTROS DEL DS1307 TODOS LOS DATOS ESTAN EN CODIGO BCD***************************
#define ds1307W 0b11010000 //direccion del modulo para escritura(write)
#define ds1307R 0b11010001 //direccion del modulo para lectura(read)
int8 ds1307[7];
int bytes=0;
int1 flag=1;
#int_RDA
void conf_hora(){ // RECIBO 8 BYTES DEL CELULAR
if(bytes<=6){
ds1307[bytes]=getc();
bytes++;
}
else if(bytes==7&&255==getc()){
bytes=0;
flag=1; // SI RECIBO 7 BYTES Y EL 8vo ES '0xff' pongo en 1 el flag
}
else{
bytes=0;
flag=0;
}
}
//*************************************************************************************************************\\
//******************************************FUNCIONES DEL DS1307***********************************************\\
//*************************************************************************************************************\\
unsigned int bcd_a_bin(unsigned int bcd){ // FUNCION DE CONVERSION DE BCD A BINARIO
unsigned int bcdL=0,bcdH=0;
bcdL=((bcd)&15);
bcdH=(((bcd)>>4)*10);
return bcdH+bcdL;
}
int bin_a_bcd(int8 bin){ // FUNCION DE CONVERSION DE BINARIO A BCD
int bcdH=0,bcdL;
bcdH=bin/10;
bcdL=bin%10;
return bcdH<<4|bcdL;
}
void ds1307_init(){ // CONFIGURACION INICIAL
i2c_start();
i2c_write(ds1307W);
i2c_write(0x00);
bit_clear(ds1307[0],7); // PONGO EL BIT CH EN 0 PARA QUE EL OSCILADOR COMIENCE A FUNCIONAR
i2c_write(bin_a_bcd(ds1307[0])); //segundos=0 BIT 7 DEBE ESTAR EN 0 PARA QUE EL OSCILADOR FUNCIONE
i2c_write(bin_a_bcd(ds1307[1])); //minutos=30
bit_set(ds1307[2],5); /// PONGO EN 1 EL BIT 5 PARA CONFIGURARLO EN 24HORAS
i2c_write(bin_a_bcd(ds1307[2])); //horas=13hs
i2c_write(bin_a_bcd(ds1307[3])); //dia de la semana=1
i2c_write(bin_a_bcd(ds1307[4])); //dia del mes
i2c_write(bin_a_bcd(ds1307[5])); //mes
i2c_write(bin_a_bcd(ds1307[6])); //año=96
i2c_write(0b00010000); //configuracion
i2c_stop();
}
void ds1307_fecha() // LECTURA DE LA FECHA DEL MODULO
{
i2c_start(); //Inicia I2C
i2c_write(ds1307W); //Direcciona DS1307 write
i2c_write(0x03); //Indica que ponga registro en dia de la semana
i2c_start();
i2c_write(ds1307R);
ds1307[3]=bcd_a_bin(i2c_read());
ds1307[4]=bcd_a_bin(i2c_read());
ds1307[5]=bcd_a_bin(i2c_read());
ds1307[6]=bcd_a_bin(i2c_read(0));
i2c_stop();
}
void ds1307_horas(){ //LECTURA DE LA HORA DEL MODULO
i2c_start(); //Inicia I2C
i2c_write(ds1307W); //Direcciona DS1307 write
i2c_write(0x00); //Indica que ponga registro en ds_seconds
i2c_start();
i2c_write(ds1307R);
ds1307[0]=bcd_a_bin(i2c_read());
ds1307[1]=bcd_a_bin(i2c_read());
ds1307[2]=bcd_a_bin(i2c_read(0));
i2c_stop();
bit_clear(ds1307[2],5); /// PONGO EN 5 EL BIT 5 PARA EVITAR EL BIT DE CONF DE 24 HORAS
}
//*************************************************************************************************************\\
//***********************************FIN DE FUNCIONES DEL DS1307***********************************************\\
//*************************************************************************************************************\\
void puerto_salida(int port)
{
output_bit(pin_c0,bit_test(port,0));
output_b(port);
}
void main()
{
output_a(0x00);
output_b(0x00);
set_tris_c(0b10000000);
//setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
//setup_timer_2(T2_DIV_BY_1,0,1);
Setup_adc_ports(NO_ANALOGS);
// enable_interrupts(INT_EXT);
enable_interrupts(INT_RDA);
// enable_interrupts(INT_TIMER1);
// enable_interrupts(INT_TIMER2);
// enable_interrupts(INT_EEPROM);
enable_interrupts(GLOBAL);
while(TRUE)
{
if(flag==1)
{
ds1307_init();
output_toggle(pin_a1);
delay_ms(100);
flag=0;
}
else{
ds1307_fecha();
ds1307_horas();
puerto_salida(ds1307[0]);
//printf(lcd_putc,"\f%d-%d-20%d\n",ds1307[4],ds1307[5],ds1307[6]);
//printf(lcd_putc,"%d : %d : %d",ds1307[2],ds1307[1],ds1307[0]); //23:59:5//
putc(ds1307[0]);
putc(ds1307[1]);
putc(ds1307[2]);
putc(ds1307[3]);
putc(ds1307[4]);
putc(ds1307[5]);
putc(ds1307[6]);
output_toggle(pin_a0);
delay_ms(1000);
}
}
}