Diferencia entre Arduino y programar en lenguaje Asm o en C

#1
hola, miren, tengo a un conocido que me pregunto esto, puesto que tenia interes en hacer algun curso de aprendizaje.

queria saber que es y a que le sirve, las diferencias entre programar en C o en ASM como asi tambien en arduino.
y yo no se que decirle.

gracias
 

Dr. Zoidberg

Well-known-Papá Pitufo
#2
Decile que aprenda a programar en C, y va a saber programar Arduino, PIC, Atmel y todo lo que se le ocurra.
 
#3
Hola, Arduino es una plataforma que posee el mínimo hardware periférico cómo para funcionar a nivel básico.
El ASM, es un lenguaje de programación de bajo nivel. Posee un conjunto de instrucciones en sintaxis "amigable" para no tener que escribir en binario. Posee un control completo del hardware.
El lenguaje C, es un sistema con un nivel mayor al ASM, es el más utilizado, ya que soporta funciones y librerías, que permite una redacción rápida de un programa. Pero no tiene un completo control del hardware cómo el mencionado ASM.
 
#4
yo pienso que si sabes usar bien C puedes hacer uso del hardware como si se tratara de ASM.

ASM no lo uso ni de chiste solo para cuando jugaba con el extinto Z80.

ASM es un conjunto de instrucciones bastante rudimentario y hacer una simple condicion pregunta tipo if
debes hacer uso repetitivo de instrucciones de suma o resta segun sea el caso y ver si se activa una bandera del CPU, algo bastante rudimentario

Arduino es la sopa instantanea de la electronica, haces muchas cosas con solo usar funciones que no sabes como estan construidas ni quien las hizo solo sabes que funciona y punto, el hardware no te preocupas de nada solo es una plaquita que alguien hizo no tienes idea de nada solo de conectar y se acabo.
 
#5
Para explicártelo de hecho en Arduino aplicas las 3 pero en distintos niveles, en primera el lenguaje Arduino se basa de Wiring que se basa en Processing que en realidad se apoya sobre Java, sin embargo, los MCU no se programan en Java, el lenguaje Arduino por lo tanto es en realidad un conjunto de librerías que causa la abstracción del lenguaje y tras esa bonita capa de librerías en realidad se programa en C/C++, sí, C++, ya que Java es un lenguaje orientado a Objetos, y por lo tanto Wiring y Arduino también, por ello se usa C++ como intermediario tras toda la capa maquillada por el "lenguaje" Arduino, detrás de eso el compilador en realidad toma el código en C/C++ y lo traduce al equivalente de ensamblador para luego volverlo código maquina. el ensamblador es un lenguaje de bajo nivel y el más directo al código maquina, cada instrucción tiene su equivalente binario de una palabra de programa y es la forma humana simple de ver el código que para la CPU solo son 1's y 0's.

En resumen cuando programas en lenguaje Arduino en realidad usas.
Capa de abstracción del lenguaje Arduino -> Librerías en C/C++ -> librerías especificas en ASM cuando se requieren -> Código maquina.

La diferencia es que entre más capas elimines a tu programa más control tienes de cada ciclo de reloj y optimizas mejor la aplicación, claro, eso mientras programes correctamente.

Como el Lenguaje Arduino depende de las librerías de abstracción es más simple de aprender, pero si no han hecho una librería adecuada para determinado componente o característica te topas con el muro, ahí ya debes crear la librería en C++ con sus correspodientes archivos .cpp y .h, también requieres más conocimientos del hardware físico a programar. En cambio ASM se usa en aplicaciones donde cada ciclo de reloj es critico aprovecharlo, pero generalmente basta con configurar el compilador para que calcule correctamente desde C delegándolo a funciones como delays con cuentas a nivel ciclo de reloj y otras operaciones especiales.
 
#6
El assembler, siempre sirve, te permite hacer cosas que con C no se puede, debido a lo que explico Roberto, tiene un completo nivel del hardware, y es muy común utilizar ambos para complementarse, como por ejemplo rutinas de retardo, en los proyectos que nosotro hicimos, hicimos todo un sistema, eficiente para los retardo y se hicieron assemmbler.
Para la inmensa mayoría de las cosas con C te sobra, pero si aprendes y dominas el assembler tenes el control total de tu micro
 
#7
Si la misión del Arduino es gestionar las entradas y salidas, las interrupciones o eventos, como pulsar un botón o leer un sensor, y usar aritmética entera, pues hay pocas diferencias entre C y ensamblador (en cuanto a número de líneas).

Otra cosa es si necesitas usar aritmética en punto flotante, o necesitar una estructura compleja (como una lista enlazada o árbol binario), en cuyo caso es mejor usar C.

El discutir entre C y ensamblador... da lugar a interesantes descubrimientos de cómo el compilador traduce código C a código máquina.
 
Última edición:
#8
A mi me gusta mucho tanto C como Assembler, y reconozco que uso C más cuando programo algoritmos o programas para CPUs, o cuando para una MCU que no conozco en profundidad (porque básicamente si tienes muchos ejemplos en C que hacen algo parecido a lo que quieres, es más rápido modificar un ejemplo para que haga lo que quieres, que hacer entero el código).

Pero si quiero que un programa funcione EXACTAMENTE como espero de él, prefiero el ASM. Quizá es más jaleo a la hora de programar, pero después tengo menos dolores de cabeza a la hora de arreglar cosas, y es porque en C se produce un efecto que no se produce en ASM y es el "Lost in translation". Por supuesto, si conoces todas las idiosincrasias del compilador en C, puedes sobrellevar el asunto bastante bien pero de vez en cuando aparece algún imprevisto, que no aparecería si se escribiera directamente en ASM.

Supongamos una instrucción sencilla para codigo en PIC:

Código:
if (VAR.5==TRUE) PORTB.3=0; else PORTB.3=1;
Una forma de traducir esto por algún compilador para optimizar el tiempo de ejecución sería:

Código:
	BSF PORTB,3
	BTFSC VAR,5
	BCF PORTB,3
Este código es muy rápido, pero es un desastre, porque asume primero el "else" y luego cambia la condición si se cumple el "if". Esto implica que aunque sea por unos nanosegundos, PORTB.3 va a presentar un pulso de nivel alto. Un compilador podría usar esta optimización cuando se trate de variables internas, que no manejen ningún tipo de hardware, ya que por ejemplo si en lugar de PORTB.3 se tratara de ADCON0bits.GO, el ADC siempre se accionaría ya que basta sólo una escritura de ese bit a 1 para que el ADC comience. Incluso con variables internas se podría dar el caso de que una interrupción saltase entre la primera y segunda instrucción, causando un estropicio.

Lo habitual sería encontrar esta forma en la mayoría de compiladores:

Código:
	BTFSC VAR,5
	BCF PORTB,3
	BTFSS VAR,5
	BSF PORTB,3
Aquí el bit 3 de portB nunca asume un valor, de forma que cambiaría de estado acorde con la condición del "if" y no antes del "if".

Pero no es la más adecuada en algunos casos. Esta es la forma que traduce la ejecución tal cual la leemos en el código en C, pero una ejecución de una sentencia "if" es simultanea, es decir, no se ejecuta primero la condición "if" y luego la condición "else", sino que o se ejecuta el "if", o en el mismo tiempo que se ejecutaría el "if" se ejecuta el "else". Esto en un bus de comunicaciones puede suponer una diferencia de fases en los pulsos que haga perder la comunicación, o introducir un error de magnitud en una modulación PWM, etc.

La forma más lenta, que según que casos sería la más correcta, sería esta:

Código:
	MOVF PORTB,W
	BTFSC VAR,5
	ANDLW 0xF7
	BTFSS VAR,5
	IORLW 0x08
	MOVWF PORTB
PORTB.3, si cambia, lo hace en el mismo instante sin depender de la condición, respetando el tiempo de ejecución.

Curiosamente la optimización primera ahora se podría hacer, ya que W es un registro interno que no se ve afectado por el hardware, ni debería verse afectado por las interrupciones. Así este código sería viable:

Código:
	MOVF PORTB,W
	IORLW 0x08
	BTFSC VAR,5
	ANDLW 0xF7
	MOVWF PORTB
En resumen, una simple sentencia de C, puede traducirse por el compilador de varias maneras, y dependiendo del caso unas pueden ser más apropiadas que otras (para encender o apagar un LED, no tiene mayor importancia si se usa la primera de todas).
 
#9
disculpen.............pero me siento como que le pregunte a los 3 chiflados para donde queda :



seguro es culp amia que desconozco esto.
pero entonces, arduino no tiene ventaja alguna ?
 

Adjuntos

#11
Para la gente que debate entre C++ y ASM para el procesador 328 que trae el arduino, Traten de hacer un sistema de tiempo real en el con C++ y veran que no les cabe por la mayoria de librerias y codigo adicional que el compilador introduce. Aganlo en ASM y perfecto (ya que tienes todo el control del codigo que genera), .... a mi me gusta mejor usar loscontroladores PICs ... por el precio ... 4 a 16 veces más barato para el mismo control (Nadie supera los 54 centavos US dolar del PIC16F54). Con el hasta 8 tareas diferentes realizado en 18 variables RAM y 2K Flash .. incluyendo transmisión y recepción serie por software.

Actualización: El free RTOS trae una adaptación para usarlo en el Arduino, lo acabo de bajar y voy a ver que tanto puedo hacer con él. Por lo pronto la definición de tareas, prioridades, semaforos, etc. se ven faciles de realizar.
 
Última edición:
#12
Hola
disculpen.............pero me siento como que le pregunte a los 3 chiflados para donde queda :
seguro es culp amia que desconozco esto.
pero entonces, arduino no tiene ventaja alguna ?
Bueno entonces con mi respuesta., me adjudicaria el lugar de el cuarto "chiflado" ., !!! y no existe ¡¡¡​
Vamos a lo primero ., si queres usar arduino ., estan fabricados casi todos con MICROS atmega (atmel)​
Lo segundo ., si tu duda es sobre ASM ., C y por supuesto C++ (arduino) ., entonces decidirias ., cual es mejor para tu conveniencia​
Y por tercero ., ya que tu duda es ¿¿¿ cual lenguaje usar ??? ., yo te diria que usaras un compilaldor que tenga los tres​
El unico que te serviria ., es el AVRstudio7 ., que es de atmel​
Es totalmente gratuito ., y con soporte libre AVRFREAKS​
Si te remitis a la hoja de datos del micro que pretendas usar ., tenes ejemplos de funciones tanto en ASM o C​
Ahora el unico compilador que conozco ., que tiene las tres funciones ASM ., C y C++ (arduino) ., es el AVRstudio7​
Y tambien con algo que "talvez" suceda ., que me contaron en el foro AVR ., como atmel fue comprada por pic (MICROCHIP)​
Se esta gestando la idea ., que se funcionen los compiladores ., se tendria en uno solo ., los micros mas usados : PIC ., AVR y ARM​
Espero que allas entendido algo ., sino tendremos que pidirles que nos expliquen mejor a Moe ., Curly y Larry​
 
#13
Arduino queda en que se programa en un C levemente simplificado, y en qué las placas vienen montadas por precios de risa.
Pero su verdadero punto fuerte es que hay una inmensa comunidad detrás que ha hecho funciones y librerías para todo lo que imagines, y también para bastantes cosas que no imaginas. La segunda parte es la calidad de esas librerías, porque no todas están programadas con cabeza, pero si que te pueden sacar de un apuro.
Otra ventaja es que te bajas el IDE y a los diez minutos ya estás haciendo tus programas modificando los ejemplos que lleva.

Si fuese a fabricar mil unidades de algo, diseñaría el PCB, buscaría que micro usar (hay vida más allá de los pic) y miraría en que lo programo, seguramente en C.
Si voy a hacer series cortas o incluso únicas saco un arduino de un cajón y a correr, ni lo pienso.

 
Última edición:
#14
disculpen.............pero me siento como que le pregunte a los 3 chiflados para donde queda :

seguro es culp amia que desconozco esto.
pero entonces, arduino no tiene ventaja alguna ?
C: Arduino se programa fácil.

ASM: Se programa más difícil. Incluso a veces muy difícil. Pero controlas cada byte que metes en la memoria del Arduino.

Arduino: es una (muy) pequeña placa de prototipado que sirve para realizar montajes y aplicaciones electrónicas controladas por microcontrolador, por un precio muy bajo.
 
Arriba