Vista previa del material en texto
Portada club 97.qxd:Maquetación 1 05/04/13 14:38 Página 1 www.FreeLibros.org 2ª de forros.qxd:club 05/03/13 16:29 Página 2ªFo1 Bases de los MiCroControladores Capítulo 1 1 Di rec tor Ing. Ho ra cio D. Va lle jo Pro duc ción Jo sé Ma ría Nie ves (Grupo Quark SRL) autor: Varios (ver Editorial) Selección y Coordinación: Ing. Horacio Daniel Vallejo Edi to rial QUarK S.r.l. Pro pie ta ria de los de re chos en cas te lla no de la pu bli ca - ción men sual Sa bEr ElEc tró ni ca - San Ricardo 2072 (1273) - Ca pi tal Fe de ral - Buenos Aires - Argentina - T.E. 4301-8804 ad mi nis tra ción y Ne go cios Te re sa C. Ja ra (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) Sis te mas: Pau la Ma ria na Vi dal red y Com pu ta do ras: Raúl Ro me ro Video y animaciones: Fernando Fernández le ga les: Fer nan do Flo res Con ta du ría: Fer nan do Du cach Técnica y Desarrollo de Prototipos: Alfredo Armando Flores aten ción al Clien te Ale jan dro Va lle jo ate clien @we be lec tro ni ca .co m.ar In ter net: www .we be lec tro ni ca .co m.mx Publicidad: Rafael Morales rafamorales@webelectronica.com.ar Club Se: grupo Quark Srl luisleguizamon @we be lec tro ni ca .co m.ar edi to rial Quark Srl San Ricardo 2072 (1273) - Ca pi tal Fe de ral www .we be lec tro ni ca .co m.ar La Edi to rial no se res pon sa bi li za por el con te ni do de las no tas fir ma das. To dos los pro duc tos o mar cas que se men cio nan son a los efec tos de pres tar un ser vi cio al lec tor, y no en tra ñan res pon sa bi li dad de nues tra par te. Es tá pro hi bi da la re pro duc ción to tal o par cial del ma te rial con te ni do en es ta re vis ta, así co - mo la in dus tria li za ción y/o co mer cia li za ción de los apa ra tos o ideas que apa re cen en los men cio na dos tex tos, ba jo pe na de san cio nes le ga les, sal vo me - dian te au to ri za ción por es cri to de la Edi to rial. Impresión: Talleres Babieca - México La colección Club Saber Electrónica fue pensada como una obra de 12 tomos de edición mensual en la que se tratarán los temas más significativos de la electrónica. Rápidamente com- prendimos que esta serie estaba llenando un vacío en la información y por ello decidimos conti- nuarla. Ya llevamos más de 8 años (97 tomos de colección) y pensamos que su vida aún está en pañales. En diversos tomos nos hemos referido a los microcontroladores pero hasta la fecha poco hemos hablado de lenguajes de programación de alto nivel, es por ello que este libro y la siguien- te edición tratará este tema de una forma sencilla y con gran contenido práctico. Un microcontrolador es un circuito integrado o chip que incluye en su interior las tres uni- dades 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 diseñados para disminuir el costo económico y el consumo de energía de un sistema en particular. Por eso el tamaño de la CPU, la cantidad de memoria y los periféricos incluidos depen- derán de la aplicación. El control de un electrodoméstico sencillo como una batidora, utilizará un procesador muy pequeño (4 u 8 bit) por que sustituirá a un autómata pequeño; en cambio un reproductor de música y/o vídeo digital (mp3 o mp4) requerirá de un procesador de 32 bit o de 64 bit y de uno o mas códec de señal digital (audio y/o vídeo). 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 electrónico del motor en un automóvil. Los microcontroladores representan la inmensa mayoría de los chips de computadoras ven- didos, un 50% son controladores "simples" y el resto corresponde a procesadores más especiali- zados. Un microcontrolador difiere de una CPU normal, en que es más fácil convertirlo en una computadora en funcionamiento, con un mínimo de chips externos de apoyo. Un microcontrolador típico tendrá un generador de reloj integrado y una pequeña 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 sincronización. Los microcontroladores disponen generalmente también de una gran variedad de dispositivos de entrada/salida, como convertidores de analógico a digital, temporizadores, UARTs y buses de interfaz serie especializados, como I2C y CAN. Frecuentemente, estos dispositivos integrados pueden ser controlados por instrucciones de procesadores especializados. Los modernos micro- controladores frecuentemente incluyen un lenguaje de programación integrado, como el BASIC que se utiliza bastante con este propósito. Esperamos que esta breve introducción le sirva como “disparador” para estudiar el conteni- do en la espera del próximo texto. ¡Hasta el mes próximo! 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 dólares americanos cada uno y Ud. los puede descargar GRATIS con su número 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 pass- word 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. Editorial Del Editor al Lector suma edi Club 97.qxd:*Cap 4 - telefonia 05/04/13 14:55 Página 1 El Mundo de los Microcontroladores 2 Club saber electrónica nº 97 Capítulo 1 los sistemas de NumeraCióN . . . . . . . . . . . . . . . .3 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 Qué Pueden Hacer los Microcontroladores . . . . . . . . . . . . .4 Números, Números, Números... . . . . . . . . . . . . . . . . . . . . . .6 Sistema de Numeración Binario . . . . . . . . . . . . . . . . . . . . . .6 Sistema de Numeración Exadecimal . . . . . . . . . . . . . . . . . .7 Conversión de Sistemas de Numeración . . . . . . . . . . . . . . .8 Conversión de Números Binarios a Decimales . . . . . . . . . .8 Conversión de Números Hexadecimales a Decimales . . . . .9 Conversión de Números Hexadecimales a Binarios . . . . . . .9 Marcar los Números . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 Números Negativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 BIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 BYTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 Detalles Importantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 Componentes Básicos de la Lógica 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 Comunicación en Serie . . . . . . . . . . . . . . . . . . . . . . . . . . . .17 Velocidad de Transmisión Serial . . . . . . . . . . . . . . . . . . . . .18 I2C Circuito Inter- Integrado (INTER INTEGRATED CIRCUIT) . . . . . . . . . . . . . . . . . . .18 SPI - Bus Serial de Interfaz de Periféricos (SERIAL PERIPHERAL INTERFACE BUS . . . . . . . . . . . . .18 Oscilador . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . .19 Circuito de Alimentación . Fuente de Alimentación . . . . . . .19 Temporizadores – Contadores . . . . . . . . . . . . . . . . . . . . . .20 ¿Cómo Funcionan los Temporizadores? . . . . . . . . . . . . . .20 Utilizando un Preescalador en el Funcionamiento del Temporizador . . . . . . . . . . . . . . . . . . .21 Utilizando una Interrupción en el Funcionamiento del Temporizador . . . . . . . . . . . . . . . . . . .21 Contadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21 Temporizador Perro Guardián. WATCHDOG . . . . . . . . . . .22 Convertidor Digital – Analógico (D/A) . . . . . . . . . . . . . . . . .22 Arquitectura Interna de un Microcontrolador . . . . . . . . . . . .23 Juego de Instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . .24 ¿Cómo se Debe Elegir un Microcontrolador? . . . . . . . . . . .25 Capítulo 2 sistemas de programaCióN: leNguaje mikroC . . . . . . . . . . . . . . . . . . . . . . . .27 Lenguajes de Programación . . . . . . . . . . . . . . . . . . . . . . . .27 Lenguaje Ensamblador . . . . . . . . . . . . . . . . . . . . . . . . . . . .28 Ventajas de los Lenguajes de Programación de Alto Nivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28 Lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29 Características de el Lenguaje mikroC . . . . . . . . . . . . . . . .30 Fases de la Compilación . . . . . . . . . . . . . . . . . . . . . . . . . . .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 Conversión de Tipos de Datos . . . . . . . . . . . . . . . . . . . . . .44 Estructuras de Control . . . . . . . . . . . . . . . . . . . . . . . . . . . .45 Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47 Sentencias de Salto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49 Tipos de Datos Avanzados . . . . . . . . . . . . . . . . . . . . . . . . .50 Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54 Capítulo 3 los miCroCoNtroladores piC . . . . . . . . . . . . . .63 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .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 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70 Descripción del Circuito Electrónico . . . . . . . . . . . . . . . . . .70 El Programador Quark Pro 2 . . . . . . . . . . . . . . . . . . . . . . .77 EL MunDo DE Los MicrocontroLaDorEs suMario suma edi Club 97.qxd:*Cap 4 - telefonia 05/04/13 14:55 Página 2 IntroduccIón La situación actual en el campo de los micro- controladores se ha producido gracias al desa- rrollo de la tecnología de fabricación de los cir- cuitos integrados. Este desarrollo ha permitido construir las centenas de miles de transistores en un chip. Esto fue una condición previa para la fabricación de un microprocesador. Las prime- ras microcomputadoras se fabricaron al añadir- Capítulo 1 3 Capítulo 1 eL muNdo de Los microcoNtroLadores Prácticamente desde su aparición, allá por el año 1986, en Saber Electrónica desta- camos la importancia de los microcontroladores en el mundo de la electrónica. Hemos escrito más de 50 artículos, 10 libros de texto y varios cursos sobre compo- nentes de distintas familias. Sin embargo, el tema nunca se agota y siempre se puede dar una nueva vista que nos permita conocer cada vez mejor a estos procesadores en un solo chip con los que podemos aprender y capacitarnos en nuestra vida profe- sional. A partir de este número comenzamos con la edición de un curso de micro- controladores de MicroElectronika (www.mikroe.com) a quienes agradecemos por permitirnos compartir este importantísimo material, invitando a todos los lectores a que visiten la página de referencia para obtener importante material de apoyo. www.mikroe.com “Los sistemas de NumeracióN” Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 3 El Mundo de los Microcontroladores les periféricos externos, tales como memoria, líneas de entrada/salida, temporizadores u otros. El incremento posterior de la densidad de integración permitió crear un circuito integrado que contenía tanto al procesador como periféri- cos. Así es cómo fue desarrollada la primera microcomputadora en un solo chip, denominada más tarde microcontrolador. Los principiantes en electrónica creen que un microcontrolador es igual a un microprocesador. Esto no es cierto. Difieren uno del otro en muchos sentidos. La primera y la más importan- te diferencia es su funcionalidad. Para utilizar al microprocesador en una aplicación real, se debe de conectar con componentes tales como memoria o componentes buses de transmisión de datos. Aunque el microprocesador se consi- dera una máquina de computación poderosa, no está preparado para la comunicación con los dispositivos periféricos que se le conectan. Para que el microprocesador se comunique con algún periférico, se deben utilizar los circuitos especia- les. Así era en el principio y esta práctica sigue vigente en la actualidad. Por otro lado, al microcontrolador se le dise- ña de tal manera que tenga todas las compo- nentes integradas en el mismo chip. No necesi- ta de otros componentes especializados para su aplicación, porque todos los circuitos necesa- rios, que de otra manera correspondan a los periféricos, ya se encuentran incorporados. Así se ahorra tiempo y espacio necesario para cons- truir un dispositivo. Qué Pueden Hacer los MIcrocontroladores Para entender con más facilidad las razones del éxito tan grande de los microcontroladores, vamos a prestar atención al siguiente ejemplo. Hace unos 10 años, diseñar un dispositivo elec- trónico de control de un ascensor de un edificio de varios pisos era muy difícil, incluso para un equipo de expertos. ¿Ha pensado alguna vez en qué requisitos debe cumplir un simple ascensor? ¿Cómo lidiar con la situación cuando dos o más personas lla- man al ascensor al mismo tiempo? ¿Cuál llama- da tiene la prioridad? ¿Cómo solucionar las cuestiones de seguridad, de pérdida de electrici- dad, de fallos, de uso indebido? Lo que sucede después de resolver estos problemas básicos es un proceso meticuloso de diseñar los dispositivos adecuados utilizando un gran número de los chips especializados. Este proceso puede tardar semanas o meses, depen- diendo de la complejidad del dispositivo. Cuando haya terminado el proceso, llega la hora de diseñar una placa de circuito impreso y de montar el dispositivo. ¡Un dispositivo enorme! Es otro trabajo difícil 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 alimentación. Esto suele ser el punto en el que la fiesta se convierte en un verdadero trabajo puesto que los dispositivos electrónicoscasi nunca funcio- nan apropiadamente desde el inicio. Prepárese para muchas noches sin dormir, correcciones, mejoras... y no se olvide de que todavía estamos hablando de cómo 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 compañías de desarrollo esta- rán interesadas en su trabajo. Por supuesto, si tiene suerte, cada día le traerá una oferta de tra- bajo de un nuevo inversionista. Sin embargo, si lo requieren para trabajar en el control de los elevadores de un nuevo edificio que tiene cuatro pisos más de los que ya maneja su sistema de control. ¿Sabe cómo proceder? ¿Cree acaso que se pueden controlar las demandas de sus clientes? Pensamos que usted va a construir un dispo- sitivo universal que se puede utilizar en los edi- ficios de 4 a 40 pisos, una obra maestra de elec- trónica. Bueno, incluso si usted consigue cons- truir una joya electrónica, su inversionista le esperará delante de la puerta pidiendo una cámara en el ascensor o una música relajante en caso de fallo de ascensor. O un ascensor con 4 Club Saber Electrónica Nº 97 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 4 BaSES dE loS MiCroCoNtroladorES 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 ingeniería electrónica” real- mente significa. Es así como se hacían las cosas hasta aparición de los microcontroladores diseñados - pequeños, potentes y baratos. Desde ese momento su programación dejó de ser una ciencia, y todo tomó otra dirección ... El dispositivo electrónico capaz de controlar Capítulo 1 5 Figura 1 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 5 El Mundo de los Microcontroladores un pequeño submarino, una grúa o un ascensor como el anteriormente mencionado, ahora está incorporado en un sólo chip. Los microcontrola- dores ofrecen una amplia gama de aplicaciones y sólo algunas se exploran normalmente. Le toca a usted decidir qué quiere que haga el microcontro- lador y cargar un programa en él con las instruc- ciones apropiadas. Antes de encender el disposi- tivo 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, mejo- rar o actualizar el programa, hágalo. ¿Hasta cuándo se deben hacer modificacio- nes? Hasta quedar satisfecho. Eso puede realizar- se sin ningún problema. Vea en la figura 1 una caracterización sobre los pasos que debe seguir un principiante para la programación. Sabía usted que todas las personas pueden ser clasificadas en uno de 10 grupos, en los que están familiarizados con el sistema de numera- ción binario y en los que no están familiarizados con él. Si no entendió lo anterior significa que todavía pertenece al segundo grupo. Si desea cambiar su estado, lea el siguiente texto que describe brevemente algunos de los conceptos básicos utilizados más tarde en este libro (sólo para estar seguro de que estamos hablando en los mismos términos). núMeros, núMeros, núMeros... ¡La matemática es una gran ciencia! Todo es tan lógico y simple... El univer- so de los números se puede describir con sólo diez dígitos. ¿Realmente tiene que ser así? ¿Necesitamos exactamente esos 10 dígitos? Por supuesto que no, es sólo cuestión del hábito. Acuérdese de las lecciones de la escue- la. Por ejemplo, ¿qué significa el número 764? Cuatro unidades, seis decenas y siete centenas. ¡Muy simple! ¿Se podría expresar de una forma más desa- rrollada? Por supuesto que sí: 764 = 4 + 60 + 700 ¿Aún más desarrollado? Sí: 764 = 4*1 + 6*10 + 7*100 ¿Podría este número parecer un poco más “científico”? La respuesta es sí otra vez: 764= 4*100 + 6*101 + 7*102. ¿Qué significa esto realmente? ¿Por qué uti- lizamos exactamente estos números 100, 101 y 102 ? ¿Por qué es siempre el número 10? Es porque utilizamos 10 dígitos diferentes (0, 1, 2...8, 9). En otras palabras, es porque utiliza- mos el sistema de numeración en base 10, es decir el sistema de numeración decimal, figura 2. sIsteMa de nuMeracIón BInarIo ¿Qué pasaría si utilizáramos sólo dos núme- ros 0 y 1? 6 Club Saber Electrónica Nº 97 Figura 2 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 6 BaSES dE loS MiCroCoNtroladorES Si sólo pudiéramos afirmar (1) o negar (0) que algo existe. La respuesta es “nada espe- cial”, seguiríamos utilizando los mismos núme- ros de la misma manera que utilizamos hoy en día, no obstante ellos parecerían un poco dife- rentes. Por ejemplo: 11011010. ¿Cuántas son realmente 11011010 páginas de un libro? Para entenderlo, siga la misma lógica como en el ejemplo anterior, pero en el orden inverti- do. Tenga en cuenta que se trata de aritmética con sólo dos dígitos 0 y 1, es decir, del sistema de numeración en base 2 (sistema de numera- ción binario). Vea la figura 3. Evidentemente, se trata del mismo número representado en dos sistemas de numeración diferentes. La única diferencia entre estas dos representaciones yace en el número de dígitos necesarios para escribir un número. Un dígito (2) se utiliza para escribir el número 2 en el sis- tema decimal, mientras que dos dígitos (1 y 0) se utilizan para escribir aquel número en el sis- tema binario. ¿Ahora está de acuerdo que hay 10 grupos de gente? ¡Bienvenido al mundo de la aritmética bina- ria! ¿Tiene alguna idea de dónde se utiliza? Excepto en las condiciones de laboratorio estrictamente controladas, los circuitos electró- nicos más complicados no pueden especificar con exactitud la diferencia entre dos magnitudes (dos valores de voltaje, por ejemplo), si son demasiado pequeños (más pequeños que unos pocos voltios). La razón son los ruidos eléctricos y fenómenos que se presentan dentro de lo que llamamos “entorno de trabajo real” (algunos ejemplos de estos fenómenos son los cambios imprevisibles de la tensión de alimentación, cambios de temperatura, tolerancia a los valores de los componentes etc...). Imagínese una com- putadora que opera sobre números decimales al tratarlos de la siguiente manera: 0=0V, 1=5V, 2=10V, 3=15V, 4=20V... 9=45V ¿Alguien dijo baterías? Una solución mucho más fácil es una lógica binaria donde 0 indica la ausencia de voltaje, mientras que 1 indica la presencia de voltaje. Simplemente, es fácil de escribir 0 o 1 en vez de “no hay voltaje” o “ hay voltaje”. Mediante el cero lógico (0) y uno lógico (1) la electrónica se enfrenta perfectamente y realiza con facilidad todas las operaciones aritméticas. Evidentemente, se trata de electrónica que en realidad aplica aritmética en la que todos los números son representados con sólo dos dígitos y donde sólo es importante saber si hay voltaje o no. Por supuesto, estamos hablando de electrónica digital. sIsteMa de nuMeracIón exadecIMal En el principio del desarrollo de las computa- doras era evidente que a la gente le costaba mucho trabajar con números binarios. Por eso, se estableció un nuevo sistema de numeración, que utilizaba 16 símbolos diferentes. Es llamado el sistema de numeración hexadecimal. Este sistema está compuesto de 10 dígitos a los que estamos acostumbrados (0, 1, 2, 3,... 9) y de seis letras del alfabeto A, B, C, D, E y F. ¿Cuál es el propósito de esta combinación aparentemente extraña? Basta con mirar cómo todo en la historia de Capítulo 1 7 Figura 3 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 7 El Mundo de los Microcontroladores los números binarios encaja perfectamente para lograr una mejor comprensión del tema. Vea la figura 4. El mayor número que puede ser representa- do con 4 dígitos binarios es el número 1111. Corresponde al número 15 en el sistema deci- mal. En el sistema hexadecimal ese número se representacon sólo un dígito F. Es el mayor número de un dígito en el sistema hexadecimal. ¿Se da cuenta de la gran utilidad de estas equivalencias? El mayor número escrito con ocho dígitos binarios es a la vez el mayor número de dos dígitos en el sistema hexadecimal. Tenga en cuenta que una computadora utiliza números binarios de 8 dígitos. ¿Acaso se trata de una casualidad? códIgo Bcd El código BCD (Binary-Coded Decimal - Código binario decimal) es un código binario utili- zado para representar a los números decimales. Se utiliza para que los cir- cuitos electrónicos pue- dan comunicarse con los periféricos utilizando el sistema de numeración decimal o bien utilizando el sistema binario dentro de “su propio mundo”. Consiste en números binarios de 4 dígitos que representan los primeros diez dígitos (0, 1, 2, 3...8, 9). Aunque cuatro dígitos pueden hacer 16 combinaciones posibles en total, el código BCD normalmente utiliza a las primeras diez. conversIón de sIsteMas de nuMeracIón El sistema de numeración binario es el que utilizan los microcontroladores, el sistema deci- mal es el que nos resulta más comprensible, mientras que el sistema hexadecimal presenta un balance entre los dos. Por eso, es muy importante aprender cómo convertir los números de un sistema de numeración a otro, por ejemplo, cómo convertir una serie de ceros y unos a una forma de representación comprensible para nosotros. conversIón de núMeros BInarIos a decIMales Los dígitos en un número binario tienen pon- deraciones diferentes lo que depende de sus posiciones dentro del número que están repre- sentando. Además, cada dígito puede ser 1 o 0, y su ponderación se puede determinar con faci- lidad al contar su posición empezando por la derecha. Para hacer una conversión de un número binario a decimal es necesario multipli- car las ponderaciones con los dígitos correspon- dientes (0 o 1) y sumar todos los resultados. La magia de la conversión de un número binario a decimal funciona de maravilla... ¿Tiene dudas? Vea el ejemplo de la figura 5. Cabe destacar que es necesario utilizar sólo dos dígitos binarios para representar a todos los números decimales de 0 a 3. Por consiguiente, para representar los núme- ros de 0 a 7 es necesario utilizar tres dígitos binarios, para representar los números de 0 a 15 - cuatro dígitos etc. Dicho de manera sencilla, el mayor número binario que se puede representar utilizando n dígitos se obtiene al elevar la base 2 a la poten- cia n. Luego, al resultado se le resta 1. Por ejem- plo, si n=4: 24 - 1 = 16 - 1 = 15 8 Club Saber Electrónica Nº 97 Figura 4 Figura 5 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 8 BaSES dE loS MiCroCoNtroladorES Por consiguiente, al utilizar 4 dígitos binarios, es posible representar los números decimales de 0 a 15, que son 16 valores diferentes en total. conversIón de núMeros HexadecIMales a decIMales Para realizar una conversión de un número hexadecimal a decimal, cada dígito hexadecimal debe ser multiplicado con el número 16 elevado al valor de su posición. Como ejemplo, vea la representación de la figura 6. conversIón de núMeros HexadecIMales a BInarIos No es necesario realizar ningún cálculo para convertir un número hexadecimal a binario. Los dígitos hexadecimales se reemplazan simple- mente por los cuatro dígitos binarios apropiados. Ya que el dígito hexadecimal máximo es equiva- lente al número decimal 15, es necesario utilizar cuatro dígitos binarios para representar un dígi- to hexadecimal. Vea la figura 7. Marcar los núMeros El sistema de numeración hexadecimal, junto con los sistemas binario y decimal, se conside- ran los más importantes para nosotros. Es fácil realizar una conversión de cualquier número hexadecimal a binario, además es fácil de recor- darlo. Sin obstante, estas conversiones pueden provocar una confusión. Por ejemplo, ¿qué sig- nifica en realidad la sentencia: “Es necesario contar 110 productos en una cadena de monta- je”? Dependiendo del sistema en cuestión (bina- rio, decimal o hexadecimal), el resultado podría ser 6, 110 o 272 productos, respectivamente. Por consiguiente, para evitar equivocaciones, diferentes prefijos y sufijos se añaden directa- mente a los números. El prefijo $ o 0x así como el sufijo h marca los números en el sistema hexadecimal. Por ejemplo, el número hexadeci- mal 10AF se puede escribir así: $10AF, 0x10AF o 10AFh. De manera similar, los números bina- rios normalmente obtienen el sufijo % o 0B. Si un número no tiene ni sufijo ni prefijo se consi- dera decimal. Desafortunadamente, esta forma de marcar los números no es estandarizada, por consiguiente depende de la aplicación con- creta. La mostrada en la figura 8 es tabla comparativa que con- tiene los valores de números 0- 255 representados en tres siste- mas de numeración diferentes. núMeros negatIvos Como ya hemos visto, para escribir un núme- ro negativo en matemáticas, basta con añadirle el prefijo “-” (signo menos). Sin embargo, en la programación, al acabarse el proceso de la com- pilación, se quedan sólo los números binarios, Capítulo 1 9 Figura 6 Figura 7 Figura 8 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 9 El Mundo de los Microcontroladores volviéndose las cosas más complicadas. Se uti- lizan sólo dos dígitos - 0 y 1, mientras que todos los demás números, símbolos y signos se for- man por medio de las combinaciones de estos dos dígitos. En el caso de los números negati- vos, la solución es la siguiente: “En los números negativos, el bit más signifi- cativo (el bit del extremo izquierdo) representa el signo del número (donde 0 será positivo y 1 negativo)”. En el caso de un número de 8 bits, para representar un valor numérico sólo quedan 7 bits. De acuerdo a este tipo de codificación el número +127 es el mayor número positivo con signo que se puede representar con 8 bits. Asimismo, hay cero (0) positivo y negativo (refié- rase a la siguiente tabla). ¿Se puede saber de qué número se trata? Por ejemplo, si ponemos el número 10000001, ¿es -1 o 129? No se preocupe, de eso se encarga el compilador. Ésta es la razón 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 continuación. BIt La teoría dice que un bit es la unidad básica de información... Vamos a olvidarlo por un momento y demos- trar qué es eso en la práctica. La respuesta es - nada especial- un bit es un sólo dígito binario. Similar a un sistema de numeración decimal en el que los dígitos de un número no tienen la misma ponderación (por ejemplo, los dígitos en el número 444 son los mismos pero tienen los valores diferentes), el “significado” de un bit depende de la posición que tiene en número binario. En los números binarios, sus dígitos se denominan el bit cero (el primer bit a la dere- cha), el primer bit (el segundo bit a la derecha) etc. Además, ya que el sistema binario utiliza solamente dos dígitos (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 números decimales que estas expre- siones llegaron a ser comunes. Sería correcto decir por ejemplo, “el valor del sexto bit en cual- quier número binario equivale al número decimal 64”. Pero todos somos humanos y los viejos hábitos mueren difícilmente. Además, ¿cómo le suena “número uno-uno-cero-uno-cero...”? BYte Un byte consiste en 8 bits colocados uno junto al otro. Si un bit es un dígito, es lógico que los bytes representen los números. Todas las operaciones matemáticas se pueden realizar por medio de ellos, como por medio de los números decimales comunes. Similar a los dígi- tos de cualquier número, los dígitos de un byte no tienen el mismo significado. El bit del extremo izquierdo tiene la mayor ponderación, por eso es denominado el bit más significativo (MSB). El bit delextremo derecho tiene la menor pondera- ción, por eso es denominado el bit menos signi- ficativo (LSB). Puesto que los 8 dígitos de un byte se pueden combinar de 256 maneras dife- rentes, el mayor número decimal que se puede representar con un byte es 255 (una combina- ción representa un cero). Un nibble o un cuarteto representa una mitad de byte. Dependiendo de la mitad del número en cuestión (izquierda o derecha), se les denomina nibbles “altos” o “bajos”, respecti- vamente (figura 9). Usted seguramente ha pensado alguna vez en cómo es la electrónica dentro de un circuito 10 Club Saber Electrónica Nº 97 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 10 BaSES dE loS MiCroCoNtroladorES integrado digital, un microcontrolador o un microprocesador. ¿Cómo son los circuitos que realizan las ope- raciones matemáticas complicadas y toman decisiones? ¿Sabía que sus esquemas, aparen- temente complicadas consisten en sólo unos pocos elementos diferentes, denominados cir- cuitos lógicos o compuertas lógicas? detalles IMPortantes El funcionamiento de estos elementos es basado en los principios establecidos por el matemático británico George Boole en la mitad del siglo 19 - es decir, ¡antes de la invención de la primera bombilla! En breve, la idea principal era de expresar las formas lógicas por medio de las funciones algebraicas. Tal idea pronto se transformó en un producto práctico que se con- virtió más tarde en lo que hoy en día conocemos como circuitos lógicos Y (AND), O (OR) o NO (NOT). El principio de su funcionamiento es conocido como algebra de Boole. coMPonentes BásIcos de la lógIca dIgItal Algunas instrucciones de programa utilizadas por un microcontrolador funcionan de la misma manera que las compuertas lógicas, pero en forma de comandos. A continuación vamos a explicar el principio de su funcionamiento. compuerta Y (and) Una compuerta lógica “Y” dispone de dos o más entradas y de una salida. En este caso la compuerta utilizada dispone de sólo dos entra- das. Un uno lógico (1) aparecerá en su salida sólo en caso de que ambas entra- das (A Y B) sean llevadas a alto (1). La tabla a la derecha de la figura 10 (en la que también se muestra el símbolo de esta com- puerta) es la tabla de verdad que muestra la relación entre las entradas y salidas de la compuer- ta. El principio de funcionamiento es el mismo cuando la compuerta disponga de más de dos entradas: la salida proporciona un uno lógico (1) sólo si todas las entradas son llevadas a alto (1). Vea la figura 11. Cualquier otra combinación de voltajes de entrada proporcionará un cero lógico (0) en su salida. Utilizada en el programa, la operación Y lógico es realizada por una instrucción de pro- grama, de la que vamos a hablar más tarde. Por ahora basta con conocer que Y lógico en un pro- grama se refiere a la realización de este tipo de operación sobre los bits correspondientes de dos registros diferentes. compuerta o (or) De manera similar, la compuerta O, cuyo símbolo se observa en la figura 12, también dis- pone de dos o más entradas y de una salida. Si la compuerta dispone de sólo dos entradas, es aplicable lo siguiente: la salida proporciona un uno lógico (1) si una u otra entrada (A o B) es lle- vada a alto (1). En caso de que la compuerta O Capítulo 1 11 Figura 9 Figura 10 Figura 11 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 11 El Mundo de los Microcontroladores disponga de más de dos entradas, es aplicable lo siguiente: La salida proporciona un uno lógico (1) si por lo menos una entrada es llevada a alto (1). Si todas las entradas están a cero lógico (0), la salida estará a cero lógico (0) también. Vea la figura 13. En un programa, la operación O lógico se realiza de la misma manera que la operación Y. compuerta no (not) La compuerta lógica NO dispone de una sola entrada y una sola salida, por lo que funciona muy simplemente, figura 14. Cuando un cero lógi- co (0) aparezca en su entrada, la salida propor- ciona un uno lógico (1) y viceversa. Esto significa que esta compuerta invierte las señales por sí mismas y por eso es denominada inversor. En el programa la operación lógica NO se realiza sobre un byte. El resultado es un byte con los bits invertidos, figura 15. Si los bits de un byte se consideran número, el valor invertido es un complemento a ese número. El complemento de un número es el valor que se añade al número hasta llegar al mayor número binario de 8 dígitos. En otras palabras, la suma de un dígito de 8 números y de su com- plemento es siempre 255. compuerta xor (o exclusiva) La compuerta XOR (O EXCLUSIVA) es un poco complicada en comparación con las demás. Representa una combinación de todas las compuertas anteriormente descritas y su símbolo se puede ver en la figura 16. La salida proporciona un uno lógico (1) sólo si sus entra- das están en estados lógicos diferentes. En el programa, esta operación se utiliza con frecuencia para comparar dos bytes. La resta se puede utilizar con el mismo propósito (si el resul- tado es 0, los bytes son iguales). A diferencia de la resta, la ventaja de esta operación lógica es que no es posible obtener los resultados negati- vos. En la figura 17 puede apreciar cómo es la correspondencia entre entradas y salidas. regIstros Un registro o una celda de memoria es un cir- cuito electrónico que puede memorizar el estado de un byte. 12 Club Saber Electrónica Nº 97 Figura 12 Figura 13 Figura 14 Figura 15 Figura 16 Figura 17 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:50 Página 12 BaSES dE loS MiCroCoNtroladorES En la figura 18 tenemos un esquena que ejemplifica el funcionamiento de un registro. registros sFr A diferencia de los registros que no tienen ninguna función especial y predeterminada, cada microcontrolador dispone de un número de registros de funciones especiales (SFR), con la función predeterminada por el fabricante. Sus bits están 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. Imagínese ocho interruptores que manejan el funcionamiento de un cir- cuito pequeño dentro del microcontro- lador. Los registros SFR hacen exacta- mente lo mismo. Vea en la figura 19 un diagrama en bloques de aplicación de estos registros. En otras palabras, el estado de los bits de registros se fija dentro de programa, los registros SFR dirigen los pequeños circuitos dentro del microcontrolador, estos circuitos se conectan por los pines del microcontrolador a un dispositivo periférico utili- zado para... bueno, depende de usted. Puertos de entrada / salIda (e/s) Para hacer útil un microcontrolador, hay que conectarlo a un dispositivo externo, o sea, a un periférico. Cada microcontrolador tiene uno o más registros (denominados puertos) conecta- dos a los pines en el microcontro- lador, figura 20. ¿Por qué se denominan puertos de entrada/salida? Porque usted puede cambiar la función de cada pin como quiera. Por ejemplo, usted desea que su dispositivo encienda y apague los tres señales LEDs y que simultá- neamente monitoree el estado lógico de 5 sensores o botones de presión. 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 función de algún pin Capítulo 1 13 Figura 18 Figura 19 Figura 20 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 13 El Mundo de los Microcontroladores puede ser cambiada durante el funcionamiento. Una de las características más importantes de los pines de entrada/salida (E/S) es la corriente máxima que pueden entregar/recibir. En la mayoría de los microcontroladores la corriente obtenida de un pin es suficiente para activar un LED u otro dispositivo de baja corrien- te (10-20mA). Mientrasmás pines de E/S haya, más baja es la corriente máxima de un pin. En otras pala- bras, todos los puertos de E/S comparten la corriente máxima declarada en la hoja de espe- cificación técnica del microprocesador. Otra característica importante de los pines es que pueden disponer de los resistores pull-up. Estos resistores conectan los pines al polo posi- tivo del voltaje de la fuente de alimentación y su efecto se puede ver al configurar el pin como una entrada conectada a un interruptor mecáni- co o a un botón de presión. Las últimas versio- nes de los microcontroladores tienen las resis- tencias 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 deter- mina el estado del pin correspondiente en el microcontrolador. Por ejemplo, al escribir un uno lógico (1) a un bit del registro de control (SFR), el pin apropiado del puerto se configura automá- ticamente como salida. Eso significa que el voltaje llevado a ese pin se puede leer como 0 o 1 lógico. En caso con- trario, al escribir 0 al registro SFR, el pin apro- piado del puerto se configura como salida. Su voltaje (0V o 5V) corresponde al estado del bit apropiado del registro del puerto. unIdad de MeMorIa La unidad de memoria es una parte del microcontrolador utilizada para almacenar los datos, figura 21. La manera más fácil de expli- carlo es compararlo con un armario grande con muchos cajones. Si marcamos los cajones cla- ramente, será fácil acceder a cualquiera de sus contenidos al leer la etiqueta en la parte delan- tera del cajón. De manera similar, cada dirección de memo- ria corresponde a una localidad de memoria. El contenido de cualquier localidad se puede leer y se le puede acceder al direccionarla. La memo- ria se puede escribir en la localidad o leer. Hay varios tipos de memoria dentro del microcontrolador: Memoria roM – Memoria de sólo lectura ROM: Read Only Memory. La memoria ROM se utiliza para guardar permanentemente el pro- grama que se está ejecutando. El tamaño de programa que se puede escribir depende del tamaño de esta memoria. Los microcontrolado- res actuales normalmente utilizan el direcciona- miento de 16 bits, que significa que son capaces de direccionar hasta 64 Kb de memoria, o sea 65535 localidades. Por ejemplo, si usted es prin- cipiante, su programa excederá pocas veces el límite de varios cientos de instrucciones. Hay varios tipos de memoria ROM: rom de Máscara (enmascarada) - MroM La ROM enmascarada es un tipo de ROM cuyo contenido es programado por el fabricante. El término “de máscara” viene del proceso de fabricación, donde las partes del chip se plas- man en las mascaras utilizadas durante el pro- ceso de fotolitografía. En caso de fabricación de grandes series, el precio es muy bajo. Olvide la idea de modificarla... 14 Club Saber Electrónica Nº 97 Figura 21 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 14 BaSES dE loS MiCroCoNtroladorES otP roM (one time Programmable roM) roM programable una sola vez La memoria programable una sola vez per- mite descargar un programa en el chip, pero como dice su nombre, una sola vez. Si se detec- ta un error después de descargarlo, lo único que se puede hacer es descargar el programa correcto en otro chip. 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 sili- cio a la luz de ultravioleta y borrar el programa completamente en varios minutos. Luego es posible descargar un nuevo programa en él. La instalación de esta ventana es complica- da, lo que por supuesto afecta al precio. Desde nuestro punto de vista, desgraciadamente, de manera negativa... Memoria Flash Este tipo de memoria se inventó en los años 80 en los laboratorios de la compañía INTEL, como forma desarrollada de la memoria UV EPROM. Ya que es posible escribir y borrar el contenido de esta memoria prácticamente un número ilimitado de veces, los microcontrolado- res con memoria Flash son perfectos para estu- diar, experimentar y para la fabricación en pequeña escala. Por la gran popularidad de esta memoria, la mayoría de los microcontroladores se fabrican con tecnología flash hoy en día. Si usted va a comprar un microcontrolador, ¡éste es en definitiva la opción perfecta! Memoria raM – Memoria de acceso aleatorio RAM: Random Access Memory. Al apagar la fuente de alimentación, se pierde el contenido de la memoria RAM. Se utiliza para almacenar temporalmente los datos y los resultados inme- diatos creados y utilizados durante el funciona- miento del microcontrolador. Por ejemplo, si el programa ejecuta la adición (de cualquier cosa) es necesario tener un registro que representa lo que se llama “suma” en vida cotidiana. Con tal propósito, uno de los registros de la RAM es denominado “suma” y se utiliza para almacenar los resultados de la adición. Memoria eeProM – roM Programable y Borrable eléctricamente EEPROM: Electricall y Erasable Programmable ROM. El contenido de la EEPROM se puede cambiar durante el funcio- namiento (similar a la RAM), pero se queda per- manentemente guardado después de la pérdida de la fuente de alimentación (similar a la ROM). Por lo tanto, la EEPROM se utiliza con frecuen- cia para almacenar los valores creados durante el funcionamiento, que tienen que estar perma- nentemente guardados. Por ejemplo, si usted ha Capítulo 1 15 Figura 22 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 15 El Mundo de los Microcontroladores diseñado una llave electrónica o un alarma, sería estupendo permitir al usuario crear e intro- ducir una contraseña por su cuenta. Por supuesto, la nueva contraseña tiene que estar guardada al apagar la fuente de alimentación. En tal caso una solución perfecta es el microcontrolador con una EEPROM embebida. InterruPcIones La mayoría de programas utilizan interrupcio- nes durante ejecución de programa regular. El propósito del microcontrolador generalmente consiste en reaccionar a los cambios en su entorno. En otras palabras, cuando ocurre algo, el microcontrolador reacciona de alguna mane- ra... Por ejemplo, al apretar el botón del mando a distancia, el microcontrolador lo registra y res- ponde al comando cambiando de canal, subien- do o bajando el volumen etc. Si el microcontro- lador pasará la mayoría del tiempo comproban- do varios botones sin parar - las horas, los días, esto no sería nada práctico. Por lo tanto, el microcontrolador “aprendió un truco” durante su evolución. En vez de seguir comprobando algún pin o bit, el microconrolador deja su “trabajo de esperar” a un “experto” que reaccionará sólo en caso de que suceda algo digno de atención. La señal que informa al procesador central acerca de tal acontecimiento se denomina INTERRUPCIÓN. 16 Club Saber Electrónica Nº 97 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 16 BaSES dE loS MiCroCoNtroladorES unIdad central de ProcesaMIento (central Processor unIt - cPu) Como indica su nombre, esto es una unidad que controla todos los procesos dentro del microcontrolador. Consiste en varias unidades más pequeñas, figura 23, de las que las más importantes son: • Decodificador de instrucciones es la parte que descodifica las instrucciones del pro- grama y acciona otros circuitos basándose en esto. El “conjunto de instrucciones” que es dife- rente para cada familia de microcontrolador expresa las capacidades de este circuito; • Unidad lógica aritmética (Arithmetical Logical Unit - ALU) realiza todas las operaciones matemáticas y lógicas sobre datos; y • Acumulador o registro de trabajo. Es un registro SFR estrechamente relacionado con el funcionamiento de la ALU. Es utilizado para almacenar todos los datos sobre los que se debe realizar alguna operación (sumar, mover). También almacena los resultados preparados para el procesamientofuturo. Uno de los regis- tros SFR, denominado Registro Status (PSW), está estrechamente relacionado con el acumula- dor. Muestra el “estado” de un número almace- nado en el acumulador (el número es mayor o menor que cero etc.) en cualquier instante dado. Bus El bus está formado por 8, 16 o más cables. Hay dos tipos de buses: el bus de direcciones y el bus de datos. El bus de direcciones consiste en tantas líneas como sean necesarias para direccionar la memoria. Se utiliza para transmitir la dirección de la CPU a la memoria. El bus de datos es tan ancho como los datos, en este caso es de 8 bits o líneas de ancho. Se utiliza para conectar todos los circuitos dentro del microcon- trolador. coMunIcacIón en serIe La conexión paralela entre el microcontrolador y los periféri- cos a través de los puertos de entrada/salida es una solución perfecta para las distancias cortas “hasta varios metros”, figura 24. No obstante, en otros casos cuando es necesario establecer comunicación entre dos dispositivos a largas distancias no es posible uti- lizar la conexión paralela. En vez de eso, se uti- liza la conexión en serie. Hoy en día, la mayoría de los microcontrola- dores llevan incorporados varios sistemas dife- rentes para la comunicación en serie, como un equipo estándar. Cuál de estos sistemas se uti- lizará en un caso concreto, depende de muchos factores, de los que más importantes son: • ¿Con cuántos dispositivos el microcon- trolador tiene que intercambiar los datos? • ¿Cuál es la velocidad del intercambio de datos obligatoria? Capítulo 1 17 Figura 23 Figura 24 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 17 El Mundo de los Microcontroladores • ¿Cuál es la distancia entre los dispositi- vos? • ¿Es necesario transmitir y recibir los datos simultáneamente? Una de las cosas más importantes en cuanto a la comunicación en serie es el “Protocolo” que debe ser estrictamente observado. Es un con- junto de reglas que se aplican obligatoriamente para que los dispositivos puedan interpretar correctamente los datos que intercambian mutuamente. Afortunadamente, los microcontro- ladores se encargan de eso automáticamente, así que el trabajo de programador/usuario es reducido a la escritura y lectura de datos. velocIdad de transMIsIón serIal La velocidad de transmisión serial (baud rate) es el término utilizado para denotar el número de bits transmiti- dos por segundo (bps). ¡Fíjese que este tér- mino se refiere a bits, y no a bytes! El protocolo normal- mente requiere que cada byte se transmita junto con varios bits de control. Eso quiere decir que un byte en un flujo de datos serial puede consistir en 11 bits. Por ejemplo, si velocidad de transmisión serial es 300 bps un máximo de 37 y un mínimo de 27 bytes se pueden transmitir por segundo. Los sistemas de comunicación serial más uti- lizados son: I2c cIrcuIto Inter- Integrado (Inter Integrated cIrcuIt) Circuito inter-integrado es un sistema para el intercambio de datos serial entre los microcon- troladores y los circuitos integrados especializa- dos de generación. Se utiliza cuando la distancia entre ellos es corta (el receptor y el transmisor están normalmente en la misma placa de circui- to impreso). La conexión se establece por medio de dos líneas - una se utiliza para transmitir los datos, mientras que la otra se utiliza para la sin- cronización (la señal de reloj). Como se muestra en la figura 25, un disposi- tivo es siempre el principal (master - maestro), el que realiza el direccionamiento de un chip subordinado (slave - esclavo) antes de que se inicie la comunicación. De esta manera un microcontrolador puede comunicarse con 112 dispositivos diferentes. La velocidad de transmi- sión serial es normalmente 100 kb/seg (el modo estándar) o 10 Kb/seg (modo de velocidad de transmisión baja). Recientemente han aparecido los sistemas con la velocidad de transmisión serial 3.4 Mb/sec. La distancia entre los dispositivos que se comunican por el bus I2C está limitada a unos metros. sPI - Bus serIal de InterFase de PerIFérIcos (serIal PerIPHeral InterFace Bus) Un bus serial de interfase de periféricos es un sistema para la comunicación serial que utili- za hasta cuatro líneas (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 conexión full duplex, lo que signifi- ca que los datos se envían y se reciben simultá- neamente. La velocidad de transmisión máxima es mayor que en el sistema de conexión I2C. 18 Club Saber Electrónica Nº 97 Figura 25 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 18 BaSES dE loS MiCroCoNtroladorES uart – transMIsor – recePtor asIncrónIco unIversal (unIversal asYncHronous receIver/transMItter) - transMIsor- Este tipo de conexión es asincrónica o asín- crona, lo que significa que no se utiliza una línea especial para transmitir la señal 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 sólo una línea de comunicación, tanto el receptor como el transmisor reciben y envían los datos a veloci- dad misma que ha sido predefinida para mante- ner la sincronización necesaria. Esto es una manera simple de transmitir datos puesto que básicamente representa una conversión de datos de 8 bits de paralelo a serial. La velocidad de transmisión no es alta, es hasta 1 Mbit/sec. oscIlador Los pulsos uniformes generados por el osci- lador (figura 27) permi- ten el funcionamiento armónico y síncrono de todos los circuitos del microcontrolador. El oscilador se configura normalmente de tal manera que utilice un cristal de cuarzo o reso- nador cerámico para estabilización de frecuencia. Además, puede funcionar como un circuito autónomo (como oscilador RC). Es importante decir que las ins- trucciones del programa no se ejecutan a la velocidad impuesta por el mismo oscilador sino varias veces más despacio. Eso ocurre porque cada instrucción se ejecuta en varios ciclos del oscilador. En algunos microcontroladores se necesita el mismo número de ciclos para ejecutar todas las instrucciones, mientras que en otros el tiempo de ejecución no es el mismo para todas las ins- trucciones. Por consiguiente, si el sistema utiliza el cris- tal de cuarzo con una frecuencia de 20MHZ, el tiempo de ejecución de una instrucción de pro- grama no es 50 nS, sino 200, 400 o 800 nS dependiendo del tipo del microcontrolador. cIrcuIto de alIMentacIón Fuente de alIMenta cIón Hay que mencionar dos cosas dignas de atención con relación al circuito de la fuente de alimentación de microcontroladores: • Brown out es un estado potencialmen- te peligroso que ocurre al apagar el micro- controlador o en caso de que el voltaje de la fuente de alimentación salga de unos márge- nes debido al ruido eléctrico. Como el microcontrolador dispone de varios circuitos que funcionan a niveles de voltaje diferentes, ese estado puede causar un com- portamiento descontrolado. Para evitarlo, el microcontrolador normal- mente tiene un circuito incorporado para el Capítulo 1 19 Figura 26 Figura 27 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 19 El Mundo de los Microcontroladores brown out reset. El circuito reinicia inmediata- mente el microcontrolador si el voltaje de ali- mentación cae por debajo del límite. • el pin de reset (reinicio), marcado fre- cuentemente con MCLR (Master Clear Reset), sirve para el reinicio externo del microcontrola- dor al aplicar un cero (0) o un uno (1) lógico dependiendo del tipo del microcontrolador. En caso de que el circuito brown out no esté incor- porado, un simple circuito externo para el brown out reset se puede conectar al pin MCLR. teMPorIzadores – contadores El oscilador del microcontrolador utiliza cris- tal de cuarzo para su funcionamiento. Aunque no se trata de la solución más simple, hay muchas razonespara utilizarlo. La frecuencia del oscilador es definida con precisión y muy estable, así que siempre genera los pulsos del mismo ancho, lo que los hace perfectos para medición 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 oscila- dor. Esto es exactamente lo que hace el tempo- rizador y su representación la podemos obser- var en la figura 28. La mayoría de los programas utiliza estos cronómetros electrónicos en miniatura. Generalmente son registros SFR de 8 o 16 bits cuyo contenido se aumenta automáticamente con cada pulso. ¡Una vez que se llena el registro, se genera una interrupción! Si el temporizador utiliza el oscilador de cuar- zo interno para su funcionamiento, es posible medir el tiempo entre dos eventos (el valor de registro en el momento de iniciar la medición es T1, en el momento de finalizar la medición 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 temporiza- dor se convierte en un contador. Esto es una explicación simple de su funcio- namiento. Es un poco más complicado en prác- tica. ¿cóMo FuncIonan los teMPorIzadores? En la práctica los pulsos generados por el oscilador de cuarzo son llevados al circuito una vez por cada ciclo de máquina directamente o por el pre-escalador, lo que aumenta el número en el registro del temporizador. Si una instrucción (un ciclo de máquina gene- ralmente) dura cuatro períodos del oscilador de cuarzo, este número será cambiado un millón de veces por segundo (cada microsegundo) al incorporar al cuarzo que oscila con una frecuen- cia de 4MHz. Es fácil de medir los intervalos de tiempo cor- tos de la manera descrita anteriormente (hasta 256 microsegundos porque es el mayor número que un registro puede contener). Esta obvia desventaja se puede superar de varias maneras: al utilizar el oscilador más lento, por medio de registros con más bits, del pre- escalador o de la interrupción. Las primeras dos soluciones tienen algunas debilidades así que se recomienda utilizar el pre-escalador y/o la interrupción. 20 Club Saber Electrónica Nº 97 Figura 28 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 20 BaSES dE loS MiCroCoNtroladorES utIlIzando un Preescalador en el FuncIonaMIento del teMPorIzador Un pre-escalador es un dispositivo electróni- co utilizado para dividir la frecuencia por un fac- tor predeterminado. Esto quiere decir que se necesita llevar 1, 2, 4 o más pulsos a su entrada para generar un pulso a la salida. La mayoría de los microcontroladores disponen de uno o más pre-escaladores incorporados y su tasa de divi- sión puede ser cambiada dentro del programa. El pre-escalador se utiliza cuando es necesario medir los períodos de tiempo más largos, figura 29. Si el temporizador y el temporizador perro guardián comparten un pre-escalador, éste no se puede utilizar por los dos simultáneamente. utIlIzando una InterruPcIón en el FuncIonaMIento del teMPorIzador Si el registro del temporizador es de 8 bits, el mayor número que se puede escribir en él es 255 (en los registros de 16 bits es el número 65.535). Si se excede este número, el tempori- zador se reinicia automáticamente y el conteo comienza de nuevo en cero. Esto es denominado desbordamiento o sobreflujo (overflow). Permitido por el programa, el desbordamiento puede provocar una interrup- ción, lo que abre completamente nuevas posibi- lidades. Por ejemplo, el estado de registros utilizados para contar segundos, minutos o días puede ser implementado en una rutina de interrupción. El proceso entero (excepto la rutina de interrup- ción) se lleva a cabo internamente, lo que permite que los circuitos princi- pales del micro- controlador funcio- nen regularmente. La figura 30 descri- be el uso de una interrupción en el funcionamiento del temporizador. Al asignarle un pre-escalador al temporizador, se producen retrasos de duración arbitraria con mínima interferencia en la ejecu- ción del programa principal. contadores Si un temporizador se suministra por los pul- sos ingresados por el pin de entrada en el micro- Capítulo 1 21 Figura 29 Fifura 30 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 21 El Mundo de los Microcontroladores controlador, se produce un con- tador. Evidentemente, es el mismo circuito electrónico. La única diferencia es que los pul- sos para contar se ingresan por el pin de entrada y que su dura- ción (anchura) no es definida. Por eso, no se pueden utilizar para medición de tiempo, sino que se utilizan para otros propó- sitos, por ejemplo: contar los productos en la cadena de mon- taje, número de rotaciones del eje de un motor, pasajeros etc. (dependiendo del sensor utiliza- do). teMPorIzador Perro guardIán WatcHdog El perro guardián es un temporizador conec- tado a un oscilador RC completamente indepen- diente dentro del microcontrolador. Si el perro guardián está habilitado, cada vez que cuenta hasta el máximo valor en el que ocu- rre el desbordamiento del registro se genera una señal de reinicio del microcontrolador y la ejecu- ción de programa inicia en la primera instruc- ción. El punto es evitar que eso ocurra al utilizar el comando adecuado. La idea se basa en el hecho de que cada pro- grama se ejecuta en varios bucles, más largos o cortos. Si las instrucciones que reinician el tempori- zador perro guardián se colocan en lugares estratégicos del programa, aparte los comandos que se ejecutan regularmente, el funcionamien- to del perro guardián no afectará a la ejecución del programa, figura 31. Si por cualquier razón (ruidos eléctricos fre- cuentes en la industria) el contador de programa “se queda atrapado” dentro de un bucle infinito, el valor del registro continuará aumentado, el temporizador perro guardián alcanzará el máxi- mo valor, el registro se desbordará y, ¡aleluya! ¡Ocurre el reinicio! convertIdor dIgItal – analógIco (d/a) Las señales del mundo real son muy diferen- tes de las que “entiende” el microcontrolador (ceros y unos), así que deben ser convertidas para que el microcontrolador pueda entenderlas. En la figura 32 podemos observar que entre “0” (0V) y “1” (5V) hay varios niveles de tensión intermedios. Un convertidor analógico-digital es un circuito electrónico encargado de convertir las señales continuas en números digitales dis- cretos. En otras palabras, este circuito convierte un número real en un número binario y se lo envía a la CPU para ser procesado. Este módulo, figu- ra 33, se utiliza para medir el voltaje en el pin de entrada. El resultado de esta medición es un número (el valor digital) utilizado y procesado más tarde en el programa. 22 Club Saber Electrónica Nº 97 Figura 31 Figura 32 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 22 BaSES dE loS MiCroCoNtroladorES arQuItectura Interna de un MIcrocontrolador Todos los microcontroladores actuales utili- zan uno de dos modelos básicos de arquitectu- ra 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 arqui- tectura Von- Neumann disponen de un solo blo- que de memoria y de un bus de datos de 8 bits, figura 34. Como todos los datos se intercambian por medio de estas 8 líneas, este bus está sobre- cargado, y la comunicación por si misma es muy lenta e ineficaz. La CPU puede leer una instrucción 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 el mismo bus. Por ejemplo, si alguna línea de programa dice que el regis- tro de la memoria RAM llamado “SUM” debe ser aumentado por uno (instrucción: incf SUMA), el micro- controlador hará lo siguiente: 1. Leer la parte de la instrucción de programa que especifica QUÉ es lo que debe realizar(en este caso es la instrucción para incrementar “incf”) 2. Seguir leyendo la misma ins- trucción que especifica sobre CUÁL dato lo debe realizar (en este caso es el contenido del registro “SUMA”) 3. Después de haber sido incrementado, el contenido de este registro se debe escribir en el registro del que fue leído (dirección 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. Uno es de 8 bits de ancho y conecta la CPU con la memoria RAM. El otro consiste en varias líneas (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 Capítulo 1 23 Figura 33 Figura 34 Figura 35 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 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, sólo 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 serán almacenados en la memoria ROM interna del microcontrolador después de haber sido compi- lados a código máquina. No obstante, estas localidades de memoria ROM no tienen 8, sino 12, 14 o 16 bits. 4, 6 o 8 bits adicionales representan una instrucción que especifica a la CPU qué hacer con los datos de 8 bits. Las ventajas de este diseño son las siguien- tes: • Todos los datos en el programa son de un byte (8 bits) de ancho. Como un bus de datos utilizado para lectura de programa tiene unas líneas más (12, 14 o 16), tanto la instrucción como el dato se pueden leer simultáneamente al utilizar estos bits adicionales. Por eso, todas las 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) estén separa- dos, permite a la CPU poder ejecutar dos ins- trucciones simultáneamente. Dicho de manera sencilla, mientras que se realiza la lectura o escritura de la RAM (que marca el fin de una ins- trucción), la siguiente instrucción se lee por medio de otro bus. • En los microcontroladores que utilizan la arquitectura de von-Neumann, nunca se sabe cuánta memoria ocupará algún programa. Generalmente, la mayoría de las instrucciones de programa ocupan dos localidades de memo- ria (una contiene información sobre QUÉ se debe realizar, mientras que la otra contiene información sobre CUÁL dato se debe realizar). Sin embargo, esto no es una fórmula rígida, sino el caso más frecuente. En los microcontrolado- res que utilizan una arquitectura Harvard, el bus de la palabra de programa es más ancho que un byte, lo que permite que cada palabra de pro- grama esté compuesto por una instrucción y un dato. En otras palabras, una localidad de memo- ria - una instrucción de programa. Juego de InstruccIones El nombre colectivo de todas las instruccio- nes que puede entender el microcontrolador es llamado Juego de Instrucciones, figura 36. Cuando se escribe un programa en ensambla- dor, en realidad se especifican instrucciones en el orden en el que deben ser ejecutadas. La res- tricción principal es el número de instrucciones disponibles. Los fabricantes aceptan cualquiera de los dos enfoques descritos a continuación: rIsc (reduced Instruction set computer) - computadora con Juego de Instrucciones reducidas En este caso la idea es que el microcontrola- dor reconoce y ejecuta sólo operaciones básicas (sumar, restar, copiar etc.) Las operaciones más complicadas se realizan al combinar éstas (por ejemplo, multiplicación se lleva a cabo al realizar adición sucesiva). Es como intentar explicarle a alguien con pocas palabras cómo llegar al aeropuerto en una nueva ciudad. Sin embargo, no todo es tan oscuro. Además, el microcontrolador es muy rápido así que no es posible ver todas las “acro- bacias” aritméticas que realiza. El usuario sólo puede ver el resultado final de todas las operaciones. Por último, no es tan difí- 24 Club Saber Electrónica Nº 97 Figura 36 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 24 BaSES dE loS MiCroCoNtroladorES cil explicar dónde está el aeropuerto si se utili- zan las palabras adecuadas tales como: a la derecha, a la izquierda, el kilómetro etc. cIsc (complex Instruction set computer) - computadoras con un juego de instruccio- nes complejo ¡CISC es opuesto a RISC! Los microcontro- ladores diseñados para reconocer más de 200 instrucciones diferentes realmente pueden reali- zar muchas cosas a alta velocidad. No obstante, uno debe saber cómo utilizar todas las posibili- dades que ofrece un lenguaje tan rico, lo que no es siempre tan fácil. ¿cóMo se deBe elegIr un MIcrocontrolador? Si usted es principiante y ha tomado decisión de trabajar con los microcontroladores. ¡felicita- ciones por la elección! No obstante, a primera vista, no es fácil la elección del microcontrolador más adecuado como parece a la primera vista. ¡El problema no es el pequeño rango de dispo- sitivos a elegir, sino todo lo contrario! Antes de empezar a diseñar un dispositivo basado en un microcontrolador, tome en cuenta lo siguiente: cuántas entradas/líneas son nece- sarias para su funcionamiento, realizaría el dis- positivo otras operaciones además encender/apagar un relé, necesita algún modulo especializado tal como el de comunicación en serie, convertidor A/D etc. Cuando usted tiene una clara imagen de lo que quiere, el rango de selección se reduce considerablemente, y le queda pensar en el precio. ¿Va a tener varios dispositivos? ¿Varios cientos? ¿Un millón? De todos modos ahora es más claro. Si está pensando en todas estas cosas por primera vez, todo le parecerá un poco confuso. Por esa razón, vaya paso a paso. Antes que nada, seleccione al fabricante, es decir, la fami- lia de microcontroladores que ofrece. Luego, aprenda a trabajar con un modelo particular. Sólo aprenda lo que necesite aprender, no entre demasiado en detalles. Resuelva el problema específico y le pasará una cosa increíble - será capaz de manejar cualquier modelo del mismo fabricante... Más o menos, todo se parece a montar en bicicleta: después de varias caídas inevitables en el principio, será capaz de mantener el equilibrio y montar en cualquier otra bicicleta. ¡Por supues- to, nunca se olvida tanto de montar en bicicleta, como de la destreza de programación! J Capítulo 1 25 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 25 Cap 1 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:51 Página 26 Lenguajes de Programación El microcontrolador ejecuta el programa car- gado en la memoria flash. Esto se denomina el código ejecutable y está compuesto por una serie de ceros y unos, aparentemente sin signi- ficado. Dependiendo de la arquitectura del microcontrolador, el código binario está com- puesto por palabras de 12, 14 o 16 bits de ancho. Cada palabra se interpreta por la CPU como una instrucción a ser ejecutada durante el funcionamiento del microcontrolador. Todas las instrucciones que el microcontrolador puede reconocer y ejecutar se les denominan colecti- vamente Conjunto de instrucciones. Como es más fácil trabajar con el sistema de numeración hexadecimal, el código ejecutable se representa con frecuencia como una serie de los números Capítulo 2 27 Capítulo 2 eL mundo de LoS microcontroLadoreS Usted seguramente sabe que no es suficiente sólo conectar el microcontrolador a los otros componentes y encender una fuente de alimentación para hacerlo funcionar, ¿verdad? Hay que hacer algo más. Se necesita programar el microcontrolador. Si cree que esto es complicado, está equivocado. Todoel procedimiento es muy simple. Basta con leer el texto para entender de lo que estamos hablando. www.mikroe.com SiStemaS de Programación: Lenguaje mikroc Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 27 El Mundo de los Microcontroladores hexadecimales denominada código Hex. En los microcontroladores PIC con las palabras de pro- grama de 14 bits de anchura, el conjunto de ins- trucciones tiene 35 instrucciones diferentes. Lenguaje ensambLador Como el proceso de escribir un código ejecu- table era considerablemente arduo, en conse- cuencia fue creado el primer lenguaje de pro- gramación denominado ensamblador (ASM). Siguiendo la sintaxis básica del ensamblador, era más fácil escribir y comprender el código. Las instrucciones en ensamblador consisten en las abreviaturas con significado y a cada ins- trucción corresponde una localidad de memoria. Un programa denominado ensamblador compila (traduce) las instrucciones del lenguaje ensam- blador a código máquina (código binario). Vea la figura 1. Este programa compila instrucción a instrucción sin optimización. Como permite con- trolar en detalle todos los procesos puestos en marcha dentro del chip, este lenguaje de pro- gramación todavía sigue siendo popular. Ventajas de Los Lenguajes de Programación de aLto niVeL A pesar de la gran cantidad de beneficios, el lenguaje ensamblador tiene algunas desventa- jas a saber: * Incluso una sola operación en el programa escrito en ensamblador consiste en muchas ins- trucciones, haciéndolo muy largo y difícil de manejar. * Cada tipo de microcontrolador tiene su pro- pio conjunto de instrucciones que un programa- dor tiene que conocer para escribir un programa * Un programador tiene que conocer el hard- ware del microcontrolador para escribir un pro- grama En la figura 2 podemos observar un progra- ma escrito en C y el mismo programa compilado al código ensamblador. Los lenguajes de programación de alto nivel (Basic, Pascal, C etc.) fueron creados con el propósito de superar las desventajas del ensam- blador. En lenguajes de programación de alto nivel varias instrucciones en ensamblador se sustitu- yen por una sentencia. El programador ya no tiene que conocer el conjunto de instrucciones o características del hardware del microcontrola- dor utilizado. Ya no es posible conocer exacta- mente cómo se ejecuta cada sentencia, de todas formas ya no importa. Aunque siempre se puede insertar en el programa una secuencia escrita en ensamblador. 28 Club Saber Electrónica Nº 97 Figura 1 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 28 SiStEmaS dE ProgramaCióN: LENguajE mikroC 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 instrucción apropiada para multiplicar dos números. Por supuesto, para cada problema hay una solución y éste no es una excepción gracias a la aritmética que permite realizar las operaciones complejas al descomponerlas en un gran núme- ro operaciones más simples. En este caso, la multiplicación se puede sustituir con facilidad por adición 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 programación de alto nivel como es C, porque el compilador encontrará automáticamente la solución a éste problema y otros similares. Para multiplicar los números a y b, basta con escribir a*b ó axb. Lenguaje c El lenguaje C dispone de todas las ventajas de un lenguaje de programación de alto nivel (anteriormente descritas) y le permite realizar algunas operaciones tanto sobre los bytes como sobre los bits (operaciones lógicas, desplaza- miento etc.). Las características de C pueden ser muy úti- les al programar los microcontroladores. Además, C está estandarizado (el estándar ANSI), es muy portable, así que el mismo códi- go se puede utilizar muchas veces en diferentes proyectos. Lo que lo hace accesible para cualquiera que conozca este lenguaje sin reparar en el propósi- to de uso del microcontrolador. C es un lengua- je compilado, lo que significa que los archivos fuentes que contienen el código C se traducen a lenguaje máquina por el compilador. Todas estas características hicieron al C uno de los lenguajes de programación más populares. Capítulo 2 29 Figura 2 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 29 El Mundo de los Microcontroladores La figura 3 es un ejemplo general de lo que sucede durante la compilación de programa de un lenguaje de programación de alto nivel a bajo nivel. 30 Club Saber Electrónica Nº 97 Figura 3 caracteríSticaS deL Lenguaje mikroc A continuación vamos a presentar a los elementos principales del lenguaje mikroC desarrollado por Mikroelektronika. Este lenguaje es muy similar al C estándar, no obstante en determinados aspectos difiere del ANSI estándar en algunas características, figura 4. Algunas de estas diferencias se refieren a las mejoras, destinadas a facilitar la programación de los microcontroladores PIC, mientras que las demás son la consecuencia de la limitación de la arquitectura del hardware de los PIC. Aquí vamos a presentar características específicas del lenguaje mikroC en la programación de los microcontro- ladores PIC. Figura 4 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 30 SiStEmaS dE ProgramaCióN: LENguajE mikroC El término C se utilizará para referirse a las características comunes de los lenguajes C y mikroC. Este libro describe una aplicación muy concreta del lenguaje de programación C utilizado en el com- pilador “mikroc Pro for Pic”. En este caso, el compilador se utiliza para la programación de los microcontroladores PIC. Cabe destacar que el lector no necesariamente precisará este compilador pero creemos oportuno utilizarlo dado que sus ventajas son enormes. De todos modos, en el pró- ximo capítulo, veremos otras formas de trabajar con microcontroladores PIC. Fases de La comPiLación El proceso de compilación consiste en varios pasos y se ejecuta automáticamente por el compi- lador, figura 5. Por consiguiente, un conocimiento básico del funcionamiento puede ser útil para entender el concepto del lenguaje mikroC. El archivo fuente contiene el código en mikroC que usted escribe para programar el microcon- trolador. El preprocesador se utiliza automáticamente por el compilador al iniciarse el proceso de la compilación. El compilador busca las directivas del preprocesador (que siempre empiezan por ‘#’) dentro del código y modifica el código fuente de acuerdo con las directivas. En esta fase se llevan a cabo inclusión de archivos, definición de constantes y macros etc., lo que facilita el proceso. Más tarde vamos a describir estas directivas en detalle. El analizador sintáctico (parser) elimi- na toda la información inútil del código (comentarios, espacios en blanco). Luego, el compilador traduce el código a un archivo binario denominado archivo .mcl. El enlazador (linker) recupera toda la información requerida para ejecutar el programa de los archivos externos y la agrupa en un solo archivo (.dbg). Además, un proyecto puede contener más de un archivo fuente y el programador puede utilizar funciones predefinidas y agrupadas dentro de los archivos denominados librerías. Por último, el generador “.hex” produce un archivo .hex. Es el archivo que se va a cargar en el microcontrola- dor. El proceso entero de la compilación que incluye todos los pasos anteriormente descritos se le denomina “building”. estructura deL Programa La idea principal de escribir un programa en C es de “romper” un problema mayor en varios tro- zos más pequeños. Supongamos que es necesario escribir un programa para el microcontrolador para medir la temperatura y visualizar los resultados en un LCD. El proceso de mediciónse realiza por un sensor que convierte temperatura en voltaje. El microcontrolador utiliza el convertidor A/D para convertir este voltaje (valor analógico) en un número (valor digital) que luego se envía al LCD Capítulo 2 31 Figura 5 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 31 por medio de varios conductores. En consecuencia, el programa se divide en cuatro partes, de las que cada una corresponde a una acción específica: Activar y configurar el convertidor A/D incorporado; Medir el valor analógico; Calcular temperatura; y Enviar los datos en el formato apropiado al LCD. Los lenguajes de programación de alto nivel como es C le permiten solucionar este proble- ma con facilidad al escribir cuatro funciones que se ejecutarán cíclicamente sin parar, tal como se deduce de la figura 6. La idea general es de dividir el problema en varios trozos, de los que cada uno se puede escribir como una sola función. Todos los pro- gramas escritos en mikroC contienen por lo menos una función llamada main() que encie- rra entre llaves {} las sentencias a ser ejecuta- das. Esto es la primera función a ser ejecutada al iniciarse la ejecución de programa. Las otras funciones se pueden llamar dentro de la fun- ción main. En otras palabras, podemos decir que la función main() es obligatoria, mientras que las demás son opcionales. Si todavía no ha escrito un programa en C, es probable que todo le resulte confuso. No se preocupe, acéptelo tal como es por el momento y más tarde entenderá la sintaxis. ¡Y ahora, haga su primer programa ‘real’! La figura 7 muestra la estructura de un programa, señalando las partes en las que consiste. El Mundo de los Microcontroladores 32 Club Saber Electrónica Nº 97 Figura 6 Figura 7 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 32 SiStEmaS dE ProgramaCióN: LENguajE mikroC La manera de escribir el código en C es muy importante. Por ejemplo, C difiere entre minúscu- las y mayúsculas, así que la función main() no se puede escribir MAIN() o Main(). Además, note que dos líneas del código dentro de la función terminan con un punto y coma. En C todas las sen- tencias deben terminar con un punto y coma ‘;’, así el compilador puede aislarlas y traducirlas a código máquina. Para comprender mejor esta estructura mire la figura 8 en la que se expresan diferentes obser- vaciones dentro del programa. comentarios Los comentarios son las partes del programa utilizados para aclarar las instrucciones de pro- grama o para proporcionar más información al respecto. El compilador no hace caso a los comen- tarios y no los compila al código ejecutable. Dicho de manera sencilla, el compilador es capaz de reconocer los caracteres especiales utili- zados para designar dónde los comentarios comienzan y terminan y no hace nada de caso al texto entre ellos durante la compilación. Hay dos tipos de tales caracteres. Unos designan los comenta- rios largos que ocupan varias líneas de programa marcados por la secuencia especial /*...*/, mien- tras que otros designan los comentarios cortos que caben en una sola línea //. Aunque los comen- tarios no pueden afectar a la ejecución de programa, son tan importantes como cualquier otra parte de programa. Aquí está el porqué... con frecuencia es necesario mejorar, modificar, actualizar, simplificar un programa... No es posible interpretar incluso los programas simples sin utilizar los comentarios. Capítulo 2 33 Figura 8 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 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 tamaño de dato (número de bytes reque- rido en la memoria) y su representación. Hay varios tipos de datos que se pueden utilizar en el len- guaje de programación mikroc dependiendo del tamaño de dato y del rango de valores. La tabla 1 muestra el rango de valores que los datos pueden tener cuando se utilizan en su forma básica. Al añadir un prefijo (calificador) a cualquier tipo de dato entero o carácter, el rango de sus posi- bles valores cambia así como el número de los bytes de memoria necesarios. Por defecto, los datos de tipo int son con signo, mientras que los de tipo char son sin signo. El calificador signed (con signo) indica que el dato puede ser positivo o negativo. El prefijo unsigned indica que el dato puede ser sólo positivo. Note en la tabla 2 que el prefijo es opcional. tipo entero (int) Un entero es un número sin parte fraccionaria que puede estar expresado en los siguientes for- matos, a saber: Hexadecimal (base 16): el número empieza con 0x (o 0X). Los enteros hexadecimales consis- ten en los dígitos (de 0 a 9) y/o las letras (A, B, C,D, E, F). Por ejemplo: ‘0x1A’. Decimal (base 10): el número consiste en los dígitos (de 0 a 9). El primer dígito no puede ser 0. En este formato, se puede introducir el signo de número (‘+’ o ‘-’). Por ejemplo: 569, -25, +1500. Octal (base 8): los números se representan a base 8 utilizando sólo 8 dígitos (de 0 a 7). Los enteros octales empiezan con 0. Por ejemplo: ‘056’. Binario (base 2): cuando un entero empieza con 0b (o 0B) se representan como una serie de bits (‘0’ y ‘1’). Por ejemplo: 0B10011111. Vea a continuación un juego de sentencias que pueden corresponder a una parte de un progra- ma en la que se muestran los diferentes formatos: 34 Club Saber Electrónica Nº 97 Tabla 1 Tabla 2 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 34 SiStEmaS dE ProgramaCióN: LENguajE mikroC 0x11 // formato hexadecimal equivale a decimal 17 11 // formato decimal -152 // formato decimal 011 // formato octal equivale a decimal 9 0b11 // formato binario equivale a decimal 3 tipo punto flotante (float) El tipo punto flotante (float) se utiliza para los números reales con el punto decimal. Los datos de tipo float se pueden representar de varias maneras. Un dato float es siempre con signo (signed): 0. // = 0.0 -1.23 // = -1.23 23.45e6 // = 23.45 * 10^6 2e-5 // = 2.0 * 10^-5 3E+10 // = 3.0 * 10^10 .09E34 // = 0.09 * 10^34 tipo carácter (char) El tipo char es considerado como un entero por el compilador. No obstante, se utiliza normal- mente para los datos de tipo carácter. Un dato de tipo carácter está encerrado entre comillas y codi- ficado en un carácter ASCII: 59 // entero 'p' // carácter ASCII 'p' Una secuencia de caracteres es denominada cadena (string). Las cadenas están encerradas entre comillas dobles: "Presione el botón RA0" VariabLes y constantes definiciones Una variable es un objeto nombrado capaz de contener un dato que puede ser modificado duran- te la ejecución de programa. En C, las variables tienen tipo, que significa que es necesario especi- ficar el tipo de dato que se le asigna a una variable (int, float etc.). Las variables se almacenan en la memoria RAM y el espacio de memoria que ocupan (en bytes) depende de su tipo, figura 13. /* dos líneas de programa consecutivas. En la primera línea del programa se define el tipo de variable */ int a = 1000; // Variable a es de tipo int y equivale a 1000 a = 15; // a equivale a 15 Capítulo 2 35 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 35 El Mundo de los Microcontroladores Una constante tiene las mismas características que una variable excepto el hecho de que su valor asignado no puede ser cambiado durante la ejecución de programa. A diferencia de las varia- bles, las constantes se almacenan en la memoria Flash del microcontrolador para guardar el mayor espacio posible de memoria RAM. El compilador las reconoce por el nombre y el prefijo const. En mikroC, el compilador reconoce automáticamente el tipo de dato de una constante, así que no es necesario especificar el tipo adi- cionalmente. /* dos líneas de programa consecutivas */ const A = 1000 // el valor de laconstante A está definido A = 15; // ¡ERROR! no se puede modificar el valor de la constante Cada variable o constante debe tener un identificador que lo distingue de otras variables y cons- tantes. Refiérase a los ejemplos anteriores, a y a son identificadores. reglas para nombrar En mikroC los identificadores pueden ser tan largos como quiera. Sin embargo, hay varias res- tricciones a saber: * Los identificadores pueden incluir cualquiera de los caracteres alfabéticos A-Z (a-z), los dígitos 0-9 y el carácter subrayado ‘_’. El compilador es sensible a la diferencia entre minúsculas y mayús- culas. Los nombres de funciones y variables se escriben con frecuencia con minúsculas, mientras que los nombres de constantes se escriben con mayúsculas. * Los identificadores no pueden empezar con un dígito. * Los identificadores no pueden coincidir con las palabras clave del lenguaje mikroC, porque son las palabras reservadas del compilador. El compilador mikroC reconoce 33 palabras clave que se muestran en la tabla 3. Ejemplos de los identificadores válidos e inválidos los puede ver a continuación: 36 Club Saber Electrónica Nº 97 Tabla 3 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 36 SiStEmaS dE ProgramaCióN: LENguajE mikroC temperatura_V1 // OK Presión // OK no_corresponder // OK dat2string // OK SuM3 // OK _vtexto // OK 7temp // NO -- no puede empezar con un número %más_alto // NO -- no pueden contener caracteres especiales if // NO -- no puede coincidir con una palabra reservada j23.07.04 // NO -- no puede contener caracteres especiales (punto) nombre de variable // NO -- no puede contener espacio en blanco declaración de Variables Cada variable debe ser declarada antes de ser utilizada en el programa. Como las variables se almacenan en la memoria RAM, es necesario reservar el espacio para ellas (uno, dos o más bytes). Al escribir un programa, usted sabe qué tipo de datos quiere utilizar y qué tipo de datos espera como resultado de una operación, mientras que el compilador no lo sabe. No se olvide de que el progra- ma maneja las variables con los nombres asignados. El compilador las reconoce como números en la memoria RAM sin conocer su tamaño y formato. Para mejorar la legibilidad de código, las varia- bles se declaran con frecuencia al principio de las funciones: <tipo> variable; Es posible declarar más de una variable de una vez si tienen el mismo tipo: <tipo> variable1, variable2, variable3; Aparte del nombre y del tipo, a las variables se les asignan con frecuencia los valores iniciales justamente enseguida de su declaración. Esto no es un paso obligatorio, sino ‘una cuestión de bue- nas costumbres’. Se parece a lo siguiente: unsigned int peso; // Declarar una variable llamada peso peso = 20; // Asignar el valor 20 a la variable peso Un método más rápido se le denomina declaración con inicialización (asignación de los valores iniciales): unsigned int peso = 20; // peso está declarado y su valor es 20 Si hay varias variables con el mismo valor inicial asignado, el proceso se puede simplificar: unsigned int peso1 = peso2 = peso3 = 20; int valor_inicial = un_mínimo_de_petróleo = 0; Tenga cuidado de no declarar la misma variable otra vez dentro de la misma función. Puede modificar el contenido de una variable al asignarle un nuevo valor tantas veces que quiera. Al declarar una variable, siempre piense en los valores que la variable tendrá que contener durante la ejecución de programa. Capítulo 2 37 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 37 El Mundo de los Microcontroladores En el ejemplo anterior, peso1 no se puede representar con un número con punto decimal o un número con valor negativo. declaración de constantes Similar a las variables, las constantes deben ser declaradas antes de ser utilizadas en el pro- grama. En mikroC, no es obligatorio especificar el tipo de constante al declararla. Por otra parte, las constantes deben ser inicializadas a la vez que se declaran. El compilador reconoce las constantes por su prefijo const utilizado en la declaración. Dos siguientes declaraciones son equivalentes: const int MINIMUM = -100; // Declarar constante MINIMUM const MINIMUM = -100; // Declarar constante MINIMUM Las constantes pueden ser de cualquier tipo, incluyendo cadenas: const T_MAX = 3.260E1; // constante de punto flotante T_MAX const I_CLASS = ‘A’; // constante carácter I_CLASS const Mensaje = “Presione el botón IZQUIERDA”; // constante de cadena Mensaje Las constantes de enumeración son un tipo especial de constantes enteras que hace un pro- grama más comprensible al asignar los números ordinales a las constantes. Por defecto, el valor 0 se asigna automáticamente a la primera constante entre llaves, el valor 1 a la segunda, el valor 2 a la tercera etc. enum surtidores {AGUA,GASÓLEO,CLORO}; // AGUA = 0; GASÓLEO = 1; CLORO = 2 Es posible introducir directamente el valor de una constante dentro de la lista de enumeraciones. El incremento se detiene al asignar un valor a un elemento de matriz, después se reinicia a partir del valor asignado. Vea el siguiente ejemplo: enum surtidores {AGUA,GASÓLEO=0,CLORO}; // AGUA = 0; GÁSOLEO = 0; CLORO = 1 Las constantes de enumeración se utilizan de la siguiente manera: int Velocidad_de_ascensor enum motor_de_ascensor {PARADA,INICIO,NORMAL,MÁXIMO}; Velocidad_de_ascensor = NORMAL; // Velocidad_de_ascensor = 2 definir los nuevos tipos de datos La palabra clave typedef le permite crear con facilidad los nuevos tipos de datos, así, por ejem- plo, podemos escribir la siguiente sentencia: typedef unsigned int positivo; // positivo es un sinónimo para el tipo sin signo int positivo a,b; // Variables a y b son de tipo positivo a = 10; // Variable a equivale a 10 b = 5; // Variable b equivale a 5 38 Club Saber Electrónica Nº 97 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 38 SiStEmaS dE ProgramaCióN: LENguajE mikroC Ámbito de VariabLes y constantes Una variable o una constante es reconocida por el compilador en base de su identificador. Un identificador tiene significado si el compilador lo puede reconocer. El ámbito de una variable o una constante es el rango de programa en el que su identificador tiene significado. El ámbito es deter- minado por el lugar en el que se declara una variable o una constante. Intentar acceder a una varia- ble o una constante fuera de su ámbito resulta en un error. Una variable o una constante es invisi- ble fuera de su ámbito. Todas las variables y constantes que pensamos utilizar en un programa deben ser declaradas anteriormente en el código. Las variables y constantes pueden ser globales o locales. Una variable global se declara en el código fuente, fuera de todas las funciones, mientras que una variable local se declara dentro del cuerpo de la función o dentro de un bloque anidado en una función. Vea la figura 9. A las variables globales se les puede acceder de cualquier parte en el código, aún dentro de las funciones con tal de que sean declaradas. El ámbito de una variable global está limitado por el fin del archivo fuente en el que ha sido declarado. El ámbito de variables locales está limitado por el bloque encerrado entre llaves {} en el que han sido declaradas. Por ejemplo, si están declaradas en el principio del cuerpo de función (igual que en la función main) su ámbito está entre el punto de declaración y el fin de esa función. Refiérase al ejemplo anterior. A las variables locales declaradas en main() no se les puede acceder desde la Función_1 y al revés. Un bloque compuesto es un grupo de declaraciones y sentencias (que pueden ser bloques tam- bién) encerradas entre llaves. Un bloque puede ser una función, una estructura de control etc. Una variabledeclarada dentro de un bloque se considera local, o sea, ‘existe’ sólo dentro del bloque. Sin embargo, las variables declaradas fuera del ámbito todavía son visibles. Aunque las constantes no pueden ser modificadas en el programa, siguen las mismas reglas que las variables. Esto significa que son visibles dentro de su bloque a excepción de las constantes globales (declaradas fuera de cualquier función). Las constantes se declaran normalmente en el inicio del código fuera de cualquier función (como variables globales). Capítulo 2 39 Figura 9 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 39 El Mundo de los Microcontroladores cLases de aLmacenamiento Las clases de almacenamiento se utilizan para definir el ámbito y la vida de variables, constan- tes y funciones dentro de un programa. En mikroC se pueden utilizar diferentes clases de almace- namiento: auto es una clase de almacenamiento por defecto para las variables locales, así que se utiliza raramente. Se utiliza para definir que una variable local tiene duración local. La clase de almacenamiento auto no se puede utilizar con variables globales, figura 10. static es una clase de almacenamiento por defecto para las variables globales. Especifica que una variable es visible dentro del archivo. A las variables locales declaradas con el prefijo static se les puede acceder dentro del archivo fuente (o sea se comportan como variables globales). extern: la palabra clave extern se utiliza cuando el programa está compuesto por diferentes archivos fuente. Esto le permite utilizar una variable, una constante o una función declarada en otro archivo. Por supuesto, para compilar y enlazar este archivo correctamente, el mismo debe ser inclui- do en su proyecto. Vea un ejemplo de un programa que consiste en dos archivos: File_1 y File_2. File_1 utiliza una variable y una función declaradas se usa en File_2. File 1: extern int cnt; // Variable cnt es visible en File_1 extern void hello(); // Función hello()se puede utilizar en File_1 void main(){ PORTA = cnt++; // Cualquier modificación de cnt en File_1 será visible en File_2 hello(); // Función hello()se puede llamar desde aquí } File 2: int cnt = 0; void hello(); void hello(){ // Modificaciones que afectan a la . // cnt en File_1 son visibles aquí . } oPeradores Un operador es un símbolo que denota una operación aritmética, lógica u otra operación parti- cular. Dicho de manera sencilla, varias operaciones aritméticas y lógicas se realizan por medio de 40 Club Saber Electrónica Nº 97 Figura 10 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 40 SiStEmaS dE ProgramaCióN: LENguajE mikroC los operadores. Hay más de 40 operaciones disponibles en el lenguaje C, pero se utiliza un máxi- mo de 10 a 15 de ellas en la práctica. Cada operación se realiza sobre uno o más operandos que pueden ser variables o constantes. Además, cada operación se caracteriza por la prioridad de eje- cución y por la asociatividad. operadores aritméticos Los operadores aritméticos se utilizan en las operaciones aritméticas y siempre devuelven resul- tados numéricos. Hay dos tipos de operadores, los unitarios y los binarios. A diferencia de las ope- raciones unitarias que se realizan sobre un operando, las operaciones binarias se realizan sobre dos operandos. En otras palabras, se requieren dos números para ejecutar una operación binaria. Por ejemplo: a+b o a/b. Vea en la tabla 4 cuáles son los operadores aritméticos: int a,b,c; // Declarar 3 enteros a, b, c a = 5; // Inicializar a b = 4; // Inicializar b c = a + b; // c = 9 c = c%2; // c = 1. Esta operación se utiliza con frecuencia // para comprobar la paridad. En este caso, el // resultado es 1 lo que significa que la variable // es un número imparo operadores de asignación Hay dos tipos de asignación en el lenguaje C: * Los operadores simples asignan los valores a las variables utilizando el carácter común ‘=’. Por ejemplo: a =8 * Las asignaciones compuestas son específicas para el lenguaje C. Consisten en dos caracte- res como se muestra en la tabla 5. int a = 5; // Declarar e inicializar la variable a a += 10; // a = a + 10 = 15 Capítulo 2 41 Tabla 4 Tabla 5 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 41 El Mundo de los Microcontroladores Se utilizan para simplificar la sintaxis y habilitar la ejecución más rápida. Debajo de la tabla se puede observar un ejemplo de uso en lenguaje C. operadores de incremento y decremento Las operaciones de incremento y decremento por 1 se denotan con “++” y “—”. Estos caracte- res pueden preceder o seguir a una variable. En primer caso (++x), la variable x será incrementada por 1 antes de ser utilizada en la expre- sión. De lo contrario, la variable se utilizará en la expresión antes de ser aumentada por 1. Lo mismo se aplica a la operación de decremento, tabla 6. int a, b, c; a = b = 5; c = 1 + a++; // c = 6 b = ++c + a // b = 7 + 6 = 13 operadores relacionales Los operadores relacionales se utilizan en comparaciones con el propósito de comparar dos valores, tabla 7. int prop; int var = 5; prop = var < 10; // Expresión es evaluada como verdadera, prop = 1 En mikroC, si una expresión es evaluada como falsa (false), el operador devuelve 0, mientras que si una oración es evaluada como verdadera (true), devuelve 1. Esto se utiliza en expresiones tales como ‘si la expresión es evaluada como verdadera, entonces...’ operadores Lógicos Hay tres tipos de operaciones lógicas en el lenguaje C: y (and) lógico, o (or) lógico y nega- ción - no (not) lógico. Los operadores lógicos devuelven verdadero (1 lógico) si la expresión eva- luada es distinta de cero. En caso contrario, devuelve falso (0 lógico) si la expresión evaluada equi- vale a cero. Esto es muy importante porque las operaciones lógicas se realizan generalmente sobre 42 Club Saber Electrónica Nº 97 Tabla 6 Tabla 7 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 42 SiStEmaS dE ProgramaCióN: LENguajE mikroC las expresiones, y no sobre las variables (números) particulares en el programa. Por lo tanto, las operaciones lógicas se refieren a la veracidad de toda la expresión. Por ejemplo: 1 && 0 es igual a (expresión verdadera) && (expresión falsa) El resultado 0, o sea - Falso en ambos casos. En la tabla 8 tiene la correspondencia de estos operadores lógicos. operadores de manejo de bits A diferencia de las operaciones lógicas que se realizan sobre los valores o expresiones, las ope- raciones de manejo de bits se realizan sobre los bits de un operando. Se enumeran en la tabla 9. ¿cómo utilizar los operadores? Aparte de los operadores de asignación, dos operadores no deben estar escritos uno junto al otro, por ejemplo: x*%12; // esta expresión generará un error Cada operador tiene su prioridad y asociatividad como se muestra en la tabla 10. Similar a las expresiones aritméticas, los operadores se agrupan juntos por medio de paréntesis como se puede observar a continuación: int a, b, res; a = 10; b = 100; res = a*(a + b); // resultado = 1100 res = a*a + b; // resultado = 200 Primero se calculan las expresiones encerradas entre paréntesis. Si es necesario, se pueden uti- lizar los paréntesis múltiples (anidados). Capítulo 2 43 Tabla 8 Tabla 9 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 43 El Mundo de los Microcontroladores conVersión de tiPos de datos Algunas operaciones implican conversión de datos. Por ejemplo, si divide dos valores enteros, hay una alta posibilidad de que el resultado no sea un entero. El mikroC realiza una conversión automática cuando se requiera. Si dos operandos de tipo dife- rente se utilizan en una operación aritmética, el tipo de operando de la prioridad más baja se con- vierte automáticamente en el tipo de operando de la prioridad más alta. Los tipos de datos princi- pales se colocan según el orden jerárquico mostradoen la figura 11. La autoconversión se realiza asimismo en las operaciones de asignación. El resultado de la expresión de la derecha del operador de la asignación siempre se convierte en el tipo de la varia- ble de la izquierda del operador. Si el resultado es de tipo de la prioridad más alta, se descarta o se redondea para coincidir con el tipo de la variable. Al convertir un dato real en un entero, siempre se descartan los números que siguen al punto decimal: int x; // A la variable x se le asigna el tipo integer (un entero) x = 3; // A la variable x se le asigna el valor 3 x+ = 3.14; // El valor 3.14 se agrega a la variable x al // realizar la operación de asignación /* El resultado de la adición es 6 en vez de 6.14, como era de esperar. Para obtener el resultado esperado sin descartar los números que siguen al punto decimal, se debe declarar x como un punto flotante. */ 44 Club Saber Electrónica Nº 97 Tabla 10 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 44 SiStEmaS dE ProgramaCióN: LENguajE mikroC Para realizar una conversión explícita, antes de escribir una expresión o una variable hay que especificar el tipo de resultado de operación entre paréntesis: double distancia, tiempo, velocidad; distancia = 0.89; tiempo = 0.1; velocidad = (int)(a/b); // c = (int)8.9 = 8.0 velocidad = ((int)a)/b; // c = 0/0.1 = 0.0 estructuras de controL estructuras condicionales Las condiciones son ingredientes comunes de un programa. Las condiciones permiten ejecutar una o varias sentencias dependiendo de validez de una expresión. En otras palabras, ‘Si se cum- ple la condición (...), se debe hacer (...). De lo contrario, si la condición no se cumple, se debe hacer (...)’. Los operandos condicionales if-else y switch se utilizan en las operaciones condicionales. Una sentencia condicional puede ser seguida por una sola sentencia o por un bloque de sentencias a ser ejecutadas. operador condicional if-else El operador if se puede utilizar solo o asociado al operador else (if-else). Ejemplo del operador if: if(expresión) operación; Si el resultado de la expresión encerrada entre paréntesis es verdadero (distinto de 0) la opera- ción se realiza y el programa continúa con la ejecución. Si el resultado de la expresión es falso (0), la operación no se realiza y el programa continúa inmediatamente con la ejecución. Como hemos mencionado, la otra forma combina tanto el operador if como el else: if(expresión) operación1 else operación2; Si el resultado de la expresión es verdadero (distinto de 0), se realiza operación1, de lo contra- rio se realiza la operación2. Después de realizar una de las operaciones, el programa continúa con la ejecución. La sentencia if-else se parece a lo siguiente: if(expresión) operación1 else operación2 Si operación1 u operación2 está compuesta, escriba una lista de sentencias encerradas entre llaves. Por ejemplo: Capítulo 2 45 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 45 El Mundo de los Microcontroladores if(expresión) { ... // ... // operación1 ...} // else operación2 El operador if-else se puede sustituir por el operador condicional ‘?:’: (expresión1)? expresión2 : expresión3 Si el valor de la expresión1 es distinto de 0 (verdadero), el resultado de la expresión entera será equivalente al resultado obtenido de la expresión2. De lo contrario, si la expresión1 es 0 (falso), el resultado de la expresión entera será equivalente al resultado obtenido de la expresión3. Por ejem- plo: maximum = (a>b)? a : b // A la variable maximum se le asigna el // valor de la variable mayor(a o b) operador switch A diferencia de la sentencia if-else que selecciona entre dos opciones en el programa, el ope- rador switch permite elegir entre varias opciones. La sintaxis de la sentencia switch es: switch (selector) // Selector es de tipo char o int { case constante1: operación1 // El grupo de operadores que se ejecutan si ... // el selector y la constante1 son equivalentes break; case constante2: operación2 // El grupo de operadores se ejecuta si ... // el selector y la constante2 son equivalentes break; ... default: operación_esperada // El grupo de operadores que se ejecuta si ... // ninguna constante equivale al selector break; } La operación switch se ejecuta de la siguiente manera: primero se ejecuta el selector y se com- para con la constante1. Si coinciden, las sentencias que pertenecen a ese bloque se ejecutan hasta llegar a la palabra clave break o hasta el final de la operación switch. Si no coinciden, el selector se 46 Club Saber Electrónica Nº 97 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 46 SiStEmaS dE ProgramaCióN: LENguajE mikroC compara con la constante2. Si coinciden, las sentencias que pertenecen a ese bloque se ejecutan hasta llegar a la palabra clave break etc. Si el selector no coincide con ninguna constante, se eje- cutarán las operaciones que siguen al operador default. También es posible comparar una expresión con un grupo de constantes. Si coincide con algu- na de ellas, se ejecutarán las operaciones apropiadas: switch (días) // La variable días representa un día de la semana. { // Es necesario determinar si es un día laborable o no lo es case1:case2:case3:case4:case5: LCD_message = ‘Día laborable’; break; case6:case7: LCD_message = ‘Fin de semana’; break; default:LCD_message_1 = ‘Elija un día de la semana’; break; } La palabra clave de C ‘break’ se puede utilizar en cualquier tipo de bloques. Al utilizar ‘break’, es posible salir de un bloque aunque la condición para su final no se haya cum- plido. Se puede utilizar para terminar un bucle infinito, o para forzar un bucle a terminar antes de lo normal. bucLes A menudo es necesario repetir una cierta operación un par de veces en el programa. Un con- junto de comandos que se repiten es denominado un bucle de programa. Cuántas veces se ejecu- tará, es decir cuánto tiempo el programa se quedará en el bucle, depende de las condiciones de salir del bucle. bucle While El bucle while se parece a lo siguiente: while(expresión){ comandos ... } Los comandos se ejecutan repetidamente (el programa se queda en el bucle) hasta que la expre- sión llegue a ser falsa. Si la expresión es falsa en la entrada del bucle, entonces el bucle no se ejecutará y el programa continuará desde el fin del bucle while. Un tipo especial del bucle de programa es un bucle infinito. Se forma si la condición sigue sin cambios dentro del bucle. La ejecución es simple en este caso ya que el resultado entre llaves es siempre verdadero (1=verdadero), lo que significa que el programa se queda en el mismo bucle: while(1){ // En vez de “while(1)”, se puede escribir “while(true)” ... // Expresiones encerradas entre llaves se ejecutarán ... // repetidamente (bucle infinito) } Capítulo 2 47 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 47 El Mundo de los Microcontroladores bucle For El bucle for se parece a lo siguiente: for(expresión_inicial; expresión_de_condición; cambiar_expresión) { operaciones ... } La ejecución de esta secuencia de programa es similar al bucle while, salvo que en este caso el proceso de especificar el valor inicial (inicialización) se realice en la declaración. La expresión_ ini- cial especifica la variable inicial del bucle, que más tarde se compara con la expresión_ de_condi- ción antes de entrar al bucle. Las operaciones dentro del bucle se ejecutan repetidamente y des- pués de cada iteración el valor de la expresión_inicial se incrementa de acuerdo con la regla cam- biar_expresión. La iteración continúa hasta que la expresión_de_condición llegue a ser falsa. for(k=0; k<5; k++) // La variable k se incrementa 5 veces (de 1 a 4) y operación // cada vez se repite la expresión operación ... La operación se ejecutará cinco veces. Luego, al comprobar se valida que la expresión k<5 sea falsa (después de 5 iteracionesk=5) y el programa saldrá del bucle for. bucle do-while El bucle do-while se parece a lo siguiente: do operación while (cambiar_condición); La expresión cambiar_condición se ejecuta al final del bucle, que significa que operación se eje- cuta como mínimo una vez sin reparar en que si la condición es verdadera o falsa. Si el resultado es distinto de 0 (verdadero), el procedimiento se repite. Todos los siguientes ejemplos son equivalentes. Esta parte del código visualiza “hello” en un LCD 10 veces con un retardo de un segundo. Note que en este ejemplo se utilizan funciones pre- definidas, que se encuentran en las librerías del compilador mikroC PRO for PIC. No obstante le aconsejamos que no trate de entenderlas en detalle. Su comportamiento general dentro del bucle se explica por medio de los comentarios. i = 0; // Inicialización del contador while (i<10) { // Condición Lcd_Out(1,3,”hello”); // Visualizar “hello” en el LCD Delay_ms(1000); // Retardo de 1000 ms Lcd_Cmd(_LCD_CLEAR); // Borrar el LCD Delay_ms(500); // Retardo de 500ms i++; // Contador se incrementa } 48 Club Saber Electrónica Nº 97 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 48 SiStEmaS dE ProgramaCióN: LENguajE mikroC for(i=0; i<10; i++) { // Inicialización, condición, incremento Lcd_Out(1,3,”hello”); // Visualizar “hello” en el LCD Delay_ms(1000); // Retardo de 1000 ms Lcd_Cmd(_LCD_CLEAR); // Borrar el LCD Delay_ms(500); // Retardo de 500ms } i = 0; // Inicialización del contador do { Lcd_Out(1,3,”hello”); // Visualizar “hello” en el LCD Delay_ms(1000); // Retardo de 1000 ms Lcd_Cmd(_LCD_CLEAR); // Borrar LCD Delay_ms(500); // Retardo de 500ms i++; // Contador se incrementa } while (i<10); // Condición sentencias de saLto sentencia break A veces es necesario detener y salir de un bucle dentro de su cuerpo. La sentencia break se puede utilizar dentro de cualquier bucle (while, for, do while) y en las sentencias switch también. En éstas la sentencia break se utiliza para salir de las sentencias switch si la condición case es verda- dera. En este ejemplo, “Esperar” está parpadeando en la pantalla LCD hasta que el programa detec- te un uno lógico en el pin 0 del puerto PORTA. while(1){ // Bucle infinito if(PORTA.F0 == 1) // Probar si el estado lógico del pin 0 del puerto break; // PORTA es 1; si equivale, salir del bucle Lcd_Out(1,3,”Esperar”); // Visualizar “Esperar” en el LCD Delay_ms(1000); // Retardo de 1000 ms Lcd_Cmd(_LCD_CLEAR); // Borrar LCD Delay_ms(500); // Retardo de 500ms } sentencia continue La sentencia continue colocada dentro de un bucle se utiliza para saltar una iteración. A dife- rencia de la sentencia break, el programa se queda dentro del bucle y las iteraciones continúan. // Si x=7, puede ocurrir una división por 0. // continue se utiliza aquí para evitar esta situación. x=1; while (x<=10) { if (x == 7) { // saltar x=7 para evitar división por 0 Lcd_Cmd(_LCD_CLEAR); Lcd_Out(1,3,”Division by 0”); Capítulo 2 49 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 49 El Mundo de los Microcontroladores Delay_ms(1000); x++; continue; // Después de esta línea, saltar a la sentencia while con x=8 } a = 1/(x-7); // Esta división generará un error si x=7 /* Muchas operaciones pueden ocurrir aquí */ Lcd_Out(1,3,”Division is OK”); // Poner este mensaje en el LCD Delay_ms(1000); x++; } sentencia goto La sentencia goto le permite hacer un salto absoluto al otro punto en el programa. Esta caracte- rística se debe utilizar con precaución ya que su ejecución puede causar un salto incondicional sin hacer caso a todos los tipos de limitaciones de anidación. El punto destino es identificado por una etiqueta, utilizada como un argumento para la sentencia goto. Una etiqueta consiste en un identifi- cador válido seguido por un colon (:). ... if(CO2_sensor) goto aire acondicionado; // Si se consta que el valor ... // de la variable CO2_sensor =1 // hacer salto a la línea de programa // Aire acondicionado ... Aire acondicionado: // Desde aquí sigue la parte del código que se ejecutará // en caso de una concentración de CO2 demasiado alta ... // en el ambiente tiPos de datos aVanzados matrices Una matriz es una lista de elementos del mismo tipo colocados en localidades de memoria con- tiguas. Cada elemento es referenciado por un índice. Para declarar una matriz, es necesario espe- cificar el tipo de sus elementos (denominado tipo de matriz), su nombre y el número de sus ele- mentos encerrados entre corchetes. Todos los elementos de una matriz tienen el mismo tipo. tipo_de_matriz nombre_de_matriz [nº_de_elementos]; Los elementos de una matriz se identifican por su posición. En C, el índice va desde 0 (el primer elemento de una matriz) a N-1 (N es el número de elementos contenidos en una matriz). El compi- lador tiene que “saber” cuántas localidades de memoria debe alojar al declarar una matriz. 50 Club Saber Electrónica Nº 97 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 50 SiStEmaS dE ProgramaCióN: LENguajE mikroC El tamaño de una matriz no puede ser una variable. Por eso, se pueden utilizar dos métodos: // método 1 int display [3]; // Declaración de la matriz display capaz de contener 3 enteros // método 2 const DÍGITOS = 5; char Matriz_nueva[DÍGITOS]; // Declaración de la matriz Matriz_nueva // capaz de contener 5 enteros Una matriz se puede inicializar a la vez que se declara, o más tarde en el programa. En ambos casos, este paso se realiza al utilizar llaves: int array_1[3] = {10,1,100}; Para leer o modificar un elemento de matriz del ejemplo anterior, basta con introducir su índice encerrado entre corchetes: /* Se supone que a ha sido declarado anteriormente como un entero */ a = array_1[0]; // A la variable a se le asigna el valor del miembro de matriz // con índice 0 (a = 10) array_1[2] = 20; // Miembro de matriz array_1[2] es modificado (nuevo valor es 20) El siguiente programa cambia el orden de los elementos de una matriz. Note que el índice se puede expresar mediante variables y operaciones básicas. void main() { const MUESTRAS_DE_AGUA = 4; // Valor de la constante MUESTRAS_DE_AGUA es 4 int i, temp; // Variables i y temp son de tipo int int profunidad_de_sonda [MUESTRAS_DE_AGUA] = {24,25,1,1987}; // Todos // los miembros de la matriz profundidad // de sonda son de tipo int for(i=0;i<(MUESTRAS_DE_AGUA/2);i++){ // Bucle se ejecuta 2 veces temp = profundiad_de_sonda [i]; // temp se utiliza para guardar un valor // temporalmente profundiad_de_sonda [i] = profundiad_de_sonda [MUESTRAS_DE_AGUA-1-i]; profundiad_de_sonda [MUESTRAS_DE_AGUA-1-i] = temp; } // Aquí tenemos: profundidad_de_sonda [MUESTRAS_DE_AGUA] = {1987,1,25,24} } matrices bidimensionales Aparte de las matrices unidimensionales que se pueden interpretar como una lista de valores, el lenguaje C le permite declarar matrices multidimensionales. Capítulo 2 51 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 51 El Mundo de los Microcontroladores En esta parte vamos a describir sólo las matrices bidimensionales, también denominadas tablas o matrices. Una matriz bidimensional se declara al especificar el tipo de dato de matriz, el nombre de matriz y el tamaño de cada dimensión. tipo_de_matriz nombre_de_matriz [número_de_filas] [número_de_columnas]; En la declaración de esta matriz número_de_filas y número_de_columnas representan el núme- ro de filas y columnas en las que consiste una tabla, respectivamente. Vea la siguiente matriz bidi- mensional: int Tabla [3][4]; // Tabla se define de modo que tenga 3 filas y 4 columnas Esta matriz se puede representar en la forma de una tabla: ______________________________________________tabla[0][0] tabla[0][1] tabla[0][2] tabla[0][3] tabla[1][0] tabla[1][1] tabla[1][2] tabla[1][3] tabla[2][0] tabla[2][1] tabla[2][2] tabla[2][3] –––––––––––––––––––––––––––––––––––––––––––––– Similar a las matrices unidimesionales, es posible asignar los valores a los elementos de una tabla en la línea de declaración. La asignación debe ser realizada línea a línea como en el siguien- te ejemplo. Como hemos visto anteriormente, esta matriz tiene dos filas y tres columnas: int Tabla [2][3]= { {3,42,1},{7,7,19} }; La matriz anterior se puede representar también en la forma de una tabla de valores: ___________________________ 3 42 1 7 7 19 ––––––––––––––––––––––––––– Punteros Un puntero es una variable destinada a recibir una dirección. Un puntero “apunta” a una locali- dad de memoria, referenciada por una dirección. En C, la dirección de un objeto se puede obtener por medio un operador unitario &. Para acceder al contenido de la memoria en una dirección espe- cífica (también llamado objeto apuntado), se utiliza un operador de indirección (*). ‘&n’ es la dirección de la localidad de memoria ‘n’. ‘*(&n)’ es el contenido de la dirección ‘(&n)’, o sea de ‘n’. Para declarar un puntero, se debe que especificar el tipo de la variable apuntada: tipo_de_variable *puntero; 52 Club Saber Electrónica Nº 97 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 52 SiStEmaS dE ProgramaCióN: LENguajE mikroC En esta etapa, el puntero mi_puntero apunta al valor almacenado en esta localidad de memoria, o sea, a un valor desconocido. Así que, una inicialización es muy recomendable: puntero = &variable; Ahora, puntero contiene la dirección de variable. Para acceder al contenido de la variable apuntada, debe utilizar ‘*’. El siguiente ejemplo muestra el contenido de memoria dependiendo de la acción realizada por medio del puntero. Los punteros son muy útiles para manejar las matrices. En este caso, un puntero se utilizará para apuntar al primer elemento de una matriz. Debido al hecho de que es posible realizar operaciones básicas sobre los punteros (aritmética de punteros), es fácil manejar los elementos de una matriz. Fíjese en la diferencia entre ‘*v+1’ y ‘*(v+1)’ en el siguiente ejemplo: short int voltio[3] = {0,5,10}; short int *v; v = &(voltio[0]); // v contiene la dirección de voltio[0] *(v+1) = 2; // voltio[1] = 2 voltio[2] = *v+1; // tab[2] = 1 (tab[0] + 1) *(v+2) = *(v+1); // voltio[2] = 2 v++; // v contiene la dirección de voltio[1] *v = 1; // voltio[1] = 1 Los punteros también pueden ser declarados con el prefijo ‘const’. En este caso, su valor no puede ser modificado después de la inicialización, similar a una constante. A diferencia de C, el mikroC no admite alojamiento dinámico. estructuras Ya hemos visto cómo agrupar los elementos dentro de matrices. No obstante, al utilizar este método todos los elementos deben ser del mismo tipo. Al utilizar estructuras, es posible agrupar diferentes tipos de variables bajo el mismo nombre. Las variables dentro de una estructura se le denominan los miembros de la estructura. Las estructuras de datos se declaran al utilizar la siguiente sintaxis: Capítulo 2 53 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 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 declaración de la estructura de datos: struct generador { int voltaje; char corriente; }; Entonces, podrá definir los objetos denominados ‘turbina’ en el código. A cada uno de estos tres objetos (turbinas) se le asignan las variables ‘corriente’ y ‘voltaje’. struct generadores turbina_1, turbina_2, turbina_3; Para acceder a las variables, es preciso utilizar el operador ‘.’ turbina_3.voltaje = 150; turbina_3.corriente = 12; Por supuesto, igual que al utilizar los punteros, todavía se le permite realizar operaciones por medio de operadores y sentencias definidos en las partes anteriores. Si está familiarizado con el lenguaje C, recuerde que mikroC no admite la inicialización de los miembros de estructura por medio de las llaves. Por ejemplo, ‘conjunto_1 ={15,‘m’};’ devuelve un error en mikroC. Funciones Una función es una subrutina que contiene una lista de sentencias a realizar. La idea principal es dividir un programa en varias partes utilizando estas funciones para resolver el problema inicial con más facilidad. Además, las funciones nos permiten utilizar las destrezas y el conocimiento de otros programadores. Una función se ejecuta cada vez que se llame dentro de otra función. En C, un programa contiene como mínimo una función, la función main(), aunque el número de funciones es normalmente mayor. Al utilizar funciones el código se hace más corto ya que es posible llamar una función tantas veces como se necesite. En C, el código normalmente consiste en muchas fun- ciones. No obstante, en caso de que su programa sea muy corto y simple, puede escribir todas las sentencias dentro de la función principal. Función Principal La función principal main() es una función particular puesto que es la que se ejecuta al iniciar el programa. Además, el programa termina una vez completada la ejecución de esta función. El com- pilador reconoce automáticamente esta función y no es posible llamarla por otra función. La sinta- xis de esta función es la siguiente: 54 Club Saber Electrónica Nº 97 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 54 SiStEmaS dE ProgramaCióN: LENguajE mikroC void main (void) { /* el primer ‘void’ significa que main no devuelve ningún valor. El segundo ‘void’ significa que no recibe ningún valor. Note que el compilador también admite la siguiente sintaxis: ‘main()’ o ‘void main()’ o ‘main(void)’ */ .. /* —- Introduzca su programa aquí —- */ . }; Esto significa que f es una función que recibe un número real x como parámetro y devuelve 2*x- y. La misma función en C se parece a lo siguiente: float f (float x, float y) // variables flotantes x y y se pueden utilizar en f { float r; // declarar r para almacenar el resultado r = 2*x - y; // almacenar el resultado del cálculo en r return r; // devolver el valor de r } Cada función debe ser declarada apropiadamente para poder interpretarla correctamente duran- te el proceso de compilación. La declaración contiene los siguientes elementos: * Tipo de resultado (valor devuelto): tipo de dato del valor devuelto * Nombre de función: es un identificador que hace posible llamar a una función. * Declaración de parámetros: se parece a la declaración de variable regular (por ejemplo: float x). Cada parámetro consiste en una variable, constante, puntero o matriz, precedidos por la etique- ta de tipo de dato. Se utilizan para pasar la información a la función al llamarla. Los parámetros dife- rentes están delimitados por comas. * Cuerpo de función: bloque de sentencias dentro de llaves. Una función se parece a lo siguiente: tipo_de_resultado nombre_de_función (tipo argumento1, tipo argumento2,...) { Sentencia; Sentencia; ... return ... } Note que una función no necesita parámetros (función main() por ejemplo), pero debe estar entre paréntesis. En caso contrario, el compilador malinterpretaría la función. Para hacerlo más claro, puede sustituir el espacio en blanco encerrado entre paréntesis por la palabra clave void: main (void). Capítulo 2 55 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 55 El Mundo de los Microcontroladores Valor devuelto Una función puede devolver un valor (esto no es obligatorio) por medio de la palabra clave return. Al llegar a return, la función evalúa un valor (puede ser una expresión) y lo devuelve a la línea de programa desde la que fue llamada. return r; // Devolver el valor contenido en r return (2*x - y); // Devolver el valor de la expresión 2*x-y Una función nopuede devolver más de un valor, pero puede devolver un puntero o una estruc- tura. Tenga cuidado al utilizar matrices y punteros. El siguiente ejemplo es un error típico: int *reverse(int *tab) // Esta función debe devolver una matriz r { // cuyo contenido está en orden inverso con // respecto a la matriz tab int r[DIM]; // Declaración de una nueva matriz denominada r int i; for(i=0;i<DIM;i++) // Bucle que copia el contenido de tab en r r[i] = tab[DIM-1-i]; // al invertir el orden return r; // Devolver el valor r } En realidad, el compilador reserva memoria para el almacenamiento de variables de la función reverse sólo durante su ejecución. Una vez completada la ejecución de reverse, la localidad de memoria para la variable i o para la matriz r ya no está reservada. Esto significa que la dirección que contiene los valores de i o r[] está libre para introducir datos nuevos. Concretamente, la función devuelve sólo el valor &r[0], así que sólo el primer elemento de la matriz tab será almacenado en la memoria. Las demás localidades de memoria, tales como &tab[1], &tab[2], etc. serán consideradas por el compilador como espacios en blanco, o sea, estarán listas para recibir los nuevos valores. Para escribir esta función es necesario pasar la matriz r [] como parámetro (vea la subsección Pasar los parámetros). La función puede contener más de una sentencia return. En este caso, al ejecutar la primera sen- tencia return, la función devuelve el valor correspondiente y se detiene la ejecución de la función. float abs (float x, float y) // Devolver el valor absoluto de 2*x-y { if ((2*x - y) >= 0) return (2*x - y); else return (-2*x + y); } Si la función no devuelve ningún valor, la palabra void debe ser utilizada como un tipo de resul- tado en la declaración. En este caso, la sentencia return no debe ser seguida por ninguna expre- sión. Puede ser omitida como en el siguiente ejemplo: void wait_1 (unsigned int a) { 56 Club Saber Electrónica Nº 97 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 56 SiStEmaS dE ProgramaCióN: LENguajE mikroC cnt ++; // Incremento de una variable global cnt Delay_ms(a) ; // Ejecución de la función Delay_ms } // Note que Delay_ms no devuelve nada declarar Prototipos de Funciones Para utilizar una función, el compilador debe ser consciente de su presencia en el programa. En la programación en C, los programadores normalmente primero escriben la función main() y luego las funciones adicionales. Para avisar al compilador de la presencia de las funciones adicionales, se requiere declarar los prototipos de funciones en el principio de programa antes de la función main(). Un prototipo de función está compuesto por: tipo de resultado nombre de función tipos de parámetros un punto y coma (;) El prototipo de la función main no necesita ser declarado. float f (float, float); /* no es obligatorio escribir los nombres de los parámetros. Este prototipo informa al compilador: en el programa se utilizará la función f, que utiliza dos parámetros de tipo float y devuelve el resultado del tipo float. */ Llamar a una Función Mientras una función es definida y su prototipo declarado, se puede utilizar en cualquier parte de programa. Sin embargo, como la función main es ‘raiz’ del programa, no puede ser llamada de nin- guna parte de programa. Para ejecutar una función, es necesario escribir su nombre y los paráme- tros asociados. Vea los siguientes ejemplos: float resultado,a,b; // resultado,a,b,time deben coincidir con los tipos // definidos int time = 100; // en la declaración de las funciones f y wait_1 a = 10.54; b = 5.2; resultado = f(a,b); // Ejecutar la función f por medio de los parámetros a y b // El valor devuelto se le asigna a la variable resultado pausa_1(tiempo); // Ejecutar la función pausa_1 por medio de la variable tiempo funciónX(); // Ejecutar la función funciónX (sin parámetros) Cuando se llama una función, el programa salta a la función llamada, la ejecuta, después vuel- ve a la línea desde la que fue llamada. Pasar los Parámetros Al llamar una función, se le pasan los parámetros. En C existen dos formas diferentes para pasar parámetros a una función. Capítulo 2 57 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 57 El Mundo de los Microcontroladores El primer método, denominado ‘paso por valor’, es el más fácil. En este caso, los parámetros se pueden considerar como variables locales de la función. Cuando se llama una función, el valor de cada parámetro se copia a un nuevo espacio de memoria reservado durante la ejecución de la fun- ción. Como los parámetros se consideran como variables locales por el compilador, sus valores pueden ser modificados dentro de la función, pero sus modificaciones no se quedan en la memoria una vez completada la ejecución de la función. Tenga en cuenta de que la función devuelve un valor, y no una variable. Además, se crean copias de los valores de los parámetros, por lo que sus nombres en la función f pueden ser diferentes de los parámetros utilizados en la main(). La mayor desventaja del ‘paso por el valor’ es que la única interacción que una función tiene con el resto del programa es el valor devuelto de un solo resulta- do (o la modificación de las variables globales). El otro método, denominado ‘paso por dirección’ le permite sobrepasar este problema. En vez de enviar el valor de una variable al llamar a función, se debe enviar la dirección de memoria del valor. Entonces, la función llamada será capaz de modificar el contenido de esta localidad de memoria. // Función ‘sort’ordena los miembros de la matriz por valor ascendente // y devuelve el miembro con máximo valor int sort(int *); // Prototipo de función const SIZE = 5; // Número de miembros a ordenar void main() { int maximum, input[SIZE] = {5,10,3,12,0}; // Declaración de variables en la matriz maximum = sort(input); // Llamar a función y asignarle el máximo // valor a la variable maximum } int sort(int *sequence) { int i, temp, permut; // Declaración de variables permut = 1; // Bandera de bit indica que se ha hecho una permutación while(permut!=0) { // Quedarse en el bucle hasta reiniciar la bandera permut = 0; // Bandera reiniciada for(i=0;i<SIZE-1;i++) { // Comparar y ordenar los miembros de la // matriz (dos a dos) if(sequence [i] > sequence[i+1]){ temp = sequence [i]; sequence[i] = sequence[i+1]; sequence[i+1] = temp; permut = 1; // Se ha hecho una permutación, bandera de bit //se pone a uno } } } return sequence[SIZE-1]; // Devolver el valor del último miembro } // que es al mismo tiempo el miembro con el máximo valor 58 Club Saber Electrónica Nº 97 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 58 SiStEmaS dE ProgramaCióN: LENguajE mikroC En este ejemplo, por medio de una función se realizan dos operaciones: ordena los miembros de la matriz por valor asdendente y devuelve el máximo valor. Para utilizar una matriz en una función es necesario asignar la dirección a la matriz (o a su pri- mer miembro). Vea el siguiente ejemplo: float método_1(int[]); // Declaración de prototipo de la función Método_1 float método_2(int*); // Declaración de prototipo de la función Método_2 const NÚMERO_DE_MEDICIONES = 7; // Número de los miembros de la matriz void main() { double promedio1, promedio2; // Declaración de las variables promedio1 // y promedio2 int voltaje [NÚMERO_DE_MEDICIONES] = {7,8,3,5,6,1,9}; // Declaración de la // matriz voltaje promedio1 = método_1(&voltaje[0]); // Parámetro de la función es la dirección // del primer miembro promedio2 = método_2(voltaje); // Parámetro de la función es la dirección de // la matriz } //×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× float método_1(int voltaje[]) // Inicio de la función método_1 { int i, suma; //Declaración de las variables locales i y suma for(i=0;i<NÚMERO_DE_MEDICIONES;i++) // Cálculo del valor promedio de voltaje suma += voltaje[i]; // Es posible utilizar *(voltaje+i)en vez de voltaje[i] return(suma/NÚMERO_DE_MEDICIONES); } //×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× float método_2 (int *voltaje) //Inicio de la función método_2 { int i, suma; // Declaración de las variables locales i y suma for(i=0;i<NÚMERO_DE_MEDICIONES;i++) // Cálculo del valor promedio de voltaje suma += *(voltaje+i); // Es posible utilizar voltaje[i] en vez de *(voltaje+i) return(suma/NÚMERO_DE_MEDICIONES); } Las funciones ‘método_1’ y ‘método_2’ son completamente equivalentes. Las dos devuelven el valor promedio de la matriz ‘voltaje[]’. Después de declararla, la dirección del primer miembro se puede escribir como ‘voltaje’ o ‘&vol- taje[0]’. Capítulo 2 59 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 59 El Mundo de los Microcontroladores características PrinciPaLes deL Procesador El preprocesador es un programa que procesa el código antes de que pase por el compilador. Funciona bajo el control de las líneas de comando del preprocesador denominadas directivas. Las directivas del preprocesador se colocan en el código fuente, normalmente en el principio del archivo. Antes de pasar por el compilador, el código fuente se examina por el preprocesador que detecta y eje- cuta todas las directivas del preprocesador. Las directivas del preprocesador siguen a una regla de la sintaxis especial, empiezan por un símbolo ‘#’ y no requieren ningún punto y coma al final (;). directivas del Procesador La tabla 11 contiene un conjunto de directivas del preprocesador frecuentemente utilizadas: Las directivas del preprocesador se pueden dividir en tres categorías: * Definiciones de macro * Inclusiones de archivos * Control de compilación Ahora, vamos a presentar sólo las directivas del preprocesador utilizadas con más frecuencia. Sin embargo, no es necesario saber todas ellas para programar microcontroladores. Sólo tenga en cuenta que el preprocesador es una herramienta muy poderosa para los programadores avanzados en C, especialmente para el control de compilación. directivas del Procesador para definir marcos Por medio de los macros es posible definir las constantes y ejecutar funciones básicas. Una sus- titución de macro es un proceso en el que un identificador del programa se sustituye por una cade- na predefinida. El preprocesador sustituye cada ocurrencia del identificador en el código fuente por una cadena. Después de la sustitución, el código será compilado normalmente. Esto significa que el código sustituido debe respetar la sintaxis del mikroC. La acción se realiza por medio de la directiva ‘#define’. #define PI 3.14159 // Sustitución simple, PI será sustituido por // el valor 3.14159 en todas las partes del programa También puede utilizar los parámetros para realizar substituciones más complejas: #define VOLUMEN (D,H) (((D/2)*(D/2)*PI))*H // Macro con parámetros 60 Club Saber Electrónica Nº 97 Tabla 11 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 60 SiStEmaS dE ProgramaCióN: LENguajE mikroC Entonces, en el código, la siguiente sentencia: Tanque_1 = VOLUMEN (Diámetro,altura); Será sustituida por: Tanque_1 = (((Diámetro/2)*(Diámetro/2)*PI)*altura; Por medio de la directiva #undef es posible quitar una definición de nombre de macro. Así se especifica que la substitución que se ha definido anteriormente ya no va ocurrir en el siguiente códi- go. Esto es útil cuando usted quiere restringir la definición sólo a una parte particular del programa. #undef TANQUE // Quitar la definición del macro VOLUMEN inclusión de archivos La directiva de preprocesador #include copia un archivo específico en el código fuente. El códi- go incluido debe observar la sintaxis de C para ser compilado correctamente. Hay dos formas de escribir estas directivas. En el primer ejemplo, sólo el nombre de archivo se especifica, así que el preprocesador lo buscará dentro del archivo include. En el segundo ejemplo, se especifica la ruta entera, así que el archivo estará directamente incluido (este método es más rápido). #include <nombre_de_archivo> // Se especifica sólo el nombre del archivo #include “C:\Ruta\nombre_de_archivo.h” // Se especifica la localidad exacta del archivo Lo dados hasta aquí es una “base” para que pueda aprender a programar en lenguaje. Como ya hemos visto, hay varias divergencias entre los lenguajes mikroC y ANSI C. En el pró- ximo tomo de colección del Club Saber Electrónica vamos a presentar las características específi- cas del mikroC con el propósito de facilitar la programación de los microcontroladores PIC. J Capítulo 2 61 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 61 Cap 2 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:53 Página 62 IntroduccIón En rea li dad, un mi cro pro ce sa dor y un mi cro - con tro la dor no son la mis ma co sa. Los PICs son mi cro con tro la do res, es de cir, una uni dad que po see en su in te rior al mi cro pro ce sa dor y a los ele men tos in dis pen sa bles pa ra que pue da fun - cio nar co mo una mi ni com pu ta do ra en un so lo chip. Un mi cro pro ce sa dor es so la men te la uni dad cen tral de pro ce sos o CPU, la me mo ria, los Capítulo 3 63 Capítulo 3 eL Mundo de Los MicrocontroLadores Los circuitos integrados programables (Programmable Integrated Circuits = PIC) son componentes sumamente útiles en la Electrónica de Consumo. Aun cuando son conocidos desde hace más de veinte años, existen en la actualidad nuevos tipos que cumplen con una serie de requisitos y características sumamente útiles. Como una primera aproximación podemos definir a un PIC como “un chip que permite obtener un circuito integrado a mi medida”, es decir, puedo hacer que el PIC se comporte como un procesador de luminancia, un temporizador o cualquier otro sistema mediante un programa que le grabo en una memoria ROM interna. Los microcontro- ladores PIC son, en el fondo, procesadores similares a otros tipos, como por ejemplo la familia de los microprocesadores X86, 80486, Pentium y muchos otros pero con capacidades limitadas. En este capítulo veremos en qué consiste un PIC y cuáles son los tipos más comunes, lo que nos permitirá abordar el tema de su programación, lo cual se desarrollará en el próximo tomo de la colección Club Saber Electrónica. “Los MicrocontroLadores Pic” Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 63 El Mundo de los Microcontroladores puer tos y to dos los de más pe ri fé ri cos son ex te - rio res. La pro gra ma ción de un mi cro pro ce sa dor es, por lo tan to, una ta rea com ple ja por que de - ben con tro lar se to dos es tos dis po si ti vos ex ter - nos. Un mi cro con tro la dor in te gra la CPU y to dos los pe ri fé ri cos en un mis mo chip. El pro gra ma - dor se de sen tien de de una gran can ti dad de dis - po si ti vos y se con cen tra en el pro gra ma de tra - ba jo. Es ta cir cuns tan cia da lu gar a una gran pér - di da de tiem po por que los da tos tie nen que ser re ti ra dos de la me mo ria y lle va dos a la CPU (Cen tral Pro ces sor Unit) y vi ce ver sa. Es to sig ni - fi ca que la com pu ta do ra de di ca la ma yor par te del tiem po al trans por te de da tos de ida o de vuel ta, en lu gar de usar es te tiem po pa ra tra ba - jar so bre los da tos. Los PICs em plean un con jun to de ins truc cio - nes del ti po RISC (Re du ced Ins truc tion Set Com pu ter). Con el RISC se sue le eje cu tar la ma - yo ría de las ins truc cio nes con un so lo pul so del clock. Con las ins truc cio nes que se usan en otros equi pos del ti po CISC (Com plex Ins truc tion Set Com pu ter), se lo gran ins truc cio nes más po - de ro sas, pe ro a cos ta de va rios ci clos del clock. En el bien co no ci do pro ce sa dor 68HC11 de Mo -to ro la se re quie ren, a ve ces, has ta 5 ci clos del clock pa ra eje cu tar una ins truc ción. A los fi nes prác ti cos, nos va mos a re fe rir a los mi cro con tro la do res co mo blo ques que po seen una me mo ria de pro gra ma, que es el lu gar don - de de ben alo jar se los da tos que le in di quen al chip qué es lo que de be ha cer; una me mo ria de da tos don de in gre sen las se ña les que de be pro - ce sar el pro gra ma, una uni dad arit mé ti ca y ló gi - ca don de se de sa rro llen to das las ta reas, una uni dad de con trol que se en car gue de su per vi sar to dos los pro ce sos y puer tos de en tra da y sa li da pa ra que el PIC ten ga con tac to con el ex te rior (fi gu ra 1). Un mi cro con tro la dor, co mo cual quier cir cui to in te gra do ana ló gi co, tie ne en tra das, sa li das y al - gu nos com po nen tes ex te rio res ne ce sa rios pa ra pro ce sar las se ña les de en tra da y con ver tir las en las se ña les de sa li da (fi gu ra 2). El 16C54 (con memoria tipo OTP) y su similar 16F84 (con memoria EEPROM tipo flash) re quie ren un cris - tal con dos ca pa ci to res y co mo mí ni mo un re sis - tor pa ra el re set. Por su pues to ne ce si ta una ten - sión de fuen te de 5V (VDD) apli ca da con res pec - to al ter mi nal de ma sa (VSS). Po see dos puer tos de sa li da, el A y el B, cu yos ter mi na les son mar - ca dos RA0 al RA4 y RB0 al RB7. Es tos puer tos pue den ser pro gra ma dos co mo de en tra da o de sa li da. El ter mi nal 4 ope ra co mo re set pe ro tam - bién cum ple fun cio nes de car ga de me mo ria de pro gra ma cuan do es ex ci ta do con pul sos de 15V. El ter mi nal RA4 (pa ta 3) tam bién tie ne fun - cio nes co mo en tra da de un tem po ri za dor y RBO (pa ta 6) cum ple tam bién fun cio nes co mo en tra - da de in te rrup ción. Va mos a rea li zar la ex pli ca ción de es te capí- tulo en ba se al mi cro con tro la dor 16F84 por ser uno de los PICs de ma yor re nom bre y por exis - tir abun dan te bi blio gra fía y pro yec tos dis po ni - bles gra tui ta men te en In ter net. Sin em bar go, de - be mos acla rar que exis ten otros chips co mo el 16F628, que son si mi la res a és te, más eco nó mi - cos y de me jo res pres ta cio nes. Opor tu na men te ve re mos cómo “mi grar” de uno a otro sin ma yo - res com pli ca cio nes. 64 Club Saber Electrónica Nº 97 Figura 1 Figura 2 Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 64 LoS MiCroCoNtroLadorES PiC También aclaramos que en el próximo tomo de la colección Club Saber Electrónica analizaremos a un PIC de mejores característi- cas como el PIC 16F887. Aho ra bien, la ma yo ría de los mi cro con tro la - do res (sean de Mi cro chip, o de Na tio nal, Mo to - ro la, Phi lips, etc.) se com por tan de for ma si mi lar, por ello nos va mos a re fe rir a los mi cro con tro la - do res PIC16F84 cu ya ar qui tec tu ra in ter na pue - de ob ser var se en la fi gu ra 3. Ob ser ve pri me ro los blo ques ex ter nos. Exis - te un cris tal que se co nec ta en OSC1 y OSC2 pa ra ge ne rar el CLOCK del sis te ma. Lue go una se ñal de en tra da lla ma da MCLR ne ga da, que es un nom bre de fan ta sía pa ra nues tro co no ci do RE SET (de bi do a que esa pa ta tie ne un do ble uso) y, por úl ti mo, dos puer tos pa ra le los de I/O (en tra da o sa li da) lla ma dos puer to A y puer to B. Una de las pa tas del puer to A pue de ser uti li za - da co mo en tra da de in te rrup cio nes (es ta pa ta es pe cial ha ce que el mi cro pro ce sa dor de je de rea li zar la ta rea que es ta ba eje cu tan do y pa se a rea li zar otra ta rea al ter na ti va; cuan do la ter mi na vuel ve a su pro gra ma ori gi nal). Ana li ce mos el blo que más gran de (tem po ri - za do res), en és te ob ser va mos un gru po de blo - ques de di ca dos a me jo rar el fun cio na mien to pe - ro sin in fluir di rec ta men te en el flu jo de se ña les. Ve mos un tem po ri za dor de en cen di do, un tem - po ri za dor de arran que del os ci la dor de CLOCK, un cir cui to de re set y un cir cui to lla ma do de vi gi - lan cia o WATCH DOG. Los dos pri me ros blo ques pro cu ran un arran que or de na do pa ra no pro du - cir una car ga al mis mo tiem po so bre la fuen te. Por úl ti mo, exis te un cir cui to con un nom bre cu - rio so: “pe rro guar dián”. Su fun ción es es tar vi gi - lan te el má xi mo de tiem po que tar da el mi cro pro - ce sa dor en com ple tar su pro gra ma (o me jor se - ría de cir, la de ri va ción más lar ga de su pro gra - ma) y en ca so de su pe rar se ese tiem po, pro vo - car un re set au to má ti co por que el mi cro pro ce sa - dor se que dó tra ba do en al gu na par te de su pro - gra ma. Tam bién se di ce que el mi cro pro ce sa dor se que dó col ga do o con ge la do. Es te blo que de cir cui tos no tra ba ja in de pen - Capítulo 3 65 Figura 3 Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 65 El Mundo de los Microcontroladores dien te men te si no que re quie re co ne xio nes al ex - te rior y al in te rior del dis po si ti vo. Por ejem plo, no siem pre son uti li za dos y es el pro gra ma quien de ter mi na su uti li za ción y ade más ajus ta sus pa - rá me tros. Es to se rea li za a tra vés del blo que de con trol o de co di fi ca dor de ins truc cio nes. Ana li ce mos aho ra la sec ción de arri ba a la iz - quier da en don de ob ser va mos la me mo ria de pro gra ma, el con ta dor de pro gra ma, el re gis tro de ins truc cio nes y la pi la o STACK de 8 ni ve les. Cuan do ha bla mos de re gis tros nos re fe ri mos a pe que ñas uni da des de me mo ria tran si to ria, cons trui da por lo ge ne ral, con un re gis tro de des pla za mien to. Son me mo rias vo lá ti les que se uti li zan pa ra guar dar in for ma ción por un tiem po mí ni mo, con el fin de rea li zar una ope ra ción com ple ja de va rios pa sos. El con ta dor de pro gra ma es el res pon sa ble de que el mi cro pro ce sa dor va ya ana li zan do las ins truc cio nes en or den as cen den te. Es te guar da el nú me ro de ins truc ción en el STACK y la ins - truc ción mis ma la pa sa al re gis tro de ins truc cio - nes des de don de se en vía al res to del mi cro pro - ce sa dor. El STACK es, en rea li dad, una pi la de re gis tros (en nues tro ejem plo hay 8), de bi do a que el pro gra ma pue de te ner de ri va cio nes (en la jer ga LOOPS, ru los o sub pro gra mas). Cuan do se ter mi na de eje cu tar un loop se de be vol ver al mis mo pun to del pro gra ma en don de se ha bía pro du ci do la bi fur ca ción y eso es po si ble por que ese nú me ro de ins truc ción que dó guar da do en uno de los re gis tros de la pi la. Es co mún que un loop ten ga, a su vez, un loop se cun da rio y cuan - do se eje cu ta ese loop se cun da rio se de be vol - ver al mis mo pun to del loop pri ma rio, eso se con si gue con guar dar ese nú me ro de ins truc ción del loop se cun da rio en otro re gis tro de la pi la. Ana li ce mos aho ra la sec ción in fe rior de re - cha. En ese sec tor se ubi can los blo ques res - pon sa bles de efec tuar ope ra cio nes ma te má ti cas y ló gi cas bi na rias; re cor de mos que el nom bre ALU pro vie ne de Arit me tic Lo gic Uni te (uni dad ari mé ti ca y ló gi ca). En es te sec tor es im pres cin - di ble uti li zar un re gis tro ya que una ope ra ción arit mé ti ca o ló gi ca siem pre se efec túa en tre dos nú me ros. Los nú me ros bi na rios que de ben pro - ce sar se se to man de la me mo ria de da tos, el pri - me ro se acu mu la en el re gis tro de tra ba jo o re - gis tro W (de Work = tra ba jo) el se gun do es el pre sen te en el ins tan te en que se in vo ca la me - mo ria de da tos. Co mo las ope ra cio nes pue den ser en ca de na das (cuan do el re sul ta do sir ve co - mo ope ran do de la si guien te ope ra ción, tal co mo el ca so de un pro duc to) el re gis tro W tie ne un re - tor no a la ALU. Ve mos ade más que la ALU es tá co man da da por el blo que MUX (MUl ti ple Xa dor). En efec to, la ALU re quie re que se le en víen nú - me ros pa ra pro ce sar que le lle guen des de la memo ria de da tos, pe ro an tes se la de be pre dis - po ner pa ra que efec túe la ope ra ción re que ri da (com pa ra ción, ro ta ción de dí gi tos, etc.). El re gis tro de es ta do o es ta tus co la bo ra du - ran te las ope ra cio nes ma te má ti cas. Pien se có - mo ope ra Ud. pa ra rea li zar una res ta: pri me ro ubi ca el pri mer nú me ro, lue go el se gun do y des - pués co mien za a ana li zar los bits me nos sig ni fi - ca ti vos (las uni da des), pe ro si el nú me ro de arri - ba es me nor que el nú me ro de aba jo, en ton ces to ma pres ta do de la co lum na de las de ce nas, lue go de be re cor dar es to por que el nú me ro de arri ba en la co lum na de las de ce nas se re du jo en una uni dad. En rea li dad, aun que se tra te de una ope ra ción en tre dos nú me ros su eje cu ción re quie re guar dar lo que se lla ma aca rreo en otro re gis tro y és te no es otra co sa más que el re gis - tro STA TUS. El PIC16F84 con tie ne ade más de to do lo vis - to, una me mo ria RAM de re gis tros que pue de ser lla ma da des de el re gis tro de ins truc ción a tra vés de un mul ti ple xa dor de di rec cio nes. Es ta sec ción só lo se uti li za en de sa rro llos avan za dos. Aho ra bien, un mi cro con tro la dor sin pro gra ma no sa be ha cer na da, es co mo un ni ño re cién na - ci do; tie ne al gu nos re fle jos con di cio na dos co mo el de suc ción que le per mi te ali men tar se pe ro no sa be ha cer más que eso. No so tros de be re mos en se ñar le a rea li zar ac cio nes y lo va mos a ha cer co mo a un be bé, pa so a pa so. Su ca pa ci dad de apren di za je es enor me y su ma men te va ria da. Le va mos a en se ñar a llo rar a in ter va los re gu la - res, a en cen der lu ces, a su mar, a res tar, etc. En se ñar le sig ni fi ca pro gra mar lo y eso se rea - li za con una pla que ta de pro gra ma ción que de - pen de de ca da mar ca y mo de lo de mi cro con tro - la dor. An ti gua men te los mi cro pro ce sa do res te - nían una ven ta ni ta trans pa ren te y era ne ce sa rio 66 Club Saber Electrónica Nº 97 Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 66 LoS MiCroCoNtroLadorES PiC ex po ner los a la luz ul tra vio le ta pa ra bo rrar su me mo ria e in tro du cir un pro gra ma nue vo. Ac - tual men te cuen tan con me mo rias que no tie nen es te re qui si to. Bas ta con car gar los con un pro - gra ma pa ra que se bo rre el an te rior. Es to sig ni fi - ca que, con el mis mo in te gra do, po dre mos cons - truir di fe ren tes dis po si ti vos que rea li cen fun cio - nes to tal men te dis tin tas unas de otras. La Me Mo rIa de Pro gra Ma La memoria del PIC16F84 es una EE PROM, es de cir, de lec tu ra so la men te (ROM = Read Only Me mory) que se pro gra ma por ten sión (no ne ce si ta luz ul tra vio le ta); es de cir que bas ta con in tro du cir los da tos con cier to ni vel de ten sión pa ra que és tos bo rren el pro gra ma an te rior y gra ben uno nue vo. ¿Por qué es ta me mo ria se lla ma ROM, si se pue den gra bar da tos so bre ella? Se lla ma ROM por que pa ra gra bar la se de be co nec tar el PIC al pro gra ma dor; lue go de que el PIC co lo ca es tos da tos en la pla que ta del dis po si ti vo, só lo pue den ser leí dos, ya que en - ton ces for man el pro gra ma del PIC. Es ta me mo ria (fi gu ra 4) tie ne una lon gi tud de 1 Kby te con pa la bras de 14 bits. Di ga mos que tie ne un an - cho de 14 bits y una al tu ra de 1.000 By tes o que es una me mo ria de 1.000 x 14. Ob ser ve que los nú me ros de ins - truc ción en he xa de ci mal van des de el 000 al 3FF, lo cual im pli ca que exis ten 1.040 po si cio nes de me mo ria, va lor ob te ni do em plean do la fór mu - la: 3 x 162+16 x 161+16 x 160 Ob ser ve que dos de las po si cio nes de me - mo ria tie nen las in di ca cio nes “vec tor de re set” y “vec tor de in te rrup ción”. Eso sig ni fi ca que, cuan do se pro vo ca un re - set, el mi cro pro ce sa dor vuel ve a la po si ción 000 del pro gra ma y cuan do se pro du ce una in te rrup - ción, a la po si ción 004. Es tos re tor nos for za dos de ben ser con si de ra dos al di se ñar el pro gra ma del mi cro pro ce sa dor; es de cir que el re set se pro du ce por que la se ñal ex ter na po ne el con ta - dor de pro gra ma en 000 y to do el pro gra ma se rei ni cia. En cam bio, cuan do in gre sa una se ñal por la pa ta de in te rrup ción el con ta dor de pro gra - ma va a 004 y la ac ción que, en ge ne ral ocu rre, es que se co mien za a leer un sub pro gra ma par - ti cu lar. Cuan do es te sub pro gra ma ter mi na, el con ta dor de pro gra - ma re cu pe ra el nú me ro que te nía en el mo men - to de arri bar la in te rrup - ción. La Me Mo rIa de da tos La RAM (Ran dom Ac - cess Me mory = me mo - ria de ac ce so alea to rio, fi gu ra 5) es una me mo - Capítulo 3 67 Figura 4 Figura 5 Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 67 El Mundo de los Microcontroladores ria de lec tu ra y es cri tu ra de 64. De es tos 64 re - gis tros, los pri me ros 12 son fi jos y cum plen un pro pó si to de ter mi na do, en tan to que des de el 13 has ta el 64 son re gis tros de pro pó si to ge ne ral, en don de el pro gra ma pue de in di car que se al - ma ce ne un da to pa ra ser to ma do más tar de. Además, posee un conjunto de memoria SRAM de 36 posiciones con los que se pueden co- nstruir registros de 8 bits con características EEPROM. En lo personal, prefiero designar a este conjunto de registros como “memoria libre”. Los Puer tos deL PIc El PIC16C84 tie ne dos puer tos pa ra le los de en tra da o sa li da: el puer to “A” de 8 pa tas y el “B” de 5 pa tas. Ca da pa ta pue de ser pre dis pues ta por el pro gra ma pa ra ope rar co mo de en tra da o de sa li da. Ca da pa ta tie ne un re sis tor de pull-up (re sis - tor co nec ta do a fuen te) in ter no que pue de ser des co nec ta do me dian te el pro gra ma. Es tos re - sis to res se des co nec tan au to má ti ca men te si una pa ta se pre dis po ne co mo pa ta de sa li da de - bi do a que las sa li das ya tie nen po si bi li dad de en tre gar co rrien te des de fuen te con un tran sis - tor. To dos los re sis to res de pull-up se co nec tan o des co nec tan al mis mo tiem po (no exis te un co man do que los co nec te in de pen dien te men - te). Co mo puer to de sa li da, una pa ta pue de to - mar 25mA del cir cui to o en tre gar 20mA al mis - mo, sin em bar go, en el puer to “A” só lo se pue - den con su mir 80mA en to tal o en tre gar 50mA, es to sig ni fi ca que só lo al gu nas pa tas pue den tra ba jar al má xi mo por que si to das lo hi cie ran (y son 8) el con su mo to tal se ría de 25 x 8 = 200mA. El puer to “B” tie ne otras ca rac te rís ti cas má xi - mas, ya que en to tal pue de to mar 150mA o en - tre gar 100mA. Co mo ve mos, las sa li das ad mi ten su fi cien te car ga co mo pa ra ali men tar di rec ta - men te a un led (fi gu ra 6). Los puer tos no uti li za - dos siem pre se de ben co nec tar a la fuen te de 5V a tra vés de un re sis tor de 10kΩ de bi do a que se tra ta de un dis po si ti vo CMOS que, de otro mo do, po dría de te rio rar se por cap ta ción elec - tros tá ti ca (fi gu ra 7). La pa ta 3 per te ne cien te al puer to “A” pue de ser con fi gu ra da co mo de en tra da /sa li da o co mo 68 Club Saber Electrónica Nº 97 Figura 6 Figura 7 Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 68 LoS MiCroCoNtroLadorES PiC de arran que de un tem po ri za dor /con ta dor (fi gu - ra 8). Cuan do se pro gra ma co mo en tra da es ta pa ta fun cio na co mo un dis pa ra dor de SCH MITT o Sch mitt trig ger, ideal pa ra re co no cer se ña les dis tor sio na das o con cre ci mien to len to. Es ta mis ma pa ta tam bién tie ne una ca rac te rís ti ca dis - tin ta cuan do ope ra co mo sa li da. Ella es la úni ca que tra ba ja a co lec tor abier to, es de cir, que no pue de em plear se co mo fuen te, en es te ca so siem pre se uti li za rá un re sis tor ex ter no. eL cLock Los PICs po seen un os ci la dor con fi gu ra - ble por progra ma de ca rac te rís ti cas muy am plias. Cuan do no se re quie re mu cha pre ci sión se pue de tra ba jar con un os ci - la dor a RC co nec ta - do se gún la fi gu ra 9. Pa ra cir cui tos que re quie ran una gran pre ci sión se pue de tra ba jar con un cris tal de fre cuen cia ba ja, me dia o al ta (fi gu ra 10). Co mo má xi mo el PIC16F84 pue de tra ba jar con un cris tal de 10MHz. In ter - na men te la fre cuen cia del cris tal se di vi - de por 4, por lo tan to, es muy co mún la uti li za ción de un cris tal de 4MHz pa ra ob - te ner un CLOCK in ter no de 1MHz que ga ran ti za que ca da ins truc ción du re exac ta men te 1mS. Pa ra tem po ri za do res de pe río do lar go se uti li zan cris ta les de ba ja fre cuen cia. eL re set El PIC “se re se tea” cuan do la pa ta 4 (MCLR ne ga da) se po ne a po ten cial ba jo. Pa ra sim pli fi - car el cir cui to de re set, el PIC po see un tem po ri - za dor in ter no que per mi te rea li zar un re set au to - má ti co cuan do se apli ca ten sión de 5V. En es tos ca sos el cir cui to ex ter no de re set só lo im pli ca el uso de un re sis tor de 10kΩ en tre la pa ta 4 y fuen te tal co mo se mues tra en la fi gu ra 11. En mu chos cir cui tos es ne ce sa rio rea li zar un re set ma nual y pa ra ello exis ten dos po si bi li da - des, una es uti li zar só lo el tem po ri za dor in ter no (por pro gra ma) y la otra es agre gar una cons tan - te de tiem po ex te rior co mo se mues tra en la fi - gu ra 12. En el se gun do cir cui to C1 pro vee un re - tar do al en cen di do o pos te rior al pul sa do de re - set por que C1 se car ga rá len ta men te a tra vés de R1 con una cons tan te de tiem po de 22kΩ x 10µF = 220mS. Capítulo 3 69 Figura 8 Figura 9 Figura 10 Figura 11 Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 69 El Mundo de los Microcontroladores El re sis tor R3 li mi ta la co rrien te de des car ga de C1 a va lo res com pa ti bles con sus ca rac te rís - ti cas de co rrien te de pi co má xi ma. D1 des car ga a C1 cuan do la ten sión de fuen - te de cae pa ra per mi tir un re set in me dia to cuan - do la fuen te se apa ga y se en cien de en rá pi da su ce sión. R2 li mi ta la co rrien te de re set, to ma da des de el mi cro pro ce sa dor. Es te se gun do sis te - ma se sue le uti li zar cuan do se re quie re un re se - tea do re mo to a tra vés de va rios me tros de ca ble que po drían cap tar zum bi do (C1 re du ce la im pe - dan cia del cir cui to de re set). PrIMeras concLusIones El PIC es un mi cro con tro la dor, una es pe cie de "or de na dor en mi nia tu ra" (con mu chas co mi - llas) que po dre mos pro gra mar. Hay mu chos ti - pos de mi cro con tro la do res PIC, los hay de 8 pa - tas con 6 ter mi na les pa ra in ter cam bio de da tos (6 ter mi na les de en tra da / sa li da de da tos), pe ro tam bién exis ten dis po si ti vos más po de ro sos de 80 pa tas con 40 pi nes I/O (de en tra da y sa li da de da tos). El PIC16F84 po see en su in te rior un mi cro - pro ce sa dor, una me mo ria RAM (vo lá til) don de guar da re mos las va ria bles, una me mo ria EE - PROM (no vo lá til) don de guar da re mos nues tro pro gra ma, un ti mer o con ta dor que nos fa ci li ta rá al gu nas ta reas, y otros blo ques de con trol y apo - yo. Al gu nas ca rac te rís ti cas más re pre sen ta ti vas del PIC16F84 son: Ope ra a una fre cuen cia má xi ma de 10MHz (ex cep to el PIC 16F84A que pue de ope - rar a 20MHz). 1kby te de me mo ria EE PROM pa ra nues tro pro gra ma (1024 po si cio nes). 68 by tes (de 8 bits) de me mo ria RAM 64 by tes de me mo ria EE PROM pa ra da - tos (no vo lá ti les) Pro gra ma ble con só lo 35 ins truc cio nes Po see 13 pi nes de en tra da /sa li da (un puer to de 8 bits + otro de 5 bits) Tie ne un ti mer /con ta dor de 8 bits Tam bién po see una se rie de re gis tros y tem - po ri za do res, cu yo es tu dio no rea li za re mos en es ta obra. 70 Club Saber Electrónica Nº 97 IntroduccIón Este proyecto comenzó a principios del 2008 cuando inicié la escritura del código fuente para el firmware de un 18F2550 y la elaboración del Software correspondiente a la interfaz de usuario para la PC de un pro- gramador de microcontroladores Pic por puerto USB. Anteriormente ya había esta- do interesado en los procesos de progra- mación de los Pic por lo tanto, basado en esas experiencias y en el estudio de los Data Sheets referentes a las especificacio- nes de programación de los microcontrola- dores, surgió el GPIC USB como una apli- cación totalmente funcional hacia finales de Octubre del 2008. A la fecha ha sufrido algunas modifica- ciones que permite mejorar su funciona- miento y ampliar la cantidad de componen- tes soportados. descrIPcIón deL cIrcuIto eLectrónIco El esquema de la figura 1 corresponde al programador de microcontroladores PIC por puerto USB, su diseño es simple y sen- GPIC USB: ProGramador de mICroControladoreS PIC y memorIaS eeProm Por PUerto USB Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 70 LoS MiCroCoNtroLadorES PiC cillo. Lo podemos dividir en tres bloques fundamentales bien definidos, tal como muestra la figura 2. Bloque 1: Microcontrolador El primero y más importante está consti- tuido por el microcontrolador 18F2550 (IC2), es el encargado de la comunicación por el puerto USB con la PC por intermedio de la interfaz de programación, establece la transferencia de datos con los microcontro- ladores soportados y activa las tensiones de VDD y VPP, figura 3. Los pines 15 y 16 (RC4 - RC5) del puer- to C del PIC conectan con la ficha corres- pondiente para la transmisión y recepción de los datos vía USB. Los pines 2 y 3 (RA0 - RA1) del puerto A se destinan como interfaz de comunicación del proto- colo ICSP entre el progra- mador y los microcontrola- dores soportados por éste, a través del conector ICSP (terminales 1 y 2, figura 1). Los datos por el pin 2 son bidireccionales, sincroniza- dos por una señal de reloj con salida por el pin 3. Capítulo 3 71 Figura 1 Figura 2 Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 71 El Mundo de los Microcontroladores Los pines 23, 24 y 25 (RB2 - RB3 - RB4) del puerto B los utilizamos para el control de la tensión VPP de programación. Según el estado de estas salidas obtenemos dife- rentes 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 tensión VDD. Continuamos con los pines 11, 12 y 13 (RC0 - RC1 - RC2) del puerto C, son utili- zados como salidas para los LEDs de visualización del funcionamiento del pro- gramador. Comenzando con el LED denominado "VDD", este se encenderá con el suministro de esta tensión. Tenemos tres estados posibles, según la configuración establecida desde la interfaz de usuario en la PC: A- Sólo se suministra tensión VDD a los microcontroladores soportados durante los procesos de lectura, grabación, verifica- ción y borrado. B- Suministro de tensión constante, para poder alimentar a los circuitos durante las pruebas (sólo circuitos con bajo consu- mo). C- No se suministra tensión VDD hacia los microcontroladores soportados, una fuente externa debe proveer la alimenta- ción. El LED denominado VPP, se enciende durante el suministro de dicha tensión 72 Club Saber Electrónica Nº 97 Figura 3 Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 72 LoS MiCroCoNtroLadorES PiC durante todos los procesos. Desde la inter- faz de programación en la PC podemos configurar el suministro de esta tensión de dos formas: A- Sólo se suministra tensión VPP a los microcontroladores soportados durante todos los procesos. B- Suministro de tensión MCLR post- procesos, para "arrancar" al microcontrola- dor sin tener que desconectar la ficha ICSP. Por último el LED denominado USB, se enciende cuando se establece la comuni- cación con el puerto USB y es reconocido el programador. Volviendo sobre el PIC 18F2550, éste debe ser grabadoen un principio para su funcionamiento. El programa para este microcontrolador podemos dividirlo en dos partes: un progra- ma residente en un bloque de memoria del PIC, comúnmente 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 secuen- cia de encendido en forma intermitente. En caso contrario, el firmware tomará el control y el LED quedará encendido en forma con- tinua. La gran ventaja de utilizar este sistema se debe a que sólo una vez debemos pro- gramar el microcontrolador 18F2550, en lo sucesivo los cambios y actualizaciones del firmware se podrán 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 señal que, junto con el buzzer BZ1 emite unos "beeps" cada vez que pulsamos los botones de comando para lectura, graba- ción, verificación y borrado desde la interfaz de programación. Es opcional su imple- mentación y puede ser activado o desacti- vado desde la misma interfaz. Bloque 2: conversor dc - dc En un comienzo me planteé qué diseño usar para el conversor de tensión, si imple- mentarlo de forma totalmente independien- te o utilizar el PIC para esta tarea generan- do un PWM por software, más los compo- nentes externos necesarios. Me decidí por la primera opción por varios motivos: el cir- cuito integrado utilizado MC34093, figura 4, es un conversor especializado para esta función, de muy bajo costo, ampliamente difundido, que figura en las listas de com- ponentes de casi todos los comercios de electrónica. Es autónomo, no depende del firmware grabado en el 18F2550, quiero decir con esto que podemos chequear su funcionamiento y la tensión de salida del conversor (en las pruebas) sin necesidad de tener el PIC en la placa del programador ya que no depende de éste. Además nos permite, si fuera necesario, regular la ten- sión de salida con sólo variar el valor de una resistencia: R3 o R4. El valor del choque L1 no es crítico, puede estar comprendido entre 220µH y 680µH sin ningún tipo de inconveniente. El circuito se alimenta con 5 volt suministrados por el puerto USB y a la salida de TP2 obte- nemos una tensión continua de aproximadamente 14V a 14.5V necesarios para alimentar el bloque 3 de la figura 2. Las resistencias R3, R4 junto con R5 forman un divisor resis- tivo conectado al pin 5 del Capítulo 3 73 Figura 4 Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 73 El Mundo de los Microcontroladores MC34093, este lazo de realimentación estabiliza la tensión de salida ya que es comparada con una tensión de referen- cia interna, como podemos observar en la figura 5. En la salida del integrado pin 1, obtenemos una onda variable en ancho de pulso (PWM) en relación al consumo exigido luego de la rectifica- ción, lógicamente dentro de unos lími- tes. Los estados de conmutación On-Off en el pin 1 del MC34093 junto con L1 producen la elevación de la tensión, el diodo D1 y los capacitares C3, C4 se encargan de la rectificación. El capacitor C2 establece la frecuencia del oscilador interno. Bloque 3: tensiones VPP y Vdd Podría haber utilizado un solo transistor para tratar la tensión de programación VPP, pero estaríamos bastante limitados. La idea era tener una salida Vpp única y más flexi- ble, que proporcionara la tensión normal de programación, la opción de una tensión MCLR post programación y por último que ya estuviera pensada para los microcontro- ladores que trabajan con 3.3 volt que serán incorporados en el futuro. Esto lo podía obtener utilizando un amplificador operacio- nal, precisamente el CA3140 con entradas MOSFET y salida bipolar, que trabaja bien con alimentación de simple vía, pero lo más importante en cuanto a la elección es que está preparado para obtener una tensión de salida diferente independientemente a la tensión suministrada sobre el pin 7. Con un diodo Zener sobre el pin 8 (STROBE) se consigue de forma simple y práctica modificar el valor de la tensión de salida por el pin 6. En la figura 7 podemos ver la información que brinda el fabricante del CA3140 para adaptar la salida a niveles compatibles TTL independientemente de la tensión V+ en el pin 7. En el programador he adaptado el circui- to para manejar las tensiones de 3.3 volt para esta gama de PICs que se irán incor- porando en próximas actualizaciones. 74 Club Saber Electrónica Nº 97 Figura 5 Figura 7 Figura 6 Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 74 LoS MiCroCoNtroLadorES PiC Está conformada, como podemos obser- var en la figura 6, por el Zener Z1 conecta- do al pin 8 del CA3140 en serie con el tran- sistor NPN Q2 que trabaja como llave elec- trónica 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 tensión VPP será la normal de 12.30V a 13V; por otro lado, con un nivel alto proporcionado por RB4 del 18F2550 a través de R13 el circui- to se conecta, la tensión VPP en este caso será de 3.3 volt. De esta forma queda totalmente auto- matizado el suministro de VPP de acuerdo a los dispositivos seleccionados desde la interfaz de usuario en la PC. Por el momento no es necesario imple- mentar Z1, Q2 y R13, ya que es la primera versión base del programador y dicha gama de dispositivos aún no están incorporados. En este caso el pin 8 debe quedar sin cone- xión. Como pueden ver, la electrónica del programador ya está pensada para sopor- tar de forma práctica a estos microcontrola- dores a medida que sean agregados. Continuando con esta etapa, las entra- das inversora y no inversora del amplifica- dor 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 próximo a masa (0.3 volt) y Vpp, al finalizar proveerá una tensión adecuada al caso, si se eligió la opción "suministrar MCLR" desde la interfaz de programación. Todas las señales para la activación de las tensiones están sincronizadas desde el firmware del microcontrolador Pic. Las resistencias R9 y R10 conectadas a masa evitan que queden al "aire" las entra- das del operacional en caso que el micro- controlador 18F2550 no esté presente en su zócalo, de lo contrario tendríamos un estado de indeterminación 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 tensión de alimentación para su funcionamiento, pro- porcionada por el conversor Dc-Dc. El pin 4 se conecta a masa. La tensión máxima en la salida del ope- racional pin 6 es aproximadamente 2 volts menor a la tensión de alimentación sobre el pin 7 (en caso que no se encuentre activa- do Q2, Z1). Para finalizar la descripción y resumien- do, el terminal 3 del conector ICSP (figura 1) puede manejar cuatro estados de VPP: Capítulo 3 75 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 = 100µF x 16V, electrolítico C2 = 390pF, cerámico C3, C5 = 0,1µF, cerámico C6 = 10µF x 16V, electrolítico C7, C8 = 15pF, cerámico C9 = 0,47µF, cerámico C10 = 1nF, cerámico C11 = 1µF x 16V, electrolítico L1 = choque de 330µH a 680µH Xtal = cristal de 20MHz Bz1 = (opcional) buzzer sin oscilador interno F1 = Fusible de 250mA, requiere puente o por- tafusible Varios: Placa de circuito impreso, gabinete para mon- taje, conector USB, conector ICSP, cables, estaño, etc. Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 75 El Mundo de los Microcontroladores 1- Una tensión próxima a masa (0.3 volt). 2- Una tensión Vpp de aproximadamen- te 12.30 - 13 volt.3- Una tensión post programación MCLR. 4- Una tensión Vpp baja de 3.3 volt. Por último el transistor Q1 se encarga del manejo de la tensión Vdd, se encuentra conectado con la salida RB5 del microcon- trolador. Un nivel alto en la base de Q1 lo mantiene bloqueado y un nivel bajo lo colo- ca en estado de conducción con salida por colector; el emisor de dicho transistor se conecta a +5 volt suministrados por el puer- to USB. extensión 3.3 Volt Vdd2 Opcionalmente podemos anexar una línea auxiliar de 3.3 volt en el conector ICSP (ya está contemplado en el circuito gene- ral de la figura 1). Con un simple cir- cuito (figu- ra 8) obte- nemos una tensión de salida de 3.3 volts en el emisor de Q3, con las mismas característi- cas de control que VDD. La entrada de tensión se produce por el colector de Q3, conectado a VDD, colector de Q2. En la figura 9 se puede ver la ima- gen de la placa de circuito impreso con su máscara de componentes. Desde la página del autor puede des- cargar tanto la interfaz gráfica para programación (figura 10) como el firmware para el PIC del programa- dor. La versión 2.1 de dicho firmware soporta los siguientes componentes: 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 76 Club Saber Electrónica Nº 97 Figura 8 Figura 9 Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 76 LoS MiCroCoNtroLadorES PiC 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 micro- controlador PIC se requiere de una serie de parámetros básicos a saber: VDD = Voltaje de alimentación de 5V VSS = Referencia de tierra del circuito VPP = Voltaje de programación de 14V PGD = Datos de programación PGC = Pulsos de reloj para la sincroni- zación El primer cargador desarrollado por nuestro equipo y publicado en Saber Electrónica 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 alimenta- ción, muchos de ellos basados en un dise- ño denominado “JDM” y que emplean como interfaz gráfica al programa IC-Prog. El pro- gramador más completo lo hemos denomi- nado Quark Pro 2 y se publicó en Saber Electrónica Nº 200. Aquí una breve descrip- ción. En la figura 11 se muestra el circuito eléctrico del programador QUARK-PRO 2. Como puede observar no existe ninguna fuente de alimentación externa. El circuito se alimenta del puerto serial de la PC a tra- vés del conector DB9. El voltaje de alimen- tación VDD se obtiene de los mismos pul- sos de reloj (pin 7 del DB9), los cuales son Capítulo 3 77 Figura 10 Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 77 El Mundo de los Microcontroladores 78 Club Saber Electrónica Nº 97 Figura 11 Figura 12 Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 78 LoS MiCroCoNtroLadorES PiC rectificados por los diodos D3 y D4 y esta- bilizado a 5 volt mediante el diodo zener D5 (5.1V) y el capacitor C1. De la misma manera, se obtiene el voltaje de programa- ción VPP, cargando el capacitor C2 y esta- bilizando con el diodo zener D6 (8.2V) el cual se suma al voltaje del zener D5 (5,1V), obteniéndose así 13.3 Volt suficientes para realizar la programación del PIC. Se han adicionado el LED L1 para visualizar el pro- ceso de grabación o lectura del PIC, así como el LED L2 para indicar que el circuito se encuentra alimentado, además, si se colocara un PIC en corto, este LED se apa- gará o bajará significativamente su intensi- dad. 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 selecciona- mos el hardware (programador JDM), seleccionamos el software (IC-PROG), basados en el que fuera más compatible. El IC-PROG ofrece varias ventajas: La prime- ra es que dentro de su menú ofrece opcio- nes 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 mayo- ría de los sistemas operativos de la PC, además que con frecuencia están disponi- bles de manera gratuita versiones actuali- zadas (véase www.ic-prog.com). En la figu- ra 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 herra- mientas de trabajo muy completas. J Capítulo 3 79 Figura 13 Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 79 Cap 3 - Microcont.qxd:*Cap 4 - telefonia 05/04/13 14:54 Página 80 3ª de forros.qxd:club 05/03/13 16:31 Página 3ªFo1 4ª de forros.qxd:Club 05/03/13 16:33 Página 4ªFo1