Cómo Programar Un Microcontrolador Con Pic C PDF
Cómo Programar Un Microcontrolador Con Pic C PDF
ESCRITO POR CAMILO ANDRS FELIPE CASTRO VARN INGENIERO ELECTRNICO Correo electrnico: [email protected] Twitter: @incoelectronica Pgina en Facebook: http://www.facebook.com/INCOELECTRONICA Pgina oficial: https://sites.google.com/site/incoelectronicasas/ Pgina en Youtube: http://www.youtube.com/user/INCOELECTRONICA
Este artculo se basa en distintas fuentes de informacin, las cuales fueron citadas correspondientemente, la redaccin y edicin es total responsabilidad del autor. El objetivo de este documento es nicamente acadmico, si se desea ampliar informacin no dude en escribirnos en nuestra pgina oficial, correo o alguna de las redes sociales en las que nos encontramos adscritos. De antemano gracias por preferirnos.
CMO 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 mquina o ensamblador (ASM) que se maneja por defecto, este hace los programas ms fciles de escribir, analizar y comprender. PIC C ha sido desarrollado por PIC CMU, y cuenta con una gran cantidad de libreras 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 Garca. 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.
Fuente. Autor. El lenguaje C es un tipo de programacin que pese a ser uno de los ms bsicos en esta rea, sigue siendo una gran herramienta en el momento de crear diferentes rutinas para un microcontrolador. Este lenguaje bsicamente es un sistema de decisiones, por ello realizar un diagrama de flujo antes de escribirlo es de gran ayuda (para ms informacin visitar el enlace que acompaa la figura 2).
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 cdigo completo directamente en un archivo con extensin ".C" (ms adelante se tratar este tema), cualquiera que sea el caso que se vaya a usar, la estructura es prcticamente la misma:
#include <16f876.h> #fuses XT,NOWDT,PUT,NOWRT #use delay(clock=4000000) #use fast_io(B) int1 cambio=0; #INT_EXT ext_isr() { output_toggle(PIN_B7); } -| |-------Directivas | | --| |-------Funcin o funciones secundarias --
-| | | | | | | |-------Funcin principal | | | | | | --
x x
x x
Las directivas dan los parmetros 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 segn se programe. La funcin principal es la columna vertebral del programa y es la primera en ejecutarse segn su diseo, har las llamadas correspondientes tanto a las libreras como a las funciones secundarias. Las funciones secundarias, son aquellas subrutinas en las que se apoya la funcin principal para su correcto funcionamiento, principalmente se usa para no repetir la escritura de un cdigo una y otra vez o por simple orden. Las instrucciones son el cdigo 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 estn disponibles para la programacin de microcontroladores, por esta razn se darn a conocer los comandos disponibles y los exclusivos para PIC C. x Constantes: Estos son las constantes que acepta PIC C. Tipos de datos Tipo de dato al que corresponde Decimal Octal Hexadecimal Binario Carcter Carcter Octal Carcter hexadecimal Constantes definidas por sufijo Sufijo Tipo de dato al que corresponde 127U Entero de 8 bit 80UL Variable de 8 bytes 80L Entero de 16 bits con signo 80F Valor de ponto flotante de 32 bits Con comillas simples C Carcter Caracteres especiales Efecto Retorno de lnea Retorno de carro Tabulacin Backspace
Definicin 123 0123 0x123 0b011011 x \010 \xA5 Definicin Int8 Long Signed INT16 Float Char Definicin \n \r \t \b
Tipos de datos: PIC C acepta los siguientes los siguientes tipos de datos. Tipo Int1 Short Int Int8 Int16 Long Int32 Float Char Void Signed Int8 Signed Int16 Signed Int32 Tamao 1 bit 8 bit 16 bit 32 bit 32 bit 8 bit 8 bit 16 bit 32 bit Rango 0a1 0 a 255 0 a 65535 0 a 4294967295 1.175x10-38 a 3.402x1038 0 a 255 -128 a 127 -32768 a 32767 -231 a +(231-1) Descripcin Entero 1 bit Entero de 8 bit Entero de 16 bit Entero de 32 bit Coma flotante Carcter Sin valor Entero con signo Entero largo con signo Entero 32 bit con signo
Variables: La definicin de las variables dentro del programa es la misma para todas: [Tipo de variable] o o [Nombre de la variable]= [Valor inicial de la variable]
El tipo de variable se refiere a las definiciones descritas en el punto anterior. El nombre de la variable es aquella con que el programador la identificar, esta puede tomar cualquier valor con la condicin 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 ms de una palabra se puede escribir usando la raya al piso nombre_de_la_variable. El valor inicial de la variable puede ser cualquiera que est dentro de los lmites 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 drselos para asegurar que el programa inicie con los valores que queremos, existe un pequeo problema que al programar un microcontrolador sin borrarlo primero, el nmero de registro que se le asigne a la variable que acabamos de definir tenga un valor an, esto puede provocar malestares que en el momento de hacer las pruebas en fsico, no se encuentre el error, tenga esto en cuenta.
La nica diferencia de las variables est en la posicin dentro del programa en la que se escriban, segn sea esta, son de tipo global o local: o Variables de tipo local: Aplican dentro de la funcin en las que sean definidas.
Variables de tipo global: Aplican para todo el programa, se pueden citar dentro de la funcin principal como tambin en las secundarias.
byte variable_global void funcin_secundaria() { variable_global++; } void main() { while(1) { funcin_secundaria(); } }
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. x Operadores y expresiones: Las operaciones son aquellas usadas para cumplir con la tarea lgica de nuestro programa ya sean sumas o restas aritmticas o lgicas, mientras que las expresiones cumplen con la misma tarea, con la diferencia que no necesita escribir toda la ecuacin para que el programa lo entienda, por ejemplo: o o Operacin => i=i+1 Expresin => i++
Ambos tienen el mismo efecto sobre el registro i lo nico que difieren es en la escritura de la instruccin, 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 ms y ms complejos se empieza a ver la diferencia. En el siguiente cuadro se dar a conocer los operadores y expresiones ms comunes:
Tipo de operador
Definicin
Operadores de asignacin
>>= &= |= ^^= ~= ++ -+ * / % < > <= >= == != ! && || ~ & ^^ | >> << & * ->
Operadores aritmticos
Operadores relacionales
Comparan y dan un resultado: 1 verdadero, 0 falso. Comparan cada registro y realizan la operacin correspondiente. Hacen la misma tarea de los operadores lgicos a nivel de bit y solo variables de tipo entero. Son capaces de mover las posiciones de los bits de un registro. Capaces de apuntar y tomar el valor de un puntero.
Operadores lgicos
Descripcin Asignacin de suma. Asignacin de resta. Asignacin de multiplicacin. Asignacin de divisin Asignacin de resto de divisin. Asignacin de desplazamiento a la izquierda. Asignacin de desplazamiento a la derecha. Asignacin de AND de bits Asignacin de OR de bits. Asignacin de OR exclusivo de bits. Asignacin de negacin de bits. Asignacin de incremento. Asignacin de decremento. Suma. Resta. Multiplicacin. Divisin. Cambio de signo. Mdulo, resta de una divisin entera. Menor que... Mayor que Menor o igual que Mayor o igual que Igual que Distinto a Negado lgico (NOT). Y lgico (AND). O lgico (OR). Negado de bits (NOT). Y lgico de bits (AND). O lgico exclusivo de bits (XOR). O lgico de bits (OR). Desplazamiento a la derecha. Desplazamiento a la izquierda. Directo Indirecto Puntero a estructura
Funciones: son las encargadas de separar el programa en segmentos de cdigos, como ya se haba mencionado anteriormente, existe la funcin principal complementada de una o ms secundarias con el fin de ahorrar lneas repetidas de instrucciones. Al igual que las variables se deben de definir al comenzar el programa y se pueden separar en libreras o ficheros si se desea, con la extensin .h o .c. Declaraciones de control: Estas declaraciones se encargan de controlar el proceso del programa:
Sentencia
Descripcin
Diagrama de flujo
Ejemplo de cdigo
if(A==5) { Decisin 1; } else { Decisin 2; }
If else
While
while(A==5) { Proceso; }
Do While
do { Proceso; } while(true)
For
for(A=0;A>=5;A++) { Proceso; }
switch (A) { Case 1: Proceso 1; break; Case 2: Proceso 2; break; Case 3: Proceso 3; break; }
Devuelve los datos a las funciones. Permite Salir de un bucle. Realiza un salto incondicional.
Comentarios: Ayudan a aclarar ciertos aspectos del programa, son muy tiles en dos casos especficos, 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 acompaa de un diagrama de flujo este ltimo no se sentir tan perdido; no tienen ningn efecto sobre el programa. Los comentarios se pueden escribir de dos maneras: o Los de una sola lnea: El comentario empieza con dos barras diagonales // y se escribe lo que se desea. Por ejemplo: INT o Variable=0 // Se define una variable tipo INT
Los de dos o ms lneas: 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 daar el PIC. */
Directivas: Tambin conocidas como directivas de pre-procesamiento, usualmente empiezan con el smbolo # 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 nmero de estas y para no citarlas todas se mencionarn las ms comunes, para mayor informacin recomendamos el libro de Eduardo Garca y el manual de usuario del compilador PCW de CCS (lo puede encontrar en nuestra pgina 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 programacin, por ejemplo: #fuses XT, NOPROTECT, NODEBUG o #include Archivo, incluye en el programa y la compilacin ciertos ficheros o libreras, es muy til para incluir la librera del PIC a usar o de diferentes perifricos, esto evita definir una serie de parmetros que ya estn 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 mquina que requiere alguna instruccin para ejecutarse de la manera ms adecuada: #use delay (clock=4000000) o #ASM y #ENDASM, permite insertar cdigo ensamblador a un programa en C, aunque no acepta todos las instrucciones que pueda disponer el PIC, si tiene los ms 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 haba mencionado dos maneras de realizar un programa en PIC C, una por el PROJECT WIZARD y otra escribiendo todo el cdigo en un documento con la extensin .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 algn medio extrable, ya que este permite compilarse en equipos en donde no se haya hecho el programa. Para hacer el mini-tuto ms didctico se decidi ensear ambos ejemplos por medio de videos, expuestos en nuestra pgina en youtube, aqu dejamos los enlaces: Creacin de un programa en C para microcontrolador PIC a travs del PROJECT WIZARD: http://youtu.be/b-Q_kUv7aCw Creacin de un programa en C para microcontrolador PIC desde un archivo de extensin .c: http://youtu.be/lvK81htVrhs Ya vistos estos videos se tiene idea de lo que se va realizar a continuacin, independientemente del mtodo 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 posicin inicial esperando a que se vuelva a repetir el proceso.
Fuente. Autores. Para compilar el programa se adoptar el mtodo de un archivo con extensin .c, esto para que se pueda descargar el archivo desde nuestra pgina web y pueda compilarse ah mismo, como se demostr en el otro video, el mtodo que se usa tendr el mismo resultado, difiere nicamente en unas pocas lneas:
#include <16F877A.h> #fuses XT,NOWDT #use delay(clock = 4000000) #include <lcd.c> #byte porta=0x05 #byte portd=0x08 #byte trisa=0x85 #byte trisd=0x88 #byte adcon1=0x9f char secu[10]={'0','1','2','3','4','5','6','7','8','9'}; void main() { byte uni,dec,cen; adcon1=0x07; trisa=0x01; trisd=0x00; lcd_init(); lcd_putc('\f'); while(true) { if(bit_test(porta,0)==1) { lcd_gotoxy(1,1); printf(lcd_putc,"Contador ON "); for(cen=0;cen<10;cen++) { for(dec=0;dec<10;dec++) { for(uni=0;uni<10;uni++) { lcd_gotoxy(16,2); lcd_putc(secu[uni]); lcd_gotoxy(15,2); lcd_putc(secu[dec]); lcd_gotoxy(14,2); lcd_putc(secu[cen]); delay_ms(100); } } } } else { lcd_gotoxy(1,1); printf(lcd_putc,"Contador en cero"); lcd_gotoxy(14,2); printf(lcd_putc,"000"); } } }
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 instruccin, 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 instruccin ya se haba explicado anteriormente, con esta se incluye la librera que contiene los datos bsicos 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 mxima ser de 4MHz proveniente de un cristal de cuarzo y que no se har uso del perro guardin o watchdog. #use delay(clock = 4000000): Aqu se configura la base de tiempo del PIC, muchos se preguntarn el porqu es necesaria esta instruccin, esto se debe a que PIC C genera una serie de ciclos de mquina para hacer funcionar el microcontrolador, pero debido a que estos ciclos son inversamente proporcionales a la frecuencia de reloj inducida al PIC (Ciclo de mquina = 4/Fosc), no se puede poner deliberadamente x cantidad de ciclos, o sino el lenguaje C no se podra usar para programar estos dispositivos. #include <lcd.c>: Aunque es la misma instruccin mencionada tres puntos atrs, esta incluye otra librera la del manejo del display LCD, as como esta se pueden incluir tantas libreras como se necesiten sin importar si es propia o de un tercero. #byte porta=0x05: Esta es la primera instruccin de una serie igual, esta se usa para definir variables de tipo byte en una posicin de memoria especfica, qu tiene de especial?, bsicamente porque define una variable importante en la posicin de memoria 05h del microcontrolador, vase la pgina 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 instruccin 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 carcter 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 extensin de la matriz, si se necesita ms de una fila la definicin es por medio de dos nmeros 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 carcter a su formato ASCII de manera transparente. void main(): Esta es la funcin principal, es decir la columna vertebrar de tu programa, no importa cuntas instrucciones y funciones se le pongan encima, C siempre comenzar por ac. Recuerden que seguida de la funcin van los corchetes {}, entre estos se encierran las lneas de comandos que la rutina ha de ejecutar. byte uni,dec,cen: Una sencilla lnea de definicin de variables, en este caso tres tipo byte, recuerden que debido a la estructura, antes de cualquier cosa dentro de una funcin van las
definiciones de las variables, este punto es crtico cuando se crea el proyecto por el PROJECT WIZARD, se debe fijar que encima de las lneas creadas automticamente en la funcin principal (dentro del void) se definan las variables, de lo contrario PIC C mostrar error. Las lneas 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 hara en ASM, y sin la necesidad de usar los comandos especficos de este lenguaje (#ASM #ENDASM). Posteriormente se usarn los mtodos definidos especficamente para C, como el uso de apuntadores, sin embargo, este mtodo es ms prctico en casos especficos. lcd_init(): Esta instruccin es propia de la librera de la pantalla LCD, es usada para inicializar este elemento, siempre se usa en las primeras lneas de la funcin principal. lcd_putc('\f'): Esta lnea se usa para limpiar el LCD de cualquier registro que le haya quedado de un uso anterior, tambin es usada para imprimir datos o lneas de datos en el LCD. while(true): Esta declaracin 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 especfico y no se bloquee. if(bit_test(porta,0)==1): Esta otra declaracin 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 declaracin de decisin es decir, si se cumple con la condicin dada entre los parntesis se ejecuta la tarea de lo contrario se ignora; bit_test es el encargado de revisar el pin referenciado dentro de los parntesis siguientes; (porta,0) referencia el pin del microcontrolador a revisar, primero se le dice que puerto o variable debe tomar y despus 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 condicin ==1 se refiere al estado en el que se debe encontrar el pin para que se pueda ejecutar la declaracin. En otras palabras, esta instruccin 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 nmeros entre los parntesis, el primero posiciona el cursor en la columna y el segundo en la fila (y,x). printf(lcd_putc,"Contador ON pantalla LCD. "): Imprime la serie de caracteres escritas entre las comillas en la
for(cen=0;cen<10;cen++): esta es una declaracin de conteo desde cero hasta 9, y cada cambio queda registrado en la variable cen. lcd_putc(secu[uni]): Imprime en el LCD el carcter de la matriz secu de la posicin designada por el valor de la variable uni. Es decir, si uni tiene el valor de 3, el programa mostrar el carcter de la posicin 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 posicin inexistente en la matriz el programa se bloquea completamente.
delay_ms(100): Genera un retraso de 100 milisegundos, el tiempo es determinado por el nmero entre parntesis y el acrnimo ms, tambin se puede usar microsegundos usando us as delay_us. Estos tiempos no son completamente exactos pues varan segn 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 declaracin if, y se encarga de cubrir las otras posibilidades que no hace las instrucciones dentro del if. Esperamos que con esta detallada explicacin de las instrucciones usadas en el programa ejemplo sean de ayuda y se pueda comprender la programacin en PIC C. Finalmente y como un bonus dejamos un video tutorial para compilar programas de PIC C en el programa oficial de Microchip: http://youtu.be/xIozjzoKZh4 Estos son los parmetros ms bsicos de PIC C, en los documentos descritos en las referencias, se puede conseguir mayor informacin, sin embargo la principal herramienta es la curiosidad, cualquier duda, comentario u observacin que tengan no duden en dirigirse a nuestro correo electrnico y redes sociales, aunque no seamos los mayores expertos, tambin podemos aprender con ustedes, muchas gracias por leer nuestro artculo. 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 Garca Manual de usuario del compilador PCW de CCS http://ww1.microchip.com/downloads/en/DeviceDoc/39582b.pdf