Optimization of Microchip PIC XC8 compiler in Free and Pro mode

I don’t like to program PICs in C language. In fact, I even used to hate it due to the poor quality of the C compilers.

When I started to program PICs microcontrollers in 1998 there was not too many options to program PICs in C. As far as I remember, only Hi-Tech, IAR and CCS had compilers – not even Microchip has his own one – and they were quite horrible compiling. But the fault was not in the compilers manufacturers, but in the PIC core architecture.

Those days Microchip had only what we know nowadays as the ‘base-line’ (12C50X) and ‘mid-range’ (16C54,16F84,16F87X…) architectures. Those cores were so simple that it was not easy no make a C compiler for them. Few memory, scarce resources, small instructions set, few addressing modes…
Anyway, who needs a C compiler with such simple architectures?

Years later Microchip released the more C oriented PIC17/PIC18 architecture and a new range of C compilers for the new PICs were created. Finally we had “reasonable efficient” tools to program Microchip microcontrollers in C!

Two years ago Microchip bought the Hi-Tech company and renamed their Picc compiler as XC8. With this movement, Microchip provide to their clients a cheap and decent C compiler as their old and deprecated C18 compiler was – in my opinion – plenty of bugs and not worthy to work with.

I still use ASM to program the PIC12 and PIC16 family. However, I program the PIC18 devices in C but I often had to dive into the asm of the generated binary  to optimize it.
In those optimizations I have seen weird things made by compilers and I have been long time wanting to write about it.
Today I am only going to write shortly about how the free mode of the XC8 compiler bloats the binary to make the Pro version look more efficient.

Continue reading

eZ430-Chronos tutorial – Part I

Sorry! It is in Spanish only and it is not finished. I will fix this as soon as possible.

 

 

El eZ430-Chronos es reloj basado en una plataforma de desarrollo para el microcontrolador MSP430 de Texas Instruments.

FOTO DEL RELOJ

TODO: DETALLES DEL RELOJ

 

En este primer tutorial vamos a conocer la estructura general del firmware del eZ430-Chronos y a añadir nuestra primera funcion: un calendario mejorado.

 

Entorno de desarrollo

Utilizaremos el Code Composer Studio v4.0 como entorno de desarrollo.

Podemos usar la version limitada descargable gratuitamente de la pagina de Texas Instruments o alguna de las versiones de pago (Microcontroller o Platinum).

La instalacion y uso del CCS no es es objeto de este tutorial.

 

Instalaremos tambien el codigo fuente del firmware incluido en el reloj descargandolo o utilizando el cdrom incluido con el reloj.

 

Una vez tengamos todo el entorno de desarrollo instalado, arrancamos el CCS y procedemos a importar un proyecto existente ( File -> Import -> CCS -> Existing CCS/CCE Eclipse Project )

 

Elegimos como path el directorio donde hemos instalado el codigo fuente.

Durante la instalacion, se habra instalado la version del firmware para el CCS y para el IAR. Asegurate de elegir la version para CCS.

Tambien se incluyen dos versiones del firmware: Una que ofrece la funcionalidad de un reloj deportivo (“CCS\Sport Watch”) y otra que realiza logueo continuo de los sensores (“CSS\Data logger”).

Si se realiza la instalacion por defecto, el path sera C:\Archivos de programa\Texas Instruments\eZ430-Chronos\Software Projects\Chronos Watch\CCS\Sports Watch

Nos aseguramos de activar la casilla “Copy projects into workspace”.

 

Terminada la importacion, debemos tener nuestro proyecto en la vista de proyectos

 

 

 

Elegimos el perfil activo (868MHz Europa – CSS limited)

 

Project -> Build Project y confirmamos en la consola que no se ha producido ningun error.

Estructura general ->

– main.c: bucle principal.
– logic\*: Contiene el codigo que gestiona las logicas de las distintas funciones del reloj. Ejemplos:
logic\menu.c: menus
logic\clock.c: reloj
logic\stopwatch.c: cronometro
logic\date.c: fecha
logic\acceleration.c: acelerador

– simpliciti\*: Pila SIMPLICITI
– bluerobin\*: pila bluerobin. (es un binario y los .h. No hay fuente)
– driver\*: control de los distintos perifericos hardware. <- si usamos la version lite, no se compilan.

Echar un vistazo a main.c, menu.c y menu.h

 

menu.h nos fijamos en esto:

 

Esta estructura contiene la informacion relativa a los menus que permiten acceder a las funciones del reloj. La estructura sirve para definir indistintamente a los menus del LCD superior o del inferior.

sx_function es la funcion que se ejecuta cuando se pulsa el boton derecho y MX_funciontion la que se ejecuta al mantener apretado el boton derecho unos segundos.

Display_function apunta al metodo que se invoca para pintar el menu en el LCD. El parametro “line” de las 3 funciones anteriores sirve para indicar el LCD donde se renderizara la funcion.

next es un puntero al menu que se saltara la aplicacion cuando se apriete el boton izquierdo una sola vez.

 

Un vistazo a menu.c

Observamos como se declaran e inicializan los distintos menus, tanto para el LCD (LINE1) superior como el inferior (LINE2).

Por ejemplo, esta es la declaracion de los menus del LCD superior:

Notese como se encadena cada menu al siguiente y el ultimo al primero.

Vamos a centrarnos en la funcionalidad del calendario cuya estructura del menu es la siguiente:

Echaremos un vistazo a display_date() , que es la funcion que se ejecuta cuando el reloj debe debe mostrar la fecha.

El primer argumento, line indica en que LCD se renderizara

que es el metodo que se ejecuta al mantener pulsado el boton izquierdo durante un tiempo

CONTINUARA…