TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado 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
-
Hola.
Y el hard? si tiene las resistencias de pullup en las lineas SDA y SCL? esta conectado el pin de la bateria?
Saludos
-
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
-
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.....
-
No tendrás cambiada la polaridad de la batería??
-
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.
-
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
-
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));
}
-
por ahi tengo unos ds1307, haber si armo una plaquita para el reloj, y la pruebo, te cuento.
Saludos!!
-
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
-
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
-
hola amigo fantaxmax me gustaria si probaste el reloj ds1307 si es asi como te fue....
-
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!
-
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
-
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
-
Hola, tal vez lo que te hace falta es incluir el pic que estas utilizando en los #include
saludos
-
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 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??
-
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