Está en la página 1de 6

Scientia et Technica Ao XV, No 43, Diciembre de 2009. Universidad Tecnolgica de Pereira.

ISSN 0122-1701 37

PROGRAMANDO MICROCONTROLADORES PIC EN LENGUAJE C

PIC Microcontrollers Programming in C language

RESUMEN CARLOS ALBERTO HENAO


En este artculo se presenta el manejo del compilador PCW para Tecnlogo Elctrico
microcontroladores PIC, el cual permite programar fcilmente los Estudiante de Ingeniera Elctrica
microcontroladores en lenguaje C, con lo cual se realiza ms rpidamente el caramelo@utp.edu.co
desarrollo de programas que seran bastante complejos de abordar en lenguaje
ensamblador.
EDISON DUQUE
PALABRAS CLAVES: Compilador, lenguaje C, microcontrolador. Ingeniero Electrnico, M.Sc
Profesor Asociado
ABSTRACT Universidad Tecnolgica de Pereira
In this article management PCW compiler for PIC microcontrollers, which can eduque@utp.edu.co
easily program the PIC microcontrollers in C language, which is quickly
developing programs that would be quite complex to make in assembly
language.

KEYWORDS: Compiler, C language, microcontroller.

1. INTRODUCCIN 2.1 EL COMPILADOR PCW

Tradicionalmente muchos programadores de Bsicamente el compilador PCW maneja la misma


microcontroladores PIC utilizan el lenguaje ensamblador estructura de programacin que el lenguaje de
para realizar sus proyectos, pero en la actualidad existen programacin C, las similitudes ms importantes son:
compiladores de lenguajes de alto nivel que permiten
realizar las mismas tareas en un menor tiempo de 2.1.1 OPERADORES ARITMTICOS
desarrollo y con mucha mayor facilidad en la
programacin. Los operadores aritmticos del PCW son praticamenete
los mismos que su homlogo el lenguaje C y son los
El PCW Compiler es una herramienta til para programar siguientes:
microcontroladores PIC, en la cual estn incluidas las
libreras para manejar una pantalla LCD, el protocolo de Operador Descripcin Ejemplo
comunicacin serial, manejo de puertos, etc. En la + Suma (enteros) Suma = a + b
actualidad el compilador PCW es una herramienta en - Resta (enteros) Resta = a - b
desarrollo, poco a poco se han ido adaptando nuevas * Producto (enteros) Produ= a * b
libreras, nuevos microcontroladores y nuevas ayudas. / Divisin (enteros) div = a / b
% Mdulo: (residuo ) Mod = a % b
2. CARACTERSTICAS DE COMPILADOR PCW Tabla 2.1 Operadores aritmticos

Traduce el cdigo C del archivo fuente (.c) a 2.1.2 OPERADORES RELACIONES


lenguaje de mquina para programar
microcontroladores PIC (.HEX). Los operadores relacionales son los siguientes
Se incluye Drivers o libreras de cdigo fuente
para manejo de pantallas LCD, teclados, Operador Descripcin
sensores, protocolos de comunicacin, < Menor que
memorias, conversin analgico a digital, etc. > Mayor que
Se integra al mdulo de desarrollo IDE del <= Menor o igual que
MPLAB (software de desarrollo de Microchip) >= Mayor o igual que
y otros simuladores y editores para la == Igual que
depuracin del cdigo fuente. Tabla 2.2: Operadores relaciones
Funciones para el manejo de interrupciones.

Fecha de Recepcin: 15 de Septiembre de 2009.


Fecha de Aceptacin: 12 de Octubre de 2009
38 Scientia et Technica Ao XV, No 43, Diciembre de 2009. Universidad Tecnolgica de Pereira.

2.1.3 FORMATOS DE LAS VARIABLES 2.3 DIRECTIVAS EN EL CCS

C Caracter #INCLUDE <NOMBRE_DEL_FICHERO>


U Entero sin signo
x Entero en Hex (en minscula) Esta directiva hace que el compilador incluya en el
X Entero en Hex (en mayscula) fichero fuente el texto que contiene el archivo indicado.
D Entero sin signo
%e Real en formato exponencial Ejemplo: #include <16F877.H>
%f Real (float)
Lx Entero largo en Hex (en minscula) #FUSE
LX Entero largo en Hex (en mayscula)
Lu Decimal largo sin signo Esta directiva define qu fusibles deben activarse en el
dispositivo cuando se programe. Esta directiva no afecta
Ld Decimal largo con signo
a la compilacin; sin embargo, esta informacin se pone
Tabla 2.3: Formatos de las variables
en el archivo de salida. Algunas de las opciones ms
usadas son:
2.1.4 SENTENCIAS BSICAS Y BUCLES
LP, XT, HS, RC (Tipo de oscilador)
El compilador PCW contiene los bucles y sentencias
WDT, NOWDT (Activacin del Watch Dog Timer)
bsicas del lenguaje C que son principalmente las
PROTECT, NOPROTECT (Proteccin del cdigo)
siguientes:
PUT, NOPUT (Temporizador de arranque)
Sentencia if (expresin) BROWNOUT, NOBROWNOUT (Deteccin de cadas
Sentencia if..... Else de tensin de la fuente de alimentacin)
Bucle while
Bucle for Ejemplo #fuse HS, WDT.
Bucle do... while
#INT_XX
2.2 COMPILADOR PCB Y PCM PCH
Estas directivas especifican que la funcin que le sigue
Esta herramienta contiene 3 compiladores que son: es una funcin de interrupcin. Las funciones de
interrupcin no pueden tener ningn parmetro. Como es
PCB: Genera cdigo para microcontroladores de 12 bits natural, no todas las directivas pueden usarse con todos
en memoria de programa (ejemplo: la familia los dispositivos. Las directivas ms comunes son las
PIC12C54x). siguientes:

PCM: Genera cdigo para microcontroladores de 14 bits #INT_EXT: Interrupcin externa


en memoria de programa (ejemplo: la familia
PIC16F87x). #INT_TRCC: Desbordamiento del TIMER0 (RTCC)

PCH: Genera cdigo para microcontroladores de 16 bits #INT_RB: Cambio en los pines B4, B5, B6, B7
en memoria de programa.
#INT_AD: Conversor A/D
En la siguiente grfica se muestra la funcin de los
compiladores #INT_TIMER1: Desbordamiento del TIMER1.

#INT_TIMER2: Desbordamiento del TIMER2

#INT_CP1: Modo captura de datos por CCP1

#INT_CCP2: Modo captura por CCP2

#USE DELAY (Clock = Frecuencia):

Esta directiva indica al compilador la frecuencia del


procesador, en ciclos por segundo, a la vez que habilita el
uso de las funciones DELAY_MS() y DELAY_US().

Figura 2.1 : Funcin de los compiladores Ejemplo: #USE DELAY (CLOCK = 4000000)
Scientia et Technica Ao XV, No 43, Diciembre de 2009. Universidad Tecnolgica de Pereira. 39

#USE STANDARD_io (Puerto) Esta funcin activa/desactiva las resistencias pullups en


las entradas del puerto B. Flag puede ser TRUE (activa) o
Esta directiva afecta al cdigo que el compilador FALSE (desactiva).
generar para las instrucciones de entrada y salida. Este
mtodo rpido de hacer I/O ocasiona que el compilador Ejemplo: Port_b_pullups(false)
realice I/O sin programar el registro de direccin. El
puerto puede ser A-G. Set_ tris_puerto(Valor)

Ejemplo: #USE STANDARD_io(B) Estas funciones permiten escribir directamente los


registros tri-estado para la configuracin de los puertos
#USE RS232 (BAUD = baudios, XMIT = pin, RCV= (configurar pines de entrada y salida).
pin)
Esto debe usarse con FAST_IO(), cuando se accede a los
Esta directiva le dice al compilador la velocidad en bits puertos de I/O como si fueran memoria, igual que cuando
por segundo y los pines utilizados para la comunicacin se utiliza una directiva #BYTE. Cada bit de value
serie. Esta directiva tiene efecto hasta que se encuentra representa una patilla. Un '1' indica que la patilla es de
otra directiva RS232. entrada y un '0' que es de salida.

La directiva #USE DELAY debe aparecer antes de Ejemplo : Set_tris_A(0xff); puerto A como entrada
utilizar #USE RS232. Esta directiva habilita el uso de
funciones tales como GETCH, PUTCHAR y PRINTF. 2.5 FUNCIONES DE RETARDO

2.4 FUNCIONES DISCRETAS DE I/0 Delay_cicles(Valor)

Input(pin) Esta funcin realiza retardos segn el nmero de ciclos


de instruccin especificado en count; los valores posibles
Devuelve el estado '0' o '1' de la patilla indicada en pin. van desde 1 a 255. Un ciclo de instruccin es igual a
El mtodo de acceso de I/O depende de la ltima cuatro periodos de reloj.
directiva #USE *_IO utilizada. El valor de retorno es un
entero corto. Ejemplo : Delay_cicles(100); Cuenta 100 ciclos

Ejemplo : if (Input(Pin_B0)==1) Delay_ms(Valor)

Output (Pin, Value) Esta funcin realiza retardos del valor especificado en
time. Dicho valor de tiempo es en milisegundos y el
Esta funcin saca el bit dado en value(0 o 1) por la patilla rango es 0-65535.
de I/O especificada en pin. El modo de establecer la
direccin del registro, est determinada por la ltima Para obtener retardos ms largos as como retardos
directiva #USE *_IO. 'variables' es preciso hacer llamadas a una funcin
separada; vase el ejemplo siguiente.
Ejemplo : output_bit( PIN_B0, 0);
Delay_us(Valor)
Output _high(pin)
Esta funcin realiza retardos del valor especificado en
Pone a 'uno' el pin indicado. El mtodo de acceso de I/O time. Dicho valor es en microsegundos y el rango va
depende de la ltima directiva #USE *_IO utilizada. desde 0 a 65535. Es necesario utilizar la directiva #use
delay antes de la llamada a esta funcin para que el
Ejemplo : Output_high(PIN_C0) compilador sepa la frecuencia de reloj.

Output_low(pin) 2.6 FUNCIONES PARA LA MANIPULACIN DE


BITS
Pone a 'cero' el pin indicado. El mtodo de acceso de I/O
depende de la ltima directiva #USE *_IO. Bit_clear (Var, Bit)

Ejemplo : Output_low(PIN_D0) Esta funcin simplemente borra (pone a '0') el dgito


especificado en bit(0-7 0-15) del byte o palabra
Port_b_pullups(flag) aportado en var. El bit menos significativo es el 0.

Ejemplo : int x = 10;


40 Scientia et Technica Ao XV, No 43, Diciembre de 2009. Universidad Tecnolgica de Pereira.

Bit_clear(x,0) ; La funcin de impresin formateada PRINTF saca una


cadena de caracteres al estndar serie RS-232 o a una
Bit_set(Var, bit) funcin especificada.

Esta funcin pone a '1' el dgito especificado en bit(0-7 o Cuando se usan variables, string debe ser una constante.
0-15) del byte o palabra aportado en var. El carcter % se pone dentro de string para indicar un
valor variable, seguido de uno o ms caracteres que dan
Rotate_left(Direccin, bytes) formato al tipo de informacin a representar.

Esta funcin rota a la izquierda un bit de un array o de 2.8 MANEJO DEL MODULO LCD
una estructura. Ntese que la rotacin implica que el bit
MSB pasa a ser el bit LSB. Direccin puede ser un #INCLUDE <LCD.C>
identificador de un array o la direccin a un byte o a una
estructura, por ejemplo, &dato. bytes es el nmero de Librera que maneja el mdulo LCD, se debe poner
bytes implicados en la rotacin. siempre que se vaya a utilizar una de estas pantallas o
displays. Por defecto se utiliza conexin a 4 bitas entre el
Ejemplo : X = 0*50 microcontrolador y la pantalla LCD.
Rotate_left(&X, 1) ; 0*A0
Al puerto asignado para el manejo del mdulo LCD se le
Rotate_right (Direccin, bytes) asigna por defecto la siguiente configuracin de conexin
hacia la LCD.
Esta funcin rota a la derecha un bit de un array o de una
estructura. Ntese que esta rotacin implica que el bit Puert_X0 = Al terminal E de la LCD
LSB pasa a ser el bit MSB. address puede ser un Puerto_X1 = Al terminal RW de la LCD
identificador de un array o la direccin a un byte o a una Puerto_X2 = Al terminal RS de la LCD
estructura, por ejemplo, &dato. bytes es el nmero de Puerto_X4-X7 = Al los terminales D4 D7
bytes implicados en la rotacin. respectivamente
Puerto_X3 = No se conecta
2.7 MANEJO DEL PROTOCOLO RS232
Donde X puede ser el puerto (A, B, C, D, E ,G)
GETC() , GETCH(), GETCHAR()
PRINTF(LCD_PUTC,[STRING])
Estas funciones esperan un carcter por la patilla RCV
del dispositivo RS232 y retorna el caracter recibido. Est funcin permite escribir en la LCD, es decir, poner
caracteres que se vayan a visualizar en el modulo LCD.
Es preciso utilizar la directiva #USE RS232 antes de la
llamada a esta funcin para que el compilador pueda Ejemplo : Printf(lcd_putc,Hola Mundo); escribe Hola
determinar la velocidad de transmisin y la patilla Mundo en la LCD
utilizada. La directiva #USE RS232 permanece efectiva
hasta que se encuentre otra que anule la anterior. LCD_INIT()

Los procedimientos de I/O serie exigen incluir #USE Esta funcin inicializa la LCD (borra toda la pantalla)
DELAY para ayudar a sincronizar de forma correcta la
velocidad de transmisin. Se debe tener en cuenta que es Ejemplo : do
necesario adaptar los niveles de voltaje antes de conectar {
el PIC a un dispositivo RS-232. lcd_init();
printf(lcd_putc,Microcontroladores);
PUT() , PUTCHAR() delay_ms(1000);
}
Estas funciones envan un caracter a la patilla XMIT del while(true);
dispositivo RS232. Es preciso utilizar la directiva #USE
RS232 antes de la llamada a esta funcin para que el 3.0 EJEMPLOS DE PROGRAMACIN
compilador pueda determinar la velocidad de transmisin
y la patilla utilizada. La directiva #USE RS232 3.1 EJEMPLO MODULO LCD
permanece efectiva hasta que se encuentre otra que anule
la anterior. En el presente ejemplo se muestra como escribir en una
pantalla LCD utilizando el compilador PCW, los pasos
Printf ([funtion], string, [valor]) son los siguientes:
Scientia et Technica Ao XV, No 43, Diciembre de 2009. Universidad Tecnolgica de Pereira. 41

protocolo RS-232 con el compilador PCW, los pasos son


Definir que tipo de compilador (PCB, PCM, los siguientes:
PCH) y que tipo de microcontrolador se va a
utilizar. Definir que tipo de compilador (PCB, PCM,
Definir la frecuencia del oscilador PCH) y que tipo de microcontrolador se a
Definir los puertos por donde se van a conectar utilizar.
la LCD Definir la frecuencia del oscilador
Inicializar la LCD Configurar el protocolo RS-232 utilizando la
Escribir en la LCD directiva #USE RS232 (BAUD = bits por
Esperar un tiempo segundo, XMIT = pin, RCV= pin).
Volver a empezar el ciclo Mandar dato utilizando la instruccin
printf([Funtion], string, [valor])
Las conexiones se muestran en la figura 3.1
En el ejemplo se utiliz un PIC16F877 que contiene en
su arquitectura un USART (mdulo de comunicaciones
seriales) para la comunicacin con otros dispositivos. En
la figura 3.2 se muestran la conexiones.

Figura 3.1: Diagrama de conexiones de modulo LCD

El cdigo es siguiente:

#if defined(__PCM__) Figura 3.2. Comunicacin serial RS-232.


#include <16f877.h>
#use delay(clock = 4000000) Se transmite por el Puerto C bit 6 y se recibe por el
#define use_portb_lcd TRUE Puerto C pin 7.
#include <lcd.c>
El programa es el siguiente:
void main()
{ #if defined(__PCM__)
do #include <16f877.h>
{ #use delay(clock = 4000000)
lcd_init(); // se inicializa la lcd #use rs232(baud = 2400, xmit = PIN_C6, rcv = PIN_C7)
lcd_gotoxy(5,1); // ubica puntero #use standard_io(c)
printf(lcd_putc,"MICROCHIP");
delay_ms(1000); void main()
} {
while(true); do
} {
printf(\n MICROCONTROLADORES PIC);
3.2 EJEMPLO MANEJO DEL PROTOCOLO RS232 }
while(true);
En el siguiente ejemplo dan las pautas para programar el }
microcontrolador para que envie datos utilizando el
42 Scientia et Technica Ao XV, No 43, Diciembre de 2009. Universidad Tecnolgica de Pereira.

Este pequeo programa tiene como funcin enviar la


cadena de caracteres MICROCONTROLADORES PIC
hacia otro dispositivo, por ejemplo otro
microcontrolador, un controlador lgico programable o
una computadora con puerto serial. Si lo que se quiere es
enviar algn valor numrico se deben utilizar los
formatos de la tabla 2.3. Los ejemplos antes mencionados
se pueden simular en el software Proteus versin 6.0 en
adelante.

4. CONCLUSIONES

El compilador PCW es una herramienta


poderosa que permite programar
MICROCONTROLADORES PIC reduciendo
el tiempo de programacin y complejidad en los
algoritmos.
El PCW es un compilador muy completo ya que
permite desde el manejo de una LCD hasta un
protocolo de comunicacin.
En las pruebas realizadas se obtuvieron
excelentes resultados al comparar el desempeo
del microcontrolador programado en
ensamblador y el programado en lenguaje C
mediante el PCW.

5. BIBLIOGRAFA

[1] Jos Mara Angulo Uscategui, Diseo Practico de


Aplicaciones de Microcontroladores PIC16F877,
Mcgraw-hill, Segunda Edicin, Espaa 2000

[2] Jose Mara Angulo Uscategui, Diseo Prctico de


Aplicaciones Primera Parte PIC16F84 Lenguaje
Pbasic y Ensamblador, Tercera Edicin, Mcgraw-
hill, Espaa 2003

[3] Andrs Cnova Lpez, Manual de Usuario del


Compilador PCW de CCS, Microchip, Espaa 2000

[4] www.microchip.com

También podría gustarte