Vous êtes sur la page 1sur 149

Mara Aranda Elcuaz

Universidad Pblica de Navarra

ndice general
Ttulo __Pgina

INTRODUCCIN..5 MEMORIA.8 Captulo 1: Microcontroladores: Caractersticas y aplicaciones generales..9 1.1. Definicin9 1.2. Recursos comunes a todos los microcontroladores.9 1.2.1. Arquitectura bsica.......9 1.2.2. Procesador CPU9 1.2.3. Memoria..10 1.2.4. Puertas de Entrada y Salida....12 1.2.5. Reloj Principal12 1.3. Recursos especiales...12 1.4. Lenguajes de programacin...13 1.5. Fabricantes.14 1.6. Aplicaciones..14 Captulo 2: Microcontroladores PIC15 2.1. Caractersticas relevantes..15 2.2. Las gamas PIC...17 2.2.1. Gama baja...17 2.2.2. Gama media18 2.2.3. Gama alta y gama mejorada...18 2.3. 16F87X: caractersticas generales.19 2.3.1. Organizacin 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 estado22 2.3.3.2. Registro de opciones22 2.3.3.3. Registro de interrupciones...23 2.3.3.4. Otros registros especiales.24 2.3.4. Palabra de configuracin e identificacin...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 guardin WDT29
1

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Ttulo

__Pgina

2.4.2.3. Temporizador TMR0...29 2.4.2.4. Reset30 2.4.2.5. Modo de reposo Sleep.31 2.4.3. Interrupciones.31 2.5. Perifricos..33 2.5.1. Puertas de Entrada y salida.33 2.5.2. Conversor Analgico Digital..34 2.5.3. Temporizador TMR1..37 2.5.4. Temporizador TMR2..38 2.5.5. Mdulos de captura/comparacin/modulacin de anchura de pulsos..39 2.5.5.1 Modo de captura...39 2.5.5.2 Modo de comparacin...40 2.5.5.3 Modulacin por anchura de pulsos (PWM)..40 2.5.6. Puerta serie sncrona (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 Captulo 3: Herramientas de trabajo53 3.1. Placa de pruebas PICDEM 2 PLUS..53 3.2. Software de programacin54 3.2.1. Cmo usar MPLAB55 3.2.1.1. Creacin de proyectos.55 3.2.1.2. Compilacin del programa..56 3.2.1.3. Programacin...57 3.3. 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 estndar.60 3.3.2.3. Especificacin de dispositivos.60 3.3.2.4. Libreras incorporadas.60 3.3.3. Funciones62 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/Temporizadores65 3.3.3.6. Funciones de entrada A/D66 3.3.3.7. Funciones CCP.66 3.3.3.8. Funciones para el manejo de la Eeprom interna..67 3.3.4. Definicin de datos.67
2

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Ttulo

__Pgina
3.3.5. Definicin de una funcin..68 3.3.6. Estructura de un programa en C.68

Captulo 4: Prcticas...70 4.1. Entradas digitales...70 4.1.1. Control de tiempos: Parpadeo de un led.70 4.1.1.1. Organigrama70 4.1.1.2. Solucin en ensamblador.70 4.1.1.3. Solucin en C...72 4.1.2. Encendido de un led a travs de un pulsador.73 4.1.2.1. Organigrama73 4.1.2.2. Solucin en ensamblador.73 4.1.2.3. Solucin en C...74 4.2. LCD y Memoria Eeprom...76 4.2.1. Envo de mensajes al LCD.76 4.2.1.1. Organigrama76 4.2.1.2. Solucin...77 4.2.2. Programacin de la Eeprom...78 4.2.2.1. Organigrama79 4.2.2.2. Solucin...80 4.3. Entradas Analgicas: Potencimetro82 4.3.1. Organigrama...82 4.3.2. Solucin..83 4.4. PWM.85 4.4.1. Primer acercamiento al PWM85 4.4.1.1. Organigrama86 4.4.1.2. Solucin...86 4.4.2. PWM con entradas analgicas...87 4.4.2.1. Organigrama87 4.4.2.2. Solucin...88 4.5. Comunicacin Serie PIC-PC90 4.5.1. Un ejemplo sencillo91 4.5.1.1. Organigrama91 4.5.1.2. Solucin...92 4.5.2. PWM a distancia. Versin 1...93 4.5.2.1. Organigrama94 4.5.2.2. Solucin...94 4.5.3. PWM a distancia. Versin 2...97 4.5.3.1. Organigrama97 4.5.3.2. Solucin...98 Captulo 5: Comunicaciones CAN..101 5.1. Introduccin.101 5.1.1. El CAN y su historia.101 5.1.2. Aplicaciones.101 5.2. Caractersticas del bus CAN102
3

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Ttulo

__Pgina

5.3. Arquitectura de capas..102 5.3.1. Capa fsica103 5.3.2. Capa de enlace de datos104 5.4. Mensajes y tipos de tramas..104 5.4.1. Trama de datos..105 5.4.2. Trama remota106 5.4.3. Trama de error..107 5.4.4. Espacio entre tramas.108 5.4.5. Trama de sobrecarga.108 5.5. Acceso mltiple y arbitraje de acceso al bus...109 5.6. Especificaciones..110 5.7. Protocolos CAN de alto nivel..110 5.8. Implementacin 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 ANEXOS113 Anexo 1: Libreras C..114 1.1. LCD.114 1.2. PIC 16F877..118 Anexo 2: Modulacin PWM..122 Anexo 3: Presentacin comunicaciones CAN...127 BIBLIOGRAFA141

Mara Aranda Elcuaz

Universidad Pblica de Navarra

INTRODUCCIN

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Introduccin
La energa elica es la energa renovable ms competitiva dentro del mercado energtico y Espaa es un pas puntero, puesto que es el 2 fabricante mundial y el 3 en potencia instalada (6202 MW en 2003). Adems Navarra fue la comunidad pionera en Espaa y hasta 2001 la 1 comunidad en potencia instalada. Hoy en da, todava se puede decir que el sector de la energa elica es relativamente nuevo, an con ciertas incgnitas en sus equipos, rendimientos, etc. En consecuencia, el empleo de los sistemas de monitorizacin suponen una herramienta imprescindible para poder conocer las evoluciones reales de las distintas magnitudes fsicas y as dar fiabilidad al funcionamiento general de los aerogeneradores. Son de aplicacin para estas tareas cualquier elemento comercial de medida como registradores, osciloscopios, sensores programables, etc. Sin embargo, por las caractersticas especiales de trabajo, es decir, a gran altura, en movimiento, etc, resulta muchas veces interesante disponer de potentes herramientas de medida y anlisis de reducido tamao y robustez. La empresa INGETUR, fabricante de turbinas de gran potencia, solicit a su departamento de investigacin y desarrollo el diseo de una herramienta porttil de pequeas dimensiones y sencillo manejo para la monitorizacin de magnitudes fsicas en los aerogeneradores. Dicha herramienta deba ser configurable y deba permitir la conexin directa al bus CAN de comunicaciones, con el que trabajan estas mquinas, para as poder realizar un seguimiento de las magnitudes fsicas tales como presiones hidrulicas, temperaturas, posiciones de elementos, etc. Con todas estas premisas de desarrollo y configuracin se lleg a la conclusin de que la mejor forma de implementar este dispositivo era hacerlo mediante microcontroladores, puesto que son dispositivos programables caracterizados principalmente por su reducido tamao, sencillez de programacin 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 continuacin. La primera fase comprende un estudio general de los microcontroladores. En esta etapa se definen con detalle todas las caractersticas fundamentales y sus aplicaciones principales, as como los lenguajes de programacin de los mismos. Todo ello para tener 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 das. Otro de los objetivos de este trabajo era la de recoger en un documento aquella informacin necesaria y suficiente que permita una introduccin cmoda en el entorno de los microcontroladores PIC. Para ello, se ha estructurado la memoria de este proyecto en tres captulos tericos y un cuarto captulo con ejercicios prcticos. El estudio terico recoge toda la informacin prctica asociada a los fundamentos del hardware y del software, mientras que los ejercicios prcticos tienen la funcin de simplificar el proceso de aprendizaje de la programacin en entorno C. Adems, tal como se han quedado finalmente dichos ejercicios,

Mara Aranda Elcuaz

Universidad Pblica de Navarra

podran servir de base para futuras prcticas de cursos especficos de empresa o universitarios. Los primeros captulos de la memoria estn dedicados a los fundamentos tericos de los microcontroladores, tal y como se comenta en el prrafo anterior. El primer captulo describe de manera general los microcontroladores hablando de sus recursos comunes, aplicaciones y fabricantes. El segundo captulo 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 organizacin de la memoria, sus perifricos, etc. Finalmente, en el tercer captulo se describen las herramientas necesarias para llevar acabo la programacin de los PICS. Se describe la placa de pruebas que se emplear en el captulo de prcticas, el software necesario para su programacin de manera prctica y finalmente se realiza un resumen de las directivas empleadas por el compilador CCS que trabaja en lenguaje C. El cuarto, y ltimo captulo dedicado a los microcontroladores desarrolla un total de seis prcticas que parten desde un nivel cero con el trabajo con entradas y salidas digitales, pasando por el manejo de la memoria EEPROM y la pantalla LCD, las entradas analgicas, la modulacin por anchura de pulsos (PWM) y finalmente las comunicaciones de estos microcontroladores va 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 despus poder realizar pruebas en este tipo de red con microcontroladores. La memoria de este proyecto dedica un captulo a este estudio, preparando adems una presentacin en PowerPoint que servir para poder ofrecer un curso interno en la empresa con el objetivo de que sus empleados conozcan los detalles que entraa este tipo de comunicaciones. En este captulo se describen las caractersticas fundamentales de este tipo de comunicaciones, se habla de su estructura interna, los tipos de tramas que se envan, especificaciones y protocolos CAN. Asimismo termina haciendo referencia a la implementacin CAN en los microcontroladores. La principal lnea de continuacin en proyectos futuros es la preparacin de software especfico de comunicacin CAN. A partir de este software se podr finalizar el desarrollo del dispositivo monitor que dio origen al presente proyecto final de carrera. Adems de todo lo comentado anteriormente, en este proyecto se aaden al final del mismo una serie de anexos. El primero vendr relacionado con la programacin de los dispositivos, exponiendo dos libreras empleadas por el compilador. Seguidamente, se aade un captulo que describe los principios de modulacin por anchura de pulsos y finalmente, un captulo dedicado a las comunicaciones en red CAN. Se trata de una presentacin en PowerPoint que describe los principios bsicos de este tipo de bus.

Mara Aranda Elcuaz

Universidad Pblica de Navarra

MEMORIA

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Captulo 1. Microcontroladores: Caractersticas y aplicaciones generales


Definicin
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 lmites prefijados, genera las seales 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 travs del tiempo, su implementacin fsica ha variado frecuentemente. Hace tres dcadas, los controladores se construan exclusivamente con componentes de lgica 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 computador contenido en el corazn (chip) de un circuito integrado.

1.2 Recursos comunes a todos los microcontroladores


Al estar todos los microcontroladores integrados en un chip, su estructura fundamental y sus caractersticas son muy parecidas. Todos deben disponer de los bloques esenciales: procesador, memoria de datos e instrucciones, lneas de entrada y salida, oscilador de reloj y mdulos controladores de perifricos. Sin embargo, cada fabricante intenta enfatizar los recursos idneos para las aplicaciones a las que se destintan preferentemente.

1.2.1 Arquitectura bsica


Aunque inicialmente todos los microcontroladores adoptaron la arquitectura clsica 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 donde se almacenan datos e instrucciones de forma indistinta. A dicha memoria se accede a travs de un sistema de buses nico (direcciones, datos y control). La arquitectura Harvard dispone de dos memorias independientes: una, que contiene slo instrucciones y otra, slo datos. Ambas disponen de sus respectivos sistemas de buses de acceso y es posible realizar operaciones de acceso (lectura o escritura) simultneamente en ambas memorias

1.2.2 Procesador
Es el elemento ms importante del microcontrolador y determina sus principales caractersticas, tanto a nivel hardware como a nivel de software. Se encarga de direccionar la memoria de instrucciones, recibir el cdigo OP de la instruccin en curso, su decodificacin
9

Mara Aranda Elcuaz

Universidad Pblica de Navarra

y la ejecucin de la operacin que implica la instruccin, as como la bsqueda de los operandos y el almacenamiento del resultado. Existen tres orientaciones en cuanto a la arquitectura y funcionalidad de los procesadores actuales: CISC: Computadores de Juego de Instrucciones Complejo: Disponen de ms de 80 instrucciones mquina en su repertorio, algunas de las cuales son muy sofisticadas y potentes, requiriendo muchos ciclos para su ejecucin. RISC: Tanto la industria de los computadores comerciales como la de los microcontroladores estn decantndose hacia la filosofa RISC (Computadores de Juego de Instrucciones Reducido). En estos procesadores el repertorio de instrucciones mquina 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. SISC: En los microcontroladores destinados a aplicaciones muy concretas, el juego de instrucciones, adems de ser reducido, es especfico, o sea, las instrucciones se adaptan a las necesidades de la aplicacin prevista. Esta filosofa se ha bautizado con el nombre de SISC (Computadores de Juego de Instrucciones Especfico).

1.2.3 Memoria
En los microcontroladores la memoria de instrucciones y datos est integrada en el propio chip. Una parte debe ser no voltil, tipo ROM, y se destina a contener el programa de instrucciones que gobierna la aplicacin. Otra parte de memoria ser tipo RAM, voltil, y se destina a guardar las variables y los datos. La RAM en estos dispositivos es de poca capacidad pues slo debe contener las variables y los cambios de informacin que se produzcan en el transcurso del programa. Por otra parte, como slo existe un programa activo, no se requiere guardar una copia del mismo en la RAM pues se ejecuta directamente desde la ROM. Segn el tipo de memoria ROM que dispongan los microcontroladores, la aplicacin y utilizacin de los mismos es diferente. Se describen las cinco versiones de memoria no voltil que se pueden encontrar en los microcontroladores del mercado. 1. ROM con mscara Es una memoria no voltil de slo lectura cuyo contenido se graba durante la fabricacin del chip. El elevado coste del diseo de la mscara slo 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 voltil de slo lectura programable una sola vez por el usuario. OTP (One Time Programmable). La versin OTP es recomendable cuando es muy corto el ciclo de diseo del producto, o bien, en la construccin de prototipos y series muy pequeas.
10

Mara Aranda Elcuaz

Universidad Pblica de Navarra

3 EPROM Los microcontroladores que disponen de memoria EPROM (Erasable Programmable Read OnIy Memory) pueden borrarse y grabarse muchas veces. La grabacin 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 cpsulas son de material cermico y son ms caros que los microcontroladores con memoria OTP que estn hechos con material plstico. 4 EEPROM Se trata de memorias de slo lectura, programables y borrables elctricamente EEPROM (Electrical Erasable Programmable Read OnIy Memory). Tanto la programacin como el borrado, se realizan elctricamente desde el propio grabador y bajo el control programado de un PC. Es muy cmoda y rpida la operacin de grabado y la de borrado. Los microcontroladores dotados de memoria EEPROM una vez instalados en el circuito, pueden grabarse y borrarse cuantas veces se quiera sin ser retirados de dicho 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 pequea zona de memoria EEPROM en los circuitos programables para guardar y modificar cmodamente una serie de parmetros que adecuan el dispositivo a las condiciones del entorno. 5 FLASH Se trata de una memoria no voltil, de bajo consumo, que se puede escribir y borrar. Funciona como una ROM y una RAM pero consume menos y es ms pequea. A diferencia de la ROM, la memoria FLASH es programable en el circuito. Es ms rpida y de mayor densidad que la EEPROM. La alternativa FLASH est recomendada frente a la EEPROM cuando se precisa gran cantidad de memoria de programa no voltil. Es ms veloz y tolera ms ciclos 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 integrado de la tarjeta. As, un dispositivo con este tipo de memoria incorporado al control del motor de un automvil permite que pueda modificarse el programa durante la rutina de mantenimiento peridico, compensando los desgastes y otros factores tales como la compresin, la instalacin de nuevas piezas, etc. La reprogramacin del microcontrolador puede convertirse en una labor rutinaria dentro de la puesta a punto.

1.2.4 Puertas de Entrada y Salida

11

Mara Aranda Elcuaz

Universidad Pblica de Navarra

La principal utilidad de las patitas que posee la cpsula que contiene un microcontrolador es soportar las lneas de E/S que comunican al computador interno con los perifricos 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 sincronizacin de todas las operaciones del sistema. Generalmente, el circuito de reloj est incorporado en el microcontrolador y slo 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 cermico 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 energa.

1.3 Recursos especiales


Cada fabricante oferta numerosas versiones de una arquitectura bsica de microcontrolador. En algunas ampla las capacidades de las memorias, en otras incorpora nuevos recursos, en otras reduce las prestaciones al mnimo para aplicaciones muy simples, etc. La labor del diseador es encontrar el modelo mnimo que satisfaga todos los requerimientos de su aplicacin. De esta forma, minimizar el coste, el hardware y el software. Los principales recursos especficos 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 guardin o Watchdog: Es un temporizador que cuando se desborda y pasa por 0 provoca un reset automticamente en el sistema. 3. Proteccin ante fallo de alimentacin o Brownout: Se trata de un circuito que genera un reset cuando el voltaje de alimentacin VDD es inferior a un voltaje mnimo establecido. 4. Estado de reposo o de bajo consumo: Es un estado del sistema donde se detiene el reloj principal y sus circuitos asociados con el objetivo de ahorrar energa en periodos de tiempo donde el microcontrolador se mantiene en espera de instrucciones. 5. Conversor A/D: Procesa seales analgicas convirtindolas en seales digitales.
12

Mara Aranda Elcuaz

Universidad Pblica de Navarra

6. Comparador analgico: Algunos modelos de microcontroladores disponen internamente de un Amplificador Operacional que acta como comparador entre una seal fija de referencia y otra variable que se aplica por una de las patitas de la cpsula. La salida del comparador proporciona un nivel lgico 1 0 segn una seal 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 travs de las patitas del encapsulado. 8. Puertas de comunicacin: 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 adaptarlos con otros elementos bajo otras normas y protocolos. Algunos modelos disponen de recursos que permiten directamente esta tarea, entre los que destacan: - UART, adaptador de comunicacin serie asncrona. - USART, adaptador de comunicacin serie sncrona y asncrona - 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 adaptacin con redes de conexionado multiplexado desarrollado conjuntamente por Bosch e Intel para el cableado de dispositivos en automviles.

1.4 Lenguajes de programacin


Se han desarrollado todo tipo de lenguajes para los microcontroladores, pero los ms usados son el Ensamblador, el BASIC y el C. Los programas escritos en Ensamblador son compactos y rpidos, sin embargo, utiliza nemnicos inteligibles y si no estn bien confeccionados resultarn de gran tamao y lentos. Los lenguajes de alto nivel como el BASIC y el C son ms fciles de comprender y por tanto de disear. Pero como toda mquina digital, el microcontrolador es capaz de entender 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 cdigo mquina para luego grabarlo en la memoria del microcontrolador y ejecutarlo.

1.5 Fabricantes

13

Mara Aranda Elcuaz

Universidad Pblica de Navarra

En la actualidad, gran parte de los fabricantes de circuitos integrados disponen de su propia lnea de microcontroladores. As tendremos Intel, que ha ido siempre por delante presentando nuevos productos, as por ejemplo el 8048 se considera el primer microcontrolador de 8 bits y lo fabric Intel en la dcada 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 aos. Su popularidad avanza da a da, siendo incluidos en la mayora de proyectos debido a su bajo coste, reducido consumo, pequeo tamao, fcil programacin y abundancia de herramientas econmicas de soporte. Otras empresas como Hitachi, Texas, Toshiba y Zilog abarcan pequeas partes del mercado. Todos los microcontroladores que se fabrican en el presente son buenos y el mejor no siempre es el mismo. Cambian el modelo y fabricante segn la aplicacin y las circunstancias que lo envuelven.

1.6 Aplicaciones
Cada vez existen ms productos que incorporan un microcontrolador con el fin de aumentar sustancialmente sus prestaciones, reducir su tamao y coste, mejorar su fiabilidad y disminuir el consumo. Algunos fabricantes de microcontroladores superan el milln de unidades de un modelo determinado producidas en una semana. Este dato puede dar una idea de la masiva utilizacin de estos componentes. Los microcontroladores estn siendo empleados en multitud de sistemas presentes en la vida diaria, como pueden ser juguetes, horno microondas, frigorficos, televisores, computadoras, impresoras, mdems, el sistema de arranque de nuestro coche, etc. Y otras aplicaciones como instrumentacin electrnica, control de sistemas en una nave espacial, etc. Una aplicacin tpica podra emplear varios microcontroladores para controlar pequeas partes del sistema. Estos pequeos controladores podran comunicarse entre ellos y con un procesador central, probablemente ms potente, para compartir la informacin y coordinar sus acciones, como, de hecho, ocurre ya habitualmente en cualquier PC.

14

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Captulo 2. Microcontroladores PIC


Para la realizacin de estas prcticas se ha elegido la familia PIC de microchip por diversos motivos: 1. Por la cantidad de informacin disponible sobre estos microcontroladores, y es que para las aplicaciones ms habituales la eleccin de una versin adecuada de PIC es la mejor solucin. 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 parmetros en consumo, tamao, etc. 5. Porque posee gran variedad de herramientas, tanto de software como de hardware, baratas y fciles de utilizar. Una de las razones del xito de los PIC se basa en su utilizacin. Cuando se aprende a manejar uno de ellos, conociendo su arquitectura y su repertorio de instrucciones, es muy fcil emplear otro modelo.

2.1 Caractersticas 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 DATO S CPU

B u s d e I n s tr u c c io n e s
M E M O R IA D E IN S T R U C C IO N E S

12

Figura 2.1.a 2 Se aplica la tcnica de segmentacin (pipe-line) en la ejecucin de las instrucciones: La segmentacin permite al procesador realizar al mismo tiempo la ejecucin de una instruccin y la bsqueda del cdigo de la siguiente. De esta forma se puede ejecutar cada instruccin en un ciclo (un ciclo de instruccin equivale a cuatro ciclos de reloj) excepto las instrucciones de salto que ocupan dos ciclos al no conocer la direccin de la siguiente instruccin hasta que no se haya completado la de bifurcacin. Figura 2.1.b de la pgina siguiente.

15

Mara Aranda Elcuaz


CLK

Universidad Pblica de Navarra

c ic l o

B I3 E I3

B I2 E I2

B I1 E I3

F in I N S T R 0 F in IN S T R 1 F in I N 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 14 bits y ms las de la gama alta. Esta caracterstica es muy ventajosa en la optimizacin de la memoria de instrucciones y facilita enormemente la construccin 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 instruccin puede manejar cualquier elemento de la arquitectura como fuente o como destino. 6 Arquitectura basada en un banco de registros: Esto significa que todos los objetos del sistema (puertas de E/S, temporizadores, posiciones de memoria, etc.) estn implementados fsicamente como 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 ms conveniente para su proyecto. 8 Herramientas de soporte potentes y econmicas: La empresa Microchip y otras que utilizan los PIC ponen a disposicin de los usuarios numerosas herramientas para desarrollar hardware y software. Son muy abundantes los programadores, los simuladores software, los emuladores en tiempo real, Ensambladores, Compiladores C, Intrpretes y Compiladores BASIC, etc.

16

Mara Aranda Elcuaz

Universidad Pblica de Navarra

2.2 Las gamas PIC


Para resolver aplicaciones sencillas se precisan pocos recursos; en cambio, las aplicaciones grandes requieren numerosos y potentes. Siguiendo esta filosofa, 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 aplicaciones simples y otros complejos y ms costosos para las de mucha envergadura. Con las cuatro gamas de PIC se dispone de gran diversidad de modelos y encapsulados, pudiendo seleccionar el que mejor se acople a las necesidades de acuerdo con el tipo y capacidad de las memorias, el nmero de lneas de E/S y las funciones auxiliares precisas. Sin embargo, todas las versiones estn construidas alrededor de una arquitectura comn, un repertorio mnimo de instrucciones y un conjunto de opciones muy apreciadas, como el bajo consumo y el amplio margen del voltaje de alimentacin.

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 tambin hay modelos con memoria OTP. La memoria de datos puede tener una capacidad comprendida entre 25 y 73 bytes. Slo disponen de un temporizador (TMR0), un repertorio de 33 instrucciones y un nmero de patitas para soportar las E/S comprendido entre 12 y 20. El voltaje de alimentacin 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 alimentacin. 2. Perro guardin (Watchdog): Existe un temporizador que produce un reset automticamente si no es recargado antes de que pase un tiempo prefijado. As se evita que el sistema quede "colgado" dado en esa situacin el programa no recarga dicho temporizador y se genera un reset. 3. Cdigo de proteccin: Cuando se procede a realizar la grabacin del programa, puede protegerse para evitar su lectura.

17

Mara Aranda Elcuaz

Universidad Pblica de Navarra

4. Lneas de E/S de alta corriente: Las lneas 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 perifricos. 5. Modo de reposo (bajo consumo o SLEEP): Ejecutando una instruccin (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 ms de dos subrutinas y adems no admiten interrupciones.

2.2.2 Gama Media


En esta gama sus componentes aaden nuevas prestaciones a las que posean los de la gama baja, hacindoles ms adecuados en las aplicaciones complejas. Admiten interrupciones, poseen comparadores de magnitudes analgicas, convertidores A/D, puertos serie y diversos temporizadores. Algunos modelos disponen de una memoria de instrucciones del tipo OTP que resulta mucho ms econmica en la implementacin de prototipos y pequeas series. Otros en cambio, disponen de una memoria de instrucciones tipo EEPROM, que, al ser borrables elctricamente, son mucho ms fciles de reprogramar que las EPROM, que tienen que ser sometidas a rayos ultravioleta durante un tiempo determinado para realizar dicha operacin. El PIC elegido para realizacin de las prcticas, el 16F877, pertenece a esta gama y en los sucesivos captulos, las explicaciones se centrarn en l.

2.2.3 Gama Alta y Gama Mejorada


En la actualidad, esta gama esta formada por tres modelos. Los dispositivos PIC17C4X responden a microcontroladores de arquitectura abierta pudindose expansionar 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 configuracin interna del PIC aadiendo nuevos dispositivos de memoria y de E/S externas. Esta facultad obliga a estos componentes a tener un elevado nmero de patitas comprendido entre 40 y 44. Admiten interrupciones, poseen puerto serie, varios 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 cdigo alcanza las 64k palabras y una frecuencia de 40 MHz.

18

Mara Aranda Elcuaz

Universidad Pblica de Navarra

2.3 16F87X: Caractersticas generales


2.3.1 Organizacin 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 posicin dentro de un determinado banco y 2 bits ms 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 mnima de 4k palabras de 14 bits hasta una mxima de 8k palabras de la misma longitud. Durante la fase de bsqueda, la direccin de la instruccin la proporciona el contador de programa, el cual normalmente se auto incrementa en la mayora de las instrucciones, excepto en las de salto. Al tener cada posicin de memoria un tamao de 14 bits, en las instrucciones del programa estn implcitas las direcciones de los registros o memoria de datos. En una sola palabra se agrupa el cdigo de la instruccin y su direccin. De los 14 bits, 7 se utilizan para indicar su direccin, lo que da un mximo direccionable en la memoria de datos de 128 bytes por banco de registros. 2.3.1.2 Direccionamiento y paginado En los PICs 16F87X, el contador de programa (CP) del microcontrolador tiene un tamao de 13 bits, con lo que es posible direccionar un tamao total de memoria de programa hasta un mximo de 8k x 14 bits organizada en pginas de un tamao de 2k x 14 bits. Para manejar microcontroladores de 4 u 8k bytes de memoria de programa, ha de recurrirse a la paginacin, cada pgina 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 ledo y escrito. Los bits superiores (PC<12:8>), estn alojados en el registro PCH, sobre el que no se puede leer ni escribir, pero se puede acceder a l indirectamente a travs del registro PCLATH.

Figura 2.3.1.2: Contador de programa

19

Mara Aranda Elcuaz

Universidad Pblica de Navarra

2.3.2 Banco de registros y memoria de datos


Los registros son de 8 bits y estn 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 continuacin por los registros de proposicin 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 no puede ser accedido de forma directa, pero su contenido s puede moverse a otro registro al que s puede accederse directamente. Cada operacin aritmtica que se realiza utiliza el registro w.
20

Mara Aranda Elcuaz

Universidad Pblica 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 alimentacin. Esta memoria es de 8 bits y no forma parte del espacio normal direccionable, y slo es accesible en lectura y escritura a travs 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 instruccin utiliza un dato inmediato, su valor (literal) lo contiene su cdigo OP y en la ejecucin 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 cuestin directamente en la instruccin, 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 Seleccin 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 posicin 0 del banco 0. En tal caso, se accede a la posicin que apunta el contenido del registro FSR ubicado en la posicin 04 del rea de datos. Sus 5 bits de menos peso apuntan la direccin del dato y los bits 6 y 5 seleccionan el banco. No tiene implementado el bit 7, que siempre se lee como 1. El registro INDF no se halla implementado fsicamente. 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 registros de funciones especiales o registros de control tienen como cometido gobernar el funcionamiento de los recursos del microcontrolador.
21

Mara Aranda Elcuaz

Universidad Pblica 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 ms importantes, cuyos bits controlan funciones vitales del microcontrolador. En la figura 2.3.3.1 se muestra la estructura y la misin de cada uno de sus bits.

Figura 2.3.3.1: Registro de Estado El bit IRP hace la seleccin 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 el reset del PIC y permiten actuar en consecuencia: Z es la bandera de cero, DC bandera de acarreo en el 4 bit de menor peso y C bandera de acarreo 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 ledo y escrito y contiene varios bits para la configuracin de las asignaciones del pre divisor al TMR0 o al WDT, la interrupcin externa, el TMR0 y las resistencias internas de polarizacin del puerto B. RBPU es el bit de conexin de las resistencias de polarizacin del Puerto B; INTDEG selecciona el tipo de flanco para la interrupcin por RB0/INT, segn 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 asignacin del divisor de frecuencias al WDT o al TMR0.

22

Mara Aranda Elcuaz

Universidad Pblica 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

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Puesto que los microcontroladores PIC de la gama media admiten interrupciones, requieren un registro encargado de su regulacin. 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 pgina anterior se ofrece la estructura y la misin de los bits del registro INTCON. El bit GIE concede o cancela la activacin global de las interrupciones. PEIE, TOIE, INTE y RBIE activan o desactivan las interrupciones en perifricos, 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 prohben las interrupciones producidas por los perifricos internos del PIC y que no estn incluidos en el registro INTCON. Los registros PIR1 y PIR2 contienen una serie de bits que actan como banderas de sealizacin de la causa que origina la interrupcin, 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

Mara Aranda Elcuaz

Universidad Pblica de Navarra

2.3.4 Palabra de configuracin e identificacin


La palabra de configuracin en los PIC de la gama media se compone de 14 bits que se escriben durante el proceso de grabacin del dispositivo. Dichos bits ocupan la posicin 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 proteccin de cdigo, BODEN activa o desactiva el fallo en la alimentacin, PWRTE activa el temporizador, WDTE activa el perro guardin, los bits FOSC1:FOSC0 seleccionan el tipo de oscilador.

Figura 2.3.4: Palabra de configuracin Tambin existen cuatro posiciones reservadas en la memoria de programa destinadas a contener las Palabras de identificacin (ID). En estas palabras solo se emplean los 4 bits de menos peso, en donde se almacena el nmero de serie, cdigos de identificacin, numeraciones secunciales o aleatorias, etc. Tambin se escribe su contenido en el proceso de grabacin del dispositivo.

25

Mara Aranda Elcuaz

Universidad Pblica de Navarra

2.4 Recursos comunes e interrupciones


En la siguiente tabla se muestran las caractersticas ms relevantes de los PIC 16F87X:
Caractersticas 16F873 16F874 16F876 16F877 Frecuencia Mxima 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 Mdulos CCP 2 2 2 2 Comunicaciones Serie MSSP, USART MSSP,USART MSSP,USART MSSP, USART Comunicacin Paralelo PSP PSP Lneas 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 instruccin 14 bits 14 bits 14 bits 14 bits

Todos estos elementos que se muestran en la tabla sern analizados y explicados en los puntos sucesivos de este captulo.

2.4.1 Diagramas de conexionado del 16F877

Figura 2.4.1a: Diagrama de conexionado del PIC 16F877

26

Mara Aranda Elcuaz

Universidad Pblica de Navarra

En la figura anterior se muestra el diagrama de conexionado de un PIC 16F877. A continuacin se nombran las funciones de todas las patitas: - MCLR/VPP: Reset externo. Por esta patita se aplica tambin la tensin / VPP usada en la grabacin del programa. - RA0/AN0: E/S digital o entrada analgica - RA1/AN1: E/S digital o entrada analgica - RA2/AN2/VREF: E/S digital, entrada analgica o salida de la tensin de referencia - RA3/AN3/ VREF: E/S digital, analgica o entrada externa de VREF - RA4/TOCKI: E/S digital o entrada del reloj para TMR0 - RA5/AN4/SS: E/S digital, analgica o seleccin del puerto serie sincrono - RB0/INT-RB7: E/S digitales del Puerto B. RB0/INT puede actuar como entrada de interrupcin externa. RB4-RB7 pueden provocar interrupcin cuando cambian de estado - RE0/RD/AN5: E/S digital del Puerto E. Seal de lectura del Puerto paralelo esclavo. Entrada analgica. - RE1/WR/AN6: E/S digital. Seal de escritura del Puerto paralelo esclavo. Entrada analgica. - RE2/CS/AN7: E/S digital. Seal de activacin del Puerto paralelo esclavo. Entrada analgica. - VDD: Entrada del positivo de la alimentacin - OSC1/CLKIN: Entrada al cristal cuarzo o reloj externo - OSC2/CLKOUT: Salida del cristal. En modo R-C por esta patita sale FOSC1 - RC0/T1OSO/T1CL1: E/S digital del Puerto C. Conexin del oscilador externo para el temporizador TMR1 o entrada de reloj para el TMR1 - RC1/T1OSI/CCP2: E/S digital del Puerto C. Conexin del oscilador externo para TMR1 o salida del modulo 2 de captura/comparacin - RC2/CCP1: E/S digital del Puerto C. Salida del modulo 1 de captura/comparacin - RC3/SCK/SCL: E/S digital. E/S de reloj para el Puerto serie sincrono (SSP) de los mdulos SPI a I2C - RC4/SDI/SDA: E/S digital. Entrada de datos serie en el modo SPI. E/S de datos serie en modo I2C - RC5/SD0: E/S digital del Puerto C. Salida de datos serie en el modo SPI - RC6/TX/CK: E/S digital. Transmisin serie asincrona. Entrada de reloj para comunicacin serie sincrona - RC7/RX/DT: E/S digital. Recepcin serie asincrona. Lnea de datos en la comunicacin serie sincrona. - RD0/PSP0-RD7/PSP7: E/S digitales del Puerto D. Este Puerto puede trabajar como Puerto paralelo esclavo para interconexin con un bus de datos de 8 bits de otro microprocesador Una vez explicado el funcionamiento de cada patita del PIC16F877, en la pgina siguiente, en la figura 2.4.1b se muestra su arquitectura interna, un diagrama de bloques donde se muestran los perifricos y las lneas de entrada y salida.

27

Mara Aranda Elcuaz

Universidad Pblica 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 mayora de los modelos y que son conocidos por la gama baja. 2.4.2.1 Oscilador principal Para la generacin de los impulsos de reloj internos los PIC16F87X disponen de cuatro alternativas, debiendo el usuario seleccionar el ms adecuado y programar adecuadamente los bits FOSC1 y FOSC0 de la palabra de configuracin, que establecen la configuracin entre las siguientes: - LP: - XT: - HS: - RC: Oscilador de cristal de cuarzo o resonador cermico de baja potencia Cristal o resonador cermico Oscilador de cristal o resonador de alta velocidad Oscilador formado por una red resistencia condensador

28

Mara Aranda Elcuaz

Universidad Pblica 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 precisin en la generacin de impulsos de reloj, se puede emplear una red RC mucho ms econmica. En este caso, la frecuencia de oscilacin 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 configuracin RC 2.4.2.2 Perro guardin (WDT) El Perro guardin vigila que el programa no se "cuelgue" y dejen de ejecutarse las instrucciones secunciales del mismo tal como lo ha previsto el diseador. Para realizar esta labor de vigilancia, el perro guardin 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 temporizador est controlado por un oscilador interno independiente, con una temporizacin nominal de 18 ms, que puede aumentarse asignando el divisor de frecuencia al perro guardin, 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 a 0 para iniciar la temporizacin, se consigue por software con las instrucciones CLRWDT y SLEEP. 2.4.2.3 Temporizador TMR0 El TMR0 en los PIC16F87X es un contador ascendente de 8 bits, que puede funcionar con reloj interno o externo y ser sensible al flanco ascendente o descendente. Se le puede

29

Mara Aranda Elcuaz

Universidad Pblica de Navarra

asigna el divisor de frecuencia, y adems posee la posibilidad de generar una interrupcin cuando se desborda. El TMR0 se comporta como un registro de propsito especial ubicado en la posicin 1 del rea de datos. Para trabajar con TMR0 se pueden utilizar las siguientes frmulas 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. Obsrvese que existe un bloque que retrasa dos ciclos y cuya misin consiste en sincronizar el momento del incremento producido por la seal T0CKI con el que producen los impulsos del reloj interno. Cuando no se usa el Divisor de frecuencia, la entrada de la seal 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 Conexin de la alimentacin (POR: Power-On-Reset) 2 Activacin de la patita MCLR (Master Clear Reset) durante una operacin normal. 3 Activacin de MCLR en el estado de Reposo o SLEEP. 4 Desbordamiento del Perro guardin. Como se aprecia en el esquema de la figura 2.4.2.4 de la pgina 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 generacin del reset interno. El bloque temporizador de la figura produce un retraso en la generacin del reset para dar tiempo a que se estabilice la tensin VDD de alimentacin y la frecuencia del oscilador principal. Este temporizador est gobernado por un oscilador RC independiente.

30

Mara Aranda Elcuaz

Universidad Pblica 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 segn 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 Conexin de la alimentacin (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 ejecucin de la instruccin SLEEP. Con esta instruccin ocurren las siguientes acciones: 1. Si el perro guardin 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 tenan 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 guardin que estaba activo cuando se ejecuto SLEEP se desborda y 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 interrupcin consiste en una detencin del programa en curso para realizar una determinada rutina que atienda la causa que ha provocado la interrupcin. Es como una llamada a subrutina, que se origina por otra causa que por una instruccin del tipo CALL.
31

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Tras la terminacin de la rutina de interrupcin, se retorna al programa principal en el punto en que se abandono. Las causas que originan una interrupcin pueden ser externas, como la activacin de una patita con el nivel lgico apropiado, e internas, como las que pueden producirse al desbordarse un temporizador, como el TMR0. En las aplicaciones industriales, las interrupciones son un producto muy potente para atender los acontecimientos fsicos en tiempo real. Las interrupciones evitan que la UCP explore continuamente el nivel lgico de una patita o el valor de un contador. Los PIC16F87X tienen cuatro posibles fuentes de interrupcin: 1. Interrupcin externa provocada al activar la patita RB0/INT 2. Desbordamiento del TMR0 3. Cambio de estado en las lneas del Puerto B 4. Cambio de estado en el comparador analgico En la figura siguiente se ofrece el esquema lgico que controla la generacin de la interrupcin, cuando aparece un nivel alto en su lnea INT de salida.

Figura 2.4.3: Lgica de control para la generacin de la interrupcin Cada causa de interrupcin esta controlada mediante dos lneas o seales. Una de ellas acta como una bandera de sealizacin que indica si se ha producido o no el acontecimiento, mientras que la otra es el permiso o prohibicin de la interrupcin en si. El valor que se aplica a las seales de entrada del circuito de gobierno de las interrupciones proviene del que tengan los bits de los registros INTCON, PIR1 y PIE1. El bit GIE de activacin global del permiso de interrupcin, situado en el registro INTCON, se borra automticamente cuando se reconoce una interrupcin para evitar que se produzca otra cuando se atiende a la inicial. Al retornar de la interrupcin, el bit GIE se vuelve a activar.

32

Mara Aranda Elcuaz

Universidad Pblica de Navarra

2.5 Perifricos
2.5.1 Puertos de entrada y salida
Las patitas de comunicacin de los microcontroladores se agrupan en conjuntos llamados puertos porque dejan entrar y salir la informacin al procesador o pines. Dichos puertos deben soportar las lneas que precisan los distintos perifricos que hay integrados en la cpsula. Cuantos ms perifricos dispone el modelo, exige ms lneas de comunicacin y mayor numero de patitas, con ms multiplexado de seales. 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 ms capacidad en sus memorias. Puerto A: Consta de 6 patitas o lneas (RA0-RA5). Todas, menos RA4, pueden actuar como E/S digitales o como canales de entrada para el Conversor AD. La patita RA4, adems de E/S digital puede funcionar como entrada de reloj externo para el TMR0. Puerto B: Las 4 lneas de mas peso del Puerto B (RB<3:0>) actan como E/S digitales, segn la programacin del registro TRISB. Adems pueden disponer de una carga pull-up interna si se programa la lnea como entrada y el bit<7> (RBPO) del registro OPTION vale 0. Las lneas RB<7:4> funcionan como las anteriores, pero adems pueden provocar una interrupcin si se programan como entradas y se produce el cambio de nivel lgico en alguna de ellas. En tal caso se activa el bit <0> (RBIF) de INTCON. La interrupcin se anula al borrar el bit <3> (RBIE) de INTCON o al hacer una nueva lectura del Puerto B. Puerto C: Es un puerto bidireccional de 8 bits, cada patita acta como E/S digital, segn la programacin de TRISC. Adems, tambin puede actuar como entrada o salida de diversos perifricos internos. Consultar el punto 2.4.1 donde se explican los diagramas de conexionado para ver la funcin de cada patita en el puerto C. Puerto D: Cada patita puede configurarse como E/S digital, segn la programacin del registro TRISD. Tambin puede funcionar como Puerto Paralelo Esclavo para soportar la interconexin 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 lneas RE<2:0> del Puerto E pasan a soportar las seales 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

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Puerto E: Este puerto que solo dispone de tres patitas esta disponible en el modelo, la nomenclatura de las lneas es: RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 Las 3 patitas pueden funcionar como E/S digitales, segn la programacin de los tres bits de menos peso del registro TRISE. Tambin pueden actuar como seales de control (RD, WR y CS) para el flujo de datos entre un microprocesador y el Puerto D, cuando esta programada en el modo Esclavo. Deben programarse como entradas. Finalmente, tambin pueden realizar estas 3 patitas la funcin de canales de entradas analgicas para el Conversor A/D, segn la programacin del registro ADCON1. El registro TRISE, que se muestra en la figura siguiente sirve para configurar las lneas 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 analgico digital


El mdulo de conversin Analgico/Digital dispone de cinco entradas para los dispositivos de 28 pines y ocho para los otros dispositivos de la familia. Es un conversor analgico a digital de 8 bits con una tensin de referencia que puede ser interna (VDD) o externa (entra por la patita AN3/Vref). En cada momento la conversin solo se realiza con la entrada de uno de sus canales, depositando el resultado de la misma en el registro ADRES y activndose la bandera ADIF, que provoca una interrupcin si el bit de
34

Mara Aranda Elcuaz

Universidad Pblica de Navarra

permiso correspondiente esta activado. Adems, al terminar la conversin el bit GO/DONE se pone a 0.

Figura 2.5.2a: Conversor AD con 8 canales para entradas analgicas El mdulo de A/D tiene cuatro registros que son: ADRESH, ADRESL, ADCON0 y ADCON1. Para gobernar el funcionamiento del CAD se utilizan el ADCON0 y el ADCON1. El primero, que se muestra en la figura 2.5.2a, selecciona el canal a convertir con los bits CHS <2:0>, activa al conversor y contiene la bandera que avisa del fin de la conversin (ADIF) y el bit GO/DONE.

Figura 2.5.2b: Registro ADCON0

35

Mara Aranda Elcuaz

Universidad Pblica de Navarra

El registro ADCON1 establece las entradas que son digitales y analgicas, as como el tipo de tensin de referencia (interna o externa). ADFM selecciona el formato del resultado de la conversin, con justificacin izquierda o derecha. PCFG3:PCFG0 son los bits de configuracin de los canales de entrada del conversor. Se utilizan para configurar las patillas como E/S digital o como entrada analgica 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 conversin en el CA/D: 1. Se configura correctamente el CA/D programando los bits de los registros de control. 2. Se autoriza o prohbe la generacin de interrupcin al finalizar la conversin, cargando los bits del PIE1. 3. Para iniciar la conversin se pone el bit GO/DONE = 1. Hay que tener en cuenta el tiempo que durara la conversin. 4. Se detecta el final de la conversin bien porque se genera la interrupcin, o bien porque se explora cuando el bit GO/DONE = 0. 5. Se lee el resultado de la conversin en el registro ADRES. Los registros ADRESH:ADRESL contienen los 10 bits resultado de la conversin A/D. Cuando se completa la conversin A/D, el resultado se guarda en los registros y se pone a
36

Mara Aranda Elcuaz

Universidad Pblica de Navarra

cero el bit GO/DONE y el flag de fin de conversin ADIF (PIR1<6>) se pone a 1. Despus de que el conversor A/D se ha configurado como se quiere, la seleccin del canal debe realizarse antes de hacer la adquisicin. Los canales de entrada analgica deben tener los correspondientes bits del registro TRIS seleccionados como entradas.

2.5.3 Temporizador TMR1


El TMR1 es un Temporizador/Contador ascendente de 16 bits, por lo que esta implementado mediante dos registros especficos 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. Generacin interna (4 TOSC) 2. Generacin mediante un oscilador externo controlado por cristal que se conecta a las patitas RC0/T1OSO/T1CKI y RC1/T1OSI/CCP2. El oscilador se activa 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, segn el valor de los bits <1:0> (TICKPS) del registro T1CON. El reloj externo puede estar sincronizado o no con el interno, segn el bit T1SYNC de T1CON. El interno siempre es sncrono. T1OSCEN habilita el oscilador, #TlSYNC es el bit de control de sincronizacin de la seal 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 duracin mnima de 4.TOSC. En el modo de Reposo cuando funciona en modo sncrono, el TMR1 deja de incrementarse pues se desconecta el circuito de sincronismo. En forma asncrona 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. Tambin en modo asncrono se puede usar como base de tiempos en operaciones de Captura y Comparacin. El modulo CCP pone a 0 el TMR1 cuando se produce una Captura o una Comparacin.
37

Mara Aranda Elcuaz

Universidad Pblica 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 diseado para usarse conjuntamente con el circuito de Modulacin de Anchura de Impulsos (PWM). Se incrementa al ritmo de los impulsos que se le aplican (4.TOSC), 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 especfico 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 parmetros de este temporizador.

Figura 2.5.4a: Diagrama de bloques del TMR2

38

Mara Aranda Elcuaz

Universidad Pblica de Navarra

El reset borra al Predivisor y al Post-divisor. Tambin 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 seal de reloj para el modulo de interfaz serie SSP.

Figura 2.5.4b: Registro T2CON

2.5.5 Mdulos de captura/comparacin/modulacin de anchura de pulsos CCP


Los microcontroladores PIC16F87X disponen de dos de estos mdulos, llamados CCP1 y CCP2, que se controlan con los registros CCP1CON y CCP2CON, respectivamente. Realizan tres funciones: 1. Capturan informacin 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 mdulos CCP1 y CCP2 son idnticos, excepto en ciertas funciones especiales de disparo. Ambos constan de dos registros 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) b) c) d) Un flanco ascendente Un flanco descendente Cada 4 flancos ascendentes Cada 16 flancos ascendentes

Al realizarse una captura se activa la bandera CCPxIF del registro PIR1 o PIR2 y si se programa adecuadamente el bit de permiso en PIE1 o PIE2, se genera una interrupcin. Ya se puede leer el valor del registro CCPRx.
39

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Cuando se produce una captura y no se ha ledo 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 operacin. Una aplicacin del modo de Captura puede ser la medicin 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 Comparacin 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 sncrono. 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 sealizador CCPxIF. En tal caso, si el bit de permiso esta activado se provoca una interrupcin. Si se selecciona la funcin especial de disparo, el CCP1 pone a 0 al TMR1 con lo que CCPR1 funciona como un registro de periodos capaz de provocar interrupciones peridicamente. Tambin el CCP2 pone a 0 el TMR1 e inicia una conversin en el Convertidor A/D, con lo que se pueden realizar peridicamente conversiones de analgicodigitales, 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 ms 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 . TOSC . PREDIVISOR Tiempo a 0 = DCI . TOSC . 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 TOSC, en vez de cada 4 . TOSC. Todo ello sucede cuando se opera con una resolucin 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 pgina 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 resolucin de 10 bits. CCPxM3:CCPxM0 seleccionan el modo de trabajo.

40

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Figura 2.5.5.3: Registro CPPxCON

2.5.6 Puerto serie sncrono (SSP)


Se trata de un perifrico diseado para soportar una interfaz serie sncrono que resulta muy eficiente para la comunicacin del microcontrolador con dispositivos tales como displays, EEPROM, ADC, etc. Tiene dos modos de trabajo: 1. Interfaz Serie de Perifricos (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 seales de control: Salida de Datos (SDO), Entrada de Datos (SDI), Reloj (SCK) y Seleccin de Esclavo (SS). Dichas seales se corresponden con las patitas RC5, RC4, RC3 y RA5 respectivamente. Cada una de las seales debe programarse como entrada o salida segn su condicin, utilizando los bits de los registros TRIS. Cualquier funcin del modo SPI queda anulada poniendo con el valor opuesto a su condicin el bit correspondiente de TRIS. Por ejemplo, si solo se quiere recibir datos, se programa la patita que soporta a SOD como entrada y as se anula su funcin. 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. El dato a transmitirse deposita en SSPBUF y de aqu pasa a SSPSR. Se puede recibir y transmitir datos simultneamente. SSPSR es un registro de desplazamiento que funciona serie/paralelo/serie.

41

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Cuando se acaba de transmitir o recibir un dato completo se activa el bit BF (Buffer Lleno) del registro SSPSTAT. Tambin lo hace la bandera SSPIF y si el bit de permiso esta activado se genera una interrupcin. Cuando se recibe un dato durante una transmisin se ignora y se activa el bit WCOL del registro SSPCON que indica que se ha producido una colisin. (Para ver los detalles de funcionamiento de los registro SSPSTAT y SSPCON consultar el DATA SHEET del 16F87X que se puede encontrar en la pgina web de microchip.) En el caso que se reciba un nuevo dato en SSPSBUF sin haber ledo el anterior se genera un error de desbordamiento.

Figura 2.5.6.1: Modo SPI 2.5.6.2 Modo I2C Este tipo de interfaz serie ha sido desarrollado por Philips y utiliza solo dos hilos trenzados y una masa comn para la interconexin de los diversos dispositivos, que han tenido que ser diseados para soportar este protocolo, asegurando una gran fiabilidad en la comunicacin que llega a tolerar una velocidad mxima de 400 Kbps. Es capaz 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, piscifactoras, etc. El master es el que inicia y termina la transferencia general y provee de la seal de reloj. El esclavo es el dispositivo direccionado por el master, mediante 7 bits, lo que limita el nmero de componentes a 128.

42

Mara Aranda Elcuaz

Universidad Pblica de Navarra

El inicio de la transmisin 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 seal de reloj (SCL). En el protocolo I2C cada dispositivo tiene asignada una direccin de 7 o de 10 bits que enva el master cuando comienza la transferencia con uno de ellos. Tras la direccin se aade el bit de recepcin/transmisin 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 I2C.

Figura 2.5.6.2a: Modo I2C SSPBUF es el registro donde se almacena el byte a transmitir o el que se recibe. SSPSR es el registro desplazamiento serie de la lnea 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 I2C.. Cada vez que se detecta un bit de inicio o un bit de stop es posible que se active la bandera SSPIF y en el caso de estar tambin activado el bit de permiso correspondiente generar una interrupcin.

2.5.7 Interfaz de comunicaciones serie (USART-SCI)


La interfaz de comunicaciones SCI proporciona las mismas prestaciones que una UART programable. Se puede configurar de dos modo diferentes: Asncrono (full-duplex) La comunicacin es bidireccional. La patita RC6/Tx/CK acta como lnea de transmisin y la RC7/Rx/DT como lnea de recepcin. Cada dato lleva un bit de inicio y otro de stop.

Sncrono (semiduplex)
43

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Comunicacin unidireccional. Una sola lnea para los datos que se implementan sobre la patita RC7/Rx/DT. Existen dos modos, en el modo master la seal 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, transmitindose o recibindose por el bit <0> de RXSTA y/o RCSTA. El registro especfico TXSTA acta 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 asncrono. BAUDIOS = FOSC / (n(x + 1)) n = 4 en el modo sncrono n = 16 en el modo asncrono de alta velocidad n = 64 en el modo asncrono de baja velocidad x = valor cargado en el registro SPBRG y siendo x = (FOSC / Baudios) / (n 1)

Mediante la programacin de los bits del registro TXSTA y RCSTA se configura el modo de trabajo. As, SPEN configura RC7/Rx y RC6/Tx como lneas de comunicacin 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 interrupcin. Activando Tx8/9 se inserta el noveno bit almacenado en el bit <0> (TxD8) de TXSTA. El bit TRMT indica si el transmisor esta vaco o no. El dato se recibe por RSR y cuando se completa se pasa al registro RCREG para su posterior lectura, activndose la bandera RCIF y si acaso la interrupcin. Si se activa el bit RC8/9del RCSTA el noveno bit se deposita en el bit <0> (RCD8) del RCSTA. Los bits OERR y FERR indican error de desbordamiento y de trama, respectivamente. En la figura de la pgina siguiente se ofrece la asignacin de funciones de los bits de los registros TXSTA y RCSTA que gobiernan al receptor y transmisor asncronos, respectivamente. En modo sncrono el SCI trabaja en half duplex, no pudiendo emitir y transmitir a la vez. La seal de reloj la enva el transmisor (maestro) conjuntamente con los datos. Los principios y el funcionamiento de la emisin y la recepcin sincronas son similares al modo asncrono y nicamente hay que seleccionar esta forma de trabajo cargando adecuadamente los registros TXSTA y RCSTA.
44

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Figura 2.5.6a: Registro TXSTA La figura superior muestra el registro TXSTA donde el bit 7, CSRC, es el bit de seleccin de reloj siendo solo importante en el modo sncrono donde se elige entre maestro o esclavo. El bit 6 habilita la transmisin de 8 o 9 bits, en general, es TXEN, quien habilita la transmisin. El bit SYNC selecciona el modo USART entre sncrono y asncrono. Finalmente BRGH selecciona si el rango de baudios ser de baja o alta velocidad en el modo asncrono, TRMT es el bit de estado del registro de desplazamiento del transmisor y TX9D es el noveno bit de datos de transmisin. Se puede emplear como bit de paridad. La figura 2.5.6b de la pgina siguiente muestra el registro RCSTA donde el bit 7, SPEN, es el bit de habilitacin del puerto serie. El bit 6 habilita la recepcin de 8 o 9 bits y SREN, bit 5, habilita la recepcin nica y CREN, bit 4, la recepcin continua. Los bits 1 y 2 son bits de error y finalmente, RX9D es el noveno bit de datos de recepcin.

45

Mara Aranda Elcuaz

Universidad Pblica 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 memoria de programa FLASH puede ser modificada sin necesidad de utilizar un programador exterior. Se dispone de seis registros de SFR para leer y escribir sobre la memoria no voltil, estos registros son: EECON1, EECON2, EEDATA, EEDATH, EEADR y EEADRH. 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 posicin y el registro EEDATA para colocar el dato ledo o escrito. Sin embargo para 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 posicin de memoria, por ello se utiliza el registro EEADR concatenado con el registro EEADRH que contiene la parte alta de la palabra de direccionamiento de memoria. De forma similar se utilizan los registros EEDATA concatenado con el registro EEADRH que contiene los 6 bit de mayor peso de las palabras de 14 bits. Adems 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

Mara Aranda Elcuaz

Universidad Pblica 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 direccin de la EEPROM donde se encuentra el dato y luego el microcontrolador copia el dato de dicha posicin a EEDATA. A continuacin hay que poner a 0 el bit EEPGD (EECON1<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 programacin, es ms compleja por razones de seguridad. Antes de escribir un dato en la EEPROM, debe ponerse a 1 la bandera de activacin de escritura WR (EECON1<1>). Para transferir el dato desde el registro EEDATA a la direccin de la EEPROM a la que apunta EEADR, debe ejecutarse una secuencia obligatoria indicada por el fabricante. Posteriormente, cuando se ha realizado con xito la operacin de la bandera EEIF (PIR1<7>) se pone a 1. Si no lo hace, el almacenamiento ha sido incorrecto y no se ha realizado.

2.6 Repertorio de instrucciones de la gama media


Habiendo escogido los diseadores de PIC la filosofa RISC, su juego de instrucciones es reducido, siendo stas, adems, sencillas y rpidas, puesto que casi todas se ejecutan en un nico ciclo de mquina (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 comprensin de la nomenclatura de sus componentes es esencial. De este

47

Mara Aranda Elcuaz

Universidad Pblica de Navarra

modo se expone la tabla siguiente para ayudarle a comprender las abreviaturas, y seguidamente las 35 instrucciones para la gama media.

Abreviatura
PC

Descripcin
Contador de Programa que direcciona la memoria de instrucciones. Tiene un tamao 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. Cima de la pila, con 2 niveles en la gama baja y 8 en la media Perro guardin (Watchdog) Registro W, similar al acumulador Suele ser un campo de 5 bits (fffff) que contiene la direccin del banco de registros, que ocupa el banco 0 del rea de datos. Direcciona uno de esos registros. Bit del cdigo OP de la instruccin, 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 posicin 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. Tambin 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 software de Microchip conviene hacer x = 0 Nombre de la etiqueta Opciones Contenido Se asigna a Campo de bits de un registro Pertenece al conjunto Sealizador de cero en W. Pertenece al registro de estado Sealizador de acarreo en el octavo bit del W. Pertenece al registro de estado Sealiza el acarreo en el 4 bit del W. Pertenece al registro de estado Trminos definidos por el usuario

TOS WDT W F

D Dest TO PD b k

label [] () <> Z C DC Itlicas

48

Mara Aranda Elcuaz

Universidad Pblica de Navarra

ADDLW Suma un literal Sintaxis: [label] ADDLW k Operandos: 0 k 255 Operacin: (W) + (k) (W) Flags afectados: C, DC, Z Cdigo OP: 11 111x kkkk kkkk Descripcin: Suma el contenido del registro W y k, guardando el resultado en W. Ejemplo: ADDLW 0xC2

ADDWF W + F Sintaxis: [label] ADDWF f,d Operandos: d [0,1], 0 f 127 Operacin: (W) + (f) (dest) Flags afectados: C, DC, Z Cdigo OP: 00 0111 dfff ffff Descripcin: 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. Ejemplo: ADDWF REG,0

ANDLW W AND literal Sintaxis: [label] ANDLW k Operandos: 0 k 255 Operacin: : (W) AND (k) (W) Flags afectados: Z Cdigo OP: 11 1001 kkkk kkkk Descripcin: Realiza la operacin lgica AND entre el contenido del registro W y k, guardando el resultado en W. Ejemplo: ADDLW 0xC2

Antes: W = 0x17 Despus: W = 0xD9

Antes: W = 0x17., REG = 0xC2 Despus: W = 0xD9, REG = 0xC2

Antes: W = 0x17 Despus: W = 0xD9

ANDWF W AND F Sintaxis: [label] ANDWF f,d Operandos: d [0,1], 0 f 127 Operacin: (W) AND (f) (dest) Flags afectados: Z Cdigo OP: 00 0101 dfff ffff Descripcin: Realiza la operacin lgica 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. Ejemplo: : ANDWF REG,0

BCF

Borra un bit

BSF

Activa un bit

Sintaxis: [label] BCF f,b Operandos: 0 f 127, 0 b 7 Operacin: 0 (f<b>) Flags afectados: Ninguno Cdigo OP: 01 00bb bfff ffff Descripcin: Borra el bit b del registro f

Sintaxis: [label] BSF f,b Operandos: 0 f 127, , 0 b 7 Operacin: 1 (f<b>) Flags afectados: Ninguno Cdigo OP: 01 01bb bfff ffff Descripcin: Activa el bit b del registro f

Ejemplo:

BCF REG,7 Ejemplo: : BSF REG,7 Antes: REG = 0x0A

Antes: W = 0x17., REG = 0xC2 Despus: W = 0x17, REG = 0x02

Antes: REG = 0xC7 Despus: REG = 0x47

BTFSC Test de bit y salto Sintaxis: [label] BTFSC f,d Operandos: d [0,1], 0 f 127 Operacin: Salto si (f<b>) = 0 Flags afectados: Ninguno Cdigo OP: 01 10bb bfff ffff Descripcin: Si el bit b del registro f es 0, se salta una instruccin y se contina con la ejecucin. En caso de salto, ocupar dos ciclos de reloj. Ejemplo: BTFSC REG,6 GOTO NO_ES_0 SI_ES_0 Instruccin NO_ES_0 Instruccin

BTFSS Test de bit y salto Sintaxis: [label] BTFSS f,d Operandos: d [0,1], 0 f 127 Operacin: Salto si (f<b>) = 1 Flags afectados: Ninguno Cdigo OP: 01 11bb bfff ffff Descripcin: Si el bit b del registro f es 1, se salta una instruccin y se contina con la ejecucin. En caso de salto, ocupar dos ciclos de reloj. Ejemplo: BTFSS REG,6 GOTO NO_ES_0 SI_ES_0 Instruccin NO_ES_0 Instruccin

CALL

Salto a subrutina

Sintaxis: [label] CALL k Operandos: 0 k 2047 Operacin: PC Pila; k PC Flags afectados: Ninguno Cdigo OP: 10 0kkk kkkk kkkk Descripcin: Salto a una subrutina. La parte baja de k se carga en PCL, y la alta en PCLATCH. Ocupa 2 ciclos de reloj. Ejemplo:ORIGEN CALL DESTINO Antes: PC = ORIGEN Despus: PC = DESTINO

49

Mara Aranda Elcuaz

Universidad Pblica de Navarra

CLRF

Borra un registro

CLRW Borra el registro W Sintaxis: [label] CLRW Operandos: Ninguno Operacin: : 0x00 W, 1 Z Flags afectados: Z Cdigo OP: 00 0001 0xxx xxxx Descripcin: El registro de trabajo W se carga con 0x00. El flag Z se activa. Ejemplo: : CLRW

CLRWDT Borra el WDT Sintaxis: [label] CLRWDT Operandos: Ninguno Operacin: 0x00 WDT, 1 /TO 1 /PD Flags afectados: /TO, /PD Cdigo OP: 00 0000 0110 0100 Descripcin: Esta instruccin borra tanto el WDT como su preescaler. Los bits /TO y /PD del registro de estado se ponen a 1. Ejemplo: : CLRWDT Despus: Contador WDT = 0, Preescales WDT = 0, /TO = 1, /PD = 1

Sintaxis: [label] CLRF f Operandos: 0 f 127 Operacin: : 0x00 (f), 1 Z Flags afectados: Z Cdigo OP: 00 0001 1fff ffff Descripcin: El registro f se carga con 0x00. El flag Z se activa.

Ejemplo: :

CLRF REG

Antes: REG = 0x5A Despus: REG = 0x00, Z = 1

Antes: W = 0x5A Despus: W = 0x00, Z = 1

COMF

Complemento de f

DECF Decremento de f Sintaxis: [label] DECF f,d Operandos: d [0,1], 0 f 127 Operacin: : (f ) 1 (dest) Flags afectados: Z Cdigo OP: 00 0011 dfff ffff Descripcin: Decrementa en 1 el contenido de f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f. Ejemplo: : DECF CONT,1

DECFSZ Decremento y salto Sintaxis: [label] DECFSZ f,d Operandos: d [0,1], 0 f 127 Operacin: (f) -1 d; Salto si R=0 Flags afectados: Ninguno Cdigo OP: 00 1011 dfff ffff Descripcin: Decrementa 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 instruccin, en cuyo caso costara 2 ciclos. Ejemplo: DECFSC REG,0 GOTO NO_ES_0 SI_ES_0 Instruccin NO_ES_0 Salta instruccin anterior

Sintaxis: [label] COMF f,d Operandos: d [0,1], 0 f 127 Operacin: : (/ f), 1 (dest) Flags afectados: Z Cdigo OP: 00 1001 dfff ffff Descripcin: El registro f es complementado. El flag Z se activa si el resultado es 0. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.. Ejemplo: : COMF REG,0

Antes: REG = 0x13 Despus: REG = 0x13, W = 0XEC

Antes: CONT = 0x01, Z = 0 Despus: CONT = 0x00, Z = 1

GOTO

Salto incondicional

INCF Incremento de f Sintaxis: [label] INCF f,d Operandos: d [0,1], 0 f 127 Operacin: : (f ) + 1 (dest) Flags afectados: Z Cdigo OP: 00 1010 dfff ffff Descripcin: Incrementa en 1 el contenido de f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f. Ejemplo: INCF CONT,1

INCFSZ Incremento y salto Sintaxis: [label] INCFSZ f,d Operandos: d [0,1], 0 f 127 Operacin: (f) -1 d; Salto si R=0 Flags afectados: Ninguno Cdigo OP: 00 1111 dfff ffff Descripcin: Incrementa 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 instruccin, en cuyo caso costara 2 ciclos. Ejemplo: INCFSC REG,0 GOTO NO_ES_0 SI_ES_0 Instruccin NO_ES_0 Salta instruccin anterior

Sintaxis: [label] GOTO k Operandos: 0 k 2047 Operacin: k PC <8:0> Flags afectados: Ninguno Cdigo OP: 10 1kkk kkkk kkkk Descripcin: Se trata de un salto incondicional. La parte baja de k se carga en PCL, y la alta en PCLATCH. Ocupa 2 ciclos de reloj. Ejemplo: DESTINO ORIGEN GOTO

Antes: PC = ORIGEN Despus: PC = DESTINO

Antes: CONT = 0xFF, Z = 0 Despus: CONT = 0x00, Z = 1

50

Mara Aranda Elcuaz

Universidad Pblica de Navarra

IORLW W OR literal Sintaxis: [label] IORLW k Operandos: 0 k 255 Operacin: : (W) OR (k) (W) Flags afectados: Z Cdigo OP: 11 1000 kkkk kkkk Descripcin: Se realiza la operacin lgica OR entre el contenido del registro W y k, guardando el resultado en W. Ejemplo: IORLW 0x35

IORWF

W AND F

MOVLW Cargar literal en W Sintaxis: [label] MOVLW f Operandos: 0 f 255 Operacin: (k) (W) Flags afectados: Ninguno Cdigo OP: 11 00xx kkkk kkkk Descripcin: El literal k pasa al registro W.

Sintaxis: [label] IORWF f,d Operandos: d [0,1], 0 f 127 Operacin: (W) OR (f) (dest) Flags afectados: Z Cdigo OP: 00 0100 dfff ffff Descripcin: Realiza la operacin lgica 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. Ejemplo: IORWF REG,0

Ejemplo:

MOVLW 0x5A

Antes: W = 0x9A Despus: W = 0xBF

Antes: W = 0x91, REG = 0x13 Despus: W = 0x93, REG = 0x13

Despus: REG = 0x4F, W = 0x5A

MOVF

Mover a f

MOVWF

Mover a f

NOP

No operar

Sintaxis: [label] MOVF f,d Operandos: d [0,1], 0 f 127 Operacin: (f) (dest) Flags afectados: Z Cdigo OP: 00 1000 dfff ffff Descripcin: 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: MOVF REG,0

Sintaxis: [label] MOVWF f Operandos: 0 f 127 Operacin: W (f) Flags afectados: Ninguno Cdigo OP: 00 0000 1fff ffff Descripcin: El contenido del registro W pasa el registro f.

Sintaxis: [label] NOP Operandos: Ninguno Operacin: No operar Flags afectados: Ninguno Cdigo OP: 00 0000 0xx0 0000 Descripcin: No realiza operacin alguna. En realidad consume un ciclo de instruccin sin hacer nada.

Ejemplo: Despus: W = REG

MOVWF REG,0

Ejemplo:

CLRWDT

Antes: REG = 0xFF, W = 0x4F Despus: REG = 0x4F, W = 0x4F

Despus: Contador WDT = 0, Preescales WDT = 0, /TO = 1, /PD = 1

RETFIE Retorno de interrup. Sintaxis: [label] RETFIE Operandos: Ninguno Operacin: : 1 GIE; TOSPC Flags afectados: Ninguno Cdigo OP: 00 0000 0000 1001 Descripcin: El PC se carga con el contenido de la cima de la pila (TOS): direccin de retorno. Consume 2 ciclos. Las interrupciones vuelven a ser habilitadas. Ejemplo: RETFIE

RETLW Retorno, carga W Sintaxis: [label] RETLW k Operandos: 0 k 255 Operacin: : (k) (W); TOSPC Flags afectados: Ninguno Cdigo OP: 11 01xx kkkk kkkk Descripcin: El registro W se carga con la constante k. El PC se carga con el contenido de la cima de la pila (TOS): direccin de retorno. Consume 2 ciclos. Ejemplo: RETLW 0x37

RETURN Retorno de rutina Sintaxis: [label] RETURN Operandos: Ninguno Operacin: : TOS PC Flags afectados: Ninguno Cdigo OP: 00 0000 0000 1000 Descripcin: El PC se carga con el contenido de la cima de la pila (TOS): direccin de retorno. Consume 2 ciclos. Ejemplo: RETURN

Despus: PC = direccin de retorno GIE = 1

Despus: PC = direccin de retorno W = 0x37

Despus: PC = direccin de retorno

51

Mara Aranda Elcuaz

Universidad Pblica de Navarra

RLF Rota f a la izquierda Sintaxis: [label] RLF f,d Operandos: d [0,1], 0 f 127 Operacin: Rotacin a la izquierda Flags afectados: C Cdigo OP: 00 1101 dfff ffff Descripcin: 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. Ejemplo: RRF REG,0

RRF

Rota f a la derecha

SLEEP Modo bajo consumo Sintaxis: [label] SLEEP Operandos: Ninguno Operacin: 0x00WDT, 1 / TO 0 WDT Preescaler, 0 / PD Flags afectados: / PD, / TO Cdigo OP: 00 0000 0110 0011 Descripcin: El bit de energa 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: : SLEEP

Sintaxis: [label] RRF f,d Operandos: d [0,1], 0 f 127 Operacin: Rotacin a la derecha Flags afectados: C Cdigo OP: 00 1100 dfff ffff Descripcin: 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. Ejemplo: RRF REG,0

Antes: REG = 1110 0110, C = 0 Despus: REG = 1110 0110, W = 1100 1100, C = 1

Antes: REG = 1110 0110, C = 1 Despus: REG = 1110 0110, W = 01110 0011, C = 0

Preescales WDT = 0, /TO = 1, /PD = 1

SUBLW Resta Literal - W Sintaxis: [label] SUBLW k Operandos: 0 k 255 Operacin: ( k ) - (W) (W) Flags afectados: Z, C, DC Cdigo OP: 11 110x kkkk kkkk Descripcin: Mediante el mtodo del complemento a dos el contenido de W es restado al literal. El resultado se almacena en W. Ejemplos: SUBLW 0x02

SUBWF

Resta f W

SWAPF Intercambio de f Sintaxis: [label] SWAPF f,d Operandos: d [0,1], 0 f 127 Operacin: : (f <3: 0>) (f <7:4>) Flags afectados: Ninguno Cdigo OP: 00 1110 dfff ffff Descripcin: Los 4 bits de ms 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

Sintaxis: [label] SUBWF f,d Operandos: d [0,1], 0 f 127 Operacin: ( f ) (W ) (dest) Flags afectados: C, DC, Z Cdigo OP: 00 0010 dfff ffff Descripcin: Mediante el mtodo 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: SUBWF REG,1 Antes: REG = 0x03, W = 0x02, C = ? Despus:REG=0x01, W = 0x4F, C=1 Antes: REG = 0x02, W = 0x02, C = ? Despus:REG=0x00, W =0x02, C= 1 Antes: REG= 0x01, W= 0x02, C= ? Despus:REG=0xFF, W=0x02, C= 0 (Resultado negativo)

Antes:W=1,C=?. Despus: W=1, C=1 Antes:W=2,C=?. Despus: W=0, C=1 Antes:W=3,C=?.Despus:W=FF,C=0 (El resultado es negativo)

Antes: REG = 0xA5 Despus: REG = 0xA5, W = 0x5A

XORLW W OR literal Sintaxis: [label] XORLW k Operandos: 0 k 255 Operacin: : (W) XOR (k) (W) Flags afectados: Z Cdigo OP: 11 1010 kkkk kkkk Descripcin: Se realiza la operacin lgica XOR entre el contenido del registro W y k, guardando el resultado en W. Ejemplo: : XORLW 0xAF

XORWF W AND F Sintaxis: [label] XORWF f,d Operandos: d [0,1], 0 f 127 Operacin: (W) XOR (f) (dest) Flags afectados: Z Cdigo OP: 00 0110 dfff ffff Descripcin: Realiza la operacin lgica 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: : XORWF REG,0

La gama media tiene un total de 35 instrucciones, cada una de las cuales ocupan 14 bits.

Antes: W = 0xB5 Despus: W = 0x1A

Antes: W = 0xB5, REG = 0xAF Despus: W = 0xB5, REG = 0x1A

52

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Captulo 3. Herramientas de trabajo


Para la realizacin de las prcticas ser necesario disponer de cierto material fsico y algunos programas informticos: Hardware necesario: - Tarjeta entrenadora Picdem 2 Plus de Microchip - In-Circuit Debugger ICD 2 - PIC 16F877 Software necesario: - Microchip MPLAB IDE con Plug-in de CCS instalado

3.1 Placa de pruebas: PICDEM 2 PLUS


Sobre la placa de pruebas PICDEM 2 PLUS de Microchip se realizarn todas las prcticas propuestas en el captulo 4; se presenta a continuacin un listado de sus caractersticas generales:

1) Posee 3 mdulos para la conexin de microcontroladores de 18, 28 y 40 pines que en ningn caso podrn ser utilizados al mismo tiempo. 2) Regulador de +5 V para entradas de corriente 9 V, 100 mA AC/DC, pila de 9V o +5 V de corriente continua regulada para la alimentacin de la placa. 3) Conexin serie RS-232 y hardware asociado (MAX232A para ajustar niveles) para comunicar la tabla con distintos dispositivos externos como puede ser, por ejemplo, un ordenador. 4) Conector para el depurador y grabador en circuito ICD 2 5) Potencimetro de 5 K para entradas analgicas, conectado a RA0 a travs de una resistencia de 470 . 6) 3 pulsadores para impulsos externos (RA4 y RB0) y botn de reset. Si se presionan se ponen a 0, si no, permanecen a nivel alto. 7) Led verde de indicacin de encendido
53

Mara Aranda Elcuaz

Universidad Pblica de Navarra

8) 4 Leds rojos conectados al Puerto B de cada uno de los microcontroladores 9) Jumper J6 para la desconexin de los leds 10) Oscilador de 4 MHz 11) Conectores vacos para otros osciladores 12) Cristal de 32.768 KHz para la operacin de TMR1 13) Jumper J7 para la desconexin del oscilador RC 14) EEPROM 32k x 8 serie para comunicacin I2C 15) Pantalla LCD con dos lneas de 16 caracteres cada una. Las lneas de control son RA3:RA1 y cuatro lneas de datos (RD3:RD0)

16) Buzzer 17) rea de conexin de hardware libre 18) Sensor de temperatura TC74 conectado a los micros a travs de RC3 y RC4 compatible con la comunicacin I2C En la siguiente tabla se puede ver un resumen de las conexiones de entrada y salida:

3.2 Software de programacin


MPLAB IDE es un conjunto de herramientas que permite el desarrollo completo de proyectos siguiendo las siguientes fases: 1) Editar el programa: Estas prcticas sern diseadas en lenguaje C en el 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) Compilar o ensamblar el programa fuente, es decir, convertir a cdigo mquina ejecutable el programa fuente editado en la fase anterior. Para poder compilar el programa ser necesario tener instalado el Plug-in de CCS y para ensamblarlo habr que emplear el programa MPASWIN que incluye MPLAB IDE.

54

Mara Aranda Elcuaz

Universidad Pblica de Navarra

3) Simular el programa: Antes de grabar el programa en la memoria del PIC, conviene comprobar si el funcionamiento del programa es correcto. Para ello se puede simular por software con el simulador que incluye MPLAB. No es una fase obligatoria, es opcional pero conveniente. 4) Grabacin del PIC: Para la grabacin del microcontrolador se utilizar el ICD2 conectado al PC.

3.2.1 Cmo usar MPLAB


3.2.1.1 Creacin de proyectos MPLAB es un Entorno de Desarrollo Integrado (IDE) fcil de aprender y fcil de usar. La caracterstica IDE proporciona a los desarrolladores de software para aplicaciones la flexibilidad para editar, compilar, emular, simular, desarrollar y depurar su propio software para las familias de microcontroladores PIC16/17 de 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 creacin de proyectos donde habr que seguir unos pasos sencillos para la configuracin del proyecto.

1) Seleccin del modelo de microcontrolador a emplear de una lista. En el caso de estas prcticas se elegir el PIC16F877. 2) Seleccin del lenguaje y compilador a emplear as como la ubicacin de este en el PC, en este caso, se utilizar el compilador de Ccs tal y como se indica en la figura.

55

Mara Aranda Elcuaz

Universidad Pblica 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 al proyecto y elegir la carpeta donde se desea guardar.

4) Seleccionar los archivos de cdigo fuente y las libreras necesarias para llevar a cabo el proyecto.

56

Mara Aranda Elcuaz

Universidad Pblica de Navarra

En caso de no haber creado todava el cdigo fuente, no habra ms que crearlo en el editor de textos del propio programa o en cualquier otro editor de textos. En MPLAB sera File>New, una vez escrito se guarda pulsando File>Save. Despus de seguir todos los pasos el programa realiza un resumen, ah se pulsa Finalizar y se sale del asistente. En este punto cabe destacar que lo realizado hasta ahora es simplemente la creacin del cdigo fuente y la configuracin de las aplicaciones que se van a emplear. El siguiente paso es la compilacin. 3.2.1.2 Compilacin del programa Una vez realizado el proyecto es tan sencillo como darle al botn de compilar tal y como se indica en la figura de la pgina siguiente.

Si el programa no tiene fallos nos saldr un mensaje de que se ha compilado con xito Build Sucedded, si tiene algn error saldr un mensaje e indicar en que lnea o parte del programa se ha producido, habr que corregirlo y volver a compilar. Una vez compilado correctamente se habr generado en la carpeta previamente seleccionada un archivo de igual nombre al cdigo fuente pero con extensin .hex. Este archivo es el mismo pero traducido a cdigo mquina, 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 opcin Compile aparecer la opcin Assemble y todo lo dems ser exactamente igual a lo explicado para el lenguaje C. 3.2.1.3 Programacin Una vez generado el archivo en cdigo mquina 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 va USB al ordenador y despus 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

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Una vez seleccionado habr que pulsar el icono Program tarjet device y el programa quedar grabado en el PIC.

58

Mara Aranda Elcuaz

Universidad Pblica de Navarra

3.3 Lenguaje C.
En este punto de proyecto no se pretende explicar cmo se programa en este lenguaje, sino hacer un listado de las directivas y funciones permitidas por el compilador PCW de CCS, compilador especfico para microcontroladores de la casa Microchip. As pues, se parte de la idea de que el lector posee conocimientos bsicos de este lenguaje u otros lenguajes de alto nivel.

3.3.1 Operadores y expresiones


Una expresin de asignacin tradicional es de la forma expr1 = expr1 operador expr2, pero tambin puede ser representada por otra ms corta expr1 operador = expr2. En la siguiente tabla se resumen los operadores de asignacin compuesta y su significado:

Los operadores aritmticos empleados para realizar operaciones matemticas son:

La misin de los operadores relacionales es comparar dos operandos y dar un resultado entero, 1 si es verdadero y 0 si es falso:

59

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Los operadores lgicos, al igual que los operadores relacionales, devuelve 1 o 0 tras la evaluacin 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 slo 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 carcter # seguido por un comando especfico. Algunas de estas directivas son extensiones del C estndar. El C proporciona una directiva del preprocesador, que los compiladores aceptan, y que 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 continuacin se describen algunas directivas del compilador que se emplearn para programar los microcontroladores PIC en estas prcticas. 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 posicin de memoria x ms el bit de desplazamiento y. #BYTE identificador = X
60

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Esta directiva crear un identificador id que puede utilizarse como cualquier INT (un byte). El identificador har referencia a un objeto en la posicin de memoria x, donde x puede ser una constante u otro identificador. Si x es otro identificador, entonces ste estar localizado en la misma direccin que el identificador id. #RESERVE Permite reservar posiciones de la RAM para uso del compilador. #RESERVE debe aparecer despus de la directiva #DEVICE, de lo contrario no tendr efecto. 3.3.2.2 Directivas del C estndar #DEFINE identificador CADENA Se utiliza simplemente para reemplazar el identificador (ID) con CADENA #IF expresin_constante #ELSE #ENDIF El preprocesador evala la expresin_constante y si es distinta de cero procesar las lneas hasta el #ELSE o en su defecto hasta el #ENDIF. #INCLUDE <Nombre_Fichero> #INCLUDE "Nombre_Fichero" Esta directiva hace que el compilador incluya en el fichero fuente el texto que contiene el archivo especificado en <Nombre_Fichero>. 3.3.2.3 Especificacin de dispositivos #FUSES opciones Esta directiva define qu fusibles deben activarse en el dispositivo cuando se programe. Esta directiva no afecta a la compilacin; sin embargo, esta informacin es necesaria para algunos programadores de dispositivos. Algunas de las opciones ms usadas son: LP, XT, HS, RC WDT, NOWDT PROTECT, NOPROTECT PUT, NOPUT (Power Up Timer) BROWNOUT, NOBROWNOUT SWAP 3.3.2.4 Libreras incorporadas #USE DELAY (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

Mara Aranda Elcuaz

Universidad Pblica de Navarra

#USE FAST_IO (puerto) Esta directiva afecta al cdigo que el compilador generar para las instrucciones de entrada y salida. Este mtodo rpido de hacer I/O ocasiona que el compilador realice I/O sin programar el registro de direccin. #USE I2C (master/slave, SDA=Pin, SCL=Pin opciones) La librera I2C contiene funciones para implementar un bus I2C. La directiva #USE I2C permanece efectiva para las funciones I2C_START, I2C_STOP, I2C_READ, I2C_WRITE e 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 cdigo que el compilador genera para las instrucciones de entrada y salida. El mtodo estndar de hacer I/O causar que el compilador genere cdigo 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 estndar.
62

Mara Aranda Elcuaz

Universidad Pblica 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 carcter por la patilla RCV del dispositivo RS232 y retorna el carcter recibido. Es preciso utilizar la directiva #USE RS232 antes de la llamada a esta funcin para que el compilador pueda determinar la velocidad de transmisin 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 transmisin. PUTC() PUTCHAR() Estas funciones envan un carcter a la patilla XMIT del dispositivo RS232. Es preciso utilizar la directiva #USE RS232 antes de la llamada a esta funcin para que el compilador pueda determinar la velocidad de transmisin y la patilla utilizada. La directiva #USE RS232 permanece efectiva hasta que se encuentre otra que anule la anterior. PUTS(string) Esta funcin enva cada carcter de string a la patilla XMIT del dispositivo RS232. Una vez concluido el envo de todos los caracteres la funcin enva un retorno de carro CR o RETURN (ASCII 13) y un avance de lnea LF o LINE-FEED (ASCII 10). PRINTF([function], string, [values]) La funcin de impresin formateada PRINTF saca una cadena de caracteres al estndar serie RS-232 o a una funcin especificada. El formato est relacionado con el argumento que ponemos dentro de la cadena (string). Cuando se usan variables, string debe ser una constante. El carcter % se pone dentro de string para indicar un valor variable, seguido de uno o ms caracteres que dan formato al tipo de informacin a representar. Si ponemos %% obtenemos a la salida un solo %. El formato tiene la forma genrica %wt, donde w es optativo y puede ser 1,2,...,9. Esto es para especificar cuntos carcteres son representados; si elegimos el formato 01,...,09 indicamos ceros a la izquierda, o tambin 1.1 a 9.9 para representacin en punto flotante. t es el tipo de formato y puede ser uno de los siguientes:

63

Mara Aranda Elcuaz

Universidad Pblica de Navarra

SET_UART_SPEED(baud) Esta funcin cambia la velocidad de transmisin de la UART (Universal Asynchronous Receiver Transmitter) en tiempo de ejecucin. SETUP_ADC(mode) Esta funcin configura (permite establecer analgico/digital. Los modos son los siguientes: 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 mtodo de acceso de I/O depende de la ltima directiva #USE *_IO utilizada. El valor de retorno es un entero corto. OUTPUT_BIT(pin, value) Esta funcin saca el bit dado en value(0 o 1) por la patilla de I/O especificada en pin. El modo de establecer la direccin del registro, est determinada por la ltima directiva #USE *_IO. OUTPUT_HIGH(pin) Pone a 'uno' el pin indicado. El mtodo de acceso de I/O depende de la ltima directiva #USE *_IO utilizada. OUTPUT_LOW(pin) Pone a 'cero' el pin indicado. El mtodo de acceso de I/O depende de la ltima directiva #USE *_IO. los parmetros) del conversor

64

Mara Aranda Elcuaz

Universidad Pblica de Navarra

SET_TRIS_A(value) SET_TRIS_B(value) SET_TRIS_C(value) SET_TRIS_D(value) SET_TRIS_E(value) Estas funciones permiten escribir directamente los registros tri-estado para la configuracin de los puertos. Esto debe usarse con FAST_IO() y cuando se accede a los puertos de I/O como si fueran memoria, igual que cuando se utiliza una directiva #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 funcin realiza retardos segn el nmero de ciclos de instruccin especificado en count; los valores posibles van desde 1 a 255. Un ciclo de instruccin es igual a cuatro periodos de reloj. DELAY_MS(time) Esta funcin realiza retardos del valor especificado en time. Dicho valor de tiempo es en milisegundos y el rango es 0-65535. Es preciso utilizar la directiva #use delay(clock=frecuencia) antes de la llamada a esta funcin, para que el compilador sepa la frecuencia de reloj. DELAY_US(time) Esta funcin realiza retardos del valor especificado en time. Dicho valor es en microsegundos y el rango va desde 0 a 65535. Es necesario utilizar la directiva #use delay antes de la llamada a esta funcin para que el compilador sepa la frecuencia de reloj. 3.3.3.4 Funciones de control del procesador DISABLE_INTERRUPTS(level) Esta funcin desactiva la interrupcin del nivel dado en level. El nivel GLOBAL prohbe todas las interrupciones, aunque estn habilitadas o permitidas. Los niveles de interrupcin son:

ENABLE_INTERRUPTS(level) Esta funcin activa la interrupcin del nivel dado en level. Queda a cargo del tcnico definir un procedimiento o rutina de atencin, para el caso que se produzca la interrupcin
65

Mara Aranda Elcuaz

Universidad Pblica de Navarra

indicada. El nivel GLOBAL permite todas las interrupciones que estn habilitadas de forma individual. SLEEP() Esta funcin 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 funcin reiniciar el timer del watchdog. Si habilitamos el timer del watchdog, debe llamarse peridicamente 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 funcin inicializa el timer1. Los valores de mode deben ordenarse juntos, tal como se muestra en el ejemplo. El valor del timer puede leerse y puede escribirse utilizando GET_TIMER1() y SET_TIMER1(). Los valores de mode son:

SETUP_TIMER_2(mode, period, postscale) Esta funcin inicializa el timer2; mode especifica el divisor del reloj del oscilador. Period es un nmero comprendido entre 0-255, y determina el momento en el que el valor del reloj se resetea a 0. postscale es un nmero de 0 a 15, que determina cuntos reset del timer se han producido antes de una interrupcin. 0 significa 1 reset, 1 significa 2 reset, y as sucesivamente. El valor del timer puede leerse y puede escribirse utilizando GET_TIMER2() y SET_TIMER2().
66

Mara Aranda Elcuaz

Universidad Pblica 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 funcin configura los pines del ADC para que sean analgicos, digitales o alguna combinacin de ambos. SETUP_ADC(mode) Esta funcin 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 funcin READ_ADC(). El nmero de canal empieza en 0. Es preciso esperar un corto espacio de tiempo despus de cambiar el canal de adquisicin, antes de que se puedan obtener lecturas de datos vlidos. i=READ_ADC() Esta funcin lee el valor digital del conversor analgico digital. Deben hacerse llamadas a SETUP_ADC() y SET_ADC_CHANNEL() en algn momento antes de la llamada a esta funcin. 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

Mara Aranda Elcuaz

Universidad Pblica 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 (slo si se utiliza un ciclo de trabajo de 8 bits) CCP_PWM_PLUS_2 (slo si se utiliza un ciclo de trabajo de 8 bits) CCP_PWM_PLUS_3 (slo 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 funcin lee un byte en la direccin (address) de Eeprom especificada. La direccin puede ser 0-63. WRITE_EEPROM(address, value) Esta funcin escribe un byte de datos en la direccin de memoria Eeprom especificada. Value es el byte de datos a escribir.

3.3.4 Definicin de datos


Si TYPEDEF se pone delante de la definicin 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 constante. Las constantes deben ser inicializadas y no pueden cambiar en tiempo de ejecucin. typedef [calificador_tipo] [especificador_tipo] [identificador]

Especificadores de tipo: unsigned unsigned int int char long long int signed signed int signed long define un nmero de 8 bits sin signo define un nmero de 8 bits sin signo define un nmero de 8 bits sin signo define un nmero de 8 bits sin signo define un nmero de 16 bits sin signo define un nmero de 16 bits sin signo define un nmero de 8 bits con signo define un nmero de 8 bits con signo define un nmero de 16 bits con signo
68

Mara Aranda Elcuaz

Universidad Pblica de Navarra

float short short int

define un nmero de 32 bits en punto flotante define un bit define un bit

3.3.5 Definicin de una funcin


El formato de la definicin de una funcin es como sigue: [calificador_tipo] identificador ([[especificador_tipo identificador]) { [cuerpo de la funcin] } El calificador_tipo para una funcin pueden ser void o un especificador de tipo (vase la lista de la pgina anterior) La definicin de una funcin puede ir precedida por una de las siguientes directivas del preprocesador (calificadores de funcin) para identificar una caracterstica especial de la funcin: #separate #inline #int_... Cuando utilizamos una de las directivas mencionadas y la funcin tiene un prototipo (declaracin anterior a la definicin de la funcin, y colocada al principio del fichero fuente) hay que incluir la misma #directiva en el prototipo y en la definicin de la funcin. Una funcin que tiene un parmetro de tipo char aceptar una constante de cadena. El compilador generar un bucle que llama a la funcin una vez para cada carcter 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 cdigo fuente 4. Compilar 5. Grabar el programa en el microcontrolador Como etapas previas a la escritura del cdigo 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 de funciones main() { variables locales; bloque de sentencias; llamadas a las funciones;
69

Mara Aranda Elcuaz

Universidad Pblica de Navarra

} funcion_1() { variables locales a funcion_1; bloque de sentencias; llamada a otra/s funciones; } funcion_n() { }

70

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Captulo 4. Prcticas
4.1 Entradas Digitales
El objetivo de esta prctica es tener una primera toma de contacto con todos los elementos que se irn empleando a lo largo de los distintos ejercicios planteados en este captulo. Para ello se van a realizar distintos ejemplos que trabajan con entradas digitales cuyo resultado se visualizar mediante unos leds. El trabajo con entradas digitales es, posiblemente, el ejercicio ms sencillo que se puede plantear. Adems, se realizar una comparacin entre el diseo 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


Disear 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 Inicializacin de registros Encender Led Retardo 65 ms Apagar Led Retardo 65 ms

4.1.1.2 Solucin en ensamblador Para el correcto diseo 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

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Para generar una rutina de retardo correcta habr que tener en cuenta la frmula dada en el apartado 2.4.2.3 de la memoria: Tiempo = 4 Tosc (Valor cargado en TMR0) (Rango del Divisor) Valor a cargar en TMR0 = (tiempo / 4 Tosc) (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 mximo, 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 aproximacin. En el lenguaje C, tal y como se ver en el siguiente punto, existe una funcin que directamente introduce un retardo de 65 ms, el resultado no slo es ms exacto sino que tambin es ms directo ya que no ser necesario realizar ningn clculo 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 solucin al problema planteado en ensamblador quedara de la siguiente manera: <1a-ensamblador.asm>
LIST P=16F877 INCLUDE"P16F877.INC" #define #define org INIC BANK1 bsf STATUS,5 ;Macro para abreviar el BANCO 1 BANK0 bcf STATUS,5 ;Macro para abreviar el BANCO 0 0 ;Posicin 0 de la memoria de programa ;Seleccin del Banco 1 ;Se configura todo el puerto B como salida ;Se configura el registro ;OPTION:TMR0:Preescaler 256 ;Seleccin del Banco 0 ;Apaga todos los leds del puerto B

BANK1 clrf TRISB movlw b'11010111' movwf OPTION_REG BANK0 clrf PORTB

PARPA call bcf call goto RETAR LOOP btfss goto bcf return

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 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

Mara Aranda Elcuaz

Universidad Pblica de Navarra

end

;fin de programa

Inicialmente en el programa se llama a la librera del microcontrolador donde tiene configuradas las direcciones de todos los registros del PIC y despus se pasa al programa principal donde se distinguen tres fases bien diferenciadas. La primera fase configura el puerto B como salida y el registro de opciones para la correcta configuracin del temporizador TMR0. En la segunda fase estara el programa principal, enciende y apaga el leds y llama a la rutina de retardos y finalmente, en la tercera fase se expone la rutina del retardo. Por ltimo, cabe destacar que en este programa no se ha definido la palabra de configuracin, 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 Solucin en C Para el correcto diseo 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 continuacin, el lenguaje C es mucho ms breve y ms fcil de comprender. Por lo tanto, a la hora de pensar el diseo de un programa ser ms rpido 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,NOPUT,NOBROWNOUT,NOLVP #use delay(clock=4000000) #use fast_io(B) void main() // Programa principal { set_tris_b(0); // Configura el puerto B como salida while (1) // Bucle infinito { output_B(1) ; / / Enciende 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 presentacin es muy clara y se han aadido los comentarios correspondientes tras cada funcin en el propio programa. A simple vista parece que el programa planteado en C ocupa mucho menos que el programa diseado en ensamblador, pero en la realidad no es as, una vez traducidos a

73

Mara Aranda Elcuaz

Universidad Pblica de Navarra

cdigo mquina, el programa en C ocupa 312 bytes mientras que el programa en lenguaje ensamblador ocupa 103 bytes. Si emplesemos un programa para desensamblar el cdigo en C y traducirlo a ensamblador se podra ver como en realidad para realizar el mismo trabajo se necesitan ms instrucciones. La flexibilidad del C tiene su precio en cuanto a tamao de cdigo y tiempo de ejecucin.

4.1.2 Encendido de un led a travs de un pulsador


Disear un programa en c y ensamblador que encienda el led RB1 despus de presionar el pulsador RA4. 4.1.2.1 Organigrama Inicio PIN A4: Entrada Puerto B: Salida Inicializacin de registros

Chequeo pulsador Han pulsado ?

No

Apagar led

S Retardo para evitar rebotes Encender led 4.1.2.2 Solucin en ensamblador Para dar solucin 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 pequeo retardo para evitar rebotes despus de presionar el pulsador y as no confundir al microcontrolador El programa queda resuelto en lenguaje ensamblador de la siguiente manera: <1b-esamblador.asm>
74

Mara Aranda Elcuaz

Universidad Pblica de Navarra

LIST P=16F877 INCLUDE"P16F877.INC" #define #define org INIC BANK1 bsf STATUS,5 ;Macro para abreviar el BANCO 1 BANK0 bcf STATUS,5 ;Macro para abreviar el BANCO 0 0 ;Posicin 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 movlw b'11010010' ;Se configura el registro ;OPTION:TMR0:Preescaler 8 movwf OPTION_REG ; BANK0 ;se lecc in del Banco 0 PORTB PORTA,4 ;pulsado? WAIT RETAR ;Apaga los LEDS borrando el puerto B ;Lee el interruptor y espera a que sea "0". Han ;No han pulsado, va a la etiqueta WAIT ;Si han pulsado, llama a la rutina de RETARDO

WAIT clrf btfsc goto call PULSA btfss goto cal l RETAR LOOP btfss goto bcf return end

bsf PORTB,1 ;Bit 1 del PUERTO B "1". Enciende el LED PORTA,4 ;Lee el interruptor y espera a que sea "1". Han ;soltado? PULSA ;No, va a la etiqueta PULSAR WAIT ;S i , va a la et iqueta 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 ;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 principal donde se lee el estado del pulsador y se acta en consecuencia. 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 Solucin en c Para conseguir una solucin en lenguaje C habr que pensar en introducir en el programa una secuencia condicional que revise los dos estados del pulsador y acte en consecuencia tras hacer todas las configuraciones que sean necesarias. El problema planteado podra tener el siguiente diseo: <1b-c.c>
#include <16F877.h> 75

Mara Aranda Elcuaz

Universidad Pblica de Navarra

#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP #use delay(clock=4000000) #use fast_io(A) #use fast_io(B) #byte port_a=0X05 #byte port_b=0X06 void main() { set_tris_a(0xFF); //Puerto A como entrada set_tris_b(0x00); //Puerto B como salida port_b=0; for(;;) //Bucle infinito { if(!input(PIN_A4)) //Si se ha pulsado hacer... { delay_us(50); //meter un tiempo para los rebotes output_high(P IN_B0); / /encender led } else //Si no { output_ low(P IN_B0); /apagar el led / } } }

Como conclusin, cabe indicar que la solucin a estos problemas no es exclusiva; se ha puesto una posible solucin y por supuesto, habr otras distintas igualmente vlidas. El objetivo de esta prctica era doble: 1) Que el alumno tome contacto con las prcticas con dos simples ejemplos, conociendo ya de forma prctica el microcontrolador, la placa de pruebas y los lenguajes de programacin. 2) Una muestra de que el lenguaje C en el caso de este proyecto tiene ms 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 da salen al mercado nuevos modelos con mayor capacidad y no por ello aumentan su tamao. Adems por muy extensas que puedan llegar a ser las prcticas aqu planteadas, al compilar el programa se comprueba que el tamao de cdigo no llega en ningn caso a ocupar un 80% de la memoria del PIC. Tambin 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 contraposicin, se piensa que el lenguaje C es ms comprensible y puede ahorrar al diseador tiempo de trabajo. Por todo esto, se toma la determinacin a partir de este punto de resolver las prcticas nicamente en lenguaje C.

76

Mara Aranda Elcuaz

Universidad Pblica de Navarra

77

Mara Aranda Elcuaz

Universidad Pblica de Navarra

4.2 LCD y Memoria Eeprom


En la prctica anterior ya se ha visto como se utilizaba la librera del PIC 16F877, librera que se puede encontrar en el Anexo 1. Esta librera contiene el nombre y la direccin de todos los registros del PIC as como la definicin de una serie de funciones que facilitarn el manejo de temporizadores, entradas analgicas y otra serie de recursos que se irn viendo a lo largo del resto de prcticas. 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 conexin 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 tambin 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 prctica es conocer las conexiones del LCD, cmo funciona, su librera LCD y aprender a manejar las funciones incluidas en ella y adems la grabacin en la memoria EEPROM del PIC que se ver en el punto siguiente.

4.2.1 Envo de mensajes al LCD


Tras leer y comprender el archivo lcd-picdem.c, crear un programa que muestre en la pantalla LCD los siguientes mensajes solamente una 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 nmeros. Entre letra y letra meter una pausa de 0,5 s. 3. Terminar con una despedida centrada en la segunda lnea. 4.2.1.1 Organigrama Inicio Definir vector Inicializar variables y LCD Enviar mensaje 1 Retardo 5000 ms

78

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Borrar Pantalla

Situar cursor Enviar carcter Retardo 0,5 s ltimo carcter ? S Borrar pantalla Situar cursor Enviar menaje 3 Retardo 5000 ms No

4.2.1.2 Solucin Para que este programa funcione correctamente primero habr que inicializar la pantalla con su correspondiente funcin en el programa principal. Los mensajes primero y tercero son simples, bastar una funcin 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 ms complicado, primeramente habr que definir un vector de caracteres que contenga el abecedario y todos los nmeros a enviar. Posteriormente, y ya en el programa principal, habr que generar un bucle para ir movindose a lo largo de toda la pantalla y asimismo meter el retardo solicitado de 0,5s entre el envo del primer carcter y el segundo. Dicho todo esto el programa pedido quedara de la siguiente manera: <2lcd.c>
#include <16F877.h> #use delay(clock=4000000) #include <lcd-picdem.c> //Archivo de config de la pantalla #fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP char vector [ ]={' ' , ' a ' , ' b ' , ' c ' , ' d ' , ' e ' , ' f ' , ' g ' , ' h ' , ' i ' , ' j ' , ' k ' , ' l ' , ' m ' , 'n ' , ' o ' , ' p ' , ' q ' , ' r ' , ' s ' , ' t ' , ' u ' , ' v ' , ' w ' , ' x ' , ' y ' , ' z ' , ' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' } ; 79

Mara Aranda Elcuaz

Universidad Pblica de Navarra

void main() { int i,j=1; lcd_ in i t ( ) ; lcd_putc(" Hola delay_ms(5000); lcd_putc("\f"); / / I n i c i a la pantal l a "); //Enva 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 posicin i,j } else { lcd_gotoxy((i-16),j); //Sino a la posicin i-16,j } printf(lcd_putc,"%c", vector[i]);//Escribir el carcter i delay_ms(500); / /Pausa de 0,5s if(i==16) { j=2; //Despus del carcter 16 pasar a la //2 lnea } } //Fin del bucle lcd_putc("\f"); lcd_gotoxy(1,2); lcd_putc(" Adios! delay_ms(5000); } //Vuelve a borrar pantalla //Y coloca el cursor en la segunda //lnea "); //Envia Adios //Pausa de 5 segundos

Como se puede comprobar en este ejercicio se desarrollan la mayora de funciones definidas para el LCD: - Inicializacin de la pantalla (lcd_init()) - Posicionamiento del cursor (lcd_gotoxy(x,y)) - Envo de comandos al LCD (lcd_putc(\f)) - Escritura en pantalla: - Constantes (lcd_putc(" Adios! ")) - Vectores ( printf(lcd_putc,"%c", vector[i])) Es un ejercicio sencillo pero muy completo a la vez en lo que al funcionamiento del LCD se refiere.

4.2.2 Programacin de la EEPROM


Tal y como se ha visto en el punto 2.3.2 de este documento, la memoria de datos EEPROM posee 256 bytes en el PIC16F877 donde puede almacenar de forma indefinida
80

Mara Aranda Elcuaz

Universidad Pblica de Navarra

cualquier dato que se desee retener cuando se apague la alimentacin. Para recordar el funcionamiento interno de esta memoria basta consultar el punto 2.5.8 tambin en este documento. Para poner en prctica la programacin 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 que controle el funcionamiento de una mquina de Su turno que se puede encontrar habitualmente en cualquier establecimiento comercial. Sobre el LCD se visualizar el nmero del turno actual (2 dgitos). Este se deber incrementar a cada pulso aplicado por RA4. En la memoria EEPROM del PIC16F877 se almacenar el ltimo nmero visualizado, de forma que, ante un fallo de alimentacin por ejemplo, se reanude la cuenta en el ltimo nmero. Qu sucede al pulsar el reset?, Se reinicia el programa? 4.2.2.1 Organigrama

81

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Inicio Pin A4: Entrada Iniciar LCD Leer EEPROM Turno>99 ? S Turno = 1 Posicionar cursor Escribir LCD Chequeo Pulsador Han pulsado? S Retardo rebotes Incrementar turno Turno>99 ? S No No No

Turno = 1

Escribir EEPROM Situar Cursor Enviar turno al LCD 4.2.2.2 Solucin


82

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Para disear este programa ser necesario conocer las funciones para el manejo de la Eeprom que se pueden encontrar en el captulo del lenguaje C. Por otra parte, se recomienda generar una rutina que coloque el cursor en todo momento para sobrescribir el nmero y que a su vez lo muestre a travs de la pantalla LCD; A esta rutina se le podr llamar cuando sea necesario. A continuacin, se presenta una solucin posible al problema planteado: <2eeprom.c>
#include <16f877.h> #use delay(clock=4000000) #fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP #use fast_io(A) #include <lcd-picdem.c> int turno; void Visualizar_Turno() { lcd_gotoxy(8,1); printf (lcd_putc,"%U", turno); } void main() { set_tris_a(0b00010000); lcd_init(); //PIN RA4 como entrada //Rutina para mandar el turno al LCD

// Comandos de inicializacin del LCD. //Lee la posicin 0 de la EEPROM //Poner a 1 si est fuera del rango

lcd_putc("Turno: "); turno = read_eeprom(0); if((turno<1)||(turno>99)) { turno=1; } Visualizar_Turno();

//Ver el turno

while (1) { if(!input(PIN_A4)) { delay_ms(90); //Retardo para evitar rebotes turno++; //Incrementar turno if(turno>99) //Si es mayor de 99 volver a 1 { lcd_gotoxy(9,1); lcd_putc(" "); turno=1; } write_eeprom(0,turno); //Escribir el valor en la eeprom Visualizar_Turno(); //Visualizarlo en el LCD } } } 83

Mara Aranda Elcuaz

Universidad Pblica de Navarra

En la cabecera del programa se hacen las configuraciones pertinentes y se incluyen los archivos necesarios para el correcto funcionamiento de las funciones incluidas en el programa principal tal y como se haca hasta ahora. Despus se expone la subrutina que escribir el valor en la LCD cada vez que se pulse RA4 y que se llamar durante el programa principal. En el programa principal, tras configurar el PIN RA4 como entrada y la inicializacin del LCD se lee la EEPROM para comprobar el ltimo nmero que ley la maquina antes de perder la alimentacin si ese valor no est dentro del rango [01-99] se inicializa a 1 y se visualiza el turno por la LCD. Despus siempre que se pulse RA4, incrementar el turno en una posicin, se mostrar en la LCD y se grabar en la memoria EEPROM por si hay fallos en la alimentacin. Al pulsar el botn 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 el ltimo valor antes de presionar el pulsador del reset fue memorizado en la Eeprom.

84

Mara Aranda Elcuaz

Universidad Pblica de Navarra

4.3 Entradas analgicas: Potencimetro


Como ya se ha comentado en el captulo 2 de la memoria, el PIC16F877 posee 8 pines situados en las puertas A y E que pueden trabajar de manera analgica. Conectado al pin RA0 del microcontrolador, la placa de pruebas PICDEM 2 PLUS posee un potencimetro con una resistencia R16 de 5 k que puede oscilar entre 0 y +5V con ayuda de una ruleta. La figura siguiente indica la conexin del potencimetro al microcontrolador:

Con la ayuda de este potencimetro en esta prctica se pretende visualizar, a travs del LCD de la placa de pruebas, el voltaje que cae en dicha resistencia en tiempo real segn la posicin en que se deje la ruleta que lo controla. 4.3.1 Organigrama Inicio Definir constantes y variables Iniciar pantalla

Situar cursor Encender ACD Seleccionar terminales analgicas

85

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Seleccionar canal Hacer conversin AD Escalar valores Enviar datos al LCD Retardo 10 ms

4.3.2 Solucin Para la realizacin de este programa habr que tener en cuenta varias cosas expuestas ya en el punto 2.5.2 pero que es conveniente recordar: Primero, el PIC 16F877 posee una resolucin de hasta 10 bits para el resultado de la conversin A/D, si en el compilador no se pone nada, da por hecho que la resolucin que se desea obtener es de 8 bits, si se prefiere una resolucin de 10 bits habr que especificarlo. En este caso una resolucin de 8 bits ser suficiente para obtener resultados satisfactorios y la instruccin #device adc no sera necesaria pero se ha querido poner igualmente. Segundo, habr que configurar los puertos que se desean emplear de forma analgica, el conversor analgico 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 resolucin 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 operacin se puede crear una subrutina que haga el clculo y se le llame desde el programa principal. Un programa que podra dar solucin al problema queda expuesto y explicado a continuacin: <adc.c>
#include <16F877.h> #device adc=8 #use delay(clock=4000000) #include <lcd-picdem.c> #fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP const int escala = 255; const float v_max = 5.0; void calcula_voltaje (int val, float &voltaje) { voltaje=(val*v_max)/escala; } 86

Mara Aranda Elcuaz

Universidad Pblica de Navarra

void main(void) { int valor; f l oa t vol ta je ; 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 setup_adc_ports(AN0); //Selecciona terminales set_adc_channel(0); // Selecciona canal valor=read_adc(); // Conversin AD calcu la_vo l ta j e (va lo r , vo l ta j e ) ; pr int f ( l c d _putc , "%1.2f" , vo l t a j e ) ; delay_ms(10); } }

Tras la cabecera de programa correspondiente se definen las constantes para el clculo del voltaje y la subrutina que realiza el clculo. 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 analgico digital, escalarlo y finalmente mostrarlo en pantalla.

87

Mara Aranda Elcuaz

Universidad Pblica 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 modulacin por anchura de pulsos. Para ver como funciona la PWM en detalle, adems de lo dicho en captulos 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 mdulo 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 comparador comprueba si son iguales 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 automtica, obteniendo de esta forma una salida modulada por anchura de pulso (PWM) en el pin CCP1. Grficamente sera as:

PR2 CCPR1 TMR2

Para un primer acercamiento a la modulacin por anchura de pulsos se plantea el siguiente ejercicio:

4.4.1 Primer acercamiento al PWM


Con la ayuda de las dos siguientes frmulas para el clculo 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. Adems 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 conseguirn distintas intensidades para el led. Para el clculo de PR2 se tiene que: T = (PR2+1)4ToscTMR2preescaler

88

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Para el clculo del duty se tiene que: Duty = (CCPR1L:CCPCON1<5:4>)ToscTMR2preescaler 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 Solucin Para los clculos de PR2 y CCPRL1 hay que tener en cuenta que el oscilador de la placa de pruebas PICDEM 2 PLUS trabaja a una frecuencia de oscilacin de 4MHz y TMR2preescaler se le da el valor de 16. Con esto y despejando de las frmulas 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 frmula dada se tendr que los valores de CCPR1L sern 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 modulacin de anchura de pulsos en el captulo 3.3.3 de la programacin en lenguaje C se puede realizar ya el programa solicitado que podra quedar de la siguiente manera:
89

Mara Aranda Elcuaz

Universidad Pblica de Navarra

<ejermod1.c>
#include <16F877.H> #fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP #use Delay(Clock=4000000) #use fast_io(B) #byte PORTB=6 main() { PORTB=0b00000010; setup_ccp1(CCP_PWM); / / Configura CCP1 como PWM setup_timer_2(T2_DIV_BY_16,124,1) ; / / f=500Hz (T=2ms) set_pwm1_duty(62); // Duty=1ms de partida while(1) { if(!input(PIN_B0) set_pwm1_duty(94); if(! input (P IN_A4)) set_pwm1_duty(16); } }

// Duty=1,5ms // Duty=250ms

En la cabecera tal y como se haca hasta ahora se realizan las configuraciones necesarias para el PIC y para el empleo del puerto B como salida. Despus se configura el led a utilizar y el CCP1 como PWM. Se carga la frecuencia de 500 Hz y el duty inicial para despus entrar en un bucle infinito que cambie los dutys segn se presione los distintos pulsadores. NOTA IMPORTANTE: CCP1 en este microcontrolador 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 iluminacin del led. A mayor tiempo de encendido el led mostrar mayor intensidad y viceversa.

4.4.2 PWM empleando entradas analgicas


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 potencimetro conectado a RA0. Adems 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 clculos de PR2 y CCPR1L emplear las frmulas dadas en el ejercicio anterior. 4.4.2.1 Organigrama

90

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Inicio Definir constantes y variables

Iniciar LCD Configurar CCP1 Seleccionar frecuencia Encender ADC Seleccionar terminales analgicos Seleccionar canal

Convertir AD Establecer Duty Escalar Duty Enviar datos al LCD

4.4.2.2 Solucin Este ejercicio combina la mayor parte de lo visto hasta ahora ya que emplea entradas analgicas, trabaja con el LCD y adems se introduce la modulacin por anchura de pulsos. Tras la cabecera del programa habr que generar una rutina que escale el duty tal y como se haca para el voltmetro en la prctica 3. Habr que realizar tambin las configuraciones pertinentes del LCD para mostrar resultados y finalmente todo lo que lleva relacionado el PWM consigo. Dicho todo esto, el programa solicitado podra tener la siguiente forma: <ejermod2.c>
#include <16F877.H> #fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP #use Delay(Clock=4000000) #include <lcd-picdem.c> 91

Mara Aranda Elcuaz

Universidad Pblica 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); lcd_putc (" f=500Hz- >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) ; / / f=500Hz (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 segn se mueve la ruleta, adems 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 mnimo el led estar apagado y el duty ser de 0 ms y cuando la ruleta se encuentre en su mximo el led permanecer encendido a su mxima 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

Mara Aranda Elcuaz

Universidad Pblica de Navarra

4.5. Comunicacin Serie PIC-PC (RS-232)


Resulta de gran inters abrir las puertas de comunicacin del microcontrolador para poder comunicarse no slo con los elementos incluidos en la placa de pruebas dada sino tambin con elementos exteriores ms potentes como puede ser un ordenador o cualquier elemento que sea poseedor tambin de un bus de comunicaciones. En esta prctica se pretende ver cmo el microcontrolador con ayuda de un cable serie y un sencillo programa informtico de comunicacin 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 tambin es capaz de reconocer. El programa informtico al que se refiere en este documento es el HyperTerminal de Windows. Antes de comenzar con la prctica 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 el PC a un microcontrolador por el puerto serie se utilizan las seales Tx, Rx y GND. El PC utiliza la norma RS232, por lo que los niveles de tensin de los pines estn 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 PICDEM 2 PLUS viene ya incrustado, se trata del chip MAX232 cuyo esquema se puede ver en la pgina siguiente. En el esquema se puede ver que lleva conectados 4 condensadores q sern necesarios para que las transmisiones se lleven a cabo. Adems se observa como las patitas 13 y 14 estn conectadas al puerto serie de la placa que comunicar como el ordenador y las patitas 11 y 12 estn conectadas a las patitas RX (RC7) y TX (RC6) del microcontrolador. Todas estas observaciones realizadas en esta pgina junto con las nombradas en el apartado correspondiente de la programacin en lenguaje C sern necesarias para llevar a cabo la prctica de manera satisfactoria.

93

Mara Aranda Elcuaz

Universidad Pblica de Navarra

4.5.1 Un ejemplo sencillo


Se propone a continuacin un ejemplo sencillo y divertido para comprobar 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 despus la muestre en el LCD de la placa de pruebas para as comprobar que el microcontrolador tambin es capaz de recibir la informacin. 4.5.1.1 Organigrama Inicio Declarar e iniciar variables Iniciar LCD Transmitir cadena a PC Escribir LCD

Recibir carcter RS232 Enviar carcter RS232 Situar cursor Escribirlo en la LCD

94

Mara Aranda Elcuaz

Universidad Pblica de Navarra

4.5.1.2 Solucin Si se han estudiado las funciones relacionadas con la comunicacin serie el programa se disea casi de manera inmediata como sigue: <1rs232.c>
// Comunicacin serie gestionada por software. #include <16f877.h> #use delay(clock=4000000) #use RS232(BAUD=9600, RESTART_WDT) #include <lcd-picdem.c> main() { int x=1; char c; lcd_init(); puts("Escribe tu nombre: "); lcd_putc ("Te l l amas: ") ; while (1) { c = getc(); putc(c); lcd_gotoxy(x,2); lcd_putc(c); x++; if(x>16) { x=1; } } }

BITS=8,

PARITY=N,

XMIT=PIN_C6,

RCV=PIN_C7,

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 nmero de bits pueden variar, en este ejercicio se han puesto los valores ms empleados, aunque podran ser otros sin afectar demasiado al funcionamiento del programa. Las patillas XMIT y RCV deben coincidir con los pines de transmisin serie definidos para cada microcontrolador. Una vez iniciada la pantalla, en el programa principal la funcin 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 funcin put_lcd enviar lo que le sigue a la pantalla LCD. En este momento el programa queda esperando a recibir algo por el teclado.
95

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Una vez pulsada una tecla en el teclado, la funcin c=getc() hace que el microcontrolador reciba ese carcter y la siguiente funcin hace que se enve en forma de eco a la pantalla del Hyperterminal. Despus se coloca en la posicin de pantalla correspondiente y las va escribiendo en el LCD.

4.5.2 PWM a distancia. Versin 1.


Una vez visto el ejemplo anterior que explicaba de manera sencilla el funcionamiento del puerto serie se puede realizar cualquier ejemplo de mayor o menor complejidad que no debe entraar ninguna dificultad para realizarlo por el alumno. Ya que en prcticas anteriores se ha visto el funcionamiento del PWM, aqu se va un poco ms all y se plantea un ejercicio de PWM a distancia. El programa deber solicitar en el Hyperterminal las configuraciones 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 continuacin: Inicialmente, ayudndose de la pantalla del Hyperterminal, se darn a elegir entre tres frecuencias posibles: Si se pulsa 1 se realizar la configuracin para f = 500Hz Si se pulsa 2 se realizar la configuracin para f = 2KHz Si se pulsa 3 se realizar la configuracin para f = 20KHz Si se pulsa cualquier otra tecla se mostrar un mensaje de error y se volver a pedir que se elija frecuencia

Adems habr que memorizar ese valor en la memoria Eeprom para posibles desconexiones de alimentacin. Una vez establecida la frecuencia habr que solicitar, tambin mediante la pantalla del Hyperterminal el duty con el que se quiere trabajar. Si se pulsa 1 se realizar la configuracin para duty = 1,5ms Si se pulsa 2 se realizar la configuracin para duty = 750us Si se pulsa cualquier otra tecla se mostrar un mensaje de error y se volver a pedir que se elija duty

Tambin en este caso habr que memorizarlo en la memoria Eeprom y en ambos casos se deber enviar tambin 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 pantalla del Hyperterminal cuales eran las ltimas configuraciones seleccionadas antes de la ltima desconexin y configurar con ellas el led. Nota de ayuda: Inicialmente este programa puede dar algunos errores debido a que el carcter que el PIC recibe viene dado en cdigo ASCII y habr que cambiarlo a nmero entero. Para solucionar esto no habr que hacer grandes esfuerzos puesto que el compilador incluye en su librera stdlib.h una funcin que convierte el cdigo ASCII a nmeros enteros.
96

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Si se consulta esta librera rpidamente se descubre qu funcin realiza este trabajo. En el programa solicitado simplemente habr que incluir esta librera y llamar a la funcin correspondiente cuando sea necesario. 4.5.2.1 Organigrama Inicio Incluir librera LCD y RS232 Declarar variables Iniciar Pantalla y led Configurar CCP1 como PWM Leer EEPROM Seleccionar frecuencia y duty Enviar datos al PC No Frecuenci a correcta? S Seleccionar frecuencia (PR2) Mandar datos LCD Parte 2 Mandar datos PC Mandar datos PC No Duty correct o? S Seleccionar duty (CCPR1L) Mandar datos LCD Convertir ASCII a entero Escribir EEPROM Convertir ASCII a entero Escribir EEPROM Parte 1 Enviar cadenas para seleccin de frec al PC Recibir respuesta va RS232 Parte 2 Enviar cadenas para seleccin de duty al PC Recibir respuesta va RS232

Parte 1

4.5.2.2 Solucin Tras incluir en la cabecera las configuraciones y libreras 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 nmero entero. Despus de la definicin de las variables comienza el programa principal, que tras las configuraciones e inicio de pantalla debera leer la memoria Eeprom para mostrar los resultados de frecuencia y duty anteriores a la desconexin de la alimentacin. Comienza el primer bucle, aquel que solicita una frecuencia hasta que el valor introducido es vlido y seguir tres pasos:
97

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Convierte el valor ASCII a nmero entero Memoriza el valor entero en la Eeprom Entra dentro de una condicional que configure PR2 como corresponda y muestre la seleccin por el led, la pantalla LCD y la pantalla del Hyperterminal

Cuando termina este bucle comienza otro exactamente igual, pero esta vez para la configuracin del duty. Por lo tanto, una posible solucin al problema planteado quedara como sigue: <Pwmrs232.c>
#include <16f877.h> #fuses HS,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP #use delay(clock=4000000) #use RS232(BAUD=9600, RESTART_WDT) #use fast_io(B) #byte PORTB=6 #include <lcd-picdem.c> #include <stdlib.h> char c[1]; long int k1,k2; main() { lcd_init(); lcd_gotoxy(1,1); PORTB=0b00000010; // B1 ser el led para la modulacin 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==1) { setup_timer_2(T2_DIV_BY_16,124,1); // f=500Hz (T=2ms) puts("Una frecuencia de 500 Hz"); } if (k1==2) { setup_timer_2(T2_DIV_BY_16,30,1); // f=2KHz (T=0,5ms) puts("Una frecuencia de 2 KHz") ; } if (k1==3) { setup_timer_2(T2_DIV_BY_16,2,1); // f=20KHz (T=50us) puts("Una frecuencia de 20 KHz") ; 98 BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7,

Mara Aranda Elcuaz }

Universidad Pblica de Navarra

k2=read_eeprom(1); // Lee el valor del ltimo duty seleccionado i f (k2==1) { set_pwm1_duty(94); // Duty=1,5ms puts("Y un duty de 1,5ms"); } if (k2==2) { set_pwm1_duty(16); // Duty=750us puts("Y un duty de 750us") ; } while(1) { parte1: puts("Pulsa 1, 2 o 3 segun a la frecuencia que ahora prefieras trabajar: "); puts("1 . f=500Hz (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("Has selecc ionado la frecuencia de 500 Hz"); lcd_putc (" f=500Hz- >T=2ms ") ; } if (k1==2) { setup_timer_2(T2_DIV_BY_16,30,1); // f=2KHz (T=0,5ms) puts("Has selecc ionado la frecuencia de 2 KHz") ; lcd_putc (" f=2kHz- >T=0.5ms ") ; } if (k1==3) { setup_timer_2(T2_DIV_BY_16,2,1); // f=20KHz (T=50us) puts("Has selecc ionado la frecuencia de 20 KHz") ; lcd_putc (" f=20KHz- >T=50us ") ; } if ((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=1.5ms"); puts("2. Duty=750us");

99

Mara Aranda Elcuaz gets(c ) ;

Universidad Pblica de Navarra

k2 = atoi32(c); //Convierte los ascii recibidos a un numero entero. 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("Has selecc ionado el duty de 1.5ms"); lcd_putc (" Duty = 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. Versin 2.


El programa realizado en el punto anterior es interesante pero demasiado largo y poco prctico debido a que solo se pueden seleccionar tres diferentes tipos de frecuencia y dos de duty. El problema est en que se emplea una funcin que escribe carcter a carcter y no por bloques. Si se sustituye la funcin de escritura por printf se soluciona dicho problema y se puede obtener un programa ms corto y con un rango de eleccin de la configuracin mucho ms amplio. As pues, en este programa se pide: 1) Pedir por pantalla una frecuencia en Hz que est dentro del rango 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 mostrar adems los valores obtenidos para PR2 y CPR1L. 4.5.3.1 Organigrama

100

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Inicio Incluir librera LCD y RS232 Declarar variables Iniciar Pantalla y led Configurar CCP1 como PWM Seleccionar duty Enviar datos al PC Parte 1 Parte 2

101

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Parte 1 Enviar cadenas para seleccin de frec al PC Recibir respuesta va RS232 Convertir ASCII a entero Calcular PR2 No

Parte 2 Enviar cadenas para seleccin de duty al PC Recibir respuesta va RS232 Convertir ASCII a entero Calcular CCPR1L CCPR1 L correcto? S Seleccionar duty Mandar datos LCD Mandar datos PC

No

PR2 vlido? S Seleccionar frecuencia Mandar datos LCD Mandar datos PC

4.5.3.2 Solucin El problema en este caso conlleva algn cambio ms respecto al anterior. Habr que definir una cadena de caracteres ms larga y una vez introducida habr que operar con ella para obtener los valores correspondientes de PR2 y CCPR1L, ya que esta vez no son inmediatos. <Pwmrs232version1.2>
#include <16f877.h> #fuses HS,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP #use delay(clock=4000000) #use RS232(BAUD=9600, RESTART_WDT) #use fast_io(B) #byte PORTB=6 #include <lcd-picdem.c> #include <stdlib.h> 102 BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7,

Mara Aranda Elcuaz

Universidad Pblica de Navarra

char frec[5]; long int k1,K2,PR2,CCPR1L; main() { lcd_init(); lcd_gotoxy(1,1); lcd_putc("F= lcd_gotoxy(1,2); lcd_putc ("Duty= PORTB=0b00000010; setup_ccp1(CCP_PWM);

Hz"); us") ; // B1 led para la modulacin // Configura CCP1 como PWM

puts("Ejercicio de PWM a distancia."); set_pwm1_duty(0); while(1) { parte1: puts("Elige la frecuencia que prefieras trabajar en Hz y pulsa INTRO: "); gets(frec); k1 = atoi32(frec); //Convierte ascii a un numero entero. pr int f ( "%Lu" " Hz", k1); puts(" "); PR2=(62500/k1)- 1; if ((PR2<0)|(PR2>255)) { puts("Frecuencia indebida, seleccione de nuevo una frecuencia"); goto parte1; } if ((PR2>0)&(PR2<256)) { setup_timer_2(T2_DIV_BY_16,PR2,1); pr int f ( " por tanto, PR2=" "%Lu", PR2); puts(" ") ; } lcd_gotoxy(4,1); printf(lcd_putc,"%Lu",k1); parte2: puts("Elige el duty en us y pulsa INTRO: "); gets( f r ec ) ; k2 = atoi32(frec); pr int f ( "%Lu" " us" , k2);/Devuelve el dato rec ib ido / puts(" ") ; CCPR1L=k2/16; if ((CCPR1L<0)|(CCPR1L>255)) { 103 // Frecuencia 0 de partida

Mara Aranda Elcuaz puts("Duty incorrecto, repite el proceso"); goto parte2; } if ((CCPR1L>0)&(CCPR1L<256)) { set_pwm1_duty(CCPR1L); printf(" por tanto, CCPR1L=" "%Lu", CCPR1L); puts(" ") ; } lcd_gotoxy(7,2); printf(lcd_putc,"%Lu",k2);

Universidad Pblica de Navarra

puts("Muy bien, ahora comprueba el resul tado en la placa." ) ; puts(" "); } }

104

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Captulo 5. Comunicaciones CAN


5.1 Introduccin
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 automocin alemana a mediados de los aos 80 por Robert Bosch. Su objetivo principal era hacer los automviles ms seguros, fiables y con un gasto de combustible ms eficiente mientras se reduca el peso y la complejidad de los mismos. Algunos aos importantes para el CAN son: - 1983: Comienzo del proyecto interno de Bosch para vehculos - 1987: Primeros controladores CAN desde Intel y Philips - 1991: Se publica la especificacin 2.0 - 1992: Se establece la CiA (CAN in Automation) y el CAN comienza a emplearse en los automviles de la casa Mercedes - 1993: se publica el estndar ISO 11898 - 1995: se aade la trama extendida a la ISO 11898 A pesar de que hoy en da el 80% de las aplicaciones CAN estn en la industria automovilstica, el protocolo CAN tambin 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 estn concentradas en la industria automovilstica donde realiza el control del motor, de la mecnica del automvil as como los sistemas de entretenimiento. Relacionado con la industria automovilstica, el CAN se extiende al transporte pblico y otras mquinas mviles como aviones, helicpteros, trenes y los controles de trfico y sistemas de informacin conductor/pasajero. Pero en general el CAN se aplica en cualquier sistema de control industrial: sistemas de control de plantas y maquinaria, redes entre mquinas, sistemas de supervisin y en la automatizacin de edificios: control de ascensores, aire acondicionado, sistemas de calefaccin y refrigeracin, control de iluminacin En resumen, en cualquier sistema que precise control en tiempo real distribuido y con escaso flujo de datos.

5.2 Caractersticas del bus CAN


El bus CAN es un bus serie de transmisin de datos en tiempo real que sigue la norma ISO 11898 y sus caractersticas son:

105

Mara Aranda Elcuaz

Universidad Pblica de Navarra

1. La comunicacin est basada en mensajes y no en direcciones, todos los nodos CAN son capaces de transmitir y recibir datos y varios pueden acceder al bus de datos simultneamente. No hay sistema de direccionamiento de los nodos en el sentido convencional y los mensajes se envan segn su prioridad: Un nodo emisor enva el mensaje a todos los nodos de la red, cada nodo, segn 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 aadir nodos adicionales al bus sin necesidad de reprogramar todo el sistema para que se reconozcan los nuevos nodos. 3. Gran fiabilidad en la transmisin: - Detecta errores, los sealiza, enva mensaje de error y reenviar el mensaje corrupto una vez que el bus vuelva a estar activo - Distingue entre errores temporales y errores permanentes desconectando automticamente los nodos defectuosos. - Puede operar en ambientes con condiciones extremas de ruido e interferencias. 4. La velocidad de transmisin 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 creacin del modelo de referencia
106

Mara Aranda Elcuaz

Universidad Pblica de Navarra

OSI (Open System Interconection, ISO 7498). Este modelo implementa las dos capas inferiores del protocolo CAN, la capa fsica y la capa de enlace de datos.

5.3.1 Capa fsica


La capa fsica es responsable de la transferencia de bits entre los distintos nodos que componen la red. Define aspectos como niveles de seal, codificacin, sincronizacin y tiempos en que los bits se transfieren al bus. En la especificacin original de CAN, la capa fsica no fue definida, permitiendo diferentes opciones para la eleccin del medio y niveles elctricos de transmisin. Las caractersticas de las seales elctricas en el bus fueron establecidas ms tarde por el estndar ISO 11898 y su modelo de referencia OSI. Adems, ah se especifica tres niveles con distintas funciones cada uno. Los distintos niveles de la capa fsica son:

Figura 5.3.1.a Los nodos conectados al bus interpretan dos niveles lgicos denominados: Dominante: la tensin diferencial (CAN_H - CAN_L) es del orden de 2.0 V con CAN_H = 3.5V y CAN_L = 1.5V (nominales). Recesivo: la tensin diferencial (CAN_H - CAN_L) es del orden de 0V con CAN_H = CAN_L = 2.5V (nominales). La codificacin de bits se realiza por el mtodo NRZ (Non-Return-to Zero) que se caracteriza por que el nivel de seal puede permanecer constante durante largos periodos de tiempo y habr que tomar medidas para asegurarse de que el intervalo mximo permitido entre dos seales no es superado. Esto es importante para la sincronizacin. No hay flanco de subida ni de bajada para cada bit, durante el tiempo de bit hay bits dominantes (0) y recesivos (1) y disminuye la frecuencia de seal respecto a otras codificaciones (como la codificacin Manchester, por ejemplo).

107

Mara Aranda Elcuaz

Universidad Pblica 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 lgico y est dividida a su vez en dos niveles. El primero sera el LLC, Logical Link Control, que se dedica al filtrado de aceptacin, la notificacin de sobrecarga y a la gestin de recuperacin. El segundo nivel es el MAC, Mdium Access Control, dedicado al encapsulado y desencapsulado de datos, codificacin de las tramas, gestin de acceso al medio, deteccin y sealizacin de errores, acuses de recibo Todo esto se ir viendo en los puntos posteriores de este captulo.

5.4 Mensajes y tipos de tramas


Como se ha comentado en el apartado de caractersticas, 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 segn le interese o no. Existen distintos tipos de tramas predefinidas por CAN para la gestin de la comunicacin: Trama de datos: Se utiliza normalmente para poner informacin en el bus y la pueden recibir algunos o todos los nodos. Trama de informacin remota: puede ser utilizada por un nodo para solicitar la transmisin de una trama de datos con la informacin asociada a un identificador dado. El nodo que disponga de la informacin definida por el identificador la transmitir en una trama de datos. Trama de error: Se generan cuando algn nodo detecta algn error definido. Trama de sobrecarga: Se generan cuando algn nodo necesita ms tiempo para procesar los mensajes recibidos. Espaciado entre tramas: Las tramas de datos (y de interrogacin 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 informacin espontneamente con tramas de datos, bien sea por un proceso cclico o activado ante eventos en el nodo. La trama de interrogacin remota slo se suele utilizar para deteccin de presencia de nodos o para
108

Mara Aranda Elcuaz

Universidad Pblica de Navarra

puesta al da de informacin en un nodo recin incorporado a la red. Los mensajes pueden entrar en colisin en el bus, el de identificador de mayor prioridad sobrevivir y los dems son retransmitidos lo antes posible.

5.4.1 Trama de datos

Figura 5.4.1.a Los mensajes de datos consisten en celdas que envan datos y aaden informacin 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 sincronizacin con otros nodos. Celda de Arbitraje (Arbitration Field): Es la celda que concede prioridad a unos mensajes o a otros: En formato estndar tendr 11 bits seguidos del bit RTR (Remote Transmisin Request) que en este caso ser dominante.

Figura 5.4.1.c En formato extendido sern 11 bits de identificador base y 18 de extendido. El bit SRR substituye al RTR y ser recesivo.

Figura 5.4.1.d
109

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Nota: La trama en formato estndar prevalece sobre la extendida Celda de control (Control Field): El campo de control est formado por dos bits reservados para uso futuro y cuatro bits adicionales que indican el nmero de bytes de datos. En realidad el primero de estos bits (IDE) se utiliza para indicar si la trama es de CAN Estndar (IDE dominante) o Extendido (IDE recesivo). El segundo bit (RB0) es siempre recesivo. Los cuatro bits de cdigo de longitud (DLC) indican en binario el nmero de bytes de datos en el mensaje (0 a 8) Celda de Datos (Data Field): Es el campo de datos de 0 a 8 bytes. CRC: Cdigo de redundancia cclica: Tras comprobar este cdigo se podr comprobar si se han producido errores. Celda de reconocimiento (ACK): 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. Fin de trama (EOF): Consiste en 7 bits recesivos sucesivos e indica el final de la trama. Espaciado entre tramas (IFS): Consta de un mnimo de 3 bits recesivos.

5.4.2 Trama remota


Los nodos tienen habilidad para requerir informacin a otros nodos. Un nodo pide una informacin a los otros, el nodo que tiene dicha informacin enva una comunicacin con la respuesta que puede ser recibida adems por otros nodos si estn interesados.

Figura 5.4.2.a Un mensaje de peticin remota tiene la siguiente forma:

Figura 5.4.2.b

110

Mara Aranda Elcuaz

Universidad Pblica de Navarra

En este tipo de mensajes se enva 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 enve un mensaje de datos y de peticin 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 comunicacin limpiamente tras el error. El Indicador de error es distinto segn el estado de error del nodo que detecta el error:

Figura 5.4.3.a Si un nodo en estado de error "Activo" detecta un error en el bus interrumpe la comunicacin 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 la generacin 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 delimitacin de error formado por los 8 bits recesivos. Entonces la comunicacin se reinicia y el nodo que haba sido interrumpido reintenta la transmisin 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 transmisin de una trama de error de tipo pasivo no afectar a ningn nodo en la red, excepto cuando el error es detectado por el propio nodo que est transmitiendo. En ese caso los dems nodos detectarn una violacin de las reglas de relleno y transmitirn a su vez tramas de error. Tras sealar un error por medio de la trama de error apropiada cada nodo transmite bits recesivos hasta que recibe un bit tambin recesivo, luego transmite 7 bits recesivos consecutivos antes de finalizar el tratamiento de error. La regla de relleno de bits que aparece lneas 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

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Figura 5.4.3.b Otro mtodo para la deteccin de errores es el chequeo de la trama:

Figura 5.4.3.c El campo CRC contiene informacin adicional a la trama, ste se calcula con un polinomio generador de igual manera en el receptor y en el emisor. Esto permite 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 monitorizacin, 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 interrogacin 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 transmisin o el bus permanecer en reposo. Para un nodo en estado error pasivo la situacin es diferente, deber espera una secuencia adicional de 8 bits recesivos antes de poder iniciar una transmisin. De esta forma se asegura una ventaja en inicio de transmisin 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 slo puede generarse durante el espacio entre tramas. De esta forma se diferencia de una trama de error, que slo puede ser transmitida durante la transmisin 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 ser seguidos por los generados por otros nodos, dando lugar a un mximo de 12 bits dominantes. El delimitador es de 8 bits recesivos.
112

Mara Aranda Elcuaz

Universidad Pblica 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 recepcin de un nuevo mensaje. De esta forma retrasa el inicio de transmisin de un nuevo mensaje. Un nodo puede generar como mximo 2 tramas de sobrecarga consecutivas para retrasar un mensaje. Otra razn para iniciar la transmisin de una trama de sobrecarga es la deteccin 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 generacin de tramas de sobrecarga por los dems nodos dando lugar, como se ha indicado, a un mximo de 12 bits dominantes de indicador de sobrecarga.

5.5 Acceso mltiple 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 adems, 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 unsono se detectar la colisin. Al detectarse la colisin comienza el arbitraje. Cada nodo emisor enva los bits del identificador del mensaje y vigila el bus comprobando lo que emite. El nodo de mayor prioridad (con bits dominantes, 0) acceder primero al bus y una vez pasado un tiempo de espera, diferente para cada nodo, se vuelve a intentar el acceso sin repeticin de mensaje ni prdidas de tiempo ya que esta contencin es a nivel de bit. Es un modo no 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

Mara Aranda Elcuaz

Universidad Pblica 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 da: Protocolo CAN especificacin 2.0 A: solo maneja mensajes estndar con identificador de 11 bits Protocolo CAN especificacin 2.0 Pasivo: solo transmite mensajes estndar con identificador de 11 bits, pero comprueba si recibe mensajes estndar y mensajes extendidos con identificadores de 29 bits. Protocolo CAN especificacin 2.0 Activo: transmiten y reciben mensajes estndar y mensajes extendidos

5.7 Protocolos de alto nivel


El protocolo CAN especifica la forma de transmitirse la informacin y en que condiciones se realiza segn el estndar ISO 11898. Para especificar la estructura de la informacin que se transmite y otros mecanismos para dotar de funcionalidad especfica a los nodos se precisa protocolo adicional de ms alto nivel. Ejemplos de protocolo de ms alto nivel pueden ser CANopen y MCNet protocol

5.8 Implementacin de controladores CAN


Existen tres tipos de arquitecturas en microcontroladores: Stand-Alone CAN controller, Integrated CAN Controller y Single-Chip CAN Node.

114

Mara Aranda Elcuaz

Universidad Pblica de Navarra

5.8.1 Stand-Alone CAN Controller


Es la arquitectura ms simple, para llevar a cabo una comunicacin 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 interface necesario para las comunicaciones. Un ejemplo de controlador CAN es el MCP2510 cuya DATA SHEET se puede encontrar en la pgina 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 en la que se han desarrollado los ejercicios anteriores no sera 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 especfica para este tipo de comunicaciones, que desarrolla adems este tipo de arquitectura y que se puede conseguir tambin a travs de la pgina web de microchip.

5.8.2 Integrated CAN Controller


Este tipo de arquitectura consiste en un microcontrolador que incluya, no slo sus caractersticas propias sino adems un mdulo CAN con las caractersticas de un microcontrolador CAN. El transceiver se sita de manera separada.

Figura 5.8.2
115

Mara Aranda Elcuaz

Universidad Pblica 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

Mara Aranda Elcuaz

Universidad Pblica de Navarra

ANEXOS

117

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Anexo 1: Libreras
1.1 Librera LCD
//////////////////////////////////////////////////////////////////////// lcd_picdem.c Driver para mdulos LCD microcontrolados Funciones definidas: lcd_init() Inicializacin,llamar antes de cualquier otra funcin. lcd_putc(c) Muestra c en la posicion siguiente del LCD. Caracteres de control: \f Borra display \n Sita cursor al comienzo de la lnea 2 \b Retrocede el cursor una posicin \t Avanza el cursor una posicin \r Retrocede una posicin la pantalla visible \v Avanza una posicin la pantalla visible lcd_gotoxy(x,y) Sita escritura en posicin del LCD (posicin 1,1: arriba a la izquierda) lcd_getc(x,y) Devuelve carcter en posicin x,y del LCD //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// Conexin a 7 pines del MCU: 3 de control / interface de datos de 4 bits: Lneas de control asignadas RA1 enable RA2 rw RA3 rs Lneas de Datos RD0 D4 RD1 D5 RD2 D6 RD3 D7 //////////////////////////////////////////////////////////////////////// struct lcd_pines_control { // Estructura que se define para facilitar acceso boolean nada; boolean enable; boolean rw; boolean rs; int otros : 4; } lcd_control; //y asociarlos a los 3 bits ms bajos del PORTA //se asigna luego a esta estructura el PORTA //rs (1) corresponde al menos significativo //a los pines de control del LCD

struct lcd_pines_datos { // Se hace lo mismo con esta estructura para el PORTD int datos:4; //los 4 bits ms bajos son los de datos 118

Mara Aranda Elcuaz int no_usados:4; } lcd_datos;

Universidad Pblica de Navarra

#byte lcd_control = 5 //Se pone la estructura entera en el PORTA #byte trisa = 0x85 //Registro de direccin de datos #byte lcd_datos = 8 #byte trisd = 0x88 //Lo mismo para los datos, en el PORTD //Registro de direccin de datos

#define lcd_linea_dos 0x40 //Direccin de inicio para la 2 lnea 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); //////////////////////////////////////////////////////////////////////// Funcin que inicializa el LCD, se deberan cambiar bits para cambiar configuracin //////////////////////////////////////////////////////////////////////// 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_contro l . r s = 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 enva Function set 0 0 1 DL N F lcd_send_byte(0,0b00001100);//Se enva Display on/off 0 0 0 0 1 D C B lcd_send_byte(0,0b00000001);//Se enva Clear Display lcd_send_byte(0,0b00000110);//Se enva Entry Modeset 0 0 0 0 0 1 I/D S //////////////////////////////////////////////////////////////////////// DL: datos 4 bits(0); 8 bits (1) 119

Mara Aranda Elcuaz N: 2 lneas (1); 1 lnea (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: acompaa desplaz.display (1); no (0) //////////////////////////////////////////////////////////////////////// }

Universidad Pblica de Navarra

//////////////////////////////////////////////////////////////////////// Lee el byte sealado por el puntero, 1 parte alta, 2 parte baja Si al llamar a esta funcin rs=0, devuelve busy flag (+signif.) y direccin actual //////////////////////////////////////////////////////////////////////// byte lcd_read_byte() { byte low,high; tr i sa&=0b11110001;/ /Seales de contro l (sa l i das) , el resto lo que sean trisd|=0b00001111;//Las de datos pasan a ser entradas, las dems igual lcd_contro l . 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_contro l . enable = 0; tr i sd&=0b11110000; / / Dejamos RD0 a RD3 como sal idas return( (high<<4) | low); } //////////////////////////////////////////////////////////////////////// Enva medio byte, los 4 bits ms 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; } //////////////////////////////////////////////////////////////////////// -Enva 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

Mara Aranda Elcuaz

Universidad Pblica de Navarra

void lcd_send_byte( byte address, byte n ) { lcd_control.rs = 0; while ( bi t_ tes t ( l cd _ read_byte( ) , 7 ) ) ; / /M ient ras est ocupado el LCD, / /espera lcd_contro l . r s = address; delay_cyc les(1 ) ; lcd_contro l . rw = 0; delay_cyc les(1 ) ; lcd_contro l . enable = 0; lcd_send_nibble (n >> 4); lcd_send_nibble (n & 0x0F); } //////////////////////////////////////////////////////////////////////// Sita el contador de direcciones en la DDRAM (para lectura o escritura posterior): x puede ir de 1 a 40, posicin dentro de una lnea (16 visibles) y puede ser 1 (lnea 1) o 2 (lnea 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 } //////////////////////////////////////////////////////////////////////// Enva un carcter c a la DDRAM del LCD, tambin algunos caracteres de control: //////////////////////////////////////////////////////////////////////// void lcd_putc( char c) { switch (c) { case ' \ f ' : lcd_send_byte(0 ,1) ; break; / / L impia la pantal l a delay_ms(2); case '\n': lcd_gotoxy(1 ,2) ; break; / /Co loca puntero en 1 posic ion de la 2 l nea case ' \b ' : lcd_send_byte(0 ,0x10); break; / /Retrocede una posic in el cursor case '\t ' : lcd_send_byte(0 ,0x14); break; / /Avanza una posic in el cursor case '\r' : lcd_send_byte(0,0x18); break; / /Retrocede una posic in la pantal l a vis ib l e case '\v' : lcd_send_byte(0,0x1C); break; / /Avanza una posic in la pantal l a vis ib l e defaul t : lcd_send_byte(1 ,c ) ; break; //Si es una tira, los enva todos uno a uno } }

121

Mara Aranda Elcuaz

Universidad Pblica de Navarra

//////////////////////////////////////////////////////////////////////// Devuelve el carcter situado en la posicin x,y de la DDRAM //////////////////////////////////////////////////////////////////////// char lcd_getc( byte x, byte y) { char value; lcd_gotoxy(x ,y ) ; lcd_contro l . r s=1; value = lcd_read_byte(); lcd_contro l . r s=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

Mara Aranda Elcuaz

Universidad Pblica de Navarra

1.2 Librera 16F877


///////// / / / Standard Header f i l e for the PIC16F77 device / / / / / / / / / / / / / / #device PIC16F77 #nolist //////// Program memory: 8192x14 Data 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,NOPROTECT //////// Fuses: NOBROWNOUT,BROWNOUT //////// ////////////////////////////////////////////////////////////////// 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 #define PIN_B0 #define PIN_B1 #define PIN_B2 #define PIN_B3 #define PIN_B4 #define PIN_B5 #define PIN_B6 #define PIN_B7 #define PIN_C0 #define PIN_C1 #define PIN_C2 #define PIN_C3 #define PIN_C4 #define PIN_C5 #define PIN_C6 #define PIN_C7 #define PIN_D0 #define PIN_D1 #define PIN_D2 #define PIN_D3 #define PIN_D4 #define PIN_D5 #define PIN_D6 #define PIN_D7 40 41 42 43 44 45 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

#define PIN_E0 72 #define PIN_E1 73 #define PIN_E2 74 ///////// / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / #define FALSE 0 Useful def ines

123

Mara Aranda Elcuaz #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

Universidad Pblica de Navarra

//////////////////////////////////////////////////////////////// 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 #define RTCC_8_BIT 8 0 1 2 3 4 5 6 7 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

Mara Aranda Elcuaz

Universidad Pblica 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 #define T1_DIV_BY_1 #define T1_DIV_BY_2 #define T1_DIV_BY_4 #define T1_DIV_BY_8 8 0 0x10 0x20 0x30

///////////////////////////////// / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / Timer 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 // 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

Mara Aranda Elcuaz #byte PSP_DATA= 8

Universidad Pblica de Navarra

////////////////////////////////////////////////////////////////// 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_AN7_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

Mara Aranda Elcuaz

Universidad Pblica 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

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Anexo 2: Modulacin PWM


A) Circuito de potencia bsico: Clula elemental de conmutacin
Ii T1 Vi T2 V0 I0

Figura 1 En la figura a se representa un circuito de intercambio de potencia elctrica entre dos fuentes que se rige por las siguientes reglas de funcionamiento: - La fuente de tensin Vi 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 conmutacin para T1 y T2: - Si el transistor T1 est encendido, el transistor T2 deber estar apagado. - Si el transistor T1 est apagado, el transistor T2 deber estar encendido. A1) Tensin de salida Con estas leyes de conmutacin se obtiene la siguiente tabla para el valor de la tensin de salida V0: T1 1 0 T2 0 1 V0 Vi 0

Esta tabla representa la tensin 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) Tensiones de salida intermedias Tomando como referencia al transistor T1, se llama ton el periodo que ste transistor permanece encendido y toff al periodo en el que dicho transistor permanece apagado, siendo T el periodo total que se ir repitiendo a lo largo del tiempo.

128

Mara Aranda Elcuaz

Universidad Pblica de Navarra

La tensin de salida V0 dibujar una grfica tal como la que se dibuja en la pgina siguiente.

129

Mara Aranda Elcuaz

Universidad Pblica de Navarra

V0

Vi

Vi

Vi

0 ton T toff

Figura 2 La tensin <V0> o tensin V0 media se calcula como sigue: < Vo >= Vi ton + 0toff T = Vi ton = Vi D T

Donde <V0> [0,Vi] y D se conoce como Ciclo de trabajo. A3) Corriente de entrada Segn el estado de los transistores se realiza la siguiente tabla de la misma manera que se realiz para la tensin de salida, pero esta vez para la corriente: T1 1 0 A4) Corrientes de entrada intermedias Tal y como se ha dibujado para la tensin de salida, se realiza tambin la grfica para la corriente de entrada:
I0

T2 0 1

Ii 0 I0

Ii

I0

I0

0 ton T toff

Figura 3

130

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Para el clculo de la corriente intermedia <Ii>: < I i >= t on I 0 + t off 0 T = I0 t on = I 0 D T Donde <Ii> [0,I0]

A5) Balance de 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<Ii>=Vi I0D PVo= <V0>I0=ViDI0

B) Circuitos de gobierno de la clula elemental de conmutacin


Los circuitos de gobierno de la clula elemental de conmutacin son circuitos moduladores que siguen la tcnica PWM (modulacin por anchura de pulsos). Se dibuja a continuacin el diagrama de bloques esencial de un ejemplo sencillo de circuito modulador:

T1
V0 [0,Vi]

Modulador

T2

Figura 4

v0 [0,1] V0 [0,Vi] Vi VTRI [0,1]

T1 T2

Figura 5

131

Mara Aranda Elcuaz

Universidad Pblica de Navarra

El circuito de la figura 5 primeramente divide las tensiones de salida y entrada para obtener una tensin entre 0 y 1 que se compara con una onda triangular que trabaja tambin en dicho intervalo. El diagrama de ondas del circuito queda representado de la siguiente manera:
VTRI
1 v0

ton

toff

T1

On

Off

T2

On

Off

V0

Vi

<V0>

La primera grfica representa la comparacin entre la onda triangular y el valor de v0 en el intervalo [0,1]. Las dos siguientes representan los estados de los dos transistores T1 y T2 y por ltimo, la grfica inferior representa la tensin de salida del circuito. Para calcular la tensin media <V0> se pueden emplear dos mtodos distintos: 1 mtodo: De la misma manera que se ha calculado hasta ahora: < Vo >= Vi ton + 0toff t = Vi on T T
132

Mara Aranda Elcuaz

Universidad Pblica de Navarra

2 mtodo: Por semejanza triangular: De la grfica de la onda triangular se obtiene que: pero como v0 = V0 Vi ton V0 = , T Vi ton = <V0 > T 1 v0 t = on = v0 T ton T

se puede sustituir y queda:

despejando de esta ecuacin se obtiene que: V0 = Vi

133

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Anexo 3: Presentacin de las Comunicaciones CAN

134

Mara Aranda Elcuaz

Universidad Pblica de Navarra

135

Mara Aranda Elcuaz

Universidad Pblica de Navarra

136

Mara Aranda Elcuaz

Universidad Pblica de Navarra

137

Mara Aranda Elcuaz

Universidad Pblica de Navarra

138

Mara Aranda Elcuaz

Universidad Pblica de Navarra

139

Mara Aranda Elcuaz

Universidad Pblica de Navarra

140

Mara Aranda Elcuaz

Universidad Pblica de Navarra

141

Mara Aranda Elcuaz

Universidad Pblica de Navarra

142

Mara Aranda Elcuaz

Universidad Pblica de Navarra

143

Mara Aranda Elcuaz

Universidad Pblica de Navarra

144

Mara Aranda Elcuaz

Universidad Pblica de Navarra

145

Mara Aranda Elcuaz

Universidad Pblica de Navarra

146

Mara Aranda Elcuaz

Universidad Pblica de Navarra

147

Mara Aranda Elcuaz

Universidad Pblica de Navarra

BIBLIOGRAFA

148

Mara Aranda Elcuaz

Universidad Pblica de Navarra

Libros: MICROCONTROLADORES PIC, LA CLAVE DEL DISEO. Martn Cuenca, Angulo Usategui y Angulo Martnez. Ed Thomson, 2003. MICROCONTROLADORES PIC, DISEO PRCTICO DE APLICACIONES. Angulo Usategui y Angulo Martnez. Ed Mc Graw Hill, 2003. MANUAL DE USUARIO DEL COMPILADOR PCW DE CCS. Andrs Cnovas Lpez

Artculos tcnicos: CONTROLLER AREA NETWORK (CAN) BASICS. Keith Fazui. Microchip Technology Inc, 1999.

Datasheet: PIC16F87X: 28/40-Pin 8-Bit CMOS FLASH Microcontrollers PICDEM 2 Plus Users Guide

Pginas Web: http://www.can-cia.org: pgina dedicada al bus CAN http://miarroba.com/foros/ver.php?id=6510: Foro dedicado a microcontroladores

149

Vous aimerez peut-être aussi