TODOPIC

Otros Microcontroladores / Dispositivos programables => Arduino => Mensaje iniciado por: Loudness en 19 de Abril de 2018, 10:28:56

Título: Convertir sketch a ensamblador
Publicado por: Loudness en 19 de Abril de 2018, 10:28:56
Hola a todos

Llamarme loco que lo estoy :D pero hay queda la pregunta:

Se puede pasar un sketch de arduino a ensamblador?

O un poco mas: se puede programar arduino en ensamblador?

Me vais a decir que es una locura, que no es necesario, que aprenda c...
Pero todavia no tengo valor (tiempo) para ponerme con el c y lo de utilizar un sketch o cualquier programa sin entenderlo, la verdad es que no me gusta.

Por eso quiero pasarlo a ensamblador, para comprenderlo, modificarlo y utilizarlo con seguridad e, incluso dado el momento pasarlo a un pic 8)

Espero cualquier comentario, idea o reprimenda sobre el tema

Saludos
Título: Re:Convertir sketch a ensamblador
Publicado por: elreypic2 en 19 de Abril de 2018, 10:38:34
Que tal loudness,

No conozco ningun software que lo haga de forma automatica. En el caso de arduino, en realidad es C y el compilador usado es el AVR GCC y este no genera ningun archivo ensamblador, lo compila directamente generando un archivo HEX. A excepcion de que alguien conozca algun otro compilador que genere el archivo assembler pasar de C a Assembler es un procedimiento manual lo que es muy inconveniente.
Lo mejor es programar el arduino en ensamblador, ya que este es un microcontrolador AVR así que si tienes experiencia en ensamblador para AVR no debe haber ningun problema. Para programarlo simplemente usa un programador externo como el USBasp que es super barato y listo. Cualquier arduino basado en AVR se puede programar en assembler.

saludos,

elreypic.
Título: Re:Convertir sketch a ensamblador
Publicado por: Picuino en 19 de Abril de 2018, 11:17:53
Se puede pasar un sketch de arduino a ensamblador?

Si

O un poco mas: se puede programar arduino en ensamblador?

Si

Pero todavia no tengo valor (tiempo) para ponerme con el c y lo de utilizar un sketch o cualquier programa sin entenderlo, la verdad es que no me gusta.

Por eso quiero pasarlo a ensamblador, para comprenderlo, modificarlo y utilizarlo con seguridad e, incluso dado el momento pasarlo a un pic 8)

Espero cualquier comentario, idea o reprimenda sobre el tema

Es una locura. Como no entiendes algo que te llevaría 10 horas comprender, entonces le quieres dedicar 100 horas....
 

Saludos.
Título: Re:Convertir sketch a ensamblador
Publicado por: Picuino en 19 de Abril de 2018, 11:22:23
Que tal loudness,

No conozco ningun software que lo haga de forma automatica. En el caso de arduino, en realidad es C y el compilador usado es el AVR GCC y este no genera ningun archivo ensamblador, lo compila directamente generando un archivo HEX. A excepcion de que alguien conozca algun otro compilador que genere el archivo assembler pasar de C a Assembler es un procedimiento manual lo que es muy inconveniente.

No es cierto. Si quieres, el compilador de C AVR GCC puede generar el listado en ensamblador.
Creo recordar que la opción es -fverbose-asm

Saludos.

Título: Re:Convertir sketch a ensamblador
Publicado por: elreypic2 en 19 de Abril de 2018, 11:52:30
No es cierto. Si quieres, el compilador de C AVR GCC puede generar el listado en ensamblador.
Creo recordar que la opción es -fverbose-asm

Saludos.

Gracias por la aclaracion Picuino, desconocía esa opción del AVR GCC.

elreypic.
Título: Re:Convertir sketch a ensamblador
Publicado por: Loudness en 19 de Abril de 2018, 21:26:55
Gracias por sus respuestas.


Lo mejor es programar el arduino en ensamblador, ya que este es un microcontrolador AVR así que si tienes experiencia en ensamblador para AVR no debe haber ningun problema. Para programarlo simplemente usa un programador externo como el USBasp que es super barato y listo. Cualquier arduino basado en AVR se puede programar en assembler.


Gracias elreypic, como te va?.

Antes de meterme de lleno con los pic habia estudidao un poco de AVR asi que creo que, si me pongo, podria conseguirlo.
Solamente me queda la duda si me interesa "perder" el tiempo con el assembler o empezar a estudiar c de una vez.


Es una locura. Como no entiendes algo que te llevaría 10 horas comprender, entonces le quieres dedicar 100 horas....
 

Gracias Picuino. Entendido :D. Como dije arriba mejor empezar con el c?

Saludos
Título: Re:Convertir sketch a ensamblador
Publicado por: KILLERJC en 19 de Abril de 2018, 21:46:24
O un poco mas: se puede programar arduino en ensamblador?

Voy a hacer una aclaracion, Arduino no es un microcontrolador. SI se puede programar el microcontrolador de Microchip (ex-Atmel) en el lenguaje ensamblador.
Título: Re:Convertir sketch a ensamblador
Publicado por: Picuino en 20 de Abril de 2018, 02:46:46
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.
Título: Re:Convertir sketch a ensamblador
Publicado por: Loudness en 20 de Abril de 2018, 03:04:42
Voy a hacer una aclaracion, Arduino no es un microcontrolador.

Mi explicacion no ha sido buena :oops:. Gracias por la aclaracion.

Sin duda lo mejor es empezar con el c.


Entendido. Me lo pensare en serio.

Saludos.
Título: Re:Convertir sketch a ensamblador
Publicado por: Picuino en 20 de Abril de 2018, 03:14:10
El C lo inventaron hace casi 50 años los mismos que programaron el sistema UNIX, para sustituir el lenguaje ensamblador y hacer su sistema más portable. Como puedes ver tuvieron éxito en las dos empresas.
El C es hoy por hoy y desde hace décadas el sustituto universal del ensamblador para hacer código portable. Es uno de los lenguajes más usados y más copiados por otros lenguajes (Java, JavaScript, PHP, bash, Python, etc)
Lo extraño es que no sepas C. En la mayoría de academias y facultades es obligatorio (a pesar de no ser una buena opción para empezar a programar) y lleva mucho tiempo siendo uno de los más usados:
https://www.tiobe.com/tiobe-index/

El C del Arduino a un nivel de iniciación lo aprenden relativamente rápido los chavales de 14 años en la escuela. Aunque conocer bien algunos temas es bastante complejo, lo que necesitas para sustituir al ensamblador no es tanto.

Saludos.
Título: Re:Convertir sketch a ensamblador
Publicado por: Loudness en 20 de Abril de 2018, 05:15:09
Gracias por la explicacion Picuino


Lo extraño es que no sepas C. En la mayoría de academias y facultades es obligatorio


En lo de la programacion empeze hace unos anos como hobby.
Al fijarme en los pic, el entorno MPLAB y el ensamblador eran gratuitos y, a nivel inicial, habia bastante informacion en la red asi que me decidi por este camino.
Poco a poco al intentar ahondar mas en este mundo y hacer programas un poco mas complicados, he visto que el c se impone y creo que me equivoque en la eleccion del idioma.
Aunque en mi trabajo uso el pic o el arduino para pequenos proyectos para salir del paso, este no es mi trabajo principal asi que tampoco puedo dedicarle tanto tiempo como me gustaria y, empezar a estudiar otro idioma.... me cuesta decidirme :?.



El C del Arduino a un nivel de iniciación lo aprenden relativamente rápido los chavales de 14 años en la escuela.


Alguien me comento que antes de empezar a estudiar c me metiera con el arduino, que puede ser un primer paso.
Y ademas de descargarme sckeths y librerias y hacerlos funcionar tambien escribo mis propios programas (faciliiisimos).

Pero lo de utilizar una libreria o un porgrama corta/pega sin saber lo que tiene dentro o como funciona no me gusta nada de nada.
Y al intentar comprender las librerias de arduino me rindo.

Por eso pregunte si se podian pasar a assembler. Pense que podai ser mas facil, pero al contrario, parece que se puede complicar incluso mas....

Me pongo a buscar informacion de c

Saludos
Título: Re:Convertir sketch a ensamblador
Publicado por: Picuino en 20 de Abril de 2018, 05:55:38
Al fijarme en los pic, el entorno MPLAB y el ensamblador eran gratuitos y, a nivel inicial, habia bastante informacion en la red asi que me decidi por este camino.

Siento decirte que caíste en la trampa de Microchip.  :(
Por eso Arduino lleva un Atmel. Su compilador es estupendo y es open-source (gratuito y de código abierto).


Alguien me comento que antes de empezar a estudiar c me metiera con el arduino, que puede ser un primer paso.
Y ademas de descargarme sckeths y librerias y hacerlos funcionar tambien escribo mis propios programas (faciliiisimos).

Arduino se programa en C. No existe el lenguaje Arduino, es C ni más ni menos (en realidad C++). Si empiezas con Arduino estás empezando con lenguaje C.
Lo que ocurre es que el entorno Arduino añade ciertas funciones y definiciones al C estándar, que hacen un poco más sencillo comenzar.


¿Por qué no pruebas a hacer un programa y te ayudamos? Esa es la mejor manera de comprobar si te puede valer. Prueba a aprender durante unas horas y luego decides.

Título: Re:Convertir sketch a ensamblador
Publicado por: elreypic2 en 20 de Abril de 2018, 10:09:19
Que tal Loudness,

Como bien te comenta Picuino, en realidad comenzar el lenguaje C no es tan complicado y usando las librerias y funciones que se le han agregado al entorno Arduino, la programacion se hace mas sencilla.

Yo te recomiendo que comiences a ver el lenguaje C y para ellos hay bastantes libros y recursos en linea:

https://cs.indstate.edu/~cbasavaraj/cs559/the_c_programming_language_2.pdf
http://www.dc.fi.udc.es/~so-grado/current/Varios/CursoC.pdf
https://www.amazon.com/Embedded-C-Programming-Atmel-AVR/dp/1418039594

Esto por mencionar algunos. Pero hay infinidad de recursos gratuitos en linea.

elreypic.
Título: Re:Convertir sketch a ensamblador
Publicado por: locodelafonola en 20 de Abril de 2018, 13:40:01
Hola ., bueno creo que aqui hay confucion  ., primero el lenguaje de arduino es C++ (no C)
Lo segundo ., dudo que puedas programar un arduino en ASM ., a menos que desbloques los "FUSEBIT" y borres su BOOTLADER
LO tercero es que al ser C++ ., tiene funciones "emascaradas" ., a la cuales no tienes acceso
Si usas la herramienta de compilacion gratuita ATMELstudio 7xxx ., tenes la posibilidad de programar en tres tipos de lenguaje C++ ., C y ASM
Tambien tiene la funcion de "DISSEMBLER" ., que te podria servir de guia ., para la programacion de un chip nuevo y normal en ASM  .,  sin ser arduino 
Título: Re:Convertir sketch a ensamblador
Publicado por: KILLERJC en 20 de Abril de 2018, 14:49:19
Hola ., bueno creo que aqui hay confucion  ., primero el lenguaje de arduino es C++ (no C)
Lo segundo ., dudo que puedas programar un arduino en ASM ., a menos que desbloques los "FUSEBIT" y borres su BOOTLADER
LO tercero es que al ser C++ ., tiene funciones "emascaradas" ., a la cuales no tienes acceso
Si usas la herramienta de compilacion gratuita ATMELstudio 7xxx ., tenes la posibilidad de programar en tres tipos de lenguaje C++ ., C y ASM
Tambien tiene la funcion de "DISSEMBLER" ., que te podria servir de guia ., para la programacion de un chip nuevo y normal en ASM  .,  sin ser arduino 

Hay muchas cosas que desacuerdo con eso. Pero esto no viene al caso, asi que voy a continuar con el tema.

C es un lenguaje, y C++ es otro, Picuino lo simplifico diciendo que es C ( a pesar que aclaro que es C++ ), y al menos yo los considero 2 lenguajes distintos a pesar que poseen algunas similitudes.
C le va a dar una base, y le va a permitir entender/programar cuaquier micro sin mirar atras, entonces es mi eleccion para el autor del hilo. Por otra parte si te interesa entender las librerias de Arduino vas a tener que ademas de aprender C agregar unas cuantas cosas mas, todo lo referente a clases, inheritance, overloading y no se si se me escapa alguna otra cosa.
Con un conocimiento de C mas un minimo o base de que son las cosas que nombre podrias entender las librerias de Arduino.

Por eso mismo sigo pensando que C seria la mejor opcion.

Respecto a los compiladores, en AVR no puedo proveerte informacion, pero en PIC si venis del ASM, pienso que vas a disfrutar mas usando XC8, y que vas a encontrar muy distinto que CCS por ejemplo, a pesar que este ultimo es muy lindo para alguien que comienza. Esto ya queda a tu criterio de eleccion.

Tutoriales hay bastantes en internet.
Título: Re:Convertir sketch a ensamblador
Publicado por: Picuino en 20 de Abril de 2018, 15:16:46
A ver Loudness,  que todo esto no te líe.

Arduino se puede programar en C. Nada de lo que te digan puede cambiar esto.

Ahora vamos a entrar en más detalles.
C++ es un lenguaje que simplemente añade más funcionalidad al lenguaje C. Esto significa que TODOS los programas en C se pueden compilar en un compilador de C++ pero no al contrario. Por lo tanto tu puedes programar Arduino en lenguaje C sin ningún problema en absoluto.

Dicho esto, las librerías de Arduino están programadas en C++ y aprovechan muchas características del lenguaje C++ para que el usuario vea todo sencillo. Esto se consigue a costa de hacer las librerías lentas y complejas. Así que por ahora deberías olvidarte de analizar las librerías de Arduino por dentro porque te va a complicar mucho la vida. Simplemente utilízalas sin mirar dentro o haz las tuyas propias (que es lo que yo hago muy a menudo para ganar velocidad).


También puedes programar Arduino en ensamblador sin ningún problema.
La forma simple es añadiendo las instrucciones una a una. Te puede valer para pequeños programas:
https://playground.arduino.cc/Main/AVR

La forma más elaborada es añadiendo archivos de ensamblador separados, que se enlazan posteriormente:
https://arduino.stackexchange.com/questions/46397/how-to-use-arduino-ide-to-compile-s-files?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

En ningún caso tienes que quitar el bootloader y se puede hacer sin problema desde el IDE de Arduino o desde otro cualquiera.


En cuanto al listado ensamblador del programa en C, hacerlo con el IDE de Arduino es un poco complejo. Lo más sencillo es que lo compiles por separado desde línea de comandos (puedes hacerlo con un archivo batch) con la opción de generar el listado ensamblador.

Un saludo.


Título: Re:Convertir sketch a ensamblador
Publicado por: AleSergi en 20 de Abril de 2018, 15:59:23
C a la primera....   con él podrás con los AVR o los PIC,  sin mucho esfuerzo,  una vez comprendido el lenguaje, además del lado de PIC,  tenes un compilador llamado CCS,  que abstrae fuertemente del hardware,  una especie de Arduino,  de los PICs.
Muchos de los módulos arduineros y sus librerias,  estan  portadas a C purista,  para compilarlas con AVR-GCC,  nada C++ en ellas...
La cosa es así,  aprender C,  te abre la puerta para muchisimos microcontroladores,  mejor anticiparse...  no sabemos cuanta vida les quedan a los 8bits, los 32bits, se programan C,  y ya estarías caminando por su mundillo.
Título: Re:Convertir sketch a ensamblador
Publicado por: tsk en 20 de Abril de 2018, 17:44:56
C++ es un lenguaje que simplemente añade más funcionalidad al lenguaje C. Esto significa que TODOS los programas en C se pueden compilar en un compilador de C++ pero no al contrario. Por lo tanto tu puedes programar Arduino en lenguaje C sin ningún problema en absoluto.

Bueno en realidad, hoy en día C y C++ son dos lenguajes distintos, que se pueda compilar C dentro de un programa de C++ es porque el compilador lo permite y puede manejar código hecho en C, pero no por ello C++ es una extensión de C, probablemente inició con esa idea, pero ya no se aplica.
Título: Re:Convertir sketch a ensamblador
Publicado por: Picuino en 20 de Abril de 2018, 20:39:28
Si C++ puede compilar todos los programas de C y además puede compilar otros programas, entonces C++ es igual que C con algo más.
De hecho el mismo nombre C++ viene de la sintaxis del C y significa C más uno o C añadido.

¿Por qué opinas que C++ no es una extensión del C?



https://es.wikipedia.org/wiki/C%2B%2B :
Citar
C++ es un lenguaje de programación diseñado a mediados de los años 1980 por Bjarne Stroustrup. La intención de su creación fue el extender al lenguaje de programación C mecanismos que permiten la manipulación de objetos.
Título: Re:Convertir sketch a ensamblador
Publicado por: Picuino en 20 de Abril de 2018, 20:41:32
Citar
El nombre "C++" fue propuesto por Rick Mascitti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio científico. Antes se había usado el nombre "C con clases". En C++, la expresión "C++" significa "incremento de C" y se refiere a que C++ es una extensión de C.
Título: Re:Convertir sketch a ensamblador
Publicado por: tsk en 20 de Abril de 2018, 21:48:52
Comenzó con siendo una extensión de C y de hecho se le denominaba C con Clases, pero cada uno evolucionó con su propio estándar, lo cual los separó.

De hecho puedes encontrar construcciones que son totalmente validas en C++, que parecen C, pero que no te van a compilar en C, a menos que el compilador lo permita y también en el sentido contrario.

Por ejemplo esto en ambos es válido

Código: C
  1. struct Algo {
  2. };

Pero sólo en C++ es válido

Código: C
  1. Algo algo1,algo2;
  2. void print(Algo a);

Cuando en C debe de ser

Código: C
  1. struct Algo algo1,algo2;
  2. void print(struct Algo a);

De igual forma lo siguiente es válido en C

Código: C
  1. void *ptr;
  2. int *i = ptr;

pero para que pueda compilar en C++ requieres hacerlo de la siguiente forma

Código: C
  1. void *ptr;
  2. int *i = (int *)ptr;

Si no obtienes un error

Código: [Seleccionar]
main.cpp:5:11: error: invalid conversion from ‘void*’ to ‘int*’ [-fpermissive]
  int *i = ptr;

En C++ es válido

Código: C
  1. int i(10);

Lo que en C sería el equivalente de

Código: C
  1. int i = 10;

Como vez, cada uno evolucionó por su lado, y cada uno cuenta con sus propios estándares. Se parecen, pero es un error pensar que C es un subconjunto de C++ o que C++ son extensiones para el C.
Título: Re:Convertir sketch a ensamblador
Publicado por: Picuino en 21 de Abril de 2018, 06:46:21
De igual forma lo siguiente es válido en C

Código: C
  1. void *ptr;
  2. int *i = ptr;

pero para que pueda compilar en C++ requieres hacerlo de la siguiente forma

Código: C
  1. void *ptr;
  2. int *i = (int *)ptr;

Si no obtienes un error

Depende de las opciones del compilador. Si no haces una compilación estricta no da error:

 - Tienes que ingresar para ver archivos adjuntos -


Los demás son ejemplos de C++ que no se compilan en C y en eso estoy de acuerdo desde el principio porque todos los añadidos y todos los extras que tiene C++ no compilarán en C.


A efectos prácticos, que es lo que le interesa a Loudness, todos los programas en C se pueden compilar con un compilador de C++ como el de Arduino.
Y el compilador C++ de Arduino es uno de los mejores que existen, es un port de GCC, el compilador estandar de GNU/Linux.

Un saludo.
Título: Re:Convertir sketch a ensamblador
Publicado por: locodelafonola en 21 de Abril de 2018, 11:50:47
Hola ., bueno creo que aqui hay confucion  ., primero el lenguaje de arduino es C++ (no C)
Lo segundo ., dudo que puedas programar un arduino en ASM ., a menos que desbloques los "FUSEBIT" y borres su BOOTLADER
LO tercero es que al ser C++ ., tiene funciones "emascaradas" ., a la cuales no tienes acceso
Si usas la herramienta de compilacion gratuita ATMELstudio 7xxx ., tenes la posibilidad de programar en tres tipos de lenguaje C++ ., C y ASM
Tambien tiene la funcion de "DISSEMBLER" ., que te podria servir de guia ., para la programacion de un chip nuevo y normal en ASM  .,  sin ser arduino 

Hay muchas cosas que desacuerdo con eso. Pero esto no viene al caso, asi que voy a continuar con el tema.

C es un lenguaje, y C++ es otro, Picuino lo simplifico diciendo que es C ( a pesar que aclaro que es C++ ), y al menos yo los considero 2 lenguajes distintos a pesar que poseen algunas similitudes.
C le va a dar una base, y le va a permitir entender/programar cuaquier micro sin mirar atras, entonces es mi eleccion para el autor del hilo. Por otra parte si te interesa entender las librerias de Arduino vas a tener que ademas de aprender C agregar unas cuantas cosas mas, todo lo referente a clases, inheritance, overloading y no se si se me escapa alguna otra cosa.
Con un conocimiento de C mas un minimo o base de que son las cosas que nombre podrias entender las librerias de Arduino.

Por eso mismo sigo pensando que C seria la mejor opcion.

Respecto a los compiladores, en AVR no puedo proveerte informacion, pero en PIC si venis del ASM, pienso que vas a disfrutar mas usando XC8, y que vas a encontrar muy distinto que CCS por ejemplo, a pesar que este ultimo es muy lindo para alguien que comienza. Esto ya queda a tu criterio de eleccion.

Tutoriales hay bastantes en internet.
De igual forma lo siguiente es válido en C

Código: C
  1. void *ptr;
  2. int *i = ptr;

pero para que pueda compilar en C++ requieres hacerlo de la siguiente forma

Código: C
  1. void *ptr;
  2. int *i = (int *)ptr;

Si no obtienes un error

Depende de las opciones del compilador. Si no haces una compilación estricta no da error:

 - Tienes que ingresar para ver archivos adjuntos -


Los demás son ejemplos de C++ que no se compilan en C y en eso estoy de acuerdo desde el principio porque todos los añadidos y todos los extras que tiene C++ no compilarán en C.


A efectos prácticos, que es lo que le interesa a Loudness, todos los programas en C se pueden compilar con un compilador de C++ como el de Arduino.
Y el compilador C++ de Arduino es uno de los mejores que existen, es un port de GCC, el compilador estandar de GNU/Linux.

Un saludo.
Hola ., y perdonen si "meto la cuhara donde no debo"
Yo uso avr ., desde que empece con los micros ., ASM intente aprenderlo ., pero "no doy pie con bola" ., el consultante pregunta si se puede pasar de lenguaje C++ a ASM ., para grabar un arduino
Si bien el compilador acepta librerias con extencion .C (las redefiniciones para que funcione en C++  o .CPP tiene que estar en una libreria .H) ., y tambien acepta librerias .S (ASM)
Pero aca no es el problema del lenguaje ., sino si el arduino acepta que sea de otra manera (y es lo que no seme entendio)
Si yo quisiera grabar una compilacion ( C o ASM) ., en un arduino ., no me deja marca error
Y es a eso alo que me refiero ., cualquiera de las compilaciones anteriores ya tiene el "BOOTLADER" incomporado ., y el arduino lo agrega al momento de grabarlo
Si alguno piensa que se puede grabar con otro grbador por los terminales ISP ., veran que no los deja
La proteccion logica delos FUSEBIT ., (que se graban aparte en los ATMEGA., no es igual que los PIC)
La unica manera de solucionar esto es acceder desde el compilador en la plataforma arduino y cambiarlo desde alii (fusebit)
Entonces si podemos grabar deslos terminales ISP como si fuera cualquier micro
Yo creo que la confucion se da por el tema de los lenguajes ., pero aparte de eso ., esta la limitacion que impone el propio arduino par su programacion
Si el consultante quiere compilar en ASM ., puede hacerlo ., pero sobre un micro "virgen" o bien borrar el arduino y dejarlo con la configuracion igual a uno virgen
De otra manera ., dudo que pueda hacerlo
Título: Re:Convertir sketch a ensamblador
Publicado por: tsk en 21 de Abril de 2018, 12:01:59


Los demás son ejemplos de C++ que no se compilan en C y en eso estoy de acuerdo desde el principio porque todos los añadidos y todos los extras que tiene C++ no compilarán en C.

A efectos prácticos, que es lo que le interesa a Loudness, todos los programas en C se pueden compilar con un compilador de C++ como el de Arduino.
Y el compilador C++ de Arduino es uno de los mejores que existen, es un port de GCC, el compilador estandar de GNU/Linux.

Un saludo.

Pero te desvías del estándar y es porque el compilador lo permite, pero no existe la certeza que con otros compiladores lo puedas hacer.

Lo que hace Arduino es que al compilador le agregan la opción -fpermissive, y como tiene una mezcla de liberías en C y en C++ usa tanto avr-gcc como avr-g++ al compilar las fuentes.

Es decir, todo lo que tenga terminación .cpp lo va a compilar a código objeto (.o) con avr-g++ y todos las fuentes que terminen con .c lo va a compilar a código objeto (.o) con avr-gcc y al finalizar los va a enlazar todos con avr-gcc.

Entonces, realmente no puedes decir que estás aprendiendo C y tampoco C++, estás aprendiendo un tipo de Frankenstein, porque si fuera completamente C++, no tendrías que hacer

pinMode(13,OUTPUT) y digitalWrite(13,HIGH)

Tendrias por ejemplo que declarar

DigitalOut LED(13)

Entonces LED pasaría a ser un objeto de la clase DigitalOut. Para después usarlo de la siguiente manera

LED = 0
LED = 1

Sobrecargando el operador =

o

LED.write(0)

y

LED.set()
LED.reset()
LED.toggle()

Entonces, que es lo que realmente estás aprendiendo. C con algunos conceptos que le piden prestado a C++, porque apenas estás tocando la superficie de lo que es C++.

¿Podrían haber alcanzado el mismo objetivo si hubieran usado sólo C?

Claro que sí.

¿Lo podían haber conseguido usando únicamente C++?

Claro que sí. Pero veamos los horrores de haber creado las funciones pinMode y digitalWrite para después compararlo con una seudo implementación en C++

pinMode
Código: C
  1. void pinMode(uint8_t pin, uint8_t mode)
  2. {
  3.         uint8_t bit = digitalPinToBitMask(pin);
  4.         uint8_t port = digitalPinToPort(pin);
  5.         volatile uint8_t *reg, *out;
  6.  
  7.         if (port == NOT_A_PIN) return;
  8.  
  9.         // JWS: can I let the optimizer do this?
  10.         reg = portModeRegister(port);
  11.         out = portOutputRegister(port);
  12.  
  13.         if (mode == INPUT) {
  14.                 uint8_t oldSREG = SREG;
  15.                 cli();
  16.                 *reg &= ~bit;
  17.                 *out &= ~bit;
  18.                 SREG = oldSREG;
  19.         } else if (mode == INPUT_PULLUP) {
  20.                 uint8_t oldSREG = SREG;
  21.                 cli();
  22.                 *reg &= ~bit;
  23.                 *out |= bit;
  24.                 SREG = oldSREG;
  25.         } else {
  26.                 uint8_t oldSREG = SREG;
  27.                 cli();
  28.                 *reg |= bit;
  29.                 SREG = oldSREG;
  30.         }
  31. }

digitalWrite
Código: C
  1. void digitalWrite(uint8_t pin, uint8_t val)
  2. {
  3.         uint8_t timer = digitalPinToTimer(pin);
  4.         uint8_t bit = digitalPinToBitMask(pin);
  5.         uint8_t port = digitalPinToPort(pin);
  6.         volatile uint8_t *out;
  7.  
  8.         if (port == NOT_A_PIN) return;
  9.  
  10.         // If the pin that support PWM output, we need to turn it off
  11.         // before doing a digital write.
  12.         if (timer != NOT_ON_TIMER) turnOffPWM(timer);
  13.  
  14.         out = portOutputRegister(port);
  15.  
  16.         uint8_t oldSREG = SREG;
  17.         cli();
  18.  
  19.         if (val == LOW) {
  20.                 *out &= ~bit;
  21.         } else {
  22.                 *out |= bit;
  23.         }
  24.  
  25.         SREG = oldSREG;
  26. }

Se viola el principio de no repetirse así mismo

Código: C
  1. uint8_t bit = digitalPinToBitMask(pin);
  2.         uint8_t port = digitalPinToPort(pin);
  3.         volatile uint8_t *reg, *out;
  4.  
  5.         if (port == NOT_A_PIN) return;
  6.  
  7.         // JWS: can I let the optimizer do this?
  8.         reg = portModeRegister(port);
  9.         out = portOutputRegister(port);
  10.  
  11. -------------------------------------------------
  12.         uint8_t timer = digitalPinToTimer(pin);
  13.         uint8_t bit = digitalPinToBitMask(pin);
  14.         uint8_t port = digitalPinToPort(pin);
  15.         volatile uint8_t *out;
  16.  
  17.         if (port == NOT_A_PIN) return;
  18.  
  19.         if (timer != NOT_ON_TIMER) turnOffPWM(timer);
  20.  
  21.         out = portOutputRegister(port);

Son cosas que sólo se tienen que verificar cuando se declara el pin como salida (en el constructor), por lo tanto hay configuraciones que pueden quedar alamacenadas en variables protegidas dentro de una clase de nombre DigitalOut

Así, la implementación de un supuesto write incluiría únicamente las siguientes lineas

Código: C
  1. uint8_t oldSREG = SREG;
  2.         cli();
  3.  
  4.         if (val == LOW) {
  5.                 *out &= ~bit;
  6.         } else {
  7.                 *out |= bit;
  8.         }
  9.  
  10.         SREG = oldSREG;

Hay mucha diferencia en el rendimiento, ya que no tienes que estar haciendo

Código: C
  1. uint8_t bit = digitalPinToBitMask(pin);
  2.         uint8_t port = digitalPinToPort(pin);
  3.         ...
  4.  
  5.         if (port == NOT_A_PIN) return;
  6.  
  7.         if (timer != NOT_ON_TIMER) turnOffPWM(timer);
  8.  
  9.         out = portOutputRegister(port);

Cada vez que quieres leer o escribir en el pin, además de propiciar a que el compilador optimice mejor la parte de la escritura en el pin por medio de las funciones, sbi y cbi.

Así por ejemplo un LED.set() el compilador lo podría traducir por un

Código: ASM
  1. sbi 0x08, 7

Y un LED.reset()

Código: ASM
  1. cbi 0x08, 7

Esto es porqué, el avr-gcc, es demasiado inteligente para saber que

Código: C
  1. PORTC |= 0B10000000;
  2. PORTC |= 1<7;

es el equivalente a querer un sbi 0x08, 7

Código: C
  1. PORTC &= 0B01111111;
  2. PORTC &= ~(1<7);

es el equivalente a querer un cbi 0x08, 7
Hola ., y perdonen si "meto la cuhara donde no debo"
Yo uso avr ., desde que empece con los micros ., ASM intente aprenderlo ., pero "no doy pie con bola" ., el consultante pregunta si se puede pasar de lenguaje C++ a ASM ., para grabar un arduino
Si bien el compilador acepta librerias con extencion .C (las redefiniciones para que funcione en C++  o .CPP tiene que estar en una libreria .H) ., y tambien acepta librerias .S (ASM)
Pero aca no es el problema del lenguaje ., sino si el arduino acepta que sea de otra manera (y es lo que no seme entendio)
Si yo quisiera grabar una compilacion ( C o ASM) ., en un arduino ., no me deja marca error
Y es a eso alo que me refiero ., cualquiera de las compilaciones anteriores ya tiene el "BOOTLADER" incomporado ., y el arduino lo agrega al momento de grabarlo
Si alguno piensa que se puede grabar con otro grbador por los terminales ISP ., veran que no los deja
La proteccion logica delos FUSEBIT ., (que se graban aparte en los ATMEGA., no es igual que los PIC)
La unica manera de solucionar esto es acceder desde el compilador en la plataforma arduino y cambiarlo desde alii (fusebit)
Entonces si podemos grabar deslos terminales ISP como si fuera cualquier micro
Yo creo que la confucion se da por el tema de los lenguajes ., pero aparte de eso ., esta la limitacion que impone el propio arduino par su programacion
Si el consultante quiere compilar en ASM ., puede hacerlo ., pero sobre un micro "virgen" o bien borrar el arduino y dejarlo con la configuracion igual a uno virgen
De otra manera ., dudo que pueda hacerlo

De hecho con avrdude puedes subir cualquier programa al arduino usando el bootloader de arduino, por lo que no lo tienes que borrar el micro antes.
Título: Re:Convertir sketch a ensamblador
Publicado por: planeta9999 en 21 de Abril de 2018, 12:20:02
Si el consultante quiere compilar en ASM ., puede hacerlo ., pero sobre un micro "virgen" o bien borrar el arduino y dejarlo con la configuracion igual a uno virgen [/left]
De otra manera ., dudo que pueda hacerlo


No tiene porque estar en estado virgen el microcontrolador para poder grabarle un programa compilado desde un fuente en ensamblador, se puede cargar perfectamente desde el bootloader, da igual el lenguaje en el que estuviera el fuente.

La única diferencia entre un programa compilado para cargarlo por un bootloader o no, es la dirección de arranque del programa. En C eso lo puedes configurar en el Linker Script, y es probable que también lo puedas hacer igual si el fuente está en ensamblador, ya que eso afecta solo al proceso de enlazado, no al de compilación.

Otra cosa, es localizar donde narices esconde Arduino los linker script, para modificarlos a tu antojo, a mi me costó lo suyo encontrarlos para los Teensy (que usan Arduino), así puedo compilar para cargar mis programas sobre un Kinetis que instala mi propio bootloader encriptado, cuando es para dárselo al cliente, o sin bootloader ni encriptación durante la fase de  desarrollo. Los menús de Arduino, los tengo modificados para poder elegir entre compilar o no para mi booloader, lo único que hace es elegir uno u otro linker script.

Arduino es un entorno muy oscuro, buena parte de su infraestructura está escondida, por eso no es nada recomendable para alguien que quiera aprender con intención de poder abrirse a cualquier otro entorno que respete un estandard, como es ARM. Es lo mismo que esos entornos basados en diagramas de flujo, te quedas atrapado en un mundo propietario del que no puedes salir, con sus reglas y sus limitaciones, que son muchas, con nula portabilidad.  Mucho mejor optar por micros basados en ARM, como STM32, NXP Kinetis, LPC, Atmel SAM y otros.
Título: Re:Convertir sketch a ensamblador
Publicado por: Picuino en 21 de Abril de 2018, 13:57:06
tsk:
Estoy de acuerdo con que las funciones de Arduino son lentas y se pueden optimizar mucho más.
De hecho lo que suelo hacer yo es escribir directamente el pin que me interesa con una sencilla orden. Si quiero activar el pin4:
   PORTD |= (1<<4);
Si quiero apagarle:
   PORTD &= ~(1<<4);

https://www.arduino.cc/en/Reference/PortManipulation
https://upload.wikimedia.org/wikipedia/commons/thumb/c/c9/Pinout_of_ARDUINO_Board_and_ATMega328PU.svg/800px-Pinout_of_ARDUINO_Board_and_ATMega328PU.svg.png


Pero estas órdenes están llenas de complicaciones para alguien que comienza, así que en Arduino se pueden utilizar las órdenes:
   digitalWrite(4, HIGH);
   digitalWrite(4, LOW);
y todos tan contentos.


Yo creo que si Loudness quiere aprender C, ha quedado claro que en el foro conocemos bien el lenguaje y estamos dispuestos a ayudarle.

Lo único que queda es que comience a programar y a preguntar dudas para que se las podamos resolver.



Un saludo.
Título: Re:Convertir sketch a ensamblador
Publicado por: Picuino en 21 de Abril de 2018, 14:12:22
Arduino es un entorno muy oscuro, buena parte de su infraestructura está escondida, por eso no es nada recomendable para alguien que quiera aprender con intención de poder abrirse a cualquier otro entorno que respete un estandard, como es ARM. Es lo mismo que esos entornos basados en diagramas de flujo, te quedas atrapado en un mundo propietario del que no puedes salir, con sus reglas y sus limitaciones, que son muchas, con nula portabilidad.  Mucho mejor optar por micros basados en ARM, como STM32, NXP Kinetis, LPC, Atmel SAM y otros.

Planeta, eso hay que matizarlo. Para alguien que no conozca nada de Arduino puede dar una impresión falsa.

1º Arduino es de código abierto. TODOS los fuentes están disponibles y no existe NINGUNA restricción para leer, modificar o distribuir los ficheros fuentes originales o modificados. Es por completo Open-Source.

2º La infraestructura no está escondida, simplemente no aparece en los menús de usuario porque estos están dirigidos a usuarios inexpertos a los que no les interesa nada lo que hay por debajo. Pero todas las librerías que busques las puedes encontrar en su directorio de instalación, en código fuente (no compilado).

3º Todo el código de Arduino está escrito en C o en C++ estandar y puedes portarlo sin problemas a otras plataformas. Es open-source, así que no tendrás ningún problema. No estás atrapado por nada.


A partir de aquí es cierto que si utilizas mucho las librerías de Arduino, tienes el problema de que en otros entornos no están disponibles y tendrás que portarlas tú mismo a mano si quieres utilizarlas. Por otro lado ya hemos visto que estas funciones y librerías están hechas para facilitar la vida a los principiantes y son muy lentas e ineficientes.
Otro problema que puedes encontrar es que las librerías tienen muchos comentarios en el código, pero no existen manuales para hackearlas (se supone que un usuario inexperto no lo necesita), así que si quieres modificarlas como ha hecho planeta, te tocará leer unos cuantos ficheros fuentes hasta entenderlo y poder modificarlo.
Pero esos son los únicos fallos de Arduino y los está comentando alguien experto que ha decidido modificar los fuentes de Arduino y lo ha conseguido hacer de forma completamente legal. El único problema consiste en que ha tardado más tiempo de lo que esperaba, por falta de manuales.
Título: Re:Convertir sketch a ensamblador
Publicado por: tsk en 21 de Abril de 2018, 15:02:18
2º La infraestructura no está escondida, simplemente no aparece en los menús de usuario porque estos están dirigidos a usuarios inexpertos a los que no les interesa nada lo que hay por debajo. Pero todas las librerías que busques las puedes encontrar en su directorio de instalación, en código fuente (no compilado).

3º Todo el código de Arduino está escrito en C o en C++ estandar y puedes portarlo sin problemas a otras plataformas. Es open-source, así que no tendrás ningún problema. No estás atrapado por nada.

Si estás atrapado por algo, las Licencias. Puedes verlo como una trampa o no dependiendo de los objetivos que tengas.

El core de Arduino está en LGPL (sin ninguna excepción), por lo que al distribuir el sistema, tienes la obligación de incluir el código objeto (.o) de tu aplicación y con las instrucciones y/o mecanismos para que lo pueda re enlazar con otras librerías, que por lo general serían actualizaciones. Hay otras librerías, como la que maneja las tarjetas SD que está bajo GPL 3 y tienes que liberar el código fuente de tu aplicación, a menos que te quieras ver inmerso en problemas legales.

El año pasado, el creador de la librería SdFat le cambió la licencia por MIT, pero aun en la versión 1.8.5 que se puede descargar y la versión nightly, todavía no hay ningún cambio, siguen usando la versión que está licenciada bajo GPL 3. La GPL3 era un impedimento para que las librerías SD se pudieran licenciar en otros términos distintos.

Aquí está la versión que están en MIT.

https://github.com/greiman/SdFat

Y aquí está el commit del cambio de Licencia

https://github.com/greiman/SdFat/commit/e4190e50a4ed83c73fb046b7fce2694e8cfe2ddb  (4 de Octubre de 2017)

Si nos vamos un poco más abajo, se requieren unas librerías que usa el mismo toolchain (avr-gcc) que son las libgcc y las avr-libc. Las primeras están en GPL3, pero con una excepción que evita que tengas que liberar el código fuente de tu aplicación, o incluso tener que entregar el código objeto de tu aplicación, y las avr-libc si más no recuerdo están bajo una licencia modificada tipo BSD, con lo cual tampoco hay problemas.

Por más principiante que seas, debes saber o te deben de informar en que te estas metiendo y al menos, por cortesía deberían de poner que licencias están involucradas.

Por ejemplo:
https://www.arduino.cc/en/Reference/SD

No hay referencia que se encuentra bajo GPL 3.
Título: Re:Convertir sketch a ensamblador
Publicado por: locodelafonola en 21 de Abril de 2018, 15:13:12
Hola ., para no seguir desviandonos del tema ., esto es lo que se pregunta en el primer mensaje
Hola a todos

Llamarme loco que lo estoy :D pero hay queda la pregunta:

Se puede pasar un sketch de arduino a ensamblador?

O un poco mas: se puede programar arduino en ensamblador?

Me vais a decir que es una locura, que no es necesario, que aprenda c...
Pero todavia no tengo valor (tiempo) para ponerme con el c y lo de utilizar un sketch o cualquier programa sin entenderlo, la verdad es que no me gusta.

Por eso quiero pasarlo a ensamblador, para comprenderlo, modificarlo y utilizarlo con seguridad e, incluso dado el momento pasarlo a un pic 8)

Espero cualquier comentario, idea o reprimenda sobre el tema

Saludos
Si bien dice que quiere aprender C ., ese no es el problema
como bien explica quiere usar la plataforma arduino para cargar compilaciones en ASM
Como dije antes .,  arduino no lo permite (aparte de tener el FUSEBIT del ISP desabilitado)
Pero si  queremos grabar una complacion ditinta a C++ ya sea ASM o C tambien no largaria error
A menos que borramos el chip y dejaramos los fusebit de fabrica ., por el simple hecho de que cuando el compilador arduino ., compila el sketch se agrega el BOOTLADER
De la misma manera lo hace el compilador en otro lenguaje (C o ASM es igual ) - Tienes que ingresar para ver archivos adjuntos -  
O sea que al momento de grabar ., nos esta grabando DOS BOOTLADER ., y alli marca error
Y si alguno piensa que no es asi ., fijencen que pines usas la interfaz arduino para grabar el atmega328p (por ejemplo)
No es solamente una cuestion de lenguaje ., sino tambien el modo en que lo hace ., y alli solo acepta C++ ., y no otro lenguaje
Título: Re:Convertir sketch a ensamblador
Publicado por: tsk en 21 de Abril de 2018, 15:54:13
El problema es que inicialmente quería saber si podía obtener el ASM de un sketch, y por lo tanto también programar una placa de Arduino en ASM. Lo cual es totalmente posible

No requiere borrar el bootloader del arduino ni resetearlo.

avrdude puede usar el bootloader de arduino como protocolo para subir cualquier binario generado, ya sea con el IDE de Arduino o sin el IDE de Arduino. No importa si lo haces en C o ASM. Lo he hecho en varias oportunidades.

Se hace con la siguiente instrucción:

Código: [Seleccionar]
avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyUSB0 -b 57600 -U flash:w:programa.hex

También arduino no agrega a tu sketch el bootloader. Con eso se eliminaría el objetivo pricipal del bootloader, además de que se tendría que sobreescribir el mismo cada vez que se suba un nuevo programa.

El bootloader puede estar hecho en C, pero le puedes subir programas hechos en ASM, C, C++, Pascal o cualquier otro que pueda generar código máquina para el microcontrolador. No importa como obtuviste el programa.hex, lo que importa es que el contenido tenga instrucciones válidas para la arquitectura del microcontrolador.

PD: También agregó que hiciéramos  comentarios y reprimendas, ergo, no nos estamos desviando del tema  :lol:
Título: Re:Convertir sketch a ensamblador
Publicado por: Loudness 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:.

Título: Re:Convertir sketch a ensamblador
Publicado por: KILLERJC 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
Título: Re:Convertir sketch a ensamblador
Publicado por: Loudness 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.
Título: Re:Convertir sketch a ensamblador
Publicado por: KILLERJC 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.
Título: Re:Convertir sketch a ensamblador
Publicado por: Picuino 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.
Título: Re:Convertir sketch a ensamblador
Publicado por: Loudness 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
Título: Re:Convertir sketch a ensamblador
Publicado por: KILLERJC 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.
Título: Re:Convertir sketch a ensamblador
Publicado por: Fabri Olivari 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...
Título: Re:Convertir sketch a ensamblador
Publicado por: muyfeo 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.
Título: Re:Convertir sketch a ensamblador
Publicado por: gustavopic 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