You are on page 1of 270
CompnaporC ees ~~. PAE eg UPL Ay.) MicroconTroLapores PIC TE fiat air iii We lel i i k ‘tied g gy 2 Ly | ial il (res==a] id ig Compitapor C CCS Y SimuLapor PROTEUS PARA Microcontrotapores PIC Eduardo Garcia Breijo &y Alfaomega EX marcombo ediciones léenicas Datos catalogréficos Garcia, Eduardo ‘Compilador C CCS y simulador PROTEUS para Microcontroladores PIC Primera Edicién Alfaomega Grupo Editor, S.A. de C.V., México ISBN: 978-970-15-1397-2 Formato: 17x 23cm Péginas: 276 Compilador C CCS y simulador PROTEUS para Mierocontroladores PIC Eduardo Garcia Breijo ISBN: 978-84-267- 1495-4, edicién original publicada por MARCOMBO, S.A., Barcelona, Espafia Derechos reservados © MARCOMBO, S.A. Primera edicién: Alfaomega Grupo Editor, México, junio de 2008. © 2008 Alfaomega Grupo Editor, S.A. d Pitégoras 1139, Col. Del Valle, 03100, México D.F. Miembro de la Cémara Nacional de la Industria Editorial Mexicana Registro No. 2317 Pag. Web: http:/www.alfaomega.comamx E-mail: libreriapitagoras @alfaomega.com.mx ISBN: 978-970-15-1397-2 Derechos reservados: Esia obra es propiedad intelectual de su autor y los derechos de publicacién en lengua espafiola han sido legalmente transferidos al editor. Prohibia su reproduccién parcial 0 total por cualquier medio sin permiso por escrito del propietario de los derechos del copyright. Nota importante: La informacién contenida en esta obra tiene un fin exclusivamente didéctico y, por lo tanto, no esté previsto su aprovechamiento a nivel profesional o industrial. Las indicaciones técnicas y programas incluidos, han sido elaborados con gran cuidado por el autor y reproduciddos bajo estrictas normas de control. ALFAOMEGA GRUPO EDITOR, S.A. de C.Y. no seri jurfdicamente responsable Or: ertores u omisiones; daiios y perjuicios que se pudieran atrbuir al uso de la informacién comprendida en este libro y en el CD-ROM adjunto, ni por la utlizacién indebida que pudiera darsele Exdicién autorizada para venta en México y todo el continente americano. Impreso en México. Printed in Mexico. Empresas del grupo: México: Alfuomeva Grupo Esitor, S.A. de C.Y. — Pitdgoras 1139, Col. Del Valle, México, DF ~C.P. 03100. Tel: (52-5) 5089-7740 — Fax: (52-55) 5575-2420 / 2490. Sin costo: 0-800-020-4396 E-mail: libreriapitagoras@alfaomega.com.mx ‘Colombia: Alfaomega Colombiana S.A. ~ Carrera 15 No. 64 A 29 ~ PBX (57-1)2100122 Fax: (57-1) 6068648 — E-mail: scliente@alfaomega.com.co Chile: Atfaomega Grupo Editor, 8.A.— General del Canto 370-Providencia, Santiago, Chile ‘Tel: (56-2) 235-4248 = Fax; (56-2) 235-5786 — E-mail: agechile@alfaomega.cl ‘Argentina: Alfaomega Grupo Faitor Argentino, S.A. ~ Paraguay 1307 P.B. “11”. Capital Federal, Buenos Aires, CP. 1057 ~ Tel.: (54-11) 4811-7183 / 8352, E-mail: info@aifeomegaeditor.com.ar Indice analitico 1. ISIS de PROTEUS VSM 1.1 Introduccién. 1.2 Captura electronica: entorno grafico ISI 1.3 Depuracién de los sistemas basados en PICmicro. 2. Compilador CCS C 2.1 Introduccién 2.2 Esteuctura de un programa 2.3 Tipos de datos. 2.4 Las constantes.. 2.5 Variables 2.6 Operadores 2.6.1 Asignaciéa... 2.6.2 Aritméticos 2.6.3 Relacionales . ; 2.6.4 Légicos... 28 2.6.5 De bits... 28 2.6.6 Punteros. 2.7 Funcion 2.8 Declaraciones de control 2.8.4 WHILE / DO-WHILE 2.8.5 Owros.. 2.9 Comentarios. 2.10 Directivas y funciones (Preprocessor commands y built-in functions) 2.11 Librerias, drivers y Sempion. . : 242 Enmweno de tebsjo de CCS C Compile (2.12.1 Introducciés 2.12.2 Entorno de trabajo. 3, La gestion de los puertos 3.1 Introduccién.. 3.2 Gestion de puertos en C. 3.2.1 A través de la RAM. 3.3.1 LCD. 3.3.2 LCD gritico, 3.3.3 Teelado (keypad . 4, Las interrupciones y los temporizadores... 4.1 Introduccion 4.2 Interrupciones. 4.2.1 Inteerupciones en 4.3 TIMER, 4.3.1 TIMERO en ens 4.4 TIMERI y TIMER2..... 4.4.1 TIMERI y TIMER2 en C 5. Convertidor Analdgico — Digital. 5.1 Introduceién. 5,2 Médulo Convertidor (gama media) 5.2.1 Registros FSR. cst 5,2.2 Proceso de conversion 5.2.3 Efecto del modo SLEEP y RESET en el médulo AD. 5.3 Médulo AD en C oe <7 6. Médulo CCP - Comparador, Captura y PWM .. 6.1 Introduceién: 6.2 Modo Captura 6.3 Modo Comparacién... 6.4 Modo PWM 6.5 Médulo CCP en C 7. Transmisién serie.. 7.1 Introduecién: 7.2. El médulo USART/SC 7.2: Introduccion. 7.2.2 El médulo USART en C 7.2.3 La norma RS232. : 7.3 Puerto serie sincrono (SSP). 7.3.1 Intesfaz Inter-Circuitos (2C) 8. Gama Alta — PICI8 8.1 Introduccién... 8.2 Organizacién de la memoria.. 8.2.1 Arquitectura HARDVARD... 8.2.2 Memoria de Programa... 8.2.3 Contador de Programa .. 8.2.4 Memoria de Configuracién 8.2.5 Pila 8.2.6 Memoria de Datos. 8.2.7 Memoria EEPROM... 82.8 Modos de Direccionamiento 8.2.9 Interrupcion: 8.2.9.1 Registros de salvaguarda 8.2.10 Registro W’... 8.2.11 Osciladot. 8.2.12 Unidades Funcionales.. 8.2.12.1 Puertos de entrada/salida 8.2.12.2 Temporizadores.. 82.123 Convertidor Analégico-Digital... 82124 Canal de Comanicacin Serie (EUSART). &2.12.5 Modulo Master SSP (MSSP). 8.2.12.6 Modulo de Compracién/Captura/PWM. co 8.2.12.7 Modulo Comparado: 8.2.12.8 Modulo de referencia... ! 8.2.12,.9 Modulo detector de Alto/Bajo Voltaje... 9. RTOS - Real Time Operating set 9.1 Introduccién. 9.2 RTOS en C 10. USB - Universal Serial Bus 10.1 Introduccién... 1am 10.1.1 Migracin de RS232 a USB . 10.1.1.1 USB CDC (Communication Device Class) 10.2 USB con ISIS y CCS C 10.2.1 USB en ISIS 10.2.2 USB en CCS C vil Introduccion El estudio de los microcontroladores PIC no consiste sélo en dominar su arquitec- tura interna o el cédigo maquina sino también en conocer programas auxiliares que facilitan el disefio de los sistemas donde intervienen. Entre los muchos programas para el desarrollo de sistemas con PICmicro® desta- can, por su potencia, el PROTEUS VSM de ©Labcenter Electrénics y el compilador C de ©Custom Computer Services Incorporated (CCS). El programa PROTEUS VSM es una herramienta para la verificaci6n via software que permite comprobar, practicamente en cualquier disefio, la eficacia del progra- ma desarrollado. Su combinacién de simulacin de eédigo de programacién y si- mulacin mixta SPICE permite verificaciones analdgico-digitales de sistemas basa- dos en microcontroladores. Su potencia de trabajo es magnifica. Por otra parte, tenemos el compilador C de CCS, ya que después de conocer y “do- minar’ el lenguaje ensamblador es muy util aprender a programar con un lenguaje de alto nivel como el C. El compilador CCS C permite desarrollar programas en C enfocado a PIC con las ventajas que supone tener un lenguaje desarrollado espe- cificamente para un microcontrolador concreto. Su facilidad de uso, su cuidado entorno de trabajo y la posibilidad de compilar en las tres familias de gamas baja, media y alta, le confieren una versatilidad y potencia muy elevadas. Al escribir este libro se plantean muchas dudas, sobre todo a la hora de concretar el temario. Escribir profusamente sobre los PIC o sobre el PROTEUS 0 sobre el CCS C supone, casi seguro, escribir un libro para cada uno de estos temas. Por ello, el planteamiento ha sido diferente, desarrollar los conocimientos basicos necesarios para manejar cada programa, apoyarlo con el mayor nimero de ejercicios y dejar al lector la posterior ampliacién de conocimientos. Asi lo he decido en base a la experiencia que me da estar impartiendo clases sobre PIC en la carrera de Ingenie- ros Técnicos Industriales, especialidad de Electronica Industrial, de la Universidad Politécnica de Valencia. Con estas premisas espero que el libro sirva a lector para aumentar sus conocimien- tos sobre el PIC o para iniciarlos en el caso de los que desconozcan este mundo. 1. ISIS de PROTEUS VSM ISIS de PROTEUS VSM 1.1 Introduccion El entorno de disefio electrénico PROTEUS VSM de LABCENTER ELECTRONICS (wzow labeenter.co.uk) ofrece la posibilidad de simular cédigo microcontrolador de alto y bajo nivel y, simulténeamente, con la simulacién en modo mixto de SPICE. Esto permite el disefio tanto a nivel hardware como software y realizar la simula- cién en un mismo y tinico entorno, Para ello, se suministran tres potentes subentor- nos como son el [SIS para el disefio grafico, VSM (Virtual System Modelling) para la simulacién y el ARES para el disefto de placas (figura 1). The VSM Advantage Con las horramiantas tradieionales de alsefo, el desarrotio del software y la comprabacion det sistema no puede resiizarse hasta que se desarrole un prototvo real, esto puede supaner semarias de relr3s0. ‘Ademas, si sa localiza elgin error en ef disefio hardware, la Totalidad del proceso debe repetise. SS BS) Ftc are mods —_— Usendo Proteus VSM, e! desarrollo dl software puede comenzar tan pronto como el esquemético es Aioujado y fa combinacién de software y hardware puede ser testeada antes del mantar el prottipo. Figura 1. Entorno de trabajo PROTEUS (fuente: Labcenter Electronics} Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC 1.2 Captura electronica: entorno grafico ISIS ISIS es un potente programa de disefio electrénico que permite realizar esquemas que pueden ser simulados en el entorno VSM o pasados a un circuito impreso ya en el entorno ARES. Posee una muy buena coleccién de librerias de modelos tanto para dibujar, simular © para las placas. Ademas, permite la creacién de nuevos componentes, su mode- lizaci6n para su simulacién e, incluso, la posibilidad de solicitar al fabricante (Lab- center Electronics) que cree un nuevo modelo. Sin entrar profundamente en como utilizar dicho programa (requeriria un libro sélo para ello), a continuacién se explican las bases para dibujar cualquitr circuito electrénico. El programa ISIS posee un entorno de trabajo (figura 2) formado por distintas barras de herramientas y la ventana de trabajo. Varios de estos mentis también se pueden utilizar con la ayuda del botdn derecho del ratén. Al pulsarlo en cualquier parte del entorno de trabajo aparece un menti contex- tual donde se pueden ir obteniendo los distintos submentis de trabajo (figura3). 1. ISIS de PROTEUS VSM Figura 3. Submenis de trabajo del botén derecho del ratén Para dibujar, lo primero es colocar los distintos componentes en la hoja de trabajo. Para ello, se selecciona el modo componentes (figura 4) y, acto seguido, realizar una pulsacién sobre el botén P de la ventana de componentes y librerias (figura 5). [Pp anes ieee Taal Figura 4. Modo componentes Figura 5. Boton “pick” Tras activar el botén P se abre la ventana para la edicién de componentes (figura 6) donde se puede buscar el componente adecuado y comprobar sus caracteristicas. Al localizar el componente adecuado se realiza una doble pulsacién en él, de tal forma que aparezca en la ventana de componentes y librerias (figura 7). Se pue- de realizar esta accién tantas veces como componentes se quieran incorporar al esquema. Una vez finalizado el proceso se puede cerrar la ventana de edicién de componentes. Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Permite localizar por tipo, clase y fabricante Permite localizar componentes por nombre Lista de dispositivos disponibles y sus caracteristicas ‘Simbolo de esquema y modelo Encapsulado para placa Poquofio oditor de las caracteristicas de un componente (situar el ratén sobre él) Figura 6. Ventana para la edicion de componentes Figura 7. Los componentes ahadidos Para situar un componente en el esquema tan sélo debemos seleccionarlo de la lista, Al hacerlo se puede comprobar su orientacién (tal como se representara en el esquema) en la ventana de edicién (figura 8). Si deseamos modificar la rotacién 0 la reflexidn del componente podemos acceder a ello a través de la barra de herra- mientas correspondiente (figura 9). Hacigndolo de esta forma, “todos” los componentes de la lista tendran la misma orientacién (si se desea orientar un tinico componente deberemos hacerlo una vez ya situado en el esquema). 1. ISIS de PROTEUS VSM > + © a & is cor «+t Figura 8. Seleccion y orlentacion iawra 9. Barra de rotacionyy refiexién del componente Ahora solo falta realizar una pulsacién sobre la ventana de trabajo y se colocard el componente. El cursor del ratén se convierte en un lépiz blanco (figura 10). Se pueden colocar varios componentes del mismo tipo simplemente realizando varias pulsaciones, Para terminar de colocar un componente se debe seleccionar otro com- ponente de la lista o pasar a otro modo de trabajo. Lipic banc Figura 10. Cursor en el modo de colocacién Es importante activar la herramienta de referencia automatica (Real Time Annota- tion). De esta forma, los componentes tendran una referencia distinta y de forma consecutiva; en los circuitos integrados con varios componentes encapsulados tam- bién se referenciarén segiin dicho encapsulado (U1A, UIB, etc.). Esta herramienta se activa o desactiva desde la opcién de menti TOOLS > Real Time Annotation. Una vez situados los componentes en el rea de trabajo se pueden mover, al pasar por encima del componente el cursor se convierte en una mano (figura 11) y al rea~ lizar una pulsacién, el cursor se transforma en una mano con una cruz, indicando que se puede mover el componente (quedan seleccionados al ponerse en rojo) y se puede arrastrar (atencién: si se vuelve a realizar otra pulsacién del botén izquierdo se editan las caracteristicas del componente). Tambign se puede cambiar su orienta- cién utilizando los comands de rotacién y reflexidn a través de una pulsacion del botén derecho del rat6n (figura 12) y se pueden eliminar con dos pulsaciones con el botén derecho sobre ellos (0 con el botén derecho y el comando Delete Objet). OD slain del composes Ng, Mover componente debe ara en Figura 11. El cursor en modo de seleccién y mover Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC ; Figura 12, Menu contextual de un componente activado por el botén derecho del ratén Todas estas acciones se pueden realizar individualmente o de forma colectiva, es decir, se pueden agrupar varios componentes a través de pulsaciones consecutivas sobre ellos (manteniendo la tecla pulsada) o dibujando una ventana con el botén izquierdo y arrastrandola sobre los mismos (figura 14). iS _bbbbht ee uo Haddad EESG: ReRERER lw Figura ‘Una vez seleccionado el conjunto de componentes (se marcan todos en rojo) debe mos utilizar la herramienta de grupo (figura 15), que también aparece tras pulsar el botén derecho. Con esta herramienta se pueden copiar, mover, rotar o eliminar los componentes seleccionados. . Los componentes en el area de trabajo 1. ISIS de PROTEUS VSM 9 Ree ao eo Ow + saaan >> ae aber acat Gaps s08 fe TELE ir le | : Figura 14, Seleccién de varios componentes Figura 15. La herramienta de grupo Para unir los componentes con cables hay que situarse en los extremos de los termi- nales, el cursor se convierte en un lapiz, verde (figura 16). Ahora se pueden ejecutar dos acciones o ir marcando el camino hasta el destino con distintas pulsaciones (figura 17) 0 realizar, directamente, una pulsacién en el destino y dejar que [SIS realice el camino. Para ello, debe estar activada la herramienta TOOLS > Wire Autorouter. Figura 16. inicio Figura 17. Circuito “a mano” Compilador € CCS y Simulador PROTEUS para Microcontroladores PIC Las uniones entre cables se pueden realizar de forma automatica. Para ello, mien- tras se traza un camino debemos realizar una pulsacién sobre el cable objeto de la unién eléctrica (figura 18). También se pueden realizar de forma manual mediante el modo de unién (figura 19); en este modo tan sélo hay que ir haciendo pulsacio- nes sobre los puntos donde deseamos realizar la union. Figura 18. Unién eléctricaentrecables ‘Figura 19. Modo de union Se puede modificar el trazado de los cables. Para ello, se realiza una pulsacién so- bre el cable, en ese instante el cursor se convierte en una doble flecha (figura 20) y se puede arrastrar el ratén para modificar el cable. t Doble flecha: mover cables Figura 20. Mover los cables ‘También se pueden utilizar buses para las uniones multicable. Los buses permiten conectar varios terminales entre si utilizando un tinico elemento (figura 21); en este caso, el cursor se convierte en un lapiz azul (figura 22). Pero para distinguir los distintos cables que forman parte del bus y distribuirlos en Ia entrada y en la salida se deben etiquetar mediante labels. En el caso de los cables se indicard una etiqueta unica LCDO, LCD1, etc., y al bus una etiqueta conjunta segiin el formato LCD[0..3] que indique el nombre y la cantidad de cables que lo forman. Figura 21. Cableado por bus 1. 1SIS de PROTEUS VSM Figura 22. Cursor en modo de trazado de bus El etiquetado también permite unir cables virtualmente. Para ello, tan s6lo es nece- sario que los dos cables se Hamen igual aunque no estén conectados entre si. Para etiquetar cables 0 buses se utiliza el modo label (figura 23). Al activar este modo y realizar una pulsacién sobre un cable 0 bus se abre una ventana donde podemos in- troducir la etiqueta, ademds de seleccionar posicién, orientacién y estilo (figura 24) Figura 23. Modo label Figura 24. Ventana de edicién de etiquetas Otro modo de unién virtual es a través de terminales. Al activar el modo terminal (figura 25) se pueden seleccionar distintos tipos de terminales, entre ellos el utiliza- do por defecto (defauif). Al utilizar este terminal en varios componentes y darle el mismo nombre en todos ellos se consigue una unién eléctrica. Figura 25. Modo terminal Compilador C CCS y Simulador PROTEUS: Figura 26. Uni6n eléctrica a través de terminales Mediante este modo también se pueden colocar las masas y alimentaciones del circuito utilizando las opciones Ground y Power (figura 26). De esta forma se puede finalizar el circuito (figura 27). Figura 27. Circuito cableado Tan s6lo queda modificar las caracteristicas de los componentes que lo requieran, por ejemplo modificando el valor de los componentes pasivos. Para ello, se seleccio- na un componente realizando una pulsacién con el botdn derecho, aparece el mentt contextual y se selecciona la opcién EDIT PROPERTIES; también se puede utilizar el modo edicién (figura 28) en el cual tan sélo es necesario hacer una pulsacién con el botén izquierdo sobre el componente; en este modo el cursor se convierte en una flecha (figura 29). Al ejecutar esta accién se abre la ventana de edicién donde se pueden cambiar las caracteristicas de los componentes (figura 30), por ejemplo la resistencia de 10K a 180 ohm. También se puede editar directamente la referencia o el valor de un componente si la pulsacidn se realiza encima de estos elementos. 10 1. ISIS de PROTEUS VSM I Figura 28. Modo edicién Figura 29. Cursor en modo edicion = |e SIF [ear Figura 30. Ventana de edicién de un componente Con esto quedaria finalizado el circuito electrénico (figura 31). Pero en el caso de los sistemas basados en un microcontrolador atin quedan por modificar las carac- teristicas del mismo microcontrolador. Figura 31. El esquema completo a] Compilador © GCS y Simulador PROTEUS para En el caso de los microcontroladores, la ventana de edicién aporta mucha infor- macién (figura 32). Tal vez lo mas importante es que permite cargar en el micro controlador el archivo de programa (*.HEX) generado en la compilacién; también se puede modificar la frecuencia de reloj (por lo tanto no es necesario el uso de cristales externos en la simulaci6n), cambiar la palabra de configuracién y otras propiedades avanzadas. Sr ia oman feortter — Figura 32. Ventana de edicion de un micro 1.3 Depuracién de los sistemas basados en PiCmicro La caracterfstica mas importante del PROTEUS VSM es la capacidad de depurar pro- gramas fuente de distintos lenguajes de programacidn. Ademas de aceptar el archivo de programacién Intel Hex (HEX), también admite ficheros JAR UBROF (D39), Byte- Craft COD (COD), Microchip Compatible COF (COF) y Crownhill Proton Plus (BAS). Al utilizar estos archivos se puede abrir una ventana de c6digo fuente llamada SOURCE CODE mediante la cual se puede seguir el programa fuente linea a linea de cédigo. Ademés permite visualizar elementos internos del PIC como son la memoria de programa, la memoria de datos RAM o la EEPROM, los registros especiales (FSR) y la pila (Stack). Ademés, el entorno PROTEUS VSM permite compilar programas fuente en cédigo ensamblador directamente, Para ello, se utiliza el comando SOURCE (figura 33). 12 1, ISIS de PROTEUS VSM ' Define Code Generation Tools... Setup External Text Edt... Figura 33. Generador de cédigo de ficheros fuente En el caso del compilador CCS C, después de compilar se generan, entre otros, los archivos *,HEX y “.COF, los cuales se pueden utilizar para trabajar con el entorno PROTEUS VSM. Para ejecutar el programa desde ISIS se debe abrir la ventana de edicién del microcontrolador (figura 32) y en el item PROGRAM FILE se puede indicar el fichero de cédigo fuente utilizado. ‘Ademés, en esta ventana se puede indicar la frecuencia de trabajo con la opcién PROCESSOR CLOCK FREQUENCY (debemos observar que para la simulacin no es necesario colocar elementos externos de oscilacién en el PIC, tan sélo hacen falta en caso de realizar la placa). En la opcién ADVANCED PROPERTIES podemos ha- bilitar 0 configurar muchos més elementos: configurar el wacthdog, habilitar avisos de desbordamiento de pila, accesos no correctos a memoria, etc. Una vez cargado el microcontrolador con el programa fuente, se puede proceder a la simulacién del circuito empleando la barra de simulacién (figura 34). Esta barra se compone de la opcién MARCHA, PASO A PASO, PAUSA y PARADA. Figura 34, Barra de simulacién Con la opeién MARCHA la simulacién se inicia (el botén se vuelve verde) y fun- ciona en modo continuo, La simulacién NO es en tiempo real y dependerd de la carga de trabajo del PC. En la barra de estado se indica la carga de la CPU del PC (a mayor carga menos real seré la simulacién) y el tiempo de ejecucidn; este tiempo indica el tiempo que tardaria, en la realidad, el circuito en realizar un proceso (por ejemplo esto implica que, dependiendo de la carga de trabajo de la CPU, un tiempo de 1 sen el circuito puede significar varios minutos de simulacién). > > TW Tm ] ANIMATING: 00:00:02.5 (CPU load 8) Figura 35. Barra de estado en la simulacion Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC La opcién STOP para totalmente la simulacin mientras que PAUSE la para de for- ma momenténea permitiendo hacer uso de las herramientas de depuracién. La opcién PASO a PASO permite trabajar en tramos de tiempo predefinidos y, ade- més, permite utilizar las herramientas de depuracién. Esta opcidn est ligada a la configuracién de la animacién (figura 36): SYSTEM > SET ANIMATION OP- TIONS > SINGLE STEP TIME donde se puede definir el incremento de tiempo que se desea que pase cada vez que se pulsa esta tecla. eee | Shon toe Geant? | ShonLage Set Fr? | Shon te Votan ti Clee? Max SACETinedep, [3m | Severin th ert Figura 36. Set animation options En este cuadro de didlogo también se pueden cambiar los siguientes pardmetros: * FRAMES PER SECOND: numero de veces que la pantalla de ISIS se refresca en un segundo (por defecto 20). + TIMESTEP PER FRAME: indica el tiempo de simulacién por cada uno de los {frames; lo ideal es que sea el valor inverso del escogido en la opcién FRAMES PER SECOND. + ANIMATIONS OPTIONS: permite habilitar la visualizacion de las sondas de tensidn y corriente, mostrar los niveles légicos en los pines, mostrar el nivel de tension en los cables mediante colores 0 mostrar la direccién de la corriente en los cables mediante flechas. * VOLTAGE/CURRENT RANGES: permite determinar el umbral de tension (£V) y corriente para utilizar en la visualizacién de las correspondientes ANI- MATIONS OPTIONS. En este punto se puede simular (y animar) un sistema con el PICmicro (figura 37) Lo més interesante de la simulacién con microcontroladores es la utilizacién de las herramientas de depuracion. Es decir, visualizar mediante ventanas las distintas paries internas del microcontrolador: memoria de programa, memoria de datos, pila, etc. La mayor parte de estas ventanas s6lo se pueden visualizar durante una PAUSA. 14 Figura 37. Una simulacién en marcha Desde el mend DEBUG (figura 38) también se puede iniciar la simulacién pero pensando en la depuracién. Con la opcién START/RESTAR DEBUGGING se pue- de iniciar la simulacién pero haciendo una pausa para ver las distintas ventanas de depuracién. También se puede ejecutar el programa directamente con la opcién EXECUTE, EXECUTE WITHOUT BREAKPOINT o EXECUTE FOR SPECIFIED TIME que permite ejecutar directamente un programa, ejecutarlo sin puntos de ruptura (en el caso de tenerlos) y ejecutarlo en un tiempo concreto. Figura 38. El mend DEBUG antes de la simulacién 15 Compilador C CCS y Simutador PROTEUS para Microcontroladores PIC Desde esta ventana también se puede reinicializar la memoria EEPROM del mi- crocontrolador mediante RESET PERSISTENT MODEL DATA. Al producirse una pausa, el menti DEBUG se modifica (figura 39) mostrando las correspondientes herramientas de depuracién. rc Pukagns va Fic PubuaNecay Ui 2 PRCCPUERREH Mery =U BC PUReg Menaul BPC Figura 39, El mend DEBUG en una pausa Estas herramientas son (figura 40): SIMULATION LOG: Mensajes resultantes de la simulacién. WATCH WINDOWS: Ventana de visualizacién de posiciones de memoria. Permite afiadir la que e] usuario desea ver PIC CPU REGISTERS: Muestra los registros FSR del PIC. PIC CPU DATA MEMORY: Muestra la memoria de datos (RAM). PIC CPU EPROM MEMORY: Muestra la memoria de datos (EPROM). PIC CPU PROGRAM MEMORY: Muestra la memoria de programa. PIC CPU STACK: Muestra la pila. . 16 1. ISIS de PROTEUS VSM Figura 40. Ventanas de depuracién La ventana WATCH WINDOW es la més versétil puesto que se pueden afiadir variables y modificar su visualizacién. Al pulsar el botdn derecho sobre la ven- tana se abre un menti contextual (figura 41). Con ADD ITEMS (nameladdress) se afiade la variable a visualizar directamente con el nombre predefinido (figura 42) = en el PIC 0, en el caso de varia see we Go] bles propias del programador, se Sema GRE : pueden visualizar por direccién (figura 43), donde se le indica el nombre, la direccién en hexade- cimal, el tipo de dato (byte, word, etc.) y el formato de visualizacién (binario, decimal, etc.). El tipo de dato y el formato también se pue- de cambiar desde DATA TYPE y DISPLAY FORMAT. Figura 41. Menu contextual de WATCH WINDOWS: 7 Compitador C CCS y Simutador PROTEUS para Microcontroladores PIC Con WATCHPOINT CONDITION se pueden habilitar puntos de ruptura median- te condiciones sobre las distintas variables (figura 44); se indica la variable, la mas- cara de la condicién (NONE, AND, OR, XOR) y el tipo de condicion (NONE, ON CHANGE, EQUALS, etc.). Geta Conon Cena ai wate pets © Suspend he venlton ANY exreeson 2 4 Stop hearin ny when ALL ort ee, hes nk vaso — i we foo soar | Condi [Ba Chara Figura 43. Add by Address Figura 44. Puntos de ruptura Hay una ventana de depuracién que sélo se visualiza si se ha incorporado un fi- chero COD 0 COF al microcontrolador, se trata de la ventana CPU SOURCE CODE (figura 45). Con esta ventana se puede seguir la simulacién linea a linea del archivo de cédigo fuente, En esta ventana (también en el menu DEBUG) estan disponibles unos botones de control (figura 46). 18 f4use ceiayceleck= 4000000) Ssnclude <1ca.mio.c Mineliids Skbecmio.e vorg maine) { legates Roath ete port_p-put lups Crave); Ved_putec"\MLasto. ..\A")s arene Lee the: roo Trecieby Tetieeeey Nepictoweas Uppecrine cat sever Ym ine carsceer } Gimer ne Sal arch facies Cater Seth Gprrerine valor fesertco Figura 45. La ventana CPU Source code | de | Figura 46. Los controles para la simulacion Simulacién en modo continuo, no permite ver las ventanas de depu- racién. Permite ejecutar una instruccién; si es una subrutina 0 una funcién la ejecuta directamente. Permite ejecutar una instruccién; si es una subrutina o una funcién entra en ella. Trabaja en modo continuo hasta que encuentra un retorno de cual- quier subrutina. Trabaja en modo continuo hasta que se encuentra con un punto de ruptura. Habilita 0 deshabilita los puntos de ruptura. [=] [=] | (e % 19 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Hay una ventana de diagndstico que facilita la depuracién, almacenando los erro- Tes, mensajes de diagnéstico y avisos producidos durante el proceso de simulacién (figura 47). En la barra de estado (zona inferior del area de trabajo) se muestra un aviso (figura 48); con una pulsacidn en el aviso aparece la ventana de diagnosis. escent © \OOCINE™ NE AALONEAS\elSATG SOF er anon UTE MATA PCIE nce nnn 71002 But |g PETE don Bonin 28 tect iy EEPROM cin rg Xt Vachon ES, Resse debe fon He Wado He® ost, pepan vd nd lee Figura 47. Mensajes de diagnéstico de la simulacion Se pueden configurar las opciones de esta herramienta desde la opeién DEBUG CONFIGURE DISGNOSTIC (figura 49). En la ventana se muestran los componen- tes del esquema susceptibles de un diagnéstico en la simulacién y las diferentes posibilidades de diagnéstico y el tiempo de diagnéstico (figura 50). @ Thies) | ots Figura 48, Mensajes de la herramienta de diagnéstico Figura 49. La configuracion de diagnésticos MILFORD-£e20.0KP (U5) 5240s wi) 152405 (U2) s2405 13) @ Yone/SFF scces evens 1) Pet Everts 1 Slep/WakeEverts 1 eter Everee 1 Watchdog Tee Mate 1 PSP Mose “Tac imation ore Distled Wangs ony @ Fula Sucre seulabonnhenavt an eet ope? Loaten(— te (serie [ Figura 50. Opciones de configuracion Tras la simulacién aparecen los diferentes resultados del andlisis; en el item SOUR- CE aparece indicado el dispositivo fuente del andlisis y tras una pulsacién se puede acceder a él (figura 51). remit Ja? prove on HLS c Baie Jaber pode on ADORE i abe cn A007 i be on HOKE ad abe on AOU tat abe on 30008 at i modal loa 70.03 [Bud 285 sea daeg FCS device VO} Fan Code 8 PEED Ceres ati JQ (01.101 Gvedive ps0. No | Loaded 128 ite fein EEPROM data 1 Loadna HEX le Mectrom HEX Radial of 1082 byes om le Macom HEX. |B Loaded 535 png wor nD cao. Figura 51. Resultado del diagnéstico El listado de nodos y patillas se pueden encontrar con la ayuda del DESIGN EX- PLORER (a ésta opcién podemos acceder a través de distintas opciones: coman- do DESIGN, botén derecho, etc.). En su ventana de trabajo se muestran todos los nodos y patillas que forman el circuito (figura 52). 2 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Figura 52. La ventana Design Explorer Capitulo 2 Compilador CCS C 2.1 Introduccion El Compilador C de CCS ha sido desarrollado especificamente para PIC MCU, ob- teniendo la maxima optimizacién del compilador con estos dispositivos. Dispone de una amplia libreria de funciones predefinidas, comandos de preprocesado y ejemplos. Ademas, suministra los controladores (drivers) para diversos dispositivos como LCD, convertidores AD, relojes en tiempo real, EEPROM serie, etc, Las ca- racteristicas generales de este compilador y mas informacién adicional se pueden encontrar en la direccién hitp://www.ccsinfo.com. Un compilador convierte el lenguaje de alto nivel a instrucciones en cédigo mé- quina; un cross-compiler es un compilador que funciona en un procesador (normal- mente en un PC) diferente al procesador objeto. El compilador CCS C es un cross- compiler. Los programas son editados y compilados a instrucciones maquina en el entorno de trabajo del PC, el cédigo maquina puede ser cargado del PC al sistema PIC mediante el ICD2 (0 mediante cualquier programador) y puede ser depurado (puntos de ruptura, paso a paso, etc.) desde el entorno de trabajo del PC EICCS C es C estandar y, ademés de las directivas estandar (include, etc.), sumi- nistra unas directivas especificas para PIC (device, etc.); ademas incluye funciones especificas (bit_set(), etc.). Se suministra con un editor que permite controlar Ia sin- taxis del programa. En el manual de CCS se da mucha més informacién de la que a continuacién se va a dar. En este capitulo sdlo se describirdn los elementos mas basicos y esenciales pata comenzar a programar. Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC 2.2 Estructura de un programa Para escribir un programa en C con el CCS C se deben tener en cuenta una serie de elementos basicos de su estructura (figura 1). * DIRECTIVAS DE PREPROCESADO: controlan la conversién del programa a cédigo maquina por parte del compilador. PROGRAMAS o FUNCIONES: conjunto de instrucciones. Puede haber uno © varios; en cualquier caso siempre debe haber uno definido como principal mediante la inclusién de la Hamada main(). INSTRUCCIONES: indican como debe comportar el PIC en todo momento. COMENTARIOS: permiten describir lo que significa cada linea del programa Ding Daeanes a inincion AtSeararasan| Be Funcion principal Sh De eel es Instrucciones we ‘Comentarios pereerrrrtrs Figura 1. Estructura basica de un programa 2.3 Tipos de datos CCS C acepta los siguientes tipos de datos: Tipo Tamaiio Rango Descripcién Inf Short 1 bit Oal Entero de 1 bit 24 2. Compilador CCS C Tipo ‘Tamaiio go Descrips ae 8 bit 0.0255 Entero ate 16 bit 0a 65.535 Entero de 16 bit Int32, 32 bit 0a 4.294.967.295 Entero de 32 bit Float 32bit et: | Coma flotante Void 8 bit 0a255 Caracter Sin valor Signed Int8 8 bit “128 a +127 Entero con signo Signed Inti6 16 bit -32768 a + 32767 _| Entero largo con signo Signed Int32 32bit a H2"1) Entero 32 bit con signo 2.4 Las constantes Las constantes se pueden especificar en decimal, octal, hexadecimal o en binario: 123 Decimal 0123 etal (0) 0x123 Hexadecimal(0x) 06010010 _[ Binario (0b) Caracter 4010" Cardcter octal AxAS’ Cardcter hexade Ademas, se pueden definir constantes con un sufijo: ‘También se definen caracteres especiales, algunos como: Ints 127U Long 80UL Signed INTI6 _ | 80L Float 3.14F Char Con comillas simples \n Cambio de linea \ Retorno de carro 25 2.5 Variables Las variable se utilizan para nombrar posiciones de memoria RAM; se deben decla- rar, obligatoriamente, antes de utilizarlas; para ello se debe indicar el nombre y el tipo de dato que se manejard. Se definen de la siguiente forma: TIPO NOMBRE_VARIABLE [=VALOR INICIAL] TIPO hace referencia a cualquiera de los tipos de datos vistos en el punto 2.3. El NOMBRE_VARIABLE puede ser cualquiera y el valor inicial es opcional. Veamos un ejemplo: float temp. Las variables definidas en un programa pueden ser de tipo LOCAL 0 GLOBAL. Las variables locales s6lo se utilizan en la funcién donde se encuentran declaradas; las variables globales se pueden utilizar en todas las funciones del programa. Ambas deben declararse antes de ser utilizadas y las globales deben declararse antes de cualquier funcién y fuera de ellas. Las variable globales son puestas a cero cuando se inicia la funcién principal main(). #include <16f876.h: #USE DELAY (CLOCK=4000000) int1é c void FUNCION // Variable global char K, kant="0"; // bles locales void main( ) t int temp; // Variable 1 } Las variables pueden ser definidas con: * AUTO: (usada por defecto, no hace falta que se indique) donde la variable existe mientras la funcién esta activa. Estas variables no se inicializan a cero. Su valor se pierde cuando se sale de la funcién. 26 2. Compilador CCS C « STATIC: Una variable local se activa como global, se inicializa a cero y man- tiene su valor al entrar y salir de la funcién. + EXTERN: Permite el uso de variables en compilaciones multiples. 2.6 Operadores 2.6.1 Asignacion 4= _| Asignacién de suma (x+y es lo mismo que x-xty) = _| Asignacién de resta (x-=y es lo mismo que x=x-y) Asignacién de multiplicacién (x*=y es lo mismo que x=x*y) 'y) %= | Asignacién del resto de la division (x%=y es lo mismo que x-x%y) Asignacidn de division (x/=y es lo mismo que x= << | Asignacién de desplazamiento a la izquierda (x<<>=y es igual que x=x>>y) Asignacién OR de bits (x!=y es lo mismo que x=x!y) > &= | Asignacién AND de bits (x&=y es lo mismo que x=x&y) l= ed Asignacién OR EXCLUSIVA de bits (x"=y es lo mismo que x=x“y) 2.6.2 Aritméticos Ss Decremento sizeof | Determina el tamaiio, en bytes, de un operando En las operaciones de decremento e incremento, en funcién de la posicién del ope- rador, se consigue un preincremento (+A) o un postincremento (A++). Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC 2.6.3 Relacionales Menor que Mayor que ¥|y]* Mayor 0 igual que Menor igual que ua Igual Distinto Expresién condicional 2.6.4 Légicos ! NOT && AND i [oR 2.6.5 De bits ~ | Complemento a1 & | AND kis OR EXCLUSIVA | OR >>_| Desplazamiento a derechas <<_| Desplazamiento a izquierdas 2.6.6 Punteros & | Direccién Indireccion Puntero a estructura 2, Compilador CCS C Orden de precedencia de los operadores: Expresiones en orden de precedencia descendente (expr) lexpr ~expr “Hrexpr expr ~expr (type)expr “expr &value sizeof(type) exprrexpr expr/expr expr%expr exprtexpr expr-expr expré>expr exprsexpr expreexpr__[exprexpr _| exprexpr expr=expr expri=expr expréexpr expr’expr expr | expr expr &é& expr expr || expr expr ? expriexpr Wvalue=expr | Ivalueexpr_[ Ivalue=expr Ivalue*-expr | Ivalue/expr_| Ivalue%=expr Iwalue>>=expr_| Ivalue<<=expr | Ivalueé&=expr Ivalue*=expr__| Ivaluel=expr_| expr, expr 2.7 Funciones Las funciones son bloques de sentencias; todas las sentencias se deben enmarcar dentro de las funciones. Al igual que las variables, las funciones deben definirse antes de utilizarse. Una funcién puede ser invocada desde una sentencia de otra funcién. Una funcién puede devolver un valor a la sentencia que la ha llamado. El tipo de dato se indica en la definicién de la funcién; en el caso de no indicarse nada se entiende que es un int8 y en el caso de no devolver un valor se debe especificar el valor VOID. La fancién, ademas de devolver un valor, puede recibir parametros 0 argumentos. 29 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC La estructura de una funcién es: ncion (tipe paraml, param2,...) Dato Nombre (sentenctas); trunca (float a) { La forma de devolver un valor es mediante la sentencia RETURN: retura (expresién); expresién Donde expresién debe manejar el mismo tipo de dato que el indicado en la de- finicién de la funcién. En el caso de no devolver nada se finaliza con RETURN, al encontrar esta sentencia el compilador vuelve a la ejecucién de la sentencia de llamada. También se puede finalizar la funcién sin RETURN, tan s6lo con la lave de cierre “)”. Las funciones pueden agruparse en ficheros de librerias , que se pueden utilizar mediante la directiva #include . 2.8 Declaraciones de control Las declaraciones son usadas para controlar el proceso de ejecucién del programa. Las que admite CCS son: © IfElse. © While. 30 2 Compilador CCS C + Do-While. * For. * Switch-Case. © Return. * Break, Continue y Goto. 2.8.1 IF-ELSE Con la ayuda de IF-ELSE se pueden tomar decisiones. Af (expresién) sentencia_t; [else sentencia 2;] Los elementos que se encuentran entre corchetes [ ] son opcionales. Primero se evaltia la EXPRESION y sies cierta (TRUE 0 1) ejecuta la SENTENCIA_1, en el caso contrario (FALSE 0 0) ejecuta la SENTENCIA_2. Pueden anidarse los IF-ELSE dando lugar a los ELSE-IF; esto permite tomar deci- siones miiltiples. if (expresion_t) sentencia 1; lelse if (exptesisn_2) sentencia_2;] felse sentencia_3;] En este caso las EXPRESIONES se evalian en orden, si alguna de ellas es cierta la SENTENCIA asociada a ella se ejecutara y se termina la funcién. En caso contrario se ejecuta la SENTENCIA del ELSE. En ambos casos si existen varias sentencias para ejecutar se deben utiliza las Haves { }: 31 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC if (expresion) sentencia 1; [else sentencia 17 HW Bjemplos: IF (A==0) B=10; ELSE C=5; Ss IF (Al=1) B=10; ELSE C=5; —- 32 2, Compitadar GCS C IF (A>10) {IF (A>20) B=15;} ELSE B=5; 2.8.2 SWITCH Switch es un caso particular de una decisién multiple switch fexpresién) t case ante 1: sentencias; break; ease constante 2: sentenciass break; [default ISentencias;) 4 Evahia la expresién y en orden a la CONSTANTE adecuada realiza las sentencias “asociadas. Si ninguno de los CASE corresponde a la CONSTANTE se ejecuta DE- T (este comando es opcional). El comando BREAK provoca la salida de SWITCH, de lo contrario se ejecuta el ite CASE. pueden existir dos CASE con la misma CONSTANTE. 33 Compitador C CCS y Simutador PROTEUS para Microcontroladores PIC Ejemplo: case 2: B=2; break; case 3: B=3; break; default: break; zacién ; incremento sentencias; En las expresiones del FOR la inicializacién es una variable a la cual se Je asigna un valor inicial con el que controlar el bucle. La condicién de finalizacién sirve para evaluar ANTES de ejecutar las sentencias sies cierta 0 no, en el caso de ser cierta se ejecutan las sentencias y en caso contrario se sale del FOR. Por iltimo, la expresion de incremento 0 decremento modifica la variable de control DESPUES de ejecutar el bucle. Se pueden anidar bucles FOR utilizando distintas variables de control, 34 2. Compilador COS C Si se ejecuta la siguiente expresién se consigue un BUCLE SIN FIN: Fort; 7) f sentencias; } Ejemplo: For (N=1;N<=10;N++) { Printf(“%u",N); + 2.8.4 WHILE / DO-WHILE WHILE se utiliza para repetir sentencias. while (expresién) ‘ sentencias; ) La expresién se evalia y la sentencia se ejecuta mientras la expresin es verdadera, cuando es falsa se sale del WHILE. Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC DO-WHILE se diferencia del WHILE y del FOR en la condicién de finalizacién, la cual se evaliia al final del bucle, por lo que las sentencias se ejecutan al menos una vez. Do while (expresién); Si se ejecutan las siguientes expresiones se consigue un BLICLE SIN FIN: white (2) t ( gentencias; ) Wile (3) Ejemplos: While (N>5 && M<10) { At; 2; 36 2. Compilador CCS C 2.8.5 Otros * Return: se emplea para devolver datos en las funciones, + Break: permite salir de un bucle, se utiliza para While, For ,Do y Switch. * Goto: provoca un salto incondicional. 2.9 Comentarios Los comentarios en el programa facilitan la compresion de las distintas expresiones tanto para el programador como para quién tiene que interpretar dicho programa No afectan a la compilacién por lo que pueden ser tan extensos como el programa- dor quiera. Se pueden colocar en cualquier parte del programa y con dos forma- tos: * Utilizando //. Al colocar estos signos se comienza el comentario y finaliza en el final de la linea. * Utilizando /* y */. Se debe utilizar al inicio y al final de comentario, pero no pueden repetirse dentro del mismo comentario. /* Este comentario no finalize al final de esta linea finaliza cuando se cierre el comentario */ 7 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC 2.10 Directivas y funciones (Preprocessor commands y built-in functions) 2.10.1 Directivas Las directivas de pre-procesado comienzan con el simbolo y contintian con un comando especifico. La sintaxis depende del comando. Algunos comandos no per- miten otros elementos sintacticos en la misma expresién. Muchas de las directivas utilizadas por CCS son extensiones del C estandar. #DEFINEID STRING #1 expr #NOLIST ELSE #IFDEF id sPRAGMA cmd Estandar C #ENDIF #LIST #ERROR INCLUDE “FILENAME” #INLINE #INT_GLOBAL #SEPARATE Cualificadores #INT_DEFAULT SINT xx __DATE__ 2 pen a Identificadores |__DEVICE__ = TIME__ FILENAME__ RTOS #USE RTOS Especificacién Dispositivos DEVICE CHIP #FUSES options #1D CHECKSUM #1D NUMBER #SERIALIZE USE DELAY CLOCK #USEFIXEDIO — #USE RS232 #USE FAST_IO USE 12C #USE SPI USE STANDARD IO #ASM #BYTE id=id #ROM SBIT id=id.const ¥ENDASM #TYPE Librerias predefinidas Control de | yprrid-constconst #FILL_ROM #ZERO_RAM memoria sBUILD SLOCATE id=const #BYTE id=const #RESERVE Control de | #CASE #OPT n #PRIORITY compilador | #ORG #IGNORE_WARNINGS A lo largo del presente libro se iran viendo varias directivas en su ambito de apli- cacién particular. 2. Compilador CCS C ‘Como ejemplo se pueden comentar: #DEVICE chip, permite definir el PIC con el que se realizaré la compila device PICLEFES #FUSES options, la cual permite definir la palabra de configuracién para progra- mar un PIC. Por ejemplo, en el PICIGF84 las opciones posibles son: LP, XT, HS, RC, NOWDT, WDT, NOPUT, PUT, PROTECT, NOPROTECT. #device PIclersd #fuses XT, NOWOT, PUT, NOPROTECT #INCLUDE “filename”, permite incluir fichero en el programa. #include <16?84.h> #fuses XT, NONDT, PUT, NOPROTSCT #USE DELAY (CLOCK=SPEED), permite definir las frecuencia del oscilador del PIC, el compilador lo utiliza para realizar cAlculos de tiempo. Se puede utilizar M, MHZ, K y KHZ para definir la frecuencia. PINCLUDE <16F877.h> fuse delay (clock=4000000) #ASM y #ENDASM, permiten utilizar cédigo ensamblador en el programa en C. Se utilizan al inicio y al final del bloque ensamblador. fas bsf TATUS,RPO moviw 0x8 movw£ PORTS bef STATUS, RFO fendasn Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC 2.10.2 Funciones CCS suministra una serie de funciones predefinidas para acceder y utilizar el PIC y sus periféricos. Estas funciones facilitan la configuracion del PIC sin entrar en el ni- vel de los registros especiales. Las funciones se clasifican por bloques funcionales. ASSERT() GETCHO, PUTC() FGETC() GETCHAR() _ | PUTCHAR() psrsme | FSETSO GETS) PUTSO) FPRINTR() _[ KBHIT() SET_UART._SPEED() FPUTC() PERROR() SETUP_UART() FPUTS() PRINTF() wspus [setup sp) | SPl_DATAIS_INO. SPI_WRITE() SPr2-HILOs |SPLXFER() | SPLREAD() OUTPUT_ Sa GET_TRISx() } INPUT_K() FLOAT() SET_TRIS_B() INPUT() INPUT_STATE() | OUTPUT_G()_| SET_TRIS_C() INPUT_AQ)_| INPUT_x() OUTPUT_H()_[SET_TRIS_D() : , OUTPUT_ INPUT) {OUTPUT_AQ) | iricH() SET_TRIS_E() INPUT_C() _[ouTPUT_() [OUTPUT J() | SET_TRIS_F() BS = 7 TIPU Gi piscreras [JNPUT0Q __[ourpur_sir() [ouTPUT_KQ)_[Set_TRIS_G)) INPUT_E() —_ [OUTPUT_C()__[ OUTPUTLOWG | SET_TRIS_HO) : OUTPUT_T0- INPUTR() — {OUTPUT_DQ) | Corer) SET_TRIS_() J OUTPUT_DRI- [PORT_A_PU- mPuTGO | vec) LLUPSO SET_TRIS_K() INPUTHO _[OuTPUT_EQ) | PORT_B_PULLUPSO) INPUT JQ) OUTPUT_F() | SET_TRIS_A() E/S PUERTO | PSP_INPUT_FULL() PSP_OVERFLOW() PARALELO. ; ESCLAVO _ | °SP-OUTPUT_FULL() SETUP_PSP() ()_[12C Slaveaddn() [12C ISR_STATEO wsBusKe [Rc PoLL() [| 12C START() BCREAD() [2c sToP() CLEAR INTE- [GOTO_ rac contro: [RRUPTQ | apprEss) _ | RESET-CPUO PROCESOS | DISABLE_!! INTERRUPT_ I reurig) [Acne RESTART_CAUSE() 2. Compilador CCS C ENABLE_IN- SETUP_OSCILLATOR( ) a TERRUPIS() [JUMP_TOISR procesos [EXTNT [TARE Ts nung) GETENV() READ_BANK() | WRITE_BANK() BIT_CLEAR() | MAKES() _MUL() SHIFT_LEFT() ee aoe BIT_SET() MAKE16() eos Hee ) BIT_TEST() MAKE32() nee SWAP() ABS() ‘COSH() TLABS(), SING) Selec aaa ACOS() DIV) LDEXP() SINH() ASIN) EXP() DIVO), SQRT() ATAN() | FABS(), LOG() TAN() ATAN2() FLOOR) LOGI) TANHO, CESTANDAR CEN, FMOD() MODK(), COS() FREXP() POW) pee SETUP_VREK() | SETUP_LOW_VOLT_DETECT() ‘AID CONVER- | SET_ADC_CHANNEL() SETUP_ADC_PORTS() SION SETUP_ADC() | READ_ADC() ATOF() ISLOWER(char) | STRCMP( ) oT STRRCHR() ATOK ) ISPRINT(x) STRCOLL() STRSPN() ATOIS2() ISPUNCT(x) STRCPY() STRSTR() ISSPACE(char) OLY) STRCSPN()__[ STRTOD() CARACTERES [ISALNUMQ)_[ISUPPER(char)_[STRLEN() STRTOK() CESTANDAR | ISALPHA(char) | ISXDIGIT(char) | STRLWR() STRTOL() ISAMOUNG() [ITOA() STRNCAT() _[STRTOUL() ISCNTRL(x)__| SPRINTF() STRNCMP() _[ STRXFRM() IsDIGIT(char) _[STRCAT() STRNCPY() | TOLOWER() ISGRAPH(x) _[ STRCHR() STRPBRK() _| TOUPPER() GET_TIMER() [SET_RTCC() _[SETUP_TIMER_0() overs — LCETTIMERI() | SET_TIMERO() | SETUP_TIMER.1() GET_TIMER2() | SET_TIMERI()_[SETUP_TIMER 2() GET_TIMER3() | SET_TIMER2()_| SETUP_TIMER_3 () 4 Compilador € CCS y Simulador PROTEUS para Microcontroladores PIC GET_TIMER4() | SET_TIMER3()_[ SETUP_TIMER 4() ER5() IMER4() | SETUP_TIMER 5() ‘TIMERS (GET_TIMERx() | SET_TIMERS()_[ SETUP_WDT() RESTART_WDT() SETUP_COUNTERS() CALLOC() __[MEMCMP() _| OFFSETOFBIT() FREE() MEMCPY() REALLOC() perience LONGJMP() | MEMMOVE() _| SETIMP() MALLOC() _| MEMSET() MEMCHR() _ | OFFSETOF() STRXFRM() _|MEMCHR() [| MEMCMP() STRCAT() ‘STRCHR() STRCMP() STRCOLL() —_[STRCSPN() | STRICMP() cADENAS [STRCOLL() | STRCSPN(Q) | STRICMP() ESTANDAR [STRLEN() STRLWR() STRNCAT() STRNCMP() _|STRNCPY() __ | STRPBRK() STRRCHR() _ | STRSPN() ‘STRSTR() STANDARD STRING FUNCTION() SET_POWER_PWM_OVERRIDE() | SETUP_CCP2() SET_POWER_PWMX_DUTY() _| SETUP_CCP3() SET_PWM1_DUTY() SETUP_CCP4() Moputo [SET_PWM2_DUTY() SETUP_CCP5() ccP SET_PWM3_DUTY() SETUP_CCP6( ) SET_PWM4 DUTY() SETUP_POWER_PWM() SET_PWM5_DUTY() SETUP_POWER_PWM_PINS() SETUP_CCPI() ERASE_PROGRAM_EEPROM() _| SETUP_EXTERNAL_MEMORY() READ_CALIBRATION() eter SSE EEPROM | READ_EEPROM() WRITE_EEPROM() INTERNA READ_EXTERNAL_MEMORY()_| WRITE EXTERNAL MEMORY() READ_PROGRAM_FEPROM() _ | WRITE PROGRAM _EEPROM() READ_PROGRAM_MEMORY() _| WRITE_PROGRAM_MEMORY() cereus BSEARCH() | RAND() SRAND() QSORT() RETARDOS | DELAY_CYCLES() DELAY_US() _ [| DELAY_MS() 42 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC + .PJT: fichero de proyecto; contiene toda la informacién relacionada con el pro- yecto. + .LST: muesira un listado con el cédigo C y el cédigo ensamblador asociado para cada linea de cédigo. + .SYM: muestra las posiciones y valores de los registros y las variables del pro- grama. * STA: muestra una estadistica de la utilizacion de la RAM, ROM y la PILA. + .TRE: muestra un arbol del programa donde se especifican las funciones y sus Iamadas, con la ROM y RAM usada en cada una de ellas. + HEX: * .COF: fichero binario que incluye el cédigo maquina y la informacién para la depuracién correspondiente. ichero estindar para la programacién del PIC. 2.12.2 Entorno de trabajo Elentorno de trabajo del CCS en PCW y PCWH permite compilar y también sumi- nistra una gran variedad de herramientas auxiliares. En la figura 2 se muestra los distintos elementos basicos del entorno de trabajo. Existen dos formas de iniciar una sesién: abriendo un fichero de cédigo fuente o creando un proyecto. Barra de estandar ZONA DE CODIGO Barra de informacién Figura 2. Entorno de Trabajo 2. Compilador CCS C Para abrir un fichero fuente directamente se realiza una pulsacién sobre el icono para el manejo de ficheros (figura 3) y aparece un menu donde podemos crear, abrir, guardar o cerrar ficheros. Con el comando NEW podemos crear un fichero fuente, un proyecto, un fichero RTF o un fichero de diagrama de flujo. Figura 3. Los menus para el manejo de los ficheros Con la opcién NEW > SOURCE FILE, el programa pide el nombre del nuevo fichero y crea una nueva ventana en blanco donde podemos empezar a escribir (Figura 4). SSeS Figura 4. Fichero fuente nuevo Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Si se ejecuta el comando PROJECT WIZARD, tras pedir el nombre del nuevo pro- yecto aparece la ventana de configuracién con dos pestafias, una para configurar las distintas opciones que se muestran en la barra de la izquierda (figura 5) y otra donde se muestra el codigo resultante de la configuraci6n (figura 6). Recorriendo las distintas opciones (general, communications, etc.) se llega a obtener el cédigo de configuracién deseado (figura 7), tras lo cual ya podemos empezar a escribir el resto del cOdigo del programa. Debemos observar como se incluye un fichero de cabecera *k donde se encuentra la configuracién del dispositivo (figura 8). iPomieiee fein mcaintng Figura 6. Ventana de configuracion con el cédigo resultante 2. Compilador CCS C setup_ade_ports AND) setup_ade (ADC CLOCK_INTERHAL setup_spi (FALSE) setup_timer_0 RTCC_INTERNAL| RTCC_DIV_1 setup timer i Ti DISABLED setup_timer2 T2_DISABLED.0. + cédigo después de una configuracion $5252 bats parte 8 omit-PaL¢6, cov PDT bite’ Figura 8. El fichero de cabecera con la configuracion del PIC 2.12.2.1 El primer programa La opcién del PROJECT WIZARD es muy comoda pero para comenzar a trabajar con CCS C, se recomienda iniciar los ficheros de cédigo fuente directamente hasta que el programador adquiera los conocimientos basicos para manejar esta opcién. Asi pues abrimos un fichero fuente nuevo donde se escribiré un programa para en- cender y apagar un led durante 1 segundo. El led se conectaré a la patilla RB7 de un PICI6F876 trabajando a una frecuencia de 4 MHz. En los siguientes temas se iran explicando cada una de las sentencias utilizadas, ahora lo interesante es manejar el entorno de trabajo y no tanto lo que hace cada sentencia. Lo primero es utilizar el fichero de cabecera donde se especifican las caracteristicas del microcontrolador PIC: 47 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Este fichero lo suministra CCS y lo incorpora en el directorio de dispositivos (devi- ces). El compilador tiene una ruta de busqueda para los ficheros #include; esta ruta se puede modificar en el caso de querer incluir ficheros que se encuentren en otros directorios. Con el comando OPTIONS > PROJECTS OPTIONS > INCLUDE FILES se accede a una ventana (figura 9) donde se puede afiadir, eliminar 0 mo- dificar el orden de busqueda de los ficheros #include (también podemos observar que se pueden configurar los ficheros de trabajo -FILES- 0 los ficheros de salida OUTPUT FILES-). Figura 9, Ruta de busqueda de los ficheros #include A continuacién se definen, mediante las correspondientes directivas, la velocidad del PIC y el puerto utilizado. Es importante definir la velocidad inmediatamente después del PIC ya que muchos drivers (como el LCD) la necesitan para configu- rarse. fuse delay (clock = 4000000) # byte puerto_b = 0x06 Ahora se puede describir la funcién principal MAIN (). Los cambios de color, letra, etc. se puede configurar desde la opcion OPTIONS > EDITOR PROPERTIES... Al escribir el programa (figura 10) podemos observar como aparece un Arbol de funciones a la izquierda de la ventana de programa; esto permite expandir o con- traer las funciones y declaraciones de control para optimizar la visualizacién de los programas més complejos (figura 11). 48 2. Compitador CCS C set_teie p00 puerto» eiay_e@ 1000 bit_see puerto b, aetay_me i000 bit_clear puerto» ‘ens e (TRUE Figura 10. El programa a £876 & a @elay clock » 00905: | 4)) soce puertop 5) 6 | void mainivoid set_tria bp) 00 puezeo Bo ao Figura 11. Contrayendo el arbot Enel editor de texto se puede pulsar el botdn derecho sobre cualquier linea (figura 12); en el caso de los ficheros #include permite abrirlos en una pestafa adicional. Figura 12. Las opciones det botén derecho 49 Compilador C CCS y Simulador PROTEUS para Microcontri Como ayuda para escribir el programa, CCS ofrece el comando VIEW (figura 13) que permite visualizar las interrupciones (Valid Interrupts), fusibles de configura- cién (Valid Fuses), hojas de caracteristicas (Data Sheet) y una ventana completa don- de se describe el PIC (Device Table Editor) mediante distintas pestafas (esta opcién también es accesible desde la opcién TOOLS > DEVICE EDITOR (ver figura 15). me a ce ef ne ‘tanga: Figura 13. Comando VIEW Se puede proceder a la compilacién, que se puede hacer con el comando COMPILE > COMPILE 0 directamente con la tecla de funcién . Durante la compilacién aparece una ventana donde se informa del proceso de compilacién y si hay errores (figura 14). Tras la compilacién aparece una ventana con los mensajes de error si los. hubiese o el porcentaje de utilizacién de la memoria RAM y ROM sila compilacion ha sido correcta (figura 15). jATENCION! Si se escribe un fichero fuente y a continuacién se abre 0 se crea un segundo fichero fuente, al compilar este ultimo se compilara el primero. Siempre se compila siempre el PRIMER fichero abierto. 2. Compilador CCS C Complete Notas s . Files 2, Stotements: 8, Times t Sec. Lines: 266 ‘Output tes: ERR MEX SYM LST COF PST TRE STA Figura 14, Ventana de compilacion Figura 15. Mensajes de compilacion Tras la compilacion se obtiene, entre otros, el fichero HEX para programar 0 si- mular el PIC. En OPTIONS > PROJECT OPTIONS > OQUPUT FILES, se pueden configurar los ficheros de salida (figura 16). Figura 16. Ficheros de salida 51 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC En Ja parte izquierda del fichero fuente aparecen unas ventanas auxiliares (Identi- jfiers, Projects, Files) en las que se pueden observar la estructura de fichero del pro- grama compilado (figura 17). Haciendo una pulsacién en cualquiera de ellos se abre una pestafia con su contenido, Figura 17. Ventana auxiliar para ficheros En la barra estindar -figura 18- (para activarla: OPTIONS > TOOLBAR... > TOOLBARS, figura 19), también aparecen distintos comandos entre los que se en- cuentran la visualizacion de los ficheros de salida. Figura 19. Activacion barras de herramientas 52 2. Compilador CCS C Hay un fichero de salida especialmente util para la simulacidn con el PROTEUS VSM, se trata del fichero RAM SYMBOL MAP (*SYM) donde aparecen todas las variables de la memoria RAM y sus correspondientes direcciones. Por ejemplo, si en un programa existe una variable FLOAT llamada TEMP, se puede consultar su direccién a través de este fichero (figura 20) para utilizarla en el WATCH del PRO- TEUS (figura 21 y figura 22). 933, init. 893-036 @ITOF P41 033 MAIN-@sCRaTCH 034-097 GPRINTF L320 208FPI Figura 21. Configuracion del WATCH en el PROTEUS Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC None Agdcess Value matic 25.4507 Figura 22. Ventana de WATCH con la variable 54 3, La gestién de los puertos Capitulo 3 La gestion de los puertos 3.1 Introduccién Los microcontroladores PIC tienen terminales de entrada/salida divididos en puer- tos, que se encuentran nombrados alfabéticamente A, B, C, D, etc. Cada puerto pue- de tener hasta § terminales que, de forma basica, se comportan como una entrada/ salida digital. Segiin las caracteristicas del PIC, cada puerto puede tener, ademas, asignado un bloque funcional: convertidor AD, USART, 12C, ete. Por ejemplo, en la familia PICI6F87X (figura 1), pueden llegar hasta 5 puertos en el PIC16F877 donde se pueden encontrar bloques de TIMERS, CCP, MSSP, USART, PSP y convertidores AD. Caracteritiens PICISRTS | PICTOFaT’ | PICIGTRT® | PICIGRIT ‘Gama Media _ a EE Frecuencia de tsbajo Deas | De-2oMNe DERM | DERM eset delays) POR.BOR | FOR,HOR PORBOR | PORHOR qewrrosn | @wer.osrn _| ewkr,ost)_| @ewRT.osT) ‘Memaria de Programa FLASH | 4K aK aK aK palabras de L4bits) I | ‘Mematia Datos (ote) co TE 3a 36 ‘Memoria Datos EEPROM | 138 18 356 a a is Porm ABC Tome a ne x 2 z z [ MSSRUSART _(MSSR.USART | MSSPUSART. [psp SCANALES —NCANALES | SCARALES Figura 1. Caracteristicas de la familia PICIGF87X Considerando a los puertos como entradas/salidas digitales, los puertos se carac- terizan por ser independientes, es decir, se puede programar cada terminal del puerto para que se comporte como una entrada o una salida digital (figura 2). La Compilador C CCS y Simulador PROTEUS para Microcoatrotadores PIC habilitacién como entrada o salida se realiza a través del registro TRISx (TRISA: 85h, TRISB: 86h, TRISC: 87h, TRISD: 88h 0 TRISE: 89h en el BANCO 1 de la memo- ria RAM). NOTA Un valor 0 en estos registros indica que el terminal correspondiente del puerto es de salida, mientras que un valor 1 indica que seré de entrada La gestion del bus de datos se realiza a través de los registros PORTx (PORTA: 05h, PORTB: 06h, PORTC: 07h, PORTD: 08h 0 PORTE: 09h en el BANCO 0 de la memoria RAM). TERMINAL BUS DATOS Oo ESORITURA DATOS ESORITURA TRIESTADO —] LECTURA DATOS Figura 2. Estructura basica de un terminal ‘También existen algunos terminales que poseen unas caracteristicas especiales, por ejemplo: * Enel puerto A, el terminal RA4 tiene salida en drenador abierto lo que obliga a utilizar una resistencia de pull-up en el caso de funcionar como salida. Este terminal tiene entrada en trigger-schmitt lo que permite su utilizacién como entrada de contador de eventos externos en conjuncién con un modulo tem- porizador (TIMER). * En el puerto B, los terminales tienen una resistencia de pull-up interna que se puede habilitar a través del bit RBPU del registro OPTION_REG (81h, 181h). Si dicho bit es 1, todas las resistencias de pull-up estardn deshabilitadas, si es un 0 estarén habilitadas sdlo en el caso de que el terminal funcione como en- trada (figura 3). 56 3. La gestién de los puertos Figura 3. Registro OPTION_REG Bit 7; RPBU: Habilita las resistencias de pull-up. I-Las deshabilita. OeLas habilita todas. Las caracteristicas eléctricas de los puertos delimitan su utilizacién para manejar cargas de forma directa. "Maxima corriente de salida a nivel alto por el puerto A ‘Maxima corriente de salida a nivel bajo por el puerto A. ‘Maxima corriente de salida a nivel alto por el puerto B Maxitna corriente de salida a nivel bajo por el puerto B Figura 4. Caracteristicas eléctricas de los puertos de un PIC16F84 Estos niveles de tensién permiten trabajar con cargas de bajo consumo como leds, displays de 7 segmentos 0 LCD, pero para activar cargas de mayor consumo es ne- cesaria la utilizacién de transistores. 3.2 Gestion de puertos en C En lenguaje C se pueden gestionar los puertos de dos formas: * Se declaran los registros TRISX y PORTX definiendo su posicién en la memo- tia RAM como variables de C. * Utilizando las directivas especificas del compilador (#USE FAST_IO, #USE FIXED_IO, #USE STANDARD_IO). 3.2.1 A través de la RAM Se definen los registros PORTx y TRISx como bytes y se sitian en la posicién co- rrespondiente de la memoria RAM. La directiva utilizada de C es #BYTE: #BYTE variable=constante; #AYTE TRISA = 0x85 // Variable TRISA en 85h. #evTe PORTA = 0x05 // Variable PORTA en 05h. #BYTE TRISB ~ 0x86 // Variable TRISB en 86h. 57 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC #BYTE PORTS = 0x06 // Variable PORT en 06h, #BYTE TRISC = 0x87 Uf Variable TRISC en 87h #BYTE PORTC = 0x07 // Variable poRTC en 07n. Una vez definidas estas variables se pueden configurar y controlar los puertos a través de los comandos de asignacién. RISA = OXEE; // @ terminales de entrada RISB = 0x00; // 8 terminales de salida RISC = Ox0F; // 4 terminales de mayor peso de salida, 4 terminales de // menor poso do entrada Escritura en los puertos: PoRTC = Ox0a; // salida det datos 00001010 por 61 puerto C Lectura de puertos: valor = PORTA, [7 awigna ol dato del puerto Aa 1a variable valor Manejo de sentencias: TRISO-Ox0F; (PORTO & OxOF) PORTD Oxadz // comprucbs ‘Ios 4 terminales de // menor peso del puerto D y si son ¢/ 1111 saca por los 4 terminales de // mayor peso el dato 1010. Existen unas funciones de C que permiten trabajar bit a bit con los registros 0 varia- bles definidas previamente. Estas funciones son las siguientes: bit_clear (var,bit); /{ Pone a 0 el bit especifico (0 a 7) de la variable. bit set (var , bit); // Pone a 1 el bit especifico (01a 7) de la variable. bit_test (var, bit); _// Muestra el bit especifico (0 a 7) de la variable. swap (var); i] Intercambia los 4 bits de mayor peso por los 4 de // menor peso de la variable bit_set (PORTO, 4); // “saca* un i por el terminal RCO if (bit test (PORTB,O)—-1) bit clear(PORTS,1); //si RBO es 1 borra RBI Se puede declarar un bit de un registro con una variable mediante la directiva #BIT, lo que permite trabajar directamente con el terminal: #BIT nombre = posicién.bit #BIT RBA = 0406.4 // PORTA=OXO6 RB4 = 0; La gestion de los puertos Ejemplo 1: Se configuran los terminales RB1 como salida y el RBO como entrada (con resistencia de pull-up). La salida debe tener el mismo valor que la entrada. Se utiliza un interruptor en la entrada y un Jed en la salida (figura 5). Componentes ISIS: PIC16F876, RES, LED-BLUE y SW-SPST-MOM. Figura 5. Elesquema del ejemplo 1 #include <16F876.n> #uses XP, NONDT #use delay( clock = 4900000 ) J Reloj de 4 Miz favre TRIse = 0x06 // TRISB en 86h. farTe PORTE = 0x06 // PORTE en 06h. #BYTE OPTION REG = Oxti // OPTION_REG en 81h. void main() { bit_clear(OPtION_REG,7); _// Habilitacién Pull-up bit_sot (TRTSB,0); // 80 como entrada bit clear (7RISB/1) 7 // 93 como salida bit_clear (PORTE, 1) ¢ // Bpaga el 18D while (2) { 4f (bit_test (portb,0) = 1) // Si RBO es 1, apaga el LED bit_clear (portb,1) 7 else bit_set (portb,1); Y/ Si RBO = 0, enciende e1 LED Figura 6. El programa del ejemplo 1 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC 3.2.2 A través de las directivas El compilador ofrece funciones predefinidas para trabajar con los puertos. Estas funciones son: output_X (valor); // Por el puerto correspondiente saca el valor (()-255). input_XQ; // Se obtiene el valor en el puerto correspondiente. set_tris_X(valor); /( Carga el registro TRISx con el valor (0-255). port_b_pullups (valor); // Mediante valor = TRUE 0 valor = FALSE habilita // 0 deshabilita las resistencias de pull-up en PORTB. get_trisX() // Devuelve el valor del registro TRISx Donde la X es la inicial del puerto correspondiente (A, B, C,...). A (Ox! ica por el pu mput_B() 7 $0 (0x08) ; Existen una serie de funciones asociadas a un terminal o pin*. El parametro pin* se define en un fichero include (por ejemplo, 16F876.h) con un formato del tipo PIN_Xn, donde X es el puerto y nes el ntimero de pin. #define PIN_AO 40 #define PIN_A141 Las funciones son: output_low (pin*); if Pina. output_high (pin*); / Pinal. output_bit (pin* , valor); // Pin al valor especificado. output _toggle(pin*); // Complementa el valor del pin. output_float (pin*); /] Pin de entrada, quedando a tensién flotante... // (simula salida en drenador abierto) input_state(pin*); // Lee el valor del pin sin cambiar el sentido del // terminal. input(pin*); // Lee el valor del pin. Las funciones output_x0 e input_x0 dependen de la directiva tipo #USE *_1O que esté activa. Directivas: #USE FAST_IO (PUERTO) [PUERTO: A...] Con la funcién outpui_x() se saca el valor al puerto y con la funcién input_x() se lee el puerto. La directiva no modifica previamente el registro TRIS correspondiente 3. La gestion de los puertos Hay que asegurarse de que los registros TRIS estan correctamente definidos. En- tonces, el ejemplo 1 quedaria: #include <16F676.h> fetuses XP, NOwDT fuse delay( clock = 4000000 ) Hove Fast in(3) € void main() ( port_b pullups (TRUE); sortie 8(0x01) 7 output_tow(PIN Bt); mite (1) t 4 (input (PIN_BO) = 7) output_low/PIN Bt) + elee output_high (PIW_B1) , ) #USE STANDARD_IO (PUERTO) [PUERTO: A...] Con la funcién output_x() el compilador se asegura de que el terminal, o terminales correspondientes, sean de salida mediante la modificacién del TRIS correspondien- te. Con la funcién input_x() ocurre lo mismo pero asegurando el terminal (termina- les) como entrada. Es la directiva por defecto. Entonces, el ejemplo 1 quedaria: #include <16F876.h> #fuses XT,NowDT fuse delay( clock = 4000000 ) fuse standard _io(B) void main() { port_b_pullups (TRUE); output_low(PIN_B1); while (1) t 4f (input (PIN_BO) == 1) output _low (PIN_B1) else output. high (PIN_81)+ } : #USE FIXED_IO (PUERTO_OUTPUTS=pin*, ...) [PUERTO: A...] El compilador se encarga de generar el cédigo para definir los puertos de acuerdo con la informacién que indica la directiva (donde sélo se indican los terminales de 61 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC salida), sin tener en cuenta si la operacién es de entrada o de salida. Entonces, el ejemplo 1 quedaria: finclude <16F876.h> #fuses XT, NOWDT Huse delay( clock = 4000000 ) fuse fixed_i0(b_outpute=pin_b1) void main’) ( port_b pullups (RUE) + output_low(PIH_B1) > while (1) qi ix (input (2101_20) output_tow (PIN B1) 7 else output_high (Pnv_Bt) s a0 3.2.3 Con punteros En C se puede acceder a la memoria de datos mediante punteros. Los punteros se deben definir como INT: #define TRISA (int*) 0x85 #define PORTA (int*) 0x05 El registro es manejado mediante la utilizacién del operando *: int valor valor ~ ‘porta Los terminales se pueden leer o escribir utilizando operadores légicos: | spores = 0800000002 1) AO = 1 | sporta ¢= 0611111101; 17 BaD = 0 1 (tporta © 0600000001) Hi tee ol wales ae a0 Entonces, el ejemplo 1 quedaria: #include <16F876.h> #Euses x7,NOOT #use delay! clock = 4000000 ) fdefine TRISB (int*) 0x86 <— fdefine PORTE (int*) 0x06 <— fidetine OPTTON (int*) 0x81 — 3. La gestion de los puertos void maint) { stoped 0b01121112; // Fone a 0 el bit 7 del OPTION_REG // (pull-up habilitado) *eriob = Ox01s 0 entrada, RBI salida *porth = 0x00; // Apaga el LED while (1) ‘ if (*porth & 0x01 } // bee el RBO y si es 1.. *portb=0x00; // Bpaga el ED (RBI ~ 0) *portb=0x02; // Si es 0 enciende e1 LED (RBI = 1) } Ejemplo 2: Realizar un contador de 0 a 99 con un doble display de 7 segmentos de cétodo comin. La cuenta debe ser continua y de 0.a9 el digito de las decenas debe estar apagado. Componentes ISIS: PICI6F876, RX8 y 7SEG-MPX2-CA-BLUE. Figura 7. El esquema del ejemplo 2 include <16F876.5> #usE DeLay (clock = 4000000) #FUSES XT, NOWDT, NOPROTECT, NOPUT #USE fast_10 (B) HUSE fast_t0 (A) byte CONST DISPLAY[10] = (0x3£, 0x06, 085b, 0x4, 0X66, 0x6d, 0x74, 0x07, 0x7£,0x60)7 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC deot+) udet) r B(DISPLAY[ud}) + delay_ms (50) 7 ££ (dec==0) output_a (0x03) ; decenas = 0, ‘/ cat_D = apagado else output_a(0x01); decenas > 0, ED = encendido OUTPUT_B (DISPLAY [dec]} ; // Digito decenas delay ms (50); // Para evitar parpadeos Figura 8. El programa del ejemplo 2 Los terminales de los dos displays son comunes por lo que el dato es comiin; para que aparezca el digito solo en las unidades, 0 s6lo en las decenas, se debe apagar el otro display mediante el terminal de catodo. Es decir, si se desea visualizar las unidades se pasa el cédigo “10” al display y si son las decenas se pasa el “01” (con un 1 el display esté apagado y con un 0 estd encendido). La alternancia entre los dos cdtodos debe ser tan répida que el ojo no se de cuenta del parpadeo. En el caso que las decenas sean cero, su display se apagara. CONST DISPLAY{10] = {0x3£,0x06,0x5b,0x4£,0x66,0x6d,0x7d,0x07,0x7£,0x6f} permi- te visualizar de 0 a 9 mediante la combinacién de digitos tipica de los displays de 7 segmentos (figura 9). Por ejemplo, en el Ose encienden a, b, ¢, d, e y f, lo que signi- fica 111111, 0x3F en hexadecimal. Figura 9. Los 7 segmentos del display 3. La gestion de los puertos 3.3 Entradas y salidas 3.3.1 LCD Se acostumbran ha utilizar LCD del tipo HD 44780, con un mimero de lineas varia- ble y un niimero de caracteres por linea también variable (por ejemplo, con 2 x 16 se trabaja con dos lineas de 16 caracteres cada una) (ver figura 10). TCD con driver HO44760 © 13-06 44-7 (dato ms) Figura 10. El patillaje de un LCD tipico El bus de datos es de 8 bits, aunque también existe la posibilidad de trabajar con 4 bits (con un menor niimero de caracteres). El compilador C incluye un fichero (dri- ver) que permite trabajar con un LCD. El archivo es LCD.Cy debe llamarse como un include. Este archivo dispone de varias funciones ya definidas: Ied_init 0; Es la primera funcién que debe ser llamada Borra el LCD y lo configura en el formato de 4 bits, con dos Iineas y con caracteres de 5x 8 puntos, en modo encendido, cursor apagado y sin parpadeo. Configura el LCD con un autoincremento del puntero de direcciones y sin despla- zamiento del display real. Jed_gotoxy (byte x, byte y); Indica la posicién de acceso al LCD, Por ejemplo, (1,1) indica la primera posicién de la primera linea y (1,2) indica la primera posicién de la segunda linea. led_gete (byte x , byte y); Lee el cardcter de la posicién (x,y). Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC led_pute (char s); Ses una variable de tipo char. Esta funcién escribe la variable en la posicién corres- pondiente. Si, ademas, se indica: \fse limpia el LCD. \n el cursor va a la posicién (1,2). \b el cursor retrocede una posicién. El compilador de C ofrece una funcién mas versatil para trabajar con el LCD: printf (string) printf (cstring, values.. printf (fname, cstring, values...) String es una cadena o un array de caracteres, values es una lista de variables sepa- radas por comas y fname es una funcién. El formato es “ont, donde n es opcional y puede ser: 1-9: para especificar cuantos caracteres se deben especificar 01-09: para indicar la cantidad de ceros a la izquierda. 1.1-9.9 para coma flotante. t puede indicar: c Caracter. s Cadena 0 caracter. u Entero sin signo. d- Enero con signo. Lu Entero largo sin signo. Id _ Entero largo con signo. x Entero Hexadecimal (mintisculas), X __ Entero Hexadecimal (maytisculas). Lx Entero largo Hexadecimal (mimisculas). IX _ Entero largo Hexadecimal (mayuisculas). f Flotante con truncado. 8 Flotante con redondeo. e Flotante en formato exponencial. w _ Entero sin signo con decimales insertados. La 1* cifra indica el total, la 2? el numero de decimales. 3, La gestién de los puertos A continuacién, mostramos unos ejemplos de los distintos formatos: Ahora, mostramos una serie de ejemplos de aplicacién: byte xy,27 print£(*Hola") : printf (*Valor=>¥2x\n\r",get_rtce())+ prints ("$2u 8X $4x\2\r~/x,y,2)7 print£(ICD_POTC, *n=8u",n) + El driver LCD.C esta pensado para trabajar con el PORTD o el PORTS. Por defecto, utiliza el PORTD a menos que le indiquemos lo contrario mediante: #define use_portb_led TRUE,, se comenta o descomentatal como se indica en la figura 11. Por defecto, este driver usa siete terminales para la comunicacién entre el LCD y el PIC. Enla figura 11 se observa parte del fichero LCD.C donde se encuentran defini- das las conexiones utilizadas y la posibilidad de cambiar de puerto. // As delined in the following structure the pin connection is as follows: 4/20. enable “Dt xe ft D2 mw f4 Dh BM Mo 2S 2S Jt 06 D6 fi BT D7 aw // LCD pins DO-D3 are not used and PIC D3 is not used. // Un-comment the following define to use port B // #define use_porth led TRUE Figura 11. Extracto del fichero LCD.C 67 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Se puede trabajar con otros puertos, por ejemplo el PORTC, modificando el fichero LCD.C. En la figura 12 se muestra parte del fichero LCD.C donde se definen los puertos de trabajo (el D 0 el B); modificando estas sentencias se puede trabajar con otro puerto (A, C, etc,). PORTS”) // This puts the entire structure over Pdetine set_tr. felse Plocate Icd = geteny(*sfz:PORTD”) ‘his puts the entire structure over the port Fdefine set_ gendif Figura 12. Extracto del fichero LCD.C Ejemplo 3: Realizar un ment de control mediante un pulsador. El programa debe mostrar un menti de 3 funciones. Mediante el pulsador se debe seleccionar uno de los 3 elementos y con otro ejecutar la funcién (en este caso encender un lei). Dispo- nemos de los componentes ISIS: PICI6F876, RES, BUTTON y LMO16L. Figura 13. El esquema del ejemplo 3 #include <16F876.h> #fuses XT, NONDT fuse delay (clock- 4000900) #include fuse standard_i0(C) fuse standard io(a) enum funciones (med,cal,ini}; void modir (void) { //algeritme correspondiente output_toggle (pin CO) 7 i void calibrar(void)( U/algoritme correspondiente eutput_toggle(pin Cl); i oid inicializar (void) { /falgoritmo correspondiente gutput_toggie(pin_c2); ’ if run_func(int numfunc) j Pswitcn (numtunc) ¢ case med: medir() ; break; case cal: ealibrar(}; break; iniciatizar(); break; 3. La gestion de los puertos // asigna un valor a cada elenento Wf med = 9, cal = 1 thi = 2 // Functén de medir //Puncién de calibrar // Buncién de inicializer // Asignacién de 1a funcién a realizar // viene dada por la variable “iten” // Variables de Fun Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC char n_menus = 3; // Nimexo de functones // bit_set(PRISA, 0); Jod_init(); white (2) ¢ if (input (PIN_AO) == 1) [ // Detecta botén de seleccién itemt+s // $4 pulsa aumenta la variable delay_ms (300); // Para evitar rebotes ded pute ("6") } 4£ (item > (nmenus-1)) ( // 1a variable supera el niinero de... item = 0; } // funciones 1a inicializa switch (item) [ case 0? ted_gotoxy (1,1) 7 printf(led_putc, “MEDIR“); led_gotoxy (1,1) ¢ break; printf (led_putc, “CALIBRAR”); led_gatoxy (1,1) 7 break+ case 2: printf (led_pute, “INICT led_gotoxy (1,1) 7 breaks TZAR") (input (PIN, ~~.) // Si se pulsa el botén de seleccisn... {detay ms (200) + run_fune(itea) 7} // se llama a la funcién correspondiente Figura 14. El programa del ejemplo 3 3.3.2 LCD grafico Se puede utilizar un LCD grafico con una controladora KS0108 (como el de la figura 15), por ejemplo la ASI-A-1286AS-L]-EWS/W de la casa ALL SHORE INDUSTRIES. 70 3. La gestion de los puertos: Figura 15. LCD grafico con controladora KSO108. La distribucién de patillas es la siguiente: VSS: masa. VDD: alimentacién. Vo: tensién de contraste. Dil: entrada de datos/entrada de cédigos de instrucci6n. RW: lectura/escritura. E:enable. DBO..DB7: datos de entrada. CS1.,CS2: chip select RST: reset. El compilador C suministra varios drivers para este tipo de LCD graficos, el GLCD.C, GRAPHICS.C 0, el mas especifico, HDM64G512.C. La conexién definida en estos ficheros es la siguiente: MUU mt wy JULLCD Pin connections: mt 1 (These can be changed as needed in the following defines). Il// JI VSS is connected to GND Mit WL VDD is connected to+5V ah Wl VO -LCD operating vottage (Constrast adjustment) / JU. DIL- Data or Instruction és connected to B2 mt WHI RIW - Read or Write is connected to B4 wh Wil Enable is connected to B5 wh Hit Data Bus 0 to 7 is connected to port d MY n Compilador C CCS y Simulador PROTEUS para Microcontrotadores PIC Hil Chip Select 1 is connected to BO Mi Hill Chip Select 2 is connected to B1 Mi /MIl. Reset is connected to CO MW M1 Negative voltage is also connected to the 20k Ohm POT i HH Positive voltage for LED backlight is connected to +5V I!) Ml Negavtive voltage for LED backlight is connected to GND//// Mi Wi LLL LEE Las funciones definidas son: ged_inittmode) Debe ser la primera funcién en invocarse. Enciende el LCD. gled_pixel(x,y,color) Establece el color del pixel. Puede activarse 0 desactivarse. gicd_fillScreen(color) Rellena el LCD de un color determinado. Puede activarse o desactivarse. gicd_update() Escribe en la RAM del LCD; sdlo es posible si esta definide FAST_GLCD. gled_line(x1, y1, x2, y2, color) Dibuja una linea desde el primer punto al segundo asignando color, el cual, a su vez, puede activarse o desactivarse. gled_rect(x1, y1, x2, y2, fill, color) Dibuja un rectingulo con un vértice en (x1, y1) y el otro en (x2, y2). Puede ser relle- nado o no y puede activarse un color ono. gled_bar(x1, y1, x2, y2, width, color) Dibuja una barra desde el primer punto al segundo; se puede definir el ntimero del rango de pixeles y puede activarse el color 0 no. gled_circle(x, y, radius, fill, color) Dibuja un circulo con centro en (x, y) y con el radio especificado; puede rellenarse ono y puede activarse el color o no. gled_text57(x, y, textptr, size, color) Escribe el texto empezando en (x, y); los caracteres son de 5 x 7 pixeles; se puede escalar el tamanio y puede activarse el color o no. Esta funcién envia los caracteres a la linea siguiente (se debe usar #define GLCD_WIDTH para definir el ancho de visualizacién). 72 3. La gestin de los puertos Ejemplo 4: Visualizar en un LCD el estado de las entradas del PUERTOA (ver figu- ra 16). Disponemos de los componentes ISIS: PICI6F877, RESPACK8, LGM12641- BSIR y SW-SPST-MOM. al an a y iuint we all Figura 16. El esquema del ejemplo 4 Hinelude <16F877.n> #£uses HS,NOWD?,NOPROTECT,NOLVP fuse delay (clock=20000000) Hinclade include fuse standard_io(a) void main() { CHAR AS[ j="85"; CHAR A4[ J="A4"? CHAR ASL J~"A3‘7 CHAR AZ j="A2"; cuaR All ]=“AI"; cuan AOL j="A0"s CHAR IN[ ]="PUERTO A”; gled_init (on): gled)text57(33, 30,A5, 1, 11+ glod_text57(49, 30,A4, 1, 1s gled_text57(65, 30,A3, 1, 1); gled_text5?(81, 30,A2, 1, 1); 73 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC gled_text57(97, 30,1, 1, 1)2 gled text57(113, 30,A0, 2, 17 gled_text57(30,5,1N, 2, 1)7 while (2){ if (input_state (PIN_AS) =-0) gled_rect (32,40,46,60,1,2)7 else gled_rect (32,40, 46,60,1,0) + gied_reat(32,40,46,60,0,1)7 Lf (input_state (PIN Ad) ==0) gled_rect (48, 40,62,60,1,1)¢ else gled_rect (48, 40,62, 60,1,0)¢ glod_rect (48, 40,62,60,0,1) ; if (input_state (PIN_A3)=-0) glcd_rect (64,40, 78,60,1,1)7 else gled_rect (64,40,78,60,1,0)+ glod_rect (64, 40,78, 60, 0,2) if (input_state(PIN_A2}==0) glcd_rect (80,40,94,60,1,1)+ else glod_rect (80, 40,94, 60,1,0) : gled_rect (80, 40,94, 60,0,1)+ if (input_state(PIN_Al)==0) gled_rect (96,40,110,60,1,1)¢ else gicd_rect (96, 40,110, 60,1, 0) + gled_rect (96,40,110,60,0,1)+ if (input_state (PIN_A0)==0) gled_rect (112, 40,126, 60,1,2); else gled_rect (112, 40,126, 60,1,0) 1 gled_rect (112, 40,126, 60,01); delay_ms (400) 7 } Figura 17. El programa correspondiente al ejemplo 4 4 3. La gestién de los puertos 3.3.3 Teclado (keypad 3x4) Las entradas a través de un pulsador son muy habituales en los sistemas con micro- controladores para trabajar con una mayor informacién o informacién alfanumérica. Por ejemplo, se utiliza los teclados matriciales de 1x4, 3x4.0 4x4 (ver figura 18). Nei eR Figura 18. Diferentes tipos de teclados matriciales El compilador de C incluye el driver KBD.C para manejar el teclado (3x4). Las fun- ciones que incorporan son las siguientes: kbd_init() Inicializa el sistema, debe ser la primera funcién en el programa. kbd_getcO) Devuelve el valor de la tecla pulsada en funcién de la tabla que tiene programada (ver figura 19). 77 Keypad layout: char const KEYS[4][3] = < Figura 19. La definicion de tecias en el archivo KBD.C A través de la modificacién de esta tabla podemos adecuar el resultado del progra- maa las distintas carétulas del teclado. El archivo KBD.C est pensado para trabajar con el PORTE o el PORTD (ver figura 20). Activando o no la linea #define use_portb_Ied TRUE podemos seleccionar el PORT (ver figura 21). 75 Compilador C CCS y Simulador PROTEUS para Microcontrotadores PIC anyt RenaiF endif iF deFined use_porto_kba derine set_tris kbd(yy"set_tris_b(x) teise igerine set_tris xnd(hy set_tris_a(x) endif Figura 20. La configuracién de puertos Figura 21. La seleecién del PORTE. Las conexiones vienen dadas en el fichero pero se pueden modificar: Werine COLO (1 <5) fidetine Cot (1 <« 6) doFine COL2 (4 << 7) SdeFine ROWB (1 << 1) ‘define ROW (4 << 2) define ROW2 (1 << 3) fideFine ROWS (1 << 4) a co} Ci) C2 RO Ri Figura 22. La asignacion de patilias 76 3.La gestion de los puertos Se puede trabajar con el LCD y el teclado a través de puertos separados 0 compar- tiendo el mismo puerto (con el ahorro de patillas que conileva) (ver figuras 23y 24). Compartir puerto suele conllevar problemas si se quiere trabajar con el teclado y Jas interrupciones RB4/RB7. bib Le bette Dee cl 8 tata Figura 24, EI LCD y el teciado compartiendo los mismos puertos Ejemplo 5: Introducir datos por el teclado y visualizarlos en el LCD. Cuando se pulsa la tecla “*” borrar el LCD (ver figura 24). Se dispone de los siguientes compo- nentes ISIS: PICI8F876, LMOI6L y KEYPAD-PHONE. Hinclude <16F876.h> #fuses XP, NODE, NOPROTECT,NOLVE fuse delay (ctock= 4000000) #include Hinclude #fuses XT,NONDT, NOPROTECT, NOLVP fuse delay (clock= 4000000) fuse standard_iofa) #include Hinclude Hinclude from 0x2100=('7",/2",'3") // Posicién 0,1 y 2 de 1a Reprom con ios datos. U/ 7:2, ¥ 3 respectivamente void main() { char k; int char datal3}, clave(3); // Matrices pare quardar clave y datos ed init 2 kbd_intt (7 port_b_pullups (TRUE) ; while (TRUE) { i=0; // posicién de 12 matriz printf(1cd_pute,”\fpulsar tecla 1\n"); // Para primer dato while (i<=2) { “/ Para tres datos keakbd_gete() 7 // tee el teclado 79 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC if (k!~0) /f Sie (datalil=ke // se guarda f(led_pute, “\f Figura 27.- Programa del Ejemplo 6 Ejemplo 7: Introducir los datos, a través de un teclado, de velocidad de un mo- tor y generar una sefial modulada en ancho de pulso proporcional al dato de la velocidad (figura 28). Se dispone de los siguientes componentes ISIS: PICI8F876, KEYPAD-PHONE, RES, 2SK1058, CELL y MOTOR. Figura 28. El esquema del ejemplo 7 3. La gestion de los puertos Se genera una sefial modulada en ancho de pulso PWM (sin utilizar el modulo CCP de los PIC) donde el semiperiodo de sefial a nivel alto esta fijado por el valor introducido en el teclado, Para ello, se utiliza un registro de 8 bits para fijar el semi- periodo a nivel alto (PWMH) y el semiperiodo a nivel bajo (PWML) (ver la figura 29). Como el valor maximo del registro es 259, este debe coincidir con el valor maximo del teclado, es decir 9; por lo tanto, la relacién entre el valor del teclado y el semiperiodo PWMH sera: PWMH= (255/9) x Tecla, aproximadamente PWMH=28*Tecla. PWMH PWM. J—»—| Figura 29. La modulacion PWM Seguin dicha ecuacién cuando el valor de teclado sea 0 la salida sera 0 de forma continua y el motor estar parado. Cuando el valor de teclado sea 9, el semiperiodo PWMH sera de 252 (no llega a 255) y el motor estara casi a toda marcha. El semipe- iodo a nivel bajo PWML. se obtiene de restar el PWMH a 255. Hinelude <16£876.h> fuses XP, NOWD?, NOPROTECT, NOLVE WISE osLAY (cLOce=4000000) #INCLUDS HUSE STANDARD_10 (a) VoD MAING) ‘ CHAR k,kant="0"; // k valor de teclado, k valor anterier de teciado char Pami=0,PmML=02 // Semiperiodo alto y bajo kbd_inic()s PORT_8_FUDLUPS (TRUS) ; WHILE (1) ¢ // Bucle infinito (siempre consulta el teclado) kekbd_gete(); // Iwe en ASCII el valor de 1a tecla pulsada if (ke=*\0") kekant; // Si no se pyisa tecla (\0) se usa // el valor anterior ££ (hear) |] (kan w)) Rates /f Si se pilsa * 0 # se asigna // wn vator cero. 81 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Figura 31. La serial obtenida para el valor 9 82 4. Las interrupciones y los temporizadores Capitulo 4 Las interrupciones y los temporizadores 4.1 Introduccién Las interrupciones permiten a cualquier suceso interior o exterior interrumpir la gjecucién del programa principal en cualquier momento. En el momento de pro- ducirse la interrupcién, el PIC ejecuta un salto a la rutina de atenci6n a la interrup- cién, previamente definida por el programador, donde se atenderé a la demanda de la interrupcién. Cuando se termina de ejecutar dicha rutina, el PIC retorna a la ejecucién del programa principal en la misma posicién de la memoria de programa donde se produjo la interrupcién. EI manejo de interrupciones permite realizar programas que no tienen que estar continuamente consultando sucesos internos 0 externos mediante técnicas de con- sulta o polling, las cuales provocan retardos o patadas en la ejecucidn del programa principal. Los TIMER o temporizadores son médulos integrados en el PIC que permite reali- zar cuentas tanto de eventos interns como externos. Cuando la cuenta es interna se habla de temporizacién y cuando la cuenta es externa se habla de contador. Los timers estén intimamente ligados al uso de las interrupciones, pero no por ello se utilizan siempre de forma conjunta. 4.2 Interrupciones Al producirse una interrupcién, el PIC salta automaticamente a la direccién del vector de interrupcién de la memoria de programa y ejecuta la porcién de progra- ‘ma, correspondiente a la atencién de la interrupcién, hasta encontrar la instruccion RETFIE. Al encontrar dicha instruccién, abandona la interrupcién y retorna a la 83 ulador PROTEUS para Microcontroladores PIC Compilador € CCS y posicién de memoria del programa principal desde la que salté al producirse la interrupcion. Las fuentes de interrupcién dependen del PIC utilizado. Por ejemplo, el PICI6F84 tiene 4 fuentes de interrupcidn y la familia PICI6F87X tiene entre 13 y 14. Los PIC de gama baja y media tienen un tinico vector de interrupcién situado en la direccidn 04h de programa (figura 1), mientras que los de gama alia tienen dos vectores de interrupcién de distinta prioridad, alta y baja, situados en la posicién 08h y 18h de la memoria de programa. Nivel deta Pa [Nivel 2d to Pita ‘Nivel 6 de ta Pte Figura 1. Memoria de programa [posicién del vector de interrupeién) ‘Al poseer un iinico vector de interrupcién (dos en la gama alta), el PIC posee unos registros de control donde mediante la utilizacion de banderas, o flags, el usuario puede determinar que es lo que ha producido la interrupcidn; ademas, en estos registros, se pueden habilitar o no las distintas fuentes de interrupci6n (mascaras de interrupcién) e, incluso, permite una habilitacién general. Cuando la habilitacién general esté activa y algunas, o todas, la particulares tam- bién lo estan, los flags se activan en el caso de producirse algunas de las interrup- ciones, de tal manera que el programador puede, mediante el testeo de dichos flags, actuar de la forma mas adecuada. 84 4. Las interrupciones y los temporizadores La faniilia PICI6F87X tiene hasta 14 fuentes de interrupcién. Posee un registro de control, INTCON (figura 2), que permite la habilitacién de interrupciones y el manejo de los flags. La habilitacién general se activa mediante el bit GIE (INTCON<7>), el cual es desactivado en el reset; por lo tanto, hay que habilitarlo por programa. Existen 4 registros adicionales para la gestidn de las interrupciones: PIR1, PIR2, PIE y PIE2. Cuando se responde a una interrupcién, el bit GIE es inhabilitado para evitar inte- rrupciones sucesivas. La direccién de retorno del programa principal se almacena ena pila y el contador de programa se carga con la direccién 0004h. Una vez en la rutina de atencién a la interrupcidn se puede determinar la fuente de la interrup- cién mediante el testeo de los diferentes flags. Los flags activos deben ser “borrados” antes de abandonar la rutina de interrupcidn para evitar reentradas erréneas. Registro ITCON (direcci6én RAM: OBh/8Bh/10Bh/18Bh] [PIC1GF87x] RW0 RW RW RWO RWO RW RW Figura 2. Registro INTCON bit7: _ GIE: Bit de habilitacisn global de las interrupciones. 1 = Habilita todas las interrupciones no enmascararbles. 0=Las deshabilita. bit6: PETE: Bit de habilitacién de las interrupciones de periféricos. 1 = Habilita todas las interrupciones no enmascarables de periféricos. 0=Las deshabilita bit5: TOIE: Bit de habilitacién de la interrupcién por desbordamiento del TMRO: 1 = Habilita la interrupcion del TMRO. 0=La deshabilita. bit4: _ INTE: Bit de habilitacién de la interrupcién externa RBO/INT. 1 = Habilita la interrupcién del RBO/INT. 0=La deshabilita. bit 3: RBIE: Bit de habilitacion de la interrupcién por cambio en el PORTB. 1 = Habilita la interrupcién del PORTB. 0 = La deshabilita. Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC bit2: TOIF: Bit de flag de la interrupcién del TMRO. 1 = El registro del TMRO se ha desbordado (debe borrarse por software). 0= El registro del TMRO no se ha desbordado. bit 1: INTF: Bit de flag de la interrupcién del RBO/INT. 1=Se ha producido una interrupcidn externa por RBO/INT (debe borrarse por software). 0 = No se ha producido la interrupcién. bit 0: RBIF: Bit de flag de la interrupcién por cambio en PORTB. 1=Al menos uno de los terminales RB7:RB4 ha cambiado de estado (debe borrarse por software). 0=No se ha producido cambio en dichas patillas. Registro PIE1 (direccion RAM: 8Ch] [PIC16F87x] RW0 RWO RW0 RW0 RWO RWO RW0 RW-O PSPIE COPtE TMRAIE Bit7 Bito Figura 3. Registro PIE bit7: _ PSPIE: Bit de habilitacién de interrupcién por lectura/escritura del puerto paralelo esclavo: 1 =Habilita la interrupcién por lectura/escritura del PSP. 0=La deshabilita. bit6: DIE: Bit de habilitacién de interrupcién por conversién A/D. 1 = Habilita la interrupcién. = La deshabilita. bt5: — RCIE: Bit de habilitacién de interrupcién por recepcién del USART. 1 = Habilita la interrupcién. 0=La deshabilita. bit4: ‘XIE: Bit de habilitacién de interrupcién por transmisién del USART. 1 = Habilita la interrupcién. 0= La deshabilita. bit 3: bit 2: | bit 1: bit 0: 4, Las interrupciones y los temporizadores SSPIE: Bit de habilitacién de interrupcion del puerto serie sincrono. 1 = Habilita la interrupeién. 0= La deshabilita. it de habilitacién de interrupcién del médulo CCP1. = Habilita la interrupcion. 0=La deshabilita. ‘TMR2IE: Bit de habilitacién de interrupcién por igualacién del TMR? y PR2. 1 = Habilita la interrupcién. 0= La deshabilita. TMRIIE: Bit de habilitacién de interrupcién por desbordamiento del TMRi. 1 = Habilita la interrupcién. 0=La deshabilita. CCPHE: Registro PIE2 (direcci6n RAM: 8Dh) [PIC16F87x] bit 7: bit 6: bit5: bit 4: bit 3: bit 2-1: bit 0: U0 RW-O uo RIW-0 U0 U0 RIW-0 RR cee [occ I corae Bit? Bito RW-0 Figura 4. Registro PIEZ No implementado. Se lee como 0. Reservado. No implementado. Se lee como 0. EEIE: Habilitacién de interrupcién por escritura en EEPROM. 1 = Habilita la interrupcion. 0 =La deshabilita. BCLIF: Flag de interrupcion por colisién en bus 1 = Colisidn en el bus $SP 0 I2C en modo master. 0=No hay colision. No implementados. Se len como 0. CCP2IE: Habilitaci6n de interrupcin del médulo CCP2. 1 = Habilita la interrupcién. 0=La deshabilita Co ilador C CCS y Sit Los registros PIR] y PIR2 contienen los flags de las distintas interrupciones. El com- pilador C se encarga de generar el cédigo necesario para leer y borrar dichos flags, tal y como podremos ver en el siguiente apartado. 4.2.1 Interrupciones en C En el compilador C, la directiva habitual en el manejo de las interrupciones #INT_xxxx. Especifica que la funcién que le sigue es una funcién de interrupciéi ademas, no necesita mas parametros. Las posibles directivas son las siguientes (en gris las posibles interrupciones en la familia PICI6F87X): Interrupciones _| Descripcién #INT_AD Conversién AD completa #INT_ADOF Conversién AD fuera de rango de tiempo. sINT_BUSCOL _ | Colisién de bus. #INT_BUTTON _ | Por botén (14000). SINT_CANERR _| Error enel modulo CAN. sINT_CANIRX __ | Mensaje invalido en el bus CAN. INT_CANRXO _| Bus CAN recibe un nuevo mensaje en buffer 0 SINT_CANRX1 _| Bus CAN recibe un nuevo mensaje en buffer 1. HINT_CANTX0 —_| Bus CAN trarsmisién completa en buffer 0. SINT_CANTX1 Bus CAN transmisién completa en buffer 1. #INT_CANTX2 Bus CAN transmisién completa en buffer 2. #INT_CANWAKE | Bus CAN evento de activacién o wake-up. #INT_CCP1 Unidad 1 de captura, comparacion y PWM. #INT_CCP2 Unidad 2 de captura, comparacién y PWM. #INT_CCP3 Unidad 3 de captura, comparacién y PWM. #INT_CCP4 Unidad 4 de captura, comparacién y PWM. #INT_CCP5 Unidad 5 de captura, comparacién y PWM. #INT_COMP Comparador. #INT_COMP1 Comparador 1. 4, Las interrupciones y los temporizadores: Interrupciones Descripeién #INT_COMP2 Comparador 2. #INT_CR Encriptaci6n finalizada. #INT_EEPROM _ | Escritura EEPROM finalizada. #INT_EXT Interrupcidn externa (RBO). #INT_EXT1 Interrupeién externa #1. #INT_EXT2 Interrupeién externa #2. #INT_EXT3 Interrupcidn externa #3. 4INT_2C Interrupeién 12C (14000). #INT_IC1 Entrada captura #1. #INT_IC2 Entrada captura #2. #INT_IC3 Entrada captura #3. #INT_LCD Actividad LCD. #INT_LOWVOLT | Detectado bajo voltae. #INT_LVD Detectado bajo voltaje. #INT_OSC_FAIL | Fallo en oscilador. #INT_OSCF Fallo en oscilador. #INT_PSP Dato de entrada en puerto paralelo. #INT_PWMTB _| Base de tiempo PWM. #INT_RA ‘Cambio de estado en A0-A5. #INT_RB Cambio de estado en B4-B7. #INT_RC Cambio de estado en C4-C7. #INT_RDA RS232 dato recibido. #INT_RDAO S232 dato recibido en buffer 0. #INT_RDA1 RS232 dato recibido en buffer 1. #INT_RDA2 RS232 dato recibido en buffer 2. #INT_RTCC Desbordamiento del Timer 0 (RTCO). #INT_PSP Escritura/lectura del puerto paralelo. 4. Las interrupciones y los temporizadores Interrupciones Descripcién Comparador 2. #INT_CR Encriptacién finalizada #INT_EEPROM Escritura EEPROM finalizada. #INT_EXT Interrupcién externa (RBO). #INT_EXT1 Interrupcién externa #1. #INT_EXT2 Interrupcién externa #2. #INT_EXT3 Interrupcién externa #3. #INT_12C Interrupeién 12C (14000) 4INT_ICL Entrada captura #1. vINT_IC2 Entrada captura #2. 4INT_IC3 Entrada captura #3. #INT_LCD Actividad LCD #INT_LOWVOLT | Detectado bajo voltaje. 4INT_LVD Detectado bajo voltaje. #INT_OSC_FAIL | Fallo en oscilador, #INT_OSCF Fallo en oscilador. +INT_PSP Dato de entrada en puerto paralelo. #INT_PWMTB Base de tiempo PWM. #INT_RA Cambio de estado en A0-A5. #INT_RB Cambio de estado en B4-B7. #INT_RC Cambio de estado en C4-C7. #INT_RDA RS232 dato recibido. #INT_RDAO RS232 dato recibido en buffer 0. #INT_RDA1 RS232 dato recibido en buffer 1. #INT_RDA2 RS232 dato recibido en buffer 2. #INT_RTCC Desbordamiento del Timer 0 (RTCC). #INT_PSP Escritura/lectura del puerto paralelo. Interrupciones | Descripcion #INT_SSP_ Actividad en SPI 0 12C. #INT_SSP2 Actividad en SPI 0 I2C Port 2. #INT_TBE RS232 buffer de transmisién vacio. #INT_TBEO RS232 buffer 0 de transmisién vacio. #INT_TBE1 RS232 buffer 1 de transmisién vacio. #INT_TBE2 RS232 buffer 2 de transmision vacio. #INT_TIMERO Desbordamiento del Timer 0 (RTCC). #INT_TIMER1 Desbordamiento del Timer 1. #INT_TIMER2 Desbordamiento del Timer 2. #INT_TIMER3 Desbordamiento del Timer 3. #INT_TIMER4 Desbordamiento del Timer 4. #INT_TIMER5 Desbordamiento del Timer 5. #INT_USB Actividad en el USB. Existe una directiva #INT_DEFAULT que implica que se utilizar la funcién que le acompaiia si se activa una interrupcién y ninguno de los flags esta activo. La directiva #INT_GLOBAL implica que la funcién sustituye todas las acciones que inserta el compilador al aceptarse una interrupcidn. Se ejecuta solamente lo escrito en dicha funcién. No se suele utilizar y si se hace debe hacerse con mucho cuidado. Si se utilizan las directivas de interrupcién, el compilador genera el cddigo nece- sario para ejecutar la funcién que sigue a la directiva. Ademés genera el cédigo necesario para guardar al principio y restituir al final el contexto; también borrard el flag activo por la interrupeién. El compilador C incluye funciones para el mejor manejo de las directivas de inte- rrupcién: enable_interrupts (nivel); nivel es una constante definida en un fichero de cabecera (16F87X:h -figura 5-) y genera el cédigo necesario para activar las mascaras correspondientes, afectando a los registros ITCON, PIE1 y PIE2. En el PICI6F876, los “niveles” permitidos son: 4, Las interrupciones y los temporizadores: agen ITCON(OBh) | PIE1(8Ch) PIE2(8Dh) GLOBAL ~~ INT_RTCC 00100000 INT_TIMERO 2 INT_EXT aera a vom INT_AD a INT_RDA aie INT_TBE ee INT_SSP aa INT_CCP1 ee INT_TIMER2 pe INT_TIMER1 ba INT_EEPROM _ INT_BUSCOL poooo INT_ccP2 —_ GLOBAL equivale a GIE = PETE = 1 y debe activarse de forma independiente. El resto activaran la mascara correspodiente. disable_interrupts (nivel); Realiza la funcidn contraria a la anterior, inhabilita las mascaras de la interrupeién _ correspondiente. 91 Compitador C CCS y Simulador PROTEUS para Microcontroladores PIC Figura 5. Parte del fichero include 16F87x.h 4.2.1.1 Interrupcién exterior por RBO Es una interrupeién basica, comtin a la mayoria de los PIC. Permite generar una in- terrupcién tras el cambio de nivel de alto a bajo o de bajo a alto en la entrada RBO. La directiva utilizada es #INT_EXT y se debe acompasiar de las siguientes funcio- nes (afectan al bit 6 del registro OPTION_REG, ver figura 6). ext_int_edge (H_TO_L); La interrupeién es por flanco de bajada (activa el flag INTF). ext_int_edge (L_TO_H); La interrupcién es por flanco de subida (activa el flag INTF). Figura 6. Registro OPTION_REG bit6: INTEDG: Bit de seleccion del flanco de interrupcién de RBO. 1 =La interrupcién es por flanco de subida del pin RBO/INT. 0 = La interrupcién es por flanco de bajada del pin RBO/INT. 4. Las interrupciones y los temporizadores Ejemplo 1: Encender y apagar, consecutioamente, un LED en la patilla RB7 cuando se pro- duzca un cambio de nivel en ta patilla RBO (ver figura 7). Componentes: ISIS: PIC16F876, RES, LED-GREEN y SW-SPDT-MOM. Figura 7. Ejempio 1 include <16F976.h> #fuses XT,NONDT, PUT, NOWRT fuse delay(clock= 4000000) fuse fast_io(B) dnti cambion0; // Variable de cambio #1NT_exr // Atencién a interrupcidn por cambio en REO extisr(){ // Puncién de interrupcisn ‘output_toggle(pin_B7) + 1 void maint) { set_tris B(0x0i); // BO. como entrada, B7 como salida output_low(PIN_87) i 1 Beage LED port_b pullups (TRUE) H/ Poll-up para R30 enable interrupts (int_ext); Jf Habilita int. R80. ext_int_edge(t To #); // por flanco de subida enable_interrupts (GLOBAL) ; // Habilita int. general white (1)i // Bucle infinito de espera } Figura 8. Programa del ejemplo 1 Compitador C CCS y Simulador PROTEUS para Microcontroladores PIC 3 TIMERO El bloque funcional TIMER0/WATCHDOG es un contador (registro) de 8 bits, incre- mentado por hardware y programable. La cuenta maxima es de 255 (el incremento es constante e independiente). * Contador: cuenta los eventos externas (a través del pin RA4/TOCK1) ‘+ Temporizador: cuenta los pulsos internos de reloj. Se puede insertar un prescaler, es decir, un divisor de frecuencia programable que puede dividir por 2, 4, 8, 16, 32, 64, 128 o 256. La frecuencia de conteo es una cuarta parte de la frecuencia de reloj (fosc/4). Posteriormente, con el uso del prescaler se puede dividir la frecuencia. El bloque del TIMERO puede funcionar como WATCHDOG, lo que permite que du- rante el funcionamiento normal del microcontrolador, un desbordamiento (0 tinte- out) del Watchdog provoque un reset (Watchdog Timer Reset). Para evitar el desbor- damiento se debe, cada cierto tiempo y antes de que legue al limite, ejecutar una instruccién CLRWDT que borra el Watchdog y que hace comenzar un nuevo conteo desde cero, Se basa en un oscilador RC interno, independiente del oscilador del mi- crocontrolador y que no requiere ningtin componente externo. El Watchdog cuenta in- cluso si el reloj conectado a OSC1/CLKI y/o OSC2/CLKO esta parado, por ejemplo, por la ejecucién de una instruccién SLEEP o por un defecto del cristal dscilador. Los registros implicados en la configuracién del TIMERO/WDT son los siguientes: * OPTION_REG: configura el “hardware” del TIMERO/WDT. * INTCON: permite trabajar con la interrupcién del TIMERO/WDT. * TRISA: habilita la patilla RA4. Registro OPTION_REG (direccién RAM: 81h/181h) [PIC1GF87x] Figura 9. Registro OPTION_REG bitS: OCS: Procedencia de las sefiales: 1=RA4/TOCK1. 0 = Reloj interno. bit 4: TOSE: Tipo de flanco en el TOCK1/RA4: 1 =Flanco descendente. 0 = Flanco ascendente. 94 4, Las interrupciones y los temporizadores bit3: PSA: Asignacién del divisor de frecuencias: 1=WDT. O=TMRO. PS2:PS1:PS0: Determina el divisor de frecuencias a actuar segun la Rango TMRO ‘Rango WDT 12 Md 14 12 10 18 1 ou 1:16 18 100 132 1:16 101 1:64 1:32 110 1:128 ‘164 m1 1:256 1:128 El tiempo de desbordamiento del TIMERO se calcula segiin la siguiente ecuacién: T=Ty¢Prescaler-(256 - Carga TMRO) Donde T,,, ¢s el ciclo maquina que se puede calcular mediante la ecuaci6n: Toy = Pose 4.3.1 TIMERO en C La funcién para configurar el TIMERO es: setup_timer_0 (modo); Donde modo esta definido en el fichero de cabecera (afecta a los bits 5:0 del OP- TION_REG): OPTION_REG(S1h/181h) RICC_INTERNAL , RICC_EXT_L_1O_H sone paseo 20h Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Setup_Timer_O(modo); | OPTION_REG(@th/181h) RICC_EXT_H_TO_L 00: nt on RTCC_DIV_1 pransens RTCC_DIV_2 a0 RTCC_DIV_4 — RTCC_DIV_8 tonnes RTCC_DIV_16 soonnor RTCC_DIV_32 ie RTCC_DIV_64 ioe: RTCC_DIV_128 eet RTCC_DIV_256 Senin Los distintos modos se pueden agrupar mediante el empleo de simbolo |. setup_tiner0 (RICO DIV.2 | RTCC_EXE L 70 2), La funcién para configurar el WDT es: setup_wdt (modo); Donde modo esta definido en el fichero de cabecera (afecta a los bits 3:0 del OPTION_ REG): Setup_wdt(modo); | OPTION_REG(61h/181h) WDT_18MS aed WDT_36MS ae WDT_72MS mean 4, Las interrupciones y los temporizadores Setup_wdt(modo); | OPTION_REG(Sih/181h) WDT_144MS ane WDT_288MS ieee WDT_576MS ee WDT_1152MS ree WDT_2304MS ae Para activar el Watchdog se deben utilizar los bits de configuracién mediante la - directiva FUSES: 4#fuses WOT Activado. #tuses NOWDT Desactivado. El compilador C suministra una serie de funciones para leer o escribir en el Ti- MERO/WDT. Para escribir un valor en el registro : set_timer( (valor); ‘aalor: entero de 8 bits. ‘Para leer el valor actual del registro: valor = get_timer0 0; valor: entero de 8 bits. También permite realizar la puesta a cero del Watchdog (como CLRWDT): restart_wdt (); Ejemplo 2: Generar una serial cuadrada de 1KHz utilizando la interrupcién del TIMERO (ver figura 10). Componentes ISIS: PICI6F876 e Instrumentos ISIS: OSCILLOSCOPE y COUNTER TIMER. Para generar una sefial de 1 Khz se necesita un semiperiodo de 500 jis. Seguin la ecuacién de desbordamiento del K, utilizando un cristal de 4 MHz y un prescaler de 2: T+TyPrescaler-(256 - Carga TMRO) 97 | Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC 500 jis = (4/4000000)-2-(256-x) donde x = 6, es decir, se debe cargar el TIMERO con el valor 6, Pero esta relacién sélo se cumple si se trabaja en ensamblador. Al trabajar en C, el compilador genera lineas de cédigo que aumentan el tiempo de ejecucién del programa y, por ello, es necesario ajustar el valor final. En este caso se ha utilizado un valor de carga de 29 (Ox1D). ev Ea Yea fey te) cease Cosy ey Wweiee eh Ose OSE Bn + aenen. aA Do ao = COP 2 LELBT MTA] © Sian sainathe wits in oa SoOuNESTOUnOM HTH Figura 10. Ejemplo 2 # INCLU! #use delay (clock~4000000) <16P876.h> #fuses XT,NOWDT fuse standard_io #int_TIMERO \ void TIMERO_ier(void) { output_toggle(PIN_B0); set_timer0 (0x18); } /f Se recarga el timerd void main() { NTERNAL|RTCC_DIV_2); // Configuracién timer0 // carga del timero | enable_interrupts (INT_TIMERO) + // Habilita interrupcién timerd enable interrupts (global) : // Rabi lita interrupeién general while (1); // bucle infinite , i Figura 11. Programa del Ejemplo 2 : 98 4, Las interrupciones y los temporizadores El compilador se encarga al entrar en la interrupcién de inhabilitar las interrupcio- nes y al salir de borrar los flags, por lo que no es necesario hacerlo por programa. Se puede observar la sefial con el osciloscopio digital y activando los cursores en el menti de Trigger (figura 12) y la medida es de 998,76 us. Figura 12. Osciloscopio digital 4.4 TIMER1 y TIMER2 El modulo TIMERI es otro temporizador/contador con las siguientes caracteristicas: * Trabaja con 16 bits (con dos registros de 8 bits: TMRIH y TMRIL). * Ambos registros se pueden leer y escribir. Interrupcién por desbordamiento de FFFFh a 0000h. Reset por disparo del médulo CCP. Controlado por el registro TICON (ver figura 13). Con el bit TMRION (T1CON«<0>) se puede habilitar o deshabilitar. Registro TICON (direccién RAM: 10h)[PIC16F87x] bit 7:6: No implementados: Se len como 0. bit 5:4: TICKPS1:T1CKPSO: Seleccién del valor del prescaler del reloj del TMR1: L1= Prescaler a 1:8. 99 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC 10= Presealer a 1:4. Ol= Prescaler a 1:2. Figura 13. Registro TICON bit3: | TIOSCEN: Bit de habilitacion del oscilador del TMR1: 1 = Oscilador habilitado. 0 = Oscilador parado. bit2: TISYNC: Sincronizacién de la entrada de reloj externa. Si TMRICS=1: 1=No sincronizado con la entrada de reloj interno, 0 = Sineronizacién de la entrada del reloj externo. Si TMRICS = 0: Este bit es ignorado. TMR1 utiliza el reloj interno. bit 1: TMRICS: Bit de seleccién de la fuente de reloj para el TMRO: 1 =Reloj externo desde el pin RCO/T10S0/TICKI (flanco de subida). 0 = Reloj interno (F,,../4). bit0: TMRION: Bit de habilitacién del TMRI: 1=TMRiI habilitado. 0=TMR1 parado. El TIMER1 puede operar en los siguientes modos: © Como temporizador. * Como contador sincrono. * Como contador asincrono. El modo de operacién se establece mediante el bit TMR1CS (TICON<1>). En modo temporizador, el TIMER] se incrementa en cada ciclo de instruccién. En modo contador se incrementa por flanco de subida de la sefial externa. Cuando 100 4, Las interrupciones y los temporizadores se habilita el oscilador interno del TIMERT mediante el bit TIOSCEN, las patillas RCY/TIOSI y RCO/TIOSO/TICKT se configuran como entradas ignorando el valor de TRISC<1:0>. El TIMERI tiene un reset interno que puede ser generado por el médulo CCP. Las interrupciones del TIMERT se controlan a través de los registros PIE1y PIRI El tiempo de desbordamiento de! TIMERI se calcula seguin la siguiente ecuacién: T=T,,-Prescaler (65536 — Carga TMRI) Donde T,,, es el ciclo maquina que se puede calcular mediante la ecuacién: Tou = 4/Foae El TIMER? es un modulo temporizador con las siguientes caracteristicas: * Temporizacion de 8 bits (registro TMR2). ‘Registro de periodo de 8 bits (PR2). + Ambos registros se pueden leer o escribir. * Prescaler programable por programa (1:1, 1:4, 1:16). * Postealer programable por programa (1:1 a 1:16) * Interrupcidn controlada por PR2. + El médulo SSP utiliza opcionalmente el TIMER2 para generar una sefial de reloj. El TIMER? tiene un registro de control T2CON (figura 14). El TIMER2 puede ser habilitado mediante el bit TMR2ON (T2CON<2>) para optimizar el consumo de potencia. Registro T2CON (direccién RAM: 12h)[PIC16F87x] Raa awa TOUTRS; | TOUTPS# | TwRZON Figura 14. Registro T2CON bit 7: Noimplementado: Se lee como 0. bit 6:3: TOUTPS3:TOUTPSO: Seleccion del valor del postscaler del TMR2. 0000 = Postscaler a 1:1. 0001 = Postscaler a 1:2. 101 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC 1110 = Postscaler a 1:15. 1111 = Postscaler a 1:16. bit2: TMR2ON: Bit de habilitacién del TMR2: 1= TMR2 habilitado. 0= TMR2 parado, bit 1:0: T2CKPS1:T2CKPSO: Seleccién del valor del prescaler del TMR2. 00 = Prescaler a 1:1. O1 = Prescaler a 1:4, ‘1x = Prescaler a 1:16. El TIMER? se puede emplear como base de tiempos para la modulacién en ancho de pulso (PWM) mediante la utilizacion del médulo CCP. El TIMER? se puede leer o escribir y es borrado en el reset. La entrada de reloj (FOSC/4) tiene un prescaler de I:1. 1:4 0 1:16 seleccionado mediante los bits T2CKPS1:T2CKPS0 (T2CON«1:0>). La salida se obtiene a través de un postscaler (de 1:1 a 1:16) que permite generar la interrupcion cuyo flag se encuentra en TMRAIE, (PIRI<1>). Los contadores de pres- caler-y postscaler son borrados cuando se escribe en el registro TIMER2, cuando se escribe en el registro T2CON 0 en cualquier reset. El TIMER2 no se borra cuando se escribe en el T2CON. El tiempo de desbordamiento del TIMER? se calcula segin la siguiente ecuacién: T=T.,;[Prescaler- (Carga TMR2 + 1-Postscaler] Donde T,, es el ciclo maquina que se puede calcular mediante la ecuacién: Toye MB ose 4.4.1 TIMER] y TIMER2 en C La configuracién del médulo TMRI en el compilador de C se realiza a través de la funci6n: setup_timer_1 (modo); Donde modo esta definido en el fichero de cabecera (afecta a los bits 5:0 del registro TICON): Setup_Timer_1(modo); TICON(Oh) 0000000 T1_DISABLED ih 102 4. Las interrupeiones y los temporizadores Setup_Timer_1(modo); TICON(Oh) T1_INTERNAL ee T1_EXTERNAL eee TI_EXTERNAL_SYNC Sept T1_CLK_OUT acess TLDIV_BY1 bn TI_DIV_BY.2 — Ti_DIV_BY4 — TLDIV_BY.8 po Los distintos modos se pueden agrupar mediante el empleo de simbolo |. La lectura y escritura en el modulo TMR1 se realiza a través de las siguientes fun- ciones: valor = get timer] (); set_timerl (valor); donde valor es un entero de 16 bits. La configuracién del médulo TMR2 en el compilador de C se realiza con la fun- cién: setup_timer_2 (modo,periodo,postscaler); donde: * periodo es un valor entero de 8 bits (0-255) para el registro PR2; ‘© postscaler es el valor del postscaler (1 a 16). Afecta a los bits 6:3 del registro T2CON; y * modo afecta a los bits 2:0 del registro T2CON. 103 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Setup _Timer_2(modo,periodo,postscaler); T2CON(2h) T2_DISABLED enon TL_DIV_BY1 exon T1_DIV_BY_4 soe a T1_DIV_BY_16 coon La lectura y escritura en el médulo TMR2 se realiza con la ayuda de las siguientes funciones: valor= get_timer? (); set_timer2 (valor); donde zalor es un entero de 8 bits. Ejemplo 3: Generar una funcién que permita realizar retardos de 1 segundo empleando el TIMERI. Componentes ISIS: PICI6F876. Figura 15. Ejemplo 3 x Se calcula un periodo parcial de 0.5 segundos y se repite dos veces: 104 4, Las interrupciones ylos temporizadores 05 = 4/F,,(65536-x)P con Fy. = 4 MHz y preescaler 1:8,; el TM = 3036. Para observar mejor el petiodo conectar el Counter Timer a CE y ponerlo en modo TIME (segundos). #include <16£876.b> Afuses XP,NOND? fuse delay (clack=3000000) fuse standard_io(b) intl cont~0; #int_riment // taverrupcién TIMERL void tempts (void) // Puneién ‘ if (cont==1) output_togyle(PIN_B1); // Cada 2 interrupeiones de 0.5 8 set_timer! (3036) /? eecarga del TRI cont++; 3 main () f setup timer 1 (T1ANTERWAL | T1_DIV_BY_8)+ set_timer1 (3036); /7 recarga del TMRI enable_interrupts (INT_TIMERI) + // habilita interrupeién timeri ‘enable interrupts (global); // habilita interrupcién generat while (2); , Figura 16, Programa del ejemplo 3 También se podria realizar sin interrupciones, esperando a que el TMR1 se desbor- dase, include <16£876.h> #feses x7,NOWOT fuse delay (clock=4000000) #ase standard_io(b) 105 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC temp2s () f int cont=0; output_toggle(PIN_81); while (cont<2) U/ Paka contar 2 veces 0.5 seq i set_timerl (3036) 7 // Indcializa el TURD while (get_timer!()>=3036); // Eepera a que se desborde (0.5 s) conttt; } main 0 setup_timer_1 (T1_INTERNAL | T1_DIv_BY_8); white (1) { tempis() + // lamada a la funcién de temporizacién Figura 17, Programa del ejemplo 3 sin interrupciones Ejemplo 4: Medir el ancho de un pulso mediante el TIMER1 y la interrupcién externa por RBO (figura 18). Componentes ISIS: PIC16F876 y LMOI6L. Instrumentos: OSCILLOS- COPE y Generadores: PULSE. a 888 by asaaases 106 4. Las interrupciones y los temporizadores: Al medir el ancho de un pulso se necesita detectar su flanco de subida y después su flanco de bajada. Esto se puede realizar mediante Ja interrupcién RBO ya que permite configurar el flanco de disparo. Al producirse una interrupeién, por ejemplo en el flanco de subida, se puede inicia~ lizar el valor del temporizador (TIMERT) en ese momento; se cambia la activacién de la interrupcién del RBO a flanco de bajada y cuando se vuelva a producir la si- guiente interrupcién por dicho flanco se guarda el valor del temporizador. Elancho de pulso serd la diferencia entre el valor del TIMERI en el flanco de subida y el flanco de bajada. El ancho de pulso maximo para una frecuencia de 4 MHz (ci- clo maquina de 1 j1s) es de 65,536 ms (un ciclo del TIMER1). El minimo dependeré del tiempo que tarda un programa en gestionar la interrupcién y los calculos. En el ejemplo se puede conseguir medir anchos de pulso de entre 64,934 ms y 69 jis. Modificar el fichero LCD.C para que se visualice a través del puerto C. #include <16f876.h> #fuses XT,NOWDT fuse delay (clock=4000000) include ‘Int16 TFB; // Tiempo flanco de bajada float AP; 7 Valor final del ancho de puiso int! nuevopulso=6; // Entea otro pulso int! cambio~6; // Carbio de flanco de disparo fint_ext void funcion_ext_int (J // Pancién Interrupcién 4£(cambio=-0) { // lance de Subida set_timerl (0); Uf tnicializa T™RI ‘ext_int_edge(0,H 70); // Contigurar para flaneo bajada cambioni; // Control de cambio de fanco } else ( // Blanco de Bajada ‘TBaget_timeri(); // Valet del TIMER] para el tlanco de bajada ext_int_edge (0,E TO.H)s // Contigurar para flanco subida cambto=0; // Control de cambio de flanco Lf (nuevopulso==0) { 4 Fin de pulso... nuevopulso=37 // Pulse a caleular void main() { Jed init (); 107 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC setup timer 1(ti INTERNAL | T1_PIV_BY 1); // Conflgutacién TIMERI ext_int_edge (0,170 #): // Contiquear para flaneo subide cambio = // Control de cambio de flanco enable_interrupts (int_ext): // Habilitactén inverrupcién R80 enable interrupts (global); // Wabilitacién general do { if (nuevopulso=—1) { /7/ ePulso nuevo? AP = TFB*1.07 7/ Ancho de pulso en mictesegundos de TIMERL.. // @ 4uiz el = Ius*Timert printf(led_putc,”\nPulso = 86.1fuS *, AP); // Visualiza medida // en 10D ) auevopulso~0; // Pulao medido } } while (TRUE); // Bucte infinite i Figura 19. Programa del Ejemplo 4 El generador PULSE se utiliza para crear la sefial de entrada, Con el bottin derecho se pueden editar sus caracteristicas (figura 20). agheadesy Dota Type Stes Sise Figura 20. Propiedades de PULSE Ejemplo 5: Generar una sefial cuadrada de 1 KHz utilizando la interrupcion del TIMER2 (figura 21). Componentes ISIS: PIC16F876 ¢ Instrumentos ISIS: OSCILLOSCOPE y COUNTER TIMER. 108 4, Las interrupciones y los temporizadores Para generar una sefial de 1 Khz se necesita un semiperiodo de 500 1s, segiin la ecuacién del desbordamiento del TIMER1, utilizando un cristal de 4 MHz, un pre- escaler de 4 y un postscaler de 1: T=T,,,[Prescaler-(Carga TMR2+1)-Postscaler) 500 fas = (4/4000000)-[4-(X+1)-1] donde x= 125; es decir, se debe cargar el TIMER? con el valor 125, Pero esta relacién solo se cumple si se trabaja en ensamblador. Al trabajar en C, el compilador genera Iineas de cédigo que aumentan el tiempo de ejecucién del programa y, por ello, es necesario ajustar el valor final. En este caso se ha utilizado un valor de carga de 11. oor sosasr 45% ‘newnionwecrs revere ncrscisel Figura 21. Ejemplo 5 #INCIUDE <16F! fuse delay ( #£uses XT,NOWDT fuse standard io(B) 1990000) #int_TIMER2 // para semiperiode alto ga el TIMERO set_timer2(11); } 109 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Ese | eee Figura 23. Sefal de 1 KHz Ejemplo 6: Introducir los datos, a través del teclado, de Ia velocidad de un motor de co rriente continua y generar una seftal modulada en un ancho de pulso proporcional al dato de velocidad. Controlar la velocidad en rpm rlaen un LCD (figura 24). Componen- tes ISIS: PICI8F876, KEYPAD-PHONE, RE: 1058, CELL, LMO16L y MOTOR- ENCODER, Funciona igual que el ejemplo 6 del tema d contador de pulsos controlado por el TIN que suministra el modelo del MOTOR-E: tres tipos de salidas: Q1, Q2 e IDX. los puertos, pero ahora se le afiade un 0. Los pulsos proceden de un encoder ‘ODER. Este modelo permite obtener QI y Q2 permiten controlar el sentido de giro y la posicién angular del motor (se configuran en la opcién PULSES PER REVOLUTION del meni de edicion del mo- tor). La sefial IDX suministra un pulso por revolucion y es la que se usard para medir la velocidad del motor en este ejemplo; al suministrar un pulso por revolucién se pueden contar los pulsos por minuto mediante el TMRO y visualizarlos en el LCD. 110 _ 4. Las interrupeiones y los temporizadores Figura 24, Ejemplo 6 Se puede utilizar el puerto B conjuntamente para el LCD y el teclado, pero se ha preferido utilizar el puerto C para el LCD (esto supone modificar el fichero LCD.C para que en lugar de utilizar el puerto D o E utilice el C), figura 25. | Foye led =7 on to port (at adress 7) ne eet eri ican) set ects aici “f Figura 25. Fichero LCD.C a modificar mW Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC El programa se basa en producir una interrupcién del TIMERO cada 0.5 segundos y leer el TIMERO que se utiliza como contador de pulsos externos. La lectura se debe multiplicar por 2 (preescaler minimo del TMRO) y por 120 (puesto que al ser revolu- ciones por minuto, si se mide cada 0.5 segundos se necesitar multiplicar por este factor). La carga del TMR1 con un preescaler de 8 es de 3036. Hinclude <16£876,h> #fuses XT,NOWDE, NOPROTECT, NOLVP #USE DELAY (CLOCK=4000000) HINCLUDE Hinclude #USE STANDARD_I0 (a) inel§ counter=07 /fadeeenaeeeaeees IND TIMER tte eeenestenesseeeets Hint TIMERD void TIMERI_isr (void) { counter=get_timerd() ; // tecture contador TMRO counter-counter*2*1202 // Conversion a rpm printf (led pute, “#61u xpm”,counter) 7 Ied_gotoxy(1,1)+ set_timer0 (0); // Reinicia cuenta ‘timeri (3036) // Recarga 2 0.5 5 [fseaheseensasarienatonarions, VOID MAING) CHAR K,kant="0"; char PuMi=0, PAML=0; ded _inie (ys kbd_init()z PORT_8_PULLUPS (TRUE) ; setup_timer_0(rtce_ext_l_to_bIRTCC_DIV_2)7 setup_timer_1(T1_internal|Tl_prv s¥ 8); set_timer0 (0) 7 set_timeri (3036); enable interrupts (int_timerl); // Contigueacién T™RO // Configuracién TRI Wf Borrado contador Wf Carga 2.0.5.5 enable interrupts (global) ; / Habilitacién de interrupctones wares (1) { kekbd_gete if (kem’\0') kekant; 112 4. Las interrupciones y los temporizadores Figura 27. Set modula y salida del encoder Ejemplo 7: Segtin Ia duracién de pulsacion de un botén obtener tres tipos de funciones una pulsacién corta da lugar a una funcién (por ejemplo encender un led en el puerto A) una primera pulsaciin mayor de tres segundos da lugar a otra funcién (por ejemplo encen der un led en el puerto C) y una segunda pulsacion mayor de tres segundos de lugar a otra {funcién (por ejemplo apagar el led del puerto C). Cuando se trabaje con Ia segunda o tercer ura 28). Componentes ISIS: PICI8F8: funcion no se atenderdn las pulsaciones cortas (f BUTTON, RES, LED-RED, LED-BLUE. En este ejemplo se utiliza una técnica de polling (comprobacién continua) del esta- do del pulsador pero empleando la interrupcién del TIMERO; de esta forma no se tendra al programa principal parado comprobando el estado del pulsador. 113 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC ann Figura 28. Ejemplo 7 Se programa el TIMERO para que provoque una interrupcién cada determinado tiempo, en este caso de 20 ms. Cada vez que se produzca la interrupcién se com- prueba si el botén ha sido pulsado. En el caso de que haya sido pulsado se com- prueba si es una pulsacién corta o mayor de 3 segundos. Para este ultimo caso se comprueba si el botén esta pulsado durante 150 interrupciones del TIMERO (s/20ms = 150). Si el botén no ha sido pulsado se designa como Funcién_D6 = 0, si ha sido pulsado una vez durante mds de 3 segundos se designa como Funcién_D6 = 1, si ha sido pulsado momentaneamente se designa como Funcién_D6 = 2 y si ha sido pulsado durante mas de 3 segundos por segunda vez se designa como Funcién_D6 = 3. Para distinguir si se ha pulsado durante mas de 3 segundos una o dos veces se uti- liza una variable de control (que se lamaré CON_D6) que puede valer cero o uno, dependiendo de si es la primera ver o la segunda vez que se pulsa. Para controlar el tiempo que esta el botén pulsado se utiliza una variable (D6) que se ira incrementando si el botén est pulsado y se produce una interrupcién del TMRO. #INCLUDE <16F877.h> device ade=10 fuse delay (clock=4000000) #fuses XT,NOWDT,NOPUT, NOPROTECT, NOBRONNOUT, NOLVP,NOCPD, NONR?, NODEBUG FUSE FAST_I0 (B) #BYTE TRISA = 0x85 BYTE PORTA = 0x05 114 4, Las interrupciones y los temporizadores #RYTE TRISC ~ 0x87 #eYTE PORTC = 0x07 #SYTE TRISD = 0x86 #BYTE PORTD = Ox08 #BYTE TIMERO = 0x02 #BIT RAS = 0x05.5 #BIT RC2 = 0x07.2 CHAR D6, FUNCION_DS,CON_D6+ INT] cnr; [/sarhaeeeseeeSTNTERRUPCION TIMBRO**+ete ete eseeenseeescee #int_TImeRo void TIMBRO_isr (void) ( TF (INPUT (PIN_D6)==0) { // Si esta pulsado IF (D6 >= 150) ¢ //petecta si 3 3 (20ms x 150) f // Pulgado 1* vez 3 8 FUNCION_D6=1; CON_Dé=I7 } ELSE { // Pulsado 2* vez 3 8 26-07 FUNCION_D6=3; cON_D6=0;} ) ELSE D6++; //8i no Lega a los 3 5 aumenta contador , eLse | 4f (D6>0 8% funcion_D6 ==1) D6=0; /7 Si pulsado antes pero menos 7/4 3 sey borra contador && FUNCION_D6 !=3 ) // Si pulsado antes.. IF (D6 > 0 && FUNCION_D6 {FONCTON_D 11 ¥ WO F=1 y WO Fe3. 26407) // entonces Fa2 J SET_TINERO (100); // Reinicializa el contador , UL SAA RRT RARE ON EE EAEE ES ETES PRINCIPAL SSSA ERAT ORT ER ESET AREA EET TERE ERE void main() [ disable interrupts (GLOBAL); setup timer 0(RTCC_INTERNALIRTCC_DIV_128); 6-0, FUNCTON_Dé=0; CoN _Dé=0; // timpia contadores tecla TRISA = 0X00; //00000000 RISC = 0x00; //00000000 115 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC RISD ~ 0X40; //01000000 BIT_CLEAR (PORTA, 5) 7 BIT_CLEAR(PORTC, 2); enable interrupts (GLOBAL) + SETTIMERO (100) — // TIMERO=20ms de polling; 20ms=(256-100)*1 ys*128 enable interrupts (INT_TIMERO); mers (1) 1) RC21; // $1 funcién 1 enciende RC2 { /7 Si funcién 3 apaga RC2. // Espeta wn tiempo pata no provocar una functon 2 DELAY_MS (400) + 7 no deseada. FUNCION_D6-07} 1 Yoolve a funciéa 0 IE (FUNCION D6==2) { “7 Si funcién 2, una ver enciende led. courses // segunda vez 10 apaga, ast continnamente 4 (CND==0) AAS=1; ELSE RAS=0; FUNCTON_D5~0; // Weelve a funcién 0 ) } } Figura 29. Programa del ejemplo 7 5. Convertidor Anal6gico — Digital Capitulo 5 Convertidor Analdgico - Digital 5.1 Introduccion Los microcontroladores PIC pueden incorporar un médulo de conversién de sefial analégica a sefial digital. Los médulos AD que utiliza Microchip hacen un muestreo y retencién (sample & hold) con un condensador y después utiliza el médulo de conver- sién (figura 1). El médulo de conversién A/D es del tipo de aproximaciones sucesivas. ENTRADA ANALOGICA Figura 1. Fases de la conversion analogica/digital El convertidor de aproximaciones sucesivas se utiliza en aplicaciones donde se ne- cesitan altas velocidades de conversién. Se basa en realizar sucesivas comparacio- nes de forma ascendente o descendente hasta encontrar un valor digital que iguale Ia tensidn entregada por el conversor D/A y la tensién de entrada. Durante la fase de muestro el interruptor se cierra y el condensador se carga a Ia tensién de entrada (el tiempo que el interruptor permanece cerrado es funda- mental para la correcta carga del condensador). Una vez abierto el interruptor, el condensador mantendra (tedricamente) la tensi6n de entrada mientras el modulo AID realiza la conversién. El médulo de conversion se caracteriza por parametros como los siguientes: * Rango de entrada. 7 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC ‘+ Numero de bits. * Resolucién. ‘* Tensién de fondo de escala. * Tiempo de conversién. * Error de conversi6n. El médulo que utilizan los PIC de gama media tiene un numero de bits de 10, por lo que su resolucisn es: resolucion siendo Vy la tensidn de entrada y N el ntimero de bits del convertidor. Es decir, para la tensién maxima de entrada (5V) la resoluci6n es de 0,0048 V (4,8 mV) por LSB. La resolucién si cambia si se modifica la tensién de fondo de escala, es decir, la ten- sién de referencia. Los PICs permiten cambiar la tensin de referencia en un valor absoluto (de 0a +V,,) o en un margen (de -V,, a +V,,,). Las tensiones a convertir siempre son positivas. 5.2 Médulo Convertidor (gama media) El médulo convertidor A/D en la gama media posee hasta 8 entradas analdgicas. Los 16F876/873 tienen 5 canales (en el puerto A) y los 16F877/874 tienen 8 canales (5 en el puerto A y 3en el puerto E). El convertidor (figura 2) es de 10 bits y, tal como se ha comentado, es de aproximaciones sucesivas. Permite variar la tensidn de refe- rencia a la maxima V,,, 0a una tensién positiva menor a través de AN3/V,.,, ¥ ala minima V,, 0a una tensién positiva mayor a través de AN2/Vic,. de Aproximaciones Sucesivas Figura 2. Bloques basicos de un convertidor A/D de aproximaciones sucesivas Puede seguir funcionando cuando el PIC est en modo SLEEP ya que dispone de un oscilador RC interno propio. Dato digital 118 5. Convertidor Analégico — Digital Figura 3. Arquitectura del médulo convertidor A/D La funcién de transferencia del convertidor A/D es el resultado de que la primera transicién ocurra cuando la tension analégica de entrada es igual a V,,,/1024 La resolucién vendra dada por la siguiente ecuaci Crees —Vrer-) 1LSB = Viggp_ + —SEE2 BEE oF aiak Enel caso de que la Vyes,= Vig ¥ Vagy. = Vas entonces la resolucién es: 5 1LSB=—>— =48m¥ oo 8" de esta forma si la lectura es de 512 LSB, la tensién analdgica leida es: s Viy = 512-——— = 512-4,8mV = 2.4576 V w 1024 + Brn 5.2.1 Registros FSR Hay 11 registros asociados a este periférico: + Definicién de pines de entrada y sefiales aplicadas: TRISA — PORTA ~ TRISE — PORTE. ‘* Manejo de interrupciones: INTCON - PIE1 ~PIR1. 119 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC * Control del conversor A/D: ADCONO - ADCONI - ADRESH ~ ADRESL. Registro de control ADCONO (direccién RAM: 1Fh) [PIC16F87x] Figura 4, Registro ADCONO bits 7:6 DCS1:ADCSO: Bits de seleccién del reloj para la conversion A/D. 00 = Eoac/2e O1=F,,/8. 10=F.,./32. 11 = Fc (Reloj del oscilador interno RC) bits 5:3 CHS2:CHSO: Bits de seleccién del canal, bit2 bit T bitO 120 000 = Canal 0, (RAO/ANO). 001 = Canal 1, (RAV/AN1). 010 = Canal 2, (RA2/AN2). 011 = Canal 3, (RA3/AN3). 100 = Canal 4, (RA4/AN4). 101 = Canal 5, (RAS/ANS). 110 = Canal 6, (RA6/AN6). 111 = Canal 7, (RAZ/AN7). GO/ DONE: Bits de estado de la conversién. Si ADCON=1 1 = Conversién en progreso (a 1 inicia una conversién). 0 = La conversién ha finalizado (este bit es borrado por hardware al terminar la conversién) No usado: valor 0. ADCON: Activacién del conversor A/D. 1=convertidor activo. 0=convertidor no activo. Figura 5. Registro ADCONT bit7: ADEM: Seleccién de formato del resultado (figura 6): 1 = Justificacién a derechas. Los 6 bits mas significativos de ADRESH son leidos como ‘0’. 0 = Justificacién a izquierdas. Los 6 bits menos significativos de ADRESL son leidos como ‘0’. bit 6-4: No usado: valor 0 bit 3-0: PCFG3:PCFG0: Configuracién de las entradas al modulo A/D (figura 7). ‘0000 00 ‘ADRESH |} Resultado 10 bit | Justificacion a izquierdas 3 | 3 ANE [ANT RAS RAS a [Vor Veen | ver] Cag E zg Wop _| vss Tne A Verne D Venn a Visi aPlaetele= PP ez Waar | Vier rae | Maar Weer | Yaar D Vain else} e|>|>|>[>]elelolcjolsi> >t t=] =1>/2 15121 515/>>| a =>] >=] =] =1>]5 =| oll i> CECEEEEEECCEEES >|>/>]>]>]>[>1>] ole |= |>[>[>/> Figura 7. Tabla de configuracién de los canales 121 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC En las versiones PICI7F87xA existen unas pequefias variaciones en estos dos re- gistros. En el registro ADCONO (direccion RAM:1Fh) [PIC16F87xA] los bits: bit 7-6: ADCS1:ADCSO0: Seleccién del reloj para la conversién A/D junto con ADCS2 que esta en ADCON1. 01=fOsc’8 | 10=fOSC/32 | 11=1RC 01 = fOSC/16 | 10 = fOSC/64 | 11 = #RC Enel registro ADCONI (direccién RAM: 9Fh) [PIC16F87xA] el bit: bit6:; | ADCS2: Seleccién de reloj para conversién A/D junto con ADCS1 y ADCSO. Otros registros que afectan al médulo convertidor son los referentes a la interrup- cin: INTCON, PIE1 y PIRI. 5.2.2 Proceso de conversion Para realizar la conversién, el fabricante recomienda seguir los siguientes pasos: 1. Configurar el médulo A/D: a, Configuracién de pines analégicos/tensién de referencia/E/S digitales (ADCON}). b. Seleccién de la entrada A/D (ADCOND). ¢, Seleccién de reloj para la conversién A/D (ADCONO). d. Habilitar médulo A/D (ADON (ADCON0<0>) 2, Configurar las interrupciones (si se desea): a, ADIF =0; b, GIE = PEIE = ADIE = 1. 3. Esperar el tiempo de adquisicién. 4. Comenzar la conversion poniendo a ‘1’ el bit GO/DONE(ADCONO<2>). 5. Esperar a que termine la conversién. Puede ser de dos formas: a, Mediante lectura continua del bit GO/DONE hasta que sea 0’, indicando el fin de la conversi6n. b. Esperando a la interrupcién. 6. Leer rel egistro de conversién ADRES y borrar en flag ADIF si es necesario. 122 5. Convertidar Analégico — Digital 7. Para la siguiente conversién se salta a los puntos 1, 2 6 3 en funcién de lo que se necesite. El tiempo de conversidn por bit se define como T,,. Un minimo de 2-T,,, son necesarios antes de la conversion (esto no es necesario para los PICI6F87xA de- bido a que el interruptor de muestreo se cierra en cuanto se obtiene el resultado). Existen dos tiempos basicos de trabajo: el tiempo de adquisicién (T,..) y el tiempo de conversion T,,,. * Tiempo de adquisicién (Tq): tiempo necesario para que se cargue el con- densador de retencién (C,,.,,) con la tensién de entrada. Este proceso de carga del condensador depende de distintos factores, entre otros, la impedancia de la fuente de tensién de entrada (el fabricante recomienda que se situe por de- bajo de los 10 kohm). El tiempo de adquisicién dentro de los margenes tipicos es de, aproximada- mente, 20 us. La adquisicién no comienza hasta que no acabe la conversién, Asi que se debe espera un T,.,, tras una conversién, tras seleccionar un nuevo canal o tras en- cender el modulo AD. + Tiempo de conversi6n (T,,.): tiempo necesario para obtener el valor digital de la tensién analégica de entrada. Este tiempo depende de la fuente de reloj que se seleccione para la conversion. Para una correcta conversién A/D, el reloj debe seleccionarse para asegurar un tiempo minimo T,, de 1,6 ys. En la figura 8 se muestra la tabla de seleccién de fuentes de reloj con su T,., asociado, las celdas sombreadas son las que no se recomienda su uso. Fuente de retoj (Tap) Frecuencia del dispositive | Operacién | ADCSI:ADCS0 | _20MHz | 5MHz | 1.25 MHz | 333.33 kHz Move 00. 100 ns™ 400 ns Lous Gus. BT: OL 400 ns™ 16 ps 327m 10 16s: 64 ys RC i 2-6 us) | 2-6 us ‘Tabla de seleccion de fuentes de reloj Figui Las notas de la figura 8 indican: (1): La fuente RC tiene un T,,, tipico de 4 us. (2): Estos valores violan el minimo tiempo requerido de T,.,. (3): Para conversiones més rpidas se recomienda utilizar otra fuente de reloj. (4): En PICs con frecuencias superiores a 1 MHz, el modo RC sélo es recomen- dable en modo SLEEP. EI T,, se configura en ADCOND (reloj de la conversién). Tao-2TOSC | Tan-8-TOSC | Tan=32-TOSC ee | (tip. dys) 123 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Tambien en el PICL6F87xA. Tap=4 TOSC | Tap= 16 TOSC | Tap-64 TOSS, Para convertir 10 bits se requiere un tiempo de 12°T,,, (figura 9). pa be OTS SSD. INICIO CONVERSION EL CONDENSADOR YA GARGADO SE DESCONEGTA DE LA FUENTE ANALOGICA (TIPIGAMENTE A LOS 100ns) ane neni aa ‘SE CARGA ADRES EL BIT GOIDONE SE PONE A0 SE ACTIVA ELFLAG ADIF EL CONDESADOR SE CONTECTA DE NUEVO ALA FUENTE ANALOGICA Figura 9. Ciclos de conversion Considerando los dos tiempos (de adquisicién y de conversién) la secuencia com- pleta de muestreo/retencién y adquisicién en los PICs de gama media se muestra en a figura 10. Existe una diferencia entre los PICI6F87X y los PIC16F87XA; en los *\p antes de iniciar una nueva adquisi- primeros es necesario esperar un tiempo 2 cidn, cosa que no ocurre en los segundos. jaecee | meters Fin de Conversién GODONE=® Valor en ADRESS Inicio de adauisicion ‘So activa Nag ADIF Figura 10. Tiempo de muestro y conversion 5.2.3 Efecto del modo SLEEP y RESET en el modulo AD En el modo dormido (sleep), el médulo AD puede funcionar si se selecciona como reloj para la conversion el RC interno (ADCS1= 1 y ADCSO = 1). En este caso, el médulo espera 1 ciclo de instruccion antes de iniciar la conversién, permitiendo la ejecucién de la siguiente instruccién SLEEP, eliminando asi todo posible ruido de 124 5. Convertidor Analégico ~ Digital conmutacién durante la conversién. Al finalizar la conversién, el bit GO/DONE es puesto a “0” y el resultado se carga en los registros ADRESH y ADRESL. En el caso de que la interrupcién del médulo AD esté habilitada (ADIE = 1 y PEIE =1) el dispositivo se despierta, pero en el caso de no estar habilitada, el médulo se apaga aunque el bit ADON siga a “1”. Enel caso de que la fuente de reloj no es la RC interna, la ejecucién de una instruc- cidn SLEEP hace que la conversi6n que se esté realizando se pare y que el médulo se apague aunque el bit ADON siga a “1”. Enel caso de producirse un RESET, los registros del médulo AD se inicializan a los valores indicados por el fabricante. El efecto del RESET es el apagado del médulo y la parada instanténea de la conversién actual, los terminales se reinicializan a entradas analdgicas (ADCONI parte baja a 0); el valor de ADRESX no se modifica enel caso de un Reset pero en el caso de un Power-on Reset es desconocido. 5.3 Modulo AD en C En el compilador € las funciones para manejar el convertidor AD son las siguientes: setup_ade (modo); modo; para la configuracién del médulo conversor A/D correspondientes a los bits 7:6 del ADCONO. a Setup_ade(modo); ADCONOIFh) ‘00000000 ADC_OFF nae ADC_CLOCK_INTERNAL | 11000000 _ = con ADC_CLOCK_DIV_2 ine ‘1000000 ADC_CLOCK_DIV_8 ae 10000000 ADC_CLOCK_DIV_32 | soy setup_adc_ports (valor); Valor: definicién de las entradas analdgicas correspondiente a los bits 3-0 del ADCONI (figura 11). set_adc_channel (canal); canal: seleccién del canal analégico correspondiente a los bits 5:3 de ADCONO. 1(AN1)) 2 (AN2) 73 (AN3) (AN4) 5 (ANS) | 6 (AN6) | 7 (AN7) 125 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC a z Ee Ee setup_ade_ports (valor); ‘ALL ANALOG ANY ANT ANZ ANUANS ANE ANT. NSS_VRERT ASW ANT ANT ANT ANE =l> [>] >| ga ANU ANT ANT ANT VSS_VREF ANT ANLANS ver ARO ANI NO_ANALOGS ANU ANT_ANA ANS ANGLANT.VREF_YREF ANUANLANT ANI ANC ANS ANILANT AND ANT ANE ASSAREF ANALOG RAT RA2_REF >lelel>l>l>l el elel=l=lel> ANU ANL_VREF_VREP AND ory l= ]=f pelt tel ell] ge. SO ae ears Figura 11. Posible valores de setup_adc_port{valor) valor=tead_ade (); Lectura del resultado donde valor es un entero de 16 bits segiin la directiva SDEVI- CE ADC= empleada. Dicha directiva trabaja segin la tabla: DEVICE | Sbit | 10bit | I1bit | 16 bit ADC=8 | 00-FF | 00-FF | 00-FF | 00-FF ADC=10 x | 03FF x x ADC=11 x x 0-7FF x ADC=16 | 0-FFOO | 0-FFCO| O-FFEO | 0-FFFF Por ejemplo, el fichero 16f876.h incluye como primera directiva #device PICL6F876. Para incluir la informacién del tipo de conversor A/D se debe afiadir #device ade=10. READ_ADC() admite tres modos de funcionamiento: 126 ‘ADC_START_AND_READ ADC START ONLY ‘Solo inicia la conversién. ADC READ ONLY ‘Sélo Ice los registros del convertider. 5. Convertidor Analégico — Digital Ejemplo 1: Lectura de una tensiin analégica por el canal ANO (figura 12). Componentes ISIS: PICI6F876, POT-LIN, CELL y LMOI6L. Figura 12, Ejemplo 1 Finclude <16F876.h> device ade=10 #FUSES XT,NOWDT 4#F0SES fuse delay (clock=4000000) dinclude void main() { inti6 q7 float p: setup_ade_ports (ANO) 7 //eanal 0 analégico setup ade (ADC CLOCK INTERNAL); //fuente de reloj RC ded init (ys for (27) { set_ade_channel (0); (/Habilitacién Canal 0 delay us (20); 127 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC @ = read_ade(); //uectura canal 0 p= 5.0.¢ 9 / 1024.07 /dconversisn a tensién printf(Icd_putc, *\fabc = 8410", q); printf(led_pute, “\nVoltage = 301.2fV", ps detay_ms(100) + , Figura 13. Programa del Ejemplo 1 Ejemplo 2: Termémetro con una NTC NTSAOWB203 (figura 16). Componentes ISIS: PIC16F876, NISAOQWB203, CELL y LMOI6L. Se utiliza una NTC NTSAOWB203 con una beta de 4050 y una resistencia a 23 °C de 20 kohm (figura 14); estas caracteristicas se pueden ajustar asi como la temperatura amedir en el ment de edicién del componente (botén derecho, figura 15). ear Wieoanecea NibaoaDee [A TSADNEETES Figura 15. Edicién del componente 128 5. Convertidor Analégico ~ Digital La NTC se linealiza mediante una resistencia R1 de 10 kohm, el valor de tensién de la NTC (V,) se puede obtener segiin las siguientes ecuaciones (temperaturas en grados kelvin): V,-R,_ _ 10000-V, Rp= a 527; ! -273.15 = d 273.15 Ue Se Ge Ree Te 4050" 20000' 298.15 $88 2b. assesses cas include “165876.4” #device ado-10 Ffuses Xt,NOWDT fuse delay (clock=4000000) Hinelude //Mecesaria para los cdlcuios matenéticos Finclude void main() ( float tv,tr,temp,y? Hvariables de ecuactén inti6 value; Jed init (); setup_port_a( Ali ANALOG )7 setup_adef ADC CLOCK INTERNAL ); Compilador C GCS y Simulador PROTEUS para Microcontroladores PIC set_adc_channel( 0); delay_us (10). do { value = Read ADC(); tv = 5.0 * value / 1024.07 tr = tv * 10000.0 / (5.0 - tw); y = tog (tr/20000.0) 7 y = (1.0/298.15) + (y *(1.0/4050.0))+ temp=1.0/ys temp = temp -273.15; printf (led_pute,“\nT = #04.2£07, temp) + ) while (TRUE); Figura 17.- Programa de ejemplo 2 Ejemplo 3: Realizar un barémetro/altimetro que mida en Kpa, Psi, Atm o mts median- te su seleccién por un pulsador (figura 20). Componentes ISIS: PICI6F876, MPX4115, NTSAOWB203, BUTTO, CAP y LMOI6L. El sensor de presién MPX4115 de 15 a 115 kPa (2.2 to 16.7 psi) con una tensién de salida de 0.2 a48 V. La funcién de transferencia se muestra en la figura 18, la ecua- cién de la tensién de salida es: Vour= Ve * (0.009 * P - 0.095) + (ErrorPresion + FactorTmp # 0.009 V.) ‘TRANSFER FUNCTION Vout =¥e".0084F-.095) + Exo Vg =5.1 Vo TEMP =010 85°C ‘OSERRSSSISHSSRESSATSSSLS Pressure (ret: © sealed varsum) in kPa Figura 18. MPX4115 (cortesia de Motorola) El error de Presién y el factor de temperatura vienen definidos por el fabricante (figura 19), El error de Presién se sitda en +1.5 y el factor de temperatura varia entre 130 5. Convertidor Analégico — Digital 1y 3 segiin la temperatura. Este factor hace que sea necesario medir la temperatura de trabajo y, por ello, se utilizaré una NTC. (MPXATISA, MPXAAIISA Series une = eae es NF Sy see ee NOTE: The Temperature Muster a iar reaponen am O° 40°C ad om BC 128C Pressure Error Band a rants Rese ao—| Figura 19. Error de Presién y Factor de Temperatura (cortesia de Motorola) La ecuacién para calcular la presin con una V, de 5V y un error de presién de #15 es de: p= 0415 *Vour 41.5. FactorTmp 0.045 Una vez calculada la presin en Kpa se relaciona con Psi y Atm: 1 Kpa = 0,0098692 Atm. 1 Kpa = 0.145037 Psi. La altitud en metros se puede calcular segiin la ecuaci6n: P, = -7990.6527 - In} —S4— ff aoe Ha 131 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC B88 eB. assesses { # Figura 20. Ejemplo 3 #include <16F876.n> #device adc=10 #EUSES XT,NOWOT ruses #use deiay (clock=#000000) Hinclude Hinclude #aY7E TRISA ~ 0x85 #9YTE PORTA = Ox05 void main() { intié qr foat tv,tr, temp, y,tf,error? //Variables ecuaciones float p,presion,pres_atm,pres_psi,alt; (MYarisbles cAlculo presion //y altura Sat cat=0; bit set (TRISA , 2); setup_adc_ports(RAQ_RAI_RA3_ANALOG); //RAO y RAI analégica, RA2 digital 132 5, Convertidor Analégico — Digital setup_ade (ADC_CLOCK_INTERNAL) + Jed init ()¢ for (77) 1 ‘set_ade_channel (0); /hectura presién en voltios deiay_us (20) + @ = reed_adet); p= 5.0 *@/ 1024.0; presion= (0.475ep)/0.085; set_adc_channel (1)7 delay_us(20)z q = read _ade(); ty= 5.0 *q/ 1024.0; tr = tv * 1000.0 / (5.0 - tvs y = log (t¥/20000.0); (/Lectura presién en Kpa (/ectura temperatura y= (2.0/298.15) + (y *(1.0/4050.0))7 temp=1.0/y: temp = temp -273.15; 4f (vemp>=0 &6 tenp<-85) TF=1.0; else TF=3.0; ERROR = TF * 1.57 //eaicule del error de presién con 1a temperatura 7//el exror puede ser 4 pero aqui usamos - 0 + presion=presion-ERROR; pres_atm = presion * 0.0099692; pres_psi = presion * 0.1450377, alt = -7990.652789*1og (presion/101.304) ; //ealcalar mimero veces pulsa botén AF (BIT PRST(PORTA,2)==0) ent#+; if (ent>4) ente0; ‘Switch (cnt) { case 0: Jed_gotoxy (1,15 printf (lod_putc, “\P= #5.2f Kpa printf (lod_pute,"\nt = $04.25 C”, break; case 1: Jed _gotoxy (1,1); printf (led pute, printf (led pute, "\nt = $04.28 c”, breaks case 2: Jed_gotoxy (1,2); printf (led putc, “\Pe #3.2f psi T\Pe 84,26 atm {/Presién en Kpa //eresién en Atm (/Presién en Psi (altura //Segin némero veces pulsa botén se elige mend *, PRESTON): temp) 7 ", PRES_atm); temp) + *, PRES psi); 133 Compilador C CCS y Simutador PROTEUS para Microcontroladores PIC printf (led_putc,”\n? = $04.2f c”, temp): break; case 3: ded_gotoxy (1,1)4 printf (led pute, “\Alt= $7.26 m “, alt); printf (led putc,"\n? = 804.26 c”, temp); break; } delay_ms (100) } Figura 21. Programa del ejemplo 3 Ejemplo 4: Simulacién de adquisiciin de tensiones negations (figura 22). Componentes ISIS: PICI6F876, CELL y LMO16L. ‘Como se ha comentado al inicio del capitulo, el convertidos AD del PIC slo puede adquirir tensiones POSITIVAS. Tal como esta configurada Ja entrada del conversor, el PIC se “QUEMARIA” en el caso de introducir una sefal de tensién negativa por los canales AD. Pero la simulacién es “muy sufrida” y si que permite adquirir tensiones negativas sin que al PIC le ocurra nada, pero la realidad es mucho “mas cruel”; |OJO con esté diferencia entre la simulacién y la realidad! Figura 22. Ejemplo 4 134 5. Convertidor Analdgico — Digital include <16F876.h> fdevice ade=10 #EUSES XT, NOWDT #EUSES fuse delay (clock=4000000) include <£CD.c> void main() { intl6 q7 float ps setup_adc_ports(ANO_VREE_VREF) + setup_ade (ADC_CLOCK_INTERNAL) ; jed_init(y; for (7) set_adc_channel (0); delay us(20); g = read_adet}+ P= (-2.0) + (4%q / 1024.0); print£ (led pute, "\fADC = 841d", @)s printf (led pute, “\nVoltage ~ #01.2fV", p)+ delay_ms (100) ; , Figura 23. Programa del ejemplo 4 La solucién practica para medir tensiones negativas es desplazar la tensién hasta valores positivos y después restar este desplazamiento por software. 135 6. Médulo CCP - Comparador, Captura y PWM Capitulo 6 Médulo CCP - Comparador, Captura y PWM 6.1 Introduccion Los médulos CCP permiten realizar tres funciones basicas basadas en el manejo de los temporizadores (Timer): * Comparador: compara el valor del temporizador con el valor de un registro y provoca una accién en el PIC. + Captura: obtiene el valor del temporizador en un momento dado, fijado por la accién de un terminal del PIC. * PWM: genera una sefial modulada en amplitud de pulso. Los PIC de la gama media pueden tener hasta 2 médulos CCP. Los dos médulos CCP se comportan practicamente igual (menos en un caso especial que se estudiar poste- riormente). Tras producirse un reset, el modulo CCP se encuentra deshabilitado. Cada médulo CCP posee un registro de 16 bits que puede utilizarse de las tres siguientes formas: * Registro de 16 bits para capturar el valor del temporizador al producirse un evento (CAPTURA). © Registro de 16 bits para comparar su valor con el valor del temporizador TMR1, pudiendo provocar un evento cuando se alcanza el valor contenido en este registro (COMPARADOR). * Registro de 10 bits para el ciclo de trabajo de una sefial PWM (PWM). Cada uno de los registros CCP tiene asociados tres registros (la x indica CCP1 0 CCP2): * CCPxCON: Registro de control del CCP. 137 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC * CCPRxH: Byte alto del registro de 16 bits del CCP. * CCPRxL; Byte bajo del registro de 16 bits del CCP. * CCPx: pin del CCP. Registro de control CCPxCON (direccion RAM: 17h/D1h) [PI- C16F87x] Figura 1. Registro de control CCPxCON bit 7:6 No usados: valor 0. Dit 5:4 CCPXX:CCPxY: bit] y bitO del Duty Cycle del PWM. ‘Modo captura: No se usa. Modo comparacién: No se usa. Modo PWM: Son los dos bits menos significativos de los 10 bits utilizados para el Duty Cycle del PWM. Los ocho bits de mayor peso del Duty Cycle se encuentran en el registro CCPRxL. bit3:0 CCPxM3:CCPxM0: bits de seleccién del modo CCPx. 0000 0100 o101 0110 0111 1000 1001 to19 | Modo de comparacién, genera interrupcién al igualarse (CCPxIF 0 CCPx no es afectado). Modo de comparacién, lanza acci6n especial (CCPxIF = 1, CCP1 resetea 1011 | TMR1, CCP2 resetea TMRI y lanza una conversién A/D (si esté habi- litada). ixx Modo PWM. 138 6. Médulo CCP — Comparador, Captura y PWM Debido a que los dos médulos CCP utilizan los temporizadores, cuando estén acti- vos los dos médulos se puede dar alguna interaccién entre ellos. La siguiente tabla muestra dichas interacciones. ModoCCPx | Modo CCPy Interaccién Captura Captura Misma base de tiempos en TMRT. «, _ | Lacomparacién debe configurarse para la ac- Sap Comparacién. | sn espedel de disparo que barra eliTMRI. ¥ S La comparacién debe configurarse para la ac- iComiparacitns | Comparaciiel: | espodal de dispato que Bona el TRE Los PWM deberan tener la misma frecuencia awe vee y tasa de actualizacién (interrupcién TMR2). PWM Captura Ninguna. PWM Comparacin | Ninguna. 6.2 Modo Captura Enel modo de captura, CCPRxH:CCPRxL capturan el valor de los 16 bits del regis- tro TMRI cuando ocurre un evento en el pin CCPx, Los posibles eventos son: * Flanco de bajada. * Flanco de subida. + 4 flancos de subida. * 16 flancos de subida. Estos eventos se seleccionan con los bits CCPxM3:CCPxMO0 (CCPxCON<3:0>). En el momento de la captura, el bit CCP1IF (PIR1<2>) [y/o el CCP2IF (PIR2<0>)] se pone a 1, produciendo una interrupcién en el caso de que esté habilitada. El flag ha de ser borrado por software. Si sucede otra captura antes de haber leido el registro CCPRx, el valor de la captura previa se habré perdido. En modo captura, el pin RC2/CCPI (y/o el pin RCU/T1OSUCCP2) debe configurar- se como entrada poniendo a uno el bit TRISC<2> [y/o el TRISC<1>]. Si el bit RC2/ CCP1 [y/o RCV/CCP2] se configura como salida, una escritura en este pin podria originar una captura. Este modo trabaja con el TMR1. Ademis, es necesario que éste funcione como tem- porizador 0 como contador en modo sincrono. En modo asincrono no funcionaria. Si se produce un cambio en el modo captura, por ejemplo de flanco de bajada a cada 4 flancos, se puede dar una falsa interrupcién. Por software se debe borrar el 139 Compilador C CCS y Simutador PROTEUS para Microcontroladores PIC bit CCPaIE para deshabilitar las interrupciones, limpiar el flag CCPxIF y cambiar elmodo de captura. Mediante el preescaler se puede alcanzar una resolucién mds precisa sobre las se- fiales de entrada. Hay cuatro configuraciones de preescaler especificadas mediante los bits CCPxM3:CCPxMO, Cuando el médulo CCPx esta inhabilitado no esta en modo captura, el contador del predivisor es puesto a cero. Cualquier tipo de reset borra el preescaler. Para cambiar el tipo de preescaler se debe apagar antes el médulo CPx (borrar el preescaler) y posteriormente modificar dicho valor, de lo contrario se puede produ- cir una interrupcion. Si se utiliza el modo sleep (dormido), el TMR1 (configurado en modo sincrono) no se incrementa, pero el preescaler del CCPx si que continua incrementando el conta- dor de eventos y, por lo tanto, cuando alcanza el valor prefijado, el bit CCPxF se pone 1, lo que provoca un despertar del PIC; asf el contenido del TMRI se guarda en los CCPRx pero su valor no es significativo dado que el TMR/ estaba parado. 6.3 Modo Comparacién En el modo comparacién el valor de 16 bits del registro CCPRx se compara conti- nuamente con el valor del temporizador TMR1. Cuando ambos valores se igualan, en el pin CCPx se puede producir, o no, un evento de los siguientes: Se pone a1. Se pone a0. No cambia. Estos eventos se seleccionan mediante la configuracién de los bits de control (CCPxM3:CCPxM0 (CCPxCON<3:0>): 1000 _| Modo de comparacién, pin CCP a 1 al igualarse (CCPxIF 1001__| Modo de comparacién, pin CCP a 0 al igualarse (CCPxIF = 1). Modo de comparacién, genera interrupcién al igualarse (CCP: CCPx no es afectado). Modo de compara 1011 setea TMRI, CCP2 resetea TMR1 y lanza una conversién A/D (si esta habilitada).. 1010 Por otra parte, al producirse un evento en el pin, se produciré la interrupcién en caso de que esté habilitada, ya que el flag CCPxIF (de PIR1 o PIR2) se pone a1. 140 El TIMERI se debe configurar en modo temporizador 0 modo contador sincrono para que el médulo CCPx funcione correctamente en el modo comparacién. Para trabajar en este modo, el pin CCPx debe configurarse como salida, poniendo a 0 el bit del registro TRISC correspondiente. Cuando se selecciona uno de Jos modos de comparacién, el pin CCPx toma el nivel légico contrario al que tiene que tomar cuando se produzca la igualdad (es decir si se tiene que poner a 1 en la igualdad, se pone a 0 en estado normal) Hay un modo de trabajo (CCPxXM3:CCPxMO: 1010) en el que se produce una inte- rrupcién al producirse la igualdad, se activa el flag CCPxIF y se genera la interrup- cién, si esta habilitada, pero el pin CCP no se ve afectado. Portiltimo, puedetrabajarenmododedisparodeacciénespecial (CCPxM3:CCPxM0: 1011), En este caso cuando se produce la igualdad, el temporizador TIMERI se re- setea, por lo que se utiliza como marcador de la accién. En el médulo CCP2, ade- mis de producirse el reset del TIMERI, se inicia una nueva conversién AD si dicho médulo esta habilitado; esto permite realizar conversiones A/D periédicas. En el modo sleep (dormido), el TIMERI no funciona y, por lo tanto, [a comparacién tampoco. El pin CPx tendra el mismo valor que antes de trabajar en modo sleep. Después de cualquier reset, el modulo CCP est deshabilitado. 6.4 Modo PWM El modo PWM (Pulse Width Modulation) o MODULACION DE ANCHO DE PULSO, permite obtener en los pines CCPx una sefial periddica en la que se puede modifi- car su ciclo de trabajo (Duty Cicle). Es decir, puede variarse el tiempo en el cual la sefial est a nivel alto (T.,.,) frente al tiempo que esta a nivel bajo (T.,.); ver la figura 2. De esta forma, la tension media aplicada a la carga es proporcional al T,,, contro- Jando, por ejemplo, la velocidad de motores, luminosidad de lamparas, etc. Figura 2. Sehal PWM, 141 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC La resolucién de salida es de hasta 10 bits. Para que este médulo funcione correc- tamente, el pin debe estar configurado como salida, mediante la configuracién del TRIS correspondiente. El periodo de la sefial PWM se obtiene de configurar el TIMER? y el contenido del registro PR2 (direccién 0x92); ver la figura 3. Este registro de 8 bits contiene los 8 bits mas significativos de una cuenta de 10 bits. Para calcular el periodo de la seal PWM se utiliza la siguiente ecuacin: PWMT = (PR2 + 1)-4T,,,-(Valor del Preescaler del TMR2) Cuando el valor del TMR2 se iguala al valor de PR2, pueden ocurrir los siguientes eventos: + TMR2 se borra. * El pin CCPx se pone a 1 (excepcién: si el Duty Cycle es 0%, el CCPx no se pone al). * El valor de CCPRxL se carga en el CCPRxH, el cual es el que se compara con el TIMER? para fijar el duty cycle. | Gico de Trabajo ‘ieee’ Taner TWR2=Ciclo de Trabajo Figura 3. Sefal de salida PWM El ciclo de trabajo (duty cycle) se define por el valor del registro CCPRxL y con los bits CCPICON antes de comenzar un nuevo periodo, El registro CCPRxL contiene los 8 bit de mayor peso y el CCPICON«5:4> contiene los 2 bits de menor peso. Por lo tanto, se consigue una resolucién de 10 bits (DCxB9:DCxB0). El tem- porizador base con el que se compara el contenido de estos registros es el TMR2. La siguiente ecuacién permite calcular el valor del Duty Cycle: PWM duty cicle = (CCPRxL:CCPxCON<5:4>) Tyee TMR2 prec ai en Los registros CCPRIL y los bits CCPICON«5:4> pueden escribirse en cualquier momento, pero no se cargan en CCPRIH hasta que finalice el periodo de la onda PWM actual (es decir que se produce la igualdad entre PR2 y TMR2). En este modo el CCPR1H es de sélo lectura. 142 6. Médulo CCP — Comparador, Captura y PWM | El CCPx se pone a 0, terminando el ciclo de trabajo, cuando el TMR2 mas 2 bits se iguala a CCPxH mas 2 bits Siel ciclo de trabajo de la onda PWM es mayor que el periodo, la sefial que sale por la patilla CCPx esta siempre a 1. La resolucién maxima en bits viene dada por la expresion: ee Font) » 1g2 Por ejemplo, para una frecuencia de PWM de 1.22 kHz con un preescaler de TMR2 de 16 y una frecuencia de reloj de 20 MHz: 1 L —— = (PR2 +1)-4-————-16 aap (PRP + DAs resolucion = "se obtiene un valor de PR2 = 255 (0xFF), y una resolucién de: resolucion = > 10 bits | 20-10° 1200 Ig2 Para poner en marcha el modo PWM se deben dar los siguientes pasos: 1. Configurar el periodo PWM mediante escritura del registro PR2. 2. Configurar el Duty Cycle escribiendo en el registro CCPRIL y los bits CCPICONS:4>. 3, Configurar CCPx como salida mediante el TRISC. 4. Configurar el preescaler del TMR2 y habilitarlo mediante escritura en T2CON. 5. Configurar el médulo CCP para la operacién en modo PWM. 6.5 Modulo CCP en C El compilador C suministra una serie de funciones para el manejo del médulo CCP. Configuracién del médulo CCPx: setup_ccpx (modo); modo hace referencia a los bits CCPxM3:CCPxM0 del registro CCPxCON (figura 4). 143 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Figura 4. Modos de SETUP_CCPx(MODO) Los valores para comparar se fijan en los tegistros CCPRx. En el compilador C, estos registros estan definidos en el fichero include, por ejemplo en el 16F87x.h: ‘SETUP_CCPx(MODO); ‘MODO Registro COPxCON (THON) ccP_OFF Deshabilitacian (00000000 (00h) (CCP_CAPTURE_FE Captura por flanco de bajada_| 00000100 (04h) ‘CCP_CAPTURE RE ‘Captura por flanco do sublda_| 00000101 (08h) ‘CCP_CAPTURE DIV 4 Captura tras 4 pulsos ‘00000110 (06h) ‘CCP_CAPTURE_DIV_16 “Captura tras 16 pulsos (00000114 (07h) ‘CCP_COMPARE SET_ON MATCH | Salidaatencomparacién | 00001000 (08h) ‘CCP_COMPARE CLR_ONMATCH | Salidaa0encomparacién | 00001001 (0A8) ‘CCP_COMPARE_INT InterrupeiGn en comparacién | 00001010 (OAn) CCP_COMPARE RESET_TIMER | Reset TMRen comparacion | 00001011 (OBh) ‘ccP_PwM Hablitacién PWM ‘00001100 (Och) long CCP_1; long CCP_2; #byte CCP_1= 0x15 #byte CCP_2=0x1B tbyte CCP_1_LOW = 0x15 #byte CCP_2_ LOW =0x1B byte CCP_1_HIGH = 0x16 #byte CCP_2_HIGH = 0x1C Definicién del ciclo de trabajo para PWM: set_pwmx_duty (valor); valor: dato de 8 o 16 bits que determina el ciclo de trabajo, Este valor, junto con el valor del preescaler del TMR2, determina el valor del ciclo de trabajo. En la configu- racién del TIMER2, el postcaler debe valer 1. Figura 5. ejemplo 1 6. Modulo CCP - Comparador, Captura y PWM e Ejemplo 1: Medir el ancho de un pulso mediante el médulo CCP (figura 5). Componentes ISIS: PICI6F876 y LMOIGL. Instrumentos: OSCILLOSCOPE y Genteradores: PULSE. Se utiliza el modo captura del CCP, configurandolo para que detecte el flanco de subida o de bajada del pulso a medir. Este ejemplo es similar al ejemplo 4 del tema de interrupciones, pero en ese la detecci6n era por interrupcién de RBO. Cada vez que se produzca una deteccién de flanco, el valor del TMR1 pasara al registro del médulo CCP. include <16f876.n> ffuses xT, NowOT fuse delay (clock=4000000) Finclude fbyte PIRI~Ox0c intl nuevopulso=0; //Entra otro pulso intl6 TFB=0,1P3-0;7P=0; /1 Tiempo flancos float AP=0.0; /ialor final del ancho de pulso intl cambio 7/cambio de flanco de disparo #int_copl void copt_int)( //Punci6n interrupeién if (cambio==0) ( //#lanco de subida TPS=cCP_1; (Carga del valor del registro CCPRI en flanco subida setup_cepl(CCP_CAPTURE_FE); //Configuracién modo Captura en flanco bajada canbio-1; //control de cambio de flanco ) else { /(#lanco de Bajada TFB=CCP_1; /(earga del valor del registro CCPRI en flanco bajada setup cep! (CCP_CAPTURE_RE); //Configuracién modo Captura en flanco subida cambi: (Control de cambio de flanco 4f(nuevepuiso—0) { //€in de pulso... nuevopulso-1+ //pulso a medir d ? void main() ( lod init (+ setup timer 1(T1_INTERNAL); — //Contiguracién THRI setup_cepi (CCP_CAPPURE_RE); —//Configuracién moda Captura en flanco subida cambio = 0; /foontrol de cambio a 0 145 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC enable interrupts (int_ccp1); //labilitacién interrupcién modulo CCP enable _interrupte(global); —-//#abilitacién interrupcién global do { if (nuevopulso==1) { /1ePulso nuevo? P= (TEB-TES) > //ancho de puso. AP = TF*1.0; //ancho de pulso en microsegundos (a 4 Miz:1 us) printf (led_putc,“\nPulso = %6.1fuS “, AP); nuevopulso=0; //Pulso ya medido, espera nuevo 5 } while (TRUE); Figura 6. Programa del ejemplo 1 Ejemplo 2: Generar una seiial cuadrada de 2 kHz mediante el médulo CCP (figura 7). Componentes ISIS: PICI6F876 y LMO16L. Instrumentos: OSCILLOSCOPE y COUN- TER TIME. Figura 7. Ejemplo2 Se utiliza el modo comparacién del CCP, configurandolo en modo conmutacién del pin CCP por comparacién. Este ejemplo es similar a los ejemplos 1 y 5 del tema de intetrupciones, pero en esos la deteccién era por interrupcion del TRMO y TMR2, respectivamente. 146 6, Médulo CCP — Comparador, Captura y PWM EI médulo CCP compara continuamente el valor de TMRI con el valor prefijado; cuando se produce la igualdad se produce el cambio de estado del pin CCP y la activacién de la interrupcién del médulo CCP. En cada conmutacién se debe fijar el valor a comparar para obtener una onda cua drada (un ciclo de trabajo del 50%), es decir un semiperiodo de 250 ps (a 4 MHz el ciclo maquina es de 1 j1s), por lo tanto, el CCP2 se debe cargar con este valor (ajus- tando el valor final es de 199). #include <16£876.h> #fuses x7,NonDT intl cambio-0; //ariable de control de canbio #int_cop2 void cop2_int()( /(Punciéa de interrupcién if (++cambio-=1) setup_ccp2 (CCP_COMPARE_CLR_ON_MATCH) + //Modo Comparacién, cambio a 0 } elses setup_cop2(CCP_COMPARE SET ON MATCH); //Modo Comparacién, cambio a 1 } set_timeri(0)+ //eorvado de TsRi cce_2 = 199; (ftnicializacién del registro CCPR2 para un Duty del 508 , void main() ¢ disable_interrupts (global) ; setup_timer 1 (T1_INTERNAL | 1_DIV BY_1); //Configuracién "MRI setup_cop2(CCP_COMPARE SBT ON MATCH); //Configuracién inicial modulo CCP CCR 2 = 1997 //tnicializacién del registro CCPA2 //oara un Duty del 50% enable interrupts (int_ccp2); //Habilitacién interrupcién modulo CCP2 enable_interrupts (global): /f¥abilitacién interrupcién general dof } while (reve) s ) Figura 8. Programa del ejemplo 2 Ejemplo 3: Mediante la configuracién del médulo CCP lanzar una conversién AD, auto- ‘mitica cada 1 ms. Con el valor obtenida se realizaré una conversién DA utilizando el PWM un filtro paso-bajo (figura 10). Componentes ISIS: PICI6F876, CAP, CELL, LED-BAR- GRAPH-GRN, LM3914, POT-LIN y RES. Instrumentos: OSCILLOSCOPE. Se configura el médulo CCP2 en modo comparacién con accién especial de disparo, cuando se produce la igualdad se resetea el TMR1 se y se lanza una conversin AD, si est habilitada. Cargando el registro de CCP2 con el valor adecuado se consigue 147 Compilador C CCS y Simulador PROTEUS para Microcontrotadores PIC que, cuando coincida con el valor de TMRI, se produzca una conversién AD, en este caso cada 1 ms. Dado que la frecuencia de trabajo es 4 MHz (1 ms/1 j1s=1000), el registro CCP2 se carga a 1000. Figura 9. Seal de 2 KHz (ejemplo 2) Con el valor obtenido de la conversion se puede obtener una sefial PWM propor- cional a este valor. Para ello se utiliza el médulo CCP1, dado que el valor de la con- versin es de 10 bits y el registro del médulo PWM también es de 10 bits, el valor puede ser transferido directamente. El periodo de la sefial PWM viene fijado por el TMR2, con un prescaler y un postcaler de valor 1 y un valor de registro PR2 de 224, lo que implica un periodo de 225 1s (4444 Hz). Si dicha sefial es filtrada con un filtro de paso bajo se obtiene una corriente continua proporcional al valor de la conversién. Como aplicacién se puede aplicar esta sefial a.una barra de /eds y obtener una sefial luminosa proporcional a la sefial adquirida (voltmeter). Para ello se utiliza el circuito integrado LM3914 (figura 11) En la figura 10 se observa el funcionamiento del circuito; con una pila y un poten- ciémetro se varia la tension de entrada, la cual es muestreada cada 1 ms. Con este valor se genera una sefial PWM (ver canal A del osciloscopio) y mediante el filtro de paso bajo se obtiene la tensi6n media proporcional (ver canal B del oscilosco- pio). Dicha tensidn se inyecta a la entrada del LM3914 que proporciona la sefial a los leds 148 i Ht I ad Figura 11. Aplicacion tipica del LM3914 (cortesia National SMC) finclude <16f676.h> device ade=10 #fusee xt/NONDT inti6 valor; #int_ad 149 Compitador C CCS y Simulador PROTEUS para Microcontroladores PIC TERNAL) 1 Relo ) while (TRUE); Figura 12. Programa del ejemplo 3 Figura 13. Sehal modulada y sefal filtrada 150 6 Medulo cc Comparador, Captura y PWM Puede detectarse un error en el médulo CCP en modo PWM con valores altos (ver el iiltimo ejemplo de este capitulo). Ejemplo 4: Mediante la configuracién del médulo CCP lanzar una conversién AD auto- imitica, Con el valor obtenido representar la tensién de entrada en un display grifico (fi- gura 14). Componentes ISIS: PICI6F877, CELL, VSIN, LGM12641BSIR. Instrumentos: OSCILLOSCOPE. Eneste ejercicio hay que tener en cuenta dos factores, Por un lado que la frecuencia de muestreo debe ser, por lo menos, dos veces mayor que Ja frecuencia a mues- trear; en este caso sila frecuencia de muestreo es de 5 KHz (200 us), la frecuencia de la senal a muestrear debe ser inferior a2 KHz. Por otro lado, hay que ajustar el rango de tensién de entrada a valores positivos. Se utiliza una fuente de continua de 2.5 V para elevar una fuente senoidal de 5 V de pico a pico con una frecuencia de 10 Hz (también se puede desplazar la tensién con el offset de la fuente VSINE). Para representar esta tension se ajusta el tamario de la pantalla: en el eje de las X el tiempo (de 1 a 128 pixeles), en el eje de las Y la tension (de 1 a 64 pixeles). Figura 14. Ejemplo 4 Hanelude <16£877.n> #device ade=10 151 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC fuse delay (clock=20000000) #£uses HS, NOWDT finclude include int16 valoz; float tension; #int_ad void ad_int(){ //funcién interrupcién AD valor=read adc (ADC_READ_ONLY); /ivalor de fuente analévica... ecp_2=1000; /ixeinicia cuenta i void main() { int® xa=128,y. gled_init (ON); disable_interrupts (global) + setup_ade_potts (ANO)+ /Hiabiistacién RAO analégico setup _adc(AD@_CLOCK_INTERNAL) + //Reloj interno RC set_ade_channel (0); U{canai 0 setup_cop2 (CCP_COMPARE_RESST_TIMER) //CCP2 mode COMPARACION.. // y disparo especial setup_timer_1(T_INTERNAL | T1_OIV_B¥ 1); /{Contigneactén TRI set_timer (0) /feuesta a 0 cep_2-10007 //twestreo cade 200 us @ 20 Miz enable_interrupts (INT_AD) + //abilitacién Interrupeién AD enable_interzupts (global); //Rabilitacion Inverrupcién global gled_fillscreen (0) ; //Borrade de pantalla gled_Line (1, 64,1/1,1)5 //lineas de xe y gled_dine(1,31,128,32,2)3 do f tension=(valor*5.0)/1024.0; /f'tin en voltios (de 0a Sv) ya=1.0#12.6¢tension; _//Escalado de vin, y de 1 a 64 (y=1+64/5+Vin) gled_pixel (xa,ya,1) xa-7 ' AE (xa<2) ixa=1287 //eje de tiempos (x de 1 a 128) ] gled fillscreen (0); gled_Line(1,64/2,1/1)7 //lineas de xe y gled_Line(1, 31,128, 31,1, 2 } while (TRUE); Figura 15, Programa del ejemplo 4 152 6. Médulo CCP — Comparador, Captura y PWM Ejemplo 5: Realizar un control PID para regular la temperatura de un horno (figura 16). Componentes ISIS: PIC16F877, IRL1004, OVEN, RES y CELL. Instrumentos: OS- CILLOSCOPE. Figura 16. Ejemplo 5 Uno de los controladores mas comunes que se utilizan en el control de temperatura es el PID (Proporcional-Integral-Derivada). Sin entrar en teoria de control, se pue- de indicar que un controlador PID responde a la siguiente ecuacién: uO eorge foe sory 0. ae donde e(t) es el error de la serial y u(t) es la entrada de control del proceso. K, es la ganancia proporcional, T, es la constante de tiempo integral y T, es la constante de tiempo derivativa. En el dominio s, el controlador PID se puede escribir como: 1 U(s)=K, | 1+ — + T,s EG) Ts Un controlador PID tiene tres pardmetros (K,,, T,) los cuales interactian uno con el otro y su ajuste para obtener el mejor conirol puede ser muy complicado. 153 Compilador C CCS y Simulador PROTEUS para Microcontrotadores PIC Ziegler/Nichols sugirieron valores para los parametros del control PID basados en andlisis de lazo abierto y lazo cerrado del proceso a controlar. En lazo abierto, mu- chos procesos pueden definirse segiin la siguiente funcién de transferencia: Kye G(s) =2 = (l+s7) donde los coeficientes x, t, y ¥) $e obtienen de la respuesta del sistema en lazo abier- toa una entrada escalén. Se parte del sistema estabilizado en y(t) = y, para u(t) =u, se aplica una entrada escalén de u, a u, (el salto debe estar entre un 10 y un 20% del valor nominal) y se registra la respuesta de la salida hasta que se estabilice en el nue- vo punto de operacion. Figura 17. Respuesta de salida a una entrada escalon Los pardmetros se pueden obtener de esta respuesta: tT = ~h % ahh eam Uy, — Uy Segiin Ziegler/Nochols, las relaciones de estos coeficientes con los parametros del controlador son: 12-7 KT K T=2-t, 1, =0.5-t» 154 6. Médulo CCP - Comparador, Captura y PWM La realizacién de un controlador PID discreto viene dado por la transformada 2: ii U(2)= EK, Pe también: oe -r oa +c(1-27) donde: Existen distintas posibilidades de la realizacién practica de un controlador PID; una de las mas habituales es la realizacién en paralelo (figura 18). Figura 18. Diseno paralelo del controlador PID El algoritmo utilizado para programar el PIC se muestra en la figura 19 de la pagi- na siguiente. El muestreo debe ser mucho menor que el tiempo de establecimiento, del sistema en lazo abierto. En el modelo Ziegler/Nichols se toma un valor T < +,/4 (también puede utilizarse T < y,/10). Un problema asociado a este tipo de disefio es el Hamado “initegral windup”, el cual puede provocar largos periods de sobreimpulsos (overshoot), motivados por los valores excesivos que alcanza la serial de control debico a la acumulacidn en el integrador. Para evitar este problema se suele limitar la sefial de control entre un valor maximo y otro minimo, impidiendo que el integrador actiie cuando se supe- ran esos limites. 155 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC ‘SENAL DE SALIDA 101) ¥ |CALCULO DEL ERROR| STAT} (KT) al Sia CALCULO DEL TERMING INTEGRAL, HA }=B"9(KT) HT) ¥ CALCULO DEL TERMINO DERIVATIVO| dCKT t)=oe(kT)-c° (KT) x ‘CALCULO DE LA SALIDA, A ED =eT 40°96) +40) x TRANSFERENCIA DE yKt) ‘ALACTUADOR I iT) OT) o(kTo)=ekT) tl Figura 19. Algoritmo de programacién del PID En el ejemplo, el control se realiza sobre un horno con una resistencia calefactora. Se actiia sobre dicha resistencia mediante una sefial PWM generada en funcidn del control PID. Para facilitar la simulacién se alimenta la resistencia con una fuente 156 6. Modulo CCP - Comparador, Captura y PWM de corriente continua de 12 V y se modifica su potencia de calentamiento (editar el componente con el botén derecho) a 120 W (figura 20). Figura 20. Caracteristicas del OVEN Dado que la corriente maxima es de 10 A se ha utilizado un MOSFET de potencia, el IRL1004. Como sensor de temperatura se puede utilizar cualquier dispositive NTC, RTD, termopares, etc,; pero el OVEN tiene un terminal que indica la temperatura del hhorno en grados Celsius. Ser este terminal el que se utilice para introducir al PIC la temperatura del horno; dado que la temperatura est medida directamente en grados Celsius es conveniente utilizar (para este ejemplo) un divisor por 100 que permita obtener el valor en milivoltios de la temperatura (25 °C serin 250 mV). Figura 21. Caracteristicas del OVEN 157 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC La temperatura a alcanzar (0 set point) se podria introducir por teclado (y LCD) pero, para simplificar, se establece directamente en el programa (se deja al lector modificar dicho programa para poder variar la temperatura de set point). La tempe- ratura inicial se puede modificar en el menti de edicién del componente OVEN. El resto de caracteristicas a modificar en el componente OVEN son (figura 22): ‘© Temperature coefficient (VPC): da una idea de la temperatura que alcanzara el horno segiin la tensién aplicada. Valor: 1 V/°C. © Oven time Constant (sec): es la constante de tiempo del horno. Para evitar una larga simulacién se ajusta a 10 segundos. ‘+ Heater time Constant (sec): es la constante de tiempo del calefactor. Para evitar una larga simulacién se ajusta a 1 segundo, + Thermal resistance to ambient (°C/W): resistencia térmica horno-ambiente. Se ajusta al mismo valor que el dado por defecto, 0.7. (moc Yate USA Mod Fi Adnend Pests “prc Ienpour ) [thond eadanes tarot 7 Tie Caa ee oom Ye Cte i iv Figura 22. Caracteristicas del OVEN Para determinar los parametros (kt, y Y,) del control PID basados en el anilisis de lazo abierto segiin Ziegler/Nichols, se realiza un andlisis transitorio del horn con una entrada escalén de 0a 2 V (10% a 20% del valor nominal); ver figura 23. Para trazar la grafica se utiliza la Simulation graphs en el ISIS (figura 24); el tipo interactive. En el comando GRAPH/ADD TRACE (figura 25) se afade la traza de Ja sonda de tension colocada en la salida de temperatura del horno. Al realizar Ja simulacion temporal de la forma habitual (0 con la barra espaciadora) se lanza también la simulacién gréfica y durante el tiempo fijado en la gréfica (editando sus caracteristicas -figura 26-), el valor de la sonda se reflejard en dicha gréfica (se deja abierto el interruptor un tiempo y después se cierra para provocar el escalén 158 6. Modulo CCP — Comparador, Captura y PWM de entrada). Realizando una pulsacién en la barra de titulo de la grafica se puede ampliar y utilizar un cursor para realizar las medidas; también se puede exportar la grafica aun fichero. Figura 25. Mend Graph 159 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC De la recta de maxima pendiente se deducen los pardmetros x, t, y yy definidos ieee Figura 26. Caracteristicas del grafico para el anilisis en lazo abierto de Ziegler/Nichols (figura 27). 160 4 5.5-4.5 fy =b-h =18.5-5.5=13 276-25 =——— = 125.5 2-0 Figura 27. Determinacién de los parametros ky t, ¥ Vy Los pardmetros K,, T, y T, se calculan en base a éstos: 1.2413 ee Yo Kt 12551 T,=2-1)=2-1=2 T,=0.5-) =0.5-1=0.5 = 0.1243 6, Médula CCP — Comparador, Captura y PWM Los parametros del controlador discreto se calculan en base al tiempo T que segiin Ziegler/Nichols es de 0.1 s por ser menor de T <, /4. a=K, =0.1243 K,°T _0.1243-0.1 0.0062 2 Ty _ 0.1243-05 _ 9 6015 01 INCLUDE <16F977.n> fdevice ade=10 fuse delay (clock=#000000) #fuses XT,NOWDT ‘BYTE TRISC = 0x87 void main() { intlé valor; i //lectura de temperatura int16 conteol; /fvalor del Pit Moat a,b,cr /(constantes del PID float temp Limit; //temperatura a aleanzar float x7,eT,iT,d?,y2,uT,i70,eT0,i7 1,eT_1; //variables de ecuaciones float max,min; //limites maximo y minimo de control min=0.0; //inicializacién variables max-1000.07 40:120.07 en i-0.97 20.1283; /leonstantes del PID b=0.0062 o-0.62157 temp _1imit=500.0; /(lemperataca 2 alcanzar RISC~O; setup timer 2(t2_div by 4,249,1)+ //periodo de 12 sefal PWM a ims setup cep! (cep_pxm) : //ti6dui0 CCP a modo PAN setup_ade_ports(all analog) ; ‘/{Puerto A analégico setup_adc (ADC_CLOCK_INTERNAL) ; /frelo} convertidor AD interno set_ade_channel (0)s /fuectura por @1 canal 0 while(1) { valor=read_adc()+ //iectura de la temperatura yT-valor*5000.0/1024.0; //eonversién a mV (0.25V a 250mV) xTeterp_linit; erert-yr; (/ealeule error ATeb*eT+iT0; //céloule del término integral 161 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC pac* (eT-eT0) 7 //calcutoe del términd derivativo utmitvateTtd?, //eAlcule de la salida PID if (ut>max) ‘1 //Salida PID si es mayor que ei MAX utemaxs J else { if (uTemin){ //Salida PID si es menor que el MIN uteming} } controleu?y //transterencia de salida PID a sefal Pum set_pwml_duty(control); in0-iTy //Guardar variables eT0=097 delay_ms (100); /(Tiempo de mestrec 1 Figura 28, Programa del ejemplo 5 La respuesta del sistema se muestra en la figura 29; si se reduce el tiempo de mues- treoa 1 ms se reduce el sobreimpulso (figura 30). Figura 29. Respuesta con T= 100 ms 162 6. Médulo CCP — Comparador, Captura y PWM Figura 30, Respuesta con T= 1 ms Ejemplo 6: Problemas en la simulacién del médulo CCP en modo PWM cont el ISIS (figu- ra 16). Componentes ISIS: PICI6F876. Instrumentos: OSCILLOSCOPE. Se ha detectado un problema, que pronto seré resuelto por LabCenter, en el médu- lo CCP trabajando en modo PWM. Los valores del dutty pueden ir de 0 a 1023 dan- do una sefial modulada desde 0 V con el valor 0a 5 V con el valor 1023; pero en el ISIS, a partir del valor 900 la sefial se convierte en una sefial cuadrada con un ciclo del 50% y un periodo doble del que tenia. En el ejemplo se observa este defecto. Figura 31. Ejemplo 6 163 Compilador ¢ CCS y Simulador PROTEUS para Microcontroladores PIC Figura 33. PWM con valor mayor de 900 164 #include <16f976.h> #fuses XT, NONOT fuse delay (clock=4000000) intis i; void main() ( setup. timor_2(12_DIV_BY.1,224,1); //PR2-224, Tpwa~225ua setup_cop] (CCP_PWH) 7 For (im071<1024;i++) ( set_pwmi_duty (i); dolay_ms (25); i See | 6. Modulo CCP — Comparador, Captura y PWM /#ECPL en modo PRM //a Duty de Pa Figura 34, Programa del ejemplo 6 165 7. Transmision serie Capitulo 7 Transmision serie 7.1 Introduccion Los PIC utilizan, entre otros, dos modos de transmisién en serie: * El puerto serie sincrono (SSP). * La interfaz de comunicacién serie (SCI) 0 receptor transmisor serie sincrono- asincrono universal (UISART). EI SSP se suele utilizar en la comunicacién con otros microcontroladores 0 con pe- riféricos. Las dos interfaces de trabajo son: * Interfaz serie de periféricos (SPI): desarrollada por Motorota para la comu- nicacién entre microcontroladores de la misma, o diferente, familia en modo maestro-esclavo; Full-duplex. * Interfaz Inter-Circuitos (FC): Interfaz desarrollado por Philips, con una gran capacidad para comunicar microcontroladores y periféricos; Half-duplex. La configuracién USART (transmisor-receptor serie sincrono-asincrono universal), también conocido como SCI (interfaz de comunicacién serie), permite la comunica- cién con un ordenador trabajando en modo full-duplex asincrono 0 con periféricos trabajando en modo half-duplex. En general, puede trabajar de dos formas: * Asincrono (full-duplex). # Sincrono (half-duplex). Otros tipos de comunicacién soportados por los PIC son: 1-Wire bus, LIN (Local Interconnect Network), USB (Universal Serial Bus), el CAN (Controller Area Network) y Ethernet. 167 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC 7.2 El modulo USART/SCI 7.2.1 Introduccién Algunos PIC disponen del médulo de comunicacién serie USART/SCI, tal vez el més utilizado entre los médulos de interfaz serie. La principal funcién del USART es la de transmitir 0 recibir datos en serie. Esta operacién puede dividirse en dos categorias: sincrona o asincrona, La transmisién sincrona utiliza una sefial de reloj y una linea de datos, mientras que en la transmi- sién asincrona no se envia la sefial de reloj, por lo que el emisor y el receptor deben tener relojes con la misma frecuencia y fase. Cuando la distancia entre el emisor y el receptor es pequejia se suele utilizar la transmisién sincrona, mientras que para distancias mayores se utiliza la transmisi6n asincrona. El USART puede transmitir o recibir datos serie, Puede transferir tramas de datos de 8 09 bits por transmisin y detectar errores de transmisién. También puede ge- nerar interrupciones cuando se produce una recepcién de datos o cuando la trans- misin ha sido completada. Algunos PIC tienen un USART direccionable 0 AUSART (Addresable USART) que utiliza el noveno bit de datos para distinguir entre la recepcién de datos o de direc- cién. En algunos PIC se ha mejorado el médulo USART dando lugar al EUSART 0 USART mejorado, el cual permite la deteccién automatica de baudios, el despertar automatico al recibir la seal de sincronismo o la transmisién del cardcter Break de 12 bits, permitiendo su utilizacién en sistemas de redes de interconexién local (bus. LIN). Basicamente, la transmisién serie consiste en enviar los datos bit a bit a través de una linea connin en periodos de tiempo fijos, dando lugar a la llamada velocidad de transmisién o numero de bits enviados por segundo (baudios). Tanto el emisor como el receptor poseen registros de desplazamiento para realizar la comunica- cién. Los bits estan codificados en NRZ (nivel alto: 1, nivel bajo: 0), NRZI (cambio de nivel: 1, sin cambio de nivel: 0), ete. En el modo sincrono se permite la transmisién continua de datos y no existe un limite de tamajio, es un modo senti-duplex (la comunicacién serie se establece a tra- vés de una tinica linea, en ambos sentidos, pero no se puede transferir informacion en ambos sentidos de forma simulténea), En este modo de transmisién se puede trabajar de dos formas: * Enmodo Maestro, donde el microcontrolador maestro genera la serial de reloj inicia o finaliza la comunicaci6n. * Enmodo Esclavo, donde el microcontrolador esclavo recibe la sefial de reloj y depende del microcontrolador maestro para recibir o enviar informacién. 168 7. Transmisi6n serie Figura 1. Transmisién sincrona En el modo asincrono se emplean relojes tanto en el emisor como en el receptor. Ambos relojes deben ser de igual frecuencia y deben estar en fase o sincronizados. La frecuencia de reloj se acuerda antes de la transmisién configurando la velocidad mientras que la sincronizacién se realiza durante la transmisién. Cada trama de datos tiene un tamaio fijo y poseen un bit inicial o de arranque (start) y un bit final o de parada (stop) que permiten realizar dicha sincronizacién. La transmisiGn es en modo full-duplex (se utilizan dos lineas, una transmisora -TX- y otra receptora -RX-, transfiriendo informacién en ambos sentidos; se puede transmitir y recibir informacién de forma simultanea). 0 if Bit start Bit stop Figura 2. Transmisién asinerona EI modo mas habitual de transmisién por el USART es el modo asincrono, pues- to que permite comunicaciones en largas distancias. Existen distintas normas de transmisién serie asincrona, como la RS232, la RS485, etc. Los niveles de tensién. empleados en estas normas son diferentes al empleado por el PIC. Por ello, suele ser necesaria la utilizacién de circuitos externos de adaptacién Los terminales utilizados en el modulo USART son el RC6/TX/CK y el RC7/RX/DT: + Enel modo sincrono maestro, el pin RC6/TX/CK se utiliza como sefial de reloj (de salida) y el RC7/RX/DT como linea de datos a enviar o recibir. * Enel modo sincrono esclavo, el pin RC6/TX/CK se utiliza como sefial de reloj (de entrada) y el RC7/RX/DT como linea de datos a enviar o recibir. * Enel modo asincrono, el pin RC6/TX/CK se utiliza como terminal de transmi- sidn de datos y el RC7/RX/DT como terminal de recepcidn de datos. Los registros asociados al médulo USART/SCI son: * SPBRG: Generador del ratio de baudios. * TXSTA: Estado de transmisién y control. 169 + RCSTA: Estado de recepcién y control. + TXREG: Registro de datos de transmisi6n. + RCREG: Registro de datos de recepcién. * PIR1: Flag de interrupcisn. PIE1: Habilitacién de la interrupcion. Registro TXSTA (direccién RAM: 98h) [PIC16F87x] bit 7: bit 6: bit 5: bit 4: bit 3: bit 2: 170 Figura 3. El registro TXSTA CSRC: Bit de seleccién de la fuente de reloj. En modo asincrono no interviene. En modo sincrono: 1 = Modo maestro (genera senal de reloj mediante BRG). 0 = Modo esclavo (fuente de reloj exterior). TX9: Bit de habilitacién de la transmisién de 9 bits: de 9 bits. = Transmisin de 8 bits. Transmisi TXEN: Bit de habilitacién de la transmisién: 1 = Transmisi6n habilitada. 0 =Transmisién deshabilitada. SYNC: Bit de seleccién del modo del USART: 1 =Trans ién sincrona, 0 = Transmisién asincrona. No implementado. Se lee como 0. BRGH: Bit de seleccién del valor de baudios. Modo asincrono: 1 = Alla velocidad. 0 = Baja velocidad, No se utiliza en el modo sinerono. 7. Transmisi6n serie bit 1: TRMT: Bit de estado del registro TSR: 1=TSR vacio. 0=TSR lleno. bit 0: TX9D: 9 bit de datos transmitidos. Puede ser el bit de paridad. Boi REGISTRO DE DESPLAZAMIENTO DE SALIDA| Figura 4, Esquema del proceso de transmision El USART puede configurarse para transmitir 8 0 9 bit de datos configurando el bit TX9 del registro TXSTA. Si se utiliza el formato de 9 bits, el noveno bit debe colocarse en el bit TX9D del registro TXSTA antes de escribir los 8 bit en el registro TXREG. Ura vez estan todos los bits en dicho registro, son transferidos al registro de desplazamiento de transmision (TSR). Desde alli son transmitidos al ciclo de reloj por el pin TX comenzando por el bit de siart y terminando por el bit de stop. Figura 5. El envio de las tramas Registro RCSTA (direccién RAM: 18h) [PIC16F87x] RW RWO Ro RO RO cae en Biro Figura 6. El registro RCSTA bit 7: SPEN: Bit de habilitacién del puerto serie. 1= Habilitado (RX/DT y TX/CK como puerto serie). 0=Deshabilitado. m1 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC bit 6: RX9: Bit de habilitacion de la recepcin de 9 bits. 1 =Recepcidn de 9 bits. 0 =Recepcion de 8 bits. bit 5: SREN: Bit de habilitacién de recepcién sincrona. No utilizado en modo asincrono. Modo sincrono: 1 = Recepcién unica habilitada. 0 = Deshabilitada. (Se pone a 0 después de una recepcién completa). bit 4: CREN: Bit de habilitacion de recepeidn continua, Modo asincrono: Habilitada. Deshabilitada. Modo sincrono: 1 = Habilitada hasta que el bit CREN es puesto a 0. 0 = Deshabilitada. bit 3: No implementado. Se lee como 0. bit 2: FERR: Bit de error de trama. 1 = Error (Ge actualiza al leet RCREG). 0=Noerror. bit 1: OERR: Bit de error de overrrun. 1 =Error (Se pone a 0) si CREN es 0). 0=Noerror. bit 0: RX9D: 9 bit de datos transmitido: t] (REGISTRO DE DESPLIZANIENTO OE ENTRADA [" Buffer Figura 7. El esquema del proceso de la recepelén de datos 172 7. Transmisi6n serie El USART puede configurarse para recibir 8 0 9 bit configurando el bit RX9 del registro RCSTA. Después de la deteccin del bit de start, los 8 0 9 bits entrantes por el pin RX son desplazados por el registro de desplazamiento de entrada (RSR) uno a uno. Después de que el ultimo bit ha sido desplazado dentro, el bit de stop es testeado y el dato (el paquete de bits) es transferido a un buffer el cual, a su vez, lo transfiere al registro RCREG si esta vacio. El buffer y el registro RCREG forman una FIFO de dos elementos (el primer dato que entra es el primer dato que sale). En el caso de transmisién de 9 bit, el noveno bit pasa la bit RX9D del registro RCSTA del mismo modo que los otros 8 pasan al registro RCEG. Algunos dispositivos tienen un USART modificada, llamado AUSART o USART direccionable, que permite filtrar autométicamente ciertas transmisiones. Los datos recibidos son separados en dos categorias, direccién y datos, que se indican por el noveno bit. Sdlo los bytes de direccién son procesados por el USART, los datos son ignorados. Este echo se utiliza normalmente cuando hay varios dispositivos en un bus y las transmisiones se direccionan a uno en concreto. Los dispositivos que reciben la transmisién ignoran todos los bytes de datos con el noveno bit a0 y sélo reciben los bytes de direccién con el noveno bit a 1. Cuando se recibe el byte de di- mn y coincide, el dispositive puede pasar a recepcién normal y recibir el resto re de los datos. En este tipo de dispositivos el bit 2 del RCSTA es: bit 3: ADDEN: Bit de habilitacién de deteccién de direccién I-Habilitada (Sdlo si RX9=1) 0-Deshabilitada REGISTRO DE DESPLAZAMIENTO DE ENTRADA| 4 Large solo si 1 Figura 8. Esquema del proceso de recepcién en los AUSART Registro SPBRG (0x99) [PIC1GF87x] La velocidad de comunicacién se controla por el valor cargado en este registro. Genera el reloj que permite la comunicacién. La velocidad se expresa en baudios (bit/s). 173 Compilador C CCS y Si PROTEUS para Microcontrol: En modo asincrono: BRGH-0 (baja velocidad) BaUbIOS = ——L08C 64-(SPBRG +1) BRGH=(alta velocidad) BAUDIOS = Fosc -(SPBRG +1) En modo sincrono: saupios = —J0% 4: (SPBRG +1) Siempre hay que considerar un margen de error. 7.2.2 El médulo USART en C Configuracién genérica del USART: #USE RS232 (opciones) Esta directiva permite configurar varios parémetros del ISART: velocidad de trans- misién, pins utilizados, etc. Se puede modificar en cualquier parte del programa pero siempre después de haber definido la directiva USE DELAY. Esta directiva habilita el uso de funciones tales como GETCH, PUTCHAR y PRINTF. Permite su uso en dispositivos que no poseen médulo USART mediante software USART. Cuando se utilizan dispositivos con USART, si no se puede alcanzar una tasa de baudios dentro del 3% del valor deseado utilizando la frecuencia de reloj actual, se generard un error. BAUD=X Velocidad en Baudios. XMIT=pin Pin de transmisi RCV=pin Pin de recepcién. Usa un software UART software en lugar del hard- FORCE_SW ware aun cuando se especifican los pines del hard- ware. RESTART WDT Hace que la funcién GETC() ponga a cero el WOT mientras espera un cardcter. BRCHICK Permite velocidades de transmisién bajas en chips que tienen problemas de transmisién. 174 7. Transmisi6n serie ENABLE=pin El pin especificado estara a nivel alto durante la transmisin. Utilizado en transmisién 485. DEBUGGER Permite depuracién a través del ICD. El pin por de- fecto es el B3; usar XMIT y RCV para cambiar el pin (debe ser‘el mismo en ambos). RESTART_WDT Provoca que la funcion GETC() borre el WDT si es- pera un cardcter, INVERT Invierte la polaridad de los pines serie (normalmen- te no es necesario con el convertidor de nivel, como el MAX232). No puede usarse con el LISART inter- no. PARITY=X Donde X es N, E, uO. BITS =X Donde X es 5-9 (no puede usarse 5-7 con el USART interno). FLOAT_HIGH Se utiliza para las salidas de colector abierto. ERRORS Indica al compilador que guarde los errores recibi- dos en la variable RS232_ERRORS para restablecer- los cuando se producen. SAMPLE EARLY No se puede utilizar con USART interno. Provo- ca que el muestreo del dato a través de la funcién GETC() se realice al principio de un bit de tiempo. RETURN=pin Para FLOAT_HIGH y MULTI_MASTER, éste pin se usa para leer la sefial de retorno, Por defecto, para FLOAT_HIGH es XMIT y para MULTI_MASTER es. RCV. MULTI_MASTER Usa el pin de RETURN para determinar si otro mas- ter en el bus esta transmitiendo al mismo tiempo. Si se detecta una colisién, el bit 6 se pone a 1 en RS232_ ERRORS y todos los posibles PUTC() son ignorados hasta que el bit 6 esté a 0. La sefial es comprobada al final y al principio de cada bit de tiempo. No se puede utilizar con USART interno. LONG_DATA Permite manejar INT16 a las funciones GETCO) y PUTC(). En formatos de datos de 9 bits. DISABLE_INTS Provoca la deshabilitacién de interrupciones cuan- do se ejecuta GETC() y PUTC() evitando distorsio- nes en los datos. 175 h Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC STOP=x Numero de bits de stop (por defecto 1) | Para establecer el tiempo que GETC() espera un ca- TIMEOUT=x acter (en ms). Si no se recibe cardcter en este tiem- po, el RS232_ERRORS se pone a 0. Provoca una linea RS232 en modo esclavo sincro- no, haciendo la patilla de recepcién como entrada de reloj y la de transmisién como entrada/salida de datos. SYNC_SLAVE Provoca una linea RS232 en modo maestro sincrono, SYNC_MASTER haciendo la patilla de recepcién como salida de reloj y la de transmisién como entrada/salida de datos. Provoca una linea RS232 en modo maestro sincrono en modo continuo, haciendo la patilla de recepcién SYNC_MATER.CONT | como salida de reloj y la de transmisién como entra- da/salida de datos. UARTI Configurar el XMIT y RCV para el USART1. UART2 Configurar el XMIT y RCV para el USART2. Ejemplos: fuse delay (clock=2000000) ; fuse ra232 (BAUD=9600 , xMt! fuse 6232 (BAUD-9600 , xu MCS ; RCV=PIN CT , BITS=8) M_AZ , RCV=PIN_A3) setup_uart(baud) baud es una constante que define la velocidad. Un 1 enciende el USART y un 0 lo apaga. Con cualquier valor de velocidad, el USART se enciende. En dispositivos que utilizan AUSART se admiten los siguientes pardmetros: UART_ADDRESS UART: sélo acepta datos con el noveno bit a 1. UART_DATA UART: acepta todos los datos. set_uart_speed (baud) Idéntica a la funcién anterior. // $e establece la velocidad mediante 1a combinacién de las patillas BO y BL switch( input_b() 6 3) ( case 0: set_vart_speed(2400); breaks case I: set_uart speed (4600); break, case 2: set_uart_speed(2600); break; case 3: set_uart_speed(19200)7 break; 176 7. Transmisi6n serie Transmisién de datos: pute (cdata) putchar (cdata) edata es un caracter de 8 bits. Esta funcién envia un caracter mediante la patilla XMIT, La directiva #USE RS232 debe situarse siempre antes de utilizar ésta fun- cién, puts (string) string: cadena de caracteres constante o matriz de caracteres terminada con un 0. La funcion puts() manda los caracteres de la cadena, uno a uno, a través del bus RS-232 utilizando la funcion PUTCO); detras de la cadena envia un RETURN (13) y un retorno de carro (10). printf (fname, cstring, values...) estring: es una cadena de caracteres (constante) o matriz de caracteres terminada con un 0. fname: las funciones a utilizar para escribir la cadena indicada; por defecto se utiliza la funcién PUTCO, que permite escribir en el bus RS-232. onlues: valores a incluir en la cadena separados por comas; se debe indicar %nt. El formato es %nt, donde n es opcional y puede ser: 1-9 para especificar cuantos caracteres deben ser especificados; 01-09 para indicar la cantidad de ceros a la izquierda; 1.1 -9.9 para coma flotante. t puede indicar: c | Cardcter. s__ | Cadena o cardcter. Entero sin signo. d__| Entero con signo. Lu_| Entero largo sin signo. Ld_| Entero largo con signo. x Entero hexadecimal (minusculas). X__| Entero hexadecimal (mayisculas). WwW Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Lx _| Entero largo hexadecimal (mimisculas).. LX_| Entero largo hexadecimal (mayisculas), £ _ | Flotante con truncado. g__| Flotante con redondeo. e Flotante en formato exponencial. Entero sin signo con decimales insertados. La 1* cifra indica el total, la 2* W | el mimero de decimales. Recepcién de datos: value=gete() value=getch0) value=getchar() value es un cardcter de 8 bits. Espera recibir un cardcter por la linea RS-232 y de- vuelve su valor. En los dispositivos con USART interno, se pueden almacenar hasta tres caracteres; para evitar esperas se puede usarla funcién KBHIT(). valor = kbhit() valor es 0 (FALSE) si GETC() debe esperar a que Ilegue un cardcter; 1 (TRUE) si ya hay un cardcter listo para ser leido por la funcién GETCO. Ejemplo 1: Enviar los datos del 0 al 10, en modo asincrono, entre dos PIC. Visuwalizar con un LCD los datos enviados y los datos recibidos; la recepcién del dato deberd ser por inter- rupcién del USART. (ver figura 10). Componentes ISIS: PICI6F876 y LMO16L.. Instru- ‘mentos: VIRTUAL TERMINAL. #include <16F876.h> #PUSES XT, NOWDT fuse delay (clock=4000000) fuse 19232(baud=9600, xmit=pin_c6, rcv=pin_c7) #include deoses xT,NowDr fuse delay (clock=4000000) fuse rs232(baud=9600, xnit=pin_c6, rev=p: Pinelude #eyTE TRISA-0x85 1_c7, bits=8) 179 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Figura 11. Programa PIC_2 del ejemplo 1 Con el programa VIRTUAL TERMINAL (boton derecho: Hex display mode) se pue- den visualizar los datos del bus serie (figura 12). ry ro an Cet rear Figura 12. Virtual Terminal 7.2.3 La norma RS232 La norma RS232 es la mas habitual en la comunicacién serie. Basicamente comu- nica un equipo terminal de datos (DTE 0 Data Terminal Equipment) y el equipo de comunicacién de datos (DCE 0 Data Communications Equipment), Las caracteristicas eléctricas de la sefial en esta norma establecen que la longitud maxima entre el DTE y el DCE no debe ser superior a los 15 metros y la velocidad maxima de transmision es de 20.000 bps. Los niveles ldgicos no son compatibles 180 7. Transmisi6n serie TTL, deben situarse dentro de los siguientes rangos: 1 légico entre 3V y -1BV y 0 logico entre +3V y +15V. Se utilizan conectores de 25 patillas (DB 25) 0 de 9 patillas (DB 9) siendo asignado el conector macho al DTE y el conector hembra al DCE. Para una comunicacién full duplex desde el USART del PIC, se debe conectar un minimo numero de sefiales, TXD y RXD asi como la masa (GND). Los PIC utilizan sefial TTL en el médulo USART por lo que se debe utilizar un conversor de nivel a RS232, como el MAX232, Figura 13. Conexion basica full duplex entre PIC y PC En la mayoria de los PC actuales, sobre todo el los portatiles, estan desapareciendo los puertos serie. Como solucién se pueden utilizar cables de conversion SERIE- USB que utilizan el Universal Serial Port (USB), no se debe confundir con la utiliza- cidn del médulo USB integrado en el PIC con gestién de comunicacién USB (ver Ja figura 14). | eee | Bus USB. DisPOsITIVO “aecane usB Pic Figura 14. Diferencia entre un convertidor serie-usb y un médulo USB integrado Estos cables (ver la figura 15) se basan en integrados como el F7232BM de FTDI chip (figura 16) (http://wurw ftdichip.com/Products/FT232BM.htm). En la propia Web del fabricante se pueden encontrar los drivers para la configuracién de Windows (figura 17) y los disefios de un sistema de conversién SERIE-USB. 181 Compitador C c ccs y Simutador PROTEUS para Microcontroladores PIC Figura 16. FT2328M Figura 17. Universal Serial Port ELISIS del PROTEUS proporciona un potente componente que permite la simula- cién a través del puerto serie: COMPIM (figura 18). 182 7. Transmision serie PS 00 oe us es or op i o Figura 18. EI componente COMPIM Utilizando este componente no es necesario afiadir al esquema del PIC un MAX232, ya que el propio componente gestiona la comunicacién con el puerto del PC. Utili- zando este componente podemos comunicarnos con el propio PC (si tiene 2 puer- tos serie o 1 puerto serie y un puerto USB -utilizando el convertidor- como pode- mos ver en la figura 19) y manejar los datos que proceden del PIC con cualquier programa de aplicacién (Visual BASIC, Visual C, etc.). ‘comt CABLE SERIE Com2 HEMBRA-HEMBRA HEMBRA-HEMBRA + USB-SERIE Figura 19. Las conexiones serie-serie o serieusb 183 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC La contiguracién del puerto se realiza como en cualquier componente y se pueden cambiar practicamente todas las propiedades de un puerto serie: mimero de puer- to, velocidad, paridad, ntimero de bits, etc. (ver la figura 20). {it Companent Figura 20. Configuracién COMPIM Ejemplo 2: Enviar los datos de una conversion AD al puerto serie de un PC (figura 21). Componentes ISIS: PIC16F876, COMPIM, POTLIN y LMOI6L. Instrumentos: DC VOL- TMETER y VIRTUAL TERMINAL. Para probar este ejemplo se pueden utilizar dos PC 0 un PC con dos puertos serie 0 un PC con un puerto serie y un puerto USB (utilizando un cable SERIE-USB). Para observar los datos que envia el PIC se utiliza un COMPIM y también se puede utilizar un COMPIM para leer los datos que entran por el PC 0, en este caso, utilizar el HyperTerminal de Windows 0 cualquier otro programa emulador del puerto serie. Por el Virtual Terminal se pueden comprobar los datos de salida y entrada. En este caso se han conectado los dos puertos serie del PC (COM1 y COM? con un cable). Se puede utilizar el HyperTerminal de Windows (Accesorios/Comunicaciones/HyperTer~ minal), configurandolo segiin las siguientes figuras: figura 23, figura 24, figura 25, figura 26 y la figura 27. En este caso se han conectado el puerto COMI del PC y un USB configurado en COMB. 184 f= | Figura 23. El nombre de la conexién Figura 26. El comando Archivo/Propiedades para modificar la visualizacion 7. Transmision serie (ane) (opens Eatin sien ser tine (cede ca nner steer ee Soe, Sie [tae ares se ett nt at et san aed deter Cisee) Cemve) Sir Yalta Str Yoltege 51 YI Sit Voltage 81 Voltage = §29933: Figura 28, La simulacién entre PROTEUS y el PC utilizando el HyperTerminal 187

You might also like