Test de Compiladores para microcontroladores PIC de gama media

La idea de realizar esta prueba a los compiladores más conocidos para microcontroladores PIC de gama media surgió hace unos meses, en el grupo de facebook Electrónica y Microcontroladores, ante la curiosidad por comprobar si el compilador experimental PicPas era tan eficiente como suponíamos. Entendiéndose como más eficaz, el que consiga un tamaño del ejecutable menor y usar menos memoria RAM del microcontrolador.

Cuanto mayor sea esta eficacia del compilador, más sencillo y económico será el microcontrolador necesario para ejecutar el código generado.

Para poder comparar la eficiencia de los distintos compiladores (comerciales y gratuitos) a los que teníamos acceso, se utilizó un código que podríamos denominar “patrón de medida“, mucho más complejo que el usado para manejar la típica secuencia de encendido y apagado de uno o varios diodos LED que a modo de demostración suelen utilizar todos los compiladores.

El programa (patrón de medida) se debe traducir de la manera más literal posible a cada uno de los lenguajes de programación (C, Pascal, BASIC) y los “dialectos” o particularidades específicas de cada compilador, de manera que no influya en la prueba el tipo de algoritmo más o menos eficaz, o la genialidad del programador para codificarlo en un determinado lenguaje. Por eso se trata de un “programa patrón de medida“, y es el compilador evaluado el que deberá, automáticamente, generar el código ejecutable más optimizado o que menos recursos del microcontrolador requiera.

Este programa consiste en un Reloj Digital totalmente operativo y funcional, con reconocimiento de años bisiestos, corrección automática de errores en valores numéricos de ajuste manual, etc., compilado para los microcontroladores PIC16F877A (el más popular) y PIC16F84A (el “padre” de todos los PICs de la familia). Este último, sólo cuando el compilador sea capaz de generar un ejecutable de menos de 1.75 KB (su máxima capacidad de almacenamiento de programa).

Las funciones básicas del reloj las realiza de manera extraordinariamente precisa el integrado DS1307, que se comunica mediante protocolo I2C con el microcontrolador. Dispone de tres pulsadores como dispositivos de entrada, para modificar la fecha y hora del reloj, y de un display LCD como salida.

La comunicación I2C se realiza mediante software (no se hace uso del posible hardware I2C integrado en el microcontrolador), por lo que es aplicable a cualquier PIC de gama media. Se utilizan instrucciones básicas para optimizar el tamaño del código. No se hace uso de las librerías que puedan acompañar a los distintos compiladores, ya que invalidarían la prueba debido a que no se conoce su nivel de optimización, y en ese caso, lo que se evaluaría sería la eficacia de la propia librería.

Si dispone de ella, la única librería del compilador utilizada por el programa es la que contiene la instrucción de espera delay_ms() o similar, por estar muy estandarizada en todos los compiladores y generar con todos ellos un código muy similar.

Para comprobar el correcto funcionamiento de los ejecutables generados por los distintos compiladores se ha empleado el simulador de Proteus. Podemos ver la simulación en el siguiente vídeo.

Descarga de ficheros con esquema y simulación en Proteus para PIC16F877A y para PIC16F84A.


Compiladores evaluados

En este repositorio están publicados los ficheros de código fuente y ejecutables .HEX generados por cada uno de los compiladores para los microcontroladores PIC16F877A y PIC16F87A.

Los resultados obtenidos han sido los siguientes (Memoria RAM + FLASH usada = Puntuación)

PIC16F877A

NOTA: Pulsa sobre el nombre del compilador para ver el código fuente, y sobre la puntuación para ver el ejecutable .HEX

PIC16F84A

  • XC8 (pago) (RAM: 27 / FLASH: 725 words) : 752
  • PICPAS (RAM: 33 bytes / FLASH: 809 words) : 842
  • PROTON IDE (RAM: 31 bytes / FLASH: 828 words) : 859
  • PIC MICRO PASCAL (RAM: 33 bytes / FLASH: 828 words) : 861
  • CCS C (RAM: 26 bytes / FLASH: 836 bytes) : 862
  • MIKROPASCAL (RAM: 35 bytes / FLASH: 935 words) : 970
  • GCBASIC (RAM: 45 bytes / FLASH: 925 words) : 970
  • MIKROC (RAM: 37 bytes / FLASH: 973 words) : 1010
  • XC8 (free) (No válido. FLASH > 1000 words) : 1092 (máxima RAM + FLASH)
  • SDCC (No válido. FLASH > 1000 words) : 1092 (máxima RAM + FLASH)


Resultado

Para obtener el resultado se ha sumado las memoria total RAM y FLASH usada por cada compilador en los dos microcontroladores evaluados (PIC16F877A y PIC16F84A). El ganador es el que obtiene un número menor (usa menos recursos = mayor optimización).

Clasificación Final:

  1. PICPAS v.0.8.1 (GRATUITO) : 1722    <— EL MEJOR
  2. XC8 v.1.35 (DE PAGO – Versión REGISTRADA) : 1757
  3. CCS C v.5.0.74 (DE PAGO) : 1767
  4. MIKROPASCAL v.7.1.0 (DE PAGO) : 1967
  5. GCBASIC v.0.97.01 (GRATUITO) : 1968
  6. PROTON IDE v.3.6.0.0 (GRATUITO para PIC más usuales) : 1981
  7. PIC MICRO PASCAL v.2.1.4 (GRATUITO) : 2045
  8. MIKROC V.7.0.0 (DE PAGO) : 2047
  9. XC8 v.1.43 (Versión FREE – GRATUITO) : 2542
  10. SDCC v.3.6.0 (GRATUITO) : 2977      <— EL PEOR


Conclusiones

  1. PicPas ha sido el ganador, aunque a mínima distancia de otros compiladores profesionales y mucho más completos. Sus competidores en la gama gratuita serían GCBASIC y Proton IDE (aunque este no es gratis para todos los PICs)
  2. Acaba con el mito de que la versión gratuita de XC8 funciona igual que la registrada (de pago). Tal y como anuncia el fabricante, es una mala opción para trabajos profesionales. Si quieres obtener buenos resultados tendrás que registrarlo y pagar.
  3. Programar microcontroladores en lenguaje C no tiene por qué ser más eficiente que hacerlo en Pascal o BASIC.
  4. Los autores del compilador SDCC para PIC, ya advierten de que se trata de una versión preliminar con el único objetivo de que funcione correctamente, y que dejan la optimización del código generado para próximas versiones.

NOTA: Más información y comentarios originales en: Segunda Comparativa de Compiladores Frente a PICPAS.

Aprende ensamblador ARM de manera sencilla y VisUAL

Aprender, o al menos conocer, el lenguaje ensamblaje es muy importante si se desea tener una idea muy clara de cómo funciona realmente cualquier sistema informático o de control electrónico programable. VisUAL es un emulador muy indicado para aprender, de una manera muy práctica y sencilla, el lenguaje ensamblador de CPUs diseñadas con arquitectura ARM.

Además de admitir un gran subconjunto de instrucciones ARM, la CPU se emula a través de una serie de animaciones que ayudan a visualizar el flujo de datos en el microprocesador o microcontrolador emulado, incluyendo animaciones muy útiles para comprender algunas de las instrucciones más difíciles de entender, como los cambios y la manipulación de la pila de datos.

Al estar diseñado específicamente para utilizarse como herramienta de enseñanza en el Imperial College London, su Interface Gráfica de Usuario (GUI) es muy amigable, se destacan claramente todos los errores de sintaxis y se muestran ejemplos de la sintaxis correcta.

GUI probando una simple instrucción ADD con dos números.

Además, cuenta con todo aquello que se puede esperar de un emulador, como la ejecución paso a paso de instrucciones, visualización de datos o registros en diferentes ventanas, establecer puntos de interrupción, etc. Incluso advierte de la ejecución de posibles bucles infinitos.

En resumen, una excelente herramienta si deseas iniciarte en el fantástico mundo de los microcontroladores ARM.

 

Configuraciones Básicas de Amplificadores Operacionales

Configuraciones Básicas de Amplificadores Operacionales

Objetivos cumplidos durante este año. Objetivos para el nuevo año 2018

Durante este año 2107 que acaba, creo que aprobé una asignatura que tenía pendiente desde hacía muchos años, más que nada por falta de tiempo, y era la de programar microcontroladores PIC. Le di un buen repaso, y lo cierto es que me resultó muy sencillo hacerlo en ensamblador. Especialmente me gusto aprender a programar en ensamblador funciones básicas con números de 32 o más bits, como sumas, restas, división, multiplicación, funciones trigonométricas, etc. Todo en lenguaje ensamblador, lo que te hace entender el funcionamiento al nivel más bajo de cualquier microprocesador o microcontrolador. Programarlos en lenguajes C, BASIC y Pascal fue muy sencillo, y lo cierto es que, en ese sentido, aunque con sus particularidades, prácticamente todos los micros se programan de manera muy similar, por lo que entendido lo básico, en lenguaje de alto nivel, pasar de programar un micro a otro diferente tiene poco misterio.

Para el año 2018 mi objetivo es, sin abandonar los microcontroladores PIC y AVR, volver a usar núcleos 8051, ahora actualizados y libres de licencia, y empezar a programar los licenciados con arquitectura ARM. En ambos casos, buscando que no sean propiedad de un solo fabricante.

Objetivo 1: Probar microcontroladores avanzados basados en núcleos 8051. En su día me consideré un especialista en la programación del 8051 clásico de Intel y los primeros AT de Atmel. Nada más emocionante e inconfesable que participar en la programación de aquellas primeras tarjetas FunCard que decodificaban señales de TV por satélite de canales de pago. Pero ahora que la licencia de uso de los núcleos 8051 es libre y gratuita (cualquier fabricante los puede integrar en sus dispositivos, sintetizarlos en FPGA, modificarlos o mejorarlos sin pagar ningún tipo de licencia a Intel), encuentras núcleos 8051 integrados en sistemas muy complejos y microcontroladores que multiplican por 40 la velocidad de los 8051 originales. Quiero probar qué se puede hacer con ellos, y por qué se siguen usando a nivel profesional aunque no cuenten con el apoyo “publicitario” de otros micros de uso más extendidos actualmente entre el gran público.

Objetivo 2: Empezar con los microcontroladores ARM usando el STM32.

FELIZ y PROSPERO 2018!

 

Infografía resumen sobre lámparas LED

Resumen gráfico con información útil acerca de los datos más significativos que necesitas conocer sobre las lámparas LED.

InfogramaLamparasLed.jpg

¿Por qué estudiar Electrónica?

Resistencias Pull Up y Pull Down en Circuitos Digitales

Las resistencias denominadas Pull up y Pull down, muy empleadas en circuitos electrónicos digitales, no son ningún tipo de resistencia o componente electrónico especial por su construcción, se trata de resistencias comunes que reciben este nombre por su cometido dentro del circuito. Estos nombres son una forma de referirse a ellas de manera corta, a lo que tan aficionado es el mundo técnico y especialmente si se habla en inglés.

¿Qué son las resistencias Pull Up?

Las resistencias Pull-up son utilizadas en circuitos digitales para asegurar en cualquier circunstancia un nivel lógico seguro y definido en una determinada entrada o pin digital. Cabe recordar que en electrónica digital existen tres estados lógicos:

  • Alto (High): Representa la presencia de voltaje eléctrico, también llamado Uno Lógico.
  • Bajo (Low): Representa la ausencia de voltaje eléctrico, también llamado Cero Lógico.
  • Flotante (Floating): Estado de Alta Impedancia (Hi-Z). Desconectado del resto del circuito electrónico.

Sigue leyendo

Domótica Comercial para uso en hogares y pequeños negocios

La domótica ya se encuentra en el catálogo de productos que comercializan los principales fabricantes de material eléctrico. Así son los novedosos cuadros eléctricos domotizados SmartLink de Schneider. Así serán en poco tiempo todos los cuadros eléctricos, o al menos existirá la posibilidad de que lo sean a precios mucho más económicos que los actuales (lo novedoso hay que pagarlo, pero cuando se popularice, su precio será mucho más accesible). La electrónica presente ya en cualquier cuadro eléctrico industrial, superficie comercial o gran edificio de uso público, ahora también lo estará en hogares y pequeños negocios.

Principios de Funcionamiento de Sistemas Digitales y su Programación a Bajo Nivel

Se añaden a nuestra Biblioteca dos libros de distribución gratuita con los que comprender los principios en que se basa cualquier sistema digital programable. O qué es realmente lo que mueve nuestro mundo digital al margen de las abstracciones utilizadas por los programadores informáticos, que utilizando lenguajes de alto nivel pueden programarlos sin necesidad de conocer los complejos fundamentos electrónicos con que a bajo nivel se está trabajando.

Un técnico electrónico no es un programador… y debe conocer qué es realmente lo que se mueve a nivel binario.

Pero un técnico electrónico no es un programador, y aunque también programe utilizando lenguajes de alto nivel, su enfoque debe ser muy distinto, y debe conocer qué es realmente lo que se mueve a nivel binario dentro del sistema electrónico digital programable que está diseñando o utilizando.

Sigue leyendo