Autor Tema: Memorias 24c512 y pic 18f4550  (Leído 3443 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado perezriveracarlos

  • PIC10
  • *
  • Mensajes: 15
Memorias 24c512 y pic 18f4550
« en: 30 de Noviembre de 2010, 12:05:30 »
Buenas.

Primero me presento ya que soy nuevo en este foro.
Mi nombre es Carlos y vivo en Barcelona, Soy Ingeniero Industrial, no se, que mas poner.


Después de estar horas buscando por el foro sin ningun éxito no me queda mas remedio que exponeros mi problema.


Mi problema es el siguiente:
Tengo un circuito que capturo una trama de hexas por el puerto serie y los guardo en una 24C512, hasta aqui bien, el problema es que en el datasheet pone que puedo grabar 65536 palabras de 8 bits, pero el problema viene que cuando grabo mas de 432 parejas de bytes (8bits) no me lo graba bien.

Creo que el problema lo tengo en la paginacion de la memoria, ya que en el datasheet pone que hay 512 paginas (y no se como hay que hacerlo para la paginación)

Uso el entorno de desarroyo PCWHD CCS y uso su libreria 24512.C.

Como puedo hacer para poder grabarlo todo??


Os pongo el codigo que uso y el de la libreria a ver si me podeis echar una mano.


Gracias
« Última modificación: 02 de Diciembre de 2010, 05:09:14 por perezriveracarlos »

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Memorias 24c512 y pic 18f4550
« Respuesta #1 en: 30 de Noviembre de 2010, 14:04:16 »
Hola,perezriveracarlos , Haber por la paginacion ,no te preocupes, pues de la forma que lees, no tienes ningún problema, la paginacion se gasta para acelerar la forma de leer la memoria, en bloques , sin tener que enviar los bits de start y stop, de un modo,que la librería ccs no implementa, en cuanto a el problema de escritura, si no veo el resto del programa no puedo decirte, mucho, por ejemplo, si la variable Tag[], la direccionas con a =0>255; no podrás poner mas de 255 bytes, o
   
 
Código: [Seleccionar]
while (c<ntag)// siempre escribes en las mismas posiciones desde c hasta ntag,
         {
            b=0;
            while (b<12)
            {// como i=0 cuando lo inicializas, al grabar eliminas el puntero en las 2 primeras direcciones de memoria.
               write_ext_eeprom((i),tag[a]);// cuando c supere los 22 , 'a' (a=22*12=264 mas de un int8 )se desbordara, y en el mejor de los casos , empezara,
                                                         // otra vez de 0 , pero como dice murfy, crash seguro,
               b++;
               a++;
            }   

en cuanto a la lectura, la variable c , la desbordas 2 veces, como mínimo.
cuando defines tag[], cuantos bytes de memoria usas, haber si corrompes alguna dirección que no toca.

si puedes , postea el código completo y haber si podemos ayudarte mejor, o un modelo en proteus, para poderlo simular, por cierto, lo pruebas en físico, o en proteus?.         
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado perezriveracarlos

  • PIC10
  • *
  • Mensajes: 15
Re: Memorias 24c512 y pic 18f4550
« Respuesta #2 en: 30 de Noviembre de 2010, 15:14:33 »
Hola.

pongo el cogigo entero, hay que terminar de depurar cosillas.

Lo hago en Fisico, ya que tengo la placa montada.

ntag es el numero de veces cadenas de 12 hexas de 8 bits.


Como puedo hacerlo para no desbordar?? por cierto murphy no me visita, empieza de cero jejeje

Me puedes explicar un poco el por que se desborda???

Gracias por la ayuda

« Última modificación: 02 de Diciembre de 2010, 05:09:55 por perezriveracarlos »

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Memorias 24c512 y pic 18f4550
« Respuesta #3 en: 01 de Diciembre de 2010, 08:13:46 »
Hola perezriveracarlos ,en cuanto termine , investigo mejor el código.
Te desborda, porque en 'C' de CCS, el int es igual a int8 del que los valores con signo van de  ( 0 a +128-> -127 a 0, y en unsigned de 0 a 255, si quieres leer 400, pooooos desborda, deberías usar int 16, que es el int normal de otros compiladores 'C' como los de pc . Unsigned=>(0 a 65535) Signed=>(0 a 32768->-32767 a 0).
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado perezriveracarlos

  • PIC10
  • *
  • Mensajes: 15
Re: Memorias 24c512 y pic 18f4550
« Respuesta #4 en: 01 de Diciembre de 2010, 12:26:00 »
Gracias por contestar pero sigue sin funcionar


Hago lo siguiente, la defino como int16 y voy incrementando uno a uno, peor así  no funciona ya que desbordo.

Teneis algun ejemplo de como recorrer toda la memoria externa?? 512K

Como puedo grabar ese int16 en la memoria EEPROM interna para poder recuperarlo despues??

Gracias a todos

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Memorias 24c512 y pic 18f4550
« Respuesta #5 en: 01 de Diciembre de 2010, 13:08:21 »
Hola, para recuperar un int16, tienes que grabar los dos bytes que lo componen, después recuperas cada una de las partes y las unes.

Mira:

int16 addres;

addres=0x00;
// supongamos que el valor almacenado es 12 34 Byte 0 y 1;
addres=READ_EEPROM(0x00);/// addres =>0012
addres=addre<<8;/// addres=1200;
addres=addres+READ_EEPROM(0x01);/// addres=>1234;

ya puedes usar el valor total;

yo leo una eep externa así en una aplicación de un cartel led, es para leerla totalmente en pantalla y ver si grababa lo que recibia por usb.

Citar
      if(c[0]=='R')
      {//si queremos leer la eeprom (entera)

     // init_ext_eeprom();//inicializamos eeprom
      for(dir_eep=0;dir_eep<TOTAL_EEPROM;dir_eep++)// TOTAL_EEPROM, es elmaximo de Bytes, en principio usaba una 1025 ahora una 256 en tu caso=0xffff (0 a 65535)
      {//de lo contrario leemos en la direccion correspondiente.
 

      //printf(usb_cdc_putc,"\r\n Has enviado la direccion %x %x el resultado es %LX",c[1],c[2],dir_eep);///haber si va o no
      disable_interrupts(INT_TIMER0);///paramos el refresco porque ocurre en los mismos pines
      tmp_buf=read_ext_eeprom(dir_eep);
      usb_cdc_putc(tmp_buf);// tu puedes usar putc(tmp_buf);
      //printf(usb_cdc_putc,"%X",tmp_buf);
      enable_interrupts(INT_TIMER0);//volvemos a abilitar el refresco, con suerte no se notara
      }

 Por cierto,tienes una captura de lo que recibes del aparato externo, es que quiero simularlo, para ver cual es el problema, o simplemente le envió repetidamente estoy luego creo un pulso en el pin d0;

'0x0c','0x00','0x00','0x00',0x12','0x00','0x11',"RFID-CARE003";

Por cierto, sie esto "RFID-CARE" siempre es igual, porque no guardas solo los datos y luego lo agregas al visualizar, por ejemplo;

recibes RFID-CARE003,

guardas 003 care[numerocare]=3;

envias prinf("RFID-CARE%03i",care[numerocare]);




Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado perezriveracarlos

  • PIC10
  • *
  • Mensajes: 15
Re: Memorias 24c512 y pic 18f4550
« Respuesta #6 en: 01 de Diciembre de 2010, 13:52:11 »
HOla

Pruebo lo que dices y te comento el resto de tu mensaje, pero RFID-CARE003 es el valor de un TAG, lo que pasa es que lo numero, puede ser cualquiercosa que tenga 12 bytes.

Te lo comento después


Gracias

Desconectado perezriveracarlos

  • PIC10
  • *
  • Mensajes: 15
Re: Memorias 24c512 y pic 18f4550
« Respuesta #7 en: 01 de Diciembre de 2010, 14:39:48 »
Hola

Por fin me funciona  :-/ :-/ :-/

Lo he logrado añadiendo una libreria que se llama: <internal_eeprom.c>

y he usado las funciones: (entendiendo que d=int16)

Tambien se puede usar para 32, es bastante buena, os aconsejo que le pegueis un vistazo.

d=read_int16_eeprom(0x02);
write_int16_eeprom(0x02,d);

Muchas gracias a todos y si teneis cualquier duda me lo comentais y os ayudo en lo que pueda.

MUUUUCHAS GRACIASS!!!!!!




Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Memorias 24c512 y pic 18f4550
« Respuesta #8 en: 01 de Diciembre de 2010, 15:43:39 »
pero esa librería es solo para la eeprom interna, ( luego leeré todo tu código), pero no se para que la gastas, si el problema dices que es al escribir en la externa :shock:
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado perezriveracarlos

  • PIC10
  • *
  • Mensajes: 15
Re: Memorias 24c512 y pic 18f4550
« Respuesta #9 en: 02 de Diciembre de 2010, 05:06:59 »
Uso la memoria intetrna para guardar el indice de la memoria externa, y como es de 512K (16bits la direccion) no podia direccionarla entera.
Ahora uso 2 bytes de la memoria interna para guardar el indice de la memoria externa, así si se queda sin bateria, se apaga o algo así tengo el indice por donde iva.

Saludos