PROGRAMACION DE MICROCONTROLADORES Ing. Adriana Ramírez Mora UMB
Aunque el microcontrolador tiene la posibilidad de real ea liza r muc ha s funciones nciones,, sol solo o real ea liza rá lo que nosotrosle digamosque haga. Para ara est esto se debe debe cargar cargar en su memor emoriia de prog progrra ma la s inst nstrucc uc c iones que debe de be seguir eguir. Esta s instrucc iones ones son unos y ceros ceros que que el mic ro inter nterp p retar eta rá y real ea liza rá d e maner ma nera a sec uenci uenc ia l. Al conjunto de instrucciones que se cargan en el mic mic ro c o ntr ntro la d o r se le le lllla ma programa. ma programa.
PA SO S PA PAS PAR RA DAR DA R SO LUC IÓ N A UN UN PROBLEMA 1. Anal Ana liza r la la situac ión prob probllema, det de term erminar la s ent entra das da s y sa lidas da s, des de sc ribirde bir de manera manera gener ge nera a l el proc proc eso eso 2. Ela b o ra r d ia gra gra ma de d e fluj flujo o 3. Esc ribir el p ro g ra ma en e n el lenguaj ngua je es e sc o gido 4. Compilar 5. Corregir errores 6. Si es p o sible ible simula simularr 7. C a rgar ga r el c ódi ód igo en e n el mic mic roc ontr ontrola ola dor do r 8 Prueba Prueba en Pr Protoboa otob oa rd
DIAGRAMA DE FLUJ O
El diagrama de flujo es una representación gráfica que muestra detalladamente el algoritmo de un programa, consiste en una serie de símbolos gráficos que representan por si solos acciones o decisiones unidos por flechas que determinan el flujo del programa, los símbolos de acciones o decisiones contienen en su interior un paso de la sec uencia generada por el pseudoc ódigo. El análisis del problema puede conducir inmediatamente al desarrollo de un diagrama de flujo que integra en un solo paso el pseudocódigo y el diagrama mismo, aunque los diagramas de flujo contienen símbolos diversos para representar las acciones, se utilizaran básicamente cuatro de ellos
SIMBOLOS
Recomendaciones al realizar diagrama de flujo
Desarrollar primero el algoritmo ojala en pseudocódigo, definiendo las entradas (variables y constantes), el proceso (acciones, decisiones o bifurcaciones) y el resultado (almacenado en memoria, acción sobre periféricos (visualizar, actuar, activar). Utilizar adecuadamente la simbología grafica acorde con la acción determinada en la secuencia del pseudoc ódigo. Representar el diagrama de arriba hacia aba jo y/o de izquierda a derecha. Los símbolos se conec tan por flec has que indican la direc ción del flujo del programa, es rec omendable utilizar solo líneas horizontales y verticales., no diagonales. Los símbolos pueden tener más de una línea de entrada.
Recomendaciones al realizar diagrama de flujo
Los símbolos de decisión deben contener dos líneas de salida (si/no; falso/ verdadero; cumple/ no c umple). Los textos deben estar escritos de forma clara y legible evitando usar muchas palabras. Se recomienda no cruzar líneas de flujo pues se c onfunde c on un nodo. No dejar líneas de flujo sin conectar. En caso que el diagrama de flujo haga un llamado a otro programa representarlo como una acción que se dirija a esa subrutina seguida de otra que retorne el resultado de la misma. Se recomienda nombrar ca da programa y subprograma (subrutina) de manera que al convertirlo en lenguaje
EJ EMPLOS DIAG RAMAS DE FLUJ O
LENGUAJES DE PROGRAMACIÓN PARA MICROCONTROLADORES PIC
LENGUAJ ES DE PROGRAMAC IÓN Existen varios lenguajes de programación para microcontroladores PIC, entre ellos tenemos: •
•
•
•
•
Lenguaje de máquina Lenguaje ensamblador C para pic (XC8, PICC, MicroC ) Basic para pic Niple
Un error común que se comete cuando se menciona la posibilidad de programar en Basic o C es pensar que con Visual Basic o Visual C++ se puede elaborar rutinas pa ra PICs, pero en realida d lo que se debe tener en cuenta es que existen compiladores espec iales para estos lenguajes y por ende la sintaxis es diferente de la de un lenguaje orientado a objetos.
LENGUAJ ES DE PROGRAMACIÓN El lenguaje que entienden los microcontroladores es el lenguaje máquina, así que si se escribe el programa en otro lenguaje se debe realizar una traducc ión a lenguaje máquina, esta tarea la realiza un software espec ífico, para lo cual se requiere de tres pasos: 1. Editar el programa en su formato fuente (Escribir las instrucciones en el lenguaje escogido) 2. Compilar (Traducir) y Depurar (Buscar errores sintácticos y lógicos) 3. Realizar las correcciones
LENGUAJES DE PROGRAMACIÓN Código fuente: Es el conjunto de líneas de texto que representan las instrucc iones que debe seguir la CPU para ejecutar el programa, este código describe completamente el funcionamiento del programa, aunque no es directamente ejecutable teniendo que pasar por un compilador para ser traducido a lenguaje maquina o código objeto. Los compiladores Se encargan de traducir el programa fuente en c ódigo maquina, estos son espec íficos del lenguaje en c ual se programe
LENGUAJ E DE MÁQUINA Este lenguaje es el que entiende directamente el micro, son las instrucciones en binario (unos y ceros), lo que hace que su escritura y compresión sea bastante compleja, aunque para simplificar se representen en hexadecimal. Como desventaja el lenguaje máquina tiene: Difícil de recordar la cadena que identifica una instrucción Diferencia entre set de instrucciones de un micro a otro •
•
LENGUAJE ENSAMBLADOR En el lenguaje ensamblador se solucionan varios de los inconvenientes del lenguaje máquina al remplazar el código binario por mnemotécnicos que usan términos de fácil asociación a la operación que rea liza la instrucción. Ej.
Codigo Binario Codigo Hex. MNEMOTÉCNICO 1011010000001000 B408 MOV AH, 08 El lenguaje ensamblador es considerado un lenguaje de bajo nivel aunque es mucho más fác il que el lenguaje máquina, mantiene la dependencia al tipo de proc esador.
LENGUAJ E ENSAMBLADOR Ventajas: Es el lenguaje de bajo nivel natural de la línea PIC tanto para gama baja, media o alta. C on el se tiene un aprovechamiento eficiente de los rec ursos del PIC. Se pueden crear macros con este lenguaje, para después simplificar el código en diferentes desarrollos. C on el se pueden controlar los tiempos y los registros bit a bit. Excelente pa ra manejar interrupc iones simultánea s. C uando se genera el archivo .hex éste es completamente optimizado. Desventajas: Se requiere experiencia en programación, puede ser más complicado que los otros lenguajes de programac ión
C PARA PIC Ventajas: Es un lenguaje de a lto nivel. Puedes construir rutinas matemáticas fácilmente. Puede ser de a yuda al combinarlo con Ensamblador sobre todo en la ga ma alta. Se pueden crear macros con este lenguaje, para d espués simplifica r el código en diferentes desarrollos. Es aceptado por la empresa fabricante Microchip, incluso ellos tienen algunos compiladoresC. Desventajas: Los programas al compilarlos pueden resultar un poc o extensos y pesados. Con este lenguaje no se puede controlar del todo los tiempos y los registros bit a bit.
Ejemplo PICC
BASIC PARA PIC Ventajas: Es un lenguaje muy simple y con instrucciones fác ilmente legibles, incluso por no expertos. Desventajas: Nunca se tiene el control del programa en c uanto tiempos de ejecución y control de registros bit a bit. Es muy complicado el manejo de interrupciones simultáneas en este lenguaje. Tiene limitaciones cuando genera el archivo .hex, es dec ir no optimiza el tamaño de memoria de programa del PIC. La mayoría de compiladores pa ra este lenguaje pueden utilizarse únicamente bajo ambiente Windows.
BASIC PARA PIC Existen varias casas que producen compiladores para este lenguaje, entre ellas se pueden mencionara: www.letbasic.com www.melabs.com www.basicmicro.com El más conocido y que a mi parecer es mejor entre ellos es el PICBASIC PRO de MicroEngineering Labs
Ejemplo BASIC PARA PIC
NIPLE Niple es un lenguaje mayormente gráfico, muy amigable, que permite con conocimientos básicos de PIC , crear en base a diagramas de flujo un programa. Esto significa que, cada parte de éste diagrama es una especie de makro, que combinado con la posibilidad de configurar los puertos del dispositivo en forma gráfica, y algunos datos específicos de cada desarrollo termina generando un código de peso respetable.
NIPLE Ventajas: Tienes rutinas resueltas, como comunicación serie por soft, comunicación serie por USART, manejo de LCD, Comunicación I2C. Es muy ameno y sencillo hacer programas de una complejidad media. Limitaciones: Si bien se han ampliado la cantidad de dispositivos PIC para los que se puede usar Niple todavía son pocos (16F84 / 16F877 / 16F628 / 627 / 648), sigue habiendo un Niple para dispositivos de 28 pines y otro para los de 40... o sea, no es un Niple general que permite general código para cualquiera de los dispositivos disponibles.
XC8 MPLAB
COMPOSICIÓN GENERAL •
•
•
•
•
•
Directivas de Pre-procesamiento Declaración de constantes Declaración de variables globales Funciones definidas por el usuario Función MAIN Comentarios para entender el funcionamiento del programa
DIRECTIVAS DE PREPROCESAMIENTO Le dice al compilador que realice algunas tareas antes de compilar el programa, como por ejemplo: Incluir librerías: #include <>se encuentra en plibs, “ ” Cuando se encuentra en la carpeta del proyecto Definirfusibles: #pragma config FOSC =XT_XT Para poder usar la función delay... es necesario indicar al compilador la frec uencia del reloj con #define _XTAL_FREQ 20000000 por ejemplo.
•
•
•
Entre otros.
COMENTARIOS Para entender siempre el programa hecho, sea por otra persona o por nosotros mismos cuando lo retomemos después de algún tiempo, es importante realizar comentarios de todo lo realizado. En XC8 al final de cada instrucc ión se debe poner punto y coma (;) para indicar que ahí termina la instrucción. Para realizar comentarios se utiliza // c uando se desea que el comentario quede en la misma línea. Si el comentario utiliza más de una línea se utiliza /* y cuando se termine el c omentario se usa */ para indicar que terminó el comentario
Para trabajar sobre un registro específico se usa el mismo nombre que tiene en el datasheet: TRISB, LATD, PORTA. Para trabajar sobre un bit específico del registro se usa: LATDbits.LATD0 o simplemente LATD0 o LD0 PORTDbits.RD1 o Simplemente RD1
RBPU =1; //para apaga r las Resistenc ias de PullUp del puerto Frec uencia del oscilador interno se c onfigura en OSCCON con los bits Selec ción de la frec uenc ia del oscilador interno
•
Declaración de constantes Con #define por ejemplo: #define ON 1 //la palabra on valdrá siempre 1 #define OFF 0 // la palabra off valdrá siempre 0 #define led LATD0 //nombra Led al bit 0 del LATD #define sw RD1 //nombra sw al bit 1 del PORTD
DECLARACIÓN DE VARIABLES GLOBALES Las variables será donde se guarden los datos de los proc esos, como contad ores, sumas, promedios, eda d…etc. Según el programa diseñad o. Se llaman variables globales porque serán usadas en cualquiera de las funciones que contenga el programa. Antes de usar las variables, estas deben ser declaradas, indicando el tipo de variable del que se trata y su nombre, escritas en ese orden: Tipo Variable Ejemplo: Int cont En el ejemplo se define una variable llamada cont, de tipo entero (Int)
Tipos de Datos TIPO Bit Signed char Unsigned char Signed int Unsigned int Signed long Unsigned long Float Double id
TAMAÑO 1 bit 8 bits 8 bits 16 bits 16 bits 32 bits 32 bits 32 bits 64 bits
RANGO 0o 1 -128 a 127 0 a 255 -32768 a 32767 0 a 65535 -2147483648 a 2147483647 0 a 4294’967295 ±1.175x10−38 a ±3.402x1038 i
DESCRIPCIÓN Bit Entero con signo Entero sin signo Entero largo con signo Entero largo sin signo Entero de 32 bits Coma flotante Coma flotante i l
Tipos de datos Si el signo no se especifica junto al tipo de dato, este será por defecto c on signo a excepc ión del tipo c har que por defecto es sin signo. El tipo bit siempre se lo toma sin signo. Ej. Char conta1 // define c onta1 como variable entero 8 bits sin signo int signo
conta2 //define conta2 como variable entera 16 bits con
Char conta3 =0; //Entero sin signo inicializado en el valor 0
Los valores se pueden especificar en decimal, binario, octal, hexadec imal… entre otras, así: •
•
•
•
•
Decimal: 123 Octal se antepone un cero: 0452 Hexadecimal se antepone 0X: 0x3F Binario se antepone 0b: 0b10001110 Carácter se escribe entre comilla sencilla: ‘a’
En el momento de definir las variables se les puede o no asignar un valor. Ej: Int segundos=0, minutos=0, horas=1, tabla; Se está definiendo cuatro variables, todas de tipo entero, las primeras tres inician con un valor. A la variable tabla no se le asigna ningún valor.
Vectores Para definir un vector se usa: char tabla[10]; //define un vector llamado tabla con diez posiciones tipo char cada uno Para definir con valores iniciales se ingresan los valores entre corchetes separados por coma char tabla[3]={5,4,8}; //numeración de izq derecha iniciando en 0 Para guardar un valor en una posición específica del vec tor se hace: Tabla [0] = 4; //guarda el valor cuatro en la posición cero del vector
FUNCIONES La s func unc iones son c onjun onjunttos de inst nstrucc iones que real ea lizan una una tarea area espe especc ífic fic a , dent de ntrro de est esta s se encuent enc uentrra el prog progrra ma pri princi nc ipal pa l que se denota d enota c omo func funciión main(). Existen otra otra s func funciiones que tra e el c ompila ompila dor do r par pa ra hac er má má s fác il la prog progrramaci amación ón y otr otras que que pued pueden en ser cread creadas as por por el progr progra a mador mado r (como (c omo subrut ubrutiinas), nas), que tendrán endrán el nombr nombre e que le asi asigne el progr programado amadorr según la func unc ión que c umpla. pla. Tod Todo o prog progrra ma en C debe de be c ontener la func funciión main() main()..
FUNCIÓN MAIN Esta func funciión conti c ontiene ene el e l prog progrra ma pr p rinci nc ipa l y sin impor importar tar su pos po sic ión dentr d entro o del de l a rc hivo hivo de texto texto del prog progrra ma ser será á la pri primera mera en e n ejecut ejec uta a rse. indic ar e l inicio inicio Tod Toda a función devuelve devuelve un va va lor, or, a unque unque es e ste sea sea nul nulo, Para indic de la función principalse debe escribir: void main() { aq uí van las las lílíneas d el prog rama princ princ ipal }
Funciones definidas por el programador Se pueden definir funciones que realicen alguna tarea en particular y que sea invoc nvoc a da des de sde el e l prog progrra ma pri princi nc ipa l (como (co mo lllla mado mad o a una subr subrut utiina), Para Para esto esto se debe deb e c rear ea r la la func unc ión c on sus ins instr trucc ucc iones ant a ntes es del d el progr programa ama pri principa ncipall, por ejempl ejemplo: o: Void sieteseg eteseg() () { se esc esc riben be n la s líneas nea s de pr p rogr og ra ma de la la func funciión } C uando se se des de see lla lla mar la func func ión des de sde la func funciión pri princi nc ipa l solo se se debe de be es e sc ribir: bir: sieteseg();
Funciones se dec laran antes del main, si las pongo después del main se debe declarar como prototipo antes del main para que las reconozca: // prototipos Void funcion1(); //función principal Void main(void) { ………. } //funciOnes Void funcion1() { …instrucciones de la función }
OPERACIONES Operación
OPERACIONES ARITMÉTICAS
Simbolo
Suma
+
Resta
-
Multiplicación
*
División
/
Módulo (Resto de la división)
%
Incremento
++
Decremento
--
Operaciones Operación
OPERACIONES LÓGICAS
Not And Or Operación Menor que
OPERACIONES RELACIONALES (Se usan especialmente para preguntar)
Mayor que Menor o igual que Mayor o igual que Igual Distinto
Simbolo ! && || Simbolo
< > <= >= == !=
Operaciones Operación Asignación de suma (a+=b equivale a a=a+b) Asignación de resta (a-=b equivale a a=a-b) Asignación de multiplicación (a*=b equivale a a=a*b) OPERACIONES Asignación de división (a/ =b equivale a a=a/ b) DE Asignación de módulo (a%=b equivale a a=a%b) ASIGNACIÓN Asignación de desplazamiento a la izquierda Asignación de desplazamiento a la derec ha Asignación AND (a&=b equivale a a = a&b) Asignación OR (a| =b equivale a a = a| b) Asignación XOR (a^=b equivale a a=a^b)
Símbolo += -= *= /= %= <<= >>= &= |= ^=
Ej. operaciones aritméticas char A=7, B=3, C, D, E, F; //Declaramos variables C =A+5; D = A+B;
//C sería igual a 12 // C sería 10
E = B – 2; //E sería 1 F =A - B; // F sería 4 C =5*A; D = A*B
// C sería 35 // D sería 21
Ej. operaciones aritméticas char A=9, B=2, C, D, E, F; //Declaramos variables FLOAT G; //dec laramos G como flotante C = A/ 3; D = 10/B; E = A/B; F = A%B G =A/ B; A++; B--;
// C sería 3 // D sería 5 // como E se definió como entero, sería 4 // F sería el resto de la división: 1 // Como G es de tipo float sería 4,5 // realiza A=A+1 // realiza B=B-1
Retardos El __delay_ms(x) o __delay_us(x) usa la frec uencia del reloj por lo cual depende de esta el máximo valor que podemos poner en x
Se debe definir al inicio la frecuencia del cristal: #define _XTAL_FREQ 8000000
Retardos Puede usarse también las siguientes funciones de retardo de C18 Delay10TC Yx(i);// 10.Tcy.i genera una demora de 10 ciclos de instrucciones*i Delay100TCYx(i); //100.Tcy.i genera una demora de 100 ciclos de instrucción*i Delay1KTC Yx(i); //1000.Tcy.i genera una demora de 1000 ciclos de instrucciones*i Delay10KTC Yx(i); //10000.Tcy.i genera una demora de 10000 ciclos de instrucción*i Para usar estas debe incluirse la librería delays.h que viene de C 18 y definir la frec uencia de reloj: #define _XTAL_FREQ 4000000 #include
Estructuras de decisión
Como su nombre lo indica las declarac iones de control se enca rgan de controlar el flujo de los datos o del proceso de ejecución del programa. Las dec larac ionesde control más usadas son: if – else Switc h, c ase While For
IF - ELSE
IF - ELSE Sirve pa ra tomar decisiones, con este se realiza una pregunta cuya respuesta es si o no: La forma de usarlo es: If(pregunta) { instrucciones a realizar si se cumple la pregunta } Else { Instrucciones a realizar si no }
IF-ELSE Se pueden realizar preguntas de igualdad utilizando == Ejemplos: Si quiero saber si dos variables son igua les: If (a==b) Si quiero saber si una variables es igual a un valor espec ífico if (a==20) Si quiero saber si dos variables son diferentes se usa != así: If (a!=b) •
•
•
IF - ELSE Como se notará la pregunta se realiza dentro del IF no dentro del else, se sobre-entiende que el else es el no de la pregunta que se realizó en el if . Ejemplo: If(A==10) { contador++; } Else { contador--; } Puertoc=contador
IF-ELSE También se puede usar operadores relacionales, ejemplos: Si a es menor que b: if(ab) Si a es mayor o igual que b: if(a>=b) Si a es menor o igual que b: if(a<=b)
IF-ELSE También se puede realizar operaciones lógicas para tener en c uenta varias opc ionesa la vez, por ejemplo: Se desea que se realice una acción dentro del if si se cumple que la variable a=1 y la variable c=5: if ((a==1)&&(c==5)) Otro ejemplo si se desea realizar una acción dentro del if cuando a o b sean 1: if ((a==1)| | (b==1)) Note que se debe usar un paréntesis para el if (en los ejemplos en rojo) y paréntesis aparte para cada expresión (en los ejemplos en azul)
if ( X ) //pregunta si X=1 If ( !X ) //pregunta si X =0
SWITCH
SWITCH
Sirve pa ra dec isiones múltiples, donde la pregunta no tiene solo la posibilidad de si o no sino que puede tener diferentes valores
SWITCH La forma de usarlo es: Switch (expresión) { case valor1: instrucciones a realizar si es el valor1 Break; //con break se sale del switch case valor2: instrucciones a realizar si es el valor2 Break; ….. Default: …… }
SWITCH Ejemplo: se desea tomar decisiones según el valor de un contador, si este se encuentra en 0 se debe poner en el puerto C un 3F, si el contador se encuentra en 1 se debe enviar al puerto C un 06, si el contador se encuentra en 2 se debe enviar al puerto C un 5B y si se encuentra en 3 se debe enviar al puerto C un 4F. Después de realizar estas preguntas se debe poner en 1 el puerto A
SWITCH
Ejemplo: Switch (Cont) { case 0: portc=0X0F; break; case 1: portc=0X06; break; case 2: portc=0x5B; break; case 3: portc=0x4F; break; } Porta=1;
SWITCH Se debe tener en cuenta que: Los casos deben ser concretos, no se puede por ejemplo preguntar si es menor o mayor o igual sino que se tiene que ponerel valor específico. El Switch al igual que el if-else no es repetitivo
ESTRUCTURAS DE REPETICIÓN
WHILE (MIENTRAS QUE..)
WHILE Se usa para repetir instrucc iones varias veces, esta debe tener una condición que c ontrola la sec uencia de repetición y c uando debe salir de este. La forma de usarlo es: While(condicion) { instrucciones a repetir mientrasse cumpla la condición }
WHILE Ejemplo: se desea verificar si la variable pulso cambia a 1, mientras sea cero debe estar monitoreando, cuando cambie a 1 debe salir a realizar el resto de tareas. While (pulso=0) { } No hay instrucc iones porque no se pide que realice nada mientras espera que pulso cambie a 1. Cuando pulso cambie a 1 saldrá del while
WHILE Ej2. Se desea esperar que la entrada RC,2 cambie a 1, mientras espera se debe realizar una subrutina llamada visualización, cuando RC,2 cambie a 1 se debe poner en 1 el bit 5 del puerto D
Como el while repite mientras se cumple la condición preguntamos si RC,2 es 0, en lugar de preguntar si es 1.
WHILE El segmento de programa queda ría así: While(RC 2 == 0) { visualizacion(); } LATD5=1;
WHILE Ej.3 se desea realizar un contador de 0 a 9 que incremente cada 100 ms automáticamente usando WHILE y visualice el conteo Cont=0; While(cont<9) { __delay_ms(100); cont++; visualiza(); }
DO … While Realiza las acciones una vez antes de preguntar si la condición se cumple
FOR (para)
FOR Se usa para repetir instrucciones varias veces, a diferencia del While, en el Forse define desde el principio la cantidad de vecesque se realizará La forma de usarlo es: For(valor inicial de la variable; condición de finalización ; incremento de la variable) { instruccionesa realizar }
FOR Por ejemplo para el contador de 0 a 9: For(conta=0 ; conta<10 ; conta++) { __delay_ms(100); visualiza(); } Para que se ejecute un bucle sin fin se utiliza: For( ; ; ) { Instrucciones a repetir de manera infinita }
Ejemplo En este ejemplo se enciende y apaga automáticamente un led con intervalos de 1 segundo, para esto se usa una función que requiere el parámetro t, este valor se usa para delimitar las iterac iones del for. En el ejemplo se envía el parámetro 100, así que el for repetirá 100 veces el retado de 10mspara un total de 1s.
Continue; La sentencia c ontinue hace que el programa regrese al principio de un bucle sin completar la iterac ión actual. Ejemplo: while (i < 4) { i++; if (i == 2) continue; printf (“Iteración%d\n", i); }
En pantalla se vería: Iterac ión 1 Iterac ión 3 Iterac ión 4