TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: RedPic en 14 de Enero de 2014, 09:47:41

Título: ¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: RedPic en 14 de Enero de 2014, 09:47:41
"Con la iglesia hemos topado, amigo Sancho" Miguel de Cervantes Saavedra en El Quijote.

Os pongo en antecedentes: PIC 24FJ256GA110, Memoria Flash 256K, Memoria EEPROM 0K. Compilando con CCS C v.5.015.

Según reza el adagio castellano "a falta de pan, buenas son tortas", así que al no tener EEPROM decidí usar un trozo de la Flash de Programa a modo de EEPROM y escribir y leer bytes de ella pero o el PIC o el CCS o mi desconocimiento me están amargando la experiencia.  :5]

Si intento hacer simplemente esto:

Código: CSS
  1. char buffer[]="1234567890"
  2.          int32 address=0x0AE0;
  3.  
  4.          write_program_memory(address,buffer,10);
  5.          delay_ms(15);
  6.          fprintf(DEBUG,">WRITE FLASH=[%s]>\r\n",buffer);
  7.          read_program_memory(address,buffer,10);
  8.          fprintf(DEBUG,">READ FLASH=[%s]>\r\n",buffer);

Obtengo  :shock::

Código: CSS
  1. >WRITE FLASH=[1234567890]
  2. >READ FLASH=[]

O sea nada de nada, no escribe ni por vergüenza, y mi gozo en un pozo  :?

He estado buscando y me he encontrado con tamaños de página para erase y para write ... y no se muy bien cómo meterle mano a este tema. Yo lo que necesito es escribir una docena de bytes y leerlos, no más.

¿Tenéis idea de cómo hacerlo o por donde puedo mirar/buscar?  :mrgreen:

Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ???
Publicado por: RedPic en 14 de Enero de 2014, 10:27:18
Lo mas cercano que he encontrado es esto en el foro del CCS, veré si es esta la solución.

http://www.ccsinfo.com/forum/viewtopic.php?t=49089&highlight=writeprogrammemory
Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ???
Publicado por: Picuino en 14 de Enero de 2014, 10:37:25
¿Cual es el tamaño de página para escritura en flash de ese microcontrolador?

En otros micros la escritura se produce en bloques de 32bytes. Prueba con un buffer de 32 o 64 bytes a ver si funciona.

Saludos.
Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ???
Publicado por: MGLSOFT en 14 de Enero de 2014, 11:24:05
Diego, en el ejemplo del foro de CCS, el autor crea un buffer para leer aparte del que luego lee para escribir.
En tu caso solo declaras un buffer, solo para escribir, y luego lees lo escrito sobre el mismo buffer.

Estas seguro que ese buffer no se crea con valores estáticos??

Así encuentra el autor el origen de la memoria flash:

Código: C
  1. #define CK_FLASH_END       (getenv("PROGRAM_MEMORY")-1)      
  2. #define CK_FLASH_PAGE_SIZE (getenv("FLASH_ERASE_SIZE")/2)
  3. #define CK_NUM_PAGES (CK_FLASH_END/CK_FLASH_PAGE_SIZE)
  4.  
  5. #define CK_USER_PAGE (CK_FLASH_PAGE_SIZE*(CK_NUM_PAGES-1))
  6.  
  7. #org CK_USER_PAGE,CK_FLASH_END {}

O sea que efectivamente, como dice Picuino, esta paginada.

Y así resuelve la escritura en el main() , negus el dice le funciona.

Código: C
  1. unsigned int8 read_data[8];
  2. unsigned int8 write_data[] = {12,34,56,0,25,42,1,0};
  3.  
  4. write_program_memory(CK_USER_PAGE,write_data,8);
  5. delay_ms(1);              
  6. read_program_memory(CK_USER_PAGE,read_data,8);
Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ???
Publicado por: RedPic en 14 de Enero de 2014, 15:51:26
Con getenv() veo que el 24FJ256GA110 tiene estos valores:


PROGRAM_MEMORY ................... 0x0002ABF8
FLASH_ERASE_SIZE ................. 0x0800
FLASH_WRITE_SIZE ................. 0x0100


Lo que voy a hacer es montar los 2Kbytes, como dice MGLSOFT, al final de la ROM de Programa, usando el #ORG Start, End {} y con un Buffer de 2Kb sobre RAM haré una pseudo-eeprom

- Leo con read_program_memory() sobre el buffer
- Actualizo el contenido del buffer con unas funciones similares a las de la EEPROM
- Hago el erase_program_memory() que aconseja el Datasheet del micro
- Escribo  el buffer con el write_program_memory()

Ya os pongo los resultados.
Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ???
Publicado por: BrunoF en 14 de Enero de 2014, 18:34:15
Con getenv() veo que el 24FJ256GA110 tiene estos valores:


PROGRAM_MEMORY ................... 0x0002ABF8
FLASH_ERASE_SIZE ................. 0x0800
FLASH_WRITE_SIZE ................. 0x0100


Lo que voy a hacer es montar los 2Kbytes, como dice MGLSOFT, al final de la ROM de Programa, usando el #ORG Start, End {} y con un Buffer de 2Kb sobre RAM haré una pseudo-eeprom

- Leo con read_program_memory() sobre el buffer
- Actualizo el contenido del buffer con unas funciones similares a las de la EEPROM
- Hago el erase_program_memory() que aconseja el Datasheet del micro
- Escribo  el buffer con el write_program_memory()

Ya os pongo los resultados.

Es así como se hace Diego, aunque puedes usar un buffer menor al tamaño de la página de 2kB. Si quieres ver un caso extremo, en una empresa donde trabajé, usaban la FLASH como RAM en un 18F...

 
Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ???
Publicado por: RedPic en 15 de Enero de 2014, 06:24:04
Con getenv() veo que el 24FJ256GA110 tiene estos valores:


PROGRAM_MEMORY ................... 0x0002ABF8
FLASH_ERASE_SIZE ................. 0x0800
FLASH_WRITE_SIZE ................. 0x0100


Lo que voy a hacer es montar los 2Kbytes, como dice MGLSOFT, al final de la ROM de Programa, usando el #ORG Start, End {} y con un Buffer de 2Kb sobre RAM haré una pseudo-eeprom

- Leo con read_program_memory() sobre el buffer
- Actualizo el contenido del buffer con unas funciones similares a las de la EEPROM
- Hago el erase_program_memory() que aconseja el Datasheet del micro
- Escribo  el buffer con el write_program_memory()

Ya os pongo los resultados.

Es así como se hace Diego, aunque puedes usar un buffer menor al tamaño de la página de 2kB. Si quieres ver un caso extremo, en una empresa donde trabajé, usaban la FLASH como RAM en un 18F...
 

Si, Bruno, pero para mantener la integridad de la Flash dicen que es necesario hacer un erase antes de cada write, por ello el área reservada debe ser del tamaño del FLASH_ERASE_SIZE aunque el buffer lo construya con un tamaña que sea múltiplo del FLASH_WRITE_SIZE para optimizar el acceso ¿no?

Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ???
Publicado por: RedPic en 15 de Enero de 2014, 07:33:12
Lo único que no entiendo del ejemplo del tipo este del foro de CCS es:

Código: CSS
  1. #define CK_FLASH_PAGE_SIZE (getenv("FLASH_ERASE_SIZE")/2)

¿Por qué hace su Flash Page Size igual a la mitad del Flash Erase Size?  :shock:
Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ???
Publicado por: MerLiNz en 15 de Enero de 2014, 07:57:13
porque quizas el erase sea en words, osea 16bits.
Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ???
Publicado por: RedPic en 15 de Enero de 2014, 09:03:47
Cierto.

Pero además es un poco mas complejo. Ya casi lo tengo pero ... me escribe 3 de cada 4 bytes del buffer original.

Parece ser que cada dato es de 24 bits (16+8) por lo que un buffer continuo de datos de 8 bits debo escribirlo físicamente separando el 4º byte y desplazándolo todo uno más adelante: 3 bytes de datos, 1 byte de separación, 3 bytes de datos, 1 byte de separación, etc. etc. etc.

Voy a modificar mis funciones de lectura/escritura teniendo esto en cuenta y a ver que pasa.  8)

Título: ¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: RedPic en 15 de Enero de 2014, 10:37:53
¡¡¡Efectivamente!!! Todo solucionado.  :-/

Al final he montado un buffer "lógico" perfectamente contínuo sobre el que leo o escribo como si fuese la EEPROM. Pero cuando accedo a la ROM lo proceso creando un buffer "físico" metiéndole un 0x00 cada 3 bytes que es el que uso para la función write_program_memory(). Por otra parte leo sobre ese buffer "físico" con la función read_program_memory() y lo proceso al revés, comprendiéndolo y eliminando ese byte de 4 para generar el buffer "lógico".

Así tengo dos funciones lógicas de escritura/lectura donde la dirección es relativa a su posición dentro del buffer "lógico" que son las que se usan dentro de mi programa como si fuesen para escribir/leer una EEPROM "normal"

Código: CSS
  1. void pseudo_eeprom_write(int16 offset_Address,int8 *pData, int16 dataLen);
  2. void pseudo_eeprom_read(int16 offset_Address,int8 *pData, int16 dataLen);

Y éstas a su vez llaman a otras dos que o prepara el buffer para escribir en la ROM o lo preparan después de haber leído de ella:

Código: CSS
  1. void pseudo_eeprom_write_physical_buffer(void);
  2. void pseudo_eeprom_read_physical_buffer(void);

Obviamente un buffer de n bytes de tamaño solo puede leerse/escribirse en sus 3/4 partes debido a ese "corrimiento" que se necesita de los bytes "fantasmas", así un buffer de 512 bytes solo contendrá 384 bytes reales.  :mrgreen:




Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ???
Publicado por: RICHI777 en 15 de Enero de 2014, 13:47:59
Con getenv() veo que el 24FJ256GA110 tiene estos valores:


PROGRAM_MEMORY ................... 0x0002ABF8
FLASH_ERASE_SIZE ................. 0x0800
FLASH_WRITE_SIZE ................. 0x0100


Lo que voy a hacer es montar los 2Kbytes, como dice MGLSOFT, al final de la ROM de Programa, usando el #ORG Start, End {} y con un Buffer de 2Kb sobre RAM haré una pseudo-eeprom

- Leo con read_program_memory() sobre el buffer
- Actualizo el contenido del buffer con unas funciones similares a las de la EEPROM
- Hago el erase_program_memory() que aconseja el Datasheet del micro
- Escribo  el buffer con el write_program_memory()

Ya os pongo los resultados.

Es así como se hace Diego, aunque puedes usar un buffer menor al tamaño de la página de 2kB. Si quieres ver un caso extremo, en una empresa donde trabajé, usaban la FLASH como RAM en un 18F...

 

 :shock:  :shock:  :shock: Pero la flash tiene un tiempo de vida limitado ...
Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ???
Publicado por: RedPic en 15 de Enero de 2014, 15:11:49

 :shock:  :shock:  :shock: Pero la flash tiene un tiempo de vida limitado ...


Si, unas 10 veces menos que la EEPROM. Pero yo solo la quiero para unos datos muy estables y con muy pocos cambios en función del tiempo, como el ID del micro (o número de serie) por ejemplo, que esta familia de los 24FJ256GA110 no lo tiene implementado.
Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: RICHI777 en 15 de Enero de 2014, 15:38:50
Si Diego se entiende tu concepto, yo me refería al comentario que hizo Bruno acerca de la empresa donde trabajo ...
Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: BrunoF en 15 de Enero de 2014, 16:54:12
Si Diego se entiende tu concepto, yo me refería al comentario que hizo Bruno acerca de la empresa donde trabajo ...


Si. Era para una fábrica de autos de Argentina. El tiempo estimado de vida era entre 9 y 12 meses, debido al uso de la FLASH como RAM...

Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: RICHI777 en 15 de Enero de 2014, 17:14:08
Si Diego se entiende tu concepto, yo me refería al comentario que hizo Bruno acerca de la empresa donde trabajo ...


Si. Era para una fábrica de autos de Argentina. El tiempo estimado de vida era entre 9 y 12 meses, debido al uso de la FLASH como RAM...



 :shock:  :shock:  :shock: Después de eso tenías que cambiar el coche ??? :D  :D  :D

Quien fue el craneo que se le ocurrio esa idea ?  :2]


Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: MerLiNz en 15 de Enero de 2014, 20:08:14
flash como ram?? Eso no me cuadra, la flash es bastante mas lenta para utilizarla como ram que cualquier otra opcion, incluso una flash externa
Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: BrunoF en 15 de Enero de 2014, 23:09:56
Si Diego se entiende tu concepto, yo me refería al comentario que hizo Bruno acerca de la empresa donde trabajo ...


Si. Era para una fábrica de autos de Argentina. El tiempo estimado de vida era entre 9 y 12 meses, debido al uso de la FLASH como RAM...



 :shock:  :shock:  :shock: Después de eso tenías que cambiar el coche ??? :D  :D  :D

Quien fue el craneo que se le ocurrio esa idea ?  :2]

flash como ram?? Eso no me cuadra, la flash es bastante mas lenta para utilizarla como ram que cualquier otra opcion, incluso una flash externa

No era para el auto en sí. Era para unos tableros que usaban los operarios en la fábrica... Sí, claro que era más lenta, pero los valores se grababan sólo un par de veces al día a lo sumo. No recuerdo los detalles exáctos pero sí sé que paginaban la RAM en ROM porque sino no alcanzaba la RAM del uC.

Saludos!!
Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: MerLiNz en 16 de Enero de 2014, 08:18:50
Y no hubiese sido mas sencillo buscarse una MCU con mas RAM  :D :D
Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: BrunoF en 17 de Enero de 2014, 13:24:34
Y no hubiese sido mas sencillo buscarse una MCU con mas RAM  :D :D

Pues cuando ingresé a la empresa ya había 300 tableros funcionando en fábrica y además mis ordenes eran desarrollar con lo que ya había.
Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: MGLSOFT en 17 de Enero de 2014, 14:10:04
Podes comentar mas sobre que hacen esos tableros?? :shock: :shock:
Título: Re: ¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: BrunoF en 21 de Enero de 2014, 12:17:52
Algunos eran tableros por RF que manejaban en cadena de producción los operarios para control de stock y pedido de repuestos. Otros eran estilo beepers RF para los encargados de depósito y repartidores de repuestos, etc. Había de todo un poco.

Título: Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: micronet3 en 05 de Enero de 2017, 14:26:51
hola, una consulta, ya he podido guardar datos en la memoria de programa del pic 18f452, pero al momento de reescribirlo con otros datos o mejor dicho hacer una actualizacion de datos, no se guardan bien!

a que se debera esto?

saludos
Título: Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: KILLERJC en 05 de Enero de 2017, 17:53:03
hola, una consulta, ya he podido guardar datos en la memoria de programa del pic 18f452, pero al momento de reescribirlo con otros datos o mejor dicho hacer una actualizacion de datos, no se guardan bien!

a que se debera esto?

saludos

¿Algun codigo simple estas probando?
Te pido algo simple que probaste para saber si no es algun problema de programacion, cuando me refiero a simple, es solo probar que se grabo correctamente el dato y listo. Y por otro lado, estamos hablando de en fisico o en una simulacion?
Título: Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: micronet3 en 05 de Enero de 2017, 18:28:05
si aqui esta:
#include <18f452.h>

#fuses hs,nowdt,noprotect,nowrt,nocpb,nowrtb,nocpd,noebtr,noebtrb
#use delay(clock=20M)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)

#define CK_FLASH_END       (getenv("PROGRAM_MEMORY")-1)     
#define CK_FLASH_PAGE_SIZE (getenv("FLASH_ERASE_SIZE")/2)
#define CK_NUM_PAGES (CK_FLASH_END/CK_FLASH_PAGE_SIZE)
 
#define CK_USER_PAGE (CK_FLASH_PAGE_SIZE*(CK_NUM_PAGES-1))
 
#org 28680,CK_FLASH_END {}


void main(){
   int16 i;
   int16 j;
   unsigned int8 read_data[56];
   unsigned int8 read_data2[56];
   
   for(i=0;i<56;i++){
      read_data =i;
      read_Data2 =i+1;
   }



   //aqui grabo los datos
   write_program_memory(28680,read_data,56);
   read_program_memory(28680,read_data,56);
   
   //aqui borro los datos y grabo otra vez los datos
   erase_program_eeprom(28680);
   write_program_memory(28680,read_data2,56);
   read_program_memory(28680,read_data2,56);
   
   delay_ms(10);
   
   for(i=0;i<56;i++)
      printf("%u\r\n",read_data2);
}


pasa lo siguiente, guardo los datos en una posicion y graba correctamente.
el problema viene cuando quiero guardar otros datos en la misma posicion, lo borro con la funcion erase_program_eeprom(), y lo vuelvo a grabar , pero ocurre que ya no graba sino que todo el bloque de memoria reservado se pone a 255.
es en simulacion, en proteus, ahi pude observar el estado de la memoria de programa


Título: Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: KILLERJC en 05 de Enero de 2017, 18:40:34
Si hiciste todo el calculo anterior (Para usar la ultima pagina de la FLASH)... es decir todo esto:

Código: C
  1. #define CK_FLASH_END       (getenv("PROGRAM_MEMORY")-1)      
  2. #define CK_FLASH_PAGE_SIZE (getenv("FLASH_ERASE_SIZE")/2)
  3. #define CK_NUM_PAGES (CK_FLASH_END/CK_FLASH_PAGE_SIZE)
  4.  
  5. #define CK_USER_PAGE (CK_FLASH_PAGE_SIZE*(CK_NUM_PAGES-1))

Para encontrar que direccion de memoria seria donde deberias guardar. Por que luego haces esto:

Código: C
  1. #org 28680,CK_FLASH_END {}

Es decir, por que pondrias un valor fijo... Probaste usando :

Código: C
  1. #org CK_USER_PAGE,CK_FLASH_END {}

Y luego en los write y read

Código: C
  1. xxxxx_program_memory(CK_USER_PAGE,read_data,56);

De todas formas pienso que deberia funcionar.. O tal ves la direccion que le estas dando, al grabar supera la pagina, y como no fue borrado anteriormente te trae problemas.
Título: Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: micronet3 en 05 de Enero de 2017, 19:58:18
En dos horas regreso a mi búnker y pruebo lo que me sugieres
Gracias!
Título: Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: micronet3 en 05 de Enero de 2017, 23:51:05
Saludos KILLER, mira hice lo que me sugeristes y asi no graba nada, al momento de la lectura muestra 255, mmm parece que por ahi viene el problema!
Título: Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: KILLERJC en 07 de Enero de 2017, 07:44:03
Bueno, lo unico que veo es que no se esta borrando antes de escribir la primera vez


   //aqui grabo los datos
   write_program_memory(28680,read_data,56);
   read_program_memory(28680,read_data,56);
   

El cual funcionaria luego de grabarse, pero no luego del primer run del programa.
La verdad no se por que no funciona, no se si lo estas probando en fisico o en simulacion.
Tampoco veo un loop infinito, asi que se puede haber ejecutado muchas veces y qquemado la Flash.
La unica que me queda es que me pases el .hex, asi la paso a ASM y ahi reviso que esta haciendo.
Título: Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: micronet3 en 09 de Enero de 2017, 19:20:21
nome funciona todavia killeric, este proyecto lo estoy dejando por ahora porque se mepresento una urgencia en el trabajo, pero lovoy a retomar y les comentare
Título: Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: micronet3 en 18 de Enero de 2017, 09:33:41
bueno retomando esto, ya que las funciones de ccs no me han funcionado, me fui al datasheet y ahi tiene unas rutinas en assembler para la lectura y escritura

char leyendo_memoria(int addr_upper,int addr_high,int addr_low){
   char m,n;
   TBLPTRU=ADDR_UPPER;
   TBLPTRH=ADDR_HIGH;
   TBLPTRL=ADDR_LOW;
   #asm
   TBLRD*+ //LEYEDO E INCREMENTANDO
   movf TABLAT,W
   movwf m
   TBLRD*+
   movf TABLAT,W
   movwf n
   #endasm
   return(m);
}

al parecer si me esta leyendo correctamente, falta todavia las funciones de borrar y escribir
Título: Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: micronet3 en 18 de Enero de 2017, 14:45:22
saludos
ya tengo las funciones para leer y borrar datos guardados en la memoria de programa, solo me queda la funcion para guardar los datos, esto se me ha complicado un poco y no logro entender correctamente el codigo en assembler que esta en el datasheet del 18f452 y sirve para escribir datos

que es NEW DATA LOW Y NEW DATA HIGH?

es la parte que esta seleccionado a ver si me pueden ayudar



Título: Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: micronet3 en 18 de Enero de 2017, 15:33:47
aqui adjunto la funcion para poder escribir datos en la memoria de programa del pic 18f452, hasta ahora no graba nada, a ver si alguien encuentra el porque


void escribiendo_memoria(char *ptra,int addr_upper,int addr_high,int addr_low){
  char COUNTER;
  char buffer[64];
  char *pt;
  int i,j,dir;
 
  char new_data_low;
  char new_data_high;
  char counter_high;
  pt=&buffer[0];
   TBLPTRU=ADDR_UPPER;
   TBLPTRH=ADDR_HIGH;
   TBLPTRL=ADDR_LOW;
   FSR0H=0;
   FSR0L=pt;
   #asm
   movlw 0x40
   movwf COUNTER
   //LEYENDO EL BOQUE DE 64 BYTE
READ_BLOCK:
   TBLRD*+
   MOVF TABLAT,W
   MOVWF POSTINC0
   DECFSZ COUNTER
   BRA READ_BLOCK
//actualizando buffer
   movlw 0
   movwf FSR0H
   movf  PT,W
   MOVWF FSR0L
   Movlw 0
   movwf POSTINC0
   Movf  PTRA,W
   movwf INDF0
   
ERASE_BLOCK:
   MOVF ADDR_UPPER,W
   MOVWF TBLPTRU
   MOVF  ADDR_HIGH,W
   MOVWF TBLPTRH
   MOVF  ADDR_LOW,W
   MOVWF TBLPTRL
   bsf EECON1,7 //eepgd
   bcf EECON1,6 //cfgs
   bsf EECON1,2 //wren
   bsf EECON1,4 //FREE
   bcf INTCON,7 //GIE
   movlw 0X55
   movwf EECON2
   movlw 0XAA
   movwf EECON2
   bsf EECON1,1
   bsf INTCON,7
   TBLRD*-
   
   //ESCRIBIENDO
WRITE_BUFFER_BACK:
   MOVLW 8
   MOVWF COUNTER_HIGH
   MOVLW 0
   MOVWF FSR0H
   MOVF  PTRA,W
   MOVWF FSR0L
PROGRAM_LOOP:
   MOVLW 8
   MOVWF COUNTER
WRITE_WORD_HREGS:
   MOVF  POSTINC0,W
   MOVWF TABLAT
   TBLWT+*
   DECFSZ COUNTER
   BRA  WRITE_WORD_HREGS
PROGRAM_MEMORY:
   BSF   EECON1,7
   BCF   EECON1,6
   bsf EECON1,2 //WREN
   bcf INTCON,7 //GIE
   
   MOVLW 0X55
   MOVWF EECON2
   MOVLW 0XAA
   MOVWF EECON2
   BSF   EECON1,1
   BSF   INTCON,7
   DECFSZ   COUNTER_HIGH
   BRA   PROGRAM_LOOP
   BCF   EECON1,2
  #endasm

}
Título: Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: KILLERJC en 18 de Enero de 2017, 20:02:14
Mmmm... no se que decirte, tocar los accesos indirectos sin generar un backup primero podria causar problemas. Por que el compilador no espera que alguien lo cambie.
Por eso mismo deberias primero tener variables que creen un backup de esos registros ( FSR0x )

El otro tema es que un puntero tiene un tamaño dependiente del hardware, en ese PIC la memoria tiene 12 bits, por lo cual asumo que el puntero debe ser de 16 bits. Como pensas meter 16 bits en 8?

Código: C
  1. FSR0H=0;
  2.    FSR0L=pt;

Deberia ser algo asi:

Código: C
  1. FSR0L = pt & 0xFF;
  2.    FSR0H = (pt>>8) & 0xFF;

Asi que el resto del codigo no seria 0 el valor de FSRH0
Título: Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: micronet3 en 18 de Enero de 2017, 20:59:35
Gracias killeric por tu respuesta, pues si, el puntero lo habia declarado de 8 bits  :?
y el codigo me funciona perfectamente hasta la lectura. si lee y muestra los valores que grabe con la directiva #rom
el problema viene desde que se actualiza el buffer

voy a cambiar el puntero a 16 bits
seria: INT16 *PTR;

Título: Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: micronet3 en 18 de Enero de 2017, 21:03:43
estoy siguiendo esta secuencia que esta en el datasheet del pic 18f452
y el codigo en assembler que hay ahi

me has dado una idea killeric, entonces puedo definir mi funcion para para escribir de la siguiente manera?

void escribiendo_memoria(int16 *pt,int32 addr){
   FSR0L = pt & 0xFF;
   FSR0H = (pt>>8 ) & 0xFF;
   
   TBLPTRU=ADDR &0XFF;
   TBLPTRH=(ADDR>>8 ) & 0XFF;
   TBLPTRU=(ADDR>>8 ) & 0XFF;
 
Título: Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: micronet3 en 19 de Enero de 2017, 07:02:44
por fin lo logre y ya puedo cantar victoria  :-/ :-/ :-/
gracias
Título: Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: micronet3 en 19 de Enero de 2017, 07:56:19
por fin lo logre y ya puedo cantar victoria  :-/ :-/ :-/
gracias
pucha nada, falsa alarma, la rutina de grabar datos en la memoria no graba nada, parece como que la memoria se bloqueara

Título: Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
Publicado por: micronet3 en 19 de Enero de 2017, 15:12:43
 :-/ :-/
ahora si lo consegui.
ya puedo guardar datos en la memoria de programa de manera ordenada y puedo volver a guardar en la misma direccion

saludos