Está en la página 1de 17

Cómo programar un microcontrolador con

PIC C?
PIC C es una herramienta que permite programar un microcontrolador por medio de lenguaje C, a
diferencia del lenguaje máquina o ensamblador (ASM) que se maneja por defecto, este hace los programas
más fáciles de escribir, analizar y comprender. PIC C ha sido desarrollado por PIC CMU, y cuenta con
una gran cantidad de librerías o drivers que permiten optimizar los programas en el momento de manejar
dispositivos externos, tales como pantallas LCD, memorias, conversores, etc. Queremos destacar que el
orden de este mini-tuto se basó principalmente en el libro Compilador C CCS y simulador Proteus para
Microcontroladores PIC, de Eduardo García.

Tal como se puede observar en la figura 1, el espacio de trabajo del programa consta de las siguientes
partes:

Figura 1. Espacio de trabajo de PIC C (Para agrandar dar clic).

Fuente. Autor.

El lenguaje C es un tipo de programación que pese a ser uno de los más básicos en esta área, sigue siendo
una gran herramienta en el momento de crear diferentes rutinas para un microcontrolador. Este lenguaje
básicamente es un sistema de decisiones, por ello realizar un diagrama de flujo antes de escribirlo es de
gran ayuda (para más información visitar el enlace que acompaña la figura 2).

Figura 2. Ejemplo de un diagrama de flujo.


Fuente. http://www.comolohago.cl/2009/06/16/como-hacer-un-diagrama-de-flujo/.

Estructura de un programa en C
Un programa en PIC C se puede hacer de dos formas distintas, ya sea creando un proyecto o
simplemente escribiendo el código completo directamente en un archivo con extensión ".C" (más
adelante se tratará este tema), cualquiera que sea el caso que se vaya a usar, la estructura es
prácticamente la misma:
 Las directivas dan los parámetros de control que le indican al compilador las herramientas que el
programa va a necesitar para ejecutarse adecuadamente.
 Las funciones son las rutinas que el microcontrolador ejecutará según se programe. La función principal
es la columna vertebral del programa y es la primera en ejecutarse según su diseño, hará las llamadas
correspondientes tanto a las librerías como a las funciones secundarias. Las funciones secundarias, son
aquellas subrutinas en las que se apoya la función principal para su correcto funcionamiento,
principalmente se usa para no repetir la escritura de un código una y otra vez o por simple orden.
 Las instrucciones son el código a escribir y a compilar.
 Los comentarios se usan para aclarar ciertos aspectos de las instrucciones, es bastante útil para recordar
la estructurar y el funcionamiento de un programa hecho anteriormente o por un tercero.

Operadores y expresiones compatibles con PIC C


No todas las funciones de lenguaje C están disponibles para la programación de microcontroladores, por
esta razón se darán a conocer los comandos disponibles y los exclusivos para PIC C.
 Constantes: Estos son las constantes que acepta PIC C.

 Tipos de datos: PIC C acepta los siguientes los siguientes tipos de datos.
 Variables: La definición de las variables dentro del programa es la misma para todas:

[Tipo de variable] [Nombre de la variable]= [Valor inicial de la variable]

o El tipo de variable se refiere a las definiciones descritas en el punto anterior.


o El nombre de la variable es aquella con que el programador la identificará, esta puede tomar
cualquier valor con la condición de que no se usen espacios ni tampoco las letras se salgan del
teclado americano o los caracteres especiales, por ejemplo, no se permite el uso de “ñ”, y si se
desea definir una variable con más de una palabra se puede escribir usando la raya al piso
“nombre_de_la_variable”.
o El valor inicial de la variable puede ser cualquiera que esté dentro de los límites del tipo de
variable a usar, por ejemplo no se puede dar un valor de 260 a una variable tipo byte. Aunque no
es obligatorio darle valor a las variables, es preferible dárselos para asegurar que el programa
inicie con los valores que queremos, existe un pequeño problema que al programar un
microcontrolador sin borrarlo primero, el número de registro que se le asigne a la variable que
acabamos de definir tenga un valor aún, esto puede provocar malestares que en el momento de
hacer las pruebas en físico, no se encuentre el error, tenga esto en cuenta.

La única diferencia de las variables está en la posición dentro del programa en la que se escriban, según
sea esta, son de tipo global o local:

o Variables de tipo local: Aplican dentro de la función en las que sean definidas.
o Variables de tipo global: Aplican para todo el programa, se pueden citar dentro de la función
principal como también en las secundarias.

Las variables se pueden definir AUTO, las cuales son aquellas que no se necesitan definir,
STATIC, variables locales que pasan a ser globales, y EXTERN, variables compiladas varias
veces.

 Operadores y expresiones: Las operaciones son aquellas usadas para cumplir con la tarea lógica de
nuestro programa ya sean sumas o restas aritméticas o lógicas, mientras que las expresiones cumplen
con la misma tarea, con la diferencia que no necesita escribir toda la ecuación para que el programa lo
entienda, por ejemplo:
o Operación => i=i+1
o Expresión => i++

Ambos tienen el mismo efecto sobre el registro “i” lo único que difieren es en la escritura de la
instrucción, como bien se puede apreciar mientras que el primer caso tiene cinco caracteres el segundo
tiene 3; aunque la diferencia no sea mucha, al momento de escribir ecuaciones o algoritmos más y más
complejos se empieza a ver la diferencia. En el siguiente cuadro se dará a conocer los operadores y
expresiones más comunes:
 Funciones: son las encargadas de separar el programa en segmentos de códigos, como ya se había
mencionado anteriormente, existe la función principal complementada de una o más secundarias con el
fin de ahorrar líneas repetidas de instrucciones. Al igual que las variables se deben de definir al
comenzar el programa y se pueden separar en librerías o ficheros si se desea, con la extensión “.h” o
“.c”.
 Declaraciones de control: Estas declaraciones se encargan de controlar el proceso del programa:
 Comentarios: Ayudan a aclarar ciertos aspectos del programa, son muy útiles en dos casos específicos, el
primero cuando se quiere retomar un programa que se tiene en espera durante mucho tiempo (suele
pasar con algunos proyectos que necesitan echarle una repasada a algunos temas o aprender otros
nuevos), y cuando se le va a dar a un tercero, en este caso si se acompaña de un diagrama de flujo este
último no se sentirá tan perdido; no tienen ningún efecto sobre el programa. Los comentarios se pueden
escribir de dos maneras:

o Los de una sola línea: El comentario empieza con dos barras diagonales “//” y se escribe lo que
se desea. Por ejemplo:

INT Variable=0 // Se define una variable tipo INT

o Los de dos o más líneas: Usualmente para hacer extensas especificaciones del programa, en este
caso se usa un barra diagonal junto a un asterisco, al comienzo y al final pero, en distinto orden
así:

/* Este programa se encargará de controlar el movimiento


de un motor paso a paso, tenga en cuenta los transistores
en los pines de salida para evitar dañar el PIC. */

 Directivas: También conocidas como directivas de pre-procesamiento, usualmente empiezan con el


símbolo “#” sin las comillas; se usan para indicarle y definirle al microcontrolador las tareas y registros
que debe tener en cuenta para comenzar sus rutinas de manera adecuada y óptima, existe un gran
número de estas y para no citarlas todas se mencionarán las más comunes, para mayor información
recomendamos el libro de Eduardo García y el manual de usuario del compilador PCW de CCS (lo puede
encontrar en nuestra página oficial):

o #device chip, define el micro a usar, por ejemplo:

#device 16F877A

o #fuses options, permite quemar los fusibles del microcontrolador que se van a usar en el
momento de la programación, por ejemplo:

#fuses XT, NOPROTECT, NODEBUG

o #include “Archivo”, incluye en el programa y la compilación ciertos ficheros o librerías, es muy


útil para incluir la librería del PIC a usar o de diferentes periféricos, esto evita definir una serie de
parámetros que ya están definidas en estos ficheros:

#include “16F877A.h”

o #use delay (clock=velocidad), define la base de tiempo en los que se basará el programa para
definir la cantidad de ciclos de máquina que requiere alguna instrucción para ejecutarse de la
manera más adecuada:

#use delay (clock=4000000)


o #ASM y #ENDASM, permite insertar código ensamblador a un programa en C, aunque no acepta
todos las instrucciones que pueda disponer el PIC, si tiene los más importantes (recomendamos
nuevamente el manual de CCS). Bastante útil a quienes apenas comienzan a migrar:

#asm
Movlw 0x8
Movwf portb
#endasm

Primer Programa
Anteriormente se había mencionado dos maneras de realizar un programa en PIC C, una por el PROJECT
WIZARD y otra escribiendo todo el código en un documento con la extensión “.C”, ambos casos son
útiles, el primero lo recomendamos a los principiantes, una vez se tenga dominio en los conceptos de PIC
C pasar al segundo caso, este es bastante útil en el momento de necesitar el programa disponible en la
nube o en algún medio extraíble, ya que este permite compilarse en equipos en donde no se haya hecho el
programa.

Para hacer el mini-tuto más didáctico se decidió enseñar ambos ejemplos por medio de videos, expuestos
en nuestra página en youtube, aquí dejamos los enlaces:

Creación de un programa en C para microcontrolador PIC a través del PROJECT WIZARD:

Seguir link de youtube https://youtu.be/b-Q_kUv7aCw

Creación de un programa en C para microcontrolador PIC desde un archivo de extensión “.c”:

Seguir link de youtube https://youtu.be/lvK81htVrhs

Ya vistos estos videos se tiene idea de lo que se va realizar a continuación, independientemente del método
adoptado para crear y compilar el programa, este último efectuará una tarea sencilla: un contador de 0 a
999 iniciado al oprimir un pulsador, una vez termine el conteo volverá a su posición inicial esperando a
que se vuelva a repetir el proceso.

Figura 3. Diagrama de flujo del programa ejemplo.


Fuente. Autores.

Para compilar el programa se adoptará el método de un archivo con extensión “.c”, esto para que se pueda
descargar el archivo desde nuestra página web y pueda compilarse ahí mismo, como se demostró en el otro
video, el método que se usa tendrá el mismo resultado, difiere únicamente en unas pocas líneas:
Lo primero que puede observar es la ausencia de los comentarios en los que se han insistido
anteriormente, esto debido a que se explicará paso a paso el funcionamiento del programa y de cada
instrucción, tenga en cuenta la estructura del programa, pues es fundamental para que se pueda compilar
el programa, si no queda claro este aspecto no dude en contactarnos, con gusto aclararemos cualquier
pregunta:

#include <16F877A.h>: Esta instrucción ya se había explicado anteriormente, con esta se incluye la
librería que contiene los datos básicos para el manejo del microcontrolador, en este caso el PIC16F877A,
al programa.

#fuses XT,NOWDT: En este punto se configuran los fusibles del PIC, para el caso solamente se le indica
al microcontrolador que la velocidad máxima será de 4MHz proveniente de un cristal de cuarzo y que no
se hará uso del perro guardián o watchdog.

#use delay(clock = 4000000): Aquí se configura la base de tiempo del PIC, muchos se preguntarán el
porqué es necesaria esta instrucción, esto se debe a que PIC C genera una serie de ciclos de máquina
para hacer funcionar el microcontrolador, pero debido a que estos ciclos son inversamente
proporcionales a la frecuencia de reloj inducida al PIC (Ciclo de máquina = 4/Fosc), no se puede poner
deliberadamente x cantidad de ciclos, o sino el lenguaje C no se podría usar para programar estos
dispositivos.

#include <lcd.c>: Aunque es la misma instrucción mencionada tres puntos atrás, esta incluye otra
librería la del manejo del display LCD, así como esta se pueden incluir tantas librerías como se necesiten
sin importar si es propia o de un tercero.

#byte porta=0x05: Esta es la primera instrucción de una serie igual, esta se usa para definir variables de
tipo byte en una posición de memoria específica, ¿qué tiene de especial?, básicamente porque define una
variable importante en la posición de memoria 05h del microcontrolador, véase la página 19 del
datasheet del PIC, al igual que las instrucciones similares siguientes.

char secu[10]={'0','1','2','3','4','5','6','7','8','9'}: Bueno este tipo de instrucción es algo avanzada, pero no es


nada del otro mundo, esta estructura define matrices, para el caso es una simple matriz de 1x10 (una fila,
diez columnas), la primera parte “char” indica que todos los datos introducidos son de tipo carácter o char
(los cuales son los que únicos que entiende, por así decirlo, el LCD); en cuanto a “secu” es el nombre dada
a la matriz, este es el referente para citarla posteriormente; [10] es la extensión de la matriz, si se necesita
más de una fila la definición es por medio de dos números separados por corchetes cuadrados así [y][x];
y finalmente siguen los datos, estos son separados por comas, en este caso en particular se encierran entre
comillas sencillas, para indicar que son tipo char, convirtiendo el carácter a su formato ASCII de manera
transparente.

void main(): Esta es la función principal, es decir la columna vertebrar de tu programa, no importa cuántas
instrucciones y funciones se le pongan encima, C siempre comenzará por acá. Recuerden que seguida de
la función van los corchetes {}, entre estos se encierran las líneas de comandos que la rutina ha de ejecutar.
byte uni,dec,cen: Una sencilla línea de definición de variables, en este caso tres tipo byte, recuerden que
debido a la estructura, antes de cualquier cosa dentro de una función van las definiciones de las variables,
este punto es crítico cuando se crea el proyecto por el PROJECT WIZARD, se debe fijar que encima de
las líneas creadas automáticamente en la función principal (dentro del void) se definan las variables, de lo
contrario PIC C mostrará error.

Las líneas venideras como la referente al ADCON y los TRISx demuestran la versatilidad de PIC C, pues
permite definir variables tan elementales del PIC como estas y configurarlas tal cual se haría en ASM, y
sin la necesidad de usar los comandos específicos de este lenguaje (#ASM… #ENDASM). Posteriormente
se usarán los métodos definidos específicamente para C, como el uso de apuntadores, sin embargo, este
método es más práctico en casos específicos.

lcd_init(): Esta instrucción es propia de la librería de la pantalla LCD, es usada para inicializar este
elemento, siempre se usa en las primeras líneas de la función principal.

lcd_putc('\f'): Esta línea se usa para limpiar el LCD de cualquier registro que le haya quedado de un uso
anterior, también es usada para imprimir datos o líneas de datos en el LCD.

while(true): Esta declaración genera un ciclo infinito, es decir, repite una misma rutina una y otra y otra
vez, con el fin de que el microcontrolador siempre ejecute una tarea en específico y no se bloquee.

if(bit_test(porta,0)==1): Esta otra declaración es usada para testear o revisar el estado del pin A0 del
microcontrolador, esto se puede ver por medio de su estructura; el if es la declaración de decisión es decir,
si se cumple con la condición dada entre los paréntesis se ejecuta la tarea de lo contrario se ignora; bit_test
es el encargado de revisar el pin referenciado dentro de los paréntesis siguientes; (porta,0) referencia el
pin del microcontrolador a revisar, primero se le dice que puerto o variable debe tomar y después de la
coma se pone el pin o bit a testear, y en conjunto nos dice que el objetivo es el pin A0, de igual forma se
pueden testear bits de variables definidas por el usuario; finalmente la condición “==1” se refiere al estado
en el que se debe encontrar el pin para que se pueda ejecutar la declaración. En otras palabras, esta
instrucción se puede leer: Si el pin A0 del microcontrolador está en uno haga…

lcd_gotoxy(1,1): Su objetivo es posicionar el cursor del LCD en el lugar designado por los números
entre los paréntesis, el primero posiciona el cursor en la columna y el segundo en la fila (y,x).

printf(lcd_putc,"Contador ON "): Imprime la serie de caracteres escritas entre las comillas en la


pantalla LCD.

for(cen=0;cen<10;cen++): esta es una declaración de conteo desde cero hasta 9, y cada cambio queda
registrado en la variable cen.

lcd_putc(secu[uni]): Imprime en el LCD el carácter de la matriz secu de la posición designada por el


valor de la variable uni. Es decir, si uni tiene el valor de 3, el programa mostrará el carácter de la
posición 3, que para este caso es el valor ASCII de 3; se debe tener en cuenta que si el valor de uni
apunta a una posición inexistente en la matriz el programa se bloquea completamente.
delay_ms(100): Genera un retraso de 100 milisegundos, el tiempo es determinado por el número entre
paréntesis y el acrónimo ms, también se puede usar microsegundos usando us así delay_us. Estos
tiempos no son completamente exactos pues varían según el programa, por ende si se desean tiempos
exactos se debe acudir a los Timer que posea el PIC.

else: es la otra parte de la declaración if, y se encarga de cubrir las otras posibilidades que no hace las
instrucciones dentro del if.

Esperamos que con esta detallada explicación de las instrucciones usadas en el programa ejemplo sean
de ayuda y se pueda comprender la programación en PIC C.

Finalmente y como un bonus dejamos un video tutorial para compilar programas de PIC C en el programa
oficial de Microchip:

Seguir link de youtube https://youtu.be/xIozjzoKZh4

Estos son los parámetros más básicos de PIC C, en los documentos descritos en las referencias, se puede
conseguir mayor información, sin embargo la principal herramienta es la curiosidad, cualquier duda,
comentario u observación que tengan no duden en dirigirse a nuestro correo electrónico y redes sociales,
aunque no seamos los mayores expertos, también podemos aprender con ustedes, muchas gracias por
leer nuestro artículo.

Estos son los parámetros más básicos de PIC C, en los documentos descritos en las referencias, se puede
conseguir mayor información, sin embargo la principal herramienta es la curiosidad, cualquier duda,
comentario u observación que tengan no duden en dirigirse a nuestro correo electrónico y redes sociales,
aunque no seamos los mayores expertos, también podemos aprender con ustedes, muchas gracias por
leer nuestro artículo.

REFERENCIAS

http://es.wikipedia.org/wiki/C_(lenguaje_de_programaci%C3%B3n)

http://www.aquihayapuntes.com/indice-programacion-pic-en-c.html

Compilador C CCS y simulador Proteus para Microcontroladores PIC, de Eduardo García

Manual de usuario del compilador PCW de CCS

http://ww1.microchip.com/downloads/en/DeviceDoc/39582b.pdf
Cómo programar un microcontrolador con PIC C.pdf

IF - ELSE.jpg

Programa ejemplo (manejo LCD).C

Programa ejemplo (manejo LCD).hex

Programa ejemplo.c

Simulación manejo LCD.DSN

También podría gustarte