Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Compilador C Ccs Y Simulador Proteus Para Microcontroladores Pic, Notas de estudo de Engenharia Elétrica

Curso de microcontroladores com simuladores

Tipologia: Notas de estudo

2013

Compartilhado em 11/06/2013

roberto-vilela-6
roberto-vilela-6 🇧🇷

4.8

(18)

44 documentos

1 / 270

Documentos relacionados


Pré-visualização parcial do texto

Baixe Compilador C Ccs Y Simulador Proteus Para Microcontroladores Pic e outras Notas de estudo em PDF para Engenharia Elétrica, somente na Docsity! Polpa HOT TA HH EA Y SIMULADOR PROTEUS DT CADA dh EE) Ea RpEEE EE FZ & ComriLaDor € CCS Y SimuLadOR PROTEUS PARA MicrOCONTROLADORES PIC Eduardo Garcia Breijo LON Alfaomega icion es lécnicas vi DIA D 3.3.2 LCD gráfico. 3.3.3 Teclado (keypad 3x4) 4. Las interrupciones y los temporizadores. 4.1 Introducción... 4.2 Interrupciones 4.21 Interrupciones en 4.3 TIMER 4.3.1 TIMERO en C 44 TIMERI y TIMERZ 4.4.1 TIMERI y TIMER? en € 5. Convertidor Analógico — Digital 5.1 Introducción... 5.2 Módulo Convertidor (gama media) 5.2.1 Registros FSR. 2 Proceso de conversió: 5.2.3 Efecto del modo SLEEP y R] 5.3 Módulo AD en C.. 6. Módulo CCP — Comparador, Captura y PWM. 6.1 Introducció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 Introducción... 7.2 El módulo USART/SCI. 7.2.1 Introducción. 7.2.2 El módulo USART en C 7.2.3 La norma R$232..... 7.3 Puerto serie síncrono (SSP) 7.3.1 Interfaz Inter-Circuitos (I2C) 8. Gama Alta — PICI8.. 8.1 Introducció 8.2 Organización de la memori; 8.2.1 Arquitectura HARDVARD. 8.2.2 Memoria de Program: 8.2.3 Contador de Program 8.2.4 Memoria de Configuración.. en el módulo AD PEDIA 8.2.5 Pila 8.2.6 Memoria de Dato: 8.2.7 Memoria EEPROM 8.2.8 Modos de Direccionamiento Interrupciones. 8.2.9.1 Registros de salvaguarda. 8.2.10 Registro W 8.2.11 Oscilador. 8.2,12 Unidades Funcionale: 8.2.12.1 Puertos de entrada /salida 8.2.12.2 Temporizadores. 82.12.3 Convertidor Analógico-Digital. 8.2.12.4 Canal de Comunicación Serie (BUSART) 8.2.12.5 Modulo Master SSP (MSSP).... 8.2.12.6 Modulo de Compración/Captura/PWM (CCP) 8.2.12.7 Modulo Comparador 8 Modulo de referencia. 8.2.12,9 Modulo detector de Alto/Bajo Voltaj 9. RTOS — Real Time Operating System. 9,1 Introducción 9.2 RTOS en C 10. USB — Universal Serial Bus 10.1 Introducció; 10.1.1 Migración de R$232 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 vii + Introducción 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 diseno de los sistemas donde intervienen. Entre los muchos programas para el desarrollo de sistemas con PICmicroO desta- can, por su potencia, el PROTEUS VSM de OLabcenter Electrónics y el compilador € de OCustom Computer Services Incorporated (CCS). El programa PROTEUS VSM es una herramienta para la verificación vía software que permite comprobar, prácticamente en cualquier diseno, la eficacia del progra- ma desarrollado. Su combinación de simulación de código de programación y si- mulación mixta SPICE permite verificaciones analógico-digitales de sistemas basa- dos en microcontroladores. Su potencia de trabajo es magnífica. Por otra parte, tenemos el compilador C de CCS, ya que después de conocer y “do- minar” el lenguaje ensamblador es muy útil 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 o 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 básicos necesarios para manejar cada programa, apoyarlo con el mayor número de ejercicios y dejar al lector la posterior ampliación de conocimientos. Así 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 Electrónica 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. popitaçneto popipteçnetas 1. ISIS de PROTEUS VSM Figura 3. Submenús de trabajo dei 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 librerías (figura 5). ms Db 4H Dv 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 características. Al localizar el componente adecuado se realiza una doble pulsación en él, de tal forma que aparezca en la ventana de componentes y librerías (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. LIA 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 características Símbolo de esquema y modelo Encapsulado para placa Pequefio editor de las caracteristicas de un componente (situar el ratón sobre 61) Figura 6. Ventana para la edición de componentes RES SW-SPSTMOM Figura 7. Los componentes afiadidos 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 representará en el esquema) en la ventana de edición (figura 8). Si deseamos modificar la rotación o la reflexión del componente podemos acceder a ello a través de la barra de herra- mientas correspondiente (figura 9). Haciéndolo de esta forma, “todos” los componentes de la lista tendrán la misma orientación (si se desea orientar un único componente deberemos hacerlo una vez ya situado en el esquema). o EI £ 1. ISIS de PROTEUS VSM > + ] % B k E cor th Figura 8. Selección y orientación Figura 9. Barra de rotación y reflexión del componente Ahora sólo falta realizar una pulsación sobre la ventana de trabajo y se colocará 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. y en botón izquierdo coloca el component Figura 10. Cursor en el modo de colocación Es importante activar la herramienta de referencia automática (Real Time Annota- tion). De esta forma, los componentes tendrán una referencia distinta y de forma consecutiva; en los circuitos integrados con varios componentes encapsulados tam- bién se referenciarán según dicho encapsulado (U1A, U1B, etc.). Esta herramienta se activa o desactiva desde la opción de menú 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 características del componente). También se puede cambiar su orienta- ción utilizando los comandos de rotación y reflexión a través de una pulsación del botón derecho del ratón (figura 12) y se pueden eliminar con dos pulsaciones con el botón derecho sobre ellos (o con el botón derecho y el comando Delete Objet). y) Selección del componente a Mover componente, se debe arrastrar el ratón Figura 11. El cursor en modo de selección y mover popupteçnitas Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Las uniones entre cables se pueden realizar de forma automática. 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 unión. NS siste Figura 18. Unión eléctrica entre cables Figura 19. Modo de unión 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. Figura 20. Mover los cables También se pueden utilizar buses para las uniones multicable. Los buses permiten conectar varios terminales entre sí utilizando un único elemento (figura 21); en este caso, el cursor se convierte en un lápiz azul (figura 22). Pero para distinguir los distintos cables que forman parte del bus y distribuirlos en la entrada y en la salida se deben etiquetar mediante labels. En el caso de los cables se indicará una etiqueta única LCDO, LCDJ1, etc. y al bus una etiqueta conjunta según el formato LCD[0..3] que indique el nombre y la cantidad de cables que lo forman. Figura 21. Cableado por bus PEDIATRA 1. ISIS de PROTEUS VSM Figura 22. Cursor en modo de trazado de bus El etiquetado también permite unir cables virtualmente. Para ello, tan sólo es nece- sario que los dos cables se Ilamen igual aunque no estén conectados entre sí. Para etiquetar cables o buses se utiliza el modo label (figura 23). Al activar este modo y realizar una pulsación sobre un cable o bus se abre una ventana donde podemos in- troducir la etiqueta, además de seleccionar posición, orientación y estilo (figura 24). ELA 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 (default). Al utilizar este terminal en varios componentes y darle el mismo nombre en todos ellos se consigue una unión eléctrica. > + o = ud T k. pe 1 jo o Figura 25. Modo terminal EDU E Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC ROZICEET | eblhhbbe bhbbkl RCSISDO o RXD O———— RXD xo 0——— mo Figura 26. Unión 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). 2 [2 pe [20 2 o [28 pa te pts pé 15 [6 ar [18 Figura 27. Circuito cableado Tan sólo queda modificar las características 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 botón derecho, aparece el menú 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 características 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 pulsación se realiza encima de estos elementos. 10 so = = 2 CET 1. ISIS de PROTEUS VSM | Source EM 38 Define Code Generation Tools... Setup External Text Editor... Bula a 1. borra,asm 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 simulación 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 o configurar muchos más elementos: configurar el wnacthdog, 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 dependerá 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 ejecución; 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). Di JM [om] animatin: 00:00:0265 (CPU load: Figura 35. Barra de estado en la simulación 13 PEDIA Compilador C CCS y Simulador PROTEUS para Microcontrotadores PIC La opción STOP para totalmente la simulación 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 opción 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. comiguraigm RE > Simulation Speed-———. [——>=Animation Options ———— Frames per Second: | | ShowVotage 5 Cunent on Probes? iv | Timestep per Frame: | Show Logic State of Pirs? vo Singlo Step Tama: | Showie Voltage by Cow? 1 | ShowiWre Cunert with Anowa? Figura 36. Set animation options En este cuadro de diálogo también se pueden cambiar los siguientes parámetros: 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 visualización de las sondas de tensión y corriente, mostrar los niveles lógicos en los pines, mostrar el nivel de tensión en los cables mediante colores o mostrar la dirección de la corriente en los cables mediante flechas. VOLTAGE/CURRENT RANGES: permite determinar el umbral de tensión (&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 depuración. Es decir, visualizar mediante ventanas las distintas partes internas del microcontrolador: memoria de programa, memoria de datos, pila, etc. La mayor parte de estas ventanas sólo se pueden visualizar durante una PAUSA. 14 DIADEMA t Er E 1. ISIS de PROTEUS VSM Sw5, so SW-spsT 1 É so E 2. oo augsenaê ERES UNOS Figura 37. Una simulación en marcha Desde el menú 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 menú DEBUG antes de la simulación 15 LIA Compilador € CCS y Simulador PROTEUS para Microcontrotadores PIC Con WATCHPOINT CONDITION se pueden habilitar puntos de ruptura median- te condiciones sobre las distintas variables (figura 44); se indica la variable, la más- cara de la condición (NONE, AND, OR, XOR) y el tipo de condición (NONE, ON CHANGE, EQUALS, etc.). Hate cla lt ad ob chao TE Memo [PIECPU Daia Memoy-UZ Nome [SAIDA foto cocmeçe o AR Blob Bio Conan Er E “Tum ia) watch pot ás + Suspende emo ANY eqresinitue ichpoint Condition “Stop Me simon ori ve ALL epressions ate te. É Doubt Wii) | É Quad WB byte) (IEEE Float byte) < -JEEE Double (8 bytes) 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 o COF al microcontrolador, se trata de la ventana CPU SOURCE CODE (figura 45). Con esta ventana se puede seguir la simulación línea a línea del archivo de código fuente, En esta ventana (también en el menú DEBUG) están disponibles unos botones de control (figura 46). 18 IDA 1. ISIS de PROTEUS VSM l * Radalo | o6 “include <Icdimio.c> 4include <kbdMID.c> 2 void main() ( char kj int vox 1ed-init kbdcini ti port b. pu trade cd puteç'NtListo...Nn'); uríle (TRUE) ( tha gec(); peid 48; //0x30 OD.) Da eise Ted. purctk); prinef(Icd pure printfticd pure printfílcd putc, Brintr(Tedonutc printeCIcdlpute, au caracter caracter caracter valor ascii valor ascii valor numerico sf Figura 45. La ventana CPU Source code * | edad] dé Figura 46. Los controles para la simulación Simulación en modo continuo, no permite ver las ventanas de depu- ración. Permite ejecutar una instrucción; si es una subrutina o 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 o deshabilita los puntos de ruptura. 19 LIRA Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Hay una ventana de diagnóstico que facilita la depuración, almacenando los erro- res, mensajes de diagnóstico y avisos producidos durante el proceso de simulación (figura 47). En la barra de estado (zona inferior del área de trabajo) se muestra un aviso (figura 48); con una pulsación en el aviso aparece la ventana de diagnosis. Meseago ED SIS Ricano 7.07 2 (Bud 3632) C) Lobcente Electonics 1330-2007. ÃO Source code Dull copied O 3 Compra dest E Nêretwvos de programa abcentes ElectonesAPoteus 7 PlofessionaNsAMPLE. 5 Not complaton completed O. 9 Nest ining complete O [9 PROSPICE 710.09 fui 2529) (C) Labeentes Elechormos 18932007 [O Lcadedretit O NDCICUME = MEIA CONAIG NTempNL ISA ENT SD fo des 152405 MATCH. [03 PIC1S mode telaave 7 00.03 (Bud 3685) semulating PICIGEZE deviom [O Loaded 128 Eyes ol postes EEPROM data 1 Loading HEX He Machuom HEX, O Roseta ot TOR bes Hom He Macho HE Loaded 535 program words ar O sa tes Figura 47. Mensajes de diagnóstico de la simulación Se pueden configurar las opciones de esta herramienta desde la opció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). Lo TJIPTU|a |O sMesses) Rostshesti Figura 48. Mensajes de la herramienta de diagnóstico EST = remessa ro DI Setgtastat Debora cnheio [EX Exento ne Exete Without Bresipovts. AbsPIZ ExeenoFor Species Time Figura 49. La configuración de diagnósticos 20 DIA 2. Compilador CCS C Capítulo 2 Compilador CCS € 2.1 Introducción El Compilador C de CCS ha sido desarrollado especificamente para PIC MCU, ob- teniendo la máxima optimización del compilador con estos dispositivos. Dispone de una amplia librería de funciones predefinidas, comandos de preprocesado y ejemplos. Además, suministra los controladores (drivers) para diversos dispositivos como LCD, convertidores AD, relojes en tiempo real, EEPROM serie, etc. Las ca- racterísticas generales de este compilador y más información adicional se pueden encontrar en la dirección http://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 máquina en el entorno de trabajo del PC, el código máquina puede ser cargado del PC al sistema PIC mediante el ICD2 (o mediante cualquier programador) y puede ser depurado (puntos de ruptura, paso a paso, etc.) desde el entorno de trabajo del PC. ELCCS C es C estándar y, además de las directivas estándar (finclude, etc.), sumi- nistra unas directivas específicas para PIC (fdevice, etc.); además incluye funciones específicas (bit set(), etc.). Se suministra con un editor que permite controlar la sin- taxis del programa. NOTA En el manual de CCS se da mucha más información de la que a continuación se va a dar. En este capítulo sólo se describirán los elementos más básicos y esenciales para comenzar a programar. 23 pesipieçnitas 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 básicos de su estructura (figura 1). DIRECTIVAS DE PREPROCESADO: controlan la conversión del programa a código máquina por parte del compilador. PROGRAMAS o FUNCIONES: conjunto de instrucciones. Puede haber uno o varios; en cualquier caso siempre debe haber uno definido como principal mediante la inclusión de la llamada main(). * INSTRUCCIONES: indican como debe comportar el PIC en todo momento. * COMENTARIOS: permiten describir lo que significa cada linea del programa. delay XT: NOM standard 10: Dener Direct Función TIMERO dor usa dt varo É IvarOo=: quepur bit/PEN BO, outpur ir PIR BO Zoé tsmaro Función principal Betup timer O RIC INTERNAL/RICC, DIV 2 net tinero emaBle intecrupto INT TIMERO cnablo intecrupes global fe ro Instrucciones Comentarios EASSALARALARASESARMo so an rar] Figura 1. Estructura básica de un programa 2.3 Tipos de datos CCs C acepta los siguientes tipos de datos: Tipo Tamafio Rango Descripción Intt a E Short Tbit Dal Entero de 1 bit 24 popupteçnetas 2. Compilador CCS C Tipo Tamafio * Rango Descripción Int 7 Int8 8bit 0a 255 Entero Intl6 a a à Long 16 bit 0a 65.535 Entero de 16 bit Int32 32 bit O a 4.294.967.295 Entero de 32 bit A *1,175x10% a Float 32 bit 23. 402x1058 Coma flotante Char 8 bit 0a 255 Carácter Void E E Sin valor Signed Int8 8 bit -128 a +127 Entero con signo Signed Intl6 16 bit -32768 a +32767 | | Entero largo con signo Signed Int32 32 bit -24 a +(2º1-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 Octal (0) 0x123 Hexadecimal(0x) 0b010010 Binario (Ob) Ea Carácter Noto” Carácter octal AxA5 Carácter hexadecimal Además, se pueden definir constantes con un sufijo: Int8 127U Long SOUL Signed INT16 80L Float 3.14F Char Con comillas simples *C” También se definen caracteres especiales, algunos como: dm Cambio de línea we Retorno de carro 25 popipieçnetas Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC 2.6.3 Relacionales Menor que Mayor que < > > | Mayor o igual que <= | Menor igual que = | Igual != | Distinto ?: | Expresión condicional 2.6.4 Lógicos E NOT && | AND H OR 2.6.5 De bits = | Complemento a 1 & | AND ” OR EXCLUSIVA I OR > | Desplazamiento a derechas << | Desplazamiento a izquierdas 2.6.6 Punteros & | Dirección * | Indirección -> | Puntero a estructura 28 Orden de precedencia de los operadores: 2, Compilador Cesc DIA D Expresiones en orden de precedencia descendente (expr) lexpr -expr +expr expr+ --expr | expr-- (typejexpr *expr &value sizeof(type) exprtexpr expr/expr exprWexpr expr+expr expr-expr expr<<expr expr>>expr expr<expr expr<=expr expr>expr expr>=expr expr=expr expr!=expr expr&expr exprºexpr expr | expr expr && expr expr || expr expr? exprexpr lvalue = expr lvalue+=expr | Ivalue-=expr lvalue*=expr lvalue/=expr | Ivalue%=expr lvalue>>=expr | Ivalue<<=expr | Ivalue&=expr lvalue"=expr lvaluel=expr | expr, expr 2.7 Funciones Las funciones son blogues 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 función, además de devolver un valor, puede recibir parâmetros o argumentos. 29 popitagnéto Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC La estructura de una función es: Tipo Dato Nombre Funcion (tipo param, param2,...) (sentencias) ; float trunca (float a) f float bz La forma de devolver un valor es mediante la sentencia RETURN: return (expresión); return 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 amada. También se puede finalizar la función sin RETURN, tan sólo con la llave de cierre “)”. Las funciones pueden agruparse en ficheros de libreriías <fichero.h>, que se pueden utilizar mediante la directiva ginclude <fichero.h>. 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 Esp 2 Compilador CCSC IF (A>10) (IF (A>20) B=15;) ELSE B=5; 2.8.2 SWITCH Siwitch es un caso particular de una decisión múltiple switch (expresión) t Case constante 1: sentencias; break; Case constante 2: Sentencias; break; default: f Sentencias;] + 3 Evalúa 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- FAULT (este comando es opcional). comando BREAK provoca la salida de SWITCH, de lo contrario se ejecuta el ente CASE. pueden existir dos CASE con la misma CONSTANTE. 33 PEDIA Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Ejemplo: case 3: B=3; break, default: break; 2.8.3 FOR Se usa para repetir sentencias. for (inicialización ; condición de finalización ; incremento ) f 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 si es cierta o no, en el caso de ser cierta se ejecutan las sentencias y en caso contrario se sale del FOR. Por último, la expresión de incremento o decremento modifica la variable de control DESPUES de ejecutar el bucle. NOTA Se pueden anidar bucles FOR utilizando distintas variables de control. 34 poppteçnétas 2. Compilador CCS Si se ejecuta la siguiente expresión se consigue un BUCLE SIN FIN: Fort; ; ) f sentencias; 4 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) t sentencias; y La expresión se evalúa y la sentencia se ejecuta mientras la expresión es verdadera, cuando es falsa se sale del WHILE. PEDIA 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 continúan con un comando específico. La sintaxis depende del comando. Algunos comandos no per- miten otros elementos sintácticos en la misma expresión. Muchas de las directivas utilizadas por CCS son extensiones del C estándar. ADEFINE IDSTRING 4lFexpr *NOLIST HELSE HIFDEF id 4*PRAGMA cmd Estándar C a +ENDIF ALIST +*UNDEF id HERROR 4INCLUDE “FILENAME” . HINLINE INT GLOBAL — 4SEPARATE Cualificadores $INT. DEFAULT HINT ox FEDATR E LINE -PCH Identificadores | DEVICE cuPEBo:. TIME FILE PCM — FILENAME RTOS HTASK AUSE RTOS Especificación | fDEVICE CHIP ID “filename” 4FUSES options Dispositivos | sID CHECKSUM fID NUMBER 4SERIALIZE a USE DELAY CLOCK 4USEFIXED IO — AUSERS232 Eibrerias sUSE FAST IO sUSE RC “USE SPI predefinidas *USE STANDARD IO ASM 4BYTE ideid FROM *BIT id=id.const *ENDASM TYPE COMnoLd rr ia-constconst — EILISROM ZERO RAM memoria 4BUILD ALOCATE id=const *BYTE id=const SRESERVE Controlde | CASE *0PTn *PRIORITY compilador ORG HIGNORE WARNINGS Alo largo del presente libro se irán viendo varias directivas en su ámbito de apli- cación particular. 38 popupteçnitas 2. Compilador COS € Como ejemplo se pueden comentar: +DEVICE chip, permite definir el PIC con el que se realizará la compilación. fdevice PICI6FE4 £FUSES options, la cual permite definir la palabra de configuración para progra- mar un PIC. Por ejemplo, en el PIC16F84 las opciones posibles son: LP, XT, HS, RC, NOWDT, WDT, NOPUT, PUT, PROTECT, NOPROTECT. fidevice PICIGFB4 ffuses XT, NOWDT, PUT, NOPROTECT *INCLUDE “filename”, permite incluir fichero en el programa. Finclude <16F84.h> ffuses XT, NOWDT, PUT, NOPROTECT *USE DELAY (CLOCK=SPEED), permite definir las frecuencia del oscilador del PIC, el compilador lo utiliza para realizar cálculos de tiempo. Se puede utilizar M, MHZ, K y KHZ para definir la frecuencia. FINCLUDE <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. fasm bsf TATUS,RPO moviw 0x8 movwf PORTE bof STATUS, RPQ fendasm DIA D 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 configuración del PIC sin entrar en el ni- vel de los registros especiales. Las funciones se clasifican por bloques funcionales. ASSERT() GETCH() PUTC() FGETC() GETCHAR() | PUTCHAR() FGETS() GETS() PUTS() E/S R$232 EPRINTE() KBHIT() SET UART SPEED() FPUTC() PERROR() SETUP. UART() FPUTS() PRINTF() ESBUS |SETUPSPI() |SPLDATA IS IN() [spLWRITEO SPI2-HILOS |SPLXFER() — |SPLREAD() j E OUTPUT. GET TRISx() | INPUTK() FLOAT() SET TRIS B() INPUT() INPUT STATE() | OUTPUT G() [SET TRIS C() INPUT A() [INPUTX() OUTPUT H() | SET TRIS D() OUTPUT. INPUT. B() OUTPUT A() | piGH() SET TRIS E() INPUT. C() OUTPUT.B() |OUTPUTJ() |SET TRISF() ES - DISCRETAS [INPULDO — | OUTPUT.BIT() | OUTPUT K() | SET TRIS G() INPUT E() OUTPUT. C() | OUTPUT LOW() | SET TRIS H() OUTPUT TO- INPUT F() OUTPUT. D() | GaLE() SET TRIS J() OUTPUT. DRI | PORT A PU- . INPULG() | vr() LLUPSO SET TRIS K() INPUT. H() — [OUTPUT.E() | PORTB PULLUPS() INPUT I() OUTPUT F() [SET TRIS A() E/S PUERTO | PSP INPUT FULL() PSP OVERFLOW() PARALELO ESCLAVO | PSP OUTPUT. FULL() SETUP. PSP() I2C WRITE() | [2C Slaveaddr() | I2C.ISR STATE() ESBUSIRC |I2C POLL() |IDCSTART() RC READ() | PC STOP() CLEAR INTE- | GOTO, A = RESET CPU CONTROL | RRUPT() ADDRESS() = GRC) PROCESOS | DISABLE IN- | INTERRUPT. . TERRUPTS() | ACTIVE() RESTART. CAUSE() 40 Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC EDITE * .PJT: fichero de proyecto; contiene toda la información relacionada con el pro- yecto. * “LST: muestra un listado con el código C y el código ensamblador asociado para cada línea de código. * .SYM: muestra las posiciones y valores de los registros y las variables del pro- grama. * STA: muestra una estadística de la utilización de la RAM, ROM y la PILA. * .TRE: muestra un árbol del programa donde se especifican las funciones y sus amadas, con la ROM y RAM usada en cada una de ellas. * .HEX: fichero estândar para la programación del PIC. * «COF: depuración correspondiente. 2.12.2 Entorno de trabajo ichero binario que incluye el código máquina y la información para la El entorno 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 básicos del entorno de trabajo. Existen dos formas de iniciar una sesión: abriendo un fichero de código fuente o creando un proyecto. Comando de manejo de ficheros. Barra de SubComandos Ss = Para Dan RAS aaa Dl [77 Programa : Barra de estândar Barra de Ventanas auxiliares ZONA DE CÓDIGO Figura 2. Entorno de Trabajo 44 PERUA DS ú 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 menú 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). Figura 4. Fichero fuente nuevo 45 popiptagnéto 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 pestanias, una para configurar las distintas opciones que se muestran en la barra de la izquierda (figura 5) y otra donde se muestra el código resultante de la configuración (figura 6). Recorriendo las distintas opciones (general, communications, ete.) se llega a obtener el código de configuración deseado (figura 7), tras lo cual ya podemos empezar a escribir el resto del código del programa. Debemos observar como se incluye un fichero de cabecera *.h donde se encuentra la configuración del dispositivo (figura 8). e ad nao à E = Deco [ME =] Oeiuafoneay [ SUB je T Rest WO ig sto DELA E aut pu rev cora lasuses amor “180 vino Tear Bites Ea Due vio CUT nses py re Tae jsESnOPOrECI Parado une canon; ne metes ensessng Figura 6. Ventana de configuración con el código resultante 46 Jo <158876 h delay clock + anouor = puerto b vota main (void set tris p(0500) puerto b do delay ms (1005 bit ser (puerto b delay me 1000 hit clear (puerto b while (TRUE, 152876.» = delay clock e puerto b - U jvoid main (void. set tris b/Dx00/: pusrto b - 0 Figura 11. Contrayendo el árbol Enel editor de texto se puede pulsar el botón derecho sobre cualquier linea (figura 12); en el caso de los ficheros include permite abrirlos en una pestania adicional. Figura 12. Las opciones del botón derecho PEDIA D 2 Compitador ces c 49 popipteçnetas 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 características (Data Sheet) y una ventana completa don- de se describe el PIC (Device Table Editor) mediante distintas pestanias (esta opción también es accesible desde la opción TOOLS > DEVICE EDITOR (ver figura 15). E AassbissapaaSssssssasascsagaadãas Figura 13. Comando VIEW Se puede proceder a la compilación, que se puede hacer con el comando COMPILE > COMPILE o directamente con la tecla de función <F9>. 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 si la compilación ha sido correcta (figura 15). NOTA ATENCIÓN! Si se escribe un fichero fuente y a continuación se abre o se crea un segundo fichero fuente, al compilar este último se compilará el primero. Siempre se compila siempre el PRIMER fichero abierto. 50 forno p * Reference Number, P362086211 mms E Project: FA.ATURA PlClpracticasiCLASENuz. jnt, clluz.e Figura 14. Ventana de compilación 2. Compilador CS C Figura 15. Mensajes de compilación Tras la compilación se obtiene, entre otros, el fichero HEX para programar O si- mular el PIC. En OPTIONS > PROJECT OPTIONS > OUPUT FILES, se pueden configurar los ficheros de salida (figura 16). [Project Optians. xd Iecude pes. Gisbaigafines Figura 16. Ficheros de salida 51 Losi qual Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC 25.4s07 Figura 22. Ventana de WATCH con la variable 54 popupteçnetas LUQUAU TA 3. La gestión de los puertos Capítulo 3 | La gestión 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 8 terminales que, de forma básica, se comportan como una entrada/ salida digital. Según las características del PIC, cada puerto puede tener, además, | asignado un bloque funcional: convertidor AD, USART, IC, etc. Por ejemplo, en la familia PIC16F87X (figura 1), pueden llegar hasta 5 puertos en el ! PIC16F877 donde se pueden encontrar bloques de TIMERS, CCP, MSSP, USART, PSP y convertidores AD. Características | Prcierers | PrcioraTa PICI6FS76 PICIGFS7T Gama Media : Frecuen: DC20MHz | DC-20MHz DC20MEiz DEZMHZ Reset (y delays) POR,BOR POR;BOR PORBOR PORBOR (PWRTOST) | (PWRTOST) (PWRTOST) | (PWRT.OST) Memoria de Programa FLASH | dk AR BK BK (palabras de 1á-bits) Memoria Datos (bytes) 192 19z 368 368 Memoria Datos EEPROM 8 128 26 fasso = Interrupeiones 1 [14 13 14 Puertos E/S PorisA.BC | PorisABCDE | PorisABC | Ports ABC.DE Temporizadores 3 3 3 2 2 PSP E CANALES TR CANALES SCANALES TE CANALES 35 SS Ss Sis iso Figura 1. Características de la família PIC16F87X 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 55 popipteçnitas Compilador G CCS y Simulador PROTEUS para Microcontroladores PIC habilitación como entrada o salida se realiza a través del registro TRISx (TRISA: 85h, TRISB: 86h, TRISC: 87h, TRISD: 88h o 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 gestión del bus de datos se realiza a través de los registros PORTx (PORTA: 05h, PORTB: 06h, PORTC: 07h, PORTD: 08h o PORTE: 09h en el BANCO 0 de la memoria RAM). TERMINAL BUS DATOS > vo ESCRITURA DATOS ESCRITURA TRIESTADO LECTURA DATOS Figura 2. Estructura básica de un terminal También existen algunos terminales que poseen unas características 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). * Enel 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 estarán deshabilitadas, si es un O estarán habilitadas sólo en el caso de que el terminal funcione como en- trada (figura 3). 56 popipteçnitas 3. La gestión 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 led en la salida (figura 5). Componentes ISIS: PIC16F876, RES, LED-BLUE y SW-SPST-MOM. Figura 5. Elesquema del ejemplo 1 fínclude <16F876.h> ffuses XT, NOWDT duse delay ( clock = 4000000 ) // Reloj de 4 MHz ABYTE TRISB = 0x86 4) TRISB en 86h. fBYTE PORTB = 0x06 // PORTB en 06h. SBYTE OPTION REG = 0x81 // OPTION REG en 81h. void main() f bit clear (OPTION REG, 7); // Habilitación Pull-up bit set (TRISB,0); 44 BO como entrada bit clear (TRISB,1); 4) Bt como salida bit clear (PORTB,1); // Apaga el LED while (1) + if (bit test(portb,0) == 1) // Si RBO és 1, apaga el LED bit clear(portb,1); else bit set(portb,1); // Si RBO = 0, enciende el LED Figura 6. El programa del ejemplo 1 pesipiiçnatas 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 (0-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 o valor = FALSE habilita | o 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,...). Output A(OxFF); // Saca por el puerto À el valor 11111 Valor=Input B(); // Lee el valor del puerto B Set tris C(0x0F); // Configura el puerto C: CO-C3 entradas, C4-C7 salidas Existen una serie de funciones asociadas a un terminal o pin”. El parâmetro pin* se define en un fichero include (por ejemplo, 16F876.h) con un formato del tipo PIN. Xn, donde X es el puerto y n es el número de pin. fdefine PIN AQ 40 fdefine PIN Al141 Las funciones son: output low (pin*); HPinaoO. output high (pin?); WPinal. output bit (pin*, valor); /[ Pim 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 /I terminal. input(pin*); // Lee el valor del pin. Las funciones output x() e input x() dependen de la directiva tipo $USE * TO que esté activa. Directivas: “USE FAST JO (PUERTO) [PUERTO: A...] Con la función output 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. so EDIR 3. La gestión de los puertos Hay que asegurarse de que los registros TRIS están correctamente definidos. En- tonces, el ejemplo 1 quedaría : finclude <16F876.h> Ffuses XT, NOWDT fuse delay( clock = 4000000 ) tuse fast io(B) void main() ( port b pullups (TRUE); set tris B(0x01)s output Jow(PIN B1); white (1) t 4£ (input(PIN BO) == 1) output low(PIN B1); else output high(PIN B1); D) ) *USE STANDARD IO (PUERTO) [PUERTO: A...] Conla 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: finclude <16F876.h> ffuses XT, NONDT fuse delay( clock = 4000000 ) fuse standard io(B) void main() ( port b pullups (TRUE); output low(PIN B1); while (1) t 1f (input(PIN BO) == 1 ) output low(PIN 81); else output high (PIN B1); h k *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 popupteçnetas Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC main()f byte ud=0, dec=0; SET TRIS B(0x00); SET TRIS A(0x00) > OUTPUT B(O); For( ss) df for (de for (ud=Dpud<lO;ud++) T A(0x02); /U cat D = apagado, cat U = encendido B(DISPLAY[ud]); // Digito unidades sdec<10;dec++) f // Cuenta digito decenas 50); // Para evitar parpadeos 0) output a(0x03); // Si decenas = 0, // cat D = apagado else output a(0x01); // Si decenas > 0, /! cat D = 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 común; para que aparezca el digito sólo en las unidades, o sólo en las decenas, se debe apagar el otro display mediante el terminal de cátodo. 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 O está encendido). La alternancia entre los dos cátodos 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 apagará. CONST DISPLAY [10] = [0x38,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x78,0x6f) permi- te visualizar de 0 a 9 mediante la combinación de dígitos típica de los displays de 7 segmentos (figura 9). Por ejemplo, en el 0 se encienden a, b, c, d, e y f, lo que signi- fica 111111, 0x3F en hexadecimal. Figura 9. Los 7 segmentos del display 64 PELADAS 3. La gestión de los puertos 3.3 Entradas y salidas 3.3.1 LCD Se acostumbran ha utilizar LCD del tipo HD44780, con un número de líneas varia- ble y un número de caracteres por línea también variable (por ejemplo, con 2 x 16 se trabaja con dos líneas de 16 caracteres cada una) (ver figura 10). LCD con driver HD44780 1 ss (Masa) 2.- Vec (Alimentación de 2.7V a 5.5V) .- Ajuste de contraste (de O a 5.5V) S (selección de registro) JW (lectura escritura) 6.- E (enable) = 7. DO (dato LSB) 13-06 14.- D7 (dato MSB) Figura 10. El patillaje de un LCD típico El bus de datos es de 8 bits, aunque también existe la posibilidad de trabajar con 4 bits (con un menor número de caracteres). El compilador C incluye un fichero (dri- ver) que permite trabajar con un LCD. El archivo es LCD.C y debe Ilamarse como un ginclude. Este archivo dispone de varias funciones ya definidas: lcd 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 líneas 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. led 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 línea y (1,2) indica la primera posición de la segunda línea. lcd getc (byte x, byte y); Lee el carácter de la posición (x,y). popiptigneta Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC led putc (char s); S es una variable de tipo char. Esta función escribe la variable en la posición corres- pondiente. Si, además, se indica: M se limpia el LCD. mel cursor va a la posición (1,2). b el cursor retrocede una posición. El compilador de C ofrece una función más versátil 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 frame es una función. El formato es %nt, 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 Carácter. s Cadena o carácter. u Entero sin signo. d Entero con signo. Lu Entero largo sin signo. Ld Entero largo con signo. a Entero Hexadecimal (minúsculas). E Entero Hexadecimal (mayúsculas). Lx Entero largo Hexadecimal (minúsculas). LX Entero largo Hexadecimal (mayúsculas). 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 número de decimales. finclude <167876.h> ffuses XT,NOWDT fuse delay (clock= 4000000) finclude <led.c> fuse standard io(c) fuse standard io(A) enum funciones (med, cal ini); void medir (voia)( /falgorítmo correspondiente output togale(pin CO); ! void calibrar (void) ( /falgoritmo correspondiente output toggle(pin Cl); ) woid inicializar (void)( //algoritmo correspondiente output toggle (pin C2); F Roi run func(int numfunc) ( switch (numfunc) ( case med: medir ()s break; case cal: calibrar(); break; case ini: inicializar(); break; DES main) ( Ehar item; b popiptaçneto 3 la gestión de los puertos // Asigna un valor a cada elemento //'med =0, cal=1 e ini-2 // Función de medir n de calibrar /! Eunción de inicializar // Asignación de la función a realizar // viene dada por la variable “item” /! Variables de funciones PEDIA D Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC char n menus = 3; /4 Número de funciones 4) bit set(TRISA,0); led init()s while (1) f i£ (input (PIN AO) f // Detecta botón de selección item++; // St pulsa aumenta la variable delay ms (300); // Rara evitar rebotes lcd pute( NE); / if (item > (nmenus-l)) ( // Si la variable supera el item = 0; ) 4) f£unciones la inicializa switch (item) ( case 0: lcd gotoxy (1,1); printf(led pute, “MEDIR"); led gotoxy(1,1); break; case 1: printé(lcd puto, “CALIBRAR*) ; led gotoxy(1 break; case 2: printf(lcd pute, “INICIALIZAR"); lcd gotoxy(1,1) 7 break; ción.., /! Si se pulsa el botón de sel | (input (PIN A (delay ms(200); run func(item);) 4/ se llama a la función correspondiente Figura 14. El programa del ejemplo 3 3.3.2 LCD gráfico Se puede utilizar un LCD gráfico 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 PEDIA 3. La gestión de los puertos Figura 15. LCD gráfico con controladora KS0 108 La distribución de patillas es la siguiente: VSS: masa. VDD: alimentación. Vo: tensión de contraste. D/I: entrada de datos/entrada de códigos de instrucción. R/W: 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 gráficos, el GLCD.C, GRAPHICS.C o, el más específico, HDM64GS12.C. La conexión definida en estos ficheros es la siguiente: P// 0 LOLA LLC LCA ALA ee A ECA AA AEE mu ur 1H LCD Pin connections: mt 1H (These can be changed as needed in the following defines). ll! HI VSS is connected to GND Hu Hi! VDD is connected to +5V uu HH! VO - LCD operating voltage (Constrast adjustment) uu HH DII - Data or Instruction is connected to B2 un di RIW - Read or Write is connected to B4 tu. Hit! Enable is connected to B5 Hu HH Data Bus O to 7 is connected to port d um n Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC popipteçnetas gled text57(97, 30,AL, 1, 1) gled text57(113, 30,40, 1, 1); glcd text57(30,5,1N, 2, 1); while(1)f 74 1£ (input state(PIN A5)==0) glcd rect(32,40,46,60,1,1); else glcd rect(32,40,46,60,1,0); gicd rect(32,40,46,60,0,1); if (input state(PIN A4)==0) glcd rect (48,40,62,60,1,1)4 else glcd rect(48,40,62,60,1,0): glcd rect (48,40,62,60,0,1); if (input state(PIN A3)==0) glcd rect (64,40,78,60,1,1); else glcd rect (64,40,78,60,1,0); glcd rect (64,40,78,60,0,1); if (input state(PIN A2)==0) gled rect (80,40,94,60,1,1); else gled rect (80,40,94,60,1,0) é glcd rect(80,40,94,60,0,1); if (input state(PIN Al)==0) glcd rect (96,40,110,60,1,1)+ else glcd rect (96,40,110,60,1,0); gled rect (96,40,110,60,0,1); if (input state(PIN A0)==0) glcd rect(112,40,126,60,1,1); else gicd rect(112,40,126,60,1,0): glcd rect(112,40,126,60,0,1); delay ms (400); 4 Figura 17. El programa correspondiente al ejemplo 4 pontaria 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 utilizan los teclados matriciales de 1x4, 3x4 0 4x4 (ver figura 18). Ra o À 9 * = 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 getc() Devuelve el valor de la tecla pulsada en función de la tabla que tiene programada (ver figura 19). 4! Reypad layout: char const KEYS[4][3] = 4€1',' eu Figura 19, La definición de teclas en el archivo KBD.C A través de la modificación de esta tabla podemos adecuar el resultado del progra- ma a las distintas carátulas del teclado. Elarchivo KBD.C está pensado para trabajar con el PORTB o el PORTD (ver figura 20). Activando o no la línea fdefine use portb lcd TRUE podemos seleccionar el PORTB (ver figura 21). 7 popiptaneta Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC TIT deFim or Eb Kbd nnyto/kbd = kbd = 8 wit defined use portb kbd nderine set tris kbd(yj set tris b(x) Relse uderine set tris kbd(h) set tris d(x) Hendif Figura 20. La configuración de puertos Figura 21. La selección del PORTB Las conexiones vienen dadas en el fichero pero se pueden modificar: Tderine COLO (1 define COLA (1 << 6) udefine COL2 (1 << 7) derine ROWO (1 << 1) define ROW (1 << 2) naerine ROW2 (1 << 3) ldefine Figura 22. La asignación de patillas 76 3. La gestión de los puertos 385 cão ungosas Figura 26. El esquema del ejemplo 6 finclude <16F876.h> ffuses XT,NOWDT, NOPROTECT, NOLVP fuse delay (clock= 4000000) fuse standard io(a) Hinclude <lcd.c> finclude <kbd.c> finclude <stdlib.h> from 0x2100=[7",'2t,"3") // Posición 0,1 y 2 de la Eeprom con los datos... 4 TZ, Y 3 respectivamente void main() f char k; int iz char data[3), clave[3]; // Matrices para guardar clave y datos led init()s kbd init()s port b pullups (TRUE) ; while (TRUE) ( i=0; // posición de la matriz printf(lcd putc,”lfpulsar tecla 1ln”); // Para primer dato while (ix=2) ( 4! Para tres datos k=kbd getc(); // Lee el teclado 79 popiptagneto DIA Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC 1£ (k!=0) /f SY se ha pulsado alguna tecla (data [i]=k // se guarda en la posición correspondiente i++; // de la matriz printf(lcd pute,”Vpulsar tecla tuln”,i+1); »// Siguiente dato / for (i=Dzi<: IH) df // Basa datos de eeprom a la matriz clave clave[i] ((datalo. f printé(Jed pote,” fem ead eeprom(i);] lave[0])&4 (data [1]==clave[1]) s&(dat. 2]==clave[2])) Abierta”); // Compara los datos y la clave output bigh(PIN AO); (4 Si es igual da pulso al relé delay ms (500); output low(PIN AO) else printf(lcd putc, “VíPuerta Cerrada”); // Clave erronea delay ms(1000) ; 3 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 senial modulada en ancho de pulso proporcional al dato de la velocidad (figura 28). Se dispone de los siguientes componentes ISIS: PICI8F876, KEYPAD-PHONE, RES, 25K1058, CELL y MOTOR. Ea 3 t aa = Em = DECGEGEE PARE: FERE Figura 28. El esquema del ejemplo 7 3. La gestión de los puertos Se genera una serial modulada en ancho de pulso PWM (sin utilizar el modulo CCP de los PIC) donde el semiperiodo de sefial a nivel alto está 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 máximo del registro es 255, este debe coincidir con el valor máximo del teclado, es decir 9; por lo tanto, la relación entre el valor del teclado y el semiperiodo PWMH será: PWMHe= (255/9) x Tecla, aproximadamente PWMH=28*Tecla. Figura 29. La modulación PWM Según dicha ecuación cuando el valor de teclado sea O la salida será O de forma continua y el motor estará parado. Cuando el valor de teclado sea 9, el semiperiodo PWMH será de 252 (no llega a 255) y el motor estará casi a toda marcha. El semipe- riodo a nivel bajo PWML se obtiene de restar el PWMH a 255. finclude <16£876.h> ffuses XT,NOWDT, NOPROTECT, NOLVP. fUSE DELAY (CLOCK=4000000) FINCLUDE <kbd.c> AUSE STANDARD TO (a) VOID MAIN() f CHAR k,kant="0"; 4) X valor de teclado, k valor anterior de teclado char PhMH=D,PWML=0; // Semiperiodo alto y bajo kbd init()s PORT B PULLUPS (TRUE) > WHILE (1) f /! Bucle infinito (siempre consulta el teclado) k=kbd gete() 4) lee en ASCII el valor de ia tecla pulsada 2F (k=="V0") k=kant; // Si no se pulsa tecla (VD) se usa 41 el valor anterior df ((k=="82) |] (k=="[")) k=t0" 7 // Si se pulsa * o f se asigna /! un valor cero. 81 RDI ESA Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC posición de memoria del programa principal desde la que saltó al producirse la interrupción. Las fuentes de interrupción dependen del PIC utilizado. Por ejemplo, el PIC16F84 tiene 4 fuentes de interrupción y la familia PIC16F87X tiene entre 13 y 14. Los PIC de gama baja y media tienen un único vector de interrupción situado en la dirección 04h de programa (figura 1), mientras que los de gama alta 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. pe<t20> CALL, RETURN RETPIERETLW, NiveltdolaPila | Nivel2dolaPila | 8 Vector de Reset Oooh Vector de Interrupción | o004h 0005h Pagina O o7FFh osooh Pagina 1 | | orFFh 4000h Pagina 2 A7FFh APFEh Pagina 3 Figura 1. Memoria de programa fposición del vector de interrupción) Al poseer un único vector de interrupción (dos en la gama alta), el PIC posee unos registros de control donde mediante la utilización de banderas, o flags, el usuario puede determinar que es lo que ha producido la interrupción; además, en estos registros, se pueden habilitar o no las distintas fuentes de interrupción (máscaras 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 están, 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 más adecuada. 8 | Powatronica ça 4. Las interrupciones y los temporizadores La familia PIC16F87X 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 delos 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 gestión de las interrupciones: PIR1, PIR2, PIEI 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 enla pila y el contador de programa se carga con la dirección 0004h. Una vez en la rutina de atención a la interrupción 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 interrupción para evitar reentradas erróneas. Registro ITCON (dirección RAM: 0Bh/8Bh/10Bh/18Bhj) [PIC16F87x] RW-O RIWO RIWO RIWO RWO RWO RWO RW ce [Pee [Toc [inte [re [tor [inte [Re Bit7 Bito Figura 2. Registro INTCON bit7: —GIE: Bit de habilitación global de las interrupciones. 1 = Habilita todas las interrupciones no enmascararbles. 0=Las deshabilita. bitó: | PEIE: 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 interrupción 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. bit3: —RBIE: Bit de habilitación de la interrupción por cambio en el PORTEB. 1 = Habilita la interrupción del PORTB. 0=La deshabilita. EDIR 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). O= El registro del TMRO no se ha desbordado. bitl: INTE: Bit de flag de la interrupción del RBO/INT. 1=Se ha producido una interrupción externa por RBO/INT (debe borrarse por software). 0=No se ha producido la interrupción. bitO: 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 (dirección RAM: 8Ch) [PIC16F87x] RIWO RIWO RIWO RIWO RIWO RWO RIWO RW [pspE [Ave [Rree [Txe [sspiE [ccrrE | TMRZE | TMRIE Bit? Bito Figura 3. Registro PIE1 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. bitó: | ADIE: Bit de habilitación de interrupción por conversión A/D. 1= Habilita la interrupción. 0=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: | TXIE: Bit de habilitación de interrupción por transmisión del USART. 1 = Habilita la interrupción. 0=La deshabilita. popiptegnetas 4. Las interrupciones y los temporizadores Interrupciones Descripción FINT COMP2 Comparador 2. INT CR Encriptación finalizada. *INT EEPROM Escritura EEPROM finalizada. INT EXT Interrupción externa (RB0). INT EXTI Interrupción externa £1. HINT EXT2 Interrupción externa $2, “INT EXT3 Interrupción externa 23. &INT RC Interrupeión I2€ (14000). FINT ICI Entrada captura £1. INT IC2 Entrada captura 42. HINT IC3 Entrada captura £3. HINT LCD Actividad LCD FINT LOWVOLT | Detectado bajo voltaje. *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 AO-AS5. INT RB Cambio de estado en B4-B7. &INT RC Cambio de estado en C4-C7. INT RDA R$232 dato recibido. FINT RDAO R$232 dato recibido en buffer O. INT RDAI R$232 dato recibido en buffer 1. INT RDA2Z R$232 dato recibido en buffer 2. FINT RTCC Desbordamiento del Timer O (RTCO). *INT PSP Escritura/lectura del puerto paralelo. | dowatronica | [Lita 4. Las interrupciones y los temporizadores Interrupciones Descripción INT COMP2 Comparador 2. 4INT CR Encriptación finalizada. *INT EEPROM Escritura EEPROM finalizada. 4INT EXT Interrupción externa (RB0). *INT EXTI Interrupción externa £1. *INT EXT2Z Interrupción externa $2. HINT EXT3 Interrupción externa £3. &INT 12C Interrupción 12€ (14000). *INT IC1 Entrada captura £1. INT IC2 Entrada captura £2. HINT 1C3 Entrada captura 43. “INT LCD Actividad LCD tINT LOWVOLT | Detectado bajo voltaje. &INT LVD Detectado bajo voltaje. sINT OSC FAIL | Fallo en oscilador. &INT OSCF Fallo en oscilador. INT PSP Dato de entrada en puerto paralelo. “INT PWMTB Base de tiempo PWM. | FINT.RA Cambio de estado en AQ-AS. INT RB Cambio de estado en B4-B7. INT RC Cambio de estado en C4-C7. INT RDA R$S232 dato recibido. INT. RDAO R$232 dato recibido en bugfer O. INT RDAI R$232 dato recibido en buffer 1. FINT RDA2Z R$232 dato recibido en buffer 2. sINT RTCC Desbordamiento del Timer O (RTCC). HINT PSP Escritura/lectura del puerto paralelo. LOUDUAUE Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC Interrupciones Descripción *INT SSP Actividad en SPI o 12€. sINT SSP2 Actividad en SPI o 12C Port 2. *INT TBE R$232 buffer de transmisión vacio. *INT TBEO R$232 buffer O de transmisión vacio. *INT TBE1 R$232 buffer 1 de transmisión vacio. INT TBEZ R$232 buffer 2 de transmisión vacio. INT TIMERO Desbordamiento del Timer O (RTCC). *INT TIMER1 Desbordamiento del Timer 1. “INT TIMERZ Desbordamiento del Timer 2. INT TIMER3 Desbordamiento del Timer 3. INT TIMER4 Desbordamiento del Timer 4. INT TIMERS Desbordamiento del Timer 5. sINT USB Actividad en el USB. Existe una directiva fINT. DEFAULT que implica que se utilizará la función que le acompania si se activa una interrupción y ninguno de los flags está activo. La directiva INT. GLOBAL implica que la función sustituye todas las acciones que inserta el compilador al aceptarse una interrupción. 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 código 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 borrará 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 máscaras correspondientes, afectando a los registros ITCON, PIE1 y PIEZ2. En el PIC16F876, los “niveles” permitidos son:
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved