Autor Tema: Problemas con 24lc256 con 16f887  (Leído 3290 veces)

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

Desconectado jamasari

  • PIC10
  • *
  • Mensajes: 32
Problemas con 24lc256 con 16f887
« en: 13 de Noviembre de 2011, 21:03:19 »
hola a todos estoy tratando de guardar cadenas en una eeprom pero solo me deja guardar en las primeras 256 bytes pero cuando intento escribir en otra direccion diferente no me lo permite y no escribe nada si alguien tiene alguna idea de mi problema por favor ayudarme.

dejo codigo:
Código: [Seleccionar]
#include<16F887.h>
//#include<stdlib.h>
#fuses INTRC,MCLR,NOLVP,NOPROTECT,NOWDT
#use delay(clock=20000000)
#use fast_io(C)
#use fast_io(D)
#use i2c(master,SDA=PIN_C4,SCL=PIN_C3) 
#include"lcd.c"
#include"24256.c"
#define EEPROM_ADDRESS long int
#define EEPROM_SIZE   32768

char cadena[30]="hola mundo como esta";
char cadena2[11]="aaaaaaaaaa";
char cadena3[11]="bbbbbbbbbb";
char cadena4[11]="cccccccccc";
int f=0x5A;
long int address=0;
void configure()
{
   set_tris_C(0);
   set_tris_D(0);
   output_C(0);
   output_D(0);
   init_ext_eeprom();
   lcd_init();
}

// Esta funcion escribe los bytes de un solo caracter, proporcionando un direccion inicial y los bytes,
//donde la direccion inicial posee el numero de bytes que contiene dicho caracter
void write2ext_eeprom(address, char character)
{
   long int i;
   long int lim;
   lim=20;
   for(i>0;i<=lim;i++)
   {
     if(lim==0){
     }
     
      write_ext_eeprom(address,*character);
     character++;
     address++;
   }
}

void main()
{
   configure();
   lcd_putc("\fEscribiendo...");

   //write2ext_eeprom(0,cadena2);
   
   //write2ext_eeprom(41,cadena3);
   
   //write2ext_eeprom(392,cadena4);
   
   write2ext_eeprom(254,cadena);
   

   lcd_putc("\fFin de\nescritura...");
}

PD: el codigo no fue hecho por mi lo copie de otro tema solo lo he modificado

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Problemas con 24lc256 con 16f887
« Respuesta #1 en: 13 de Noviembre de 2011, 22:14:47 »
void write2ext_eeprom(address, char character)

a ese address le falta un int16 delante

Desconectado jamasari

  • PIC10
  • *
  • Mensajes: 32
Re: Problemas con 24lc256 con 16f887
« Respuesta #2 en: 13 de Noviembre de 2011, 23:11:22 »
Gracias Amigo por responder pero no hubo ningun cambio le agregue el int16 pero no paso nada??

Código: [Seleccionar]
#include<16F887.h>
//#include<stdlib.h>
#fuses INTRC,MCLR,NOLVP,NOPROTECT,NOWDT
#use delay(clock=20000000)
#use fast_io(C)
#use fast_io(D)
#use i2c(master,SDA=PIN_C4,SCL=PIN_C3) 
#include"lcd.c"
#include"24256.c"
#define EEPROM_ADDRESS long int
#define EEPROM_SIZE   32768
/*********************************************************************************************
   ETIQUETAS
*********************************************************************************************/
//Direcciones
char cadena[30]="hola mundo como esta";
char cadena2[11]="aaaaaaaaaa";
char cadena3[11]="bbbbbbbbbb";
char cadena4[11]="cccccccccc";
int f=0x5A;


//   Tabla de caracteres en EEPROM interna ****************************************************
//   El primer byte de cada letra indica el numero de bytes que componen el caracter


void configure()
{
   set_tris_C(0);
   set_tris_D(0);
   output_C(0);
   output_D(0);
   init_ext_eeprom();
   lcd_init();
}

// Esta funcion escribe los bytes de un solo caracter, proporcionando un direccion inicial y los bytes,
//donde la direccion inicial posee el numero de bytes que contiene dicho caracter
void write2ext_eeprom(int16 address, char character)
{
   long int i;
   long int lim;
   lim=20;
   for(i>0;i<=lim;i++)
   {
     if(lim==0){
     }
     
      write_ext_eeprom(address,*character);
     character++;
     address++;
   }
}

void main()
{
   configure();
   lcd_putc("\fEscribiendo...");

   //write2ext_eeprom(0,cadena2);
   
   //write2ext_eeprom(41,cadena3);
   
   //write2ext_eeprom(392,cadena4);
   
   write2ext_eeprom(250,cadena);
   

   lcd_putc("\fFin de\nescritura...");
}

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Problemas con 24lc256 con 16f887
« Respuesta #3 en: 13 de Noviembre de 2011, 23:27:34 »
revisa write_ext_eeprom de que tambien tenga un int16

Desconectado jamasari

  • PIC10
  • *
  • Mensajes: 32
Re: Problemas con 24lc256 con 16f887
« Respuesta #4 en: 13 de Noviembre de 2011, 23:55:18 »
pues le coloco
Código: [Seleccionar]
void write2ext_eeprom(int16 address, char character)
{
   long int i;
   long int lim;
   lim=20;
   for(i>0;i<=lim;i++)
   {
     if(lim==0){
     }
     
      write_ext_eeprom(int16 address,*character);
     character++;
     address++;
   }

pero me da error al compilar

Desconectado jamasari

  • PIC10
  • *
  • Mensajes: 32
Re: Problemas con 24lc256 con 16f887
« Respuesta #5 en: 13 de Noviembre de 2011, 23:55:48 »
ya me tiene medio loco este puntico

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Problemas con 24lc256 con 16f887
« Respuesta #6 en: 14 de Noviembre de 2011, 11:39:48 »
no no, asi no, me refiero a la funcion, seguramente este en este archivo: #include"24256.c"

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problemas con 24lc256 con 16f887
« Respuesta #7 en: 14 de Noviembre de 2011, 12:19:10 »
no no, asi no, me refiero a la funcion, seguramente este en este archivo: #include"24256.c"


Esa es propia del compilador  ;-)

Ahora, el 16F887 tiene oscilador interno de 20 MHz?  :tongue:

Esto:
Código: [Seleccionar]
#define EEPROM_ADDRESS long int
#define EEPROM_SIZE   32768

no es necesario, ya está en la librería 24256.h. Lo que si te pide es la definición de EEPROM_SDA y EEPROM_SCL, y se debe hacer antes:

Código: [Seleccionar]
#define EEPROM_SDA  PIN_C4
#define EEPROM_SCL  PIN_C3
#include <24256.h>

Para guardar cadenas podes hacerlo de la siguiente manera:

Código: C
  1. void write2ext_eeprom(int16 address, char *character)
  2. {
  3.  
  4.    do{
  5.       write_ext_eeprom(address++,*character++);
  6.    }while(*character!='\0');
  7. }

Fíjate el tema de los punteros, porque en la función quieres implementarlo pero nunca lo indicas entre los parámetros.



Saludos!
« Última modificación: 14 de Noviembre de 2011, 12:21:26 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Problemas con 24lc256 con 16f887
« Respuesta #8 en: 14 de Noviembre de 2011, 13:01:47 »
si, todo eso lo mire yo, sin embargo cuando dijo que solo escribia bien hasta 256bytes por eso me extrañe, porque un char se que son 8bits y que el maximo es 255 asi que lo primero que pense es eso.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problemas con 24lc256 con 16f887
« Respuesta #9 en: 14 de Noviembre de 2011, 13:06:55 »
si, todo eso lo mire yo, sin embargo cuando dijo que solo escribia bien hasta 256bytes por eso me extrañe, porque un char se que son 8bits y que el maximo es 255 asi que lo primero que pense es eso.

Cuack!  :tongue: El problema está que con tantos posibles inconvenientes, a cual atribuírselo  :mrgreen:
No contesto mensajes privados, las consultas en el foro

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Problemas con 24lc256 con 16f887
« Respuesta #10 en: 14 de Noviembre de 2011, 13:14:58 »
yo es que cuando tengo problemas recurro al debuggin, y voy observando cada cambio de variable y asi es facil identificar el problema, pero asi leyendo el codigo sin saber como va transcurriendo es algo complicado, como con los ojos tapados.

Desconectado jamasari

  • PIC10
  • *
  • Mensajes: 32
Re: Problemas con 24lc256 con 16f887
« Respuesta #11 en: 14 de Noviembre de 2011, 17:23:07 »
Hola creo que no me he dado a entender bien sobre el problema, lo que pasa es que si me graba todos los caracteres  lo malo es que en la memoria eeprom solo me graba hasta la FF y de la 100 en adelante no graba nada..

ese es el problema

Desconectado jamasari

  • PIC10
  • *
  • Mensajes: 32
Re: Problemas con 24lc256 con 16f887
« Respuesta #12 en: 14 de Noviembre de 2011, 17:25:52 »
y tengo otra dudita para que sirve el * en character???

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problemas con 24lc256 con 16f887
« Respuesta #13 en: 14 de Noviembre de 2011, 17:39:26 »
Hola creo que no me he dado a entender bien sobre el problema, lo que pasa es que si me graba todos los caracteres  lo malo es que en la memoria eeprom solo me graba hasta la FF y de la 100 en adelante no graba nada..

ese es el problema

Hiciste las modificaciones planteadas?


y tengo otra dudita para que sirve el * en character???


 :shock: Lo implentaste primero vos en la función que mostraste  :) Podes informarte al respecto buscado teoria sobre punteros en C.  ;-)


Aparte de todo, revisaste el tema del oscilador interno y la frecuencias de trabajo posible?
No contesto mensajes privados, las consultas en el foro

Desconectado jamasari

  • PIC10
  • *
  • Mensajes: 32
Re: Problemas con 24lc256 con 16f887
« Respuesta #14 en: 14 de Noviembre de 2011, 17:51:19 »
Suky ya hice los cambios que me dijiste y modifique lo del oscilador, si fue un error mio ya lo cambie a HS 20Mhz.

y la pregunta que hice del * lo que pasa es que el codigo original no fue hecho por mi entonces no tengo mucho conocimiento sobre punteros, unicamente lo necesario pero ahora mismo leere sobre punteros.

Pero no hay cambios en el programa sigue sin guardar despues de la direccion FF.

este es el codigo que estoy usando

Código: [Seleccionar]
#include<16F887.h>
//#include<stdlib.h>
#fuses HS,MCLR,NOLVP,NOPROTECT,NOWDT
#use delay(clock=20000000)
#use fast_io(C)
#use fast_io(D)
#use i2c(master,SDA=PIN_C4,SCL=PIN_C3)  
#include"lcd.c"
#define EEPROM_SDA  PIN_C4
#define EEPROM_SCL  PIN_C3
#include"24256.c"

/*********************************************************************************************
   ETIQUETAS
*********************************************************************************************/
//Direcciones
char cadena[30]="hola mundo como esta";
char cadena2[11]="aaaaaaaaaa";
char cadena3[11]="bbbbbbbbbb";
char cadena4[11]="cccccccccc";
int f=0x5A;


//   Tabla de caracteres en EEPROM interna ****************************************************
//   El primer byte de cada letra indica el numero de bytes que componen el caracter


void configure()
{
   set_tris_C(0);
   set_tris_D(0);
   output_C(0);
   output_D(0);
   init_ext_eeprom();
   lcd_init();
}

// Esta funcion escribe los bytes de un solo caracter, proporcionando un direccion inicial y los bytes,
//donde la direccion inicial posee el numero de bytes que contiene dicho caracter
void write2ext_eeprom(int16 address, char character)
{
    
   do{
     write_ext_eeprom(address++,*character++);
  }while(*character!='\0');
  }


void main()
{
   configure();
   lcd_putc("\fEscribiendo...");

  
  
   write2ext_eeprom(253,cadena);
  

   lcd_putc("\fFin de\nescritura...");
}

este es el 24256.c que estoy usando:
Código: [Seleccionar]
void write_ext_eeprom(int16 address, BYTE data)
{
   short int status;
   i2c_start();
   i2c_write(0xa0);
   i2c_write(address>>15);
   i2c_write(address);
   i2c_write(data);
   i2c_stop();
   i2c_start();
   status=i2c_write(0xa0);
   while(status==1)
   {
   i2c_start();
   status=i2c_write(0xa0);
   }
}


« Última modificación: 14 de Noviembre de 2011, 19:25:34 por Suky, Razón: Se borra la publicación de la librería completa y solo se muestra parte de interés. »


 

anything