Está en la página 1de 84

Portada club 97.

qxd:Maquetacin 1 05/04/13 14:38 Pgina 1

2 de forros.qxd:club 05/03/13 16:29 Pgina 2Fo1

suma edi Club 97.qxd:*Cap 4 - telefonia 05/04/13 14:55 Pgina 1

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

La Editorial no se responsabiliza por el contenido de


las notas firmadas. Todos los productos o marcas
que se mencionan son a los efectos de prestar un
servicio al lector, y no entraan responsabilidad de
nuestra parte. Est prohibida la reproduccin total o
parcial del material contenido en esta revista, as como la industrializacin y/o comercializacin de los
aparatos o ideas que aparecen en los mencionados
textos, bajo pena de sanciones legales, salvo mediante autorizacin por escrito de la Editorial.
Impresin: Talleres Babieca - Mxico

Del Editor al Lector


La coleccin Club Saber Electrnica fue pensada como una obra de 12 tomos de edicin
mensual en la que se tratarn los temas ms significativos de la electrnica. Rpidamente comprendimos que esta serie estaba llenando un vaco en la informacin y por ello decidimos continuarla. Ya llevamos ms de 8 aos (97 tomos de coleccin) y pensamos que su vida an est en
paales.
En diversos tomos nos hemos referido a los microcontroladores pero hasta la fecha poco
hemos hablado de lenguajes de programacin de alto nivel, es por ello que este libro y la siguiente edicin tratar este tema de una forma sencilla y con gran contenido prctico.
Un microcontrolador es un circuito integrado o chip que incluye en su interior las tres unidades funcionales de una computadora: CPU, Memoria y Unidades de E/S, es decir, se trata de
una computadora completa en un solo circuito integrado.
Son diseados para disminuir el costo econmico y el consumo de energa de un sistema en
particular. Por eso el tamao de la CPU, la cantidad de memoria y los perifricos incluidos dependern de la aplicacin. El control de un electrodomstico sencillo como una batidora, utilizar un
procesador muy pequeo (4 u 8 bit) por que sustituir a un autmata pequeo; en cambio un
reproductor de msica y/o vdeo digital (mp3 o mp4) requerir de un procesador de 32 bit o de 64
bit y de uno o mas cdec de seal digital (audio y/o vdeo). El control de un sistema de frenos
ABS (Antilock Brake System) se basa normalmente en un microcontrolador de 16 bit, al igual que
el sistema de control electrnico del motor en un automvil.
Los microcontroladores representan la inmensa mayora de los chips de computadoras vendidos, un 50% son controladores "simples" y el resto corresponde a procesadores ms especializados. Un microcontrolador difiere de una CPU normal, en que es ms fcil convertirlo en una
computadora en funcionamiento, con un mnimo de chips externos de apoyo.
Un microcontrolador tpico tendr un generador de reloj integrado y una pequea cantidad
de memoria RAM y ROM/EPROM/EEPROM/FLASH, significando que para hacerlo funcionar,
todo lo que se necesita son unos pocos programas de control y un cristal de sincronizacin. Los
microcontroladores disponen generalmente tambin de una gran variedad de dispositivos de
entrada/salida, como convertidores de analgico a digital, temporizadores, UARTs y buses de
interfaz serie especializados, como I2C y CAN. Frecuentemente, estos dispositivos integrados
pueden ser controlados por instrucciones de procesadores especializados. Los modernos microcontroladores frecuentemente incluyen un lenguaje de programacin integrado, como el BASIC
que se utiliza bastante con este propsito.
Esperamos que esta breve introduccin le sirva como disparador para estudiar el contenido en la espera del prximo texto.

Hasta el mes prximo!

Sobre loS 2 CDS y Su DeSCarga


Ud. podr descargar de nuestra web 2 CDs: Microcontroladores vol. 1 y 2
con gran cantidad de circuitos para armar y sistemas para experimentar. Todos los
CDs son productos multimedia completos con un costo de mercado equivalente a 8
dlares americanos cada uno y Ud. los puede descargar GRATIS con su nmero de
serie por ser comprador de este libro. Para realizar la descarga deber ingresar a
nuestra web: www.webelectronica.com.mx, tendr que hacer clic en el cono password e ingresar la clave MICro97. Tenga este texto cerca suyo ya que se le har
una pregunta aleatoria sobre el contenido para que pueda iniciar la descarga.

Captulo 1

suma edi Club 97.qxd:*Cap 4 - telefonia 05/04/13 14:55 Pgina 2

El Mundo de los Microcontroladores

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

Club saber electrnica n 97

Juego de Instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . .24


Cmo se Debe Elegir un Microcontrolador? . . . . . . . . . . .25

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

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Pgina 3

Captulo 1

eL muNdo de Los microcoNtroLadores

Los sistemas de NumeraciN


Prcticamente desde su aparicin, all por el ao 1986, en Saber Electrnica destacamos la importancia de los microcontroladores en el mundo de la electrnica.
Hemos escrito ms de 50 artculos, 10 libros de texto y varios cursos sobre componentes de distintas familias. Sin embargo, el tema nunca se agota y siempre se puede
dar una nueva vista que nos permita conocer cada vez mejor a estos procesadores
en un solo chip con los que podemos aprender y capacitarnos en nuestra vida profesional. A partir de este nmero comenzamos con la edicin de un curso de microcontroladores de MicroElectronika (www.mikroe.com) a quienes agradecemos por
permitirnos compartir este importantsimo material, invitando a todos los lectores a
que visiten la pgina de referencia para obtener importante material de apoyo.
www.mikroe.com
IntroduccIn
La situacin actual en el campo de los microcontroladores se ha producido gracias al desarrollo de la tecnologa de fabricacin de los cir-

cuitos integrados. Este desarrollo ha permitido


construir las centenas de miles de transistores
en un chip. Esto fue una condicin previa para la
fabricacin de un microprocesador. Las primeras microcomputadoras se fabricaron al aadir-

Captulo 1

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Pgina 4

El Mundo de los Microcontroladores


les perifricos externos, tales como memoria,
lneas de entrada/salida, temporizadores u
otros. El incremento posterior de la densidad de
integracin permiti crear un circuito integrado
que contena tanto al procesador como perifricos. As es cmo fue desarrollada la primera
microcomputadora en un solo chip, denominada
ms tarde microcontrolador.
Los principiantes en electrnica creen que un
microcontrolador es igual a un microprocesador.
Esto no es cierto. Difieren uno del otro en
muchos sentidos. La primera y la ms importante diferencia es su funcionalidad. Para utilizar al
microprocesador en una aplicacin real, se debe
de conectar con componentes tales como
memoria o componentes buses de transmisin
de datos. Aunque el microprocesador se considera una mquina de computacin poderosa, no
est preparado para la comunicacin con los
dispositivos perifricos que se le conectan. Para
que el microprocesador se comunique con algn
perifrico, se deben utilizar los circuitos especiales. As era en el principio y esta prctica sigue
vigente en la actualidad.
Por otro lado, al microcontrolador se le disea de tal manera que tenga todas las componentes integradas en el mismo chip. No necesita de otros componentes especializados para su
aplicacin, porque todos los circuitos necesarios, que de otra manera correspondan a los
perifricos, ya se encuentran incorporados. As
se ahorra tiempo y espacio necesario para construir un dispositivo.

Qu Pueden Hacer los MIcrocontroladores


Para entender con ms facilidad las razones
del xito tan grande de los microcontroladores,
vamos a prestar atencin al siguiente ejemplo.
Hace unos 10 aos, disear un dispositivo electrnico de control de un ascensor de un edificio
de varios pisos era muy difcil, incluso para un
equipo de expertos.
Ha pensado alguna vez en qu requisitos
debe cumplir un simple ascensor? Cmo lidiar
con la situacin cuando dos o ms personas lla-

Club Saber Electrnica N 97

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

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Pgina 5

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

mente significa. Es as como se hacan las


cosas hasta aparicin de los microcontroladores
diseados - pequeos, potentes y baratos.
Desde ese momento su programacin dej de
ser una ciencia, y todo tom otra direccin ...
El dispositivo electrnico capaz de controlar

Figura 1

Captulo 1

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Pgina 6

El Mundo de los Microcontroladores


un pequeo submarino, una gra o un ascensor
como el anteriormente mencionado, ahora est
incorporado en un slo chip. Los microcontroladores ofrecen una amplia gama de aplicaciones y
slo algunas se exploran normalmente. Le toca a
usted decidir qu quiere que haga el microcontrolador y cargar un programa en l con las instrucciones apropiadas. Antes de encender el dispositivo es recomendable verificar su funcionamiento
con ayuda de un simulador. Si todo funciona
como es debido, incorpore el microcontrolador en
el sistema. Si alguna vez necesita cambiar, mejorar o actualizar el programa, hgalo.
Hasta cundo se deben hacer modificaciones?
Hasta quedar satisfecho. Eso puede realizarse sin ningn problema. Vea en la figura 1 una
caracterizacin sobre los pasos que debe seguir
un principiante para la programacin.
Saba usted que todas las personas pueden
ser clasificadas en uno de 10 grupos, en los que
estn familiarizados con el sistema de numeracin binario y en los que no estn familiarizados
con l. Si no entendi lo anterior significa que
todava pertenece al segundo grupo. Si desea
cambiar su estado, lea el siguiente
texto que describe brevemente algunos
de los conceptos bsicos utilizados
ms tarde en este libro (slo para estar
seguro de que estamos hablando en
los mismos trminos).

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.

nMeros, nMeros, nMeros...


La matemtica es una gran ciencia!
Todo es tan lgico y simple... El universo de los nmeros se puede describir
con slo diez dgitos.
Realmente tiene que ser as?
Necesitamos exactamente esos 10 dgitos?
Por supuesto que no, es slo cuestin del
hbito. Acurdese de las lecciones de la escuela. Por ejemplo, qu significa el nmero 764?
Cuatro unidades, seis decenas y siete centenas.

Club Saber Electrnica N 97

Figura 2

sIsteMa de nuMeracIn BInarIo


Qu pasara si utilizramos slo dos nmeros 0 y 1?

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Pgina 7

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.

Evidentemente, se trata del mismo nmero


representado en dos sistemas de numeracin
diferentes. La nica diferencia entre estas dos
representaciones yace en el nmero de dgitos
necesarios para escribir un nmero. Un dgito
(2) se utiliza para escribir el nmero 2 en el sistema decimal, mientras que dos dgitos (1 y 0)
se utilizan para escribir aquel nmero en el sistema binario.
Ahora est de acuerdo que hay 10 grupos
de gente?
Bienvenido al mundo de la aritmtica binaria! Tiene alguna idea de dnde se utiliza?
Excepto en las condiciones de laboratorio
estrictamente controladas, los circuitos electrnicos ms complicados no pueden especificar
con exactitud la diferencia entre dos magnitudes
(dos valores de voltaje, por ejemplo), si son
demasiado pequeos (ms pequeos que unos

dE loS

M iCroCoNtroladorES

pocos voltios). La razn son los ruidos elctricos


y fenmenos que se presentan dentro de lo que
llamamos entorno de trabajo real (algunos
ejemplos de estos fenmenos son los cambios
imprevisibles de la tensin de alimentacin,
cambios de temperatura, tolerancia a los valores
de los componentes etc...). Imagnese una computadora que opera sobre nmeros decimales al
tratarlos de la siguiente manera: 0=0V, 1=5V,
2=10V, 3=15V, 4=20V... 9=45V
Alguien dijo bateras?
Una solucin mucho ms fcil es una lgica
binaria donde 0 indica la ausencia de voltaje,
mientras que 1 indica la presencia de voltaje.
Simplemente, es fcil de
Figura 3 escribir 0 o 1 en vez de no
hay voltaje o hay voltaje.
Mediante el cero lgico (0) y
uno lgico (1) la electrnica
se enfrenta perfectamente y
realiza con facilidad todas
las operaciones aritmticas.
Evidentemente, se trata de
electrnica que en realidad
aplica aritmtica en la que
todos los nmeros son
representados con slo dos
dgitos y donde slo es importante saber si hay
voltaje o no. Por supuesto, estamos hablando de
electrnica digital.

sIsteMa de nuMeracIn exadecIMal


En el principio del desarrollo de las computadoras era evidente que a la gente le costaba
mucho trabajar con nmeros binarios. Por eso,
se estableci un nuevo sistema de numeracin,
que utilizaba 16 smbolos diferentes. Es llamado
el sistema de numeracin hexadecimal. Este
sistema est compuesto de 10 dgitos a los que
estamos acostumbrados (0, 1, 2, 3,... 9) y de
seis letras del alfabeto A, B, C, D, E y F.
Cul es el propsito de esta combinacin
aparentemente extraa?
Basta con mirar cmo todo en la historia de

Captulo 1

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Pgina 8

El Mundo de los Microcontroladores


los nmeros binarios encaja perfectamente para
lograr una mejor comprensin del tema. Vea la
figura 4.
Figura 4

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.

conversIn de sIsteMas de nuMeracIn


El sistema de numeracin binario es el que
utilizan los microcontroladores, el sistema deci-

Club Saber Electrnica N 97

mal es el que nos resulta ms comprensible,


mientras que el sistema hexadecimal presenta
un balance entre los dos. Por eso, es muy
importante aprender cmo
convertir los nmeros de
un sistema de numeracin
a otro, por ejemplo, cmo
convertir una serie de
ceros y unos a una forma de representacin
comprensible para nosotros.

conversIn de nMeros BInarIos


a decIMales
Los dgitos en un nmero binario tienen ponderaciones diferentes lo que depende de sus
posiciones dentro del nmero que estn representando. Adems, cada dgito puede ser 1 o 0,
y su ponderacin se puede determinar con facilidad al contar su posicin empezando por la
derecha. Para hacer una conversin de un
nmero binario a decimal es necesario multiplicar las ponderaciones con los dgitos correspondientes (0 o 1) y sumar todos los resultados. La
magia de la conversin de un nmero binario a
decimal funciona de maravilla... Tiene dudas?
Vea el ejemplo de la figura 5.

Figura 5

Cabe destacar que es necesario utilizar slo


dos dgitos binarios para representar a todos los
nmeros decimales de 0 a 3.
Por consiguiente, para representar los nmeros de 0 a 7 es necesario utilizar tres dgitos
binarios, para representar los nmeros de 0 a 15
- cuatro dgitos etc.
Dicho de manera sencilla, el mayor nmero
binario que se puede representar utilizando n
dgitos se obtiene al elevar la base 2 a la potencia n. Luego, al resultado se le resta 1. Por ejemplo, si n=4:
24 - 1 = 16 - 1 = 15

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Pgina 9

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.

conversIn de nMeros HexadecIMales


a decIMales
Para realizar una conversin de un nmero
hexadecimal a decimal, cada dgito hexadecimal
debe ser multiplicado con el nmero 16 elevado
al valor de su posicin. Como ejemplo, vea la
representacin de la figura 6.

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.

conversIn de nMeros HexadecIMales


BInarIos

No es necesario realizar ningn clculo para


convertir un nmero hexadecimal a binario. Los
dgitos hexadecimales se reemplazan simplemente por los cuatro dgitos binarios apropiados.
Ya que el dgito hexadecimal mximo es equivalente al nmero decimal 15, es necesario utilizar
cuatro dgitos binarios para representar un dgito hexadecimal. Vea la figura 7.
Figura 7
Figura 8

Marcar los nMeros


El sistema de numeracin hexadecimal, junto
con los sistemas binario y decimal, se consideran los ms importantes para nosotros. Es fcil
realizar una conversin de cualquier nmero
hexadecimal a binario, adems es fcil de recordarlo. Sin obstante, estas conversiones pueden
provocar una confusin. Por ejemplo, qu significa en realidad la sentencia: Es necesario
contar 110 productos en una cadena de monta-

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

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Pgina 10

El Mundo de los Microcontroladores


volvindose las cosas ms complicadas. Se utilizan slo dos dgitos - 0 y 1, mientras que todos
los dems nmeros, smbolos y signos se forman por medio de las combinaciones de estos
dos dgitos. En el caso de los nmeros negativos, la solucin es la siguiente:
En los nmeros negativos, el bit ms significativo (el bit del extremo izquierdo) representa el
signo del nmero (donde 0 ser positivo y 1
negativo).
En el caso de un nmero de 8 bits, para
representar un valor numrico slo quedan 7
bits. De acuerdo a este tipo de codificacin el
nmero +127 es el mayor nmero positivo con
signo que se puede representar con 8 bits.
Asimismo, hay cero (0) positivo y negativo (refirase a la siguiente tabla).

el nmero 444 son los mismos pero tienen los


valores diferentes), el significado de un bit
depende de la posicin que tiene en nmero
binario. En los nmeros binarios, sus dgitos se
denominan el bit cero (el primer bit a la derecha), el primer bit (el segundo bit a la derecha)
etc. Adems, ya que el sistema binario utiliza
solamente dos dgitos (0 y 1), el valor de un bit
puede ser 0 o 1.
No se confunda si se encuentra con un bit
que tiene el valor 4, 16 o 64. Son los valores
representados en el sistema decimal.
Simplemente, nos hemos acostumbrado tanto a
utilizar los nmeros decimales que estas expresiones llegaron a ser comunes. Sera correcto
decir por ejemplo, el valor del sexto bit en cualquier nmero binario equivale al nmero decimal
64. Pero todos somos humanos y los viejos
hbitos mueren difcilmente. Adems, cmo le
suena nmero uno-uno-cero-uno-cero...?

BYte

Se puede saber de qu nmero se trata?


Por ejemplo, si ponemos el nmero
10000001, es -1 o 129? No se preocupe, de
eso se encarga el compilador. sta es la razn
por la que se declaran variables al escribir el
programa, mientras tanto, mire la tabla 1 para
interpretar lo que estamos diciendo. Bueno, de
eso vamos a hablar a continuacin.

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

Club Saber Electrnica N 97

Un byte consiste en 8 bits colocados uno


junto al otro. Si un bit es un dgito, es lgico que
los bytes representen los nmeros. Todas las
operaciones matemticas se pueden realizar
por medio de ellos, como por medio de los
nmeros decimales comunes. Similar a los dgitos de cualquier nmero, los dgitos de un byte
no tienen el mismo significado. El bit del extremo
izquierdo tiene la mayor ponderacin, por eso es
denominado el bit ms significativo (MSB). El bit
del extremo derecho tiene la menor ponderacin, por eso es denominado el bit menos significativo (LSB). Puesto que los 8 dgitos de un
byte se pueden combinar de 256 maneras diferentes, el mayor nmero decimal que se puede
representar con un byte es 255 (una combinacin representa un cero).
Un nibble o un cuarteto representa una
mitad de byte. Dependiendo de la mitad del
nmero en cuestin (izquierda o derecha), se
les denomina nibbles altos o bajos, respectivamente (figura 9).
Usted seguramente ha pensado alguna vez
en cmo es la electrnica dentro de un circuito

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Pgina 11

B aSES

Figura 9

integrado digital, un microcontrolador o un


microprocesador.
Cmo son los circuitos que realizan las operaciones matemticas complicadas y toman
decisiones? Saba que sus esquemas, aparentemente complicadas consisten en slo unos
pocos elementos diferentes, denominados circuitos lgicos o compuertas lgicas?

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.

coMPonentes BsIcos de la lgIca dIgItal


Algunas instrucciones de programa utilizadas
por un microcontrolador funcionan de la misma
manera que las compuertas lgicas, pero en
forma de comandos. A continuacin vamos a
explicar el principio de su funcionamiento.
compuerta Y (and)
Una compuerta lgica Y dispone de dos o
ms entradas y de una salida. En este caso la
compuerta utilizada dispone de slo dos entradas. Un uno lgico (1) aparecer en su salida

dE loS

M iCroCoNtroladorES

slo en caso de que ambas entradas (A Y B) sean llevadas a alto


(1). La tabla a la derecha de la
figura 10 (en la que tambin se
muestra el smbolo de esta compuerta) es la tabla de verdad que
muestra la relacin entre las
entradas y salidas de la compuerta. El principio de funcionamiento es el mismo
cuando la compuerta disponga de ms de dos
entradas: la salida proporciona un uno lgico (1)
slo si todas las entradas son llevadas a alto (1).
Vea la figura 11.

Figura 10
Figura 11

Cualquier otra combinacin de voltajes de


entrada proporcionar un cero lgico (0) en su
salida. Utilizada en el programa, la operacin Y
lgico es realizada por una instruccin de programa, de la que vamos a hablar ms tarde. Por
ahora basta con conocer que Y lgico en un programa se refiere a la realizacin de este tipo de
operacin sobre los bits correspondientes de
dos registros diferentes.

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

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Pgina 12

El Mundo de los Microcontroladores


disponga de ms de dos entradas, es aplicable
lo siguiente: La salida proporciona un uno lgico
(1) si por lo menos una entrada es llevada a alto
(1). Si todas las entradas estn a cero lgico (0),
la salida estar a cero lgico (0) tambin. Vea la
figura 13.

Figura 12
Figura 13

En un programa, la operacin O lgico se


realiza de la misma manera que la operacin Y.
compuerta no (not)
La compuerta lgica NO dispone de una sola
entrada y una sola salida, por lo que funciona
muy simplemente, figura 14. Cuando un cero lgico (0) aparezca en su entrada, la salida proporciona un uno lgico (1) y viceversa. Esto significa
que esta compuerta invierte las seales por s
mismas y por eso es denominada inversor.
En el programa la operacin lgica NO se
realiza sobre un byte. El resultado es un byte

con los bits invertidos, figura 15. Si los bits de un


byte se consideran nmero, el valor invertido es
un complemento a ese nmero.
El complemento de un nmero es el valor
que se aade al nmero hasta llegar al mayor
nmero binario de 8 dgitos. En otras palabras,
la suma de un dgito de 8 nmeros y de su complemento es siempre 255.
compuerta xor (o exclusiva)
La compuerta XOR (O EXCLUSIVA) es un
poco complicada en comparacin con las
dems. Representa una combinacin de todas
las compuertas anteriormente descritas y su
smbolo se puede ver en la figura 16. La salida
proporciona un uno lgico (1) slo si sus entradas estn en estados lgicos diferentes.
En el programa, esta operacin se utiliza con
frecuencia para comparar dos bytes. La resta se
puede utilizar con el mismo propsito (si el resultado es 0, los bytes son iguales). A diferencia de
la resta, la ventaja de esta operacin lgica es
que no es posible obtener los resultados negativos. En la figura 17 puede apreciar cmo es la
correspondencia entre entradas y salidas.

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

Club Saber Electrnica N 97

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Pgina 13

B aSES

M iCroCoNtroladorES

dE loS

En otras palabras, el estado


de los bits de registros se fija
dentro de programa, los
registros SFR dirigen los
pequeos circuitos dentro
del microcontrolador, estos
circuitos se conectan por los
pines del microcontrolador a
un dispositivo perifrico utilizado para... bueno, depende
de usted.

Figura 18

En la figura 18 tenemos un esquena que


ejemplifica el funcionamiento de un registro.
Puertos de entrada / salIda (e/s)
registros sFr
A diferencia de los registros que no tienen
ninguna funcin especial y predeterminada,
cada microcontrolador dispone de un nmero de

Para hacer til un microcontrolador, hay que


conectarlo a un dispositivo externo, o sea, a un
perifrico. Cada microcontrolador tiene uno o
ms registros (denominados puertos) conectados a los pines en el microcontrolador, figura 20.
Por qu se denominan puertos
de entrada/salida?
Porque usted puede cambiar la
funcin de cada pin como quiera.
Por ejemplo, usted desea que su
dispositivo encienda y apague los
tres seales LEDs y que simultneamente monitoree el estado
lgico de 5 sensores o botones de
Figura 19 presin. Uno de los puertos debe
estar configurado de tal manera
que haya tres salidas (conectadas a los LEDs) y
cinco entradas (conectadas a los sensores). Eso
se realiza simplemente por medio de software,
lo que significa que la funcin de algn pin

registros de funciones especiales (SFR), con la


funcin predeterminada por el fabricante. Sus
bits estn conectados a los circuitos internos del
microcontrolador tales como temporizadores,
convertidores A/D, osciladores entre
otros, lo que significa que directamente
manejan el funcionamiento de estos
circuitos, o sea del microcontrolador.
Imagnese ocho interruptores que
manejan el funcionamiento de un circuito pequeo dentro del microcontrolador. Los registros SFR hacen exactamente lo mismo. Vea en la figura 19 un
diagrama en bloques de aplicacin de
estos registros.
Figura 20

Captulo 1

13

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Pgina 14

El Mundo de los Microcontroladores


puede ser cambiada durante el funcionamiento.
Una de las caractersticas ms importantes
de los pines de entrada/salida (E/S) es la
corriente mxima que pueden entregar/recibir.
En la mayora de los microcontroladores la
corriente obtenida de un pin es suficiente para
activar un LED u otro dispositivo de baja corriente (10-20mA).
Mientras ms pines de E/S haya, ms baja
es la corriente mxima de un pin. En otras palabras, todos los puertos de E/S comparten la
corriente mxima declarada en la hoja de especificacin tcnica del microprocesador.
Otra caracterstica importante de los pines es
que pueden disponer de los resistores pull-up.
Estos resistores conectan los pines al polo positivo del voltaje de la fuente de alimentacin y su
efecto se puede ver al configurar el pin como
una entrada conectada a un interruptor mecnico o a un botn de presin. Las ltimas versiones de los microcontroladores tienen las resistencias pull-up configurables por software.
Cada puerto de E/S normalmente est bajo
el control de un registro SFR especializado, lo
que significa que cada bit de ese registro determina el estado del pin correspondiente en el
microcontrolador. Por ejemplo, al escribir un uno
lgico (1) a un bit del registro de control (SFR),
el pin apropiado del puerto se configura automticamente como salida.
Eso significa que el voltaje llevado a ese pin
se puede leer como 0 o 1 lgico. En caso contrario, al escribir 0 al registro SFR, el pin apropiado del puerto se configura como salida. Su
voltaje (0V o 5V) corresponde al estado del bit
apropiado del registro del puerto.

Figura 21

De manera similar, cada direccin de memoria corresponde a una localidad de memoria. El


contenido de cualquier localidad se puede leer y
se le puede acceder al direccionarla. La memoria se puede escribir en la localidad o leer.
Hay varios tipos de memoria dentro del
microcontrolador:
Memoria roM Memoria de slo lectura
ROM: Read Only Memory. La memoria ROM
se utiliza para guardar permanentemente el programa que se est ejecutando. El tamao de
programa que se puede escribir depende del
tamao de esta memoria. Los microcontroladores actuales normalmente utilizan el direccionamiento de 16 bits, que significa que son capaces
de direccionar hasta 64 Kb de memoria, o sea
65535 localidades. Por ejemplo, si usted es principiante, su programa exceder pocas veces el
lmite de varios cientos de instrucciones. Hay
varios tipos de memoria ROM:

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

Club Saber Electrnica N 97

rom de Mscara (enmascarada) - MroM


La ROM enmascarada es un tipo de ROM
cuyo contenido es programado por el fabricante.
El trmino de mscara viene del proceso de
fabricacin, donde las partes del chip se plasman en las mascaras utilizadas durante el proceso de fotolitografa. En caso de fabricacin de
grandes series, el precio es muy bajo. Olvide la
idea de modificarla...

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Pgina 15

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

uv eProM (uv erasable Programmable


roM) - roM programable borrable
por rayos ultravioleta
El encapsulado de esta memoria, figura 22,
tiene una ventana reconocible en la parte alta.
Eso permite exponer la superficie del chip de silicio a la luz de ultravioleta y borrar el programa
completamente en varios minutos. Luego es
posible descargar un nuevo programa en l.
La instalacin de esta ventana es complicada, lo que por supuesto afecta al precio. Desde
nuestro punto de vista, desgraciadamente, de
manera negativa...

dE loS

M iCroCoNtroladorES

pequea escala. Por la gran popularidad de esta


memoria, la mayora de los microcontroladores
se fabrican con tecnologa flash hoy en da. Si
usted va a comprar un microcontrolador, ste
es en definitiva la opcin perfecta!
Memoria raM Memoria
de acceso aleatorio
RAM: Random Access Memory. Al apagar la
fuente de alimentacin, se pierde el contenido
de la memoria RAM. Se utiliza para almacenar
temporalmente los datos y los resultados inmediatos creados y utilizados durante el funcionamiento del microcontrolador. Por ejemplo, si el
programa ejecuta la adicin (de cualquier cosa)
es necesario tener un registro que representa lo
que se llama suma en vida cotidiana. Con tal
propsito, uno de los registros de la RAM es
denominado suma y se utiliza para almacenar
los resultados de la adicin.
Memoria eeProM roM Programable
y Borrable elctricamente
EEPROM:
Electricall
y
Erasable
Programmable ROM. El contenido de la
EEPROM se puede cambiar durante el funcionamiento (similar a la RAM), pero se queda permanentemente guardado despus de la prdida
de la fuente de alimentacin (similar a la ROM).
Por lo tanto, la EEPROM se utiliza con frecuencia para almacenar los valores creados durante
el funcionamiento, que tienen que estar permanentemente guardados. Por ejemplo, si usted ha

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

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Pgina 16

El Mundo de los Microcontroladores


diseado una llave electrnica
o un alarma, sera estupendo
permitir al usuario crear e introducir una contrasea por su
cuenta. Por supuesto, la nueva
contrasea tiene que estar
guardada al apagar la fuente
de alimentacin. En tal caso
una solucin perfecta es el
microcontrolador con una
EEPROM embebida.

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

Club Saber Electrnica N 97

do varios botones sin parar - las horas, los das,


esto no sera nada prctico.
Por lo tanto, el microcontrolador aprendi un
truco durante su evolucin. En vez de seguir
comprobando algn pin o bit, el microconrolador
deja su trabajo de esperar a un experto que
reaccionar slo en caso de que suceda algo
digno de atencin.
La seal que informa al procesador central
acerca de tal acontecimiento se denomina
INTERRUPCIN.

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Pgina 17

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

direccionar la memoria. Se utiliza para transmitir


la direccin de la CPU a la memoria. El bus de
datos es tan ancho como los datos, en este caso
es de 8 bits o lneas de ancho. Se utiliza para
conectar todos los circuitos dentro del microcontrolador.
Figura 23

Consiste en varias unidades ms pequeas,


figura 23, de las que las ms importantes son:

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;

Unidad lgica aritmtica (Arithmetical


Logical Unit - ALU) realiza todas las operaciones
matemticas y lgicas sobre datos; y

Acumulador o registro de trabajo. Es un


registro SFR estrechamente relacionado con el
funcionamiento de la ALU. Es utilizado para
almacenar todos los datos sobre los que se
debe realizar alguna operacin (sumar, mover).
Tambin almacena los resultados preparados
para el procesamiento futuro. Uno de los registros SFR, denominado Registro Status (PSW),
est estrechamente relacionado con el acumulador. Muestra el estado de un nmero almacenado en el acumulador (el nmero es mayor o
menor que cero etc.) en cualquier instante dado.

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

La conexin paralela entre el


microcontrolador y los perifricos a travs de los puertos de
entrada/salida es una solucin
perfecta para las distancias
cortas hasta varios metros,
figura 24. No obstante, en otros casos cuando
es necesario establecer comunicacin entre dos
dispositivos a largas distancias no es posible utilizar la conexin paralela. En vez de eso, se utiliza la conexin en serie.
Figura 24

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:

Con cuntos dispositivos el microcontrolador tiene que intercambiar los datos?

Cul es la velocidad del intercambio de


datos obligatoria?

Captulo 1

17

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Pgina 18

El Mundo de los Microcontroladores

Cul es la distancia entre los dispositivos?

Es necesario transmitir y recibir los


datos simultneamente?
Una de las cosas ms importantes en cuanto
a la comunicacin en serie es el Protocolo que
debe ser estrictamente observado. Es un conjunto de reglas que se aplican obligatoriamente
para que los dispositivos puedan interpretar
correctamente los datos que intercambian
mutuamente. Afortunadamente, los microcontroladores se encargan de eso automticamente,
as que el trabajo de programador/usuario es
reducido a la escritura y lectura de datos.

velocIdad de transMIsIn serIal


La velocidad de transmisin serial (baud
rate) es el trmino utilizado para denotar el
nmero de bits transmitidos por segundo (bps).
Figura 25

entre ellos es corta (el receptor y el transmisor


estn normalmente en la misma placa de circuito impreso). La conexin se establece por medio
de dos lneas - una se utiliza para transmitir los
datos, mientras que la otra se utiliza para la sincronizacin (la seal de reloj).
Como se muestra en la figura 25, un dispositivo es siempre el principal (master - maestro), el
que realiza el direccionamiento de un chip
subordinado (slave - esclavo) antes de que se
inicie la comunicacin. De esta manera un
microcontrolador puede comunicarse con 112
dispositivos diferentes. La velocidad de transmisin serial es normalmente 100 kb/seg (el modo
estndar) o 10 Kb/seg (modo de velocidad de
transmisin baja).
Recientemente han aparecido los sistemas
con la velocidad de transmisin serial 3.4
Mb/sec. La distancia entre los dispositivos que
se comunican por el bus I2C est limitada a
unos metros.

Fjese que este trmino se refiere a bits, y


no a bytes!
El protocolo normalmente requiere que
cada byte se transmita
junto con varios bits de
control. Eso quiere decir que un byte en un flujo
de datos serial puede consistir en 11 bits. Por
ejemplo, si velocidad de transmisin serial es
300 bps un mximo de 37 y un mnimo de 27
bytes se pueden transmitir por segundo.
Los sistemas de comunicacin serial ms utilizados son:

I2c cIrcuIto Inter- Integrado


(Inter Integrated cIrcuIt)
Circuito inter-integrado es un sistema para el
intercambio de datos serial entre los microcontroladores y los circuitos integrados especializados de generacin. Se utiliza cuando la distancia

18

Club Saber Electrnica N 97

sPI - Bus serIal de InterFase de PerIFrIcos


(serIal PerIPHeral InterFace Bus)
Un bus serial de interfase de perifricos es
un sistema para la comunicacin serial que utiliza hasta cuatro lneas (normalmente solo son
necesarias tres) para recibir los datos, para
transmitir los datos, para sincronizar y (opcional)
para seleccionar el dispositivo con el que se
comunica, figura 26.
Esto es la conexin full duplex, lo que significa que los datos se envan y se reciben simultneamente.
La velocidad de transmisin mxima es
mayor que en el sistema de conexin I2C.

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Pgina 19

B aSES
Figura 26

uart transMIsor recePtor asIncrnIco


unIversal (unIversal asYncHronous
receIver/transMItter) - transMIsorEste tipo de conexin es asincrnica o asncrona, lo que significa que no se utiliza una lnea
especial para transmitir la seal de reloj. En
algunas aplicaciones este rasgo es crucial (por
ejemplo, en mandar datos a distancia por RF o
por luz infrarroja). Puesto que se utiliza slo una
lnea de comunicacin, tanto el receptor como el
transmisor reciben y envan los datos a velocidad misma que ha sido predefinida para mantener la sincronizacin necesaria. Esto es una
manera simple de transmitir datos puesto que
bsicamente representa una conversin de
datos de 8 bits de paralelo a serial. La velocidad
de transmisin no es alta, es hasta 1 Mbit/sec.

dE loS

M iCroCoNtroladorES

lador (figura 27) permiten el funcionamiento


armnico y sncrono de
todos los circuitos del
microcontrolador.
El oscilador se configura
normalmente de tal
manera que utilice un
cristal de cuarzo o resonador cermico para
estabilizacin de frecuencia. Adems, puede
funcionar como un circuito autnomo (como
oscilador RC). Es importante decir que las instrucciones del programa no se ejecutan a la
velocidad impuesta por el mismo oscilador sino
varias veces ms despacio. Eso ocurre porque
cada instruccin se ejecuta en varios ciclos del
oscilador.
En algunos microcontroladores se necesita el
mismo nmero de ciclos para ejecutar todas las
instrucciones, mientras que en otros el tiempo
de ejecucin no es el mismo para todas las instrucciones.
Por consiguiente, si el sistema utiliza el cristal de cuarzo con una frecuencia de 20MHZ, el
tiempo de ejecucin de una instruccin de programa no es 50 nS, sino 200, 400 o 800 nS
dependiendo del tipo del microcontrolador.

oscIlador

cIrcuIto de alIMentacIn
Fuente de alIMenta cIn

Los pulsos uniformes generados por el osciFigura 27

Hay que mencionar dos cosas dignas de


atencin con relacin al circuito de la fuente
de alimentacin de microcontroladores:

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

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Pgina 20

El Mundo de los Microcontroladores


brown out reset. El circuito reinicia inmediatamente el microcontrolador si el voltaje de alimentacin cae por debajo del lmite.

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

Club Saber Electrnica N 97

La mayora de los programas utiliza estos


cronmetros electrnicos en miniatura.
Generalmente son registros SFR de 8 o 16 bits
cuyo contenido se aumenta automticamente
con cada pulso.
Una vez que se llena el registro, se genera
una interrupcin!
Si el temporizador utiliza el oscilador de cuarzo interno para su funcionamiento, es posible
medir el tiempo entre dos eventos (el valor de
registro en el momento de iniciar la medicin es
T1, en el momento de finalizar la medicin es
T2, el tiempo transcurrido es igual al resultado
de la resta T2 - T1).
Si los registros se aumentan con los pulsos
que vienen de la fuente externa, tal temporizador se convierte en un contador.
Esto es una explicacin simple de su funcionamiento. Es un poco ms complicado en prctica.

cMo FuncIonan los teMPorIzadores?


En la prctica los pulsos generados por el
oscilador de cuarzo son llevados al circuito una
vez por cada ciclo de mquina directamente o
por el pre-escalador, lo que aumenta el nmero
en el registro del temporizador.
Si una instruccin (un ciclo de mquina generalmente) dura cuatro perodos del oscilador de
cuarzo, este nmero ser cambiado un milln de
veces por segundo (cada microsegundo) al
incorporar al cuarzo que oscila con una frecuencia de 4MHz.
Es fcil de medir los intervalos de tiempo cortos de la manera descrita anteriormente (hasta
256 microsegundos porque es el mayor nmero
que un registro puede contener).
Esta obvia desventaja se puede superar de
varias maneras: al utilizar el oscilador ms lento,
por medio de registros con ms bits, del preescalador o de la interrupcin. Las primeras dos
soluciones tienen algunas debilidades as que
se recomienda utilizar el pre-escalador y/o la
interrupcin.

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Pgina 21

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

Si el temporizador y el temporizador perro


guardin comparten un pre-escalador, ste no
se puede utilizar por los dos simultneamente.

utIlIzando una InterruPcIn


FuncIonaMIento del teMPorIzador

dE loS

M iCroCoNtroladorES

mayor nmero que se puede escribir en l es


255 (en los registros de 16 bits es el nmero
65.535). Si se excede este nmero, el temporizador se reinicia automticamente y el conteo
comienza de nuevo en cero.
Esto es denominado desbordamiento o
sobreflujo (overflow). Permitido por el programa,
el desbordamiento puede provocar una interrupcin, lo que abre completamente nuevas posibilidades.
Por ejemplo, el estado de registros utilizados
para contar segundos, minutos o das puede ser
implementado en una rutina de interrupcin. El
proceso entero (excepto la rutina de interrupcin) se lleva a
cabo internamente,
lo que permite que
los circuitos principales del microcontrolador funcionen regularmente.
La figura 30 describe el uso de una
interrupcin en el
funcionamiento del
temporizador. Al asignarle un pre-escalador al
temporizador, se producen retrasos de duracin
arbitraria con mnima interferencia en la ejecucin del programa principal.

contadores

en el

Si el registro del temporizador es de 8 bits, el

Si un temporizador se suministra por los pulsos ingresados por el pin de entrada en el micro-

Fifura 30

Captulo 1

21

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Pgina 22

El Mundo de los Microcontroladores


controlador, se produce un contador. Evidentemente, es el
mismo circuito electrnico. La
nica diferencia es que los pulsos para contar se ingresan por
el pin de entrada y que su duracin (anchura) no es definida.
Por eso, no se pueden utilizar
para medicin de tiempo, sino
que se utilizan para otros propsitos, por ejemplo: contar los
productos en la cadena de montaje, nmero de rotaciones del
eje de un motor, pasajeros etc.
(dependiendo del sensor utilizado).

Figura 31

convertIdor dIgItal analgIco (d/a)


teMPorIzador Perro guardIn
WatcHdog
El perro guardin es un temporizador conectado a un oscilador RC completamente independiente dentro del microcontrolador.
Si el perro guardin est habilitado, cada vez
que cuenta hasta el mximo valor en el que ocurre el desbordamiento del registro se genera una
seal de reinicio del microcontrolador y la ejecucin de programa inicia en la primera instruccin.
El punto es evitar que eso ocurra al utilizar el
comando adecuado.
La idea se basa en el hecho de que cada programa se ejecuta en varios bucles, ms largos o
cortos.
Si las instrucciones que reinician el temporizador perro guardin se colocan en lugares
estratgicos del programa, aparte los comandos
que se ejecutan regularmente, el funcionamiento del perro guardin no afectar a la ejecucin
del programa, figura 31.
Si por cualquier razn (ruidos elctricos frecuentes en la industria) el contador de programa
se queda atrapado dentro de un bucle infinito,
el valor del registro continuar aumentado, el
temporizador perro guardin alcanzar el mximo valor, el registro se desbordar y, aleluya!
Ocurre el reinicio!

22

Club Saber Electrnica N 97

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

En la figura 32 podemos observar que entre 0


(0V) y 1 (5V) hay varios niveles de tensin
intermedios. Un convertidor analgico-digital es
un circuito electrnico encargado de convertir
las seales continuas en nmeros digitales discretos.
En otras palabras, este circuito convierte un
nmero real en un nmero binario y se lo enva
a la CPU para ser procesado. Este mdulo, figura 33, se utiliza para medir el voltaje en el pin de
entrada.
El resultado de esta medicin es un nmero
(el valor digital) utilizado y procesado ms tarde
en el programa.

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Pgina 23

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

Como todos los datos se intercambian por


medio de estas 8 lneas, este bus est sobrecargado, y la comunicacin por si misma es muy
lenta e ineficaz.
La CPU puede leer una instruccin o
leer/escribir datos de/en la memoria.
Los dos procesos no pueden ocurrir a la vez
puesto que las instrucciones y los datos utilizan

dE loS

M iCroCoNtroladorES

el mismo bus. Por ejemplo, si alguna


lnea de programa dice que el registro de la memoria RAM llamado
SUM debe ser aumentado por uno
(instruccin: incf SUMA), el microcontrolador har lo siguiente:
1. Leer la parte de la instruccin
de programa que especifica QU es
lo que debe realizar (en este caso es
la instruccin para incrementar incf)
2. Seguir leyendo la misma instruccin que especifica sobre CUL
dato lo debe realizar (en este caso es
el contenido del registro SUMA)
3. Despus de haber sido incrementado, el
contenido de este registro se debe escribir en el
registro del que fue ledo (direccin del registro
SUMA).
El mismo bus de datos se utiliza para todas
estas operaciones intermedias.
arquitectura Harvard
Los microcontroladores que utilizan esta
arquitectura disponen de dos buses de datos
diferentes, figura 35.

Figura 35

Uno es de 8 bits de ancho y conecta la CPU


con la memoria RAM. El otro consiste en varias
lneas (12, 14 o 16) y conecta a la CPU y la
memoria ROM. Por consiguiente, la CPU puede
leer las instrucciones y realizar el acceso a la
memoria de datos a la vez.
Puesto que todos los registros de la memoria
RAM son de 8 bits de ancho, todos los datos

Captulo 1

23

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Pgina 24

El Mundo de los Microcontroladores


dentro del microcontrolador que se intercambian
son de la misma anchura. Durante el proceso de
la escritura de programa, slo se manejan los
datos de 8 bits.
En otras palabras, todo lo que usted podr
cambiar en el programa y a lo que podr afectar
ser de 8 bits de ancho. Todos los programas
escritos para estos microcontroladores sern
almacenados en la memoria ROM interna del
microcontrolador despus de haber sido compilados a cdigo mquina.
No obstante, estas localidades de memoria
ROM no tienen 8, sino 12, 14 o 16 bits. 4, 6 o 8
bits adicionales representan una instruccin que
especifica a la CPU qu hacer con los datos de
8 bits.
Las ventajas de este diseo son las siguientes:

Todos los datos en el programa son de


un byte (8 bits) de ancho. Como un bus de datos
utilizado para lectura de programa tiene unas
lneas ms (12, 14 o 16), tanto la instruccin
como el dato se pueden leer simultneamente al
utilizar estos bits adicionales. Por eso, todas las
instrucciones se ejecutan en un ciclo salvo las
instrucciones de salto que son de dos ciclos.

El hecho de que un programa (la ROM)


y los datos temporales (la RAM) estn separados, permite a la CPU poder ejecutar dos instrucciones simultneamente. Dicho de manera
sencilla, mientras que se realiza la lectura o
escritura de la RAM (que marca el fin de una instruccin), la siguiente instruccin se lee por
medio de otro bus.

En los microcontroladores que utilizan la


arquitectura de von-Neumann, nunca se sabe
cunta memoria ocupar algn programa.
Generalmente, la mayora de las instrucciones
de programa ocupan dos localidades de memoria (una contiene informacin sobre QU se
debe realizar, mientras que la otra contiene
informacin sobre CUL dato se debe realizar).
Sin embargo, esto no es una frmula rgida, sino
el caso ms frecuente. En los microcontroladores que utilizan una arquitectura Harvard, el bus
de la palabra de programa es ms ancho que un
byte, lo que permite que cada palabra de pro-

24

Club Saber Electrnica N 97

grama est compuesto por una instruccin y un


dato. En otras palabras, una localidad de memoria - una instruccin de programa.

Juego de InstruccIones
El nombre colectivo de todas las instrucciones que puede entender el microcontrolador es
llamado Juego de Instrucciones, figura 36.

Figura 36

Cuando se escribe un programa en ensamblador, en realidad se especifican instrucciones en


el orden en el que deben ser ejecutadas. La restriccin principal es el nmero de instrucciones
disponibles. Los fabricantes aceptan cualquiera
de los dos enfoques descritos a continuacin:
rIsc (reduced Instruction set computer)
- computadora con Juego de Instrucciones
reducidas
En este caso la idea es que el microcontrolador reconoce y ejecuta slo operaciones bsicas
(sumar, restar, copiar etc.) Las operaciones ms
complicadas se realizan al combinar stas (por
ejemplo, multiplicacin se lleva a cabo al realizar
adicin sucesiva).
Es como intentar explicarle a alguien con
pocas palabras cmo llegar al aeropuerto en
una nueva ciudad. Sin embargo, no todo es tan
oscuro. Adems, el microcontrolador es muy
rpido as que no es posible ver todas las acrobacias aritmticas que realiza.
El usuario slo puede ver el resultado final de
todas las operaciones. Por ltimo, no es tan dif-

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Pgina 25

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.

cMo se deBe elegIr


MIcrocontrolador?

un

Si usted es principiante y ha tomado decisin


de trabajar con los microcontroladores. felicitaciones por la eleccin! No obstante, a primera
vista, no es fcil la eleccin del microcontrolador
ms adecuado como parece a la primera vista.
El problema no es el pequeo rango de dispositivos a elegir, sino todo lo contrario!
Antes de empezar a disear un dispositivo
basado en un microcontrolador, tome en cuenta

dE loS

M iCroCoNtroladorES

lo siguiente: cuntas entradas/lneas son necesarias para su funcionamiento, realizara el dispositivo


otras
operaciones
adems
encender/apagar un rel, necesita algn modulo
especializado tal como el de comunicacin en
serie, convertidor A/D etc. Cuando usted tiene
una clara imagen de lo que quiere, el rango de
seleccin se reduce considerablemente, y le
queda pensar en el precio. Va a tener varios
dispositivos? Varios cientos? Un milln? De
todos modos ahora es ms claro.
Si est pensando en todas estas cosas por
primera vez, todo le parecer un poco confuso.
Por esa razn, vaya paso a paso. Antes que
nada, seleccione al fabricante, es decir, la familia de microcontroladores que ofrece. Luego,
aprenda a trabajar con un modelo particular.
Slo aprenda lo que necesite aprender, no entre
demasiado en detalles. Resuelva el problema
especfico y le pasar una cosa increble - ser
capaz de manejar cualquier modelo del mismo
fabricante...
Ms o menos, todo se parece a montar en
bicicleta: despus de varias cadas inevitables en
el principio, ser capaz de mantener el equilibrio
y montar en cualquier otra bicicleta. Por supuesto, nunca se olvida tanto de montar en bicicleta,
como de la destreza de programacin! J

Captulo 1

25

Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Pgina 26

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 27

Captulo 2

eL mundo de LoS microcontroLadoreS

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

ancho. Cada palabra se interpreta por la CPU


como una instruccin 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
ms fcil trabajar con el sistema de numeracin
hexadecimal, el cdigo ejecutable se representa
con frecuencia como una serie de los nmeros

Captulo 2

27

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 28

El Mundo de los Microcontroladores


hexadecimales denominada cdigo 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 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.

Ventajas de Los Lenguajes


de Programacin de aLto niVeL
A pesar de la gran cantidad de beneficios, el

Figura 1

28

Club Saber Electrnica N 97

lenguaje ensamblador tiene algunas desventajas a saber:


* Incluso una sola operacin en el programa
escrito en ensamblador consiste en muchas instrucciones, hacindolo muy largo y difcil 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
En la figura 2 podemos observar un programa escrito en C y el mismo programa compilado
al cdigo ensamblador.
Los lenguajes de programacin de alto nivel
(Basic, Pascal, C etc.) fueron creados con el
propsito de superar las desventajas del ensamblador.
En lenguajes de programacin de alto nivel
varias instrucciones en ensamblador se sustituyen por una sentencia. El programador ya no
tiene que conocer el conjunto de instrucciones o
caractersticas del hardware del microcontrolador utilizado. Ya no es posible conocer exactamente cmo se ejecuta cada sentencia, de
todas formas ya no importa. Aunque siempre se
puede insertar en el programa una secuencia
escrita en ensamblador.

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 29

S iStEmaS

dE

P rogramaCiN : L ENguajE

mikro C

Figura 2

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 instruccin apropiada para multiplicar
dos nmeros.
Por supuesto, para cada problema hay una
solucin y ste no es una excepcin gracias a la
aritmtica que permite realizar las operaciones
complejas al descomponerlas en un gran nmero operaciones ms simples. En este caso, la
multiplicacin se puede sustituir con facilidad
por adicin 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 programacin de alto nivel
como es C, porque el compilador encontrar
automticamente la solucin a ste problema y
otros similares. Para multiplicar los nmeros a y
b, basta con escribir a*b axb.

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

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 30

El Mundo de los Microcontroladores

Figura 3

La figura 3 es un ejemplo general de lo que


sucede durante la compilacin de programa de

un lenguaje de programacin de alto nivel a bajo


nivel.

caracterSticaS deL Lenguaje mikroc


A continuacin vamos a presentar a los elementos principales del lenguaje mikroC
desarrollado por Mikroelektronika.
Este lenguaje es muy similar al C estndar, no obstante en determinados aspectos difiere del
ANSI estndar en algunas caractersticas, figura 4. Algunas de estas diferencias se refieren a las
mejoras, destinadas a facilitar la programacin de los microcontroladores PIC, mientras que las
dems son la consecuencia de la limitacin de la arquitectura del hardware de los PIC. Aqu vamos
a presentar caractersticas especficas del lenguaje mikroC en la programacin de los microcontroladores PIC.
Figura 4

30

Club Saber Electrnica N 97

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 31

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.

estructura deL Programa


La idea principal de escribir un programa en C es de romper un problema mayor en varios trozos ms pequeos. Supongamos que es necesario escribir un programa para el microcontrolador
para medir la temperatura y visualizar los resultados en un LCD. El proceso de medicin se realiza
por un sensor que convierte temperatura en voltaje. El microcontrolador utiliza el convertidor A/D
para convertir este voltaje (valor analgico) en un nmero (valor digital) que luego se enva al LCD

Captulo 2

31

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 32

El Mundo de los Microcontroladores


por medio de varios conductores. En consecuencia, el programa se divide en cuatro partes, de las
que cada una corresponde a una accin especfica:
Activar y configurar el convertidor A/D incorporado;
Medir el valor analgico;
Calcular temperatura; y
Enviar los datos en el formato apropiado al LCD.
Los lenguajes de programacin de alto nivel
como es C le permiten solucionar este problema con facilidad al escribir cuatro funciones
que se ejecutarn cclicamente sin parar, tal
como se deduce de la figura 6.
La idea general es de dividir el problema en
varios trozos, de los que cada uno se puede
escribir como una sola funcin. Todos los programas escritos en mikroC contienen por lo
menos una funcin llamada main() que encierra entre llaves {} las sentencias a ser ejecutadas. Esto es la primera funcin a ser ejecutada
al iniciarse la ejecucin de programa. Las otras
funciones se pueden llamar dentro de la funcin main. En otras palabras, podemos decir
Figura 6
que la funcin main() es obligatoria, mientras
que las dems son opcionales. Si todava no ha escrito un programa en C, es probable que todo le
resulte confuso. No se preocupe, acptelo tal como es por el momento y ms tarde entender la
sintaxis.
Y ahora, haga su primer programa real!
La figura 7 muestra la estructura de un programa, sealando las partes en las que consiste.

Figura 7

32

Club Saber Electrnica N 97

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 33

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

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 34

El Mundo de los Microcontroladores


tiPos de datos en mikroc
En el lenguaje C, los datos tienen un tipo, o sea, cada dato utilizado en el programa debe tener
su tipo especificado. Esto permite al compilador conocer el tamao de dato (nmero de bytes requerido en la memoria) y su representacin. Hay varios tipos de datos que se pueden utilizar en el lenguaje de programacin mikroc dependiendo del tamao de dato y del rango de valores. La tabla 1
muestra el rango de valores que los datos pueden tener cuando se utilizan en su forma bsica.

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

tipo entero (int)


Un entero es un nmero sin parte fraccionaria que puede estar expresado en los siguientes formatos, a saber:
Hexadecimal (base 16): el nmero empieza con 0x (o 0X). Los enteros hexadecimales consisten en los dgitos (de 0 a 9) y/o las letras (A, B, C,D, E, F). Por ejemplo: 0x1A.
Decimal (base 10): el nmero consiste en los dgitos (de 0 a 9). El primer dgito no puede ser
0. En este formato, se puede introducir el signo de nmero (+ o -). Por ejemplo: 569, -25, +1500.
Octal (base 8): los nmeros se representan a base 8 utilizando slo 8 dgitos (de 0 a 7). Los
enteros octales empiezan con 0. Por ejemplo: 056.
Binario (base 2): cuando un entero empieza con 0b (o 0B) se representan como una serie de
bits (0 y 1). Por ejemplo: 0B10011111.
Vea a continuacin un juego de sentencias que pueden corresponder a una parte de un programa en la que se muestran los diferentes formatos:

34

Club Saber Electrnica N 97

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 35

S iStEmaS
0x11
11
-152
011
0b11

dE

P rogramaCiN : L ENguajE

mikro C

// formato hexadecimal equivale a decimal 17


// formato decimal
// formato decimal
// formato octal equivale a decimal 9
// formato binario equivale a decimal 3

tipo punto flotante (float)


El tipo punto flotante (float) se utiliza para los nmeros reales con el punto decimal. Los datos
de tipo float se pueden representar de varias maneras.
Un dato float es siempre con signo (signed):
0.
-1.23
23.45e6
2e-5
3E+10
.09E34

// = 0.0
// = -1.23
// = 23.45 * 10^6
// = 2.0 * 10^-5
// = 3.0 * 10^10
// = 0.09 * 10^34

tipo carcter (char)


El tipo char es considerado como un entero por el compilador. No obstante, se utiliza normalmente para los datos de tipo carcter. Un dato de tipo carcter est encerrado entre comillas y codificado en un carcter ASCII:
59
'p'

// 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;

// Variable a es de tipo int y equivale a 1000


// a equivale a 15

Captulo 2

35

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 36

El Mundo de los Microcontroladores


Una constante tiene las mismas caractersticas que una variable excepto el hecho de que su
valor asignado no puede ser cambiado durante la ejecucin de programa. A diferencia de las variables, las constantes se almacenan en la memoria Flash del microcontrolador para guardar el mayor
espacio posible de memoria RAM.
El compilador las reconoce por el nombre y el prefijo const. En mikroC, el compilador reconoce
automticamente el tipo de dato de una constante, as que no es necesario especificar el tipo adicionalmente.
/* dos lneas de programa consecutivas */
const A = 1000
A = 15;

// el valor de la constante A est definido


// ERROR! no se puede modificar el valor de la constante

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

Ejemplos de los identificadores vlidos e invlidos los puede ver a continuacin:

36

Club Saber Electrnica N 97

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 37

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;

// Declarar una variable llamada peso


// Asignar el valor 20 a la variable peso

Un mtodo ms rpido se le denomina declaracin con inicializacin (asignacin de los valores


iniciales):
unsigned int peso = 20;

// peso est declarado y su valor es 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

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 38

El Mundo de los Microcontroladores


En el ejemplo anterior, peso1 no se puede representar con un nmero con punto decimal o un
nmero con valor negativo.

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;

// Declarar constante MINIMUM


// Declarar constante MINIMUM

Las constantes pueden ser de cualquier tipo, incluyendo cadenas:


const T_MAX = 3.260E1;
const I_CLASS = A;
const Mensaje = Presione el botn IZQUIERDA;

// constante de punto flotante T_MAX


// constante carcter I_CLASS
// constante de cadena Mensaje

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};

// AGUA = 0; GASLEO = 1; CLORO = 2

Es posible introducir directamente el valor de una constante dentro de la lista de enumeraciones.


El incremento se detiene al asignar un valor a un elemento de matriz, despus se reinicia a partir
del valor asignado. Vea el siguiente ejemplo:
enum surtidores {AGUA,GASLEO=0,CLORO};

// AGUA = 0; GSOLEO = 0; CLORO = 1

Las constantes de enumeracin se utilizan de la siguiente manera:


int Velocidad_de_ascensor
enum motor_de_ascensor {PARADA,INICIO,NORMAL,MXIMO};
Velocidad_de_ascensor = NORMAL;
// Velocidad_de_ascensor = 2

definir los nuevos tipos de datos


La palabra clave typedef le permite crear con facilidad los nuevos tipos de datos, as, por ejemplo, podemos escribir la siguiente sentencia:
typedef unsigned int positivo;
positivo a,b;
a = 10;
b = 5;

38

Club Saber Electrnica N 97

// positivo es un sinnimo para el tipo sin signo int


// Variables a y b son de tipo positivo
// Variable a equivale a 10
// Variable b equivale a 5

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 39

S iStEmaS

dE

P rogramaCiN : L ENguajE

mikro C

mbito de VariabLes y constantes


Una variable o una constante es reconocida por el compilador en base de su identificador. Un
identificador tiene significado si el compilador lo puede reconocer. El mbito de una variable o una
constante es el rango de programa en el que su identificador tiene significado. El mbito es determinado por el lugar en el que se declara una variable o una constante. Intentar acceder a una variable o una constante fuera de su mbito resulta en un error. Una variable o una constante es invisible fuera de su mbito.
Todas las variables y constantes que pensamos utilizar en un programa deben ser declaradas
anteriormente en el cdigo. Las variables y constantes pueden ser globales o locales. Una variable
global se declara en el cdigo fuente, fuera de todas las funciones, mientras que una variable local
se declara dentro del cuerpo de la funcin o dentro de un bloque anidado en una funcin. Vea la
figura 9.

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

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 40

El Mundo de los Microcontroladores


cLases de aLmacenamiento
Las clases de almacenamiento se utilizan para definir el mbito y la vida de variables, constantes y funciones dentro de un programa. En mikroC se pueden utilizar diferentes clases de almacenamiento:
auto es una clase de almacenamiento por
defecto para las variables locales, as que se
utiliza raramente. Se utiliza para definir que
una variable local tiene duracin local. La
clase de almacenamiento auto no se puede
utilizar con variables globales, figura 10.

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();

// Variable cnt es visible en File_1


// Funcin hello()se puede utilizar en File_1

void main(){
PORTA = cnt++;
hello();
}

// Cualquier modificacin de cnt en File_1 ser visible en File_2


// Funcin hello()se puede llamar desde aqu

File 2:
int cnt = 0;
void hello();
void hello(){
.
.
}

// Modificaciones que afectan a la


// cnt en File_1 son visibles aqu

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

Club Saber Electrnica N 97

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 41

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

int a = 5; // Declarar e inicializar la variable a


a += 10; // a = a + 10 = 15

Captulo 2

41

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 42

El Mundo de los Microcontroladores


Se utilizan para simplificar la sintaxis y habilitar la ejecucin ms rpida. Debajo de la tabla se
puede observar un ejemplo de uso en lenguaje C.
operadores de incremento y decremento
Las operaciones de incremento y decremento por 1 se denotan con ++ y . Estos caracteres pueden preceder o seguir a una variable.
En primer caso (++x), la variable x ser incrementada por 1 antes de ser utilizada en la expresin. De lo contrario, la variable se utilizar en la expresin antes de ser aumentada por 1. Lo mismo
se aplica a la operacin de decremento, tabla 6.

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

Club Saber Electrnica N 97

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 43

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

operadores de manejo de bits


A diferencia de las operaciones lgicas que se realizan sobre los valores o expresiones, las operaciones de manejo de bits se realizan sobre los bits de un operando. Se enumeran en la tabla 9.

Tabla 9

cmo utilizar los operadores?


Aparte de los operadores de asignacin, dos operadores no deben estar escritos uno junto al
otro, por ejemplo:
x*%12;

// esta expresin generar un error

Cada operador tiene su prioridad y asociatividad como se muestra en la tabla 10.


Similar a las expresiones aritmticas, los operadores se agrupan juntos por medio de parntesis
como se puede observar a continuacin:
int a, b, res;
a = 10;
b = 100;
res = a*(a + b); // resultado = 1100
res = a*a + b; // resultado = 200
Primero se calculan las expresiones encerradas entre parntesis. Si es necesario, se pueden utilizar los parntesis mltiples (anidados).

Captulo 2

43

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 44

El Mundo de los Microcontroladores

Tabla 10

conVersin de tiPos de datos


Algunas operaciones implican conversin de datos. Por ejemplo, si divide dos valores enteros,
hay una alta posibilidad de que el resultado no sea un entero.
El mikroC realiza una conversin automtica cuando se requiera. Si dos operandos de tipo diferente se utilizan en una operacin aritmtica, el tipo de operando de la prioridad ms baja se convierte automticamente en el tipo de operando de la prioridad ms alta. Los tipos de datos principales se colocan segn el orden jerrquico mostrado en la figura 11.

La autoconversin se realiza asimismo en las operaciones de asignacin. El resultado de la


expresin de la derecha del operador de la asignacin siempre se convierte en el tipo de la variable de la izquierda del operador. Si el resultado es de tipo de la prioridad ms alta, se descarta o se
redondea para coincidir con el tipo de la variable. Al convertir un dato real en un entero, siempre se
descartan los nmeros que siguen al punto decimal:
int x;
x = 3;
x+ = 3.14;

// A la variable x se le asigna el tipo integer (un entero)


// A la variable x se le asigna el valor 3
// El valor 3.14 se agrega a la variable x al
// realizar la operacin de asignacin

/* El resultado de la adicin es 6 en vez de 6.14, como era de esperar.


Para obtener el resultado esperado sin descartar los nmeros que siguen al
punto decimal, se debe declarar x como un punto flotante. */

44

Club Saber Electrnica N 97

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 45

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

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 46

El Mundo de los Microcontroladores


if(expresin) {
...
...
...}
else
operacin2

//
// operacin1
//

El operador if-else se puede sustituir por el operador condicional ?::


(expresin1)? expresin2 : expresin3
Si el valor de la expresin1 es distinto de 0 (verdadero), el resultado de la expresin entera ser
equivalente al resultado obtenido de la expresin2. De lo contrario, si la expresin1 es 0 (falso), el
resultado de la expresin entera ser equivalente al resultado obtenido de la expresin3. Por ejemplo:
maximum = (a>b)? a : b

// A la variable maximum se le asigna el


// valor de la variable mayor(a o b)

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
...

// Selector es de tipo char o int

// El grupo de operadores que se ejecutan si


// el selector y la constante1 son equivalentes

break;
case constante2:
operacin2
...

// El grupo de operadores se ejecuta si


// el selector y la constante2 son equivalentes

break;
...
default:
operacin_esperada
...
break;

// El grupo de operadores que se ejecuta si


// ninguna constante equivale al selector

}
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

Club Saber Electrnica N 97

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 47

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){
...
...
}

// En vez de while(1), se puede escribir while(true)


// Expresiones encerradas entre llaves se ejecutarn
// repetidamente (bucle infinito)

Captulo 2

47

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 48

El Mundo de los Microcontroladores


bucle For
El bucle for se parece a lo siguiente:
for(expresin_inicial; expresin_de_condicin; cambiar_expresin) {
operaciones
...
}
La ejecucin de esta secuencia de programa es similar al bucle while, salvo que en este caso el
proceso de especificar el valor inicial (inicializacin) se realice en la declaracin. La expresin_ inicial especifica la variable inicial del bucle, que ms tarde se compara con la expresin_ de_condicin antes de entrar al bucle. Las operaciones dentro del bucle se ejecutan repetidamente y despus de cada iteracin el valor de la expresin_inicial se incrementa de acuerdo con la regla cambiar_expresin. La iteracin contina hasta que la expresin_de_condicin llegue a ser falsa.
for(k=0; k<5; k++)
operacin
...

// La variable k se incrementa 5 veces (de 1 a 4) y


// cada vez se repite la expresin operacin

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;

// Inicializacin del contador

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

Club Saber Electrnica N 97

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 49

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

// Inicializacin, condicin, incremento


// Visualizar hello en el LCD
// Retardo de 1000 ms
// Borrar el LCD
// Retardo de 500ms
// Inicializacin del contador

do {
Lcd_Out(1,3,hello);
Delay_ms(1000);
Lcd_Cmd(_LCD_CLEAR);
Delay_ms(500);
i++;
}
while (i<10);

// Visualizar hello en el LCD


// Retardo de 1000 ms
// Borrar LCD
// Retardo de 500ms
// Contador se incrementa
// Condicin

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);

// saltar x=7 para evitar divisin por 0

Captulo 2

49

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 50

El Mundo de los Microcontroladores


Delay_ms(1000);
x++;
continue;

// Despus de esta lnea, saltar a la sentencia while con x=8

}
a = 1/(x-7);

// Esta divisin generar un error si x=7

/* Muchas operaciones pueden ocurrir aqu */


Lcd_Out(1,3,Division is OK);
Delay_ms(1000);
x++;

// Poner este mensaje en el LCD

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

tiPos de datos aVanzados

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

Club Saber Electrnica N 97

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 51

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

int display [3];


const DGITOS = 5;
char Matriz_nueva[DGITOS];

// Declaracin de la matriz Matriz_nueva


// capaz de contener 5 enteros

Una matriz se puede inicializar a la vez que se


declara, o ms tarde en el programa. En ambos
casos, este paso se realiza al utilizar llaves:
int array_1[3] = {10,1,100};
Para leer o modificar un elemento de matriz del ejemplo anterior, basta con introducir su ndice
encerrado entre corchetes:
/* Se supone que a ha sido declarado anteriormente como un entero */
a = array_1[0];

// A la variable a se le asigna el valor del miembro de matriz

// con ndice 0 (a = 10)


array_1[2] = 20;

// Miembro de matriz array_1[2] es modificado (nuevo valor es 20)

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

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 52

El Mundo de los Microcontroladores


En esta parte vamos a describir slo las matrices bidimensionales, tambin denominadas tablas
o matrices. Una matriz bidimensional se declara al especificar el tipo de dato de matriz, el nombre
de matriz y el tamao de cada dimensin.
tipo_de_matriz nombre_de_matriz [nmero_de_filas] [nmero_de_columnas];
En la declaracin de esta matriz nmero_de_filas y nmero_de_columnas representan el nmero de filas y columnas en las que consiste una tabla, respectivamente. Vea la siguiente matriz bidimensional:
int Tabla [3][4]; // Tabla se define de modo que tenga 3 filas y 4 columnas
Esta matriz se puede representar en la forma de una tabla:
______________________________________________
tabla[0][0] tabla[0][1]
tabla[0][2]
tabla[0][3]
tabla[1][0] tabla[1][1]
tabla[1][2]
tabla[1][3]
tabla[2][0] tabla[2][1]
tabla[2][2]
tabla[2][3]

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 (*).

&n es la direccin de la localidad de memoria n.


*(&n) es el contenido de la direccin (&n), o sea de n.
Para declarar un puntero, se debe que especificar el tipo de la variable apuntada:
tipo_de_variable *puntero;

52

Club Saber Electrnica N 97

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 53

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;

// v contiene la direccin de voltio[0]


// voltio[1] = 2
// tab[2] = 1 (tab[0] + 1)
// voltio[2] = 2
// v contiene la direccin de voltio[1]
// voltio[1] = 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

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 54

El Mundo de los Microcontroladores


struct nombre_de_estructura {
tipo1_de_miembro1 miembro1;
tipo2_de_miembro2 miembro2;
tipo3_de_miembro3 miembro3;
..
};
No es posible inicializar variables dentro de la declaracin de la estructura de datos:
struct generador {
int voltaje;
char corriente;
};
Entonces, podr definir los objetos denominados turbina en el cdigo. A cada uno de estos tres
objetos (turbinas) se le asignan las variables corriente y voltaje.
struct generadores turbina_1, turbina_2, turbina_3;
Para acceder a las variables, es preciso utilizar el operador .
turbina_3.voltaje = 150;
turbina_3.corriente = 12;
Por supuesto, igual que al utilizar los punteros, todava se le permite realizar operaciones por
medio de operadores y sentencias definidos en las partes anteriores.
Si est familiarizado con el lenguaje C, recuerde que mikroC no admite la inicializacin de los
miembros de estructura por medio de las llaves. Por ejemplo, conjunto_1 ={15,m}; devuelve un
error en mikroC.

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

Club Saber Electrnica N 97

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 55

S iStEmaS

dE

P rogramaCiN : L ENguajE

mikro C

void main (void) {


/* el primer void significa que main no devuelve ningn valor. El segundo
void significa que no recibe ningn valor. Note que el compilador
tambin admite la siguiente sintaxis: main() o void main() o
main(void) */
..
/* - Introduzca su programa aqu - */
.
};
Esto significa que f es una funcin que recibe un nmero real x como parmetro y devuelve 2*xy. La misma funcin en C se parece a lo siguiente:
float f (float x, float y)
{
float r;
r = 2*x - y;
return r;
}

// variables flotantes x y y se pueden utilizar en f


// declarar r para almacenar el resultado
// almacenar el resultado del clculo en r
// devolver el valor de r

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

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 56

El Mundo de los Microcontroladores


Valor devuelto
Una funcin puede devolver un valor (esto no es obligatorio) por medio de la palabra clave
return. Al llegar a return, la funcin evala un valor (puede ser una expresin) y lo devuelve a la lnea
de programa desde la que fue llamada.
return r;
return (2*x - y);

// Devolver el valor contenido en r


// Devolver el valor de la expresin 2*x-y

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;

// Esta funcin debe devolver una matriz r


// cuyo contenido est en orden inverso con
// respecto a la matriz tab
// Declaracin de una nueva matriz denominada r
// Bucle que copia el contenido de tab en r
// al invertir el orden
// Devolver el valor 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

Club Saber Electrnica N 97

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 57

S iStEmaS
cnt ++;
Delay_ms(a) ;
}

dE

P rogramaCiN : L ENguajE

mikro C

// Incremento de una variable global cnt


// Ejecucin de la funcin Delay_ms
// Note que Delay_ms no devuelve nada

declarar Prototipos de Funciones


Para utilizar una funcin, el compilador debe ser consciente de su presencia en el programa. En
la programacin en C, los programadores normalmente primero escriben la funcin main() y luego
las funciones adicionales. Para avisar al compilador de la presencia de las funciones adicionales,
se requiere declarar los prototipos de funciones en el principio de programa antes de la funcin
main(). Un prototipo de funcin est compuesto por:
tipo de resultado
nombre de funcin
tipos de parmetros
un punto y coma (;)
El prototipo de la funcin main no necesita ser declarado.
float f (float, float);
/* no es obligatorio escribir los nombres de los parmetros. Este prototipo
informa al compilador: en el programa se utilizar la funcin f,
que utiliza dos parmetros de tipo float y devuelve el resultado del tipo
float. */
Llamar a una Funcin
Mientras una funcin es definida y su prototipo declarado, se puede utilizar en cualquier parte de
programa. Sin embargo, como la funcin main es raiz del programa, no puede ser llamada de ninguna parte de programa. Para ejecutar una funcin, es necesario escribir su nombre y los parmetros asociados. Vea los siguientes ejemplos:
float resultado,a,b;
int time = 100;
a = 10.54;
b = 5.2;
resultado = f(a,b);
pausa_1(tiempo);
funcinX();

// resultado,a,b,time deben coincidir con los tipos


// definidos
// en la declaracin de las funciones f y wait_1

// Ejecutar la funcin f por medio de los parmetros a y b


// El valor devuelto se le asigna a la variable resultado
// Ejecutar la funcin pausa_1 por medio de la variable tiempo
// Ejecutar la funcin funcinX (sin parmetros)

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

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 58

El Mundo de los Microcontroladores


El primer mtodo, denominado paso por valor, es el ms fcil. En este caso, los parmetros se
pueden considerar como variables locales de la funcin. Cuando se llama una funcin, el valor de
cada parmetro se copia a un nuevo espacio de memoria reservado durante la ejecucin de la funcin. Como los parmetros se consideran como variables locales por el compilador, sus valores
pueden ser modificados dentro de la funcin, pero sus modificaciones no se quedan en la memoria
una vez completada la ejecucin de la funcin.
Tenga en cuenta de que la funcin devuelve un valor, y no una variable. Adems, se crean copias
de los valores de los parmetros, por lo que sus nombres en la funcin f pueden ser diferentes de
los parmetros utilizados en la main(). La mayor desventaja del paso por el valor es que la nica
interaccin que una funcin tiene con el resto del programa es el valor devuelto de un solo resultado (o la modificacin de las variables globales).
El otro mtodo, denominado paso por direccin le permite sobrepasar este problema. En vez de
enviar el valor de una variable al llamar a funcin, se debe enviar la direccin de memoria del valor.
Entonces, la funcin llamada ser capaz de modificar el contenido de esta localidad de memoria.
// Funcin sortordena los miembros de la matriz por valor ascendente
// y devuelve el miembro con mximo valor
int sort(int *);
const SIZE = 5;

// 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)

if(sequence [i] > sequence[i+1]){


temp = sequence [i];
sequence[i] = sequence[i+1];
sequence[i+1] = temp;
permut = 1;
// Se ha hecho una permutacin, bandera de bit
//se pone a uno
}
}
}
return sequence[SIZE-1];
}

58

// Devolver el valor del ltimo miembro


// que es al mismo tiempo el miembro con el mximo valor

Club Saber Electrnica N 97

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 59

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*);

// Declaracin de prototipo de la funcin Mtodo_1


// Declaracin de prototipo de la funcin Mtodo_2

const NMERO_DE_MEDICIONES = 7;

// Nmero de los miembros de la matriz

void main()
{
double promedio1, promedio2;

// Declaracin de las variables promedio1


// y promedio2
int voltaje [NMERO_DE_MEDICIONES] = {7,8,3,5,6,1,9};
// Declaracin de la
// matriz voltaje
promedio1 = mtodo_1(&voltaje[0]);
// Parmetro de la funcin es la direccin
// del primer miembro
promedio2 = mtodo_2(voltaje);
// Parmetro de la funcin es la direccin de
// la matriz

}
//
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];

// Clculo del valor promedio de voltaje


// Es posible utilizar *(voltaje+i)en vez de 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);

// Clculo del valor promedio de voltaje


// Es posible utilizar voltaje[i] en vez de *(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

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 60

El Mundo de los Microcontroladores


caractersticas PrinciPaLes deL Procesador
El preprocesador es un programa que procesa el cdigo antes de que pase por el compilador.
Funciona bajo el control de las lneas de comando del preprocesador denominadas directivas. Las
directivas del preprocesador se colocan en el cdigo fuente, normalmente en el principio del archivo.
Antes de pasar por el compilador, el cdigo fuente se examina por el preprocesador que detecta y ejecuta todas las directivas del preprocesador. Las directivas del preprocesador siguen a una regla de la
sintaxis especial, empiezan por un smbolo # y no requieren ningn punto y coma al final (;).
directivas del Procesador
La tabla 11 contiene un conjunto de directivas del preprocesador frecuentemente utilizadas:
Tabla 11

Las directivas del preprocesador se pueden dividir en tres categoras:


* Definiciones de macro
* Inclusiones de archivos
* Control de compilacin
Ahora, vamos a presentar slo las directivas del preprocesador utilizadas con ms frecuencia.
Sin embargo, no es necesario saber todas ellas para programar microcontroladores. Slo tenga en
cuenta que el preprocesador es una herramienta muy poderosa para los programadores avanzados
en C, especialmente para el control de compilacin.
directivas del Procesador para definir marcos
Por medio de los macros es posible definir las constantes y ejecutar funciones bsicas. Una sustitucin de macro es un proceso en el que un identificador del programa se sustituye por una cadena predefinida. El preprocesador sustituye cada ocurrencia del identificador en el cdigo fuente por
una cadena. Despus de la sustitucin, el cdigo ser compilado normalmente.
Esto significa que el cdigo sustituido debe respetar la sintaxis del mikroC. La accin se realiza
por medio de la directiva #define.
#define PI 3.14159

// Sustitucin simple, PI ser sustituido por


// el valor 3.14159 en todas las partes del programa

Tambin puede utilizar los parmetros para realizar substituciones ms complejas:


#define VOLUMEN (D,H) (((D/2)*(D/2)*PI))*H

60

Club Saber Electrnica N 97

// Macro con parmetros

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 61

S iStEmaS

dE

P rogramaCiN : L ENguajE

mikro C

Entonces, en el cdigo, la siguiente sentencia:


Tanque_1 = VOLUMEN (Dimetro,altura);
Ser sustituida por:
Tanque_1 = (((Dimetro/2)*(Dimetro/2)*PI)*altura;
Por medio de la directiva #undef es posible quitar una definicin de nombre de macro. As se
especifica que la substitucin que se ha definido anteriormente ya no va ocurrir en el siguiente cdigo. Esto es til cuando usted quiere restringir la definicin slo a una parte particular del programa.
#undef TANQUE

// Quitar la definicin del macro VOLUMEN

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

// Se especifica slo el nombre del archivo


// Se especifica la localidad exacta del archivo

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

Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Pgina 62

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 63

Captulo 3

eL Mundo de Los MicrocontroLadores

Los MicrocontroLadores Pic


Los circuitos integrados programables (Programmable Integrated Circuits = PIC) son
componentes sumamente tiles en la Electrnica de Consumo. Aun cuando son
conocidos desde hace ms de veinte aos, existen en la actualidad nuevos tipos que
cumplen con una serie de requisitos y caractersticas sumamente tiles. Como una
primera aproximacin podemos definir a un PIC como un chip que permite obtener
un circuito integrado a mi medida, es decir, puedo hacer que el PIC se comporte
como un procesador de luminancia, un temporizador o cualquier otro sistema
mediante un programa que le grabo en una memoria ROM interna. Los microcontroladores PIC son, en el fondo, procesadores similares a otros tipos, como por ejemplo
la familia de los microprocesadores X86, 80486, Pentium y muchos otros pero con
capacidades limitadas. En este captulo veremos en qu consiste un PIC y cules son
los tipos ms comunes, lo que nos permitir abordar el tema de su programacin, lo
cual se desarrollar en el prximo tomo de la coleccin Club Saber Electrnica.
IntroduccIn
En realidad, un microprocesador y un microcontrolador no son la misma cosa. Los PICs son
microcontroladores, es decir, una unidad que
posee en su interior al microprocesador y a los

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

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 64

El Mundo de los Microcontroladores


puertos y todos los dems perifricos son exteriores. La programacin de un microprocesador
es, por lo tanto, una tarea compleja porque deben controlarse todos estos dispositivos externos.
Un microcontrolador integra la CPU y todos
los perifricos en un mismo chip. El programador se desentiende de una gran cantidad de dispositivos y se concentra en el programa de trabajo. Esta circunstancia da lugar a una gran prdida de tiempo porque los datos tienen que ser
retirados de la memoria y llevados a la CPU
(Central Processor Unit) y viceversa. Esto significa que la computadora dedica la mayor parte
del tiempo al transporte de datos de ida o de
vuelta, en lugar de usar este tiempo para trabajar sobre los datos.
Los PICs emplean un conjunto de instrucciones del tipo RISC (Reduced Instruction Set
Computer). Con el RISC se suele ejecutar la mayora de las instrucciones con un solo pulso del
clock. Con las instrucciones que se usan en
otros equipos del tipo CISC (Complex Instruction
Set Computer), se logran instrucciones ms poderosas, pero a costa de varios ciclos del clock.
En el bien conocido procesador 68HC11 de Motorola se requieren, a veces, hasta 5 ciclos del
clock para ejecutar una instruccin.
A los fines prcticos, nos vamos a referir a los
microcontroladores como bloques que poseen
una memoria de programa, que es el lugar donde deben alojarse los datos que le indiquen al
chip qu es lo que debe hacer; una memoria de
datos donde ingresen las seales que debe procesar el programa, una unidad aritmtica y lgica donde se desarrollen todas las tareas, una
unidad de control que se encargue de supervisar
todos los procesos y puertos de entrada y salida
para que el PIC tenga contacto con el exterior
(figura 1).
Un microcontrolador, como cualquier circuito
integrado analgico, tiene entradas, salidas y algunos componentes exteriores necesarios para
procesar las seales de entrada y convertirlas
en las seales de salida (figura 2). El 16C54
(con memoria tipo OTP) y su similar 16F84 (con
memoria EEPROM tipo flash) requieren un cristal con dos capacitores y como mnimo un resis-

64

Club Saber Electrnica N 97

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

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 65

LoS M iCroCoNtroLadorES PiC


Tambin aclaramos que en el prximo tomo
de la coleccin Club Saber Electrnica
analizaremos a un PIC de mejores caractersticas como el PIC 16F887.
Ahora bien, la mayora de los microcontroladores (sean de Microchip, o de National, Motorola, Philips, etc.) se comportan de forma similar,
por ello nos vamos a referir a los microcontroladores PIC16F84 cuya arquitectura interna puede observarse en la figura 3.
Observe primero los bloques externos. Existe un cristal que se conecta en OSC1 y OSC2
para generar el CLOCK del sistema. Luego una
seal de entrada llamada MCLR negada, que es
un nombre de fantasa para nuestro conocido
RESET (debido a que esa pata tiene un doble
uso) y, por ltimo, dos puertos paralelos de I/O
(entrada o salida) llamados puerto A y puerto B.
Una de las patas del puerto A puede ser utilizada como entrada de interrupciones (esta pata
especial hace que el microprocesador deje de
realizar la tarea que estaba ejecutando y pase a

realizar otra tarea alternativa; cuando la termina


vuelve a su programa original).
Analicemos el bloque ms grande (temporizadores), en ste observamos un grupo de bloques dedicados a mejorar el funcionamiento pero sin influir directamente en el flujo de seales.
Vemos un temporizador de encendido, un temporizador de arranque del oscilador de CLOCK,
un circuito de reset y un circuito llamado de vigilancia o WATCHDOG. Los dos primeros bloques
procuran un arranque ordenado para no producir una carga al mismo tiempo sobre la fuente.
Por ltimo, existe un circuito con un nombre curioso: perro guardin. Su funcin es estar vigilante el mximo de tiempo que tarda el microprocesador en completar su programa (o mejor sera decir, la derivacin ms larga de su programa) y en caso de superarse ese tiempo, provocar un reset automtico porque el microprocesador se qued trabado en alguna parte de su programa. Tambin se dice que el microprocesador
se qued colgado o congelado.
Este bloque de circuitos no trabaja indepen-

Figura 3

Captulo 3

65

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 66

El Mundo de los Microcontroladores


dientemente sino que requiere conexiones al exterior y al interior del dispositivo. Por ejemplo, no
siempre son utilizados y es el programa quien
determina su utilizacin y adems ajusta sus parmetros. Esto se realiza a travs del bloque de
control o decodificador de instrucciones.
Analicemos ahora la seccin de arriba a la izquierda en donde observamos la memoria de
programa, el contador de programa, el registro
de instrucciones y la pila o STACK de 8 niveles.
Cuando hablamos de registros nos referimos a
pequeas unidades de memoria transitoria,
construida por lo general, con un registro de
desplazamiento. Son memorias voltiles que se
utilizan para guardar informacin por un tiempo
mnimo, con el fin de realizar una operacin
compleja de varios pasos.
El contador de programa es el responsable
de que el microprocesador vaya analizando las
instrucciones en orden ascendente. Este guarda
el nmero de instruccin en el STACK y la instruccin misma la pasa al registro de instrucciones desde donde se enva al resto del microprocesador. El STACK es, en realidad, una pila de
registros (en nuestro ejemplo hay 8), debido a
que el programa puede tener derivaciones (en la
jerga LOOPS, rulos o subprogramas). Cuando
se termina de ejecutar un loop se debe volver al
mismo punto del programa en donde se haba
producido la bifurcacin y eso es posible porque
ese nmero de instruccin qued guardado en
uno de los registros de la pila. Es comn que un
loop tenga, a su vez, un loop secundario y cuando se ejecuta ese loop secundario se debe volver al mismo punto del loop primario, eso se
consigue con guardar ese nmero de instruccin
del loop secundario en otro registro de la pila.
Analicemos ahora la seccin inferior derecha. En ese sector se ubican los bloques responsables de efectuar operaciones matemticas
y lgicas binarias; recordemos que el nombre
ALU proviene de Aritmetic Logic Unite (unidad
arimtica y lgica). En este sector es imprescindible utilizar un registro ya que una operacin
aritmtica o lgica siempre se efecta entre dos
nmeros. Los nmeros binarios que deben procesarse se toman de la memoria de datos, el primero se acumula en el registro de trabajo o re-

66

Club Saber Electrnica N 97

gistro W (de Work = trabajo) el segundo es el


presente en el instante en que se invoca la memoria de datos. Como las operaciones pueden
ser encadenadas (cuando el resultado sirve como operando de la siguiente operacin, tal como
el caso de un producto) el registro W tiene un retorno a la ALU. Vemos adems que la ALU est
comandada por el bloque MUX (MUltipleXador).
En efecto, la ALU requiere que se le enven nmeros para procesar que le lleguen desde la
memoria de datos, pero antes se la debe predisponer para que efecte la operacin requerida
(comparacin, rotacin de dgitos, etc.).
El registro de estado o estatus colabora durante las operaciones matemticas. Piense cmo opera Ud. para realizar una resta: primero
ubica el primer nmero, luego el segundo y despus comienza a analizar los bits menos significativos (las unidades), pero si el nmero de arriba es menor que el nmero de abajo, entonces
toma prestado de la columna de las decenas,
luego debe recordar esto porque el nmero de
arriba en la columna de las decenas se redujo
en una unidad. En realidad, aunque se trate de
una operacin entre dos nmeros su ejecucin
requiere guardar lo que se llama acarreo en otro
registro y ste no es otra cosa ms que el registro STATUS.
El PIC16F84 contiene adems de todo lo visto, una memoria RAM de registros que puede
ser llamada desde el registro de instruccin a
travs de un multiplexador de direcciones. Esta
seccin slo se utiliza en desarrollos avanzados.
Ahora bien, un microcontrolador sin programa
no sabe hacer nada, es como un nio recin nacido; tiene algunos reflejos condicionados como
el de succin que le permite alimentarse pero no
sabe hacer ms que eso. Nosotros deberemos
ensearle a realizar acciones y lo vamos a hacer
como a un beb, paso a paso. Su capacidad de
aprendizaje es enorme y sumamente variada.
Le vamos a ensear a llorar a intervalos regulares, a encender luces, a sumar, a restar, etc.
Ensearle significa programarlo y eso se realiza con una plaqueta de programacin que depende de cada marca y modelo de microcontrolador. Antiguamente los microprocesadores tenan una ventanita transparente y era necesario

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 67

LoS M iCroCoNtroLadorES PiC


Figura 4

exponerlos a la luz ultravioleta para borrar su


memoria e introducir un programa nuevo. Actualmente cuentan con memorias que no tienen
este requisito. Basta con cargarlos con un programa para que se borre el anterior. Esto significa que, con el mismo integrado, podremos construir diferentes dispositivos que realicen funciones totalmente distintas unas de otras.

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

conectar el PIC al programador;


luego de que el PIC coloca estos
datos en la plaqueta del dispositivo,
slo pueden ser ledos, ya que entonces forman el programa del PIC.
Esta memoria (figura 4) tiene una
longitud de 1 Kbyte con palabras de
14 bits. Digamos que tiene un ancho de 14 bits y una altura de 1.000
Bytes o que es una memoria de
1.000 x 14. Observe que los nmeros de instruccin en hexadecimal van desde el 000 al
3FF, lo cual implica que existen 1.040 posiciones
de memoria, valor obtenido empleando la frmula:
3 x 162+16 x 161+16 x 160
Observe que dos de las posiciones de memoria tienen las indicaciones vector de reset y
vector de interrupcin.
Eso significa que, cuando se provoca un reset, el microprocesador vuelve a la posicin 000
del programa y cuando se produce una interrupcin, a la posicin 004. Estos retornos forzados
deben ser considerados al disear el programa
del microprocesador; es decir que el reset se
produce porque la seal externa pone el contador de programa en 000 y todo el programa se
reinicia. En cambio, cuando ingresa una seal
por la pata de interrupcin el contador de programa va a 004 y la accin que, en general ocurre,
es que se comienza a leer un subprograma particular. Cuando este
subprograma termina,
Figura 5 el contador de programa recupera el nmero
que tena en el momento de arribar la interrupcin.

La MeMorIa de datos
La RAM (Random Access Memory = memoria de acceso aleatorio,
figura 5) es una memo-

Captulo 3

67

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 68

El Mundo de los Microcontroladores


Figura 6

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.

Los Puertos deL PIc


El PIC16C84 tiene dos puertos paralelos de
entrada o salida: el puerto A de 8 patas y el B
de 5 patas. Cada pata puede ser predispuesta
por el programa para operar como de entrada o
de salida.
Cada pata tiene un resistor de pull-up (resistor conectado a fuente) interno que puede ser
desconectado mediante el programa. Estos resistores se desconectan automticamente si
una pata se predispone como pata de salida debido a que las salidas ya tienen posibilidad de
entregar corriente desde fuente con un transistor. Todos los resistores de pull-up se conectan
o desconectan al mismo tiempo (no existe un
comando que los conecte independientemen-

68

Club Saber Electrnica N 97

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

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 69

LoS M iCroCoNtroLadorES PiC


Para circuitos que requieran una gran
precisin se puede trabajar con un cristal
de frecuencia baja, media o alta (figura
10). Como mximo el PIC16F84 puede
trabajar con un cristal de 10MHz. Internamente la frecuencia del cristal se divide por 4, por lo tanto, es muy comn la
utilizacin de un cristal de 4MHz para obtener un CLOCK interno de 1MHz que
garantiza que cada instruccin dure
exactamente 1mS. Para temporizadores
de perodo largo se utilizan cristales de
baja frecuencia.

Figura 8

de arranque de un temporizador/contador (figura 8). Cuando se programa como entrada esta


pata funciona como un disparador de SCHMITT
o Schmitt trigger, ideal para reconocer seales
distorsionadas o con crecimiento lento. Esta
misma pata tambin tiene una caracterstica distinta cuando opera como salida. Ella es la nica
que trabaja a colector abierto, es decir, que no
puede emplearse como fuente, en este caso
siempre se utilizar un resistor externo.

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

Los PICs poseen un


oscilador configurable por programa de
caractersticas muy
amplias. Cuando no
se requiere mucha
precisin se puede
trabajar con un oscilador a RC conectado segn la figura 9.

uso de un resistor de 10k entre la pata 4 y


fuente tal como se muestra en la figura 11.
En muchos circuitos es necesario realizar un
reset manual y para ello existen dos posibilidades, una es utilizar slo el temporizador interno
(por programa) y la otra es agregar una constante de tiempo exterior como se muestra en la figura 12. En el segundo circuito C1 provee un retardo al encendido o posterior al pulsado de reset porque C1 se cargar lentamente a travs de
R1 con una constante de tiempo de 22k x
10F = 220mS.

Captulo 3

69

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 70

El Mundo de los Microcontroladores


El resistor R3 limita la corriente de descarga
de C1 a valores compatibles con sus caractersticas de corriente de pico mxima.
D1 descarga a C1 cuando la tensin de fuente decae para permitir un reset inmediato cuando la fuente se apaga y se enciende en rpida
sucesin. R2 limita la corriente de reset, tomada
desde el microprocesador. Este segundo sistema se suele utilizar cuando se requiere un reseteado remoto a travs de varios metros de cable
que podran captar zumbido (C1 reduce la impedancia del circuito de reset).

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).

El PIC16F84 posee en su interior un microprocesador, una memoria RAM (voltil) donde


guardaremos las variables, una memoria EEPROM (no voltil) donde guardaremos nuestro
programa, un timer o contador que nos facilitar
algunas tareas, y otros bloques de control y apoyo. Algunas caractersticas ms representativas
del PIC16F84 son:
Opera a una frecuencia mxima de
10MHz (excepto el PIC16F84A que puede operar a 20MHz).
1kbyte de memoria EEPROM para
nuestro programa (1024 posiciones).
68 bytes (de 8 bits) de memoria RAM
64 bytes de memoria EEPROM para datos (no voltiles)
Programable con slo 35 instrucciones
Posee 13 pines de entrada/salida (un
puerto de 8 bits + otro de 5 bits)
Tiene un timer/contador de 8 bits
Tambin posee una serie de registros y temporizadores, cuyo estudio no realizaremos en
esta obra.

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

Club Saber Electrnica N 97

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

El esquema de la figura 1 corresponde al


programador de microcontroladores PIC
por puerto USB, su diseo es simple y sen-

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 71

LoS M iCroCoNtroLadorES PiC

Figura 1

cillo. Lo podemos dividir en tres bloques


fundamentales bien definidos, tal como
muestra la figura 2.
Bloque 1: Microcontrolador
El primero y ms importante est constituido por el microcontrolador 18F2550
(IC2), es el encargado de la comunicacin
por el puerto USB con la PC por intermedio

Figura 2

de la interfaz de programacin, establece la


transferencia de datos con los microcontroladores soportados y activa las tensiones
de VDD y VPP, figura 3.
Los pines 15 y 16 (RC4 - RC5) del puerto C del PIC conectan con la ficha correspondiente para la transmisin y recepcin
de los datos va USB.
Los pines 2 y 3 (RA0 - RA1) del puerto A
se destinan como interfaz
de comunicacin del protocolo ICSP entre el programador y los microcontroladores soportados por ste,
a travs del conector ICSP
(terminales 1 y 2, figura 1).
Los datos por el pin 2 son
bidireccionales, sincronizados por una seal de reloj
con salida por el pin 3.

Captulo 3

71

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 72

El Mundo de los Microcontroladores

Figura 3

Los pines 23, 24 y 25 (RB2 - RB3 - RB4)


del puerto B los utilizamos para el control
de la tensin VPP de programacin. Segn
el estado de estas salidas obtenemos diferentes tensiones en la salida VPP del
conector ICSP (terminal 3, figura 1).
El pin 26 (RB5) del PIC lo utilizamos
como una salida para controlar los estados
de la tensin VDD.
Continuamos con los pines 11, 12 y 13
(RC0 - RC1 - RC2) del puerto C, son utilizados como salidas para los LEDs de
visualizacin del funcionamiento del programador.
Comenzando con el LED denominado
"VDD", este se encender con el suministro
de esta tensin.
Tenemos tres estados posibles, segn la

72

Club Saber Electrnica N 97

configuracin establecida desde la interfaz


de usuario en la PC:
A- Slo se suministra tensin VDD a
los microcontroladores soportados durante
los procesos de lectura, grabacin, verificacin y borrado.
B- Suministro de tensin constante,
para poder alimentar a los circuitos durante
las pruebas (slo circuitos con bajo consumo).
C- No se suministra tensin VDD hacia
los microcontroladores soportados, una
fuente externa debe proveer la alimentacin.
El LED denominado VPP, se enciende
durante el suministro de dicha tensin

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 73

LoS M iCroCoNtroLadorES PiC


durante todos los procesos. Desde la interfaz de programacin en la PC podemos
configurar el suministro de esta tensin de
dos formas:
A- Slo se suministra tensin VPP a
los microcontroladores soportados durante
todos los procesos.
B- Suministro de tensin MCLR postprocesos, para "arrancar" al microcontrolador sin tener que desconectar la ficha ICSP.
Por ltimo el LED denominado USB, se
enciende cuando se establece la comunicacin con el puerto USB y es reconocido
el programador. Volviendo sobre el PIC
18F2550, ste debe ser grabado en un
principio para su funcionamiento.
El programa para este microcontrolador
podemos dividirlo en dos partes: un programa residente en un bloque de memoria del
PIC, comnmente llamado bootloader,
encargado de "chequear" la existencia del
firmware correspondiente al conectar el
programador al puerto USB.
En caso de no encontrarse, el LED
denominado USB comenzar una secuencia de encendido en forma intermitente. En
caso contrario, el firmware tomar el control
y el LED quedar encendido en forma continua.
La gran ventaja de utilizar este sistema
se debe a que slo una vez debemos programar el microcontrolador 18F2550, en lo
sucesivo los cambios y actualizaciones del
firmware se podrn realizar directamente

desde la interfaz de usuario en la PC. Para


finalizar este bloque, el pin 17 (RC6) del
puerto C, lo utilizamos para generar una
seal que, junto con el buzzer BZ1 emite
unos "beeps" cada vez que pulsamos los
botones de comando para lectura, grabacin, verificacin y borrado desde la interfaz
de programacin. Es opcional su implementacin y puede ser activado o desactivado desde la misma interfaz.
Bloque 2: conversor dc - dc
En un comienzo me plante qu diseo
usar para el conversor de tensin, si implementarlo de forma totalmente independiente o utilizar el PIC para esta tarea generando un PWM por software, ms los componentes externos necesarios. Me decid por
la primera opcin por varios motivos: el circuito integrado utilizado MC34093, figura 4,
es un conversor especializado para esta
funcin, de muy bajo costo, ampliamente
difundido, que figura en las listas de componentes de casi todos los comercios de
electrnica. Es autnomo, no depende del
firmware grabado en el 18F2550, quiero
decir con esto que podemos chequear su
funcionamiento y la tensin de salida del
conversor (en las pruebas) sin necesidad
de tener el PIC en la placa del programador
ya que no depende de ste. Adems nos
permite, si fuera necesario, regular la tensin de salida con slo variar el valor de
una resistencia: R3 o R4.
El valor del choque L1 no es crtico,
puede estar comprendido entre 220H y
680H sin ningn tipo de
inconveniente.
Figura 4
El circuito se alimenta con 5
volt suministrados por el puerto
USB y a la salida de TP2 obtenemos una tensin continua de
aproximadamente 14V a 14.5V
necesarios para alimentar el
bloque 3 de la figura 2.
Las resistencias R3, R4 junto
con R5 forman un divisor resistivo conectado al pin 5 del

Captulo 3

73

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 74

El Mundo de los Microcontroladores


MC34093, este lazo de realimentacin
estabiliza la tensin de salida ya que es
comparada con una tensin de referencia interna, como podemos observar en
la figura 5. En la salida del integrado pin
1, obtenemos una onda variable en
ancho de pulso (PWM) en relacin al
consumo exigido luego de la rectificacin, lgicamente dentro de unos lmites. Los estados de conmutacin On-Off
en el pin 1 del MC34093 junto con L1
producen la elevacin de la tensin, el
diodo D1 y los capacitares C3, C4 se
encargan de la rectificacin. El capacitor
C2 establece la frecuencia del oscilador
interno.
Bloque 3: tensiones VPP y Vdd
Podra haber utilizado un solo transistor
para tratar la tensin de programacin VPP,
pero estaramos bastante limitados. La idea
era tener una salida Vpp nica y ms flexible, que proporcionara la tensin normal de
programacin, la opcin de una tensin
MCLR post programacin y por ltimo que
ya estuviera pensada para los microcontroladores que trabajan con 3.3 volt que sern
incorporados en el futuro. Esto lo poda
obtener utilizando un amplificador operacional, precisamente el CA3140 con entradas
MOSFET y salida bipolar, que trabaja bien
con alimentacin de simple va, pero lo ms
importante en cuanto a la eleccin es que
est preparado para obtener una tensin
de salida diferente independientemente a la
tensin suministrada sobre el pin 7.
Con un diodo Zener sobre el pin 8
(STROBE) se consigue de forma simple y
prctica modificar el valor de la tensin de
salida por el pin 6. En la figura 7 podemos
ver la informacin que brinda el fabricante
del CA3140 para adaptar la salida a niveles
compatibles TTL independientemente de la
tensin V+ en el pin 7.
En el programador he adaptado el circuito para manejar las tensiones de 3.3 volt
para esta gama de PICs que se irn incorporando en prximas actualizaciones.

74

Club Saber Electrnica N 97

Figura 5

Figura 6

Figura 7

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 75

LoS M iCroCoNtroLadorES PiC


Listado de Materiales
IC1 = MC34063
IC2 = PIC 18F2550
IC3 = CA 3140
Q1 = BC327
Q2 = BC547
Vpp, Vdd, Usb = LEDs de 3 mm
D1 = 1N4148
R1 = 0.22 a 0.47 Ohm
R2 = 180 Ohm
R3 = R4 = 12k
R5 = 2.2k
R6, R7 - R8 = 33 Ohm
R9, R10, R11= 10k
R12 = 33k
R13, R14, R15, R21, R22 = 4.7k
R16, R17, R18 = 470 Ohm

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

C1, C4 = 100F x 16V, electroltico


C2 = 390pF, cermico
C3, C5 = 0,1F, cermico
C6 = 10F x 16V, electroltico
C7, C8 = 15pF, cermico
C9 = 0,47F, cermico
C10 = 1nF, cermico
C11 = 1F x 16V, electroltico
L1 = choque de 330H a 680H
Xtal = cristal de 20MHz
Bz1 = (opcional) buzzer sin oscilador interno
F1 = Fusible de 250mA, requiere puente o portafusible
Varios:
Placa de circuito impreso, gabinete para montaje, conector USB, conector ICSP, cables,
estao, etc.

niveles detectados por las entradas del


CA3140 la salida de ste conmutar entre
un estado prximo a masa (0.3 volt) y Vpp,
al finalizar proveer una tensin adecuada
al caso, si se eligi la opcin "suministrar
MCLR" desde la interfaz de programacin.
Todas las seales para la activacin de las
tensiones estn sincronizadas desde el
firmware del microcontrolador Pic.
Las resistencias R9 y R10 conectadas a
masa evitan que queden al "aire" las entradas del operacional en caso que el microcontrolador 18F2550 no est presente en
su zcalo, de lo contrario tendramos un
estado de indeterminacin a la salida. El
capacitor C10 limita la banda pasante del
operacional, es obligatorio junto con R11 y
R12.
El pin 7 del CA3140 recibe la tensin de
alimentacin para su funcionamiento, proporcionada por el conversor Dc-Dc. El pin 4
se conecta a masa.
La tensin mxima en la salida del operacional pin 6 es aproximadamente 2 volts
menor a la tensin de alimentacin sobre el
pin 7 (en caso que no se encuentre activado Q2, Z1).
Para finalizar la descripcin y resumiendo, el terminal 3 del conector ICSP (figura
1) puede manejar cuatro estados de VPP:

Captulo 3

75

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 76

El Mundo de los Microcontroladores


1- Una tensin prxima a masa (0.3
volt).
2- Una tensin Vpp de aproximadamente 12.30 - 13 volt.
3- Una tensin post programacin
MCLR.
4- Una tensin Vpp baja de 3.3 volt.
Por ltimo el transistor Q1 se encarga
del manejo de la tensin Vdd, se encuentra
conectado con la salida RB5 del microcontrolador. Un nivel alto en la base de Q1 lo
mantiene bloqueado y un nivel bajo lo coloca en estado de conduccin con salida por
colector; el emisor de dicho transistor se
conecta a +5 volt suministrados por el puerto USB.
extensin 3.3 Volt Vdd2
Opcionalmente podemos anexar una
lnea auxiliar de 3.3 volt en el conector
ICSP (ya est
contemplado en
Figura 8
el circuito general de la figura 1).
Con
un
simple circuito (figura 8) obtenemos una
tensin de
salida de
3.3 volts en
el emisor
de Q3, con las mismas caractersticas de control que VDD. La entrada
de tensin se produce por el colector
de Q3, conectado a VDD, colector de
Q2.
En la figura 9 se puede ver la imagen de la placa de circuito impreso
con su mscara de componentes.
Desde la pgina del autor puede descargar tanto la interfaz grfica para
programacin (figura 10) como el
firmware para el PIC del programador. La versin 2.1 de dicho firmware
soporta los siguientes componentes:

76

Club Saber Electrnica N 97

PIC18F67J93 PIC18F87J93 PIC18F67J90


PIC18F87J90 PIC18F67J50 PIC18F87J72
PIC18F67J11 PIC18F87J50 PIC18F67J10
PIC18F87J11 PIC18F66J93 PIC18F87J10
PIC18F66J90 PIC18F86J93 PIC18F66J55
PIC18F86J90 PIC18F66J50 PIC18F86J72
PIC18F66J16 PIC18F86J55 PIC18F66J15
PIC18F86J50 PIC18F66J11 PIC18F86J16
PIC18F66J10 PIC18F86J15 PIC18F65J90
PIC18F86J11 PIC18F65J50 PIC18F86J10
PIC18F65J15 PIC18F85J90 PIC18F65J11
PIC18F85J50 PIC18F65J10 PIC18F85J15
PIC18F64J90 PIC18F85J11 PIC18F64J11
PIC18F85J10 PIC18F63J90 PIC18F84J90
PIC18F63J11 PIC18F84J11 PIC18F83J90
PIC18F83J11 PIC18F66J60 PIC18F66J65
PIC18F67J60 PIC18F86J60 PIC18F86J65
PIC18F87J60 PIC18F96J60 PIC18F96J65
PIC18F97J60 PIC18F24J10 PIC18LF24J10
PIC18F25J10 PIC18LF25J10 PIC18F44J10
PIC18LF44J10 PIC18F45J10 PIC18LF45J10
PIC18F24J11 PIC18LF24J11 PIC18F25J11
PIC18LF25J11 PIC18F26J11 PIC18LF26J11
PIC18F44J11 PIC18LF44J11 PIC18F45J11
PIC18LF45J11 PIC18F46J11 PIC18LF46J11

Figura 9

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 77

LoS M iCroCoNtroLadorES PiC


Figura 10

PIC18F26J13 PIC18LF26J13 PIC18F27J13


PIC18LF27J13 PIC18F46J13 PIC18LF46J13
PIC18F47J13 PIC18LF47J13 PIC18F24J50
PIC18LF24J50 PIC18F25J50 PIC18LF25J50
PIC18F26J50 PIC18LF26J50 PIC18F44J50
PIC18LF44J50 PIC18F45J50 PIC18LF45J50
PIC18F46J50 PIC18LF46J50 PIC18F26J53
PIC18LF26J53 PIC18F27J53 PIC18LF27J53
PIC18F46J53 PIC18LF46J53 PIC18F47J53

eL PrograMador Quark Pro 2


Para cargar un programa en un microcontrolador PIC se requiere de una serie de
parmetros bsicos a saber:
VDD = Voltaje de alimentacin de 5V
VSS = Referencia de tierra del circuito
VPP = Voltaje de programacin de 14V
PGD = Datos de programacin
PGC = Pulsos de reloj para la sincronizacin

El primer cargador desarrollado por


nuestro equipo y publicado en Saber
Electrnica en 1998, utilizaba el puerto
paralelo de una computadora, precisaba
una fuente externa y estaba basado en un
circuito de David Tate. Posteriormente
desarrollamos varios cargadores usando el
puerto serie con y sin fuente de alimentacin, muchos de ellos basados en un diseo denominado JDM y que emplean como
interfaz grfica al programa IC-Prog. El programador ms completo lo hemos denominado Quark Pro 2 y se public en Saber
Electrnica N 200. Aqu una breve descripcin.
En la figura 11 se muestra el circuito
elctrico del programador QUARK-PRO 2.
Como puede observar no existe ninguna
fuente de alimentacin externa. El circuito
se alimenta del puerto serial de la PC a travs del conector DB9. El voltaje de alimentacin VDD se obtiene de los mismos pulsos de reloj (pin 7 del DB9), los cuales son

Captulo 3

77

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 78

El Mundo de los Microcontroladores

Figura 11
Figura 12

78

Club Saber Electrnica N 97

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 79

LoS M iCroCoNtroLadorES PiC

Figura 13

rectificados por los diodos D3 y D4 y estabilizado a 5 volt mediante el diodo zener D5


(5.1V) y el capacitor C1. De la misma
manera, se obtiene el voltaje de programacin VPP, cargando el capacitor C2 y estabilizando con el diodo zener D6 (8.2V) el
cual se suma al voltaje del zener D5 (5,1V),
obtenindose as 13.3 Volt suficientes para
realizar la programacin del PIC. Se han
adicionado el LED L1 para visualizar el proceso de grabacin o lectura del PIC, as
como el LED L2 para indicar que el circuito
se encuentra alimentado, adems, si se
colocara un PIC en corto, este LED se apagar o bajar significativamente su intensidad. En la figura 12 se muestra el circuito
impreso sugerido para nuestro prototipo.
Por qu utilizar el programa IC-PROG?
Con el mismo criterio que seleccionamos el hardware (programador JDM),
seleccionamos el software (IC-PROG),

basados en el que fuera ms compatible. El


IC-PROG ofrece varias ventajas: La primera es que dentro de su men ofrece opciones importantes como la posibilidad de
seleccionar el puerto a utilizar, as como el
prototipo de programador a utilizar; la
segunda es que el programa ofrece un
ambiente de trabajo muy amigable, ya que
este programa y gracias a las aportaciones
de muchos colaboradores de todo el
mundo, est traducido a varios idiomas y
tercero es que es compatible con la mayora de los sistemas operativos de la PC,
adems que con frecuencia estn disponibles de manera gratuita versiones actualizadas (vase www.ic-prog.com). En la figura 13 se muestra el ambiente de trabajo de
este programa.
Si usted ha trabajado con ambientes de
programas diferentes, podr observar que
el ambiente del IC-Prog dispone de herramientas de trabajo muy completas. J

Captulo 3

79

Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Pgina 80

3 de forros.qxd:club 05/03/13 16:31 Pgina 3Fo1

4 de forros.qxd:Club 05/03/13 16:33 Pgina 4Fo1

También podría gustarte