Autor Tema: DS1307 no funciona  (Leído 2330 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado electroipod

  • PIC16
  • ***
  • Mensajes: 166
DS1307 no funciona
« en: 23 de Enero de 2012, 10:49:36 »
Hola tengo un problema quiero hacer funcionar este IC RTC DS1307 con un pic 16f887 y una pantalla lcd solo quiero mostrar la hora en la pantalla pero no se que esta mal en mi programa si alguien me pudiera dar una mano, en la pantalla solo sale: TIME 0:0:0 y no cambia los segundos ayuda porfa, gracias.

unsigned short bcdtoshort(unsigned short bcd){
  unsigned short lv,hv;
  lv=bcd&0x0f;
  hv=(bcd>>4)&0x0f;
  return lv+hv*10;
}
void main() {
    unsigned short seg,min,hor;
    char time[6];
    ANSEL=0;ANSELH=0;
    TRISB.B1=0;
    PORTB.B1=0;
    Lcd_Init();
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(1,1,"TIME ");
    I2C1_Init(100000);
    Delay_ms(50);
    I2C1_Start();
    I2C1_Wr(0xd0);
    I2C1_Wr(0);//direccion de memoria "segundos"
    I2C1_Wr(0);//segundos
    I2C1_Wr(0);//minutos
    I2C1_Wr(0);//hora
    I2C1_Wr(0);//dia de la semana
    I2C1_Wr(0);//fechas
    I2C1_Wr(0);//meses
    I2C1_Wr(0);//años
    I2C1_Wr(0x10);//control,habilita SQWE
    I2C1_Stop();
    Delay_ms(50);
   
while(1){
    I2C1_Start();
    I2C1_Wr(0xd0);
    I2C1_Wr(0);
    I2C1_Repeated_Start();
    I2C1_Wr(0xd1);
    seg=I2C1_Rd(1);//lee segundos
    min=I2C1_Rd(1);//lee minutos
    hor=I2C1_Rd(0);//lee horas
    I2C1_Stop();
    Delay_ms(50);
   
    time[0]=bcdtoshort(hor)+48;
    time[1]=':';
   
    time[2]=bcdtoshort(min)+48;
    time[3]=':';
   
    time[4]=bcdtoshort(seg)+48;
    time[5]=0;
    Lcd_out(1,6,time);
    Delay_ms(100);
   
}
   
   
}

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: DS1307 no funciona
« Respuesta #1 en: 23 de Enero de 2012, 11:09:15 »
Hola amigo, de esta forma lo configuro yo, revisa si te sirve.

Saludos.
Código: [Seleccionar]
void leer_ds1307()
{ int respaldo;

   i2c_start();         //Start
i2c_write(0b11010000);   //Control
i2c_write(0b00000000);   //Direccion
i2c_stop();            //Stop
i2c_start();         //Start
i2c_write(0b11010001);   //Control para lectura

respaldo = i2c_read();   //Se lee los segundos
uni_seg = respaldo;
dec_seg = swap(respaldo);
uni_seg &= 0x0f;
dec_seg &= 0x0f;

respaldo = i2c_read();   //Se lee los minutos
uni_minu = respaldo;
dec_minu = swap(respaldo);
uni_minu &= 0x0f;
dec_minu &= 0x0f;

respaldo = i2c_read();   //Se lee las horas
uni_hora = respaldo;
dec_hora = swap(respaldo);
uni_hora &= 0x0f;
dec_hora &= 0x0f;

respaldo = i2c_read();   //Se lee el dia de la semana
dia_sem = respaldo;

respaldo = i2c_read();   //Se lee el dia del mes
uni_dia = respaldo;
dec_dia = swap(respaldo);
uni_dia &= 0x0f;
dec_dia &= 0x0f;

respaldo = i2c_read();   //Se lee el mes
uni_mes = respaldo;
dec_mes = swap(respaldo);
uni_mes &= 0x0f;
dec_mes &= 0x0f;

respaldo = i2c_read();   //Se lee los años
uni_anio = respaldo;
dec_anio = swap(respaldo);
uni_anio &= 0x0f;
dec_anio &= 0x0f;

respaldo = i2c_read();

i2c_stop();            //Stop
}
///////////////////////////////////////////////////////////////////////////////
void conf_ds1307()
{
int respaldo;

i2c_start();         //Start
i2c_write(0b11010000);   //Control
i2c_write(0b00000000);   //Direccion

respaldo=(uni_seg | (swap(dec_seg)));   //Se escriben los segundos
i2c_write(respaldo);

respaldo=(uni_minu | (swap(dec_minu)));   //Se escriben los minutos
i2c_write(respaldo);

respaldo=(uni_hora | (swap(dec_hora)));   //Se escriben las horas
i2c_write(respaldo);

i2c_write(dia_sem);

respaldo=(uni_dia | (swap(dec_dia)));   //Se escriben los dias del mes
i2c_write(respaldo);

respaldo=(uni_mes | (swap(dec_mes)));   //Se escribe el mes
i2c_write(respaldo);

respaldo=(uni_anio | (swap(dec_anio)));   //Se escribe el año
i2c_write(respaldo);

i2c_write(0);   //Control de pulsos

i2c_stop();            //Stop
}

Desconectado electroipod

  • PIC16
  • ***
  • Mensajes: 166
Re: DS1307 no funciona
« Respuesta #2 en: 23 de Enero de 2012, 12:18:15 »
El problema parece ser el simulador proteus ya que lo grabe en el pic y funciona normal, pero me gustaria poder simularlo en el proteus para no estar grabando el pic a cada rato cada vez que haga algun cambio, alguno de ustedes tendra un programa funcionando en proteus no importa que sea algo simple como mostrar la hora me lo podria pasar porfavor, les pongo una imagen haber si alguien me dice que estoy conectando mal, gracias.

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: DS1307 no funciona
« Respuesta #3 en: 23 de Enero de 2012, 12:34:00 »
Revisa este ejemplo.

Saludos

Desconectado electroipod

  • PIC16
  • ***
  • Mensajes: 166
Re: DS1307 no funciona
« Respuesta #4 en: 23 de Enero de 2012, 12:57:37 »
Revisa este ejemplo.

Saludos
Gracias por el programa lo voy a estudiar se que esta hecho en ccs c pero el programa que estoy haciendo esta hecho en mikroc pero creo que podre adaptarlo ya que ambos trabajan con el lenguaje C. Me quede sorprendido cuando vi en el LCD la misma hora  y fecha que tiene mi computadora, interesante, gracias man.
« Última modificación: 23 de Enero de 2012, 13:01:00 por electroipod »


 

anything