Lenguaje C para microcontroladores microcontroladores El uso del lenguaje C en microcontroladores: Un programa codificado en lenguaje C resulta muy útil en la aplicación de microcontroladores, dado que su compilación es bastante eficiente y óptima acercándose a la codificación de lenguaje de máquina. Lo descriptivo de la sintaxis permite elaborar de mejor forma los algoritmos olvidándose de los molestos push y pop usados en el lenguaje de máquina cuando se usan saltos a subrutinas. El microcontrolador ejecuta el programa cargado en la memoria Flash. Esto se denomina el código ejecutable y está compuesto por una serie de ceros y unos, aparentemente sin significado. Dependiendo de la arquitectura del microcontrolador, el código binario está compuesto por palabras de 12, 14 o 16 bits de anchura. Cada palabra se interpreta por la CPU como una instrucción a ser ejecutada durante el funcionamiento del microcontrolador. Todas las instrucciones que el m icrocontrolador puede reconocer y ejecutar se les denominan colectivamente Conjunto de instrucciones. Como es más fácil trabajar con el sistema de numeración hexadecimal, el código ejecutable se representa con frecuencia como una serie de los números hexadecimales denominada código Hex. En los microcontroladores PIC con las palabras de programa de 14 bits de anchura, el conjunto de instrucciones tiene 35 instrucciones diferentes.
LENGUAJ LENGUAJ E ENSA MB LADOR LADOR Como el proceso de escribir un código ejecutable era considerablemente arduo, en consecuencia fue creado el primer lenguaje de programación denominado ensamblador (ASM). Siguiendo la sintaxis básica del ensamblador, era más fácil escribir y comprender el código. Las instrucciones en ensamblador consisten en las abreviaturas con significado y a cada instrucción corresponde una localidad de memoria. Un programa denominado ensamblador compila (traduce) las instrucciones del lenguaje ensamblador a código máquina (código binario).
UNMSM-FIEE
Circuitos Eléctricos I
Este programa compila instrucción a instrucción sin optimización. Como permite controlar en detalle todos los procesos puestos en marcha dentro del chip, este lenguaje de programación todavía sigue siendo popular.
Ventajas de lenguajes de programación de alto nivel A pesar de todos los lados buenos, el lenguaje ensamblador tiene algunas desventajas: Incluso una sola operación en el programa escrito en ensamblador consiste en muchas instrucciones, haciéndolo muy largo y difícil de manejar. Cada tipo de microcontrolador tiene su propio conjunto de instrucciones que un programador tiene que conocer para escribir un programa Un programador tiene que conocer el hardware del microcontrolador para escribir un programa Programa escrito en C (El mismo programa compilado al código ensamblador):
Ing. Electrónica
P á g i n a | 2
UNMSM-FIEE
Circuitos Eléctricos I
Los lenguajes de programación de alto nivel (Basic, Pascal, C etc.) fueron creados con el propósito de superar las desventajas del ensamblador. En lenguajes de programación de alto nivel varias instrucciones en ensamblador se sustituyen por una sentencia. El programador ya no tiene que conocer el conjunto de instrucciones o características del hardware del microcontrolador utilizado. Ya no es posible conocer exactamente cómo se ejecuta cada sentencia, de todas f ormas ya no importa. Aunque siempre se puede insertar en el programa una secuencia escrita en ensamblador. Si alguna vez ha escrito un programa para un microcontrolador PIC en lenguaje ensamblador, probablemente sepa que la arquitectura RISC carece de algunas instrucciones. Por ejemplo, no hay instrucción apropiada para multiplicar dos números. Por supuesto, para cada problema hay una solución y éste no es una excepción gracias a la aritmética que permite realizar las operaciones complejas al descomponerlas en un gran número operaciones más simples. En este caso, la multiplicación se puede sustituir con facilidad por adición sucesiva (a x b = a + a + a + … + a). Ya estamos en el comienzo de una historia muy larga… No hay que preocuparse al utilizar uno de estos lenguajes de programación de alto nivel como es C, porque el compilador encontrará automáticamente la solución a éste problema y otros similares. Para multiplicar los números a y b, basta con escribir a*b.
Leng uaje C El lenguaje C dispone de todas las ventajas de un lenguaje de programación de alto nivel (anteriormente descritas) y le permite realizar algunas operaciones tanto sobre los bytes como sobre los bits (operaciones lógicas, desplazamiento etc.). Las características de C pueden ser muy útiles al programar los microcontroladores. Además, C está estandarizado (el estándar ANSI), es muy portable, así que el mismo código se puede utilizar muchas veces en diferentes proyectos. Lo que lo hace accesible para cualquiera que conozca este lenguaje sin reparar en el propósito de uso del microcontrolador. C es un lenguaje compilado, lo que significa que los archivos fuentes que contienen el código C se traducen a lenguaje máquina por el compilador. Todas estas características hicieron al C uno de los lenguajes de programación más populares.
Ing. Electrónica
P á g i n a | 3
UNMSM-FIEE
Circuitos Eléctricos I
La figura anterior es un ejemplo general de lo que sucede durante la compilación de programa de un lenguaje de programación de alto nivel a bajo nivel.
Elementos básicos del lenguaje C: Comentario : este permite la documentación del código y se usa de acuerdo a la siguiente sintaxis /* Este es un comentario */
otra opción
// Este es un comentario
Inicio y fin de bloque: permite agrupar un número de instrucciones las que pueden ser ejecutadas con cierta prioridad. Se usa { para iniciar bloque y } para finalizar bloque. { // inicio de bloque // instrucciones } // final de bloque
Identificador : es el nombre que se le da a una variable o función por lo general asociado al tipo de dato que ha de contener la variable o al tipo de procedimiento que ha de realizar la función.
Tipo: es una palabra reservada definida que indica el tipo de variable que se ha de definir y su alcance numérico, esto de acuerdo a la Tabla 1.
Ing. Electrónica
P á g i n a | 4
UNMSM-FIEE
Circuitos Eléctricos I
El microcontrolador y el compilador CC5x
A rquitectura del microcontrolador Para las aplicaciones se utilizará un microcontrolador basado en la familia 16F87Xa de microchip. Este microcontrolador contiene registros, módulos ADC, comunicación serial, temporizadores y manejo de interrupciones. Además posee una memoria de programa de entre 4 y 8Kbytes, su reloj puede ser de entre 4 y 20MHz. (ver data μC16F87xA). Un esquema simplificado es el de la Fig. 4.
Es bastante sencillo de hacer funcionar, solo basta un par de capacitores, el cristal más un resistor, de acuerdo a la Fig. 5. En dicho circuito, el terminal 28 correspondiente al bit más significativo del puerto B, se usará como monitor del
Ing. Electrónica
P á g i n a | 5
UNMSM-FIEE
Circuitos Eléctricos I
funcionamiento. La tarea básica a implementar será poner en 1 y en 0 alternadamente el bit mencionado de tal forma de visualizarlo mediante un instrumento.
Entorno de desarrollo El entorno de desarrollo MPLAB permite el trabajo con el microcontrolador incorporando al editor y herramientas de simulación y un compilador proporcionado por otro fabricante, en este caso el compilador C CC5x desarrollado por B. Knudsen. Al trabajar con el compilador CC5x, se debe incorporar el archivo cabecera 16F873a.h, esto automáticamente permite configurar el entorno de trabajo, quedando definido todos los “recursos” de la CPU, registros y módulos con los nombres identificados en la referencia técnica del microcontrolador. Se sugiere revisar el archivo de cabecera y contrastarlo con los nombres de los registros y direcciones asociadas descritas en el manual. Los registros de microcontrolador vienen definidos en el archivo de cabecera, estos pueden ser accesados directamente al igual que también sus bits individuales. En algunos casos los registros ya tienen definidos algunos bits internos usando otros identificadores, esto no es incompatible entre sí. Como ejemplo se tiene el caso del puerto B, llamado PORTB por el compilador CC5X, el cual está definido en el archivo de cabecera como una variable entera de 8 bits. También es posible encontrar el nombre de algunos bits definidos como variables tipo bit, ya sean banderas (Flags) o bits de habilitación de periféricos. Un ejemplo es RCIF (ReCeive Interrupt Flag) que está definido como una variable tipo bit o el PEIE (PEriferical Interrupt Enable).
Manejo de Puertos de E/S El microcontrolador posee al menos 3 puertos que pueden ser usados como entradassalidas digitales o como entradas análogas (si corresponde). Los Puertos son
Ing. Electrónica
P á g i n a | 6
UNMSM-FIEE
Circuitos Eléctricos I
básicamente registros de 8 bits basados en Flip-Flops Ti po D, que pueden ser usados como entrada o salida. Los nombres de los puertos corresponden a los especificados en la data del microcontrolador, así se tiene el PORTB de 8 bits, el PORTC de 8 bit y el PORTA de 5 bits. Dichos bits se configuran como entrada o salida a través de un registro llamado TRIS. Para el caso del Puerto A será TRISA, para el puerto B, se usa el TRISB, etc. Los puertos señalados poseen más de una función. Estos puertos del µC se usan como si fueran variables enteras de 8 bit y pueden accesarse nivel de bit o en forma de bytes. Primero se debe especificar si el bit es de entrada o salida, esto se hace definiendo el bit correspondiente como salida, esto se hace c on el registro TRISx (x es el puerto A, B o C) mediante el set o reset de dicho registro. Cada bit del registro TRISx maneja la entrada o salida del bit correspondiente del PORTx. TRISB.0=0; // Bit 0 del puerto B se define como salida TRISC.7=1; // Bit 7 del puerto C se define como entrada Puede definirse todo el puerto como entrada o salida o mezcla de ambas situaciones usando un byte completo sobre el registro TRIS correspondiente. TRISB=0x00; // los 8 bit del PORTB como salida TRISC=0xFF; // los 8 bits del PORTC como entrada TRISB=0x0f; // Los 4 bit más significativos de entrada, // los 4 bit menos significativos como salida La Fig. 6 muestra un diagrama funcional del terminal PORTB.0, el cual es controlado por el bit 0 del TRISB (TRISB.0).
Ing. Electrónica
P á g i n a | 7
UNMSM-FIEE
Circuitos Eléctricos I
Diferencias entre PIC y ATMEL (arduino) Existen decenas de empresas fabricantes de microcontroladores, entre las que podemos nombrar: Intel, Motorola, Texas Instrument, Microchip, Cypress, Atmel, entre otras. Pero dentro de toda esta gama de microcontroladores se destacan dos familias de microcontroladores: la familia AVR y la familia PIC, cuya popularidad es alta entre diseñadores de sistemas embebidos que requieren un rendimiento alto y bajo costo, y eligen uno u otro ya sea por su nivel de integración, por su arquitectura, la disponibilidad de recursos o su lenguaje de programación. Los PIC son una familia de microcontroladores de 8 bits fabricados por la empresa estadounidense MICROCHIP, cuentan con un CPU RISC y memoria FLASH para el almacenamiento del Firmware. Por otro lado los AVR son una familia de microcontroladores fabricada por la compañía noruega ATMEL, estos microcontroladores de 8 bits cuentan con una CPU RISC y su memoria de programa viene implementada en FLASH. Ambas familias cuentan con periféricos como Puertos Digitales, ADC, PWM, entre otros. Basado en esta descripción, se podría pensar que los PIC y AVR son iguales, en cierto modo si, desde un punto de vista de estructura general, pero es el ámbito que rodea esta estructura para el desarrollo de sistemas embebidos, es donde encontramos diferencia entre ambos microcontroladores, en indicadores como: Lenguaje de programación, IDE, interfaces para la programación, reloj interno, voltaje de alimentación, potencia, costo, etc.
¿Se pueden programar con el mismo lenguaje?
Ing. Electrónica
P á g i n a | 8
UNMSM-FIEE
Circuitos Eléctricos I
No, si es que se quiere programar en lenguaje nativo porque su juego de instrucciones o mnemónicos son diferentes, sus registros sin distintos. Son arquitecturas de hardware diferentes. Si se pueden programar si se utiliza un lenguaje de alto nivel (C, Pascal, Basic). Cabe aclarar que lenguajes en versiones para PIC, no son los mismos compiladores tradicionales. Es decir, para quien use lenguaje C habrán pocas diferencias entre un microcontrolador y otro.
¿Pueden tener los mismos usos? Es posible que sí. Se puede encontrar un microcontrolador Atmel equivalente en funciones y características a un PIC. No obstante, ello no significa que se pueda sustituir físicamente el componente sin alterar el circuito electrónico ni el programa PIC porque son incompatibles en esos dos niveles.
¿Son controladores completamente diferentes, cada uno con sus propias aplicaciones? Un microcontrolador 8051 o compatible puede servir para hacer un juego de luces navideñas, pero sería un desperdicio de prestaciones. En ese sentido existen aplicaciones más o menos determinadas para cada modelo de microcontrolador. PIC fue y sigue siendo un microcontrolador muy común en algunas áreas, pero esas mismas áreas funcionales en otros lugares geográficos prefieren utilizar microcontrolador Freescale que tampoco son costosos. En este último caso PIC y Freescale son diferentes, se programan de modo diferente, pero también tienen modelos que son prácticamente equivalentes en cuanto a sus funciones. A ello agreguemos el hecho de que ciertos microcontrolador son más bien un sector clase A tal como los ARM y los propios AVR. Por lo general sus prestaciones son superiores. Aunque también encontrarás potentes PIC de 32 bits.
Se pueden programar con el mismo hardware, ¿o tiene cada uno un hardware específico? Cada uno se programa con un hardware específico. Sin embargo, existen diversos circuitos programadores universales que te permiten programar varias marcas/modelos con distinta cantidad de pines sin hacer ningún cambio.
¿Podría sustituir un controlador Atmel por un controlador PIC?
Ing. Electrónica
P á g i n a | 9
UNMSM-FIEE
Circuitos Eléctricos I
Por sus funciones sí. Pero no puedes retirar un PIC y colocar un Atmel así de simple. El circuito es otro. El programa es otro a pesar de que funcionalmente puedan ejecutar las mismas tareas.
Encapsulamiento y ocultación Como hemos visto, cada objeto es una estructura compleja en cuyo interior hay datos y programas, todos ellos relacionados entre sí, como si estuvieran encerrados conjuntamente en una cápsula. Esta propiedad (encapsulamiento), es una de las características fundamentales en la OOP. Los objetos son inaccesibles, e impiden que otros objetos, los usuarios, o incluso los programadores conozcan cómo está distribuida la información o qué información hay disponible. Esta propiedad de los objetos se denomina ocultación de la información. Esto no quiere decir, sin embargo, que sea imposible conocer lo necesario respecto a un objeto y a lo que contiene. Si así fuera no se podría hacer gran cosa con él. Lo que sucede es que las peticiones de información a un objeto. deben realizarse a través de mensajes dirigidos a él, con la orden de r ealizar la operación pertinente. La respuesta a estas órdenes será la información requerida, siempre que el objeto considere que quien envía el mensaje está autorizado para obtenerla. El hecho de que cada objeto sea una cápsula facilita enormemente que un objeto determinado pueda ser transportado a otro punto de la organización, o incluso a otra organización totalmente diferente que precise de él. Si el objeto ha sido bien construido, sus métodos seguirán funcionando en el nuevo entorno sin problemas. Esta cualidad hace que la OOP sea muy apta para la reutilización de programas.
Organización de los objetos En principio, los objetos forman siempre una organización jerárquica, en el sentido de que ciertos objetos son superiores a otros de cierto modo. Existen varios tipos tipos de jerarquías: serán simples cuando su estructura pueda ser representada por medio de un "árbol". En otros casos puede ser más compleja. En cualquier caso, sea la estructura simple o compleja, podrán distinguirse en ella tres niveles de objetos.
La raíz de la jerarquía. Se trata de un objeto único y especial. Este se caracteriza por estar en el nivel más alto de la estructura y suele recibir un nombre muy genérico, que indica su categoría especial, como por ejemplo objeto m adre, Raíz o Entidad.
Los objetos intermedios . Son aquellos que descienden directamente de la raíz y que a su vez tienen descendientes. Representan conjuntos o clases de objetos, que pueden ser muy generales o muy especializados, según la aplicación. Normalmente Ing. Electrónica
P á g i n a | 10
UNMSM-FIEE
Circuitos Eléctricos I
reciben nombres genéricos que denotan al conjunto de objetos que representan, por ejemplo, VENTANA, CUENTA, FICHERO. En un conjunto reciben el nombre de clases o tipos si descienden de otra clase o subclase.
Los objetos terminales. Son todos aquellos que descienden de una clase o subclase y no tienen descendientes. Suelen llamarse casos particulares, instancias o ítems porque representan los elementos del conjunto representado por la clase o subclase a la que pertenecen. Veamos ahora en detalle los tres elementos mencionados en "Estructura de un Objeto".
Bibliografía http://luis.izqui.org/resources/ProgOrientadaObjetos.pdfhttp://users.salleurl.edu/~tl13 960/tutorial_hi_tech.pdf http://sites.ieee.org/sb-itver/files/2014/09/Programa-y-requerimientos-del-curso-uCen-C.pdf http://www.edudevices.com.ar/download/articulos/MCUsPIC/Programando_PICs_C CS_08.pdf http://controlautomaticoeducacion.com/primeros-pasos-programando-unmicrocontrolador/
Ing. Electrónica
P á g i n a | 11