Club 191
Club 191
Club 191
Editorial
Nº 191
Jefe de Redacción Debido al avance de la tecnología, cada vez mas se emplean “sistemas microcontrolados” en
Luis Horacio Rodriguez aplicaciones sencillas y hasta “imprácticas”, sin embargo, el uso de estos sistemas obliga a que el
técnico deba conocer su estructura para poder saber qué familia elegir para un determinado uso.
Club Saber Electrónica es una
publicación de Saber PICAXE y ARDUINO son los máximos exponentes de los sistemas de microcontroladores
Internacional SA de CV de más empleados. El primero se basa en los microcontroladores PIC de Microchip y ARDUINO en
México y los AVR de Atmel pero ¿qué es un microcontrolador?
Editorial Quark SRL de Argentina
Un microcontrolador es un circuito integrado o chip que incluye en su interior las tres uni-
Editor Responsable en Argentina dades funcionales de una computadora: CPU, Memoria y Unidades de E/S, es decir, se trata de
y México: Ing. Horacio D. Vallejo una computadora completa en un solo circuito integrado.
Administración México: Son diseñados para disminuir el costo económico y el consumo de energía de un sistema en
Patricia Rivero Rivero particular. Por eso el tamaño de la CPU, la cantidad de memoria y los periféricos incluidos depen-
derán de la aplicación. El control de un electrodoméstico sencillo como una batidora, utilizará un
Comercio Exterior:
Francisco Di Zonno procesador muy pequeño (4 u 8 bit) por que sustituirá a un autómata pequeño; en cambio un
reproductor de música y/o vídeo digital (mp3 o mp4) requerirá de un procesador de 32 bit o de 64
Director Club Saber Electrónica: bit y de uno o mas códec de señal digital (audio y/o vídeo). El control de un sistema de frenos
Federico Vallejo
ABS (Antilock Brake System) se basa normalmente en un microcontrolador de 16 bit, al igual que
Responsable de Atención al el sistema de control electrónico del motor en un automóvil.
Lector: Los microcontroladores representan la inmensa mayoría de los chips de computadoras ven-
Alejandro A. Vallejo
didos, un 50% son controladores "simples" y el resto corresponde a procesadores más especiali-
Coordinador Internacional zados. Un microcontrolador difiere de una CPU normal, en que es más fácil convertirlo en una
Luis Alberto Castro Regalado computadora en funcionamiento, con un mínimo de chips externos de apoyo.
Publicidad
Un microcontrolador típico tendrá un generador de reloj integrado y una pequeña cantidad
Argentina: 11 4206-1742 de memoria RAM y ROM/EPROM/EEPROM/FLASH, significando que para hacerlo funcionar,
México: 55 5839-5277 todo lo que se necesita son unos pocos programas de control y un cristal de sincronización. Los
Internet:
microcontroladores disponen generalmente también de una gran variedad de dispositivos de
www.webelectronica.com.ar entrada/salida, como convertidores de analógico a digital, temporizadores, UARTs y buses de
Web Manager: Prometeo interfaz serie especializados, como I2C y CAN. Frecuentemente, estos dispositivos integrados
Club Saber Electrónica. Fecha de publicación: pueden ser controlados por instrucciones de procesadores especializados. Los modernos micro-
noviembre 2021. Publicación mensual editada y controladores frecuentemente incluyen un lenguaje de programación integrado, como el BASIC
publicada por Editorial Quark, Herrera 761 que se utiliza bastante con este propósito.
(1295) Capital Federal, Argentina (005411-
43018804), en conjunto con Saber Internacio- Este libro es la reedición ampliada del tomo Nº 97 publicado hace más de 10 años y que sigue
nal SA de CV, Av. Moctezuma Nº 2, Col. Sta. siendo tan vigente como entonces. Esperamos que esta breve introducción le sirva como “dispa-
Agueda, Ecatepec de Morelos, México
(005255-58395277), con Certificado de Licitud rador” para estudiar el contenido en la espera del próximo texto.
del título (en trámite). Distribución en México:
REI SA de CV. Distribución en Argentina: Ca-
¡Hasta el mes próximo!
pital: Carlos Cancellaro e Hijos SH, Gutenberg
3258 - Cap. 4301-4942 - Interior: DISA – Distri-
bución en Uruguay: Rodesol SA Ciudadela Sobre loS 2 CDS y Su DeSCarga
1416 – Montevideo, 901-1184 – La Editorial no
se responsabiliza por el contenido de las notas Si compró este libro en tiendas de venta de libros y/o revistas Ud. podrá descargar
firmadas. Todos los productos o marcas que se de nuestra web 2 CDs: “Microcontroladores vol. 1 y 2” con gran cantidad de circuitos
mencionan son a los efectos de prestar un ser-
vicio al lector, y no entrañan responsabilidad de para armar y sistemas para experimentar. Todos los CDs son productos multimedia
nuestra parte. Está prohibida la reproducción completos con un costo de mercado equivalente a 8 dólares americanos cada uno y Ud.
total o parcial del material contenido en esta re-
vista, así como la industrialización y/o comer- los puede descargar GRATIS con su número de serie por ser comprador de este libro.
cialización de los aparatos o ideas que apare- Para realizar la descarga deberá ingresar a nuestra web: www.webelectronica.com.mx,
cen en los mencionados textos, bajo pena de
sanciones legales, salvo mediante autorización tendrá que hacer clic en el ícono password e ingresar la clave “que se encuentra en la
por escrito de la Editorial. portada impresa de este libro”. Estos CDs son un beneficio adicional válido para
Revista Club Saber Electrónica,
ISSN: 1668-6004 quienes realizan la compra del ejemplar.
Editorial 1
El Mundo de los Microcontroladores
suMario
CAPítULo 1 CAPítULo 2
LoS SIStEMAS DE NUMERACIóN . . . . . . . . . . . . . . . .3 SIStEMAS DE PRogRAMACIóN:
Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 LENgUAJE MIkRoC . . . . . . . . . . . . . . . . . . . . . . . .27
Qué Pueden Hacer los Microcontroladores . . . . . . . . . . . . .4 Lenguajes de Programación . . . . . . . . . . . . . . . . . . . . . . . .27
Números, Números, Números... . . . . . . . . . . . . . . . . . . . . . .6 Lenguaje Ensamblador . . . . . . . . . . . . . . . . . . . . . . . . . . . .28
Sistema de Numeración Binario . . . . . . . . . . . . . . . . . . . . . .6 Ventajas de los Lenguajes de Programación
Sistema de Numeración Hexadecimal . . . . . . . . . . . . . . . . .7 de Alto Nivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28
Conversión de Sistemas de Numeración . . . . . . . . . . . . . . .8 Lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29
Conversión de Números Binarios a Decimales . . . . . . . . . .8 Características de el Lenguaje mikroC . . . . . . . . . . . . . . . .30
Conversión de Números Hexadecimales a Decimales . . . . .9
Fases de la Compilación . . . . . . . . . . . . . . . . . . . . . . . . . . .31
Conversión de Números Hexadecimales a Binarios . . . . . . .9
Estructura del Programa . . . . . . . . . . . . . . . . . . . . . . . . . . .31
Marcar los Números . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33
Números Negativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
Tipos de Datos en mikroC . . . . . . . . . . . . . . . . . . . . . . . . . .34
BIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
BYTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 Variables y Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . .35
Detalles Importantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 Ámbito de Variables y Constantes . . . . . . . . . . . . . . . . . . .39
Componentes Básicos de la Lógica Digital . . . . . . . . . . . . .11 Clases de Almacenamiento . . . . . . . . . . . . . . . . . . . . . . . . .40
Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12 Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40
Puertos de Entrada / Salida (E/S) . . . . . . . . . . . . . . . . . . . .13 Conversión de Tipos de Datos . . . . . . . . . . . . . . . . . . . . . .44
Unidad de Memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14 Estructuras de Control . . . . . . . . . . . . . . . . . . . . . . . . . . . .45
Interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16 Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47
Unidad Central de Procesamiento Sentencias de Salto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49
(CENTRAL PROCESSOR UNIT - CPU) . . . . . . . . . . . . . . .17 Tipos de Datos Avanzados . . . . . . . . . . . . . . . . . . . . . . . . .50
Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17 Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54
Comunicación en Serie . . . . . . . . . . . . . . . . . . . . . . . . . . . .17
Velocidad de Transmisión Serial . . . . . . . . . . . . . . . . . . . . .18 CAPítULo 3
I2C Circuito Inter- Integrado LoS MICRoCoNtRoLADoRES PIC . . . . . . . . . . . . . .63
(INTER INTEGRATED CIRCUIT) . . . . . . . . . . . . . . . . . . .18 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63
SPI - Bus Serial de Interfaz de Periféricos La Memoria de Programa . . . . . . . . . . . . . . . . . . . . . . . . . .67
(SERIAL PERIPHERAL INTERFACE BUS) . . . . . . . . . . . .18 La Memoria de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . .67
Oscilador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19 Los Puertos del PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .68
Circuito de Alimentación . Fuente de Alimentación . . . . . . .19
El Clock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .69
Temporizadores – Contadores . . . . . . . . . . . . . . . . . . . . . .20
El Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .69
¿Cómo Funcionan los Temporizadores? . . . . . . . . . . . . . .20
Primeras Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . .70
Utilizando un Preescalador en el
GPIC USB: Programador de Microcontroladores
Funcionamiento del Temporizador . . . . . . . . . . . . . . . . . . .21
Utilizando una Interrupción en el PIC y Memorias Eeprom por Puerto USB . . . . . . . . . . . . .70
Funcionamiento del Temporizador . . . . . . . . . . . . . . . . . . .21 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70
Contadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21 Descripción del Circuito Electrónico . . . . . . . . . . . . . . . . . .70
Temporizador Perro Guardián. WATCHDOG . . . . . . . . . . .22 El Programador Quark Pro 2 . . . . . . . . . . . . . . . . . . . . . . .77
Convertidor Digital – Analógico (D/A) . . . . . . . . . . . . . . . . .22
Arquitectura Interna de un Microcontrolador . . . . . . . . . . . .23 CAPítULo 4
Juego de Instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . .24 gUíA PRáCtICA PARA APRENDER
¿Cómo se Debe Elegir un Microcontrolador? . . . . . . . . . . .25 MICRoCoNtRoLADoRES PIC . . . . . . . . . . . . . . . . .81
www.mikroe.com
Capítulo 1 3
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 hablando de cómo poner en marcha un simple
diseña de tal manera que tenga todas las com- ascensor.
ponentes integradas en el mismo chip. No nece- Cuando el dispositivo finalmente empiece a
sita de otros componentes especializados para funcionar perfectamente y todo el mundo esté
su 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 estarán
periféricos, ya se encuentran incorporados. Así interesadas en su trabajo. Por supuesto, si tiene
se ahorra tiempo y espacio necesario para cons- suerte, cada día le traerá una oferta de trabajo
truir un dispositivo. de un nuevo inversionista. Sin embargo, si lo
requieren para trabajar en el control de los ele-
vadores 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 Pensamos que usted va a construir un dispo-
electrónico de control de un ascensor de un edi- sitivo universal que se puede utilizar en los edi-
ficio de varios pisos era muy difícil, incluso para ficios de 4 a 40 pisos, una obra maestra de
un equipo de expertos. electrónica. Bueno, incluso si usted consigue
construir 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
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
El Mundo de los Microcontroladores
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 HexadecimaL
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
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. adecimaLes
¿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
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
a BiNarios
Figura 7
Figura 8
marcar Los Números
Capítulo 1 9
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
Capítulo 1 11
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.
Figura 14
Figura 15
registros
Capítulo 1 13
El Mundo de los Microcontroladores
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 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
El Mundo de los Microcontroladores
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.
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
en tantas líneas como sean necesarias para de datos obligatoria?
Capítulo 1 17
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
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.
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.
Capítulo 1 19
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.
Fifura 30
Capítulo 1 21
El Mundo de los Microcontroladores
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.
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
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:
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
Capítulo 2
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
Capítulo 2 27
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
Figura 2
Capítulo 2 29
El Mundo de los Microcontroladores
Figura 3
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
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
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”.
Capítulo 2 31
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:
Figura 7
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
El Mundo de los Microcontroladores
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
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:
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
59 // entero
'p' // carácter ASCII 'p'
Una secuencia de caracteres es denominada cadena (string). Las cadenas están encerradas
entre comillas dobles:
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.
Capítulo 2 35
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.
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.
* 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.
Tabla 3
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:
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:
Un método más rápido se le denomina declaración con inicialización (asignación de los valores
iniciales):
Si hay varias variables con el mismo valor inicial asignado, el proceso se puede simplificar:
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
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:
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.
int Velocidad_de_ascensor
enum motor_de_ascensor {PARADA,INICIO,NORMAL,MÁXIMO};
Velocidad_de_ascensor = NORMAL; // Velocidad_de_ascensor = 2
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
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
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:
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();
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
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
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
Capítulo 2 41
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.
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
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
Tabla 9
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
El Mundo de los Microcontroladores
Tabla 10
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.
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:
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.
if(expresión) operación;
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
El Mundo de los Microcontroladores
if(expresión) {
... //
... // operación1
...} //
else
operación2
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:
break;
case constante2:
break;
...
default:
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:
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:
Capítulo 2 47
El Mundo de los Microcontroladores
bucle For
El bucle for se parece a lo siguiente:
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.
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.
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.
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.
Capítulo 2 49
El Mundo de los Microcontroladores
Delay_ms(1000);
x++;
continue; // Después de esta línea, saltar a la sentencia while con x=8
}
Sentencia goto
La sentencia goto le permite hacer un salto absoluto al otro punto en el programa. Esta carac-
terí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 iden-
tificador 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
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.
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.
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
Para leer o modificar un elemento de matriz del ejemplo anterior, basta con introducir su índice
encerrado entre corchetes:
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
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
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.
int Tabla [3][4]; // Tabla se define de modo que tenga 3 filas y 4 columnas
___________________________
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 especí-
fica (también llamado objeto apuntado), se utiliza un operador de indirección (*).
tipo_de_variable *puntero;
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;
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:
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
El Mundo de los Microcontroladores
struct nombre_de_estructura {
tipo1_de_miembro1 miembro1;
tipo2_de_miembro2 miembro2;
tipo3_de_miembro3 miembro3;
..
};
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’.
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:
..
.
};
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:
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:
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
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.
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:
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:
tipo de resultado
nombre de función
tipos de parámetros
un punto y coma (;)
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.
Capítulo 2 57
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.
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
}
En este ejemplo, por medio de una función se realizan dos operaciones: ordena los miembros
de la matriz por valor ascendente 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:
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
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
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
El Mundo de los Microcontroladores
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 (;).
Tabla 11
* 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.
También puede utilizar los parámetros para realizar substituciones más complejas:
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.
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).
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
Capítulo 3
Capítulo 3 63
El Mundo de los Microcontroladores
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
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
La MeMoria de datos
Capítulo 3 67
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-
Figura 11
eL cLock
Capítulo 3 69
El Mundo de los Microcontroladores
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 de
Este proyecto comenzó a principios del 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 estado
interesado en los procesos de programa- descriPción deL circuito eLectrónico
ció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-
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
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
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 inter-
todos los procesos. faz 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 comunica- usar para el conversor de tensión, si imple-
ción con el puerto USB y es reconocido el mentarlo de forma totalmente independien-
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
El Mundo de los Microcontroladores
Está conformada, como podemos obser- RB2 del microcontrolador; de acuerdo a los
var en la figura 6, por el Zener Z1 conecta- niveles detectados por las entradas del
do al pin 8 del CA3140 en serie con el tran- CA3140 la salida de éste conmutará entre
sistor NPN Q2 que trabaja como llave un estado próximo a masa (0.3 volt) y Vpp,
electrónica On-Off, de acuerdo a los niveles al finalizar proveerá una tensión adecuada
alto o bajo en la base. Con un nivel bajo al caso, si se eligió la opción "suministrar
sobre la base de este transistor el circuito MCLR" desde la interfaz de programación.
está desconectado, por lo tanto la tensión Todas las señales para la activación de las
VPP será la normal de 12.30V a 13V; por tensiones están sincronizadas desde el
otro lado, con un nivel alto proporcionado firmware del microcontrolador Pic.
por RB4 del 18F2550 a través de R13 el cir- Las resistencias R9 y R10 conectadas a
cuito se conecta, la tensión VPP en este masa evitan que queden al "aire" las entra-
caso será de 3.3 volt. das del operacional en caso que el micro-
De esta forma queda totalmente auto- controlador 18F2550 no esté presente en
matizado el suministro de VPP de acuerdo su zócalo, de lo contrario tendríamos un
a los dispositivos seleccionados desde la estado de indeterminación a la salida. El
interfaz de usuario en la PC. capacitor C10 limita la banda pasante del
Por el momento no es necesario imple- operacional, es obligatorio junto con R11 y
mentar Z1, Q2 y R13, ya que es la primera R12.
versión base del programador y dicha El pin 7 del CA3140 recibe la tensión de
gama de dispositivos aún no están incorpo- alimentación para su funcionamiento, pro-
rados. En este caso el pin 8 debe quedar porcionada por el conversor Dc-Dc. El pin 4
sin conexión. Como pueden ver, la electró- se conecta a masa.
nica del programador ya está pensada para La tensión máxima en la salida del ope-
soportar de forma práctica a estos micro- racional pin 6 es aproximadamente 2 volts
controladores a medida que sean agrega- menor a la tensión de alimentación sobre el
dos. 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
Capítulo 3 75
El Mundo de los Microcontroladores
Figura 10
Capítulo 3 77
El Mundo de los Microcontroladores
Figura 11
Figura 12
Figura 13
pulsos de reloj (pin 7 del DB9), los cuales mos el hardware (programador JDM),
son rectificados por los diodos D3 y D4 y seleccionamos el software (IC-PROG),
estabilizado a 5 volt mediante el diodo basados en el que fuera más compatible. El
zener D5 (5.1V) y el capacitor C1. De la IC-PROG ofrece varias ventajas: La prime-
misma manera, se obtiene el voltaje de pro- ra es que dentro de su menú ofrece opcio-
gramación VPP, cargando el capacitor C2 y nes importantes como la posibilidad de
estabilizando con el diodo zener D6 (8.2V) seleccionar el puerto a utilizar, así como el
el cual se suma al voltaje del zener D5 prototipo de programador a utilizar; la
(5,1V), obteniéndose así 13.3 Volt suficien- segunda es que el programa ofrece un
tes para realizar la programación del PIC. ambiente de trabajo muy amigable, ya que
Se han adicionado el LED L1 para visuali- este programa y gracias a las aportaciones
zar el proceso de grabación o lectura del de muchos colaboradores de todo el
PIC, así como el LED L2 para indicar que el mundo, está traducido a varios idiomas y
circuito se encuentra alimentado, además, tercero es que es compatible con la
si se colocara un PIC en corto, este LED se mayoría de los sistemas operativos de la
apagará o bajará significativamente su PC, además que con frecuencia están dis-
intensidad. En la figura 12 se muestra el cir- ponibles de manera gratuita versiones
cuito impreso sugerido para nuestro prototi- actualizadas (véase www.ic-prog.com). En
po. la figura 13 se muestra el ambiente de tra-
bajo 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
Capítulo 3 79
Capítulo 4
Capítulo 4 81
El Mundo de los Microcontroladores
Capítulo 4 83
El Mundo de los Microcontroladores
Capítulo 4 85
El Mundo de los Microcontroladores
Capítulo 4 87
El Mundo de los Microcontroladores
Capítulo 4 89
El Mundo de los Microcontroladores
Capítulo 4 91
El Mundo de los Microcontroladores
Capítulo 4 93
El Mundo de los Microcontroladores
Capítulo 4 95
El Mundo de los Microcontroladores
Capítulo 4 97
El Mundo de los Microcontroladores
Capítulo 4 99
El Mundo de los Microcontroladores
Capítulo 4 101
El Mundo de los Microcontroladores
Capítulo 4 103
El Mundo de los Microcontroladores
Capítulo 4 105
El Mundo de los Microcontroladores
Capítulo 4 107
El Mundo de los Microcontroladores
Capítulo 4 109
El Mundo de los Microcontroladores
Capítulo 4 111
El Mundo de los Microcontroladores
Capítulo 4 113
El Mundo de los Microcontroladores
Capítulo 4 115
El Mundo de los Microcontroladores
Capítulo 4 117
El Mundo de los Microcontroladores
Capítulo 4 119
El Mundo de los Microcontroladores
Capítulo 4 121
El Mundo de los Microcontroladores
Capítulo 4 123
El Mundo de los Microcontroladores
Capítulo 4 125
El Mundo de los Microcontroladores
Capítulo 4 127
El Mundo de los Microcontroladores
Capítulo 4 129
El Mundo de los Microcontroladores
Capítulo 4 131
El Mundo de los Microcontroladores
Capítulo 4 133
El Mundo de los Microcontroladores
Capítulo 4 135
El Mundo de los Microcontroladores
Capítulo 4 137
El Mundo de los Microcontroladores
Capítulo 4 139
El Mundo de los Microcontroladores
Capítulo 4 141
El Mundo de los Microcontroladores
Capítulo 4 143
El Mundo de los Microcontroladores
Capítulo 4 145
El Mundo de los Microcontroladores
Capítulo 4 147
4ª de forros.qxd:sumario 223 21/11/13 18:13 Página 4ªFo1
3ª de forros 2.qxd:club 10/12/12 09:55 Página 3ªFo1