Autor Tema: Duda con Escritura y Lectura en memoria RAM de un DS1302 (Reloj) en C18  (Leído 2438 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Hola que tal;

He estado tratando de hacer funcionar la memoria RAM del reloj de tiempo real DS1302 y hasta el momento solamente he logrado realizar la escritura en la memoria RAM; mas sin embargo no he logrado realizar la lectura de tal.... En la memoria estoy guardando 8 bytes y los mismos los quiero leer cuando los necesite... Creo que mi problema esta en mi rutina de lectura... ya que siempre me envia ceros....

Escritura de un Byte:

Código: [Seleccionar]
//Funcion de escritura de un Byte
void write_byte(unsigned char Byte)
{
unsigned char i;
TrisIO=0;
for (i=0;i<=7;++i)
{
IO=Byte&0x01;
Byte>>=1;
SCLK=1;
SCLK=0;
}
}

Función que escribe los 8 bytes en la memoria Ram del reloj:
Código: [Seleccionar]
void write_ds1302_ram(unsigned char Dato_1,unsigned char Dato_2,unsigned char Dato_3,unsigned char Dato_4,unsigned char Dato_5,unsigned char Dato_6,unsigned char Dato_7,unsigned char Dato_8)
{
RST=1;
write_byte(0xFE);
write_byte(Dato_1);
write_byte(Dato_2);
write_byte(Dato_3);
write_byte(Dato_4);
write_byte(Dato_5);
write_byte(Dato_6);
write_byte(Dato_7);
write_byte(Dato_8);
RST=0;
}

Función que realiza la lectura de un byte:
Código: [Seleccionar]
unsigned char read_only_ds1302(void)
{
unsigned char i,Data;

Data=0xFF;
TrisIO=1;
for(i=0;i<=7;i++)
{
Data=IO&0x01;
Data>>=1;
SCLK=1;
SCLK=0;
}
return(Data);
}

Rutina que realiza la lectura de los 8 bytes:
Código: [Seleccionar]
void read_ds1302_ram(void)
{
unsigned char Dato_1,Dato_2,Dato_3,Dato_4,Dato_5,Dato_6,Dato_7,Dato_8;
char cadena[10];

RST=1;
write_byte(0xFF);
Dato_1=read_only_ds1302();
Dato_2=read_only_ds1302();
Dato_3=read_only_ds1302();
Dato_4=read_only_ds1302();
Dato_5=read_only_ds1302();
Dato_6=read_only_ds1302();
Dato_7=read_only_ds1302();
Dato_8=read_only_ds1302();
RST=0;

WriteLCD(" d1=",4);
itoa(Dato_1,cadena);
putsUART(cadena);

WriteLCD(" d2=",4);
itoa(Dato_2,cadena);
putsUART(cadena);

WriteLCD(" d3=",4);
itoa(Dato_3,cadena);
putsUART(cadena);

WriteLCD(" d4=",4);
itoa(Dato_4,cadena);
putsUART(cadena);

Delay_ms(1000);
}


Segun yo estoy realizando bien la lectura... o tengo algun error? Les agradeceria sus comentarios

Salduos
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Duda con Escritura y Lectura en memoria RAM de un DS1302 (Reloj) en C18
« Respuesta #1 en: 03 de Noviembre de 2010, 13:02:47 »
Mi duda es con la función "unsigned char read_only_ds1302(void)".... creo que no estoy leyendo de la manera adecuada los bits para formar el byte completo
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Duda con Escritura y Lectura en memoria RAM de un DS1302 (Reloj) en C18
« Respuesta #2 en: 03 de Noviembre de 2010, 13:58:53 »
Probandolo de esta manera solamente puedo leer el primer dato de la ram....

como puedo hacerle para que me lea correctamente los demas...

Saludos!!

Lectura de un byte:
Código: [Seleccionar]
unsigned char read_only_ds1302(void)
{
unsigned char i,Data;

TrisIO=1;
Data=0;
for(i=0;i<=6;i++)
{
if(IO==1)
{
Data += 0x80;
}
Data>>=1;
SCLK=1;
SCLK=0;
}
return(Data);
}

Rutina de lectura en RAM:
Código: [Seleccionar]
void read_ds1302_ram(void)
{
unsigned char Dato_1,Dato_2,Dato_3,Dato_4,Dato_5,Dato_6,Dato_7,Dato_8;
char cadena[10];

RST=1;
write_byte(0xFF);
Dato_1=read_only_ds1302();
Dato_2=read_only_ds1302();
Dato_3=read_only_ds1302();
Dato_4=read_only_ds1302();
Dato_5=read_only_ds1302();
Dato_6=read_only_ds1302();
Dato_7=read_only_ds1302();
Dato_8=read_only_ds1302();
RST=0;

WriteLCD(" d1=",4);
itoa(Dato_1,cadena);
putsUART(cadena);

WriteLCD(" d2=",4);
itoa(Dato_2,cadena);
putsUART(cadena);

WriteLCD(" d3=",4);
itoa(Dato_3,cadena);
putsUART(cadena);

WriteLCD(" d4=",4);
itoa(Dato_4,cadena);
putsUART(cadena);

Delay_ms(1000);
}
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Duda con Escritura y Lectura en memoria RAM de un DS1302 (Reloj) en C18
« Respuesta #3 en: 03 de Noviembre de 2010, 14:06:22 »
Leíste el datasheet del ds1302? Implementa un puntero interno que se incrementa en cada lectura? Si fuera el caso, en la primer lectura debería indicarse la dirección del primer registro a leer y para los demás ya no es necesario direccionar. Sino hay que direccionar cada registro a leer.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Duda con Escritura y Lectura en memoria RAM de un DS1302 (Reloj) en C18
« Respuesta #4 en: 03 de Noviembre de 2010, 14:47:15 »
Ya me di cuenta donde esta mi error... me estaba desfasando por un pulso era por eso que solamente el primer dato me llegaba bien. Si ya leí la hoja de datos del ds1302 y estoy usando el modo burts tanto para escribir como para leer los datos jejeje

Bueno ya corregido las funciones para la lectura de la RAM del reloj quedan así:

Escritura de un byte:
Código: [Seleccionar]
//Funcion que escribe una Byte en el DS1302
void write_byte(unsigned char Byte)
{
unsigned char i;
TrisIO=0;
for (i=0;i<=7;++i)
{
IO=Byte&0x01;
Byte>>=1;
SCLK=1;
SCLK=0;
}
}

Escritura de 8 bytes en la Memoria RAM del reloj (Ojo pueden ser hasta 31 bytes):
Código: [Seleccionar]
void write_ds1302_ram(unsigned char Dato_1,unsigned char Dato_2,unsigned char Dato_3,unsigned char Dato_4,unsigned char Dato_5,unsigned char Dato_6,unsigned char Dato_7,unsigned char Dato_8)
{
RST=1;
write_byte(0xFE);
write_byte(Dato_1);
write_byte(Dato_2);
write_byte(Dato_3);
write_byte(Dato_4);
write_byte(Dato_5);
write_byte(Dato_6);
write_byte(Dato_7);
write_byte(Dato_8);
RST=0;
}

Lectura de un Byte:
Código: [Seleccionar]
unsigned char read_only_ds1302(void)
{
unsigned char i,Data;

TrisIO=1;
Data=0;
for(i=0;i<=6;i++)
{
if(IO==1)
{
Data += 0x80;
}
Data>>=1;
SCLK=1;
SCLK=0;
}
SCLK=1;
SCLK=0;
return(Data);
}

Lectura de 8 bytes en la Memoria RAM del reloj (Ojo pueden ser hasta 31 bytes):
Código: [Seleccionar]
void read_ds1302_ram(void)
{
unsigned char Dato_1,Dato_2,Dato_3,Dato_4,Dato_5,Dato_6,Dato_7,Dato_8;
char cadena[10];

RST=1;
write_byte(0xFF);
Dato_1=read_only_ds1302();
Dato_2=read_only_ds1302();
Dato_3=read_only_ds1302();
Dato_4=read_only_ds1302();
Dato_5=read_only_ds1302();
Dato_6=read_only_ds1302();
Dato_7=read_only_ds1302();
Dato_8=read_only_ds1302();
RST=0;

WriteLCD(" d1=",4);
itoa(Dato_1,cadena);
putsUART(cadena);

WriteLCD(" d2=",4);
itoa(Dato_2,cadena);
putsUART(cadena);

WriteLCD(" d3=",4);
itoa(Dato_3,cadena);
putsUART(cadena);

WriteLCD(" d4=",4);
itoa(Dato_4,cadena);
putsUART(cadena);

WriteLCD(" d5=",4);
itoa(Dato_5,cadena);
putsUART(cadena);

WriteLCD(" d6=",4);
itoa(Dato_6,cadena);
putsUART(cadena);

WriteLCD(" d7=",4);
itoa(Dato_7,cadena);
putsUART(cadena);

WriteLCD(" d8=",4);
itoa(Dato_8,cadena);
putsUART(cadena);

Delay_ms(1000);
}
Lo que no me destruye, me fortalece