Sei sulla pagina 1di 6

Programacin en C de PICs empleando

herramientas libres
Matias De la Puente
mfpuente.ar@gmail.com
10 de mayo de 2009

1.

Introduccin

Los microcontroladores PIC programados en ensamblador logran una ejecucin ptima del programa cargado en su memoria, pero muchas veces la
tarea de realizar y mantener un programa de grandes dimensiones en ensamblador se hace difcil. Sobre todo cuando ha pasado un tiempo sin ver el
programa. Esta es la principal ventaja de C, un lenguaje de programacin
de mas alto nivel que ensamblador. Un programa realizado en C puede no
ser mas rpido que uno realizado en ensamblador pero facilita la realizacin
y mantenimiento de un programa de grandes dimensiones. Adems el cdigo
fuente realizado en C es fcilmente portado a distintos modelos de PICs realizando nicamente pequeas modicaciones relacionadas a la arquitectura
del microcontrolador.
Este articulo muestra el empleo del compilador libre sdcc[4] para compilar programas en C, como as tambin el empleo del programador de PICs
libre picp[3] para cargar el programa compilado en la memoria del PIC.
Para leer este articulo solo es necesario que el lector presente mnimos
conocimientos del lenguaje C y de la linea de comandos.

2.

Primer programa

El listado 1 simplemente har oscilar un led conectado al pin RA0 de un


microcontrolador PIC16f84A.
1

# include < pic16f84a .h >

2
3
4
5
6
7
8
9

void delay ()
{
int i , j ;
for ( i =0; i <4; i ++)
for ( j =0; j <250; j ++)
;
}

10
11
12
13

void main ()
{
TRISA = 0 x00 ;

14
15
16
17
18
19
20
21
22

while (1)
{
RA0 =
delay
RA1 =
delay
}

1;
();
0;
();

Listing 1: Primer programa - pic01.c


Este cdigo puede ser escrito con cualquier editor de texto como ser:
vim, nano, gedit, leafpad, mousepad, kate hasta inclusive puede escribirse
empleando openoce o abiword pero guardando el documento como texto
plano.

2.1. Explicacin del cdigo


La primera linea del programa incluye al cdigo fuente el archivo de
cabecera pic16f84a.h, el cual dene todos los registros del microcontrolador
incluyendo los registros de conguracin.
La funcin delay (linea 3) realiza un retardo aproximado de 1 segundo
si el microcontrolador presenta un ciclo de instruccin de 1 ms.
La funcin main (linea 11) es la primera funcin que ejecuta por defecto
el microcontrolador (y de cualquier programa en C). La primera instruccin
a ejecutar es TRISA = 0x00, la cual congura como salida al puerto A. El
bucle de la linea 15 se ejecutar mientras el microcontrolador se encuentre
encendido, ya que la condicin (1) siempre ser positiva, a este bucle se lo
denomina bucle innito. Las lineas 17 y 19 colocan en 1 y 0, respectivamente,
2

el bit 0 del puerto A. Las lineas 18 y 20 llaman a la funcin delay para


realizar el retardo denido.
De esta manera al colocar un led en el pin RA0 del microcontrolador,
este oscilar a una frecuencia de 0.5 Hz aproximadamente.

2.2. Compilacin del programa


La compilacin del programa se realiza con el siguiente comando:
$ sdcc - mpic14 - p16f84a pic01 . c

La opcin -mpic14 le indica al compilador que genere cdigo en ensamblador para microcontroladores con instrucciones de 14 bits (16F84A,
16F628A, 16F876A, etc). Para microcontroladores con instrucciones de 16
bits se debe emplear la opcin -mpic16. La siguiente opcin, -p16f84a, indica al compilador el modelo de microcontrolador a emplear y debe coincidir
con el modelo del archivo de cabecera incluido en el cdigo fuente. La ultima
opcin indica el o los archivo de cdigo fuente a compilar.
Este compilador genera a partir del archivo de cdigo fuente en C distintos archivos, los mas importantes son:

pic01.asm contiene el cdigo ensamblador generado por sdcc.


pic01.hex contiene el cdigo binario listo para ser grabado en la memoria
del microcontrolador.

El archivo pic01.hex, junto con otros ms, no son generados directamente


por sdcc sino que son generados por gpasm y gplink del paquete gputils[1].
El compilador sdcc genera el cdigo ensamblador a partir del cdigo en C
y automticamente ejecuta gpasm y gplink para generar el archivo .hex a
partir del cdigo ensamblador. Se le puede indicar a sdcc que utilice las
herramientas de Microchip[2] mpasm y mplink solamente agregando a sdcc
la opcin -mplab-comp.
El compilador sdcc soporta un gran numero de microcontrolador de 14
y 16 bits. Para obtener una lista de los microcontroladores de 14 bits soportados por el compilador solo hay que ejecutar el siguiente comando
$ sdcc - mpic14 - phelp pic01 . c

Para este ejemplo se emple el archivo pic01.c pero puede ser cualquier
otro inclusive uno vaco. Para obtener una lista de los microcontroladores
de 16 bits soportados por el compilador simplemente hay que reemplazar la
opcin -mpic14 por -mpic16.

2.3. Acerca de los registros


Como se menciono anteriormente, los registros del microcontrolador se
encuentran denidos dentro del archivo de cabecera incluido en el cdigo
3

fuente. No hace falta abrir este archivo de cabecera para saber como estn
denidos todos los registros del microcontrolador ya que el nombre de registro
es el mismo empleado dentro de la hoja de datos del microcontrolador. Por
ejemplo, si queremos modicar el valor del registro INTCON del PIC16F84A
elegido simplemente hay que introducir la linea INTCON = 0x00; en el cdigo
fuente, para este ejemplo se modico por el valor 0x00 pero puede ser el que
uno desee.
Cabe mencionar que los microcontroladores de 14 bits presentan registros en diferentes bancos de memoria. En ensamblador el desarrollador deba
seleccionar el banco de memoria en donde se encontraba el registro a modicar. En C no hace falta realizar esta tarea ya que el mismo compilador
genera el cdigo para elegir el banco correspondiente antes de modica el
registro. En los microcontroladores de 16 bits lo bancos de memoria fueron
eliminados y no hace falta realizar esta tarea, mejorando el rendimiento del
programa.
Ahora bien, a veces es necesario modica solamente un bit de un registro,
esto puede ser fcilmente realizado ya que tambin se encuentran denidos
los bits de cada registro. La nomenclatura empleada para realizar esta tarea
es diferente entre un microcontrolador de 14 bits y uno de 16 bits. Para un
microcontrolador de 14 bits se emplea esta nomenclatura:
< nombre del registro > _bits . < nombre del bit >

Por ejemplo, se desea habilitar las interrupciones globales de PIC16F84A,


para eso hay que poner en 1 el bit GIE del registro INTCON, simplemente
agregamos al cdigo fuente la linea INTCON_bits.GIE = 1;. Para un microcontrolador de 16 bits la nomenclatura es similar, la nica diferencia es que
no presenta el guin bajo entre nombre del registro y bits. En este caso para
habilitar las interrupciones globales del microcontrolador se empleara esta
linea de cdigo: INTCONbits.GIE = 1;.
Un caso a tener en cuenta es el de los microcontroladores de 16 bits
ya que no se requiere incluir el archivo de cabecera segn el modelo a programar. Esto es, solamente hace falta incluir al cdigo fuente el archivo de
cabecera pic18fregs.h y a travs de la opcin -p18fxxxx se elige el modelo
a programar.
3.

Grabacin del programa en la memoria del microcontrolador

Para grabar el programa en la memoria del microcontrolador se emplea

picp. Este comando se comunica con el programador1 PICSTART Plus de


1

Para evitar confusiones el

programador

es el dispositivo capaz de guardar un programa

en la memoria del microcontrolador. Para hacer referencia a la persona que escribe el


programa se empleara

desarrollador

Microchip para grabar los microcontroladores.

3.1. Grabar el programa


La grabacin del programa en la memoria del microcontrolador se realiza
simplemente empleando los siguientes instrucciones:
$ picp / dev / ttyS0 16 f84a - ef
$ picp / dev / ttyS0 16 f84a - bp - wp pic01 . hex

El primer comando limpieza (erase) toda la memoria ash del microcontrolador. La segunda opcin realiza un blanqueado (blank) de la memoria de
programa para luego grabar el programa compilado con sdcc.
La primera opcin /dev/ttyS0 es el puerto serie en donde se encuentra
conectado el programador (COM1, COM2, etc. para usuarios de Windows). La
segunda opcin 16f84a indica el modelo de microcontrolador a colocado
en el programador. Se puede obtener una lista completa de los dispositivo
soportados empleando picp -d. La opcin -ef especica que se limpie la
memoria ash del microcontrolador. La opcin -bp blanquea la memoria de
programa del microcontrolador. Por ultimo, la opcin -wp pic01.hex escribe
en la memoria de programa el archivo pic01.hex.

3.2. Lectura de la memoria del microcontrolador


Con picp tambin es posible leer la memoria del microcontrolador, siempre y cuando el microcontrolador no este protegido contra lectura. El comando a emplear es similar a escribir el programa:
$ picp / dev / ttyS0 16 f84a - rp temp . hex

Aqu, la opcin -rp temp.hex lee la memoria de programa del microcontrolador y la almacena en temp.hex.

3.3. Lectura y escritura de los bits de conguracin


Para leer y escribir los bits de conguracin del microcontrolador se emplean las opciones -rc y -wc respectivamente. La lectura de los bits de conguracin se realiza con:
$ picp / dev / ttyS0 16 f84a - rc

La escritura de los bits de conguracin se realiza con:


$ picp / dev / ttyS0 16 f84a - wc 0 x3FF9

El microcontrolador es congurado con la palabra 2 0x3FF9. Esto es, sin


proteccin de cdigo, temporizador de arranque desactivado, temporizador
watchdog desactivado y oscilador de tipo XT. Para mas informacin el lector
puede referirse al manual del microcontrolador.
2

Dato de 16 bits

3.3.1. Denir los bits de conguracin desde el programa


Los bits de conguracin pueden ser denidos desde el mismo programa
en C. Para ello sdcc ofrece un par de palabras reservadas 3 que hacen posible
esta tarea, las palabras reservadas son code y at y se emplean como se observa
en el listado 2.
code char at 0 x2007 CONFIG = 0 x3FF9 ;

Listing 2: Denicin de los byte de conguracin


Esta linea de cdigo es agregada al programa principal luego de las directivas #include. De esta manera cuando el programa sea grabado en la
memoria del microcontrolador tambin lo harn los bits de conguracin.
Una vez mas el lector debe referirse al manual del microcontrolador a
usar para obtener la o las direcciones y valores de los bits de conguracin.
4.

Conclusin

La programacin de un microcontrolador empleando el lenguaje C a probado durante aos ser la forma mas eciente de desarrollar un programa para
microcontroladores, por supuesto que no se genera un cdigo ensamblador
ptimo pero el cdigo hecho en C puede ser mantenido en forma mas sencilla
que uno en ensamblador. Adems pensar la solucin al problema en cdigo
en C es aun mas fcil que pensarla en ensamblador.
Este articulo ha demostrado que el desarrollo de un programa en C y el
grabado del mismo en la memoria del microcontrolador ha sido sencilla de
realizar. Las herramientas a utilizar son de fcil acceso y bien documentadas.
Un editor de texto y comandos fueron solamente necesarios para escribir
el programa y grabarlo al microcontrolador, esto prueba que no hacen falta
complejas aplicaciones grcas para realizar este trabajo. Por supuesto que
puede incorporarse dentro del editor de texto un par de botones en la barra de
herramienta para que haga en forma automtica la compilacin y el grabado
del programa.
Referencias

[1] GNU PIC Utilities. http://gputils.sourceforge.net/.


[2] Microchip. http://www.microchip.com/.
[3] PIC Programmer. http://home.pacbell.net/theposts/picmicro/.
[4] Small Device C Compiler. http://sdcc.sourceforge.net.
3

Como

if, while,

etc.

Potrebbero piacerti anche