TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: jamasari en 13 de Noviembre de 2011, 21:03:19

Título: Problemas con 24lc256 con 16f887
Publicado por: jamasari 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
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: MerLiNz en 13 de Noviembre de 2011, 22:14:47
void write2ext_eeprom(address, char character)

a ese address le falta un int16 delante
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: jamasari 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...");
}
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: MerLiNz en 13 de Noviembre de 2011, 23:27:34
revisa write_ext_eeprom de que tambien tenga un int16
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: jamasari 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
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: jamasari en 13 de Noviembre de 2011, 23:55:48
ya me tiene medio loco este puntico
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: MerLiNz 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"
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: Suky 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!
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: MerLiNz 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.
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: Suky 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:
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: MerLiNz 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.
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: jamasari 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(http://C:\Documents and Settings\THUNDER\Mis documentos\Mis imágenes\problema.jpg)
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: jamasari en 14 de Noviembre de 2011, 17:25:52
y tengo otra dudita para que sirve el * en character???
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: Suky 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?
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: jamasari 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);
   }
}


Título: Re: Problemas con 24lc256 con 16f887
Publicado por: jukinch en 14 de Noviembre de 2011, 17:59:55
Hola Jamasari y Suky.
            la duda que tienes Jamasari con el * en character es un puntero. Como ya te ha dicho Suky.
El puntero es una variable que guarda la dirección de memoria en donde está alojada otra variable en la memoria física.
            En este caso la función se declara con un puntero a caracter       llamado      character. Por lo que la función esperará un puntero como parámetro.

Te recomiendo leas este hilo:
http://www.todopic.com.ar/foros/index.php?topic=16680.40
y veas estos videos:
feature=related
feature=related
            sldos a ambos.
                     Jukinch
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: jamasari en 14 de Noviembre de 2011, 18:02:31
q bien muchas gracias jukinch por aclararmela.

ya entendi esa partecita.

tambien estoy leyendo un poco sobre eso
de nuevo gracias.
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: Suky en 14 de Noviembre de 2011, 19:16:18
No es adecuado publicar el código de la librería cuando en la misma en su cabecera dice:

Citar
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS C  ////
//// compiler.  This source code may only be distributed to other      ////
//// licensed users of the CCS C compiler.  No other use, reproduction ////
//// or distribution is permitted without written permission.          ////
//// Derivative programs created using this software in object code    ////
//// form are not restricted in any way.                               ////
///////////////////////////////////////////////////////////////////////////

 :tongue: Por favor solo menciona la parte de código que es de interés.

Ahora, veo una modificación con respecto al tratamiento de la dirección, se rota 15 veces a la derecha cuando debería ser 8:

Código: C
  1. i2c_write(address>>8);
  2.    i2c_write(address);

Saludos!
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: jamasari en 14 de Noviembre de 2011, 19:21:55
muchas gracias Suky modifique el problema que me indicaste y funciono de una.

Ofresco disculpas con la publicacion de esa parte, se que es politica del foro pero lo pase por alto.


gracias de nuevo
Título: Re: Problemas con 24lc256 con 16f887
Publicado por: jamasari en 15 de Noviembre de 2011, 00:59:59
bien