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 Compilador C GCS y Simulador PROTEUS para Microcontroladores PIC #include <16F877.h> fdevice ade=10 #FUSES xt, NOWOT fuse delay (clock=4000000) fuse rs232(baud=9600, xmit=pin_c6, rev=pin_c?, bits=8, parity=N) Hinelude <10D.C> void main() { intl6 a? float pr setup_ade_ports(ANO) setup_ade(ADC_CLOCK_INTERNAL) z Jed init; for (2) { set_ade_channel (0); delay us(10); j gq read adc()s p~ 5.0 *q / 1024.0; printf(led pute, "\fADC = $410", @) printf (led pute, “\nVoltage ~ $01.2£V", p): printf("ADc = $410“, q)+ printf ("Voltage = 801.26V\x", p)7 // \x permite cambiar de linea. delay_ms(100) ; } Figura 29. El programa del ejemplo 2 Ejemplo 3: Enviar un dato desde el PC al PIC por el puerto serie, Cuando lo reciba debe vi- sualizarlo en un LCD y enviar la palabra “recibido” al PC. Emplear interrupciones (Figura 31). Componentes ISIS: PIC16F876, COMPIM y LMO16L. #includs <16F876.h> #FUSES xT, NOWDT fuse delay (clock=4000000) fuse 18232 (baud=9600, xmit=pin ¢6, rev=pin ¢7, bits<8, parity=n) #include char chy #int_raa void serisl_isr() ( ch=getchar(); puts (*Recibido”) 188 7. Transmision serie void maint) t Jed instars enable_interrupts (global) ; enable interrupts (int_rda): while (t) ( printf (led pute, “\a\r Valor $0",ch) + } Figura 30. El programa del ejemplo 3 Figura 31. El ejemplo 3 © Reodebecaace exctosbcalneve Reeode ines 0. weeps figschce 0 eesnis sted sen (Fl ne avarce cigs tins se atin acta Crt cute bic cae AC de 7b El Amari i eiopce larch de amin mea SC eR iE 189 ne 5 os fRecibide Iecibide l2Recibide |iRecibid lRecibide IsRecibide Figura 33. Comunicacién full duplex con el PC 7.3 Puerto serie sincrono (SSP) Los dos modos 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 gran capa- cidad para comunicar microcontroladores y periféricos. Half-duplex. 7.3.1 Interfaz Inter-Circuitos (-C) EI bus P°C se basa en la comunicacién a través de 2 hilos. Cada dispositive co- nectado al bus tiene una direccién. Puede configurarse como comunicacién de un maestro y varios esclavos 0 una configuracién Muiltimaestro. En ambas configura- ciones, el dispositive maestro es el que tiene la iniciativa en la transferencia, decide con quién se realiza, el sentido de la misma (envio 0 recepcin desde el punto de vista del maestro) y cuando finaliza. Cuando el maestro inicia una comunicacién, primero transmite la direccién del dispositivo con el cual se quiere comunicar y los esclavos comprueban si la direccién concuerda con la suya. La transmisién puede 190 7. Transmisi6n serie ser de lectura o escritura, el iltimo bit de la direccién lo indica; asi el maestro estard en transmisién y el esclavo en recepcién o viceversa. En cualquier caso la sefial de reloj la genera el maestro. Los dos hilos del bus PC son dos lineas de colector abierto: la sefial de reloj SCL o pin RC3 y la linea de datos SDA o pin RC4. Se deben utilizar unas resistencias externas o de pull-up para asegurar un nivel alto cuando no hay dispositivos conec- tados al bus. EI numero de dispositivos conectados y la longitud de conexién estan limitados por la capacidad de direccionamiento (de 7 a 10 bits) y por la maxima carga del bus (400 pF). La velocidad maxima estandar es de hasta 100 Kbps, la rapida hasta 400 Kbps y la Alta hasta los 3.4 Mbps Figura 34, Caiculo del valor de R, en funcién de la capacidad y velocidad del bus (cortesia de ST) La transmisién se inicia con un bit de inicio o START y termina con el bit de finali- zacién 0 STOP. START se establece con una transicién de alto a bajo en la linea SDA (normalmente a nivel alto) cuando la linea SCL esta a nivel alto. STOP se establece cuando se produce una transicién de bajo a alto en la linea SDA cuando SCL esta a nivel alto; de esta forma los datos en la linea SDA s6lo cambian en el estado bajo de la linea SCL (figura 35). Figura 35. Condiciones dela transmision 191 Aliniciar la transmisi6n, el master envia la direccién del esclavo con el que desea establecer la comunicacién. La direccién puede ser de 7 0 10 bits con formato de byte (uno o dos bytes respectivamente). Tras la direccién se adjunta un bit de lec- tura/escritura (figura 36) DIRECCION DE 7 BITS: DIRECCION DE 10 BITS Primes by smi por ot sero (Bots Dol Esclavo, fs |< pea | 0 [ace ‘Segundo byte suministrado por ol Maestro Figura 36. Los formatos de direccion Una vez el master envia la direccion (0 datos), el esclavo genera un bit de reco- nocimiento (ACK), si el master no recibe este bit la comunicacién se interrumpe, generando la sefial de STOP. El maestro también puede recibir datos, en este caso es él quién genera la sefial de reconocimiento para cada byte recibido menos para el liltimo, en este caso el esclavo libera la linea SDA y el master genera un STOP. Existe la posibilidad de que el master, tras una transmisién/recepcién, no abando- ne el bus y siga en comunicacién con el esclavo; en esta ocasién genera una nueva condicién de START, llamada START REPETIDA (Sr), idéntica a la anterior pero después de un pulso de reconocimiento. En los PIC de la gama media existen dos médulos que permiten realizar una comu- nicacién PC, el BSSP (Basic Synchronous Serial Port) y el MMSP (Master Synchronous Serial Port), y se diferencian en modo de trabajo maestro. El médulo MSSP permite detectar condiciones de START y STOP por interrupcién. Este médulo puede tra- bajar en tres modos: © Maestro. * Esclavo con direccién de 7 bits. * Esclavo con direccién de 10 bits. Los registros asociados a este médulo son seis: SSPCON, SSPCON2, SSPADD, SSPBUF, SSPSTAT y el SSPSR. 192 7. Transmisi6n serie Registro SSPSTAT (direccién RAM: 94h] [PIC16F87x] Figura 37. El registro SSPSTAT bit7: SMP: Bit de muestreo. ‘SPI en modo maestro: 1 El dato se muestrea al final de ciclo. 0=El dato se muestrea en el medio del ciclo. SPI en modo esclavo: SMP debe ponerse a ( cuando se trabaje en modo esclavo. PC en modo master 0 esclavo: 1 =Deshabilitacién del control Slew rate para una velocidad esténdar (100 kHz i 1 MHz) 0=Habilitacién del control Slew rate para alta velocidad (400 kHz) bit6: CKE: Seleccién de flanco de reloj en modo SPI. CPK=0 1=E1 dato se transmite en el flanco de subida de CKS. 0= El dato se transmite en el flanco de bajada de CKS. CKP=1 1 = El dato se transmite en el flanco de bajada de CKS. 0= El dato se transmite en el flanco de subida de CKS. FC en modo master o esclavo: 1 = Niveles de entrada conforme especificaciones SMBUS. 0= Niveles de entrada conforme especificaciones °C. bit5: D/A: Bit de datos/ direccién (sélo en el modo FC). 1 = Indica que el ultimo byte recibido o transmitido era un dato. 0= Indica que el tiltimo byte recibido o transmitido era una direcci6n. bit4: _P: Bit de Stop (sdlo en el modo FC). 1 = Indica que ha sido detectada una condicién de Stop. 0=No se ha detectado la condicién de Stop. 193 Compitador C CCS y Simulador PROTEUS para Microcontrotadores PIC bit3: S$: Bit de Start (sélo en el modo FC). 1 = Indica que ha sido detectada una condicién de Start. 0 = No se ha detectado la condicién de Start. bit2: R/W: Bit de Lectura/ Escritura (sdlo en el modo PC). Este bit retiene la informacién de lectura 0 escritura después de la ultima deteccién de di- reccién correcta. Sélo es valido desde la confirmacién de direccién hasta el siguiente bit de Start, Stop ono ACK. En FC modo esclavo: 1= Lectura. 0= Estritura. En FC modo master: 1=Transmisi6n en progreso. 0=Transmisién en no progreso. bit 1: UA: Actualizacién de direccisn (s6lo en el modo FC de 10 bits). 1 =Se necesita una actualizacién de direccin en el registro SSPADD. 0=La direccién no necesita una actualizacion. bit0: BF: Bit de buffer lleno. Recepcién (modos SPIe FC): 1 = Recepcién completada, SSPBUF esta lleno. 0 =La recepcién no ha finalizado, SSPBUE esta vacio. ‘Transmisién: 1 =Transmisién en proceso, SSPBUF leno, 0=Transmisién completa, SSPBUF vacio. Registro SSPCON (direccién RAM: 14h) [PIC1G6F87x] Figura 38. El registro SSPCON bit7: WCOL: Bit de deteccién de colisién. Modo master: ‘1 =Se ha producido una escritura en SSPBUF sin que las condiciones del PC sean validas. bit6: bit 5: bit 4: 7. Transmisi6n serie 0=No hay colisién. Modo Esclavo: 1 =El registro SSPBUF ha sido escrito mientras se realizaba una transmisién previa. 0=No hay colisién. SSPOV: Bit de overflow (debe ser borrado por software). En modo SPI: 1=Un nuevo dato se ha recibido cuando atin no se ha leido el dato anterior almacenado en SSPBUF. El dato del registro SSPSR se pier- de y se mantiene el anterior. Sélo se produce overflow en modo esclavo. 0=No hay overflow. En modo FC: ‘= Un nuevo byte es recibido cuando atin no se ha lefdo el registro SSPBUF donde se encuentra el byte anteriormente recibido. 0=No hay overflow. SSPEN: Bit de habilitacién del puerto serie sincrono. En ambos modos, los pines han de ser correctamente configurados como entradas o salidas, En modo SPI: 1 = Habilitacién del puerto serie y configuracién de los pines SCK, SDO, SDLy SS como fuente del puerto. 0 Puerto serie deshabilitado y pines configurados como E/S. En modo FC: 1 = Habilitacién del puerto serie y configuracién de los pines SDA y SCL como fuente del puerto. 0= Puerto serie deshabilitado y pines configurados como E/S. CKP: Bit de seleccidn de la polaridad del reloj. En modo SPI: 1= El estado de reposo para el reloj es el nivel alto. 0= El estado de reposo para el reloj es el nivel bajo. En modo FC esclavo: (control de liberacién de SCK). 1 = Habilitacién del reloj. 0=Mantiene el reloj en estado bajo. 195 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC bits 3:0 SSPM3:SSPMO: Seleccién del modo del médulo SSP. 0000 = SPI, modo maestro, reloj = F..../4. 0001 = SPI, modo maestro, reloj = F,,,./16. 0010 = SPI, modo maestro, reloj =F, /64. 0011 = SPI, modo maestro, reloj = Salida del TMR2/2. 0100 = SPI, modo esclavo, reloj = pin SCK, pin SS habilitado. 0101 = SPI, modo esclavo, reloj = pin SCK, pin $S deshabilitado. Puede usarse como pin de E/S. 0110 = PC, modo esclavo, direccién de 7 bits. Ol PC, modo esclavo, direccién de 10 bits. 1000 = FC modo master, reloj=F, _//4"(SSPADD+1)). 1011 = FC en modo maestro controlado por firmrenre (esclavo inactivo). 1110 = FC en modo maestro controlado por firmware (direccién 7 bit con interrupeién de bit START y STOP). 1111 = FC en modo maestro controlado por firmware (direccién 10 bit con interrupcién de bit START y STOP). 1001, 1010, 1100, 1101 = Reservado. Registro SSPCON2 (direccién RAM: 91h) [PIC16F87x]. RW0 RWO RWO RWO RWO RWO RWO RO ACKSTAT. PEN RSEN | SEN Bito Figura 39. El registro SSPCONZ bit7: | GCEN: Bit de habilitacién llamada general (sélo en modo F'C esclavo). 1 = Habilita la interrupcidn cuando se recibe una llamada general (direccién 0000h) en el SSPSR. 0 = Deshabilitado, bit 6: | ACKSTAT: Bit de estado de reconocimiento (sélo en modo °C master). En modo master transmisién: 1 =No recibido ACK del esclavo. 0 = ACK recibido del esclavo. bit5: | ACKDT: Bit de dato de reconocimiento (sdlo en modo PC master). 196 7. Transmision serie En modo master recepcidn: Valor que sera transmitido cuando el usuario inicie una secuencia de reconocimiento al final de una recepcién: 1=No ACK. 0=ACK. bit4: ACKEN: Habilitacién secuencia de ACK (slo en modo [°C master). En modo master recepcién: 1 = Inicia secuencia de reconocimiento de SDA y SCL, y transmite un ACKDT. Borrado por hardware. 0 = Desactivado. bit3: RCEN: Bit de habilitacién de recepcién (sdlo en modo °C master). 1=Recepcisn habilitada. 0 = Deshabilitada. bit2: PEN: Habilitacién de la secuencia de STOP (sélo en modo FC master). 1 =Inicia condicién de Stop en SDA y SCL. Borrado por hardware. 0=Deshabilitada. bit 1: RSEN: Habilitacién del START repetido (sdlo en modo ?°C master). 1 =Inicia la condicién de SR en SDA y SCL. Borrado por hardware. 0 = Deshabilitada. bit0: SEN: Habilitacién del START (s6lo en modo FC master). 1 = Inicia la condicidn de START en SDA y SCL. Borrado por hardware. 0 = Deshabilitada. El resto de registros son: * El registro SSPBUF (direccién Ram: 13h) es un buffer de transmisién/recep- cién serie: es el registro desde el cual se leen o escriben los datos a transmitir. * Elregistro SSPSR es un registro de desplazamiento SSP (no accesible directa- mente). Desplaza el dato para transmitirlo o recibirlo. En una transmision, el dato se escribe desde el registro SSPBUF, mientras que en una recepcién, se carga el dato de SSPSR a SSPBUF. * El registro SSPADD (direccién Ram: 93h) define la direccién del esclavo los baudios de la comunicacién del master. En este registro se almacena la direccidn del esclavo; en el modo de 10 bits primero se debe cargar el byte alto (1111 0 A9 A8 0) y despues el byte bajo (A7:A0). Otros registros relacionados con él médulo MSSP son el TRISC (direccién Ram: 87h) para definir RC3 y RC4 como entradas. El PIRI/PIE1 (direcciones Ram: 197 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC 0Ch/8Ch) para la gestién de interrupciones (SSPIF/SSPIE). El PIR2/PIE2 (direccio- nes Ram: 0Dh/8Dh) para la gestion de la interrupcién por colisién del bus (BCLIF/ BCLIE) y el INTCON (direcciones Ram: 0Bh/8Bh/10Bh/18Bh) para la habilitacién de las interrupciones de periféricos. 1.1PC enc Configuracién genérica del PC: #use 12C (opciones) Opciones: separadas por comas, pueden ser las siguientes: MULTI_MASTER Establece modo Multimaestro. MASTER Establece modo maestro, SLAVE Establece modo esclavo. SCL=pin Especifica el pin SCL. SDA=pin Especifica el pin SDA. ADDRESS=nn Especifica la direccién en modo esclavo. FAST Utiliza velocidad alta. SLOW Utiliza velocidad baja. RESTART_WDT Borra el WDT mientras espera una lectura. FORCE_HW Utiliza las funciones PC hardware. NOFLOAT_HIGH No permite sefiales flotantes. SMBUS Utiliza el bus en formato SMBUS. STREAM=id Asocia un identificar stream. Esta directiva (FUSE I2C) tiene efecto sobre las funciones 12C_START, I2C_STOP, I2C_READ, I2C_WRITE e 12C_POLL. Se utilizan funciones software a menos que se especifique FORCE_HW. El modo esclavo sélo puede ser usado con el médulo fisico SSP. fuse 12¢ (master, sda fuse I2¢ (slave, sda-PI -PIN_C3, address=0xa0, FORCE_HW) fuse 32C(master, scl=PIN_BO, sda=PIN_B1, fast=450000) Las funciones asociadas son + 12C_WRITEO. + I2C_START(). 198 7. Transmisi6n serie * 12C_READ(. + 12C_STOP(). * 2C_POLLO. * I2C_ISR_STATEO. * 12C_SlaveAddr(). 12C_STARTO; En modo master, esta funcién inicializa la transmisién. Después de la condicién de Start, el reloj es puesto a nivel bajo hasta que se escribe con la funcién I2C_WRITEQ). Si se ama a otra funcién [2C_START antes de un 12C_STOP se esté utilizando un START repetido (Sr). Esta funcién dependerd de la respuesta del esclavo. 2e_start(); //tnieializacién de la transmisién i2e_write(0xa0); //Dixeccién del esclavo i2c_write(address}; //Datos a esclavo i2e_start(); {Restart i2e_write(Oxal)s /{cambio a lectura data=i2e read(0)¢ //Patos del esclave al master, i2c_stop()+ //€inalizacién de la transnisién 12C_STOP 0); Finaliza la transmisién. 12C_WRITE(dato); Dato es un entero de 8 bits que envia por el bus. En modo master, esta funcién genera la sefial de reloj que marca la velocidad de transmisién del dato; en modo esclavo espera la seftal de reloj que genere el maestro. Devuelve el bit de reconocimiento ACK que envia el receptor cuando la transmi- sién ha terminado: 0 indica ACK, 1 indica un NO ACK y-un 2 indica una colisién en modo multimaster. El bit de menor pesor ([sb) del primer dato transmitido tras un START indica el sen- tido de la comunicacién (si el bit es “0”, la informacién se transmitiré de maestro aesclavo). dato = 12C_READ(ACK)); Dato es un entero de 8 bits leido del bus. En modo master, esta funcién genera la sefial de reloj; en modo esclavo espera la sefial de reloj. No hay timeout por lo que se utiliza junto con 12C_POLL para prevenir bloqueos, Opcionalmente se puede incluir un ACK donde 1 indica un ACK y un 0 indica un NO ACK. Se puede borrar el Watciidog mientras se espera a leer el dato, para ello se debe incluir la opcién RESTART_WDT en la ditectiva duse i2c(). 199 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC valor = 12C_POLLO; Se utiliza sélo si el PIC tiene médulo SSP. Devuelve un TRUE (1) si se ha recibido el dato en el buffer y un FALSE (0) si no se ha recibido. Cuando devuelve un TRUE, la funcién 2C_READ() guarda el dato leido. 12C_SlaveAddr(int8 adr); Se especifica la direccién del dispositivo en modo esclavo. estado = 12C_ISR_STATE(); Se utiliza s6lo si el PIC tiene médulo SSP. Devuelve el estado del bus en modo es- clavo después de una interrupcién. Estado es un entero de 8 bits: 0 = Indica direccion coincidente con un R/W a cero. 1-0x7F = El master ha escrito un dato, se debe utilizar 2C_READ(). 0x80 = Indica direccién coincidente con un R/W a uno, responder con 12C_ WRITE(), Ox81-0xFF = Transmisién terminada y reconocida, se responde con 12C_WRITE(). Ejemplo 4: Guardar y leer datos en las 10 primeras posiciones de memoria de una EE PROM FC. Representar los oalores escritos y leidos en un display LCD (figura 40). Com- ponenttes ISIS: PICI6F877, M24512, RES y LMOI6L. Instrumenttos: I2C DEBUGGER. Figura 40. El ejemplo & 7. Transmision serie La EEPROM FC 24512 tiene un byte de control (figura 41) donde la parte alta tiene tun valor fijo (Ah) y la parte baja consta de la direccién impuesta en sus patillas (E2:£0) y el bit de lectura/escritura, de tal forma que si se fijan las entradas de di- reccién a masa, el byte de control puede tener los valores AOh para escritura y A1h para lectura. ‘Device Type center (Chip Enable Asaress oe ‘Dee Sect Cone ee Figura 41. Byte de control del 24512 [cortesia de ST) El formato de escritura es el mostrado en la figura 42, donde tras un START se es- cribe la palabra de control para seleccionar el dispositivo y el modo de trabajo, dos bytes para la direccion de escritura en el dispositivo y el dato a escribir. wo Rese eT r bev set ||| ayTE ADR T Figura 42. El formato de escritura (cortesia de ST) ‘A continuacién se describe una funcién para la escritura en la EEPROM, que debe ser llamada desde el programa principal donde se le pasa la direcci6n a escribir y el dato. void write ext_eepro: Jong int address, BYT jert int status+ start (); //inicializa 1a transmision write (0xa0) ; /fescribe la pa control (dire //0h + 0 para escritura) = write (address>>8); //earte alta de la direccién a escribir en la //E5PROM 2c write (address) ; /ipacte baja de la direccién a escribir en la //BEPROM 2¢_write (data) ¢ /dPato a escribir top) ¢ //Pinatizacién de 1a tranamisién. =_start()+ //Reinicio Lectura del bit /fincorrectas pata evitar escrituras 2 write (Oxa0): Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC while (status~-1) /(84 es 1 esperar a que responda el esclavo i i2e_start(); status~i2c¢_write(0xa0) 7 Figura 43. Funcién de escritura en la EEPROM El formate de lectura puede ser de cuatro formas: lectura de la direccién actual en el bus, lectura de una direccién cualquiera, lectura secuencial a partir de la direccién actual y lectura secuencial a partir de una direccién cualquiera. La forma mas normal es la de leer una direccién cualquiera (figura 44), donde el proceso es muy similar al de escritura y tras una reinicializacién hay dos ciclos donde se indica el modo de lectura y se envia el dato. En este caso, el master debe devolver un NO ACK. es Ri Ack” NOACK am i | | n AOORESS Devel” seven || [escort] [] pay RW 5 Figura 44. Lectura de una direccién cualquiera (cortesia de ST) A continuacién se describe una funcién para la lectura de la EEPROM, que debe ser lamada desde el programa principal donde se le pasa la direccién a leer. BYTE read_ext_eeprom(long int address) ( BYTE datas 420 starts //Inicializa ia transmisién 42c_write(OxA0); //escribe 1a palabra de control (direccién 0h //* 0 para escritura) 42¢_write(address>>8)s //Parte alta de 1a direccién a escribir en la {EEPROM i2e_weite(address) 7 //Parte baja de la direccién a escribir en la //EEPROM $2c_start(); /fieinicio 42¢_write(0xal)+ //escribe 1a palabra de control (direccién Oh //+ 1 para Lectura) datanize read(0) //ectura dei dato 42¢_stop()+ //einalizaci6n de la transmission. return (data) ; Figura 45. Funcién de lectura de la EEPROM 202 7. TransmisiOn serie Para la aplicacién del ejemplo se utilizan estas funciones en el programa princi- pas q include <16F877.h> #£uses XP, NOWDT, NOPROTECT, NOLVE #use delay (clock=4000000) Yuse 12c(Master,sda=PIN_C4,sc1=PIN_C3) /contiguracién 126 #inolude fdetine EEPROM ADDRESS long int void write ext_eepron(long int address, BYTE data) I//incluir 1a funcién explicada anteriormente} BYTE read_oxt_oeprom(Jorig int address) (//incluix la funcida explicada anterioznente) void main() { int valor=0, dator | EEPROM ADDRESS address; q ed_init()+ for (address=0;address<=9;addresst+) { WRITE_EXT_EEPROM (address, valor) ; led_gotory (1/1); printf (1cd_pute, “enviando=#1D”, valor) ; deiay_ms (500) ; valort+ 7 } for (address=0;address<=9;address++) ( dato~READ_EXT_EEPROM( address); Jed_gotoxy(1,2) 7 printf (led_pute, "recibiendo=#10",dato) ; delay _ms (500); Figura 46, El programa del ejemplo 4 En el 12C debugger se pueden seguir las transiciones del bus. En la figura 47 se muestra una operacién de lectura tal como se ha explicado anteriormente. La S significa START, la A es reconocimiento (ACK), la Sr es START repetido, la Nes NO ACK y la P indica STOP (compararla con la figura 44, en este caso la direccién es Oth y el dato es 01h). 203 Figura 47. La operacion de lectura con el 12¢ debugger Ejemplo 5: Leer la temperatura y hora de lectura y guardar los datos ext una EEPROM; utilizar un sensor de temperatura I2C (DS$1621), un reloj en tiempo real [2C (DS1307) y una EEPROM serie 12C (M24512). La lectura se realizard en funcién de una orden dada por el puerto serie; con otra orden se visualizarin los primeros datos de Ia EEPROM en un monitor del puerto serie (figura 48). Componentes ISIS: PIC16F877, M24512, RES, COMPIM, DS1621, D$1307 y LMOI6L. Instrumentos: 12C DEBUGGER. ee sail heey Figura 48. El ejemplo 5 Para facilitar el desarrollo del programa se van ha crear 3 ficheros driver para cada uno de los periféricos. Para la EEPROM serie I2C M24512 se utilizarén los algorit- 204 7. Transmision serie ‘mos descritos en el ejemplo anterior (figura 49). La direccién asignada en el esque- ma es la 0x00. void write ext_eeprom(long int addrees, BYTE data) i short int status; i2e_start(); 2c write (Oxa0) 7 12c_write (addross>>8) ¢ i2c_write (address); ide weiteldsta); i2e_start ()7 status=i2e_write(0xa0) ; while (status=1) i2e_start(); status=ize_write(0xad) ; , BYTE read_ext_eeprom(long int address) ( BYTE datas 42c_stazt(): 42¢_write (Oxa0); i2¢_write(address>>8) 7 i2¢_write (address) ; 426_start(); i2c_write (Oxal); data=i2e_read(0); i2¢_stop (7 return (data); Figura 49. Fichero EEPROM_24512.C Para el reloj en tiempo real DS1307 se necesitan conocer sus caracteristicas y es- cribir el driver. El DS1307 suministra segundos, minutos, horas, dia, mes y afio en tiempo real (mediante una bateria y un cristal de cuatzo exterior permite un fun- cionamiento independiente del sistema). Posee una serie de registros donde apa- recen los datos necesarios (figura 50), los cuales se suministran en cédigo BCD con el formato indicado en la parte derecha de la figura. En este ejemplo sdlo se leeran los segundos, minutos y horas. Para la escritura y lectura del integrado, el fabricante recomienda los ciclos indi- cados en la figura 51. Podemos observar que el ciclo de escritura se inicia con la Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC palabra 0xD0 y la de lectura con 0xD1. En el ciclo de escritura, el segundo byte es un puntero que debe indicar la direccién de inicio (en este caso 0). En el ciclo de lectura se realizara la lectura de los tres primeras direcciones de la memoria del DS1307 (los segundos, minutos y horas), el tiltimo byte debe indicar un NACK al master. Tan sélo queda convertit los bytes en BCD a binario. El fichero se muestra en la figura 52. Gane Mange. a Roaeeile rao [A [poooosnnx| & [oxen [a | P|] on Berta atone a stam ‘ener | Prowse |X ase Maneatis ipo rss eR RE as sane “RAV READINTE ON CIRECTON BT ADONESS = O1R Figura 51. Ciclo de escritura y lectura [cortesia de Dallas Smc.) int BCDaBIN(int bed) //Conversién de BCD a Binario int varia: varia = beds return (varia + (varia >> 2) + (bed Ox0E)); 7. Transmisi6n serie void tiempo(byte shor, byte smin, byte ssec) { i2c_start(); /fescritura i2c_write(0xD0); — //Cédigo de escritura i2e_write(0x00); //puntero a 1a primera direccion 42e_start(); /(iectura i2e_write(0xbl); — //Cédigo de lectura sec = BCDaBIN(i2c_read()40x7£); //Lectura de los 7 bit de los segundos min = BCDaBIN(i2c_read()s0x7f); //Lectura de los 7 bit de los minutos hor = BCDaBIN(i2c_read(0)s0x3f)+ //Lectura de los 6 bit de 1as horas 42e_stop(); Figura 52. Fichero RTC_DS1307.C El termémetro digital y termostato I2C DS1621 permite medir temperaturas entre -55 °C y 125 °C. El valor de temperatura se suministra en dos bytes, el byte alto es el valor entero con resolucién de 1 °C y el segundo byte es el valor decimal con resolucién de 0.5 °C (figura 53). ‘DIGITAL OUTPTT DIGITAL OUTPUT Binary) (Hex) HIT 1OF 00000000 7006 ‘9001 1003 HO000000 1900 “90000000 10000000 ‘ooo [90000000 06000000. 00d IINLI11 10000000, FFSOh, 11100111 90000000 E700h 71001001, 00000000 Figura 53. Formato de la temperatura (cortesia de Dallas Se.) La direccién asignada en el esquema es la 0x01. Tiene un registro de control para el funcionamiento como termostato que en esta aplicacién no se utiliza. La palabra de control para la lectura o escritura es 1001A3A2A1-R/W (figura 55). Los comandos de control pueden ser, entres otros, OxAA para lectura de la temperatura, OxEE para el inicio de la conversin. Con estos datos se puede escribir el fichero para el control del DS1621 (figura 54). void init temp(int address) ( 42c_start(); i2¢_write(0x90| (address<<1)); //Genera primer byte (1001A2A1A0W) 2c write(Oxee); //Inicia conversién i2¢_stopt)s } float read _full_temp(int address) ( signed int datah; int datal; float tura; 207 Compilador C CCS y Simulador PROTEUS para Microcontroladores Pc i2e_start(); 420 _write(0x90 | (address<<1)); //Genera primer byte (1001A2A1A0-W) i2c_write(Oxaa); //eer temperatura #20 start(); i2¢_write (0x91 | (address<<1)); //Genera primer byte (1001A2A1A0-R) datahmi2c_read(); //tectura parte alta datal=i2e_read (0); //tectura parte baja y NACK i2¢_stop(); turandatah; //oonversién @ flotante 4f (daval==128) tura=tura+0.5; return (tura); Figura 54. Fichero TEMP_DS1621.C t ee ee ee wore roarwo-anemaareath 8) UT Ne 2 / NIB N_ § HODDER, ID on ae ipa eae wom woneterre Giygs COMORES Figura 55. Protocolo de lectura/escritura (cortesia de Dallas Smc.) Puesto que la temperatura es un FLOAT no se puede guardar este dato directamente en Ja EEPROM seguin las funciones dadas en el fichero EEPROM_24512.C; por lo tanto, se 208 7. Transmision serie puede utilizar el fichero suministrado por CCS C llamado FLOATEE.C para guardar y leer datos tipo FLOAT en una EEPROM. El fichero se muestra en la figura 56. WRITE_FLOAT_BXT_FEPROM(ong int n, float data) { int i for (1 = 0; £ < 4; 14) write ext_eeprom(i +n, *((int8 *) (edata) + £)); } float READ FLOAT EXT REPROM(Long int n) int 47 float data; for (i = 07 4 < 4) itt) *((int8 *)(edata) + i) ~ read ext_eeprom(i + a)e return (data); Figura 56. Fichero FLOATEE.C Una vez definidos los ficheros para el manejo de los periféricos se puede escribir el programa principal. El programa se comunica con un terminal del puerto serie de tal forma que mediante un mentt se pueden elegir dos opciones: Con 1 se inicia Ja lectura de temperatura y tiempo para almacenarlo en la EEPROM y con 2 se visualiza, a través del puerto serie, los primeros datos de la EEPROM (los 4 bytes del FLOAT de la temperatura y los 3 bytes del tiempo —seg., min. y horas-). La co- municacién serie se realiza por interrupcién. finclide <16Fa76.n> #tuses Xt, NOWDT, NOPROTECT, NOLVP fuse delay (clock=4000000) fuse 15232 (baud-9600, xmit-pin_cé; revepin_c?, bits=8,paxity-N) fuse i2c (Master, sda=PIN_Cé,scl=PIN C3) finclude <2ed.c> Pinclude _//Ficheros driver de los periféricos Finclude #include Finclude int dat_in, ent, hr,min, cece intl6 address=0; int dat_serie[7}; float datoz Fint_xrda /{Intersupcién para el puerto serie 209 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC rda_ise() ‘ dat_in-gete()+ //Lee el puerto serie printh(\2") 7 if (dat_inew’2') //Si es "2" se visualizan los primeros datos de la BEPROM t for(ont=0sont<=6;ent++) //Lectura de los 7 primeros bytes de 12 EEPROM ‘ dat_serie[ent]=read_ext_eeprom(ent); } for(ent=0;ent<-6;cnt++) //Visualiza los 7 primeros bytes de la ZEPROM t printf ("Byte su=83u \r",cnt,dat_serie(ont)) + 1 1 void main() [ Jed_init (}7 enable interrupts (int_rda) ; enable_interrupts (global) 7 address=0; printf ("Pulsar 1 para leer datos\r”); _//Mend para el terminal serie printf("Pulsar 2 para visualizar datos\r"); while (1) ( if(dat_in==’1") //Si es “1” se inicia la lectura y grabado en la EEPROM f init_temp (0x01); //tnicializa el DS1621 delay ms (100) 2 tiempo(hr,min,sec); //Lee tiempo del 0S1307 dato = read full temp(0x01); //bee temperatura del ps1621 WRITE_FLOAT EXT EEPROM(address,dato); //Guarda 4 bytes del #LOAT address~address+4; WRITE_EXT_EEPROM(address++,hr); —//Guarda byte de hora WRITE_BXT_SEPROM(address++,min); //Guarda byte de minuto WRITE_EXT_EEPROM(address++,sec); —//Guarda byte de segundo Jed_gotoxy (1,1); printf (led pute, "Temp=$4.1f C\n",dato); //Visualiza 1a temperatura printf (led_pute, "#2u:42u:82u”,br,min,sec); //Visualiza 1s hore 210 7. Transmisi6n serie //Cuando se termina 1a EEPROM vuelve //al principio. Figura 57. Programa principal del ejemplo 5 Se puede utiliza el HyperTerminal para comunicarse con el PIC. La configuracién se muestra en la figura 58; el resultado se muestra en la figura 59. roe Alen ASCH 1 Enwar fin deine cons erences delines [Y) Eco delos catacteres exerts localmente: Fieadedolines|0— leegunde. eid de 0 eons Alrecbi A800 © Agroga avance de lines al fins! de cade linen reobida: 1) Interpreter caracteres recbidor como ASCII de 7 bite {7 Auta lines que sobrepasen el ancho determina Figura 58. Configuracién del HyperTerminal [Pulsar 1 pera loor datos Fetser ? Bare UStalizar datos 2u Compilador CCS y Simulador PROTEUS para! Microcontroladores PIC En el comando DEBUG del PROTEUS se puede visualizar la EEPROM serie me- diante el comando I2C MEMORY INTERNAL MEMORY (figura 60). A Memory Internal Memory U2 ete he eee by aBbaaeuacton? 5 0 3 ‘ 6 8 2 3 0 5 6 3 PE ge une s SEIS ERE eee es Figura 60. Memoria interna de la EEPROM IZC 212 Capitulo 8 Gama Alta - PIC18 8.1 Introduccién En los tiltimos afios, Microchip ha lanzado varias gamas de PIC con elevadas pres- taciones, los PIC18, los PIC24 y los dsPIC. Con Ia gama alta (PIC18), Microchip mantiene la arquitectura basica que tan buenos resultados ha obtenido con la gama baja y media y, ademas, reduce las limitaciones de estas dos tiltimas. Los PICI8 tienen una arquitectura RISC avanzada Harvard con 16 bits de bus de programa y 8 bits de bus de datos (figura 1). MEMORIA DATOS {HASTA 4KB) Figura 1. Arquitectura PICIS La memoria de programa aumenta hasta 1 MWord (en realidad se manejan hasta 64 Kbytes pero llegan hasta los 2 Mbytes con memoria externa) y desaparece la pa- ginacidn. La memoria de datos RAM puede llegar hasta 16 x 256 (4 KBytes) y hasta los 1 Kbytes de EEPROM. La pila aumenta hasta 31 niveles. Incluyen tres punteros FSR que permiten direc- cionar la memoria de datos de forma indirecta y sin bancos. El juego de instruccio- nes aumenta hasta las 75 instrucciones, Introduce un multiplicador hardware 8x8. La frecuencia maxima de reloj es de 40 MHZ y la velocidad de procesador llega a los 10 MIPS con oscilador de 10 MHz. Incluye periféricos de comunicacién avan- zados (CAN y USB). Con la filosofia tradicional de Microchip, los PICI8 son com- patibles con los PICI6CXX y PICI7CXX. Ademés ha desarrollado un compilador C especifico para esta gama alta, el C18. 213 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Cae | RCTIRTAT CST TCT CRF Frecvoncia de | DCW DeaaMe DoT BEN trabajo —_ A Reset (y dels) | POW BOR. POR BOR, FoR, FOR POR ROR, Instruein RESET, | Instrucie RESET, — | toxrucoéa RESET, — | lnntraccléa RESET, Palen, i tens, Pilsen, Pistons, Desberdamientode | Desbordaminto de | Desbordamiente de | Desbordamlent de Pia(ewer.osT, | Pua@rWRTOsD, | Pia(rWRE-OST), | Pia (PWRT, OST), MCLE opcional,” | MCLRepeionah,” | MCLR(opetonad, | NCL opeonal) wor wor wor wor Meworiade | 16364 aT 16384 766 | Programa hytes) ‘Memoriaie | i? Ta aim aise Programa | dastracciones ‘Memos Datos | 7a 15s 7a im (oxic = is ‘Memoria Daios | 786 % a is EEPROM | tntrcupeiones | 19 =o 20 18 | Pore AGE Ports ABC Por + 7 Médules CCP [2 2 1 7 Médalos CCP | 0 . t r | oeoradon ‘Cominkaconcs | NSSP, EUSART | MSSREUSART NSSPEUSART SISSREUSART serie Comanicicionre F ar arate are Module AD eT 10 CANALES TWEANATES THCANATES TW EANATES bis Namerods | FRE) TEA) aE EGO | tastrwccanes Programackim 5 8 s 5 sonbafe vote | Detecetin de baja |S = = a seni { Tncapsalador | ipa POT Tega POOP aie POP 2 pin SOIC apie SOIC ‘epi OFN 12538 OFS in ON Tore Figura 2. Caracteristicas de PIC1SF2420, PIC18F2520, PIC18F4420 y PIC18F4520 8.2 Organizacion de la memoria El PIC18F4520 dispone de las siguientes memorias: + Memoria de programa: memoria FLASH interna de 32.768 bytes: + Almacena instrucciones y constantes/datos. + Puede ser escrita/leida mediante un programador externo o durante la ejecucién del programa mediante unos punteros. + Memoria RAM de datos: memoria SRAM interna de 1.536 bytes en la que estn incluidos los registros de funcién especial: + Almacena datos de forma temporal durante la ejecucién del programa. + Puede ser escrita/leida en tiempo de ejecucién mediante diversas ins- trucciones. 214 8. Gama Alta~PIC18 + Memoria EEPROM de datos: memoria no volatil de 256 bytes. + Almacena datos que se deben conservar aun en ausencia de tensién de alimentacién. + Puede ser escrita/leida en tiempo de ejecucién a través de registros. * Pila: bloque de 31 palabras de 21 bits. + Almacena la direccién de la instruccién que debe ser ejecutada después de una interrupcién o subrutina. + Memoria de configuracién: memoria en la que se incluyen los bits de confi- guracién (12 bytes de memoria flash) y los registros de identificacién (2 bytes de memoria de sélo lectura). 8.2.1 Arquitectura HARDVARD EI PICI8F4520 dispone de buses diferentes para el acceso a la memoria de progra- ma y ala memoria de datos (arquitectura Harvard): * Bus de la memoria de programa: + 21 lineas de direccién. + 16/8 lineas de datos (16 lineas para instrucciones/8 lineas para datos). * Bus de la memoria de datos: + 12lineas de direccién. + 8 lineas de datos. Esto permite acceder simultaneamente a la memoria de programa y a la memoria de datos. Es decir, se puede ejecutar una instruccion (Io que por lo general requiere acceso a la memoria de datos) mientras se lee de la memoria de programa la si- guiente instruccién (proceso pipeline). 8.2.2 Memoria de Programa El PICI8F4520 dispone de una memoria de programa de 32.768 bytes (0000H-7- FEFH) (figura 3). Las instrucciones ocupan 2 bytes (excepto las instrucciones CALL, MOVEF, GOTO y LSFR que ocupan 4). Por lo tanto, la memoria de programa puede almacenar hasta 16.384 instrucciones. Primero se almacena la parte baja de la instruccidn y luego la parte alta (para las instrucciones de 4 bytes primero los bytes menos significativos y luego los mas significativos). Las instrucciones siempre empiezan en direcciones pares. La operacién de lectura en la posicién de memoria por encima de 7FFFH da ‘0° como resultado (equivalente a la instruccién NOP). 215 Compilador G CCS y Simulador PROTEUS para Microcontroladores PIC Direcciones especiales de la memoria de programa: * Vectorizacién del Reset es 0000H. Vectorizacion de las interrupciones de alta prioridad es la 0008H. * Vectorizacién de las interrupciones de baja prioridad es la 0018H. (ete a {ve a ts (ie aia er acon ‘el rape de ota pd o00en {ecto interrupcin de bala proridad 00180 | } ‘Memoria de Programa interna Figura 3. Memoria de Programa La memoria de programa puede ser leida, borrada y escrita durante la ejecucién del programa. La operacién que se utiliza normalmente en tiempo de ejecucién es la de lectura de tablas o datos almacenados en memoria de programa. 8.2.3 Contador de Programa ELPC (contador de programa) tiene 21 bits (PCU, PCH y PCL). El bit menos significa- tivo del PC apunta a BYTEs, no a WORDSs, por lo que es “0”. El PC se incrementa de dos en dos. Se dispone de los correspondientes registros auxiliares PCLATU y PCLA- TH para actuar de forma combinada con el PC cuando éste se escribe o se lee. 216 8. Gama Alta — PIC18 + PCU: parte superior del PC, registro no directamente accesible; las operaciones de lectura/escritura sobre este registro se hacen a través del registro PCLATU. + PCH: parte alta del PC, registro no directamente accesible; las operaciones de lectura/escritura sobre este registro se hacen a través del registro PCLATH. + PCL: parte baja del PC, registro directamente accesible, Una operacién de lec- tura sobre PCL provoca que los valores de PCU y PCH pasen a los registros PCLATU y PCLATH, respectivamente. Y una operacién de escritura sobre PCL. provoca que los valores de PCLATU y PCLATH pasen a PCU y PCH, respecti- vamente. El PCL siempre tiene el bit menos significativo a 0’ debido a que las instrucciones siempre empiezan en direcciones pares. 8.2.4 Memoria de Configuracion Se trata de un bloque dé memoria situado a partir de la posicion 30000H de la me- moria de programa (mas alla de la zona de memoria de programa de ustario), En esta memoria de configuracién se incluyen: * Bits de configuracién: contenidos en 12 bytes de memoria flash permiten la configuracién de algunas opciones del PIC como: * Opciones del oscilador. + Opciones de reset. + Opciones del «watchdog. + Opciones de la circuiteria de depuracién y programacién. + Opciones de proteccién contra escritura de la memoria de programa y de la memoria EEPROM de datos. Estos bits se configuran generalmente durante la programaci6n C, aunque también pueden ser leidos y modificados durante la ejecucién del programa. + Registros de identificacién: se trata de dos registros situados en las direccio- nes 3FFFFEH y 3FFFFFH que contienen informacin del modelo y revisin del dispositivo. Son registros de sdlo lectura y no pueden ser modificados por el usuario 8.2.5 Pila La Pila es un bloque de memoria RAM independiente, de 31 palabras de 21 bits y un puntero de 5 bits, que sirve para almacenar temporalmente el valor del PC cuando se produce una llamada a una subrutina o interrupcin. El “Top Of Stack” es accesible, se puede leer y escribir (sera conveniente quitar previamente las interrupciones). El puntero de pila (contenido en el registro STKPTR) es un contador de 5 bits que indica la posicién actual del final de pila. El contenido del final de pila es accesible mediante los registros TOSU, TOSH, TOSL.. 27 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Cuando se procesa una interrupcién o se ejecutan las instrucciones CALL 0 RCALL (cl PC esta apuntando a la siguiente instruccién) se incrementa el STKPTR y se almacena el valor del PC en el final de pila. Cuando se ejecutan las instrucciones RETURN, RETLW 0 RETFIE se copia en el PC el valor almacenado en la cima de pila y se decrementa el STKPTR. 8.2.6 Memoria de Datos Los PICI8 tienen hasta un total de 4 KBytes agrupados en 16 bancos, con 256 bytes cada uno. Como en el resto de las gamas, existen los registros de propésito general GPR y los registros especiales SFR; éstos tiltimos se sittan en la zona mas alta (des- de FO0h hasta FFFh). El PICI8F4520 dispone una memoria RAM de datos 1.536 bytes (6 bancos de 256 bytes). Ademés dispone de 126 bytes dedicados a los registros de funcién especial (SFRs) situados en la parte alta del banco 15 (figura 4). cy rm oo im mln oo Sh orn = mn ox co orn i” “een ‘om - on \ m om Banco oe Acceso om an ca om , jem oI = Acces Ra Low | | ny = be ‘eee AM igh | om oo s) im i Figura 4. Memoria RAM PIC18F4520 218 Para acceder a un byte de la memoria RAM de datos primero se debe seleccionar el banco al que pertenece el byte mediante el registro de seleccidn de banco (BSR) y, a continuacién, direccionar el byte dentro del banco. Ademas existe una modalidad de acceso rapido a las 126 posiciones de la parte baja del banco 0’ y a los 126 bytes de SER (banco de acceso rapido). La memoria RAM de datos se compone de registros de propésito general (GPRs) y de registros de funcién especial (SFRs). Los SFRs son los registros mediante los cua- les se puede monitorizar/controlar el funcionamiento de la CPU y de las unidades funcionales del PIC. En el PIC18F4520 se situa en el bloque de memoria de 0xF80 a OxFFF (figura 5). Se distinguen dos conjuntos de SFRs: SFRs asociados con el nticleo del PIC: CPU: WREG, STATUS, BSR, ete. Interrupciones: INTCON, PIE1, PIR1, IPR1, etc. Reset: RCON. SFRs asociados con las unidades funcionales: ‘Timers: TOCON, TMRIH, TMRIL, TICON, ete. Convertidor A/D: ADRESH, ADRESL, ADCON0, ADCON1, ete. EUSART: TXREG, TXSTA, RCSTA, ete. CCP: CCPRIH, CCPRIL, CCPICON, ete. MSSP: SSPSTAT, SSPDATA, SSPCEG, ete. Puertos de E/S: TRISA, PORTA, TRISB, PORTE, etc. SPBRG PORT A | 0xF80. PORT B | OxF81 _— PORT C | OxF82 | TIMERIL | 0xFC! PORT D | 0xF83 | TIMERIH | 0xFCI PORTE | 0xF84 | __ —— — | TIMEOL | 0xFD TRIS A | 0xF92 | TIMEROH | 0xFD TRISB | 0xF93 | —— TRIS C | OxF94 | WERG_| OxFES| TRIS D | Oxk9s [__ —— STKPTR Figura 5. Registros SFR 8.2.7 Memoria EEPROM El PIC18F4520 dispone una memoria EEPROM de datos de 256 bytes. Al ser una memoria no volatil, los datos almacenados en ella se mantienen en ausencia de 219 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC tensién de alimentacién. El acceso a esta memoria se realiza mediante los SFRs: EECONI, EECON2, EEDATA y EEADR. Esta memoria permite hasta 1.000.000 de iclos de borrado/escritura. Se puede leer/escribir de forma individual en cada una de las 256 posiciones de memoria. Cuando se realiza una operacién de escritura, la circuiteria interna del PIC se en- carga de borrar previamente la posicién en la que se desea escribir. La duracién de un ciclo completo de borrado/escritura de un byte en la memoria EEPROM suele ser de unos 4 ms. 8.2.8 Modos de Direccionamiento El modo de direccionamiento es la forma en la que se obtienen los datos que van a ser utilizados en la instruccién. Existen 4 modos de direccionamiento: INHEREN- TE, LITERAL, DIRECTO e INDIRECTO. ‘+ Modo de direccionamiento inherente: en este modo, o bien la instruccién no tiene operando o bien el operando viene especificado en el propio cédigo de operacién de la instruccién. * Modo de direccionamiento literal: en este modo, el valor del operando viene indicado de forma explicita en la instruccisn + Modo de direccionamiento directo: en este modo, la direccién en la que se encuentra el valor del operando viene indicada de forma explicita en la ins- truccién. * Modo de direccionamiento indirecto: en este modo, la direccién de memoria en la que se encuentra el dato viene especificado en uno de los registros FSR, FSR1 y FSR2. 8.2.9 Interrupciones Se dispone de dos niveles de prioridad: * Nivel alto vectorizado en la direccién 0008H. * Nivel bajo, vectorizado en la direccién 0018H. Todas las interrupciones pueden ser programadas con cualquiera de las dos priori- dades, salvo la interrupcién externa 0 (que siempre tiene alta prioridad). Se puede forzar el modo compatible “sélo alta prioridad”, mediante el bit IPEN = 0. GIE/GIEH & PEIE/GIEL controlan los respectivos permisos globales. Cuando se sirve una interrupcién, automdticamente se quita su correspondiente permiso glo- bal. El servicio de interrupcién de alta prioridad impide el servicio de baja priori- dad. Cuando se ejecuta RETFIE se pone el permiso correspondiente al nivel que se est sirviendo. 220 Todas las interrupciones disponen de 3 bits de configuracién (excepto la interrup- cién externa 0 que tiene dos): * Bit de habilitacién de interrupcién: permite habilitar a nivel individual la interrupcién. * Flag de interrupeién: se pone a ‘I’ cuando se produce la condicién de inte- rrupcidn independientemente de si la interrupcién esta habilitada o no. Este flag debe ponerse ‘0’ por software cuando se procesa la interrupcién. * Bit de prioridad de interrupcién: establece si la interrupcién es de alta o de baja prioridad (este bit no esta disponible para la interrupcién externa 0). El PIC18F4520 dispone de 20 fuentes de interrupciones. Se distinguen dos grupos de interrupeiones: * Grupo general de interrupciones: Tnierrupeion de Temporizador 0 Interrupeién por cambio en PORTE Interrupeién externa 0 Interrupeién externa 1 Linterrupeién externa 2 * Grupo de interrupciones de perifricos Tnterrupein del SSP Tnterrupeion del fallo del oscilador Interrupeién det A/D Interrupcién del comparador Interrupeidn de recepeién dela EUSART | Interrupeién del CCP2 Interrupeién de transmisién de la EUSART | Interrupcién de eseritura en Flash/BEPROM Interrupein del MMSP_ Interrupcidn de colisién de bus (MSSP) Interrupeién del CCPL InterrupciGn de deteceion de anomalias en Vpp Interrupcién del Temporizador 1 Interrupcién del Temporizador 2 Interrupelén del Temporizador 3 En el compilador C se modifica la directiva #INT_XXXX de tal forma que se pue- den incluir las palabras clave HIGH y FAST. Una prioridad HIGH puede interrumpir a otra interrupcin. Una prioridad FAST se realiza sin salvar o restaurar registros (ver el siguiente apartado). Asi, en los PICI8 se pueden dar las siguientes interrupciones en C: INT xxxx Prioridad normal (baja) de interrupeion. El compilador guarda y restaura los registros clave. Esta interrupeién no interrumpe a otras en progres, = wa a? HINT_xxxx FAST |Interrupcién de alia prioridad, En compilador NO guarda y restaura los registros clave. Esta interrupcién puede interrumpir a oN ‘tras en progreso. Sélo se permite una en el programa #INT_xxxx HIGH | Interrupcién de alta prioridad. Ei compilador guarda y restaura los registros clave, Esta interrupcién puede interrumpir a otras en ronres0. 221 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC * #INT_ovvx Prioridad normal (baja) de interrupcién. El compilador guarda y restaura los registros clave. Esta interrupcin no interrumpe a otras en pro- greso. + #INT_vox FAST: Interrupcin de alta prioridad. En compilador NO guarda y restaura los registros clave. Esta interrupcién puede interrumpir a otras en . progreso. Sélo se permite una en el programa. * #INT_oox HIGH: Interrupcién de alta prioridad. El compilador guarda y restaura los registros clave. Esta interrupcién puede interrumpir a otras en progreso. El PIC18F4550 tiene las fuentes de interrupcién mostradas en la figura 6. [Dine © ovation ing ATCC rama} [DteerCovrtow sina TIMERS name) Ditwer ovation [Dine overon [Time 3ovarow Cetera rien! [Peterlee 1 [DE teal tempt #2 [Pat 8 ay change on 8487 Psst Slave Pot cain, [Ciénaeatn atl conven conelete I ASZ22 moon data walle IE As222hanet ber act Esper 2c cniy Ticapive 0 Carpe on uit [tape Compare on ut 2 Hi colin io vane detected (iterate detect Tate een Wie coreite Figura 6. Fuentes de interrupcién del PICI8F4520 desde el Wizard del CCS 8.2.9.1 Registros de salvaguarda Las interrupciones se disparan durante la ejecucién de codigo del programa prin- cipal o de otra interrupcién. Esto hace que durante la ejecucién de la rutina de tra- tamiento de Ja interrupcién se pueda modificar el valor de los registros que estan siendo utilizados por otras partes del cédigo. Para evitar que estas modificaciones alteren el correcto funcionamiento del sistema conviene almacenar los valores de estos registros al inicio de la interrupcién para recuperarlos al final. Se puede salvar y restaurar el contenido de las variables de entorno (WREG, STA- TUS y BSR) en sus respectivos registros sombra, lo que equivale a una pila de un sélo nivel. 8. Gama Alta — PIC18 8.2.10 Registro W El registro WREG pasa a ser un registro direccionable (0xFE8), por lo que se puede utilizar de forma explicita. 8.2.11 Oscilador El PICI8F4520 permite miltiples configuraciones: Cristal Baja-Potencia (max. 200KHz) | Cristai-Resonador (max. MHz) (Cristal-Resonador Alta-Velocidad (max. 40MHz | Cristai-Resonador Alta-Velocidad con habilitacién de PLL (max. 10M) Externa R-C con FOSC/4 salida en RAG (max. 4MH7) _| Externa R-C con 1/0 en RAG (max. 4MHz) Oscilador Interno FOSC/4 salida en RAG e UO en RAT (30/800 KHz, 1/4/8 MHz) Oseilador Interno con 1/0 en RAG y RAT Reloj Externo con FOSC/4 de salida (max. 40MHz). Reloj Externo con VO en RAG (max. 40MHz| La disponibilidad de oscilador interno permite multiples configuraciones (figura 7). ewe ens Otter me 5K Une eve OC hen Ona Orncrmaee: Otte (eve deem ten Cada [ioe Ents Camano Figura 7. Configuracién del oscilador interno 8.2.12 Unidades Funcionales El PIC18F4520 dispone de una serie de Unidades Funcionales que le permiten: * Realizar tareas especificas especializadas (conversién A/D, transmisién/re- cepcién de datos, generacién de sefiales digitales con temporizaciones pro- gramables, etc.). 223 ‘* Optimizar el rendimiento del PIC, ya que estas unidades trabajan en paralelo a la CPU permitiendo que ésta se centre en otras tareas como el procesado de datos, célculos, movimiento de datos, etc. Las Unidades Funcionales mas importantes del PIC18F4520 son: Puerto de DS Unidad de Comparacion/Captura/PWM mejorada (ECCP) ‘Temporizador 0 | Canal de comunicacién serie EUSART. “Temporizador 1 | Canal de comunicacién serie MSSP ‘Temporizador2 | Médulo analégico de comparacion Temporizador3 | Canal de transmisiin de datos en paralelo (SPP) Convertidor A/D | Acceso a memoria externa (EMA) Unidad de Comparacion/Captura/PWM (CCP) =i 8.2.12.1 Puertos de entrada/salida El PIC18F4520 dispone de 5 puertos de E/S que incluyen un total de 36 lineas digi- tales de E/S: PUERTO. DE ENTRAD, DA 8 LINEAS DE ENTRADA/SALIDA 3 LINEAS DE ENTRADA/SALIDA + 1 LINEA DE ENTRADA Todas las lineas digitales de E/S disponen, como minimo, de una funcién alterna- tiva asociada a alguna circuiteria especifica del PIC. Cuando una linea trabaja en el modo alternative no puede ser utilizada como linea digital de E/S esténdar. 224 Figura 8. Esquema de un terminal 8. Gama Alta — PICIB Cada puerto de E/S tiene asociado 3 registros: * Registro TRIS: mediante este registro se configuran cada una de las lineas de E/S del puerto como ENTRADA (bit correspondiente a ‘1’) 0 como SALIDA (bit correspondiente a‘0'). * Registro PORT: mediante este registro se puede leer el nivel de pin de E/S y se puede establecer el valor del latch de salida. * Registro LAT: mediante este registro se puede leer o establecer el valor de! latch de salida. 8.2.12.2 Temporizadores TEMPORIZADOR 0: + Configurable como temporizador/contador de 8 bits/16 bits. * Pre-escalar de 8 bits programable. * Interrupcidn por desbordamiento. TEMPORIZADOR 1: * Configurable como temporizador/contador de 16 bits. * Dispone de un oscilador propio que puede funcionar como: + Sefial de reloj del temporizador 1. + Sefial de reloj del PIC en modos de bajo consumo. * Pre-escalar de 3 bits programable. * Interrupcién por desbordamiento. TEMPORIZADOR 2: * Temporizador de 8 bits (registro TMR2). * Registro de periodo PR2. * Pre-escalar de 2 bits programable (1:1, 1:4, 1:16). * Post-escalar de 4 bits (1:1...1:16) * Interrupcién por igualdad entre TMR2 y PR2. * Se puede utilizar junto con los médulos CCP y ECCP. * Se puede utilizar como sefial de reloj del médulo MSSP en modo SPI. ‘TEMPORIZADOR 3: * Configurable como temporizador/contador de 16 bits. * Dispone de vatias opciones de seiial de reloj en el modo temporizador: + Oscilador principal con o sin pre-escalar. + Oscilador del temporizador 1 con o sin pre-escalar. 225 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC * Pre-escalar de 3 bits programable. * Interrupcién por desbordamiento. Freauncy | Ovetow — 130me Ae 08 rect. Dvetton ——Enaied wine won mame rote g “2a au 532 [oock ttre Clyne Ent lek tee Feuiey| 000000 Figura 9. WDT y TMRO, TMR1 y TMRZ POH Tene Figura 10. TMR3 8.2.12.3 Convertidor Analégico-Digital * 10 bits de resolucién. * 13 canales multiplexados. 8. Gama Alta — PIC18 * Sefial de reloj de conversién configurable. * Tiempo de adquisicién programable (0 a 20 TAD). * Posibilidad de establecer el rango de tensiones de conversién mediante ten- siones de referencia externas. ‘nse oe SRR ~ DAT AZAZASEOET 2826361 8480 ‘9047 A2A3ASEDET E2825381 Ba iments Z > aDat ABABASEDE? €2826381 0A) A2A3ABEDE'E28283 5 avAIAZASAS DET E62 oat AZAZASEDETE2 —- ‘ADATAZAZABEOET eee: 5 anal Azaseseo AAs A2A385 © ADAY ADA ‘ADALA2 aoat 10 Cock Aue g Modulo AD Figut 8.2.12.4 Canal de Comunicacion Serie (EUSART) Caracteristicas fundamentales: ‘* Modos de trabajo: * Modo asincrono de 8 bits. + Modo asincrono de 9 bits. * Modo sincrono Maestro. + Modo sincrono Esclavo. + Auto-activacién por deteccién de dato recibido. * Deteccién automatica de velocidad de comunicacién (baudrate). * Transmisién y deteccién de cardcter de BREAK (bus LIN). Buersoe tet Ee Treat Tle 1 oa ih Cera Peel a Ciaran Pane Nene unit CB Figura 12. ‘Comunicaci6n Serie 227 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC 8.2.12.5 Modulo Master SSP (MSSP) EI médulo MSSP es un interfaz serie capaz de comunicarse con periféricos u otro microcontrolador. Puede operar en dos modos: * Serial Peripheral Interface (SPD). * Inter-Integrated Circuit (12C). La interfaz /2C admite los siguientes modos: * Master mode. * Multi-Master mode. * Slave mode. Maser She ede CKPADEKED cepsncxe=t xP Eo core est ii ot deb 16 Dine by Use Tee? Figura 13. Modo SPI Figura 14. Modo I2¢ 8.2.12.6 Modulo de Compracién/Captura/PWM (CCP) Dispone de tres modos de funcionamiento: * Modo de Captura: se utiliza para medir eventos externos como la duracién de pulsos digitales. + Modo de Comparacién: se utiliza para generar sefiales digitales con tempori- zaciones programables. Este tipo de sefiales son muy iiiles para el control de etapas de potencia (convertidores DC/DC, DC/AC, AC/DC, AC/DC). + Modo PWM: se utiliza para generar sefiales de modulacién de ancho de pulso (PWM). ‘También existe un modulo de comparacion/captura/PWM mejorado (ECCP). 228 8. Gama Alta - PIC1B Dispone de cuatro modos de funcionamiento: * Modo de Captura: se utiliza para medir eventos externos como la duracién de pulsos digitales. * Modo de Comparacion: se utiliza para generar seniales digitales con tempori- zaciones programables. Este tipo de sefiales son muy utiles para el control de etapas de potencia (convertidores DC/DC, DC/AC, AC/DC, AC/DC). + Modo PWM: se utiliza para generar sefiales de modulacién de ancho de pulso (PWM). + Modo PWM mejorado: se utiliza para generar sefiales PWM complementa- rias para el control de semipuentes de transistores. 2 2000.000 Kh, Duty tk 1280.000 Khe, Duy to 312500 Khe, Dub=dio 4 (Tae Dots | Fuse With Most Opt on “ Ouput Contig Fuse Ful Bdge reverse Comperst: 1 ouout Hat Bridge Comps 2 cuba Prov and Shutdown Stoke) Eiher Compolor Drier andcio'ss OREO ABO or Corpasstr Pine B and Shutdown Site R80 or Comparator? Drive pine end Do's” Apo a Emer Conpsitor Figura 15. Médulos CCP y ECCP NOTA El médulo ECCP no funciona correctamente en la tiltima versién del Proteus. Es de esperar que LabCenter lo solucione en breve. 229 Compitador C CCS y Simulador PROTEUS para Microcontroladores PIC 8.2.12.7 Modulo Comparador El médulo de comparadores analégicos contiene dos comparadores que pueden ser configurados de distintas formas. Las entradas pueden seleccionarse entre las entradas analdgicas de los pins RAO a RAS. Las salidas digitales (normal o invertida) son accesi- bles exteriormente y pueden ser leidas a través de un registro de control. Conpavatir Gnd h Gnd Gnd Gnd Tied Source Weke Up Figura . Médulo Comparador 8.2.12.8 Modulo de referencia EI médulo de referencia esta formado por una red de resistencias y permite selec- cionar una tensién de referencia. (Viet 5 Comp -> Viet Figura 17. Referencia 8.2.12.9 Modulo detector de Alto/Bajo Voltaje Este médulo programable permite, al usuario, definir un punto umbral de tension y la direccién de cambio. Si el dispositivo experimenta un cambio en la tensién y en la direccién indicada sobre el punto umbral se produce una interrupcién. 230 8. Gama Alta - PIC18 Figura 18. HLVD y LVD Ejemplo 1: Diseiar un Reloj en Tiempo Real (RTC) utilizando la interrupcién del TMR1 con oscilador exterior; utilizar para la visualizacton un display de 7 segmentos (figura 19). Componentes ISIS: PIC18F4520, RES, 7SEG-BCD y Generador ISIS: Pulse. Figura 19. Ejemplo 1 El Proteus tiene un componente 7SEG-BCD que es un display 7 de segmentos con el decodificador 7 SEG-BCD integrado, lo que facilita la simulacién. El empleo del TIMER! con oscilador exterior permite trabajar a dicho TIMER1 in- cluso cuando el PIC est en modo sleep. El Proteus no simula el oscilador externo del TMRI con cristal de cuarzo (figura 20), por lo que hay que sustituirlo por un 231 Compilador C CCS y Simutador PROTEUS para Microcontroladores PIC generador de pulsos con la frecuencia adecuada e introducitlo por él pin RCO/T1O- SO (figura 21). Al editar las caracteristicas del generador de puiso hay que cambiar el Pulse (High) voltaje a5 V y la frequency a 32.768 Hz. Para conseguir una interrupcién cada 1 seg con dicha frecuencia hace falta precar- gar el TMR1 a 0x8000 segiin los célculos de la siguiente ecuacién. ct zr Rowtiosorsen x fovea Figura 20. TMR1 con oscilador de cuarze externo Figura 22. Caracteristicas del generador Pulse 232 Sama Aa PTE La interrupcién del TMR1 debera ser de alta prioridad. Los datos en binaria (<= gundos, minutos y horas) se deben pasar a dos digitos en BCD. Se han utilizado los puertos A, By D (ya que el Ces necesario para el oscilador). En el puerto A de los PICI8, la patilla RA4 ya NO es un Drenador Abierto pero el PRO- TEUS sigue traténdola como tal, por lo que hace falta una resistencia de pull-up a la salida. En realidad esto no seria necesario. Por otra parte, la simulacién no es en tiempo real por lo que 1 segundo de simulacién puede tardar varios segundos de procesador del ordenador; se puede comprobar la relacién en la barra inferior del Proteus donde nos indica el tiempo de procesado (figura 23). de alte pri 233 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC segundos=0;) Af (minutos=-60) fhorast+; //Cuenta las horas minutos=07) if (horas~=24) horas ‘set_timerl (0X8000) ; //Precarga el TNMRI antes de salir J void BINaBCD(int valor) ( //funcién de conversién de Binario a BCD Msdigito=0; if (valor>=10){ dof valor=valor-10; MSdigitot+; Jwhile (valor>=10); } LSdigito-valor? /anidades en BCD Msdigitoxiadigitoccs; //oecanas en BCD (se desplazan a la parte Yalta del int) BeD=usdigite | Lsdigite; //OR entze les dos niineros para obtener un Hentero que se pueda sacar directanente por } //el puerto void main() ‘ setup_ade_ports (NO_ANALOGS| VSS_VDD) ; setup_wdt (WDT_OFF); setup_timer 1(TI_SXTERNAL|TI_DIV.BY_1); //TMRI con oscilador externo /imodo asincrono y prescaler=I setup_comparate: (NC_NC_NC_NC) ; setup_vref (FALSE) + setup_oscillator (False) s enable_interrupts (INT_TIMERI) z enable interrupts (GLOBAL); set_timerl (0x8000) s //TMRI~65536- (1/POSCL) ~65536-32769~32768-0x8000 while (true) t BINeBCD (segundos); //Convierte 10s segundos de binario a BCD. curevr_p(sco); //1os eaca por el puerto D. BINaBCD (minutos) + OUTPUT_3 (BCD) ; BINeBCD (horas) + ouregt_A(sco) + } Figura 24. Programa del Ejemplo 1 8. Gama Alta - PIC18 Es necesario deshabilitar el watchdog en el PIC (figura 25). ie Figura 25. Deshabilitacién del Watchdog Ejemplo 2: Eleoador de tensién (voltaje-boost comerter) con realimentacién de control (fi- gura 26). Componentes ISIS: PIC18F4520, RES, IRF130, INDUCTOR, 10BQ015 y CAP. En PROTEUS, el médulo comparador en el modelo del PICI8 no funciona co- rrectamente en la simulacién, asi también el médulo ECCP tiene algunos pro- blemas. Esperemos que LabCenter lo solucione en breve. 235 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Se configura el médulo CCP para trabajar en modo PWM y el comparador para que comparé la sefal de salida (dividida por un coeficiente) y la tensién de refe- rencia interna (en este caso se fija a 3.59 V aunque se puede modificar su valor por programacién). En el programa se modifica el médulo de referencia con la funcién setup_vref(), pero el comparador se modifica directamente en su registro CMCON ya que con la funcién setup_comparator() existe un incorrecta asignacién de valo- res en el fichero <18F4520.h>. El médulo de referencia se configura para obtener un valor de 3.59 V mediante la programacién del registro CVRCON=0b11001111 0 en compilador C de CCS: se- tup_vref(VREF_HIGH|15|VREF_F5) E| médulo comparador se configura para introducir la seal externa por RAO y utilizar Ia referencia interna (figura 27) mediante la programacisn del registro CMCON= 0600000110, en C deberia ser setup_comparator(A0_VR_A1_VR) pero se ha detectado un error en la asignacién #define del fichero de cabecera (se puede modificar o utilizar directamente el valor de CMCON). La frecuencia de la sefial PWM se ha fijado en 4 KHz. ‘cM2.CMO = 110 Figura 27. Modo del comparador El sistema funciona en un equilibrio dindmico, mientras la tensién de salida (divi- dida) sea menor que la V,,, 1a sefial PWM actia, si es mayor la seftal PWM es 0. De esta forma se consigue una tensién continua en la salida del convertidor. De esta forma se consigue una V.,,=20 + 0.27 V. Es importante inicializar la salida (con un label IC=5 sobre el cable) para evitar errores de convergencia en la simulacién. #include <16f4520.h> fuses XT,NORDT fuse delay (clock=4000000) foyte cucon-oxeB4 #oyte TRISA=0xF92 236 ‘8. Gama Alta - PIC18 void main() { inti dutty: TRISA~ Ob111010117 a 9600000110; //setup_comparator(A0_VR_AL_VR)# setup_vref (VREF_HIGH|15|VREF_F5); //CVRCON=0b110012i17 setup_timer 2(T2DIV_BY 4,62,1); //4KHz setup _cepl (CCP_PHM) > Z/0CP1 en modo Prt eet_pwmi_duty (714); while(1) { TP(C1OUT) dutty=714s //8i Vout/Coet < VRE else dutty=0; //3i Vout/Coef > VREF set_pwmi_duty (dutty); } Figura 28.Programa del ejemplo Z Si se quiere utilizar una V,,,distinta a la interna para ajustar mas finamente la ten- sién de salida, se puede utilizar el médulo comparador seguin la figura 29, introdu- ciendo la sefial por RAO y una referencia externa por RA3. Figura 30. Circuito con referencia externa 237 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Hinclude <1af4520.h> #£uses XT, NOWDT fuse delay (clock=4000000) #byte CHCON-OxFB4 fhyte TAISA-OxF92 void main() { intlé dutty; TRISA= 0b11101011- cucon= 9000001007 setup_timer_2(T2_DIV BY 4,62,1); setup_copl (CCP_PMmM) ¢ ‘set_pwni_duty (714)+ while(t) ( IF(C1OUT) dutty=7147 else dutty=0; set_pwrl_duty (dutty) 7 } Figura 31. Programa para referencia externa 9. Real Time Operating System ~ RTOS Capitulo 9 RTOS - Real Time Operating System 9.1 Introduccion El Sistema Operativo en Tiempo Real simplifica el desarrollo de una aplicacién y, mediante el uso de tareas, reduce los errores de programacién. En general, se pue- de definir un RTOS como un programa que trabaja en segundo plano, controla la ejecucién de varias tareas y facilita la comunicacién entre ellas. En el caso de que se esté ejecutando mas de una tarea al mismo tiempo, el sistema se denomina multi- tarea; cada tarea tiene asignado un tiempo de procesador EI RTOS no es exactamente un SO (sistema operativo) a pesar de que los dos se basan en un nticleo (kernel) que se encarga de controlar la de ejecucién de las tareas. La diferencia estriba en la carga inicial, si es solo el nucleo (RTOS) o si ademas se cargan otros procesos (0). El RTOS esta pensado para trabajar con los microcon- troladores. Puede utilizarse en los PIC de gama media pero donde mayor rendi- miento se obtiene es en los PIC de gama alta. EI RTOS que utiliza CCS permite el PIC ejecute regularmente las tareas programa- das sin necesidad de interrupciones. Este se logra a través de la funcion RTOS_ RUNO que acttia como planificador de tareas (dispatcher). La funcién del planifica- dor consiste en dar el control del procesador a la tarea que debe ejecutarse en un momento dado. Cuando la tarea ha terminado de ejecutarse 0 ya no necesita del procesador, el control de dicho procesador es devuelto al planificador el cual daré el control del procesador a la siguiente tarea que esté lista para ejecutarse en ese momento. Este proceso se conoce como cooperativo multitarea (cooperative multi-tasking) Un buen ejemplo de la optimizacién del uso del PIC con el RTOS es el PID utilizado en el tema sobre el médulo CCP para regular la temperatura de un horno (ejemplo 239 Compilador C CCS y Simutador PROTEUS para Microcontrotadores PIC 5). Estudiando el programa realizado en esa ocasién se observa como el PIC est totalmente ocupado en realizar el proceso PID; si se necesitase utilizar dicho mi- crocontrolador para realizar mas funciones se deberia realizar una programacién bastante compleja, intentando siempre respetar el tiempo de muestreo del PID. Utilizando el RTOS en dicho ejemplo, no sélo se simplifica el programa sino que ademas se consigue mejorar la respuesta en el sistema ya que se optimizan los re- cursos del micro. De los dos casos estudiados (tiempos de muestreo de 100 ms y 1 ms), en el primer caso se reduce el sobreimpulso y las oscilaciones y en el segundo caso se alcanza antes la temperatura fijada (Figura 1). Pero ademas, la utilizacién de RTOS va ha permitir afadir fécilmente més tareas al PIC como veremos en los préximos ejemplos. Figura 1. Respuesta del PID con y sin programacién RTOS 9.2 RTOS en C Las funciones que incorpora CCS para la gestidn del RTOS son las que aparecen en la siguiente tabla: 240 9. Real Time Operating System - RTOS rtos_run() Tnicia Ia operacion del RTOS. Todas las tareas se ejecutan através de esta funcién. | rtos_terminate() Finaliza la operacion del RTOS y devuelve el control al programa principal, a la linea siguiente de la funcién rios_run(). Es como una funcién RETURN. rtos_enable(task) Habilita una de las tareas RTOS. Una vez la tarea es habilitada, 1a funcién rtos_run() Mamaré a esta tarea cuando le toque por tiempo. El parémetro de esta funcién es el nombre de la tarea, rtos_disable(task) Deshabilita una de las tareas RTOS. Una ver la tarea es deshabilitada, la funcién rtos_run() no Namaré a esta tarea hasta que vuelva a ser habilitada mediante la funcion rtos_enable().E\ parametro de esta funcién es el nombre de la tarea. rtos_msg_poll Devuelve un 7RUE si hiay un dato en la cola de mensajes de tareas. rtos_msg_read@ Devuelve ef siguiente byte del dato contenido en Ta cola de mensajes de tareas. rtos_msg_send(task,byte) Envia un byte de datos para una tarea concreta. El dato es situado en la cola de mensajes de tareas, rtos_yield() Se llama desde una de las tareas y devuelve el control del programa a la funcién rtos_run(). Todas las tareas deben tener una Hamada a esta funcidn al final de su cédigo. rtos_signal(sem) Incrementa un SEMAFORO que se utiliza para difundir la disponibilidad de un recurso limitado. ros_wait(sem) Espera a que el recurso asociado con el semaloro esté disponible y entonces decrementa el semiforo para reclamar el recurso, rlos_awail(expre) Espera a que la EXPRESION sea TRUE antes de permitir que Ia tarea continde. rtos_overrun(task) Retoma un TRUE si la tarea ha sobrepasado el tiempo permitido de ejecucién, rtos_stats(task,stat) Retorma una ESTADISTICA de una tarea conereta, La ica incluye el tiempo minimo y maximo de mn de la tarea y el tiempo total que la tarea ha sobrepasado su ejecucién. Las directivas asociadas son dos: #use rtos (options) Las options pueden ser las siguientes (separadas por comas): timer=X: donde X (0a 4) indica el TIMER que se utilizaré para la ejecucién de las tareas, El TIMER seleccionado debe utilizarse para el RTOS. minor_cycle=time: donde TIME es un namero seguido de s, ms, ps ons. Indi- ca el tiempo que debera tardar en ejecutarse una tarea. Los tiempos de ejec- 241 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC cién de cada tarea deben ser muiltiplos de esta cantidad. Si no se especifica, el compilador se encargard de calcularlo. statistics: indica el tiempo minimo, maximo y el total utilizado por cada tarea. #task (options): Esta directiva indica al compilador que la funcién que le si- gue es una tarea de RTOS. Las options pueden ser las siguientes (separadas por comas): rate=time: donde TIME es un numero seguido de s, ms, 11s, 0 ns, Especifica Ia frecuencia con se ejecutara la tarea. Debe ser igual o miiltiplo del valor mi- nor_cycle. maxstime: donde TIME es un numero seguido de s, ms, us, 0 ns. Especifica el tiempo de ejecucién de la tarea. Este tiempo debe ser menor o igual que el valor minor_cycle. El compilador no puede hacer cumplir este tiempo por lo que el programador debe tener cuidado en asignar el tiempo de ejecucién. Ademés, este tiempo activa la funcidn rtos_overrin( task). queue=bytes: especifica cuantos bytes son colocados en la cola de mensajes. El valor por defecto es 0. Como primer ejemplo se puede utilizar el controlador PID (ejemplo 5) del tema sobre el médulo CCP. Comparando el programa escrito en aquella ocasién y el que se presenta ahora con RTOS (figura 2), se observa que el bloque del PID que estaba en el programa principal es ahora una tarea. El tiempo de muestreo estaba especi- ficado con un delay_ms() y ahora se utiliza el tiempo de ejecucién de la tarea como tiempo de muestreo, Tal como se ha comentado en el punto anterior, se ha abtenido una mejora en el funcionamiento del sistema (figura 1). #INCLUDE <16F877.h> fdevice ado=10 fuse delay (clock=4000000) fuses xt,NOWDT #Byte TRISC = 0x87 fuse rtos(timer-0,minor_cycle~Ims) //ostectiva del RTOS datlé valor; (/lectura de temperatura int16 control; /fealor del Pet float a=0.124. (//constantes del PID para 100ms float b=0.00006 float c=62.1524, float temp_limir=500.0; //temperatura a alcanzar float xT,eT,pT,q?,yl,u?z /ivariables de ecuaciones float oF float 242 9, Real Time Operating System — RTOS oat max=1000.0; float min=0.07 #task(rate=Ims, max=Ins) void pid ()7 void main(){ TRISC=0; setup_tiner 2(t2 div by 4249/1); setup_copl (cop_pwm) ; setup_ade_ports(all_ analog); setup_adc(ADC_CLOCK_INTERNAD) + set_ade_channel (0) tos run (7 } void pid ( ) output _bit( PIN CO, 0)7 valor=read_ade(); yTvalor"5000.0/1024.0; rt=temp limit; of-2T-yty plabtetept 17 gtmc* (ef-eF 1) ur-pTeateregr: 4£ (uT>max) { utemax7) else { Af (oTemin} | uteminz) , control=u?; set_pwmi_duty (control) ; pli-pry er_i-ery //limites maximo y minimo de control //indica que la siguiente funcién es una Tarea //que se ejecutard cada 100ms. //eexiodo de la sefial PNM 2 ims /fMédulo CCP a modo PHM //Puerto A analégice //reloj convertidor AD interno //tectura por el canal 0 //inicia la operacién de RTOS //tarea PID Figura 2. Programa del PID con RTOS En el ejemplo se puede afadir una tarea que permita visualizar en un display LCD la temperatura que tiene en horno (figura 3). Al manejar varias tareas es convenien- te utilizar la funci6n rtos_yield() para devolver el control al planificador de tareas 243 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC y coordinar las tareas mediante las funciones rtos_wait() y rtos_signal(); para utili- zar estas dos funciones se debe utilizar un “semaforo’, el cual permite a una tarea utilizar un recurso compartido o esperar en el caso de que esté en uso. ct ere sea —> EE esr on Figura 3. Dos tareas: PID y DISPLAY En este ejemplo no se utiliza ningtin recurso compartido, por lo que no se utilizan las funciones rtos_wait() y rtos_signal(). PINCLUDE <16F877.n> fdevice ado-10 #use delay (clock=4000000) #fuses XT, NOWD! #include fuse rtos(timer-0,minor_cycie=Ims} #Byte TRISC = 0x87 inti6 valor, control: float a-0.12437 float b=0.00006; 9, Real Time Operating System ~ RTOS float o~62.25147 float temp _1imit-500.0; float rP,eT pT, yT/ aly float pf_1=0.0/ float ef_1=0.0; float’ max1000.07 float min=0.07 float tempera? task (rate=ims,max=las) (/tarea del PID void pid ()7 /Tarea del DISPLAY void display( ); void main(){ tod init (): TRISC=07 setup_timer_2(t2_div_by 4,249,1); setup cop! (ccp_pum) 7 setup_ade_ports(al1_analeg); setup_ade(ADC_CLOCK_INTERNAL) set_ade_channel (0); rtosrun ( }; } void pid ( ) (/tarea del PID é valor=read_ade() yf=valor*5000.0/1024.0; efetemp limity ef=xT-yT; pI=bteTipT_1; tect (eT-ef_1)7 uf=ptareregry 4£ (ut>max) ( ut~maxs} else ( if (uTemin) ¢ etemin:) } control=ut; Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC set_pwml_duty (control); PIi=p?; ef iret; rtos_yield(); //Se devuelve el control a1 planificader } void display() //tarea del DISPLAY ‘ Jed _gotexy(1,1)7 tempera=y7/10; printf (led pute, "Temp= $F", tempera) 7 rtos_yield(); //8e devueive el control ai planiticador Figura 4. El programa Las variables se pueden definir de forma global o particular como en cualquier funcién. En el caso de variables globales, todas las tareas pueden utilizarlas, pero en el caso de funciones particulares se pueden utilizar las funciones de correo: rtos_msg_poll(), rtos_msg_read() y rtos_msg_send(task,byte) para transferir in- formacion. En el ejemplo anterior la variable utilizada es global, por lo que puede ser utilizada por las dos tareas, pero en el caso de ser local se podrian utilizar las funciones de correo (aunque la variable sea global también se pueden utilizar). En el caso de variables globales puede ser interesante el uso de estas funciones en aquellos casos en los que una de las tareas esté esperando que la variable modifi- que su valor a través de otra tarea. Para utilizar estas funciones en el ejemplo se modifica la llamada a la tarea DIS- PLAY y se afiade una variable para el correo (figura 5). INTI6 valor_is #task(rate=10ns,maxIns,queve=2) /feola de 2 bytes. void display( )7 Figura 5. Modificaciones del programa (1) Se realiza el envio de la variable valor desde la tarea PID y se recibe en la tarea DISPLAY para su posterior uso (figura 6). El resultado es similar al del ejemplo anterior. void pid () f valor-read_ade(); yr-valor*5000.0/1024.03 xT-temp_limit; 246 9, Real Time Operating System — RTOS play () 05_msg_read(); Recibe tempera=valo Figura 6. Modifieaciones de! programa (I!) Para terminar con este ejemplo se ha afiadido una tercera tarea que permita modi- ficar la temperatura limite en cualquier momento mediante un botén en la patilla RBO. Para esta tercera opcién se ha cambiado a un PICI8F4520. Como ya se ha comentado, el RTOS adquiere toda su eficiencia en los PIC de gama alta (figura 7). Figura 7. Tres tareas: PID, DISPLAY y TECLA 247 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Dado que en este caso se modifica una variable en dos de las tareas es conveniente utilizar las funciones rtos_wait() y rtos_signal() (figura 8). #INCLUDE <18F4520.h> Adevice adc=10 fuse delay (elock=4000000) #fuses XT,NOWDT #inelude fuse rtos (timer~0,minor_cycle~ims) fuse standard i0(8) fuse standard io(c) fietine BO PIN 80 int16 valor; //lectura de temperatura int16 control; //valor del Putt float a=0.1243; float b=0.00006; float c=62.1514; //eonstentes del PID float temp_limit=500.0, float rf,e?,pT,qT,yT/uTs float pT_1=0.07 float eT_1=0.07 //variables de ecuaciones //temperatura a alcanzar float max=1000.0; float min=0.0; //limites méximo y minimo de control. float tempera; //Para visualizar la temperatura del hozno. intié t_iz //Para visualizar la temperatura limite. intB sem; /Mariable de seméforo. task (rate=Ins,max=Ins) void pid ( }: #task(rate=10ns,max=Ims,queue=2) void display( )+ #task (rate=10as,max=Ims) void teciade ( )7 void main(){ | led anitis 248 9, Real Time Operating System — RTOS setup_timer 2(t2_div by 4,249,1); //periodo de la sefal PHM a Ims setup_cop! (cep_pwa) 7 {Miéduie CCP a modo PIM setup_ade_ports (a11_analog); //Puerto A analégice setup _ade(ADC_CLOCK INTERNAL); //reloj convertidor AD interno set_ade_channel (0); sem=17 rtosrun ()7 } void pid () t rtos_wait(sem)s valorsread_ade() //uectura de la temperatura yfevalor*5000.0/1024.07 //eonversién a mV (0.25 a 250mv) ePotenp_linits erset-yt; /fCalculo error preprerspr 1; /{caiculo del termine integral gf=c*(eT-ef_1)7 “(Calcul del término derivative TareTegh: //€&lculo de 1a salida PID Sf (ut>max) //Salida PID si es mayor que el MAX uT-maxs) else f if (wtemin) { (//Salida PID si es menor que el MIN ut=min) , control=ury //transferencia de salida PID 4 seflal PHM set_pwml_duty (control) pl_i=pty //Guardar variables ef inet; rtos_signal (sem)? rtos_yleld{) + void display() t xtos_wait (sem) ; 249 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC tempere=yF/107 Jed gotoxy(i,1)+ printf(1ed_putc, «Temp= $F\n», tempera) ; tdetem timic/10; * printf (led pute, “Limite Siu", t+ rtos_signal (sen); rtos_yield(), ) void teclado() i rtos_wait (sem) 7 4f (input (PIN_C4, temp_limit-temp_limit+10.0; 4f (temp limit > 1000.0) temp _limit~500.0; rtos_signal (sen): rtos_yield(); } Figura 8, Programa con PIC18F4520 _ 10. USB — Universal Serial Bus Capitulo 10 USB - Universal Serial Bus NOTA DEL AUTOR Cuando este libro estaba prdcticamente en imprenta, LabCenter realizé una actualizacién de la version 7 con un nuevo (y esperado) modelo: el USB (USB- CONN). CCS C ya proponia ejemplos y suministraba librerias para utilizar USB que no se podian simular en ISIS. Con este nuevo modelo se puede abandonar ya la simullacién por puerto serie RS-232 (la mayoria de los PC ya no disponen de este puerto) y afrontar el USB. Al estar el libro en imprenta, sdlo he podido incluir algo de teoria basica de USB y algin ejemplo sencillo sobre emulacién RS-232 con USB; espero que si hay mas ediciones de este libro pueda meer y aumentar este capitulo. 10.1 Introduccion El Bus Serie Universal fue creado en los afios 90 por una asociacién de empresas con la idea, entre otras, de mejorar las técnicas plug-and-play, es decir, permitira los dis- positivos conectarse y desconectarse sin necesidad de reiniciacién, configurandose autométicamente al ser conectados; ademés se le doté de transmisién de energia eléctrica para los dispositivos conectados. Este bus tiene una estructura de drbol y se pueden ir conectado dispositivos en cadena, pudiéndose conectar hasta 127 dispositivos permitiendo la transferencia sinerona y asincrona. Se puede clasificar segiin su velocidad de transferencia de datos (desde kilobits hasta megabits): Baja Velocidad (1.0) utilizado para los Dispositivos de Interfaz Humana (HID) como ratones, ete.; Velocidad Completa (1.1) y Alta Velocidad (2.0) para conexiones a Internet, etc. 251 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Fisicamente, los datos del ISB se transmiten por un par trenzado (D+ y D-) ademas de la masa y alimentacién (#5V). Los conectores estan sujetos al estandar (tipo A, tipo B). USB es un bus punto a punto, con inicio en el HOST y destino en un dispositivo o en un HUB; solo puede existir un nico HOST en la arquitectura USB. HOST se define como el dispositivo maestro que inicializa la comunicacién y HUB es el dis- positivo que contiene uno o mas conectores 0 conexiones hacia otros dispositivos USB; cada conector es un puerto LISB. El protocolo de comunicacién se basa en el paso de testigo (token), donde el HOST proporciona el testigo al dispositivo selec- cionado y éste le devuelve el testigo como respuesta. 10.1.1 Migracién de RS232 a USB La interfaz serie RS-232 est desapareciendo practicamente de los ordenadores per- sonales y esto supone un problema, ya que muchas de las aplicaciones con micro- controladores utilizan este bus para su comunicacién con el PC. La solucién ideal es migrar a una interfaz USB y existen distintas formas de hacerlo. El métode mas sencillo es emular RS-232 con el USB, con la ventaja de que el PC vera la conexién USB como una conexién COM RS-232 y no requeriré cambios en el software exis- tente, Otra ventaja es que se utilizan drivers suministrados por Windows, por lo que no es necesario desarrollar uno ad hioc; estos drivers son el usbser.sys y el ccport. sys. Ademis, puesto que el protocolo USB maneja comunicaciones de bajo nivel, los conceptos baud rate, bit de paridad y control de flujo para el RS-232 ya no im- portan. 10,1.1.1 USB CDC (Communication Device Class) Una clase USB es una agrupacién de dispositivos de caracteristicas comunes, es decir, utilizan una misma forma de comunicarse con el entorno, La clase de dis- positivo permite conocer la forma en que la interfaz se comunica con el sistema, el cual puede localizar el driver que puede controlar la conectividad entre la interfaz yel sistema, USB slo permite al driver comunicarse con el periférico a través de las tuberias (pipes) establecidas entre el sistema LISB y los endpoints del periférico. Los tipos de transferencia a través de las pipes dependen del endpoint y pueden ser: Bulk, Control, Interrupt e Isochranous. Una tuberia es un enlace virtual entre el HOST y el dispositi- vo USB, donde se configura el ancho de banda, el tipo de transferencia, la direccién del flujo de datos y el tamafio del paquete de datos. Estos enlaces se definen y crean durante la inicializacién del USB. Un endpoint es un buffer dentro del dispositivo o periférico donde se almacenan paquetes de infor- macin; todos los dispositivos deben admitir el endpoint 0, el cual recibe el control y las peticiones de estado durante la enumeracién del dispositivo. Cuando se conecta un dispositivo al HOST se produce la enumeracién en la cual el HOST interroga al 252 10. USB — Universal Serial Bus dispositivo sobre sus caracteristicas principales, asigndndole una direccién y per- mitiendo la transferencia de datos. La especificacién Clase de Disposition de Comunicacién (CDC) define algunos mo- delos de comunicacién, incluyendo la comunicacién serie. Windows suministra el driver usbersys para esta especificacién. Para la especificacién CDC se necesitan dos interfaces USB, primero la interfaz Communication Class usando un IN interrupt endpoint dé interrupcidn y el segundo es la intefaz Data Class usando un OUT bulk endpoint y un IN bulk endpoint. Esta interfaz es utilizada para transferir los datos que normalmente deberian ser transferidos a través de la interfaz RS-232. Desde el punto de vista de sistema USB, el dispositivo puede tener distintas con- figuraciones, para cada una de las cuales puede funcionar de forma distinta. Los dispositivos suministran la informacién necesaria al sistema USB a través de los descriptores; éstos contienen unos campos que permiten al sistema clasificar al dis- positivo y asignarle un driver. La primera informacin que necesita es la del fabri- cante y producto (LISB vendor ID — VIP y el Product ID ~ PID). El VIP es un nmero de 16 bits asignado por el USB implemeriters Forum (USB-IE)y debe ser obtenido por el fabricante del dispositivo USB; cada VID puede contener 65.536 PID diferentes al ser también un ntimero de 16 bits. Microchip suministra su VIP y los PID para cada familia de PIC con USB. ‘Microsoft Windotws (2000 0 XP) no tiene un fichero *.inf estandar para el driver CDC, asi que es necesario suministrar este fichero cuando se conecta un dispositive USB por primera vez al sistema. Microchip suministra el fichero mehpedc.inf necesario para sus dispositivos PIC, 10.2 USB con ISIS y CCS C 10.2.1 USB en ISIS LabCenter ha incorporado, en su versién 7, dos herramientas para la simulaci6n de circuitos con USB: el conector USB llamado USBCONN (figura 1), el cual permite conectar y desconectar el bus y el visualizador de USB llamado Analizador de Tran- siciones USB (figura 2); éste tiltimo se debe adquirir como un médulo aparte. Figura 1. USBCONN Ademés, el software de LABCENTER incorpora los drivers necesarios para la simu- lacién con USB. Para instalarlos hay que ir a la opcién INICIO > PROGRAMAS > 253 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC PROTEUS 7 PROFESSIONAL > VIRTUAL USB> INSTALL USB DRIVERS. Tras este proceso ya se puede trabajar con el USBCONN. Figura 2. Analizador de Transiciones USB 10.2.2 USB en CCS C CCS suministra librerfas para comunicar PIC con el PC utilizando el bus USB, me- diante periféricos internos (familia PIC18F4550 o el PIC16C765) o mediante dispo- sitivos externos al PIC (del tipo USBN9603).. Las librerias suministradas son: pic_usb.h: driver de capa hardware de la familia PICI6C765. iriver de capa hardware de la familia PIC18F4550. usbn960x.h: driver de capa hardware para el dispositivo externo USBN9603/ USBN9604. De esta forma, se puede utiliza el bus USB en cualquier PIC. + usb.h: definiciones y prototipos utilizados en el driver USB. usb.c: El USB stack, que mangja las interrupciones USB y el USB Setup Requests en Endpoint 0. usb_ede.h: driver que permite utilizar una clase de dispositive CDC USB, emu- Iando un dispositive RS232 y lo muestra como un puerto COM en Windows. Las funciones mas importantes, entre otras muchas, son: pic_18usb. + usb_init(): Inicializa el hardware USB. Espera en un bucle infinito hasta que el periférico USB es conectado al bus (aunque eso no significa que ha sido enumerado por el PC), Habilita y utiliza la interrupcidn USB. usb_task(): Si se utiliza una deteccién de conexién para la inicializacién, en- tonces se debe llamar periédicamente a esta funcién para controlar el pin de deteccién de conexién. Cuando el PIC es conectado 0 desconectado del bus, esta funcién inicializa el periférico USB 0 resetea el LISB stack y el periférico. 254 10. USB — Universal Serial Bus * usb_enumerated(): Devuelve un TRUE si el dispositivo ha sido enumerado por el PC y, en este caso, el dispositivo entra en modo de operacién normal y puede enviar y recibir paquetes de datos. Existen funciones especificas para CDC, entre ellas: + usb_cde_pute(c): Es idéntica a put(c) y envia un cardcter. Coloca un cardcter en el buffer de transmisién; en el caso de que esté Ileno esperar hasta que pueda enviarlo. + usb_cde_gete(c): Es idéntica a get(c) y lee un cardcter. Recibe un cardcter del buffer de transmisién; en el caso de estar vacio esperaré hasta que se reciba. CCS aporta varios ejemplos de aplicacién de USB segiin las clases de dispositi- vos, por ejemplo para el CDC encontramos el EX_USB_SERIAL.C y el EX_USB_ SERIAL2.C. Ejemplo 1; Enviar los datos de una conversién AD al puerto USB como Virtual Comm. Componentes ISIS: PIC18F4550, USBCONN, POTLIN, CELL, RES y LED-BLUE. El ejemplo se basa en la aplicacién para CDC, EX_USB_SERIAL2.C, donde el USB emula un puerto serie COM. De todas las posibles clases de dispositivos, la CDC es la mas sencilla de aplicar y entender (dada su similitud con el funcionamiento de un puerto serie). El ejemplo EX_USB_SERIAL2.C permite la visualizacion de una parte de la memoria EEPROM del PIC. La estructura de librerias de CCS se muestra en la figura 3. EX_USB_SERIAL2.C include <18F4550,h> include usB_cbCH include —— #include —» |USB_DESC_CDCH. ee include usB.C #include Figura 3. Librerias en EX_CDC_SERIAL2.C Se va ha modificar este ejempio para adaptarlo a los ejemplos del tema 7 sobre los puertos serie. Ademas de modificar el programa principal, hay que realizar una modificacién importante en la libreria de descriptores USB_DESC_CDC.H, donde se indica, al final de la libreria, el fabricante y el producto (VIP/PID); en este caso aparece: 255 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC 0x61,0x04, //vendor id (Ox04D8 is Microchip, or is it 0x0461 22) =8,9 0x33,0x00, //product id = 10,11 Para trabajar con Microchip hay que indicar en el identificador de fabricante el VENDOR ID 0x04D8 y en el identificador de productor el PRODUCT ID 0x0A para la familia de los PICI8. Es decir, esas dos lineas deben de quedar asi (es aconsejable hacer una copia de la libreria original antes de proceder al cambio): OxD8,0x04, //vendor id = 8,9 Ox0A,0X00, //product id = 10,11 Estos dos identificadores permiten la conexién con el driver de Witrdows; al iniciarse la conexién, Windows recibe los dos identificadores y localiza el driver necesario para la conexién. En el caso de no localizarlo, permite la instalacién de los recursos necesarios para la conexién; en este caso a través del fichero mchpede.inf suminis- trado por Microchip. Por otra parte, al final de la libreria se encuentra la descripcidn textual del disposi- tivo que serd detectado por Windows; para ello utiliza USB_STRING_DESC. Se pue- de modificar a gusto del usuario, teniendo cuidado con la definicién de la posicion de sirings y sus tamanios. char USB_STRING_DESC_OFFSET[]={0,4,12); char const USB_STRING_DESC[I={ Jstring 0 4, //length of string index USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING) 0x09,0x04, //Microsoft Defined for US-English string 1 8, //length of string index USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING) C0, <0 "S10, istring 2 30, //length of string index USB_DESC_STRING_TYPE, //deseriptor type 0x03 (STRING) eli C0, 256 10. USB — Universal Serial Bus hi El ejemplo (figura 4) realiza la lectura de una sefial analégica por el canal ANO y envia el dato por el USB emulando RS-232, de forma similar al ejemplo 2 del tema 7; el dato se enviara s6lo en el caso de que varie la tensién. He bbbbRehl bbeREEE i : Figura 4. Ejempio 1 Al igual que en el tema 7 se puede utilizar el Hyperterminal de Windowws (0 cualquier otro visor del puerto serie) para visualizar los datos. En este caso, hay que esperar a conectar el USB para que aparezca el puerto en las posibles conexiones del Hy- perterminal. 257 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Vol tage=1. 800 Yolen] 194 Figura 5. Hyperterminal conectado al puerto Virtual #include <19F4550.h> #device ade=10 #fuses HSPLb,NONDT, NOPROT rECT, NOLVP, NODEBUG, USBDIV; PLLS, CPUDIV1 , VREGEN #use. delay (clock=48000000) #detine USB_CON_SBNSE_PIN PIN B2 #include void main() ( BYTE i, j, addresa, value; intl6 a,aie float pr a setup_ade_ports (ANO|VSS_VED) ; setup_ade(ADC_CLOCK_INTERNAL) ¢ set_ade_channel(0)+ usb_ode_init()s usb_init (Ve do { veh _task()¢ if (usb_enumerated()) { g = read_ado(}7 Af (ql=qi) ¢ p= 5.0 * g / 1024.0; print®(usb_cde_pute, “\n\r Voltage = 201.21", p); , 258 10. USB — Universal Serial Bus ql=a: delay _ms(500)7 (PROB); Figura 6. Programa del ejemplo 1 La configuracién de PIC18F4550 es la habitual, tan sélo debemos tener en cuenta que la frecuencia debe ser de 48 MHz pero que utilizando el bit de configuracién PLL5 se puede emplear un cristal de cuarzo exterior de 20 MHz. Es importante configurar el pin de deteccién del sentido de transmisién (USB_CON_SENSE_PIN) para poder controlar la conexién o desconexién del PIC al USB; la conexién fisica se muestra en la figura 4. Antes de utilizar el puerto en el programa hay que iniciali- zarlo (usb_cdc_init() y usb_init()) y, “muy importante”, comprobar que ha sido enu- merado por el HOST (usb_enumerated()). Con el fin de inicializar o resetear la co- nexién con el USB se debe realizar una llamada periddica a la funcién usb_task() Aliniciar la simulacién con el PLAY del ISIS, el sistema permanecera inactivo hasta que se conecte el USBCONN (con las flechas rojas correspondientes). Tras conec- tar, por primera vez el USB, Windows solicita la instalacién del driver (se debe indi- car el directorio donde se guarde el fichero mchpede.inf) (figura 7 y figura 8). Figura 7. Pasos en la instalacién del driver 259 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Tras esta instalacidn y cada vez que se conecte el USBCONN aparecera el puerto COM virtual en el administrador de dispositivos de Windows (figura 9). También desaparecerd el COM virtual cada vez que se desconecte. Figura 9. Puerto COM virtual en el administrador de dispysitives En este instante el PIC queda conectado al PC y se puede abrir un visor del puerto serie para comprobar la transmision (figura 5). En los ejemplos de CCS también se pueden encontrar aplicaciones para Mass Stora- ge Device Class (MSD) y Human Interface Device Class (HID). Ejemplo 2: Erroiar los datos de una conversin AD al puerto USB como Virtual Coram para determinar la respuesta en lazo abierto de un horno (figura 10). Componentes ISIS: PIC18F4550, USBCONN, CELL, RES, LED-BLUE, SW-SPDT y OVEN. El ejemplo es similar al anterior, en este caso se utiliza EXCEL con Visual Basic, de tal forma que se pueden guardar los datos de tiempo y temperatura en una hoja de cAleulo y representarlos graficamente. 260 10. USB - Universal Serial Bus Figura 10. Ejemplo 2 Para utilizar el fichero en Excel, HORNO.XLS, se debe configurar el puerto serie virtual: en el fichero esta definido como el puerto 9 y ademas habilitar las macros, en el caso de tener Excel protegido (Herramientas > Macro > Seguridad > Media/Bajo). Para cambiarlo a la medida del usuario hay que abrir el editor de Visual Basic (He- rramientas > Macro > Editor de Visual Basic), buscar Commport = 9 y sustituirlo por el mimero adecuado de puerto serie virtual (figura 11). Tivse Fw Comat oa Tee ‘CommandBscton2.Sackecior = BOBO. 255, 0) Comment Esler = 200 oresteet9 (79D) nertonmat = “0.000% Borkateess(raajat") Colas ("2") SaaberForme = *0.0" poteopen = Teves daa tice ote Bra 9 a at: Private SiS Ceamandiactonl CiveKi) (ComandButteni.facxcclor = 200(0, 255, 0) ConmandBuctont Backcelox = ROBI260, 200, 200) Figura 11. Modificacién del puerto serie include <18F4550.h> device ade=10 #fuses HSPLb,NOWDT, NOPROTECT, NOLV#, NODEBUG, USBDIV, PLLS,CPUDIVI, VREGEN fuse delay (clock=48000000) define USB_CON_SENSS_PIN PIN B2 261 Compilador C CCS y Simutador PROTEUS para Microcontroladores PIC finclude void main() { int6 ane float p; int air iat giz int nb,ni, setup_adc_ports(ANO) ; setup_adc (ADC_CLOCK_INTERNAL) ; nao; usb_ede_init()s usb_init()s delay ms (3000) //Retardo para poder abrir el puerto con el Excel do i usb_task()7 if (usb_enumerated()) { set_ade_channel (0); delay_us(10); q = read_ade(): p= 5.0 * ¢ / 1024.0; niomake8 (n, 0) 7 snake8 (ar) 4 if {usb_ede_putready()) usb_cde_pute (al) 4f (usb_cde_putready()) usb_cde_pute (ati): qi=make® (q,0) + qi=make8 (q,1) 2 £ (usb_cde_putready()) usb_cdc_pute (al); if (usb_cdc_putready()) usb_cde_pute (ai) delay_ms{500); //Se envian datos cada 0.5 5 } while (TRUE) ; Figura 12. Programa del ejemplo 2 Para la simulacién se debe abrir el fichero de Excel (figura 13); en este fichero exis- ten dos botones para abrir el puerto y cerrarlo (también hay un botén para borrar Jos datos adquiridos). Antes de abrir el puerto se debe arrancar el ISIS ¢ iniciar la simulacién del programa, a continuacién se puede conectar el USBCONN y, una 262 10. USB - Universal Serial Bus vez conectado, se puede abrir el puerto con el botén de Excel para iniciar la adqui- sicién. svete co ue halons Fr Figura 13. Fichero de Excel Para ver la curva de calentamiento se puede cerrar el interruptor del horno de tal forma que comience a calentarse (figura 14). Figura 14, Datos adquiridos y su representacion 263 Esta edicién se terminé de imprimir en junio de 2008, Publicada por ALFAOMEGA GRUPO EDITOR, S.A. de C.V. Apartado Postal 73-267, 03311, México, D.F. La impresién y encuadernacién se realizaron. en FUENTES IMPRESORES, S.A, Centeno No, 109, Col. Granjas Esmeralda, Tztapalapa, 09810, México, D.P. HEARSE OE a sy PAU LeU a Los microcontroladores P/Cmicro de Microchip han experimentado un importante aumento de presencia en el sector industrial, esto se debe, entre otros muchos fac- tores, a la politica de apertura que tiene Microchip, ya que facilita y potencia el de- sarrollo de herramientas por parte de otras compaiiias. En lenguajes de programacién destacan los compiladores C para PIC de compaiiias como CCS Inc. El desarrollo de un lenguaje C especifico para un microcontrolador permite obtener el maximo rendimiento del micro. Los programas de simulacién permiten depurar hasta casi la perfeccién el disefio antes de ser montado en una placa. No hace falta explicar el ahorro de tiempo y coste que ello supone. Tal vez uno de los mejores simuladores para microcontro- ladores es el ISIS de PROTEUS. En el capitulo | de este libro se hace una breve, pero intensa, descripcion del ISIS de PROTEUS, de forma que el lector pueda afrontar la simulacién de disefios sin ningin problema. En el capitulo 2 también se realiza un repaso del compilador C para PIC de CCS; obviamente no puede explicarse este lenguaje en un solo capi- tulo, pero tras su lectura cualquier lector podr4 afrontar los pequefios programas de disefio que se exponen en los siguientes capitulos. Del capitulo 3 al 7 se desarrollan los distintos médulos que integran un PIC (ADC, USART,CCP, ete.) a nivel hardware, enlazdndolos con las correspondientes direc- tivas y funciones del C. En cada capitulo se plantean y desarrollan sencillos ejem- plos de aplicacién que el lector podra estudiar y, como no, modificar para completar sus conocimientos En el capitulo 8 se expone la gama alta (PIC18) y en el capitulo 9 una aplicacién mis compleja, el RTOS (Real Time Operating System). También en estos capitulos se incorporan distintos ejemplos de aplicacién. Por tiltimo, en el capitulo 10 se desarrolla el USB de reciente incorporacién al ISIS. Este libro esta enfocado a todos aquellos lectores movidos por el interés acerca de los microcontroladores PIC sin necesidad de tener conocimientos muy profundos en la materia. Los ejemplos desarrollados no tienen una excesiva complejidad, son breves y permiten ir afianzando los conocimientos capitulo a capitulo. ISBN 978-970-15-1397-2 | | 5139 ol 89701

You might also like