Autor Tema: Compatibilidad ensamblador entre familias de PIC  (Leído 8422 veces)

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

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Compatibilidad ensamblador entre familias de PIC
« en: 21 de Mayo de 2015, 11:01:27 »

¿ Alguno sabeis que grado de compatibilidad existe en el ensamblador entre las distintas familias de PIC ?, en concreto entre los PIC18F entre si, y  los PIC18F con otras familias superiores como PIC24 o PIC32.

Estoy con un proyecto en el que tengo que rediseñar una placa muy antigua, de principios de los 80, con un procesador RCA CDP1802. En principio iba a dejar el procesador original, pero hoy en día es difícil de localizar y muy caro, si me voy a los chinos todo lo que ofrecen huele a falsificación, remarcado de otros chips que obviamente no van a funcionar, o chips usados sacados de placas viejas que seguramente tampoco funcionarán. Si me voy al mercado americano, son caros, el transporte super caro y me van a crujir en aduanas.

La siguiente opción que barajé es emular el procesador original, bien con un core para FPGA o algún programa para un microcontrolador. Para FPGA encontré algo pero no es de código libre, y finalmente a base de buscar encontré un proyecto que rueda en un PIC18F4620 para emular un sistema COSMAC completo con el CDP1802, una virguería, algún día me gustaría aprender a programar un emulador de un procesador en un microcontrolador o un FPGA, es un tema fascinante.

Aunque en el proyecto para PIC18F dan los fuentes, están en ensamblador para mi desgracia, porque no es un lenguaje que domine, aunque si que hice algo hace muchos años y conozco los fundamentos de la programación en ensamblador. La cuestión es que seguramente necesitaré más flash para guardar los programas que debe de rodar el CDP1802, con el PIC18F4620 tengo solo 64K, y necesitaría al menos 96K o mejor 128K. Estoy pensando en usar el PIC18F4685 que tiene 96K, o alguno de los que tiene 128K, pero tengo mis dudas sobre si el fuente en ensamblador será compatible o puede necesitar modificaciones complicadas. Lo único bueno es que son unos fuentes extraordinariamente bien documentados.

Me voy a pedir unos samples del PIC18F4620 en PDIP y TQFP, y seguramente uno del PIC18F4685 en PDIP para pruebas.





Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Compatibilidad ensamblador entre familias de PIC
« Respuesta #1 en: 21 de Mayo de 2015, 11:17:50 »
En emsamblador no tendrás que hacer grandes modificaciones, quizá tengas que tocar algo de los puertos, pero no creo que ninguna modificación gorda.

Si quieres aprender a emular un micro o un núcleo, yo aprendí ha hacerlo primero en ordenador en C, donde tienes mas facilidad de programación, y los programas que corría los leía de un .hex con el código maquina. Es igual que un micro solo que los pines son variables para emularlos. Cuando lo dómines hay te resultara mucho mas fácil de hacer en otro micro o una FPGA. El que yo eMule fue el nucleo de un 8051

Un saludo.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Compatibilidad ensamblador entre familias de PIC
« Respuesta #2 en: 21 de Mayo de 2015, 12:00:45 »
En emsamblador no tendrás que hacer grandes modificaciones, quizá tengas que tocar algo de los puertos, pero no creo que ninguna modificación gorda.

¿ De PIC18 a PIC24 también es compatible el ensamblador ?. Lo único bueno, es que supongo que no habrán limitaciones con el compilador como ocurre con el C de XC32.

Citar
Si quieres aprender a emular un micro o un núcleo, yo aprendí ha hacerlo primero en ordenador en C, donde tienes mas facilidad de programación, y los programas que corría los leía de un .hex con el código maquina. Es igual que un micro solo que los pines son variables para emularlos.

Para hacerlo en un PC, no se ni por donde empezar. Solo se me ocurre mirar los fuentes de MAME o Pinmame, que emulan una buena cantidad de procesadores, para ver un poco como manejan el juego de instrucciones, y luego ya me pierdo. Supongo que manejan variables para los registros de trabajo como el W y otros, el contador de programa (PC), la pila para los saltos, la RAM y el estado de cada pin.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Compatibilidad ensamblador entre familias de PIC
« Respuesta #3 en: 21 de Mayo de 2015, 12:01:58 »
Hay que separar las familias

Los PIC16/PIC10/PIC12 creo que comparten todo el mismo set de intrucciones.

PIC18 ya posee un set distinto, en realidad se expande del anterior.

PIC24/dsPIC poseen otro set, pero lo comparten estos 2, dsPIC tiene algunas instrucciones mas que involucran al DSP, y hay algunas diferencias en ejecucion entre las familias ( PIC24F y PIC24E, tal ves algun salto lleva 2 y el otro 4 ciclos, en dsPIC ocurre lo mismo)

PIC32 posee el nucleo de MIPS32 M4K, asi que posee su propio set de instrucciones.

Ahi tenes los grupos en los cuales serian intercambiables los codigos, puede que cambie el nombre de algun registro o la posicion en memoria, Tambien el tema de los pines, que microchip no le da mucha importancia que se mantenga ( aunque si rediseñas la placa no deberia haber problema). Y cualquier duda que necesites en ASM veo si puedo ayudar, me gusta asi que con todo gusto.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Compatibilidad ensamblador entre familias de PIC
« Respuesta #4 en: 21 de Mayo de 2015, 12:08:05 »
PIC18 ya posee un set distinto, en realidad se expande del anterior.

PIC24/dsPIC poseen otro set, pero lo comparten estos 2, dsPIC tiene algunas instrucciones mas que involucran al DSP, y hay algunas diferencias en ejecucion entre las familias ( PIC24F y PIC24E, tal ves algun salto lleva 2 y el otro 4 ciclos, en dsPIC ocurre lo mismo)

PIC32 posee el nucleo de MIPS32 M4K, asi que posee su propio set de instrucciones.

Ahi tenes los grupos en los cuales serian intercambiables los codigos, puede que cambie el nombre de algun registro o la posicion en memoria, Tambien el tema de los pines, que microchip no le da mucha importancia que se mantenga ( aunque si rediseñas la placa no deberia haber problema). Y cualquier duda que necesites en ASM veo si puedo ayudar, me gusta asi que con todo gusto.

¿ Entre PIC18 y PIC24, hay compatibilidad ?, por ejemplo para llevar los fuentes de PIC18F4620 a un PIC24 o dsPIC.

Me gustaría meterle una rutina para que pueda cargar el programa a rodar desde una tarjeta micro SD, pero hacerlo en ensamblador me resulta muy complicado porque no lo domino. No se si sería posible mezclar C con ensamblador, para meter las rutinas de lectura de la tarjeta y grabación en la flash, usando C, y dejar las rutinas actuales en ensamblador para emular el procesador CDP1802. El caso es que el programa actual está todo en ensamblador, y habría que meterle el C, no se si eso es posible, o lo normal es al revés, desde un programa en C llamar a rutinas en ensamblador.




Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Compatibilidad ensamblador entre familias de PIC
« Respuesta #5 en: 21 de Mayo de 2015, 12:28:33 »
No, como dije hay 4 grupos distintos. Esos 4 grupos no comparten set

PIC18 es mas parecido a PIC16 con algunas instrucciones agregadas, PIC24/dsPIC no tienen nada que ver con las instrucciones del PIC18.
De igual forma se puede portar si es que no es tan complejo. Pero el ASM cambia completamente de uno a otro, directivas, etc.

Citar
El caso es que el programa actual está todo en ensamblador, y habría que meterle el C, no se si eso es posible, o lo normal es al revés, desde un programa en C llamar a rutinas en ensamblador.

Si se puede, lo unico es que si tienen argumentos tiene una forma definida para pasarse. Creo que se manjea con el stack y W en el PIC16/18 Mientras que PIC24/dsPIC/PIC32 es a traves de algunos registros + stack. juaperser puede ser de mucha mas utilidad por que yo intente y realmente no pude hacer funcionar un codigo en C con algunos archivos en ASM. (archivos ASM en un codigo C, por si no se entendio)
« Última modificación: 21 de Mayo de 2015, 12:33:53 por KILLERJC »

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Compatibilidad ensamblador entre familias de PIC
« Respuesta #6 en: 21 de Mayo de 2015, 12:37:49 »
Citar
El caso es que el programa actual está todo en ensamblador, y habría que meterle el C, no se si eso es posible, o lo normal es al revés, desde un programa en C llamar a rutinas en ensamblador.

Si se puede, lo unico es que si tienen argumentos tiene una forma definida para pasarse. Creo que se manjea con el stack y W en el PIC16/18 Mientras que PIC24/dsPIC/PIC32 es a traves de algunos registros + stack. juaperser puede ser de mucha mas utilidad por que yo intente y realmente no pude hacer funcionar un codigo en C con algunos archivos en ASM.

Del programa en C al ensamblador no habría que pasar ningún parámetro. La rutina en C serviría para leer un archivo de una tarjeta micro SD y grabar en flash ese archivo binario (como lo hace un bootloader), que es el programa que tendrá que ejecutar el procesador emulado (CDP1802 ).

El caso es que las rutinas en ensamblador, no se si tienen que ir ubicadas en direcciones concretas, y lo que si que tiene que mantenerse en ambos es la dirección de escritura y lectura donde se ubique el programa a rodar por el procesador emulado, que ocupa 4K. Desde C se manejar la flash sin problemas, borrado y escritura.

También me planteo meter varios programas de 4K cada uno, y con un jumper externo conectado el PIC, saber desde las rutinas en ensamblador que bloque de 4K tiene que cargar y ejecutar el procesador, creo que son 8 programas distintos, según en que máquina se vaya a instalar la placa.

Tendré que mirar como se llaman a programas en ensamblador desde C, porque eso no lo he hecho nunca.


« Última modificación: 21 de Mayo de 2015, 12:41:41 por planeta9999 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Compatibilidad ensamblador entre familias de PIC
« Respuesta #7 en: 21 de Mayo de 2015, 12:41:52 »
Citar
Tendré que mirar como se llaman a programas en ensamblador desde C, porque eso no lo he hecho nunca.

En la parte de C no es mucho problema. En la parte de ASM algo..

http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_XC8_C_Compiler_User_Guide.pdf

Seccion 5.12 - pagina 210

Aun asi yo prbe el ejemplo y no me funciono.

Citar
El caso es que las rutinas en ensamblador, no se si tienen que ir ubicadas en direcciones concretas, y lo que si que tiene que mantenerse en ambos es la dirección de escritura y lectura donde se ubique el programa a rodar por el procesador emulado, que ocupa 4K.

Eso se peude ver en el codigo

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Compatibilidad ensamblador entre familias de PIC
« Respuesta #8 en: 21 de Mayo de 2015, 12:53:15 »
Citar
El caso es que las rutinas en ensamblador, no se si tienen que ir ubicadas en direcciones concretas, y lo que si que tiene que mantenerse en ambos es la dirección de escritura y lectura donde se ubique el programa a rodar por el procesador emulado, que ocupa 4K.

Eso se peude ver en el codigo


¿ Le puedes echar un vistazo al fuente ?.
http://0xee.net/Rossin/Rossin/www.tedrossin.net46.net/Electronics/RCA/ElfClone/B1802_18F.asm


Yo diría que con estas directivas, se están definiendo la ubicación de partes del código, donde empiezan las rutinas del emulador y donde se almacena el programa a rodar por el procesador emulado, y eso no se si debe de considerar a la hora de hacer las rutinas en C, o se tiene que indicar en el linker script.

#define EMU_CODE_START      0x0680
#define ROM_SPACE_START      0x4000

« Última modificación: 21 de Mayo de 2015, 12:59:42 por planeta9999 »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Compatibilidad ensamblador entre familias de PIC
« Respuesta #9 en: 21 de Mayo de 2015, 12:54:44 »
Hola

Como ya te han contestado... PIC18 (ALU 8 bits) no es compatible con PIC24 (ALU 16 bits). El tamaño de las operaciones no es igual.

Aquí puedes encontrar una lista de las instrucciones...

http://en.wikipedia.org/wiki/PIC_instruction_listings

Los PICs comunes (PIC10, 12, 16) usan lo visto en: Mid-range core devices (14 bits por instrucción).

Los PIC18 usan instrucciones más enfocadas en C: PIC18 high end core devices (16 bits por instrucción).

Los PIC16 mejorados (PIC16F1XXX y PIC12F1XXX) se parecen a los PIC18: Enhanced mid-range core devices (14 bits por instrucción).

Los PIC24 ya con 16 bits de ALU tienen instrucciones que pesan 24 bits: PIC24 and dsPIC 16-bit microcontrollers.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Compatibilidad ensamblador entre familias de PIC
« Respuesta #10 en: 21 de Mayo de 2015, 13:30:30 »
#define EMU_CODE_START      0x0680  -- Direccion de flash donde se comienza el codigo de la parte de emulacion,
#define ROM_SPACE_START      0x4000  -- Direccion de flash donde se almacena el codigo a emular


org 0x0800     --- Direccion donde se almacena la tabla con todos las opcode posibles.


Yo me lo imagine tal cual al codigo, leer, una tabla y luego a cada opcode y obviamente trabajarlo de esa manera., pero veo que que le presta muchisima atencion a los ciclos de tiempo. Por todos los nop agregados, se puede achichar un poco si se reemplaza por saltos goto $+1, ahorrandote casi la mitad de nops. por cierto no parece muy complejo, lo mas complejo es respetar los tiempos.
Aunque ahora que veo tiene una maquina de estados
« Última modificación: 21 de Mayo de 2015, 13:59:34 por KILLERJC »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Compatibilidad ensamblador entre familias de PIC
« Respuesta #11 en: 21 de Mayo de 2015, 14:12:08 »
buenas planeta9999:

Citar
¿ De PIC18 a PIC24 también es compatible el ensamblador ?

quiza no me he explicado bien, queria decir que no ivas a tener grandes modificaciones por que el codigo que tu has encontrado es de un  PIC18F4620 y lo quieres meter en un  PIC18F4685, que como te han dicho los compañeros, son de la misma familia, si fuera un 24 ya seria otra cosa.

Citar
Para hacerlo en un PC, no se ni por donde empezar. Solo se me ocurre mirar los fuentes de MAME o Pinmame, que emulan una buena cantidad de procesadores, para ver un poco como manejan el juego de instrucciones, y luego ya me pierdo. Supongo que manejan variables para los registros de trabajo como el W y otros, el contador de programa (PC), la pila para los saltos, la RAM y el estado de cada pin.

creo recordar que yo empece con un programa gráfico que había desarrollado una universidad (creo que la de Navarra o Sevilla no lo recuerdo), era un nucleo procesador muy simple que podia correr programas y se veia graficamente como se movian los registros, los flag, la memoria etc.

teniendo este programa, lo emule en C y al leer los programas comprobaba que mi codigo en C hiciera lo mismo que el programa gráfico, si encuento algo en mi baul de los recuerdos te lo pasaré.

un saludo.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Compatibilidad ensamblador entre familias de PIC
« Respuesta #12 en: 21 de Mayo de 2015, 15:06:34 »
Bueno lo he encontrado,

lo dejo en un post aparte para que lo encuentre la gente que este interesada en emular nucleos o microcontroladores

un saludo y espero que os sirva.

http://www.todopic.com.ar/foros/index.php?topic=44559.msg369677;topicseen#msg369677
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Compatibilidad ensamblador entre familias de PIC
« Respuesta #13 en: 21 de Mayo de 2015, 16:09:24 »
Bueno lo he encontrado,

lo dejo en un post aparte para que lo encuentre la gente que este interesada en emular nucleos o microcontroladores

un saludo y espero que os sirva.

http://www.todopic.com.ar/foros/index.php?topic=44559.msg369677;topicseen#msg369677


Muy interesante, gracias, le echaré un ojo, aunque se echa en falta algún manual de uso.
Por Youtube me he encontrado con estos videos que explican como hacer un simulador, uno genérico (de 10 capítulos) y otro específico para el Z80 (de 5 capítulos).



Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Compatibilidad ensamblador entre familias de PIC
« Respuesta #14 en: 21 de Mayo de 2015, 16:14:15 »
#define EMU_CODE_START      0x0680  -- Direccion de flash donde se comienza el codigo de la parte de emulacion,
#define ROM_SPACE_START      0x4000  -- Direccion de flash donde se almacena el codigo a emular

org 0x0800     --- Direccion donde se almacena la tabla con todos las opcode posibles.

¿ Y las rutinas que ponga en C, no machacarán esas direcciones ?, es mi duda principal la coexistencia de C y ensamblador a la hora de que el enlazador ubique el código.

Tambien el fuente en ensamblador usa parte de la flash para guardar el programa que debe de rodar el procesador emulado, pero eso lo hace cuando entra en modo Debug y recibe el archivo a grabar por RS232, igual que lo hace un bootloader, entonces borra las páginas de la flash correspondientes y lo graba.

A todo esto un americano me vende el procesador original CDP1802, fabricado por Harris, a 5 dólares la unidad, es un buen precio, pero mejor si lo puedo emular con un PIC, para no depender de futuras compras a USA. También ha creado unos kits para formación, basados en el COSMAC original de los 70, eso si que me puede interesar para comparar el funcionanmiento del emulado con el original.
« Última modificación: 21 de Mayo de 2015, 16:19:12 por planeta9999 »