TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: arlex en 17 de Noviembre de 2012, 00:30:32

Título: pic18f452 mas ds1307 no funciona
Publicado por: arlex en 17 de Noviembre de 2012, 00:30:32
estoy usando un reloj ds307 con un pic 18f452, estoy tratando de poner a trabajar este reloj mostrando la fecha y hora en una pantalla lcd, pero no consigo que funcione fisicamente, lo he simulado en proteus y funciona bien, les dejo el codigo de lo que estoy haciendo

#include "reloj.h"
#include "LCD.c"
#fuses HS,NOWDT,NOPROTECT,PUT
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3,slow)   




BYTE bin2bcd(BYTE binary_value);
BYTE bcd2bin(BYTE bcd_value);

//=====Direcciones para DS1307================
#define ds_seconds 0x00
#define ds_minutes 0x01 
#define ds_hours 0x02
#define ds_day 0x03   
#define ds_date 0x04
#define ds_month 0x05
#define ds_year 0x06
#define ds_control 0x07
///===========================================

byte seconds,minutes,hours,day,date,month,year,control;


//Funcion para Obtener Fecha y Hora del DS1307
void Get_time_DS1307(){
   i2c_start();                       //Inicia I2C
   i2c_write(0xd0);                   //Direcciona DS1307 write
   i2c_write(ds_seconds);             //Indica que ponga registro en ds_seconds
   i2c_stop();
   i2c_start();
   i2c_write(0xd1);                   //Lee DS1307
   seconds = bcd2bin(i2c_read() & 0x7f);
   minutes = bcd2bin(i2c_read() & 0x7f);
   hours  = bcd2bin(i2c_read(0) & 0x3f);
   i2c_stop();
}
//--------------------------------------------------
void Get_date_DS1307(){
  i2c_start();                       //Inicia I2C
  i2c_write(0xd0);                   //Direcciona DS1307 write
  i2c_write(0x03);             //Indica que ponga registro en ds_seconds
  i2c_stop();
  i2c_start();
  i2c_write(0xd1);                   //Lee DS1307
  day  = bcd2bin(i2c_read() & 0x7f);   // REG 3
  date  = bcd2bin(i2c_read() & 0x3f);   // REG 4
  month  = bcd2bin(i2c_read() & 0x1f);   // REG 5
  year = bcd2bin(i2c_read(0));         // REG 6 
  i2c_stop();
}
       

//Funcion para Establecer Fecha y Hora
void set_date_DS1307(){
   i2c_start();                     //Inicia I2C
   i2c_write(0xd0);                 //Direcciona DS1307 write
   i2c_write(ds_seconds);           //Indica que empiece en registro ds_seconds
//Aquí establece fecha y hora.
   i2c_write(bin2bcd(seconds));
   i2c_write(bin2bcd(minutes));
   i2c_write(bin2bcd(hours));
   i2c_write(bin2bcd(day));
   i2c_write(bin2bcd(date));
   i2c_write(bin2bcd(month));
   i2c_write(bin2bcd(year));
   i2c_write(control);
   i2c_stop();                     //Ya puso la hora y fecha
}
//-------------------------------------

BYTE bin2bcd(BYTE binary_value)
{
  BYTE temp;
  BYTE retval;

  temp = binary_value;
  retval = 0;

  while(1)
  {
    // Get the tens digit by doing multiple subtraction
    // of 10 from the binary value.
    if(temp >= 10)
    {
      temp -= 10;
      retval += 0x10;
    }
    else // Get the ones digit by adding the remainder.
    {
      retval += temp;
      break;
    }
  }

  return(retval);
}

// Input range - 00 to 99.
BYTE bcd2bin(BYTE bcd_value)
{
  BYTE temp;

  temp = bcd_value;
  // Shifting upper digit right by 1 is same as multiplying by 8.
  temp >>= 1;
  // Isolate the bits for the upper digit.
  temp &= 0x78;

  // Now return: (Tens * 8) + (Tens * 2) + Ones

  return(temp + (temp >> 2) + (bcd_value & 0x0f));
}





void main(void){
       
     
//Justo cuando prende circuito, la fecha que establece es la siguiente
   seconds= 0x30;
   minutes= 0x10;
   hours = 0x08;                             //modo 24 hrs
   day = 0x01;                              //1 es domingo         
   date = 0x09;                                               
   month = 0x02;                           
   year = 0x08;
 
 
 
   set_date_DS1307();      //Llama a funcion para establecer Fecha y Hora

   
   lcd_init();                  // Inicializar la LCD

   

while(true){
   delay_ms(1000);                                  //Usuario lee
   Get_time_DS1307();                   //Get the time
   Get_date_DS1307();
   lcd_gotoxy(9,1);
   printf(lcd_putc,"%02u:%02u:%02u",hours,minutes,seconds);
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%02u:%02u:%02u",date,month,year);
 
}
}

bien amigos estoy usando un programador pickit para cargar el .hex al pic, cuando lo grabo y lo voy a probar en el protoboar en la pantalla siempre aparece
para  la hora 45:85:85 y para la fecha 45:25:165
espero que me puedan ayudar, ahhh pruebo este mismo codigo con un pic 16f877a y funciona perfectamente en proteus y en protoboard
Título: Re: pic18f452 mas ds1307 no funciona
Publicado por: MLO__ en 17 de Noviembre de 2012, 09:11:59
Hola.

Y el hard? si tiene las resistencias de pullup en las lineas SDA y SCL? esta conectado el pin de la bateria?

Saludos
Título: Re: pic18f452 mas ds1307 no funciona
Publicado por: arlex en 17 de Noviembre de 2012, 10:25:28
si eso es correcto tengo las ressitencias de pull-up de 4.7k conectadas a los pines scl y sda... y tengo una bateria la cual medi y entrega 2,83 V
Título: Re: pic18f452 mas ds1307 no funciona
Publicado por: arlex en 17 de Noviembre de 2012, 18:29:24
he estado intentando de que me funcione el reloj en protoboard, y al fin logre que contara los segundos con el codigo publicado anteriormente pero usando un cristal de 4 MHz, no se si le habia dicho pero estaba trabajando con 20 MHz y nada solo observaba 45:85:85 para la hora y para la fecha 45:25:165, ahora mi problema es que el reloj funciona pero sino le conecto la pila al pin 3 del ds1307, cuando la conecto vuleve aparece lo mismo que aparecia antes, ahora esto puede ser debido a que.....
Título: Re: pic18f452 mas ds1307 no funciona
Publicado por: MGLSOFT en 17 de Noviembre de 2012, 19:48:50
No tendrás cambiada la polaridad de la batería??
Título: Re: pic18f452 mas ds1307 no funciona
Publicado por: RedPic en 17 de Noviembre de 2012, 22:07:51
No lo recuerdo muy bien porque hace años que escribí la librería del DS1307 ... pero quiero recordar que utilizaba una función de inicialización para él en el que configuraba la salida y tal ... no se si al no configurarla puedes tener problemas.

El artículo sobre esto estaba en Circuito auxiliar de Reloj en Tiempo Real mediante un DS1307 (http://picmania.garcia-cuervo.net/proyectos_aux_rtc.php). Dale un repaso por si te sirve de algo.  :mrgreen:

EDITO: De todas formas estoy de acuerdo con MGLSOFT en que puede ser de la batería. En un equipo que tengo y que calza el DS1307 me dió casi exactamente ese fallo porque el portapilas venía con una especie de resina seca en uno de los contactos y al DS1307 no le llegaba el voltaje de la pila. ¡Ah! y de camino te confirmo que sin pila el DS1307 no funciona, independiente de que la pila sirva para mantenerlo en hora o para la NVRAM que lleva. Sin pila no hay reloj.
Título: Re: pic18f452 mas ds1307 no funciona
Publicado por: flacoclau en 18 de Noviembre de 2012, 12:05:19
Hola amigo, te recomiendo que leas el artículo de REDPIC, además hace unos años hice algo con un 452 y un reloj, te dejo el link:

http://www.todopic.com.ar/foros/index.php?topic=24756.0
Título: Re: pic18f452 mas ds1307 no funciona
Publicado por: arlex en 18 de Noviembre de 2012, 14:22:31
amigos, en cuanto a la bateria esta conectada correctamente ya verifique eso, por otra parte estoy usando la siguiente libreria para el mano del reloj y bueno aun sigo con el mismo problema cuando conecto la bateria marca 45:85:85, aca les dejo la libreria
////////////////////////////////////////////////////////////////////////////////
///                               DS1307.C                                   ///
///                     Driver for Real Time Clock                           ///
///                                                                          ///
/// ds1307_init() - Enable oscillator without clearing the seconds register -///
///                 used when PIC loses power and DS1307 run from 3V BAT     ///
///               - Disable squarewave output                                ///
///                                                                          ///
/// ds1307_set_date_time(day,mth,year,dow,hour,min,sec)  Set the date/time   ///
///                                                                          ///
/// ds1307_get_date(day,mth,year,dow)               Get the date             ///
///                                                                          ///
/// ds1307_get_time(hr,min,sec)                     Get the time             ///
///                                                                          ///
////////////////////////////////////////////////////////////////////////////////

#define RTC_SDA  PIN_C4
#define RTC_SCL  PIN_C3

#use i2c(master, sda=RTC_SDA, scl=RTC_SCL, SLOW)

BYTE bin2bcd(BYTE binary_value);
BYTE bcd2bin(BYTE bcd_value);

void ds1307_init(void)
{
   BYTE seconds = 0;

   i2c_start();
   i2c_write(0xD0);      // SELECCIONA RTC CON  ORDEN WR
   i2c_write(0x00);      // REG 0
   i2c_start();
   i2c_write(0xD1);      // RD from RTC
   seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307
   i2c_stop();
   seconds &= 0x7F;
   //seconds = bin2bcd(seconds & 0x7F);

   delay_us(3);

   i2c_start();
   i2c_write(0xD0);      // WR to RTC
   i2c_write(0x00);      // REG 0
   i2c_write(bin2bcd(seconds));     // Start oscillator with current "seconds value
   //i2c_write(seconds);     // Start oscillator with current "seconds value
   i2c_start();
   i2c_write(0xD0);      // WR to RTC
   i2c_write(0x07);      // Control Register
   i2c_write(0x80);     // Disable squarewave output pin
   //i2c_write(0x10);     // Disable squarewave output pin
   i2c_stop();

}

void ds1307_OUT(void){
   i2c_start();
   i2c_write(0xD0);      // WR to RTC
   i2c_write(0x07);      // WR to RTC
   i2c_write(0x10);     // Enable squarewave output pin
   i2c_stop();
}

void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min, BYTE sec)
{
  sec &= 0x7F;
  hr &= 0x3F;

  i2c_start();
  i2c_write(0xD0);            // I2C write address
  i2c_write(0x00);            // Start at REG 0 - Seconds
  i2c_write(bin2bcd(sec));     // REG 0
  i2c_write(bin2bcd(min));     // REG 1
  i2c_write(bin2bcd(hr));      // REG 2
  i2c_write(bin2bcd(dow));     // REG 3
  i2c_write(bin2bcd(day));      // REG 4
  i2c_write(bin2bcd(mth));     // REG 5
  i2c_write(bin2bcd(year));     // REG 6
  i2c_write(0x80);           // REG 7 - Disable squarewave output pin
  //i2c_write(0x00);             // Enable squarewave output pin
  i2c_stop();
}

void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow)
{
  i2c_start();
  i2c_write(0xD0);
  i2c_write(0x03);            // Start at REG 3 - Day of week
  i2c_start();
  i2c_write(0xD1);
  dow  = bcd2bin(i2c_read() & 0x7f);   // REG 3
  day  = bcd2bin(i2c_read() & 0x3f);   // REG 4
  mth  = bcd2bin(i2c_read() & 0x1f);   // REG 5
  year = bcd2bin(i2c_read(0));         // REG 6
  i2c_stop();
}

void ds1307_get_time(BYTE &hr, BYTE &min, BYTE &sec)
{
  i2c_start();
  i2c_write(0xD0);
  i2c_write(0x00);            // Start at REG 0 - Seconds
  i2c_start();
  i2c_write(0xD1);
  sec = bcd2bin(i2c_read() & 0x7f);
  min = bcd2bin(i2c_read() & 0x7f);
  hr  = bcd2bin(i2c_read(0) & 0x3f);
  i2c_stop();

}

BYTE bin2bcd(BYTE binary_value)
{
  BYTE temp;
  BYTE retval;

  temp = binary_value;
  retval = 0;

  while(1)
  {
    // Get the tens digit by doing multiple subtraction
    // of 10 from the binary value.
    if(temp >= 10)
    {
      temp -= 10;
      retval += 0x10;
    }
    else // Get the ones digit by adding the remainder.
    {
      retval += temp;
      break;
    }
  }

  return(retval);
}


// Input range - 00 to 99.
BYTE bcd2bin(BYTE bcd_value)
{
  BYTE temp;

  temp = bcd_value;
  // Shifting upper digit right by 1 is same as multiplying by 8.
  temp >>= 1;
  // Isolate the bits for the upper digit.
  temp &= 0x78;

  // Now return: (Tens * 8) + (Tens * 2) + Ones

  return(temp + (temp >> 2) + (bcd_value & 0x0f));
}
Título: Re: pic18f452 mas ds1307 no funciona
Publicado por: fantaxmax en 18 de Noviembre de 2012, 17:25:01
por ahi tengo unos ds1307, haber si armo una plaquita para el reloj, y la pruebo, te cuento.

Saludos!!
Título: Re: pic18f452 mas ds1307 no funciona
Publicado por: arlex en 19 de Noviembre de 2012, 13:59:33
hola migos nuevamente por aca pues realmente no se que pueda tener mal, estoy pensando que sean los fuses que no lo este habilitando bien
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES XT                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT                //Code not protected from reading
//#FUSES NOOSCSEN                 //Oscillator switching is disabled, main oscillator is source
#FUSES BROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES PUT                    //No Power Up Timer
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOCPD                    //No EE protection
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads

Monte otro circuito en otro protoboar y con un pic18f4550 y sigo con el mismo problema que cuenta los segundos pero al conectar la pila sale en la hora 45:85:85 los 3V3 los estoy sacando de un regulador y tambien use una pila pero no hay diferencia
/////////Este el codigo que estoy usando para el manejo del reloj

#include <Medidor.h>
#include "FLEX_LCD416.c"
#include "DS1307.c"





BYTE year,mth,day,dow,hrs,min,sec;  //Variables para manejo de Reloj



void main()
{

    lcd_init();                  // Inicializar la LCD
   ds1307_init ();              // se inicializa el ds1307
   output_c(0x00);
   output_d(0x00);
   ds1307_get_time(hrs,min,sec); //solicita Hora del Reloj
   delay_us(100);
   

   output_high(PIN_E0);
   delay_ms(500);
   output_low(PIN_E0);
   delay_ms(500);
   output_high(PIN_E0);
   delay_ms(200);
   output_low(PIN_E0);
   delay_ms(200);
   
   day=0x01;
   mth=0x05;
   year=0x08;
   hrs=0x08;
   min=0x08;
   sec=0x08;

//El pic muestra esta hora y fecha y empieza a contar los segundos pero sin la pila conectada 
 
   ds1307_set_date_time(day,mth,year,dow,hrs,min,sec);  //Establece Fecha y Hora.

   //TODO: User Code
 while (true){
    ds1307_get_time(hrs,min,sec); //solicita Hora del Reloj
    lcd_gotoxy(4,2);
    printf(lcd_putc,"%02u:%02u:%02u",hrs,min,sec);
    lcd_gotoxy(4,1);
    printf(lcd_putc,"%02u:%02u:%02u",day,mth,year);
    delay_ms(500);
   
  }//Fin de while
   
}//Fin de void main
Título: Re: pic18f452 mas ds1307 no funciona
Publicado por: arlex en 21 de Noviembre de 2012, 11:25:12
bueno pues no he podido avanzar con lo del reloj, he notado algo raro, enegizo el circuito sin conectar la pila de 3V el reloj empieza a contar pero cuando solo conecto el positivo de la bateria al pin 3 del reloj aparece en la lcd 45:85:85, dejando el negativo de la bateria al aire, voy a seguir con esto y les aviso
Título: Re: pic18f452 mas ds1307 no funciona
Publicado por: arlex en 27 de Noviembre de 2012, 11:37:58
hola amigo fantaxmax me gustaria si probaste el reloj ds1307 si es asi como te fue....
Título: Re: pic18f452 mas ds1307 no funciona
Publicado por: fantaxmax en 27 de Noviembre de 2012, 15:28:15
acabo de diseñar la placa para el reloj, y como extra voy a colocarle una memoria, ya que voy a usarlo en un pic con lcd que tengo hecho en una placa, para el dia domingo espero haberla pasado al cobre ya y haberla pasado por el acido, te cuento

Saludos!
Título: Re: pic18f452 mas ds1307 no funciona
Publicado por: stretchmame32 en 01 de Diciembre de 2012, 02:44:18
bueno respondiendo al tema el DS1307 en sus datasheets es algo engañoso, particularmente tuve el mismo problema todo mi codigo estaba bien escrito y compilado mas aun asi el DS1307 no funcionaba de forma correcta, antes que nada les comento que solo se programar en lenguaje ensamblador al igual que el buen amigo norberto,

retomando el tema lo que hice fue lo siguiente enviar el startbit ,enviar la direccion del esclavo y modo de escritura(espero ACK enviado x ds1307), envio la direccion del ds1307 en este caso pues 00(espero ACK enviado x ds1307) y despues escribir el dato o byte en la direccion 00 del ds1307 y por ultimo envio el stopbit "para el caso de la escritura"

y para el caso de la lectura es asi: enviar el startbit ,enviar la direccion del esclavo y modo de escritura(espero ACK enviado x ds1307), envio la direccion del ds1307 en este caso pues 00(espero ACK enviado x ds1307) y despues nuevamente envio el startbit, enviar la direccion del esclavo y modo de lectura (espero ACK enviado x ds1307), envio la direccion del ds1307 en este caso pues 00(espero ACK enviado x ds1307) leo la informacion contenida en la direccion 00 del ds1307 y por ultimo mando el stopbit

en los datasheets segun dice que el contador de direcciones del ds1307 se incrementa automaticamente con cualquier operacion de lectura o escritura en el bus I2C pero en mi experiencia propia algunos DS1307 funcionan de esa forma y otros nomas no, quizas sean piratas o con algun defecto, las rutinas funcionan bien tanto para leer como para escribir solo recuerda apuntar la direccion del ds1307 desde 00 hasta 07

saludos y visiten mi blog: stretchmame32.nobody.jp
Título: Re: pic18f452 mas ds1307 no funciona
Publicado por: stretchmame32 en 01 de Diciembre de 2012, 02:58:02
bueno respondiendo al tema el DS1307 en sus datasheets es algo engañoso, particularmente tuve el mismo problema todo mi codigo estaba bien escrito y compilado mas aun asi el DS1307 no funcionaba de forma correcta, antes que nada les comento que solo se programar en lenguaje ensamblador al igual que el buen amigo norberto,

retomando el tema lo que hice fue lo siguiente enviar el startbit ,enviar la direccion del esclavo y modo de escritura(espero ACK enviado x ds1307), envio la direccion del ds1307 en este caso pues 00(espero ACK enviado x ds1307) y despues escribir el dato o byte en la direccion 00 del ds1307 y por ultimo envio el stopbit "para el caso de la escritura"

y para el caso de la lectura es asi: enviar el startbit ,enviar la direccion del esclavo y modo de escritura(espero ACK enviado x ds1307), envio la direccion del ds1307 en este caso pues 00(espero ACK enviado x ds1307) y despues nuevamente envio el startbit, enviar la direccion del esclavo y modo de lectura (espero ACK enviado x ds1307), envio la direccion del ds1307 en este caso pues 00(espero ACK enviado x ds1307) leo la informacion contenida en la direccion 00 del ds1307 y por ultimo mando el stopbit

en los datasheets segun dice que el contador de direcciones del ds1307 se incrementa automaticamente con cualquier operacion de lectura o escritura en el bus I2C pero en mi experiencia propia algunos DS1307 funcionan de esa forma y otros nomas no, quizas sean piratas o con algun defecto, las rutinas funcionan bien tanto para leer como para escribir solo recuerda apuntar la direccion del ds1307 desde 00 hasta 07

saludos y visiten mi blog: stretchmame32.nobody.jp

estoy usando un reloj ds307 con un pic 18f452, estoy tratando de poner a trabajar este reloj mostrando la fecha y hora en una pantalla lcd, pero no consigo que funcione fisicamente, lo he simulado en proteus y funciona bien, les dejo el codigo de lo que estoy haciendo

#include "reloj.h"
#include "LCD.c"
#fuses HS,NOWDT,NOPROTECT,PUT
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3,slow)   




BYTE bin2bcd(BYTE binary_value);
BYTE bcd2bin(BYTE bcd_value);

//=====Direcciones para DS1307================
#define ds_seconds 0x00
#define ds_minutes 0x01 
#define ds_hours 0x02
#define ds_day 0x03   
#define ds_date 0x04
#define ds_month 0x05
#define ds_year 0x06
#define ds_control 0x07
///===========================================

byte seconds,minutes,hours,day,date,month,year,control;


//Funcion para Obtener Fecha y Hora del DS1307
void Get_time_DS1307(){
   i2c_start();                       //Inicia I2C
   i2c_write(0xd0);                   //Direcciona DS1307 write
   i2c_write(ds_seconds);             //Indica que ponga registro en ds_seconds
   i2c_stop();
   i2c_start();
   i2c_write(0xd1);                   //Lee DS1307
   seconds = bcd2bin(i2c_read() & 0x7f);
   minutes = bcd2bin(i2c_read() & 0x7f);
   hours  = bcd2bin(i2c_read(0) & 0x3f);
   i2c_stop();
}
//--------------------------------------------------
void Get_date_DS1307(){
  i2c_start();                       //Inicia I2C
  i2c_write(0xd0);                   //Direcciona DS1307 write
  i2c_write(0x03);             //Indica que ponga registro en ds_seconds
  i2c_stop();
  i2c_start();
  i2c_write(0xd1);                   //Lee DS1307
  day  = bcd2bin(i2c_read() & 0x7f);   // REG 3
  date  = bcd2bin(i2c_read() & 0x3f);   // REG 4
  month  = bcd2bin(i2c_read() & 0x1f);   // REG 5
  year = bcd2bin(i2c_read(0));         // REG 6 
  i2c_stop();
}
       

//Funcion para Establecer Fecha y Hora
void set_date_DS1307(){
   i2c_start();                     //Inicia I2C
   i2c_write(0xd0);                 //Direcciona DS1307 write
   i2c_write(ds_seconds);           //Indica que empiece en registro ds_seconds
//Aquí establece fecha y hora.
   i2c_write(bin2bcd(seconds));
   i2c_write(bin2bcd(minutes));
   i2c_write(bin2bcd(hours));
   i2c_write(bin2bcd(day));
   i2c_write(bin2bcd(date));
   i2c_write(bin2bcd(month));
   i2c_write(bin2bcd(year));
   i2c_write(control);
   i2c_stop();                     //Ya puso la hora y fecha
}
//-------------------------------------

BYTE bin2bcd(BYTE binary_value)
{
  BYTE temp;
  BYTE retval;

  temp = binary_value;
  retval = 0;

  while(1)
  {
    // Get the tens digit by doing multiple subtraction
    // of 10 from the binary value.
    if(temp >= 10)
    {
      temp -= 10;
      retval += 0x10;
    }
    else // Get the ones digit by adding the remainder.
    {
      retval += temp;
      break;
    }
  }

  return(retval);
}

// Input range - 00 to 99.
BYTE bcd2bin(BYTE bcd_value)
{
  BYTE temp;

  temp = bcd_value;
  // Shifting upper digit right by 1 is same as multiplying by 8.
  temp >>= 1;
  // Isolate the bits for the upper digit.
  temp &= 0x78;

  // Now return: (Tens * 8) + (Tens * 2) + Ones

  return(temp + (temp >> 2) + (bcd_value & 0x0f));
}





void main(void){
       
     
//Justo cuando prende circuito, la fecha que establece es la siguiente
   seconds= 0x30;
   minutes= 0x10;
   hours = 0x08;                             //modo 24 hrs
   day = 0x01;                              //1 es domingo         
   date = 0x09;                                               
   month = 0x02;                           
   year = 0x08;
 
 
 
   set_date_DS1307();      //Llama a funcion para establecer Fecha y Hora

   
   lcd_init();                  // Inicializar la LCD

   

while(true){
   delay_ms(1000);                                  //Usuario lee
   Get_time_DS1307();                   //Get the time
   Get_date_DS1307();
   lcd_gotoxy(9,1);
   printf(lcd_putc,"%02u:%02u:%02u",hours,minutes,seconds);
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%02u:%02u:%02u",date,month,year);
 
}
}

bien amigos estoy usando un programador pickit para cargar el .hex al pic, cuando lo grabo y lo voy a probar en el protoboar en la pantalla siempre aparece
para  la hora 45:85:85 y para la fecha 45:25:165
espero que me puedan ayudar, ahhh pruebo este mismo codigo con un pic 16f877a y funciona perfectamente en proteus y en protoboard

Título: Re: pic18f452 mas ds1307 no funciona
Publicado por: dyevenez en 12 de Diciembre de 2012, 09:45:16
Hola, tal vez lo que te hace falta es incluir el pic que estas utilizando en los #include

saludos
Título: Re: pic18f452 mas ds1307 no funciona
Publicado por: direct en 18 de Enero de 2013, 12:58:59
HOla a todos.

yo tengo el mismo problema pero con un pic18f4550 conectado por el puerto usb con un puerto serial virtual (hay variaos tutos de como hacerlo).
lo he configurado para que trabaje a 16MHz buscando si esa era la solucion pero el problema persiste.

probe con varias combinaciones de la directiva #use i2c(...) pero no cambia el resultado, siempre muestra 45:85:85 y la fecha 42/165/165 o algo asi (total no funciona)

la libreria que tengo para el DS1307 es la que esta en picmania (http://picmania.garcia-cuervo.net/proyectos_aux_rtc.php). con el proteus verifico que el algoritmo de la libreria esta correcto.

encontre que en otro tema de aqui (http://www.todopic.com.ar/foros/index.php?topic=37373.0) solucionaron un problema con el I2C entre pic18f4550 (puede servir de referencia para la solucion)

se me ha ocurrido experimentar directamente con el modulo MSSP del pic atravez de los registros de control, para ver si por lo menos cambia el valor que sale y asi saber que el ds1307 esta bien, pero aun estoy documentandome del datasheep del pic.

estoy abierto otras soluciones, posibilidades y experimentos de codigo para solucionar el problema

me avisan si necesitan ayuda con el codigo en css o si necesitan probarlo, les colaboro con gusto

Gracias.
Título: Re: pic18f452 mas ds1307 no funciona
Publicado por: camilogr04 en 18 de Marzo de 2020, 14:38:44
HOla a todos.

yo tengo el mismo problema pero con un pic18f4550 conectado por el puerto usb con un puerto serial virtual (hay variaos tutos de como hacerlo).
lo he configurado para que trabaje a 16MHz buscando si esa era la solucion pero el problema persiste.

probe con varias combinaciones de la directiva #use i2c(...) pero no cambia el resultado, siempre muestra 45:85:85 y la fecha 42/165/165 o algo asi (total no funciona)

la libreria que tengo para el DS1307 es la que esta en picmania (http://picmania.garcia-cuervo.net/proyectos_aux_rtc.php). con el proteus verifico que el algoritmo de la libreria esta correcto.

encontre que en otro tema de aqui (http://www.todopic.com.ar/foros/index.php?topic=37373.0) solucionaron un problema con el I2C entre pic18f4550 (puede servir de referencia para la solucion)

se me ha ocurrido experimentar directamente con el modulo MSSP del pic atravez de los registros de control, para ver si por lo menos cambia el valor que sale y asi saber que el ds1307 esta bien, pero aun estoy documentandome del datasheep del pic.

estoy abierto otras soluciones, posibilidades y experimentos de codigo para solucionar el problema

me avisan si necesitan ayuda con el codigo en css o si necesitan probarlo, les colaboro con gusto

Gracias.

Hola encontraste solución??
Título: Re:pic18f452 mas ds1307 no funciona
Publicado por: jarubiamena en 24 de Marzo de 2020, 06:40:06
Buenas a todos.
 
Aprovechando el confinamiento, yo también estoy peleando con el Ds1307. He tenido problemas para leer los registros, hasta que descubrí que entre la secuencia de escritura (para seleccionar el registro) y la secuencia de lectura, hay que enviar “repeated start” bit en vez de start bit. Espero os sirva de ayuda