Autor Tema: Usar memoria de programa para datos 18f4550  (Leído 5962 veces)

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

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Usar memoria de programa para datos 18f4550
« en: 08 de Agosto de 2008, 17:41:04 »
Saludos compañeros desde ya hace mucho tiempo he intentado utilizar la flash para tabla de datos, tabla de datos variable, me refiero a que estará sujeta a cambios externos casi todo el tiempo, asi que si bien empezará con unos datos prefijados por un #rom.... se cambiará seguramente algunos o todos los datos cuando esté en funcionamiento.

para ello he visto las funciones de CCS la write_program_memory() y write_program_eeprom() y al final no he entendido como estan funcionando, y decidi utilizar la hoja de datos y por tanto ensamblador, lei y releí lo que ahí dice y logre entender buena parte, pero me quedaron unas dudas y conclusiones.

dudas:
1. la hoja de datos dice que la escritura en la flash puede ser de 16word o 32byte como minimo, y que para ello quiza haya que manejar los 5 bits menos significativos del registro TBLPTRL, pero lo he tratado de manipular eso y siempre me escribe 64bytes.
2. para escribir en cualesquiera posiciones, o mejor dicho en un bloque de 32/64bytes primeramente hay que borrar esas posiciones??
3. como verán mi ensamblador no es nada bueno, asi que tengo la duda para direccionar bien la ram, ya que ese numero que verán en escritura_flash(0,5,0,0x60,0); lo saque de la simulacion de proteus, tendría que utilizar un puntero, pero como lo llevo a 2 bytes (separados) que necesita el lenguaje ensamblador, de un puntero *ptr?

conclusiones:
0. la funcion read del ccs esta bien, por tanto...
1. al parecer las funciones del ccs para manipular la flash, en escritura hacen primeramente un erase (osea borrar :D) y despues recien escriben, tal como recomienda la hoja de datos, y yo practicando esas mismas funciones de la hoja pasadas al ccs usando #asm #endasm hice lo mismo y se ve que se puede escribir solamente una vez, o mejor dicho que cuando se hace el 'erase' la flash queda como congelada y no acepta ninguna escritura más.
2. las funciones de ccs funcionan bien, lo que parece que esta mal es el simulador proteus, pues hasta ahora todo del manejo memoflash lo hice en torno simulación.
3. proteus casi siempre no ayuda, y mejor será siempre probar en real, asi que inmediatamente a ese código le meteré una lcd para ver variaciones o no en flash

bueno ahora les muestro las funciones extraidas de la hoja de datos y manipuladas para que hagan lo que necesitaba solamente.

Código: C
  1. #include <18f4550.h>
  2. #fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN,USBDIV,PLL5,CPUDIV1
  3. #use delay(clock=48000000)
  4. #byte EECON1=0xfa6
  5. #define RD 0
  6. #define WR 1
  7. #define WREN 2
  8. #define WRERR 3
  9. #define FREE 4
  10. #define CFGS 6
  11. #define EEPGD 7
  12. #byte EECON2=0xfa7
  13. #byte FSR0L=0xfe9
  14. #byte FSR0H=0xfea
  15. #byte POSTINC0=0xfee
  16. #byte INDF0=0xfef
  17. #byte INTCON=0xff2
  18. #define GIE 7
  19. #byte TABLAT=0xff5
  20. #byte TBLPTRL=0xff6
  21. #byte TBLPTRH=0xff7
  22. #byte TBLPTRU=0xff8
  23. #define W 0
  24. #org  0x100,0x04FF {} //reservando 1024bytes o 512word
  25.  
  26. int data[32]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32};
  27. int h,l,count;
  28.  
  29. void lectura_flash(int dir_u,int dir_h,int dir_l){
  30.    TBLPTRU=dir_u;
  31.    TBLPTRH=dir_h;
  32.    TBLPTRL=dir_l;
  33.    #ASM
  34.          TBLRD*+             //read into TABLAT and increment
  35.          MOVF TABLAT,W       //get data
  36.          MOVWF l
  37.          TBLRD*+             //read into TABLAT and increment
  38.          MOVF TABLAT,W       //get data
  39.          MOVWF h
  40.    #ENDASM
  41. }
  42.  
  43. void borrar(int dir_u,int dir_h,int dir_l){
  44.    TBLPTRU=dir_u; //point to flash
  45.    TBLPTRH=dir_h;
  46.    TBLPTRL=dir_l;
  47.    #ASM
  48.       BSF EECON1,EEPGD          //point to Flash program memory
  49.       BCF EECON1,CFGS           //access Flash program memory
  50.       BSF EECON1,WREN           //enable write to memory
  51.       BSF EECON1,FREE           //enable Row Erase operation
  52.       BCF INTCON,GIE            //disable interrupts
  53.       MOVLW 0x55
  54.       MOVWF EECON2               //write 55h
  55.       MOVLW 0xAA
  56.       MOVWF EECON2               //write 0AAh
  57.       BSF EECON1,WR             //start erase (CPU stall)
  58.       BSF INTCON,GIE            //re-enable interrupts
  59.       TBLRD*-
  60.   #ENDASM
  61. }
  62.  
  63. void escritura_flash(int dird_h,int dird_l,int dir_u,int dir_h,int dir_l){
  64.    count=32;
  65.    FSR0H=dird_h;  //point to buffer ram
  66.    FSR0L=dird_l;
  67.    TBLPTRU=dir_u; //point to flash
  68.    TBLPTRH=dir_h;
  69.    TBLPTRL=dir_l;
  70.    #ASM
  71.    WRITE_BYTE_TO_HREGS:
  72.       MOVF POSTINC0,W           //get low byte of buffer data
  73.       MOVWF TABLAT               //present data to table latch
  74.       TBLWT+*                    //write data, perform a short write
  75.                                  //to internal TBLWT holding register.
  76.       DECFSZ count             //loop until buffers are full
  77.       BRA WRITE_BYTE_TO_HREGS
  78.    PROGRAM_MEMORY:
  79.       BSF EECON1,EEPGD           //point to Flash program memory
  80.       BCF EECON1,CFGS            //access Flash program memory
  81.       BSF EECON1,WREN            //enable write to memory
  82.       BCF INTCON,GIE             //disable interrupts
  83.       MOVLW 0x55
  84.       MOVWF EECON2               //write 55h
  85.       MOVLW 0xAA
  86.       MOVWF EECON2               //write 0AAh
  87.       BSF EECON1,WR              //start program (CPU stall)
  88.       BSF INTCON,GIE             //re-enable interrupts
  89.       BCF EECON1,WREN            //disable write to memory
  90.    #ENDASM
  91. }
  92.  
  93. void main(){
  94.    SETUP_ADC(adc_off);
  95.    SETUP_ADC_PORTS(no_analogs);
  96.    set_tris_b(0);
  97.    set_tris_a(255);
  98.    output_b(0);
  99.    while(true){
  100.       if(input(PIN_A0)){
  101.          do{
  102.             delay_ms(20);
  103.          }while(input(PIN_A0));
  104.          lectura_flash(0,5,0);
  105.          escritura_flash(0,5,0,0x60,0);
  106.       }
  107.       if(input(PIN_A1)){
  108.          do{
  109.             delay_ms(20);
  110.          }while(input(PIN_A1));
  111.          borrar(0,0x60,0);
  112.       }
  113.    }
  114. }

les dejo adjunto el codigo compilado y el archivo para proteus, en la simulación el boton a RA0 escribe en la flash y el boton a RA1 borra, todo sobe una misma direccion de flash y ram, solo tomado como ejemplificacion.

nose si me he dejado entender, ojala que si, y disculpen el desorden.
« Última modificación: 08 de Agosto de 2008, 20:08:18 por un Moderador »
.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Usar memoria de programa para datos 18f4550
« Respuesta #1 en: 08 de Agosto de 2008, 20:09:31 »
Cryn, he editado el título de tu post para cambiar "memorira" por "memoria". Por aquello del buscador, ya sabes.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Usar memoria de programa para datos 18f4550
« Respuesta #2 en: 11 de Agosto de 2008, 17:31:00 »
saludos a todos, desde el otro día que quería decirles mis resultados

desafortunadamente, las pruebas han fracasado, y no funciona como en la simulación, la lectura y el borrado creo que si estan muy bien, pero la escritura nose, pasa como si se bloquera la memo y ya no permita más escrituras

y lo lamentable es que nisiquiera ha escrito :(

pongo a escribir la posición 0 de la ram y supuestamente escribe ff, y deberia ser cualquier otro dato, nose, quizá el problema sea el direccionamiento de la ram, nose seguiré intentado, pero que sugieren ustedes??
.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Usar memoria de programa para datos 18f4550
« Respuesta #3 en: 12 de Agosto de 2008, 11:41:11 »
Hola

También se me ha cruzado esa idea alguna vez, pero no se puede, en la datasheet mencionan algo así:  cuando se hace una operación de escritura, no se puede hacer mas nada.




La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Usar memoria de programa para datos 18f4550
« Respuesta #4 en: 12 de Agosto de 2008, 12:53:15 »
 :shock: :shock: :shock: que? y donde dice eso?

eso ya no sería memo flash, creo. Pues si escribimos nosotros en un sector ese sector quedará para siempre bloqueado? y cuando lo programemos con el gtp ya ese sector será omitido? a menos que simplemente en el programa se bloquee, y se desbloquee al borrar todo el programa (lo que hace el gtp) umm nose, suena un poco raro y lamentable si fuera así. Además un bootloader solo actualizaría una sola vez el código? Nose ya me enrede :(

yo sigo pensando que he tenido un error de código, y necesitaría que ustedes me ayuden para ello
.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Usar memoria de programa para datos 18f4550
« Respuesta #5 en: 14 de Agosto de 2008, 12:37:46 »
FLASH PROGRAM MEMORY chapter 6.0 página 81 de 39632D.pdf

Writing or erasing program memory will cease
instruction fetches until the operation is complete. The
program memory cannot be accessed during the write
or erase, therefore, code cannot execute. An internal
programming timer terminates program memory writes
and erases.




La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Usar memoria de programa para datos 18f4550
« Respuesta #6 en: 14 de Agosto de 2008, 14:00:34 »
Creo según interpreto el inglés bastante malo que tengo, que mientras dure la escritura no se puede executar el programa, que hay un timer que controla el tiempo de escritura.

El otro tema amigo Cryn es que la memoria de programa al ser flash puede ser sobreescrita una cierta cantidad de veces, 100.000 veces en el 18f4550, por lo que creo no te servirá de ram, ojo con esto ya que en un segundo te lo puedes cargar.

En la segunda página del DS sale esto:
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Usar memoria de programa para datos 18f4550
« Respuesta #7 en: 14 de Agosto de 2008, 15:56:59 »
gracias por sus respuestas, me hacian falta :mrgreen:

Pali, yo interpreto lo mismo que flaco

Flaco, lo que pretendía no es tan así como tenerlo de RAM, creo que exagere si dije algo así, disculpa por la exageración, jeje, lo que en realidad quisiera es utilizar la FLASH para almacenar una tabla de datos, una tabla algo grande, cerca a 1KB y por ende no puedo utilizar la eeprom, y tampoco al RAM pues esta tabla es muy importante y debe mantenerse a salvo de cortes de energía, por tanto debe guardarse en la FLASH

Esta tabla no será modificable así por así, será accedida a través de un menú y se la actualizará de una manera ordenada, por bloques de 64 o 32 bytes (espero poder manejar solo 32bytes) y el programa principal accederá a todos los datos de esta tabla en momentos oportunos
.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Usar memoria de programa para datos 18f4550
« Respuesta #8 en: 14 de Agosto de 2008, 18:59:46 »
hola que hubo? :D

tengo tristes y buenas noticias, y además extrañas :z)

las tristes
1. proteus casi siempre te sacará una cana :x
2. todavía nose como escribir solamente 32 bytes, sin que se meta a usar los 64 de un bloque, porque el erase lo hace de 64 bytes, o nose, ya me hice bolas :z)

las buenas
1. que ya he logrado probar la flash con código de ccs y esta funcionando bien, no he verificado todos los datos, pero he verificado 2 bytes, parece que va bien
2. que la flash del 4550 no se bloquea :-/, el que estaba bloqueado era yo :D

las extrañas
1. el código que dejó Microchip en la hoja de datos en cuanto a escritura parece que tiene algun error, pues no funciona en circuito real, pero si en proteus,
y las instrucciones de ccs (write_program_memory, que es la q más me interesaba) funcionan muy bien en circuito pero no en proteus (todo en cuanto a escritura)
2. ccs habla de dos instrucciones write_program_eeprom y write_program_memory, ambas funcionan bien, pero seguramente dependerá del tipo de pic, para usar w_p_eeprom, pues supongo que algunos pics si permiten la programación de la flash byte por byte
3. en proteus va bien w_p_eeprom, peo w_p_memoy no funciona :(

quizá se me olvide alguna noticia, pero editaré en ese caso

un saludo, espero sirva a alguien mis experiencias, que todavía no acaban, seguiré metiendole mano a la flash :D :D
.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Usar memoria de programa para datos 18f4550
« Respuesta #9 en: 19 de Agosto de 2008, 12:58:08 »
saludos para todos, les tengo algunas noticias, a los que han seguido el hilo y a los que no tb :D

ahora he probado de una mejor manera viendo tb en la pc los resultados leidos, y pues, talvez he manejado mal la funcion write_program_memory pues no logre ver lo que escribio, al parecer se colgo, nose, si me da teimpo lo probaré despues, pero he probado la función write_program_eeprom y esta funciona muy bien, no es como en el proteus, solo escribe en una word una variable de 16bits que se le envie desde la ram del micro, y no se coloca ceros por otras posiciones como se podría ver en simulación, ahora veré cuantas word me borra la instruccion erase, si 16 o 32 y les digo

bueno, otra vez la conclusión de no confiar siempre en proteus.
.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Usar memoria de programa para datos 18f4550
« Respuesta #10 en: 20 de Agosto de 2008, 17:09:54 »
listo ya he probado las funciones del ccs, y todas van bien, el que estaba mal era yo, porque estaba colocando mal los parametros en la funcion que seguramente hacia que borre mi programa, jaja

el erase borra 64 bytes de plano, intentare hacer solo 32

un saludo, despues les muestro lo que hice y vi con el hiperterminal.
.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Usar memoria de programa para datos 18f4550
« Respuesta #11 en: 30 de Agosto de 2008, 15:58:00 »
Q bueno que le tes metiendo mano a estas funciones Cryn, una ves lo intente pero no entendia algunos parametros y lo deje... Pero hace poco le eche mas ojo y ccs hacen uso de estas funciones en la libreria loader.c que es usada en el ejemplo EX_LOAD.c que sirve para hacer un bootloader... Espero te sirva.


Suerte.
Salu2.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Usar memoria de programa para datos 18f4550
« Respuesta #12 en: 01 de Septiembre de 2008, 15:30:59 »
no sabía sobre ese ejemplo, le daré una mirada, si encuentro algo relevante les comento.

acá lo que saque en el hiperterminal, tengo una instrucción lectura que lee desde la posición 0xf2e0 hasta 0x309f siempre que la ejecuto, e instrucciones de escritura que las colocaré seguida de lo que resulto su lectura, ademas de unos cuantos datos en RAM:
int data1[32]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
int data2[32]={32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63};
y en FLASH:
int16 const dato1=0xaabb,dato2=0xccdd,dato3=0xeeff,dato4=0x0011;

Código: [Seleccionar]
Prueba Lectura Memoria Flash

Lectura Direcciones 0x2FE0 - 0x309F             (primera lectura con datos preprogramados)
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
0020 0021 0022 0023 0024 0025 0026 0027
0028 0029 002A 002B 002C 002D 002E 002F
0030 0031 0032 0033 0034 0035 0036 0037
0038 0039 003A 003B 003C 003D 003E 003F
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF

Lectura Direcciones 0x2FE0 - 0x309F             (write_program_memory(0x3000,data1,32);)
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
0100 0302 0504 0706 0908 0B0A 0D0C 0F0E
1110 1312 1514 1716 1918 1B1A 1D1C 1F1E
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
0020 0021 0022 0023 0024 0025 0026 0027
0028 0029 002A 002B 002C 002D 002E 002F
0030 0031 0032 0033 0034 0035 0036 0037
0038 0039 003A 003B 003C 003D 003E 003F
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF

Lectura Direcciones 0x2FE0 - 0x309F             (write_program_memory(0x3020,data2,32);)
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
0100 0302 0504 0706 0908 0B0A 0D0C 0F0E
1110 1312 1514 1716 1918 1B1A 1D1C 1F1E
2120 2322 2524 2726 2928 2B2A 2D2C 2F2E
3130 3332 3534 3736 3938 3B3A 3D3C 3F3E
0020 0021 0022 0023 0024 0025 0026 0027
0028 0029 002A 002B 002C 002D 002E 002F
0030 0031 0032 0033 0034 0035 0036 0037
0038 0039 003A 003B 003C 003D 003E 003F
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF

Lectura Direcciones 0x2FE0 - 0x309F             (erase_program_eeprom(0x3000);)
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
0020 0021 0022 0023 0024 0025 0026 0027
0028 0029 002A 002B 002C 002D 002E 002F
0030 0031 0032 0033 0034 0035 0036 0037
0038 0039 003A 003B 003C 003D 003E 003F
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF

Lectura Direcciones 0x2FE0 - 0x309F             (write_program_memory(0x3000,data1,64);)
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
0100 0302 0504 0706 0908 0B0A 0D0C 0F0E
1110 1312 1514 1716 1918 1B1A 1D1C 1F1E
2120 2322 2524 2726 2928 2B2A 2D2C 2F2E
3130 3332 3534 3736 3938 3B3A 3D3C 3F3E
0020 0021 0022 0023 0024 0025 0026 0027
0028 0029 002A 002B 002C 002D 002E 002F
0030 0031 0032 0033 0034 0035 0036 0037
0038 0039 003A 003B 003C 003D 003E 003F
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF

Lectura Direcciones 0x2FE0 - 0x309F             (erase_program_eeprom(0x3000);)
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
0020 0021 0022 0023 0024 0025 0026 0027
0028 0029 002A 002B 002C 002D 002E 002F
0030 0031 0032 0033 0034 0035 0036 0037
0038 0039 003A 003B 003C 003D 003E 003F
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF                                       

Lectura Direcciones 0x2FE0 - 0x309F             (erase_program_eeprom(0x3040);)
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF

Lectura Direcciones 0x2FE0 - 0x309F             (write_program_memory(0x3040,data1,64);)
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
0100 0302 0504 0706 0908 0B0A 0D0C 0F0E
1110 1312 1514 1716 1918 1B1A 1D1C 1F1E
2120 2322 2524 2726 2928 2B2A 2D2C 2F2E
3130 3332 3534 3736 3938 3B3A 3D3C 3F3E
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF

Lectura Direcciones 0x2FE0 - 0x309F             (write_program_eeprom(0x3000,dato1);
                                                                write_program_eeprom(0x3002,dato2);
                                                                write_program_eeprom(0x3004,dato3);
                                                                write_program_eeprom(0x3006,dato4);)
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
AABB CCDD EEFF 0011 FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
0100 0302 0504 0706 0908 0B0A 0D0C 0F0E
1110 1312 1514 1716 1918 1B1A 1D1C 1F1E
2120 2322 2524 2726 2928 2B2A 2D2C 2F2E
3130 3332 3534 3736 3938 3B3A 3D3C 3F3E
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF

.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Usar memoria de programa para datos 18f4550
« Respuesta #13 en: 06 de Agosto de 2010, 01:45:13 »
Hola Cryn.

Pese a que el hilo es viejo, mi problema es nuevo. Me desayuné con el mísmo problema que vos. Dos años después, el Proteus en su versión actual sigue haciendo exáctamente lo mísmo que comentaste. Se lo  adjudiqué enseguida al Proteus porque se comportó diferente entre simulaciones inclusive...

Ahora, lo del erase_program_eeprom supongo que es necesario si o si antes de escribir. Por lo poco que deduzco, podrá ser que el circuito interno del PIC que escribe la FLASH tenga sólo la capacidad de poner bits a 0 pero no a 1? Si es así, por eso exigen que antes se borre el bloque, ya que este sería el único circuito capaz de setear bits de la FLASH. Es una teoría, seguramente el datasheet esconda la verdad.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Usar memoria de programa para datos 18f4550
« Respuesta #14 en: 06 de Agosto de 2010, 10:44:24 »
Esa es una de las razones por las cuales dejé de confiar en proteus hace mucho tiempo, porque en este caso me dejó varias horas e incluso días tratando de buscar una respuesta que con el proteus nunca la iba a conseguir. Como ya alguna vez dije, proteus es una buena herramienta, pero presenta algunos errores y al descubrir alguno puedes desperdiciar mucho tiempo, pero bueno ese no es el tema.

El erase si es necesario, y al menos en micros de la familia 18 siempre es por bloques de bytes

Imagino lo mismo que tu, que el hardware del micro está hecho solo para poner a 0 los bits de su memoria flash y por eso debe ser necesario el erase.

Recuerdo haber probado sin usar el erase, y efectivamente pasaba ello, al sobreescribir se ponen a cero aquellos que antes no estaban, y por supuesto tienes un dato erróneo.

Ello también se puede deducir en el simple hecho de la grabación del micro, siempre antes de grabar el software de grabación borra todo el contenido del micro.

saludos.
.


 

anything