Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Todo Microcontoladores
Todo Microcontoladores
B ases
de los
M iCroControladores
Editorial
Director
Ing. Horacio D. Vallejo
Produccin
Jos Mara Nieves (Grupo Quark SRL)
autor:
Varios (ver Editorial)
Seleccin y Coordinacin:
Ing. Horacio Daniel Vallejo
Editorial QUarK S.r.l.
Propietaria de los derechos en castellano de la publicacin mensual SabEr ElEctrnica - San Ricardo
2072 (1273) - Capital Federal - Buenos Aires Argentina - T.E. 4301-8804
administracin y Negocios
Teresa C. Jara (Grupo Quark SRL)
Patricia Rivero Rivero (SISA SA de CV)
Margarita Rivero Rivero (SISA SA de CV)
Staff
Liliana Teresa Vallejo
Mariela Vallejo
Diego Vallejo
Luis Alberto Castro Regalado (SISA SA de CV)
Jos Luis Paredes Flores (SISA SA de CV)
Sistemas: Paula Mariana Vidal
red y Computadoras: Ral Romero
Video y animaciones: Fernando Fernndez
legales: Fernando Flores
Contadura: Fernando Ducach
Tcnica y Desarrollo de Prototipos:
Alfredo Armando Flores
atencin al Cliente
Alejandro Vallejo
ateclien@webelectronica.com.ar
Internet: www.webelectronica.com.mx
Publicidad:
Rafael Morales
rafamorales@webelectronica.com.ar
Club Se:
grupo Quark Srl
luisleguizamon@webelectronica.com.ar
editorial Quark Srl
San Ricardo 2072 (1273) - Capital Federal
www.webelectronica.com.ar
Captulo 1
EL MunDo
DE Los
MicrocontroLaDorEs
suMario
Captulo 1
los sistemas de NumeraCiN . . . . . . . . . . . . . . . .3
Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
Qu Pueden Hacer los Microcontroladores . . . . . . . . . . . . .4
Nmeros, Nmeros, Nmeros... . . . . . . . . . . . . . . . . . . . . . .6
Sistema de Numeracin Binario . . . . . . . . . . . . . . . . . . . . . .6
Sistema de Numeracin Exadecimal . . . . . . . . . . . . . . . . . .7
Conversin de Sistemas de Numeracin . . . . . . . . . . . . . . .8
Conversin de Nmeros Binarios a Decimales . . . . . . . . . .8
Conversin de Nmeros Hexadecimales a Decimales . . . . .9
Conversin de Nmeros Hexadecimales a Binarios . . . . . . .9
Marcar los Nmeros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
Nmeros Negativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
BIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
BYTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
Detalles Importantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
Componentes Bsicos de la Lgica Digital . . . . . . . . . . . . .11
Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12
Puertos de Entrada / Salida (E/S) . . . . . . . . . . . . . . . . . . . .13
Unidad de Memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
Interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
Unidad Central de Procesamiento
(CENTRAL PROCESSOR UNIT - CPU) . . . . . . . . . . . . . . .17
Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17
Comunicacin en Serie . . . . . . . . . . . . . . . . . . . . . . . . . . . .17
Velocidad de Transmisin Serial . . . . . . . . . . . . . . . . . . . . .18
I2C Circuito Inter- Integrado
(INTER INTEGRATED CIRCUIT) . . . . . . . . . . . . . . . . . . .18
SPI - Bus Serial de Interfaz de Perifricos
(SERIAL PERIPHERAL INTERFACE BUS . . . . . . . . . . . . .18
Oscilador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19
Circuito de Alimentacin . Fuente de Alimentacin . . . . . . .19
Temporizadores Contadores . . . . . . . . . . . . . . . . . . . . . .20
Cmo Funcionan los Temporizadores? . . . . . . . . . . . . . .20
Utilizando un Preescalador en el
Funcionamiento del Temporizador . . . . . . . . . . . . . . . . . . .21
Utilizando una Interrupcin en el
Funcionamiento del Temporizador . . . . . . . . . . . . . . . . . . .21
Contadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21
Temporizador Perro Guardin. WATCHDOG . . . . . . . . . . .22
Convertidor Digital Analgico (D/A) . . . . . . . . . . . . . . . . .22
Arquitectura Interna de un Microcontrolador . . . . . . . . . . . .23
Captulo 2
sistemas de programaCiN:
leNguaje mikroC . . . . . . . . . . . . . . . . . . . . . . . .27
Lenguajes de Programacin . . . . . . . . . . . . . . . . . . . . . . . .27
Lenguaje Ensamblador . . . . . . . . . . . . . . . . . . . . . . . . . . . .28
Ventajas de los Lenguajes de Programacin
de Alto Nivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28
Lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29
Caractersticas de el Lenguaje mikroC . . . . . . . . . . . . . . . .30
Fases de la Compilacin . . . . . . . . . . . . . . . . . . . . . . . . . . .31
Estructura del Programa . . . . . . . . . . . . . . . . . . . . . . . . . . .31
Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33
Tipos de Datos en mikroC . . . . . . . . . . . . . . . . . . . . . . . . . .34
Variables y Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . .35
mbito de Variables y Constantes . . . . . . . . . . . . . . . . . . .39
Clases de Almacenamiento . . . . . . . . . . . . . . . . . . . . . . . . .40
Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40
Conversin de Tipos de Datos . . . . . . . . . . . . . . . . . . . . . .44
Estructuras de Control . . . . . . . . . . . . . . . . . . . . . . . . . . . .45
Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47
Sentencias de Salto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49
Tipos de Datos Avanzados . . . . . . . . . . . . . . . . . . . . . . . . .50
Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54
Captulo 3
los miCroCoNtroladores piC . . . . . . . . . . . . . .63
Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63
La Memoria de Programa . . . . . . . . . . . . . . . . . . . . . . . . . .67
La Memoria de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . .67
Los Puertos del PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .68
El Clock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .69
El Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .69
Primeras Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . .70
GPIC USB: Programador de Microcontroladores
PIC y Memorias Eeprom por Puerto USB . . . . . . . . . . . . .70
Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70
Descripcin del Circuito Electrnico . . . . . . . . . . . . . . . . . .70
El Programador Quark Pro 2 . . . . . . . . . . . . . . . . . . . . . . .77
Captulo 1
Captulo 1
man al ascensor al mismo tiempo? Cul llamada tiene la prioridad? Cmo solucionar las
cuestiones de seguridad, de prdida de electricidad, de fallos, de uso indebido?
Lo que sucede despus de resolver estos
problemas bsicos es un proceso meticuloso de
disear los dispositivos adecuados utilizando un
gran nmero de los chips especializados. Este
proceso puede tardar semanas o meses, dependiendo de la complejidad del dispositivo.
Cuando haya terminado el proceso, llega la hora
de disear una placa de circuito impreso y de
montar el dispositivo. Un dispositivo enorme! Es
otro trabajo difcil y tardado. Por ltimo, cuando
todo est terminado y probado adecuadamente,
pasamos al momento crucial y es cuando uno se
concentra, respira profundamente y enciende la
fuente de alimentacin.
Esto suele ser el punto en el que la fiesta se
convierte en un verdadero trabajo puesto que
los dispositivos electrnicos casi nunca funcionan apropiadamente desde el inicio. Preprese
para muchas noches sin dormir, correcciones,
mejoras... y no se olvide de que todava estamos
hablando de cmo poner en marcha un simple
ascensor.
Cuando el dispositivo finalmente empiece a
funcionar perfectamente y todo el mundo est
satisfecho, y le paguen por el trabajo que ha
hecho, muchas compaas de desarrollo estarn interesadas en su trabajo. Por supuesto, si
tiene suerte, cada da le traer una oferta de trabajo de un nuevo inversionista. Sin embargo, si
lo requieren para trabajar en el control de los
elevadores de un nuevo edificio que tiene cuatro
pisos ms de los que ya maneja su sistema de
control.
Sabe cmo proceder? Cree acaso que se
pueden controlar las demandas de sus clientes?
Pensamos que usted va a construir un dispositivo universal que se puede utilizar en los edificios de 4 a 40 pisos, una obra maestra de electrnica. Bueno, incluso si usted consigue construir una joya electrnica, su inversionista le
esperar delante de la puerta pidiendo una
cmara en el ascensor o una msica relajante
en caso de fallo de ascensor. O un ascensor con
B aSES
dos puertas. De todos modos, la ley de Murphy
es inexorable y sin duda usted no podr tomar
ventaja a pesar de todos los esfuerzos que ha
hecho. Por desgracia, todo lo que se ha dicho
hasta ahora sucede en la realidad. Esto es lo
que dedicarse a la ingeniera electrnica real-
dE loS
M iCroCoNtroladorES
Figura 1
Captulo 1
Muy simple!
Se podra expresar de una forma ms desarrollada?
Por supuesto que s:
764 = 4 + 60 + 700
An ms desarrollado?
S:
764 = 4*1 + 6*10 + 7*100
Podra este nmero parecer un poco ms
cientfico?
La respuesta es s otra vez:
764= 4*100 + 6*101 + 7*102.
Qu significa esto realmente? Por qu utilizamos exactamente estos nmeros 100, 101 y
102 ? Por qu es siempre el nmero 10?
Es porque utilizamos 10 dgitos diferentes (0,
1, 2...8, 9). En otras palabras, es porque utilizamos el sistema de numeracin en base 10, es
decir el sistema de numeracin decimal, figura
2.
Figura 2
B aSES
Si slo pudiramos afirmar (1) o negar (0)
que algo existe. La respuesta es nada especial, seguiramos utilizando los mismos nmeros de la misma manera que utilizamos hoy en
da, no obstante ellos pareceran un poco diferentes. Por ejemplo: 11011010.
Cuntas son realmente 11011010 pginas
de un libro?
Para entenderlo, siga la misma lgica como
en el ejemplo anterior, pero en el orden invertido. Tenga en cuenta que se trata de aritmtica
con slo dos dgitos 0 y 1, es decir, del sistema
de numeracin en base 2 (sistema de numeracin binario). Vea la figura 3.
dE loS
M iCroCoNtroladorES
Captulo 1
El mayor nmero que puede ser representado con 4 dgitos binarios es el nmero 1111.
Corresponde al nmero 15 en el sistema decimal. En el sistema hexadecimal ese nmero se
representa con slo un dgito F. Es el mayor
nmero de un dgito en el sistema hexadecimal.
Se da cuenta de la gran utilidad de estas
equivalencias?
El mayor nmero escrito con ocho dgitos
binarios es a la vez el mayor nmero de dos
dgitos en el sistema hexadecimal. Tenga en
cuenta que una computadora utiliza nmeros
binarios de 8 dgitos. Acaso se trata de una
casualidad?
cdIgo Bcd
El cdigo BCD (Binary-Coded Decimal Cdigo binario decimal)
es un cdigo binario utilizado para representar a
los nmeros decimales.
Se utiliza para que los circuitos electrnicos puedan comunicarse con los perifricos utilizando el
sistema de numeracin decimal o bien utilizando
el sistema binario dentro de su propio mundo.
Consiste en nmeros binarios de 4 dgitos que
representan los primeros diez dgitos (0, 1, 2,
3...8, 9). Aunque cuatro dgitos pueden hacer 16
combinaciones posibles en total, el cdigo BCD
normalmente utiliza a las primeras diez.
Figura 5
B aSES
Por consiguiente, al utilizar 4 dgitos binarios,
es posible representar los nmeros decimales
de 0 a 15, que son 16 valores diferentes en total.
dE loS
M iCroCoNtroladorES
je? Dependiendo del sistema en cuestin (binario, decimal o hexadecimal), el resultado podra
ser 6, 110 o 272 productos, respectivamente.
Por consiguiente, para evitar equivocaciones,
diferentes prefijos y sufijos se aaden directamente a los nmeros. El prefijo $ o 0x as como
el sufijo h marca los nmeros en el sistema
hexadecimal. Por ejemplo, el nmero hexadecimal 10AF se puede escribir as: $10AF, 0x10AF
o 10AFh. De manera similar, los nmeros binarios normalmente obtienen el sufijo % o 0B. Si
un nmero no tiene ni sufijo ni prefijo se considera decimal. Desafortunadamente, esta forma
de marcar los nmeros no es
Figura 6 estandarizada, por consiguiente
depende de la aplicacin concreta. La mostrada en la figura 8
es tabla comparativa que contiene los valores de nmeros 0255 representados en tres sistemas de numeracin diferentes.
nMeros negatIvos
Como ya hemos visto, para escribir un nmero negativo en matemticas, basta con aadirle
el prefijo - (signo menos). Sin embargo, en la
programacin, al acabarse el proceso de la compilacin, se quedan slo los nmeros binarios,
Captulo 1
BYte
BIt
La teora dice que un bit es la unidad bsica
de informacin...
Vamos a olvidarlo por un momento y demostrar qu es eso en la prctica. La respuesta es nada especial- un bit es un slo dgito binario.
Similar a un sistema de numeracin decimal en
el que los dgitos de un nmero no tienen la
misma ponderacin (por ejemplo, los dgitos en
10
B aSES
Figura 9
detalles IMPortantes
El funcionamiento de estos elementos es
basado en los principios establecidos por el
matemtico britnico George Boole en la mitad
del siglo 19 - es decir, antes de la invencin de
la primera bombilla! En breve, la idea principal
era de expresar las formas lgicas por medio de
las funciones algebraicas. Tal idea pronto se
transform en un producto prctico que se convirti ms tarde en lo que hoy en da conocemos
como circuitos lgicos Y (AND), O (OR) o NO
(NOT). El principio de su funcionamiento es
conocido como algebra de Boole.
dE loS
M iCroCoNtroladorES
Figura 10
Figura 11
compuerta o (or)
De manera similar, la compuerta O, cuyo
smbolo se observa en la figura 12, tambin dispone de dos o ms entradas y de una salida. Si
la compuerta dispone de slo dos entradas, es
aplicable lo siguiente: la salida proporciona un
uno lgico (1) si una u otra entrada (A o B) es llevada a alto (1). En caso de que la compuerta O
Captulo 1
11
Figura 12
Figura 13
Figura 16
Figura 17
Figura 14
Figura 15
regIstros
Un registro o una celda de memoria es un circuito electrnico que puede memorizar el estado
de un byte.
12
B aSES
M iCroCoNtroladorES
dE loS
Figura 18
Captulo 1
13
Figura 21
unIdad de MeMorIa
La unidad de memoria es una parte del
microcontrolador utilizada para almacenar los
datos, figura 21. La manera ms fcil de explicarlo es compararlo con un armario grande con
muchos cajones. Si marcamos los cajones claramente, ser fcil acceder a cualquiera de sus
contenidos al leer la etiqueta en la parte delantera del cajn.
14
B aSES
otP roM (one time Programmable roM)
roM programable una sola vez
La memoria programable una sola vez permite descargar un programa en el chip, pero
como dice su nombre, una sola vez. Si se detecta un error despus de descargarlo, lo nico que
se puede hacer es descargar el programa
correcto en otro chip.
Figura 22
dE loS
M iCroCoNtroladorES
Memoria Flash
Este tipo de memoria se invent en los aos
80 en los laboratorios de la compaa INTEL,
como forma desarrollada de la memoria UV
EPROM. Ya que es posible escribir y borrar el
contenido de esta memoria prcticamente un
nmero ilimitado de veces, los microcontroladores con memoria Flash son perfectos para estudiar, experimentar y para la fabricacin en
Captulo 1
15
InterruPcIones
La mayora de programas utilizan interrupciones durante ejecucin de programa regular. El
propsito del microcontrolador generalmente
consiste en reaccionar a los cambios en su
entorno. En otras palabras, cuando ocurre algo,
el microcontrolador reacciona de alguna manera... Por ejemplo, al apretar el botn del mando
a distancia, el microcontrolador lo registra y responde al comando cambiando de canal, subiendo o bajando el volumen etc. Si el microcontrolador pasar la mayora del tiempo comproban-
16
B aSES
unIdad central de ProcesaMIento
(central Processor unIt - cPu)
Como indica su nombre, esto es una unidad
que controla todos los procesos dentro del
microcontrolador.
dE loS
Decodificador de instrucciones es la
parte que descodifica las instrucciones del programa y acciona otros circuitos basndose en
esto. El conjunto de instrucciones que es diferente para cada familia de microcontrolador
expresa las capacidades de este circuito;
Bus
El bus est formado por 8, 16 o ms cables.
Hay dos tipos de buses: el bus de direcciones y
el bus de datos. El bus de direcciones consiste
en tantas lneas como sean necesarias para
M iCroCoNtroladorES
coMunIcacIn en serIe
Hoy en da, la mayora de los microcontroladores llevan incorporados varios sistemas diferentes para la comunicacin en serie, como un
equipo estndar. Cul de estos sistemas se utilizar en un caso concreto, depende de muchos
factores, de los que ms importantes son:
Captulo 1
17
18
B aSES
Figura 26
dE loS
M iCroCoNtroladorES
oscIlador
cIrcuIto de alIMentacIn
Fuente de alIMenta cIn
Brown out es un estado potencialmente peligroso que ocurre al apagar el microcontrolador o en caso de que el voltaje de la
fuente de alimentacin salga de unos mrgenes debido al ruido elctrico.
Como el microcontrolador dispone de varios
circuitos que funcionan a niveles de voltaje
diferentes, ese estado puede causar un comportamiento descontrolado.
Para evitarlo, el microcontrolador normalmente tiene un circuito incorporado para el
Captulo 1
19
el pin de reset (reinicio), marcado frecuentemente con MCLR (Master Clear Reset),
sirve para el reinicio externo del microcontrolador al aplicar un cero (0) o un uno (1) lgico
dependiendo del tipo del microcontrolador. En
caso de que el circuito brown out no est incorporado, un simple circuito externo para el brown
out reset se puede conectar al pin MCLR.
teMPorIzadores contadores
El oscilador del microcontrolador utiliza cristal de cuarzo para su funcionamiento. Aunque
no se trata de la solucin ms simple, hay
muchas razones para utilizarlo. La frecuencia
del oscilador es definida con precisin y muy
estable, as que siempre genera los pulsos del
mismo ancho, lo que los hace perfectos para
medicin de tiempo. Tales osciladores se utilizan
en los relojes de cuarzo. Si es necesario medir
el tiempo transcurrido entre dos eventos, basta
con contar los pulsos generados por este oscilador. Esto es exactamente lo que hace el temporizador y su representacin la podemos observar en la figura 28.
Figura 28
20
B aSES
utIlIzando un Preescalador
FuncIonaMIento del teMPorIzador
en el
Un pre-escalador es un dispositivo electrnico utilizado para dividir la frecuencia por un factor predeterminado. Esto quiere decir que se
necesita llevar 1, 2, 4 o ms pulsos a su entrada
para generar un pulso a la salida. La mayora de
los microcontroladores disponen de uno o ms
pre-escaladores incorporados y su tasa de divisin puede ser cambiada dentro del programa.
El pre-escalador se utiliza cuando es necesario
medir los perodos de tiempo ms largos, figura
29.
Figura 29
dE loS
M iCroCoNtroladorES
contadores
en el
Si un temporizador se suministra por los pulsos ingresados por el pin de entrada en el micro-
Fifura 30
Captulo 1
21
Figura 31
22
Las seales del mundo real son muy diferentes de las que entiende el microcontrolador
(ceros y unos), as que deben ser convertidas
para que el microcontrolador pueda entenderlas.
Figura 32
B aSES
Figura 33
arQuItectura Interna
MIcrocontrolador
de un
Todos los microcontroladores actuales utilizan uno de dos modelos bsicos de arquitectura denominados Harvard y Von-Neumann.
Son dos maneras diferentes del intercambio
de datos entre la CPU y la memoria:
arquitectura de von-neumann
Los microcontroladores que utilizan la arquitectura Von- Neumann disponen de un solo bloque de memoria y de un bus de datos de 8 bits,
figura 34.
Figura 34
dE loS
M iCroCoNtroladorES
Figura 35
Captulo 1
23
24
Juego de InstruccIones
El nombre colectivo de todas las instrucciones que puede entender el microcontrolador es
llamado Juego de Instrucciones, figura 36.
Figura 36
B aSES
cil explicar dnde est el aeropuerto si se utilizan las palabras adecuadas tales como: a la
derecha, a la izquierda, el kilmetro etc.
cIsc (complex Instruction set computer)
- computadoras con un juego de instrucciones complejo
CISC es opuesto a RISC! Los microcontroladores diseados para reconocer ms de 200
instrucciones diferentes realmente pueden realizar muchas cosas a alta velocidad. No obstante,
uno debe saber cmo utilizar todas las posibilidades que ofrece un lenguaje tan rico, lo que no
es siempre tan fcil.
un
dE loS
M iCroCoNtroladorES
Captulo 1
25
Captulo 2
SiStemaS de Programacin:
Lenguaje mikroc
Usted seguramente sabe que no es suficiente slo conectar el microcontrolador a los
otros componentes y encender una fuente de alimentacin para hacerlo funcionar,
verdad? Hay que hacer algo ms. Se necesita programar el microcontrolador. Si cree
que esto es complicado, est equivocado. Todo el procedimiento es muy simple.
Basta con leer el texto para entender de lo que estamos hablando.
www.mikroe.com
Lenguajes de Programacin
El microcontrolador ejecuta el programa cargado en la memoria flash. Esto se denomina el
cdigo ejecutable y est compuesto por una
serie de ceros y unos, aparentemente sin significado. Dependiendo de la arquitectura del
microcontrolador, el cdigo binario est compuesto por palabras de 12, 14 o 16 bits de
Captulo 2
27
Lenguaje ensambLador
Como el proceso de escribir un cdigo ejecutable era considerablemente arduo, en consecuencia fue creado el primer lenguaje de programacin denominado ensamblador (ASM).
Siguiendo la sintaxis bsica del ensamblador,
era ms fcil escribir y comprender el cdigo.
Las instrucciones en ensamblador consisten en
las abreviaturas con significado y a cada instruccin corresponde una localidad de memoria.
Un programa denominado ensamblador compila
(traduce) las instrucciones del lenguaje ensamblador a cdigo mquina (cdigo binario). Vea la
figura 1. Este programa compila instruccin a
instruccin sin optimizacin. Como permite controlar en detalle todos los procesos puestos en
marcha dentro del chip, este lenguaje de programacin todava sigue siendo popular.
Figura 1
28
S iStEmaS
dE
P rogramaCiN : L ENguajE
mikro C
Figura 2
Lenguaje c
El lenguaje C dispone de todas las ventajas
de un lenguaje de programacin de alto nivel
(anteriormente descritas) y le permite realizar
algunas operaciones tanto sobre los bytes como
sobre los bits (operaciones lgicas, desplazamiento etc.).
Las caractersticas de C pueden ser muy tiles al programar los microcontroladores.
Adems, C est estandarizado (el estndar
ANSI), es muy portable, as que el mismo cdigo se puede utilizar muchas veces en diferentes
proyectos.
Lo que lo hace accesible para cualquiera que
conozca este lenguaje sin reparar en el propsito de uso del microcontrolador. C es un lenguaje compilado, lo que significa que los archivos
fuentes que contienen el cdigo C se traducen a
lenguaje mquina por el compilador. Todas
estas caractersticas hicieron al C uno de los
lenguajes de programacin ms populares.
Captulo 2
29
Figura 3
30
S iStEmaS
dE
P rogramaCiN : L ENguajE
mikro C
El trmino C se utilizar para referirse a las caractersticas comunes de los lenguajes C y mikroC.
Este libro describe una aplicacin muy concreta del lenguaje de programacin C utilizado en el compilador mikroc Pro for Pic. En este caso, el compilador se utiliza para la programacin de los
microcontroladores PIC. Cabe destacar que el lector no necesariamente precisar este compilador
pero creemos oportuno utilizarlo dado que sus ventajas son enormes. De todos modos, en el prximo captulo, veremos otras formas de trabajar con microcontroladores PIC.
Fases de La comPiLacin
El proceso de compilacin consiste en varios pasos y se ejecuta automticamente por el compilador, figura 5. Por consiguiente, un conocimiento bsico del funcionamiento puede ser til para
entender el concepto del lenguaje mikroC.
Figura 5
El archivo fuente contiene el cdigo en mikroC que usted escribe para programar el microcontrolador. El preprocesador se utiliza automticamente por el compilador al iniciarse el proceso de la
compilacin. El compilador busca las directivas del preprocesador (que siempre empiezan por #)
dentro del cdigo y modifica el cdigo fuente de acuerdo con las directivas.
En esta fase se llevan a cabo inclusin de archivos, definicin de constantes y macros etc., lo
que facilita el proceso.
Ms tarde vamos a describir estas directivas en detalle. El analizador sintctico (parser) elimina toda la informacin intil del cdigo (comentarios, espacios en blanco). Luego, el compilador
traduce el cdigo a un archivo binario denominado archivo .mcl. El enlazador (linker) recupera toda
la informacin requerida para ejecutar el programa de los archivos externos y la agrupa en un solo
archivo (.dbg).
Adems, un proyecto puede contener ms de un archivo fuente y el programador puede utilizar
funciones predefinidas y agrupadas dentro de los archivos denominados libreras. Por ltimo, el
generador .hex produce un archivo .hex. Es el archivo que se va a cargar en el microcontrolador.
El proceso entero de la compilacin que incluye todos los pasos anteriormente descritos se le
denomina building.
Captulo 2
31
Figura 7
32
S iStEmaS
dE
P rogramaCiN : L ENguajE
mikro C
La manera de escribir el cdigo en C es muy importante. Por ejemplo, C difiere entre minsculas y maysculas, as que la funcin main() no se puede escribir MAIN() o Main(). Adems, note
que dos lneas del cdigo dentro de la funcin terminan con un punto y coma. En C todas las sentencias deben terminar con un punto y coma ;, as el compilador puede aislarlas y traducirlas a
cdigo mquina.
Para comprender mejor esta estructura mire la figura 8 en la que se expresan diferentes observaciones dentro del programa.
Figura 8
comentarios
Los comentarios son las partes del programa utilizados para aclarar las instrucciones de programa o para proporcionar ms informacin al respecto. El compilador no hace caso a los comentarios y no los compila al cdigo ejecutable.
Dicho de manera sencilla, el compilador es capaz de reconocer los caracteres especiales utilizados para designar dnde los comentarios comienzan y terminan y no hace nada de caso al texto
entre ellos durante la compilacin. Hay dos tipos de tales caracteres. Unos designan los comentarios largos que ocupan varias lneas de programa marcados por la secuencia especial /*...*/, mientras que otros designan los comentarios cortos que caben en una sola lnea //. Aunque los comentarios no pueden afectar a la ejecucin de programa, son tan importantes como cualquier otra parte
de programa.
Aqu est el porqu... con frecuencia es necesario mejorar, modificar, actualizar, simplificar un
programa... No es posible interpretar incluso los programas simples sin utilizar los comentarios.
Captulo 2
33
Tabla 1
Al aadir un prefijo (calificador) a cualquier tipo de dato entero o carcter, el rango de sus posibles valores cambia as como el nmero de los bytes de memoria necesarios. Por defecto, los datos
de tipo int son con signo, mientras que los de tipo char son sin signo. El calificador signed (con
signo) indica que el dato puede ser positivo o negativo. El prefijo unsigned indica que el dato puede
ser slo positivo. Note en la tabla 2 que el prefijo es opcional.
Tabla 2
34
S iStEmaS
0x11
11
-152
011
0b11
dE
P rogramaCiN : L ENguajE
mikro C
// = 0.0
// = -1.23
// = 23.45 * 10^6
// = 2.0 * 10^-5
// = 3.0 * 10^10
// = 0.09 * 10^34
// entero
// carcter ASCII 'p'
Una secuencia de caracteres es denominada cadena (string). Las cadenas estn encerradas
entre comillas dobles:
"Presione el botn RA0"
VariabLes y constantes
definiciones
Una variable es un objeto nombrado capaz de contener un dato que puede ser modificado durante la ejecucin de programa. En C, las variables tienen tipo, que significa que es necesario especificar el tipo de dato que se le asigna a una variable (int, float etc.). Las variables se almacenan en
la memoria RAM y el espacio de memoria que ocupan (en bytes) depende de su tipo, figura 13.
/* dos lneas de programa consecutivas. En la primera lnea del programa
se define el tipo de variable */
int a = 1000;
a = 15;
Captulo 2
35
Cada variable o constante debe tener un identificador que lo distingue de otras variables y constantes. Refirase a los ejemplos anteriores, a y a son identificadores.
reglas para nombrar
En mikroC los identificadores pueden ser tan largos como quiera. Sin embargo, hay varias restricciones a saber:
* Los identificadores pueden incluir cualquiera de los caracteres alfabticos A-Z (a-z), los dgitos
0-9 y el carcter subrayado _. El compilador es sensible a la diferencia entre minsculas y maysculas. Los nombres de funciones y variables se escriben con frecuencia con minsculas, mientras
que los nombres de constantes se escriben con maysculas.
* Los identificadores no pueden empezar con un dgito.
* Los identificadores no pueden coincidir con las palabras clave del lenguaje mikroC, porque son
las palabras reservadas del compilador.
El compilador mikroC reconoce 33 palabras clave que se muestran en la tabla 3.
Tabla 3
36
S iStEmaS
temperatura_V1
Presin
no_corresponder
dat2string
SuM3
_vtexto
7temp
%ms_alto
if
j23.07.04
nombre de variable
dE
P rogramaCiN : L ENguajE
mikro C
// OK
// OK
// OK
// OK
// OK
// OK
// NO -- no puede empezar con un nmero
// NO -- no pueden contener caracteres especiales
// NO -- no puede coincidir con una palabra reservada
// NO -- no puede contener caracteres especiales (punto)
// NO -- no puede contener espacio en blanco
declaracin de Variables
Cada variable debe ser declarada antes de ser utilizada en el programa. Como las variables se
almacenan en la memoria RAM, es necesario reservar el espacio para ellas (uno, dos o ms bytes).
Al escribir un programa, usted sabe qu tipo de datos quiere utilizar y qu tipo de datos espera como
resultado de una operacin, mientras que el compilador no lo sabe. No se olvide de que el programa maneja las variables con los nombres asignados. El compilador las reconoce como nmeros en
la memoria RAM sin conocer su tamao y formato. Para mejorar la legibilidad de cdigo, las variables se declaran con frecuencia al principio de las funciones:
<tipo> variable;
Es posible declarar ms de una variable de una vez si tienen el mismo tipo:
<tipo> variable1, variable2, variable3;
Aparte del nombre y del tipo, a las variables se les asignan con frecuencia los valores iniciales
justamente enseguida de su declaracin. Esto no es un paso obligatorio, sino una cuestin de buenas costumbres. Se parece a lo siguiente:
unsigned int peso;
peso = 20;
Si hay varias variables con el mismo valor inicial asignado, el proceso se puede simplificar:
unsigned int peso1 = peso2 = peso3 = 20;
int valor_inicial = un_mnimo_de_petrleo = 0;
Tenga cuidado de no declarar la misma variable otra vez dentro de la misma funcin. Puede
modificar el contenido de una variable al asignarle un nuevo valor tantas veces que quiera.
Al declarar una variable, siempre piense en los valores que la variable tendr que contener
durante la ejecucin de programa.
Captulo 2
37
declaracin de constantes
Similar a las variables, las constantes deben ser declaradas antes de ser utilizadas en el programa. En mikroC, no es obligatorio especificar el tipo de constante al declararla. Por otra parte, las
constantes deben ser inicializadas a la vez que se declaran. El compilador reconoce las constantes
por su prefijo const utilizado en la declaracin. Dos siguientes declaraciones son equivalentes:
const int MINIMUM = -100;
const MINIMUM = -100;
Las constantes de enumeracin son un tipo especial de constantes enteras que hace un programa ms comprensible al asignar los nmeros ordinales a las constantes. Por defecto, el valor 0
se asigna automticamente a la primera constante entre llaves, el valor 1 a la segunda, el valor 2 a
la tercera etc.
enum surtidores {AGUA,GASLEO,CLORO};
38
S iStEmaS
dE
P rogramaCiN : L ENguajE
mikro C
Figura 9
A las variables globales se les puede acceder de cualquier parte en el cdigo, an dentro de las
funciones con tal de que sean declaradas. El mbito de una variable global est limitado por el fin
del archivo fuente en el que ha sido declarado.
El mbito de variables locales est limitado por el bloque encerrado entre llaves {} en el que han
sido declaradas.
Por ejemplo, si estn declaradas en el principio del cuerpo de funcin (igual que en la funcin
main) su mbito est entre el punto de declaracin y el fin de esa funcin. Refirase al ejemplo
anterior. A las variables locales declaradas en main() no se les puede acceder desde la Funcin_1
y al revs.
Un bloque compuesto es un grupo de declaraciones y sentencias (que pueden ser bloques tambin) encerradas entre llaves. Un bloque puede ser una funcin, una estructura de control etc. Una
variable declarada dentro de un bloque se considera local, o sea, existe slo dentro del bloque. Sin
embargo, las variables declaradas fuera del mbito todava son visibles.
Aunque las constantes no pueden ser modificadas en el programa, siguen las mismas reglas que
las variables.
Esto significa que son visibles dentro de su bloque a excepcin de las constantes globales
(declaradas fuera de cualquier funcin). Las constantes se declaran normalmente en el inicio del
cdigo fuera de cualquier funcin (como variables globales).
Captulo 2
39
Figura 10
static es una clase de almacenamiento por defecto para las variables globales. Especifica que
una variable es visible dentro del archivo. A las variables locales declaradas con el prefijo static se
les puede acceder dentro del archivo fuente (o sea se comportan como variables globales).
extern: la palabra clave extern se utiliza cuando el programa est compuesto por diferentes
archivos fuente. Esto le permite utilizar una variable, una constante o una funcin declarada en otro
archivo. Por supuesto, para compilar y enlazar este archivo correctamente, el mismo debe ser incluido en su proyecto. Vea un ejemplo de un programa que consiste en dos archivos: File_1 y File_2.
File_1 utiliza una variable y una funcin declaradas se usa en File_2.
File 1:
extern int cnt;
extern void hello();
void main(){
PORTA = cnt++;
hello();
}
File 2:
int cnt = 0;
void hello();
void hello(){
.
.
}
oPeradores
Un operador es un smbolo que denota una operacin aritmtica, lgica u otra operacin particular. Dicho de manera sencilla, varias operaciones aritmticas y lgicas se realizan por medio de
40
S iStEmaS
dE
P rogramaCiN : L ENguajE
mikro C
los operadores. Hay ms de 40 operaciones disponibles en el lenguaje C, pero se utiliza un mximo de 10 a 15 de ellas en la prctica. Cada operacin se realiza sobre uno o ms operandos que
pueden ser variables o constantes. Adems, cada operacin se caracteriza por la prioridad de ejecucin y por la asociatividad.
operadores aritmticos
Los operadores aritmticos se utilizan en las operaciones aritmticas y siempre devuelven resultados numricos. Hay dos tipos de operadores, los unitarios y los binarios. A diferencia de las operaciones unitarias que se realizan sobre un operando, las operaciones binarias se realizan sobre
dos operandos. En otras palabras, se requieren dos nmeros para ejecutar una operacin binaria.
Por ejemplo: a+b o a/b. Vea en la tabla 4 cules son los operadores aritmticos:
Tabla 4
int a,b,c;
a = 5;
b = 4;
c = a + b;
c = c%2;
// Declarar 3 enteros a, b, c
// Inicializar a
// Inicializar b
// c = 9
// c = 1. Esta operacin se utiliza con frecuencia
// para comprobar la paridad. En este caso, el
// resultado es 1 lo que significa que la variable
// es un nmero imparo
operadores de asignacin
Hay dos tipos de asignacin en el lenguaje C:
* Los operadores simples asignan los valores a las variables utilizando el carcter comn =. Por
ejemplo: a =8
* Las asignaciones compuestas son especficas para el lenguaje C. Consisten en dos caracteres como se muestra en la tabla 5.
Tabla 5
Captulo 2
41
Tabla 6
int a, b, c;
a = b = 5;
c = 1 + a++;
b = ++c + a
// c = 6
// b = 7 + 6 = 13
operadores relacionales
Los operadores relacionales se utilizan en comparaciones con el propsito de comparar dos
valores, tabla 7.
Tabla 7
int prop;
int var = 5;
prop = var < 10; // Expresin es evaluada como verdadera, prop = 1
En mikroC, si una expresin es evaluada como falsa (false), el operador devuelve 0, mientras
que si una oracin es evaluada como verdadera (true), devuelve 1. Esto se utiliza en expresiones
tales como si la expresin es evaluada como verdadera, entonces...
operadores Lgicos
Hay tres tipos de operaciones lgicas en el lenguaje C: y (and) lgico, o (or) lgico y negacin - no (not) lgico. Los operadores lgicos devuelven verdadero (1 lgico) si la expresin evaluada es distinta de cero. En caso contrario, devuelve falso (0 lgico) si la expresin evaluada equivale a cero. Esto es muy importante porque las operaciones lgicas se realizan generalmente sobre
42
S iStEmaS
dE
P rogramaCiN : L ENguajE
mikro C
las expresiones, y no sobre las variables (nmeros) particulares en el programa. Por lo tanto, las
operaciones lgicas se refieren a la veracidad de toda la expresin.
Por ejemplo: 1 && 0 es igual a (expresin verdadera) && (expresin falsa)
El resultado 0, o sea - Falso en ambos casos. En la tabla 8 tiene la correspondencia de estos
operadores lgicos.
Tabla 8
Tabla 9
Captulo 2
43
Tabla 10
44
S iStEmaS
dE
P rogramaCiN : L ENguajE
mikro C
Para realizar una conversin explcita, antes de escribir una expresin o una variable hay que
especificar el tipo de resultado de operacin entre parntesis:
double distancia, tiempo, velocidad;
distancia = 0.89;
tiempo = 0.1;
velocidad = (int)(a/b);
// c = (int)8.9 = 8.0
velocidad = ((int)a)/b;
// c = 0/0.1 = 0.0
estructuras de controL
estructuras condicionales
Las condiciones son ingredientes comunes de un programa. Las condiciones permiten ejecutar
una o varias sentencias dependiendo de validez de una expresin. En otras palabras, Si se cumple la condicin (...), se debe hacer (...). De lo contrario, si la condicin no se cumple, se debe hacer
(...).
Los operandos condicionales if-else y switch se utilizan en las operaciones condicionales. Una
sentencia condicional puede ser seguida por una sola sentencia o por un bloque de sentencias a
ser ejecutadas.
operador condicional if-else
El operador if se puede utilizar solo o asociado al operador else (if-else).
Ejemplo del operador if:
if(expresin) operacin;
Si el resultado de la expresin encerrada entre parntesis es verdadero (distinto de 0) la operacin se realiza y el programa contina con la ejecucin. Si el resultado de la expresin es falso (0),
la operacin no se realiza y el programa contina inmediatamente con la ejecucin.
Como hemos mencionado, la otra forma combina tanto el operador if como el else:
if(expresin) operacin1 else operacin2;
Si el resultado de la expresin es verdadero (distinto de 0), se realiza operacin1, de lo contrario se realiza la operacin2. Despus de realizar una de las operaciones, el programa contina con
la ejecucin.
La sentencia if-else se parece a lo siguiente:
if(expresin)
operacin1
else
operacin2
Si operacin1 u operacin2 est compuesta, escriba una lista de sentencias encerradas entre
llaves. Por ejemplo:
Captulo 2
45
//
// operacin1
//
operador switch
A diferencia de la sentencia if-else que selecciona entre dos opciones en el programa, el operador switch permite elegir entre varias opciones. La sintaxis de la sentencia switch es:
switch (selector)
{
case constante1:
operacin1
...
break;
case constante2:
operacin2
...
break;
...
default:
operacin_esperada
...
break;
}
La operacin switch se ejecuta de la siguiente manera: primero se ejecuta el selector y se compara con la constante1. Si coinciden, las sentencias que pertenecen a ese bloque se ejecutan hasta
llegar a la palabra clave break o hasta el final de la operacin switch. Si no coinciden, el selector se
46
S iStEmaS
dE
P rogramaCiN : L ENguajE
mikro C
compara con la constante2. Si coinciden, las sentencias que pertenecen a ese bloque se ejecutan
hasta llegar a la palabra clave break etc. Si el selector no coincide con ninguna constante, se ejecutarn las operaciones que siguen al operador default.
Tambin es posible comparar una expresin con un grupo de constantes. Si coincide con alguna de ellas, se ejecutarn las operaciones apropiadas:
switch (das)
// La variable das representa un da de la semana.
{
// Es necesario determinar si es un da laborable o no lo es
case1:case2:case3:case4:case5: LCD_message = Da laborable; break;
case6:case7: LCD_message = Fin de semana; break;
default:LCD_message_1 = Elija un da de la semana; break;
}
La palabra clave de C break se puede utilizar en cualquier tipo de bloques.
Al utilizar break, es posible salir de un bloque aunque la condicin para su final no se haya cumplido.
Se puede utilizar para terminar un bucle infinito, o para forzar un bucle a terminar antes de lo
normal.
bucLes
A menudo es necesario repetir una cierta operacin un par de veces en el programa. Un conjunto de comandos que se repiten es denominado un bucle de programa. Cuntas veces se ejecutar, es decir cunto tiempo el programa se quedar en el bucle, depende de las condiciones de
salir del bucle.
bucle While
El bucle while se parece a lo siguiente:
while(expresin){
comandos
...
}
Los comandos se ejecutan repetidamente (el programa se queda en el bucle) hasta que la expresin llegue a ser falsa.
Si la expresin es falsa en la entrada del bucle, entonces el bucle no se ejecutar y el programa
continuar desde el fin del bucle while.
Un tipo especial del bucle de programa es un bucle infinito. Se forma si la condicin sigue sin
cambios dentro del bucle. La ejecucin es simple en este caso ya que el resultado entre llaves es
siempre verdadero (1=verdadero), lo que significa que el programa se queda en el mismo bucle:
while(1){
...
...
}
Captulo 2
47
La operacin se ejecutar cinco veces. Luego, al comprobar se valida que la expresin k<5 sea
falsa (despus de 5 iteraciones k=5) y el programa saldr del bucle for.
bucle do-while
El bucle do-while se parece a lo siguiente:
do
operacin
while (cambiar_condicin);
La expresin cambiar_condicin se ejecuta al final del bucle, que significa que operacin se ejecuta como mnimo una vez sin reparar en que si la condicin es verdadera o falsa. Si el resultado
es distinto de 0 (verdadero), el procedimiento se repite.
Todos los siguientes ejemplos son equivalentes. Esta parte del cdigo visualiza hello en un
LCD 10 veces con un retardo de un segundo. Note que en este ejemplo se utilizan funciones predefinidas, que se encuentran en las libreras del compilador mikroC PRO for PIC. No obstante le
aconsejamos que no trate de entenderlas en detalle. Su comportamiento general dentro del bucle
se explica por medio de los comentarios.
i = 0;
while (i<10) {
Lcd_Out(1,3,hello);
Delay_ms(1000);
Lcd_Cmd(_LCD_CLEAR);
Delay_ms(500);
i++;
}
// Condicin
// Visualizar hello en el LCD
// Retardo de 1000 ms
// Borrar el LCD
// Retardo de 500ms
// Contador se incrementa
48
S iStEmaS
for(i=0; i<10; i++) {
Lcd_Out(1,3,hello);
Delay_ms(1000);
Lcd_Cmd(_LCD_CLEAR);
Delay_ms(500);
}
i = 0;
dE
P rogramaCiN : L ENguajE
mikro C
do {
Lcd_Out(1,3,hello);
Delay_ms(1000);
Lcd_Cmd(_LCD_CLEAR);
Delay_ms(500);
i++;
}
while (i<10);
sentencias de saLto
sentencia break
A veces es necesario detener y salir de un bucle dentro de su cuerpo. La sentencia break se
puede utilizar dentro de cualquier bucle (while, for, do while) y en las sentencias switch tambin. En
stas la sentencia break se utiliza para salir de las sentencias switch si la condicin case es verdadera. En este ejemplo, Esperar est parpadeando en la pantalla LCD hasta que el programa detecte un uno lgico en el pin 0 del puerto PORTA.
while(1){
if(PORTA.F0 == 1)
break;
Lcd_Out(1,3,Esperar);
Delay_ms(1000);
Lcd_Cmd(_LCD_CLEAR);
Delay_ms(500);
}
// Bucle infinito
// Probar si el estado lgico del pin 0 del puerto
// PORTA es 1; si equivale, salir del bucle
// Visualizar Esperar en el LCD
// Retardo de 1000 ms
// Borrar LCD
// Retardo de 500ms
sentencia continue
La sentencia continue colocada dentro de un bucle se utiliza para saltar una iteracin. A diferencia de la sentencia break, el programa se queda dentro del bucle y las iteraciones continan.
// Si x=7, puede ocurrir una divisin por 0.
// continue se utiliza aqu para evitar esta situacin.
x=1;
while (x<=10) {
if (x == 7) {
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,3,Division by 0);
Captulo 2
49
}
a = 1/(x-7);
sentencia goto
La sentencia goto le permite hacer un salto absoluto al otro punto en el programa. Esta caracterstica se debe utilizar con precaucin ya que su ejecucin puede causar un salto incondicional sin
hacer caso a todos los tipos de limitaciones de anidacin. El punto destino es identificado por una
etiqueta, utilizada como un argumento para la sentencia goto. Una etiqueta consiste en un identificador vlido seguido por un colon (:).
...
if(CO2_sensor) goto aire acondicionado; // Si se consta que el valor
...
// de la variable CO2_sensor =1
// hacer salto a la lnea de programa
// Aire acondicionado
...
Aire acondicionado:
// Desde aqu sigue la parte del cdigo que se ejecutar
// en caso de una concentracin de CO2 demasiado alta
...
// en el ambiente
matrices
Una matriz es una lista de elementos del mismo tipo colocados en localidades de memoria contiguas. Cada elemento es referenciado por un ndice. Para declarar una matriz, es necesario especificar el tipo de sus elementos (denominado tipo de matriz), su nombre y el nmero de sus elementos encerrados entre corchetes. Todos los elementos de una matriz tienen el mismo tipo.
tipo_de_matriz nombre_de_matriz [n_de_elementos];
Los elementos de una matriz se identifican por su posicin. En C, el ndice va desde 0 (el primer
elemento de una matriz) a N-1 (N es el nmero de elementos contenidos en una matriz). El compilador tiene que saber cuntas localidades de memoria debe alojar al declarar una matriz.
50
S iStEmaS
dE
P rogramaCiN : L ENguajE
mikro C
El tamao de una matriz no puede ser una variable. Por eso, se pueden utilizar dos mtodos:
// mtodo 1
// Declaracin de la matriz display capaz de contener 3 enteros
// mtodo 2
El siguiente programa cambia el orden de los elementos de una matriz. Note que el ndice se
puede expresar mediante variables y operaciones bsicas.
void main() {
// Valor de la constante MUESTRAS_DE_AGUA es 4
const MUESTRAS_DE_AGUA = 4;
int i, temp;
// Variables i y temp son de tipo int
int profunidad_de_sonda [MUESTRAS_DE_AGUA] = {24,25,1,1987};
// Todos
// los miembros de la matriz profundidad
// de sonda son de tipo int
for(i=0;i<(MUESTRAS_DE_AGUA/2);i++){ // Bucle se ejecuta 2 veces
temp = profundiad_de_sonda [i];
// temp se utiliza para guardar un valor
// temporalmente
profundiad_de_sonda [i] = profundiad_de_sonda [MUESTRAS_DE_AGUA-1-i];
profundiad_de_sonda [MUESTRAS_DE_AGUA-1-i] = temp;
}
// Aqu tenemos: profundidad_de_sonda [MUESTRAS_DE_AGUA] = {1987,1,25,24}
}
matrices bidimensionales
Aparte de las matrices unidimensionales que se pueden interpretar como una lista de valores, el
lenguaje C le permite declarar matrices multidimensionales.
Captulo 2
51
Similar a las matrices unidimesionales, es posible asignar los valores a los elementos de una
tabla en la lnea de declaracin. La asignacin debe ser realizada lnea a lnea como en el siguiente ejemplo. Como hemos visto anteriormente, esta matriz tiene dos filas y tres columnas:
int Tabla [2][3]= { {3,42,1},{7,7,19} };
La matriz anterior se puede representar tambin en la forma de una tabla de valores:
___________________________
3
42
1
7
7
19
Punteros
Un puntero es una variable destinada a recibir una direccin. Un puntero apunta a una localidad de memoria, referenciada por una direccin. En C, la direccin de un objeto se puede obtener
por medio un operador unitario &. Para acceder al contenido de la memoria en una direccin especfica (tambin llamado objeto apuntado), se utiliza un operador de indireccin (*).
52
S iStEmaS
dE
P rogramaCiN : L ENguajE
mikro C
En esta etapa, el puntero mi_puntero apunta al valor almacenado en esta localidad de memoria,
o sea, a un valor desconocido. As que, una inicializacin es muy recomendable:
puntero = &variable;
Ahora, puntero contiene la direccin de variable.
Para acceder al contenido de la variable apuntada, debe utilizar *.
El siguiente ejemplo muestra el contenido de memoria dependiendo de la accin realizada por
medio del puntero.
Los punteros son muy tiles para manejar las matrices. En este caso, un puntero se utilizar para
apuntar al primer elemento de una matriz.
Debido al hecho de que es posible realizar operaciones bsicas sobre los punteros (aritmtica
de punteros), es fcil manejar los elementos de una matriz.
Fjese en la diferencia entre *v+1 y *(v+1) en el siguiente ejemplo:
short int voltio[3] = {0,5,10};
short int *v;
v = &(voltio[0]);
*(v+1) = 2;
voltio[2] = *v+1;
*(v+2) = *(v+1);
v++;
*v = 1;
Los punteros tambin pueden ser declarados con el prefijo const. En este caso, su valor no
puede ser modificado despus de la inicializacin, similar a una constante.
A diferencia de C, el mikroC no admite alojamiento dinmico.
estructuras
Ya hemos visto cmo agrupar los elementos dentro de matrices. No obstante, al utilizar este
mtodo todos los elementos deben ser del mismo tipo.
Al utilizar estructuras, es posible agrupar diferentes tipos de variables bajo el mismo nombre. Las
variables dentro de una estructura se le denominan los miembros de la estructura. Las estructuras
de datos se declaran al utilizar la siguiente sintaxis:
Captulo 2
53
Funciones
Una funcin es una subrutina que contiene una lista de sentencias a realizar. La idea principal
es dividir un programa en varias partes utilizando estas funciones para resolver el problema inicial
con ms facilidad. Adems, las funciones nos permiten utilizar las destrezas y el conocimiento de
otros programadores. Una funcin se ejecuta cada vez que se llame dentro de otra funcin. En C,
un programa contiene como mnimo una funcin, la funcin main(), aunque el nmero de funciones
es normalmente mayor. Al utilizar funciones el cdigo se hace ms corto ya que es posible llamar
una funcin tantas veces como se necesite. En C, el cdigo normalmente consiste en muchas funciones. No obstante, en caso de que su programa sea muy corto y simple, puede escribir todas las
sentencias dentro de la funcin principal.
Funcin Principal
La funcin principal main() es una funcin particular puesto que es la que se ejecuta al iniciar el
programa. Adems, el programa termina una vez completada la ejecucin de esta funcin. El compilador reconoce automticamente esta funcin y no es posible llamarla por otra funcin. La sintaxis de esta funcin es la siguiente:
54
S iStEmaS
dE
P rogramaCiN : L ENguajE
mikro C
Cada funcin debe ser declarada apropiadamente para poder interpretarla correctamente durante el proceso de compilacin. La declaracin contiene los siguientes elementos:
* Tipo de resultado (valor devuelto): tipo de dato del valor devuelto
* Nombre de funcin: es un identificador que hace posible llamar a una funcin.
* Declaracin de parmetros: se parece a la declaracin de variable regular (por ejemplo: float
x). Cada parmetro consiste en una variable, constante, puntero o matriz, precedidos por la etiqueta de tipo de dato. Se utilizan para pasar la informacin a la funcin al llamarla. Los parmetros diferentes estn delimitados por comas.
* Cuerpo de funcin: bloque de sentencias dentro de llaves.
Una funcin se parece a lo siguiente:
tipo_de_resultado nombre_de_funcin (tipo argumento1, tipo argumento2,...)
{
Sentencia;
Sentencia;
...
return ...
}
Note que una funcin no necesita parmetros (funcin main() por ejemplo), pero debe estar entre
parntesis. En caso contrario, el compilador malinterpretara la funcin. Para hacerlo ms claro, puede
sustituir el espacio en blanco encerrado entre parntesis por la palabra clave void: main (void).
Captulo 2
55
Una funcin no puede devolver ms de un valor, pero puede devolver un puntero o una estructura. Tenga cuidado al utilizar matrices y punteros. El siguiente ejemplo es un error tpico:
int *reverse(int *tab)
{
int r[DIM];
int i;
for(i=0;i<DIM;i++)
r[i] = tab[DIM-1-i];
return r;
}
En realidad, el compilador reserva memoria para el almacenamiento de variables de la funcin
reverse slo durante su ejecucin. Una vez completada la ejecucin de reverse, la localidad de
memoria para la variable i o para la matriz r ya no est reservada. Esto significa que la direccin
que contiene los valores de i o r[] est libre para introducir datos nuevos. Concretamente, la funcin
devuelve slo el valor &r[0], as que slo el primer elemento de la matriz tab ser almacenado en la
memoria. Las dems localidades de memoria, tales como &tab[1], &tab[2], etc. sern consideradas
por el compilador como espacios en blanco, o sea, estarn listas para recibir los nuevos valores.
Para escribir esta funcin es necesario pasar la matriz r [] como parmetro (vea la subseccin
Pasar los parmetros).
La funcin puede contener ms de una sentencia return. En este caso, al ejecutar la primera sentencia return, la funcin devuelve el valor correspondiente y se detiene la ejecucin de la funcin.
float abs (float x, float y) // Devolver el valor absoluto de 2*x-y
{
if ((2*x - y) >= 0)
return (2*x - y);
else
return (-2*x + y);
}
Si la funcin no devuelve ningn valor, la palabra void debe ser utilizada como un tipo de resultado en la declaracin. En este caso, la sentencia return no debe ser seguida por ninguna expresin. Puede ser omitida como en el siguiente ejemplo:
void wait_1 (unsigned int a)
{
56
S iStEmaS
cnt ++;
Delay_ms(a) ;
}
dE
P rogramaCiN : L ENguajE
mikro C
Cuando se llama una funcin, el programa salta a la funcin llamada, la ejecuta, despus vuelve a la lnea desde la que fue llamada.
Pasar los Parmetros
Al llamar una funcin, se le pasan los parmetros. En C existen dos formas diferentes para pasar
parmetros a una funcin.
Captulo 2
57
// Prototipo de funcin
// Nmero de miembros a ordenar
void main() {
int maximum, input[SIZE] = {5,10,3,12,0}; // Declaracin de variables en la matriz
maximum = sort(input);
// Llamar a funcin y asignarle el mximo
// valor a la variable maximum
}
int sort(int *sequence) {
int i, temp, permut;
permut = 1;
while(permut!=0) {
permut = 0;
for(i=0;i<SIZE-1;i++) {
// Declaracin de variables
// Bandera de bit indica que se ha hecho una permutacin
// Quedarse en el bucle hasta reiniciar la bandera
// Bandera reiniciada
// Comparar y ordenar los miembros de la
// matriz (dos a dos)
58
S iStEmaS
dE
P rogramaCiN : L ENguajE
mikro C
En este ejemplo, por medio de una funcin se realizan dos operaciones: ordena los miembros
de la matriz por valor asdendente y devuelve el mximo valor.
Para utilizar una matriz en una funcin es necesario asignar la direccin a la matriz (o a su primer miembro). Vea el siguiente ejemplo:
float mtodo_1(int[]);
float mtodo_2(int*);
const NMERO_DE_MEDICIONES = 7;
void main()
{
double promedio1, promedio2;
}
//
float mtodo_1(int voltaje[])
// Inicio de la funcin mtodo_1
{
int i, suma;
// Declaracin de las variables locales i y suma
for(i=0;i<NMERO_DE_MEDICIONES;i++)
suma += voltaje[i];
return(suma/NMERO_DE_MEDICIONES);
}
//
float mtodo_2 (int *voltaje)
//Inicio de la funcin mtodo_2
{
int i, suma;
// Declaracin de las variables locales i y suma
for(i=0;i<NMERO_DE_MEDICIONES;i++)
suma += *(voltaje+i);
return(suma/NMERO_DE_MEDICIONES);
}
Las funciones mtodo_1 y mtodo_2 son completamente equivalentes. Las dos devuelven el
valor promedio de la matriz voltaje[].
Despus de declararla, la direccin del primer miembro se puede escribir como voltaje o &voltaje[0].
Captulo 2
59
60
S iStEmaS
dE
P rogramaCiN : L ENguajE
mikro C
inclusin de archivos
La directiva de preprocesador #include copia un archivo especfico en el cdigo fuente. El cdigo incluido debe observar la sintaxis de C para ser compilado correctamente.
Hay dos formas de escribir estas directivas. En el primer ejemplo, slo el nombre de archivo se
especifica, as que el preprocesador lo buscar dentro del archivo include. En el segundo ejemplo,
se especifica la ruta entera, as que el archivo estar directamente incluido (este mtodo es ms
rpido).
#include <nombre_de_archivo>
#include C:\Ruta\nombre_de_archivo.h
Lo dados hasta aqu es una base para que pueda aprender a programar en lenguaje.
Como ya hemos visto, hay varias divergencias entre los lenguajes mikroC y ANSI C. En el prximo tomo de coleccin del Club Saber Electrnica vamos a presentar las caractersticas especficas del mikroC con el propsito de facilitar la programacin de los microcontroladores PIC. J
Captulo 2
61
Captulo 3
elementos indispensables para que pueda funcionar como una minicomputadora en un solo
chip.
Un microprocesador es solamente la unidad
central de procesos o CPU, la memoria, los
Captulo 3
63
64
Figura 1
tor para el reset. Por supuesto necesita una tensin de fuente de 5V (VDD) aplicada con respecto al terminal de masa (VSS). Posee dos puertos
de salida, el A y el B, cuyos terminales son marcados RA0 al RA4 y RB0 al RB7. Estos puertos
pueden ser programados como de entrada o de
salida. El terminal 4 opera como reset pero tambin cumple funciones de carga de memoria de
programa cuando es excitado con pulsos de
15V. El terminal RA4 (pata 3) tambin tiene funciones como entrada de un temporizador y RBO
(pata 6) cumple tambin funciones como entrada de interrupcin.
Vamos a realizar la explicacin de este captulo en base al microcontrolador 16F84 por ser
uno de los PICs de mayor renombre y por existir abundante bibliografa y proyectos disponibles gratuitamente en Internet. Sin embargo, debemos aclarar que existen otros chips como el
16F628, que son similares a ste, ms econmicos y de mejores prestaciones. Oportunamente
veremos cmo migrar de uno a otro sin mayores complicaciones.
Figura 2
Figura 3
Captulo 3
65
66
La MeMorIa de PrograMa
La memoria del PIC16F84 es una EEPROM,
es decir, de lectura solamente (ROM = Read
Only Memory) que se programa por tensin (no
necesita luz ultravioleta); es decir que basta con
introducir los datos con cierto nivel de tensin
para que stos borren el programa anterior y
graben uno nuevo.
Por qu esta memoria se llama ROM, si se
pueden grabar datos sobre ella?
Se llama ROM porque para grabarla se debe
La MeMorIa de datos
La RAM (Random Access Memory = memoria de acceso aleatorio,
figura 5) es una memo-
Captulo 3
67
ria de lectura y escritura de 64. De estos 64 registros, los primeros 12 son fijos y cumplen un
propsito determinado, en tanto que desde el 13
hasta el 64 son registros de propsito general,
en donde el programa puede indicar que se almacene un dato para ser tomado ms tarde.
Adems, posee un conjunto de memoria SRAM
de 36 posiciones con los que se pueden construir registros de 8 bits con caractersticas
EEPROM. En lo personal, prefiero designar a
este conjunto de registros como memoria libre.
68
te). Como puerto de salida, una pata puede tomar 25mA del circuito o entregar 20mA al mismo, sin embargo, en el puerto A slo se pueden consumir 80mA en total o entregar 50mA,
esto significa que slo algunas patas pueden
trabajar al mximo porque si todas lo hicieran (y
son 8) el consumo total sera de 25 x 8 = 200mA.
El puerto B tiene otras caractersticas mximas, ya que en total puede tomar 150mA o entregar 100mA. Como vemos, las salidas admiten
suficiente carga como para alimentar directamente a un led (figura 6). Los puertos no utilizados siempre se deben conectar a la fuente de
5V a travs de un resistor de 10k debido a que
se trata de un dispositivo CMOS que, de otro
modo, podra deteriorarse por captacin electrosttica (figura 7).
La pata 3 perteneciente al puerto A puede
ser configurada como de entrada/salida o como
Figura 7
Figura 8
eL reset
El PIC se resetea cuando la pata 4 (MCLR
negada) se pone a potencial bajo. Para simplificar el circuito de reset, el PIC posee un temporizador interno que permite realizar un reset automtico cuando se aplica tensin de 5V. En estos
casos el circuito externo de reset slo implica el
Figura 11
eL cLock
Figura 9
Figura 10
Captulo 3
69
PrIMeras concLusIones
El PIC es un microcontrolador, una especie
de "ordenador en miniatura" (con muchas comillas) que podremos programar. Hay muchos tipos de microcontroladores PIC, los hay de 8 patas con 6 terminales para intercambio de datos
(6 terminales de entrada / salida de datos), pero
tambin existen dispositivos ms poderosos de
80 patas con 40 pines I/O (de entrada y salida
de datos).
GPIC USB:
ProGramador de mICroControladoreS PIC y
memorIaS eeProm Por PUerto USB
IntroduccIn
Este proyecto comenz a principios del
2008 cuando inici la escritura del cdigo
fuente para el firmware de un 18F2550 y la
elaboracin del Software correspondiente a
la interfaz de usuario para la PC de un programador de microcontroladores Pic por
puerto USB. Anteriormente ya haba estado interesado en los procesos de programacin de los Pic por lo tanto, basado en
esas experiencias y en el estudio de los
Data Sheets referentes a las especificaciones de programacin de los microcontrola-
70
dores, surgi el GPIC USB como una aplicacin totalmente funcional hacia finales
de Octubre del 2008.
A la fecha ha sufrido algunas modificaciones que permite mejorar su funcionamiento y ampliar la cantidad de componentes soportados.
descrIPcIn
deL
cIrcuIto eLectrnIco
Figura 1
Figura 2
Captulo 3
71
Figura 3
72
Captulo 3
73
74
Figura 5
Figura 6
Figura 7
Est conformada, como podemos observar en la figura 6, por el Zener Z1 conectado al pin 8 del CA3140 en serie con el transistor NPN Q2 que trabaja como llave electrnica On-Off, de acuerdo a los niveles alto
o bajo en la base. Con un nivel bajo sobre
la base de este transistor el circuito est
desconectado, por lo tanto la tensin VPP
ser la normal de 12.30V a 13V; por otro
lado, con un nivel alto proporcionado por
RB4 del 18F2550 a travs de R13 el circuito se conecta, la tensin VPP en este caso
ser de 3.3 volt.
De esta forma queda totalmente automatizado el suministro de VPP de acuerdo
a los dispositivos seleccionados desde la
interfaz de usuario en la PC.
Por el momento no es necesario implementar Z1, Q2 y R13, ya que es la primera
versin base del programador y dicha gama
de dispositivos an no estn incorporados.
En este caso el pin 8 debe quedar sin conexin. Como pueden ver, la electrnica del
programador ya est pensada para soportar de forma prctica a estos microcontroladores a medida que sean agregados.
Continuando con esta etapa, las entradas inversora y no inversora del amplificador operacional se conectan con RB3 y
RB2 del microcontrolador; de acuerdo a los
Captulo 3
75
76
Figura 9
Captulo 3
77
Figura 11
Figura 12
78
Figura 13
Captulo 3
79