SDCC (Small Device C Compiler) en Windows

SDCC es un compilador Open Source distribuido bajo licencia GPL que compila código en lenguaje C para una variedad de Microcontroladores

Biblioman

9/12/20099 min read

SDCC es un compilador Open Source distribuido bajo licencia GPL que compila código en lenguaje C para los siguientes Microcontroladores: Intel 8051, Maxim 80DS390, Zilog Z80, Motorola 68HC08 y los PIC16 y PIC18 de Microchips. Es un compilador multiplataforma, por lo que lo podemos instalar en Windows, Linux y MAC. En este caso vamos a ver su instalación y uso en Windows con los Microcontroladores PIC.

Si quieres ver un ejemplo en Linux mira este tutorial.

Instalación del software necesario:

Te puedes bajar la última versión del compilador SDCC para Windows desde aquí
La instalación es como cualquier programa de Windows, se nos muestra un asistente según se muestra en la figura de abajo:

Dejaremos todas las opciones que vienen por defecto e iremos pulsando en Next hasta finalizar la instalación.

Para comprobar si la instalación se ha realizado correctamente abre una terminal (símbolo del Sistema) y escribe:

sdcc –v

Si todo ha ido bien te mostrará la versión del compilador instalado.

Además deberemos instalar gputils que es una colección de herramientas de Microchips para microcontroladores PIC. Incluye las siguientes aplicaciones: gpasm, gplink y gplib. También es Open Souce y se distribuye bajo licencia GNU. Puedes descargar la última versión desde aquí.

La instalación es también a través de un asistente y al igual que con la instalación del compilador dejaremos todas las opciones por defecto hasta finalizar la instalación:

La forma que el usuario tiene de interactuar con el compilador SDCC es por medio de comandos a través del símbolo del sistema, por lo que necesitaremos también un editor de texto para escribir el código fuente de nuestros programas, podéis utilizar cualquiera, incluso el bloc de notas de Windows pero yo prefiero usar Notepad++

Para ver cómo interactúan estas herramientas entre sí, mira el siguiente diagrama:

Como veis en el diagrama, al final del proceso tendremos tres archivos el .hex es el que utilizaremos para cargarlo en el PIC por medio de un programador para PIC, el .cod es un fichero que sirve para simular nuestro código con un simulador para PIC de código abierto llamado GPsim, este software está disponible tanto para Linux como para Windows, te puedes bajar la última versión para Windows ya compilada desde aquí

Y el .cof nos sirve para simular los programas con Proteus

En este caso, nosotros utilizaremos el .cof, para simular el ejemplo con proteus.

Pues bien, sabiendo ya los programas que necesitamos y teniendo el esquema de cómo interactúan entre ellos, vamos a ver un ejemplo completo y su posterior simulación con proteus.

El ejemplo que vamos a ver es el clásico parpadeo de un led, para ello vamos a utilizar el pic 16f877.

Empezamos lanzando nuestro editor de textos favorito para escribir el código fuente de nuestro programa, como he dicho antes a mí me gusta utilizar Notepad++

Comentario del código fuente
  • #include <pic16f877.h>

El código empieza como cualquier programa en C incluyendo los archivos de cabecera por medio de la directiva #include, en nuestro ejemplo incluiremos el archivo pic16f877.h donde están definidos los identificadores de los registros del PIC seleccionado. Como veis está dentro de los símbolos <>, esto es para indicarle al compilador que busque el archivo en el directorio definido por defecto. En mi caso este archivo está en: C:\Archivos de programa\SDCC\include\pic. Decir que los archivos de cabecera están separados en dos carpetas diferentes: para los micros pic14 que son los que empiezan por 16fXXX y para los pic16 que son todos los que empiezan por 18fXXX, en este último caso se encuentran en C:\Archivos de programa\SDCC\include\pic16. Es interesante, por no decir imprescindible editar estos archivos para ver su contenido y saber el nombre de los identificadores que corresponde con cada registro del PIC, para poder llamarlos en nuestros programas y poder operar con ellos, otro documento que conviene tener a mano es el datasheet del pic, el del pic16f877 lo tenéis aquí

  • typedef unsigned int word;

word at 0x2007 CONFIG = XTOSC & WDTOFF & PWRTEOFF & BODENON &

LVPON & CPDOFF & WRTENABLE_ON & DEBUGOFF & CPOFF;

Palabra de configuración del PIC, en ella configuramos datos como el tipo de cristal utilizado, activación o no del perro guardián (WDT), etc. Por si alguien no lo sabe, esto se puede hacer en el propio código fuente, como es el caso, ó hacerlo por medio del software del programador del PIC que utilicemos para cargar el archivo .hex a nuestro Pic.

  • void delay_ms(long ms)

Esta es una simple función para producir un retardo, no es muy precisa pero nos basta para obtener el efecto de parpadeo del led.

  • void main()

Como cualquier programa en C, la función main es la función principal del programa y contiene las siguientes instrucciones:


TRISB1 = 0; con esta instrucción defino el PIN RB1 del pic como salida los demás quedan como entradas que es el valor que tienen por defecto. El nombre del identificador TRISB1 está definido en el archivo de cabecera, por eso es importante editarlo para saberlo.

RB1=0; con esta instrucción pongo a 0 el registro RB1 del pic. El identificador RB1 también está definido en el archivo de cabecera pic16f877.h

delay_ms (250); llamo a la función de retardo y le paso como parámetro el valor de 250.

RB1=1; pongo a 1 la patilla RB1 del pic.

delay_ms (250); vuelvo a llamar a la función de retardo, para crear el efecto de parpadeo.

Una vez escrito el código fuente de nuestro programa lo guardamos en la carpeta que queramos con extensión .c, yo lo he llamado parpadeo_Led.c

Compilación del programa
Ahora llega el momento de compilar, para ello abrimos una terminal y nos vamos al directorio donde hemos guardado nuestro código fuente, con Notepad++ esto es muy rápido (en el menú de Notepad++ selecciono Ejecutar --> Open Current dir cmd ).

Una vez hecho esto ejecutamos las siguientes instrucciones en la terminal:

Primero esta: sdcc -mpic14 -p16f877 --debug -I -c parpadeo_Led.c

Y después esta otra: sdcc -mpic14 -p16f877 --debug -Wl-c -Wl-m -I -oparpadeo_Led.hex parpadeo_Led.o

Este montón de opciones que puede parecer complicado en realidad es muy fácil de utilizar. Para futuros ejemplos lo único que tienes que cambiar es lo siguiente:

-mpic14 si el pic es de la familia 16fXXX. Lo cambias por –mpic16 si el pic pertenece a la familia 18fXXX.

-p16f877 lo cambias por el nombre del dispositivo que utilices.

parpadeo_Led.c, parpadeo_led.hex y parpadeo_Led.o sustituye el nombre de estos archivos por el nombre que tú quieras darle a tus programas.

Todas las demás opciones se dejan siempre igual, si quieres saber para qué son, escribe esto en la terminal:

sdcc --help

Si el proceso de compilación ha sido correcto, SDCC nos habrá generado entre otros los siguientes archivos:

parpadeo_led.hex, parpadeo_Led.cod y parpadeo_Led.cof

Como vamos a simular el ejemplo con Proteus de esos tres archivos solo nos interesa el que termina con extensión .cof

Simulación del programa

Para simular nuestro ejemplo compilado con SDCC en Proteus primero tenemos que configurarlo:

En el menú de Proteus seleccionamos Source y hacemos clic sobre Define Code Generation Tools

Y añadimos SDCC a la lista de compiladores, según se muestra en la figura de abajo:

Ahora añadimos nuestro código fuente, para ello vamos al menú de Proteus y seleccionamos Source Add/Remove Source files…

Y añadimos nuestro archivo parpadeo_Led.c

Por último nos queda crear el esquema del circuito en Proteus y cargar en el Pic el archivo parpadeo_Led.cof

Si tienes duda de cómo cargar el archivo .cof en el PIC mira aquí

Después de esto guardamos el circuito de Proteus en la misma carpeta donde hemos guardado el ejemplo.

Y ya solo nos queda ejecutar el circuito en modo run ó paso a paso, según se muestra en la figura de abajo:

¿Qué ventajas e inconvenientes tiene el uso de este compilador?

Bajo mi punto de vista, la mayor ventaja es que se trata de un compilador Open Source, esto no solo quiere decir que sea gratis, sino que dispones del código fuente del compilador con lo que puedes editarlo y modificarlo si quieres.
Otra ventaja que le veo es que es multiplataforma, funciona en Linux, Unix, Mac y Windows por lo que no te obliga a utilizar un sistema operativo en concreto.
También al ser un proyecto libre hay un montón de librerías y ejemplos también bajo la misma licencia (GPL), por ejemplo el proyecto Pingüino utiliza este compilador, si tu quisieras podrías hacer un proyecto derivado de él y nadie te llamará pirata por hacerlo.

Otros compiladores como CCS utilizan algunas librerías con copyright, por lo que puedes utilizarlas si has comprado el programa y distribuir los .hex resultante de la compilación de tus programas, pero no puedes distribuir el código fuente de dichas librerías.

El lenguaje C que utiliza SDCC cumple más con el estándar ANSI C que otros compiladores como CCS. Por ejemplo SDCC admite la recursión de funciones y CCS no.

Una comparativa más profunda entre estos dos compiladores la tenéis aquí:

http://particle.teco.edu/software/sdcc/sdccmigration.html#convertpl

Está página es muy interesante, porque te muestra como emigrar código de CCS a SDCC por medio de un script hecho en Perl que te puedes descargar desde la propia página.

¡Ojo! no es que te convierta un programa entero hecho en CCS a SDCC, lo que te convierte son cosas como tipos de datos, palabra de configuración, directivas del procesador, etc.

Si estás utilizando Windows como sistema operativo tienes que tener instalado el interprete de Perl previamente en tu ordenador para ejecutar el script. Si tienes dudas de como instalar el intérprete de Perl y convertir los códigos fuentes de CCS a SDCC, haz la consulta en el foro.

La desventaja principal de este compilador con respecto a otros comerciales como CCS ó mikroC es que es un producto en desarrollo, por lo que será menos fiable que estos. Además casi todos los compiladores comerciales disponen de funciones precompiladas que hacen muy fácil la utilización de los recursos del PIC, con SDCC muchas de estas librerías están todavía en desarrollo.

SDCC soporta menos PIC’s que por ejemplo CCS, aunque esta desventaja es relativa ya que al ser un proyecto Open Source tú mismo puedes añadir el dispositivo y además de forma no muy complicada. Si utilizas un compilador comercial tienes que esperarte a que el desarrollador del compilador lo incluya.

Con respecto al IDE aunque para Linux existe Piklab, para Windows no hay todavía ninguno que funcione bien, por lo menos que yo sepa. Buscando por internet encontré este:

http://mfpuentear.github.com/i4uc/es/index.html

Pero está todavía en una versión alpha por lo que está bastante incompleto todavía y con errores, esperemos que mejore pronto.

Espero que este artículo sirva como punto de partida para los que quieran iniciarse en este compilador de PIC de código abierto que promete mucho.

Un saludo y hasta pronto