You are on page 1of 85

SIGUENOS EN:

LIBROS UNIVERISTARIOS Y SOLUCIONARIOS DE


MUCHOS DE ESTOS LIBROS GRATIS EN
DESCARGA DIRECTA

VISITANOS PARA DESARGALOS GRATIS.


Portada club 97.qxd:Maquetación 1 05/04/13 14:38 Página 1

http://librosysolucionarios.net
2ª de forros.qxd:club 05/03/13 16:29 Página 2ªFo1

http://librosysolucionarios.net
suma edi Club 97.qxd:*Cap 4 - telefonia 05/04/13 14:55 Página 1

B ases de los M iCroControladores

Editorial
Director

Del Editor al Lector


Ing. Horacio D. Vallejo
Producción
José María Nieves (Grupo Quark SRL)

autor: La colección Club Saber Electrónica fue pensada como una obra de 12 tomos de edición
Varios (ver Editorial)
mensual en la que se tratarán los temas más significativos de la electrónica. Rápidamente com-
Selección y Coordinación: prendimos que esta serie estaba llenando un vacío en la información y por ello decidimos conti-
Ing. Horacio Daniel Vallejo nuarla. Ya llevamos más de 8 años (97 tomos de colección) y pensamos que su vida aún está en
Editorial QUarK S.r.l. pañales.
En diversos tomos nos hemos referido a los microcontroladores pero hasta la fecha poco
Propietaria de los derechos en castellano de la publica- hemos hablado de lenguajes de programación de alto nivel, es por ello que este libro y la siguien-
ción mensual SabEr ElEctrónica - San Ricardo te edición tratará este tema de una forma sencilla y con gran contenido práctico.
2072 (1273) - Capital Federal - Buenos Aires -
Argentina - T.E. 4301-8804 Un microcontrolador es un circuito integrado o chip que incluye en su interior las tres uni-
administración y Negocios dades funcionales de una computadora: CPU, Memoria y Unidades de E/S, es decir, se trata de
Teresa C. Jara (Grupo Quark SRL) una computadora completa en un solo circuito integrado.
Patricia Rivero Rivero (SISA SA de CV)
Margarita Rivero Rivero (SISA SA de CV) Son diseñados para disminuir el costo económico y el consumo de energía de un sistema en
particular. Por eso el tamaño de la CPU, la cantidad de memoria y los periféricos incluidos depen-
Staff derán de la aplicación. El control de un electrodoméstico sencillo como una batidora, utilizará un
Liliana Teresa Vallejo
Mariela Vallejo procesador muy pequeño (4 u 8 bit) por que sustituirá a un autómata pequeño; en cambio un
Diego Vallejo reproductor de música y/o vídeo digital (mp3 o mp4) requerirá de un procesador de 32 bit o de 64
Luis Alberto Castro Regalado (SISA SA de CV) bit y de uno o mas códec de señal digital (audio y/o vídeo). El control de un sistema de frenos
José Luis Paredes Flores (SISA SA de CV) ABS (Antilock Brake System) se basa normalmente en un microcontrolador de 16 bit, al igual que
Sistemas: Paula Mariana Vidal el sistema de control electrónico del motor en un automóvil.
red y Computadoras: Raúl Romero Los microcontroladores representan la inmensa mayoría de los chips de computadoras ven-
Video y animaciones: Fernando Fernández didos, un 50% son controladores "simples" y el resto corresponde a procesadores más especiali-
legales: Fernando Flores
Contaduría: Fernando Ducach zados. Un microcontrolador difiere de una CPU normal, en que es más fácil convertirlo en una
Técnica y Desarrollo de Prototipos: computadora en funcionamiento, con un mínimo de chips externos de apoyo.
Alfredo Armando Flores Un microcontrolador típico tendrá un generador de reloj integrado y una pequeña cantidad
atención al Cliente
de memoria RAM y ROM/EPROM/EEPROM/FLASH, significando que para hacerlo funcionar,
Alejandro Vallejo todo lo que se necesita son unos pocos programas de control y un cristal de sincronización. Los
ateclien@webelectronica.com.ar microcontroladores disponen generalmente también de una gran variedad de dispositivos de
entrada/salida, como convertidores de analógico a digital, temporizadores, UARTs y buses de
Internet: www.webelectronica.com.mx
interfaz serie especializados, como I2C y CAN. Frecuentemente, estos dispositivos integrados
Publicidad: pueden ser controlados por instrucciones de procesadores especializados. Los modernos micro-
Rafael Morales controladores frecuentemente incluyen un lenguaje de programación integrado, como el BASIC
rafamorales@webelectronica.com.ar
que se utiliza bastante con este propósito.
Club Se: Esperamos que esta breve introducción le sirva como “disparador” para estudiar el conteni-
grupo Quark Srl do en la espera del próximo texto.
luisleguizamon@webelectronica.com.ar
¡Hasta el mes próximo!
editorial Quark Srl
San Ricardo 2072 (1273) - Capital Federal
www.webelectronica.com.ar
Sobre loS 2 CDS y Su DeSCarga
La Editorial no se responsabiliza por el contenido de
las notas firmadas. Todos los productos o marcas Ud. podrá descargar de nuestra web 2 CDs: “Microcontroladores vol. 1 y 2”
que se mencionan son a los efectos de prestar un con gran cantidad de circuitos para armar y sistemas para experimentar. Todos los
servicio al lector, y no entrañan responsabilidad de
nuestra parte. Está prohibida la reproducción total o
CDs son productos multimedia completos con un costo de mercado equivalente a 8
parcial del material contenido en esta revista, así co- dólares americanos cada uno y Ud. los puede descargar GRATIS con su número de
mo la industrialización y/o comercialización de los serie por ser comprador de este libro. Para realizar la descarga deberá ingresar a
aparatos o ideas que aparecen en los mencionados
textos, bajo pena de sanciones legales, salvo me- nuestra web: www.webelectronica.com.mx, tendrá que hacer clic en el ícono pass-
diante autorización por escrito de la Editorial. word e ingresar la clave “MICro97”. Tenga este texto cerca suyo ya que se le hará
Impresión: Talleres Babieca - México una pregunta aleatoria sobre el contenido para que pueda iniciar la descarga.

Capítulo 1 1
http://librosysolucionarios.net
suma edi Club 97.qxd:*Cap 4 - telefonia 05/04/13 14:55 Página 2

El Mundo de los Microcontroladores

EL MunDo DE Los MicrocontroLaDorEs

suMario
Capítulo 1 Juego de Instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . .24
los sistemas de NumeraCióN . . . . . . . . . . . . . . . .3 ¿Cómo se Debe Elegir un Microcontrolador? . . . . . . . . . . .25
Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
Qué Pueden Hacer los Microcontroladores . . . . . . . . . . . . .4 Capítulo 2
Números, Números, Números... . . . . . . . . . . . . . . . . . . . . . .6 sistemas de programaCióN:
Sistema de Numeración Binario . . . . . . . . . . . . . . . . . . . . . .6 leNguaje mikroC . . . . . . . . . . . . . . . . . . . . . . . .27
Sistema de Numeración Exadecimal . . . . . . . . . . . . . . . . . .7 Lenguajes de Programación . . . . . . . . . . . . . . . . . . . . . . . .27
Conversión de Sistemas de Numeración . . . . . . . . . . . . . . .8 Lenguaje Ensamblador . . . . . . . . . . . . . . . . . . . . . . . . . . . .28
Conversión de Números Binarios a Decimales . . . . . . . . . .8 Ventajas de los Lenguajes de Programación
Conversión de Números Hexadecimales a Decimales . . . . .9 de Alto Nivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28
Conversión de Números Hexadecimales a Binarios . . . . . . .9 Lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29
Marcar los Números . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 Características de el Lenguaje mikroC . . . . . . . . . . . . . . . .30
Números Negativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 Fases de la Compilación . . . . . . . . . . . . . . . . . . . . . . . . . . .31
BIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 Estructura del Programa . . . . . . . . . . . . . . . . . . . . . . . . . . .31
BYTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33
Detalles Importantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 Tipos de Datos en mikroC . . . . . . . . . . . . . . . . . . . . . . . . . .34
Componentes Básicos de la Lógica Digital . . . . . . . . . . . . .11 Variables y Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . .35
Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12 Ámbito de Variables y Constantes . . . . . . . . . . . . . . . . . . .39
Puertos de Entrada / Salida (E/S) . . . . . . . . . . . . . . . . . . . .13
Clases de Almacenamiento . . . . . . . . . . . . . . . . . . . . . . . . .40
Unidad de Memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40
Interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
Conversión de Tipos de Datos . . . . . . . . . . . . . . . . . . . . . .44
Unidad Central de Procesamiento
Estructuras de Control . . . . . . . . . . . . . . . . . . . . . . . . . . . .45
(CENTRAL PROCESSOR UNIT - CPU) . . . . . . . . . . . . . . .17
Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47
Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17
Sentencias de Salto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49
Comunicación en Serie . . . . . . . . . . . . . . . . . . . . . . . . . . . .17
Tipos de Datos Avanzados . . . . . . . . . . . . . . . . . . . . . . . . .50
Velocidad de Transmisión Serial . . . . . . . . . . . . . . . . . . . . .18
Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54
I2C Circuito Inter- Integrado
(INTER INTEGRATED CIRCUIT) . . . . . . . . . . . . . . . . . . .18
SPI - Bus Serial de Interfaz de Periféricos Capítulo 3
(SERIAL PERIPHERAL INTERFACE BUS . . . . . . . . . . . . .18 los miCroCoNtroladores piC . . . . . . . . . . . . . .63
Oscilador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63
Circuito de Alimentación . Fuente de Alimentación . . . . . . .19 La Memoria de Programa . . . . . . . . . . . . . . . . . . . . . . . . . .67
Temporizadores – Contadores . . . . . . . . . . . . . . . . . . . . . .20 La Memoria de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . .67
¿Cómo Funcionan los Temporizadores? . . . . . . . . . . . . . .20 Los Puertos del PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .68
Utilizando un Preescalador en el El Clock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .69
Funcionamiento del Temporizador . . . . . . . . . . . . . . . . . . .21 El Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .69
Utilizando una Interrupción en el Primeras Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . .70
Funcionamiento del Temporizador . . . . . . . . . . . . . . . . . . .21 GPIC USB: Programador de Microcontroladores
Contadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21 PIC y Memorias Eeprom por Puerto USB . . . . . . . . . . . . .70
Temporizador Perro Guardián. WATCHDOG . . . . . . . . . . .22 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70
Convertidor Digital – Analógico (D/A) . . . . . . . . . . . . . . . . .22 Descripción del Circuito Electrónico . . . . . . . . . . . . . . . . . .70
Arquitectura Interna de un Microcontrolador . . . . . . . . . . . .23 El Programador Quark Pro 2 . . . . . . . . . . . . . . . . . . . . . . .77

2 Club saber electrónica nº 97


http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 3

Capítulo 1

eL muNdo de Los microcoNtroLadores

“Los sistemas de NumeracióN”


Prácticamente desde su aparición, allá por el año 1986, en Saber Electrónica desta-
camos la importancia de los microcontroladores en el mundo de la electrónica.
Hemos escrito más de 50 artículos, 10 libros de texto y varios cursos sobre compo-
nentes 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 profe-
sional. A partir de este número comenzamos con la edición de un curso de micro-
controladores de MicroElectronika (www.mikroe.com) a quienes agradecemos por
permitirnos compartir este importantísimo material, invitando a todos los lectores a
que visiten la página de referencia para obtener importante material de apoyo.

www.mikroe.com

IntroduccIón cuitos integrados. Este desarrollo ha permitido


construir las centenas de miles de transistores
La situación actual en el campo de los micro- en un chip. Esto fue una condición previa para la
controladores se ha producido gracias al desa- fabricación de un microprocesador. Las prime-
rrollo de la tecnología de fabricación de los cir- ras microcomputadoras se fabricaron al añadir-

Capítulo 1 3
http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 4

El Mundo de los Microcontroladores

les periféricos externos, tales como memoria, man al ascensor al mismo tiempo? ¿Cuál llama-
líneas de entrada/salida, temporizadores u da tiene la prioridad? ¿Cómo solucionar las
otros. El incremento posterior de la densidad de cuestiones de seguridad, de pérdida de electrici-
integración permitió crear un circuito integrado dad, de fallos, de uso indebido?
que contenía tanto al procesador como periféri- Lo que sucede después de resolver estos
cos. Así es cómo fue desarrollada la primera problemas básicos es un proceso meticuloso de
microcomputadora en un solo chip, denominada diseñar los dispositivos adecuados utilizando un
más tarde microcontrolador. gran número de los chips especializados. Este
Los principiantes en electrónica creen que un proceso puede tardar semanas o meses, depen-
microcontrolador es igual a un microprocesador. diendo de la complejidad del dispositivo.
Esto no es cierto. Difieren uno del otro en Cuando haya terminado el proceso, llega la hora
muchos sentidos. La primera y la más importan- de diseñar una placa de circuito impreso y de
te diferencia es su funcionalidad. Para utilizar al montar el dispositivo. ¡Un dispositivo enorme! Es
microprocesador en una aplicación real, se debe otro trabajo difícil y tardado. Por último, cuando
de conectar con componentes tales como todo está terminado y probado adecuadamente,
memoria o componentes buses de transmisión pasamos al momento crucial y es cuando uno se
de datos. Aunque el microprocesador se consi- concentra, respira profundamente y enciende la
dera una máquina de computación poderosa, no fuente de alimentación.
está preparado para la comunicación con los Esto suele ser el punto en el que la fiesta se
dispositivos periféricos que se le conectan. Para convierte en un verdadero trabajo puesto que
que el microprocesador se comunique con algún los dispositivos electrónicos casi nunca funcio-
periférico, se deben utilizar los circuitos especia- nan apropiadamente desde el inicio. Prepárese
les. Así era en el principio y esta práctica sigue para muchas noches sin dormir, correcciones,
vigente en la actualidad. mejoras... y no se olvide de que todavía estamos
Por otro lado, al microcontrolador se le dise- hablando de cómo poner en marcha un simple
ña de tal manera que tenga todas las compo- ascensor.
nentes integradas en el mismo chip. No necesi- Cuando el dispositivo finalmente empiece a
ta de otros componentes especializados para su funcionar perfectamente y todo el mundo esté
aplicación, porque todos los circuitos necesa- satisfecho, y le paguen por el trabajo que ha
rios, que de otra manera correspondan a los hecho, muchas compañías de desarrollo esta-
periféricos, ya se encuentran incorporados. Así rán interesadas en su trabajo. Por supuesto, si
se ahorra tiempo y espacio necesario para cons- tiene suerte, cada día le traerá una oferta de tra-
truir un dispositivo. bajo de un nuevo inversionista. Sin embargo, si
lo requieren para trabajar en el control de los
elevadores de un nuevo edificio que tiene cuatro
Qué Pueden Hacer los MIcrocontroladores pisos más de los que ya maneja su sistema de
control.
Para entender con más facilidad las razones
del éxito tan grande de los microcontroladores, ¿Sabe cómo proceder? ¿Cree acaso que se
vamos a prestar atención al siguiente ejemplo. pueden controlar las demandas de sus clientes?
Hace unos 10 años, diseñar un dispositivo elec- Pensamos que usted va a construir un dispo-
trónico de control de un ascensor de un edificio sitivo universal que se puede utilizar en los edi-
de varios pisos era muy difícil, incluso para un ficios de 4 a 40 pisos, una obra maestra de elec-
equipo de expertos. trónica. Bueno, incluso si usted consigue cons-
truir una joya electrónica, su inversionista le
¿Ha pensado alguna vez en qué requisitos esperará delante de la puerta pidiendo una
debe cumplir un simple ascensor? ¿Cómo lidiar cámara en el ascensor o una música relajante
con la situación cuando dos o más personas lla- en caso de fallo de ascensor. O un ascensor con

4 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 5

B aSES dE loS M iCroCoNtroladorES

dos puertas. De todos modos, la ley de Murphy mente significa. Es así como se hacían las
es inexorable y sin duda usted no podrá tomar cosas hasta aparición de los microcontroladores
ventaja a pesar de todos los esfuerzos que ha diseñados - pequeños, potentes y baratos.
hecho. Por desgracia, todo lo que se ha dicho Desde ese momento su programación dejó de
hasta ahora sucede en la realidad. Esto es lo ser una ciencia, y todo tomó otra dirección ...
que “dedicarse a la ingeniería electrónica” real- El dispositivo electrónico capaz de controlar
Figura 1

Capítulo 1 5
http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 6

El Mundo de los Microcontroladores

un pequeño submarino, una grúa o un ascensor ¡Muy simple!


como el anteriormente mencionado, ahora está
incorporado en un sólo chip. Los microcontrola- ¿Se podría expresar de una forma más desa-
dores ofrecen una amplia gama de aplicaciones y rrollada?
sólo algunas se exploran normalmente. Le toca a Por supuesto que sí:
usted decidir qué quiere que haga el microcontro-
lador y cargar un programa en él con las instruc- 764 = 4 + 60 + 700
ciones apropiadas. Antes de encender el disposi-
tivo es recomendable verificar su funcionamiento ¿Aún más desarrollado?
con ayuda de un simulador. Si todo funciona Sí:
como es debido, incorpore el microcontrolador en
el sistema. Si alguna vez necesita cambiar, mejo- 764 = 4*1 + 6*10 + 7*100
rar o actualizar el programa, hágalo.
¿Podría este número parecer un poco más
¿Hasta cuándo se deben hacer modificacio- “científico”?
nes? La respuesta es sí otra vez:
Hasta quedar satisfecho. Eso puede realizar-
se sin ningún problema. Vea en la figura 1 una 764= 4*100 + 6*101 + 7*102.
caracterización sobre los pasos que debe seguir
un principiante para la programación. ¿Qué significa esto realmente? ¿Por qué uti-
lizamos exactamente estos números 100, 101 y
Sabía usted que todas las personas pueden 102 ? ¿Por qué es siempre el número 10?
ser clasificadas en uno de 10 grupos, en los que Es porque utilizamos 10 dígitos diferentes (0,
están familiarizados con el sistema de numera- 1, 2...8, 9). En otras palabras, es porque utiliza-
ción binario y en los que no están familiarizados mos el sistema de numeración en base 10, es
con él. Si no entendió lo anterior significa que decir el sistema de numeración decimal, figura
todavía pertenece al segundo grupo. Si desea 2.
cambiar su estado, lea el siguiente
texto que describe brevemente algunos
de los conceptos básicos utilizados
más tarde en este libro (sólo para estar
seguro de que estamos hablando en
los mismos términos).

núMeros, núMeros, núMeros...

¡La matemática es una gran ciencia!


Todo es tan lógico y simple... El univer-
so de los números se puede describir
con sólo diez dígitos. Figura 2

¿Realmente tiene que ser así?


¿Necesitamos exactamente esos 10 dígitos?
Por supuesto que no, es sólo cuestión del sIsteMa de nuMeracIón BInarIo
hábito. Acuérdese de las lecciones de la escue-
la. Por ejemplo, ¿qué significa el número 764? ¿Qué pasaría si utilizáramos sólo dos núme-
Cuatro unidades, seis decenas y siete centenas. ros 0 y 1?

6 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 7

B aSES dE loS M iCroCoNtroladorES

Si sólo pudiéramos afirmar (1) o negar (0) pocos voltios). La razón son los ruidos eléctricos
que algo existe. La respuesta es “nada espe- y fenómenos que se presentan dentro de lo que
cial”, seguiríamos utilizando los mismos núme- llamamos “entorno de trabajo real” (algunos
ros de la misma manera que utilizamos hoy en ejemplos de estos fenómenos son los cambios
día, no obstante ellos parecerían un poco dife- imprevisibles de la tensión de alimentación,
rentes. Por ejemplo: 11011010. cambios de temperatura, tolerancia a los valores
de los componentes etc...). Imagínese una com-
¿Cuántas son realmente 11011010 páginas putadora que opera sobre números decimales al
de un libro? tratarlos de la siguiente manera: 0=0V, 1=5V,
Para entenderlo, siga la misma lógica como 2=10V, 3=15V, 4=20V... 9=45V
en el ejemplo anterior, pero en el orden inverti-
do. Tenga en cuenta que se trata de aritmética ¿Alguien dijo baterías?
con sólo dos dígitos 0 y 1, es decir, del sistema Una solución mucho más fácil es una lógica
de numeración en base 2 (sistema de numera- binaria donde 0 indica la ausencia de voltaje,
ción binario). Vea la figura 3. mientras que 1 indica la presencia de voltaje.
Simplemente, es fácil de
Figura 3 escribir 0 o 1 en vez de “no
hay voltaje” o “ hay voltaje”.
Mediante el cero lógico (0) y
uno lógico (1) la electrónica
se enfrenta perfectamente y
realiza con facilidad todas
las operaciones aritméticas.
Evidentemente, se trata de
electrónica que en realidad
aplica aritmética en la que
todos los números son
representados con sólo dos
Evidentemente, se trata del mismo número dígitos y donde sólo es importante saber si hay
representado en dos sistemas de numeración voltaje o no. Por supuesto, estamos hablando de
diferentes. La única diferencia entre estas dos electrónica digital.
representaciones yace en el número de dígitos
necesarios para escribir un número. Un dígito
(2) se utiliza para escribir el número 2 en el sis- sIsteMa de nuMeracIón exadecIMal
tema decimal, mientras que dos dígitos (1 y 0)
se utilizan para escribir aquel número en el sis- En el principio del desarrollo de las computa-
tema binario. doras era evidente que a la gente le costaba
mucho trabajar con números binarios. Por eso,
¿Ahora está de acuerdo que hay 10 grupos se estableció un nuevo sistema de numeración,
de gente? que utilizaba 16 símbolos diferentes. Es llamado
¡Bienvenido al mundo de la aritmética bina- el sistema de numeración hexadecimal. Este
ria! ¿Tiene alguna idea de dónde se utiliza? sistema está compuesto de 10 dígitos a los que
Excepto en las condiciones de laboratorio estamos acostumbrados (0, 1, 2, 3,... 9) y de
estrictamente controladas, los circuitos electró- seis letras del alfabeto A, B, C, D, E y F.
nicos más complicados no pueden especificar
con exactitud la diferencia entre dos magnitudes ¿Cuál es el propósito de esta combinación
(dos valores de voltaje, por ejemplo), si son aparentemente extraña?
demasiado pequeños (más pequeños que unos Basta con mirar cómo todo en la historia de

Capítulo 1 7
http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 8

El Mundo de los Microcontroladores

los números binarios encaja perfectamente para mal es el que nos resulta más comprensible,
lograr una mejor comprensión del tema. Vea la mientras que el sistema hexadecimal presenta
figura 4. un balance entre los dos. Por eso, es muy
importante aprender cómo
Figura 4 convertir los números de
un sistema de numeración
a otro, por ejemplo, cómo
convertir una serie de
El mayor número que puede ser representa- ceros y unos a una forma de representación
do con 4 dígitos binarios es el número 1111. comprensible para nosotros.
Corresponde al número 15 en el sistema deci-
mal. En el sistema hexadecimal ese número se
representa con sólo un dígito F. Es el mayor conversIón de núMeros BInarIos
número de un dígito en el sistema hexadecimal. a decIMales

¿Se da cuenta de la gran utilidad de estas Los dígitos en un número binario tienen pon-
equivalencias? deraciones diferentes lo que depende de sus
El mayor número escrito con ocho dígitos posiciones dentro del número que están repre-
binarios es a la vez el mayor número de dos sentando. Además, cada dígito puede ser 1 o 0,
dígitos en el sistema hexadecimal. Tenga en y su ponderación se puede determinar con faci-
cuenta que una computadora utiliza números lidad al contar su posición empezando por la
binarios de 8 dígitos. ¿Acaso se trata de una derecha. Para hacer una conversión de un
casualidad? número binario a decimal es necesario multipli-
car las ponderaciones con los dígitos correspon-
dientes (0 o 1) y sumar todos los resultados. La
códIgo Bcd magia de la conversión de un número binario a
decimal funciona de maravilla... ¿Tiene dudas?
El código BCD (Binary-Coded Decimal - Vea el ejemplo de la figura 5.
Código binario decimal)
es un código binario utili-
zado para representar a
los números decimales. Figura 5
Se utiliza para que los cir-
cuitos electrónicos pue-
dan comunicarse con los periféricos utilizando el Cabe destacar que es necesario utilizar sólo
sistema de numeración decimal o bien utilizando dos dígitos binarios para representar a todos los
el sistema binario dentro de “su propio mundo”. números decimales de 0 a 3.
Consiste en números binarios de 4 dígitos que Por consiguiente, para representar los núme-
representan los primeros diez dígitos (0, 1, 2, ros de 0 a 7 es necesario utilizar tres dígitos
3...8, 9). Aunque cuatro dígitos pueden hacer 16 binarios, para representar los números de 0 a 15
combinaciones posibles en total, el código BCD - cuatro dígitos etc.
normalmente utiliza a las primeras diez. Dicho de manera sencilla, el mayor número
binario que se puede representar utilizando n
dígitos se obtiene al elevar la base 2 a la poten-
conversIón de sIsteMas de nuMeracIón cia n. Luego, al resultado se le resta 1. Por ejem-
plo, si n=4:
El sistema de numeración binario es el que
utilizan los microcontroladores, el sistema deci- 24 - 1 = 16 - 1 = 15

8 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 9

B aSES dE loS M iCroCoNtroladorES

Por consiguiente, al utilizar 4 dígitos binarios, je”? Dependiendo del sistema en cuestión (bina-
es posible representar los números decimales rio, decimal o hexadecimal), el resultado podría
de 0 a 15, que son 16 valores diferentes en total. ser 6, 110 o 272 productos, respectivamente.
Por consiguiente, para evitar equivocaciones,
diferentes prefijos y sufijos se añaden directa-
conversIón de núMeros HexadecIMales mente a los números. El prefijo $ o 0x así como
a decIMales el sufijo h marca los números en el sistema
hexadecimal. Por ejemplo, el número hexadeci-
Para realizar una conversión de un número mal 10AF se puede escribir así: $10AF, 0x10AF
hexadecimal a decimal, cada dígito hexadecimal o 10AFh. De manera similar, los números bina-
debe ser multiplicado con el número 16 elevado rios normalmente obtienen el sufijo % o 0B. Si
al valor de su posición. Como ejemplo, vea la un número no tiene ni sufijo ni prefijo se consi-
representación de la figura 6. dera decimal. Desafortunadamente, esta forma
de marcar los números no es
Figura 6 estandarizada, por consiguiente
depende de la aplicación con-
creta. La mostrada en la figura 8
es tabla comparativa que con-
tiene los valores de números 0-
255 representados en tres siste-
mas de numeración diferentes.
conversIón de núMeros HexadecIMales
aBInarIos

No es necesario realizar ningún cálculo para


convertir un número hexadecimal a binario. Los
dígitos hexadecimales se reemplazan simple-
mente por los cuatro dígitos binarios apropiados.
Ya que el dígito hexadecimal máximo es equiva-
lente al número decimal 15, es necesario utilizar
cuatro dígitos binarios para representar un dígi-
to hexadecimal. Vea la figura 7.

Figura 7

Figura 8
Marcar los núMeros

El sistema de numeración hexadecimal, junto


con los sistemas binario y decimal, se conside-
ran los más importantes para nosotros. Es fácil núMeros negatIvos
realizar una conversión de cualquier número
hexadecimal a binario, además es fácil de recor- Como ya hemos visto, para escribir un núme-
darlo. Sin obstante, estas conversiones pueden ro negativo en matemáticas, basta con añadirle
provocar una confusión. Por ejemplo, ¿qué sig- el prefijo “-” (signo menos). Sin embargo, en la
nifica en realidad la sentencia: “Es necesario programación, al acabarse el proceso de la com-
contar 110 productos en una cadena de monta- pilación, se quedan sólo los números binarios,

Capítulo 1 9
http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 10

El Mundo de los Microcontroladores

volviéndose las cosas más complicadas. Se uti- el número 444 son los mismos pero tienen los
lizan sólo dos dígitos - 0 y 1, mientras que todos valores diferentes), el “significado” de un bit
los demás números, símbolos y signos se for- depende de la posición que tiene en número
man por medio de las combinaciones de estos binario. En los números binarios, sus dígitos se
dos dígitos. En el caso de los números negati- denominan el bit cero (el primer bit a la dere-
vos, la solución es la siguiente: cha), el primer bit (el segundo bit a la derecha)
etc. Además, ya que el sistema binario utiliza
“En los números negativos, el bit más signifi- solamente dos dígitos (0 y 1), el valor de un bit
cativo (el bit del extremo izquierdo) representa el puede ser 0 o 1.
signo del número (donde 0 será positivo y 1 No se confunda si se encuentra con un bit
negativo)”. que tiene el valor 4, 16 o 64. Son los valores
representados en el sistema decimal.
En el caso de un número de 8 bits, para Simplemente, nos hemos acostumbrado tanto a
representar un valor numérico sólo quedan 7 utilizar los números decimales que estas expre-
bits. De acuerdo a este tipo de codificación el siones llegaron a ser comunes. Sería correcto
número +127 es el mayor número positivo con decir por ejemplo, “el valor del sexto bit en cual-
signo que se puede representar con 8 bits. quier número binario equivale al número decimal
Asimismo, hay cero (0) positivo y negativo (refié- 64”. Pero todos somos humanos y los viejos
rase a la siguiente tabla). hábitos mueren difícilmente. Además, ¿cómo le
suena “número uno-uno-cero-uno-cero...”?

BYte

Un byte consiste en 8 bits colocados uno


junto al otro. Si un bit es un dígito, es lógico que
los bytes representen los números. Todas las
operaciones matemáticas se pueden realizar
¿Se puede saber de qué número se trata? por medio de ellos, como por medio de los
Por ejemplo, si ponemos el número números decimales comunes. Similar a los dígi-
10000001, ¿es -1 o 129? No se preocupe, de tos de cualquier número, los dígitos de un byte
eso se encarga el compilador. Ésta es la razón no tienen el mismo significado. El bit del extremo
por la que se declaran variables al escribir el izquierdo tiene la mayor ponderación, por eso es
programa, mientras tanto, mire la tabla 1 para denominado el bit más significativo (MSB). El bit
interpretar lo que estamos diciendo. Bueno, de del extremo derecho tiene la menor pondera-
eso vamos a hablar a continuación. ción, por eso es denominado el bit menos signi-
ficativo (LSB). Puesto que los 8 dígitos de un
byte se pueden combinar de 256 maneras dife-
BIt rentes, el mayor número decimal que se puede
representar con un byte es 255 (una combina-
La teoría dice que un bit es la unidad básica ción representa un cero).
de información... Un nibble o un cuarteto representa una
Vamos a olvidarlo por un momento y demos- mitad de byte. Dependiendo de la mitad del
trar qué es eso en la práctica. La respuesta es - número en cuestión (izquierda o derecha), se
nada especial- un bit es un sólo dígito binario. les denomina nibbles “altos” o “bajos”, respecti-
Similar a un sistema de numeración decimal en vamente (figura 9).
el que los dígitos de un número no tienen la Usted seguramente ha pensado alguna vez
misma ponderación (por ejemplo, los dígitos en en cómo es la electrónica dentro de un circuito

10 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 11

B aSES dE loS M iCroCoNtroladorES

sólo en caso de que ambas entra-


das (A Y B) sean llevadas a alto
(1). La tabla a la derecha de la
figura 10 (en la que también se
muestra el símbolo de esta com-
puerta) es la tabla de verdad que
Figura 9 muestra la relación entre las
entradas y salidas de la compuer-
integrado digital, un microcontrolador o un ta. El principio de funcionamiento es el mismo
microprocesador. cuando la compuerta disponga de más de dos
entradas: la salida proporciona un uno lógico (1)
¿Cómo son los circuitos que realizan las ope- sólo si todas las entradas son llevadas a alto (1).
raciones matemáticas complicadas y toman Vea la figura 11.
decisiones? ¿Sabía que sus esquemas, aparen-
temente complicadas consisten en sólo unos
pocos elementos diferentes, denominados cir-
cuitos lógicos o compuertas lógicas?

detalles IMPortantes Figura 10

El funcionamiento de estos elementos es Figura 11


basado en los principios establecidos por el
matemático británico George Boole en la mitad
del siglo 19 - es decir, ¡antes de la invención de
la primera bombilla! En breve, la idea principal
era de expresar las formas lógicas por medio de
las funciones algebraicas. Tal idea pronto se
transformó en un producto práctico que se con-
virtió más tarde en lo que hoy en día conocemos Cualquier otra combinación de voltajes de
como circuitos lógicos Y (AND), O (OR) o NO entrada proporcionará un cero lógico (0) en su
(NOT). El principio de su funcionamiento es salida. Utilizada en el programa, la operación Y
conocido como algebra de Boole. lógico es realizada por una instrucción de pro-
grama, de la que vamos a hablar más tarde. Por
ahora basta con conocer que Y lógico en un pro-
coMPonentes BásIcos de la lógIca dIgItal grama se refiere a la realización de este tipo de
operación sobre los bits correspondientes de
Algunas instrucciones de programa utilizadas dos registros diferentes.
por un microcontrolador funcionan de la misma
manera que las compuertas lógicas, pero en
forma de comandos. A continuación vamos a compuerta o (or)
explicar el principio de su funcionamiento. De manera similar, la compuerta O, cuyo
símbolo se observa en la figura 12, también dis-
compuerta Y (and) pone de dos o más entradas y de una salida. Si
Una compuerta lógica “Y” dispone de dos o la compuerta dispone de sólo dos entradas, es
más entradas y de una salida. En este caso la aplicable lo siguiente: la salida proporciona un
compuerta utilizada dispone de sólo dos entra- uno lógico (1) si una u otra entrada (A o B) es lle-
das. Un uno lógico (1) aparecerá en su salida vada a alto (1). En caso de que la compuerta O

Capítulo 1 11
http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 12

El Mundo de los Microcontroladores

disponga de más de dos entradas, es aplicable con los bits invertidos, figura 15. Si los bits de un
lo siguiente: La salida proporciona un uno lógico byte se consideran número, el valor invertido es
(1) si por lo menos una entrada es llevada a alto un complemento a ese número.
(1). Si todas las entradas están a cero lógico (0), El complemento de un número es el valor
la salida estará a cero lógico (0) también. Vea la que se añade al número hasta llegar al mayor
figura 13. número binario de 8 dígitos. En otras palabras,
la suma de un dígito de 8 números y de su com-
plemento es siempre 255.

compuerta xor (o exclusiva)


La compuerta XOR (O EXCLUSIVA) es un
poco complicada en comparación con las
Figura 12 demás. Representa una combinación de todas
las compuertas anteriormente descritas y su
Figura 13 símbolo se puede ver en la figura 16. La salida
proporciona un uno lógico (1) sólo si sus entra-
das están en estados lógicos diferentes.
En el programa, esta operación se utiliza con
frecuencia para comparar dos bytes. La resta se
puede utilizar con el mismo propósito (si el resul-
tado es 0, los bytes son iguales). A diferencia de
la resta, la ventaja de esta operación lógica es
En un programa, la operación O lógico se que no es posible obtener los resultados negati-
realiza de la misma manera que la operación Y. vos. En la figura 17 puede apreciar cómo es la
correspondencia entre entradas y salidas.
compuerta no (not)
La compuerta lógica NO dispone de una sola
entrada y una sola salida, por lo que funciona
muy simplemente, figura 14. Cuando un cero lógi-
co (0) aparezca en su entrada, la salida propor-
ciona un uno lógico (1) y viceversa. Esto significa
que esta compuerta invierte las señales por sí Figura 16
mismas y por eso es denominada inversor.
En el programa la operación lógica NO se Figura 17
realiza sobre un byte. El resultado es un byte

Figura 14

Figura 15
regIstros

Un registro o una celda de memoria es un cir-


cuito electrónico que puede memorizar el estado
de un byte.

12 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 13

B aSES dE loS M iCroCoNtroladorES

En otras palabras, el estado


de los bits de registros se fija
dentro de programa, los
registros SFR dirigen los
pequeños circuitos dentro
del microcontrolador, estos
circuitos se conectan por los
pines del microcontrolador a
un dispositivo periférico utili-
Figura 18 zado para... bueno, depende
de usted.
En la figura 18 tenemos un esquena que
ejemplifica el funcionamiento de un registro.
Puertos de entrada / salIda (e/s)

registros sFr Para hacer útil un microcontrolador, hay que


A diferencia de los registros que no tienen conectarlo a un dispositivo externo, o sea, a un
ninguna función especial y predeterminada, periférico. Cada microcontrolador tiene uno o
cada microcontrolador dispone de un número de más registros (denominados puertos) conecta-
dos a los pines en el microcontro-
lador, figura 20.

¿Por qué se denominan puertos


de entrada/salida?
Porque usted puede cambiar la
función de cada pin como quiera.
Por ejemplo, usted desea que su
dispositivo encienda y apague los
tres señales LEDs y que simultá-
neamente monitoree el estado
lógico de 5 sensores o botones de
Figura 19 presión. Uno de los puertos debe
estar configurado de tal manera
registros de funciones especiales (SFR), con la que haya tres salidas (conectadas a los LEDs) y
función predeterminada por el fabricante. Sus cinco entradas (conectadas a los sensores). Eso
bits están conectados a los circuitos internos del se realiza simplemente por medio de software,
microcontrolador tales como temporizadores, lo que significa que la función de algún pin
convertidores A/D, osciladores entre
otros, lo que significa que directamente
manejan el funcionamiento de estos
circuitos, o sea del microcontrolador.
Imagínese ocho interruptores que
manejan el funcionamiento de un cir-
cuito pequeño dentro del microcontro-
lador. Los registros SFR hacen exacta-
mente lo mismo. Vea en la figura 19 un
diagrama en bloques de aplicación de
estos registros. Figura 20

Capítulo 1 13
http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 14

El Mundo de los Microcontroladores

puede ser cambiada durante el funcionamiento.


Una de las características más importantes
de los pines de entrada/salida (E/S) es la
corriente máxima que pueden entregar/recibir.
En la mayoría de los microcontroladores la
corriente obtenida de un pin es suficiente para
activar un LED u otro dispositivo de baja corrien-
te (10-20mA).
Mientras más pines de E/S haya, más baja
es la corriente máxima de un pin. En otras pala-
bras, todos los puertos de E/S comparten la
corriente máxima declarada en la hoja de espe-
cificación técnica del microprocesador.
Otra característica importante de los pines es
que pueden disponer de los resistores pull-up.
Estos resistores conectan los pines al polo posi- Figura 21
tivo del voltaje de la fuente de alimentación y su
efecto se puede ver al configurar el pin como De manera similar, cada dirección de memo-
una entrada conectada a un interruptor mecáni- ria corresponde a una localidad de memoria. El
co o a un botón de presión. Las últimas versio- contenido de cualquier localidad se puede leer y
nes de los microcontroladores tienen las resis- se le puede acceder al direccionarla. La memo-
tencias pull-up configurables por software. ria se puede escribir en la localidad o leer.
Cada puerto de E/S normalmente está bajo Hay varios tipos de memoria dentro del
el control de un registro SFR especializado, lo microcontrolador:
que significa que cada bit de ese registro deter-
mina el estado del pin correspondiente en el Memoria roM – Memoria de sólo lectura
microcontrolador. Por ejemplo, al escribir un uno ROM: Read Only Memory. La memoria ROM
lógico (1) a un bit del registro de control (SFR), se utiliza para guardar permanentemente el pro-
el pin apropiado del puerto se configura automá- grama que se está ejecutando. El tamaño de
ticamente como salida. programa que se puede escribir depende del
Eso significa que el voltaje llevado a ese pin tamaño de esta memoria. Los microcontrolado-
se puede leer como 0 o 1 lógico. En caso con- res actuales normalmente utilizan el direcciona-
trario, al escribir 0 al registro SFR, el pin apro- miento de 16 bits, que significa que son capaces
piado del puerto se configura como salida. Su de direccionar hasta 64 Kb de memoria, o sea
voltaje (0V o 5V) corresponde al estado del bit 65535 localidades. Por ejemplo, si usted es prin-
apropiado del registro del puerto. cipiante, su programa excederá pocas veces el
límite de varios cientos de instrucciones. Hay
varios tipos de memoria ROM:
unIdad de MeMorIa
rom de Máscara (enmascarada) - MroM
La unidad de memoria es una parte del La ROM enmascarada es un tipo de ROM
microcontrolador utilizada para almacenar los cuyo contenido es programado por el fabricante.
datos, figura 21. La manera más fácil de expli- El término “de máscara” viene del proceso de
carlo es compararlo con un armario grande con fabricación, donde las partes del chip se plas-
muchos cajones. Si marcamos los cajones cla- man en las mascaras utilizadas durante el pro-
ramente, será fácil acceder a cualquiera de sus ceso de fotolitografía. En caso de fabricación de
contenidos al leer la etiqueta en la parte delan- grandes series, el precio es muy bajo. Olvide la
tera del cajón. idea de modificarla...

14 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 15

B aSES dE loS M iCroCoNtroladorES

otP roM (one time Programmable roM) pequeña escala. Por la gran popularidad de esta
roM programable una sola vez memoria, la mayoría de los microcontroladores
La memoria programable una sola vez per- se fabrican con tecnología flash hoy en día. Si
mite descargar un programa en el chip, pero usted va a comprar un microcontrolador, ¡éste
como dice su nombre, una sola vez. Si se detec- es en definitiva la opción perfecta!
ta un error después de descargarlo, lo único que
se puede hacer es descargar el programa Memoria raM – Memoria
correcto en otro chip. de acceso aleatorio
RAM: Random Access Memory. Al apagar la
Figura 22 fuente de alimentación, se pierde el contenido
de la memoria RAM. Se utiliza para almacenar
temporalmente los datos y los resultados inme-
diatos creados y utilizados durante el funciona-
miento del microcontrolador. Por ejemplo, si el
programa ejecuta la adición (de cualquier cosa)
es necesario tener un registro que representa lo
que se llama “suma” en vida cotidiana. Con tal
propósito, uno de los registros de la RAM es
denominado “suma” y se utiliza para almacenar
los resultados de la adición.

Memoria eeProM – roM Programable


y Borrable eléctricamente
EEPROM: Electricall y Erasable
Programmable ROM. El contenido de la
uv eProM (uv erasable Programmable EEPROM se puede cambiar durante el funcio-
roM) - roM programable borrable namiento (similar a la RAM), pero se queda per-
por rayos ultravioleta manentemente guardado después de la pérdida
El encapsulado de esta memoria, figura 22, de la fuente de alimentación (similar a la ROM).
tiene una “ventana” reconocible en la parte alta. Por lo tanto, la EEPROM se utiliza con frecuen-
Eso permite exponer la superficie del chip de sili- cia para almacenar los valores creados durante
cio a la luz de ultravioleta y borrar el programa el funcionamiento, que tienen que estar perma-
completamente en varios minutos. Luego es nentemente guardados. Por ejemplo, si usted ha
posible descargar un nuevo programa en él.
La instalación de esta ventana es complica-
da, lo que por supuesto afecta al precio. Desde
nuestro punto de vista, desgraciadamente, de
manera negativa...

Memoria Flash
Este tipo de memoria se inventó en los años
80 en los laboratorios de la compañía INTEL,
como forma desarrollada de la memoria UV
EPROM. Ya que es posible escribir y borrar el
contenido de esta memoria prácticamente un
número ilimitado de veces, los microcontrolado-
res con memoria Flash son perfectos para estu-
diar, experimentar y para la fabricación en

Capítulo 1 15
http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 16

El Mundo de los Microcontroladores

diseñado una llave electrónica


o un alarma, sería estupendo
permitir al usuario crear e intro-
ducir una contraseña por su
cuenta. Por supuesto, la nueva
contraseña tiene que estar
guardada al apagar la fuente
de alimentación. En tal caso
una solución perfecta es el
microcontrolador con una
EEPROM embebida.

InterruPcIones

La mayoría de programas utilizan interrupcio- do varios botones sin parar - las horas, los días,
nes durante ejecución de programa regular. El esto no sería nada práctico.
propósito del microcontrolador generalmente Por lo tanto, el microcontrolador “aprendió un
consiste en reaccionar a los cambios en su truco” durante su evolución. En vez de seguir
entorno. En otras palabras, cuando ocurre algo, comprobando algún pin o bit, el microconrolador
el microcontrolador reacciona de alguna mane- deja su “trabajo de esperar” a un “experto” que
ra... Por ejemplo, al apretar el botón del mando reaccionará sólo en caso de que suceda algo
a distancia, el microcontrolador lo registra y res- digno de atención.
ponde al comando cambiando de canal, subien- La señal que informa al procesador central
do o bajando el volumen etc. Si el microcontro- acerca de tal acontecimiento se denomina
lador pasará la mayoría del tiempo comproban- INTERRUPCIÓN.

16 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 17

B aSES dE loS M iCroCoNtroladorES

unIdad central de ProcesaMIento direccionar la memoria. Se utiliza para transmitir


(central Processor unIt - cPu) la dirección de la CPU a la memoria. El bus de
datos es tan ancho como los datos, en este caso
Como indica su nombre, esto es una unidad es de 8 bits o líneas de ancho. Se utiliza para
que controla todos los procesos dentro del conectar todos los circuitos dentro del microcon-
microcontrolador. trolador.

Figura 23 coMunIcacIón en serIe

La conexión paralela entre el


microcontrolador y los periféri-
cos a través de los puertos de
entrada/salida es una solución
perfecta para las distancias
cortas “hasta varios metros”,
Consiste en varias unidades más pequeñas, figura 24. No obstante, en otros casos cuando
figura 23, de las que las más importantes son: es necesario establecer comunicación entre dos
dispositivos a largas distancias no es posible uti-
• Decodificador de instrucciones es la lizar la conexión paralela. En vez de eso, se uti-
parte que descodifica las instrucciones del pro- liza la conexión en serie.
grama y acciona otros circuitos basándose en
esto. El “conjunto de instrucciones” que es dife- Figura 24
rente para cada familia de microcontrolador
expresa las capacidades de este circuito;
• Unidad lógica aritmética (Arithmetical
Logical Unit - ALU) realiza todas las operaciones
matemáticas y lógicas 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 operación (sumar, mover).
También almacena los resultados preparados
para el procesamiento futuro. Uno de los regis-
tros SFR, denominado Registro Status (PSW),
está estrechamente relacionado con el acumula-
dor. Muestra el “estado” de un número almace- Hoy en día, la mayoría de los microcontrola-
nado en el acumulador (el número es mayor o dores llevan incorporados varios sistemas dife-
menor que cero etc.) en cualquier instante dado. rentes para la comunicación en serie, como un
equipo estándar. Cuál de estos sistemas se uti-
lizará en un caso concreto, depende de muchos
Bus factores, de los que más importantes son:

El bus está formado por 8, 16 o más cables. • ¿Con cuántos dispositivos el microcon-
Hay dos tipos de buses: el bus de direcciones y trolador tiene que intercambiar los datos?
el bus de datos. El bus de direcciones consiste • ¿Cuál es la velocidad del intercambio de
en tantas líneas como sean necesarias para datos obligatoria?

Capítulo 1 17
http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 18

El Mundo de los Microcontroladores

• ¿Cuál es la distancia entre los dispositi- entre ellos es corta (el receptor y el transmisor
vos? están normalmente en la misma placa de circui-
• ¿Es necesario transmitir y recibir los to impreso). La conexión se establece por medio
datos simultáneamente? de dos líneas - una se utiliza para transmitir los
datos, mientras que la otra se utiliza para la sin-
Una de las cosas más importantes en cuanto cronización (la señal de reloj).
a la comunicación en serie es el “Protocolo” que Como se muestra en la figura 25, un disposi-
debe ser estrictamente observado. Es un con- tivo es siempre el principal (master - maestro), el
junto de reglas que se aplican obligatoriamente que realiza el direccionamiento de un chip
para que los dispositivos puedan interpretar subordinado (slave - esclavo) antes de que se
correctamente los datos que intercambian inicie la comunicación. De esta manera un
mutuamente. Afortunadamente, los microcontro- microcontrolador puede comunicarse con 112
ladores se encargan de eso automáticamente, dispositivos diferentes. La velocidad de transmi-
así que el trabajo de programador/usuario es sión serial es normalmente 100 kb/seg (el modo
reducido a la escritura y lectura de datos. estándar) o 10 Kb/seg (modo de velocidad de
transmisión baja).
Recientemente han aparecido los sistemas
velocIdad de transMIsIón serIal con la velocidad de transmisión serial 3.4
Mb/sec. La distancia entre los dispositivos que
La velocidad de transmisión serial (baud se comunican por el bus I2C está limitada a
rate) es el término utilizado para denotar el unos metros.
número de bits transmiti-
dos por segundo (bps). Figura 25

¡Fíjese que este tér-


mino se refiere a bits, y
no a bytes!

El protocolo normal-
mente 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 sPI - Bus serIal de InterFase de PerIFérIcos
ejemplo, si velocidad de transmisión serial es (serIal PerIPHeral InterFace Bus)
300 bps un máximo de 37 y un mínimo de 27
bytes se pueden transmitir por segundo. Un bus serial de interfase de periféricos es
Los sistemas de comunicación serial más uti- un sistema para la comunicación serial que utili-
lizados son: za hasta cuatro líneas (normalmente solo son
necesarias tres) para recibir los datos, para
transmitir los datos, para sincronizar y (opcional)
I2c cIrcuIto Inter- Integrado para seleccionar el dispositivo con el que se
(Inter Integrated cIrcuIt) comunica, figura 26.
Esto es la conexión full duplex, lo que signifi-
Circuito inter-integrado es un sistema para el ca que los datos se envían y se reciben simultá-
intercambio de datos serial entre los microcon- neamente.
troladores y los circuitos integrados especializa- La velocidad de transmisión máxima es
dos de generación. Se utiliza cuando la distancia mayor que en el sistema de conexión I2C.

18 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 19

B aSES dE loS M iCroCoNtroladorES

Figura 26 lador (figura 27) permi-


ten el funcionamiento
armónico y síncrono de
todos los circuitos del
microcontrolador.
El oscilador se configura
normalmente de tal
manera que utilice un
cristal de cuarzo o reso-
nador cerámico para
uart – transMIsor – recePtor asIncrónIco estabilización de frecuencia. Además, puede
unIversal (unIversal asYncHronous funcionar como un circuito autónomo (como
receIver/transMItter) - transMIsor- oscilador RC). Es importante decir que las ins-
trucciones del programa no se ejecutan a la
Este tipo de conexión es asincrónica o asín- velocidad impuesta por el mismo oscilador sino
crona, lo que significa que no se utiliza una línea varias veces más despacio. Eso ocurre porque
especial para transmitir la señal de reloj. En cada instrucción se ejecuta en varios ciclos del
algunas aplicaciones este rasgo es crucial (por oscilador.
ejemplo, en mandar datos a distancia por RF o En algunos microcontroladores se necesita el
por luz infrarroja). Puesto que se utiliza sólo una mismo número de ciclos para ejecutar todas las
línea de comunicación, tanto el receptor como el instrucciones, mientras que en otros el tiempo
transmisor reciben y envían los datos a veloci- de ejecución no es el mismo para todas las ins-
dad misma que ha sido predefinida para mante- trucciones.
ner la sincronización necesaria. Esto es una Por consiguiente, si el sistema utiliza el cris-
manera simple de transmitir datos puesto que tal de cuarzo con una frecuencia de 20MHZ, el
básicamente representa una conversión de tiempo de ejecución de una instrucción de pro-
datos de 8 bits de paralelo a serial. La velocidad grama no es 50 nS, sino 200, 400 o 800 nS
de transmisión no es alta, es hasta 1 Mbit/sec. dependiendo del tipo del microcontrolador.

oscIlador cIrcuIto de alIMentacIón


Fuente de alIMenta cIón
Los pulsos uniformes generados por el osci-
Hay que mencionar dos cosas dignas de
Figura 27 atención con relación al circuito de la fuente
de alimentación de microcontroladores:

• Brown out es un estado potencialmen-


te peligroso que ocurre al apagar el micro-
controlador o en caso de que el voltaje de la
fuente de alimentación salga de unos márge-
nes debido al ruido eléctrico.
Como el microcontrolador dispone de varios
circuitos que funcionan a niveles de voltaje
diferentes, ese estado puede causar un com-
portamiento descontrolado.
Para evitarlo, el microcontrolador normal-
mente tiene un circuito incorporado para el

Capítulo 1 19
http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 20

El Mundo de los Microcontroladores

brown out reset. El circuito reinicia inmediata- La mayoría de los programas utiliza estos
mente el microcontrolador si el voltaje de ali- cronómetros electrónicos en miniatura.
mentación cae por debajo del límite. Generalmente son registros SFR de 8 o 16 bits
• el pin de reset (reinicio), marcado fre- cuyo contenido se aumenta automáticamente
cuentemente con MCLR (Master Clear Reset), con cada pulso.
sirve para el reinicio externo del microcontrola-
dor al aplicar un cero (0) o un uno (1) lógico ¡Una vez que se llena el registro, se genera
dependiendo del tipo del microcontrolador. En una interrupción!
caso de que el circuito brown out no esté incor-
porado, un simple circuito externo para el brown Si el temporizador utiliza el oscilador de cuar-
out reset se puede conectar al pin MCLR. zo interno para su funcionamiento, es posible
medir el tiempo entre dos eventos (el valor de
registro en el momento de iniciar la medición es
teMPorIzadores – contadores T1, en el momento de finalizar la medición es
T2, el tiempo transcurrido es igual al resultado
El oscilador del microcontrolador utiliza cris- de la resta T2 - T1).
tal de cuarzo para su funcionamiento. Aunque Si los registros se aumentan con los pulsos
no se trata de la solución más simple, hay que vienen de la fuente externa, tal temporiza-
muchas razones para utilizarlo. La frecuencia dor se convierte en un contador.
del oscilador es definida con precisión y muy Esto es una explicación simple de su funcio-
estable, así que siempre genera los pulsos del namiento. Es un poco más complicado en prác-
mismo ancho, lo que los hace perfectos para tica.
medición de tiempo. Tales osciladores se utilizan
en los relojes de cuarzo. Si es necesario medir
el tiempo transcurrido entre dos eventos, basta ¿cóMo FuncIonan los teMPorIzadores?
con contar los pulsos generados por este oscila-
dor. Esto es exactamente lo que hace el tempo- En la práctica los pulsos generados por el
rizador y su representación la podemos obser- oscilador de cuarzo son llevados al circuito una
var en la figura 28. vez por cada ciclo de máquina directamente o
por el pre-escalador, lo que aumenta el número
Figura 28 en el registro del temporizador.
Si una instrucción (un ciclo de máquina gene-
ralmente) dura cuatro períodos del oscilador de
cuarzo, este número será cambiado un millón de
veces por segundo (cada microsegundo) al
incorporar al cuarzo que oscila con una frecuen-
cia de 4MHz.
Es fácil de medir los intervalos de tiempo cor-
tos de la manera descrita anteriormente (hasta
256 microsegundos porque es el mayor número
que un registro puede contener).
Esta obvia desventaja se puede superar de
varias maneras: al utilizar el oscilador más lento,
por medio de registros con más bits, del pre-
escalador o de la interrupción. Las primeras dos
soluciones tienen algunas debilidades así que
se recomienda utilizar el pre-escalador y/o la
interrupción.

20 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 21

B aSES dE loS M iCroCoNtroladorES

utIlIzando un Preescalador mayor número que se puede escribir en él es


en el FuncIonaMIento del teMPorIzador 255 (en los registros de 16 bits es el número
65.535). Si se excede este número, el tempori-
Un pre-escalador es un dispositivo electróni- zador se reinicia automáticamente y el conteo
co utilizado para dividir la frecuencia por un fac- comienza de nuevo en cero.
tor predeterminado. Esto quiere decir que se Esto es denominado desbordamiento o
necesita llevar 1, 2, 4 o más pulsos a su entrada sobreflujo (overflow). Permitido por el programa,
para generar un pulso a la salida. La mayoría de el desbordamiento puede provocar una interrup-
los microcontroladores disponen de uno o más ción, lo que abre completamente nuevas posibi-
pre-escaladores incorporados y su tasa de divi- lidades.
sión puede ser cambiada dentro del programa. Por ejemplo, el estado de registros utilizados
El pre-escalador se utiliza cuando es necesario para contar segundos, minutos o días puede ser
medir los períodos de tiempo más largos, figura implementado en una rutina de interrupción. El
29. proceso entero (excepto la rutina de interrup-
ción) se lleva a
Figura 29 cabo internamente,
lo que permite que
los circuitos princi-
pales del micro-
controlador funcio-
nen regularmente.
La figura 30 descri-
be el uso de una
interrupción en el
funcionamiento del
Si el temporizador y el temporizador perro temporizador. Al asignarle un pre-escalador al
guardián comparten un pre-escalador, éste no temporizador, se producen retrasos de duración
se puede utilizar por los dos simultáneamente. arbitraria con mínima interferencia en la ejecu-
ción del programa principal.

utIlIzando una InterruPcIón contadores


en el FuncIonaMIento del teMPorIzador
Si un temporizador se suministra por los pul-
Si el registro del temporizador es de 8 bits, el sos ingresados por el pin de entrada en el micro-

Fifura 30

Capítulo 1 21
http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 22

El Mundo de los Microcontroladores

controlador, se produce un con-


tador. Evidentemente, es el Figura 31
mismo circuito electrónico. La
única diferencia es que los pul-
sos para contar se ingresan por
el pin de entrada y que su dura-
ción (anchura) no es definida.
Por eso, no se pueden utilizar
para medición de tiempo, sino
que se utilizan para otros propó-
sitos, por ejemplo: contar los
productos en la cadena de mon-
taje, número de rotaciones del
eje de un motor, pasajeros etc.
(dependiendo del sensor utiliza-
do).
convertIdor dIgItal – analógIco (d/a)

teMPorIzador Perro guardIán Las señales del mundo real son muy diferen-
WatcHdog tes de las que “entiende” el microcontrolador
(ceros y unos), así que deben ser convertidas
El perro guardián es un temporizador conec- para que el microcontrolador pueda entenderlas.
tado a un oscilador RC completamente indepen-
diente dentro del microcontrolador. Figura 32
Si el perro guardián está habilitado, cada vez
que cuenta hasta el máximo valor en el que ocu-
rre el desbordamiento del registro se genera una
señal de reinicio del microcontrolador y la ejecu-
ción de programa inicia en la primera instruc-
ción.
El punto es evitar que eso ocurra al utilizar el
comando adecuado.
La idea se basa en el hecho de que cada pro-
grama se ejecuta en varios bucles, más largos o
cortos. En la figura 32 podemos observar que entre “0”
Si las instrucciones que reinician el tempori- (0V) y “1” (5V) hay varios niveles de tensión
zador perro guardián se colocan en lugares intermedios. Un convertidor analógico-digital es
estratégicos del programa, aparte los comandos un circuito electrónico encargado de convertir
que se ejecutan regularmente, el funcionamien- las señales continuas en números digitales dis-
to del perro guardián no afectará a la ejecución cretos.
del programa, figura 31. En otras palabras, este circuito convierte un
Si por cualquier razón (ruidos eléctricos fre- número real en un número binario y se lo envía
cuentes en la industria) el contador de programa a la CPU para ser procesado. Este módulo, figu-
“se queda atrapado” dentro de un bucle infinito, ra 33, se utiliza para medir el voltaje en el pin de
el valor del registro continuará aumentado, el entrada.
temporizador perro guardián alcanzará el máxi- El resultado de esta medición es un número
mo valor, el registro se desbordará y, ¡aleluya! (el valor digital) utilizado y procesado más tarde
¡Ocurre el reinicio! en el programa.

22 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 23

B aSES dE loS M iCroCoNtroladorES

Figura 33 el mismo bus. Por ejemplo, si alguna


línea de programa dice que el regis-
tro de la memoria RAM llamado
“SUM” debe ser aumentado por uno
(instrucción: incf SUMA), el micro-
controlador hará lo siguiente:

1. Leer la parte de la instrucción


de programa que especifica QUÉ es
lo que debe realizar (en este caso es
la instrucción para incrementar “incf”)
2. Seguir leyendo la misma ins-
trucción que especifica sobre CUÁL
dato lo debe realizar (en este caso es
arQuItectura Interna el contenido del registro “SUMA”)
de unMIcrocontrolador 3. Después de haber sido incrementado, el
contenido de este registro se debe escribir en el
Todos los microcontroladores actuales utili- registro del que fue leído (dirección del registro
zan uno de dos modelos básicos de arquitectu- “SUMA”).
ra denominados Harvard y Von-Neumann.
Son dos maneras diferentes del intercambio El mismo bus de datos se utiliza para todas
de datos entre la CPU y la memoria: estas operaciones intermedias.

arquitectura de von-neumann arquitectura Harvard


Los microcontroladores que utilizan la arqui- Los microcontroladores que utilizan esta
tectura Von- Neumann disponen de un solo blo- arquitectura disponen de dos buses de datos
que de memoria y de un bus de datos de 8 bits, diferentes, figura 35.
figura 34.

Figura 34
Figura 35

Como todos los datos se intercambian por Uno es de 8 bits de ancho y conecta la CPU
medio de estas 8 líneas, este bus está sobre- con la memoria RAM. El otro consiste en varias
cargado, y la comunicación por si misma es muy líneas (12, 14 o 16) y conecta a la CPU y la
lenta e ineficaz. memoria ROM. Por consiguiente, la CPU puede
La CPU puede leer una instrucción o leer las instrucciones y realizar el acceso a la
leer/escribir datos de/en la memoria. memoria de datos a la vez.
Los dos procesos no pueden ocurrir a la vez Puesto que todos los registros de la memoria
puesto que las instrucciones y los datos utilizan RAM son de 8 bits de ancho, todos los datos

Capítulo 1 23
http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 24

El Mundo de los Microcontroladores

dentro del microcontrolador que se intercambian grama esté compuesto por una instrucción y un
son de la misma anchura. Durante el proceso de dato. En otras palabras, una localidad de memo-
la escritura de programa, sólo se manejan los ria - una instrucción de programa.
datos de 8 bits.
En otras palabras, todo lo que usted podrá
cambiar en el programa y a lo que podrá afectar Juego de InstruccIones
será de 8 bits de ancho. Todos los programas
escritos para estos microcontroladores serán El nombre colectivo de todas las instruccio-
almacenados en la memoria ROM interna del nes que puede entender el microcontrolador es
microcontrolador después de haber sido compi- llamado Juego de Instrucciones, figura 36.
lados a código máquina.
No obstante, estas localidades de memoria
ROM no tienen 8, sino 12, 14 o 16 bits. 4, 6 o 8
bits adicionales representan una instrucción que
especifica a la CPU qué hacer con los datos de
8 bits.
Las ventajas de este diseño son las siguien-
tes:

• 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
Figura 36
líneas más (12, 14 o 16), tanto la instrucción
como el dato se pueden leer simultáneamente al
utilizar estos bits adicionales. Por eso, todas las Cuando se escribe un programa en ensambla-
instrucciones se ejecutan en un ciclo salvo las dor, en realidad se especifican instrucciones en
instrucciones de salto que son de dos ciclos. el orden en el que deben ser ejecutadas. La res-
• El hecho de que un programa (la ROM) tricción principal es el número de instrucciones
y los datos temporales (la RAM) estén separa- disponibles. Los fabricantes aceptan cualquiera
dos, permite a la CPU poder ejecutar dos ins- de los dos enfoques descritos a continuación:
trucciones simultáneamente. Dicho de manera
sencilla, mientras que se realiza la lectura o rIsc (reduced Instruction set computer)
escritura de la RAM (que marca el fin de una ins- - computadora con Juego de Instrucciones
trucción), la siguiente instrucción se lee por reducidas
medio de otro bus. En este caso la idea es que el microcontrola-
• En los microcontroladores que utilizan la dor reconoce y ejecuta sólo operaciones básicas
arquitectura de von-Neumann, nunca se sabe (sumar, restar, copiar etc.) Las operaciones más
cuánta memoria ocupará algún programa. complicadas se realizan al combinar éstas (por
Generalmente, la mayoría de las instrucciones ejemplo, multiplicación se lleva a cabo al realizar
de programa ocupan dos localidades de memo- adición sucesiva).
ria (una contiene información sobre QUÉ se Es como intentar explicarle a alguien con
debe realizar, mientras que la otra contiene pocas palabras cómo llegar al aeropuerto en
información sobre CUÁL dato se debe realizar). una nueva ciudad. Sin embargo, no todo es tan
Sin embargo, esto no es una fórmula rígida, sino oscuro. Además, el microcontrolador es muy
el caso más frecuente. En los microcontrolado- rápido así que no es posible ver todas las “acro-
res que utilizan una arquitectura Harvard, el bus bacias” aritméticas que realiza.
de la palabra de programa es más ancho que un El usuario sólo puede ver el resultado final de
byte, lo que permite que cada palabra de pro- todas las operaciones. Por último, no es tan difí-

24 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 25

B aSES dE loS M iCroCoNtroladorES

cil explicar dónde está el aeropuerto si se utili- lo siguiente: cuántas entradas/líneas son nece-
zan las palabras adecuadas tales como: a la sarias para su funcionamiento, realizaría el dis-
derecha, a la izquierda, el kilómetro etc. positivo otras operaciones además
encender/apagar un relé, necesita algún modulo
cIsc (complex Instruction set computer) especializado tal como el de comunicación en
- computadoras con un juego de instruccio- serie, convertidor A/D etc. Cuando usted tiene
nes complejo una clara imagen de lo que quiere, el rango de
¡CISC es opuesto a RISC! Los microcontro- selección se reduce considerablemente, y le
ladores diseñados para reconocer más de 200 queda pensar en el precio. ¿Va a tener varios
instrucciones diferentes realmente pueden reali- dispositivos? ¿Varios cientos? ¿Un millón? De
zar muchas cosas a alta velocidad. No obstante, todos modos ahora es más claro.
uno debe saber cómo utilizar todas las posibili- Si está pensando en todas estas cosas por
dades que ofrece un lenguaje tan rico, lo que no primera vez, todo le parecerá un poco confuso.
es siempre tan fácil. Por esa razón, vaya paso a paso. Antes que
nada, seleccione al fabricante, es decir, la fami-
lia de microcontroladores que ofrece. Luego,
¿cóMo se deBe elegIr aprenda a trabajar con un modelo particular.
unMIcrocontrolador? Sólo aprenda lo que necesite aprender, no entre
demasiado en detalles. Resuelva el problema
Si usted es principiante y ha tomado decisión específico y le pasará una cosa increíble - será
de trabajar con los microcontroladores. ¡felicita- capaz de manejar cualquier modelo del mismo
ciones por la elección! No obstante, a primera fabricante...
vista, no es fácil la elección del microcontrolador Más o menos, todo se parece a montar en
más adecuado como parece a la primera vista. bicicleta: después de varias caídas inevitables en
¡El problema no es el pequeño rango de dispo- el principio, será capaz de mantener el equilibrio
sitivos a elegir, sino todo lo contrario! y montar en cualquier otra bicicleta. ¡Por supues-
Antes de empezar a diseñar un dispositivo to, nunca se olvida tanto de montar en bicicleta,
basado en un microcontrolador, tome en cuenta como de la destreza de programación! J

Capítulo 1 25
http://librosysolucionarios.net
Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 26

http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 27

Capítulo 2

eL mundo de LoS microcontroLadoreS

SiStemaS de Programación:
Lenguaje mikroc
Usted seguramente sabe que no es suficiente sólo conectar el microcontrolador a los
otros componentes y encender una fuente de alimentación para hacerlo funcionar,
¿verdad? Hay que hacer algo más. 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 Programación ancho. Cada palabra se interpreta por la CPU


como una instrucción a ser ejecutada durante el
El microcontrolador ejecuta el programa car- funcionamiento del microcontrolador. Todas las
gado en la memoria flash. Esto se denomina el instrucciones que el microcontrolador puede
código ejecutable y está compuesto por una reconocer y ejecutar se les denominan colecti-
serie de ceros y unos, aparentemente sin signi- vamente Conjunto de instrucciones. Como es
ficado. Dependiendo de la arquitectura del más fácil trabajar con el sistema de numeración
microcontrolador, el código binario está com- hexadecimal, el código ejecutable se representa
puesto por palabras de 12, 14 o 16 bits de con frecuencia como una serie de los números

Capítulo 2 27
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 28

El Mundo de los Microcontroladores

hexadecimales denominada código Hex. En los lenguaje ensamblador tiene algunas desventa-
microcontroladores PIC con las palabras de pro- jas a saber:
grama de 14 bits de anchura, el conjunto de ins-
trucciones tiene 35 instrucciones diferentes. * Incluso una sola operación en el programa
escrito en ensamblador consiste en muchas ins-
trucciones, haciéndolo muy largo y difícil de
Lenguaje ensambLador manejar.
* Cada tipo de microcontrolador tiene su pro-
Como el proceso de escribir un código ejecu- pio conjunto de instrucciones que un programa-
table era considerablemente arduo, en conse- dor tiene que conocer para escribir un programa
cuencia fue creado el primer lenguaje de pro- * Un programador tiene que conocer el hard-
gramación denominado ensamblador (ASM). ware del microcontrolador para escribir un pro-
Siguiendo la sintaxis básica del ensamblador, grama
era más fácil escribir y comprender el código.
Las instrucciones en ensamblador consisten en En la figura 2 podemos observar un progra-
las abreviaturas con significado y a cada ins- ma escrito en C y el mismo programa compilado
trucción corresponde una localidad de memoria. al código ensamblador.
Un programa denominado ensamblador compila Los lenguajes de programación de alto nivel
(traduce) las instrucciones del lenguaje ensam- (Basic, Pascal, C etc.) fueron creados con el
blador a código máquina (código binario). Vea la propósito de superar las desventajas del ensam-
figura 1. Este programa compila instrucción a blador.
instrucción sin optimización. Como permite con- En lenguajes de programación de alto nivel
trolar en detalle todos los procesos puestos en varias instrucciones en ensamblador se sustitu-
marcha dentro del chip, este lenguaje de pro- yen por una sentencia. El programador ya no
gramación todavía sigue siendo popular. tiene que conocer el conjunto de instrucciones o
características del hardware del microcontrola-
dor utilizado. Ya no es posible conocer exacta-
Ventajas de Los Lenguajes mente cómo se ejecuta cada sentencia, de
de Programación de aLto niVeL todas formas ya no importa. Aunque siempre se
puede insertar en el programa una secuencia
A pesar de la gran cantidad de beneficios, el escrita en ensamblador.

Figura 1

28 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 29

S iStEmaS dE P rogramaCióN : L ENguajE mikro C

Figura 2

Si alguna vez ha escrito un programa para un Lenguaje c


microcontrolador PIC en lenguaje ensamblador,
probablemente sepa que la arquitectura RISC El lenguaje C dispone de todas las ventajas
carece de algunas instrucciones. Por ejemplo, de un lenguaje de programación de alto nivel
no hay instrucción apropiada para multiplicar (anteriormente descritas) y le permite realizar
dos números. algunas operaciones tanto sobre los bytes como
Por supuesto, para cada problema hay una sobre los bits (operaciones lógicas, desplaza-
solución y éste no es una excepción gracias a la miento etc.).
aritmética que permite realizar las operaciones Las características de C pueden ser muy úti-
complejas al descomponerlas en un gran núme- les al programar los microcontroladores.
ro operaciones más simples. En este caso, la Además, C está estandarizado (el estándar
multiplicación se puede sustituir con facilidad ANSI), es muy portable, así que el mismo códi-
por adición sucesiva (a x b = a + a + a + ... + a). go se puede utilizar muchas veces en diferentes
proyectos.
Ya estamos en el comienzo de una historia Lo que lo hace accesible para cualquiera que
muy larga... conozca este lenguaje sin reparar en el propósi-
No hay que preocuparse al utilizar uno de to de uso del microcontrolador. C es un lengua-
estos lenguajes de programación de alto nivel je compilado, lo que significa que los archivos
como es C, porque el compilador encontrará fuentes que contienen el código C se traducen a
automáticamente la solución a éste problema y lenguaje máquina por el compilador. Todas
otros similares. Para multiplicar los números a y estas características hicieron al C uno de los
b, basta con escribir a*b ó axb. lenguajes de programación más populares.

Capítulo 2 29
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 30

El Mundo de los Microcontroladores

Figura 3

La figura 3 es un ejemplo general de lo que un lenguaje de programación de alto nivel a bajo


sucede durante la compilación de programa de nivel.

caracteríSticaS deL Lenguaje mikroc


A continuación vamos a presentar a los elementos principales del lenguaje mikroC
desarrollado por Mikroelektronika.

Este lenguaje es muy similar al C estándar, no obstante en determinados aspectos difiere del
ANSI estándar en algunas características, figura 4. Algunas de estas diferencias se refieren a las
mejoras, destinadas a facilitar la programación de los microcontroladores PIC, mientras que las
demás son la consecuencia de la limitación de la arquitectura del hardware de los PIC. Aquí vamos
a presentar características específicas del lenguaje mikroC en la programación de los microcontro-
ladores PIC.

Figura 4

30 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 31

S iStEmaS dE P rogramaCióN : L ENguajE mikro C

El término C se utilizará para referirse a las características comunes de los lenguajes C y mikroC.
Este libro describe una aplicación muy concreta del lenguaje de programación C utilizado en el com-
pilador “mikroc Pro for Pic”. En este caso, el compilador se utiliza para la programación 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 pró-
ximo capítulo, veremos otras formas de trabajar con microcontroladores PIC.

Fases de La comPiLación

El proceso de compilación consiste en varios pasos y se ejecuta automáticamente por el compi-


lador, figura 5. Por consiguiente, un conocimiento básico del funcionamiento puede ser útil para
entender el concepto del lenguaje mikroC.

Figura 5

El archivo fuente contiene el código en mikroC que usted escribe para programar el microcon-
trolador. El preprocesador se utiliza automáticamente por el compilador al iniciarse el proceso de la
compilación. El compilador busca las directivas del preprocesador (que siempre empiezan por ‘#’)
dentro del código y modifica el código fuente de acuerdo con las directivas.
En esta fase se llevan a cabo inclusión de archivos, definición de constantes y macros etc., lo
que facilita el proceso.
Más tarde vamos a describir estas directivas en detalle. El analizador sintáctico (parser) elimi-
na toda la información inútil del código (comentarios, espacios en blanco). Luego, el compilador
traduce el código a un archivo binario denominado archivo .mcl. El enlazador (linker) recupera toda
la información requerida para ejecutar el programa de los archivos externos y la agrupa en un solo
archivo (.dbg).
Además, un proyecto puede contener más de un archivo fuente y el programador puede utilizar
funciones predefinidas y agrupadas dentro de los archivos denominados librerías. Por último, el
generador “.hex” produce un archivo .hex. Es el archivo que se va a cargar en el microcontrola-
dor.
El proceso entero de la compilación 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 tro-


zos más pequeños. Supongamos que es necesario escribir un programa para el microcontrolador
para medir la temperatura y visualizar los resultados en un LCD. El proceso de medición se realiza
por un sensor que convierte temperatura en voltaje. El microcontrolador utiliza el convertidor A/D
para convertir este voltaje (valor analógico) en un número (valor digital) que luego se envía al LCD

Capítulo 2 31
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 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 acción específica:

Activar y configurar el convertidor A/D incorporado;


Medir el valor analógico;
Calcular temperatura; y
Enviar los datos en el formato apropiado al LCD.

Los lenguajes de programación de alto nivel


como es C le permiten solucionar este proble-
ma con facilidad al escribir cuatro funciones
que se ejecutarán cíclicamente 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 función. Todos los pro-
gramas escritos en mikroC contienen por lo
menos una función llamada main() que encie-
rra entre llaves {} las sentencias a ser ejecuta-
das. Esto es la primera función a ser ejecutada
al iniciarse la ejecución de programa. Las otras
funciones se pueden llamar dentro de la fun-
ción main. En otras palabras, podemos decir
Figura 6
que la función main() es obligatoria, mientras
que las demás son opcionales. Si todavía no ha escrito un programa en C, es probable que todo le
resulte confuso. No se preocupe, acéptelo tal como es por el momento y más tarde entenderá la
sintaxis.

¡Y ahora, haga su primer programa ‘real’!


La figura 7 muestra la estructura de un programa, señalando las partes en las que consiste.

Figura 7

32 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 33

S iStEmaS dE P rogramaCióN : L ENguajE mikro C

La manera de escribir el código en C es muy importante. Por ejemplo, C difiere entre minúscu-
las y mayúsculas, así que la función main() no se puede escribir MAIN() o Main(). Además, note
que dos líneas del código dentro de la función terminan con un punto y coma. En C todas las sen-
tencias deben terminar con un punto y coma ‘;’, así el compilador puede aislarlas y traducirlas a
código máquina.
Para comprender mejor esta estructura mire la figura 8 en la que se expresan diferentes obser-
vaciones dentro del programa.
Figura 8

comentarios

Los comentarios son las partes del programa utilizados para aclarar las instrucciones de pro-
grama o para proporcionar más información al respecto. El compilador no hace caso a los comen-
tarios y no los compila al código ejecutable.
Dicho de manera sencilla, el compilador es capaz de reconocer los caracteres especiales utili-
zados para designar dónde los comentarios comienzan y terminan y no hace nada de caso al texto
entre ellos durante la compilación. Hay dos tipos de tales caracteres. Unos designan los comenta-
rios largos que ocupan varias líneas de programa marcados por la secuencia especial /*...*/, mien-
tras que otros designan los comentarios cortos que caben en una sola línea //. Aunque los comen-
tarios no pueden afectar a la ejecución 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.

Capítulo 2 33
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 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 tamaño de dato (número de bytes reque-
rido en la memoria) y su representación. Hay varios tipos de datos que se pueden utilizar en el len-
guaje de programación mikroc dependiendo del tamaño 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 básica.

Tabla 1

Al añadir un prefijo (calificador) a cualquier tipo de dato entero o carácter, el rango de sus posi-
bles valores cambia así como el número 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 sólo positivo. Note en la tabla 2 que el prefijo es opcional.

Tabla 2

tipo entero (int)


Un entero es un número sin parte fraccionaria que puede estar expresado en los siguientes for-
matos, a saber:

Hexadecimal (base 16): el número empieza con 0x (o 0X). Los enteros hexadecimales consis-
ten en los dígitos (de 0 a 9) y/o las letras (A, B, C,D, E, F). Por ejemplo: ‘0x1A’.
Decimal (base 10): el número consiste en los dígitos (de 0 a 9). El primer dígito no puede ser
0. En este formato, se puede introducir el signo de número (‘+’ o ‘-’). Por ejemplo: 569, -25, +1500.
Octal (base 8): los números se representan a base 8 utilizando sólo 8 dígitos (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 continuación un juego de sentencias que pueden corresponder a una parte de un progra-
ma en la que se muestran los diferentes formatos:

34 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 35

S iStEmaS dE P rogramaCióN : L ENguajE mikro C

0x11 // formato hexadecimal equivale a decimal 17


11 // formato decimal
-152 // formato decimal
011 // formato octal equivale a decimal 9
0b11 // formato binario equivale a decimal 3

tipo punto flotante (float)


El tipo punto flotante (float) se utiliza para los números 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. // = 0.0
-1.23 // = -1.23
23.45e6 // = 23.45 * 10^6
2e-5 // = 2.0 * 10^-5
3E+10 // = 3.0 * 10^10
.09E34 // = 0.09 * 10^34

tipo carácter (char)


El tipo char es considerado como un entero por el compilador. No obstante, se utiliza normal-
mente para los datos de tipo carácter. Un dato de tipo carácter está encerrado entre comillas y codi-
ficado en un carácter ASCII:

59 // entero
'p' // carácter ASCII 'p'

Una secuencia de caracteres es denominada cadena (string). Las cadenas están encerradas
entre comillas dobles:

"Presione el botón RA0"

VariabLes y constantes

definiciones
Una variable es un objeto nombrado capaz de contener un dato que puede ser modificado duran-
te la ejecución de programa. En C, las variables tienen tipo, que significa que es necesario especi-
ficar 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 líneas de programa consecutivas. En la primera línea del programa


se define el tipo de variable */

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


a = 15; // a equivale a 15

Capítulo 2 35
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 36

El Mundo de los Microcontroladores

Una constante tiene las mismas características que una variable excepto el hecho de que su
valor asignado no puede ser cambiado durante la ejecución de programa. A diferencia de las varia-
bles, 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
automáticamente el tipo de dato de una constante, así que no es necesario especificar el tipo adi-
cionalmente.

/* dos líneas de programa consecutivas */

const A = 1000 // el valor de la constante A está definido


A = 15; // ¡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 cons-
tantes. Refiérase 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 res-
tricciones a saber:

* Los identificadores pueden incluir cualquiera de los caracteres alfabéticos A-Z (a-z), los dígitos
0-9 y el carácter subrayado ‘_’. El compilador es sensible a la diferencia entre minúsculas y mayús-
culas. Los nombres de funciones y variables se escriben con frecuencia con minúsculas, mientras
que los nombres de constantes se escriben con mayúsculas.
* Los identificadores no pueden empezar con un dígito.
* 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 válidos e inválidos los puede ver a continuación:

36 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 37

S iStEmaS dE P rogramaCióN : L ENguajE mikro C

temperatura_V1 // OK
Presión // OK
no_corresponder // OK
dat2string // OK
SuM3 // OK
_vtexto // OK
7temp // NO -- no puede empezar con un número
%más_alto // NO -- no pueden contener caracteres especiales
if // NO -- no puede coincidir con una palabra reservada
j23.07.04 // NO -- no puede contener caracteres especiales (punto)
nombre de variable // NO -- no puede contener espacio en blanco

declaración 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 más bytes).
Al escribir un programa, usted sabe qué tipo de datos quiere utilizar y qué tipo de datos espera como
resultado de una operación, mientras que el compilador no lo sabe. No se olvide de que el progra-
ma maneja las variables con los nombres asignados. El compilador las reconoce como números en
la memoria RAM sin conocer su tamaño y formato. Para mejorar la legibilidad de código, las varia-
bles se declaran con frecuencia al principio de las funciones:

<tipo> variable;

Es posible declarar más 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 declaración. Esto no es un paso obligatorio, sino ‘una cuestión de bue-
nas costumbres’. Se parece a lo siguiente:

unsigned int peso; // Declarar una variable llamada peso


peso = 20; // Asignar el valor 20 a la variable peso

Un método más rápido se le denomina declaración con inicialización (asignación 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_mínimo_de_petróleo = 0;

Tenga cuidado de no declarar la misma variable otra vez dentro de la misma función. 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 ejecución de programa.

Capítulo 2 37
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 38

El Mundo de los Microcontroladores

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

declaración de constantes
Similar a las variables, las constantes deben ser declaradas antes de ser utilizadas en el pro-
grama. 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 declaración. Dos siguientes declaraciones son equivalentes:

const int MINIMUM = -100; // Declarar constante MINIMUM


const MINIMUM = -100; // Declarar constante MINIMUM

Las constantes pueden ser de cualquier tipo, incluyendo cadenas:

const T_MAX = 3.260E1; // constante de punto flotante T_MAX


const I_CLASS = ‘A’; // constante carácter I_CLASS
const Mensaje = “Presione el botón IZQUIERDA”; // constante de cadena Mensaje

Las constantes de enumeración son un tipo especial de constantes enteras que hace un pro-
grama más comprensible al asignar los números ordinales a las constantes. Por defecto, el valor 0
se asigna automáticamente a la primera constante entre llaves, el valor 1 a la segunda, el valor 2 a
la tercera etc.

enum surtidores {AGUA,GASÓLEO,CLORO}; // AGUA = 0; GASÓLEO = 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, después se reinicia a partir
del valor asignado. Vea el siguiente ejemplo:

enum surtidores {AGUA,GASÓLEO=0,CLORO}; // AGUA = 0; GÁSOLEO = 0; CLORO = 1

Las constantes de enumeración se utilizan de la siguiente manera:

int Velocidad_de_ascensor
enum motor_de_ascensor {PARADA,INICIO,NORMAL,MÁXIMO};
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 ejem-
plo, podemos escribir la siguiente sentencia:

typedef unsigned int positivo; // positivo es un sinónimo para el tipo sin signo int
positivo a,b; // Variables a y b son de tipo positivo
a = 10; // Variable a equivale a 10
b = 5; // Variable b equivale a 5

38 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 39

S iStEmaS dE P rogramaCióN : 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 deter-
minado por el lugar en el que se declara una variable o una constante. Intentar acceder a una varia-
ble o una constante fuera de su ámbito resulta en un error. Una variable o una constante es invisi-
ble fuera de su ámbito.
Todas las variables y constantes que pensamos utilizar en un programa deben ser declaradas
anteriormente en el código. Las variables y constantes pueden ser globales o locales. Una variable
global se declara en el código fuente, fuera de todas las funciones, mientras que una variable local
se declara dentro del cuerpo de la función o dentro de un bloque anidado en una función. Vea la
figura 9.

Figura 9

A las variables globales se les puede acceder de cualquier parte en el código, aún 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 están declaradas en el principio del cuerpo de función (igual que en la función
main) su ámbito está entre el punto de declaración y el fin de esa función. Refiérase al ejemplo
anterior. A las variables locales declaradas en main() no se les puede acceder desde la Función_1
y al revés.

Un bloque compuesto es un grupo de declaraciones y sentencias (que pueden ser bloques tam-
bién) encerradas entre llaves. Un bloque puede ser una función, una estructura de control etc. Una
variable declarada dentro de un bloque se considera local, o sea, ‘existe’ sólo dentro del bloque. Sin
embargo, las variables declaradas fuera del ámbito todavía 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 excepción de las constantes globales
(declaradas fuera de cualquier función). Las constantes se declaran normalmente en el inicio del
código fuera de cualquier función (como variables globales).

Capítulo 2 39
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 40

El Mundo de los Microcontroladores

cLases de aLmacenamiento

Las clases de almacenamiento se utilizan para definir el ámbito y la vida de variables, constan-
tes y funciones dentro de un programa. En mikroC se pueden utilizar diferentes clases de almace-
namiento:

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 duración 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 función declarada en otro
archivo. Por supuesto, para compilar y enlazar este archivo correctamente, el mismo debe ser inclui-
do 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 función declaradas se usa en File_2.

File 1:
extern int cnt; // Variable cnt es visible en File_1
extern void hello(); // Función hello()se puede utilizar en File_1

void main(){
PORTA = cnt++; // Cualquier modificación de cnt en File_1 será visible en File_2
hello(); // Función 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 símbolo que denota una operación aritmética, lógica u otra operación parti-
cular. Dicho de manera sencilla, varias operaciones aritméticas y lógicas se realizan por medio de

40 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 41

S iStEmaS dE P rogramaCióN : L ENguajE mikro C

los operadores. Hay más de 40 operaciones disponibles en el lenguaje C, pero se utiliza un máxi-
mo de 10 a 15 de ellas en la práctica. Cada operación se realiza sobre uno o más operandos que
pueden ser variables o constantes. Además, cada operación se caracteriza por la prioridad de eje-
cución y por la asociatividad.

operadores aritméticos
Los operadores aritméticos se utilizan en las operaciones aritméticas y siempre devuelven resul-
tados numéricos. Hay dos tipos de operadores, los unitarios y los binarios. A diferencia de las ope-
raciones unitarias que se realizan sobre un operando, las operaciones binarias se realizan sobre
dos operandos. En otras palabras, se requieren dos números para ejecutar una operación binaria.
Por ejemplo: a+b o a/b. Vea en la tabla 4 cuáles son los operadores aritméticos:

Tabla 4

int a,b,c; // Declarar 3 enteros a, b, c


a = 5; // Inicializar a
b = 4; // Inicializar b
c = a + b; // c = 9
c = c%2; // c = 1. Esta operación se utiliza con frecuencia
// para comprobar la paridad. En este caso, el
// resultado es 1 lo que significa que la variable
// es un número imparo

operadores de asignación
Hay dos tipos de asignación en el lenguaje C:

* Los operadores simples asignan los valores a las variables utilizando el carácter común ‘=’. Por
ejemplo: a =8
* Las asignaciones compuestas son específicas para el lenguaje C. Consisten en dos caracte-
res como se muestra en la tabla 5.

Tabla 5

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


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

Capítulo 2 41
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 42

El Mundo de los Microcontroladores

Se utilizan para simplificar la sintaxis y habilitar la ejecución más rápida. 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 caracte-
res pueden preceder o seguir a una variable.
En primer caso (++x), la variable x será incrementada por 1 antes de ser utilizada en la expre-
sión. De lo contrario, la variable se utilizará en la expresión antes de ser aumentada por 1. Lo mismo
se aplica a la operación de decremento, tabla 6.

Tabla 6

int a, b, c;
a = b = 5;
c = 1 + a++; // c = 6
b = ++c + a // b = 7 + 6 = 13

operadores relacionales
Los operadores relacionales se utilizan en comparaciones con el propósito de comparar dos
valores, tabla 7.

Tabla 7

int prop;
int var = 5;
prop = var < 10; // Expresión es evaluada como verdadera, prop = 1

En mikroC, si una expresión es evaluada como falsa (false), el operador devuelve 0, mientras
que si una oración es evaluada como verdadera (true), devuelve 1. Esto se utiliza en expresiones
tales como ‘si la expresión es evaluada como verdadera, entonces...’

operadores Lógicos
Hay tres tipos de operaciones lógicas en el lenguaje C: y (and) lógico, o (or) lógico y nega-
ción - no (not) lógico. Los operadores lógicos devuelven verdadero (1 lógico) si la expresión eva-
luada es distinta de cero. En caso contrario, devuelve falso (0 lógico) si la expresión evaluada equi-
vale a cero. Esto es muy importante porque las operaciones lógicas se realizan generalmente sobre

42 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 43

S iStEmaS dE P rogramaCióN : L ENguajE mikro C

las expresiones, y no sobre las variables (números) particulares en el programa. Por lo tanto, las
operaciones lógicas se refieren a la veracidad de toda la expresión.
Por ejemplo: 1 && 0 es igual a (expresión verdadera) && (expresión falsa)
El resultado 0, o sea - Falso en ambos casos. En la tabla 8 tiene la correspondencia de estos
operadores lógicos.

Tabla 8

operadores de manejo de bits


A diferencia de las operaciones lógicas que se realizan sobre los valores o expresiones, las ope-
raciones de manejo de bits se realizan sobre los bits de un operando. Se enumeran en la tabla 9.

Tabla 9

¿cómo utilizar los operadores?


Aparte de los operadores de asignación, dos operadores no deben estar escritos uno junto al
otro, por ejemplo:

x*%12; // esta expresión generará un error

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


Similar a las expresiones aritméticas, los operadores se agrupan juntos por medio de paréntesis
como se puede observar a continuación:

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 paréntesis. Si es necesario, se pueden uti-
lizar los paréntesis múltiples (anidados).

Capítulo 2 43
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 44

El Mundo de los Microcontroladores

Tabla 10

conVersión de tiPos de datos

Algunas operaciones implican conversión 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 conversión automática cuando se requiera. Si dos operandos de tipo dife-
rente se utilizan en una operación aritmética, el tipo de operando de la prioridad más baja se con-
vierte automáticamente en el tipo de operando de la prioridad más alta. Los tipos de datos princi-
pales se colocan según el orden jerárquico mostrado en la figura 11.

La autoconversión se realiza asimismo en las operaciones de asignación. El resultado de la


expresión de la derecha del operador de la asignación siempre se convierte en el tipo de la varia-
ble de la izquierda del operador. Si el resultado es de tipo de la prioridad más 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 números que siguen al punto decimal:

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


x = 3; // A la variable x se le asigna el valor 3
x+ = 3.14; // El valor 3.14 se agrega a la variable x al
// realizar la operación de asignación

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


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

44 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 45

S iStEmaS dE P rogramaCióN : L ENguajE mikro C

Para realizar una conversión explícita, antes de escribir una expresión o una variable hay que
especificar el tipo de resultado de operación entre paréntesis:

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 expresión. En otras palabras, ‘Si se cum-
ple la condición (...), se debe hacer (...). De lo contrario, si la condición 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(expresión) operación;

Si el resultado de la expresión encerrada entre paréntesis es verdadero (distinto de 0) la opera-


ción se realiza y el programa continúa con la ejecución. Si el resultado de la expresión es falso (0),
la operación no se realiza y el programa continúa inmediatamente con la ejecución.
Como hemos mencionado, la otra forma combina tanto el operador if como el else:

if(expresión) operación1 else operación2;

Si el resultado de la expresión es verdadero (distinto de 0), se realiza operación1, de lo contra-


rio se realiza la operación2. Después de realizar una de las operaciones, el programa continúa con
la ejecución.
La sentencia if-else se parece a lo siguiente:

if(expresión)
operación1
else
operación2

Si operación1 u operación2 está compuesta, escriba una lista de sentencias encerradas entre
llaves. Por ejemplo:

Capítulo 2 45
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 46

El Mundo de los Microcontroladores

if(expresión) {
... //
... // operación1
...} //
else
operación2

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

(expresión1)? expresión2 : expresión3

Si el valor de la expresión1 es distinto de 0 (verdadero), el resultado de la expresión entera será


equivalente al resultado obtenido de la expresión2. De lo contrario, si la expresión1 es 0 (falso), el
resultado de la expresión entera será equivalente al resultado obtenido de la expresión3. Por ejem-
plo:

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 ope-
rador switch permite elegir entre varias opciones. La sintaxis de la sentencia switch es:

switch (selector) // Selector es de tipo char o int


{
case constante1:
operación1 // El grupo de operadores que se ejecutan si
... // el selector y la constante1 son equivalentes

break;

case constante2:

operación2 // El grupo de operadores se ejecuta si


... // el selector y la constante2 son equivalentes

break;
...
default:

operación_esperada // El grupo de operadores que se ejecuta si


... // ninguna constante equivale al selector
break;
}

La operación switch se ejecuta de la siguiente manera: primero se ejecuta el selector y se com-


para 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 operación switch. Si no coinciden, el selector se

46 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 47

S iStEmaS dE P rogramaCióN : 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 eje-
cutarán las operaciones que siguen al operador default.
También es posible comparar una expresión con un grupo de constantes. Si coincide con algu-
na de ellas, se ejecutarán las operaciones apropiadas:

switch (días) // La variable días representa un día de la semana.


{ // Es necesario determinar si es un día laborable o no lo es
case1:case2:case3:case4:case5: LCD_message = ‘Día laborable’; break;
case6:case7: LCD_message = ‘Fin de semana’; break;
default:LCD_message_1 = ‘Elija un día 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 condición para su final no se haya cum-
plido.
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 operación un par de veces en el programa. Un con-
junto de comandos que se repiten es denominado un bucle de programa. Cuántas veces se ejecu-
tará, es decir cuánto 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(expresión){
comandos
...
}

Los comandos se ejecutan repetidamente (el programa se queda en el bucle) hasta que la expre-
sión llegue a ser falsa.
Si la expresión 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 condición sigue sin
cambios dentro del bucle. La ejecución 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 ejecutarán
... // repetidamente (bucle infinito)
}

Capítulo 2 47
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 48

El Mundo de los Microcontroladores

bucle For
El bucle for se parece a lo siguiente:

for(expresión_inicial; expresión_de_condición; cambiar_expresión) {


operaciones
...
}

La ejecución de esta secuencia de programa es similar al bucle while, salvo que en este caso el
proceso de especificar el valor inicial (inicialización) se realice en la declaración. La expresión_ ini-
cial especifica la variable inicial del bucle, que más tarde se compara con la expresión_ de_condi-
ción antes de entrar al bucle. Las operaciones dentro del bucle se ejecutan repetidamente y des-
pués de cada iteración el valor de la expresión_inicial se incrementa de acuerdo con la regla cam-
biar_expresión. La iteración continúa hasta que la expresión_de_condición llegue a ser falsa.

for(k=0; k<5; k++) // La variable k se incrementa 5 veces (de 1 a 4) y


operación // cada vez se repite la expresión operación
...

La operación se ejecutará cinco veces. Luego, al comprobar se valida que la expresión k<5 sea
falsa (después 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
operación
while (cambiar_condición);

La expresión cambiar_condición se ejecuta al final del bucle, que significa que operación se eje-
cuta como mínimo una vez sin reparar en que si la condición 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 código visualiza “hello” en un
LCD 10 veces con un retardo de un segundo. Note que en este ejemplo se utilizan funciones pre-
definidas, que se encuentran en las librerías 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; // Inicialización del contador

while (i<10) { // Condición


Lcd_Out(1,3,”hello”); // Visualizar “hello” en el LCD
Delay_ms(1000); // Retardo de 1000 ms
Lcd_Cmd(_LCD_CLEAR); // Borrar el LCD
Delay_ms(500); // Retardo de 500ms
i++; // Contador se incrementa
}

48 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 49

S iStEmaS dE P rogramaCióN : L ENguajE mikro C

for(i=0; i<10; i++) { // Inicialización, condición, incremento


Lcd_Out(1,3,”hello”); // Visualizar “hello” en el LCD
Delay_ms(1000); // Retardo de 1000 ms
Lcd_Cmd(_LCD_CLEAR); // Borrar el LCD
Delay_ms(500); // Retardo de 500ms
}
i = 0; // Inicialización del contador

do {
Lcd_Out(1,3,”hello”); // Visualizar “hello” en el LCD
Delay_ms(1000); // Retardo de 1000 ms
Lcd_Cmd(_LCD_CLEAR); // Borrar LCD
Delay_ms(500); // Retardo de 500ms
i++; // Contador se incrementa
}
while (i<10); // Condición

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 también. En
éstas la sentencia break se utiliza para salir de las sentencias switch si la condición case es verda-
dera. En este ejemplo, “Esperar” está parpadeando en la pantalla LCD hasta que el programa detec-
te un uno lógico en el pin 0 del puerto PORTA.

while(1){ // Bucle infinito


if(PORTA.F0 == 1) // Probar si el estado lógico del pin 0 del puerto
break; // PORTA es 1; si equivale, salir del bucle
Lcd_Out(1,3,”Esperar”); // Visualizar “Esperar” en el LCD
Delay_ms(1000); // Retardo de 1000 ms
Lcd_Cmd(_LCD_CLEAR); // Borrar LCD
Delay_ms(500); // Retardo de 500ms
}

sentencia continue
La sentencia continue colocada dentro de un bucle se utiliza para saltar una iteración. A dife-
rencia de la sentencia break, el programa se queda dentro del bucle y las iteraciones continúan.

// Si x=7, puede ocurrir una división por 0.


// continue se utiliza aquí para evitar esta situación.
x=1;
while (x<=10) {
if (x == 7) { // saltar x=7 para evitar división por 0
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,3,”Division by 0”);

Capítulo 2 49
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 50

El Mundo de los Microcontroladores

Delay_ms(1000);
x++;
continue; // Después de esta línea, saltar a la sentencia while con x=8
}

a = 1/(x-7); // Esta división generará un error si x=7

/* Muchas operaciones pueden ocurrir aquí */

Lcd_Out(1,3,”Division is OK”); // Poner este mensaje en el LCD


Delay_ms(1000);
x++;
}

sentencia goto
La sentencia goto le permite hacer un salto absoluto al otro punto en el programa. Esta caracte-
rística se debe utilizar con precaución ya que su ejecución puede causar un salto incondicional sin
hacer caso a todos los tipos de limitaciones de anidación. El punto destino es identificado por una
etiqueta, utilizada como un argumento para la sentencia goto. Una etiqueta consiste en un identifi-
cador válido 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 línea de programa
// Aire acondicionado
...
Aire acondicionado: // Desde aquí sigue la parte del código que se ejecutará
// en caso de una concentración 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 con-
tiguas. Cada elemento es referenciado por un índice. Para declarar una matriz, es necesario espe-
cificar el tipo de sus elementos (denominado tipo de matriz), su nombre y el número de sus ele-
mentos 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 posición. En C, el índice va desde 0 (el primer
elemento de una matriz) a N-1 (N es el número de elementos contenidos en una matriz). El compi-
lador tiene que “saber” cuántas localidades de memoria debe alojar al declarar una matriz.

50 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 51

S iStEmaS dE P rogramaCióN : L ENguajE mikro C

El tamaño de una matriz no puede ser una variable. Por eso, se pueden utilizar dos métodos:

// método 1
int display [3]; // Declaración de la matriz display capaz de contener 3 enteros
// método 2
const DÍGITOS = 5;
char Matriz_nueva[DÍGITOS]; // Declaración de la matriz Matriz_nueva
// capaz de contener 5 enteros

Una matriz se puede inicializar a la vez que se


declara, o más 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 básicas.

void main() {
const MUESTRAS_DE_AGUA = 4; // Valor de la constante MUESTRAS_DE_AGUA es 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.

Capítulo 2 51
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 52

El Mundo de los Microcontroladores

En esta parte vamos a describir sólo las matrices bidimensionales, también denominadas tablas
o matrices. Una matriz bidimensional se declara al especificar el tipo de dato de matriz, el nombre
de matriz y el tamaño de cada dimensión.

tipo_de_matriz nombre_de_matriz [número_de_filas] [número_de_columnas];

En la declaración de esta matriz número_de_filas y número_de_columnas representan el núme-


ro de filas y columnas en las que consiste una tabla, respectivamente. Vea la siguiente matriz bidi-
mensional:

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 línea de declaración. La asignación debe ser realizada línea a línea como en el siguien-
te 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 también en la forma de una tabla de valores:

___________________________
3 42 1
7 7 19
–––––––––––––––––––––––––––

Punteros
Un puntero es una variable destinada a recibir una dirección. Un puntero “apunta” a una locali-
dad de memoria, referenciada por una dirección. En C, la dirección de un objeto se puede obtener
por medio un operador unitario &. Para acceder al contenido de la memoria en una dirección espe-
cífica (también llamado objeto apuntado), se utiliza un operador de indirección (*).

‘&n’ es la dirección de la localidad de memoria ‘n’.


‘*(&n)’ es el contenido de la dirección ‘(&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 Electrónica Nº 97


http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 53

S iStEmaS dE P rogramaCióN : 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 inicialización es muy recomendable:

puntero = &variable;

Ahora, puntero contiene la dirección de variable.


Para acceder al contenido de la variable apuntada, debe utilizar ‘*’.
El siguiente ejemplo muestra el contenido de memoria dependiendo de la acción 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 básicas sobre los punteros (aritmética
de punteros), es fácil manejar los elementos de una matriz.
Fíjese 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 contiene la dirección de voltio[0]
*(v+1) = 2; // voltio[1] = 2
voltio[2] = *v+1; // tab[2] = 1 (tab[0] + 1)
*(v+2) = *(v+1); // voltio[2] = 2
v++; // v contiene la dirección de voltio[1]
*v = 1; // voltio[1] = 1

Los punteros también pueden ser declarados con el prefijo ‘const’. En este caso, su valor no
puede ser modificado después de la inicialización, similar a una constante.
A diferencia de C, el mikroC no admite alojamiento dinámico.

estructuras
Ya hemos visto cómo agrupar los elementos dentro de matrices. No obstante, al utilizar este
método 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:

Capítulo 2 53
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 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 declaración de la estructura de datos:

struct generador {
int voltaje;
char corriente;
};

Entonces, podrá definir los objetos denominados ‘turbina’ en el código. 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, todavía 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 inicialización de los
miembros de estructura por medio de las llaves. Por ejemplo, ‘conjunto_1 ={15,‘m’};’ devuelve un
error en mikroC.

Funciones

Una función 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 más facilidad. Además, las funciones nos permiten utilizar las destrezas y el conocimiento de
otros programadores. Una función se ejecuta cada vez que se llame dentro de otra función. En C,
un programa contiene como mínimo una función, la función main(), aunque el número de funciones
es normalmente mayor. Al utilizar funciones el código se hace más corto ya que es posible llamar
una función tantas veces como se necesite. En C, el código normalmente consiste en muchas fun-
ciones. No obstante, en caso de que su programa sea muy corto y simple, puede escribir todas las
sentencias dentro de la función principal.

Función Principal
La función principal main() es una función particular puesto que es la que se ejecuta al iniciar el
programa. Además, el programa termina una vez completada la ejecución de esta función. El com-
pilador reconoce automáticamente esta función y no es posible llamarla por otra función. La sinta-
xis de esta función es la siguiente:

54 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 55

S iStEmaS dE P rogramaCióN : L ENguajE mikro C

void main (void) {

/* el primer ‘void’ significa que main no devuelve ningún valor. El segundo


‘void’ significa que no recibe ningún valor. Note que el compilador
también admite la siguiente sintaxis: ‘main()’ o ‘void main()’ o
‘main(void)’ */

..

/* —- Introduzca su programa aquí —- */

.
};

Esto significa que f es una función que recibe un número real x como parámetro y devuelve 2*x-
y. La misma función en C se parece a lo siguiente:

float f (float x, float y) // variables flotantes x y y se pueden utilizar en f


{
float r; // declarar r para almacenar el resultado
r = 2*x - y; // almacenar el resultado del cálculo en r
return r; // devolver el valor de r
}

Cada función debe ser declarada apropiadamente para poder interpretarla correctamente duran-
te el proceso de compilación. La declaración contiene los siguientes elementos:

* Tipo de resultado (valor devuelto): tipo de dato del valor devuelto


* Nombre de función: es un identificador que hace posible llamar a una función.
* Declaración de parámetros: se parece a la declaración de variable regular (por ejemplo: float
x). Cada parámetro consiste en una variable, constante, puntero o matriz, precedidos por la etique-
ta de tipo de dato. Se utilizan para pasar la información a la función al llamarla. Los parámetros dife-
rentes están delimitados por comas.
* Cuerpo de función: bloque de sentencias dentro de llaves.

Una función se parece a lo siguiente:

tipo_de_resultado nombre_de_función (tipo argumento1, tipo argumento2,...)


{
Sentencia;
Sentencia;
...
return ...
}

Note que una función no necesita parámetros (función main() por ejemplo), pero debe estar entre
paréntesis. En caso contrario, el compilador malinterpretaría la función. Para hacerlo más claro, puede
sustituir el espacio en blanco encerrado entre paréntesis por la palabra clave void: main (void).

Capítulo 2 55
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 56

El Mundo de los Microcontroladores

Valor devuelto
Una función puede devolver un valor (esto no es obligatorio) por medio de la palabra clave
return. Al llegar a return, la función evalúa un valor (puede ser una expresión) y lo devuelve a la línea
de programa desde la que fue llamada.

return r; // Devolver el valor contenido en r


return (2*x - y); // Devolver el valor de la expresión 2*x-y

Una función no puede devolver más de un valor, pero puede devolver un puntero o una estruc-
tura. Tenga cuidado al utilizar matrices y punteros. El siguiente ejemplo es un error típico:

int *reverse(int *tab) // Esta función debe devolver una matriz r


{ // cuyo contenido está en orden inverso con
// respecto a la matriz tab
int r[DIM]; // Declaración de una nueva matriz denominada r
int i;
for(i=0;i<DIM;i++) // Bucle que copia el contenido de tab en r
r[i] = tab[DIM-1-i]; // al invertir el orden

return r; // Devolver el valor r


}

En realidad, el compilador reserva memoria para el almacenamiento de variables de la función


reverse sólo durante su ejecución. Una vez completada la ejecución de reverse, la localidad de
memoria para la variable i o para la matriz r ya no está reservada. Esto significa que la dirección
que contiene los valores de i o r[] está libre para introducir datos nuevos. Concretamente, la función
devuelve sólo el valor &r[0], así que sólo el primer elemento de la matriz tab será almacenado en la
memoria. Las demás localidades de memoria, tales como &tab[1], &tab[2], etc. serán consideradas
por el compilador como espacios en blanco, o sea, estarán listas para recibir los nuevos valores.
Para escribir esta función es necesario pasar la matriz r [] como parámetro (vea la subsección
Pasar los parámetros).
La función puede contener más de una sentencia return. En este caso, al ejecutar la primera sen-
tencia return, la función devuelve el valor correspondiente y se detiene la ejecución de la función.

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 función no devuelve ningún valor, la palabra void debe ser utilizada como un tipo de resul-
tado en la declaración. En este caso, la sentencia return no debe ser seguida por ninguna expre-
sión. Puede ser omitida como en el siguiente ejemplo:

void wait_1 (unsigned int a)


{

56 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 57

S iStEmaS dE P rogramaCióN : L ENguajE mikro C

cnt ++; // Incremento de una variable global cnt


Delay_ms(a) ; // Ejecución de la función Delay_ms
} // Note que Delay_ms no devuelve nada

declarar Prototipos de Funciones


Para utilizar una función, el compilador debe ser consciente de su presencia en el programa. En
la programación en C, los programadores normalmente primero escriben la función 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 función
main(). Un prototipo de función está compuesto por:

tipo de resultado
nombre de función
tipos de parámetros
un punto y coma (;)

El prototipo de la función main no necesita ser declarado.

float f (float, float);

/* no es obligatorio escribir los nombres de los parámetros. Este prototipo


informa al compilador: en el programa se utilizará la función f,
que utiliza dos parámetros de tipo float y devuelve el resultado del tipo
float. */

Llamar a una Función


Mientras una función es definida y su prototipo declarado, se puede utilizar en cualquier parte de
programa. Sin embargo, como la función main es ‘raiz’ del programa, no puede ser llamada de nin-
guna parte de programa. Para ejecutar una función, es necesario escribir su nombre y los paráme-
tros asociados. Vea los siguientes ejemplos:

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


// definidos
int time = 100; // en la declaración de las funciones f y wait_1
a = 10.54;
b = 5.2;
resultado = f(a,b); // Ejecutar la función f por medio de los parámetros a y b
// El valor devuelto se le asigna a la variable resultado
pausa_1(tiempo); // Ejecutar la función pausa_1 por medio de la variable tiempo
funciónX(); // Ejecutar la función funciónX (sin parámetros)

Cuando se llama una función, el programa salta a la función llamada, la ejecuta, después vuel-
ve a la línea desde la que fue llamada.

Pasar los Parámetros


Al llamar una función, se le pasan los parámetros. En C existen dos formas diferentes para pasar
parámetros a una función.

Capítulo 2 57
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 58

El Mundo de los Microcontroladores

El primer método, denominado ‘paso por valor’, es el más fácil. En este caso, los parámetros se
pueden considerar como variables locales de la función. Cuando se llama una función, el valor de
cada parámetro se copia a un nuevo espacio de memoria reservado durante la ejecución de la fun-
ción. Como los parámetros se consideran como variables locales por el compilador, sus valores
pueden ser modificados dentro de la función, pero sus modificaciones no se quedan en la memoria
una vez completada la ejecución de la función.
Tenga en cuenta de que la función devuelve un valor, y no una variable. Además, se crean copias
de los valores de los parámetros, por lo que sus nombres en la función f pueden ser diferentes de
los parámetros utilizados en la main(). La mayor desventaja del ‘paso por el valor’ es que la única
interacción que una función tiene con el resto del programa es el valor devuelto de un solo resulta-
do (o la modificación de las variables globales).
El otro método, denominado ‘paso por dirección’ le permite sobrepasar este problema. En vez de
enviar el valor de una variable al llamar a función, se debe enviar la dirección de memoria del valor.
Entonces, la función llamada será capaz de modificar el contenido de esta localidad de memoria.

// Función ‘sort’ordena los miembros de la matriz por valor ascendente


// y devuelve el miembro con máximo valor

int sort(int *); // Prototipo de función


const SIZE = 5; // Número de miembros a ordenar

void main() {
int maximum, input[SIZE] = {5,10,3,12,0}; // Declaración de variables en la matriz
maximum = sort(input); // Llamar a función y asignarle el máximo
// valor a la variable maximum
}

int sort(int *sequence) {


int i, temp, permut; // Declaración de variables
permut = 1; // Bandera de bit indica que se ha hecho una permutación

while(permut!=0) { // Quedarse en el bucle hasta reiniciar la bandera


permut = 0; // Bandera reiniciada
for(i=0;i<SIZE-1;i++) { // 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 permutación, bandera de bit
//se pone a uno
}
}
}

return sequence[SIZE-1]; // Devolver el valor del último miembro

} // que es al mismo tiempo el miembro con el máximo valor

58 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 59

S iStEmaS dE P rogramaCióN : L ENguajE mikro C

En este ejemplo, por medio de una función se realizan dos operaciones: ordena los miembros
de la matriz por valor asdendente y devuelve el máximo valor.
Para utilizar una matriz en una función es necesario asignar la dirección a la matriz (o a su pri-
mer miembro). Vea el siguiente ejemplo:

float método_1(int[]); // Declaración de prototipo de la función Método_1


float método_2(int*); // Declaración de prototipo de la función Método_2

const NÚMERO_DE_MEDICIONES = 7; // Número de los miembros de la matriz

void main()
{
double promedio1, promedio2; // Declaración de las variables promedio1
// y promedio2
int voltaje [NÚMERO_DE_MEDICIONES] = {7,8,3,5,6,1,9}; // Declaración de la
// matriz voltaje
promedio1 = método_1(&voltaje[0]); // Parámetro de la función es la dirección
// del primer miembro
promedio2 = método_2(voltaje); // Parámetro de la función es la dirección de
// la matriz
}

//××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
float método_1(int voltaje[]) // Inicio de la función método_1
{
int i, suma; // Declaración de las variables locales i y suma

for(i=0;i<NÚMERO_DE_MEDICIONES;i++) // Cálculo del valor promedio de voltaje


suma += voltaje[i]; // Es posible utilizar *(voltaje+i)en vez de voltaje[i]

return(suma/NÚMERO_DE_MEDICIONES);
}

//××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
float método_2 (int *voltaje) //Inicio de la función método_2
{
int i, suma; // Declaración de las variables locales i y suma

for(i=0;i<NÚMERO_DE_MEDICIONES;i++) // Cálculo del valor promedio de voltaje


suma += *(voltaje+i); // Es posible utilizar voltaje[i] en vez de *(voltaje+i)

return(suma/NÚMERO_DE_MEDICIONES);
}

Las funciones ‘método_1’ y ‘método_2’ son completamente equivalentes. Las dos devuelven el
valor promedio de la matriz ‘voltaje[]’.
Después de declararla, la dirección del primer miembro se puede escribir como ‘voltaje’ o ‘&vol-
taje[0]’.

Capítulo 2 59
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 60

El Mundo de los Microcontroladores

características PrinciPaLes deL Procesador

El preprocesador es un programa que procesa el código antes de que pase por el compilador.
Funciona bajo el control de las líneas de comando del preprocesador denominadas directivas. Las
directivas del preprocesador se colocan en el código fuente, normalmente en el principio del archivo.
Antes de pasar por el compilador, el código fuente se examina por el preprocesador que detecta y eje-
cuta todas las directivas del preprocesador. Las directivas del preprocesador siguen a una regla de la
sintaxis especial, empiezan por un símbolo ‘#’ y no requieren ningún 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 categorías:

* Definiciones de macro
* Inclusiones de archivos
* Control de compilación

Ahora, vamos a presentar sólo las directivas del preprocesador utilizadas con más frecuencia.
Sin embargo, no es necesario saber todas ellas para programar microcontroladores. Sólo tenga en
cuenta que el preprocesador es una herramienta muy poderosa para los programadores avanzados
en C, especialmente para el control de compilación.

directivas del Procesador para definir marcos


Por medio de los macros es posible definir las constantes y ejecutar funciones básicas. Una sus-
titución de macro es un proceso en el que un identificador del programa se sustituye por una cade-
na predefinida. El preprocesador sustituye cada ocurrencia del identificador en el código fuente por
una cadena. Después de la sustitución, el código será compilado normalmente.
Esto significa que el código sustituido debe respetar la sintaxis del mikroC. La acción se realiza
por medio de la directiva ‘#define’.

#define PI 3.14159 // Sustitución simple, PI será sustituido por


// el valor 3.14159 en todas las partes del programa

También puede utilizar los parámetros para realizar substituciones más complejas:

#define VOLUMEN (D,H) (((D/2)*(D/2)*PI))*H // Macro con parámetros

60 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 61

S iStEmaS dE P rogramaCióN : L ENguajE mikro C

Entonces, en el código, la siguiente sentencia:

Tanque_1 = VOLUMEN (Diámetro,altura);

Será sustituida por:

Tanque_1 = (((Diámetro/2)*(Diámetro/2)*PI)*altura;

Por medio de la directiva #undef es posible quitar una definición de nombre de macro. Así se
especifica que la substitución que se ha definido anteriormente ya no va ocurrir en el siguiente códi-
go. Esto es útil cuando usted quiere restringir la definición sólo a una parte particular del programa.

#undef TANQUE // Quitar la definición del macro VOLUMEN

inclusión de archivos
La directiva de preprocesador #include copia un archivo específico en el código fuente. El códi-
go incluido debe observar la sintaxis de C para ser compilado correctamente.
Hay dos formas de escribir estas directivas. En el primer ejemplo, sólo 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 método es más
rápido).

#include <nombre_de_archivo> // Se especifica sólo el nombre del archivo


#include “C:\Ruta\nombre_de_archivo.h” // 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 pró-
ximo tomo de colección del Club Saber Electrónica vamos a presentar las características específi-
cas del mikroC con el propósito de facilitar la programación de los microcontroladores PIC. J

Capítulo 2 61
http://librosysolucionarios.net
Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 62

http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 63

Capítulo 3

eL Mundo de Los MicrocontroLadores

“Los MicrocontroLadores Pic”


Los circuitos integrados programables (Programmable Integrated Circuits = PIC) son
componentes sumamente útiles en la Electrónica de Consumo. Aun cuando son
conocidos desde hace más de veinte años, existen en la actualidad nuevos tipos que
cumplen con una serie de requisitos y características sumamente útiles. Como una
primera aproximación 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 microcontro-
ladores 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 capítulo veremos en qué consiste un PIC y cuáles son
los tipos más comunes, lo que nos permitirá abordar el tema de su programación, lo
cual se desarrollará en el próximo tomo de la colección Club Saber Electrónica.

IntroduccIón elementos indispensables para que pueda fun-


cionar como una minicomputadora en un solo
En realidad, un microprocesador y un micro- chip.
controlador no son la misma cosa. Los PICs son
microcontroladores, es decir, una unidad que Un microprocesador es solamente la unidad
posee en su interior al microprocesador y a los central de procesos o CPU, la memoria, los

Capítulo 3 63
http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 64

El Mundo de los Microcontroladores

puertos y todos los demás periféricos son exte- Figura 1


riores. La programación de un microprocesador
es, por lo tanto, una tarea compleja porque de-
ben controlarse todos estos dispositivos exter-
nos.
Un microcontrolador integra la CPU y todos
los periféricos en un mismo chip. El programa-
dor se desentiende de una gran cantidad de dis-
positivos y se concentra en el programa de tra-
bajo. Esta circunstancia da lugar a una gran pér-
dida de tiempo porque los datos tienen que ser
retirados de la memoria y llevados a la CPU
(Central Processor Unit) y viceversa. Esto signi-
fica que la computadora dedica la mayor parte tor para el reset. Por supuesto necesita una ten-
del tiempo al transporte de datos de ida o de sión de fuente de 5V (VDD) aplicada con respec-
vuelta, en lugar de usar este tiempo para traba- to al terminal de masa (VSS). Posee dos puertos
jar sobre los datos. de salida, el A y el B, cuyos terminales son mar-
Los PICs emplean un conjunto de instruccio- cados RA0 al RA4 y RB0 al RB7. Estos puertos
nes del tipo RISC (Reduced Instruction Set pueden ser programados como de entrada o de
Computer). Con el RISC se suele ejecutar la ma- salida. El terminal 4 opera como reset pero tam-
yoría de las instrucciones con un solo pulso del bién cumple funciones de carga de memoria de
clock. Con las instrucciones que se usan en programa cuando es excitado con pulsos de
otros equipos del tipo CISC (Complex Instruction 15V. El terminal RA4 (pata 3) también tiene fun-
Set Computer), se logran instrucciones más po- ciones como entrada de un temporizador y RBO
derosas, pero a costa de varios ciclos del clock. (pata 6) cumple también funciones como entra-
En el bien conocido procesador 68HC11 de Mo- da de interrupción.
torola se requieren, a veces, hasta 5 ciclos del
clock para ejecutar una instrucción. Vamos a realizar la explicación de este capí-
A los fines prácticos, nos vamos a referir a los tulo en base al microcontrolador 16F84 por ser
microcontroladores como bloques que poseen uno de los PICs de mayor renombre y por exis-
una memoria de programa, que es el lugar don- tir abundante bibliografía y proyectos disponi-
de deben alojarse los datos que le indiquen al bles gratuitamente en Internet. Sin embargo, de-
chip qué es lo que debe hacer; una memoria de bemos aclarar que existen otros chips como el
datos donde ingresen las señales que debe pro- 16F628, que son similares a éste, más económi-
cesar el programa, una unidad aritmética y lógi- cos y de mejores prestaciones. Oportunamente
ca donde se desarrollen todas las tareas, una veremos cómo “migrar” de uno a otro sin mayo-
unidad de control que se encargue de supervisar res complicaciones.
todos los procesos y puertos de entrada y salida
para que el PIC tenga contacto con el exterior Figura 2
(figura 1).
Un microcontrolador, como cualquier circuito
integrado analógico, tiene entradas, salidas y al-
gunos componentes exteriores necesarios para
procesar las señales de entrada y convertirlas
en las señales de salida (figura 2). El 16C54
(con memoria tipo OTP) y su similar 16F84 (con
memoria EEPROM tipo flash) requieren un cris-
tal con dos capacitores y como mínimo un resis-

64 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 65

LoS M iCroCoNtroLadorES PiC

También aclaramos que en el próximo tomo realizar otra tarea alternativa; cuando la termina
de la colección Club Saber Electrónica vuelve a su programa original).
analizaremos a un PIC de mejores característi- Analicemos el bloque más grande (tempori-
cas como el PIC 16F887. zadores), en éste observamos un grupo de blo-
ques dedicados a mejorar el funcionamiento pe-
Ahora bien, la mayoría de los microcontrola- ro sin influir directamente en el flujo de señales.
dores (sean de Microchip, o de National, Moto- Vemos un temporizador de encendido, un tem-
rola, Philips, etc.) se comportan de forma similar, porizador de arranque del oscilador de CLOCK,
por ello nos vamos a referir a los microcontrola- un circuito de reset y un circuito llamado de vigi-
dores PIC16F84 cuya arquitectura interna pue- lancia o WATCHDOG. Los dos primeros bloques
de observarse en la figura 3. procuran un arranque ordenado para no produ-
Observe primero los bloques externos. Exis- cir una carga al mismo tiempo sobre la fuente.
te un cristal que se conecta en OSC1 y OSC2 Por último, existe un circuito con un nombre cu-
para generar el CLOCK del sistema. Luego una rioso: “perro guardián”. Su función es estar vigi-
señal de entrada llamada MCLR negada, que es lante el máximo de tiempo que tarda el micropro-
un nombre de fantasía para nuestro conocido cesador en completar su programa (o mejor se-
RESET (debido a que esa pata tiene un doble ría decir, la derivación más larga de su progra-
uso) y, por último, dos puertos paralelos de I/O ma) y en caso de superarse ese tiempo, provo-
(entrada o salida) llamados puerto A y puerto B. car un reset automático porque el microprocesa-
Una de las patas del puerto A puede ser utiliza- dor se quedó trabado en alguna parte de su pro-
da como entrada de interrupciones (esta pata grama. También se dice que el microprocesador
especial hace que el microprocesador deje de se quedó colgado o congelado.
realizar la tarea que estaba ejecutando y pase a Este bloque de circuitos no trabaja indepen-

Figura 3

Capítulo 3 65
http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 66

El Mundo de los Microcontroladores

dientemente sino que requiere conexiones al ex- gistro W (de Work = trabajo) el segundo es el
terior y al interior del dispositivo. Por ejemplo, no presente en el instante en que se invoca la me-
siempre son utilizados y es el programa quien moria de datos. Como las operaciones pueden
determina su utilización y además ajusta sus pa- ser encadenadas (cuando el resultado sirve co-
rámetros. Esto se realiza a través del bloque de mo operando de la siguiente operación, tal como
control o decodificador de instrucciones. el caso de un producto) el registro W tiene un re-
Analicemos ahora la sección de arriba a la iz- torno a la ALU. Vemos además que la ALU está
quierda en donde observamos la memoria de comandada por el bloque MUX (MUltipleXador).
programa, el contador de programa, el registro En efecto, la ALU requiere que se le envíen nú-
de instrucciones y la pila o STACK de 8 niveles. meros para procesar que le lleguen desde la
Cuando hablamos de registros nos referimos a memoria de datos, pero antes se la debe predis-
pequeñas unidades de memoria transitoria, poner para que efectúe la operación requerida
construida por lo general, con un registro de (comparación, rotación de dígitos, etc.).
desplazamiento. Son memorias volátiles que se El registro de estado o estatus colabora du-
utilizan para guardar información por un tiempo rante las operaciones matemáticas. Piense có-
mínimo, con el fin de realizar una operación mo opera Ud. para realizar una resta: primero
compleja de varios pasos. ubica el primer número, luego el segundo y des-
El contador de programa es el responsable pués comienza a analizar los bits menos signifi-
de que el microprocesador vaya analizando las cativos (las unidades), pero si el número de arri-
instrucciones en orden ascendente. Este guarda ba es menor que el número de abajo, entonces
el número de instrucción en el STACK y la ins- toma prestado de la columna de las decenas,
trucción misma la pasa al registro de instruccio- luego debe recordar esto porque el número de
nes desde donde se envía al resto del micropro- arriba en la columna de las decenas se redujo
cesador. El STACK es, en realidad, una pila de en una unidad. En realidad, aunque se trate de
registros (en nuestro ejemplo hay 8), debido a una operación entre dos números su ejecución
que el programa puede tener derivaciones (en la requiere guardar lo que se llama acarreo en otro
jerga LOOPS, rulos o subprogramas). Cuando registro y éste no es otra cosa más que el regis-
se termina de ejecutar un loop se debe volver al tro STATUS.
mismo punto del programa en donde se había El PIC16F84 contiene además de todo lo vis-
producido la bifurcación y eso es posible porque to, una memoria RAM de registros que puede
ese número de instrucción quedó guardado en ser llamada desde el registro de instrucción a
uno de los registros de la pila. Es común que un través de un multiplexador de direcciones. Esta
loop tenga, a su vez, un loop secundario y cuan- sección sólo se utiliza en desarrollos avanzados.
do se ejecuta ese loop secundario se debe vol- Ahora bien, un microcontrolador sin programa
ver al mismo punto del loop primario, eso se no sabe hacer nada, es como un niño recién na-
consigue con guardar ese número de instrucción cido; tiene algunos reflejos condicionados como
del loop secundario en otro registro de la pila. el de succión que le permite alimentarse pero no
Analicemos ahora la sección inferior dere- sabe hacer más que eso. Nosotros deberemos
cha. En ese sector se ubican los bloques res- enseñarle a realizar acciones y lo vamos a hacer
ponsables de efectuar operaciones matemáticas como a un bebé, paso a paso. Su capacidad de
y lógicas binarias; recordemos que el nombre aprendizaje es enorme y sumamente variada.
ALU proviene de Aritmetic Logic Unite (unidad Le vamos a enseñar a llorar a intervalos regula-
arimética y lógica). En este sector es imprescin- res, a encender luces, a sumar, a restar, etc.
dible utilizar un registro ya que una operación Enseñarle significa programarlo y eso se rea-
aritmética o lógica siempre se efectúa entre dos liza con una plaqueta de programación que de-
números. Los números binarios que deben pro- pende de cada marca y modelo de microcontro-
cesarse se toman de la memoria de datos, el pri- lador. Antiguamente los microprocesadores te-
mero se acumula en el registro de trabajo o re- nían una ventanita transparente y era necesario

66 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 67

LoS M iCroCoNtroLadorES PiC

Figura 4 conectar el PIC al programador;


luego de que el PIC coloca estos
datos en la plaqueta del dispositivo,
sólo pueden ser leídos, ya que en-
tonces forman el programa del PIC.
Esta memoria (figura 4) tiene una
longitud de 1 Kbyte con palabras de
14 bits. Digamos que tiene un an-
cho de 14 bits y una altura de 1.000
Bytes o que es una memoria de
exponerlos a la luz ultravioleta para borrar su 1.000 x 14. Observe que los números de ins-
memoria e introducir un programa nuevo. Ac- trucción en hexadecimal van desde el 000 al
tualmente cuentan con memorias que no tienen 3FF, lo cual implica que existen 1.040 posiciones
este requisito. Basta con cargarlos con un pro- de memoria, valor obtenido empleando la fórmu-
grama para que se borre el anterior. Esto signifi- la:
ca que, con el mismo integrado, podremos cons-
truir diferentes dispositivos que realicen funcio- 3 x 162+16 x 161+16 x 160
nes totalmente distintas unas de otras.
Observe que dos de las posiciones de me-
moria tienen las indicaciones “vector de reset” y
La MeMorIa de PrograMa “vector de interrupción”.
Eso significa que, cuando se provoca un re-
La memoria del PIC16F84 es una EEPROM, set, el microprocesador vuelve a la posición 000
es decir, de lectura solamente (ROM = Read del programa y cuando se produce una interrup-
Only Memory) que se programa por tensión (no ción, a la posición 004. Estos retornos forzados
necesita luz ultravioleta); es decir que basta con deben ser considerados al diseñar el programa
introducir los datos con cierto nivel de tensión del microprocesador; es decir que el reset se
para que éstos borren el programa anterior y produce porque la señal externa pone el conta-
graben uno nuevo. dor de programa en 000 y todo el programa se
reinicia. En cambio, cuando ingresa una señal
¿Por qué esta memoria se llama ROM, si se por la pata de interrupción el contador de progra-
pueden grabar datos sobre ella? ma va a 004 y la acción que, en general ocurre,
Se llama ROM porque para grabarla se debe es que se comienza a leer un subprograma par-
ticular. Cuando este
subprograma termina,
Figura 5 el contador de progra-
ma recupera el número
que tenía en el momen-
to de arribar la interrup-
ción.

La MeMorIa de datos

La RAM (Random Ac-


cess Memory = memo-
ria de acceso aleatorio,
figura 5) es una memo-

Capítulo 3 67
http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 68

El Mundo de los Microcontroladores

Figura 6

ria de lectura y escritura de 64. De estos 64 re- te). Como puerto de salida, una pata puede to-
gistros, los primeros 12 son fijos y cumplen un mar 25mA del circuito o entregar 20mA al mis-
propósito determinado, en tanto que desde el 13 mo, sin embargo, en el puerto “A” sólo se pue-
hasta el 64 son registros de propósito general, den consumir 80mA en total o entregar 50mA,
en donde el programa puede indicar que se al- esto significa que sólo algunas patas pueden
macene un dato para ser tomado más tarde. trabajar al máximo porque si todas lo hicieran (y
Además, posee un conjunto de memoria SRAM son 8) el consumo total sería de 25 x 8 = 200mA.
de 36 posiciones con los que se pueden co- El puerto “B” tiene otras características máxi-
nstruir registros de 8 bits con características mas, ya que en total puede tomar 150mA o en-
EEPROM. En lo personal, prefiero designar a tregar 100mA. Como vemos, las salidas admiten
este conjunto de registros como “memoria libre”. suficiente carga como para alimentar directa-
mente a un led (figura 6). Los puertos no utiliza-
dos siempre se deben conectar a la fuente de
Los Puertos deL PIc 5V a través de un resistor de 10kΩ debido a que
se trata de un dispositivo CMOS que, de otro
El PIC16C84 tiene dos puertos paralelos de modo, podría deteriorarse por captación elec-
entrada o salida: el puerto “A” de 8 patas y el “B” trostática (figura 7).
de 5 patas. Cada pata puede ser predispuesta La pata 3 perteneciente al puerto “A” puede
por el programa para operar como de entrada o ser configurada como de entrada/salida o como
de salida.
Cada pata tiene un resistor de pull-up (resis- Figura 7
tor conectado a fuente) interno que puede ser
desconectado mediante el programa. Estos re-
sistores se desconectan automáticamente si
una pata se predispone como pata de salida de-
bido a que las salidas ya tienen posibilidad de
entregar corriente desde fuente con un transis-
tor. Todos los resistores de pull-up se conectan
o desconectan al mismo tiempo (no existe un
comando que los conecte independientemen-

68 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 69

LoS M iCroCoNtroLadorES PiC

Figura 8 Para circuitos que requieran una gran


precisión se puede trabajar con un cristal
de frecuencia baja, media o alta (figura
10). Como máximo el PIC16F84 puede
trabajar con un cristal de 10MHz. Inter-
namente la frecuencia del cristal se divi-
de por 4, por lo tanto, es muy común la
utilización de un cristal de 4MHz para ob-
tener un CLOCK interno de 1MHz que
garantiza que cada instrucción dure
exactamente 1mS. Para temporizadores
de período largo se utilizan cristales de
baja frecuencia.
de arranque de un temporizador/contador (figu-
ra 8). Cuando se programa como entrada esta
pata funciona como un disparador de SCHMITT eL reset
o Schmitt trigger, ideal para reconocer señales
distorsionadas o con crecimiento lento. Esta El PIC “se resetea” cuando la pata 4 (MCLR
misma pata también tiene una característica dis- negada) se pone a potencial bajo. Para simplifi-
tinta cuando opera como salida. Ella es la única car el circuito de reset, el PIC posee un tempori-
que trabaja a colector abierto, es decir, que no zador interno que permite realizar un reset auto-
puede emplearse como fuente, en este caso mático cuando se aplica tensión de 5V. En estos
siempre se utilizará un resistor externo. casos el circuito externo de reset sólo implica el

Figura 11
eL cLock

Los PICs poseen un


Figura 9 oscilador configura-
ble por programa de
características muy
amplias. Cuando no
se requiere mucha
precisión se puede
trabajar con un osci-
lador a RC conecta-
do según 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
Figura 10
reset manual y para ello existen dos posibilida-
des, una es utilizar sólo el temporizador interno
(por programa) y la otra es agregar una constan-
te de tiempo exterior como se muestra en la fi-
gura 12. En el segundo circuito C1 provee un re-
tardo al encendido o posterior al pulsado de re-
set porque C1 se cargará lentamente a través de
R1 con una constante de tiempo de 22kΩ x
10µF = 220mS.

Capítulo 3 69
http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 70

El Mundo de los Microcontroladores

El resistor R3 limita la corriente de descarga El PIC16F84 posee en su interior un micro-


de C1 a valores compatibles con sus caracterís- procesador, una memoria RAM (volátil) donde
ticas de corriente de pico máxima. guardaremos las variables, una memoria EE-
D1 descarga a C1 cuando la tensión de fuen- PROM (no volátil) donde guardaremos nuestro
te decae para permitir un reset inmediato cuan- programa, un timer o contador que nos facilitará
do la fuente se apaga y se enciende en rápida algunas tareas, y otros bloques de control y apo-
sucesión. R2 limita la corriente de reset, tomada yo. Algunas características más representativas
desde el microprocesador. Este segundo siste- del PIC16F84 son:
ma se suele utilizar cuando se requiere un rese-
teado remoto a través de varios metros de cable Opera a una frecuencia máxima de
que podrían captar zumbido (C1 reduce la impe- 10MHz (excepto el PIC16F84A que puede ope-
dancia del circuito de reset). rar a 20MHz).
1kbyte de memoria EEPROM para
nuestro programa (1024 posiciones).
PrIMeras concLusIones 68 bytes (de 8 bits) de memoria RAM
64 bytes de memoria EEPROM para da-
El PIC es un microcontrolador, una especie tos (no volátiles)
de "ordenador en miniatura" (con muchas comi- Programable con sólo 35 instrucciones
llas) que podremos programar. Hay muchos ti- Posee 13 pines de entrada/salida (un
pos de microcontroladores PIC, los hay de 8 pa- puerto de 8 bits + otro de 5 bits)
tas con 6 terminales para intercambio de datos Tiene un timer/contador de 8 bits
(6 terminales de entrada / salida de datos), pero
también existen dispositivos más poderosos de También posee una serie de registros y tem-
80 patas con 40 pines I/O (de entrada y salida porizadores, cuyo estudio no realizaremos en
de datos). esta obra.

GPIC USB:
ProGramador de mICroControladoreS PIC y
memorIaS eeProm Por PUerto USB
IntroduccIón dores, surgió el GPIC USB como una apli-
cación totalmente funcional hacia finales
Este proyecto comenzó a principios del de Octubre del 2008.
2008 cuando inicié la escritura del código A la fecha ha sufrido algunas modifica-
fuente para el firmware de un 18F2550 y la ciones que permite mejorar su funciona-
elaboración del Software correspondiente a miento y ampliar la cantidad de componen-
la interfaz de usuario para la PC de un pro- tes soportados.
gramador de microcontroladores Pic por
puerto USB. Anteriormente ya había esta-
do interesado en los procesos de progra- descrIPcIón deL cIrcuIto eLectrónIco
mación de los Pic por lo tanto, basado en
esas experiencias y en el estudio de los El esquema de la figura 1 corresponde al
Data Sheets referentes a las especificacio- programador de microcontroladores PIC
nes de programación de los microcontrola- por puerto USB, su diseño es simple y sen-

70 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 71

LoS M iCroCoNtroLadorES PiC

Figura 1
cillo. Lo podemos dividir en tres bloques de la interfaz de programación, establece la
fundamentales bien definidos, tal como transferencia de datos con los microcontro-
muestra la figura 2. ladores soportados y activa las tensiones
de VDD y VPP, figura 3.
Bloque 1: Microcontrolador Los pines 15 y 16 (RC4 - RC5) del puer-
El primero y más importante está consti- to C del PIC conectan con la ficha corres-
tuido por el microcontrolador 18F2550 pondiente para la transmisión y recepción
(IC2), es el encargado de la comunicación de los datos vía USB.
por el puerto USB con la PC por intermedio Los pines 2 y 3 (RA0 - RA1) del puerto A
se destinan como interfaz
de comunicación del proto-
colo ICSP entre el progra-
mador y los microcontrola-
dores soportados por éste,
a través del conector ICSP
(terminales 1 y 2, figura 1).
Los datos por el pin 2 son
bidireccionales, sincroniza-
dos por una señal de reloj
Figura 2 con salida por el pin 3.

Capítulo 3 71
http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 72

El Mundo de los Microcontroladores

Figura 3

Los pines 23, 24 y 25 (RB2 - RB3 - RB4) configuración establecida desde la interfaz
del puerto B los utilizamos para el control de usuario en la PC:
de la tensión VPP de programación. Según
el estado de estas salidas obtenemos dife- A- Sólo se suministra tensión VDD a
rentes tensiones en la salida VPP del los microcontroladores soportados durante
conector ICSP (terminal 3, figura 1). los procesos de lectura, grabación, verifica-
El pin 26 (RB5) del PIC lo utilizamos ción y borrado.
como una salida para controlar los estados B- Suministro de tensión constante,
de la tensión VDD. para poder alimentar a los circuitos durante
Continuamos con los pines 11, 12 y 13 las pruebas (sólo circuitos con bajo consu-
(RC0 - RC1 - RC2) del puerto C, son utili- mo).
zados como salidas para los LEDs de C- No se suministra tensión VDD hacia
visualización del funcionamiento del pro- los microcontroladores soportados, una
gramador. fuente externa debe proveer la alimenta-
Comenzando con el LED denominado ción.
"VDD", este se encenderá con el suministro
de esta tensión. El LED denominado VPP, se enciende
Tenemos tres estados posibles, según la durante el suministro de dicha tensión

72 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 73

LoS M iCroCoNtroLadorES PiC

durante todos los procesos. Desde la inter- desde la interfaz de usuario en la PC. Para
faz de programación en la PC podemos finalizar este bloque, el pin 17 (RC6) del
configurar el suministro de esta tensión de puerto C, lo utilizamos para generar una
dos formas: señal que, junto con el buzzer BZ1 emite
unos "beeps" cada vez que pulsamos los
A- Sólo se suministra tensión VPP a botones de comando para lectura, graba-
los microcontroladores soportados durante ción, verificación y borrado desde la interfaz
todos los procesos. de programación. Es opcional su imple-
B- Suministro de tensión MCLR post- mentación y puede ser activado o desacti-
procesos, para "arrancar" al microcontrola- vado desde la misma interfaz.
dor sin tener que desconectar la ficha ICSP.
Bloque 2: conversor dc - dc
Por último el LED denominado USB, se En un comienzo me planteé qué diseño
enciende cuando se establece la comuni- usar para el conversor de tensión, si imple-
cación con el puerto USB y es reconocido mentarlo de forma totalmente independien-
el programador. Volviendo sobre el PIC te o utilizar el PIC para esta tarea generan-
18F2550, éste debe ser grabado en un do un PWM por software, más los compo-
principio para su funcionamiento. nentes externos necesarios. Me decidí por
El programa para este microcontrolador la primera opción por varios motivos: el cir-
podemos dividirlo en dos partes: un progra- cuito integrado utilizado MC34093, figura 4,
ma residente en un bloque de memoria del es un conversor especializado para esta
PIC, comúnmente llamado bootloader, función, de muy bajo costo, ampliamente
encargado de "chequear" la existencia del difundido, que figura en las listas de com-
firmware correspondiente al conectar el ponentes de casi todos los comercios de
programador al puerto USB. electrónica. Es autónomo, no depende del
En caso de no encontrarse, el LED firmware grabado en el 18F2550, quiero
denominado USB comenzará una secuen- decir con esto que podemos chequear su
cia de encendido en forma intermitente. En funcionamiento y la tensión de salida del
caso contrario, el firmware tomará el control conversor (en las pruebas) sin necesidad
y el LED quedará encendido en forma con- de tener el PIC en la placa del programador
tinua. ya que no depende de éste. Además nos
La gran ventaja de utilizar este sistema permite, si fuera necesario, regular la ten-
se debe a que sólo una vez debemos pro- sión de salida con sólo variar el valor de
gramar el microcontrolador 18F2550, en lo una resistencia: R3 o R4.
sucesivo los cambios y actualizaciones del El valor del choque L1 no es crítico,
firmware se podrán realizar directamente puede estar comprendido entre 220µH y
680µH sin ningún tipo de
Figura 4 inconveniente.
El circuito se alimenta con 5
volt suministrados por el puerto
USB y a la salida de TP2 obte-
nemos una tensión 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 resis-
tivo conectado al pin 5 del

Capítulo 3 73
http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 74

El Mundo de los Microcontroladores

MC34093, este lazo de realimentación


estabiliza la tensión de salida ya que es
comparada con una tensión de referen-
cia 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 relación al
consumo exigido luego de la rectifica-
ción, lógicamente dentro de unos lími-
tes. Los estados de conmutación On-Off
en el pin 1 del MC34093 junto con L1
producen la elevación de la tensión, el
diodo D1 y los capacitares C3, C4 se
encargan de la rectificación. El capacitor
C2 establece la frecuencia del oscilador
interno. Figura 5

Bloque 3: tensiones VPP y Vdd


Podría haber utilizado un solo transistor
para tratar la tensión de programación VPP,
pero estaríamos bastante limitados. La idea
era tener una salida Vpp única y más flexi-
ble, que proporcionara la tensión normal de
programación, la opción de una tensión
MCLR post programación y por último que
ya estuviera pensada para los microcontro-
ladores que trabajan con 3.3 volt que serán
incorporados en el futuro. Esto lo podía
obtener utilizando un amplificador operacio-
nal, precisamente el CA3140 con entradas
MOSFET y salida bipolar, que trabaja bien
con alimentación de simple vía, pero lo más
importante en cuanto a la elección es que
está preparado para obtener una tensión
de salida diferente independientemente a la
tensión suministrada sobre el pin 7.
Con un diodo Zener sobre el pin 8
(STROBE) se consigue de forma simple y Figura 6
práctica modificar el valor de la tensión de
salida por el pin 6. En la figura 7 podemos
ver la información que brinda el fabricante
del CA3140 para adaptar la salida a niveles
compatibles TTL independientemente de la
tensión V+ en el pin 7.
En el programador he adaptado el circui-
to para manejar las tensiones de 3.3 volt
para esta gama de PICs que se irán incor-
porando en próximas actualizaciones. Figura 7

74 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 75

LoS M iCroCoNtroLadorES PiC

Listado de Materiales C1, C4 = 100µF x 16V, electrolítico


C2 = 390pF, cerámico
IC1 = MC34063 C3, C5 = 0,1µF, cerámico
IC2 = PIC 18F2550 C6 = 10µF x 16V, electrolítico
IC3 = CA 3140 C7, C8 = 15pF, cerámico
Q1 = BC327 C9 = 0,47µF, cerámico
Q2 = BC547 C10 = 1nF, cerámico
Vpp, Vdd, Usb = LEDs de 3 mm C11 = 1µF x 16V, electrolítico
D1 = 1N4148 L1 = choque de 330µH a 680µH
R1 = 0.22 a 0.47 Ohm Xtal = cristal de 20MHz
R2 = 180 Ohm Bz1 = (opcional) buzzer sin oscilador interno
R3 = R4 = 12kΩ F1 = Fusible de 250mA, requiere puente o por-
R5 = 2.2kΩ tafusible
R6, R7 - R8 = 33 Ohm
R9, R10, R11= 10kΩ Varios:
R12 = 33kΩ Placa de circuito impreso, gabinete para mon-
R13, R14, R15, R21, R22 = 4.7kΩ taje, conector USB, conector ICSP, cables,
R16, R17, R18 = 470 Ohm estaño, etc.

Está conformada, como podemos obser- niveles detectados por las entradas del
var en la figura 6, por el Zener Z1 conecta- CA3140 la salida de éste conmutará entre
do al pin 8 del CA3140 en serie con el tran- un estado próximo a masa (0.3 volt) y Vpp,
sistor NPN Q2 que trabaja como llave elec- al finalizar proveerá una tensión adecuada
trónica On-Off, de acuerdo a los niveles alto al caso, si se eligió la opción "suministrar
o bajo en la base. Con un nivel bajo sobre MCLR" desde la interfaz de programación.
la base de este transistor el circuito está Todas las señales para la activación de las
desconectado, por lo tanto la tensión VPP tensiones están sincronizadas desde el
será la normal de 12.30V a 13V; por otro firmware del microcontrolador Pic.
lado, con un nivel alto proporcionado por Las resistencias R9 y R10 conectadas a
RB4 del 18F2550 a través de R13 el circui- masa evitan que queden al "aire" las entra-
to se conecta, la tensión VPP en este caso das del operacional en caso que el micro-
será de 3.3 volt. controlador 18F2550 no esté presente en
De esta forma queda totalmente auto- su zócalo, de lo contrario tendríamos un
matizado el suministro de VPP de acuerdo estado de indeterminación a la salida. El
a los dispositivos seleccionados desde la capacitor C10 limita la banda pasante del
interfaz de usuario en la PC. operacional, es obligatorio junto con R11 y
Por el momento no es necesario imple- R12.
mentar Z1, Q2 y R13, ya que es la primera El pin 7 del CA3140 recibe la tensión de
versión base del programador y dicha gama alimentación para su funcionamiento, pro-
de dispositivos aún no están incorporados. porcionada por el conversor Dc-Dc. El pin 4
En este caso el pin 8 debe quedar sin cone- se conecta a masa.
xión. Como pueden ver, la electrónica del La tensión máxima en la salida del ope-
programador ya está pensada para sopor- racional pin 6 es aproximadamente 2 volts
tar de forma práctica a estos microcontrola- menor a la tensión de alimentación sobre el
dores a medida que sean agregados. pin 7 (en caso que no se encuentre activa-
Continuando con esta etapa, las entra- do Q2, Z1).
das inversora y no inversora del amplifica- Para finalizar la descripción y resumien-
dor operacional se conectan con RB3 y do, el terminal 3 del conector ICSP (figura
RB2 del microcontrolador; de acuerdo a los 1) puede manejar cuatro estados de VPP:

Capítulo 3 75
http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 76

El Mundo de los Microcontroladores

1- Una tensión próxima a masa (0.3 PIC18F67J93 PIC18F87J93 PIC18F67J90


volt). PIC18F87J90 PIC18F67J50 PIC18F87J72
2- Una tensión Vpp de aproximadamen- PIC18F67J11 PIC18F87J50 PIC18F67J10
te 12.30 - 13 volt. PIC18F87J11 PIC18F66J93 PIC18F87J10
3- Una tensión post programación PIC18F66J90 PIC18F86J93 PIC18F66J55
MCLR. PIC18F86J90 PIC18F66J50 PIC18F86J72
4- Una tensión Vpp baja de 3.3 volt. PIC18F66J16 PIC18F86J55 PIC18F66J15
PIC18F86J50 PIC18F66J11 PIC18F86J16
Por último el transistor Q1 se encarga PIC18F66J10 PIC18F86J15 PIC18F65J90
del manejo de la tensión Vdd, se encuentra PIC18F86J11 PIC18F65J50 PIC18F86J10
conectado con la salida RB5 del microcon- PIC18F65J15 PIC18F85J90 PIC18F65J11
trolador. Un nivel alto en la base de Q1 lo PIC18F85J50 PIC18F65J10 PIC18F85J15
mantiene bloqueado y un nivel bajo lo colo- PIC18F64J90 PIC18F85J11 PIC18F64J11
ca en estado de conducción con salida por PIC18F85J10 PIC18F63J90 PIC18F84J90
colector; el emisor de dicho transistor se PIC18F63J11 PIC18F84J11 PIC18F83J90
conecta a +5 volt suministrados por el puer- PIC18F83J11 PIC18F66J60 PIC18F66J65
to USB. PIC18F67J60 PIC18F86J60 PIC18F86J65
PIC18F87J60 PIC18F96J60 PIC18F96J65
extensión 3.3 Volt Vdd2 PIC18F97J60 PIC18F24J10 PIC18LF24J10
Opcionalmente podemos anexar una PIC18F25J10 PIC18LF25J10 PIC18F44J10
línea auxiliar de 3.3 volt en el conector PIC18LF44J10 PIC18F45J10 PIC18LF45J10
ICSP (ya está PIC18F24J11 PIC18LF24J11 PIC18F25J11
Figura 8 contemplado en PIC18LF25J11 PIC18F26J11 PIC18LF26J11
el circuito gene- PIC18F44J11 PIC18LF44J11 PIC18F45J11
ral de la figura 1). PIC18LF45J11 PIC18F46J11 PIC18LF46J11
Con un
simple cir-
cuito (figu-
ra 8) obte-
nemos una
tensión de
salida de
3.3 volts en
el emisor
de Q3, con las mismas característi-
cas de control que VDD. La entrada
de tensión se produce por el colector
de Q3, conectado a VDD, colector de
Q2.
En la figura 9 se puede ver la ima-
gen de la placa de circuito impreso
con su máscara de componentes.
Desde la página del autor puede des-
cargar tanto la interfaz gráfica para
programación (figura 10) como el
firmware para el PIC del programa-
dor. La versión 2.1 de dicho firmware
soporta los siguientes componentes: Figura 9

76 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 77

LoS M iCroCoNtroLadorES PiC

Figura 10

PIC18F26J13 PIC18LF26J13 PIC18F27J13 El primer cargador desarrollado por


PIC18LF27J13 PIC18F46J13 PIC18LF46J13 nuestro equipo y publicado en Saber
PIC18F47J13 PIC18LF47J13 PIC18F24J50 Electrónica en 1998, utilizaba el puerto
PIC18LF24J50 PIC18F25J50 PIC18LF25J50 paralelo de una computadora, precisaba
PIC18F26J50 PIC18LF26J50 PIC18F44J50 una fuente externa y estaba basado en un
PIC18LF44J50 PIC18F45J50 PIC18LF45J50 circuito de David Tate. Posteriormente
PIC18F46J50 PIC18LF46J50 PIC18F26J53 desarrollamos varios cargadores usando el
PIC18LF26J53 PIC18F27J53 PIC18LF27J53 puerto serie con y sin fuente de alimenta-
PIC18F46J53 PIC18LF46J53 PIC18F47J53 ción, muchos de ellos basados en un dise-
ño denominado “JDM” y que emplean como
interfaz gráfica al programa IC-Prog. El pro-
eL PrograMador Quark Pro 2 gramador más completo lo hemos denomi-
nado Quark Pro 2 y se publicó en Saber
Para cargar un programa en un micro- Electrónica Nº 200. Aquí una breve descrip-
controlador PIC se requiere de una serie de ción.
parámetros básicos a saber: En la figura 11 se muestra el circuito
eléctrico del programador QUARK-PRO 2.
VDD = Voltaje de alimentación de 5V Como puede observar no existe ninguna
VSS = Referencia de tierra del circuito fuente de alimentación externa. El circuito
VPP = Voltaje de programación de 14V se alimenta del puerto serial de la PC a tra-
PGD = Datos de programación vés del conector DB9. El voltaje de alimen-
PGC = Pulsos de reloj para la sincroni- tación VDD se obtiene de los mismos pul-
zación sos de reloj (pin 7 del DB9), los cuales son

Capítulo 3 77
http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 78

El Mundo de los Microcontroladores

Figura 11

Figura 12

78 Club Saber Electrónica Nº 97


http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 79

LoS M iCroCoNtroLadorES PiC

Figura 13

rectificados por los diodos D3 y D4 y esta- basados en el que fuera más compatible. El
bilizado a 5 volt mediante el diodo zener D5 IC-PROG ofrece varias ventajas: La prime-
(5.1V) y el capacitor C1. De la misma ra es que dentro de su menú ofrece opcio-
manera, se obtiene el voltaje de programa- nes importantes como la posibilidad de
ción VPP, cargando el capacitor C2 y esta- seleccionar el puerto a utilizar, así como el
bilizando con el diodo zener D6 (8.2V) el prototipo de programador a utilizar; la
cual se suma al voltaje del zener D5 (5,1V), segunda es que el programa ofrece un
obteniéndose así 13.3 Volt suficientes para ambiente de trabajo muy amigable, ya que
realizar la programación del PIC. Se han este programa y gracias a las aportaciones
adicionado el LED L1 para visualizar el pro- de muchos colaboradores de todo el
ceso de grabación o lectura del PIC, así mundo, está traducido a varios idiomas y
como el LED L2 para indicar que el circuito tercero es que es compatible con la mayo-
se encuentra alimentado, además, si se ría de los sistemas operativos de la PC,
colocara un PIC en corto, este LED se apa- además que con frecuencia están disponi-
gará o bajará significativamente su intensi- bles de manera gratuita versiones actuali-
dad. En la figura 12 se muestra el circuito zadas (véase www.ic-prog.com). En la figu-
impreso sugerido para nuestro prototipo. ra 13 se muestra el ambiente de trabajo de
este programa.
¿Por qué utilizar el programa IC-PROG? Si usted ha trabajado con ambientes de
Con el mismo criterio que selecciona- programas diferentes, podrá observar que
mos el hardware (programador JDM), el ambiente del IC-Prog dispone de herra-
seleccionamos el software (IC-PROG), mientas de trabajo muy completas. J

Capítulo 3 79
http://librosysolucionarios.net
Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 80

http://librosysolucionarios.net
3ª de forros.qxd:club 05/03/13 16:31 Página 3ªFo1

http://librosysolucionarios.net
4ª de forros.qxd:Club 05/03/13 16:33 Página 4ªFo1

http://librosysolucionarios.net

You might also like