Autor Tema: Convertir sketch a ensamblador  (Leído 19049 veces)

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

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Convertir sketch a ensamblador
« Respuesta #30 en: 22 de Abril de 2018, 22:19:29 »
El tema se ha puesto caliente  :D

Gracias a todos por sus respuestas y su tiempo.

De momento las concluciones que saco de este dialogo son estas:

1) Lo de entender las librerias de Arduino o intentar pasarlas a ASM para migrarlas, de momento, lo dejo. Parece que no es para mi nivel.

2) Programar Arduino en ASM parece que es posible pero, visto lo visto, no le veo demasiadas ventajas. Mejor empezar a estudiar c lo que me puede abrir las puertas no solo a este, sino a otros micros.

3) Hablando del PIC, para programar en C se puede utilizar el CCS o el XC8, pero, segun KILLERJC, si vienes del assembler me recomienda el XC8.

Ahora ya solo necesito sacar tiempo para empezar a estudiar :lol:.


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Convertir sketch a ensamblador
« Respuesta #31 en: 22 de Abril de 2018, 22:58:37 »
O sea vos sos libre de elegir el compilador que creas conveniente. Me explico con un ejemplo simple el porque te sugiero este compilador.

Los mas conocidos son: XC8 ( Microchip), CCS y Mikro C, pienso que los 2 mas usados con XC8/CCS

XC8 por su parte proporciona el soporte para TODOS los micros y no solo algunos, asi que esto no te limita a nada. Usando MPLAB X podes incluso probar el programa ( simularlo ) en el mismo IDE, sin necesidad de usar algun otro simulador. Y generador de FUSES de forma visual.
Voy a hacer una comparativa para que veas cual es la diferencia.

Alternar un Led:

Código: C
  1. #include <xc.h>
  2.  
  3. // Aca los FUSES
  4.  
  5. void main(void)
  6. {
  7.      TRISA = 0xFF;              // Asi para cuando te referis a un registro completo, y abajo para cuando te referis a algun bit
  8.      TRISBbits.RB0 = 0;       // Lo mismo que hacer BCF TRISB,0 , observa que no nos importa los bancos cuando manejamos C
  9.      while(1)
  10.      {
  11.           PORTBbits.RB0 = 1;
  12.           __delay_ms(500)
  13.           PORTBbits.RB0 = 0;
  14.           __delay_ms(500);
  15.      }
  16. }

Tal ves le falte configurar algun otro registro para que funcione realmente, pero es aproximado. Observa que es muy parecido a lo que harias con ASM. Te manejas con los registros.
El include de xc.h luego resuelve para el PIC que tengas configurado en tu proyecto, asi que con solo incluir ese es valido para todos.

Veamos ahora lo mismo con CCS y que funcione IGUAL.

Código: C
  1. #include <16f877a.h>
  2.  
  3. #USE FAST_IO(B)
  4. // Aca los FUSES
  5.  
  6. void main(void)
  7. {
  8.      set_tris_a(0xFF);
  9.      set_tris_b(0xFE);
  10.      while(1)
  11.      {
  12.           output_high(PIN_B0);
  13.           delay_ms(500);
  14.           output_low(PIN_B0);
  15.           delay_ms(500);
  16.      }
  17. }

CCS esta preparado para abstraerte del Hardware como ya comentaron, no tocas nunca los registros, la idea es que JAMAS lo hagas.
el USE FAST_IO  (especifico de CCS) hace que los output_low/output_high/input funcionen igual que leer el bit unicamente. Sino al no poner eso CCS si usas la funcion input para leer el estado de un pin de salida por ejemplo terminas cambiando los TRIS tambien.

Ventajas de CCS... Supongamos que tenes que realizar una UART, en XC8 debes modificar todos los registros, bits a bits. en CCS usas:

Código: C
  1. #USE RS232(baud=9600,xmit=PIN_B0, rcv=PIN_B1)

Ya con eso podes usar funciones como printf, imprimir flotantes ( numeros con decimales), letras (string), enteros, etc sin hacer nada, en cambio XC8 es mucho mas complicado ya que vas a tener que hacerte las funciones vos mismo, de la misma forma que lo pensabas cuando lo hacias en ASM. Ej: Si tengo un numero de 0 a 255 (123) y lo debo pasar a ASCII, en XC8 necesito crear una funcion que me lo pase a BCD, luego sumarle '0' y poner en un array terminado en '\0' asi es considerado un string "123".
Ademas en CCS si los pines definidos pertenece a algun modulo UART, utiliza el modulo, si no lo son, entonces crea una UART por software. Lo mismo es con I2C/SPI, todo así de fácil se crea.

----------------

Por mi, considero que CCS es C, pero no funciona como cualquier compilador que siga los estándar , por ejemplo vos necesitas agregar esos USE a TODOS los archivos .c, lo cual es absurdo, pero de esa forma se maneja CCS. Para cuando necesites crear proyectos con varios archivos .c, esto lleva a malas costumbres de programacion, una cosa que nunca habia entendido es porque usan include con archivos .c cuando unicamente deberian hacerlo con los .h, y esta es una razones de ello, Y me encontre con gente que cree que esta bien porque nunca tocaron algun otro compilador C.

------------------------------------------

Finalizando:

Si tu idea es crear un proyecto simple, rapido y facil, anda por CCS, solo vas a necesitar el manual y acostumbrarte a las funciones. (Prefiero el plugin de CCS para MPLAB, ya que el IDE de CCS es MALO)
Si tu idea es algo un poco mas grande, considero XC8 por no haber otra alternativa (mejor seria con: con un mejor IDE, y optimizaciones gratis). Pero es suficiente :P
« Última modificación: 22 de Abril de 2018, 23:01:40 por KILLERJC »

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Convertir sketch a ensamblador
« Respuesta #32 en: 23 de Abril de 2018, 00:48:22 »

     TRISBbits.RB0 = 0;       // Lo mismo que hacer BCF TRISB,0 , observa que no nos importa los bancos cuando manejamos C
 

He visto la luz entre las tinieblas... cuanto he sufrido con el cambio de bancos en el PIC16!!! :cry:
Solo por esto creo que merece pasarse a c


Si tu idea es crear un proyecto simple, rapido y facil, anda por CCS, solo vas a necesitar el manual y acostumbrarte a las funciones. (Prefiero el plugin de CCS para MPLAB, ya que el IDE de CCS es MALO)
Si tu idea es algo un poco mas grande, considero XC8 por no haber otra alternativa (mejor seria con: con un mejor IDE, y optimizaciones gratis). Pero es suficiente :P


Hummmm de momento, y por lo leido creo me inclino por el XC8. Consultare el precio.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Convertir sketch a ensamblador
« Respuesta #33 en: 23 de Abril de 2018, 01:00:15 »
XC8 tenes la version gratuita, que lo unico malo es no tener optimizaciones. Asi que podes usarlo tranquilamente.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Convertir sketch a ensamblador
« Respuesta #34 en: 23 de Abril de 2018, 03:22:30 »
CCS no es C estandar y te costará portar tus programas.
Además tiene librerías para facilitarte la vida, pero no son open-source como en Arduino, por lo que te costará mucho más portar la funcionalidad de sus librerías.

Viniendo del ensamblador, donde puedes ver todo el código y trabajas a bajo nivel, CCS te va a resultar demasiado alejado a tus costumbres. Es muy mala opción para empezar, te quedarás otra vez atrapado en una mala elección.


Otra cosa respecto al C. Para hacer los programas más portables puedes utilizar definiciones:
#define TRISBbits.RB1  PORT1

Y a partir de ahí solo utilizas la expresión PORT1. Si más adelante pasas a otro microprocesador (Atmel) solo tienes que cambiar la definición y todo el programa seguirá funcionando igual. Portabilidad inmediata.
No siempre es tan sencillo, pero es muy buena costumbre hacer definiciones de todo lo que sea dependiente del microprocesador.

Un saludo.

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Convertir sketch a ensamblador
« Respuesta #35 en: 23 de Abril de 2018, 21:43:18 »
Gracias de nuevo por vuestros consejos.

XC8 tenes la version gratuita

Pues ya me he descargado el XC8 y lo estoy manejando un poco mientras leo los manuales de microchip.

A primera vista:

1) Lo de no preocuparse de los bancos de memoria se agradece bastante.
2) Parece que en el c los delays no necesitan una libreria especifica, con solo escribir __delay_ms() ya tengo mi retardo.
3) Uno de los rompecabezas (para mi) del asembler son las operaciones matematicas, pero, en c parecen mas faciles.
4) En c parece que desaparecen el "call" y el "goto". Esto me tiene un poco perdido pero todo sera acostumbrarse.
5) Dentro del programa tambien se puede meter trozos en asembler con #asm y #endasm.

Acabo de empezar y tengo montones de dudas y preguntas pero ya las escribire en otra parte, no este sub-foro que realmente es de arduino jejejeje

Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Convertir sketch a ensamblador
« Respuesta #36 en: 23 de Abril de 2018, 22:27:15 »
Pregunta todo lo que necesites.

Respecto a esto:

Citar
4) En c parece que desaparecen el "call" y el "goto". Esto me tiene un poco perdido pero todo sera acostumbrarse.

Los CALL es lo mismo que llamar a una funcion.. Ejemplo

Código: C
  1. // Aca es tu vector de Reset, tu vector de reset llama siempre a una funcion con el nombre main, como un GOTO MAIN puesto en 0x00, luego haces lo MISMO que en ASM
  2. // Configuras tus modulos, tenes un loop infinito y dentro del loop haces lo tuyo
  3. void main(void)
  4.     // Aca configuracion
  5.  
  6.     //Loop infinito, como en ASM
  7.     while(1)
  8.     {
  9.        // Lo mismo que si hubiera hecho CALL funcion1
  10.         funcion1();
  11.     }
  12.  
  13. void funcion1(void)
  14. {
  15.    __delay_ms(500);
  16.    PORTBbits.RB0 ^= 1;  // Esto es lo mismo que hacer PORTBbits.RB0 = PORTBbits.RB0 ^ 1  , XOR con 1, es decir invertimos ese bit
  17.    // Y aca hay un RETURN escodido, asi que tampoco te preocupas por el RETURN
  18. }

Respecto de los GOTO, lo tenes en C, pero no deberias usarlo, tenes muchas formas de dirigir el flujo, con if..else,for,switch,while,do..while
El unico uso valido que le encuentro al goto en C es salir de varios for anidados.

Citar
5) Dentro del programa tambien se puede meter trozos en asembler con #asm y #endasm.

Es cierto, pero no deberias utilizarlo tampoco, a no ser algun caso extremo.

Desconectado Fabri Olivari

  • PIC10
  • *
  • Mensajes: 21
Re:Convertir sketch a ensamblador
« Respuesta #37 en: 25 de Noviembre de 2019, 00:42:41 »
Hola, lo que puedes hacer si quieres cargar el codigo de arduino en un PIC, es cargarle al PIC el FLASH PINGUINO, lo que este soft te permite es programar los pics, igual que un arduino. Te paso un LINK de la instalacion, solo tenes que buscar algunos tutoriales, al verdad que es muy facil.


Mirate esos videos son muy buenos...

Desconectado muyfeo

  • PIC10
  • *
  • Mensajes: 1
Re:Convertir sketch a ensamblador
« Respuesta #38 en: 02 de Septiembre de 2021, 18:45:39 »
Hola  a todos.
Me parece una lástima que el tema principal de este hilo se haya perdido. Yo entiendo que resulta mas fácil programar en C pero también debemos aceptar que los microcontroladores tienen restricciones que exigen en ocasiones programación a bajo nivel.
 
Actualmente estoy revisando el programa que hace un sketch vacío en Arduino y recién me entero que sin usar ningún recurso, es decir, tanto el setup() como el loop() sin código, genera un archivo en ensamblador que utiliza el timer 0 y el timer 1 cuando el objetivo es el ATtiny85.

Estaba buscando información al respecto y me encontré este hilo, en el que, en lugar de dar solución a la pregunta que hizo quien empezó el tema, terminaron consiguiendo salir por lo fácil y abandonar el tema.

En lenguaje C es posible ejecutar ensamblador y es muy fácil. Basta con usar

asm ("in R16,P0");

Donde, se pone entre comillas aquello que está en ensamblador.

Si me alguien me pregunta: ¿para qué usar ensamblador?, le respondo fácil: por la misma razón que en lugar de usar un core i5 estoy usando Arduino: Porque el problema que resuelve es diferente y en nivel de complejidad del problema se ajusta a uno y no al otro lenguaje. Esto lo puedo mostrar con un ejemplo: en C yo puedo hacer uso de multiples librerias de las que desconozco cómo hacen uso del núcleo y de la memoria del controlador. Si quiero usar un temporizador con  exactitud de microsegundos (analizador de señal, por ejemplo), y ya tengo las librerías de comunicaciones, mido el tiempo en millis() y además tengo ciclos de espera que no usan interrupciones, Arduino se va a comportar de forma inesperada y nunca voy a entender porqué, pues las bibliotecas son una caja negra que son fáciles de usar de manera individual pero suelen ser bastante incompatibles cuando uso varias en un solo programa.
Podría dar mas razones para usar ensamblador, como el empleo de arduino en tiempo real, con modos sleep para bajo consumo de energía, modificación de las resistencias de pull up, expansión de puertos mediante hardware externo, etc ... pero creo que con esto al menos es suficiente para visualizar la oportunidad de aprendizaje que nos perdemos por el solo hecho de despreciar lo desconocido en nombre de la facilidad.
A medida que avance en el tema, les dejaré por aquí algunos ejemplos de lo que se puede hacer en ensamblador desde arduino y lo útil que puede llegar a ser combinar C con ensamblador.
Hasta pronto.

Desconectado gustavopic

  • PIC18
  • ****
  • Mensajes: 417
Re:Convertir sketch a ensamblador
« Respuesta #39 en: 11 de Septiembre de 2021, 11:22:57 »
Sin duda lo mejor es empezar con el c.
Es un lenguaje con muchos detalles y sintaxis no sencilla. Además te costara quitarte alguna costumbre como el goto.
Pero en dos o tres dias puedes aprender lo suficiente como para manejar las estructuras más habituales.

Si te sientes más seguro, en c se pueden incluir instrucciones en ensamblador y con Atmel es más sencillo el ensamblador que con pic. Por eso tiene compilador gcc mientras que el pic no lo tiene.

Un saludo.

disculpa, yo aprendi el lenguaje de arduino , y para mi lo inmensamente mas importante es que te LIBERA de tener que pescar cada detalle de ASM, si vas a programar en ASM  no puedes olvidar definir ningun bit de todos esos que definen cada cosa al iniciar.
si algo te olvidas >> probelmas.
luego al programar, pues cada paso  debes tener en cuenta, cada definicion, cada palabra, cada asunto de si saltas, o de si haces algo guardar lo que sea necesario.
el tema de arduino te libera de muchisimos temas, claro que a la vez te quita cosas , como poder elegir el oscilador, o te toma algun timer.
pero ademas de la sintaxis,  de una instruccion que en asm serian muchas , de palabras que no debes preocuparte... te evitas tener que aprender toda la dataheet de el micro...
 la diferencia es abrumadora.
pór lo menos es lo que yo vivi.

un saludo
« Última modificación: 11 de Septiembre de 2021, 22:53:52 por gustavopic »


 

anything