Autor Tema: ¿CÓMO USAR CErase, CWrite y CRead?  (Leído 392 veces)

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

Desconectado virolay

  • PIC12
  • **
  • Mensajes: 50
¿CÓMO USAR CErase, CWrite y CRead?
« en: 07 de Enero de 2017, 03:15:14 »
Hola a todos y Feliz Año Nuevo.

Tengo un par de diseños con el 18F25K22 funcionando muy bien con Proton y en Proteus. Se me ha ocurrido comprar una pseudo Arduino que monta un 18F25J50. Inicialmente creía que la única diferencia era que éste último tenía USB lo que supone la pérdida de 3 pines de I/O, dos para las D+ y D- y uno para el VUSB.

El paso de uno a otro se ha ido haciendo sin más complicaciones hasta que se me ha ocurrido empezar a utilizar las funciones EWrite y ERead. A las primeras de cambio, el compilador Proton me da un error:

No Eeprom memory on this microcontroller!

He conseguido averiguar que Proton tiene 3 instrucciones para utilizar la memoria Flash como si fuera una EEPROM. La rutina básica sería algo así:

Dim wPMADRPMADRL.Word
Dim FlashIndex As Byte
Dim wFlashAddress As Word
Dim FlashByte As Byte

wFlashAddress = $0780

MAIN:
' Borra un bloque de 16 words de la memoria flash
CErase wFlashAddress

' Escribe 16 bytes en la memoria flash
CWrite wFlashAddress,[10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160]

' Lee 16 bytes desde la memoria flash
For FlashIndex = 0 To  15
    FlashByte = CRead wFlashAddress
    Inc wFlashAddress 
Next

Stop

Pero no funciona en el 25J50. Para empezar:

a) el registro PMADRL no existe y tampoco sé ni qué hace ni qué valor debería tener. ¿Alguien podría explicarme el equivalente en el 25J50?.
b) por lo visto hay PICs que deben borrarse, escribir y leer en bloque de 16 words, otro de 32 y puede que los haya de 64. ¿Dónde debo mirar en la hoja de datos del 25J50 para saber el tamaño de borrado de un bloque?
c) para terminar, supongo que deberé reservar una zona de la memoria flash para no meterme en la parte del programa. ¿Dónde y cómo se reserva la zona?.

Muchas gracias por vuestra atención y vuestro tiempo,
Quod natura non dat Salmantica non praestat

Desconectado virolay

  • PIC12
  • **
  • Mensajes: 50
Re:¿CÓMO USAR CErase, CWrite y CRead?
« Respuesta #1 en: 09 de Enero de 2017, 08:21:03 »
Aunque sigo sin saber qué es Dim wPMADRL.Word ni para qué sirve, la he quitado y he hecho pruebas con el código siguiente:

Dim FlashIndex As Byte
Dim wFlashAddress As Word
Dim FlashByte As Byte
Dim FLASHFORNEXT As Word
wFlashAddress = $7E00

' Erase a block of 16 words in flash memory
For FLASHFORNEXT = wFlashAddress To $7FF0 Step 16
CErase FLASHFORNEXT    'wFlashAddress
DelayMS 50
Next
 

' Write the bytes to flash memory
For FLASHFORNEXT = wFlashAddress To $7FF0 Step 16
CWrite FLASHFORNEXT, [$00,$55,$00,$55,$00,$55,$00,$55,$00,$55,$00,$55,$00,$55,$00,$55]
DelayMS 50
Next
Stop
' Read the bytes from flash memory
For FlashIndex = 0 To  15
    FlashByte = CRead wFlashAddress
    Inc wFlashAddress 
Next

Stop

Por extraño que parezca, en mis primeras pruebas (y con este código también) las 2 penúltimas posiciones de la Flash ($7FFC y la $7FFD) que son las que inicialmente quería grabar permanecen inalterables (a $FF), supongo que es un defecto de la simulación de Proteus. La ley de Murphy es implacable.
Con el código anterior, he modificado 512 posiciones sin problema, a excepción de las 2 posiciones citadas y las tres inmediatamente anteriores.

Saludos
Quod natura non dat Salmantica non praestat