María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Índice general Título Tít ulo
__Págin __P áginaa
INTRODUC INTRODUCCIÓN………………… CIÓN…………………………………………………………………………..5 ………………………………………………………..5 MEMORIA………………………………………………………………………………….8 Capítulo 1: Microcontroladores: Características y aplicaciones generales…………….. 9
1.1. Definición………………………………………………………………………9 Definición………………………………………………………………………9 1.2. Recursos comunes a todos los microcontroladores…………………………….9 1.2.1. Arquitectura básica....………………………………………………...9 1.2.2. Procesador CPU………………………………………………………9 1.2.3. Memoria……………………………………………………………..10 1.2.4. Puertas de Entrada y Salida....………………………………………12 1.2.5. Reloj Principal………………………………………………………12 1.3. Recursos especiales…………………………………………………………...12 1.4. Lenguajes de programación…………………………………………………...13 1.5. Fabricantes Fabricantes…………………………………………………………………….14 …………………………………………………………………….14 1.6. Aplicaciones…………………………………………………………………..14 Capítulo 2: Microcontroladores PIC………………………………………………………… 15
2.1. Características relevantes……………………………………………………..15 2.2. Las gamas PIC………………………………………………………………...17 2.2.1. Gama baja…………………………………………………………...17 2.2.2. Gama media…………………………………………………………18 2.2.3. Gama alta y gama mejorada………………………………………...18 2.3. 16F87X: características generales…………………………………………….19 2.3.1. Organización de la memoria………………………………………...19 2.3.1.1. Memoria de programa……………………………………..19 2.3.1.2. Direccionamiento y paginado……………………………..19 2.3.2. Banco de registros y memoria de datos……………………………..20 2.3.2.1. Direccionamiento de datos………………………………...21 2.3.3. Registros con funciones especiales………………………………….21 2.3.3.1. Registro de estado…………………………………………22 2.3.3.2. Registro de opciones………………………………………22 2.3.3.3. Registro de interrupciones………………………………...23 2.3.3.4. Otros registros especiales………………………………….24 2.3.4. Palabra de configuración e identificación…………………………...25 2.4. Recursos comunes e interrupciones en los 16F87X…………………………..26 2.4.1. Diagramas de conexionado………………………………………….26 2.4.2. Recursos comunes…………………………………………………..28 2.4.2.1. Oscilador principal………………………………………...28 2.4.2.2. Perro guardián WDT………………………………………29 1
María Aranda Elcuaz
Título Tít ulo
Universidad Universid ad Pública de Navarra
__Págin __P áginaa
2.4.2.3. Temporizador TMR0……………………………………...29 2.4.2.4. 2.4.2.4. Reset………………………………………………………30 Reset………………………………………………………30 2.4.2.5. Modo de reposo Sleep…………………………………….31 2.4.3. Interrupciones……………………………………………………….31 2.5. Periféricos…………………………………………………………………… Periféricos……………………………………………………………………..33 ..33 2.5.1. Puertas de Entrada y salida………………………………………….33 2.5.2. Conversor Analógico Digital………………………………………..34 2.5.3. Temporizador TMR1………………………………………………..37 2.5.4. Temporizador TMR2………………………………………………..38 2.5.5. Módulos de captura/comparación/modulación de anchura de pulsos…………………………………………………………..39 2.5.5.1 Modo de captura…………………………………………...39 2.5.5.2 Modo de comparación……………………………………...40 2.5.5.3 Modulación por anchura de pulsos (PWM)………………..40 2.5.6. Puerta serie síncrona (SSP)………………………………………….41 2.5.6.1 Modo SPI…………………………………………………..41 2.5.6.2 Modo I2C…………………………………………………..42 2.5.7. Interfaz de comunicaciones serie (USART-SCI)…………………...43 2.5.8. Lectura y escritura de la memoria de datos EEPROM……………...46 2.5.8.1. Lectura de la memoria de datos…………………………...47 2.5.8.2. Escritura de la memoria de datos………………………….47 2.6 Repertorio de instrucciones de la gama media………………………………...47 Capítulo 3: Herramientas de trabajo………………………………………………………… 53
3.1. Placa de pruebas PICDEM 2 PLUS…………………………………………..53 3.2. Software de programación……………………………………………………54 3.2.1. Cómo usar MPLAB…………………………………………………55 3.2.1.1. Creación de proyectos…………………………………….55 3.2.1.2. Compilación del programa………………………………..56 3.2.1.3. Programación……………………………………………...57 3.3. Lenguaje Lenguaje C…………………………………………………………………….58 3.3.1. Operadores y expresiones…………………………………………...58 3.3.2. Directivas del pre-procesador…...…………………………………..59 3.3.2.1. Control de memoria……………………………………….59 3.3.2.2. Directivas del C estándar………………………………….60 3.3.2.3. Especificación de dispositivos…………………………….60 3.3.2.4. Librerías incorporadas…………………………………….60 3.3.3. Funciones……………………………………………………………62 3.3.3.1. Funciones de I/O serie RS232……………………………..62 3.3.3.2. Funciones de I/O discreta………………………………….63 3.3.3.3. Funciones de retardos……………………………………..64 3.3.3.4. Funciones de control de procesador……………………….65 3.3.3.5. Contadores/Temporizadores………………………………65 3.3.3.6. Funciones de entrada A/D…………………………………66 3.3.3.7. Funciones CCP…………………………………………….66 3.3.3.8. Funciones para el manejo de la Eeprom interna…………..67 3.3.4. Definición de datos………………………………………………….67 2
María Aranda Elcuaz
Título Tít ulo
Universidad Universid ad Pública de Navarra
__Págin __P áginaa 3.3.5. Definición de una función…………………………………………..68 3.3.6. Estructura de un programa en C…………………………………….68
Capítulo Capítulo 4: Prácticas…………………………………………………………………………. Prácticas…………………………………………………………………………... ..70
4.1. Entradas digitales……………………………………………………………...70 4.1.1. Control de tiempos: Parpadeo de un led…………………………….70 4.1.1.1. Organigrama………………………………………………70 4.1.1.2. Solución en ensamblador………………………………….70 4.1.1.3. Solución en C……………………………………………...72 4.1.2. Encendido de un led a través de un pulsador……………………….73 4.1.2.1. Organigrama………………………………………………73 4.1.2.2. Solución en ensamblador………………………………….73 4.1.2.3. Solución en C……………………………………………...74 4.2. LCD y Memoria Eeprom……………………………………………………...76 4.2.1. Envío de mensajes al LCD………………………………………….76 4.2.1.1. Organigrama………………………………………………76 4.2.1.2. Solución…………………………………………………...77 4.2.2. Programación de la Eeprom………………………………………...78 4.2.2.1. Organigrama………………………………………………79 4.2.2.2. Solución…………………………………………………...80 4.3. Entradas Analógicas: Potenciómetro…………………………………………82 4.3.1. Organigrama………………………………………………………...82 4.3.2. 4.3.2. Solución…………………………………………………………….. Solución……………………………………………………………..83 83 4.4. PWM………………………………………………………………………….85 PWM………………………………………………………………………….85 4.4.1. Primer acercamiento al PWM………………………………………85 4.4.1.1. Organigrama………………………………………………86 4.4.1.2. Solución…………………………………………………...86 4.4.2. PWM con entradas analógicas……………………………………...87 4.4.2.1. Organigrama………………………………………………87 4.4.2.2. Solución…………………………………………………...88 4.5. Comunicación Serie PIC-PC…………………………………………………90 4.5.1. Un ejemplo sencillo…………………………………………………91 4.5.1.1. Organigrama………………………………………………91 4.5.1.2. Solución…………………………………………………...92 4.5.2. PWM a distancia. Versión 1………………………………………...93 4.5.2.1. Organigrama………………………………………………94 4.5.2.2. Solución…………………………………………………...94 4.5.3. PWM a distancia. Versión 2………………………………………...97 4.5.3.1. Organigrama………………………………………………97 4.5.3.2. Solución…………………………………………………...98 Capítulo 5: Comunicaciones CAN………………………………………………………….. 101
5.1. Introducción Introducción………………………………………………………………….10 ………………………………………………………………….1011 5.1.1. El CAN y su historia……………………………………………….101 5.1.2. Aplicaciones……………………………………………………….101 5.2. Características del bus CAN…………………………………………………102 3
María Aranda Elcuaz
Título Tít ulo
Universidad Universid ad Pública de Navarra
__Págin __P áginaa
5.3. Arquitectura de capas………………………………………………………..102 5.3.1. Capa física…………………………………………………………103 5.3.2. Capa de enlace de datos……………………………………………104 5.4. Mensajes y tipos de tramas…………………………………………………..104 5.4.1. Trama de datos……………………………………………………..105 5.4.2. Trama remota………………………………………………………106 5.4.3. Trama de error……………………………………………………..107 5.4.4. Espacio entre tramas……………………………………………….108 5.4.5. Trama de sobrecarga……………………………………………….108 5.5. Acceso múltiple y arbitraje de acceso al bus………………………………...109 5.6. Especificaciones……………………………………………………………..110 5.7. Protocolos CAN de alto nivel………………………………………………..110 5.8. Implementación de microcontroladores CAN……………………………….110 5.8.1. Stand-Alone CAN Controller……………………………………...111 5.8.2. Integrated CAN Controller………………………………………...111 5.8.3. Single-Chip CAN Node....................................................................112 ANEXOS…………………………………………………………………………………113 Anexo 1: Librerías Librerías C…………………………………………………………………….. C……………………………………………………………………..114
1.1. LCD………………………………………………………………….114 LCD………………………………………………………………….114 1.2. PIC 16F877…………………………………………………………..118 Anexo 2: Modulación Modulación PWM…………………………………………………………….. PWM……………………………………………………………..122 Anexo 3: Presentación Presentación comunicacione comunicacioness CAN………...……………………………… CAN………...………………………………127
BIBLIOGR BIBLIOGRAFÍA………………………………………………………………… AFÍA…………………………………………………………………………141 ………141
4
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
INTRODUCCIÓN
5
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Introducción La energía eólica es la energía renovable más competitiva dentro del mercado energético y España es un país puntero, puesto que es el 2º fabricante mundial y el 3º en potencia instalada (6202 MW en 2003). Además Navarra fue la comunidad pionera en España y hasta 2001 la 1ª comunidad en potencia instalada. Hoy en día, todavía se puede decir que el sector de la energía eólica es relativamente nuevo, aún con ciertas incógnitas en sus equipos, rendimientos, etc. En consecuencia, el empleo de los sistemas de monitorización suponen una herramienta imprescindible para poder poder conocer conocer las evoluc evoluciones iones reales reales de las las distintas distintas magnitud magnitudes es físicas físicas y así dar dar fiabilidad fiabilidad al funcionamiento general de los aerogeneradores. Son de aplicación para estas tareas cualquier elemento comercial de medida como registradores, osciloscopios, sensores programables, etc. Sin embargo, por las características especiales de trabajo, es decir, a gran altura, en movimiento, etc, resulta muchas veces interesante disponer de potentes herramientas de medida y análisis de reducido tamaño y robustez. La empr empreesa INGE INGET TUR, UR, fabr fabric ican ante te de turb turbin inas as de gran gran pote potenc ncia ia,, soli solici citó tó a su departamento de investigación y desarrollo el diseño de una herramienta portátil de pequeñas dime dimens nsion iones es y senc sencill illoo mane manejo jo para para la monit monitor oriz izac ación ión de magn magnitu itude dess física físicass en los los aerogeneradores. Dicha herramienta debía ser configurable y debía permitir la conexión directa al bus CAN de comunicaciones, con el que trabajan estas máquinas, para así poder real realiz izar ar un segu seguimi imien ento to de las las magn magnitu itude dess físic físicas as tale taless como como presio presione ness hidr hidráu áulic licas as,, temperaturas, posiciones de elementos, etc. Con todas estas premisas de desarrollo y configuración se llegó a la conclusión de que la mejor forma de implementar este dispositivo era hacerlo mediante microcontroladores, puesto puesto que son dispositivos dispositivos programab programables les caracterizad caracterizados os principalme principalmente nte por su reducido reducido tamaño, sencillez de programación y gran diversidad de aplicaciones de control de sistemas. Para realizar este dispositivo es necesario seguir una serie de pautas o fases que se detallan a continuación. microcontroladores. dores. En esta etapa La primera fase comprende un e studio general de los microcontrola se definen con detalle todas las características fundamentales y sus aplicaciones principales, así así como como los los leng lengua uaje jess de prog progra rama maci ción ón de los los mism mismos os.. Todo Todo ello ello para para tene tenerr un conocimiento exhaustivo de los microcontroladores en general y de los microcontroladores PIC de la casa MICROCHIP en particular, centrando el estudio en una familia de gama media muy comercial en estos días.
Otro Otro de los obje objetiv tivos os de este este traba trabajo jo era era la de reco recoge gerr en un docu docume mento nto aque aquella lla información necesaria y suficiente que permita una introducción cómoda en el entorno de los microcontroladores PIC. Para ello, se ha estructurado la memoria de este proyecto en tres capítulos teóricos y un cuarto capítulo con ejercicios prácticos. El estudio teórico recoge toda la información práctica asociada a los fundamentos del hardware y del software, mientras que los ejercicios prácticos tienen la función de simplificar el proceso de aprendizaje de la programac programación ión en entorno C. C. Además, Además, tal como se han quedado quedado finalmente finalmente dichos dichos ejercicios, ejercicios, 6
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
podrían podrían servir de base para futuras futuras prácticas prácticas de cursos cursos específicos específicos de empresa empresa o universitarios. Los primeros capítulos de la memoria están dedicados a los fundamentos teóricos de los microcontroladores, tal y como se comenta en el párrafo anterior. El primer capítulo describe de manera general los microcontroladores hablando de sus recursos comunes, aplicaciones y fabricantes. El segundo capítulo está dedicado a la gama media de los microcontroladores PIC, especialmente a la familia 16F87X. Aquí se hace un estudio detallado de todos sus recursos y aplicaciones, la organización de la memoria, sus periféricos, etc. Finalmente, en el tercer capítulo se describen las herramientas necesarias para llevar acabo la programación de los PICS. Se describe la placa de pruebas que se empleará en el capítulo de prácticas, el software necesario para su programación de manera práctica y finalmente se realiza un resumen de las directivas empleadas por el compilador CCS que trabaja en lenguaje C. El cuarto, y último capítulo dedicado a los microcontroladores desarrolla un total de seis prácticas prácticas que parten desde un nivel cero con el trabajo trabajo con entradas entradas y salidas salidas digitales, digitales, pasando pasando por el manejo de la memoria EEPROM EEPROM y la pantalla LCD, LCD, las entradas analógica analógicas, s, la modulación por anchura de pulsos (PWM) y finalmente las comunicaciones de estos microcontroladores vía serie (RS232). La segunda fase comprende un estudio del bus CAN y sus aplicaciones. En esta etapa se describe el funcionamiento de la red CAN para después poder realizar pruebas en este tipo de red con microcontroladores. La memoria de este proyecto dedica un capítulo a este estudio, preparando además una presentación presentación en PowerPoint PowerPoint que servirá para pode poderr ofrecer ofrecer un curso interno en la empresa empresa con el objetivo de que sus empleados conozcan los detalles que entraña este tipo de comunicaciones. En este capítulo se describen las características fundamentales de este tipo de comunicaciones, se habla de su estructura interna, los tipos de tramas que se envían, espe especi cifi fica caci cion ones es y prot protoc ocol olos os CAN. CAN. Asim Asimis ismo mo term termin inaa hac haciend iendoo refe refere renc ncia ia a la implementación CAN en los microcontroladores. La principal línea de continuación en proyectos futuros es la preparación de software específico de comunicación CAN. A partir de este software se podrá finalizar el desarrollo del dispositivo monitor que dio origen al presente proyecto final de carrera. Además de todo lo comentado anteriormente, en este proyecto se añaden al final del mismo una serie de anexos. El primero vendrá relacionado con la programación de los dispositivos, exponiendo dos librerías empleadas por el compilador. Seguidamente, se añade un capítulo que describe los principios de modulación por anchura de pulsos y finalmente, un capítulo dedicado a las comunicaciones en red CAN. Se trata de una presentación en PowerPoint que describe los principios básicos de este tipo de bus.
7
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
MEMORIA
8
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Capítulo 1. Microcontroladores: Características y aplicaciones generales Definición Definición
Recibe el nombre de controlador el dispositivo que se emplea para el gobierno de uno o varios procesos. Por ejemplo, el controlador que regula el funcionamiento de un horno dispone de un sensor que mide constantemente su temperatura interna y, cuando traspasa los límites prefijados, genera las señales adecuadas que accionan los actuadores que intentan llevar el valor de la temperatura dentro del rango estipulado. Aunque el concepto de controlador ha permanecido invariable a través del tiempo, su implementación física ha variado frecuentemente. Hace tres décadas, los controladores se construían exclusivamente con componentes de lógica discreta, posteriormente se emplearon los microprocesadores, que se rodeaban con chips de memoria y E/S sobre una tarjeta de circuito impreso. En la actualidad, todos los elementos del controlador se han podido incluir en un chip, el cual recibe el nombre de microcontrolador. Realmente consiste en un sencillo pero completo completo computa computador dor contenid contenidoo en el el corazón corazón (chip) (chip) de un circuito circuito integrado. integrado. 1.2 Recursos comunes a todos los microcontroladores
Al estar todos los microcontroladores integrados en un chip, su estructura fundamental y sus características son muy parecidas. Todos deben disponer de los bloques esenciales: procesador procesador,, memoria de de datos e instrucc instrucciones iones,, líneas de entrada entrada y salida, salida, oscilador oscilador de reloj reloj y módulos controladores de periféricos. Sin embargo, cada fabricante intenta enfatizar los recursos idóneos para las aplicaciones a las que se destintan preferentemente.
1.2.1 Arquitectura básica Aunque inicialmente todos los microcontroladores adoptaron la arquitectura clásica de Von Neumann, en el momento presente se impone la arquitectura Harvard . La arquitectura de Von Neumann se caracteriza por disponer de una sola memoria principal principal donde se almacena almacenann datos e instrucciones instrucciones de forma indistinta. indistinta. A dicha memoria memoria se accede a través de un sistema de buses único (direcciones, datos y control). La arquitectura Harvard dispone de dos memorias independientes: una, que contiene sólo instrucciones y otra, sólo datos. Ambas disponen de sus respectivos sistemas de buses de acceso y es posible realizar operaciones de acceso (lectura o escritura) simultáneamente en ambas memorias
1.2.2 Procesador Es el elem elemen ento to más más import importan ante te del del micr microc ocon ontro trola lado dorr y dete determ rmina ina sus sus princ princip ipal ales es características, tanto a nivel hardware como a nivel de software. Se encarga de direccionar la memoria de instrucciones, recibir el código OP de la instrucción en curso, su decodificación 9
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
y la ejecución de la operación que implica la instrucción, así como la búsqueda de los operandos y el almacenamiento del resultado. Existen tres orientaciones en cuanto a la arquitectura y funcionalidad de los procesadores actuales:
CISC: Co Comp mput utad adore oress de Jueg Juegoo de Instr Instruc uccio cione ness Co Comp mple lejo: jo: Disp Dispon onen en de más más de 80 instruc instruccio ciones nes máqui máquina na en su repert repertorio orio,, alguna algunass de las cuales cuales son son muy sofistica sofisticadas das y potentes, potentes, requirien requiriendo do muchos muchos ciclos para su su ejecución ejecución.. RISC: Tanto nto la ind industria ria de los computad tadores res comerciale ialess como la de los microcontroladores están decantándose hacia la filosofía RISC (Computadores de Juego de Instrucciones Reducido). En estos procesadores el repertorio de instrucciones máquina es muy reducido y las instrucciones son simples y, generalmente, se ejecutan en un ciclo. La sencillez y rapidez de las instrucciones permiten optimizar el hardware y el software del procesador procesador.. SISC: En los microcontroladores destinados a aplicaciones muy concretas, el juego de instrucciones, además de ser reducido, es “específico”, o sea, las instrucciones se adaptan a las necesidades de la aplicación prevista. Esta filosofía se ha bautizado con el nombre de SISC (Computadores de Juego de Instrucciones Específico).
1.2.3 Memoria En los microcontroladores la memoria de instrucciones y datos está integrada en el propio chip. Una parte debe ser no volátil, tipo ROM, y se destina a contener el programa de instrucciones que gobierna la aplicación. Otra parte de memoria será tipo RAM, volátil, y se destina a guardar las variables y los datos. La RAM en estos dispositivos es de poca capacidad pues sólo debe contener las variables y los cambios de información que se produzcan en el transcurso del programa. Por otra parte, como sólo existe un programa activo, no se requiere guardar una copia del mismo en la RAM pues se ejecuta directamente desde la ROM. Según el tipo de memoria ROM que dispongan los microcontroladores, la aplicación y utilización de los mismos es diferente. Se describen las cinco versiones de memoria no volátil que se pueden encontrar en los microcontroladores del mercado.
1º. ROM con máscara Es una memoria no volátil de sólo lectura cuyo contenido se graba durante la fabricación del chip. El elevado coste del diseño de la máscara sólo hace aconsejable el empleo de los microcontroladores con este tipo de memoria cuando se precisan cantidades superiores a varios miles de unidades.
2ª. OTP El microcontrolador contiene una memoria no volátil de sólo lectura “programable una sola vez” por el usuario. OTP (One Time Programmable). La versión OTP es recomendable cuando es muy corto el ciclo de diseño del producto, o bien, en la construcció construcciónn de prototipo prototiposs y series series muy muy pequeñas pequeñas.. 10
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
3ª EPROM Los microcontroladores que disponen de memoria EPROM (Erasable Programmable Read OnIy Memory) pueden borrarse y grabarse muchas veces. La grabación se realiza, como en el caso de los OTP, con un grabador gobernado desde un PC. Si, posteriormente, se desea borrar el contenido, disponen de una ventana de cristal en su superficie por la que se somete a la EPROM a rayos ultravioleta durante varios minutos. Las cápsulas son de material cerámico y son más caros que los microcontroladores con memoria OTP que están hechos con material plástico.
4ª EEPROM Se trata de memorias de sólo lectura, programables y borrables eléctricamente EEPROM (Electrical Erasable Programmable Read OnIy Memory). Tanto la programación como el borrado, borrado, se realizan realizan eléctric eléctricament amentee desde desde el propio propio grabador grabador y bajo bajo el control control programad programadoo de un PC. Es muy cómoda y rápida la operación de grabado y la de borrado. Los microcontroladores dotados de memoria EEPROM una vez instalados en el circuito, pueden pueden grabarse y borrarse borrarse cuantas veces se quiera quiera sin ser retirados de dicho circuito. circuito. Para ello se usan “grabadores en circuito” que confieren una gran flexibilidad y rapidez a la hora de realizar modificaciones en el programa de trabajo. Se va extendiendo en los fabricantes la tendencia de incluir una pequeña zona de memoria EEPROM en los circuitos programables para guardar y modificar cómodamente una serie de parámetros parámetros que adec adecuan uan el el dispositivo dispositivo a las condic condiciones iones del entorno. entorno.
5ª FLASH Se trata de una memoria no volátil, de bajo consumo, que se puede escribir y borrar. Funciona como una ROM y una RAM pero consume menos y es más pequeña. A diferencia de la ROM, la memoria FLASH es programable en el circuito. Es más rápida y de mayor densidad que la EEPROM. La alternativa FLASH está recomendada frente a la EEPROM cuando se precisa gran canti cantida dadd de memo memoria ria de progr program amaa no volá volátil til.. Es más más velo velozz y tole tolera ra más más ciclo cicloss de escritura/borrado. Las memorias EEPROM y FLASH son muy útiles al permitir que los microcontroladores que las incorporan puedan ser reprogramados “en circuito”, es decir, sin tener que sacar el circuito circuito integrado de la tarjeta. Así, un dispositivo con este tipo de memoria incorporado incorporado al control del motor de un automóvil permite que pueda modificarse el programa durante la rutina de mantenimiento periódico, compensando los desgastes y otros factores tales como la compresión, la instalación de nuevas piezas, etc. La reprogramación del microcontrolador puede puede convertirs convertirsee en una una labor labor rutinaria rutinaria dentro dentro de de la puesta puesta a punto. punto.
1.2.4 Puertas de Entrada y Salida
11
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
La principal utilidad de las patitas que posee la cápsula que contiene un microcontrolador es soportar las líneas de E/S que comunican al computador interno con los periféricos exteriores.
1.2.5 Reloj principal Todos los microcontroladores disponen de un circuito oscilador que genera una onda cuadrada de alta frecuencia, que configura los impulsos de reloj usados en la sincronización de todas las operaciones del sistema. Generalmente, el circuito de reloj está incorporado en el microcontrolador y sólo se necesitan unos pocos componentes exteriores para seleccionar y estabilizar la frecuencia de trabajo. Dichos componentes suelen consistir en un cristal de cuarzo junto a elementos pasivos o bien un resonador cerámico o una red R-C. Aumentar la frecuencia de reloj supone disminuir el tiempo en que se ejecutan las instrucciones pero lleva aparejado un incremento del consumo de energía. 1.3 Recursos especiales
Cada fabr fabric icaante nte ofert fertaa nume numero rosa sass vers versio ione ness de una arqu arquit iteectur cturaa básic sica de microcontrolador. En algunas amplía las capacidades de las memorias, en otras incorpora nuevos recursos, en otras reduce las prestaciones al mínimo para aplicaciones muy simples, etc. etc. La labo laborr del del dise diseña ñado dorr es enco encontr ntrar ar el mode modelo lo mínim mínimoo que que satis satisfag fagaa todo todoss los los requerimientos de su aplicación. De esta forma, minimizará el coste, el hardware y el software. Los principales recursos específicos que incorporan los microcontroladores son: 1. Temporizadores o “Timers”:
Se emplean para controlar periodos de tiempo y para llevar la cuenta de acontecimientos que suceden en el interior. 2. Perro guardián o “Watchdog”:
Es un tem tempori porizzado ador que que cuand uandoo se desb desbor orda da y pasa pasa por por 0 pro provoca oca un res reset automáticamente en el sistema. 3. Protección ante fallo de alimentación o “Brownout”:
Se trata de un circuito que genera un reset cuando el voltaje de alimentación V DD es inferior a un voltaje mínimo establecido. reposo o de de bajo consumo: consumo: 4. Estado de reposo
Es un estado del sistema donde se detiene el reloj principal y sus circuitos asociados con el objetivo de ahorrar energía en periodos de tiempo donde el microcontrolador se mantiene en espera de instrucciones. 5. Conversor A/D:
Procesa señales analógicas convirtiéndolas en señales digitales. 12
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
6. Comparador analógico : Algunos Algunos modelos modelos de microcontrola microcontroladore doress disponen disponen internamente internamente de un Amplificador Amplificador Operacional que actúa como comparador entre una señal fija de referencia y otra variable que se aplica por una de las patitas de la cápsula. La salida del comparador proporciona un nivel lógico 1 ó 0 según una señal sea mayor o menor que la otra. 7. Modulador de anchura de impulsos o PWM :
Son circuitos que proporcionan en su salida impulsos de anchura variable, que se ofrecen al exterior a través de las patitas del encapsulado. comunicación ón: 8. Puertas de comunicaci
Con objeto de dotar al microcontrolador de la posibilidad de comunicarse con otros dispositivos externos, otros buses de microprocesadores, buses de sistemas, buses de redes y poder poder adaptarlos adaptarlos con otros elementos elementos bajo otras normas normas y protocolos. protocolos. Algunos Algunos modelos modelos disponen de recursos que permiten directamente esta tarea, entre los que destacan: - UART, adaptador de comunicación serie asíncrona. - USART, adaptador de comunicación serie síncrona y asíncrona - Puerta paralela esclava para poder conectarse con los buses de otros microprocesadores. - USB (Universal Serial Bus), que es un moderno bus serie para los PC. - Bus I2C, que es un interfaz serie de dos hilos desarrollado por Philips. - CAN (Controller Area Network), para permitir la adaptación con redes de conexionado multi multiple plexa xado do desa desarro rrolla llado do conj conjun unta tame mente nte por por Bo Bosc schh e Intel Intel para para el cabl cablea eado do de dispositivos en automóviles. 1.4 Lenguajes de programación
Se han desarrollado todo tipo de lenguajes para los microcontroladores, pero los más usados son el Ensamblador, el BASIC y el C. Los programas escritos en Ensamblador son compactos y rápidos, sin embargo, utiliza nemónicos inteligibles y si no están bien confeccionados resultarán de gran tamaño y lentos. Los lenguajes de alto nivel como el BASIC y el C son más fáciles de comprender y por tanto de diseñar. Pero como omo toda toda máquin quinaa dig digital ital,, el micro icroco cont ntro rola lado dorr es capa capazz de ente ntende nder exclusivamente el lenguaje binario grabado en la memoria. Los compiladores son programas que se encargan de traducir el programa de trabajo escrito en cualquier lenguaje a código máquina para luego grabarlo en la memoria del microcontrolador y ejecutarlo.
1.5 Fabricantes
13
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
En la actualidad, gran parte de los fabricantes de circuitos integrados disponen de su propia línea de microcontrola microcontroladores dores.. Así tendremos tendremos Intel, que ha ido siempre por delante presentando presentando nuev nuevos os productos, productos, así por ejemplo ejemplo el 8048 se considera considera el primer primer microcontrolador de 8 bits y lo fabricó Intel en la década de los 70. Otra de las principales empresas del mundo de los dispositivos programables es Motorola y los microcontroladores PIC de la empresa americana Microchip han sido conocidos en los últimos años. Su popularidad avanza día a día, siendo incluidos en la mayoría de proyectos debid debidoo a su bajo bajo cost coste, e, redu reduci cido do cons consum umo, o, pequ pequeñ eñoo tama tamaño ño,, fáci fácill prog progra rama maci ción ón y abundancia de herramientas económicas de soporte. Otras empresas como Hitachi, Texas, Toshiba y Zilog abarcan pequeñas partes del mercado. Todos los microcontroladores que se fabrican en el presente son buenos y el mejor no siem siempr pree es el mism mismo. o. Camb Cambia iann el mode modelo lo y fabr fabric ican ante te segú segúnn la apli aplica caci ción ón y las las circunstancias que lo envuelven. 1.6 Aplicaciones
Cada Cada vez vez existe existenn más producto productoss que incorpora incorporann un microc microcont ontrol rolado adorr con el fin de aumentar sustancialmente sus prestaciones, reducir su tamaño y coste, mejorar su fiabilidad y disminuir el consumo. Algunos fabricantes de microcontroladores superan el millón de unidades de un modelo dete determ rmina inado do produ produci cida dass en una una sema semana na.. Este Este dato dato pued puedee dar dar una una idea idea de la masi masiva va utilización de estos componentes. Los microcontrolado microcontroladores res están están siendo siendo empleado empleadoss en multitud de sistemas sistemas presentes presentes en la vida vida diaria diaria,, como como pued pueden en ser ser jugu juguet etes es,, horn hornoo micr microo oond ndas as,, frigo frigoríf rífic icos os,, tele televis visore ores, s, computadoras, impresoras, módems, el sistema de arranque de nuestro coche, etc. Y otras aplicaciones como instrumentación electrónica, control de sistemas en una nave espacial, etc. Una aplicación típica podría emplear varios microcontroladores para controlar pequeñas partes partes del sistema. sistema. Estos pequeños pequeños controladores controladores podrían podrían comunicarse comunicarse entre ellos y con un procesador procesador central, probableme probablemente nte más potente, potente, para compartir la información información y coordinar coordinar sus acciones, como, de hecho, ocurre ya habitualmente en cualquier PC.
14
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Capítulo 2. Microcontroladores Microcontroladores PIC Para la realización de estas prácticas se ha elegido la familia PIC de microchip por diversos motivos: 1. Por la cantidad de información disponible sobre estos microcontroladores, y es que para las aplicacione aplicacioness más habituales habituales la elección elección de una versión versión adecuada adecuada de PIC es la mejor solución. 2. Por su sencillez de manejo, tienen un juego de instrucciones reducido, de 35 en la gama media. 3. Por su precio, que es comparativamente inferior al de sus competidores 4. Por su velocidad y promedio de parámetros en consumo, tamaño, etc. 5. Porque posee gran variedad de herramientas, tanto de software como de hardware, baratas baratas y fáciles fáciles de de utilizar. utilizar. Una de las razones del éxito de los PIC se basa en su utilización. Cuando se aprende a manejar uno de ellos, conociendo su arquitectura y su repertorio de instrucciones, es muy fácil emplear otro modelo. 2.1 Características relevantes 1º La arquitectura del procesador sigue el modelo Harvard :
En esta arquitectura, la CPU se conecta de forma independiente y con buses distintos con la memoria de instrucciones y con la de datos y así permitir su acceso simultaneo. B u s d e d a to s
M E M O R IA D E
B u s d e I n s tr u c c io n e s
M E M O R IA D E
C P U
D A T O S
IN S T R U C C I O N E S
12
8
Figura 2.1.a aplica ca la técn técnic ica a de segm segmen enta taci ción ón (“pi (“pipe pe-l -lin ine” e”)) en la ejec ejecuc ució ión n de las las 2º Se apli instrucciones:
La segmentación permite al procesador realizar al mismo tiempo la ejecución de una instrucción y la búsqueda del código de la siguiente. De esta forma se puede ejecutar cada instrucción en un ciclo (un ciclo de instrucción equivale a cuatro ciclos de reloj) excepto las instrucciones de salto que ocupan dos ciclos al no conocer la dirección de la siguiente instrucción hasta que no se haya completado la de bifurcación. Figura 2.1.b de la página siguiente.
15
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra C L K
ciclo
B I3
B I2
B I1
E I3
E I2
E I3
F in IN S T R 0 F in I N S T R 1 F in IN S T R 2
Figura 2.1.b 3º El formato de todas las instrucciones es de la misma longitud:
Las instrucciones de los microcontroladores de la gama baja tienen una longitud de 12 bits. Las de la gama media tienen tienen 14 bits y más las de la gama alta. Esta característica característica es muy ventajosa en la optimización de la memoria de instrucciones y facilita enormemente la construcción de ensambladores y compiladores. 4º Procesador RISC (Computador de Juego de instrucciones reducido):
Los modelos de la gama baja disponen de un repertorio de 33 instrucciones, 35 los de la gama media y casi 60 los de la alta. 5º Todas las instrucciones son ortogonales:
Cualquier instrucción puede manejar cualquier elemento de la arquitectura como fuente o como destino. 6º Arquitectura basada en un banco de registros:
Esto Esto signific significaa que todos todos los objeto objetoss del sistema sistema (puerta (puertass de E/S, E/S, tempo temporiza rizador dores, es, posiciones posiciones de memoria, memoria, etc.) están están impleme implementados ntados físicamente físicamente como como registros registros.. 7º Diversidad de modelos de microcontroladores con prestaciones y recursos diferentes:
La gran variedad de modelos de microcontroladores PIC permite que el usuario pueda seleccionar el más conveniente para su proyecto. 8º Herramientas de soporte potentes y económicas:
La empresa Microchip y otras que utilizan los PIC ponen a disposición de los usuarios numerosas herramientas para desarrollar hardware y software. Son muy abundantes los programado programadores, res, los simuladore simuladoress software, software, los emuladores emuladores en tiempo real, Ensamblad Ensambladores ores,, Compiladores C, Intérpretes y Compiladores BASIC, etc.
16
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
2.2 Las gamas PIC
Para Para reso resolv lver er aplic aplicac acion iones es senc sencill illas as se prec precisa isann poco pocoss recu recurs rsos os;; en camb cambio, io, las las aplicaciones grandes requieren numerosos y potentes. Siguiendo esta filosofía, Microchip construye diversos modelos de microcontroladores orientados a cubrir, de forma óptima, las necesidades de cada proyecto. Así, hay disponibles microcontroladores sencillos y baratos para atender las aplicacione aplicacioness simples simples y otros complejos y más costosos para las de mucha envergadura. Con las cuatro gamas de PIC se dispone de gran diversidad de modelos y encapsulados, pudiendo pudiendo seleccionar seleccionar el que mejor se acople acople a las necesidade necesidadess de acuerdo acuerdo con el tipo y capacidad de las memorias, el número de líneas de E/S y las funciones auxiliares precisas. Sin embargo, todas las versiones están construidas alrededor de una arquitectura común, un repertorio mínimo de instrucciones y un conjunto de opciones muy apreciadas, como el bajo consumo y el amplio margen del voltaje de alimentación.
2.2.1 Gama Baja La gama baja de los PIC encuadra nueve modelos fundamentales en la actualidad. A muchos de estos microcontroladores de gama baja se les llama “enanos” porque solamente disponen de 8 patillas. La memoria de programa puede contener 512, 1 k. y 2 k palabras de 12 bits, y ser de tipo ROM, EPROM aunque también hay modelos con memoria OTP. La memoria de datos puede tener una capacidad comprendida entre 25 y 73 bytes. Sólo disponen de un temporizador (TMR0), un repertorio de 33 instrucciones y un número de patitas para soportar las E/S comprendido entre 12 y 20. El voltaje de alimentación admite un valor muy flexible comprendido entre 2 y 6,25 V, lo cual posibilita el funcionamiento mediante pilas corrientes teniendo en cuenta su bajo consumo (menos de 2 mA a 5 V y 4 MHz ). Al igual que todos los miembros de la familia PIC16/17, los componentes de la gama baja se caracterizan por poseer los siguientes recursos. 1. Sistema POR (POWER ON RESET):
Todos los PIC tienen la facultad de generar un auto reset al conectarles la alimentación. 2. Perro guardián (Watchdog):
Existe un temporizador que produce un reset automáticamente si no es recargado antes de que pase un tiempo prefijado. Así se evita que el sistema quede "colgado" dado en esa situación el programa no recarga dicho temporizador y se genera un reset. 3. Código de protección:
Cuando se procede a realizar la grabación del programa, puede protegerse para evitar su lectura.
17
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
4. Líneas de E/S de alta corriente:
Las líneas de E/S de los PIC pueden proporcionar o absorber una corriente de salida comprendida entre 20 y 25 mA, capaz de excitar directamente ciertos periféricos. 5. Modo de reposo (bajo consumo o SLEEP):
Ejecutando una instrucción (SLEEP), la CPU y el oscilador principal se detienen y se reduce notablemente el consumo. Y por otro lado, conviene nombrar dos restricciones importantes de la gama baja y es que la pila solo dispone de dos niveles, lo que supone no poder encadenar más de dos subrutinas y además no admiten interrupciones.
2.2.2 Gama Media En esta gama sus componentes añaden nuevas prestaciones a las que poseían los de la gama gama baja baja,, haci haciééndol ndolees más más ade adecuad cuados os en las las apli aplica caci cion ones es comp comple leja jas. s. Ad Admi mite tenn interrupciones, poseen comparadores de magnitudes analógicas, convertidores A/D, puertos serie y diversos temporizadores. Algunos modelos disponen de una memoria de instrucciones del tipo OTP que resulta mucho más económica en la implementación de prototipos y pequeñas series. Otros en cambio, disponen de una memoria de instrucciones tipo EEPROM, que, al ser borrables eléctricamente, son mucho más fáciles de reprogramar que las EPROM, que tienen que ser sometidas a rayos ultravioleta durante un tiempo determinado para realizar dicha operación. El PIC elegido para realización de las prácticas, el 16F877, pertenece a esta gama y en los sucesivos capítulos, las explicaciones se centrarán en él.
2.2.3 Gama Alta y Gama Mejorada En la actualidad, esta gama esta formada por tres modelos. Los dispositivos PIC17C4X respon responde denn a microc microcontr ontrola olador dores es de arquite arquitectu ctura ra abiert abiertaa pud pudién iéndos dosee exp expans ansion ionar ar en el exterior al poder sacar los buses de datos, direcciones y control. Así se pueden configurar sistemas similares a los que utilizan los microprocesadores convencionales, siendo capaces de ampliar la configuración interna del PIC añadiendo nuevos dispositivos de memoria y de E/S externas. Esta facultad obliga a estos componentes a tener un elevado número de patitas comp compre rend ndid idoo entr entree 40 y 44. 44. Ad Admi mite tenn inte interr rrup upci cion ones es,, pose poseeen pue puerto rto seri seriee, vari varios os temporizadores y mayores capacidades de memoria, que alcanza los 8k palabras en la memoria de instrucciones y 454 bytes en la memoria de datos. En 2003, Microchip lanzaba varios modelos de microcontroladores de gran potencia y velocidad, y se destinan a aplicaciones muy avanzadas. Con un patillaje que llega desde las 28 hasta las 84 patillas, la memoria de código alcanza las 64k palabras y una frecuencia de 40 MHz.
18
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
2.3 16F87X: Características generales
2.3.1 Organización de la memoria Los microcontroladores PIC 16F87X poseen dos bloques de memoria separados, la memoria de programa y los bancos de registros. Las posiciones de la memoria de datos son de 1 byte cada una y las de la memoria de programa de 14 bits. Para direccionar los datos hacen falta 7 bits para elegir posición dentro de un determinado banco y 2 bits más para seleccionar el banco, ya que pueden existir cuatro bancos de registros. 2.3.1.1 Memoria de programa
La memoria de instrucciones puede tener una capacidad mínima de 4k palabras de 14 bits hasta una máxima de 8k palabras de la misma longitud. Durante la fase de búsqueda, la dirección de la instrucción la proporciona el contador de programa , el cual normalmente se auto incrementa en la mayoría de las instrucciones, excepto en las de salto. Al tener cada posición de memoria un tamaño de 14 bits, en las instrucciones del programa programa están implícitas las direcciones direcciones de los registros o memoria memoria de datos. datos. En una sola palabra palabra se agrupa agrupa el código código de la la instrucción instrucción y su su dirección. dirección. De De los 14 bits, bits, 7 se utilizan utilizan para para indicar su dirección, lo que da un máximo direccionable en la memoria de datos de 128 bytes por banco banco de registros. registros. 2.3.1.2 Direccionamiento y paginado
En los PICs 16F87X, el contador de programa (CP) del microcontrolador tiene un tamaño de 13 bits, con lo que es posible direccionar un tamaño total de memoria de programa hasta un máximo de 8k x 14 bits organizada en páginas de un tamaño de 2k x 14 bits. Para manejar microcontroladores de 4 u 8k bytes de memoria de programa, ha de recurrirse a la paginación, cada página tiene una capacidad de 2k, y éstas a su vez, se dividen en 8 subpaginas de 256 bytes. El contador del programa, al estar formado por 13 bits, está compuesto por dos secciones tal y como se muestra en la figura 2.3.1.2. El byte bajo viene del registro de PCL que puede ser leído y escrito. escrito. Los bits superiores (PC<12:8>), (PC<12:8>), están alojados en en el registro PCH, sobre el que no se puede leer ni escribir, pero se puede acceder a él indirectamente a través del registro PCLATH.
Figura 2.3.1.2: Contador de programa
19
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
2.3.2 Banco de registros y memoria de datos Los registros son de 8 bits y están formados por cuatro bancos como se puede ver en la figura 2.3.2:
Figura 2.3.2: Banco de registros del PIC 16F877 En las primeras posiciones de dichos bancos se encuentran los registros de funciones especiales, seguidos a continuación por los registros de proposición general o memoria de datos. La memoria de datos SRAM en los PIC 16F877 es de 368 bytes. La memoria de trabajo o acumulador (w) de 1 byte en la SRAM es un registro de almacenamiento temporal. Este registro registro no pued puedee ser accedido accedido de forma directa, directa, pero su contenido sí puede moverse a otro registro al que sí puede accederse directamente. Cada operación aritmética que se realiza utiliza el registro w. 20
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
La memoria de datos EEPROM de 256 bytes en el PIC16F877 puede almacenarse de forma indefinida cualquier dato que se desee retener cuando se apague la alimentación. Esta memoria es de 8 bits y no forma parte del espacio normal direccionable, y sólo es accesible en lectura y escritura a través de dos registros. 2.3.2.1 Direccionamiento de los datos
Para direccionar la memoria de datos se emplean tres modelos de direccionamiento, el Inmediato, el Directo y el Indirecto. Cuando una instrucción utiliza un dato inmediato, su valor (literal) lo contiene su código OP y en la ejecución se carga en el registro W para su posterior procesamiento. En el direccionamiento directo consiste en codificar el nombre del o de los registros en cuestión directamente en la instrucción, pero primero hay que situarse en el banco adecuado. Si el dato no se halla en el banco 0, se emplean los bits 6 y 5 del registro FSR (Registro de Selección de Banco), que se denominan RAI y RA0, respectivamente. En las instrucciones con direccionamiento indirecto se usa como operando el registro INDF, que ocupa la posición 0 del banco 0. En tal caso, se accede a la posición que apunta el contenido del registro FSR ubicado en la posición 04 del área de datos. Sus 5 bits de menos peso apuntan apuntan la dirección dirección del dato y los bits 6 y 5 selecciona seleccionann el banco. banco. No tiene implementado el bit 7, que siempre se lee como 1. El registro INDF no se halla implementado físicamente. Cada vez que se le referencia, se utiliza el contenido del registro FSR para direccionar al operando.
Figura 2.3.2: Direccionamiento directo e indirecto
2.3.3 Registros con funciones especiales Los Los registr registros os de funcio funciones nes espec especiale ialess o registr registros os de contro controll tienen tienen como como cometi cometido do gobernar el funcionamiento de los recursos del microcontrolador. 21
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
2.3.3.1 Registro de estado (Status)
Ocupa las posiciones 03h, 83h, 130Bh y 183Bh del PIC. Es uno de los registros más importantes, cuyos bits controlan funciones vitales del microcontrolador. En la figura 2.3.3.1 se muestra la estructura y la misión de cada uno de sus bits.
Figura 2.3.3.1: Registro de Estado El bit IRP hace la selección de bancos para el direccionamiento indirecto, tal y como se ha visto en el punto anterior y los bits RP1:RP0 lo hacen para el direccionamiento directo. Los bits TO y PD, no se pueden escribir, son banderas que indican la causa por la que se ha producido producido el reset reset del PIC y permiten actuar en consecuencia: consecuencia: Z es la bandera bandera de cero, cero, DC bandera bandera de acarre acarreoo en el el 4º bit de menor menor peso peso y C bandera bandera de de acarreo acarreo en en el 8º bit. 2.3.3.2 Registro de opciones (Option_reg)
El registro de opciones se encuentra en las posiciones 81h y 181h, puede ser leído y escrito y contiene varios bits para la configuración de las asignaciones del pre divisor al TMR0 TMR0 o al WD WDT, T, la inter interrup rupció ciónn exte externa rna,, el TMR0 TMR0 y las las resis resiste tenc ncias ias inter interna nass de polarización polarización del puerto puerto B. RBPU es el bit de conexión de las resistencias de polarización del Puerto B; INTDEG selecciona el tipo de flanco para la interrupción por RB0/INT, según esté a 0 o a 1 será ascendente o descendente. T0CS selecciona la fuente de reloj para el TMR0 y T0SE el tipo de flanco activo para el TMR0. PSA indicará la asignación del divisor de frecuencias al WDT o al TMR0.
22
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Finalmente, los bits PS2:PS0 asignan la tasa del valor del divisor de frecuencias, y difiere dependiendo del predivisor que se haya asignado al TMR0 o al WDT. Los detalles de todo lo comentado sobre este registro se encuentran en la siguiente figura:
Figura 2.3.3.2: Registro de opciones 2.3.3.3 Registro de interrupciones (INTCON)
Figura 2.3.3.3: Registro de interrupciones 23
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Puesto Puesto que los microc microcont ontrola rolador dores es PIC de la gama gama media media admite admitenn interrup interrupcio ciones nes,, requieren un registro encargado de su regulación. La operatividad de sus bits se entenderá mejor cuando se explique la operatividad de las interrupciones. En la figura 2.3.3.3 de la página página anterior anterior se ofrece ofrece la estructu estructura ra y la misión misión de los bits del del registro registro INTCON. INTCON. El bit GIE concede o cancela la activación global de las interrupciones. PEIE, TOIE, INTE y RBIE activan o desactivan las interrupciones en periféricos, TMR0, interrupciones externas y del puerto B respectivamente. El resto de bits son banderas de estado. 2.3.3.4 Otros registros especiales
Los registros PIE1 y PIE2 contienen los bits que autorizan o prohíben las interrupciones producidas producidas por los periféricos periféricos internos internos del PIC y que no están están incluidos incluidos en el registro registro INTCON. Los registros PIR1 y PIR2 contienen una serie de bits que actúan como banderas de señalización de la causa que origina la interrupción, esté permitida o no. Para ver mayor detalle de estos registros ver las figuras siguientes:
Figura 2.3.3.4: Registros PIE1, PIR1 y PCON
24
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
2.3.4 Palabra de configuración e identificación La palabra de configuración en los PIC de la gama media se compone de 14 bits que se escriben durante el proceso de grabación del dispositivo. Dichos bits ocupan la posición reservada de la memoria de programa 2007h. Como se puede comprobar en la figura 2.3.4, los bits CP1:CP0 son los bits de protección de códi código go,, BODE BODEN N activ activaa o desa desact ctiv ivaa el fallo fallo en la alime alimenta ntaci ción ón,, PWRT PWRTE E activ activaa el temporizador, WDTE activa el perro guardián, los bits FOSC1:FOSC0 seleccionan el tipo de oscilador.
Figura 2.3.4: Palabra de configuración También existen cuatro posiciones reservadas en la memoria de programa destinadas a contener las Palabras de identificación (ID). En estas palabras solo se emplean los 4 bits de meno menoss peso peso,, en dond dondee se alma almace cena na el núme número ro de serie serie,, códi código goss de iden identif tifica icació ción, n, numeraciones secuénciales o aleatorias, etc. También se escribe su contenido en el proceso de grabación del dispositivo.
25
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
2.4 Recursos comunes e interrupciones
En la siguiente tabla se muestran las características características más relevantes de los PIC 16F87X: 16F87X: Características 16F873 16F874 16F876 16F877 Frecuencia Má Máxima DC-20Mhz DC-20Mhz DC-20Mhz DC-20Mhz Memoria de programa 4KB 4KB 8KB 8KB FLASH Palabra de 14 bits Posiciones RAM de datos 192 192 368 368 Posiciones EEPROM de 128 128 256 256 datos Ports E/S A, B y C A, B, C, D y E A, B y C A, B, C, D y E Nº de Pines 28 40 28 40 Interrupciones 13 14 13 14 Timers 3 3 3 3 Módulos CCP 2 2 2 2 Comunica icacion iones Se Serie MSSP, US USART MSSP,USART MSSP,USART MSSP, US USART Comunicación Paralelo PSP PSP Líneas de entrada en 5 8 5 8 Convertidor A/D de 10 bits 35 35 35 35 Juego de Instrucciones instrucciones instrucciones instrucciones instrucciones Longitud de la instrucción 14 bits 14 bits 14 bits 14 bits
Todos estos elementos que se muestran en la tabla serán analizados y explicados en los puntos puntos sucesivo sucesivoss de este este capítulo. capítulo.
2.4.1 Diagramas de conexionado del 16F877
Figura 2.4.1a: Diagrama de conexionado del PIC 16F877
26
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
En la figura anterior se muestra el diagrama de conexionado de un PIC 16F877. A continuación se nombran las funciones de todas las patitas: - MCLR/VPP: Reset externo. Por esta patita se aplica también la tensión / V PP usada en la grabación del programa. - RA0/ RA0/AN AN0: 0: E/S E/S dig digita itall o ent entra rada da ana analó lógi gica ca - RA1/ RA1/AN AN1: 1: E/S E/S dig digita itall o ent entra rada da ana analó lógi gica ca - RA2/AN2/VREF: E/S digital, entrada analógica o salida de la tensión de referencia - RA3/AN3/ VREF: E/S digital, analógica o entrada externa de V REF - RA4/T RA4/TOC OCKI: KI: E/S E/S digit digital al o entrad entradaa del del reloj reloj para para TMR0 TMR0 - RA5/A RA5/AN4/ N4/SS SS:: E/S digita digital,l, analóg analógica ica o selec selecció ciónn del puerto puerto serie serie sincro sincrono no - RB0/ RB0/IN INTT-RB RB7: 7: E/S digi digita tale less del del Puer Puerto to B. RB0/ RB0/IN INT T pue puede actu actuar ar como como entrada de interrupción externa. RB4-RB7 pueden provocar interrupción cuando cambian de estado - RE0/R RE0/RD/A D/AN5: N5: E/S E/S digital digital del del Puert Puertoo E. Señal Señal de lect lectura ura del del Puerto Puerto paral paralelo elo esclavo. Entrada analógica. - RE1/ RE1/WR WR/AN /AN6: 6: E/S E/S digi digita tal. l. Seña Señall de escrit escritura ura del Puerto Puerto parale paralelo lo escl esclav avo. o. Entrada analógica. - RE2/C RE2/CS/ S/AN AN7: 7: E/S digi digita tal. l. Seña Señall de activ activac ación ión del Puerto Puerto parale paralelo lo esclav esclavo. o. Entrada analógica. - VDD: Entrada del positivo de la alimentación - OSC1 OSC1/CL /CLKIN KIN:: Entrad Entradaa al cristal cristal cuarzo cuarzo o reloj reloj exte externo rno - OSC2/ OSC2/CL CLKOU KOUT: T: Salida Salida del del cristal cristal.. En modo modo R-C por esta esta patita patita sale sale ¼ FOSC1 - RC0/ RC0/T1 T1OS OSO/ O/T1 T1CL CL1: 1: E/S E/S digi digita tall del del Puer Puerto to C. Co Cone nexi xión ón del del osci oscila lado dor r externo para el temporizador TMR1 o entrada de reloj para el TMR1 - RC1/T RC1/T1OS 1OSI/C I/CCP2 CP2:: E/S digital digital del del Puerto Puerto C. Conexión Conexión del del oscilado osciladorr externo externo para TMR1 TMR1 o salida del modulo modulo 2 de captura/c captura/compa omparación ración - RC2/CCP1: E/S digital del Puerto C. Salida del modulo 1 de captura/comparación - RC3/S RC3/SCK CK/SC /SCL: L: E/S digit digital. al. E/S E/S de reloj reloj para para el Puerto Puerto serie serie sinc sincron ronoo (SSP) (SSP) 2 de los módulos SPI a I C - RC4/S RC4/SDI DI/SD /SDA: A: E/S digi digital tal.. Entrad Entradaa de datos datos serie serie en el modo modo SPI. E/S E/S de 2 datos serie en modo I C - RC5/S RC5/SD0 D0:: E/S digit digital al del del Puerto Puerto C. Salid Salidaa de dato datoss serie serie en en el modo modo SPI SPI - RC6/T RC6/TX/C X/CK: K: E/S digital digital.. Transmis Transmisión ión serie serie asinc asincrona rona.. Entrada Entrada de reloj reloj para comunicación serie sincrona - RC7/R RC7/RX/ X/DT DT:: E/S E/S digi digita tal. l. Recep Recepció ciónn serie serie asinc asincro rona na.. Líne Líneaa de datos datos en la comunicación serie sincrona. - RD0/P RD0/PSP0 SP0-RD -RD7/P 7/PSP SP7: 7: E/S digital digitales es del Puert Puertoo D. Este Puert Puertoo puede puede trabaja trabajar r como Puerto paralelo esclavo para interconexión con un bus de datos de 8 bits de otro microprocesador Una vez explic explicado ado el funcion funcionam amient ientoo de cada cada patita patita del PIC16F PIC16F877 877,, en la pág página ina siguiente, en la figura 2.4.1b se muestra su arquitectura interna, un diagrama de bloques donde se muestran los periféricos y las líneas de entrada y salida.
27
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Figura 2.4.1b: Arquitectura interna del 16F877
2.4.2 Recursos comunes En la gama media existen muchos recursos que son comunes a la mayoría de los modelos y que son conocidos por la gama baja. 2.4.2.1 Oscilador principal
Para la generación de los impulsos de reloj internos los PIC16F87X disponen de cuatro alternativas, debiendo el usuario seleccionar el más adecuado y programar adecuadamente los bits FOSC1 y FOSC0 de la palabra de configuración, que establecen la configuración entre las siguientes: - LP: LP: - XT: XT: - HS: HS: - RC: RC:
Oscilador Oscilador de de cristal cristal de cuarzo cuarzo o resona resonador dor cerám cerámico ico de baja potencia potencia Crist Cristal al o reso resona nado dorr cerá cerámi mico co Oscilad Oscilador or de crist cristal al o reson resonado adorr de alta alta veloc velocida idadd Oscilador Oscilador formad formadoo por una red red resistenc resistencia ia condens condensador ador
28
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
En la figura siguiente se ofrece un circuito para las alternativas que usan cristal de cuarzo o resonador.
Figura 2.4.2.1a: Esquema para configuraciones LP, XT y HS Cuando no se requiere una gran precisión en la generación de impulsos de reloj, se puede emplear una red RC mucho más económica. En este caso, la frecuencia de oscilación viene determinada por los valores de resistencia y de los condensadores exteriores, así como de la temperatura de funcionamiento.
Figura 2.4.2.1b: Esquema para configuración RC 2.4.2.2 Perro guardián (WDT)
El Perro guardián vigila que el programa no se "cuelgue" y dejen de ejecutarse las instrucciones secuénciales del mismo tal como lo ha previsto el diseñador. Para realizar esta labor de vigilancia, el perro guardián da un paseo por la CPU cada cierto tiempo y comprueba si el programa se ejecuta normalmente; en caso contrario, el perro provoca un reset, reinicializando todo el sistema. Este Este tempor temporiza izador dor está está con contro trolad ladoo por un oscilad oscilador or interno interno indepen independie diente nte,, con una temporización nominal de 18 ms, que puede aumentarse asignando el divisor de frecuencia al perro guardián, con el cual, trabajando en el rango mayor, puede alcanzar hasta 2,3 segundos. Para evitar que se desborde el WDT y genere un reset, hay que recargar o refrescar su cuenta antes de que llegue el desbordamiento. Este refresco, que en realidad consiste en ponerle ponerle a 0 para iniciar la temporizació temporización, n, se consigue consigue por software software con las instrucciones instrucciones CLRWDT y SLEEP. 2.4.2.3 Temporizador TMR0
El TMR0 en los PIC16F87X PIC16F87X es un contador ascendente ascendente de 8 bits, que puede funcionar funcionar con reloj interno o externo y ser sensible al flanco ascendente o descendente. Se le puede
29
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
asigna el divisor de frecuencia, y además posee la posibilidad de generar una interrupción cuando se desborda. El TMR0 se comporta como un registro de propósito especial ubicado en la posición 1 del área de datos. Para trabajar con TMR0 se pueden utilizar las siguientes fórmulas en el caso que los impulsos de reloj provengan del oscilador interno con un periodo de Tosc. Tiempo = 4 · Tosc · (Valor cargado en TMR0) · (Rango del Divisor) Valor a cargar en TMR0 = (tiempo / 4 · Tosc) · (Rango del Divisor) En la figura 2.4.2.3 se ofrece el diagrama de bloques del TMR0 y el preescaler que comparte con el WDT. Obsérvese que existe un bloque que retrasa dos ciclos y cuya misión consiste en sincronizar el momento del incremento producido por la señal T0CKI con el que producen producen los impulsos impulsos del reloj interno. interno. Cuando Cuando no se usa el Divisor Divisor de frecuencia frecuencia,, la entrada de la señal de reloj externa es la misma que la salida de dicho Divisor.
Figura 2.4.2.3: Diagrama de bloques del TMR0 2.4.2.4 Reset
El reset de los microcontroladores puede ser originado por las siguientes causas: 1ª Conexión de la alimentación (POR: Power-On-Reset) 2ª Activación de la patita MCLR (Master (Master Clear Reset) durante una operación operación normal. 3ª Activación de MCLR en en el estado de Reposo Reposo o SLEEP. 4ª Desbordamiento del Perro guardián. Como se aprecia en el esquema de la figura 2.4.2.4 de la página siguiente, cualquiera de estas posibilidades introduce un nivel bajo en la entrada S del flip-flop y pone en marcha un temporizador propio que, al cabo de 18 ms, origina un flanco ascendente en la salida Q que supone la generación del reset interno. El bloque temporizador de la figura produce un retraso en la generación del reset para dar tiempo a que se estabilice la tensión V DD de alimentación y la frecuencia del oscilador principal. principal. Este Este temporizad temporizador or está está gobernad gobernadoo por un oscilad oscilador or RC indepe independien ndiente. te.
30
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Figura 2.4.2.4: Diagrama de bloques del circuito de Reset Los bits TO y PD del Registro de Estado toman el valor correspondiente según la causa que haya provocado el reset. TO 0 0 1 1 u
PD 0 1 0 1 u
Estado tras el RESET WDT en el modo “SLEEP” WDT en el modo normal MCLR en el modo SLEEP Conexión de la alimentación (POR) MCLR en el modo normal
2.4.2.5 Modo de reposo (Sleep)
Este modo especial de funcionamiento ocasiona un consumo muy bajo y se entra en él con la ejecución de la instrucción SLEEP. Con esta instrucción ocurren las siguientes acciones: 1. Si el perro guardián está activado, se refrescara su valor (se borra) pero sigue funcionando normalmente. 2. El oscilador principal del sistema deja de funcionar. 3. Los puertos de E/S mantienen el mismo estado que tenían antes de ejecutar SLEEP. 4. Los bits TO y PD del registro de estado toman los valores 1 y 0, respectivamente. Para salir del estado de Reposo hay dos posibilidades: 1ª Se activa la patita MCLR y se genera un reset. 2ª El Perro Perro guardián que estaba activo cuando se ejecuto SLEEP se desborda y genera genera un reset. Para conocer la causa por la que se ha salido del Estado de Reposo se analizan los bits TO y PD.
2.4.3 Interrupciones Una interrupción consiste en una detención del programa en curso para realizar una determinada rutina que atienda la causa que ha provocado la interrupción. Es como una llamada a subrutina, que se origina por otra causa que por una instrucción del tipo CALL. 31
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Tras la terminación de la rutina de interrupción, se retorna al programa principal en el punto en que se abandono. Las causas que originan una interrupción pueden ser externas, como la activación de una patita con el nivel lógico lógico apropiado, apropiado, e internas, internas, como las que pued pueden en producirse producirse al desbordarse un temporizador, como el TMR0. En las aplicaciones industriales, las interrupciones son un producto muy potente para atender los acontecimientos físicos en tiempo real. Las interrupciones evitan que la UCP explore continuamente el nivel lógico de una patita o el valor de un contador. Los PIC16F87X tienen cuatro posibles fuentes de interrupción: 1ª. Interrupción externa provocada al activar la patita RB0/INT 2ª. Desbordamiento del TMR0 3ª. Cambio de estado en las líneas del Puerto B 4ª. Cambio de estado en el comparador analógico En la figura siguiente se ofrece el esquema lógico que controla la generación de la interrupción, cuando aparece un nivel alto en su línea INT de salida.
Figura 2.4.3: Lógica de control para la generación de la interrupción Cada causa de interrupción esta controlada mediante dos líneas o señales. Una de ellas actú actúaa como como una una band bandeera de seña señali liza zaci ción ón que que indi indica ca si se ha prod produc ucid idoo o no el acontecimiento, mientras que la otra es el permiso o prohibición de la interrupción en si. El valo valorr que que se apli aplica ca a las las seña señale less de entr entrad adaa del del circu ircuit itoo de gobi gobier erno no de las las interrupciones proviene del que tengan los bits de los registros INTCON, PIR1 y PIE1. El bit GIE de activación global del permiso de interrupción, situado en el registro INTCON, se borra automáticamente cuando se reconoce una interrupción para evitar que se produzca produzca otra cuando cuando se atiende atiende a la inicial. inicial. Al retornar retornar de la interrupción, interrupción, el bit GIE se vuelve a activar.
32
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
2.5 Periféricos
2.5.1 Puertos de entrada y salida Las patitas de comunicación de los microcontroladores se agrupan en conjuntos llamados puertos puertos porque porque dejan entrar y salir la información información al procesador procesador o pines. pines. Dichos Dichos puertos puertos deben soportar las líneas que precisan los distintos periféricos que hay integrados en la cápsula. Cuantos más periféricos dispone el modelo, exige más líneas de comunicación y mayor numero de patitas, con más multiplexado de señales. Los Puertos de E/S de los PIC16F87X disponen de versiones con 40 patitas y 5 puertos de E/S. Tienen Conversor A/D, 4 temporizadores, modulo CCP, Puerto Serie SSP, interfaz Serie SCI, Puerto Paralelo Esclavo y más capacidad en sus memorias. Puerto A:
Consta de 6 patitas o líneas (RA0-RA5). Todas, menos RA4, pueden actuar como E/S digitales o como canales de entrada para el Conversor AD. La patita RA4, además de E/S digital puede funcionar como entrada de reloj externo para el TMR0. Puerto B:
Las 4 líneas de mas peso del Puerto B (RB<3:0>) actúan como E/S digitales, según la programac programación ión del registro registro TRISB. Además pueden pueden disponer disponer de una carga pull-up interna si se programa la línea como entrada y el bit<7> (RBPO) del registro OPTION vale 0. Las líneas RB<7:4> funcionan como las anteriores, pero además pueden provocar una interrupción si se programan como entradas y se produce el cambio de nivel lógico en alguna de ellas. En tal caso se activa el bit <0> (RBIF) de INTCON. La interrupción se anula al borrar borrar el bit <3> <3> (RBIE) (RBIE) de de INTCON INTCON o al hacer hacer una nuev nuevaa lectura lectura del del Puerto Puerto B. Puerto C:
Es un puerto bidireccional de 8 bits, cada patita actúa como E/S digital, según la programac programación ión de TRISC. TRISC. Además, también también pued puedee actuar como entrada o salida de diversos diversos periféricos periféricos internos. internos. Consultar Consultar el punto 2.4.1 dond dondee se explican explican los diagramas diagramas de conexionado para ver la función de cada patita en el puerto C. Puerto D:
Cada patita puede configurarse como E/S digital, según la programación del registro TRIS TRISD. D. Tamb Tambié iénn pued puedee funci funcion onar ar como como Puer Puerto to Para Parale lelo lo Escl Esclav avoo para para sopo soporta rtarr la interconexión directa con el bus de datos de 8 bits de otro microprocesador. Para funcionar en este modo hay que poner a 1 el bit<4> (PSMODE) de TRISE. En tal caso, las líneas RE<2:0> del Puerto E pasan a soportar las señales de control CS, WR y RD, entre el Puerto D y el bus del microprocesador. Cada vez que el microprocesador realiza un ciclo de lectura o escritura sobre el Puerto D el bit <7> (PSPIF) del registro PIR1 se pone a 1.
33
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Puerto E:
Este puerto que solo dispone de tres patitas esta disponible en el modelo, la nomenclatura de las líneas es: RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 Las 3 patitas pueden funcionar como E/S digitales, según la programación de los tres bits de menos peso del registro TRISE. También pueden actuar como señales de control (RD, WR y CS) para el flujo de datos entre un microprocesador y el Puerto D, cuando esta programada programada en el modo Esclavo. Deb Deben en programarse programarse como entradas. Finalmente Finalmente,, también también pueden pueden realizar realizar estas estas 3 patitas patitas la función función de canale canaless de entradas entradas analóg analógicas icas para para el Convers Conversor or A/D, según la programación del registro ADCON1. El registro TRISE, que se muestra en la figura siguiente sirve para configurar las líneas de E/S digitales del Puerto E, o bien, para actuar como Registro de Estado cuando el Puerto D funciona como Puerto Paralelo Esclavo.
Figura 2.5.1: Registro TRISE
2.5.2 Conversor analógico digital El módu módulo lo de conve conversi rsión ón Analógico/Digital dispo dispone ne de cinc cincoo entra entrada dass para para los los dispositivos de 28 pines y ocho para los otros dispositivos de la familia. Es un conversor analógico a digital de 8 bits con una tensión de referencia que puede ser interna (VDD) o externa (entra por la patita AN3/V ref ). ). En cada momento la conversión solo se realiza con la entrada de uno de sus canales, depositando el resultado de la misma en el registro ADRES y activándose la bandera ADIF, que provoca una interrupción si el bit de 34
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
permiso permiso correspondiente correspondiente esta activado. activado. Además, Además, al terminar terminar la conversión conversión el bit GO/DONE GO/DONE se pone a 0.
Figura 2.5.2a: Conversor AD con 8 canales para entradas analógicas El módu módulo lo de A/D A/D tiene tiene cuat cuatro ro regi registr stros os que que son: son: AD ADRE RESH SH,, AD ADRE RESL SL,, AD ADCO CON0 N0 y ADCON1. Para gobernar el funcionamiento del CAD se utilizan el ADCON0 y el ADCON1. El primero, primero, que se muestra muestra en la figura 2.5.2a, 2.5.2a, selecciona selecciona el canal a convertir convertir con los bits CHS <2:0>, activa al conversor y contiene la bandera que avisa del fin de la conversión (ADIF) y el bit GO/DONE.
Figura 2.5.2b: Registro ADCON0 35
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
El registro ADCON1 establece las entradas que son digitales y analógicas, así como el tipo de tensión de referencia (interna o externa). ADFM selecciona el formato del resultado de la conversión, con justificación izquierda o dere derech cha. a. PCFG PCFG3:P 3:PCF CFG0 G0 son son los los bits bits de confi configu gura raci ción ón de los los cana canale less de entra entrada da del del conversor. Se utilizan para configurar las patillas como E/S digital o como entrada analógica de acuerdo con la tabla de la figura siguiente.
Figura 2.5.2c: Registro ADCON1 Finalmente, se describen de forma resumida los pasos para realizar una conversión en el CA/D: 1º. Se configura correctamente el CA/D programando los bits de los registros de control. 2º. Se autoriza o prohíbe la generación de interrupción al finalizar la conversión, cargando los bits del PIE1. 3º. Para iniciar la conversión se pone el bit GO/DONE = 1. Hay que tener en cuenta el tiempo que durara la conversión. 4º. Se detecta el final de la conversión bien porque se genera la interrupción, o bien porque porque se explora explora cuando cuando el el bit GO/DON GO/DONE E = 0. 0. 5º. Se lee el resultado de la conversión en el registro ADRES. Los registros ADRESH:ADRESL contienen los 10 bits resultado de la conversión A/D. Cuando se completa la conversión A/D, el resultado se guarda en los registros y se pone a 36
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
cero el bit GO/DONE y el flag de fin de conversión ADIF (PIR1<6>) se pone a 1. Después de que el conversor A/D se ha configurado como se quiere, la selección del canal debe realizarse realizarse antes de hacer la adqu adquisición. isición. Los canales canales de entrada analógica analógica deben tener los correspondientes bits del registro TRIS seleccionados como entradas.
2.5.3 Temporizador TMR1 El TMR1 TMR1 es un Temp Tempor oriz izad ador/ or/Co Cont ntad ador or asce ascende ndente nte de 16 bits bits,, por por lo que que esta esta implementado mediante dos registros específicos TMR1H y TMR1L, que contienen el valor del conteo en cada momento. El valor de registro TMR1H-TMR1L evoluciona desde 0000h hasta FFFFh, en cuyo instante activa la bandera TMR1IF y vuelve a 0000h. Como fuente de los impulsos de reloj existen tres alternativas: 1ª. Generación interna (4 T OSC) 2ª. Generación Generación mediante un oscilador oscilador externo controlado controlado por cristal que se conecta conecta a las patitas patitas RC0/T1OSO/T1C RC0/T1OSO/T1CKI KI y RC1/T1OSI/C RC1/T1OSI/CCP2. CP2. El oscilador oscilador se activa poniendo poniendo a 1 el bit T1OSCEN del registro T1CON. El bit TMR1CS del registro T1CON selecciona entre el reloj interno o externo. 3ª. Trabaja en modo contador de eventos, cuando los impulsos externos a contar se aplican a la patita RC0/T1OSO/T1CKI. La fuente de los impulsos de reloj aplica a un Divisor de Frecuencias que los divide por 1, 2, 4 u 8, según el valor de los bits <1:0> (TICKPS) del registro T1CON. El reloj externo puede puede estar sincronizado sincronizado o no con el interno, interno, según según el bit T1SYNC de T1CON. T1CON. El interno siempre siempre es síncro síncrono. no. T1OSC T1OSCEN EN hab habilita ilita el oscilad oscilador, or, #TlSY #TlSYNC NC es el bit de contro controll de sincronización de la señal de entrada, TMR1CS selecciona la fuente de reloj y TMR1ON activa el temporizador TMR1. Figuras 2.5.3a y 2.5.3b.
Figura 2.5.3a: Esquema del TMR1 El periodo en T1CKI es preciso que tenga una duración mínima de 4.T OSC. En el modo modo de Repo Reposo so cuan cuando do func funcio iona na en modo modo sínc síncro rono no,, el TMR1 TMR1 deja deja de incrementarse pues se desconecta el circuito de sincronismo. En forma asíncrona el TMR1 sigue contando durante el modo de reposo, por eso se puede emplear como un reloj de tiempo real y para sacar del modo de Reposo al sistema. También en modo asíncrono se puede puede usar como base de tiempos tiempos en operacione operacioness de Captura Captura y Comparación Comparación.. El modulo modulo CCP pone a 0 el TMR1 cuando se produce una Captura o una Comparación. 37
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Figura 2.5.3b: Registro T1CON
2.5.4 Temporizador TMR2 El TMR2 solo esta incorporado en unos pocos modelos de la gama media porque se trata de un temporizador de 8 bits diseñado para usarse conjuntamente con el circuito de Modulación de Anchura de Impulsos (PWM). Se incrementa al ritmo de los impulsos que se le aplican (4.T OSC), que pueden ser divididos por 1, por 4 o por 16 mediante un Predivisor. Cuando el valor de TMR2 coincide con el del PR2 (Registro de Periodo) se genera un impulso en la salida EQ y TMR2 pasa a 00h. PR2 es un registro específico de lectura y escritura que cuando hay un Reset se carga con el valor FFh. Los impulsos producidos por EQ se aplican a un Post-divisor que puede dividirlos hasta 1:16, activando su salida la bandera TMR2IF. El registro T2CON regula los principales principales parámet parámetros ros de este temporiz temporizador. ador.
Figura 2.5.4a: Diagrama de bloques del TMR2
38
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
El reset borra al Predivisor y al Post-divisor. También lo hace al TMR2 cuando se ha generado como consecuencia del WDT, POR o MCLR. Cada vez que se escribe sobre el TMR2 o el T2CON se borran el Predivisor y el Post-divisor. La salida EQ se puede utilizar como señal de reloj para el modulo de interfaz serie SSP.
Figura 2.5.4b: Registro T2CON
2.5.5 Módulos de captura/comparación/modulación de anchura de pulsos CCP Los microcontroladores PIC16F87X disponen de dos de estos módulos, llamados CCP1 y CCP2, CCP2, que se contro controlan lan con con los registr registros os CCP1CO CCP1CON N y CCP2CO CCP2CON, N, respec respectiva tivame mente nte.. Realizan tres funciones: 1ª. Capturan información de 16 bits procedente del TMR1. 2ª. Comparan el valor de un registro con el del TMR1. 3ª. Modulan o controlan el intervalo de tiempo en el que bascula de 1 a 0 una patita del microcontrolador. Los módulos CCP1 y CCP2 son idénticos, excepto en ciertas funciones especiales de disparo. Ambos constan de dos registros r egistros CCPRxH y CCPRxL. 2.5.5.1 Modo de Captura
En este modo el registro CCPRxH/L de 16 bits captura el valor contenido en el TMR1, siempre que ocurra uno de los siguientes acontecimientos en la patita Rcy/CCPx del Puerto C, que previamente ha tenido que configurarse como entrada en el registro TRISC: a) Un flanco ascendente b) Un flanco flanco desce descendente ndente c) Cada 4 flancos flancos ascendentes ascendentes d) Cada 16 flancos ascendentes Al realizarse una captura se activa la bandera CCPxIF del registro PIR1 o PIR2 y si se programa programa adecuadam adecuadamente ente el bit de permiso en PIE1 o PIE2, se genera una interrupción. interrupción. Ya se puede leer el valor del registro CCPRx. 39
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Cuando se produce una captura y no se ha leído el contenido de CCPRx se borra y pasa a contener el nuevo. Si se van a modificar las condiciones en las que se va a efectuar la Captura conviene detener o desactivar el modulo CCP para que no se produzcan falsas interrupciones durante la operación. Una aplicación del modo de Captura puede ser la medición de los intervalos de tiempo que existen entre los impulsos que llegan a la patita Rcy/CCPx configurada como entrada. En este modo de trabajo TMR1 debe usarse como entrada de reloj externo sincronizado. 2.5.5.2 Modo de Comparación
Cuando un modulo CCP trabaja de esta manera el contenido del registro CCPRxH/L se compara continuamente con el del TMR1, que debe trabajar en modo síncrono. Cuando coinciden ambos valores la patita Rcy/CCPx, que previamente se habrá configurado como salida, puede bascular a 1, a 0, o bien no variar, pero se activara el señalizador CCPxIF. En tal caso, si el bit de permiso esta activado se provoca una interrupción. Si se selecciona la función especial de disparo, el CCP1 pone a 0 al TMR1 con lo que CCPR CCPR11 funci funcion onaa como como un regi regist stro ro de perio periodo doss capa capazz de prov provoc ocar ar inte interru rrupc pcion iones es periódicame periódicamente. nte. También También el CCP2 pone a 0 el TMR1 TMR1 e inicia una conv conversió ersiónn en el Convertidor A/D, con lo que se pueden realizar periódicamente conversiones de analógicodigitales, sin el control del programa de instrucciones. 2.5.5.3 Modulo de Anchura de Pulsos (PWM)
En este modo la patita Rcy/CCPx, que se ha programado como salida, bascula entre 0 y 1 a intervalos variables de tiempo. Cuando el valor de registro PR2 coincide con los 8 bits de más peso de TMR2 la patita mencionada pasa a 1 y TMR2 toma el valor 00 y reanuda la cuenta. El contenido de CCPRxL pasa a CCPRxH y se compara con TMR2. Cuando ambos coinciden la patita Rcy/CCPx pasa a 0 y se repite la secuencia. Variando el valor de PR2 y CCPRxL se varia el intervalo de tiempo que la patita esta a 1 y esta a 0, respectivamente. Tiempo a 1 = (PR2 + 1) . 4 . T OSC . PREDIVISOR Tiempo a 0 = DCI . T OSC . PREDIVISOR DCI representa el valor de los 8 bits del registro CCPRxL concatenado con los bits <5:4> de CCPxCON. Los 8 bits de TMR2 se concatenan con dos bits Q del reloj interno haciendo que cuente cada T OSC, en vez de cada 4 . T OSC. Todo ello sucede cuando se opera con una resolución de 10 bits, porque si se usa una de 8 bits, los dos bits de menos peso se ponen a 0. La figura 2.5.5.3 de la página siguiente representa cualquiera de los registros CCPICON o CCP2CON. Los bits 4 y 5 funcionan solamente en el modo PWM y son los dos bits de menos peso cuando se trabaja con una resolución de 10 bits. CCPxM3:CCPxM0 seleccionan el modo de trabajo.
40
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Figura 2.5.5.3: Registro CPPxCON
2.5.6 Puerto serie síncrono (SSP) Se trata de un periférico diseñado para soportar una interfaz serie síncrono que resulta muy eficien eficiente te para para la comuni comunicac cación ión del del microc microcontr ontrola olador dor con con dispos dispositiv itivos os tales tales como como displays, EEPROM, ADC, etc. Tiene dos modos de trabajo: 1º. Interfaz Serie de Periféricos (SPI) 2º. Interfaz Inter-Circuitos (I2C) 2.5.6.1 Modo SPI
Sirve para conectar varios microcontroladores de la misma o diferente familia, bajo el formato “maestro-esclavo”, siempre que dispongan de un interfaz compatible. En este modo se pueden emplear 3 o 4 señales de control: Salida de Datos (SDO), Entrada de Datos (SDI), Reloj (SCK) y Selección de Esclavo (SS). Dichas señales se corresponden con las patitas RC5, RC4, RC3 y RA5 respectivamente. Cada una de las señales debe programars programarsee como entrada o salida según su cond condición, ición, utilizando los bits de los registros registros TRIS. Cualquier función del modo SPI queda anulada poniendo con el valor opuesto a su condición el bit correspondiente de TRIS. Por ejemplo, si solo se quiere recibir datos, se programa programa la patita que soporta soporta a SOD como entrada entrada y así así se anula su función. función. Con el registro de control SSPCON se eligen las diferentes opciones de trabajo: Modo Master (SCK es salida), Modo Esclavo (SCK es entrada), tipo de flanco de reloj, velocidad de SCK en Modo Master, etc. Cuando se recibe un dato útil, este se introduce en serie en SSPSR y pasa a SSPBUF en paralelo. paralelo. El dato a transmitirse transmitirse deposita deposita en SSPBUF SSPBUF y de aquí pasa a SSPSR. SSPSR. Se pued puedee recibir y transmitir datos simultáneamente. SSPSR es un registro de desplazamiento que funciona serie/paralelo/serie.
41
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Cuando se acaba de transmitir o recibir un dato completo se activa el bit BF (Buffer Lleno) del registro SSPSTAT. También lo hace la bandera SSPIF y si el bit de permiso esta activado se genera una interrupción. Cuando se recibe un dato durante una transmisión se ignora y se activa el bit WCOL del registro SSPCON que indica que se ha producido una “colisión”. (Para ver los detalles de funcionamiento de los registro SSPSTAT y SSPCON consultar el DATA SHEET del 16F87X que se puede encontrar en la página web de microchip.) En el caso que se reciba un nuevo dato en SSPSBUF sin haber leído el anterior se genera un error de desbordamiento.
Figura 2.5.6.1: Modo SPI 2.5.6.2 Modo I 2C
Este tipo de interfaz serie ha sido desarrollado por Philips y utiliza solo dos hilos trenzados y una masa común para la interconexión de los diversos dispositivos, que han tenido que ser diseñados para soportar este protocolo, asegurando una gran fiabilidad en la comu comunic nicac ació iónn que que llega llega a tole tolera rarr una una velo velocid cidad ad máxi máxima ma de 400 400 Kb Kbps ps.. Es capa capazz de interconectar hasta 128 dispositivos situados a gran distancia, por lo que resulta muy usado en edificios inteligentes, control de distribuciones de electricidad, agua y gas, piscifactorías, etc. El master es el que inicia y termina la transferencia general y provee de la señal de reloj. El esclavo es el dispositivo direccionado por el master, mediante 7 bits, lo que limita el número de componentes a 128.
42
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
El inicio de la transmisión se determina con el bit de inicio (S) y el final con otro bit de stop (P). El bus serie de 2 hilos utiliza uno de ellos para transferir datos (SDA) y el otro para la señal de reloj (SCL). En el protocolo I 2C cada dispositivo tiene asignada una dirección de 7 o de 10 bits que envía el master cuando comienza la transferencia con uno de ellos. Tras la dirección se añade el bit de recepción/transmisión o lectura/escritura (R/W). Los datos se transmiten con longitud byte y al finalizar cada uno se inserta un bit de reconocimiento ACK. Debe existir un modulo de arbitraje que gestione que solo hay un maestro en cada instante sobre el bus compartido. La figura muestra un esquema interno de funcionamiento del interfaz I 2C.
Figura 2.5.6.2a: Modo I 2C SSPBUF es el registro donde se almacena el byte a transmitir o el que se recibe. SSPSR es el registro desplazamiento serie de la línea E/S. SSPADD es el registro de direcciones que identifica el dispositivo (modo esclavo) o que lo direcciona (modo master). El registro de control SSPCON selecciona las diversas funciones del modo I 2C.. Cada vez que se detecta un bit de inicio o un bit de stop es posible que se active la bandera bandera SSPIF y en el caso de estar también también activado activado el bit de permiso permiso correspond correspondiente iente generar una interrupción.
2.5.7 Interfaz de comunicaciones serie (USART-SCI) La interfaz de comunicaciones SCI proporciona las mismas prestaciones que una UART programabl programable. e. Se pued puedee configura configurarr de dos dos modo modo diferentes diferentes::
Asíncrono (full-duplex) La comunicación es bidireccional. La patita RC6/Tx/CK actúa como línea de transmisión y la RC7/Rx/DT como línea de recepción. Cada dato lleva un bit de inicio y otro de stop.
Síncrono (semiduplex) 43
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Comunicación unidireccional. Una sola línea para los datos que se implementan sobre la patita RC7/Rx/D RC7/Rx/DT. T. Existen Existen dos modos, en el modo master master la señal de reloj sale por la patita RC6/Tx/CK y en el modo esclavo entra por ella. En ambos modo los datos pueden ser de 8 o 9 bits, pudiendo emplear el noveno como bit de paridad, transmitiéndose o recibiéndose recibiéndose por el bit <0> de RXSTA y/o RCSTA. El registro específico TXSTA actúa como registro de estado y control del transmisor y el RCSTA hace lo mismo para el receptor. La velocidad en baudios se establecen por el valor cargado en el registro SPBRG y el bit BRGH del registro TXSTA, con el que se puede elegir la velocidad alta (1) o baja (0) en el modo asíncrono. BAUDIOS = FOSC / (n(x + 1)) n = 4 en el modo síncrono n = 16 en el modo asíncrono de alta velocidad n = 64 en el modo asíncrono de baja velocidad x = valor cargado en el registro SPBRG y siendo x = (FOSC / Baudios) / (n – 1)
Mediante la programación de los bits del registro TXSTA y RCSTA se configura el modo de trabajo. Así, SPEN configura RC7/Rx y RC6/Tx como líneas de comunicación serie. El transmisor se activa con el bit TxEN. El dato a transmitir se carga en TxREG y luego pasa al registro transmisor TSR, cuando se haya transmitido el bit de stop del dato anterior. Entonces se activa la bandera TxIF y si el bit de permiso esta activado se produce una interrupción. Activando Tx8/9 se inserta el noveno bit almacenado en el bit <0> (TxD8) de TXSTA. El bit TRMT indica si el transmisor transmisor esta vacío vacío o no. El dato se recibe por RSR y cuando cuando se completa se pasa al registro RCREG para su posterior lectura, activándose la bandera RCIF y si acaso la interrupción. Si se activa el bit RC8/9del RCSTA el noveno bit se deposita en el bit <0> (RCD8) del RCST RCSTA. A. Los Los bits bits OERR OERR y FERR FERR indi indica cann error rror de desb desbor orda dami mieento nto y de tram trama, a, respectivamente. En la figura de la página siguiente se ofrece la asignación de funciones de los bits de los regi regist stro ross TXST TXSTA A y RCST RCSTA A que que gobi gobier erna nann al rece recept ptor or y tran transm smis isor or asín asíncr cron onos os,, respectivamente. En modo síncrono el SCI trabaja en half duplex, no pudiendo emitir y transmitir a la vez. La seña señall de relo relojj la enví envíaa el trans transmis misor or (mae (maestr stro) o) conju conjunt ntam amen ente te con con los los dato datos. s. Los Los principios principios y el funcionamiento funcionamiento de la emisión emisión y la recepción recepción sincronas sincronas son similares similares al modo asíncrono y únicamente hay que seleccionar esta forma de trabajo cargando adecuadamente los registros TXSTA y RCSTA. 44
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Figura 2.5.6a: Registro TXSTA La figura superior muestra el registro TXSTA donde el bit 7, CSRC, es el bit de selección de reloj siendo solo importante en el modo síncrono donde se elige entre maestro o esclavo. El bit 6 habilita la transmisión de 8 o 9 bits, en general, es TXEN, quien habilita la trans transmi misió sión. n. El bit SYNC SYNC sele selecc ccion ionaa el modo modo USAR USART T entre entre sínc síncron ronoo y asínc asíncro rono no.. Finalmente BRGH selecciona si el rango de baudios será de baja o alta velocidad en el modo asíncrono, TRMT es el bit de estado del registro de desplazamiento del transmisor y TX9D es el noveno bit de datos de transmisión. Se puede emplear como bit de paridad. La figura 2.5.6b de la página siguiente muestra el registro RCSTA donde el bit 7, SPEN, es el bit de habilitación habilitación del puerto serie. serie. El bit 6 habilita la recepción de 8 o 9 bits y SREN, bit 5, habilita habilita la recep recepción ción única única y CREN, CREN, bit bit 4, la recepc recepción ión continua. continua. Los bits bits 1 y 2 son son bits de error y finalmente, RX9D es el noveno bit de datos de recepción.
45
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Figura 2.5.6b: Registro RXSTA
2.5.8 Lectura y escritura de la memoria de datos EEPROM En la familia de microcontroladores 16F87X tanto la memoria EEPROM de datos como la memo memoria ria de progr program amaa FLAS FLASH H pue puede de ser ser modi modific ficad adaa sin sin nece necesid sidad ad de utili utiliza zarr un programado programadorr exterior. exterior. Se dispone de seis registros de SFR para leer y escribir sobre la memoria no volátil, estos registro registross son: son: EECON EECON1, 1, EECON EECON2, 2, EEDAT EEDATA, A, EEDATH EEDATH,, EEADR EEADR y EEAD EEADRH. RH. Para Para direccionar las 256 posiciones de la memoria EEPROM del PIC16F876 y 16F877 basta con 8 bit, por ello para escribir o leer solo hacen falta el registro EEADR para direccionar la posición posición y el registro EEDATA EEDATA para coloca colocarr el dato leído o escrito. Sin embarg embargoo para poder poder escribir o leer datos en la memoria FLASH que puede tener hasta 8K palabras de 14 bits hacen falta dos registros para direccionar la posición de memoria, por ello se utiliza el registro EEADR concatenado con el registro EEADRH que contiene la parte alta de la palabra palabra de direccionamie direccionamiento nto de memor memoria. ia. De forma similar similar se utilizan utilizan los los registros registros EEDA EEDATA TA concatenado con el registro EEADRH que contiene los 6 bit de mayor peso de las palabras de 14 bits. Además para controlar el proceso de lectura y escritura de la memoria EEPROM y FLASH se dispone de dos registros: el EECON1 y el EECON2.
46
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Figura 2.5.8 Registro EECON1 2.5.8.1 Lectura de la memoria de datos
Para leer un dato de la EEPROM, el registro EEADR es cargado con la dirección de la EEPROM donde se encuentra el dato y luego el microcontrolador copia el dato de dicha posición posición a EEDATA. EEDATA. A continuación continuación hay que poner poner a 0 el bit EEPGD (EECON1< (EECON1<7>), 7>), para apuntar a la memoria de datos EEPROM. Una vez que se ponga a 1 la bandera RD (EECON1<0>), el dato estará disponible en el registro EEDATA, donde permanecerá hasta la siguiente escritura o lectura. 2.5.8.2 Escritura de la memoria de datos
La escritura, que es en realidad una programación, es más compleja por razones de seguridad. Antes de escribir un dato en la EEPROM, debe ponerse a 1 la bandera de activ activac ació iónn de escr escritu itura ra WR (EEC (EECON ON1< 1<1> 1>). ). Para Para trans transfe ferir rir el dato dato desd desdee el regi registr stroo EEDATA a la dirección de la EEPROM a la que apunta EEADR, debe ejecutarse una secuencia obligatoria indicada por el fabricante. Posteriormente, cuando se ha realizado con éxit éxitoo la oper operac ació iónn de la band bander eraa EEIF EEIF (PIR (PIR1< 1<7> 7>)) se pone pone a 1. Si no lo hace hace,, el almacenamiento ha sido incorrecto y no se ha realizado. 2.6 Repertorio de instrucciones de la gama media
Habiendo escogido los diseñadores de PIC la filosofía RISC, su juego de instrucciones es reducido, siendo éstas, además, sencillas y rápidas, puesto que casi todas se ejecutan en un único ciclo de máquina (equivalente a 4 del reloj principal). Sus operandos son de gran flexibilidad, pudiendo actuar cualquier objeto como fuente y como destino. Para comprender estas instrucciones, ante todo es conveniente tener clara la estructura interna del microcontrolador, puesto que las instrucciones la referencian, y puesto que en cualquier micro la comprensión de la nomenclatura de sus componentes es esencial. De este 47
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
modo modo se expo expone ne la tabl tablaa siguie siguient ntee para para ayud ayudar arle le a comp compre rende nderr las las abre abrevi viat atura uras, s, y seguidamente las 35 instrucciones para la gama media. Abreviatur Abreviatura a
Descripci Descripción ón
PC
Contador de Programa que direcciona la memoria de instrucciones. Tiene un tamaño de 11 bits en la gama baja, de los cuales los 8 de menos peso configuran el registro PCL que ocupa el registro 0x02 del área de datos.
TOS
Cima de la pila, con 2 niveles en la gama baja y 8 en la media
WDT W F
D Dest TO PD b k
x
label [] () →
<> ∈
Perro guardián (Watchdog) Registro W, similar al acumulador Suele ser un campo de 5 bits (fffff) que contiene la dirección del banco de registros, que ocupa ocupa el banco 0 del área de datos. Direcciona uno de esos registros. Bit del código OP de la instrucción, que selecciona el destino. Si d=0, el destino es W, y si d=1 el destino es f. Destino (registro W o f) Bit “Time Out” del registro de estado Bit “Power Down” del registro de estado Suele ser un campo de 3 bits (bbb) que determinan la posición de un bit dentro de un registro de 8 bits Se trata, normalmente, de un campo de 8 bits (kkkkkkkk) que representa un dato inmediato. También puede constar de 9 bits en las instrucciones de salto que cargan al PC Valor indeterminado (puede ser un 0 o un 1). Para mantener la compatibilidad con las herramientas herramientas software de Microchip Microchip conviene hacer x = 0 Nombre de la etiqueta Opciones Contenido Se asigna a Campo de bits de un registro Pertenece al conjunto
Z
Señalizador de cero en W. Pertenece al registro de estado
C
Señalizador de acarreo en el octavo bit del W. Pertenece al registro de estado
DC
Señaliza el acarreo en el 4 bit del W. Pertenece al registro de estado
Itálicas
Términos definidos por el usuario
48
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
ADDLW Suma un literal
ADD ADDWF W + F
ANDLW W AND literal
Sintaxis: [label] ADDLW k Operandos: 0 ≤ k ≤ 255 Operación: (W) + (k)⇒ (W) Flags afectados: C, DC, Z Código OP: 11 111x kkkk kkkk Descripción: Suma el contenido del registro W y k, guardando el resultado en W.
Sintaxis: [label] ADDWF f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: (W) + (f) ⇒ (dest) Flags afectados: C, DC, Z Código OP: 00 0111 dfff ffff Descripción: Suma el contenido del registro W y el registro f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.
Sintaxis: [label] ANDLW k Operandos: 0 ≤ k ≤ 255 Operación: : (W) AND (k)⇒ (W) Flags afectados: Z Código OP: 11 1001 kkkk kkkk Descripción: Realiza Realiza la operació operaciónn lógica AND entre el conteni contenido do del registro W y k, guardando el resultado en W.
Ejemplo:
Ejemplo:
Ejemplo:
ADDLW 0xC2
Antes: W = 0x17 Después: W = 0xD9
ADDWF REG,0
Antes: W = 0x17., REG = 0xC2 Después: W = 0xD9, REG = 0xC2
AND ANDWF W AND AND F
BCF
Sintaxis: [label] ANDWF f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: (W) AND (f) ⇒ (dest) Flags afectados: Z Código OP: 00 0101 dfff ffff
Sintaxis: [label] BCF f,b Operandos: 0 ≤ f ≤ 127, 0 ≤ b ≤ 7 Operación: 0 ⇒ (f
) Flags afectados: Ningu afectados: Ninguno no Código OP: 01 00bb bfff ffff
Descripción: Realiza Realiza la operació operaciónn lógica AND entre los registros W y f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.
Descripción: Borr orra el bit bit b del registro f
Ejemplo: :
Ejemplo:
ANDWF REG,0
Antes: W = 0x17., REG = 0xC2 Des ués: W = 0x17, 0x17, REG REG = 0x02 0x02
Borra un bit
ADDLW 0xC2
Antes: W = 0x17 Después: W = 0xD9 BSF
Activa un bit
Sintaxis: [label] BSF f,b Operandos: 0 ≤ f ≤ 127, , 0 ≤ b ≤ 7 Operación: 1 ⇒ (f) Flags afectados: Ningu afectados: Ninguno no Código OP: 01 01bb bfff ffff Descripción: Acti Activa va el bit b del del registro f
BCF REG,7 Ejemplo: :
Antes: REG = 0xC7 Des ués: ués: REG REG = 0x47 0x47
BSF REG,7
Antes: REG = 0x0A
BTFSC Test de de bit y salto
BTFSS Test de bit y salto
CAL CALL
Sintaxis: [label] BTFSC f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: Salto si (f) = 0 Flags afectados: Ningu afectados: Ninguno no Código OP: 01 10bb bfff ffff
Sintaxis: [label] BTFSS f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: Salto si (f) = 1 Flags afectados: Ningu afectados: Ninguno no Código OP: 01 11bb bfff ffff
Sintaxis: [label] CALL k Operandos: 0 ≤ k ≤ 2047 Operación: PC ⇒ Pila; k ⇒ PC Flags afectados: Ningu afectados: Ninguno no Código OP: 10 0kkk kkkk kkkk
Descripción: Si el bit b del registro f es 0, se salta una instrucción y se continúa con la ejecución. En caso de salto, ocupará dos ciclos de reloj.
Descripción: Si el bit b del registro f es 1, se salta una instrucción y se continúa con la ejecución. En caso de salto, ocupará dos ciclos de reloj.
Descripción: Salto a una subrutina. La parte baja de k se carga en PCL, y la alta en PCLATCH. Ocupa 2 ciclos de reloj.
Ejemplo:
Ejemplo:
Ejemplo:ORIGEN Ejemplo:ORIGEN CALL DESTINO
BTFSC REG,6 GOTO NO_ES_0 SI_ES_0 Instrucción NO_ES_0 Instrucción
BTFSS REG,6 GOTO NO_ES_0 SI_ES_0 Instrucción NO_ES_0 Instrucción
Salt alto a subru ubruttina
Antes: PC = ORIGEN Después: PC = DESTINO
49
María Aranda Elcuaz
CLR CLRF
Universidad Universid ad Pública de Navarra
Borr Borraa un reg regist istro
CLRW Borra el registro W
CLRWDT Borra el WDT
Sintaxis: [label] CLRF f Operandos: 0 ≤ f ≤ 127 Operación: : 0x00 ⇒ (f), 1 ⇒ Z Flags afectados: Z Código OP: 00 0001 1fff ffff
Sintaxis: [label] CLRW Operandos: Ninguno Operación: : 0x00 ⇒ W, 1 ⇒ Z Flags afectados: Z Código OP: 00 0001 0xxx xxxx
Descripción: El registro f se carga con 0x00. El flag Z se activa.
Descripción: El registro de trabajo W se carga con 0x00. El flag Z se activa.
Sintaxis: [label] CLRWDT Operandos: Ningu Operandos: Ninguno no Operación: 0x00 ⇒ WDT, 1 ⇒ /TO 1 ⇒ /PD Flags afectados: /TO, /PD Código OP: 00 0000 0110 0100 Descripción: Esta instrucción borra tanto el WDT como su preescaler. Los bits /TO y /PD del registro de estado se ponen a 1.
Ejemplo: : Ejemplo: :
CLRF REG
Antes: W = 0x5A Después: W = 0x00, Z = 1
Antes: REG = 0x5A Des ués: ués: REG = 0x00, 0x00, Z = 1
COMF COMF
CLRW
Compl omplem emeento nto de f
Ejemplo: : CLRWDT Después: Contador WDT = 0, Preescales WDT = 0, /TO = 1, /PD = 1
DECF Decremento de f
DECFSZ Decremento y salto
Sintaxis: [label] COMF f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: : (/ f), 1 ⇒ (dest) Flags afectados: Z Código OP: 00 1001 dfff ffff
Sintaxis: [label] DECF f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: : (f ) – 1 ⇒ (dest) Flags afectados: Z Código OP: 00 0011 dfff ffff
Sintaxis: [label] DECFSZ f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: (f) -1 ⇒ d; Salto si R=0 Flags afectados: Ningu afectados: Ninguno no Código OP: 00 1011 dfff ffff
Descripción: El registro f es complementado. El flag Z se activa si el resu resultad ltadoo es 0. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f..
Descripción: Decrem Decremen enta ta en 1 el contenido de f. Si d es 0, el resultado se almac almacen enaa en W, si d es 1 se almacena en f.
Descripción: Decre crementa el contenido del registro f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f. Si la resta es 0 salta la siguiente instrucción, en cuyo caso costaría 2 ciclos.
Ejemplo: :
Ejemplo: :
COMF REG,0
DECF CONT,1 Ejemplo:
Antes: REG = 0x13 Después: REG = 0x13, W = 0XEC
GOTO GO TO
Salt Saltoo inco incond ndic icio iona nall
Antes: CONT = 0x01, Z = 0 Después: CONT = 0x00, Z = 1
DECFSC REG,0 GOTO NO_ES_0 SI_ES_0 Instrucción NO_ES_0 Salta instrucción anterior
INCF Incremento de f
INCFSZ Incremento y salto
Sintaxis: [label] GOTO k Operandos: 0 ≤ k ≤ 2047 Operación: k ⇒ PC <8:0> Flags afectados: Ningu afectados: Ninguno no Código OP: 10 1kkk kkkk kkkk
Sintaxis: [label] INCF f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: : (f ) + 1 ⇒ (dest) Flags afectados: Z Código OP: 00 1010 dfff ffff
Sintaxis: [label] INCFSZ f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: (f) -1 ⇒ d; Salto si R=0 Flags afectados: Ningu afectados: Ninguno no Código OP: 00 1111 dfff ffff
Descripción: Se trat trataa de un salto salto incondicional. La parte baja de k se carga en PCL, y la alta en PCLATCH. Ocupa 2 ciclos de reloj.
Descripción: Incr Increm emen enta ta en 1 el contenido de f. Si d es 0, el resultado se almac almacen enaa en W, si d es 1 se almacena en f.
Ejemplo: DESTINO
Ejemplo:
Descripción: Incrementa el contenido del registro f. Si d es 0, el resultado resultado se almacena en W, si d es 1 se almacena en f. Si la resta es 0 salta la siguiente instrucción, en cuyo caso costaría 2 ciclos.
ORIGEN
Antes: PC = ORIGEN Después: PC = DESTINO
GOTO
INCF CONT,1
Antes: CONT = 0xFF, Z = 0 Después: CONT = 0x00, Z = 1
Ejemplo:
INCFSC REG,0 GOTO NO_ES_0 SI_ES_0 Instrucción NO_ES_0 Salta instrucción anterior
50
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
IORLW W OR literal
IORWF W AND F
MOVLW Cargar literal en W
Sintaxis: [label] IORLW k Operandos: 0 ≤ k ≤ 255 Operación: : (W) OR (k)⇒ (W) Flags afectados: Z Código OP: 11 1000 kkkk kkkk
Sintaxis: [label] IORWF f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: (W) OR (f) ⇒ (dest) Flags afectados: Z Código OP: 00 0100 dfff ffff
Sintaxis: [label] MOVLW f Operandos: 0 ≤ f ≤ 255 Operación: (k) ⇒ (W) Flags afectados: Ningu afectados: Ninguno no Código OP: 11 00xx kkkk kkkk
Descripción: Se realiza la operación lógica lógica OR entre entre el conte conteni nido do del del registro W y k, guardando el resultado en W.
Descripción: Realiza Realiza la operaci operación ón lógica OR entre los registros W y f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.
Descripción: El lite litera rall k pasa pasa al registro W.
Ejemplo:
Ejemplo:
Ejemplo:
IORLW 0x35
Antes: W = 0x9A Después: W = 0xBF
MOVF
Antes: W = 0x91, REG = 0x13 Después: W = 0x93, REG = 0x13
Mover a f
Sintaxis: [label] MOVF f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: (f) ⇒ (dest) Flags afectados: Z Código OP: 00 1000 dfff ffff Descripción: El contenido del registro f se mueve al destino d. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f. Permite verificar el registro, puesto que afecta a Z. Ejemplo:
IORWF REG,0
MOVWF
Mover a f
MOVLW 0x5A
Después: REG = 0x4F, W = 0x5A
NOP
No operar
Sintaxis: [label] MOVWF f Operandos: 0 ≤ f ≤ 127 Operación: W ⇒ (f) Flags afectados: Ningu afectados: Ninguno no Código OP: 00 0000 1fff ffff
Sintaxis: [label] NOP Operandos: Ningu Operandos: Ninguno no Operación: No operar Flags afectados: Ninguno Ninguno Código OP: 00 0000 0xx0 0000
Descripción: El contenido del registro W pasa el registro f.
Descripción: No realiza operación alguna. En realidad consume un ciclo de instrucción sin hacer nada.
Ejemplo:
Ejemplo:
MOVF REG,0 MOVWF REG,0
Después: W = REG Antes: REG = 0xFF, W = 0x4F Después: REG = 0x4F, W = 0x4F
CLRWDT
Después: Contador WDT = 0, Preescales WDT = 0, /TO = 1, /PD = 1
RETFIE Retorno Retorno de interrup. interru p.
RETLW Retorno, carga W
RETURN Retorno de rutina
Sintaxis: [label] RETFIE Operandos: Ninguno Operación: : 1 ⇒ GIE; TOS⇒PC Flags afectados: Ninguno Ninguno Código OP: 00 0000 0000 1001
Sintaxis: [label] RETLW k Operandos: 0 ≤ k ≤ 255 Operación: : (k)⇒ (W); TOS⇒PC Flags afectados: Ninguno Ninguno Código OP: 11 01xx kkkk kkkk
Sintaxis: [label] RETURN Operandos: Ninguno Operación: : TOS ⇒ PC Flags afectados: Ninguno Ninguno Código OP: 00 0000 0000 1000
Descripción: El PC se carga con el contenido de la cima de la pila (TOS): direc direcció ciónn de retorn retorno. o. Cons Consum umee 2 ciclos. Las interrupciones vuelven a ser habilitadas.
Descripción: El registro W se carga con la constante k. El PC se carga con el contenido de la cima de la pila (TOS): dirección de retorno. Consume 2 ciclos.
Descripción: El PC se carga con el contenido de la cima de la pila (TOS): direc direcció ciónn de retorn retorno. o. Cons Consum umee 2 ciclos.
Ejemplo:
Ejemplo:
Ejemplo:
RETFIE
Después: PC = dirección de retorno GIE = 1
RETLW 0x37
Después: PC = dirección de retorno =
RETURN
Después: PC = dirección de retorno
51
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
RLF Rota f a la izquierda
RRF
Sintaxis: [label] RLF f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: Rotación a la izquierda Flags afectados: C Código OP: 00 1101 dfff ffff
Sintaxis: [label] RRF f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: Rotación a la derecha Flags afectados: C Código OP: 00 1100 dfff ffff
Descripción: El contenido de f se rota a la izquierda. El bit de menos peso de f pasa al carry (C), y el carry se coloca en el de mayor peso. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.
Descripción: El contenido de f se rota a la derecha. El bit de menos peso de f pasa al carry (C), y el carry se coloca en el de mayor peso. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.
Descripción: El bit de energía se pone a 0, y a 1 el de descanso. El WDT y su preescaler se borran. El micro para el oscilador, llendo al modo “durmiente”.
Ejemplo:
Ejemplo:
Ejemplo: :
RRF REG,0
Antes: REG = 1110 0110, C = 0 Después: REG = 1110 0110, W = 1100 1100, C = 1
Rota f a la derecha
RRF REG,0
Antes: REG = 1110 0110, C = 1 Después: REG = 1110 0110, W = 01110 0011, C = 0
SUBLW Resta Literal - W
SUBWF
Sintaxis: [label] SUBLW k Operandos: 0 ≤ k ≤ 255 Operación: ( k ) - (W) ⇒ (W) Flags afectados: Z, C, DC Código OP: 11 110x kkkk kkkk Descripción: Mediante el método del complemento a dos el contenido de W es restado al literal. El resultado se almacena en W.
Sintaxis: [label] SUBWF f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: ( f ) – (W )⇒ (dest) Flags afectados: C, DC, Z Código OP: 00 0010 dfff ffff Descripción: Mediante el método del complemento a dos el contenido de W es restado al de f. . Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.
Ejemplos:
Antes:W=1,C=?. Después: W=1, C=1 Antes:W=2,C=?. Después: W=0, C=1 Antes:W=3,C=?.Después:W=FF,C=0 (El resultado es negativo)
Ejemplos: SUBWF REG,1 Antes: REG = 0x03, W = 0x02, C = ? Después:REG=0x01, W = 0x4F, C=1 Antes: REG = 0x02, W = 0x02, C = ? Después:REG=0x00, W =0x02, C= 1 Antes: REG= 0x01, W= 0x02, C= ? Después:REG=0xFF, W=0x02, C= 0 (Resultado negativo)
XORLW W OR literal
XORW XORWF F W AND AND F
Sintaxis: [label] XORLW k Operandos: 0 ≤ k ≤ 255 Operación: : (W) XOR (k)⇒ (W) Flags afectados: Z Código OP: 11 1010 kkkk kkkk
Sintaxis: [label] XORWF f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: (W) XOR (f) ⇒ (dest) Flags afectados: Z Código OP: 00 0110 dfff ffff
Descripción: Se realiza la operación lógica lógica XOR entre entre el conteni contenido do del registro W y k, guardando el resultado en W.
Descripción: Realiza Realiza la operaci operación ón lógica XOR entre los registros W y f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.
Ejemplo: :
Ejemplo: :
SUBLW 0x02
XORLW 0xAF
Antes: W = 0xB5 Después: W = 0x1A
Resta f – W
SLEEP Modo bajo consumo Sintaxis: [label] SLEEP Operandos: Ningu Operandos: Ninguno no Operación: 0x00⇒WDT, 1 ⇒ / TO 0 ⇒ WDT Preescaler, 0 ⇒ / PD Flags afectados: / PD, / TO Código OP: 00 0000 0110 0011
SLEEP
Preescales WDT = 0, /TO = 1, /PD = 1
SWAPF Intercambio de f Sintaxis: [label] SWAPF f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: : (f <3: 0>)⇔ (f <7:4>) Flags afectados: Ninguno Ninguno Código OP: 00 1110 dfff ffff Descripción: Los 4 bits de más peso y los 4 de menos son intercambiados. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f. Ejemplo: :
SWAPF REG,0
Antes: REG = 0xA5 Después: REG = 0xA5, W = 0x5A
La gama media tiene un total de 35 instrucciones, cada una de las cuales ocupan 14 bits.
XORWF REG,0
Antes: W = 0xB5, REG = 0xAF Después: W = 0xB5, REG = 0x1A
52
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Capítulo 3. Herramientas de trabajo Para la realización de las prácticas será necesario disponer de cierto material físico y algunos programas informáticos: Hardware necesario: - Tarje Tarjeta ta entr entren enad adora ora Picd Picdem em 2 Plu Pluss de Mic Microc rochip hip - In-C In-Cir ircu cuit it Debug bugger ger ICD ICD 2 - PIC 16F877 Software necesario: - Microc Microchip hip MPLAB MPLAB IDE con con Plug Plug-in -in de de CCS CCS instal instalado ado 3.1 Placa de pruebas: PICDEM 2 PLUS
Sobre la placa de pruebas PICDEM 2 PLUS de Microchip se realizarán todas las prácticas propuestas propuestas en el capítulo capítulo 4; se presenta presenta a continuació continuaciónn un listado de sus característic características as generales:
1) Posee Posee 3 módulos módulos para la conexió conexiónn de microcontro microcontroladore ladoress de 18, 28 y 40 40 pines que que en ningún caso podrán ser utilizados al mismo tiempo. 2) Regulado Reguladorr de +5 V para entrada entradass de corriente corriente 9 V, 100 100 mA AC/DC, AC/DC, pila de 9V o +5 +5 V de corriente continua regulada para la alimentación de la placa. 3) Conexión Conexión serie serie RS-232 y hardwar hardwaree asociado asociado (MAX232A (MAX232A para para ajustar ajustar niveles) niveles) para comunicar la tabla con distintos dispositivos externos como puede ser, por ejemplo, un ordenador. 4) Conector Conector para para el depura depurador dor y grabador grabador en circuito circuito ICD 2 5) Potencióme Potenciómetro tro de 5 KΩ para para entradas entradas analógic analógicas, as, conectad conectadoo a RA0 a través través de una resistencia de 470 Ω. 6) 3 pulsadores pulsadores para para impulsos impulsos externos externos (RA4 (RA4 y RB0) RB0) y botón de reset. reset. Si se presiona presionann se ponen a 0, si no, permanecen a nivel alto. 7) Led Led verde verde de indic indicaci ación ón de ence encendi ndido do 53
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
8) 4 Leds rojos rojos conecta conectados dos al Puerto Puerto B de cada cada uno de los los microcontrol microcontroladore adoress 9) Jumper Jumper J6 J6 para para la desco desconex nexión ión de los los leds leds 10) Oscilador Oscilador de 4 MHz MHz 11) Conectores vacíos para otros osciladores osciladores 12) Cristal de 32.768 KHz para la operación de TMR1 13) Jumper J7 para la desconexión desconexión del oscilador RC 14) EEPROM 32k x 8 serie para comunicación comunicación I2C 15) Pantalla Pantalla LCD con dos líneas de 16 caracteres caracteres cada una. Las líneas líneas de control son RA3:RA1 y cuatro líneas de datos (RD3:RD0)
16) Buzzer Buzzer 17) Área de conexión conexión de hardware libre 18) 18) Sens Sensor or de temp temper erat atura ura TC74 TC74 cone conect ctad adoo a los los micr micros os a travé travéss de RC3 RC3 y RC4 RC4 compatible con la comunicación I2C En la siguiente tabla se puede ver un resumen de las conexiones de entrada y salida:
3.2 Software de programación
MPLAB MPLAB IDE es un con conjun junto to de herram herramien ientas tas que permite permite el desar desarroll rolloo compl completo eto de proyectos proyectos siguien siguiendo do las las siguientes siguientes fases: fases: 1) Editar Editar el programa: programa: Estas Estas práctica prácticass serán diseñad diseñadas as en lenguaje lenguaje C en el editor editor de textos de MPLAB, pero se pueden realizar en cualquier otro lenguaje, ya sea de bajo nivel como el ensamblador u otros de alto nivel como el Visual Basic etc. 2) Co Comp mpila ilarr o ensa ensamb mbla larr el prog progra rama ma fuente fuente,, es deci decir, r, conv conver ertir tir a códi código go máqu máquina ina ejecutable el programa fuente editado en la fase anterior. Para poder compilar el programa programa será necesario necesario tener instalado instalado el Plug-in de CCS y para ensamblarlo ensamblarlo habrá que emplear el programa MPASWIN que incluye MPLAB IDE.
54
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
3) Simular Simular el programa: programa: Antes Antes de grabar grabar el programa programa en la memoria memoria del del PIC, conviene conviene comprobar si el funcionamiento del programa es correcto. Para ello se puede simular por software software con el simulador simulador que incluye MPLAB. MPLAB. No es una fase obligatoria, obligatoria, es opcional pero conveniente. 4) Grab Grabac ació iónn del del PIC: PIC: Para Para la grab grabac ació iónn del del micr microc ocont ontro rola lado dorr se utili utiliza zará rá el ICD2 ICD2 conectado al PC.
3.2.1 Cómo usar MPLAB 3.2.1.1 Creación de proyectos
MPLAB es un Entorno de Desarrollo Integrado (IDE) fácil de aprender y fácil de usar. La caract caracterís erística tica IDE propor proporcio ciona na a los desar desarroll rollado adores res de softwar softwaree para para aplica aplicacio ciones nes la flexibilidad para editar, compilar, emular, simular, desarrollar y depurar su propio software para las familias familias de microcontrola microcontroladores dores PIC16/17 PIC16/17 de Microchip. Microchip. Para crear un nuevo proyecto se debe ir a Project>Project Wizard, tal y como se indica en la figura siguiente. Una vez ahí, se abrirá un asistente de creación de proyectos donde habrá que seguir unos pasos sencillos para la configuración del proyecto.
1) Selección Selección del modelo modelo de microcont microcontrolado roladorr a emplear emplear de una lista. En el caso caso de estas estas prácticas prácticas se se elegirá elegirá el PIC16 PIC16F877. F877. 2) Selec Selecció ciónn del lenguaje lenguaje y compilado compiladorr a emplear emplear así como como la ubicac ubicación ión de este en el PC, en este caso, se utilizará el compilador de Ccs tal y como se indica en la figura.
55
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Si el programa se realiza en otro lenguaje habrá que seleccionar otro compilador. Por ejemplo si se ha realizado en lenguaje ensamblador, en este paso habrá que seleccionar “MPASM Assembler” que se encuentra en la carpeta donde se ha instalado el MPLAB IDE. 3) Dar un nombre nombre al proyec proyecto to y elegir elegir la carpeta carpeta donde se desea desea guardar. guardar.
4) Seleccionar los archivos de código fuente y las librerías necesarias para llevar a cabo el proyecto.
56
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
En caso de no haber creado todavía el código fuente, no habría más que crearlo en el editor de textos del propio programa o en cualquier otro editor de textos. En MPLAB sería File>New, una vez escrito se guarda pulsando File>Save. Después de seguir todos los pasos el programa realiza un resumen, ahí se pulsa Finalizar y se sale sale del del asist asisten ente te.. En este este punt puntoo cabe cabe dest destac acar ar que que lo reali realiza zado do hast hastaa ahor ahoraa es simplemente la creación del código fuente y la configuración de las aplicaciones que se van a emplear. El siguiente paso es la compilación. 3.2.1.2 Compilación del programa
Una vez realizado el proyecto es tan sencillo como darle al botón de compilar tal y como se indica en la figura de la página siguiente.
Si el programa no tiene fallos nos saldrá un mensaje de que se ha compilado con éxito “Build Sucedded”, si tiene algún error saldrá un mensaje e indicará en que línea o parte del programa programa se ha produci producido, do, habrá habrá que que corregirl corregirloo y volver volver a compila compilar. r. Una vez Una vez comp compila ilado do corre correct ctam amen ente te se habr habráá gene genera rado do en la carpe carpeta ta previa previame mente nte seleccionada un archivo de igual nombre al código fuente pero con extensión .hex. Este archivo es el mismo pero traducido a código máquina, de tal forma que el PIC pueda comprender las ordenes indicadas en el programa. Si el programa ha sido realizado en lenguaje ensamblador en vez de en lenguaje C simplemente en vez de aparecer la opción “Compile” aparecerá la opción “Assemble” y todo lo demás será exactamente igual a lo explicado para el lenguaje C. 3.2.1.3 Programación
Una vez generado el archivo en código máquina solamente queda pasarlo del ordenador al microcontrolador. Para ello será necesario un programador que, en este caso, será el MPLAB ICD 2 de Microchip. Una vez conectado vía USB al ordenador y después a la tarjeta entrenadora Picdem 2 Plus. Habrá que seleccionarlo y conectarlo en el MPLAB IDE tal y como se ve en la figura: Programmer>Select Programmer>Mplab Icd 2
57
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Una vez seleccionado habrá que pulsar el icono “Program tarjet device” y el programa quedará grabado en el PIC.
58
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
3.3 Lenguaje C.
En este punto de proyecto no se pretende explicar cómo se programa en este lenguaje, sino hacer un listado de las directivas y funciones permitidas por el compilador PCW de CCS, compilador específico para microcontroladores de la casa Microchip. Así pues, se parte de la idea de que el lector posee conocimientos básicos de este lenguaje u otros lenguajes de alto nivel.
3.3.1 Operadores y expresiones Una expresión de asignación tradicional es de la forma expr1 = expr1 operador expr2 , pero también también pued puedee ser representa representada da por otra más corta expr1 operador = expr2. En la siguiente tabla se resumen los operadores de asignación compuesta y su significado:
Los operadores aritméticos empleados para realizar operaciones matemáticas son:
La misión de los operadores relacionales es comparar dos operandos y dar un resultado entero, 1 si es verdadero y 0 si es falso:
59
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Los operadores lógicos , al igual que los operadores relacionales, devuelve 1 o 0 tras la evaluación de sus operandos. En la tabla siguiente se ilustran estos operadores:
Los operadores de manejo de bits permiten actuar sobre los operandos a nivel de bits y sólo pueden ser de tipo entero (incluyendo el tipo char). Son los que siguen:
Las expresiones empleadas se exponen en la siguiente tabla:
3.3.2 Directivas del preprocesador Todas las directivas del preprocesador comienzan con el carácter # seguido por un comando específico. Algunas de estas directivas son extensiones del C estándar. El C proporciona proporciona una directiva directiva del preprocesa preprocesador, dor, que los compiladore compiladoress aceptan, aceptan, y que permite permite ignorar o actuar sobre los datos que siguen. El compilador de CCS admite cualquier directiva del preprocesador que comience con PRAGMA, lo que asegura la compatibilidad con otros compiladores. A continuación se describen algunas directivas del compilador que se emplearán para programar programar los los microcontr microcontrolado oladores res PIC en estas estas práctica prácticas. s. 3.3.2.1 Control de memoria
#BIT identificador = x.y Esta directiva creará un identificador "id" que puede utilizarse como cualquier SHORT INT (entero corto; un bit). El identificador hará referencia a un objeto en la posición de memoria x más el bit de desplazamiento y.
#BYTE identificador = X 60
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Esta directiva creará un identificador “id” que puede utilizarse como cualquier INT (un byte). byte). El identificador identificador hará referencia referencia a un objeto objeto en la posición posición de memoria memoria x, dond dondee x puede puede ser una constante constante u otro identificador. identificador. Si x es otro identificador, identificador, entonces entonces éste estará localizado en la misma dirección que el identificador “id”.
#RESERVE Permite reservar posiciones de la RAM para uso del compilador. #RESERVE debe aparecer después de la directiva #DEVICE, de lo contrario no tendrá efecto. 3.3.2.2 Directivas del C estándar
#DEFINE identificador CADENA Se utiliza simplemente para reemplazar el identificador (ID) con CADENA
#IF expresión_constante #ELSE #ENDIF El preprocesador evalúa la expresión_constante y si es distinta de cero procesará las líneas hasta el #ELSE o en su defecto hasta el #ENDIF.
#INCLUDE #INCLUDE "Nombre_Fichero" "Nombre_Fichero" Esta directiva hace que el compilador incluya en el fichero fuente el texto que contiene el archivo especificado en . 3.3.2.3 Especificación de dispositivos
#FUSES opciones Esta directiva define qué fusibles deben activarse en el dispositivo cuando se programe. Esta directiva no afecta a la compilación; sin embargo, esta información es necesaria para algunos programadores de dispositivos. Algunas de las opciones más usadas son: LP, XT, HS, RC WDT, NOWDT PROTECT, NOPROTECT PUT, NOPUT (Power Up Timer) BROWNOUT, NOBROWNOUT SWAP 3.3.2.4 Librerías incorporadas
#USE DELAY (CLOCK=frecuencia) (CLOCK=frecuencia) Esta directiva indica al compilador la frecuencia del procesador, en ciclos por segundo, a la vez que habilita el uso de las funciones DELAY_MS() y DELAY_US(). 61
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
#USE FAST_IO (puerto) Esta directiva afecta al código que el compilador generará para las instrucciones de entrada y salida. Este método rápido de hacer I/O ocasiona que el compilador realice I/O sin programar programar el el registro registro de direcc dirección. ión.
#USE I2C (master/slave, SDA=Pin, SCL=Pin opciones) La librería I2C contiene funciones para implementar un bus I2C. La directiva #USE I2C permanece permanece efectiv efectivaa para las funcion funciones es I2C_STA I2C_START, RT, I2C_STOP I2C_STOP,, I2C_READ, I2C_READ, I2C_WRIT I2C_WRITE Ee I2C_POLL hasta que se encuentre otra directiva #USE I2C. Las opciones son:
#USE RS232 (BAUD=baudios, XMIT=pin, RCV=pin...) Esta directiva le dice al compilador la velocidad en baudios y los pines utilizados para la I/O serie. Esta directiva tiene efecto hasta que se encuentra otra directiva RS232. La directiva #USE DELAY debe aparecer antes de utilizar #USE RS232. Esta directiva habilita el uso de funciones tales como GETCH, PUTCHAR y PRINTF. Las opciones son:
#USE STANDARD_IO (puerto) Esta directiva afecta al código que el compilador genera para las instrucciones de entrada y salida. El método estándar de hacer I/O causará que el compilador genere código para hacer que un pin de I/O sea entrada o salida cada vez que se utiliza. En los procesadores de la serie 5X esto necesita un byte de RAM para cada puerto establecido como I/O estándar. 62
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
3.3.3 Funciones 3.3.3.1 Funciones de i/o serie rs232
c = GETC() c = GETCH() c = GETCHAR() Estas funciones esperan un carácter por la patilla RCV del dispositivo RS232 y retorna el carácter recibido. Es preciso utilizar la directiva #USE RS232 antes de la llamada a esta función para que el compilador pueda determinar la velocidad de transmisión y la patilla utilizada. La directiva #USE RS232 permanece efectiva hasta que se encuentre otra que anule la anterior. Los procedimientos de I/O serie exigen incluir #USE DELAY para ayudar a sincronizar de forma correcta la velocidad de transmisión.
PUTC() PUTCHAR() Estas funciones envían un carácter a la patilla XMIT del dispositivo RS232. Es preciso utilizar utilizar la directiva #USE RS232 antes de la llamada a esta función para que el compilador compilador pueda pueda determina determinarr la velocida velocidadd de transmisi transmisión ón y la patilla utilizada. utilizada. La directiv directivaa #USE RS232 RS232 permanece permanece efectiva efectiva hasta hasta que que se encuentre encuentre otra otra que que anule anule la anterior anterior..
PUTS(string) Esta función envía cada carácter de string a la patilla XMIT del dispositivo RS232. Una vez concluido el envío de todos los caracteres la función envía un retorno de carro CR o RETURN (ASCII 13) y un avance de línea LF o LINE-FEED (ASCII 10).
PRINTF([function], string, [values]) La función de impresión formateada PRINTF saca una cadena de caracteres al estándar serie RS-232 o a una función especificada. El formato está relacionado con el argumento que ponemos ponemos dentro dentro de la cadena cadena (string). (string). Cuando se usan variables, string debe ser una constante. El carácter % se pone dentro de string para indicar un valor variable, seguido de uno o más caracteres que dan formato al tipo de información a representar. Si ponemos %% obtenemos a la salida un solo %. El formato tiene la forma genérica %wt, donde w es optativo y puede ser 1,2,...,9. Esto es para especificar cuántos carácteres son representados; si elegimos el formato 01,...,09 indicamos ceros a la izquierda, o también 1.1 a 9.9 para representación en punto flotante. t es el tipo de formato y puede ser uno de los siguientes:
63
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
SET_UART_SPEED(baud) Esta función cambia la velocidad de transmisión de la UART (Universal Asynchronous Receiver Transmitter) en tiempo de ejecución.
SETUP_ADC(mode) Esta sta fun función ción conf config iguura (pe (permit rmitee estab stable lece cerr analógico/digital. Los modos son los siguientes:
los los pará parám metro tros) del del
conve onvers rsor or
ADC_OFF ADC_CLOCK_DIV_2 ADC_CLOCK_DIV_8 ADC_CLOCK_DIV_32 ADC_CLOCK_INTERNAL 3.3.3.2 Funciones de I/O discreta
INPUT(pin) Devuelve el estado '0' o '1' de la patilla indicada en pin. El método de acceso de I/O depende de la última directiva #USE *_IO utilizada. El valor de retorno es un entero corto.
OUTPUT_BIT(pin, OUTPUT_BIT(pin, value) Esta función saca el bit dado en value(0 o 1) por la patilla de I/O especificada en pin. El modo de establecer la dirección del registro, está determinada por la última directiva #USE *_IO.
OUTPUT_HIGH(pin) Pone a 'uno' el pin indicado. El método de acceso de I/O depende de la última directiva #USE *_IO utilizada.
OUTPUT_LOW(pin) Pone a 'cero' el pin indicado. El método de acceso de I/O depende de la última directiva #USE *_IO. 64
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
SET_TRIS_A(value) SET_TRIS_B(value) SET_TRIS_C(value) SET_TRIS_D(value) SET_TRIS_E(value) Esta Estass func funcio ione ness perm permite itenn escr escribi ibirr dire directa ctame mente nte los los regi regist stro ross tri-e tri-esta stado do para para la configuración de los puertos. Esto debe usarse con FAST_IO() y cuando se accede a los puertos puertos de I/O como si fueran memoria, memoria, igual que cuando cuando se utiliza una directiva directiva #BYTE. #BYTE. Cada bit de value representa una patilla. Un '1' indica que la patilla es de entrada y un '0' que es de salida. 3.3.3.3 Funciones de retardos
DELAY_CYCLES(count) Esta función realiza retardos según el número de ciclos de instrucción especificado en count; los valores posibles van desde 1 a 255. Un ciclo de instrucción es igual a cuatro periodos periodos de reloj.
DELAY_MS(time) Esta función realiza retardos del valor especificado en time. Dicho valor de tiempo es en milis iliseegundo ndos y el rango es 0-65 -65535. Es prec reciso iso utiliz ilizaar la dire irectiva iva #use delay(clock=frecuencia) antes de la llamada a esta función, para que el compilador sepa la frecuencia de reloj.
DELAY_US(time) Esta Esta func funció iónn real realiza iza reta retard rdos os del del valo valorr espe especi cific ficad adoo en time. time. Dich Dichoo valo valorr es en microsegundos y el rango va desde 0 a 65535. Es necesario utilizar la directiva #use delay antes de la llamada a esta función para que el compilador sepa la frecuencia de reloj. 3.3.3.4 Funciones de control del procesador
DISABLE_INTERRUPTS(level) Esta función desactiva la interrupción del nivel dado en level. El nivel GLOBAL prohíbe todas las interrupciones, aunque estén habilitadas o permitidas. Los niveles de interrupción son:
ENABLE_INTERRUPTS(level) Esta función activa la interrupción del nivel dado en level. Queda a cargo del técnico definir un procedimiento o rutina de atención, para el caso que se produzca la interrupción 65
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
indicada. El nivel GLOBAL permite todas las interrupciones que estén habilitadas de forma individual.
SLEEP() Esta función pone al micro en un estado de REPOSO. 3.3.3.5 Contadores/Temporizadores
GET_RTCC() GET_TIMER0() GET_TIMER1() i=GET_TIMER2() Estas funciones devuelven el valor de la cuenta de un contador en tiempo real. RTCC y Timer0 son el mismo. Timer1 es de 16 bits y los otros son de 8 bits.
RESTART_WDT() Esta función reiniciará el timer del watchdog. Si habilitamos el timer del watchdog, debe llamarse periódicamente a RESTART_WDT() para prevenir el reseteo del procesador.
SET_RTCC(value) SET_TIMER0(value) SET_TIMER1(value) SET_TIMER2(value) Estas funciones activan el timer o temporizador al valor especificado. RTCC y Timer0 son el mismo. Timer1 es de 16 bits y los otros son de 8 bits.
SETUP_TIMER_1(mode) Esta función inicializa el timer1. Los valores de mode deben ordenarse juntos, tal como se mues muestra tra en el ejemp ejemplo lo.. El valo valorr del del time timerr pued puedee leer leerse se y pued puedee escr escrib ibirs irsee utili utiliza zand ndoo GET_TIMER1() GET_TIMER1() y SET_TIMER1(). Los valores de mode son:
SETUP_TIMER_2(mode, SETUP_TIMER_2(mode, period, postscale) Esta función inicializa el timer2; mode especifica el divisor del reloj del oscilador. Period es un número comprendido entre 0-255, y determina el momento en el que el valor del reloj se resetea a 0. postscale es un número de 0 a 15, que determina cuántos reset del timer se han producido producido antes de una interrupción. interrupción. 0 significa significa 1 reset, reset, 1 significa significa 2 reset, reset, y así sucesivamente. El valor del timer puede leerse y puede escribirse utilizando GET_TIMER2() y SET_TIMER2(). 66
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Los valores de mode son: -
T2_DISABLED T2_DIV_BY_1 T2_DIV_BY_4 T2_DIV_BY_16
3.3.3.6 Funciones de entrada A/D
SETUP_ADC_PORTS(value) Esta función configura los pines del ADC para que sean analógicos, digitales o alguna combinación de ambos.
SETUP_ADC(mode) Esta función prepara o configura el conversor A/D. Los modos de funcionamiento son: - ADC_OFF - ADC_CLOCK_DIV_2 - ADC_CLOCK_DIV_8 - ADC_CLOCK_DIV_32 - ADC_CLOCK_INTERNAL
SET_ADC_CHANNEL(canal) Especifica el canal a utilizar por la función READ_ADC(). El número de canal empieza en 0. Es preciso esperar un corto espacio de tiempo después de cambiar el canal de adquisición, antes de que se puedan obtener lecturas de datos válidos.
i=READ_ADC() Esta función lee el valor digital del conversor analógico digital. Deben hacerse llamadas a SETUP_ADC() y SET_ADC_CHANNEL() en algún momento antes de la llamada a esta función. 3.3.3.7 Funciones CCP
SETUP_CCP1(mode) SETUP_CCP2(mode) Estas funciones inicializa el contador CCP. Para acceder a los contadores CCP se utilizan las variables CCP_1 y CCP_2. Los valores para mode son: CCP_OFF CCP_CAPTURE_FE CCP_CAPTURE_RE CCP_CAPTURE_DIV_4 CCP_CAPTURE_DIV_16 67
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
CCP_COMPARE_SET_ON_MATCH CCP_COMPARE_CLR_ON_MATCH CCP_COMPARE_INT CCP_COMPARE_RESET_TIMER CCP_PWM CCP_PWM_PLUS_1 (sólo si se utiliza un ciclo de trabajo de 8 bits) CCP_PWM_PLUS_2 (sólo si se utiliza un ciclo de trabajo de 8 bits) CCP_PWM_PLUS_3 (sólo si se utiliza un ciclo de trabajo de 8 bits)
SET_PWM1_DUTY(value) SET_PWM2_DUTY(value) Estas funciones escriben los 10 bits de value al dispositivo PWM para establecer el ciclo de trabajo. Se puede usar un valor de 8 bits si no son necesarios los bits menos significativos. 3.3.3.8 Funciones para el manejo de la Eeprom interna
READ_EEPROM(address) Esta función lee un byte en la dirección (address) de Eeprom especificada. La dirección puede puede ser ser 0-63.
WRITE_EEPROM(address, WRITE_EEPROM(address, value) Esta función escribe un byte de datos en la dirección de memoria Eeprom especificada. Value es el byte de datos a escribir.
3.3.4 Definición de datos Si TYPEDEF se pone delante de la definición de un dato, entonces no se asigna espacio de memoria al identificador a menos que sea utilizado como un especificador de tipo en otras definiciones de datos. Si delante del identificador ponemos CONST entonces, el identificador es tratado como consta constante nte.. Las Las con consta stante ntess deben deben ser iniciali inicializad zadas as y no pue puede denn cambia cambiarr en tiempo tiempo de ejecución.
typedef
[calificador_tipo] [especificador_tipo] [identificador]
Especificadores de tipo:
unsigned unsigned int int char long long int signed signed int signed long
define un número de 8 bits sin signo define un número de 8 bits sin signo define un número de 8 bits sin signo define un número de 8 bits sin signo define un número de 16 bits sin signo define un número de 16 bits sin signo define un número de 8 bits con signo define un número de 8 bits con signo define un número de 16 bits con signo 68
María Aranda Elcuaz
float short short int
Universidad Universid ad Pública de Navarra
define un número de 32 bits en punto flotante define un bit define un bit
3.3.5 Definición de una función El formato de la definición de una función es como sigue: [calificador_tipo] identificador ([[especificador_tipo identificador]) { [cuerpo de la función] }
El calificador_tipo para una función pueden ser void o un especificador de tipo (véase la lista de la página anterior) La definición de una función puede ir precedida por una de las siguientes directivas del preprocesa preprocesador dor (calificadore (calificadoress de función) función) para identificar identificar una característic característicaa especial especial de la función: #separate #inline #int_... Cuando utilizamos una de las directivas mencionadas y la función tiene un prototipo (declaración anterior a la definición de la función, y colocada al principio del fichero fuente) hay que incluir la misma #directiva en el prototipo y en la definición de la función. Una función que tiene un parámetro de tipo char aceptará una constante de cadena. El compilador generará un bucle que llama a la función una vez para cada carácter de la cadena.
3.3.6 Estructura de un programa en C Para crear un programa es necesario seguir los siguientes pasos: 1. Especificaciones del programa (qué se tiene que hacer) 2. Hacer organigrama 3. Escribir el código fuente 4. Compilar 5. Grabar el programa en el microcontrolador Como etapas previas a la escritura del código fuente, es importante tener muy claro que es lo que se pretende hacer, por eso, será conveniente realizar un listado con las órdenes necesarias para que el programa se lleve acabo, y realizar un organigrama o diagrama de flujo con el orden de las mismas, las condiciones, etc. De forma generalizada, la estructura de un programa en C tiene el siguiente aspecto: declaraciones globales prototipos prototipos de funciones funciones main() { variables locales; bloque de sentencias; llamadas a las funciones; 69
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
} funcion_1() funcion_1() { variables locales a funcion_1; bloque de sentencias; llamada a otra/s funciones; } funcion_n() funcion_n() { … }
70
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Capítulo 4. Prácticas 4.1 Entradas Digitales
El objetivo de esta práctica es tener una primera toma de contacto con todos los elementos que se irán empleando a lo largo de los distintos ejercicios planteados en este capítulo. Para ello se van a realizar distintos ejemplos que trabajan con entradas digitales cuyo resultado se visual visualiza izará rá mediant mediantee uno unoss leds. leds. El trabajo trabajo con con entrad entradas as digital digitales es es, posible posiblemen mente, te, el ejercicio más sencillo que se puede plantear. Además, se realizará una comparación entre el diseño de los programas en lenguaje C y lenguaje ensamblador para demostrar la eficiencia del ensamblador frente a la comodidad del C.
4.1.1 Control de tiempos: Parpadeo de un led Diseñar un programa que encienda y apague el led de la placa de entrenamiento PICDEM 2 PLUS conectado al bit 0 del puerto B del microcontrolador cada 65 milisegundos. 4.1.1.1 Organigrama
Inicio Puerto B: Salida Inicialización de registros Encender Led Retardo 65 ms Apagar Led Retardo 65 ms 4.1.1.2 Solución en ensamblador
Para el correcto diseño de este programa habrá que seguir estos tres simples pasos: 1º) Configurar el puerto B como salida 2º) Cambiar el estado de los leds de encendido a apagado 3º) Generar una rutina de retardo entre ambos estados 71
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Para generar una rutina de retardo correcta habrá que tener en cuenta la fórmula dada en el apartado 2.4.2.3 de la memoria: Tiempo = 4 · T osc · (Valor cargado en TMR0) · (Rango del Divisor) Valor a cargar en TMR0 = (tiempo / 4 · T osc) · (Rango del Divisor) Como en la placa PICDEM se tiene un cristal que trabaja a una frecuencia de 4 MHz, el valor de Tosc será de 0,25 microsegundos. Por otra parte, el rango del divisor será el máximo, es decir, 1:256. Y por último, para llegar a los 65 milisegundos habrá que cargar al TMR0 con 255: Tiempo = 4 · 0,25us · 255 · 256 = 0,06528 s = 65,28 ms Aquí se observa ya la primera desventaja del lenguaje ensamblador. Como se puede observar el resultado no es del todo exacto, será una aproximación. En el lenguaje C, tal y como se verá en el siguiente punto, existe una función que directamente introduce un retardo de 65 ms, el resultado no sólo es más exacto sino que también es más directo ya que no será necesario realizar ningún cálculo previo.
Nota: Una vez que el TMR0 se desborda se enciende la bandera que se encuentra en el bit 2 del registro INTCON, bandera que habrá que no se apaga sola, por tanto habrá que apagarla por software. Dicho todo esto el programa que da solución al problema planteado en ensamblador quedaría de la siguiente manera: <1a-ensamblador.asm> LIST P=16F877 INCLUDE"P16F877.INC" #def #defin ine e #def #defin ine e org INIC
BANK1 BANK 1 bsf bsf STA STATUS, TUS,5 5 ;Mac ;Macro ro para para abre abrevi viar ar el BA BANC NCO O1 BANK BA NK0 0 bcf bcf STA STATUS, TUS,5 5 ;Mac ;Macro ro para para abre abrevi viar ar el BA BANC NCO O0 0
BANK1 clrf TRISB movl movlw w b'11 b'1101 0101 0111 11'' movwf movwf OPTION OPTION_RE _REG G BANK0 clrf PORTB
;Posición 0 de la memoria de programa ;Selección del Banco 1 ;Se configura todo el puerto B como salida ;Se con config figur ura a el regist registro ro ;OPTIO ;OPTION:T N:TMR MR0:P 0:Prees reescal caler er 256 ;Selección del Banco 0 ;Apaga todos los leds del puerto B
PARPA call bcf call goto
bsf PORTB,0 ;Enciende el led RB0 RETAR ;Llama a la rutina de RETARDO PORTB,0 ;Apaga el led RB0 RETAR ;Llama a la rutina de RETARDO PARPA ;Comienza de nuevo el ciclo PARPA
RETAR LOOP btfss goto bcf return
clrf TMR0 ;TMR0=0 y empieza su incremento INTCON,2 ;Se ha desbordado? LOOP ;No, repite el proceso INTCON,2 ;Si, se pone el flag a 0 ;retorna al programa principal
72
María Aranda Elcuaz
end
Universidad Universid ad Pública de Navarra
;fin de programa
Inicialmente en el programa se llama a la librería del microcontrolador donde tiene configuradas las direcciones de todos los registros del PIC y después se pasa al programa principal principal donde donde se distinguen distinguen tres tres fases fases bien bien diferenciad diferenciadas. as. La primera fase configura el puerto B como salida y el registro de opciones para la correcta configuración del temporizador TMR0. En la segunda fase estaría el programa principal, principal, enciende enciende y apaga el leds y llama a la rutina de retardos y finalmente, finalmente, en la tercera fase se expone la rutina del retardo. Por Por últim último, o, cabe cabe dest destac acar ar que que en este este progr program amaa no se ha defin definid idoo la pala palabr braa de configuración, y no importa siempre que se defina desde el programa MPLAB donde habrá que seleccionar el oscilador adecuado y deshabilitar el resto de las opciones. 4.1.1.3 Solución en C
Para el correcto diseño de este programa en lenguaje C habrá que seguir exactamente los mismos pasos seguidos anteriormente en el lenguaje ensamblador: 1º) Configurar el puerto B como salida 2º) Cambiar el estado de los leds de encendido a apagado 3º) Generar una rutina de retardo entre ambos estados Sin embargo, como se ve a continuación, el lenguaje C es mucho más breve y más fácil de comprender. Por lo tanto, a la hora de pensar el diseño de un programa será más rápido y sencillo realizarlo en C que en ensamblador. //Programa 1a-c.c – Parpadeo de un led cada 65 ms// #include <16F877.h> #fuses XT,NOWDT,NOPROTECT,NOPU XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP T,NOBROWNOUT,NOLVP #use delay(clock=4000000 de lay(clock=4000000)) #use fast_io(B) void main() // Programa principal { set_tris_b(0); // Configura el puerto B como salida while (1) // Bucle infinito { outpu utput_B( t_B(1); 1); // En Enciende ciende el led RB0 delay_ms(65); // Retardo de 65ms output_B(0); // Apaga todos los leds delay_ms(65); // Retardo de 65ms } } // Fin del programa
De este programa no queda mucho por comentar, la presentación es muy clara y se han añadido los comentarios correspondientes tras cada función en el propio programa. A simple vista parece que el programa planteado en C ocupa mucho menos que el programa programa diseñado diseñado en ensamblad ensamblador, or, pero en la realidad realidad no es así, una vez traducidos traducidos a 73
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
código máquina, el programa en C ocupa 312 bytes mientras que el programa en lenguaje ensamblador ocupa 103 bytes. Si emple empleás ásem emos os un prog progra rama ma para para dese desensa nsamb mbla larr el códig códigoo en C y tradu traduci cirlo rlo a ensamblador se podría ver como en realidad para realizar el mismo trabajo se necesitan más instrucciones. La flexibilidad del C tiene su precio en cuanto a tamaño de código y tiempo de ejecución.
4.1.2 Encendido de un led a través de un pulsador Diseñar un programa en c y ensamblador que encienda el led RB1 después de presionar el pulsador pulsador RA4. RA4. 4.1.2.1 Organigrama
Inicio PIN A4: Entrada Puerto B: Salida Inicialización de registros Chequeo pulsador ¿Han pulsado pulsado ?
No
Apagar led
Sí Retardo para evitar rebotes Encender led 4.1.2.2 Solución en ensamblador
Para dar solución a este problema se deben seguir los siguientes pasos: 1º) Configurar el 4º bit del Puerto A como entrada 2º) Configurar el Puerto B como salida 3º) Generar un pequeño retardo para evitar rebotes después de presionar presionar el pulsador y así no confundir al microcontrolador El programa queda resuelto en lenguaje ensamblador de la siguiente manera: <1b-esamblador.asm> 74
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
LIST P=16F877 INCLUDE"P16F877.INC" #def #defin ine e #def #defin ine e org INIC
BANK1 BANK 1 bsf bsf STA STATUS, TUS,5 5 ;Mac ;Macro ro para para abre abrevi viar ar el BA BANC NCO O1 BANK BA NK0 0 bcf bcf STA STATUS, TUS,5 5 ;Mac ;Macro ro para para abre abrevi viar ar el BA BANC NCO O0 0
;Posición 0 de la memoria de programa
BANK1 ;Seleccion del Banco 1 clrf TRISB ;Configura el puerto B como Salida movlw b'00001000' ; movwf TRISA ;Configura el pulsador en RA4 como Entrada movl movlw w b'11 b'1101 0100 0010 10'' ;Se con config figur ura a el regist registro ro ;OPTION:TMR0:Preescaler 8 movwf OPTIO TION_R N_REG ; BANK0 ; s e l e c c i ó n de l Banco 0
WAIT clrf btfs tfsc goto call PULSA btfs tfss goto ca l l RETAR LOOP btfss goto bcf return
PORTB PORTA,4 ;pulsado? WAIT RETAR
;Apaga los LEDS borrando el puerto B ;Lee Lee el inte nterru rruptor y espera a que que sea "0". "0". Han ;No han pulsado, va a la etiqueta WAIT ;Si han pulsado, llama a la rutina de RETARDO
bsf PORTB,1 ;Bit 1 del PUERTO B "1". Enciende el LED PORTA,4 ;Lee Lee el inte nterru rruptor y espera a que que sea "1". "1". Han ;soltado? PULSA ;No, va a la etiqueta PULSAR WAIT ; S i , va a l a et et i q ue t a WAIT clrf TMR0 ;TMR0=0 y empieza su incremento INTCON,2 ;Se ha desbordado? LOOP ;No, repite el proceso INTCON,2 ;Si, se pone el flag a 0 ;retorna al programa principal
end
;fin de programa
De la misma manera que en el problema anterior, inicialmente se configura el puerto B como salida, así como el registro de opciones para el TMR0. Posteriormente llega el programa programa principal principal dond dondee se lee el estado estado del pulsador pulsador y se actúa en consecuenc consecuencia. ia. Finalmente una rutina de retardo que es llamada desde el programa principal, esta vez, debido a que será necesario un retardo para que los posibles rebotes que se puedan producir al presionar el pulsador no confundan al microcontrolador. 4.1.2.3 Solución en c
Para conseguir una solución en lenguaje C habrá que pensar en introducir en el programa una secuencia condicional que revise los dos estados del pulsador y actúe en consecuencia tras hacer todas las configuraciones que sean necesarias. El problema planteado podría tener el siguiente diseño: <1b-c.c> #include <16F877.h>
75
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
#fuses XT,NOWDT,NOPROTECT,NOPU XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP T,NOBROWNOUT,NOLVP #use delay(clock=4000000 de lay(clock=4000000)) #use fast_io(A) #use fast_io(B) #byte port_a=0X05 #byte port_b=0X06 void main() { set_ set_tr tris is_a _a(0 (0xF xFF) F);; //Pu //Puer erto to A como como entr entrad ada a set_ set_tr tris is_b _b(0 (0x0 x00) 0);; //Pu //Puer erto to B como como sali salida da port_b=0; for(;;) //Bucle infinito { if(! if(!in inpu put( t(PI PIN_ N_A4 A4)) )) //Si //Si se ha puls pulsad ado o hace hacer. r... .. { delay_us(50); //meter un tiempo para los rebotes output_high(PIN_B0); //encender led } else //Si no { output_l ow(PIN_B0);// / / apagar el led } } }
Como conclusión, cabe indicar que la solución a estos problemas no es exclusiva; se ha puesto puesto una posible posible solución solución y por supuesto, supuesto, habrá otras distintas distintas igualmente igualmente válidas. válidas. El objetivo de esta práctica era doble: 1º) Que el alumno tome contacto con las prácticas con dos simples ejemplos, conociendo ya de form formaa prác prácti tica ca el micr microc ocon ontr trol olad ador or,, la plac placaa de prue prueba bass y los los leng lengua uaje jess de programac programación. ión. 2º) Una muestra de que el lenguaje C en el caso de este proyecto tiene más ventajas que inconvenientes: Se ha comprobado que el lenguaje C ocupa un mayor espacio en la memoria del PIC que el programa en lenguaje ensamblador. Los microcontroladores tienen una capacidad de memoria limitada pero cada día salen al mercado nuevos modelos con mayor capacidad y no por ello ello aumentan aumentan su tamaño. tamaño. Además Además por por muy extensas extensas que que puedan puedan llegar llegar a ser ser las prácticas prácticas aquí planteadas, al compilar el programa se comprueba que el tamaño de código no llega en ningún caso a ocupar un 80% de la memoria del PIC. También es cierto que los tiempos de demora en lenguaje C son superiores a los del lenguaje ensamblador, pero en estos ejemplos las soluciones obtenidas se plantean para ser observadas por el propio ojo humano, con lo cual, estos tiempos de demora tampoco son excesivamente importantes. En contraposición, se piensa que el lenguaje C es más comprensible y puede ahorrar al diseñador tiempo de trabajo. Por todo esto, se toma la determinación a partir de este punto de resolver las prácticas únicamente en lenguaje C.
76
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
77
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
4.2 LCD y Memoria Eeprom
En la práctica anterior ya se ha visto como se utilizaba la librería del PIC 16F877, librería que se puede encontrar en el Anexo 1. Esta librería contiene el nombre y la dirección de todos los registros del PIC así como la definición de una serie de funciones que facilitarán el manejo de temporizadores, entradas analógicas y otra serie de recursos que se irán viendo a lo largo del resto de prácticas. El caso de las pantallas LCD es un poco especial porque no todas son iguales y aunque así lo fueran no tienen porque estar conectadas a la placa de la misma manera. Ya se ha visto en el apartado 3.1 la conexión de la pantalla en la placa PICDEM 2 PLUS, consultando el archivo “lcd.c” que se puede encontrar en la carpeta donde se instaló el compilador se observa que las conexiones de la pantalla definidas no son exactamente iguales por eso habrá que modificarlo con las conexiones de la placa PICDEM. Al archivo modificado se le ha llamado “lcd-picdem.c” y se puede encontrar también en el Anexo 1. Entonces, para poder emplear la pantalla LCD habrá que incluir dicho archivo en la cabecera del programa. El objetivo de esta práctica es conocer las conexiones del LCD, cómo funciona, su librería LCD y aprender a manejar las funciones incluidas en ella y además la grabación en la memoria EEPROM del PIC que se verá en el punto siguiente.
4.2.1 Envío de mensajes al LCD Tras leer y comprender el archivo “lcd-picdem.c”, crear un programa que muestre en la pantalla pantalla LCD los siguiente siguientess mensajes mensajes solame solamente nte una una vez: vez: 1. Un saludo centrado, por ejemplo: Hola 2. Escribir el abecedario letra a letra en toda la pantalla y llenar los huecos finales con números. Entre letra y letra meter una pausa de 0,5 s. 3. Terminar con una despedida centrada en la segunda línea. 4.2.1.1 Organigrama
Inicio Definir vector Inicializar variables y LCD Enviar mensaje 1 Retardo 5000 ms
78
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Borrar Pantalla Situar cursor Enviar carácter Retardo 0,5 s ¿Último carácter ?
No
Sí Borrar pantalla Situar cursor Enviar menaje 3 Retardo 5000 ms 4.2.1.2 Solución
Para que este programa funcione correctamente primero habrá que inicializar la pantalla con su correspondiente función en el programa principal. Los mensajes primero y tercero son simples, bastará una función para enviarlos y el suficiente retardo para que la vista de cualquier persona sea capaz de percibirlo. Sin embargo, el segundo mensaje será un poco más complicado, primeramente habrá que definir un vector de caracteres que contenga el abecedario y todos los números a enviar. Posteriormente, y ya en el programa principal, habrá que generar un bucle para ir moviéndose a lo largo de toda la pantalla y asimismo meter el retardo solicitado de 0,5s entre el envío del primer carácter y el segundo. Dicho todo esto el programa pedido quedaría de la siguiente manera: <2lcd.c> #include <16F877.h> #use delay(clock=4000000 de lay(clock=4000000)) #include //Archivo de config de la pantalla #fuses XT,NOWDT,NOPROTECT,NOPU XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP T,NOBROWNOUT,NOLVP char vec to r [ ]= ]={ ' ' , ' a ' , ' b ' , ' c ' , ' d ' , ' e ' , ' f ' , ' g ' , ' h ' , ' i ' , ' j ' , ' k ' , ' l ' , ' m' m' , 'n','o','p','q','r','s','t','u','v','w','x','y','z','1','2','3','4','5','6'};
79
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
void main() { int i,j=1; l cd _ i n i t ( ) ; lcd_put lcd_putc(" c(" Hola Hola delay_ms(5000); lcd_putc("\f");
/ / I n i c i a l a panta l l a "); //Envía //Envía Hola Hola //Pausa de 5 segundos //Borra Pantalla
for(i=1;i<33;i++) //Recorre las 32 posiciones del LCD { if(j==1) //Si esta en la linea 1 { lcd_gotoxy(i,j); //Ir a la posición i,j } else { lcd_gotoxy((i-16),j); //Sino a la posición i-16,j } printf(lcd_putc,"%c", vector[i]);//Escribir el carácter i de l ay _ms(500 ) ; / / P a u sa de 0 ,5 s if(i==16) { j=2; //Después del carácter 16 pasar a la //2 línea } } //Fin del bucle lcd_putc("\f"); lcd_gotoxy(1,2); lcd_putc(" lcd_putc(" Adios! delay_ms(5000);
//Vuelve a borrar pantalla //Y coloca el cursor en la segunda //línea "); //Envia Adios //Pausa de 5 segundos
}
Como se puede comprobar en este ejercicio se desarrollan la mayoría de funciones definidas para el LCD: - Inicialización de la pantalla (lcd_init()) - Posicionamiento del cursor (lcd_gotoxy(x,y)) - Envío de comandos al LCD (lcd_putc(“\f”)) - Escritura en pantalla: - Constantes (lcd_putc(" Adios! ")) ( - Vectores printf(lcd_put printf(lc d_putc,"%c c,"%c", ", vector[i])) vector[i])) Es un ejercicio sencillo pero muy completo a la vez en lo que al funcionamiento del LCD se refiere.
4.2.2 Programación de la EEPROM Tal Tal y como como se ha visto visto en el punt puntoo 2.3. 2.3.22 de este este docu docume mento nto,, la memoria de datos EEPROM posee 256 bytes en el PIC16F877 donde puede almacenar de forma indefinida 80
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
cualquier dato que se desee retener cuando se apague la alimentación. Para recordar el funcionamiento interno de esta memoria basta consultar el punto 2.5.8 también en este documento. Para poner en práctica la programación de la memoria EEPROM, y aprovechando que se conoce ya como mostrar datos en la pantalla LCD de la placa de pruebas, se va a realizar un programa programa que controle controle el funcionamie funcionamiento nto de una máquina máquina de “Su turno” que se puede encontrar habitualmente en cualquier establecimiento comercial. Sobre el LCD se visualizará el número del turno actual (2 dígitos). Este se deberá incrementar a cada pulso aplicado por RA4. En la memoria EEPROM del PIC16F877 se almacenará el último número visualizado, de forma que, ante un fallo de alimentación por ejemplo, se reanude la cuenta en el último número. ¿Qué sucede al pulsar el reset?, ¿Se reinicia el programa? 4.2.2.1 Organigrama
81
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Inicio Pin A4: Entrada Iniciar LCD Leer EEPROM Turno>99 ?
No
Sí Turno = 1 Posicionar cursor Escribir LCD Chequeo Pulsador ¿Han pulsado? pulsado? Sí Retardo rebotes
No
Incrementar turno Turno>99 ?
No
Sí Turno = 1 Escribir EEPROM Situar Cursor Enviar turno al LCD 4.2.2.2 Solución
82
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Para diseñar este programa será necesario conocer las funciones para el manejo de la Eeprom que se pueden encontrar en el capítulo del lenguaje C. Por otra parte, se recomienda generar una rutina que coloque el cursor en todo momento para sobrescribir el número y que a su vez lo muestre a través de la pantalla LCD; A esta rutina se le podrá llamar cuando sea necesario. A continuación, se presenta una solución posible al problema planteado: <2eeprom.c> #include <16f877.h> #use delay(clock=400000 dela y(clock=4000000) 0) #fuses XT,NOWDT,NOPROTECT,NOPU XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP T,NOBROWNOUT,NOLVP #use fast_io(A) #include int turno; void Visualizar_Turno() { lcd_gotoxy(8,1); printf (lcd_putc,"%U", turno); }
//Rutina para mandar el turno al LCD
void main() { set_tris set_tris_a( _a(0b0 0b0001 00100 0000) 00);; lcd_in lcd_init it() ();;
//PIN //PIN RA4 como como entrada entrada
// Coma Comand ndos os de inicia inicializ lizaci ación ón del LCD. LCD.
lcd_putc("Turno: "); turno turno = read_ read_eep eeprom rom(0) (0);; //Lee //Lee la posici posición ón 0 de la EEPRO EEPROM M if((turno<1)||( if((turno<1)||(turno>9 turno>99)) 9)) //Poner //Poner a 1 si si está está fuera del rango { turno=1; } Visualizar_Turno(); //Ver el turno while(1) { if(!input(PIN_A4)) { delay delay_m _ms( s(90 90); ); //Re //Reta tardo rdo para para evita evitarr rebot rebotes es turno++; //Incrementar turno if(t if(tur urno no>9 >99 9) //Si //Si es mayo mayorr de 99 volv volver er a 1 { lcd_gotoxy(9,1); lcd_putc(" "); turno=1; } write_eeprom( write_eeprom(0,turno 0,turno); ); //Escribir //Escribir el valor en la eeprom Visu isualiza izar_T r_Turno rno(); //Vis Visualiz lizarlo rlo en el el LC LCD } } }
83
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
En la cabecera del programa se hacen las configuraciones pertinentes y se incluyen los archiv archivos os neces necesario arioss para para el correc correcto to funcion funcionam amient ientoo de las funcione funcioness incluid incluidas as en el programa programa principal principal tal y como se hacía hasta ahora. ahora. Después Después se expo expone ne la subrutina subrutina que escribirá el valor en la LCD cada vez que se pulse RA4 y que se llamará durante el programa principal. principal. En el programa principal, tras configurar el PIN RA4 como entrada y la inicialización del LCD se lee la EEPROM para comprobar el último número que leyó la maquina antes de perder perder la alimentació alimentaciónn si ese valor no está dentro del rango [01-9 [ 01-99] 9] se inicializa inicializa a 1 y se visualiza el turno por la LCD. Después siempre que se pulse RA4, incrementará el turno en una posición, se mostrará en la LCD y se grabará en la memoria EEPROM por si hay fallos en la alimentación. Al pulsar el botón de reset, evidentemente sí que se reinicia el programa aunque la placa de pruebas no parezca mostrar cambios. Si el contador no se pone a 01 es precisamente porque porque el último último valor valor antes antes de presionar presionar el el pulsador pulsador del del reset reset fue memoriza memorizado do en la Eeprom. Eeprom.
84
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
4.3 Entradas analógicas: Potenciómetro
Como ya se ha comentado en el capítulo 2 de la memoria, el PIC16F877 posee 8 pines situados en las puertas A y E que pueden trabajar de manera analógica. Conectado al pin RA0 del microcontrolador, la placa de pruebas PICDEM 2 PLUS posee un potenciómetro con una resistencia R16 de 5 kΩ que puede oscilar entre 0 y +5V con ayud ayudaa de una una rule ruleta ta.. La fig figura ura sigu siguie ient ntee indi indica ca la cone conexi xión ón del del pote potenc nció ióme metr troo al microcontrolador:
Con la ayuda de este potenciómetro en esta práctica se pretende visualizar, a través del LCD de la placa de pruebas, el voltaje que cae en dicha resistencia en tiempo real según la posición posición en en que se deje deje la ruleta ruleta que que lo controla. controla. 4.3.1 Organigrama
Inicio Definir constantes y variables Iniciar pantalla
Situar cursor Encender ACD Seleccionar terminales analógicas
85
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Seleccionar canal Hacer conversión AD Escalar valores Enviar datos al LCD Retardo 10 ms 4.3.2 Solución
Para la realización de este programa habrá que tener en cuenta varias cosas expuestas ya en el punto 2.5.2 pero que es conveniente recordar: Primer Primero, o, el PIC 16F877 16F877 posee posee una resolu resolució ciónn de hasta 10 bits bits para para el resulta resultado do de la conversión A/D, si en el compilador no se pone nada, da por hecho que la resolución que se desea obtener es de 8 bits, si se prefiere una resolución de 10 bits habrá que especificarlo. En este caso una resolución de 8 bits será suficiente para obtener resultados satisfactorios y la instrucción #device adc no sería necesaria pero se ha querido poner igualmente. Segundo, habrá que configurar los puertos que se desean emplear de forma analógica, el conversor analógico digital y especificar el canal a utilizar que en este caso será el 0. Finalmente, cabe recordar que habrá que escalar la lectura obtenida. Se ha elegido una resolución de 8 bits, por lo tanto el fondo de escala será de 255. Por otro lado el rango de voltaje va desde 0 V hasta +5 V, por lo tanto bastará multiplicar el valor obtenido por 5 y dividirlo entre el fondo de escala. Para hacer esta operación se puede crear una subrutina que haga el cálculo y se le llame desde el programa principal. Un prog progra rama ma que que podr podría ía dar dar solu soluci ción ón al probl problem emaa qued quedaa expu expues esto to y expli explica cado do a continuación: #include <16F877.h> #device adc=8 #use delay(clock=4000000 de lay(clock=4000000)) #include #fuses HS,NOWDT,NOPROTECT,NOPUT HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP ,NOBROWNOUT,NOLVP const int esca e scala la = 255; 255; const float v_max = 5.0; void calcula_voltaje (int val, float &voltaje) { voltaje=(val*v_max)/escala; }
86
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
void main(void) { int valor; f l o a t vo l ta ta j e ; lcd_init(); lcd_putc('\f'); //Borra pantalla lcd_putc("voltios = "); lcd_gotoxy(16,1); lcd_putc("V"); for(;;) { lcd_gotoxy(11,1); setup_adc(adc_clock_div_32); //Enciende conversor setu setup_ p_ad adc_ c_po port rts( s(AN AN0) 0);; //Se //Sele lecc ccio iona na term termin inal ales es set_adc_channel(0); // Selecciona canal valor=read_adc(); // Conversión AD calcula_voltaje(valor,voltaje); printf(lcd_putc,"%1.2f",voltaje); delay_ms(10); } }
Tras la cabecera de programa correspondiente se definen las constantes para el cálculo del voltaje y la subrutina que realiza el cálculo. Una vez en el programa principal, habrá que definir dos variables, la primera que será el valor obtenido en el conversor y la segunda el valor a mostrar por el LCD. Se inicializa la pantalla, se hacen las configuraciones pertinentes y una vez hecho todo esto ya se podrá leer el valor digital del conversor analógico digital, escalarlo y finalmente mostrarlo en pantalla.
87
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
4.4 PWM
Cuando se desea que el estado de un determinado pin del microcontrolador bascule entre 0 y 1 a intervalos variables de tiempo se emplea la modulación por anchura de pulsos. Para ver como funciona la PWM en detalle, además de lo dicho en capítulos anteriores de la memoria, se puede consultar el Anexo 2. En el microcontrolador puede generarse una salida PWM por el pin CCP1, que en este caso es RC2, utilizando TMR2, PR2 y el módulo CCP1. La secuencia es la siguiente: se incrementa TMR2, a su vez un comparador comprueba si el valor de TMR2 y el del registro de anchura de pulso (CCPR1L) son iguales. Cuando esto ocurre, el pin CCP1 pasa a nivel bajo. Al mismo tiempo un segundo segundo comparado comparadorr comprueb compruebaa si son iguales iguales TMR2 TMR2 y PR2. Cuando lo son, CCP1 pasa a nivel 1 y TMR2 se pone a 0 para comenzar el siguiente periodo. Este proceso puede repetirse indefinidamente de forma automática, obteniendo de esta forma una salida modulada por anchura de pulso (PWM) en el pin CCP1. Gráficamente sería así:
PR2 CCPR1 TMR2
1
Para un primer acercamiento a la modulación por anchura de pulsos se plantea el siguiente ejercicio:
4.4.1 Primer acercamiento al PWM Con la ayuda de las dos siguientes fórmulas para el cálculo del valor a cargar en PR2 y en CCPR1L realizar un programa que trabaje con una frecuencia de 500 Hz y encienda el led RB1 cada 1ms inicialmente. Además se desea que presionando el pulsador RB0 el duty cambie a 1,5 ms y si se presiona RA4 el duty cambie a 250 ms. Variando el duty se conseguirán distintas intensidades para el led. Para el cálculo de PR2 se tiene que: T = (PR2+1)·4·Tosc·TMR2preescaler (PR2+1)·4·Tosc·TMR2preescaler
88
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Para el cálculo del duty se tiene que: Duty = (CCPR1L:CCPCON1<5:4>)·Tosc·TMR2pree (CCPR1L:CCPCON1<5:4>)·Tosc·TMR2preescaler scaler 4.4.1.1 Organigrama
Inicio Configurar puertos Configurar CCP1 Elegir frecuencia Inicializar Duty Comprobar pulsadores RB0 ON?
No
Sí Cambiar duty a 1,5 ms
RA4 ON?
No
Sí Cambiar duty a 750 ms 4.4.1.2 Solución
Para los cálculos de PR2 y CCPRL1 hay que tener en cuenta que el oscilador de la placa de prue prueba bass PICD PICDEM EM 2 PLUS PLUS trab trabaj ajaa a una una frec frecue uenc ncia ia de osci oscila laci ción ón de 4MH 4MHz y TMR2preescaler se le da el valor de 16. Con esto y despejando de las fórmulas dadas se obtiene que para una frecuencia de 500 Hz habrá que cargar PR2 con el valor 124. Por otro lado se trabajará con 8 bits por lo tanto los bits CCPCON1<5:4> se cargan con 00 y así despejando de la segunda fórmula dada se tendrá que los valores de CCPR1L serán de 62 para los 1 ms de salida, 94 cuando se pulsa RB0 y 16 al pulsar RA4. Teniendo esto y consultando las funciones a emplear en la modulación de anchura de pulsos pulsos en el capítulo capítulo 3.3.3 de la programac programación ión en lenguaje lenguaje C se pued puedee realizar realizar ya el programa programa solicita solicitado do que podría qued quedar ar de la la siguiente siguiente manera: manera: 89
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
#include <16F877.H> #fuses HS,NOWDT,NOPROTECT,NOPUT HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP ,NOBROWNOUT,NOLVP #use Delay(Clock=4000000) #use fast_io(B) #byte PORTB=6 main() { PORTB=0b00000010; setup_c set up_c cp1(CCP_PW cp1(CCP_PWM); / / Conf Conf ig ur a CCP1 CCP1 como como PWM setup_t setup_timer imer_2( _2(T2_ T2_DIV_BY_16,124,1 DIV_BY_16,124,1 ) ; / / f=500 f=500Hz Hz (T=2m (T=2ms) set_pwm1_duty(62); // Duty=1ms de partida while(1) { if(!input(PIN_B0) set_pwm1_duty(94); if(!input(PIN_A4)) set_pwm1_duty(16);
// Duty=1,5ms // Duty=250ms
} }
En la cabecera tal y como se hacía hasta ahora se realizan las configuraciones necesarias para el PIC y para para el empleo empleo del del puerto B como como salida. salida. Después Después se configu configura ra el led a utilizar utilizar y el CCP1 como PWM. Se carga la frecuencia de 500 Hz y el duty inicial para después entrar en un bucle infinito que cambie los dutys según se presione los distintos pulsadores. NOTA IMPORT IMPORTANTE ANTE:: CCP1 en este microcontrolad microcontrolador or está situado en la patilla RC2, para obtener la salida en el led RB1 habrá que unirlos con un cable exterior. Trabajando con estos valores de frecuencias es imposible que el ojo humano perciba que el led se enciende y se apaga, en cambio, lo que sí se podrá observar es la intensidad de iluminación del led. A mayor tiempo de encendido el led mostrará mayor intensidad y viceversa.
4.4.2 PWM empleando entradas analógicas Trabajando a la misma frecuencia que se ha trabajado en el programa anterior (f = 500 Hz), ahora se va a seleccionar el duty con ayuda del potenciómetro conectado a RA0. Además para conocer con que duty se está trabajando en cada momento, habrá que mostrar dicho valor mediante la pantalla LCD que dispone la placa de pruebas. Para los cálculos de PR2 y CCPR1L emplear las fórmulas dadas en el ejercicio anterior. 4.4.2.1 Organigrama
90
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Inicio Definir constantes y variables Iniciar LCD Configurar CCP1 Seleccionar frecuencia Encender ADC Seleccionar terminales analógicos Seleccionar canal
Convertir AD Establecer Duty Escalar Duty Enviar datos al LCD
4.4.2.2 Solución
Este ejercicio combina la mayor parte de lo visto hasta ahora ya que emplea entradas analógicas, trabaja con el LCD y además se introduce la modulación por anchura de pulsos. Tras la cabecera del programa habrá que generar una rutina que escale el duty tal y como se hacía para el voltímetro en la práctica 3. Habrá que realizar también las configuraciones pertinentes pertinentes del LCD para mostrar mostrar resultados resultados y finalmente finalmente todo lo que lleva relacionado relacionado el PWM consigo. Dicho todo esto, el programa solicitado podría tener la siguiente forma: #include <16F877.H> #fuses HS,NOWDT,NOPROTECT,NOPUT HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP ,NOBROWNOUT,NOLVP #use Delay(Clock=4000000) #include
91
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
#use fast_io(B) #byte PORTB=6 const float escala = 255; const float d_max = 1999; void calcula_duty (int val, float &duty) { duty=(val*d_max)/escala; } main() { int valor; float duty; PORTB=0b00000010; lcd_init(); lcd_gotoxy(1,1); lc d_put c (" f=50 f=500 0Hz->T= Hz->T=2ms ") ; lcd_gotoxy(1,2); lcd_putc("duty = us"); setup_ccp1(CCP_PWM); // Configura CCP1 como PWM setup_t imer_2(T2_DIV_BY_16,124,1) imer_2(T2_DIV_BY_16,124,1) ; / / f=500 f=500Hz Hz (T=2 (T=2ms) setup_adc(adc_clock_div_32); setup_adc_ports(AN0); set_adc_channel(0);
// Selecciona Reloj // RA0 analogico
while(1) { valor=read_adc(); // Lee valor RA0 set_pwm1_duty(valor); // Establece duty como valor calcula_duty(valor,duty); // Escala el duty lcd_gotoxy(8,2); printf(lcd_putc,"%3.2f",duty); // Muestra el resultado } }
En este programa por lo tanto se tiene que observar la diferencia de intensidad en el led seleccionado según se mueve la ruleta, además de conocer en cada momento el duty con el que se está trabajando consultando el LCD. Se puede comprobar que cuando la ruleta se encuentra en el mínimo el led estará apagado y el duty será de 0 ms y cuando la ruleta se encuentre en su máximo el led permanecerá encendido a su máxima intensidad y el duty coincidirá con el valor del periodo de trabajo (2000 ms), puesto que el duty nunca podrá ser mayor que la frecuencia.
92
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
4.5. Comunicación Serie PIC-PC (RS-232)
Resulta de gran interés abrir las puertas de comunicación del microcontrolador para poder comunicarse no sólo con los elementos incluidos en la placa de pruebas dada sino también con elementos exteriores más potentes como puede ser un ordenador o cualquier elemento que sea poseedor también de un bus de comunicaciones. En esta práctica se pretende ver cómo el microcontrolador con ayuda de un cable serie y un sencillo programa informático de comunicación que incluye el propio Windows puede enviar datos al ordenador, éste los reconoce y a su vez puede enviar otros datos introducidos mediante el teclado que el microcontrolador también es capaz de reconocer. El programa informático al que se refiere en este documento es el HyperTerminal de Windows. Antes de comenzar con la práctica en sí conviene conocer las siguientes consideraciones: 1º) Para que dos dispositivos puedan transmitir datos entre sí será necesario que lo hagan a la misma velocidad, por lo tanto, al abrir el HyperTerminal habrá que asegurarse de poner las mismas configuraciones que de establezcan en el programa realizado en C. 2º) Para conectar conectar el PC a un microcontrola microcontrolador dor por el puerto serie se utilizan las señales señales Tx, Rx y GND. El PC utiliza la norma RS232, por lo que los niveles de tensión de los pines están comprendidos entre +15 y -15 voltios, los microcontroladores normalmente trabajan con niveles TTL (0-5v), será necesario por tanto intercalar un circuito que adapte los niveles:
3º) Ese circuito adaptador de niveles es en realidad un chip, que en el caso de la placa de prueba prueba PICDEM PICDEM 2 PLUS viene ya incrustado, incrustado, se trata del chip MAX232 MAX232 cuyo esquema esquema se puede puede ver ver en la página página siguiente siguiente.. En el esquema se puede ver que lleva conectados 4 condensadores q serán necesarios para que las transmisiones se lleven a cabo. Además se observa como las patitas 13 y 14 están conectadas al puerto serie de la placa que comunicará como el ordenador y las patitas 11 y 12 están conectadas a las patitas RX (RC7) y TX (RC6) del microcontrolador. Todas estas observaciones realizadas en esta página junto con las nombradas en el apartado correspondiente de la programación en lenguaje C serán necesarias para llevar a cabo la práctica de manera satisfactoria.
93
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
4.5.1 Un ejemplo sencillo Se propo propone ne a cont contin inua uaci ción ón un ejem ejempl ploo senc sencill illoo y dive diverti rtido do para para comp compro roba barr que que efectivamente el microcontrolador y el ordenador son capaces de comunicarse entre sí. Para ello se creará un programa en C que pida el nombre del alumno en el HyperTerminal, espere una respuesta y después la muestre en el LCD de la placa de pruebas para así comprobar que el microcontrolador también es capaz de recibir la información. 4.5.1.1 Organigrama
Inicio Declarar e iniciar variables Iniciar LCD Transmitir cadena a PC Escribir LCD
Recibir carácter RS232 Enviar carácter RS232 Situar cursor Escribirlo en la LCD
94
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
4.5.1.2 Solución
Si se han estudiado las funciones relacionadas con la comunicación serie el programa se diseña casi de manera inmediata in mediata como sigue: <1rs232.c> // Comunicación serie gestionada por software. #include <16f877.h> #use delay(clock=4000000 de lay(clock=4000000)) #use #use RS23 RS232( 2(BA BAUD UD=9 =96 600, 00, RESTART_WDT)
BITS BITS=8 =8,,
PARI PA RITY TY=N =N,,
XMIT XM IT=P =PIN IN_C _C6, 6,
RCV= RCV=PI PIN_ N_C7 C7,,
#include main() { int x=1; char c; lcd_init(); puts("Escribe tu nombre: "); lcd_putc("Te llamas: "); while (1) { c = getc(); putc(c); lcd_gotoxy(x,2); lcd_putc(c); x++; if(x>16) { x=1; } } }
El programa como de costumbre empieza con la cabecera, donde es importante situar la directiva #use delay antes que la directiva del puerto serie para un funcionamiento correcto. En la directiva para el puerto rs232 la velocidad en baudios, la paridad y el número de bits pueden pueden variar, variar, en este este ejercicio ejercicio se han han puesto puesto los valores valores más más emplead empleados, os, aunque aunque podrían podrían ser ser otros sin afectar demasiado al funcionamiento del programa. Las patillas XMIT y RCV deben coincidir con los pines de transmisión serie definidos para cada microcontrolador. Una vez iniciada la pantalla, en el programa principal la función puts lo que hace es enviar la cadena de caracteres a la pantalla principal del Hyperterminal (programa que se recuerda debe estar configurado con las mismas opciones que se han definido en la directiva rs232) y la función put_lcd enviará lo que le sigue a la pantalla LCD. En este momento el programa programa queda queda esperando esperando a recibir recibir algo algo por el el teclado. teclado. 95
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Una vez pulsada una tecla en el teclado, la función c=getc() hace que el microcontrolador reciba ese carácter y la siguiente función hace que se envíe en forma de eco a la pantalla del Hyperterminal. Después se coloca en la posición de pantalla correspondiente y las va escribiendo en el LCD.
4.5.2 PWM a distancia. Versión 1 . Una vez visto el ejemplo anterior que explicaba de manera sencilla el funcionamiento del puerto puerto serie se puede puede realizar realizar cualquier cualquier ejemplo ejemplo de mayor mayor o menor complejid complejidad ad que no debe debe entrañar ninguna dificultad para realizarlo por el alumno. Ya que en prácticas anteriores se ha visto el funcionamiento del PWM, aquí se va un poco más allá y se plantea un ejercicio de PWM a distancia. Hyperterminal las configuracio El programa deberá solicitar en el Hyperterminal configuraciones nes necesarias necesarias de frecuencia y duty para mostrar el resultado en la pantalla del ordenador, lcd y el led RB1 tal y como se detalla a continuación: Hyperterminal , se darán a elegir entre tres Inicialmente, ayudándose de la pantalla del Hyperterminal frecuencias posibles:
-
Si se se pulsa pulsa 1 se realiza realizará rá la con configu figurac ración ión para f = 500H 500Hzz Si se se pulsa pulsa 2 se realiza realizará rá la con configu figurac ración ión para para f = 2KHz 2KHz Si se se pulsa pulsa 3 se realiza realizará rá la con configu figurac ración ión para para f = 20KH 20KHzz Si se pulsa pulsa cual cualquie quierr otra tecla tecla se most mostrará rará un un mensaj mensajee de error error y se volve volverá rá a pedir pedir que se elija frecuencia
Además Ade más habr habráá que que memo memori riza zarr ese valo valorr en la memo memori riaa Eepr Eeprom om para para posi posibl blees desconexiones de alimentación. Una vez establecida la frecuencia habrá que solicitar, también mediante la pantalla del Hyperterminal Hyperterminal el duty con el que se quiere trabajar. -
Si se se pulsa pulsa 1 se realiza realizará rá la con configu figurac ración ión para duty duty = 1,5ms 1,5ms Si se se pulsa pulsa 2 se realiza realizará rá la con configu figurac ración ión para para duty duty = 750u 750uss Si se pulsa pulsa cual cualquie quierr otra tecla tecla se most mostrará rará un un mensaj mensajee de error error y se volve volverá rá a pedir pedir que se elija duty
También en este caso habrá que memorizarlo en la memoria Eeprom y en ambos casos se deberá enviar también la frecuencia y duty seleccionados a la pantalla LCD. Por último ya que en cada caso se graba en la memoria Eeprom las configuraciones correspondientes, en el inicio del programa se deberá crear una secuencia que informe en la Hyperterminal cuales eran las últimas configuraciones seleccionadas antes de la pantalla pantalla del Hyperterminal última desconexión y configurar con ellas el led.
Nota de ayuda : Inicialmente este programa puede dar algunos errores debido a que el carácter que el PIC recibe viene dado en código ASCII y habrá que cambiarlo a número entero. Para solucionar esto no habrá que hacer grandes esfuerzos puesto que el compilador incluye en su librería stdlib.h una función que convierte el código ASCII a números enteros. 96
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Si se consulta esta librería rápidamente se descubre qué función realiza este trabajo. En el programa programa solicitado solicitado simplemente simplemente habrá que incluir incluir esta librería y llamar llamar a la función función correspondiente cuando sea necesario. 4.5.2.1 Organigrama
Inicio
Parte 2
Parte 1
Incluir librería LCD y RS232
Enviar cadenas para selección de frec al PC
Declarar variables
Enviar cadenas para selección de duty al PC Recibir respuesta vía RS232
Recibir respuesta vía RS232
Iniciar Pantalla y led Configurar CCP1 como PWM
Convertir ASCII a entero
Convertir ASCII a entero
Escribir EEPROM
Escribir EEPROM
Leer EEPROM Seleccionar frecuencia y duty Enviar datos al PC
No
¿Frecuenci a correcta?
No
¿Duty correct o?
Sí Seleccionar frecuencia (PR2)
Sí Seleccionar duty (CCPR1L)
Mandar datos LCD
Mandar datos LCD
Mandar datos PC
Mandar datos PC
Parte 1 Parte 2
4.5.2.2 Solución
Tras incluir en la cabecera las configuraciones y librerías necesarias, será necesario definir al menos 3 variables. Por un lado la cadena de caracteres que reconocerá que valor se ha introducido por teclado y por otro lado dos variables de entero largo que alberguen los valores recibidos convertidos a número entero. Después de la definición de las variables comienza el programa principal, que tras las configuraciones e inicio de pantalla debería leer la memoria Eeprom para mostrar los resultados de frecuencia y duty anteriores a la desconexión de la alimentación. Comienza el primer bucle, aquel que solicita una frecuencia hasta que el valor introducido es válido y seguirá tres pasos: 97
María Aranda Elcuaz
-
Universidad Universid ad Pública de Navarra
Convie Conv ierte rte el val valor or ASC ASCII II a núme número ro ent enter eroo Memo Memoriz rizaa el el val valor or ente entero ro en la Eepro Eeprom m Entra Entra dentro dentro de una una condic condicion ional al que config configure ure PR2 PR2 como corre correspo sponda nda y muest muestre re la Hyperterminal selección por el led, la pantalla LCD y la pantalla del Hyperterminal
Cuando termina este bucle comienza otro exactamente igual, pero esta vez para la configuración del duty. Por lo tanto, una posible solución al problema planteado quedaría como sigue: #include <16f877.h> #fuses HS,NOPROTECT,NOPUT,NOBROWN HS,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP OUT,NOLVP #use delay(clock=400000 dela y(clock=4000000) 0) #use #use RS23 RS232( 2(BA BAUD UD=9 =960 600, 0, RESTART_WDT)
BITS BITS=8 =8,,
PARI PA RITY TY=N =N,,
XMIT XM IT=P =PIN IN_C _C6, 6,
RCV= RCV=PI PIN_ N_C7 C7,,
#use fast_io(B) #byte PORTB=6 #include #include char c[1]; long int k1,k2; main() { lcd_init(); lcd_gotoxy(1,1); PORTB=0b00000010; PORTB=0b00000010; // B1 será el led para la modulación setup_ccp1(CCP_PWM); // Configura CCP1 como PWM //Esta parte hasta el bucle infinito comprueba la eeprom para saber con //que valores se trabajó anteriormente puts("La ultima vez se trabajo con:"); k1=read_eeprom(0); //Lee el valor de la última frecuencia seleccionada i f (k1= (k1==1) { setup_timer_2(T2_DIV_BY_16,124,1); // f=500Hz (T=2ms) puts(" Una fre cuencia de 500 500 Hz") Hz") ; } if (k1==2) { setup_timer_2(T2_DIV_BY_16,30,1); // f=2KHz (T=0,5ms) puts(" Una fr ecuenci a de 2 KHz") Hz") ; } if (k1==3) { setup_timer_2(T2_DIV_BY_16,2,1); // f=20KHz (T=50us) puts(" Una fre cuencia de 20 KHz") Hz") ;
98
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
} k2=read_eeprom(1); // Lee el valor del último duty seleccionado i f (k2= (k2==1) { set_pwm1_duty(94); // Duty=1,5ms puts(" Y un duty de 1,5ms"); 1,5ms"); } if (k2==2) { set_pwm1_duty(16); // Duty=750us puts(" Y un duty de 750u 750us") s") ; } while(1) { parte1: puts("Pulsa 1, 2 o 3 segun a la frecuencia que ahora prefieras trabajar: "); puts ( "1 . f=500H f=500Hz z (T=2m (T=2ms=2000us)" ) ; puts("2. f=2kHz (T=0.5ms=500us)"); puts("3. f=20kHz (T=50us)"); gets(c); k1 = atoi32(c); //Convierte los ascii recibidos a numero entero. write_eeprom(0,k1); // Escribe k1 en la direccion 0 de la eeprom lcd_gotoxy(1,1); if (k1==1) { setup_timer_2(T2_DIV_BY_16,124,1); // f=500Hz (T=2ms) puts( puts( "Has selecc ionado la fr ecuencia de 500 500 Hz") Hz") ; lc d_pu tc (" f=50 f=500 0Hz->T= Hz->T=2ms ") ; } if (k1==2) { setup_timer_2(T2_DIV_BY_16,30,1); // f=2KHz (T=0,5ms) puts( puts( "Has selecc ionado la fr ecuencia de 2 KHz"); l cd_pu cd _putc tc ( " f=2kHz- >T=0.5m 0.5ms ") ; } if (k1==3) { setup_timer_2(T2_DIV_BY_16,2,1); // f=20KHz (T=50us) puts( puts( "Has selecc ionado la fr ecuencia de 20 KHz") Hz") ; lcd_putc("f=20KHz->T=50us "); } if ((k1!=1)&(k1!=2)&(k1!=3 ((k1!=1)&(k1!=2)&(k1!=3)) )) { puts("Error: Frecuencia indebida, selecciona de nuevo"); goto parte1; } parte2: puts("Selecciona el duty pulsando 1 o 2: "); puts( "1 . Duty= uty=1.5m 1.5ms"); puts("2. Duty=750us");
99
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
gets(c); k2 = atoi atoi32 32(c (c); ); //Con //Convi viert erte e los los asci asciii recibi recibido dos s a un numer numero o ente entero ro.. write_eeprom(1,k2); // Escribe k2 en la direccion 1 de la eeprom lcd_gotoxy(1,2); if (k2==1) { set_pwm1_duty(94); // Duty=1,5ms puts( puts( "Has sele cc ionado el duty duty de 1.5m 1.5ms"); lc d_pu tc (" Duty = 1.5ms 1.5ms ") ; } if (k2==2) { set_pwm1_duty(16); // Duty=750us puts("Has seleccionado el duty de 750us"); lcd_putc(" Duty = 750us "); } if ((k2!=1)&(k2!=2)) { puts("Duty incorrecto, selecciona de nuevo"); goto parte2; } puts(" "); } }
4.5.3 PWM a distancia. Versión 2 . El programa realizado en el punto anterior es interesante pero demasiado largo y poco práctico práctico debido debido a que solo se pueden pueden seleccionar seleccionar tres diferentes diferentes tipos de frecuenc frecuencia ia y dos de duty. El problema está en que se emplea una función que escribe carácter a carácter y no por bloques. bloques. Si se sustituye la función función de escritura por printf se soluciona dicho problema y se puede puede obtener obtener un program programaa más corto corto y con un un rango de elección elección de la configuració configuraciónn mucho mucho más amplio. Así pues, en este programa se pide: 1º) Pedir por pantalla una frecuencia frecuencia en Hz que esté dentro del rango admisible, admisible, si no es así, mostrar un mensaje de error y volver a solicitarla. 2º) Pedir por pantalla un duty que esté dentro del rango admisible, si no es así, mostrar un mensaje de error y volver a solicitarlo. 3º) Mostrar las configuraciones mediante el led, la pantalla LCD y en la pantalla del Hyperterminal Hyperterminal mostrar además los valores obtenidos para PR2 y CPR1L. 4.5.3.1 Organigrama
100
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Inicio Incluir librería LCD y RS232 Declarar variables Iniciar Pantalla y led Configurar CCP1 como PWM Seleccionar duty Enviar datos al PC Parte 1 Parte 2
101
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Parte 2
Parte 1
Enviar cadenas para selección de duty al PC
Enviar cadenas para selección de frec al PC
Recibir respuesta vía RS232
Recibir respuesta vía RS232 Convertir ASCII a entero
Convertir ASCII a entero
Calcular PR2
Calcular CCPR1L
No
No
¿PR2 válido?
¿CCPR1 L correcto?
Sí Seleccionar frecuencia
Sí Seleccionar duty
Mandar datos LCD
Mandar datos LCD
Mandar datos PC
Mandar datos PC
4.5.3.2 Solución
El problema en este caso conlleva algún cambio más respecto al anterior. Habrá que definir una cadena de caracteres más larga y una vez introducida habrá que operar con ella para obtener obtener los valores valores correspond correspondiente ientess de PR2 y CCPR1L, CCPR1L, ya que esta vez no son inmediatos. #include <16f877.h> #fuses HS,NOPROTECT,NOPUT,NOBROWN HS,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP OUT,NOLVP #use delay(clock=400000 dela y(clock=4000000) 0) #use #use RS23 RS232( 2(BA BAUD UD=9 =960 600, 0, RESTART_WDT)
BITS BITS=8 =8,,
PARI PA RITY TY=N =N,,
XMIT XM IT=P =PIN IN_C _C6, 6,
RCV= RCV=PI PIN_ N_C7 C7,,
#use fast_io(B) #byte PORTB=6 #include #include
102
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
char frec[5]; long int k1,K2,PR2,CCPR1L; main() { lcd_init(); lcd_gotoxy(1,1); lcd_putc("F=
Hz");
lcd_gotoxy(1,2); lcd_putc("Duty=
us");
PORTB=0b00000010; PORTB=0b00000010; setup_ccp1(CCP_PWM);
// B1 led para la modulación // Configura CCP1 como PWM
puts("Ejercicio de PWM a distancia."); set_pwm1_duty(0);
// Frecuencia 0 de partida
while(1) { parte1: puts("Elige la frecuencia que prefieras trabajar en Hz y pulsa INTRO: "); gets(frec); k1 = atoi3 atoi32(f 2(frec) rec);; //Conv //Conviert ierte e ascii ascii a un un numero numero entero. entero. printf ("%Lu" ("%Lu" " Hz", k1); puts(" "); PR2 PR2=(62 =(6250 500/k1) 0/k1) - 1; if ((PR2<0)|(PR2>255)) ((PR2<0)|(PR2>255)) { puts("Frecuencia indebida, seleccione de nuevo una frecuencia"); goto parte1; } if ((PR2>0)&(PR2<256 ((PR2>0)&(PR2<256)) )) { setup_timer_2(T2_DIV_BY_16,PR2,1); prin t f ( " por por tanto, PR2=" "%Lu", PR2); puts(" uts(" "); } lcd_gotoxy(4,1); printf(lcd_putc,"%Lu",k1); parte2: puts("Elige el duty en us y pulsa INTRO: "); gets(frec); k2 = atoi32(frec); printf ("%Lu" ("%Lu" " us", us", k2); //Devu //Devuelve el dato ato recib ido puts(" uts(" "); CCPR1L=k2/16; if ((CCPR1L<0)|(CCPR1L>255) ((CCPR1L<0)|(CCPR1L>255))) {
103
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
puts("Duty incorrecto, repite el proceso"); goto parte2; } if ((CCPR1L>0)&(CCPR1L<256 ((CCPR1L>0)&(CCPR1L<256)) )) { set_pwm1_duty(CCPR1L); printf(" por tanto, CCPR1L=" "%Lu", CCPR1L); puts(" uts(" "); } lcd_gotoxy(7,2); printf(lcd_putc,"%Lu",k2); puts("Muy puts("Muy bien, ahora ahora com comprue prueba ba el resul tado en la placa. " ) ; puts(" "); } }
104
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Capítulo 5. Comunicaciones CAN 5.1 Introducción
5.1.1 El CAN y su historia El CAN (Controller Area Network) es un bus de comunicaciones serie en tiempo real originalmente desarrollado en la automoción alemana a mediados de los años 80 por Robert Bosch. Su objetivo principal era hacer los automóviles más seguros, fiables y con un gasto de combustible más eficiente mientras se reducía el peso y la complejidad de los mismos. Algunos años importantes para el CAN son: - 1983: Comienzo del proyecto interno de Bosch para vehículos - 1987: Primeros controladores CAN desde Intel y Philips - 1991: Se publica la especificación 2.0 - 1992: Se establece establece la CiA (CAN in Automation) y el CAN comienza a emplearse en los automóviles de la casa Mercedes - 1993: se publica el estándar ISO 11898 - 1995: se añade la trama extendida a la ISO 11898 A pesar de que hoy en día el 80% de las aplicaciones CAN están en la industria automovilística, el protocolo CAN también se ha ido extendiendo a otros mercados:
5.1.2 Aplicaciones Como ya se ha comentado anteriormente, la mayor parte de las aplicaciones que posee el CAN están concentradas en la industria automovilística donde realiza el control del motor, de la mecánica del automóvil así como los sistemas de entretenimiento. Relacionado con la industria automovilística, el CAN se extiende al transporte público y otras máquinas móviles como aviones, helicópteros, trenes y los controles de tráfico y sistemas de información conductor/pasajero. Pero en general el CAN se aplica en cualquier sistema de control industrial: sistemas de control de plantas y maquinaria, redes entre máquinas, sistemas de supervisión… y en la automa automatiza tizació ciónn de edifici edificios os:: con control trol de ascens ascensore ores, s, aire acondi acondicio cionad nado, o, sistem sistemas as de calefacción y refrigeración, control de iluminación… En resumen, en cualquier sistema que precise precise control control en en tiempo tiempo real real distribuido distribuido y con escas escasoo flujo de de datos. datos. 5.2 Características del bus CAN
El bus CAN es un bus serie de transmisión de datos en tiempo real que sigue la norma ISO 11898 y sus características son:
105
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
1. La comunicación está basada en mensajes y no en direcciones, todos los nodos CAN son son capa capace cess de trans transmi mitir tir y reci recibir bir datos datos y vario varioss pued pueden en acce accede derr al bus bus de dato datoss simu simult ltán ánea eame mente nte.. No hay hay siste sistema ma de direc direcci cion onam amie ient ntoo de los los nodo nodoss en el sent sentido ido convencional y los mensajes se envían según su prioridad: Un nodo emisor envía el mensaje a todos los nodos de la red, cada nodo, según el identificador del mensaje, lo filtra y decide si debe procesarlo inmediatamente o descartarlo. Este identificador es quien determina la prioridad que determina que mensaje accede primero al bus.
Figura 5.2a 2. Flexibilidad: Se pueden añadir nodos adicionales al bus sin necesidad de reprogramar todo el sistema para que se reconozcan los nuevos nodos. 3. Gran fiabilidad en la transmisión: - Detecta errores, los señaliza, envía mensaje de error y reenviará el mensaje corrupto una vez que el bus vuelva a estar activo - Dist Disting ingue ue entre entre erro errore ress temp tempora orale less y erro errore ress perm perman anen ente tess desc descon onec ectan tando do automáticamente los nodos defectuosos. - Puede operar en ambientes con condiciones extremas de ruido e interferencias. 4. La velocidad de transmisión depende de la longitud de la red. Cada red puede alcanzar los 1000 metros de longitud.
Figura 5.2.b 5.3 Arquitectura de capas
La arquitectura del protocolo CAN está basada en capas y permite la interoperabilidad entre productos de diferentes manufacturas gracias a la creación del modelo de referencia 106
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
OSI (Open System Interconection, ISO 7498). Este modelo implementa las dos capas inferiores del protocolo CAN, la capa física y la capa de enlace de datos.
5.3.1 Capa física La capa física es responsable de la transferencia de bits entre los distintos nodos que componen la red. Define aspectos como niveles de señal, codificación, sincronización y tiempos en que los bits se transfieren al bus. En la espec especifica ificació ciónn origina originall de CAN, CAN, la capa capa física física no fue definid definida, a, permit permitien iendo do diferentes opciones para la elección del medio y niveles eléctricos de transmisión. Las características de las señales eléctricas en el bus fueron establecidas más tarde por el estándar ISO 11898 y su modelo de referencia OSI. Además, ahí se especifica tres niveles con distintas funciones cada uno. Los distintos niveles de la capa física son:
Figura 5.3.1.a Los nodos conectados al bus interpretan dos niveles lógicos denominados: Dominante Dominante: la tensión diferencial (CAN_H - CAN_L) es del orden de 2.0 V con CAN_H =
3.5V y CAN_L = 1.5V (nominales). ( nominales). Recesivo:
la tensión diferencial (CAN_H - CAN_L) es del orden de 0V con CAN_H = CAN_L = 2.5V (nominales). La codificación de bits se realiza por el método NRZ ( Non-Return-to Zero) que se caracteriza por que el nivel de señal puede permanecer constante durante largos periodos de tiempo y habrá que tomar medidas para asegurarse de que el intervalo máximo permitido entre dos señales no es superado. Esto es importante para la sincronización. No hay flanco flanco de subida subida ni de bajada bajada para cada bit, durante durante el tiempo tiempo de bit hay bits dominantes (“0”) y recesivos (“1”) y disminuye la frecuencia de señal respecto a otras codificaciones (como la codificación Manchester, por ejemplo).
107
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Figura 5.3.1.b
5.3.2 Capa de enlace de datos La capa de enlace es responsable del acceso al medio y el control lógico y está dividida a su vez en dos niveles. El primero sería el LLC, Logical Link Control, que se dedica al filtrado de aceptación, la notificación de sobrecarga y a la gestión de recuperación. El segu segund ndoo nive nivell es el MAC, Médi Médium um Ac Acce cess ss Co Cont ntro rol, l, dedi dedica cado do al enca encaps psul ulad adoo y desencapsulado de datos, codificación de las tramas, gestión de acceso al medio, detección y señalización de errores, acuses de recibo… Todo esto se irá viendo en los puntos posteriores de este capítulo. 5.4 Mensajes y tipos de tramas
Como se ha comentado en el apartado de características, el protocolo CAN está basado en mensajes no en direcciones. El nodo emisor transmite el mensaje a todos los nodos de la red sin especificar un destino y todos ellos escuchan el mensaje para luego filtrarlo según le interese o no. Exis Existe tenn dist distin into toss tipo tiposs de tram tramas as pred predeefini finida dass por por CAN CAN para para la gest gestió iónn de la comunicación: Trama de datos :
Se utiliza normalmente para poner información en el bus y la pueden recibir algunos o todos los nodos. Trama Trama de informa información ción remota remota:
pue puede ser ser util utiliz izad adaa por por un nodo nodo para para soli solici cita tarr la transmisión de una trama de datos con la información asociada a un identificador dado. El nodo que disponga de la información definida por el identificador la transmitirá en una trama de datos. Trama de error : Se generan cuando algún nodo detecta algún error definido. Trama de sobrecarga: Se generan cuando algún nodo necesita más tiempo para procesar
los mensajes recibidos. Espaciado Espaciado entre tramas tramas: Las tramas de datos (y de interrogación remota) se separan entre
sí por una secuencia predefinida que se denomina espaciado 108nter.-trama. Bus en reposo:
En los intervalos de inactividad se mantiene constantemente el nivel
recesivo del bus. En un bus CAN los nodos transmiten la información espontáneamente con tramas de datos, bien sea por un proceso cíclico o activado ante eventos en el nodo. La trama de interrogación remota sólo se suele utilizar para detección de presencia de nodos o para 108
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
puesta puesta al día de información información en un nodo recién incorporado incorporado a la red. Los mensajes mensajes pueden pueden entrar en colisión en el bus, el de identificador de mayor prioridad sobrevivirá y los demás son retransmitidos lo antes posible.
5.4.1 Trama de datos
Figura 5.4.1.a Los mensajes de datos consisten en celdas que envían datos y añaden información definida por las especificaciones CAN:
Figura 5.4.1.b Inicio de trama (SOF): El inicio de trama es una celda de un solo bit siempre dominante
que indica el inicio del mensaje, sirve para la sincronización con otros nodos. Celda de Arbitraje (Arbitration Field):
Es la celda que concede prioridad a unos mensajes
o a otros: -
En form format atoo está estánd ndar ar tend tendrá rá 11 bits bits segu seguid idos os del del bit bit RTR RTR (Rem (Remot otee Tran Transm smis isió iónn Request) que en este caso será dominante.
Figura 5.4.1.c -
En forma formato to exten extendid didoo serán serán 11 bits bits de iden identif tific icad ador or base base y 18 de exte extendi ndido do.. El bit bit SRR substituye al RTR y será recesivo.
Figura 5.4.1.d 109
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Nota: La trama trama en en formato formato estánda estándarr prevalece prevalece sobre sobre la la extendida extendida El campo de control está formado por dos bits reservados para uso futuro y cuatro bits adicionales que indican el número de bytes de datos. En realidad el primero de estos bits (IDE) se utiliza para indicar si la trama es de CAN Estándar (IDE dominante) o Extendido (IDE recesivo). El segundo bit (RB0) es siempre recesivo. Los cuatro bits de código de longitud (DLC) indican en binario el número de bytes de datos en el mensaje (0 a 8) Celda Celda de control control (Contro (Controll Field): Field):
Celda de Datos (Data Field):
Es el campo de datos de 0 a 8 bytes.
Código de redundancia cíclica: Tras comprobar este código se podrá comprobar si se han producido errores. CRC:
es un campo de dos bits que indica si el mensaje ha sido recibido correctamente. El nodo transmisor pone este bit como recesivo y cualquier nodo que reciba el mensaje lo pone como dominante para indicar que el mensaje ha sido recibido. Celda de reconocimiento (ACK):
Fin de trama (EOF): (EOF): Consiste en 7 bits recesivos sucesivos e indica el final de la trama. Espaciado Espaciado entre tramas (IFS): Consta de un mínimo de 3 bits recesivos.
5.4.2 Trama remota Los nodos tienen habilidad para requerir información a otros nodos. Un nodo pide una información a los otros, el nodo que tiene dicha información envía una comunicación con la respuesta que puede ser recibida además por otros nodos si están interesados.
Figura 5.4.2.a Un mensaje de petición remota tiene la siguiente forma:
Figura 5.4.2.b
110
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
En este tipo de mensajes se envía una trama con el identificador del nodo requerido, a diferencia con los mensajes de datos, el bit RTR toma valor recesivo y no hay campo de datos. En caso de que se envíe un mensaje de datos y de petición remota con el mismo identificador, el de datos ganará el acceso al bus puesto que el RTR lleva valor dominante.
5.4.3 Trama de error Las tramas de error son generadas por cualquier nodo que detecta un error. Consiste en dos campos: Indicador de error ("Error Flag") y Delimitador de error. El delimitador de error consta de 8 bits recesivos consecutivos y permite a los nodos reiniciar la comunicación limpiamente tras el error. Indicador de error error es distinto según el estado de error del nodo que detecta el error: El Indicador
Figura 5.4.3.a Si un nodo en estado de error "Activo" detecta un error en el bus interrumpe la comunicación del mensaje en proceso generando un "Indicador de error activo" que consiste en una secuencia de 6 bits dominantes sucesivos. Esta secuencia rompe la regla de relleno de bits y provocará provocará la generación generación de tramas de error en otros nodos. Por tanto el Indicador de error puede extenderse entre 6 y 12 bits dominantes sucesivos. Finalmente se espera el campo de delimitación de error formado por los 8 bits recesivos. Entonces la comunicación se reinicia y el nodo que había sido interrumpido reintenta la transmisión del mensaje. Si un nodo en estado de error "Pasivo" detecta un error, el nodo transmite un "Indicador de error pasivo" seguido, de nuevo, por el campo delimitador de error. El indicador de error de tipo pasivo consiste en 6 bits recesivos seguidos y, por tanto, la trama de error para un nodo pasivo es una secuencia de 14 bits recesivos. De aquí se deduce que la transmisión de una trama de error de tipo pasivo no afectará a ningún nodo en la red, excepto cuando el error es detectado por el propio nodo que está transmitiendo. En ese caso los demás nodos detectarán una violación de las reglas de relleno y transmitirán a su vez tramas de error. Tras señalar un error por medio de la trama de error apropiada cada nodo transmite bits rece recesiv sivos os hast hastaa que que recib recibee un bit tamb tambié iénn rece recesiv sivo, o, lueg luegoo tran transm smite ite 7 bits bits rece recesiv sivos os consecutivos antes de finalizar el tratamiento de error. La regla de relleno de bits que aparece líneas arriba consiste en que cada cinco bits de igual valor se introduce uno de valor inverso tal y como se ve en la figura siguiente:
111
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Figura 5.4.3.b Otro método para la detección de errores es el chequeo de la trama:
Figura 5.4.3.c El campo CRC contiene información adicional a la trama, éste se calcula con un polinomio polinomio generador generador de igual manera en el receptor receptor y en el emisor. emisor. Esto permite permite detectar detectar errores aleatorios en hasta 5 bits o una secuencia seguida de 15 bits corruptos. El campo ACK, en el caso del emisor será recesivo y el receptor deberá sobrescribirlo como dominante y el primero comprobará, mediante la monitorización, que el mensaje ha sido escuchado. Si no sucede así, la trama se considerará corrupta.
5.4.4 Espacio entre tramas El espacio entre tramas separa una trama (de cualquier tipo) de la siguiente trama de datos o interrogación remota. El espacio entre tramas ha de constar de, al menos, 3 bits recesivos. Esta secuencia de bits se denomina "íntermission". Una vez transcurrida esta secuencia un nodo en estado de error activo puede iniciar una nueva transmisión o el bus permanecerá en reposo. Para un nodo en estado error pasivo la situación es diferente, deberá espera una secuencia adicional de 8 bits recesivos antes de poder iniciar una transmisión. De esta forma se asegura una ventaja en inicio de transmisión a los nodos en estado activo frente a los nodos en estado pasivo.
5.4.5 Trama de sobrecarga Una trama de sobrecarga tiene el mismo formato que una trama de error activo. Sin embargo, la trama de sobrecarga sólo puede generarse durante el espacio entre tramas. De esta forma se diferencia de una trama de error, que sólo puede ser transmitida durante la transmisión de un mensaje. La trama de sobrecarga consta de dos campos, el Indicador de Sobrecarga, y el delimitador. El indicador de sobrecarga consta de 6 bits dominantes que pueden pueden ser seguidos seguidos por los generado generadoss por otros nodos, nodos, dando lugar lugar a un máximo de 12 12 bits dominantes. El delimitador es de 8 bits recesivos. 112
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Una trama de sobrecarga puede ser generada por cualquier nodo que debido a sus condiciones internas no está en condiciones de iniciar la recepción de un nuevo mensaje. De esta forma retrasa el inicio de transmisión de un nuevo mensaje. Un nodo puede generar como máximo 2 tramas de sobrecarga consecutivas para retrasar un mensaje. Otra razón para iniciar la transmisión de una trama de sobrecarga es la detección por cualquier nodo de un bit dominante en los 3 bits de "intermission". Por todo ello una trama de sobrecarga de 5 generada por un nodo dará normalmente lugar a la generación de tramas de sobrecarga por los demás nodos dando lugar, como se ha indicado, a un máximo de 12 bits dominantes de indicador de sobrecarga. 5.5 Acceso múltiple y arbitraje de acceso al bus
Figura 5.5.a CAN permite el acceso al bus de varios nodos a la vez. El proceso de arbitraje está basado en el CSMA/CD (Carrier Sense Multiple Access with Collision Detection): Cada nodo debe vigilar el bus en un periodo sin actividad antes de enviar un mensaje (Carrier Sense) y además, una vez que ocurre el periodo sin actividad cada nodo tiene la misma oportunidad de enviar un mensaje (Multiple Access). En caso de que dos nodos comiencen a transmitir al unísono se detectará la colisión. Al detectarse la colisión comienza el arbitraje. Cada nodo emisor envía los bits del identificador del mensaje y vigila el bus comprobando lo que emite. El nodo de mayor prioridad prioridad (con bits dominant dominantes, es, “0”) accederá accederá primero primero al bus y una vez vez pasado pasado un tiempo tiempo de espera, diferente para cada nodo, se vuelve a intentar el acceso sin repetición de mensaje ni pérdidas pérdidas de tiempo ya que esta contención contención es a nivel de bit. Es un modo no destructivo, destructivo, los mensajes permanecen intactos a pesar de detectar colisiones y no conlleva retrasos en los mensajes de alta prioridad, prioridad que viene especificada en el identificador de mensaje. En la figura 5.5.b se ve un ejemplo de arbitraje en un bus CAN.
113
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Figura 5.5.b 5.6 Especificaciones del protocolo CAN
Se puede hablar de tres especificaciones CAN 2.0 que se utilizan hoy en día: Protocolo Protocolo CAN especificación especificación 2.0 A: solo maneja mensajes estándar con identificador de 11
bits Protocolo Protocolo CAN especificación especificación 2.0 2.0 Pasivo Pasivo: solo transmite mensajes estándar con identificador
de 11 bits, bits, pero pero comp compru rueb ebaa si reci recibe be mens mensaje ajess está estánd ndar ar y mens mensaje ajess exte extend ndido idoss con con identificadores de 29 bits. Protocolo Protocolo CAN especificación especificación 2.0 2.0 Activo: transmiten y reciben mensajes estándar y mensajes
extendidos 5.7 Protocolos de alto nivel
El protocolo CAN especifica la forma de transmitirse la información y en que condiciones se realiza según el estándar ISO 11898. Para especificar la estructura de la información que se transmite y otros mecanismos para dotar de funcionalidad específica a los nodos se precisa protocolo adicional de más alto nivel. Ejemplos de protocolo de más alto nivel pueden pueden ser CANopen y MCNet protocol
5.8 Implementación de controladores CAN
Existen tres tipos de arquitecturas en microcontroladores: Stand-Alone CAN controller, Integrated CAN Controller y Single-Chip CAN Node.
114
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
5.8.1 Stand-Alone CAN Controller Es la arquitectura más simple, para llevar a cabo una comunicación en una red CAN será necesario: 1. Un microcontrolador como puede ser el 16F877, con el que se ha venido trabajando a lo largo de todo este proyecto. 2. Un controlador CAN que introduzca el protocolo CAN, filtro de mensajes,… y todo el inter interfac facee nece necesa sario rio para para las las comu comunic nicac acion iones es.. Un ejemp ejemplo lo de contr control olad ador or CAN CAN es el MCP2510 cuya DATA SHEET se puede encontrar en la página web de microchip. 3. Un transceiver CAN, esto es, un transmisor/receptor que puede ser por ejemplo el MCP2551 desarrollado por microchip.
Figura 5.8.1 Así pues, si de alguna manera se pretende trabajar en una red CAN con la placa de pruebas pruebas en la que se han desarrollado desarrollado los ejercicios ejercicios anteriores anteriores no sería factible a no ser que de alguna manera se le acoplasen el controlador y el transceptor CAN correspondiente. Microchip ha creado una placa de pruebas específica para este tipo de comunicaciones, que desarrolla además este tipo de arquitectura y que se puede conseguir también a través de la página web de microchip.
5.8.2 Integrated CAN Controller Este tipo de arquitectura consiste en un microcontrolador que incluya, no sólo sus cara caract cter eríst ística icass prop propia iass sino sino adem además ás un módu módulo lo CAN CAN con con las las cara caracte cterís rístic ticas as de un microcontrolador CAN. El transceiver se sitúa de manera separada.
Figura 5.8.2 115
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
5.8.3 Single-chip CAN Node
Figura 5.8.3 Se trata de un chip que incluye en su interior los tres elementos necesarios para llevar a cabo las comunicaciones en un entorno CAN.
116
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
ANEXOS
117
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Anexo 1: Librerí Librerías as
1.1 Librería LCD //////////////////////////////////////////////////////////////////////// lcd_picdem.c Driver para módulos LCD microcontrolados Funciones definidas: lcd_init() Inicialización,llamar Inicialización,lla mar antes de cualquier otra función. lcd_putc(c) Muestra c en la posicion siguiente del LCD. Caracteres de control: \f Borra display \n Sitúa cursor al comienzo de la línea 2 \b Retrocede el cursor una posición \t Avanza el cursor una posición \r Retro Retroce cede de una una posi posició ción n la pant pantall alla a visibl visible e \v Avanza una posición la pantalla visible lcd_gotoxy(x,y) Sitúa escritura en posición del LCD (posición 1,1: arriba a la izquierda) lcd_getc(x,y) Devuelve carácter en posición x,y del LCD //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// Conexión a 7 pines del MCU: 3 de control / interface de datos de 4 bits: Líneas de control asignadas RA1 enable RA2 rw RA3 rs Líneas de Datos RD0 D4 RD1 D5 RD2 D6 RD3 D7 //////////////////////////////////////////////////////////////////////// struct lcd_pines_control { // Estructura Estructura que se define para para facilitar acceso acceso boolean nada; boolean boolean enable; enable; boolean rw; boolea lean rs; rs;
//y asoc asociarl iarlos os a los 3 bits más más bajos bajos del del PORTA PORTA //se asigna luego a esta estructura el PORTA //rs (1º) corr corre esponde al menos signif gnific ica ativo //a los pines de control del LCD
int otros : 4; } lcd_control; struct lcd_pines_datos { // Se hace lo mismo con esta estructura para el PORTD int int
dato datos: s:4; 4;
//lo //los s 4 bits bits más más bajo bajos s son son los los de dato datos s
118
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
int no_usados:4; } lcd_datos; #byte lcd_control = 5 //Se pone la estructura entera en el PORTA #byte trisa = 0x85 //Registro de dirección de datos #byte lcd_datos = 8 #byte trisd = 0x88
//Lo mismo para los datos, en el PORTD //Registro de dirección de datos
#define lcd_linea_dos 0x40 //Dirección de inicio para la 2ª 2ª línea en la //DDRAM
//////////////////////////////////////////////////////////////////////// -Prototipos de las funciones //////////////////////////////////////////////////////////////////////// void lcd_init(); byte lcd_read_byte(); void lcd_send_nibble(byte n); void lcd_send_byte(byte address, byte n); void lcd_gotoxy(byte x, byte y); void lcd_putc(char c); char lcd_getc(byte x, byte y); void lcd_clr_line(char fila); //////////////////////////////////////////////////////////////////////// Función que inicializa el LCD, se deberían cambiar bits para cambiar configuración //////////////////////////////////////////////////////////////////////// void lcd_init() { byte i; trisa&=0b11110001; //Se asigna salidas en RA1, RA2 y RA3, resto puerto //como estaba trisd&=0b11110000; // Lo mismo para RD0 a RD3 lcd_co lcd_control . rs = 0; lcd_control.rw = 0; lcd_control.enable = 0; delay_ms(15); for(i=1;i<=3;++i) { lcd_send_nibble(3); delay_ms(5); } lcd_send_nibble(2); lcd_send_byte(0,0b00101000);//Se envía Function set 0 0 1 DL N F lcd_send_byte(0,0b00001100);//Se envía Display on/off 0 0 0 0 1 D C B lcd_send_byte(0,0b00000001);//Se envía Clear Display lcd_send_byte(0,0b00000110);//Se envía Entry Modeset 0 0 0 0 0 1 I/D I/ D S //////////////////////////////////////////////////////////////////////// DL: datos 4 bits(0); 8 bits (1)
119
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
N: 2 líneas (1); 1 línea (0) F: 5x10 (1); 5x8 (0) D: display on (1); off (0) C: cursor on (1); off (0) B: parpadeo pos.cursor (1); no (0) I/D: incremento en R/W (1) o decremento (0) S: acompaña desplaz.display (1); no (0) //////////////////////////////////////////////////////////////////////// } //////////////////////////////////////////////////////////////////////// Lee el byte señalado por el puntero, 1º parte alta, 2º parte baja Si al llamar a esta función rs=0, devuelve busy flag (+signif.) y dirección actual //////////////////////////////////////////////////////////////////////// byte lcd_read_byte() { byte low,high; tr is a&= a&=0b11110001;// Señales de control control (sal id as) , el resto lo que que sean sean trisd|=0b00001111;//Las de datos pasan a ser entradas, las demás igual lcd_control lcd_control . rw = 1; delay_cycles(1); lcd_control.enable = 1; delay_cycles(1); high = lcd_datos.datos; lcd_control.enable = 0; delay_cycles(1); lcd_control.enable = 1; delay_us(1); low = lcd_datos.datos; lcd_control lcd_control .enable = 0; t r i s d&=0b1 d&=0b111 1110 1000 000; 0; / / Dejamos Dejamos RD0 RD0 a RD3 RD3 como como sa l i d as return( (high<<4) | low); } //////////////////////////////////////////////////////////////////////// Envía medio byte, los 4 bits más bajos de n Necesario poner rs y rw de modo adecuado y entrar con enable=0 //////////////////////////////////////////////////////////////////////// void lcd_send_nibble( byte n ) { lcd_datos.datos = n; delay_cycles(1); lcd_control.enable = 1; delay_us(2); lcd_control.enable = 0; } //////////////////////////////////////////////////////////////////////// -Envía un byte (n) al registro de instrucciones (si address=0) ó reg. de datos (address=1) -Utiliza lcd_send_nibble(n) enviando primero nibble alto del byte ////////////////////////////////////////////////////////////////////////
120
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
void lcd_send_byte( byte address, byte n ) { lcd_control.rs = 0; while ( bit_tes t( l cd_read_b cd_read_byte(),7 ) ); / /Mientras esté esté oc ocupado el LCD, //espera lcd_control lcd_control . r s = addres dress; s; delay_cycles(1); lcd_control lcd_control . rw = 0; delay_cycles(1); lcd_control lcd_control .enable = 0; lcd_send_nibble( lcd_send_nibble( n >> >> 4); lcd _send_nibb _send_nibb le (n & 0x0F); 0x0F); } //////////////////////////////////////////////////////////////////////// Sitúa el contador de direcciones en la DDRAM (para lectura o escritura posterior): x puede ir de 1 a 40, posición dentro de una línea (16 visibles) y puede ser 1 (línea 1) o 2 (línea 2) //////////////////////////////////////////////////////////////////////// void lcd_gotoxy( byte x, byte y) { byte posicion; if(y!=1) posicion=lcd_linea_dos; else posicion=0; posicion+=x-1; lcd_send_byte(0,0x80|posicion); //Las direcciones de la DDRAM empiezan //por 1xxxxxxx } //////////////////////////////////////////////////////////////////////// Envía un carácter c a la DDRAM del LCD, también algunos caracteres de control: //////////////////////////////////////////////////////////////////////// void lcd_putc( char c) { switch (c) { case '\ f ' : lcd_sen lcd_send_ d_by byte( te(0,1); 0,1); brea break; k; // L impia impia la pantal ntal la delay_ elay_ms(2); s(2); case ase '\n' '\n':: lcd_gotoxy(1,2) lcd_gotoxy(1,2) ; break; break; // Coloca puntero puntero en en 1ª posici posici on de la 2ª lí nea case ase ' \b ' : lcd_send lcd_send_b _byte(0,0x yte(0,0x10 10); ); brea break; k; // Retr ocede ocede un una posic posic ión el cursor cursor case ase '\t' '\t' : lcd_send_b lcd_send_byte(0,0x1 yte(0,0x14); 4); break; break; // Avanza Avanza un una posic posic ión el cursor cursor case '\r' : lcd_send_byte(0,0x18); break; //Retr ocede ocede una posición la pantal ntal la visi b le case '\v' : lcd_send_byte(0,0x1C); break br eak;; //Avanza //Avanza una posición la pantal ntal la vis ib le default efault : lcd_sen lcd_send_ d_b byte(1,c); yte(1,c); brea break; k; //Si es una tira, los envía todos uno a uno } }
121
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
//////////////////////////////////////////////////////////////////////// Devuelve el carácter situado en la posición x,y de la DDRAM //////////////////////////////////////////////////////////////////////// char lcd_getc( byte x, byte y) { char value; lcd_gotoxy(x,y); lcd_control.rs=1; value = lcd_read_byte(); lcd_control.rs=0; return(value); } //////////////////////////////////////////////////////////////////////// Limpia la linea correspondiente y se situa al principio de la misma //////////////////////////////////////////////////////////////////////// void lcd_clr_line(char fila) { int j; lcd_gotoxy(1,fila); for (j=0;j<40;j++) lcd_putc(' '); lcd_gotoxy(1,fila); }
122
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
1.2 Librería 16F877 ////////// / / Stan Stand dard ard He Header fi le for the the PIC1 PIC16 6F77 device vice // / / / / / / / / / / / / #device PIC16F77 #nolist //////// Program memory: 8192x14 8192x14 Data RAM: RAM: 367 Stack: 8 //////// I/O: 33 Analog Pins: 8 //////// C Scratch area: 77 ID Location: 2000 //////// Fuses: LP,XT,HS,RC,NOWDT,WDT,NOPUT,PUT,PROTECT,NO LP,XT,HS,RC,NOWDT,WDT,NOPUT,PUT,PROTECT,NOPROTECT PROTECT //////// Fuses: NOBROWNOUT,BROWNOU NOBROWNOUT,BROWNOUT T //////// ////////////////////////////////////////////////////////////////// I/O // Discrete I/O Functions: SET_TRIS_x(), OUTPUT_x(), INPUT_x(), // PORT_B_PULLUPS(), INPUT(), // OUTPUT_LOW(), OUTPUT_HIGH(), // OUTPUT_FLOAT(), OUTPUT_BIT() // Constants used to identify pins in the above are: #define PIN_A0 #define PIN_A1 #define PIN_A2 #define PIN_A3 #define PIN_A4 #define PIN_A5
40 41 42 43 44 45
#define PIN_B0 #define PIN_B1 #define PIN_B2 #define PIN_B3 #define PIN_B4 #define PIN_B5 #define PIN_B6 #define PIN_B7
48 49 50 51 52 53 54 55
#define PIN_C0 #define PIN_C1 #define PIN_C2 #define PIN_C3 #define PIN_C4 #define PIN_C5 #define PIN_C6 #define PIN_C7
56 57 58 59 60 61 62 63
#define PIN_D0 #define PIN_D1 #define PIN_D2 #define PIN_D3 #define PIN_D4 #define PIN_D5 #define PIN_D6 #define PIN_D7
64 65 66 67 68 69 70 71
#define PIN_E0 72 #define PIN_E1 73 #define PIN_E2 74 ///////// // // / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / #define FALSE 0
Use fu l de f i n e s
123
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
#define TRUE 1 #define BYTE int #define BOOLEAN short int #define getc getch #define fgetc getch #define getchar getch #define putc putchar #define fputc putchar #define fgets gets #define fputs puts //////////////////////////////////////////////////////////////// Control // Control Functions: RESET_CPU(), SLEEP(), RESTART_CAUSE() // Constants returned from RESTART_CAUSE() are: #define WDT_FROM_SLEEP 0 #define WDT_TIMEOUT 8 #define MCLR_FROM_SLEEP 16 #define NORMAL_POWER_UP 24 //////////////////////////////////////////////////////////////// Timer 0 // Timer 0 (AKA RTCC)Functions: SETUP_COUNTERS() or SETUP_TIMER0(), // SET_TIMER0() or SET_RTCC(), // GET_TIMER0() or GET_RTCC() // Constants used for SETUP_TIMER0() are: #define RTCC_INTERNAL 0 #define RTCC_EXT_L_TO_H 32 #define RTCC_EXT_H_TO_L 48 #define RTCC_DIV_1 #define RTCC_DIV_2 #define RTCC_DIV_4 #define RTCC_DIV_8 #define RTCC_DIV_16 #define RTCC_DIV_32 #define RTCC_DIV_64 #define RTCC_DIV_128 #define RTCC_DIV_256
8 0 1 2 3 4 5 6 7
#define RTCC_8_BIT
0
// Constants used for SETUP_COUNTERS() are the above // constants for the 1st param and the following for // the 2nd param: ////////////////////////////////////////////////////////////////// WDT Watch Dog Timer Functions: SETUP_WDT() or SETUP_COUNTERS() (see above) // RESTART_WDT() // #define WDT_18MS 8 #define WDT_36MS 9 #define WDT_72MS 10 #define WDT_144MS 11 #define WDT_288MS 12 #define WDT_576MS 13 #define WDT_1152MS 14 #define WDT_2304MS 15
124
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
//////////////////////////////////////////////////////////////// Timer 1 // Timer 1 Functions: SETUP_TIMER_1, GET_TIMER1, SET_TIMER1 // Constants used for SETUP_TIMER_1() are: // (or (via |) together constants from each group) #define T1_DISABLED 0 #define T1_INTERNAL 0x85 #define T1_EXTERNAL 0x87 #define T1_EXTERNAL_SYNC 0x83 #define T1_CLK_OUT
8
#define T1_DIV_BY_1 #define T1_DIV_BY_2 #define T1_DIV_BY_4 #define T1_DIV_BY_8
0 0x10 0x20 0x30
///////////////////////////////// / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / T im imer 2 // Timer 2 Functions: SETUP_TIMER_2, GET_TIMER2, SET_TIMER2 // Constants used for SETUP_TIMER_2() are: #define T2_DISABLED 0 #define T2_DIV_BY_1 4 #define T2_DIV_BY_4 5 #define T2_DIV_BY_16 6 ////////////////////////////////////////////////////////////////// CCP // CCP Functions: SETUP_CCPx, SET_PWMx_DUTY S ET_PWMx_DUTY // CCP Variables: CCP_x, CCP_x_LOW, CCP_x_HIGH // Constants used for SETUP_CCPx() are: #define CCP_OFF 0 #define CCP_CAPTURE_FE 4 #define CCP_CAPTURE_RE 5 #define CCP_CAPTURE_DIV_4 6 #define CCP_CAPTURE_DIV_16 7 #define CCP_COMPARE_SET_ON_MATCH 8 #define CCP_COMPARE_CLR_ON_MATCH 9 #define CCP_COMPARE_INT 0xA #define CCP_COMPARE_RESET_TIMER 0xB #define CCP_PWM 0xC #define CCP_PWM_PLUS_1 0x1c #define CCP_PWM_PLUS_2 0x2c #define CCP_PWM_PLUS_3 0x3c long CCP_1; #byte CCP_1 = 0x15 #byte CCP_1_LOW= 0x15 #byte CCP_1_HIGH= 0x16 long CCP_2; #byte CCP_2 = 0x1B #byte CCP_2_LOW= 0x1B #byte CCP_2_HIGH= 0x1C ////////////////////////////////////////////////////////////////// PSP // PSP Functions: SETUP_PSP, PSP_INPUT_FULL(), PSP_OUTPUT_FULL(), // PSP_OVERFLOW(), INPUT_D(), OUTPUT_D() // PSP Variables: PSP_DATA // Constants used in SETUP_PSP() are: #define PSP_ENABLED 0x10 #define PSP_DISABLED 0
125
María Aranda Elcuaz #byte PSP_DATA=
Universidad Universid ad Pública de Navarra 8
////////////////////////////////////////////////////////////////// SPI // SPI Functions: SETUP_SPI, SPI_WRITE, SPI_READ, SPI_DATA_IN // Constants used in SETUP_SSP() are: #define SPI_MASTER 0x20 #define SPI_SLAVE 0x24 #define SPI_L_TO_H 0 #define SPI_H_TO_L 0x10 #define SPI_CLK_DIV_4 0 #define SPI_CLK_DIV_16 1 #define SPI_CLK_DIV_64 2 #define SPI_CLK_T2 3 #define SPI_SS_DISABLED 1 ////////////////////////////////////////////////////////////////// UART // Constants used in setup_uart() are: // FALSE - Turn UART off // TRUE - Turn UART on ////////////////////////////////////////////////////////////////// ADC // ADC Functions: SETUP_ADC(), SETUP_ADC_PORTS() (aka SETUP_PORT_A), // SET_ADC_CHANNEL(), READ_ADC() // Constants used for SETUP_ADC() are: #define ADC_OFF 0x00 // ADC Off #define ADC_CLOCK_DIV_2 0x00 #define ADC_CLOCK_DIV_8 0x40 #define ADC_CLOCK_DIV_32 0x80 #define ADC_CLOCK_INTERNAL 0xc0 // Internal 2-6us // Constants used in SETUP_ADC_PORTS() are: #define NO_ANALOGS 7 // None #define ALL_ANALOG 0 // A0 A1 A2 A3 A5 E0 E1 E2 Ref=Vdd #define AN0_AN1_AN2_AN4_AN5_AN6_A AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF N7_VSS_VREF 1 // A0 A1 A2 A5 E0 E1 E2 Ref=A3 #define AN0_AN1_AN2_AN3_AN4 2 // A0 A1 A2 A3 A5 Ref=Vdd #define AN0_AN1_AN2_AN4_VSS_VREF 3 // A0 A1 A2 A5 Ref=A3 #define AN0_AN1_AN3 4 // A0 A1 A3 Ref=Vdd #define AN0_AN1_VSS_VREF 5 // A0 A1 Ref=A3 #define ANALOG_RA3_REF 1 \\old only provided for compatibility #define A_ANALOG 2 \\old only provided for compatibility #define A_ANALOG_RA3_REF 3 \\old only provided for compatibility #define RA0_RA1_RA3_ANALOG 4 \\old only provided for compatibility #define RA0_RA1_ANALOG_RA3_REF 5 \\old only provided for compatibility // Constants used in READ_ADC() are: #define ADC_START_AND_READ 7 // This is the default if no param is present #define ADC_START_ONLY 1 #define ADC_READ_ONLY 6 // This device allows 4 params to set_adc_channel to set the channel // for each group A,B,C,D ////////////////////////////////////////////////////////////////// INT // Interrupt Functions: ENABLE_INTERRUPTS(), DISABLE_INTERRUPTS(), // EXT_INT_EDGE() // // Constants used in EXT_INT_EDGE() are: #define L_TO_H 0x40
126
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
#define H_TO_L 0 // Constants used in ENABLE/DISABLE_INTERRUPTS() are: #define GLOBAL 0x0BC0 #define INT_RTCC 0x0B20 #define INT_RB 0x0B08 #define INT_EXT 0x0B10 #define INT_AD 0x8C40 #define INT_TBE 0x8C10 #define INT_RDA 0x8C20 #define INT_TIMER1 0x8C01 #define INT_TIMER2 0x8C02 #define INT_CCP1 0x8C04 #define INT_CCP2 0x8D01 #define INT_SSP 0x8C08 #define INT_PSP 0x8C80 #define INT_TIMER0 0x0B20 #list
127
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Anexo 2: Modulac Modulación ión PWM PWM
A) Circuito de potencia básico: Célula elemental de conmutación Ii T1 Vi T2
I0 V0
Figura 1 En la figura a se representa un circuito de inte interc rcam ambi bioo de potencia potencia eléctric eléctricaa entre dos fuentes fuentes que que se rige por por las siguien siguientes tes reglas reglas de de funcionam funcionamiento: iento: - La fuente de tensión V i no se puede cortocircuitar. - La fuente de corriente no se puede poner en circuito abierto. Por lo tanto, con estas dos reglas de funcionamiento se obtienen las leyes de conmutación para T1 y T2: - Si el transistor T1 está encendido, el transistor T 2 deberá estar apagado. - Si el transistor T1 está apagado, el transistor T 2 deberá estar encendido. A1) Tensión Tensión de de salida
Con estas leyes de conmutación se obtiene la siguiente tabla para el valor de la tensión de salida V0:
T1 1 0
T2 0 1
V0 Vi 0
Esta tabla representa la tensión de salida siempre que uno de los transistores esté siempre encendido o siempre apagado. ¿Pero que sucede si el estado de los transistores cambia cada cierto tiempo? A2) Tensione Tensioness de salida salida intermedias intermedias
Tomando como referencia al transistor T 1, se llama t on el periodo que éste transistor permanece permanece encendido encendido y t off al periodo en el que dicho transistor permanece apagado, siendo T el periodo total que se irá repitiendo a lo largo del tiempo.
128
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
La tensión de salida V 0 dibujará una gráfica tal como la que se dibuja en la página siguiente.
129
María Aranda Elcuaz
V0
Universidad Universid ad Pública de Navarra
Vi
Vi
Vi
0 ton
0
toff T
Figura 2 La tensión o tensión V0 media se calcula como sigue: < Vo >=
V i ·t on
+
0·t off
T
·
= V i
t on T
·
= V i D
Donde Є [0,Vi] y D se conoce como Ciclo de trabajo. A3) Corriente Corriente de de entrada entrada
Según el estado de los transistores se realiza la siguiente tabla de la misma manera que se realizó para la tensión de salida, pero esta vez para la corriente:
T1 1 0
T2 0 1
Ii 0 I0
A4) Corrientes Corrientes de entrada entrada intermedia intermediass
Tal y como se ha dibujado para la tensión tensión de salida, salida, se realiza también también la gráfica para la corriente de entrada:
Ii
I0
I0
0 ton
I0
0
toff T
Figura 3
130
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Para el cálculo de la corriente intermedia : <
I i
>=
t on · I 0
t
+ off ·0
T
=
I 0
t on T
=
Donde Є [0,I0]
I 0 · D
A5) Balance Balance de potencias potencias
Para comprobar que todo lo que se ha dicho hasta ahora es correcto se realiza el balance de potencias en un ciclo de trabajo determinado en las dos fuentes y se comprueba que efectivamente son iguales: PVi= Vi·=Vi ·I0·D PVo= ·I0=Vi·D·I0
B) Circuitos de gobierno de la célula elemental de conmutación Los Los circ circuit uitos os de gobie gobierno rno de la célu célula la elem elemen enta tall de conm conmut utac ación ión son son circ circuit uitos os moduladores que siguen la técnica PWM (modulación por anchura de pulsos). Se dibuja a continuación el diagrama de bloques esencial de un ejemplo sencillo de circuito modulador:
T1 V0 Є [0,Vi]
Modulador
T2
Figura 4
v0 Є [0,1] [0,1]
V0 Є [0,Vi] Vi
VTRI
T1 T2
1
Figura 5 131
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
El circuito de la figura 5 primeramente divide las tensiones de salida y entrada para obtener una tensión entre 0 y 1 que se compara con una onda triangular que trabaja también en dicho intervalo. El diagrama de ondas del circuito queda representado de la siguiente manera: VTRI 1 v0
ton
T1
toff
On
Off
T2
On
Off
V0
Vi
La primera gráfica representa la comparación entre la onda triangular y el valor de v 0 en el intervalo [0,1]. Las dos siguientes representan los estados de los dos transistores T 1 y T2 y por último, último, la gráfica inferior inferior representa representa la tensión tensión de salida del circuito. circuito. Para calcular la tensión media se pueden emplear dos métodos distintos: 1º método: De la misma manera que se ha calculado hasta ahora: <
Vo >=
V i ·t on
+
T
0·t off
=
V i ·
t on T 132
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
2º método: Por semejanza triangular:
De la gráfica de la onda triangular se obtiene que: pero como v0 =
1
=
T
v0
⇒
t on
t on T
= v0
V 0 V i
se puede sustituir y queda:
t on T
=
V 0 V i
,
despejando de esta ecuación se obtiene que: V 0 = V i ·
t on T
=
133
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Anexo 3: Present Presentación ación de las Comunicaci Comunicaciones ones CAN CAN
134
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
135
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
136
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
137
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
138
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
139
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
140
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
141
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
142
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
143
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
144
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
145
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
146
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
147
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
BIBLIOGRAFÍA
148
María Aranda Elcuaz
Universidad Universid ad Pública de Navarra
Libros: -
MICROC MICROCONT ONTROL ROLAD ADORE ORES S PIC, PIC, LA CLAVE CLAVE DEL DEL DISE DISEÑO. ÑO. Martí Martínn Cuenca Cuenca,, Angulo Usategui y Angulo Martínez. Ed Thomson, 2003. MICROC MICROCONT ONTROL ROLAD ADORE ORES S PIC, PIC, DISEÑO DISEÑO PRÁC PRÁCTIC TICO O DE APLICA APLICACIO CIONES NES.. Angulo Usategui y Angulo Martínez. Ed Mc Graw Hill, 2003. MANUA MANUAL L DE USUAR USUARIO IO DEL DEL COMPIL COMPILAD ADOR OR PCW PCW DE CCS CCS.. Andrés Andrés Cáno Cánovas vas López
Artículos técnicos: -
CONTR CONTROLL OLLER ER AREA AREA NETW NETWOR ORK K (CAN) (CAN) BASIC BASICS. S. Keith Keith Fazui Fazui.. Microc Microchip hip Technology Inc, 1999.
Datasheet: -
PIC16 PIC16F87 F87X: X: 28/4 28/40-P 0-Pin in 8-Bit 8-Bit CMOS CMOS FLAS FLASH H Micro Microcon contro trolle llers rs PICD ICDEM™ EM™ 2 Plu Pluss Use User’ r’ss Gu Guide ide
Páginas Web: -
http://www.can-cia.org: página dedicada al bus CAN http://www.can-cia.org: http ://mi ://miarroba. arroba.com/f com/foros/v oros/ver.php er.php?id=6510 ?id=6510:: Foro dedicado a microcontroladores
149