Está en la página 1de 11

Lenguaje C para 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 microcontrolador
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.

LENGUAJE ENSAMBLADOR
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ágina |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 formas 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.

Lenguaje 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ágina |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ágina |4


UNMSM-FIEE Circuitos Eléctricos I

El microcontrolador y el compilador CC5x

Arquitectura 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ágina |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 entradas-
salidas digitales o como entradas análogas (si corresponde). Los Puertos son

Ing. Electrónica Página |6


UNMSM-FIEE Circuitos Eléctricos I

básicamente registros de 8 bits basados en Flip-Flops Tipo 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 con 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ágina |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ágina |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ágina |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 realizar 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 madre, 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-uC-
en-C.pdf

http://www.edudevices.com.ar/download/articulos/MCUsPIC/Programando_PICs_C
CS_08.pdf

http://controlautomaticoeducacion.com/primeros-pasos-programando-un-
microcontrolador/

Ing. Electrónica P á g i n a | 11

También podría gustarte