Autor Tema: Busco bootloader para PIC24FJ desde SD card  (Leído 8486 veces)

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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Busco bootloader para PIC24FJ desde SD card
« Respuesta #15 en: 19 de Noviembre de 2014, 16:52:44 »
Por cierto, me vendría bien alguna utilidad que me represente los bloques de memoria que ocupa un HEX. ¿Conocéis alguna?

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Busco bootloader para PIC24FJ desde SD card
« Respuesta #16 en: 19 de Noviembre de 2014, 20:29:25 »
Aquí explica tu paisano cómo funciona un hex: http://www.todopic.com.ar/foros/index.php?topic=23342.0
¿Qué es lo que necesitas exactamente?

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Busco bootloader para PIC24FJ desde SD card
« Respuesta #17 en: 20 de Noviembre de 2014, 02:46:34 »
Pues me preguntaba si existirá alguna aplicación que pueda leer un HEX y pintar algo como esto:

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Busco bootloader para PIC24FJ desde SD card
« Respuesta #18 en: 20 de Noviembre de 2014, 08:45:28 »
Este... Paint  :mrgreen:

Si no hay nada hecho tenes que armarte tu aplicación que lea el hex desde la memoria SD y la escriba en la flash del micro. Teniendo eso funcionando vas a determinar cuanto espacio necesitas para el bootloader, como para protegerlo en la aplicación especifica y calcular las direcciones de los vectores de remapeo.

Ahí determinaras si con un pagina es suficiente para el bootloader (no se que tamaño tienen las de este micro) y a partir de la segunda es para la aplicación, etc..

Saludos
No contesto mensajes privados, las consultas en el foro

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Busco bootloader para PIC24FJ desde SD card
« Respuesta #19 en: 20 de Noviembre de 2014, 11:47:36 »
¿Lo que quieres saber es qué espacio de memoria ocupa exactamente el código HEX?
Creo que el compilador te lo da en formato texto (depende del compilador hay diferentes opciones)

También se puede hacer con facilidad en formato texto con una pequeña macro en Python:

Código: Python
  1. # -*- coding: cp1252 -*-
  2. """
  3.   Hex to Map
  4.   Convierte un archivo *.HEX con el código a grabar en un microcontrolador
  5.   en un mapa de memoria en formato texto.
  6.  
  7.   Versión de Python: 2.7
  8.  
  9.   Leyenda:
  10.   Cada punto representa 16 bytes de memoria
  11.   El primer punto arriba a la izquierda representa las posiciones de memoria 0 a 15
  12.   El ultimo punto a la izquierda de la primera linea representa la posición de memoria 1008 a 1023
  13.   .  = espacio libre en la memoria
  14.   o  = espacio de memoria ocupado de 1 a 7 bytes
  15.   O  = espacio de memoria ocupado de 8 a 16 bytes
  16. """
  17. import os
  18.  
  19. ext = '.hex'
  20. dots = 65536/16
  21. cols = 64
  22.  
  23. def main():
  24.    for filename in os.listdir('.'):
  25.       if filename[-len(ext):].lower() == ext:
  26.          hex2map(filename)
  27.  
  28. def hex2map(filename):
  29.    print 'Procesando', filename
  30.    try:
  31.       fi = open(filename, 'rt')
  32.    except:
  33.       return
  34.    hexmap = ['.'] * 4096
  35.    for line in fi:
  36.       if line[0] != ':':
  37.          continue
  38.       data = int(line[1:3],16), int(line[3:7],16)/16, int(line[7:9],16), line[9:41]
  39.       hexlen  = int(line[1:3],16)
  40.       hexdir  = int(line[3:7],16)/16
  41.       hextype = int(line[7:9],16)
  42.       hexdata = line[9:41]
  43.       if hextype == 0 and hexdata.lower() != 'ff' * hexlen:
  44.          if hexlen > 0:
  45.             hexmap[hexdir] = 'o'
  46.          if hexlen > 7:
  47.             hexmap[hexdir] = 'O'
  48.  
  49.    fo = open(filename[:-4] + '.txt', 'wt')
  50.    fo.write('Memory map of "%s"\n' % filename)
  51.    for i in range(0, dots, cols):
  52.       line = '   %s-%sh   %s' % (format(i*16, '04X'), format((i+cols)*16-1, '04X'), ''.join(hexmap[i:i+cols]))
  53.       print line
  54.       fo.write(line + '\n')
  55.    fo.close()
  56.  
  57. main()

Esta macro lee todos los archivos *.hex del directorio y los convierte en archivos de mapa de memoria.

Funciona en Python 2.7
Saludos.

Edito: Corrijo pequeña errata.
« Última modificación: 20 de Noviembre de 2014, 16:02:20 por Picuino »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Busco bootloader para PIC24FJ desde SD card
« Respuesta #20 en: 20 de Noviembre de 2014, 13:43:31 »
¿Y cómo puedo ejecutar la macro?. He descargado Python y he buscado en Google "ejecutar macro python", pero no me aclaro.

Conectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Busco bootloader para PIC24FJ desde SD card
« Respuesta #21 en: 20 de Noviembre de 2014, 14:23:37 »
Manuelo: Desde una ventana Command o desde "Ejecutar" de Windows despes poner "Bin del executable de Pyhton" seguido del "Nombre del script .py". Si el uno u el otro tienen espacios en blanco debes entrecomillarlos entre dobles comillas. El script no es mas que un fichero de texto cuyo contenido es lo que te ha colocado el amigo Picuino.

Un poné:

Código: DOS
  1. "c:\python27\python.exe" "C:\MisScripts\miejemplo.py"


¡Atención, importante! El tabulado (identado) en Python es fundamental ya que no existen los símbolos para englobar código, como los ( { ó ) } como en C o Java. Un trozo de código empieza tras : y termina cuando se termine el nivel de identación.

Así en el scritp de Picuino se ejecuta en el bucle for todo lo que está identando un tabulador a la derecha del mismo, desde "line = ..." hasta "fo.write..."

Código: Python
  1. for i in range(0, dots, cols):
  2.      line = ''.join(hexmap[i:i+cols])
  3.      line = '   %s-%sh   %s' % (format(i*16, '04X'), format((i+cols)*16-1, '04X'), line)
  4.      print line
  5.      fo.write(line + '\n')

Si a esta última línea se te ocurriese quitarle un nivel de identación, en la forma de:

Código: Python
  1. for i in range(0, dots, cols):
  2.      line = ''.join(hexmap[i:i+cols])
  3.      line = '   %s-%sh   %s' % (format(i*16, '04X'), format((i+cols)*16-1, '04X'), line)
  4.      print line
  5.    fo.write(line + '\n')

Entonces la última línea "fo.write..." se ejecutaría una sola vez tras terminar la ejecución del "for i..."

Ultimamente estoy trabajando en Python y ...  :mrgreen:
« Última modificación: 20 de Noviembre de 2014, 14:36:38 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Busco bootloader para PIC24FJ desde SD card
« Respuesta #22 en: 20 de Noviembre de 2014, 15:25:08 »
Perfecto, ya lo he podido probar. Muchas gracias por la ayuda paisano.


Picuino, espectacular la macro. Funciona de arte, y con tan pocas líneas de código que impresiona.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Busco bootloader para PIC24FJ desde SD card
« Respuesta #23 en: 20 de Noviembre de 2014, 15:43:46 »
Ya he hablado otras veces en el foro de las virtudes de Python.

Cuando descubrí este lenguaje... fue amor a primera vista.

Nunca me cansaré de alabar sus virtudes que van mucho más allá de lo que has visto en esta macro

En cualquier caso un ejemplo vale más que mil palabras y es experimentando el código donde se ven de verdad las virtudes de un lenguaje.

Adjunto la macro en formato archivo por si alguien más tiene problemas.
La macro hay que colocarla en el mismo directorio que el archivo *.hex y, al ejecutarla, automáticamente lo convierte en un archivo de texto con el mapa de memoria.

Comento que la mejor manera de copiar el código es dando al boton "Insertar Cita", con el que aparece el texto original sin tabulaciones y sin numeración.

Por si te interesa, con el módulo PIL se pueden manejar con facilidad imágenes desde Python. Con unas líneas más se podría generar una imagen de mapa de bits semejante a la que pusiste.

Saludos.
« Última modificación: 23 de Noviembre de 2014, 17:02:47 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Busco bootloader para PIC24FJ desde SD card
« Respuesta #24 en: 20 de Noviembre de 2014, 15:56:14 »
Adjunto la salida de un ejemplo que he utilizado para que se pueda apreciar:

Código: [Seleccionar]
Memory map of "18F4550_USB_Bootloader.hex"
   0000-03FFh   OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
   0400-07FFh   OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
   0800-0BFFh   OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
   0C00-0FFFh   OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
   1000-13FFh   OOOOOOOOOOOOOOOOOOO.............................................
   1400-17FFh   ................................................................
   1800-1BFFh   ................................................................
   1C00-1FFFh   ................................................................
   2000-23FFh   ................................................................
   2400-27FFh   ................................................................
   2800-2BFFh   ................................................................
   2C00-2FFFh   ................................................................
   3000-33FFh   ................................................................
   3400-37FFh   ................................................................
   3800-3BFFh   ................................................................
   3C00-3FFFh   ................................................................
   4000-43FFh   ................................................................
   4400-47FFh   ................................................................
   4800-4BFFh   ................................................................
   4C00-4FFFh   ................................................................
   5000-53FFh   ................................................................
   5400-57FFh   ................................................................
   5800-5BFFh   ................................................................
   5C00-5FFFh   ................................................................
   6000-63FFh   ................................................................
   6400-67FFh   ................................................................
   6800-6BFFh   ................................................................
   6C00-6FFFh   ................................................................
   7000-73FFh   ................................................................
   7400-77FFh   ................................................................
   7800-7BFFh   ................................................................
   7C00-7FFFh   ................................................................
   8000-83FFh   ................................................................
   8400-87FFh   ................................................................
   8800-8BFFh   ................................................................
   8C00-8FFFh   ................................................................
   9000-93FFh   ................................................................
   9400-97FFh   ................................................................
   9800-9BFFh   ................................................................
   9C00-9FFFh   ................................................................
   A000-A3FFh   ................................................................
   A400-A7FFh   ................................................................
   A800-ABFFh   ................................................................
   AC00-AFFFh   ................................................................
   B000-B3FFh   ................................................................
   B400-B7FFh   ................................................................
   B800-BBFFh   ................................................................
   BC00-BFFFh   ................................................................
   C000-C3FFh   ................................................................
   C400-C7FFh   ................................................................
   C800-CBFFh   ................................................................
   CC00-CFFFh   ................................................................
   D000-D3FFh   ................................................................
   D400-D7FFh   ................................................................
   D800-DBFFh   ................................................................
   DC00-DFFFh   ................................................................
   E000-E3FFh   ................................................................
   E400-E7FFh   ................................................................
   E800-EBFFh   ................................................................
   EC00-EFFFh   ................................................................
   F000-F3FFh   ................................................................
   F400-F7FFh   ................................................................
   F800-FBFFh   ................................................................
   FC00-FFFFh   ................................................................
« Última modificación: 20 de Noviembre de 2014, 16:00:59 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Busco bootloader para PIC24FJ desde SD card
« Respuesta #25 en: 20 de Noviembre de 2014, 16:00:36 »
Actualizo el programa que tenía una pequeña errata. Ahora en la salida se ve el caracter 'o' o el caracter 'O' dependiendo del número de posiciones ocupadas.


Saludos.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Busco bootloader para PIC24FJ desde SD card
« Respuesta #26 en: 20 de Noviembre de 2014, 16:06:10 »
¡Genial!   ((:-)) ((:-)) ((:-))

Código: [Seleccionar]
Memory map of "ex_bootloader.hex"
   0000-03FFh   O...............................................................
   0400-07FFh   ................................................................
   0800-0BFFh   ................................................................
   0C00-0FFFh   ................................................................
   1000-13FFh   ................................................................
   1400-17FFh   ................................................................
   1800-1BFFh   ................................................................
   1C00-1FFFh   ................................................................
   2000-23FFh   ................................................................
   2400-27FFh   ................................................................
   2800-2BFFh   ................................................................
   2C00-2FFFh   ................................................................
   3000-33FFh   ................................................................
   3400-37FFh   ................................................................
   3800-3BFFh   ................................................................
   3C00-3FFFh   ................................................................
   4000-43FFh   ................................................................
   4400-47FFh   ................................................................
   4800-4BFFh   ................................................................
   4C00-4FFFh   ...............................................................O
   5000-53FFh   OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo....
   5400-57FFh   ...............................................................O
   5800-5BFFh   ................................................................
   5C00-5FFFh   ................................................................
   6000-63FFh   ................................................................
   6400-67FFh   ................................................................
   6800-6BFFh   ................................................................
   6C00-6FFFh   ................................................................
   7000-73FFh   ................................................................
   7400-77FFh   ................................................................
   7800-7BFFh   ................................................................
   7C00-7FFFh   ................................................................
   8000-83FFh   ................................................................
   8400-87FFh   ................................................................
   8800-8BFFh   ................................................................
   8C00-8FFFh   ................................................................
   9000-93FFh   ................................................................
   9400-97FFh   ................................................................
   9800-9BFFh   ................................................................
   9C00-9FFFh   ................................................................
   A000-A3FFh   ................................................................
   A400-A7FFh   ................................................................
   A800-ABFFh   ................................................................
   AC00-AFFFh   ................................................................
   B000-B3FFh   ................................................................
   B400-B7FFh   ................................................................
   B800-BBFFh   ................................................................
   BC00-BFFFh   ................................................................
   C000-C3FFh   ................................................................
   C400-C7FFh   ................................................................
   C800-CBFFh   ................................................................
   CC00-CFFFh   ................................................................
   D000-D3FFh   ................................................................
   D400-D7FFh   ................................................................
   D800-DBFFh   ................................................................
   DC00-DFFFh   ................................................................
   E000-E3FFh   ................................................................
   E400-E7FFh   ................................................................
   E800-EBFFh   ................................................................
   EC00-EFFFh   ................................................................
   F000-F3FFh   ................................................................
   F400-F7FFh   ................................................................
   F800-FBFFh   ................................................................
   FC00-FFFFh   ................................................................

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Busco bootloader para PIC24FJ desde SD card
« Respuesta #27 en: 20 de Noviembre de 2014, 16:10:37 »
Gracias Nocturno.
Si te animas a aprender, programar en Python te permite hacer en poco tiempo macros muy útiles.

Adjunto la macro actualizada para que sea compatible también con la versión 3.4 de Python.

Código: Python
  1. # -*- coding: cp1252 -*-
  2. """
  3.   Hex to Map
  4.   Convierte un archivo *.HEX con el código a grabar en un microcontrolador
  5.   en un mapa de memoria en formato texto.
  6.  
  7.   Versión de Python: 2.7 y 3.4
  8.  
  9.   Leyenda:
  10.   Cada punto representa 16 bytes de memoria
  11.   El primer punto arriba a la izquierda representa las posiciones de memoria 0 a 15
  12.   El ultimo punto a la izquierda de la primera linea representa la posición de memoria 1008 a 1023
  13.   .  = espacio libre en la memoria
  14.   o  = espacio de memoria ocupado de 1 a 7 bytes
  15.   O  = espacio de memoria ocupado de 8 a 16 bytes
  16. """
  17. import os
  18.  
  19. ext = '.hex'
  20. dots = int(65536/16)
  21. cols = 64
  22.  
  23. def main():
  24.    for filename in os.listdir('.'):
  25.       if filename[-len(ext):].lower() == ext:
  26.          hex2map(filename)
  27.  
  28. def hex2map(filename):
  29.    print('Procesando', filename)
  30.    try:
  31.       fi = open(filename, 'rt')
  32.    except:
  33.       return
  34.    hexmap = ['.'] * 4096
  35.    for line in fi:
  36.       if line[0] != ':':  continue
  37.       hexlen  = int(line[1:3],16)
  38.       hexdir  = int(int(line[3:7],16)/16)
  39.       hextype = int(line[7:9],16)
  40.       hexdata = line[9:41]
  41.       if hextype == 0 and hexdata.lower() != 'ff' * hexlen:
  42.          if hexlen > 0:
  43.             hexmap[hexdir] = 'o'
  44.          if hexlen > 7:
  45.             hexmap[hexdir] = 'O'
  46.  
  47.    fo = open(filename[:-4] + '.txt', 'wt')
  48.    fo.write('Memory map of "%s"\n' % filename)
  49.    for i in range(0, dots, cols):
  50.       line = '   %s-%sh   %s' % (format(i*16, '04X'), format((i+cols)*16-1, '04X'), ''.join(hexmap[i:i+cols]))
  51.       print(line)
  52.       fo.write(line + '\n')
  53.    fo.close()
  54.  
  55. main()

Saludos.
« Última modificación: 20 de Noviembre de 2014, 16:13:09 por Picuino »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Busco bootloader para PIC24FJ desde SD card
« Respuesta #28 en: 20 de Noviembre de 2014, 16:35:47 »
Alguna vez tuve un contacto con Python y me fascinó, pero nunca le he podido dedicar el tiempo suficiente como para entenderlo hasta el punto de sacarle todo el partido.

Me pasa algo raro con un HEX para 24F.

Tanto en el "Program Memory" del MPLAB


como en el winpic800 del maestro Sisco


veo que la primera dirección ocupada es la 0x400, lo cual coincide con lo que he expresado en el código fuente.
   #define LOADER_SIZE     0x07FF
   #define LOADER_END      0xC00
   #define LOADER_ADDR     (LOADER_END - LOADER_SIZE)

Sin embargo, en tu macro, la primera posición ocupada es la 0x800.
Creo que alguna vez me ha pasado algo así con los HEX de los 24F, y es que las direcciones de memoria son doble de grandes (por aquello de los 16 bits).

Dejo el HEX adjunto por si quieres bichearlo.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Busco bootloader para PIC24FJ desde SD card
« Respuesta #29 en: 20 de Noviembre de 2014, 19:58:58 »
Claro, en la macro aparece la dirección 800h porque en el archivo *.hex aparece esto:

Código: [Seleccionar]
:080000009A0504000000000055
:100800004200F800801F780081E0A90014028000F7
:10081000040EB3001402880081E0A800013B8800A8
:1008200054052000343B8800A40A2000343B880093

Si separas las columnas para ver las direcciones más claro:

Código: [Seleccionar]
:08 0000 00 9A05040000000000 55
:10 0800 00 4200F800801F780081E0A90014028000 F7
:10 0810 00 040EB3001402880081E0A800013B8800 A8
:10 0820 00 54052000343B8800A40A2000343B8800 93

Verás que las direcciones comienzan en el byte 0x0800  (excepto 8 bytes que hay en la posición cero)

Puede que se deba a que el mplab y el winpic800 se refieren a words de 16 bits, como has comentado.

Un saludo.