Anda di halaman 1dari 84

B ases

de los

M iCroControladores

Editorial
Director Ing. Horacio D. Vallejo Produccin Jos Mara Nieves (Grupo Quark SRL) autor: Varios (ver Editorial) Seleccin y Coordinacin: Ing. Horacio Daniel Vallejo Editorial QUarK S.r.l. Propietaria de los derechos en castellano de la publicacin mensual SabEr ElEctrnica - San Ricardo 2072 (1273) - Capital Federal - Buenos Aires Argentina - T.E. 4301-8804 administracin y Negocios Teresa C. Jara (Grupo Quark SRL) Patricia Rivero Rivero (SISA SA de CV) Margarita Rivero Rivero (SISA SA de CV) Staff Liliana Teresa Vallejo Mariela Vallejo Diego Vallejo Luis Alberto Castro Regalado (SISA SA de CV) Jos Luis Paredes Flores (SISA SA de CV) Sistemas: Paula Mariana Vidal red y Computadoras: Ral Romero Video y animaciones: Fernando Fernndez legales: Fernando Flores Contadura: Fernando Ducach Tcnica y Desarrollo de Prototipos: Alfredo Armando Flores atencin al Cliente Alejandro Vallejo ateclien@webelectronica.com.ar Internet: www.webelectronica.com.mx Publicidad: Rafael Morales rafamorales@webelectronica.com.ar Club Se: grupo Quark Srl luisleguizamon@webelectronica.com.ar editorial Quark Srl San Ricardo 2072 (1273) - Capital Federal www.webelectronica.com.ar

Del Editor al Lector


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

Hasta el mes prximo!

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

Sobre loS 2 CDS y Su DeSCarga


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

Captulo 1

El Mundo de los Microcontroladores

EL MunDo

DE Los

suMario
Juego de Instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . .24 Cmo se Debe Elegir un Microcontrolador? . . . . . . . . . . .25

MicrocontroLaDorEs

Captulo 1 los sistemas de NumeraCiN . . . . . . . . . . . . . . . .3


Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 Qu Pueden Hacer los Microcontroladores . . . . . . . . . . . . .4 Nmeros, Nmeros, Nmeros... . . . . . . . . . . . . . . . . . . . . . .6 Sistema de Numeracin Binario . . . . . . . . . . . . . . . . . . . . . .6 Sistema de Numeracin Exadecimal . . . . . . . . . . . . . . . . . .7 Conversin de Sistemas de Numeracin . . . . . . . . . . . . . . .8 Conversin de Nmeros Binarios a Decimales . . . . . . . . . .8 Conversin de Nmeros Hexadecimales a Decimales . . . . .9 Conversin de Nmeros Hexadecimales a Binarios . . . . . . .9 Marcar los Nmeros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 Nmeros Negativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 BIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 BYTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 Detalles Importantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 Componentes Bsicos de la Lgica Digital . . . . . . . . . . . . .11 Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12 Puertos de Entrada / Salida (E/S) . . . . . . . . . . . . . . . . . . . .13 Unidad de Memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14 Interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16 Unidad Central de Procesamiento (CENTRAL PROCESSOR UNIT - CPU) . . . . . . . . . . . . . . .17 Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17 Comunicacin en Serie . . . . . . . . . . . . . . . . . . . . . . . . . . . .17 Velocidad de Transmisin Serial . . . . . . . . . . . . . . . . . . . . .18 I2C Circuito Inter- Integrado (INTER INTEGRATED CIRCUIT) . . . . . . . . . . . . . . . . . . .18 SPI - Bus Serial de Interfaz de Perifricos (SERIAL PERIPHERAL INTERFACE BUS . . . . . . . . . . . . .18 Oscilador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19 Circuito de Alimentacin . Fuente de Alimentacin . . . . . . .19 Temporizadores Contadores . . . . . . . . . . . . . . . . . . . . . .20 Cmo Funcionan los Temporizadores? . . . . . . . . . . . . . .20 Utilizando un Preescalador en el Funcionamiento del Temporizador . . . . . . . . . . . . . . . . . . .21 Utilizando una Interrupcin en el Funcionamiento del Temporizador . . . . . . . . . . . . . . . . . . .21 Contadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21 Temporizador Perro Guardin. WATCHDOG . . . . . . . . . . .22 Convertidor Digital Analgico (D/A) . . . . . . . . . . . . . . . . .22 Arquitectura Interna de un Microcontrolador . . . . . . . . . . . .23

Captulo 2 sistemas de programaCiN: leNguaje mikroC . . . . . . . . . . . . . . . . . . . . . . . .27


Lenguajes de Programacin . . . . . . . . . . . . . . . . . . . . . . . .27 Lenguaje Ensamblador . . . . . . . . . . . . . . . . . . . . . . . . . . . .28 Ventajas de los Lenguajes de Programacin de Alto Nivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28 Lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29 Caractersticas de el Lenguaje mikroC . . . . . . . . . . . . . . . .30 Fases de la Compilacin . . . . . . . . . . . . . . . . . . . . . . . . . . .31 Estructura del Programa . . . . . . . . . . . . . . . . . . . . . . . . . . .31 Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33 Tipos de Datos en mikroC . . . . . . . . . . . . . . . . . . . . . . . . . .34 Variables y Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . .35 mbito de Variables y Constantes . . . . . . . . . . . . . . . . . . .39 Clases de Almacenamiento . . . . . . . . . . . . . . . . . . . . . . . . .40 Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40 Conversin de Tipos de Datos . . . . . . . . . . . . . . . . . . . . . .44 Estructuras de Control . . . . . . . . . . . . . . . . . . . . . . . . . . . .45 Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47 Sentencias de Salto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49 Tipos de Datos Avanzados . . . . . . . . . . . . . . . . . . . . . . . . .50 Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54

Captulo 3 los miCroCoNtroladores piC . . . . . . . . . . . . . .63


Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63 La Memoria de Programa . . . . . . . . . . . . . . . . . . . . . . . . . .67 La Memoria de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . .67 Los Puertos del PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .68 El Clock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .69 El Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .69 Primeras Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . .70 GPIC USB: Programador de Microcontroladores PIC y Memorias Eeprom por Puerto USB . . . . . . . . . . . . .70 Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70 Descripcin del Circuito Electrnico . . . . . . . . . . . . . . . . . .70 El Programador Quark Pro 2 . . . . . . . . . . . . . . . . . . . . . . .77

Club saber electrnica n 97

Captulo 1

eL muNdo de Los microcoNtroLadores

Los sistemas de NumeraciN


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

Captulo 1

El Mundo de los Microcontroladores


les perifricos externos, tales como memoria, lneas de entrada/salida, temporizadores u otros. El incremento posterior de la densidad de integracin permiti crear un circuito integrado que contena tanto al procesador como perifricos. As es cmo fue desarrollada la primera microcomputadora en un solo chip, denominada ms tarde microcontrolador. Los principiantes en electrnica creen que un microcontrolador es igual a un microprocesador. Esto no es cierto. Difieren uno del otro en muchos sentidos. La primera y la ms importante diferencia es su funcionalidad. Para utilizar al microprocesador en una aplicacin real, se debe de conectar con componentes tales como memoria o componentes buses de transmisin de datos. Aunque el microprocesador se considera una mquina de computacin poderosa, no est preparado para la comunicacin con los dispositivos perifricos que se le conectan. Para que el microprocesador se comunique con algn perifrico, se deben utilizar los circuitos especiales. As era en el principio y esta prctica sigue vigente en la actualidad. Por otro lado, al microcontrolador se le disea de tal manera que tenga todas las componentes integradas en el mismo chip. No necesita de otros componentes especializados para su aplicacin, porque todos los circuitos necesarios, que de otra manera correspondan a los perifricos, ya se encuentran incorporados. As se ahorra tiempo y espacio necesario para construir un dispositivo. man al ascensor al mismo tiempo? Cul llamada tiene la prioridad? Cmo solucionar las cuestiones de seguridad, de prdida de electricidad, de fallos, de uso indebido? Lo que sucede despus de resolver estos problemas bsicos es un proceso meticuloso de disear los dispositivos adecuados utilizando un gran nmero de los chips especializados. Este proceso puede tardar semanas o meses, dependiendo de la complejidad del dispositivo. Cuando haya terminado el proceso, llega la hora de disear una placa de circuito impreso y de montar el dispositivo. Un dispositivo enorme! Es otro trabajo difcil y tardado. Por ltimo, cuando todo est terminado y probado adecuadamente, pasamos al momento crucial y es cuando uno se concentra, respira profundamente y enciende la fuente de alimentacin. Esto suele ser el punto en el que la fiesta se convierte en un verdadero trabajo puesto que los dispositivos electrnicos casi nunca funcionan apropiadamente desde el inicio. Preprese para muchas noches sin dormir, correcciones, mejoras... y no se olvide de que todava estamos hablando de cmo poner en marcha un simple ascensor. Cuando el dispositivo finalmente empiece a funcionar perfectamente y todo el mundo est satisfecho, y le paguen por el trabajo que ha hecho, muchas compaas de desarrollo estarn interesadas en su trabajo. Por supuesto, si tiene suerte, cada da le traer una oferta de trabajo de un nuevo inversionista. Sin embargo, si lo requieren para trabajar en el control de los elevadores de un nuevo edificio que tiene cuatro pisos ms de los que ya maneja su sistema de control. Sabe cmo proceder? Cree acaso que se pueden controlar las demandas de sus clientes? Pensamos que usted va a construir un dispositivo universal que se puede utilizar en los edificios de 4 a 40 pisos, una obra maestra de electrnica. Bueno, incluso si usted consigue construir una joya electrnica, su inversionista le esperar delante de la puerta pidiendo una cmara en el ascensor o una msica relajante en caso de fallo de ascensor. O un ascensor con

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

Club Saber Electrnica N 97

B aSES
dos puertas. De todos modos, la ley de Murphy es inexorable y sin duda usted no podr tomar ventaja a pesar de todos los esfuerzos que ha hecho. Por desgracia, todo lo que se ha dicho hasta ahora sucede en la realidad. Esto es lo que dedicarse a la ingeniera electrnica realFigura 1

dE loS

M iCroCoNtroladorES

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

Captulo 1

El Mundo de los Microcontroladores


un pequeo submarino, una gra o un ascensor como el anteriormente mencionado, ahora est incorporado en un slo chip. Los microcontroladores ofrecen una amplia gama de aplicaciones y slo algunas se exploran normalmente. Le toca a usted decidir qu quiere que haga el microcontrolador y cargar un programa en l con las instrucciones apropiadas. Antes de encender el dispositivo es recomendable verificar su funcionamiento con ayuda de un simulador. Si todo funciona como es debido, incorpore el microcontrolador en el sistema. Si alguna vez necesita cambiar, mejorar o actualizar el programa, hgalo. Hasta cundo se deben hacer modificaciones? Hasta quedar satisfecho. Eso puede realizarse sin ningn problema. Vea en la figura 1 una caracterizacin sobre los pasos que debe seguir un principiante para la programacin. Saba usted que todas las personas pueden ser clasificadas en uno de 10 grupos, en los que estn familiarizados con el sistema de numeracin binario y en los que no estn familiarizados con l. Si no entendi lo anterior significa que todava pertenece al segundo grupo. Si desea cambiar su estado, lea el siguiente texto que describe brevemente algunos de los conceptos bsicos utilizados ms tarde en este libro (slo para estar seguro de que estamos hablando en los mismos trminos). Muy simple! Se podra expresar de una forma ms desarrollada? Por supuesto que s: 764 = 4 + 60 + 700 An ms desarrollado? S: 764 = 4*1 + 6*10 + 7*100 Podra este nmero parecer un poco ms cientfico? La respuesta es s otra vez: 764= 4*100 + 6*101 + 7*102. Qu significa esto realmente? Por qu utilizamos exactamente estos nmeros 100, 101 y 102 ? Por qu es siempre el nmero 10? Es porque utilizamos 10 dgitos diferentes (0, 1, 2...8, 9). En otras palabras, es porque utilizamos el sistema de numeracin en base 10, es decir el sistema de numeracin decimal, figura 2.

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

Figura 2

sIsteMa de nuMeracIn BInarIo Qu pasara si utilizramos slo dos nmeros 0 y 1?

Club Saber Electrnica N 97

B aSES
Si slo pudiramos afirmar (1) o negar (0) que algo existe. La respuesta es nada especial, seguiramos utilizando los mismos nmeros de la misma manera que utilizamos hoy en da, no obstante ellos pareceran un poco diferentes. Por ejemplo: 11011010. Cuntas son realmente 11011010 pginas de un libro? Para entenderlo, siga la misma lgica como en el ejemplo anterior, pero en el orden invertido. Tenga en cuenta que se trata de aritmtica con slo dos dgitos 0 y 1, es decir, del sistema de numeracin en base 2 (sistema de numeracin binario). Vea la figura 3.

dE loS

M iCroCoNtroladorES

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

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

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

Captulo 1

El Mundo de los Microcontroladores


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

El mayor nmero que puede ser representado con 4 dgitos binarios es el nmero 1111. Corresponde al nmero 15 en el sistema decimal. En el sistema hexadecimal ese nmero se representa con slo un dgito F. Es el mayor nmero de un dgito en el sistema hexadecimal. Se da cuenta de la gran utilidad de estas equivalencias? El mayor nmero escrito con ocho dgitos binarios es a la vez el mayor nmero de dos dgitos en el sistema hexadecimal. Tenga en cuenta que una computadora utiliza nmeros binarios de 8 dgitos. Acaso se trata de una casualidad?

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

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

cdIgo Bcd El cdigo BCD (Binary-Coded Decimal Cdigo binario decimal) es un cdigo binario utilizado para representar a los nmeros decimales. Se utiliza para que los circuitos electrnicos puedan comunicarse con los perifricos utilizando el sistema de numeracin decimal o bien utilizando el sistema binario dentro de su propio mundo. Consiste en nmeros binarios de 4 dgitos que representan los primeros diez dgitos (0, 1, 2, 3...8, 9). Aunque cuatro dgitos pueden hacer 16 combinaciones posibles en total, el cdigo BCD normalmente utiliza a las primeras diez.

Figura 5

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

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

Club Saber Electrnica N 97

B aSES
Por consiguiente, al utilizar 4 dgitos binarios, es posible representar los nmeros decimales de 0 a 15, que son 16 valores diferentes en total.

dE loS

M iCroCoNtroladorES

conversIn de nMeros HexadecIMales decIMales

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

je? Dependiendo del sistema en cuestin (binario, decimal o hexadecimal), el resultado podra ser 6, 110 o 272 productos, respectivamente. Por consiguiente, para evitar equivocaciones, diferentes prefijos y sufijos se aaden directamente a los nmeros. El prefijo $ o 0x as como el sufijo h marca los nmeros en el sistema hexadecimal. Por ejemplo, el nmero hexadecimal 10AF se puede escribir as: $10AF, 0x10AF o 10AFh. De manera similar, los nmeros binarios normalmente obtienen el sufijo % o 0B. Si un nmero no tiene ni sufijo ni prefijo se considera decimal. Desafortunadamente, esta forma de marcar los nmeros no es Figura 6 estandarizada, por consiguiente depende de la aplicacin concreta. La mostrada en la figura 8 es tabla comparativa que contiene los valores de nmeros 0255 representados en tres sistemas de numeracin diferentes.

conversIn de nMeros HexadecIMales BInarIos

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

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

nMeros negatIvos Como ya hemos visto, para escribir un nmero negativo en matemticas, basta con aadirle el prefijo - (signo menos). Sin embargo, en la programacin, al acabarse el proceso de la compilacin, se quedan slo los nmeros binarios,

Captulo 1

El Mundo de los Microcontroladores


volvindose las cosas ms complicadas. Se utilizan slo dos dgitos - 0 y 1, mientras que todos los dems nmeros, smbolos y signos se forman por medio de las combinaciones de estos dos dgitos. En el caso de los nmeros negativos, la solucin es la siguiente: En los nmeros negativos, el bit ms significativo (el bit del extremo izquierdo) representa el signo del nmero (donde 0 ser positivo y 1 negativo). En el caso de un nmero de 8 bits, para representar un valor numrico slo quedan 7 bits. De acuerdo a este tipo de codificacin el nmero +127 es el mayor nmero positivo con signo que se puede representar con 8 bits. Asimismo, hay cero (0) positivo y negativo (refirase a la siguiente tabla). el nmero 444 son los mismos pero tienen los valores diferentes), el significado de un bit depende de la posicin que tiene en nmero binario. En los nmeros binarios, sus dgitos se denominan el bit cero (el primer bit a la derecha), el primer bit (el segundo bit a la derecha) etc. Adems, ya que el sistema binario utiliza solamente dos dgitos (0 y 1), el valor de un bit puede ser 0 o 1. No se confunda si se encuentra con un bit que tiene el valor 4, 16 o 64. Son los valores representados en el sistema decimal. Simplemente, nos hemos acostumbrado tanto a utilizar los nmeros decimales que estas expresiones llegaron a ser comunes. Sera correcto decir por ejemplo, el valor del sexto bit en cualquier nmero binario equivale al nmero decimal 64. Pero todos somos humanos y los viejos hbitos mueren difcilmente. Adems, cmo le suena nmero uno-uno-cero-uno-cero...?

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

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

BIt La teora dice que un bit es la unidad bsica de informacin... Vamos a olvidarlo por un momento y demostrar qu es eso en la prctica. La respuesta es nada especial- un bit es un slo dgito binario. Similar a un sistema de numeracin decimal en el que los dgitos de un nmero no tienen la misma ponderacin (por ejemplo, los dgitos en

10

Club Saber Electrnica N 97

B aSES

dE loS

M iCroCoNtroladorES

Figura 9

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

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

detalles IMPortantes El funcionamiento de estos elementos es basado en los principios establecidos por el matemtico britnico George Boole en la mitad del siglo 19 - es decir, antes de la invencin de la primera bombilla! En breve, la idea principal era de expresar las formas lgicas por medio de las funciones algebraicas. Tal idea pronto se transform en un producto prctico que se convirti ms tarde en lo que hoy en da conocemos como circuitos lgicos Y (AND), O (OR) o NO (NOT). El principio de su funcionamiento es conocido como algebra de Boole.

Figura 10 Figura 11

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

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

compuerta o (or) De manera similar, la compuerta O, cuyo smbolo se observa en la figura 12, tambin dispone de dos o ms entradas y de una salida. Si la compuerta dispone de slo dos entradas, es aplicable lo siguiente: la salida proporciona un uno lgico (1) si una u otra entrada (A o B) es llevada a alto (1). En caso de que la compuerta O

Captulo 1

11

El Mundo de los Microcontroladores


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

Figura 12 Figura 13

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

Figura 16 Figura 17

Figura 14 Figura 15

regIstros Un registro o una celda de memoria es un circuito electrnico que puede memorizar el estado de un byte.

12

Club Saber Electrnica N 97

B aSES

dE loS

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

Figura 18

En la figura 18 tenemos un esquena que ejemplifica el funcionamiento de un registro. Puertos de entrada / salIda (e/s) registros sFr A diferencia de los registros que no tienen ninguna funcin especial y predeterminada, cada microcontrolador dispone de un nmero de Para hacer til un microcontrolador, hay que conectarlo a un dispositivo externo, o sea, a un perifrico. Cada microcontrolador tiene uno o ms registros (denominados puertos) conectados a los pines en el microcontrolador, figura 20. Por qu se denominan puertos de entrada/salida? Porque usted puede cambiar la funcin de cada pin como quiera. Por ejemplo, usted desea que su dispositivo encienda y apague los tres seales LEDs y que simultneamente monitoree el estado lgico de 5 sensores o botones de Figura 19 presin. Uno de los puertos debe estar configurado de tal manera que haya tres salidas (conectadas a los LEDs) y cinco entradas (conectadas a los sensores). Eso se realiza simplemente por medio de software, lo que significa que la funcin de algn pin

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

Captulo 1

13

El Mundo de los Microcontroladores


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

Figura 21

De manera similar, cada direccin de memoria corresponde a una localidad de memoria. El contenido de cualquier localidad se puede leer y se le puede acceder al direccionarla. La memoria se puede escribir en la localidad o leer. Hay varios tipos de memoria dentro del microcontrolador: Memoria roM Memoria de slo lectura ROM: Read Only Memory. La memoria ROM se utiliza para guardar permanentemente el programa que se est ejecutando. El tamao de programa que se puede escribir depende del tamao de esta memoria. Los microcontroladores actuales normalmente utilizan el direccionamiento de 16 bits, que significa que son capaces de direccionar hasta 64 Kb de memoria, o sea 65535 localidades. Por ejemplo, si usted es principiante, su programa exceder pocas veces el lmite de varios cientos de instrucciones. Hay varios tipos de memoria ROM: rom de Mscara (enmascarada) - MroM La ROM enmascarada es un tipo de ROM cuyo contenido es programado por el fabricante. El trmino de mscara viene del proceso de fabricacin, donde las partes del chip se plasman en las mascaras utilizadas durante el proceso de fotolitografa. En caso de fabricacin de grandes series, el precio es muy bajo. Olvide la idea de modificarla...

unIdad de MeMorIa La unidad de memoria es una parte del microcontrolador utilizada para almacenar los datos, figura 21. La manera ms fcil de explicarlo es compararlo con un armario grande con muchos cajones. Si marcamos los cajones claramente, ser fcil acceder a cualquiera de sus contenidos al leer la etiqueta en la parte delantera del cajn.

14

Club Saber Electrnica N 97

B aSES
otP roM (one time Programmable roM) roM programable una sola vez La memoria programable una sola vez permite descargar un programa en el chip, pero como dice su nombre, una sola vez. Si se detecta un error despus de descargarlo, lo nico que se puede hacer es descargar el programa correcto en otro chip.
Figura 22

dE loS

M iCroCoNtroladorES

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

uv eProM (uv erasable Programmable roM) - roM programable borrable por rayos ultravioleta El encapsulado de esta memoria, figura 22, tiene una ventana reconocible en la parte alta. Eso permite exponer la superficie del chip de silicio a la luz de ultravioleta y borrar el programa completamente en varios minutos. Luego es posible descargar un nuevo programa en l. La instalacin de esta ventana es complicada, lo que por supuesto afecta al precio. Desde nuestro punto de vista, desgraciadamente, de manera negativa... Memoria Flash Este tipo de memoria se invent en los aos 80 en los laboratorios de la compaa INTEL, como forma desarrollada de la memoria UV EPROM. Ya que es posible escribir y borrar el contenido de esta memoria prcticamente un nmero ilimitado de veces, los microcontroladores con memoria Flash son perfectos para estudiar, experimentar y para la fabricacin en

Captulo 1

15

El Mundo de los Microcontroladores


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

InterruPcIones La mayora de programas utilizan interrupciones durante ejecucin de programa regular. El propsito del microcontrolador generalmente consiste en reaccionar a los cambios en su entorno. En otras palabras, cuando ocurre algo, el microcontrolador reacciona de alguna manera... Por ejemplo, al apretar el botn del mando a distancia, el microcontrolador lo registra y responde al comando cambiando de canal, subiendo o bajando el volumen etc. Si el microcontrolador pasar la mayora del tiempo comprobando varios botones sin parar - las horas, los das, esto no sera nada prctico. Por lo tanto, el microcontrolador aprendi un truco durante su evolucin. En vez de seguir comprobando algn pin o bit, el microconrolador deja su trabajo de esperar a un experto que reaccionar slo en caso de que suceda algo digno de atencin. La seal que informa al procesador central acerca de tal acontecimiento se denomina INTERRUPCIN.

16

Club Saber Electrnica N 97

B aSES
unIdad central de ProcesaMIento (central Processor unIt - cPu) Como indica su nombre, esto es una unidad que controla todos los procesos dentro del microcontrolador.

dE loS

M iCroCoNtroladorES

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

coMunIcacIn en serIe

Consiste en varias unidades ms pequeas, figura 23, de las que las ms importantes son: Decodificador de instrucciones es la parte que descodifica las instrucciones del programa y acciona otros circuitos basndose en esto. El conjunto de instrucciones que es diferente para cada familia de microcontrolador expresa las capacidades de este circuito; Unidad lgica aritmtica (Arithmetical Logical Unit - ALU) realiza todas las operaciones matemticas y lgicas sobre datos; y Acumulador o registro de trabajo. Es un registro SFR estrechamente relacionado con el funcionamiento de la ALU. Es utilizado para almacenar todos los datos sobre los que se debe realizar alguna operacin (sumar, mover). Tambin almacena los resultados preparados para el procesamiento futuro. Uno de los registros SFR, denominado Registro Status (PSW), est estrechamente relacionado con el acumulador. Muestra el estado de un nmero almacenado en el acumulador (el nmero es mayor o menor que cero etc.) en cualquier instante dado.

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

Bus El bus est formado por 8, 16 o ms cables. Hay dos tipos de buses: el bus de direcciones y el bus de datos. El bus de direcciones consiste en tantas lneas como sean necesarias para

Hoy en da, la mayora de los microcontroladores llevan incorporados varios sistemas diferentes para la comunicacin en serie, como un equipo estndar. Cul de estos sistemas se utilizar en un caso concreto, depende de muchos factores, de los que ms importantes son: Con cuntos dispositivos el microcontrolador tiene que intercambiar los datos? Cul es la velocidad del intercambio de datos obligatoria?

Captulo 1

17

El Mundo de los Microcontroladores


Cul es la distancia entre los dispositivos? Es necesario transmitir y recibir los datos simultneamente? Una de las cosas ms importantes en cuanto a la comunicacin en serie es el Protocolo que debe ser estrictamente observado. Es un conjunto de reglas que se aplican obligatoriamente para que los dispositivos puedan interpretar correctamente los datos que intercambian mutuamente. Afortunadamente, los microcontroladores se encargan de eso automticamente, as que el trabajo de programador/usuario es reducido a la escritura y lectura de datos. entre ellos es corta (el receptor y el transmisor estn normalmente en la misma placa de circuito impreso). La conexin se establece por medio de dos lneas - una se utiliza para transmitir los datos, mientras que la otra se utiliza para la sincronizacin (la seal de reloj). Como se muestra en la figura 25, un dispositivo es siempre el principal (master - maestro), el que realiza el direccionamiento de un chip subordinado (slave - esclavo) antes de que se inicie la comunicacin. De esta manera un microcontrolador puede comunicarse con 112 dispositivos diferentes. La velocidad de transmisin serial es normalmente 100 kb/seg (el modo estndar) o 10 Kb/seg (modo de velocidad de transmisin baja). Recientemente han aparecido los sistemas con la velocidad de transmisin serial 3.4 Mb/sec. La distancia entre los dispositivos que se comunican por el bus I2C est limitada a unos metros.

velocIdad de transMIsIn serIal La velocidad de transmisin serial (baud rate) es el trmino utilizado para denotar el nmero de bits transmitidos por segundo (bps). Figura 25 Fjese que este trmino se refiere a bits, y no a bytes! El protocolo normalmente requiere que cada byte se transmita junto con varios bits de control. Eso quiere decir que un byte en un flujo de datos serial puede consistir en 11 bits. Por ejemplo, si velocidad de transmisin serial es 300 bps un mximo de 37 y un mnimo de 27 bytes se pueden transmitir por segundo. Los sistemas de comunicacin serial ms utilizados son:

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

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

18

Club Saber Electrnica N 97

B aSES
Figura 26

dE loS

M iCroCoNtroladorES

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

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

oscIlador Los pulsos uniformes generados por el osciFigura 27

cIrcuIto de alIMentacIn Fuente de alIMenta cIn Hay que mencionar dos cosas dignas de atencin con relacin al circuito de la fuente de alimentacin de microcontroladores: Brown out es un estado potencialmente peligroso que ocurre al apagar el microcontrolador o en caso de que el voltaje de la fuente de alimentacin salga de unos mrgenes debido al ruido elctrico. Como el microcontrolador dispone de varios circuitos que funcionan a niveles de voltaje diferentes, ese estado puede causar un comportamiento descontrolado. Para evitarlo, el microcontrolador normalmente tiene un circuito incorporado para el

Captulo 1

19

El Mundo de los Microcontroladores


brown out reset. El circuito reinicia inmediatamente el microcontrolador si el voltaje de alimentacin cae por debajo del lmite. el pin de reset (reinicio), marcado frecuentemente con MCLR (Master Clear Reset), sirve para el reinicio externo del microcontrolador al aplicar un cero (0) o un uno (1) lgico dependiendo del tipo del microcontrolador. En caso de que el circuito brown out no est incorporado, un simple circuito externo para el brown out reset se puede conectar al pin MCLR. La mayora de los programas utiliza estos cronmetros electrnicos en miniatura. Generalmente son registros SFR de 8 o 16 bits cuyo contenido se aumenta automticamente con cada pulso. Una vez que se llena el registro, se genera una interrupcin! Si el temporizador utiliza el oscilador de cuarzo interno para su funcionamiento, es posible medir el tiempo entre dos eventos (el valor de registro en el momento de iniciar la medicin es T1, en el momento de finalizar la medicin es T2, el tiempo transcurrido es igual al resultado de la resta T2 - T1). Si los registros se aumentan con los pulsos que vienen de la fuente externa, tal temporizador se convierte en un contador. Esto es una explicacin simple de su funcionamiento. Es un poco ms complicado en prctica.

teMPorIzadores contadores El oscilador del microcontrolador utiliza cristal de cuarzo para su funcionamiento. Aunque no se trata de la solucin ms simple, hay muchas razones para utilizarlo. La frecuencia del oscilador es definida con precisin y muy estable, as que siempre genera los pulsos del mismo ancho, lo que los hace perfectos para medicin de tiempo. Tales osciladores se utilizan en los relojes de cuarzo. Si es necesario medir el tiempo transcurrido entre dos eventos, basta con contar los pulsos generados por este oscilador. Esto es exactamente lo que hace el temporizador y su representacin la podemos observar en la figura 28.
Figura 28

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

20

Club Saber Electrnica N 97

B aSES
utIlIzando un Preescalador en el FuncIonaMIento del teMPorIzador Un pre-escalador es un dispositivo electrnico utilizado para dividir la frecuencia por un factor predeterminado. Esto quiere decir que se necesita llevar 1, 2, 4 o ms pulsos a su entrada para generar un pulso a la salida. La mayora de los microcontroladores disponen de uno o ms pre-escaladores incorporados y su tasa de divisin puede ser cambiada dentro del programa. El pre-escalador se utiliza cuando es necesario medir los perodos de tiempo ms largos, figura 29.
Figura 29

dE loS

M iCroCoNtroladorES

Si el temporizador y el temporizador perro guardin comparten un pre-escalador, ste no se puede utilizar por los dos simultneamente.

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

en el

utIlIzando una InterruPcIn FuncIonaMIento del teMPorIzador Si el registro del temporizador es de 8 bits, el

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

Fifura 30

Captulo 1

21

El Mundo de los Microcontroladores


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

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

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

22

Club Saber Electrnica N 97

B aSES
Figura 33

dE loS

M iCroCoNtroladorES

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

arQuItectura Interna de un MIcrocontrolador Todos los microcontroladores actuales utilizan uno de dos modelos bsicos de arquitectura denominados Harvard y Von-Neumann. Son dos maneras diferentes del intercambio de datos entre la CPU y la memoria: arquitectura de von-neumann Los microcontroladores que utilizan la arquitectura Von- Neumann disponen de un solo bloque de memoria y de un bus de datos de 8 bits, figura 34.

Figura 34

Figura 35

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

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

Captulo 1

23

El Mundo de los Microcontroladores


dentro del microcontrolador que se intercambian son de la misma anchura. Durante el proceso de la escritura de programa, slo se manejan los datos de 8 bits. En otras palabras, todo lo que usted podr cambiar en el programa y a lo que podr afectar ser de 8 bits de ancho. Todos los programas escritos para estos microcontroladores sern almacenados en la memoria ROM interna del microcontrolador despus de haber sido compilados a cdigo mquina. No obstante, estas localidades de memoria ROM no tienen 8, sino 12, 14 o 16 bits. 4, 6 o 8 bits adicionales representan una instruccin que especifica a la CPU qu hacer con los datos de 8 bits. Las ventajas de este diseo son las siguientes: Todos los datos en el programa son de un byte (8 bits) de ancho. Como un bus de datos utilizado para lectura de programa tiene unas lneas ms (12, 14 o 16), tanto la instruccin como el dato se pueden leer simultneamente al utilizar estos bits adicionales. Por eso, todas las instrucciones se ejecutan en un ciclo salvo las instrucciones de salto que son de dos ciclos. El hecho de que un programa (la ROM) y los datos temporales (la RAM) estn separados, permite a la CPU poder ejecutar dos instrucciones simultneamente. Dicho de manera sencilla, mientras que se realiza la lectura o escritura de la RAM (que marca el fin de una instruccin), la siguiente instruccin se lee por medio de otro bus. En los microcontroladores que utilizan la arquitectura de von-Neumann, nunca se sabe cunta memoria ocupar algn programa. Generalmente, la mayora de las instrucciones de programa ocupan dos localidades de memoria (una contiene informacin sobre QU se debe realizar, mientras que la otra contiene informacin sobre CUL dato se debe realizar). Sin embargo, esto no es una frmula rgida, sino el caso ms frecuente. En los microcontroladores que utilizan una arquitectura Harvard, el bus de la palabra de programa es ms ancho que un byte, lo que permite que cada palabra de programa est compuesto por una instruccin y un dato. En otras palabras, una localidad de memoria - una instruccin de programa.

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

Figura 36

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

24

Club Saber Electrnica N 97

B aSES
cil explicar dnde est el aeropuerto si se utilizan las palabras adecuadas tales como: a la derecha, a la izquierda, el kilmetro etc. cIsc (complex Instruction set computer) - computadoras con un juego de instrucciones complejo CISC es opuesto a RISC! Los microcontroladores diseados para reconocer ms de 200 instrucciones diferentes realmente pueden realizar muchas cosas a alta velocidad. No obstante, uno debe saber cmo utilizar todas las posibilidades que ofrece un lenguaje tan rico, lo que no es siempre tan fcil.

dE loS

M iCroCoNtroladorES

cMo se deBe elegIr un MIcrocontrolador? Si usted es principiante y ha tomado decisin de trabajar con los microcontroladores. felicitaciones por la eleccin! No obstante, a primera vista, no es fcil la eleccin del microcontrolador ms adecuado como parece a la primera vista. El problema no es el pequeo rango de dispositivos a elegir, sino todo lo contrario! Antes de empezar a disear un dispositivo basado en un microcontrolador, tome en cuenta

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

Captulo 1

25

Captulo 2

eL mundo de LoS microcontroLadoreS

SiStemaS de Programacin: Lenguaje mikroc


Usted seguramente sabe que no es suficiente slo conectar el microcontrolador a los otros componentes y encender una fuente de alimentacin para hacerlo funcionar, verdad? Hay que hacer algo ms. Se necesita programar el microcontrolador. Si cree que esto es complicado, est equivocado. Todo el procedimiento es muy simple. Basta con leer el texto para entender de lo que estamos hablando. www.mikroe.com

Lenguajes de Programacin El microcontrolador ejecuta el programa cargado en la memoria flash. Esto se denomina el cdigo ejecutable y est compuesto por una serie de ceros y unos, aparentemente sin significado. Dependiendo de la arquitectura del microcontrolador, el cdigo binario est compuesto por palabras de 12, 14 o 16 bits de

ancho. Cada palabra se interpreta por la CPU como una instruccin a ser ejecutada durante el funcionamiento del microcontrolador. Todas las instrucciones que el microcontrolador puede reconocer y ejecutar se les denominan colectivamente Conjunto de instrucciones. Como es ms fcil trabajar con el sistema de numeracin hexadecimal, el cdigo ejecutable se representa con frecuencia como una serie de los nmeros

Captulo 2

27

El Mundo de los Microcontroladores


hexadecimales denominada cdigo Hex. En los microcontroladores PIC con las palabras de programa de 14 bits de anchura, el conjunto de instrucciones tiene 35 instrucciones diferentes. lenguaje ensamblador tiene algunas desventajas a saber: * Incluso una sola operacin en el programa escrito en ensamblador consiste en muchas instrucciones, hacindolo muy largo y difcil de manejar. * Cada tipo de microcontrolador tiene su propio conjunto de instrucciones que un programador tiene que conocer para escribir un programa * Un programador tiene que conocer el hardware del microcontrolador para escribir un programa En la figura 2 podemos observar un programa escrito en C y el mismo programa compilado al cdigo ensamblador. Los lenguajes de programacin de alto nivel (Basic, Pascal, C etc.) fueron creados con el propsito de superar las desventajas del ensamblador. En lenguajes de programacin de alto nivel varias instrucciones en ensamblador se sustituyen por una sentencia. El programador ya no tiene que conocer el conjunto de instrucciones o caractersticas del hardware del microcontrolador utilizado. Ya no es posible conocer exactamente cmo se ejecuta cada sentencia, de todas formas ya no importa. Aunque siempre se puede insertar en el programa una secuencia escrita en ensamblador.

Lenguaje ensambLador Como el proceso de escribir un cdigo ejecutable era considerablemente arduo, en consecuencia fue creado el primer lenguaje de programacin denominado ensamblador (ASM). Siguiendo la sintaxis bsica del ensamblador, era ms fcil escribir y comprender el cdigo. Las instrucciones en ensamblador consisten en las abreviaturas con significado y a cada instruccin corresponde una localidad de memoria. Un programa denominado ensamblador compila (traduce) las instrucciones del lenguaje ensamblador a cdigo mquina (cdigo binario). Vea la figura 1. Este programa compila instruccin a instruccin sin optimizacin. Como permite controlar en detalle todos los procesos puestos en marcha dentro del chip, este lenguaje de programacin todava sigue siendo popular.

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

Figura 1

28

Club Saber Electrnica N 97

S iStEmaS

dE

P rogramaCiN : L ENguajE

mikro C

Figura 2

Si alguna vez ha escrito un programa para un microcontrolador PIC en lenguaje ensamblador, probablemente sepa que la arquitectura RISC carece de algunas instrucciones. Por ejemplo, no hay instruccin apropiada para multiplicar dos nmeros. Por supuesto, para cada problema hay una solucin y ste no es una excepcin gracias a la aritmtica que permite realizar las operaciones complejas al descomponerlas en un gran nmero operaciones ms simples. En este caso, la multiplicacin se puede sustituir con facilidad por adicin sucesiva (a x b = a + a + a + ... + a). Ya estamos en el comienzo de una historia muy larga... No hay que preocuparse al utilizar uno de estos lenguajes de programacin de alto nivel como es C, porque el compilador encontrar automticamente la solucin a ste problema y otros similares. Para multiplicar los nmeros a y b, basta con escribir a*b axb.

Lenguaje c El lenguaje C dispone de todas las ventajas de un lenguaje de programacin de alto nivel (anteriormente descritas) y le permite realizar algunas operaciones tanto sobre los bytes como sobre los bits (operaciones lgicas, desplazamiento etc.). Las caractersticas de C pueden ser muy tiles al programar los microcontroladores. Adems, C est estandarizado (el estndar ANSI), es muy portable, as que el mismo cdigo se puede utilizar muchas veces en diferentes proyectos. Lo que lo hace accesible para cualquiera que conozca este lenguaje sin reparar en el propsito de uso del microcontrolador. C es un lenguaje compilado, lo que significa que los archivos fuentes que contienen el cdigo C se traducen a lenguaje mquina por el compilador. Todas estas caractersticas hicieron al C uno de los lenguajes de programacin ms populares.

Captulo 2

29

El Mundo de los Microcontroladores

Figura 3

La figura 3 es un ejemplo general de lo que sucede durante la compilacin de programa de

un lenguaje de programacin de alto nivel a bajo nivel.

caracterSticaS deL Lenguaje mikroc


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

30

Club Saber Electrnica N 97

S iStEmaS

dE

P rogramaCiN : L ENguajE

mikro C

El trmino C se utilizar para referirse a las caractersticas comunes de los lenguajes C y mikroC. Este libro describe una aplicacin muy concreta del lenguaje de programacin C utilizado en el compilador mikroc Pro for Pic. En este caso, el compilador se utiliza para la programacin de los microcontroladores PIC. Cabe destacar que el lector no necesariamente precisar este compilador pero creemos oportuno utilizarlo dado que sus ventajas son enormes. De todos modos, en el prximo captulo, veremos otras formas de trabajar con microcontroladores PIC.

Fases de La comPiLacin El proceso de compilacin consiste en varios pasos y se ejecuta automticamente por el compilador, figura 5. Por consiguiente, un conocimiento bsico del funcionamiento puede ser til para entender el concepto del lenguaje mikroC.

Figura 5

El archivo fuente contiene el cdigo en mikroC que usted escribe para programar el microcontrolador. El preprocesador se utiliza automticamente por el compilador al iniciarse el proceso de la compilacin. El compilador busca las directivas del preprocesador (que siempre empiezan por #) dentro del cdigo y modifica el cdigo fuente de acuerdo con las directivas. En esta fase se llevan a cabo inclusin de archivos, definicin de constantes y macros etc., lo que facilita el proceso. Ms tarde vamos a describir estas directivas en detalle. El analizador sintctico (parser) elimina toda la informacin intil del cdigo (comentarios, espacios en blanco). Luego, el compilador traduce el cdigo a un archivo binario denominado archivo .mcl. El enlazador (linker) recupera toda la informacin requerida para ejecutar el programa de los archivos externos y la agrupa en un solo archivo (.dbg). Adems, un proyecto puede contener ms de un archivo fuente y el programador puede utilizar funciones predefinidas y agrupadas dentro de los archivos denominados libreras. Por ltimo, el generador .hex produce un archivo .hex. Es el archivo que se va a cargar en el microcontrolador. El proceso entero de la compilacin que incluye todos los pasos anteriormente descritos se le denomina building.

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

Captulo 2

31

El Mundo de los Microcontroladores


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

Figura 7

32

Club Saber Electrnica N 97

S iStEmaS

dE

P rogramaCiN : L ENguajE

mikro C

La manera de escribir el cdigo en C es muy importante. Por ejemplo, C difiere entre minsculas y maysculas, as que la funcin main() no se puede escribir MAIN() o Main(). Adems, note que dos lneas del cdigo dentro de la funcin terminan con un punto y coma. En C todas las sentencias deben terminar con un punto y coma ;, as el compilador puede aislarlas y traducirlas a cdigo mquina. Para comprender mejor esta estructura mire la figura 8 en la que se expresan diferentes observaciones dentro del programa.
Figura 8

comentarios Los comentarios son las partes del programa utilizados para aclarar las instrucciones de programa o para proporcionar ms informacin al respecto. El compilador no hace caso a los comentarios y no los compila al cdigo ejecutable. Dicho de manera sencilla, el compilador es capaz de reconocer los caracteres especiales utilizados para designar dnde los comentarios comienzan y terminan y no hace nada de caso al texto entre ellos durante la compilacin. Hay dos tipos de tales caracteres. Unos designan los comentarios largos que ocupan varias lneas de programa marcados por la secuencia especial /*...*/, mientras que otros designan los comentarios cortos que caben en una sola lnea //. Aunque los comentarios no pueden afectar a la ejecucin de programa, son tan importantes como cualquier otra parte de programa. Aqu est el porqu... con frecuencia es necesario mejorar, modificar, actualizar, simplificar un programa... No es posible interpretar incluso los programas simples sin utilizar los comentarios.

Captulo 2

33

El Mundo de los Microcontroladores


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

Tabla 1

Al aadir un prefijo (calificador) a cualquier tipo de dato entero o carcter, el rango de sus posibles valores cambia as como el nmero de los bytes de memoria necesarios. Por defecto, los datos de tipo int son con signo, mientras que los de tipo char son sin signo. El calificador signed (con signo) indica que el dato puede ser positivo o negativo. El prefijo unsigned indica que el dato puede ser slo positivo. Note en la tabla 2 que el prefijo es opcional.

Tabla 2

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

34

Club Saber Electrnica N 97

S iStEmaS
0x11 11 -152 011 0b11

dE

P rogramaCiN : L ENguajE

mikro C

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

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

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

Una secuencia de caracteres es denominada cadena (string). Las cadenas estn encerradas entre comillas dobles: "Presione el botn RA0"

VariabLes y constantes definiciones Una variable es un objeto nombrado capaz de contener un dato que puede ser modificado durante la ejecucin de programa. En C, las variables tienen tipo, que significa que es necesario especificar el tipo de dato que se le asigna a una variable (int, float etc.). Las variables se almacenan en la memoria RAM y el espacio de memoria que ocupan (en bytes) depende de su tipo, figura 13. /* dos lneas de programa consecutivas. En la primera lnea del programa se define el tipo de variable */ int a = 1000; a = 15; // Variable a es de tipo int y equivale a 1000 // a equivale a 15

Captulo 2

35

El Mundo de los Microcontroladores


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

Cada variable o constante debe tener un identificador que lo distingue de otras variables y constantes. Refirase a los ejemplos anteriores, a y a son identificadores. reglas para nombrar En mikroC los identificadores pueden ser tan largos como quiera. Sin embargo, hay varias restricciones a saber: * Los identificadores pueden incluir cualquiera de los caracteres alfabticos A-Z (a-z), los dgitos 0-9 y el carcter subrayado _. El compilador es sensible a la diferencia entre minsculas y maysculas. Los nombres de funciones y variables se escriben con frecuencia con minsculas, mientras que los nombres de constantes se escriben con maysculas. * Los identificadores no pueden empezar con un dgito. * Los identificadores no pueden coincidir con las palabras clave del lenguaje mikroC, porque son las palabras reservadas del compilador. El compilador mikroC reconoce 33 palabras clave que se muestran en la tabla 3.

Tabla 3

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

36

Club Saber Electrnica N 97

S iStEmaS
temperatura_V1 Presin no_corresponder dat2string SuM3 _vtexto 7temp %ms_alto if j23.07.04 nombre de variable

dE

P rogramaCiN : L ENguajE

mikro C

// OK // OK // OK // OK // OK // OK // NO -- no puede empezar con un nmero // NO -- no pueden contener caracteres especiales // NO -- no puede coincidir con una palabra reservada // NO -- no puede contener caracteres especiales (punto) // NO -- no puede contener espacio en blanco

declaracin de Variables Cada variable debe ser declarada antes de ser utilizada en el programa. Como las variables se almacenan en la memoria RAM, es necesario reservar el espacio para ellas (uno, dos o ms bytes). Al escribir un programa, usted sabe qu tipo de datos quiere utilizar y qu tipo de datos espera como resultado de una operacin, mientras que el compilador no lo sabe. No se olvide de que el programa maneja las variables con los nombres asignados. El compilador las reconoce como nmeros en la memoria RAM sin conocer su tamao y formato. Para mejorar la legibilidad de cdigo, las variables se declaran con frecuencia al principio de las funciones: <tipo> variable; Es posible declarar ms de una variable de una vez si tienen el mismo tipo: <tipo> variable1, variable2, variable3; Aparte del nombre y del tipo, a las variables se les asignan con frecuencia los valores iniciales justamente enseguida de su declaracin. Esto no es un paso obligatorio, sino una cuestin de buenas costumbres. Se parece a lo siguiente: unsigned int peso; peso = 20; // Declarar una variable llamada peso // Asignar el valor 20 a la variable peso

Un mtodo ms rpido se le denomina declaracin con inicializacin (asignacin de los valores iniciales): unsigned int peso = 20; // peso est declarado y su valor es 20

Si hay varias variables con el mismo valor inicial asignado, el proceso se puede simplificar: unsigned int peso1 = peso2 = peso3 = 20; int valor_inicial = un_mnimo_de_petrleo = 0; Tenga cuidado de no declarar la misma variable otra vez dentro de la misma funcin. Puede modificar el contenido de una variable al asignarle un nuevo valor tantas veces que quiera. Al declarar una variable, siempre piense en los valores que la variable tendr que contener durante la ejecucin de programa.

Captulo 2

37

El Mundo de los Microcontroladores


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

declaracin de constantes Similar a las variables, las constantes deben ser declaradas antes de ser utilizadas en el programa. En mikroC, no es obligatorio especificar el tipo de constante al declararla. Por otra parte, las constantes deben ser inicializadas a la vez que se declaran. El compilador reconoce las constantes por su prefijo const utilizado en la declaracin. Dos siguientes declaraciones son equivalentes: const int MINIMUM = -100; const MINIMUM = -100; // Declarar constante MINIMUM // Declarar constante MINIMUM

Las constantes pueden ser de cualquier tipo, incluyendo cadenas: const T_MAX = 3.260E1; const I_CLASS = A; const Mensaje = Presione el botn IZQUIERDA; // constante de punto flotante T_MAX // constante carcter I_CLASS // constante de cadena Mensaje

Las constantes de enumeracin son un tipo especial de constantes enteras que hace un programa ms comprensible al asignar los nmeros ordinales a las constantes. Por defecto, el valor 0 se asigna automticamente a la primera constante entre llaves, el valor 1 a la segunda, el valor 2 a la tercera etc. enum surtidores {AGUA,GASLEO,CLORO}; // AGUA = 0; GASLEO = 1; CLORO = 2

Es posible introducir directamente el valor de una constante dentro de la lista de enumeraciones. El incremento se detiene al asignar un valor a un elemento de matriz, despus se reinicia a partir del valor asignado. Vea el siguiente ejemplo: enum surtidores {AGUA,GASLEO=0,CLORO}; // AGUA = 0; GSOLEO = 0; CLORO = 1

Las constantes de enumeracin se utilizan de la siguiente manera: int Velocidad_de_ascensor enum motor_de_ascensor {PARADA,INICIO,NORMAL,MXIMO}; Velocidad_de_ascensor = NORMAL; // Velocidad_de_ascensor = 2

definir los nuevos tipos de datos La palabra clave typedef le permite crear con facilidad los nuevos tipos de datos, as, por ejemplo, podemos escribir la siguiente sentencia: typedef unsigned int positivo; positivo a,b; a = 10; b = 5; // positivo es un sinnimo para el tipo sin signo int // Variables a y b son de tipo positivo // Variable a equivale a 10 // Variable b equivale a 5

38

Club Saber Electrnica N 97

S iStEmaS
mbito de VariabLes y constantes

dE

P rogramaCiN : L ENguajE

mikro C

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

Figura 9

A las variables globales se les puede acceder de cualquier parte en el cdigo, an dentro de las funciones con tal de que sean declaradas. El mbito de una variable global est limitado por el fin del archivo fuente en el que ha sido declarado. El mbito de variables locales est limitado por el bloque encerrado entre llaves {} en el que han sido declaradas. Por ejemplo, si estn declaradas en el principio del cuerpo de funcin (igual que en la funcin main) su mbito est entre el punto de declaracin y el fin de esa funcin. Refirase al ejemplo anterior. A las variables locales declaradas en main() no se les puede acceder desde la Funcin_1 y al revs. Un bloque compuesto es un grupo de declaraciones y sentencias (que pueden ser bloques tambin) encerradas entre llaves. Un bloque puede ser una funcin, una estructura de control etc. Una variable declarada dentro de un bloque se considera local, o sea, existe slo dentro del bloque. Sin embargo, las variables declaradas fuera del mbito todava son visibles. Aunque las constantes no pueden ser modificadas en el programa, siguen las mismas reglas que las variables. Esto significa que son visibles dentro de su bloque a excepcin de las constantes globales (declaradas fuera de cualquier funcin). Las constantes se declaran normalmente en el inicio del cdigo fuera de cualquier funcin (como variables globales).

Captulo 2

39

El Mundo de los Microcontroladores


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

Figura 10

static es una clase de almacenamiento por defecto para las variables globales. Especifica que una variable es visible dentro del archivo. A las variables locales declaradas con el prefijo static se les puede acceder dentro del archivo fuente (o sea se comportan como variables globales). extern: la palabra clave extern se utiliza cuando el programa est compuesto por diferentes archivos fuente. Esto le permite utilizar una variable, una constante o una funcin declarada en otro archivo. Por supuesto, para compilar y enlazar este archivo correctamente, el mismo debe ser incluido en su proyecto. Vea un ejemplo de un programa que consiste en dos archivos: File_1 y File_2. File_1 utiliza una variable y una funcin declaradas se usa en File_2. File 1: extern int cnt; extern void hello(); void main(){ PORTA = cnt++; hello(); } // Variable cnt es visible en File_1 // Funcin hello()se puede utilizar en File_1

// Cualquier modificacin de cnt en File_1 ser visible en File_2 // Funcin hello()se puede llamar desde aqu

File 2: int cnt = 0; void hello(); void hello(){ . . } // Modificaciones que afectan a la // cnt en File_1 son visibles aqu

oPeradores Un operador es un smbolo que denota una operacin aritmtica, lgica u otra operacin particular. Dicho de manera sencilla, varias operaciones aritmticas y lgicas se realizan por medio de

40

Club Saber Electrnica N 97

S iStEmaS

dE

P rogramaCiN : L ENguajE

mikro C

los operadores. Hay ms de 40 operaciones disponibles en el lenguaje C, pero se utiliza un mximo de 10 a 15 de ellas en la prctica. Cada operacin se realiza sobre uno o ms operandos que pueden ser variables o constantes. Adems, cada operacin se caracteriza por la prioridad de ejecucin y por la asociatividad.

operadores aritmticos Los operadores aritmticos se utilizan en las operaciones aritmticas y siempre devuelven resultados numricos. Hay dos tipos de operadores, los unitarios y los binarios. A diferencia de las operaciones unitarias que se realizan sobre un operando, las operaciones binarias se realizan sobre dos operandos. En otras palabras, se requieren dos nmeros para ejecutar una operacin binaria. Por ejemplo: a+b o a/b. Vea en la tabla 4 cules son los operadores aritmticos:

Tabla 4

int a,b,c; a = 5; b = 4; c = a + b; c = c%2;

// Declarar 3 enteros a, b, c // Inicializar a // Inicializar b // c = 9 // c = 1. Esta operacin se utiliza con frecuencia // para comprobar la paridad. En este caso, el // resultado es 1 lo que significa que la variable // es un nmero imparo

operadores de asignacin Hay dos tipos de asignacin en el lenguaje C: * Los operadores simples asignan los valores a las variables utilizando el carcter comn =. Por ejemplo: a =8 * Las asignaciones compuestas son especficas para el lenguaje C. Consisten en dos caracteres como se muestra en la tabla 5.

Tabla 5

int a = 5; // Declarar e inicializar la variable a a += 10; // a = a + 10 = 15

Captulo 2

41

El Mundo de los Microcontroladores


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

Tabla 6

int a, b, c; a = b = 5; c = 1 + a++; b = ++c + a

// c = 6 // b = 7 + 6 = 13

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

Tabla 7

int prop; int var = 5; prop = var < 10; // Expresin es evaluada como verdadera, prop = 1 En mikroC, si una expresin es evaluada como falsa (false), el operador devuelve 0, mientras que si una oracin es evaluada como verdadera (true), devuelve 1. Esto se utiliza en expresiones tales como si la expresin es evaluada como verdadera, entonces... operadores Lgicos Hay tres tipos de operaciones lgicas en el lenguaje C: y (and) lgico, o (or) lgico y negacin - no (not) lgico. Los operadores lgicos devuelven verdadero (1 lgico) si la expresin evaluada es distinta de cero. En caso contrario, devuelve falso (0 lgico) si la expresin evaluada equivale a cero. Esto es muy importante porque las operaciones lgicas se realizan generalmente sobre

42

Club Saber Electrnica N 97

S iStEmaS

dE

P rogramaCiN : L ENguajE

mikro C

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

Tabla 8

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

Tabla 9

cmo utilizar los operadores? Aparte de los operadores de asignacin, dos operadores no deben estar escritos uno junto al otro, por ejemplo: x*%12; // esta expresin generar un error

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

Captulo 2

43

El Mundo de los Microcontroladores

Tabla 10

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

La autoconversin se realiza asimismo en las operaciones de asignacin. El resultado de la expresin de la derecha del operador de la asignacin siempre se convierte en el tipo de la variable de la izquierda del operador. Si el resultado es de tipo de la prioridad ms alta, se descarta o se redondea para coincidir con el tipo de la variable. Al convertir un dato real en un entero, siempre se descartan los nmeros que siguen al punto decimal: int x; x = 3; x+ = 3.14; // A la variable x se le asigna el tipo integer (un entero) // A la variable x se le asigna el valor 3 // El valor 3.14 se agrega a la variable x al // realizar la operacin de asignacin

/* El resultado de la adicin es 6 en vez de 6.14, como era de esperar. Para obtener el resultado esperado sin descartar los nmeros que siguen al punto decimal, se debe declarar x como un punto flotante. */

44

Club Saber Electrnica N 97

S iStEmaS

dE

P rogramaCiN : L ENguajE

mikro C

Para realizar una conversin explcita, antes de escribir una expresin o una variable hay que especificar el tipo de resultado de operacin entre parntesis: double distancia, tiempo, velocidad; distancia = 0.89; tiempo = 0.1; velocidad = (int)(a/b); // c = (int)8.9 = 8.0 velocidad = ((int)a)/b; // c = 0/0.1 = 0.0

estructuras de controL

estructuras condicionales Las condiciones son ingredientes comunes de un programa. Las condiciones permiten ejecutar una o varias sentencias dependiendo de validez de una expresin. En otras palabras, Si se cumple la condicin (...), se debe hacer (...). De lo contrario, si la condicin no se cumple, se debe hacer (...). Los operandos condicionales if-else y switch se utilizan en las operaciones condicionales. Una sentencia condicional puede ser seguida por una sola sentencia o por un bloque de sentencias a ser ejecutadas. operador condicional if-else El operador if se puede utilizar solo o asociado al operador else (if-else). Ejemplo del operador if: if(expresin) operacin; Si el resultado de la expresin encerrada entre parntesis es verdadero (distinto de 0) la operacin se realiza y el programa contina con la ejecucin. Si el resultado de la expresin es falso (0), la operacin no se realiza y el programa contina inmediatamente con la ejecucin. Como hemos mencionado, la otra forma combina tanto el operador if como el else: if(expresin) operacin1 else operacin2; Si el resultado de la expresin es verdadero (distinto de 0), se realiza operacin1, de lo contrario se realiza la operacin2. Despus de realizar una de las operaciones, el programa contina con la ejecucin. La sentencia if-else se parece a lo siguiente: if(expresin) operacin1 else operacin2 Si operacin1 u operacin2 est compuesta, escriba una lista de sentencias encerradas entre llaves. Por ejemplo:

Captulo 2

45

El Mundo de los Microcontroladores


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

// // operacin1 //

El operador if-else se puede sustituir por el operador condicional ?:: (expresin1)? expresin2 : expresin3 Si el valor de la expresin1 es distinto de 0 (verdadero), el resultado de la expresin entera ser equivalente al resultado obtenido de la expresin2. De lo contrario, si la expresin1 es 0 (falso), el resultado de la expresin entera ser equivalente al resultado obtenido de la expresin3. Por ejemplo: maximum = (a>b)? a : b // A la variable maximum se le asigna el // valor de la variable mayor(a o b)

operador switch A diferencia de la sentencia if-else que selecciona entre dos opciones en el programa, el operador switch permite elegir entre varias opciones. La sintaxis de la sentencia switch es: switch (selector) { case constante1: operacin1 ... break; case constante2: operacin2 ... break; ... default: operacin_esperada ... break; } La operacin switch se ejecuta de la siguiente manera: primero se ejecuta el selector y se compara con la constante1. Si coinciden, las sentencias que pertenecen a ese bloque se ejecutan hasta llegar a la palabra clave break o hasta el final de la operacin switch. Si no coinciden, el selector se // El grupo de operadores que se ejecuta si // ninguna constante equivale al selector // El grupo de operadores se ejecuta si // el selector y la constante2 son equivalentes // Selector es de tipo char o int

// El grupo de operadores que se ejecutan si // el selector y la constante1 son equivalentes

46

Club Saber Electrnica N 97

S iStEmaS

dE

P rogramaCiN : L ENguajE

mikro C

compara con la constante2. Si coinciden, las sentencias que pertenecen a ese bloque se ejecutan hasta llegar a la palabra clave break etc. Si el selector no coincide con ninguna constante, se ejecutarn las operaciones que siguen al operador default. Tambin es posible comparar una expresin con un grupo de constantes. Si coincide con alguna de ellas, se ejecutarn las operaciones apropiadas: switch (das) // La variable das representa un da de la semana. { // Es necesario determinar si es un da laborable o no lo es case1:case2:case3:case4:case5: LCD_message = Da laborable; break; case6:case7: LCD_message = Fin de semana; break; default:LCD_message_1 = Elija un da de la semana; break; } La palabra clave de C break se puede utilizar en cualquier tipo de bloques. Al utilizar break, es posible salir de un bloque aunque la condicin para su final no se haya cumplido. Se puede utilizar para terminar un bucle infinito, o para forzar un bucle a terminar antes de lo normal.

bucLes A menudo es necesario repetir una cierta operacin un par de veces en el programa. Un conjunto de comandos que se repiten es denominado un bucle de programa. Cuntas veces se ejecutar, es decir cunto tiempo el programa se quedar en el bucle, depende de las condiciones de salir del bucle.

bucle While El bucle while se parece a lo siguiente: while(expresin){ comandos ... } Los comandos se ejecutan repetidamente (el programa se queda en el bucle) hasta que la expresin llegue a ser falsa. Si la expresin es falsa en la entrada del bucle, entonces el bucle no se ejecutar y el programa continuar desde el fin del bucle while. Un tipo especial del bucle de programa es un bucle infinito. Se forma si la condicin sigue sin cambios dentro del bucle. La ejecucin es simple en este caso ya que el resultado entre llaves es siempre verdadero (1=verdadero), lo que significa que el programa se queda en el mismo bucle: while(1){ ... ... } // En vez de while(1), se puede escribir while(true) // Expresiones encerradas entre llaves se ejecutarn // repetidamente (bucle infinito)

Captulo 2

47

El Mundo de los Microcontroladores


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

La operacin se ejecutar cinco veces. Luego, al comprobar se valida que la expresin k<5 sea falsa (despus de 5 iteraciones k=5) y el programa saldr del bucle for.

bucle do-while El bucle do-while se parece a lo siguiente: do operacin while (cambiar_condicin); La expresin cambiar_condicin se ejecuta al final del bucle, que significa que operacin se ejecuta como mnimo una vez sin reparar en que si la condicin es verdadera o falsa. Si el resultado es distinto de 0 (verdadero), el procedimiento se repite. Todos los siguientes ejemplos son equivalentes. Esta parte del cdigo visualiza hello en un LCD 10 veces con un retardo de un segundo. Note que en este ejemplo se utilizan funciones predefinidas, que se encuentran en las libreras del compilador mikroC PRO for PIC. No obstante le aconsejamos que no trate de entenderlas en detalle. Su comportamiento general dentro del bucle se explica por medio de los comentarios. i = 0; while (i<10) { Lcd_Out(1,3,hello); Delay_ms(1000); Lcd_Cmd(_LCD_CLEAR); Delay_ms(500); i++; } // Inicializacin del contador // Condicin // Visualizar hello en el LCD // Retardo de 1000 ms // Borrar el LCD // Retardo de 500ms // Contador se incrementa

48

Club Saber Electrnica N 97

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

dE

P rogramaCiN : L ENguajE

mikro C

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

// Visualizar hello en el LCD // Retardo de 1000 ms // Borrar LCD // Retardo de 500ms // Contador se incrementa // Condicin

sentencias de saLto sentencia break A veces es necesario detener y salir de un bucle dentro de su cuerpo. La sentencia break se puede utilizar dentro de cualquier bucle (while, for, do while) y en las sentencias switch tambin. En stas la sentencia break se utiliza para salir de las sentencias switch si la condicin case es verdadera. En este ejemplo, Esperar est parpadeando en la pantalla LCD hasta que el programa detecte un uno lgico en el pin 0 del puerto PORTA. while(1){ if(PORTA.F0 == 1) break; Lcd_Out(1,3,Esperar); Delay_ms(1000); Lcd_Cmd(_LCD_CLEAR); Delay_ms(500); } // Bucle infinito // Probar si el estado lgico del pin 0 del puerto // PORTA es 1; si equivale, salir del bucle // Visualizar Esperar en el LCD // Retardo de 1000 ms // Borrar LCD // Retardo de 500ms

sentencia continue La sentencia continue colocada dentro de un bucle se utiliza para saltar una iteracin. A diferencia de la sentencia break, el programa se queda dentro del bucle y las iteraciones continan. // Si x=7, puede ocurrir una divisin por 0. // continue se utiliza aqu para evitar esta situacin. x=1; while (x<=10) { if (x == 7) { Lcd_Cmd(_LCD_CLEAR); Lcd_Out(1,3,Division by 0);

// saltar x=7 para evitar divisin por 0

Captulo 2

49

El Mundo de los Microcontroladores


Delay_ms(1000); x++; continue; } a = 1/(x-7); // Esta divisin generar un error si x=7

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

/* Muchas operaciones pueden ocurrir aqu */ Lcd_Out(1,3,Division is OK); Delay_ms(1000); x++; } // Poner este mensaje en el LCD

sentencia goto La sentencia goto le permite hacer un salto absoluto al otro punto en el programa. Esta caracterstica se debe utilizar con precaucin ya que su ejecucin puede causar un salto incondicional sin hacer caso a todos los tipos de limitaciones de anidacin. El punto destino es identificado por una etiqueta, utilizada como un argumento para la sentencia goto. Una etiqueta consiste en un identificador vlido seguido por un colon (:). ... if(CO2_sensor) goto aire acondicionado; // Si se consta que el valor ... // de la variable CO2_sensor =1 // hacer salto a la lnea de programa // Aire acondicionado ... Aire acondicionado: // Desde aqu sigue la parte del cdigo que se ejecutar // en caso de una concentracin de CO2 demasiado alta ... // en el ambiente

tiPos de datos aVanzados

matrices Una matriz es una lista de elementos del mismo tipo colocados en localidades de memoria contiguas. Cada elemento es referenciado por un ndice. Para declarar una matriz, es necesario especificar el tipo de sus elementos (denominado tipo de matriz), su nombre y el nmero de sus elementos encerrados entre corchetes. Todos los elementos de una matriz tienen el mismo tipo. tipo_de_matriz nombre_de_matriz [n_de_elementos]; Los elementos de una matriz se identifican por su posicin. En C, el ndice va desde 0 (el primer elemento de una matriz) a N-1 (N es el nmero de elementos contenidos en una matriz). El compilador tiene que saber cuntas localidades de memoria debe alojar al declarar una matriz.

50

Club Saber Electrnica N 97

S iStEmaS

dE

P rogramaCiN : L ENguajE

mikro C

El tamao de una matriz no puede ser una variable. Por eso, se pueden utilizar dos mtodos: // mtodo 1 // Declaracin de la matriz display capaz de contener 3 enteros // mtodo 2 // Declaracin de la matriz Matriz_nueva // capaz de contener 5 enteros

int display [3]; const DGITOS = 5; char Matriz_nueva[DGITOS];

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

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

El siguiente programa cambia el orden de los elementos de una matriz. Note que el ndice se puede expresar mediante variables y operaciones bsicas. void main() { // Valor de la constante MUESTRAS_DE_AGUA es 4 const MUESTRAS_DE_AGUA = 4; int i, temp; // Variables i y temp son de tipo int int profunidad_de_sonda [MUESTRAS_DE_AGUA] = {24,25,1,1987}; // Todos // los miembros de la matriz profundidad // de sonda son de tipo int for(i=0;i<(MUESTRAS_DE_AGUA/2);i++){ // Bucle se ejecuta 2 veces temp = profundiad_de_sonda [i]; // temp se utiliza para guardar un valor // temporalmente profundiad_de_sonda [i] = profundiad_de_sonda [MUESTRAS_DE_AGUA-1-i]; profundiad_de_sonda [MUESTRAS_DE_AGUA-1-i] = temp; } // Aqu tenemos: profundidad_de_sonda [MUESTRAS_DE_AGUA] = {1987,1,25,24} } matrices bidimensionales Aparte de las matrices unidimensionales que se pueden interpretar como una lista de valores, el lenguaje C le permite declarar matrices multidimensionales.

Captulo 2

51

El Mundo de los Microcontroladores


En esta parte vamos a describir slo las matrices bidimensionales, tambin denominadas tablas o matrices. Una matriz bidimensional se declara al especificar el tipo de dato de matriz, el nombre de matriz y el tamao de cada dimensin. tipo_de_matriz nombre_de_matriz [nmero_de_filas] [nmero_de_columnas]; En la declaracin de esta matriz nmero_de_filas y nmero_de_columnas representan el nmero de filas y columnas en las que consiste una tabla, respectivamente. Vea la siguiente matriz bidimensional: int Tabla [3][4]; // Tabla se define de modo que tenga 3 filas y 4 columnas Esta matriz se puede representar en la forma de una tabla: ______________________________________________ tabla[0][0] tabla[0][1] tabla[0][2] tabla[0][3] tabla[1][0] tabla[1][1] tabla[1][2] tabla[1][3] tabla[2][0] tabla[2][1] tabla[2][2] tabla[2][3] Similar a las matrices unidimesionales, es posible asignar los valores a los elementos de una tabla en la lnea de declaracin. La asignacin debe ser realizada lnea a lnea como en el siguiente ejemplo. Como hemos visto anteriormente, esta matriz tiene dos filas y tres columnas: int Tabla [2][3]= { {3,42,1},{7,7,19} }; La matriz anterior se puede representar tambin en la forma de una tabla de valores: ___________________________ 3 42 1 7 7 19

Punteros Un puntero es una variable destinada a recibir una direccin. Un puntero apunta a una localidad de memoria, referenciada por una direccin. En C, la direccin de un objeto se puede obtener por medio un operador unitario &. Para acceder al contenido de la memoria en una direccin especfica (tambin llamado objeto apuntado), se utiliza un operador de indireccin (*).

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

52

Club Saber Electrnica N 97

S iStEmaS

dE

P rogramaCiN : L ENguajE

mikro C

En esta etapa, el puntero mi_puntero apunta al valor almacenado en esta localidad de memoria, o sea, a un valor desconocido. As que, una inicializacin es muy recomendable: puntero = &variable; Ahora, puntero contiene la direccin de variable. Para acceder al contenido de la variable apuntada, debe utilizar *. El siguiente ejemplo muestra el contenido de memoria dependiendo de la accin realizada por medio del puntero.

Los punteros son muy tiles para manejar las matrices. En este caso, un puntero se utilizar para apuntar al primer elemento de una matriz. Debido al hecho de que es posible realizar operaciones bsicas sobre los punteros (aritmtica de punteros), es fcil manejar los elementos de una matriz. Fjese en la diferencia entre *v+1 y *(v+1) en el siguiente ejemplo: short int voltio[3] = {0,5,10}; short int *v; v = &(voltio[0]); *(v+1) = 2; voltio[2] = *v+1; *(v+2) = *(v+1); v++; *v = 1;

// v contiene la direccin de voltio[0] // voltio[1] = 2 // tab[2] = 1 (tab[0] + 1) // voltio[2] = 2 // v contiene la direccin de voltio[1] // voltio[1] = 1

Los punteros tambin pueden ser declarados con el prefijo const. En este caso, su valor no puede ser modificado despus de la inicializacin, similar a una constante. A diferencia de C, el mikroC no admite alojamiento dinmico.

estructuras Ya hemos visto cmo agrupar los elementos dentro de matrices. No obstante, al utilizar este mtodo todos los elementos deben ser del mismo tipo. Al utilizar estructuras, es posible agrupar diferentes tipos de variables bajo el mismo nombre. Las variables dentro de una estructura se le denominan los miembros de la estructura. Las estructuras de datos se declaran al utilizar la siguiente sintaxis:

Captulo 2

53

El Mundo de los Microcontroladores


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

Funciones Una funcin es una subrutina que contiene una lista de sentencias a realizar. La idea principal es dividir un programa en varias partes utilizando estas funciones para resolver el problema inicial con ms facilidad. Adems, las funciones nos permiten utilizar las destrezas y el conocimiento de otros programadores. Una funcin se ejecuta cada vez que se llame dentro de otra funcin. En C, un programa contiene como mnimo una funcin, la funcin main(), aunque el nmero de funciones es normalmente mayor. Al utilizar funciones el cdigo se hace ms corto ya que es posible llamar una funcin tantas veces como se necesite. En C, el cdigo normalmente consiste en muchas funciones. No obstante, en caso de que su programa sea muy corto y simple, puede escribir todas las sentencias dentro de la funcin principal. Funcin Principal La funcin principal main() es una funcin particular puesto que es la que se ejecuta al iniciar el programa. Adems, el programa termina una vez completada la ejecucin de esta funcin. El compilador reconoce automticamente esta funcin y no es posible llamarla por otra funcin. La sintaxis de esta funcin es la siguiente:

54

Club Saber Electrnica N 97

S iStEmaS
void main (void) {

dE

P rogramaCiN : L ENguajE

mikro C

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

Cada funcin debe ser declarada apropiadamente para poder interpretarla correctamente durante el proceso de compilacin. La declaracin contiene los siguientes elementos: * Tipo de resultado (valor devuelto): tipo de dato del valor devuelto * Nombre de funcin: es un identificador que hace posible llamar a una funcin. * Declaracin de parmetros: se parece a la declaracin de variable regular (por ejemplo: float x). Cada parmetro consiste en una variable, constante, puntero o matriz, precedidos por la etiqueta de tipo de dato. Se utilizan para pasar la informacin a la funcin al llamarla. Los parmetros diferentes estn delimitados por comas. * Cuerpo de funcin: bloque de sentencias dentro de llaves. Una funcin se parece a lo siguiente: tipo_de_resultado nombre_de_funcin (tipo argumento1, tipo argumento2,...) { Sentencia; Sentencia; ... return ... } Note que una funcin no necesita parmetros (funcin main() por ejemplo), pero debe estar entre parntesis. En caso contrario, el compilador malinterpretara la funcin. Para hacerlo ms claro, puede sustituir el espacio en blanco encerrado entre parntesis por la palabra clave void: main (void).

Captulo 2

55

El Mundo de los Microcontroladores


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

Una funcin no puede devolver ms de un valor, pero puede devolver un puntero o una estructura. Tenga cuidado al utilizar matrices y punteros. El siguiente ejemplo es un error tpico: int *reverse(int *tab) { int r[DIM]; int i; for(i=0;i<DIM;i++) r[i] = tab[DIM-1-i]; return r; } En realidad, el compilador reserva memoria para el almacenamiento de variables de la funcin reverse slo durante su ejecucin. Una vez completada la ejecucin de reverse, la localidad de memoria para la variable i o para la matriz r ya no est reservada. Esto significa que la direccin que contiene los valores de i o r[] est libre para introducir datos nuevos. Concretamente, la funcin devuelve slo el valor &r[0], as que slo el primer elemento de la matriz tab ser almacenado en la memoria. Las dems localidades de memoria, tales como &tab[1], &tab[2], etc. sern consideradas por el compilador como espacios en blanco, o sea, estarn listas para recibir los nuevos valores. Para escribir esta funcin es necesario pasar la matriz r [] como parmetro (vea la subseccin Pasar los parmetros). La funcin puede contener ms de una sentencia return. En este caso, al ejecutar la primera sentencia return, la funcin devuelve el valor correspondiente y se detiene la ejecucin de la funcin. float abs (float x, float y) // Devolver el valor absoluto de 2*x-y { if ((2*x - y) >= 0) return (2*x - y); else return (-2*x + y); } Si la funcin no devuelve ningn valor, la palabra void debe ser utilizada como un tipo de resultado en la declaracin. En este caso, la sentencia return no debe ser seguida por ninguna expresin. Puede ser omitida como en el siguiente ejemplo: void wait_1 (unsigned int a) { // Esta funcin debe devolver una matriz r // cuyo contenido est en orden inverso con // respecto a la matriz tab // Declaracin de una nueva matriz denominada r // Bucle que copia el contenido de tab en r // al invertir el orden // Devolver el valor r

56

Club Saber Electrnica N 97

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

dE

P rogramaCiN : L ENguajE

mikro C

// Incremento de una variable global cnt // Ejecucin de la funcin Delay_ms // Note que Delay_ms no devuelve nada

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

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

Cuando se llama una funcin, el programa salta a la funcin llamada, la ejecuta, despus vuelve a la lnea desde la que fue llamada. Pasar los Parmetros Al llamar una funcin, se le pasan los parmetros. En C existen dos formas diferentes para pasar parmetros a una funcin.

Captulo 2

57

El Mundo de los Microcontroladores


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

void main() { int maximum, input[SIZE] = {5,10,3,12,0}; // Declaracin de variables en la matriz maximum = sort(input); // Llamar a funcin y asignarle el mximo // valor a la variable maximum } int sort(int *sequence) { int i, temp, permut; permut = 1; while(permut!=0) { permut = 0; for(i=0;i<SIZE-1;i++) {

// Declaracin de variables // Bandera de bit indica que se ha hecho una permutacin // Quedarse en el bucle hasta reiniciar la bandera // Bandera reiniciada // Comparar y ordenar los miembros de la // matriz (dos a dos)

if(sequence [i] > sequence[i+1]){ temp = sequence [i]; sequence[i] = sequence[i+1]; sequence[i+1] = temp; permut = 1; // Se ha hecho una permutacin, bandera de bit //se pone a uno } } } return sequence[SIZE-1]; } // Devolver el valor del ltimo miembro // que es al mismo tiempo el miembro con el mximo valor

58

Club Saber Electrnica N 97

S iStEmaS

dE

P rogramaCiN : L ENguajE

mikro C

En este ejemplo, por medio de una funcin se realizan dos operaciones: ordena los miembros de la matriz por valor asdendente y devuelve el mximo valor. Para utilizar una matriz en una funcin es necesario asignar la direccin a la matriz (o a su primer miembro). Vea el siguiente ejemplo: float mtodo_1(int[]); float mtodo_2(int*); const NMERO_DE_MEDICIONES = 7; void main() { double promedio1, promedio2; // Declaracin de prototipo de la funcin Mtodo_1 // Declaracin de prototipo de la funcin Mtodo_2 // Nmero de los miembros de la matriz

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

} // float mtodo_1(int voltaje[]) // Inicio de la funcin mtodo_1 { int i, suma; // Declaracin de las variables locales i y suma for(i=0;i<NMERO_DE_MEDICIONES;i++) suma += voltaje[i]; return(suma/NMERO_DE_MEDICIONES); } // float mtodo_2 (int *voltaje) //Inicio de la funcin mtodo_2 { int i, suma; // Declaracin de las variables locales i y suma for(i=0;i<NMERO_DE_MEDICIONES;i++) suma += *(voltaje+i); return(suma/NMERO_DE_MEDICIONES); } Las funciones mtodo_1 y mtodo_2 son completamente equivalentes. Las dos devuelven el valor promedio de la matriz voltaje[]. Despus de declararla, la direccin del primer miembro se puede escribir como voltaje o &voltaje[0]. // Clculo del valor promedio de voltaje // Es posible utilizar voltaje[i] en vez de *(voltaje+i) // Clculo del valor promedio de voltaje // Es posible utilizar *(voltaje+i)en vez de voltaje[i]

Captulo 2

59

El Mundo de los Microcontroladores


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

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

Tambin puede utilizar los parmetros para realizar substituciones ms complejas: #define VOLUMEN (D,H) (((D/2)*(D/2)*PI))*H // Macro con parmetros

60

Club Saber Electrnica N 97

S iStEmaS
Entonces, en el cdigo, la siguiente sentencia: Tanque_1 = VOLUMEN (Dimetro,altura); Ser sustituida por:

dE

P rogramaCiN : L ENguajE

mikro C

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

inclusin de archivos La directiva de preprocesador #include copia un archivo especfico en el cdigo fuente. El cdigo incluido debe observar la sintaxis de C para ser compilado correctamente. Hay dos formas de escribir estas directivas. En el primer ejemplo, slo el nombre de archivo se especifica, as que el preprocesador lo buscar dentro del archivo include. En el segundo ejemplo, se especifica la ruta entera, as que el archivo estar directamente incluido (este mtodo es ms rpido). #include <nombre_de_archivo> #include C:\Ruta\nombre_de_archivo.h // Se especifica slo el nombre del archivo // Se especifica la localidad exacta del archivo

Lo dados hasta aqu es una base para que pueda aprender a programar en lenguaje. Como ya hemos visto, hay varias divergencias entre los lenguajes mikroC y ANSI C. En el prximo tomo de coleccin del Club Saber Electrnica vamos a presentar las caractersticas especficas del mikroC con el propsito de facilitar la programacin de los microcontroladores PIC. J

Captulo 2

61

Captulo 3

eL Mundo de Los MicrocontroLadores

Los MicrocontroLadores Pic


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

Captulo 3

63

El Mundo de los Microcontroladores


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

tor para el reset. Por supuesto necesita una tensin de fuente de 5V (VDD) aplicada con respecto al terminal de masa (VSS). Posee dos puertos de salida, el A y el B, cuyos terminales son marcados RA0 al RA4 y RB0 al RB7. Estos puertos pueden ser programados como de entrada o de salida. El terminal 4 opera como reset pero tambin cumple funciones de carga de memoria de programa cuando es excitado con pulsos de 15V. El terminal RA4 (pata 3) tambin tiene funciones como entrada de un temporizador y RBO (pata 6) cumple tambin funciones como entrada de interrupcin. Vamos a realizar la explicacin de este captulo en base al microcontrolador 16F84 por ser uno de los PICs de mayor renombre y por existir abundante bibliografa y proyectos disponibles gratuitamente en Internet. Sin embargo, debemos aclarar que existen otros chips como el 16F628, que son similares a ste, ms econmicos y de mejores prestaciones. Oportunamente veremos cmo migrar de uno a otro sin mayores complicaciones.
Figura 2

64

Club Saber Electrnica N 97

LoS M iCroCoNtroLadorES PiC


Tambin aclaramos que en el prximo tomo de la coleccin Club Saber Electrnica analizaremos a un PIC de mejores caractersticas como el PIC 16F887. Ahora bien, la mayora de los microcontroladores (sean de Microchip, o de National, Motorola, Philips, etc.) se comportan de forma similar, por ello nos vamos a referir a los microcontroladores PIC16F84 cuya arquitectura interna puede observarse en la figura 3. Observe primero los bloques externos. Existe un cristal que se conecta en OSC1 y OSC2 para generar el CLOCK del sistema. Luego una seal de entrada llamada MCLR negada, que es un nombre de fantasa para nuestro conocido RESET (debido a que esa pata tiene un doble uso) y, por ltimo, dos puertos paralelos de I/O (entrada o salida) llamados puerto A y puerto B. Una de las patas del puerto A puede ser utilizada como entrada de interrupciones (esta pata especial hace que el microprocesador deje de realizar la tarea que estaba ejecutando y pase a realizar otra tarea alternativa; cuando la termina vuelve a su programa original). Analicemos el bloque ms grande (temporizadores), en ste observamos un grupo de bloques dedicados a mejorar el funcionamiento pero sin influir directamente en el flujo de seales. Vemos un temporizador de encendido, un temporizador de arranque del oscilador de CLOCK, un circuito de reset y un circuito llamado de vigilancia o WATCHDOG. Los dos primeros bloques procuran un arranque ordenado para no producir una carga al mismo tiempo sobre la fuente. Por ltimo, existe un circuito con un nombre curioso: perro guardin. Su funcin es estar vigilante el mximo de tiempo que tarda el microprocesador en completar su programa (o mejor sera decir, la derivacin ms larga de su programa) y en caso de superarse ese tiempo, provocar un reset automtico porque el microprocesador se qued trabado en alguna parte de su programa. Tambin se dice que el microprocesador se qued colgado o congelado. Este bloque de circuitos no trabaja indepen-

Figura 3

Captulo 3

65

El Mundo de los Microcontroladores


dientemente sino que requiere conexiones al exterior y al interior del dispositivo. Por ejemplo, no siempre son utilizados y es el programa quien determina su utilizacin y adems ajusta sus parmetros. Esto se realiza a travs del bloque de control o decodificador de instrucciones. Analicemos ahora la seccin de arriba a la izquierda en donde observamos la memoria de programa, el contador de programa, el registro de instrucciones y la pila o STACK de 8 niveles. Cuando hablamos de registros nos referimos a pequeas unidades de memoria transitoria, construida por lo general, con un registro de desplazamiento. Son memorias voltiles que se utilizan para guardar informacin por un tiempo mnimo, con el fin de realizar una operacin compleja de varios pasos. El contador de programa es el responsable de que el microprocesador vaya analizando las instrucciones en orden ascendente. Este guarda el nmero de instruccin en el STACK y la instruccin misma la pasa al registro de instrucciones desde donde se enva al resto del microprocesador. El STACK es, en realidad, una pila de registros (en nuestro ejemplo hay 8), debido a que el programa puede tener derivaciones (en la jerga LOOPS, rulos o subprogramas). Cuando se termina de ejecutar un loop se debe volver al mismo punto del programa en donde se haba producido la bifurcacin y eso es posible porque ese nmero de instruccin qued guardado en uno de los registros de la pila. Es comn que un loop tenga, a su vez, un loop secundario y cuando se ejecuta ese loop secundario se debe volver al mismo punto del loop primario, eso se consigue con guardar ese nmero de instruccin del loop secundario en otro registro de la pila. Analicemos ahora la seccin inferior derecha. En ese sector se ubican los bloques responsables de efectuar operaciones matemticas y lgicas binarias; recordemos que el nombre ALU proviene de Aritmetic Logic Unite (unidad arimtica y lgica). En este sector es imprescindible utilizar un registro ya que una operacin aritmtica o lgica siempre se efecta entre dos nmeros. Los nmeros binarios que deben procesarse se toman de la memoria de datos, el primero se acumula en el registro de trabajo o registro W (de Work = trabajo) el segundo es el presente en el instante en que se invoca la memoria de datos. Como las operaciones pueden ser encadenadas (cuando el resultado sirve como operando de la siguiente operacin, tal como el caso de un producto) el registro W tiene un retorno a la ALU. Vemos adems que la ALU est comandada por el bloque MUX (MUltipleXador). En efecto, la ALU requiere que se le enven nmeros para procesar que le lleguen desde la memoria de datos, pero antes se la debe predisponer para que efecte la operacin requerida (comparacin, rotacin de dgitos, etc.). El registro de estado o estatus colabora durante las operaciones matemticas. Piense cmo opera Ud. para realizar una resta: primero ubica el primer nmero, luego el segundo y despus comienza a analizar los bits menos significativos (las unidades), pero si el nmero de arriba es menor que el nmero de abajo, entonces toma prestado de la columna de las decenas, luego debe recordar esto porque el nmero de arriba en la columna de las decenas se redujo en una unidad. En realidad, aunque se trate de una operacin entre dos nmeros su ejecucin requiere guardar lo que se llama acarreo en otro registro y ste no es otra cosa ms que el registro STATUS. El PIC16F84 contiene adems de todo lo visto, una memoria RAM de registros que puede ser llamada desde el registro de instruccin a travs de un multiplexador de direcciones. Esta seccin slo se utiliza en desarrollos avanzados. Ahora bien, un microcontrolador sin programa no sabe hacer nada, es como un nio recin nacido; tiene algunos reflejos condicionados como el de succin que le permite alimentarse pero no sabe hacer ms que eso. Nosotros deberemos ensearle a realizar acciones y lo vamos a hacer como a un beb, paso a paso. Su capacidad de aprendizaje es enorme y sumamente variada. Le vamos a ensear a llorar a intervalos regulares, a encender luces, a sumar, a restar, etc. Ensearle significa programarlo y eso se realiza con una plaqueta de programacin que depende de cada marca y modelo de microcontrolador. Antiguamente los microprocesadores tenan una ventanita transparente y era necesario

66

Club Saber Electrnica N 97

LoS M iCroCoNtroLadorES PiC


Figura 4

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

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

La MeMorIa de PrograMa La memoria del PIC16F84 es una EEPROM, es decir, de lectura solamente (ROM = Read Only Memory) que se programa por tensin (no necesita luz ultravioleta); es decir que basta con introducir los datos con cierto nivel de tensin para que stos borren el programa anterior y graben uno nuevo. Por qu esta memoria se llama ROM, si se pueden grabar datos sobre ella? Se llama ROM porque para grabarla se debe

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

Captulo 3

67

El Mundo de los Microcontroladores


Figura 6

ria de lectura y escritura de 64. De estos 64 registros, los primeros 12 son fijos y cumplen un propsito determinado, en tanto que desde el 13 hasta el 64 son registros de propsito general, en donde el programa puede indicar que se almacene un dato para ser tomado ms tarde. Adems, posee un conjunto de memoria SRAM de 36 posiciones con los que se pueden construir registros de 8 bits con caractersticas EEPROM. En lo personal, prefiero designar a este conjunto de registros como memoria libre.

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

te). Como puerto de salida, una pata puede tomar 25mA del circuito o entregar 20mA al mismo, sin embargo, en el puerto A slo se pueden consumir 80mA en total o entregar 50mA, esto significa que slo algunas patas pueden trabajar al mximo porque si todas lo hicieran (y son 8) el consumo total sera de 25 x 8 = 200mA. El puerto B tiene otras caractersticas mximas, ya que en total puede tomar 150mA o entregar 100mA. Como vemos, las salidas admiten suficiente carga como para alimentar directamente a un led (figura 6). Los puertos no utilizados siempre se deben conectar a la fuente de 5V a travs de un resistor de 10k debido a que se trata de un dispositivo CMOS que, de otro modo, podra deteriorarse por captacin electrosttica (figura 7). La pata 3 perteneciente al puerto A puede ser configurada como de entrada/salida o como
Figura 7

68

Club Saber Electrnica N 97

LoS M iCroCoNtroLadorES PiC


Figura 8

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

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

eL reset El PIC se resetea cuando la pata 4 (MCLR negada) se pone a potencial bajo. Para simplificar el circuito de reset, el PIC posee un temporizador interno que permite realizar un reset automtico cuando se aplica tensin de 5V. En estos casos el circuito externo de reset slo implica el
Figura 11

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

Figura 9

Figura 10

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

Captulo 3

69

El Mundo de los Microcontroladores


El resistor R3 limita la corriente de descarga de C1 a valores compatibles con sus caractersticas de corriente de pico mxima. D1 descarga a C1 cuando la tensin de fuente decae para permitir un reset inmediato cuando la fuente se apaga y se enciende en rpida sucesin. R2 limita la corriente de reset, tomada desde el microprocesador. Este segundo sistema se suele utilizar cuando se requiere un reseteado remoto a travs de varios metros de cable que podran captar zumbido (C1 reduce la impedancia del circuito de reset). El PIC16F84 posee en su interior un microprocesador, una memoria RAM (voltil) donde guardaremos las variables, una memoria EEPROM (no voltil) donde guardaremos nuestro programa, un timer o contador que nos facilitar algunas tareas, y otros bloques de control y apoyo. Algunas caractersticas ms representativas del PIC16F84 son: Opera a una frecuencia mxima de 10MHz (excepto el PIC16F84A que puede operar a 20MHz). 1kbyte de memoria EEPROM para nuestro programa (1024 posiciones). 68 bytes (de 8 bits) de memoria RAM 64 bytes de memoria EEPROM para datos (no voltiles) Programable con slo 35 instrucciones Posee 13 pines de entrada/salida (un puerto de 8 bits + otro de 5 bits) Tiene un timer/contador de 8 bits Tambin posee una serie de registros y temporizadores, cuyo estudio no realizaremos en esta obra.

PrIMeras concLusIones El PIC es un microcontrolador, una especie de "ordenador en miniatura" (con muchas comillas) que podremos programar. Hay muchos tipos de microcontroladores PIC, los hay de 8 patas con 6 terminales para intercambio de datos (6 terminales de entrada / salida de datos), pero tambin existen dispositivos ms poderosos de 80 patas con 40 pines I/O (de entrada y salida de datos).

GPIC USB: ProGramador de mICroControladoreS PIC y memorIaS eeProm Por PUerto USB
IntroduccIn Este proyecto comenz a principios del 2008 cuando inici la escritura del cdigo fuente para el firmware de un 18F2550 y la elaboracin del Software correspondiente a la interfaz de usuario para la PC de un programador de microcontroladores Pic por puerto USB. Anteriormente ya haba estado interesado en los procesos de programacin de los Pic por lo tanto, basado en esas experiencias y en el estudio de los Data Sheets referentes a las especificaciones de programacin de los microcontroladores, surgi el GPIC USB como una aplicacin totalmente funcional hacia finales de Octubre del 2008. A la fecha ha sufrido algunas modificaciones que permite mejorar su funcionamiento y ampliar la cantidad de componentes soportados.

descrIPcIn

deL

cIrcuIto eLectrnIco

El esquema de la figura 1 corresponde al programador de microcontroladores PIC por puerto USB, su diseo es simple y sen-

70

Club Saber Electrnica N 97

LoS M iCroCoNtroLadorES PiC

Figura 1

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

Figura 2

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

Captulo 3

71

El Mundo de los Microcontroladores

Figura 3

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

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

72

Club Saber Electrnica N 97

LoS M iCroCoNtroLadorES PiC


durante todos los procesos. Desde la interfaz de programacin en la PC podemos configurar el suministro de esta tensin de dos formas: A- Slo se suministra tensin VPP a los microcontroladores soportados durante todos los procesos. B- Suministro de tensin MCLR postprocesos, para "arrancar" al microcontrolador sin tener que desconectar la ficha ICSP. Por ltimo el LED denominado USB, se enciende cuando se establece la comunicacin con el puerto USB y es reconocido el programador. Volviendo sobre el PIC 18F2550, ste debe ser grabado en un principio para su funcionamiento. El programa para este microcontrolador podemos dividirlo en dos partes: un programa residente en un bloque de memoria del PIC, comnmente llamado bootloader, encargado de "chequear" la existencia del firmware correspondiente al conectar el programador al puerto USB. En caso de no encontrarse, el LED denominado USB comenzar una secuencia de encendido en forma intermitente. En caso contrario, el firmware tomar el control y el LED quedar encendido en forma continua. La gran ventaja de utilizar este sistema se debe a que slo una vez debemos programar el microcontrolador 18F2550, en lo sucesivo los cambios y actualizaciones del firmware se podrn realizar directamente desde la interfaz de usuario en la PC. Para finalizar este bloque, el pin 17 (RC6) del puerto C, lo utilizamos para generar una seal que, junto con el buzzer BZ1 emite unos "beeps" cada vez que pulsamos los botones de comando para lectura, grabacin, verificacin y borrado desde la interfaz de programacin. Es opcional su implementacin y puede ser activado o desactivado desde la misma interfaz. Bloque 2: conversor dc - dc En un comienzo me plante qu diseo usar para el conversor de tensin, si implementarlo de forma totalmente independiente o utilizar el PIC para esta tarea generando un PWM por software, ms los componentes externos necesarios. Me decid por la primera opcin por varios motivos: el circuito integrado utilizado MC34093, figura 4, es un conversor especializado para esta funcin, de muy bajo costo, ampliamente difundido, que figura en las listas de componentes de casi todos los comercios de electrnica. Es autnomo, no depende del firmware grabado en el 18F2550, quiero decir con esto que podemos chequear su funcionamiento y la tensin de salida del conversor (en las pruebas) sin necesidad de tener el PIC en la placa del programador ya que no depende de ste. Adems nos permite, si fuera necesario, regular la tensin de salida con slo variar el valor de una resistencia: R3 o R4. El valor del choque L1 no es crtico, puede estar comprendido entre 220H y 680H sin ningn tipo de inconveniente. Figura 4 El circuito se alimenta con 5 volt suministrados por el puerto USB y a la salida de TP2 obtenemos una tensin continua de aproximadamente 14V a 14.5V necesarios para alimentar el bloque 3 de la figura 2. Las resistencias R3, R4 junto con R5 forman un divisor resistivo conectado al pin 5 del

Captulo 3

73

El Mundo de los Microcontroladores


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

Figura 5

Figura 6

Figura 7

74

Club Saber Electrnica N 97

LoS M iCroCoNtroLadorES PiC


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

Est conformada, como podemos observar en la figura 6, por el Zener Z1 conectado al pin 8 del CA3140 en serie con el transistor NPN Q2 que trabaja como llave electrnica On-Off, de acuerdo a los niveles alto o bajo en la base. Con un nivel bajo sobre la base de este transistor el circuito est desconectado, por lo tanto la tensin VPP ser la normal de 12.30V a 13V; por otro lado, con un nivel alto proporcionado por RB4 del 18F2550 a travs de R13 el circuito se conecta, la tensin VPP en este caso ser de 3.3 volt. De esta forma queda totalmente automatizado el suministro de VPP de acuerdo a los dispositivos seleccionados desde la interfaz de usuario en la PC. Por el momento no es necesario implementar Z1, Q2 y R13, ya que es la primera versin base del programador y dicha gama de dispositivos an no estn incorporados. En este caso el pin 8 debe quedar sin conexin. Como pueden ver, la electrnica del programador ya est pensada para soportar de forma prctica a estos microcontroladores a medida que sean agregados. Continuando con esta etapa, las entradas inversora y no inversora del amplificador operacional se conectan con RB3 y RB2 del microcontrolador; de acuerdo a los

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

Captulo 3

75

El Mundo de los Microcontroladores


1- Una tensin prxima a masa (0.3 volt). 2- Una tensin Vpp de aproximadamente 12.30 - 13 volt. 3- Una tensin post programacin MCLR. 4- Una tensin Vpp baja de 3.3 volt. Por ltimo el transistor Q1 se encarga del manejo de la tensin Vdd, se encuentra conectado con la salida RB5 del microcontrolador. Un nivel alto en la base de Q1 lo mantiene bloqueado y un nivel bajo lo coloca en estado de conduccin con salida por colector; el emisor de dicho transistor se conecta a +5 volt suministrados por el puerto USB. extensin 3.3 Volt Vdd2 Opcionalmente podemos anexar una lnea auxiliar de 3.3 volt en el conector ICSP (ya est contemplado en Figura 8 el circuito general de la figura 1). Con un simple circuito (figura 8) obtenemos una tensin de salida de 3.3 volts en el emisor de Q3, con las mismas caractersticas de control que VDD. La entrada de tensin se produce por el colector de Q3, conectado a VDD, colector de Q2. En la figura 9 se puede ver la imagen de la placa de circuito impreso con su mscara de componentes. Desde la pgina del autor puede descargar tanto la interfaz grfica para programacin (figura 10) como el firmware para el PIC del programador. La versin 2.1 de dicho firmware soporta los siguientes componentes: PIC18F67J93 PIC18F87J93 PIC18F67J90 PIC18F87J90 PIC18F67J50 PIC18F87J72 PIC18F67J11 PIC18F87J50 PIC18F67J10 PIC18F87J11 PIC18F66J93 PIC18F87J10 PIC18F66J90 PIC18F86J93 PIC18F66J55 PIC18F86J90 PIC18F66J50 PIC18F86J72 PIC18F66J16 PIC18F86J55 PIC18F66J15 PIC18F86J50 PIC18F66J11 PIC18F86J16 PIC18F66J10 PIC18F86J15 PIC18F65J90 PIC18F86J11 PIC18F65J50 PIC18F86J10 PIC18F65J15 PIC18F85J90 PIC18F65J11 PIC18F85J50 PIC18F65J10 PIC18F85J15 PIC18F64J90 PIC18F85J11 PIC18F64J11 PIC18F85J10 PIC18F63J90 PIC18F84J90 PIC18F63J11 PIC18F84J11 PIC18F83J90 PIC18F83J11 PIC18F66J60 PIC18F66J65 PIC18F67J60 PIC18F86J60 PIC18F86J65 PIC18F87J60 PIC18F96J60 PIC18F96J65 PIC18F97J60 PIC18F24J10 PIC18LF24J10 PIC18F25J10 PIC18LF25J10 PIC18F44J10 PIC18LF44J10 PIC18F45J10 PIC18LF45J10 PIC18F24J11 PIC18LF24J11 PIC18F25J11 PIC18LF25J11 PIC18F26J11 PIC18LF26J11 PIC18F44J11 PIC18LF44J11 PIC18F45J11 PIC18LF45J11 PIC18F46J11 PIC18LF46J11

Figura 9

76

Club Saber Electrnica N 97

LoS M iCroCoNtroLadorES PiC


Figura 10

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

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

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

Captulo 3

77

El Mundo de los Microcontroladores

Figura 11 Figura 12

78

Club Saber Electrnica N 97

LoS M iCroCoNtroLadorES PiC

Figura 13

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

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

Captulo 3

79