Implementación de interfaz I2C con microcontroladores PIC para sensores TITULACIÓN: Ingeniería Técnica en Telecomunicaciones. Especialidad Telemática. AUTOR: Yul Silva Rodríguez. DIRECTOR: David Girbau. PONENTE: Ángel Ramos. FECHA: Junio del 2012. “Como no tenemos nada más precioso que el tiempo, no hay mayor generosidad que perderlo sin tenerlo en cuenta” ÍNDICE 1. INTRODUCCIÓN.................................................................................................................................. 2 1.1. WSN Y SMART CITIES ....................................................................................................................... 2 1.1.1. Sensores inalámbricos .......................................................................................................... 2 1.1.2. Redes de sensores inalámbricos (WSN) convencionales: Zigbee ............................................ 3 1.1.3. Smart Cities......................................................................................................................... 4 1.2. SENSORES INALÁMBRICOS UWB .......................................................................................................... 5 1.2.1. UWB, Definición y características ..................................................................................... 5 1.2.2. Sistema RFID pasivo UWB conmutado con códigos de tiempo ........................................... 6 2 1.3. INTEGRACIÓN DE EEPROM Y SENSORES CON EL BUS I C ............................................................................ 7 1.4. OBJETIVOS DEL PROYECTO .................................................................................................................. 7 1.5. ORGANIZACIÓN DE LA MEMORIA .......................................................................................................... 8 1.6. REFERENCIAS .................................................................................................................................. 8 2. BUS I2C IMPLEMENTADO CON PIC .................................................................................................... 11 2 2.1. PROTOCOLO I C ............................................................................................................................ 11 2.1.1. Start Condition .................................................................................................................. 12 2.1.2. Stop Condition ................................................................................................................... 12 2.1.3. Restart condition............................................................................................................... 12 2.1.4. ACK Condition. ................................................................................................................... 13 2.1.5. Transferencia de datos ....................................................................................................... 13 2.2. BUS I2C IMPLEMENTADO CON PIC16F1827 ........................................................................................ 14 2.3. REGISTROS PARA LAS OPERACIONES CON I2C. ........................................................................................ 15 2.3.1. SSPxSTAT, Registro de Estado (Habilitado para I2C) ............................................................ 15 2.3.2. SSPxCON1, Registro de Control SSP1 .................................................................................. 15 2.3.3. SSPxCON2, Registro de Control SSP2................................................................................... 16 2.3.4. SSPxADD Registro de Velocidad de Transmisión y Dirección. .............................................. 17 2.4. REFERENCIAS. ............................................................................................................................... 18 3. APLICACIÓN PARA ESCRITURA DE EEPROM EXTERNA CON I2C. ........................................................ 20 3.1. PLACA PERSONALIZADA. .................................................................................................................. 20 3.2. EEPROM 24LC256. ..................................................................................................................... 23 3.2.1. Configuración inicial de la memoria. ................................................................................... 24 3.2.2. Operación de escritura. ...................................................................................................... 25 3.2.3. Operación de lectura. ......................................................................................................... 25 3.3. IMPLEMENTACIÓN DEL PROGRAMA. .................................................................................................... 26 3.3.1. Función INIT. ...................................................................................................................... 27 3.3.2. Función BSTART. ................................................................................................................ 28 3.3.3. Función BRESTART. ............................................................................................................ 29 3.3.4. Función BSTOP. .................................................................................................................. 29 3.3.5. Función TX. ........................................................................................................................ 30 3.3.6. Función RX. ........................................................................................................................ 31 3.3.7. Función POLL. .................................................................................................................... 31 3.3.8. Función ADD_MANNAGER. ................................................................................................ 32 3.3.9. Función BYTEWRITE. .......................................................................................................... 33 3.3.10. Función BYTEREAD. .......................................................................................................... 34 3.3.11. Ejemplo de escritura y lectura........................................................................................... 35 3.4. REFERENCIAS. ............................................................................................................................... 35 4. APLICACIÓN PARA LECTURA DE UN ACELERÓMETRO MMA8453Q. .................................................. 38 4.1. ACELERÓMETRO MMA8453Q. ........................................................................................................ 38 4.1.1. Descripción del dispositivo.................................................................................................. 38 4.1.2. Aplicaciones del dispositivo. ............................................................................................... 38 4.1.3. Funciones principales. ........................................................................................................ 39 4.1.4. Conexión de los pines para el dispositivo MMA8453Q ......................................................... 40 4.2. CONFIGURACIÓN DEL DISPOSITIVO MMA8453Q .................................................................................. 41 4.2.1. Registro de control ............................................................................................................. 41 4.2.2. Registro de configuración vertical/horizontal (0x11) ........................................................... 42 4.2.3. Registro de estado Vertical/Horizontal (0x10) ..................................................................... 43 4.2.4. Registros de datos.............................................................................................................. 44 4.3. IMPLEMENTACIÓN DE FUNCIONES DE LECTURA Y ESCRITURA EN EL DISPOSITIVO .............................................. 45 4.3.1. Función WRITE_ACCEL ....................................................................................................... 45 4.3.2. Función READ_ACCEL ......................................................................................................... 46 4.4. IMPLEMENTACIÓN Y PRUEBA DE APLICACIÓN CON EL DISPOSITIVO MMA8453Q............................................ 48 4.3.1. Implementación de lectura de la posición Vertical/Horizontal del dispositivo ...................... 49 4.3.2. Prueba de funcionamiento PL_STATUS ............................................................................... 49 4.3.3. Implementación de lectura del valor de los ejes X, Y y Z del dispositivo ................................ 52 4.3.4. Prueba de funcionamiento DATA REGISTERS....................................................................... 54 4.4. REFERENCIAS ................................................................................................................................ 55 5. CONCLUSIONES Y LÍNEAS FUTURAS.................................................................................................. 58 6. APÉNDICE ......................................................................................................................................... 60 6.1. CÓDIGO DEL PROGRAMA .................................................................................................................. 60 Capítulo I. Introducción CAPITULO I Introducción _______________________________ 1 Capítulo I. Introducción 1. Introducción En la actualidad, el uso de sensores inalámbricos para la monitorización de diferentes parámetros se ha extendido de forma considerable. Una de las posibles aplicaciones consiste en las ciudades inteligentes (“Smart cities”). Éstas permitirían aumentar la eficiencia energética de una ciudad, monitorizando parámetros tan sencillos y cotidianos como pueden ser la temperatura, la presión atmosférica, la humedad, si hay movimiento o no en una determinada zona, etc. El estudio de estos parámetros puede mejorar la eficiencia global de la ciudad y desembocar en que la misma se convierta en un entorno medioambientalmente responsable. Otra aplicación del uso de sensores inalámbricos es la monitorización y seguimiento de productos. Existen productos que requieren estar en un margen de temperaturas, productos que no pueden sufrir golpes durante su transporte, y otros que no pueden estar en ambientes con demasiada humedad. 1.1. WSN y Smart Cities En esta sección se expondrán diferentes conceptos necesarios para introducir el tema de sensores inalámbricos. Se describirán las características y el funcionamiento de las redes de sensores inalámbricos (WSN, wireless sensor networtks). Finalmente, como aplicación práctica, se explicará el concepto de smart cities. 1.1.1. Sensores inalámbricos Un sensor es un dispositivo que produce un registro cuantitativo en respuesta a cambios físicos o químicos en las condiciones de un sistema. Un sensor puede medir diferentes parámetros, como por ejemplo: presión, temperatura, sonido, vibraciones, movimiento, aceleración y tensión dinámica, humedad, etc [1] En la Figura 1.1 se puede observar un mapa conceptual en el que se indican las principales características de los sensores. SENSORES FUNCIONAMIENTO ACTIVO SEÑAL ELÉCTRICA QUE GENERAN PASIVO ANALÓGICO RANGO DE VALORES QUE PROPORCIONAN DE MEDIA DIGITAL NIVEL DE INTEGRACIÓN TIPO DE VARIABLE FÍSICA ON - OFF DISCRETOS TEMPORAL INTEGRADOS Figura 1.1. Características de los sensores 2 INTELIGENTES Capítulo I. Introducción Los sensores inalámbricos (wireless sensors, WS) son dispositivos que básicamente están compuestos de cuatro elementos: Procesamiento y memoria para procesar los datos recogidos. Unidad de comunicación para transmitir y recibir datos usando alguna técnica de modulación e interfaz aire. Sensor que registra una variable física y la convierte en un dato que entrega al microcontrolador, que posteriormente enviará. Batería que alimenta los diferentes componentes del nodo sensor. En la Figura 1.2 se puede observar la distribución de los elementos de un sensor inalámbrico. Figura 1.2. Elementos en un sensor inalámbrico Las principales ventajas que presentan este tipo de dispositivos son: el tiempo de vida, la cobertura, los costes y la facilidad de instalación, el tiempo de respuesta, el bajo consumo de potencia, la precisión y frecuencia de las mediciones y la seguridad. Por otro lado, entre las principales desventajas se puede destacar la capacidad de cómputo, limitaciones en memoria. [2] 1.1.2. Redes de sensores inalámbricos (WSN) convencionales: Zigbee Una red de sensores inalámbricos es una gran cantidad de pequeños dispositivos autónomos, distribuidos físicamente a los cuales se les llama “nodos de sensores”, que se instalan alrededor de un fenómeno para monitorizarlo. Presentan una capacidad de almacenamiento y de comunicar datos en una red de forma inalámbrica. Es importante mencionar que este tipo de redes están pensadas para la integración con otras tecnologías, como por ejemplo: agricultura, biología, medicina, etc. Además, se utiliza para muchas aplicaciones que hasta hace relativamente poco tiempo eran impensables como la interacción de los seres humanos con el medio (computación ubicua, inteligencia ambiental, etc.). [3] Entre las principales características de las WSN se pueden mencionar las siguientes: Facilidad de despliegue. 3 Capítulo I. Introducción No necesita una infraestructura de red Topología dinámica (nodos auto configurables, tolerancia a fallos.). Utilización de broadcast. Ultra bajo consumo (funcionamiento con pilas, larga autonomía). Bajo coste Tamaño reducido Operación sin necesidad de mantenimiento durante varios meses o incluso años. Las WSN se constituyen en base a los siguientes cinco elementos: Sensores: De diferentes tipos y tecnologías los cuales recogen la información del medio y la convierten en señales eléctricas. Nodos de sensor: Toman los datos del sensor a través de sus puertas de datos y envían la información a la estación base. Gateway: Elementos para la interconexión entre la red de sensores y una red TCP/IP. Estación base: Recolector de datos. Red inalámbrica: Típicamente basada en el estándar 802.15.4 ZigBee. ZigBee es el nombre de la especificación de un conjunto de protocolos de alto nivel de comunicación inalámbrica para su utilización con radiodifusión digital de bajo consumo, basada en el estándar IEEE 802.15.4 [4] de redes inalámbricas de área personal (WPAN). Su objetivo son las aplicaciones que requieren comunicaciones seguras con baja tasa de envío de datos y maximización de la vida útil de las baterías. Por este motivo, la aplicación principal es para la domótica. [5] 1.1.3. Smart Cities Una smart city es un sistema de gran complejidad o un ecosistema en el que coexisten múltiples procesos íntimamente ligados y que resulta difícil abordar de forma individualizada. [6][7] [8] (ver Figura 1.3). En la práctica, se entiende que una smart city es una ciudad comprometida con su entorno, con elementos arquitectónicos de vanguardia, y donde las infraestructuras están dotadas de las soluciones tecnológicas más avanzadas para facilitar la interacción del ciudadano con los elementos urbanos. Un planteamiento como el descrito exige a aquellas ciudades que aspiren a ser consideradas como “inteligentes” a mejorar y renovarse constantemente, con el fin de mejorar la calidad de vida en su entorno. Se puede deducir que el papel de los sensores inalámbricos y las redes de sensores inalámbricos (WSN) es crucial para la implementación de una smart city. La recolección y el análisis de datos de los diferentes sensores dispersados a lo largo de la ciudad es imprescindible para convertir a una ciudad en “inteligente”. 4 Capítulo I. Introducción Figura 1.3. Representación de una Smart City 1.2. Sensores inalámbricos UWB 1.2.1. UWB, Definición y características Cuando se habla de UWB (Ultra Wide Band) se hace referencia a una tecnología de transmisión vía radio basada en la transmisión de pulsos con unos tiempos de subida y bajada extremadamente cortos (entre algunas decenas de picosegundos y pocos nanosegundos), con una energía relativamente baja. [9] La Comisión Federal de Comunicaciones (FCC) asignó a UWB un espectro de 3.1 a 10.6 GHz en el año 2002. Desde entonces, ha surgido un gran interés en el desarrollo de tecnologías que utilicen UWB debido a las ventajas que ofrece, como por ejemplo el gran ancho de banda de estos sistemas. En la Figura 1.4 se puede comparar el espectro UWB con las señales de banda estrecha. Figura 1.4. Espectro de comunicaciones 5 Capítulo I. Introducción Las aplicaciones actuales de UWB se basan principalmente en tres campos: Comunicaciones inalámbricas de alta velocidad como por ejemplo redes PAN (Personal Area Network) con la interconexión de diferentes dispositivos de uso personal o redes WLAN para conexión a Internet o a otros ordenadores. Redes de sensores, en donde a partir de diferentes nodos que extraen información pueden obtenerse datos sobre el entorno donde nos encontramos de cara a por ejemplo localización de objetos en una sala o características físicas sobre un objeto desconocido. Sistemas de localización en donde se explota la gran resolución temporal que presentan los sistemas UWB, lo que permite un posicionamiento y una localización muy precisa. 1.2.2. Sistema RFID pasivo UWB conmutado con códigos de tiempo Actualmente en el grupo se está trabajando en una nueva tipología de sensores de tipo UWB la cual presenta como novedad un sistema de chip híbrido que se activa mediante códigos de tiempo UWB y que presenta un enlace de 2.4 GHz. Básicamente, se añade un chip a una etiqueta de tipo “chipless UWB” con código de tiempo para modular el estado de la señal de tipo UWB que se haya recibido del lector. Esta señal rebotará en la etiqueta, lo que permite responder al lector. El chip que contendrá la etiqueta será un micro controlador comercial. El sistema se compone de un lector y una o varias etiquetas. Dicho lector interroga a la etiqueta mediante una señal de 2.4 GHz (llamada wake-up), la cual pone en macha el circuito lógico que lleva incorporado. Seguidamente, el lector envía una señal UWB a la etiqueta y esta señal rebota hacia el lector. Esta respuesta que ha rebotado es modulada por la circuitería lógica de la etiqueta de acuerdo con la información que se quiera contestar. En la Figura 1.5 se puede observar un esquema del sistema propuesto. Figura 1.5. Esquema básico del sistema En la Figura 1.6 se puede observar una fotografía del diseño de la etiqueta. Se diferencian claramente 3 bloques: El detector que recibirá la señal de wake-up, el UWB Backscatterer que devolverá una señal de respuesta y el microcontrolador que se encargará del procesamiento de datos. 6 Capítulo I. Introducción Figura 1.6. Fotografía de la etiqueta 1.3. Integración de EEPROM y sensores con el bus I2C Una gran cantidad de sensores que se pueden encontrar en el mercado trabajan a través del bus I2C. Como consecuencia, surgen dos necesidades: la de implementar la comunicación vía I2C entre dichos sensores y el microcontrolador de bajo consumo, y la de almacenar las lecturas recogidas por los sensores de forma permanente en una memoria externa. Es importante remarcar que se utilizan microcontroladores Microchip PIC de la serie “eXtreme Low Power” (XLP) porque presentan un bajo consumo de energía, ideal para tags RFID donde la energía está muy limitada. En la Figura 1.7 se puede observar un esquema básico sobre cómo se tendría que implementar el sistema UWB con la incorporación del trabajo de este proyecto (EEPROM y sensores I2C, en este caso como demostrador es un acelerómetro). Se utiliza el módulo MSSP del micro controlador PIC para establecer la comunicación entre el sistema, el sensor I2C y la memoria EEPROM. Figura 1.7. Esquema de etiqueta una vez incorporado el bloque EEPROM-SENSOR 1.4. Objetivos del proyecto El propósito principal de este proyecto es la interconexión, mediante el uso del protocolo I2C, de un microcontrolador de bajo consumo con una memoria EEPROM 24LC256 y con diferentes sensores que trabajen con el bus I2C. Actualmente ya existen dispositivos que realicen este tipo de comunicación mediante el bus I2C pero ninguno orientado al bajo consumo para ser integrado en una etiqueta de RFID. 7 Capítulo I. Introducción Una parte fundamental de este proyecto es explicar en detalle el bus I2C, sus principales características y sobre todo su modo de funcionamiento; ya que será la herramienta principal para la interacción de los diferentes dispositivos. El PIC y la memoria EEPROM también juegan un papel fundamental en la comunicación vía I2C. Por este motivo, entender su funcionamiento y conocer sus principales características es un aspecto esencial para la posterior implementación del bus I 2C. Se explicarán en detalle las operaciones de lectura y escritura. Una vez implementado el bus, la integración de sensores con el bus I2C y el poder realizar medidas con estos sensores conforma la parte final de este proyecto. Concretamente, se utilizará un acelerómetro de Freescale MMA8453Q con el que se realizarán diferentes pruebas de orientación. 1.5. Organización de la memoria A continuación se describirán los capítulos que conforman el proyecto: - - - - El Capítulo 1 inicia al lector en las ideas básicas del proyecto. Ofrece una visión global de él, informa acerca de la situación actual en cuanto a sensores inalámbricos y el creciente interés que están despertando las Smart Cities. Además se centra en los sensores UWB (Ultra Wide Band) y finalmente, la integración de memorias EEPROM y sensores I2C en etiquetas RFID. El Capítulo 2 se centrará en el bus I2C, expondrá tanto el funcionamiento como los requerimientos del bus. Además, ofrecerá una explicación detallada de cómo implementar el bus I2C con un microcontrolador Microchip PIC16F1827. El Capítulo 3 describirá la placa personalizada, explicará el funcionamiento de la memoria EEPROM 24LC256 y expondrá la implementación del programa para leer y escribir datos en la memoria. El Capítulo 4 describirá las características, aplicaciones y funciones principales del acelerómetro. Además, expondrá la implementación de las funciones de lectura y escritura en este dispositivo, así como también mostrará las diferentes pruebas realizadas para comprobar que el programa funciona correctamente. 1.6. Referencias [1] Dr. Mónica Huerta. (2010, Julio). Sensores inalámbricos. Avances y aplicaciones en telemedicina [Online]. Disponible en: http://es.scribd.com/doc/35166626/SENSORES-INALAMBRICOS [2] Francisco Ortiz Tapia. Redes de sensores inalámbricos [Online]. Disponible en: http://profesores.elo.utfsm.cl/~tarredondo/info/networks/Presentacion_sensores.pdf [3] Francisco Gómez Mula. (2007, Julio 13). Redes de sensores inalámbricos [Online]. Disponible en: http://atc.ugr.es/~aprieto/TIC_socio_sanitario/A11_4_05_Redes_sensores.pdf [4] Wikipedia. (2012, Febrero 23). IEEE 802.115.4 [Online]. Disponible en: http://es.wikipedia.org/wiki/IEEE_802.15.4 [5] Wikipedia. (2012, Mayo 18). ZigBee [Online]. Disponible en: http://es.wikipedia.org/wiki/ZigBee [6] IBM. The Smarter City [Online]. Disponible en: http://www.ibm.com/thesmartercity [7] Profesor William F. Mitchell. Smart Cities: Vision [Online]. Disponible en: http://cities.media.mit.edu 8 Capítulo I. Introducción [8] Wikipedia. (2012, Mayo 22). Smart City [Online]. Disponible en: http://en.wikipedia.org/wiki/Smart_city [9] Andrés Martínez García (2010, Julio). Estudio de canal para sistemas UWB [Online]. Disponible en: http://upcommons.upc.edu/pfc/bitstream/2099.1/13288/2/PFC.pdf 9 Capítulo II. Bus I2C implementado con PIC CAPITULO II 2 Bus I C implementado con PIC ______________________________ 10 Capítulo II. Bus I2C implementado con PIC 2. Bus I2C implementado con PIC 2.1. Protocolo I2C El bus I2C (Inter-Integrated Circuit) es un sistema de comunicación en serie, cuyo ámbito de aplicación es la comunicación entre circuitos integrados. Fue desarrollado por Philips a mediados de los años 80, presentaba una velocidad de transmisión baja (100 kHz) y se creó con la finalidad de conectar varios chips de Philips a través de un bus interno simple. Posteriormente, en 1992, se presentó la primera versión estandarizada (Version 1.0) que aumentaba la velocidad a 400 KHz, presentaba un modo de direccionamiento de 10 bits e incrementaba la capacidad a 1008 nodos. [1] Antes de la aparición del bus I2C, las transferencias de datos entre una memoria y un microprocesador se realizaban de forma paralela y requerían encapsulados en los cuales se necesitaban entre 24 y 28 pines. En contraste con esta gran cantidad de pines, el bus I2C permite la comunicación “chip-to-chip” bidireccional, utilizando solamente dos líneas en una conexión en serie. I2C es un protocolo síncrono, que permite a un dispositivo MASTER (maestro) iniciar una comunicación con un dispositivo SLAVE (esclavo) a través de dos líneas: SDA (Serial Data) es la encargada del intercambio de datos y SCL (Serial Clock). SDA es la encargada del intercambio de datos y SCL es la encargada de sincronizar al transmisor y al receptor durante la transferencia de datos. La línea SCL habitualmente es controlada por el dispositivo MASTER. Las dos líneas SCL y SDA están conectadas a la línea de alimentación positiva, a través de resistencias cuya misión es asegurar una mínima carga de la línea, necesaria para que la transmisión sea estable ante posibles ruidos externos. Estas resistencias son llamadas de PULL-UP. Su valor está comprendido entre 1 kΩ y 10 kΩ dependiendo de la tensión de alimentación y de los dispositivos conectados. También tienen la función de permitir que tanto la línea de datos como la de reloj sean bidireccionales, ya que cualquier dispositivo (MASTER o SLAVE) puede forzar a nivel bajo la línea y, por lo tanto, ser leída por otros dispositivos. [2] La transferencia de datos entre MASTER y SLAVE debe poseer el conexionado de la Figura 2.1. 2 Figura 2.1. Esquema de conexión I C Master-Slave 11 Capítulo II. Bus I2C implementado con PIC Las líneas del bus I2C presentan dos posibles estados eléctricos. Estos estados son conocidos como “flanco ascendente” y “flanco descendente”. Cuando la línea de datos y la línea de reloj se encuentran a nivel alto, esto indica que ningún dispositivo está actuando y la línea está en reposo o libre. El bus I2C envía señales por las líneas SDA y SCL con un formato estandarizado, que son interpretadas como condiciones. Estas condiciones indican cuando una transferencia empieza, para, es reconocida, etc. A continuación se explicarán algunas de estas condiciones. [3] 2.1.1. Start Condition Se define como una transición de la línea SDA del nivel alto al nivel bajo mientras la línea SCL se mantiene en el nivel alto. La condición de Start es siempre generada por el dispositivo MASTER e indica la transición de bus del estado de reposo a un estado de actividad. Se puede ver en la figura 2.2. 2.1.2. Stop Condition Se define como una transición de la línea SDA del nivel bajo al nivel bajo mientras la línea SCL se mantiene en el nivel alto. Es generada por el dispositivo que asuma la condición de MASTER dentro del bus. Se puede ver en la figura 2.2. Figura 2.2. Condiciones de Start y Stop 2.1.3. Restart condition Esta señal presenta la misma forma que una señal de Start (Figura 2.3.), se puede utilizar en cualquier momento en que una señal de Stop fuera válida. El dispositivo que asuma la condición de MASTER puede emitir un reinicio si desea mantener el bus una vez concluida la transferencia. 12 Capítulo II. Bus I2C implementado con PIC Figura 2.3. Condición de Restart 2.1.4. ACK Condition. Un dispositivo puede enviar una señal de reconocimiento (ACK) despues de la recepción de cada byte emitiendo una transición del nivel alto al nivel bajo de la línea SDA durante el noveno pulso de reloj de la línea SCL. Se puede ver en la figura 2.4. Figura 2.4. Condición de ACK 2.1.5. Transferencia de datos. Existen una serie de normas que garantizan que la comunicación entre un MASTER y un SLAVE (o a otro master que trabaje como esclavo) se lleve a cabo de forma correcta. El procedimiento que debe seguir el MASTER para hacerse con el control del bus es inicialmente siempre el mismo. Primeramente, se envia una señal de START con la finalidad de que todos los demás dispositivos (tanto SLAVES como otros MASTERS) que no la hayan enviado. A partir de aquel momento, actuarán como SLAVES. Seguidamente, se envia la dirección I2C del dispositivo al que se quiere dirigir. La dirección tiene una longitud de 7 bits seguidos de un octavo bit (R/W) que indica si la operación será de lectura o escritura. Esta dirección será única en todo el bus, de manera que todos los demás componentes que no tengan esta dirección se desconectarán. El dispositivo al cual nos dirigimos enviará al MASTER una señal de reconocimiento (ACK) para notificar que se encuentra a la escucha. 13 Capítulo II. Bus I2C implementado con PIC Acto seguido, el MASTER empezará la transmisión de los datos. Se enviarán los primeros 8 bits de datos a transmitir. Una vez recibida la señal de reconocimiento por parte del SLAVE, se vuelven a enviar 8 bits de datos y así sucesivamente hasta que se termine con la información que se desea transmitir. Llegados a este punto, pueden presentarse dos situaciones: que el MASTER que posee el control de bus acabe con el SLAVE al que se dirigia y seguidamente se dirija a otro SLAVE, o que el MASTER quiera terminar la conexión en el bus. En el primer caso, una vez enviado el ultimo byte de datos y recibida la ultima señal de reconocimiento (ACK) del SLAVE, se enviará una nueva señal de START seguida de la dirección del nuevo SLAVE siguiendo los pasos explicados anteriormente. Se puede ver en la figura 2.5. Figura 2.5. Modo de transferencia a varios SLAVES En el segundo caso, cuando se ha enviado el ultimo byte de datos y se ha recibido la ultima señal de reconocimiento (ACK), el dispositivo que actúa de MASTER enviará una señal de STOP, con lo cual dejará libre el bus. Se puede ver en la figura 2.6. Figura 2.6. Modo de transferencia 2.2. Bus I2C implementado con PIC16F1827 Se utilizará un microcontrolador PIC16F1827 de Microchip [4] como maestro en el proceso de comunicación I2C debido a que presenta un menor consumo de energía y mayor velocidad (hasta 32 MHz) que un PIC16 normal. El bajo consumo energético es un aspecto primordial de cara a ser integrados en etiquetas de RFID. El microcontrolador PIC16F1827 utiliza el módulo de puerto serie síncrono MSSP, ya que se trata de una interfaz serie muy utilizada para comunicarse con otros dispositivos periféricos o microcontroladores. Estos dispositivos pueden ser memorias EEPROM, registros de desplazamiento, displays, acelerómetros, drivers, convertidores A/D, etc. 14 Capítulo II. Bus I2C implementado con PIC El módulo MSSP puede operar en dos modos: Interfaz Periférica Serie (SPI) Inter-Circuito Integrado (I2C) El módulo SSP en modo I2C implementa completamente todas las funciones MASTER y SLAVE y provoca interrupciones en los bits de START y STOP en hardware, para determinar el estado del bus. [4] 2.3. Registros para las operaciones con I2C. 2.3.1. SSPxSTAT, Registro de Estado (Habilitado para I2C) Este registro nos permite configurar y controlar el estado de diferentes aspectos importantes en una comunicación I2C, por ejemplo: detectar si una señal de START o STOP ha sido transmitida satisfactoriamente, conocer el estado del buffer, saber si una transmisión está en progreso o no, etc. En la Figura 2.7 podemos ver la distribución del registro. Utilizaremos este registro para configurar la velocidad de respuesta con la que realizaremos la comunicación I2C. En este caso solo modificaremos el bit de muestra (SMP) que corresponde al séptimo bit del registro. Debe estar configurado para funcionar con una velocidad estándar (100 kHz y 1 MHz), en nuestro caso trabajaremos a una velocidad de 100 kHz. Bit 7: SMP. Bit de muestra. 0- Control slew rate habilitado para modo High- speed (400 kHz) 1- Control slew rate deshabilitado para modo estándar (100 kHz y 1MHz) Figura 2.7. Registro SSPxSTAT 2.3.2. SSPxCON1, Registro de Control SSP1 Este registro nos permite configurar y controlar aspectos importantes en la comunicación I2C, como por ejemplo: detectar si ha habido una colisión durante el proceso de escritura (WCOL), saber si ha habido overflow en la conexión (SSPxOV), habilitar el módulo SSP (SSPxEN) o seleccionar el modo SSP (SSPxM). En la Figura 2.8 podemos ver la distribución del registro. En este caso, el registro será utilizado para indicar que no habrá overflow en la recepción (SSPxOV = 0), también se habilitará el SSP (SSPxEN = 1) e indicará el modo de SSP (SSPxM <3:0> = 1000). 15 Capítulo II. Bus I2C implementado con PIC El modo de SSP seleccionado con los bits ‘1000’ significa que se ha seleccionado el modo I2C master. Se ampliará en detalle en la sección 2.3.4. SSPxADD Registro de Velocidad de Transmisión y Dirección. Figura 2.8. Registro SSPxCON1 2.3.3. SSPxCON2, Registro de Control SSP2 Este registro nos permite habilitar o deshabilitar opciones tales como: habilitar secuencia de ACK (ACKEN), habilitar o deshabilitar la recepción (RCEN), habilitar o deshabilitar la condición de STOP (PEN), habilitar o deshabilitar la recepción de la condición de START (RSEN) y habilitar o deshabilitar la condición de START (SEN). También permite conocer el estado del ACK (ACKSTAT). En la Figura 2.9 podemos ver la distribución del registro. Para la configuración inicial de una comunicación en I2C necesitamos que todos los bits se encuentren a cero, en especial: Bit 4: ACKEN. Habilitación de la secuencia de ACK (solo en modo MASTER). 0- Secuencia ACK inactivada. 1- Inicia secuencia de reconocimiento en los pines SDA y SCL y transmite el bit ACKDT. Se limpia automáticamente por hardware. Bit 3: RCEN. Bit de habilitación de recepción (solo modo MASTER). 0- Recepción desactivada. 1- Habilita recepción por I2C Bit 2: PEN. Bit de habilitación de condición de STOP (solo modo MASTER) 0- Condición de STOP desactivada. 1- Inicia la condición de STOP en los pines SDA y SCL. Se limpian automáticamente por hardware. Bit 1: RSEN. Bit de habilitación de repetición de la condición de START (solo en modo MASTER). 0- Condición de repetición de START desactivada. 1- Inicia la condición de repetición de START en los pines SDA y SCL. Se limpian automáticamente por hardware. 16 Capítulo II. Bus I2C implementado con PIC Bit 0: SEN. Bit de habilitación de condición de START (solo en modo MASTER). 0- Condición START inactiva. 1- Inicia la condición de START en SDA y SCL. Se limpia automáticamente por hardware. Figura 2.9. Registro SSPxCON2 2.3.4. SSPxADD Registro de Velocidad de Transmisión y Dirección. La correcta configuración de este registro (mostrado en la Figura 2.10) es muy importante ya que controla la velocidad de las transmisiones en el bus I2C. Este registro fija la frecuencia de reloj del bus fclk. Dado que hemos escogido el modo SSP I2C master (ver sección 2.3.2), la frecuencia se calculará mediante la expresión (1): (1) Donde Fosc es la frecuencia del oscilador de programa, y SSPxADD es el valor en decimal de dicho registro. En nuestro caso trabajaremos a una frecuencia fclk de 100 kHz y una frecuencia de oscilador de programa de 4 MHz. Por lo tanto, el valor que será cargado en este registro SSPADD será (2): [3] (2) Figura 2.10. Registro SSPxADD 17 Capítulo II. Bus I2C implementado con PIC 2.4. Referencias. [1] Wikipedia. (2012, Abril 23). I2C [Online]. Disponible en: http://en.wikipedia.org/wiki/I%C2%B2C [2] Valleverde. (2012, Abril 23). El bus serie I2C [Online]. Disponible en: http://webs.ono.com/valleverde/ [3] Microchip. (2001). I2C Master Mode [Online]. Disponible en: http://ww1.microchip.com/downloads/en/DeviceDoc/i2c.pdf [4] Microchip Technology Inc. (2011). PIC16(L)F1826/27 Data Sheet [Online]. Disponible en: http://ww1.microchip.com/downloads/en/devicedoc/41391b.pdf 18 Capítulo III. Aplicación para escritura de EEPROM externa con I2C CAPITULO III Aplicación para escritura de EEPROM externa con I2C ______________________________ 19 Capítulo III. Aplicación para escritura de EEPROM externa con I2C 3. Aplicación para escritura de EEPROM externa con I2C 3.1. Placa personalizada. La necesidad de interconectar el microcontrolador, la memoria EEPROM y el sensor (acelerómetro) nos obliga a diseñar una placa personalizada en la cual podamos interconectar estos elementos siguiendo el esquema de conexionado de la Figura 3.1. Figura 3.1. Esquema de conexionado. Se ha implementado la placa personalizada utilizando el programa RIMU PCB [5] para diseñar el layout. Podemos ver el diseño final en la Figura 3.2, posteriormente se explicara en detalle y se especificaran algunas decisiones de diseño. Figura 3.2. Layout de la placa personalizada. Los resistores de pull-up necesarios para el bus I2C serán de 10 kΩ (ver Figura 3.3). Según las especificaciones de la memoria EEPROM, los valores típicos requeridos por 20 Capítulo III. Aplicación para escritura de EEPROM externa con I2C la línea SDA (Serial Data) son: 10 kΩ para trabajar a una frecuencia de 100 kHz y 2 kΩ para trabajar a 400 kHz o 1 MHz. RESISTORES DE PULL-UP (10 KΩ) Figura 3.3.Resistores de pull-up. Con motivo de simplificar el conexionado a la hora de implementar la placa personalizada se han tomado las siguientes decisiones de diseño: Se han conectado los pines A0, A1 y A2 de la memoria EEPROM, correspondientes a los 3 bits de direccionamiento, directamente a tierra como podemos apreciar en la Figura 3.4. Con esto se consigue que estos 3 pins de la memoria EEPROM tomen el valor de cero. BITS DE DIRECCIONAMIENTO Figura 3.4.Conexión de los bits de direccionamiento de la EEPROM. El pin correspondiente al bit WP (Write Protect) de la memoria EEPROM estará conectado a tierra (figura 3.8), ya que la acción de escritura estará permitida. Bit WP Figura 3.8.Conexión de pin WP (Write Protect). 21 Capítulo III. Aplicación para escritura de EEPROM externa con I2C Se han añadido pines de programación, en este caso se han utilizado los pines RB6 y RB7 del PIC como reloj y datos, también el pin RA5 como MCLR para activar el modo de programación y los pines alimentación (VDD) y masa (VSS), como se puede observar en la Figura 3.5. PINES DE PROGRAMACIÓN Figura 3.5. Pines de programación. La alimentación tanto del micro controlador, la EEPROM como del acelerómetro ha sido implementada mediante una toma de corriente USB, como se muestra en la Figura 3.6. De esta manera obtenemos una alimentación de 5 V que posteriormente será reducida a 3,3 V utilizando un regulador lineal Texas Instruments UA78M33CDCYG3 con un encapsulado tipo SOT-223 [1], ya que el acelerómetro solamente permite trabajar en un margen de voltaje entre 1.95 V y 3.6 V. ALIMENTACIÓN USB REGULADOR LINEAL UA78M33CDCYG3 Figura 3.6. A la izquierda el esquema de la alimentación vía USB. A la derecha el distribuidor lineal tipo SOT-223. Se han diseñado unas ranuras para la posterior conexión del acelerómetro MMA8453Q de Freescale Semiconductor [2]desde una placa externa como se puede ver en la Figura 3.7. Posteriormente, en el Capítulo 4, se especificaran las características y la distribución del acelerómetro en la placa externa. 22 Capítulo III. Aplicación para escritura de EEPROM externa con I2C Figura 3.7. A la izquierda se pueden observar las ranuras destinadas al acelerómetro y a la derecha el acelerómetro en una placa externa. En la Figura 3.8 podemos ver la placa fabricada con el acelerómetro conectado. Figura 3.8. Placa final con los componentes principales: PIC, EEPROM y acelerómetro 3.2. EEPROM 24LC256. EEPROM 24LC256 son las siglas de “Electrically Erasable Programmable Read-Only Memory”. Se trata de un dispositivo de almacenamiento no volátil de tipo ROM que puede ser programada, borrada y reprogramada eléctricamente. Dispone de una capacidad de 256kbits (32K x 8), es decir, es capaz de almacenar aproximadamente 32.000 palabras de 8 bits y además puede operar a través de un amplio rango de voltaje (1.7 a 5.5 V). [3] La característica principal de esta memoria es que implementa la interfaz I2C para su comunicación serie con otros dispositivos electrónicos. Además, este tipo de memorias han sido desarrolladas para trabajar con aplicaciones de bajo consumo de energía, con lo cual se convierte en un elemento idóneo para la comunicación mediante el bus I2C ya que el objetivo de este proyecto es trabajar a nivel de etiquetas (tags) RFID en donde el bajo consumo de energía es un aspecto primordial. 23 Capítulo III. Aplicación para escritura de EEPROM externa con I2C Se puede observar en la Figura 3.9 que la memoria que se utilizará (Microchip 24LC256 con encapsulado tipo SOIC) dispone de 8 pines. Los tres primeros, A0, A1, y A2, son utilizadas para cambiar la dirección de memoria y poder utilizar hasta 8 memorias (3 bits) simultáneas en el mismo bus. Las pines de VSS y VCC se conectan a masa y a un voltaje de entre 1.7 a 5.5V respectivamente. La pin WP (Write-Protect input) se utiliza para habilitar o deshabilitar la operación de escritura conectándola a VSS o VCC respectivamente. Finalmente, las entradas de SDA y SCL son las utilizadas para transferir las direcciones y los datos en el caso del pin SDA, y para sincronizar la transferencia de datos en el caso del pin SCL. [4] Figura 3.9.Esquema de una memoria EEPROM 24LC256. 3.2.1. Configuración inicial de la memoria. En cuanto a configuración, inmediatamente después de la condición de Start, el dispositivo MASTER envía al SLAVE el primer byte llamado byte de control (ver Figura 3.10). El formato de este byte de control es la siguiente: los 4 bits más significativos indican en código de control, para las memorias EEPROM 24XX256 viene asignado el valor en binario “1010” para operaciones de lectura y escritura; los siguientes 3 bits corresponden a los bits de selección de chip (A2, A1, y A0), estos bits pueden ser utilizados para ampliar la memoria total hasta 2Mbits ya que nos permiten poner 8 memorias en el mismo bus. En nuestro caso se les ha asignado el valor “0” ya que solamente se trabajará con una memoria. Finalmente, el último bit permite seleccionar la función de lectura o escritura (Read/Write bit). [4] De esta manera, una vez enviada la condición de Start, el dispositivo 24LC256 monitorea el bus SDA para comprobar el identificador del tipo de dispositivo al cual se transmitirá. Al recibir el código “1010” y los bits de selección de chip apropiados, el dispositivo SLAVE 24LC256 envía una señal de reconocimiento ACK hacia el dispositivo MASTER. Dependiendo del estado del bit Read/Write, el dispositivo 24LC256 seleccionará la función de lectura o escritura. Figura 3.10.Formato del byte de control. 24 Capítulo III. Aplicación para escritura de EEPROM externa con I2C 3.2.2. Operación de escritura. La operación de escritura se lleva a cabo siguiendo 6 pasos. El protocolo de comunicación es el siguiente: 1. Se inicia el proceso de comunicación entre MASTER y SLAVE mediante el envío de la condición de START. 2. Se envía el primer byte, Byte de control, en la sección 3.2.1. se ha explicado detalladamente el formato de este byte, lógicamente el bit R/W presentará un nivel bajo “0”. Se espera la señal de reconocimiento ACK. 3. En el siguiente byte a transmitir por el dispositivo MASTER se envían los 7 bits más significativos de la dirección en donde se desea escribir (Address High Byte). Dado que la distribución de memoria proporciona aproximadamente 32 mil posiciones posibles, se necesitan 15 bits (32768 valores) para identificar cada posición; por lo tanto, se utilizan palabras de 16 bits (WORD) que serán enviadas en 2 grupos de 8 bits. De esta manera, se obviará el bit 7 ya que solo se necesitan 7 bits. En la Figura 3.11 se puede ver como se distribuyen los 15 bits de direccionamiento. Se espera la señal de reconocimiento ACK. 4. Se envían los 8 bits que completan la dirección de memoria (Address Low Byte) y se espera la señal de reconocimiento ACK. 5. Se envía el byte de información que se desea escribir en la posición de memoria seleccionada anteriormente. Se espera la señal de reconocimiento ACK. 6. Finalmente, una vez concluida la operación de escritura, el dispositivo MASTER genera la condición de STOP. Nota: Lógicamente el pin WP (Write-Protect) debe estar conectado a nivel de tensión bajo de manera que permita la escritura sobre la memoria EEPROM (nivel bajo “0”). De no ser así, el dispositivo enviará señales de reconocimiento correctamente pero el ciclo de escritura no se llevara a cabo. Figura 3.11.Proceso de escritura en un dispositivo EEPROM 24LC256. 3.2.3. Operación de lectura. La operación de escritura se lleva a cabo siguiendo 8 pasos (ver Figura 3.12). El protocolo de comunicación es el siguiente: 1. Se inicia el proceso de comunicación entre MASTER y SLAVE mediante una operación de escritura. Se envia la condición de START. 25 Capítulo III. Aplicación para escritura de EEPROM externa con I2C 2. Se envía el primer byte, Byte de control. En la sección 3.2.1. se ha explicado detalladamente el formato de este byte, lógicamente el bit R/W presentará un nivel bajo “0”. Se espera la señal de reconocimiento ACK. 3. En el siguiente byte a transmitir por el dispositivo MASTER se envían los 7 bits más significativos de la dirección que se desea leer (Address High Byte). Se espera la señal de reconocimiento ACK. 4. Se envían los 8 bits que completan la dirección de memoria (Address Low Byte) y se espera la señal de reconocimiento ACK. 5. Finaliza el proceso de escritura cuando el dispositivo MASTER genera una condición de START inmediatamente después de haber recibido la señal de ACK. 6. Se inicia la operación de lectura, el dispositivo MASTER emite el byte de control pero con el bit R/W a uno. Se espera la señal de reconocimiento por parte del SLAVE. 7. El dispositivo SLAVE transmitirá el dato en una palabra de 8bits. El dispositivo MASTER no emitirá la señal de reconocimiento ACK. Esto hace que el dispositivo 24LC256 interrumpa la transmisión. 8. Finalmente, una vez concluida la operación de lectura, el dispositivo MASTER genera la condición de STOP. Figura 3.12.Proceso de lectura en un dispositivo EEPROM 24LC256. Nota: Después de una operación de lectura de una posición de memoria aleatoria, el contador de dirección interno de la memoria apuntará a la dirección que viene inmediatamente después de la que se acaba de leer. 3.3. Implementación del programa. En este punto se expondrá el código utilizado para la comunicación I2C entre el micro controlador PIC16F1827 y la memoria EEPROM 24LC256. Se ha decidido utilizar el lenguaje ensamblador de bajo nivel por el hecho de que es necesario trabajar a bajo nivel para poder configurar los registros. Las instrucciones necesarias vienen detalladas en el datasheet del microcontrolador [6] Se han creado 3 funciones principales para el correcto funcionamiento de la comunicación a través del bus I2C. Función “Init”. Esta función es la encargada de la configuración inicial del programa, la inicialización de los registros. Aquí se configuran diferentes parámetros del micro controlador como pueden ser: La velocidad del oscilador 26 Capítulo III. Aplicación para escritura de EEPROM externa con I2C interno, la velocidad de transmisión del bus, habilita el puerto serie del controlador, etc. Función “ByteWrite”. Esta función se encarga de la escritura en la EEPROM 24LC256 a través de otras funciones secundarias como: BSTART, BRESTART, BSTOP, TX, RX, etc. Las cuales serán explicadas en detalle posteriormente. Función “ByteRead”. Esta función se encarga de la lectura byte a byte de la EEPROM 24LC256. A continuación se presentan al detalle las funciones básicas creadas para la comunicación a través del bus I2C. 3.3.1. Función INIT. Init banksel bcf bsf bsf bsf ;CONFIGURACIÓN DE PUERTOS ;PORTB banksel movlw movwf ;PORTA banksel clrf ;CONFIGURACIÓN I2C MSSP1 ;SSP1STAT banksel movlw movwf ;SSP1ADD banksel movlw movwf ;SSP1CON2 banksel clrf ;SSP1CON1 banksel movlw movwf ;CONFIGURACIÓN DE POSICIONES banksel movlw movwf banksel movlw movwf OSCCON OSCCON,6 OSCCON,5 OSCCON,4 OSCCON,3 TRISB B'00010010' TRISB PORTA PORTA SSP1STAT B'10000000' SSP1STAT SSP1ADD B'00001001' SSP1ADD SSP1CON2 SSP1CON2 SSP1CON1 B'00101000' SSP1CON1 DE MEMORIA ad_low_counter .255 ad_low_counter ad_high_counter .127 ad_high_counter retlw 0 Código 3.1.Función de inicialización y configuración inicial de registros I2C. Primeramente, se ha configurado la frecuencia del oscilador interno del micro controlador a través del registro OSCCON (Oscillator Control Register) indicando la 27 Capítulo III. Aplicación para escritura de EEPROM externa con I2C frecuencia mediante los bits 6-3 (IRCF<3:0>) en donde se indica el valor “0111” que corresponde a una frecuencia de 500 kHz. En segundo lugar, se configuran los puertos. En la comunicación a través del bus I2C es necesario que los puertos RB1/SDA y RB4/SCL del puerto B estén configurados como entradas, por lo tanto, se indica dicha situación a través del registro TRISB. En tercer lugar, se configura el módulo del puerto serie síncrono MSSP a través de los siguientes registros: SSPxSTAT (Registro de estado) en donde se indica que se utilizará el modo de velocidad estándar (100 kHz o 1 MHz), SSPxADD (Registro de Velocidad de transmisión y dirección) en donde se indica un valor y en función de este se calcula la velocidad de transmisión (se explica detalladamente en la sección 2.3.4), SSPxCON1 (Registro de control) en donde habilitamos el puerto serie (SSPxEN) e indicamos el modo del puerto serie (se explica detalladamente en la sección 2.3.2) y SSPxCON2 (Registro de control 2) del que se precisa que esté a cero (se explica detalladamente en la sección 2.3.3). Finalmente, se hace la configuración inicial de los contadores de dirección. Se han definido dos variables (ad_low_counter y ad_high_counter) a través de las cuales se controlará el estado de la memoria (vacio / lleno). Se explicará en detalle en la sección 3.3.8. Add_mannager. 3.3.2. Función BSTART. BSTART banksel bcf banksel bsf banksel btfss goto $-1 retlw PIR1 PIR1,SSP1IF SSP1CON2 SSP1CON2,SEN PIR1 PIR1,SSP1IF 0 Código 3.2.Función que genera la condición de inicio (START CONDITION). Esta función se encarga de generar la condición de START. El procedimiento es el siguiente: se indica que no hay ninguna interrupción pendiente limpiando el flag de interrupción SSP1IF (bit del flag de interrupción del SSP) del registro PIR1, seguidamente se habilita la condición de START poniendo a uno el valor del bit SEN (Start Condition Enabled bit) del registro SSPxCON2 y finalmente se consulta por encuesta el bit SSP1IF del registro PIR1 hasta que detecte que se ha producido una interrupción, en tal caso la operación se habrá llevado a cabo correctamente. 28 Capítulo III. Aplicación para escritura de EEPROM externa con I2C Start Condition 3 Amplitude (V) 2.5 2 1.5 1 0.5 0 28.24 28.25 28.26 28.27 28.28 28.29 28.3 28.31 28.32 28.33 Time (ms) Figura 3.13.Señal de start vista desde un osciloscopio. En la Figura 3.13 se puede observar una condición de Start generada por nuestro programa y que ha sido capturada desde un osciloscopio. Se puede observar en la parte central de la imagen una transición de la línea SDA (señal roja) del nivel alto al nivel bajo mientras la línea SCL (señal azul) se mantiene en el nivel alto. 3.3.3. Función BRESTART. BRESTART banksel bcf banksel bsf banksel btfss goto $-1 retlw PIR1 PIR1,SSP1IF SSP1CON2 SSP1CON2,RSEN PIR1 PIR1,SSP1IF 0 Código 3.3.Función que genera la condición de reinicio (RESTART CONDITION). Esta función se encarga de generar la condición de RESTART. El procedimiento es el siguiente: se indica que no hay ninguna interrupción pendiente limpiando el flag de interrupción SSP1IF (bit del flag de interrupción del SSP) del registro PIR1, seguidamente se habilita la condición de RESTART poniendo a uno el valor del bit RSEN (Repeated Start Condition Enabled bit) del registro SSPxCON2 y finalmente se consulta por encuesta el bit SSP1IF del registro PIR1 hasta que detecte que se ha producido una interrupción, en tal caso la operación se habrá llevado a cabo correctamente. 3.3.4. Función BSTOP. BSTOP banksel bcf banksel bsf banksel btfss goto $-1 retlw PIR1 PIR1,SSP1IF SSP1CON2 SSP1CON2,PEN PIR1 PIR1,SSP1IF 0 Código 3.4.Función que genera la condición de parada (STOP CONDITION). 29 Capítulo III. Aplicación para escritura de EEPROM externa con I2C Esta función es la encargada de generar la condición de STOP. El procedimiento es el siguiente: se indica que no hay ninguna interrupción limpiando el flag de interrupción SSP1IF (bit del flag de interrupción del SSP) del registro PIR1, a continuación se habilita la condición de STOP poniendo a uno el valor del bit PEN (Stop Condition Enabled bit) del registro SSPxCON2 y finalmente se consulta por encuesta el bit SSP1IF del registro PIR1 hasta que detecte que se ha producido una interrupción, en tal caso la operación se habrá llevado a cabo correctamente. Stop Condition Amplitude (V) 3 2.5 2 1.5 1 0.50 29.52 29.53 29.54 29.55 29.56 29.57 29.58 29.59 29.6 29.61 Time (ms) Figura 3.14.Señal de stop vista desde un osciloscopio. En la Figura 3.14 se puede observar una condición de Stop generada por nuestro programa y que ha sido capturada desde un osciloscopio. Se puede observar en la parte central de la imagen una transición de la línea SDA (señal roja) del nivel bajo al nivel bajo mientras la línea SCL (señal azul) se mantiene en el nivel alto. 3.3.5. Función TX. TX banksel bcf banksel movf banksel movwf banksel btfss goto $-1 retlw PIR1 PIR1,SSP1IF datao datao,W SSP1BUF SSP1BUF PIR1 PIR1,SSP1IF 0 Código 3.5.Función de transmisión de datos. Esta función es la encargada de la transmisión de datos, transmite el byte guardado en la variable “datao” al dispositivo EEPROM. El procedimiento es el siguiente: se indica que no hay ninguna interrupción pendiente limpiando el flag de interrupción SSP1IF (bit del flag de interrupción del SSP) del registro PIR1, a continuación se copia el valor de la variable “datao” al registro W para luego ser puesto en el registro SSP1BUF (SSP Recieve Buffer/Transmit Register). Cada vez que este registro se carga con un valor, automáticamente se inicia la transmisión de datos. Finalmente, se consulta por encuesta 30 Capítulo III. Aplicación para escritura de EEPROM externa con I2C el bit SSP1IF del registro PIR1 hasta que detecte que se ha producido una interrupción, en tal caso la operación se habrá llevado a cabo correctamente. 3.3.6. Función RX. RX banksel PIR1 bcf PIR1,SSP1IF banksel SSP1CON2 bsf SSP1CON2,RCEN banksel PIR1 btfss PIR1,SSP1IF goto $-1 banksel SSP1BUF movf SSP1BUF,W banksel datai movwf datai banksel PIR1 bcf PIR1,SSP1IF banksel SSP1CON2 bsf SSP1CON2,ACKEN banksel PIR1 btfss PIR1,SSP1IF goto $-1 retlw 0 Código 3.6.Función de recepción de datos. Esta función es la encargada de la recepción de datos, lee un byte del dispositivo EEPROM y lo guarda en la variable “datai”. El procedimiento es el siguiente: se indica que no hay ninguna interrupción pendiente limpiando el flag de interrupción SSP1IF (bit del flag de interrupción del SSP) del registro PIR1. Seguidamente se inicia la recepción de un byte habilitando el bit RCEN (Recieve Enable bit) del registro SSPxCON2. Por último, se comprueba que la operación se haya completado correctamente consultando consulta por encuesta el bit SSP1IF del registro PIR1 hasta que detecte que se ha producido una interrupción. El siguiente paso es copiar al registro W el valor de la recepción que se encuentra en el registro SSP1BUF (SSP Recieve Buffer/Transmit Register) para luego ponerlo en la variable “datai”. Acto seguido, se limpia el bit de interrupción SSP1IF y se genera una secuencia de reconocimiento ACK mediante el bit ACKEN del registro SSPxCON2. Finalmente, se consulta por encuesta el bit SSP1IF del registro PIR1 hasta que detecte que se ha producido una interrupción, en tal caso la operación se habrá llevado a cabo correctamente. 3.3.7. Función POLL. Poll banksel movlw movwf pollcnt .40 pollcnt call banksel movlw banksel movwf BRESTART WRITE_ADDR WRITE_ADDR datao datao polling 31 Capítulo III. Aplicación para escritura de EEPROM externa con I2C call TX banksel SSP1CON2 btfss SSP1CON2,ACKSTAT goto exitpoll banksel pollcnt decfsz pollcnt,F goto polling exitpoll call retlw BSTOP 0 Código 3.7.Función de encuesta de señal de reconocimiento. Esta función se encarga de sondear el dispositivo EEPROM para así controlar el estado del bit de reconocimiento ACK. Este bit indica que el ciclo de escritura interno en el dispositivo se ha completado. El procedimiento es el siguiente. Primero, se define un número máximo de encuestas de 40 veces y se genera una señal de RESTART, de esta manera se indica que se llevara a cabo una nueva transmisión. Utilizando la función TX se transmite el byte de control de escritura del dispositivo EEPROM (almacenado en WRITE_ADDR). Después se sondea el valor del bit ACKSTAT (Acknowledge Status bit) del registro SSPxCON2 hasta que presente un valor de cero (1=ACK no recibido / 0=ACK recibido). Finalmente, se genera una señal de STOP para indicar que el procedimiento ha finalizado. 3.3.8. Función ADD_MANNAGER. Add_mannager decfsz goto decfsz goto goto ad_low_counter,F inc_low ad_high_counter,F inc_high full_memory full_memory sleep inc_low banksel address_low incf address_low,1 goto fin inc_high banksel address_high incf address_high,1 clrf address_low goto fin fin retlw 0 Código 3.8.Función de gestión de posiciones de memoria. Esta función se encarga de gestionar las posiciones de memoria en el proceso de escritura en el dispositivo EEPROM. Incrementa en uno el valor del contador de posiciones de memoria para que después de una escritura, la siguiente se haga en la posición inmediatamente continua a la anterior. También controla el estado de la memoria; cuando se han escrito en todas las posiciones posibles de la memoria, se ejecuta la instrucción de SLEEP, de esta manera el microprocesador se pondrá en modo de bajo consumo. 32 Capítulo III. Aplicación para escritura de EEPROM externa con I2C Se han definido dos variables (ad_low_counter y ad_high_counter) que han sido previamente inicializadas con los valores 255(11111111) y 127 (01111111) respectivamente, que representan los 15 bits de posiciones de memoria posibles. Esta función, en cada escritura, decrementa en uno el valor de la variable ad_low_counter e incrementa en uno el valor de la variable address_low (esta variable corresponde al byte de la parte baja de la posición de memoria donde se desea escribir o leer), cuando el valor de esta variable ad_low_counter llega a cero (después de 255 escrituras) se decrementa en uno el valor de variable ad_high_counter y se incrementa en uno el valor de la variable address_high (esta variable corresponde al byte de la parte alta de la posición de memoria donde se desea escribir o leer) y así sucesivamente hasta agotar las 32768 posiciones de memoria, entonces el micro controlador se pondrá en estado de SLEEP. 3.3.9. Función BYTEWRITE. ByteWrite call BSTART ; SE GENERA EL BYTE DE CONTROL (ESCRITURA) banksel WRITE_ADDR movlw WRITE_ADDR banksel datao movwf datao call TX ; SE ENVIA EL BYTE CON banksel movf movwf call LA DIRECCIÓN ALTA address_high address_high,0 datao TX ; SE ENVIA EL BYTE CON banksel movf movwf call LA DIRECCIÓN BAJA address_low address_low,0 datao TX ; SE ENVIA EL BYTE DE DATOS banksel data_to_write movf data_to_write,0 movwf datao call TX ; SE GENERA LA CONDICION DE STOP call BSTOP call Poll call Add_mannager retlw 0 Código 3.9.Función de escritura. Esta función se encarga del proceso de escritura en el dispositivo EEPROM, requiere de tres parámetros: el byte a escribir guardado en la variable data_to_write, la dirección alta guardada en la variable address_high y la dirección baja guardada en la variable address_low. 33 Capítulo III. Aplicación para escritura de EEPROM externa con I2C Para realizar dicha operación se sigue el proceso de escritura explicado en detalle en la sección 2.2.3, en donde el byte de control para escritura se encontrará en la variable WRITE_ADDR, la dirección de memoria se encontrará en las variables address_low y address_high y el byte a escribir se encontrará en la variable data_to_write. Finalmente, se ejecuta la función de POLL y se gestiona la siguiente posición de memoria a través de la función ADD_MANNAGER. 3.3.10. Función BYTEREAD. ByteRead call BSTART ; SE GENERA EL BYTE DE CONTROL (ESCRITURA) banksel WRITE_ADDR movlw WRITE_ADDR banksel datao movwf datao call TX ; SE ENVIA EL BYTE CON banksel movf movwf call LA DIRECCIÓN ALTA address_high address_high,0 datao TX ; SE ENVIA EL BYTE CON banksel movf movwf call LA DIRECCIÓN BAJA address_low address_low,0 datao TX ; SE GENERA LA CONDICIÓN DE RESTART call BRESTART ; SE GENERA EL BYTE DE CONTROL (LECTURA) banksel READ_ADDR movlw READ_ADDR banksel datao movwf datao call TX ; LECTURA DEL BYTE DE DATOS banksel SSP1CON2 bsf SSP1CON2,ACKDT call RX ; SE GENERA LA CONDICIÓN DE STOP call BSTOP retlw 0 Código 3.10.Función de lectura. Esta función se encarga del proceso de lectura en el dispositivo EEPROM. Requiere de dos parámetros: la dirección alta guardada en la variable address_high y la dirección baja guardada en la variable address_low. Retorna el resultado en la variable datai. Para llevar a cabo esta operación se sigue el protocolo de escritura explicado en detalle en la sección 2.2.4. Los bytes de control de escritura y de lectura se encuentran en las constantes WRITE_ADDR y READ_ADDR respectivamente. 34 Capítulo III. Aplicación para escritura de EEPROM externa con I2C 3.3.11. Ejemplo de escritura y lectura. En este apartado se mostrará el proceso de escritura y lectura, entre el micro controlador y la memoria, que se debe seguir para el correcto funcionamiento del programa. El código es el siguiente: call ; OPERACIÓN DE ESCRITURA banksel movlw movwf movlw movwf movf movwf call ; OPERACIÓN DE LECTURA call banksel movlw movwf movlw movwf call Init address_high 0x00 address_high 0x00 address_low orientacion,0 data_to_write ByteWrite Init address_high 0x00 address_high 0x00 address_low ByteRead Código 3.11.Ejemplo de escritura y lectura. Podemos ver que las tres funciones principales son INT, ByteWrite y ByteRead. Para empezar, se inicializan los registros necesarios a través de la función INIT, seguidamente se inicia el proceso de escritura indicando la dirección alta y baja de la memoria (en este caso se escribirá en la posición 0x00 en ambos valores, es decir, se escribirá en la posición 00000000 00000000). A efectos prácticos que serán expuestos más adelante, la variable orientacion contendrá el byte que se desea guardar en memoria. Por lo tanto, la variable orientacion es copiada a la variable data_to_write y posteriormente se llama a la función ByteWrite para iniciar el proceso de escritura. En cuanto a la operación de lectura, se vuelve a llamar a la función INIT para con el fin de reiniciar los valores necesarios para la gestión de las posiciones de memoria. Se indica la posición de memoria de la cual se desea leer el byte y finalmente se llama a la función ByteRead, el valor de la lectura será guardado en la variable datai. 3.4. Referencias. [1] Texas Instruments. (2010, Abril). POSITIVE-VOLTAGE REGULATORS [Online]. Disponible en: http://www.ti.com/lit/ds/symlink/ua78m33.pdf [2] Freescale Semiconductor. (2011, Agosto). MMA8453Q [Online]. Disponible en: http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8453Q.pdf?fpsp=1 [3] Wikipedia. (2012, Abril 26). EEPROM [Online]. Disponible en: http://en.wikipedia.org/wiki/EEPROM 35 Capítulo III. Aplicación para escritura de EEPROM externa con I2C [4] Microchip Technology Inc. (2004). 256k I2C CMOS Serial EEPROM [Online]. Disponible en: http://ww1.microchip.com/downloads/en/devicedoc/21203m.pdf [5] Hutson Systems. (2009, Mayo 2). Rimu PCB [Online]. Disponible en: http://www.hutson.co.nz/rimupcb.htm [6] Microchip Technology Inc. (2011). PIC16(L)F1826/27 Data Sheet [Online]. Disponible en: http://ww1.microchip.com/downloads/en/devicedoc/41391b.pdf 36 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q CAPITULO IV Aplicación para lectura de un acelerómetro MMA8453Q ______________________________ 37 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q 4. Aplicación para lectura de un acelerómetro MMA8453Q 4.1. Acelerómetro MMA8453Q. En esta sección se explicaran en detalle las principales características del acelerómetro MMA8453Q, sus principales aplicaciones y se mencionan algunas de las funciones más importantes. Además, se hará especial énfasis en la función de orientación llamada “Portrait/Landscape embedded function” que ofrece dicho dispositivo, ya que con ella se probará la aplicación de comunicación mediante el bus I2C. 4.1.1. Descripción del dispositivo. El dispositivo MMA8453Q [1] es un acelerómetro micromecanizado de bajo consumo, de tres ejes y con 10 bits de resolución. Presenta diversas funciones integradas con múltiples opciones que pueden ser programadas y/o configuradas por el usuario. Este dispositivo puede ser configurado para generar señales de interrupción inerciales “wakeup” de cualquier combinación de las funciones integradas mencionadas anteriormente. De esta manera, el dispositivo puede controlar eventos y permanecer en modo de ahorro de energía durante los periodos de inactividad. La principal característica de este dispositivo, por el cual ha sido elegido para formar parte de este proyecto, es que presenta una interfaz de salida digital I2C a través de la cual se controlará mediante el dispositivo Microchip PIC16(L)F1826/27. Además, trabaja a con una tensión de alimentación de entre 1.95 V y 3.6 V, ofrece una salida digital de 8 y 10 bits y dispone de tres canales integrados de detección de movimiento (detección de movimiento, detección de un pulso y detección de sacudida), entre otras características. 4.1.2. Aplicaciones del dispositivo. Existe una gran diversidad de aplicaciones para este tipo de dispositivos, en este proyecto se utilizará, en términos generales, para leer la orientación del dispositivo en un byte para luego ser transmitido al micro controlador a través del bus I2C y así realizar una prueba de concepto. Entre las aplicaciones típicas de este tipo de acelerómetro se encuentran: Aplicaciones de eCompass. Detección estática de la orientación (horizontal/vertical, arriba/abajo, izquierda/derecha, delate/detrás). Detección de caída libre para ordenadores portátiles, eReader y notebooks. Detección de orientación en tiempo real. Análisis de actividad en tiempo real. Detección de movimiento para ahorro de energía en dispositivos portátiles (Modalidad Auto-Sleep y Auto-Wake para teléfonos móviles, PDAs, GPS, etc). Control en caso de golpe o vibración. 38 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q 4.1.3. Funciones principales. Detección de caída libre y movimiento. El dispositivo cuenta con una arquitectura flexible para la detección de interrupciones, ya sean caídas libres o simples movimientos. La configuración de movimiento tiene la opción de activar o desactivar un filtro paso alto para eliminar los datos de inclinación (estática offset). La caída libre no utiliza este filtro. La detección de caída libre implica el seguimiento de los ejes X, Y y Z para controlar si la magnitud de aceleración está por debajo de un umbral para una cantidad de tiempo, ambos definidos por el usuario. Detección transitoria. El dispositivo pasa por el filtro paso alto los datos de aceleración, lo que elimina el offset (DC) y las bajas frecuencias. La frecuencia de corte del filtro paso alto puede ser definida por el usuario. La función integrada de detección transitoria utiliza los datos filtrados, lo cual permite al usuario ajustar el umbral de rebote y el contador. Detección de orientación. El dispositivo presenta un algoritmo de detección de orientación con la posibilidad de detectar hasta 6 orientaciones. La transición de vertical a horizontal es fijada por un ángulo a partir de 45º y un ángulo de histéresis de ± 14º. Esto permite que haya una transición sin problemas de vertical a horizontal de 30º, y de horizontal a vertical de aproximadamente 60º. El ángulo en el que el dispositivo ya no detecta el cambio de orientación se denomina “ángulo Z de bloqueo”. El dispositivo funciona hasta 29º desde la posición plana. Todos los ángulos tienen una precisión de ±2º. La Figura 4.1 y la Figura 4.2 ilustran la región del ángulo Z de bloqueo. Figura 4.1.Esquema de transición de horizontal a vertical Figura 4.2.Esquema de transición de vertical a horizontal 39 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q 4.1.4. Conexión de los pines para el dispositivo MMA8453Q En este apartado se describirá el conexionado de los diferentes pines del acelerómetro sobre la placa externa en la que se encuentra (vista anteriormente en la Figura 3.7) y también sobre la placa que se ha diseñado para conectar el acelerómetro con el resto de componentes a través de bus I2C. A continuación se expondrán las conexiones para los diferentes pines del dispositivo recomendadas por el fabricante [2]. En la Figura 4.3 se puede apreciar el esquema con las directrices para montar la placa y la disposición de los pines. Figura 4.3.Esquema de conexión recomendad para los dispositivos MMA8451, 2 y 3Q En la Tabla 4.1 se expone la conexión recomendada para cada pin: Número de MMA8453Q pin 1 VDDIO 2 BYPASS 3 NC 4 SCL 5 GND 6 SDA 7 SA0 8 9 10 11 12 13 14 15 16 EN INT2 GND INT1 GND NC VDD NC NC Conexión recomendada Alimentación de entre 1.62 a 3.6 V Condensador de 0.1μF conectado a GND Mantener desconectado Resistor de Pull-up de 4.7Ω requerida por el bus I2C Conectar a GND Resistor de Pull-up de 4.7Ω requerida por el bus I2C Conectar a GND o a VDD dependiendo de la dirección I2C que se quiera asignar, en este caso se ha decidido conectar a GND. Dejar desconectado, conectar a VDD o a GND Conectar al MCU Conectar a GND Conectar al MCU Conectar a GND Dejar desconectado, conectar a VDD o a GND Entrada analógica de entre 1.95 y 3.6 V Dejar desconectado, conectar a VDD o a GND Dejar desconectado, conectar a VDD o a GND 40 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q Tabla 4.1. Conexiones del acelerómetro MMA8453Q 4.2. Configuración del dispositivo MMA8453Q En este apartado explicará en detalle la configuración de los registros necesarios para el acoplamiento entre el acelerómetro y el microcontrolador a través del bus I2C. En principio no existen incompatibilidades de configuración entre los requerimientos (por ejemplo, la velocidad del bus de 100 kHz) de los diferentes dispositivos que actúan en condición de esclavo (Microchip EEPROM 24LC256 y acelerómetro). El dispositivo MMA8453Q dispone de un gran número de registros configurables, tanto de lectura como de escritura, que sirven para controlar, activar, desactivar y configurar el acelerómetro a gusto del usuario. Para realizar la prueba de concepto utilizando el acelerómetro se utilizarán solamente algunos de estos registros, los cuales serán explicados en detalle. Para más información sobre la descripción de los registros consultar Freescale Semiconductor MMA8453Q [1]. 4.2.1. Registro de control Existen 5 registros de control que permiten llevar el control del sistema (activar, desactivar, velocidad, modo SLEEP, etc.) y configurar los diferentes tipos de interrupciones posibles. A continuación se explicara el registro CTRL_REG1 ya que es el que se ha utilizado. Registro de control del sistema 1 (0x2A).- En la Figura 4.4 se puede apreciar la distribución del byte de registro. Este registro permite llevar el control del dispositivo, es decir, cambiar entre modo activo y modo de espera, seleccionar entre el modo de lectura rápida y el modo normal, seleccionar la velocidad de salida de datos (ODR) del sistema y configurar la frecuencia de muestreo cuando el dispositivo está en modo inactivo. Figura 4.4. Distribución del byte del registro de control del sistema 1, CTRL_REG1 Los bits 6 y 7 permiten seleccionar la frecuencia de muestreo cuando el dispositivo se encuentra en modo inactivo. Además, cuando el dispositivo se encuentra en modo inactivo o auto-sleep, el sistema ODR y la velocidad de datos para todo el sistema de bloques funcionales son reemplazados por la velocidad de datos establecida por el campo ASLP_RATE. En la Tabla 4.2 se indican las diferentes combinaciones con sus respectivos valores en frecuencia: ASLP_RATE1 0 0 ASLP_RATE2 0 1 41 Frecuencia (Hz) 50 12.5 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q 1 1 0 1 6.25 1.56 Tabla 4.2. Combinaciones para la velocidad durante el modo sleep del acelerómetro Los bits 3, 4 y 5 (DR[2:0]) sirven para seleccionar al velocidad de salida de datos (ODR) para las muestras de aceleración. El valor predeterminado es 000 para una velocidad de 800 Hz. A continuación se muestran en la Tabla 4.3 las diferentes combinaciones y sus valores de ODR y periodo correspondiente: DR2 0 0 0 0 1 1 1 1 DR1 0 0 1 1 0 0 1 1 DR0 0 1 0 1 0 1 0 1 ODR 800 Hz 400 Hz 200 Hz 100 Hz 50 Hz 12.5 Hz 6.25 Hz 1.56 Hz Periodo 1.25 ms 2.5 ms 5 ms 10 ms 20 ms 80 ms 160 ms 640 ms Tabla 4.3. Combinaciones para la velocidad durante el modo normal del acelerómetro El bit 2 (LNOISE) sirve para reducir el rango máximo de ruido. Su valor por defecto es 0 (Normal Mode) pero si se desea reducir el ruido su valor seria 1 (Reduced Noise Mode). El bit 1 (F_READ) permite elegir entre un modo de lectura rápido (1) y el modo normal (0). El valor por defecto es 1. Finalmente, el bit 0 (ACTIVE) permite activar el dispositivo o pasar de modo activo (1) a modo STANDBY (0). El valor por defecto es 0. Es importante saber que excepto para la selección del modo STANDBY, el dispositivo se debe encontrar en modo STANDBY para cambiar cualquiera de los campos o manipular cualquier registro. 4.2.2. Registro de configuración vertical/horizontal (0x11) Este registro se utiliza para habilitar la función de PORTRAIT/LANDSCAPE (vertical/horizontal) y también para indicar el comportamiento del contador de rebote. En la Figura 4.5 se puede ver la asignación de cada bit del registro. Figura 4.5. Distribución del byte del registro de configuración vertical/horizontal. PL_CFG El bit 7 indica el modo del contador de rebote. Cuando se le asigna el valor 0 disminuye el contador cada vez que la condición de interés ya no es válida. En cambio, cuando se le asigna el valor 1 (valor por defecto) borra el contador cada vez que la condición de interés ya no es válida. 42 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q El bit 6 habilita o deshabilita la detección de posición vertical/horizontal. Cuando se le asigna el valor 0 (valor por defecto) se deshabilita la detección de orientación vertical/horizontal. En cambio, cuando se le asigna el valor 1 se habilita dicha función. 4.2.3. Registro de estado Vertical/Horizontal (0x10) Este registro nos informa sobre la orientación actual o de cualquier cambio en la orientación del acelerómetro. En la Figura 4.6 se puede observar la distribución del byte del registro de estado vertical/horizontal. Figura 4.6. Distribución del byte del registro de estado Portrait/Landscape El bit número 7, NEWLP, indica si ha habido algún cambio en la orientación del dispositivo. Un 0 indica que no ha habido ningún cambio, un 1 indica que ha habido algún cambio en los bits de BAFRO y/o LAPO. El bit 6, LO, indica si se ha excedido el ángulo de inclinación en el eje Z, es decir, se ha cumplido la condición de Lockout. Un 0 indica que la condición de Lockout no ha sido detectada. Un 1 indica que la condición de Lockout ha sido detectada. Los bits 5, 4 y 3 no se utilizan por lo que mantendrán un valor constante 0. Los bits 1 y 2, LAPO[1:0], indican la orientación vertical/horizontal del dispositivo. A continuación se muestran en la Tabla 4.4 las diferentes combinaciones y sus valores de orientación correspondientes: LAPO [1] LAPO [0] 0 0 0 1 1 0 1 1 Descripción Portrait Up. Dispositivo en posición vertical respecto a la orientación normal. Valor por defecto. Portrait Down. Dispositivo en posición vertical invertida Landscape right. Dispositivo en modo horizontal hacia la derecha Landscape Left. Dispositivo en modo horizontal hacia la izquierda Tabla 4.4. Combinaciones para la orientación vertical/horizontal del acelerómetro El bit 0, BAFRO, indica si el dispositivo se encuentra en posición frontal o posterior. Un 0 indica que el dispositivo se encuentra en posición frontal (valor por defecto) y un 1 que está en posición posterior. Con la Figura 4.7 se puede entender mejor las posiciones Portrait Up, Portrait Down, Landscape Right, Landscape Left, Back y Front. 43 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q Figura 4.7. Gráfico de orientaciones del dispositivo 4.2.4. Registros de datos Estos registros contienen los datos de muestra de salida de los ejes X, Y y Z expresados en complemento a 2 y en una longitud de 10 bits. Los registros de muestra almacenan los datos de la muestra actual. Se ha decidido utilizar solamente los 8 bits más significativos de cada eje para su posterior análisis. Registro de datos. OUT_X_MSB (0x01) Este registro nos ofrece los 8 bits más significativos del eje X. En la Figura 4.8 podemos ver la distribución del byte. Figura 4.8. Distribución del byte de MSB del eje X Registro de datos. OUT_Y_MSB (0x03) Este registro nos ofrece los 8 bits más significativos del eje Y. En la Figura 4.9 podemos ver la distribución del byte. Registro de datos. OUT_Z_MSB (0x05) Este registro nos ofrece los 8 bits más significativos del eje Z. En la Figura 4.10 podemos ver la distribución del byte. Figura 4.9. Distribución del byte de MSB del eje Y Figura 4.10. Distribución del byte de MSB del eje Z 44 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q 4.3. Implementación de funciones de lectura y escritura en el dispositivo En este apartado se describirá la implementación de las dos funciones que han sido diseñadas para la escritura y la lectura del dispositivo. 4.3.1. Función WRITE_ACCEL Write_accel call banksel movlw banksel movwf call ; Se envia la dirección banksel movf movwf call ; Se envía el valor que banksel movf movwf call BSTART WRITE_ACCEL_ADDR WRITE_ACCEL_ADDR datao datao TX del registro reg_addr reg_addr,0 datao TX se desea escribir data_to_write data_to_write,0 datao TX ; Señal de STOP call retlw BSTOP 0 Código 4.1.Función de escritura en el acelerómetro Esta función es muy similar a la función ByteWrite descrita anteriormente en el apartado 3.3.9. Como se puede ver en la Figura 4.11 el fabricante especifica la secuencia de transmisión de datos para establecer la comunicación vía I2C con el acelerómetro. Se ha de tener en cuenta que el byte de control para esta operación es “00111000”, este valor se encuentra guardado en el registro WRITE_ACCEL_ADDR. Figura 4.11. Secuencia de escritura en el acelerómetro Esta función requiere únicamente de dos valores: el número del registro en el cual se desea escribir y el valor que se desea escribir, estos valores deben ser guardados previamente en las variables reg_addr y data_to_write respectivamente. Siguiendo las directrices vistas en la Figura 4.11 se realiza la operación de escritura. Se siguen los siguientes pasos: Se inicia la transmisión enviando la señal de Start. Se envía el byte de control de escritura “00111000” para indicar que se desea escribir en el dispositivo. 45 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q Se comprueba la señal de reconocimiento ACK enviada por el dispositivo esclavo. Se envía la dirección del registro en donde se quiere escribir a través de la variable reg_addr. Se comprueba la señal de reconocimiento ACK enviada por el dispositivo esclavo. Se envía el valor que se desea escribir en dicho registro a través de la variable data_to_write. Se comprueba la señal de reconocimiento ACK enviada por el dispositivo esclavo. Finalmente, se envía la señal de Stop para indicar que ha finalizado la comunicación y así dejar libre el bus. En la Figura 4.12 se puede observar la secuencia de escritura en el acelerómetro capturada desde un osciloscopio, en dicha figura se indican todos los pasos descritos anteriormente. 3 Amplitude (V) 2.5 2 1.5 1 0.5 0 28.2 28.25 28.3 28.35 28.4 28.45 28.5 28.55 28.6 Time (ms) Start Condition Byte de control Dirección del registro Byte a escribir Stop Condition Figura 4.12. Secuencia de escritura en el acelerómetro 4.3.2. Función READ_ACCEL Read_accel call BSTART ; Se envía el byte de control de escritura banksel WRITE_ACCEL_ADDR movlw WRITE_ACCEL_ADDR banksel datao movwf datao call TX ; Se envia la dirección del registro en donde se escribirá banksel reg_addr 46 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q movf movwf call reg_addr,0 datao TX ; Se genera la condición de RESTART call BRESTART ; Se envia el byte de control de lectura banksel READ_ACCEL_ADDR movlw READ_ACCEL_ADDR banksel datao movwf datao call TX ; Se lee el valor de registro banksel SSP1CON2 bsf SSP1CON2,ACKDT call RX movf datai,0 movwf orientacion ; Señal de STOP call retlw 0 BSTOP Código 4.2.Función de lectura del acelerómetro Esta función es muy similar a la función ByteRead descrita anteriormente en el apartado 3.3.10. Como se puede ver en la Figura 4.13 el fabricante especifica la secuencia de transmisión de datos para establecer la comunicación vía I2C con el acelerómetro. Se ha de tener en cuenta que el byte de control para esta operación es “00111001”, este valor se encuentra guardado en el registro READ_ACCEL_ADDR. Figura 4.13. Secuencia de lectura en el acelerómetro Esta función requiere únicamente de la dirección del registro que se desea leer para devolver el valor del estado del registro a través de la variable orientación. Siguiendo las directrices vistas en la Figura 4.13 se realiza la operación de escritura. Se siguen los siguientes pasos: Se inicia la transmisión enviando la señal de Start. Se envía el byte de control de escritura “00111000” para indicar que se desea escribir en el dispositivo. Se comprueba la señal de reconocimiento ACK enviada por el dispositivo esclavo. Se envía la dirección del registro en donde se quiere escribir a través de la variable reg_addr. 47 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q Se comprueba la señal de reconocimiento ACK enviada por el dispositivo esclavo. Se genera una señal de RESTART. Se envía el byte de control de lectura “00111001” para indicar que se desea leer del dispositivo. Se comprueba la señal de reconocimiento ACK enviada por el dispositivo esclavo. Se recibe el byte de información en la variable orientación. Finalmente, se genera una condición de NAK, ya que el dispositivo que actúa como maestro no genera una señal de reconocimiento ACK y seguidamente envía la señal de Stop para indicar que ha finalizado la comunicación y así dejar libre el bus. En la Figura 4.14 se puede observar la secuencia de lectura del acelerómetro capturada desde un osciloscopio, en dicha figura se indican todos los pasos descritos anteriormente. 3 Amplitude (V) 2.5 2 1.5 1 0.5 0 29.3 29.35 29.4 29.45 29.5 29.55 29.6 29.65 29.7 29.75 Time (ms) Restart Condition Byte de control Byte de lectura NACK Stop Condition Figura 4.14. Secuencia de lectura del acelerómetro 4.4. Implementación y prueba de aplicación con el dispositivo MMA8453Q En este apartado se describirá la manipulación de los registros expuestos anteriormente para el correcto funcionamiento de la comunicación a través del bus I2C. Además, se realizará una comprobación del funcionamiento de la aplicación utilizando un programa de prueba proporcionado por el fabricante del dispositivo. De esta manera, se comprobarán los valores de la orientación detectados por nuestra aplicación con los valores que nos indique la aplicación del fabricante. 48 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q 4.3.1. Implementación de lectura de la posición Vertical/Horizontal del dispositivo call Init ; CONFIGURACIÓN DEL REGISTRO PORTRAIT/LANDSCAPE. banksel reg_addr movlw 0x11 movwf reg_addr banksel data_to_write movlw b'11000000' movwf data_to_write call Write_accel ; ACTIVACIÓN DEL DISPOSITIVO. banksel reg_addr movlw 0x2A movwf reg_addr banksel data_to_write movlw b'00000001' movwf data_to_write call Write_accel ; LEER EL ESTADO ACTUAL banksel movlw movwf call DE “PORTRAIT/LANDSCAPE STATUS” reg_addr 0x10 reg_addr Read_accel Código 4.3.Lectura del registro Portrait/Landscape Status. En el Código 4.3 se puede observar la configuración necesaria para leer el valor del registro 0x10 Portrait/Landscape Status, el cual nos indica la orientación del dispositivo. Después de inicializar los registros necesarios para establecer la comunicación mediante el bus I2C a través de la función INIT, se debe habilitar la función de detección de posición Vertical/Horizontal del dispositivo a través del registro (0x11) de configuración Vertical/Horizontal explicado en detalle en la sección 4.2.2. Es imprescindible que para realizar dicha operación el dispositivo se debe encontrar en modo de Standby. En segundo lugar, se despierta al dispositivo a través del registro (0x2A) de configuración explicado en detalle en la sección 4.2.1. Finalmente, se lee el valor del registro (0x10) de estado Vertical/Horizontal explicado en detalle en el sección 4.2.3. 4.3.2. Prueba de funcionamiento PL_STATUS Para realizar esta prueba se ha utilizado un kit de prueba [3] proporcionado por el fabricante, con el cual se probarán todas las posibles posiciones que permite el registro para luego ser comparadas con la lectura que nos proporcione el programa que hemos creado. 49 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q En primer lugar, se comprobará el funcionamiento del acelerómetro haciendo uso del programa SensorToolbox proporcionado por el fabricante. En la Tabla 4.5 se pueden observar las diferentes posiciones con su respectivo valor en el registro PL_STATUS, los valores de cada bit están explicados en detalle en la sección 4.2.3. Orientación dispositivo del Valor del registro 50 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q Tabla 4.5. Bits LAPO1, LAPO0 y BAFRO del registro PL_Status en función de la orientación del acelerómetro, leídos con el kit de demostración proporcionado por el fabricante Una vez comprobado el correcto funcionamiento del acelerómetro, se pasará a comprobar su funcionamiento con nuestro programa. En la Tabla 4.6 podemos ver representados los valores leídos con el debugger del microcontrolador. Orientación dispositivo del Valor del registro ORIENTACION 51 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q Tabla 4.6. Bits LAPO1, LAPO0 y BAFRO del registro PL_Status en función de la orientación del acelerómetro, leídos con el microcontrolador PIC16F1827 y el programa diseñado Se puede ver cómo los valores leídos mediante la placa personalizada y el programa diseñado coinciden con los que cabría esperar respecto la Tabla 4.5. Por lo tanto, se comprueba que el funcionamiento tanto del programa como de la placa es correcto. 4.3.3. Implementación de lectura del valor de los ejes X, Y y Z del dispositivo Lee_ejes inicio ;////////// EJE X /////////////////////////////////////// banksel movlw movwf call reg_addr 0x00 reg_addr Read_accel banksel movf banksel orientacion orientacion,0 data_to_write 52 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q movwf banksel movlw movwf movlw movwf call banksel movlw movwf movlw movwf call banksel movf banksel movwf banksel incf incf data_to_write address_high 0x00 address_high 0x00 address_low ByteWrite address_high 0x00 address_high 0x00 address_low ByteRead datai datai,0 eje_x eje_x reg_addr reg_addr reg_addr ;///////////// EJE Y /////////////////////////////// call Read_accel banksel orientacion movf orientacion,0 banksel data_to_write movwf data_to_write banksel address_high movlw 0x01 movwf address_high movlw 0x01 movwf address_low call ByteWrite banksel address_high movlw 0x01 movwf address_high movlw 0x01 movwf address_low call ByteRead banksel datai movf datai,0 banksel eje_y movwf eje_y banksel reg_addr incf reg_addr incf reg_addr ;////////// EJE Z ///////////////////////////////////////////////// call Read_accel banksel orientacion movf orientacion,0 banksel data_to_write movwf data_to_write banksel address_high movlw 0x02 movwf address_high movlw 0x02 movwf address_low call ByteWrite banksel address_high movlw 0x02 53 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q movwf movlw movwf call banksel movf banksel movwf address_high 0x02 address_low ByteRead datai datai,0 eje_z eje_z retlw 0 Código 4.4.Lectura de ejes. En el Código 4.4 se puede observar la configuración necesaria para leer el valor de los 3 registros (0x01, 0x03 y 0x05) correspondientes a la inclinación en cada eje X, Y y Z respectivamente. La función Lee_ejes se encarga de la lectura de los 8 bits más significativos de cada eje, estos se encuentran en los registros de datos. La función y la estructura de estos registros se han explicado en detalle en la sección 4.2.4. Para efectuar la operación de lectura, en primer lugar se ha de indicar la dirección del registro y guardar dicha dirección en la variable reg_addr. Se iniciará la secuencia de lectura con el registro 0x01 correspondiente al eje X. Una vez especificado el registro, se llamará a la función Read_accel, esta leerá el valor del registro en el acelerómetro. Acto seguido, el byte que ha sido leído del registro 0x01 se escribe en el dispositivo Microchip EEPROM 24LC256 mediante la función ByteWrite. Finalmente, se lee el byte escrito en la memoria mediante la función ByteRead y se traslada a la variable eje_x para poder ser visualizado desde el Debuger. Se repite el procedimiento para los ejes Y y Z, hace falta tener en cuenta que los valores de estos ejes se encuentran en los registros 0x03 y 0x05 y serán guardados en las variables eje_y y eje_z respectivamente. 4.3.4. Prueba de funcionamiento DATA REGISTERS En este apartado se comprobará el funcionamiento de la función Lee_ejes explicada en el apartado anterior. Igual que con el registro PL_STATUS en la sección 4.3.2 aquí también se utilizará el programa proporcionado por el fabricante SensorToolbox. Se ha considerado una posición horizontal para la prueba, como se puede ver en la Figura 4.15. 54 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q Figura 4.15. Posición del dispositivo para la prueba. A la izquierda se puede ver la placa custom que se ha diseñado. A la derecha se puede ver el dispositivo con el hardware proporcionado por el fabricante Para comprobar que los valores coinciden, se ha utilizado el programa SensorToolbox proporcionado por el fabricante. Resultado obtenido a través de la función Lee_ejes. Figura 4.16. Figura 4.16. Lectura de los tres ejes del acelerómetro mediante el microcontrolador PIC Resultado obtenido a través del programa SensorToolbox. Figura 4.17. Figura 4.17. Lectura de los tres ejes del acelerómetro mediante el kit de demostración Se puede observar que los valores obtenidos de los ejes Y y Z son iguales en ambos casos, en cambio, existe cierta discrepancia en el eje X debido a factores externos como por ejemplo: la orientación de la placa, el peso de la placa, etc. 4.4. Referencias [1] Freescale Semiconductor. (2011, Agosto). MMA8453Q [Online]. Disponible en: http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8453Q.pdf?fpsp=1 [2] Freescale Semiconductor. Aplication Note 4077 (2010, Septiembre). MMA845xQ Desing checklist and Board mounting Guidelines [Online]. Disponible en: http://cache.freescale.com/files/sensors/doc/app_note/AN4077.pdf 55 Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q [3] Freescale, INC. Sensor Toolbox [Online]. Disponible en: http://www.freescale.com/webapp/sps/download/license.jsp?colCode=SNRTOOLBOX&locatio n=null&Parent_nodeId=12403268572397213067AA&Parent_pageType=overview 56 Capítulo V. Conclusiones CAPITULO V Conclusiones ______________________________________________________________________ 57 Capítulo V. Conclusiones 5. Conclusiones y líneas futuras El creciente interés para la monitorización de diferentes parámetros físicos como temperatura, humedad, presión, contaminación, vibraciones, movimiento... está generando en la actualidad y en el futuro próximo gran cantidad de líneas de investigación. Un ejemplo es lo que se conoce como smart cities. Uno de los focos de interés está en la investigación y desarrollo de sensores wireless, ya que obviamente no es factible la instalación masiva de sensores cableados por el coste de la obra civil que esto supone. En este proyecto se ha trabajado en la parte del sensor. Concretamente, se ha partido de sensores wireless UWB previamente diseñados en el grupo, a los cuales se ha añadido ciertas funcionalidades. Estos sensores disponen de un microcontrolador de bajo consumo al cual el presente trabajo ha consistido en conectarle mediante bus I2C una memoria EEPROM y sensores de parámetros físicos comerciales. La memoria es necesaria para almacenar medidas de forma que se transfieran al lector no en tiempo real sino en instantes de tiempo concretos, mientras que la integración de sensores comerciales permite la integración de sensores que van interconectados con bus I2C para tomar su lectura y enviar los datos de forma wireless. De esta forma, los trabajos han sido divididos en tres partes, todas ellas concluidas de forma satisfactoria: - Estudio del microcontrolador e implementación del bus I2C. - Conexión de la memoria EEPROM al microcontrolador mediante bus I2C. - Conexión de un sensor acelerómetro mediante bus I2C. Se ha desarrollado una placa de demostración que incluye los tres dispositivos y se han programado todas las rutinas necesarias de configuración y aplicación para lectura/escritura de la memoria y lectura del acelerómetro. Como líneas futuras se abre un abanico de posibilidades una vez se tienen los módulos lector, tag y la posibilidad de almacenar medidas en el tag y de integrar sensores comerciales mediante bus I2C. El siguiente paso es la integración en el tag de la circuiteria adicional que se ha diseñado en este proyecto siguiendo criterios de miniaturización. Finalmente, pensando en el nivel de aplicación se propone la implementación de distintas aplicaciones reales para la monitorización de varios parámetros físicos, ya sea utilizando sensores I2C o sensores conectados al convertidor A/D del microcontrolador de los cuales se toman medidas y se almacenan en la memoria para un posterior volcado mediante UWB hacia el lector. 58 Capítulo VI. Apéndice. Código del programa CAPITULO VI Apéndice ______________________________________________________________________ 59 Capítulo VI. Apéndice. Código del programa 6. Apéndice 6.1. Código del programa ;******************************************************************** ; Filename: i2c_proyecto.asm ; Date: junio/2012 ; File Version: Original ; ; Author: YUL SILVA RODRÍGUEZ ; Company: URV ; ; ;********************************************************************* ; ; Files Required: P16F1827.INC ;********************************************************************* list p=16f1827 ; list directive to define processor #include <p16f1827.inc> ; processor specific variable definitions ;--------------------------------------------------------------------; CONFIGURATION WORD SETUP ; The 'CONFIG' directive is used to embed the configuration word ; within the .asm file. The lables following the directive are located ; in the respective .inc file. See the data sheet for additional ; information on configuration word settings. ;--------------------------------------------------------------------__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_ON & _IESO_OFF & _FCMEN_OFF __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF ;--------------------------------------------------------------------; DEFINICION DE VARIABLES ;--------------------------------------------------------------------CBLOCK 0x20 ; Define GPR variable register locations datai datao eje_x address_high address_low data_to_write eje_y eje_z reg_addr orientacion registro var pollcnt ad_high_counter ad_low_counter ENDC ;*******************RAM register definitions********************** 60 Capítulo VI. Apéndice. Código del programa ;datai ;datao ;eje_x ;address_high ;address_low ;data_to_write ;eje_y ;eje_z ;reg_addr ;orientacion ;registro ;var ;pollcnt ;ad_high_counter ;ad_low_counter equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ 20h 21h 22h 23h 24h 25h 26h 27h 28h 29h 30h 31h 32h 33h 34h ; Datos de entrada Buffer ; Datos de salida Buffer ; Direccion alta en la EEprom ; Direccion baja en la eeprom ; Datos que se escribiran en EEprom ; ; ; ; ; ; ; Direccion del registro accel Dato leido del acelerometro Variable para la rutina Lee_ejes Variable para la rutina Lee_ejes Contador de encuesta Variables la gestion de memoria Variables gestion de memoria ;*******************Macro definitions***************************** WRITE_ADDR equ b'10100000' ; Byte de control escritura READ_ADDR equ b'10100001' ; Byte de control lectura WRITE_ACCEL_ADDR equ b'00111000' ; Byte de control accel escritura READ_ACCEL_ADDR equ b'00111001' ; Byte de control accel lectura DATAEE DE ORG 0xF000 "MCHP" ; Place 'M' 'C' 'H' 'P' at address 0,1,2,3 ;--------------------------------------------------------------------; RESET VECTOR ;--------------------------------------------------------------------ORG 0x0000 PAGESEL START GOTO START ; processor reset vector ; When using debug header, first inst. ; may be passed over by ICD2. ;--------------------------------------------------------------------; INTERRUPT SERVICE ROUTINE ;--------------------------------------------------------------------ORG 0x0004 ;--------------------------------------------------------------------; USER INTERRUPT SERVICE ROUTINE GOES HERE ;--------------------------------------------------------------------RETFIE ; return from interrupt ;--------------------------------------------------------------------; MAIN PROGRAM ;--------------------------------------------------------------------START ;--------------------------------------------------------------------; INICI DE PROGRAMA ;--------------------------------------------------------------------call banksel movlw movwf banksel Init ; Initializar dispositivo reg_addr 0x11 ;Portrait/LandscapE configuration Register reg_addr data_to_write 61 Capítulo VI. Apéndice. Código del programa movlw movwf call b'11000000' data_to_write Write_accel banksel reg_addr movlw 0x2A movwf reg_addr banksel data_to_write movlw b'00000001' movwf data_to_write call Write_accel ;PL detection habilitada ;SE TIENE QUE HACER EN MODO STANDBY ;CONTROL1 Register ;WAKE mode ;//////////////////LEER PL STATUS DEL ACELEROMETRO/////////////// banksel movlw movwf call reg_addr 0x10 reg_addr Read_accel ;Portrait/LandscapE STATUS ;NEWLP LO 0 0 0 LAPO[1] LAPO[1] BAFRO ;//////////////////LEER EJES DEL ACELEROMETRO////////////////////// banksel movlw movwf movlw movwf call address_high 0x00 address_high 0x00 address_low Lee_ejes ; Indicamos la posición de memoria ; en la cual se quiere iniciar la ; escritura ;//////////////////LEER sysMode y WHO_AM_I////////////////////// banksel movlw movwf call reg_addr 0x0B reg_addr Read_accel banksel movlw movwf call reg_addr 0x0D reg_addr Read_accel ;READ SYSMODE ; 00000001 -> OK ;Who AM I? ; 00111010 -> OK ;////////////////// ESCRIBIR Y LEER DE EEPROM //////////////////// banksel movlw movwf movlw movwf movf movwf call address_high 0x00 address_high 0x00 address_low orientacion,0 data_to_write ByteWrite ;Escribimos el valor de la orientacion en ;la EEPROM ;*******************Init subroutine******************************* ; Inicializacion de registros ;***************************************************************** Init banksel OSCCON bsf OSCCON,6 bsf OSCCON,5 62 Capítulo VI. Apéndice. Código del programa bcf bsf OSCCON,4 OSCCON,3 ;Configuracion Frecuencia Reloj interno (IRCF) ;0111 (Por defecto 500 kHz MF ;1101 4MHz ;CONFIGURACIÓN DE PUERTOS ;PORTB banksel TRISB ; En I2C, RB1/SDA y RB4/SCL movlw B'00010010' ; tienen que ser entradas movwf TRISB ;PORTA banksel movlw movwf banksel andwf TRISA ;ya estan conectados a GND b'00100000' TRISA ;Pongo A0, A1 y A2 a 0 PORTA PORTA,1 ;CONFIGURACIÓN I2C MSSP1 ;SSP1STAT banksel SSP1STAT movlw B'10000000' ; Slew rate control disabled for standard movwf SSP1STAT ; speed mode (100 kHz and 1 MHz) ;SSP1ADD banksel SSP1ADD movlw B'00001001' ;Fscl=500 kHz / (4*(3+1))= 31.25 kHz movwf SSP1ADD ;SSP1CON2 banksel SSP1CON2 clrf SSP1CON2 ;SSP1CON1 banksel SSP1CON1 movlw B'00101000' ;SSPxEN activado y 1000 = I2C Master movwf SSP1CON1 ; mode, clock = FOSC/(4 * (SSPxADD+1)) ;CONFIGURACION DE POSICIONES DE MEMORIA banksel ad_low_counter movlw .255 movwf ad_low_counter banksel ad_high_counter movlw .127 movwf ad_high_counter retlw 0 ;*******************Subrutina bit de START************************** ; Esta rutina genera la condición de START ;***************************************************************** BSTART banksel PIR1 bcf PIR1,SSP1IF ; limpia el flag SSP banksel SSP1CON2 bsf SSP1CON2,SEN ; Genera condición de Start banksel PIR1 btfss PIR1,SSP1IF ; Comprueba final de operación goto $-1 ; Sino, continua comprobando retlw 0 ;*******************Restart bit subroutine************************** 63 Capítulo VI. Apéndice. Código del programa ; Esta rutina genera una condición de RESTART ;***************************************************************** BRESTART banksel PIR1 bcf PIR1,SSP1IF ; limpia el flag SSP banksel SSP1CON2 bsf SSP1CON2,RSEN ; Genera condición de RESTART banksel PIR1 btfss PIR1,SSP1IF ; Comprueba final de operación goto $-1 ; Sino, continua comprobando retlw 0 ;*******************Stop bit subroutine*************************** ; Esta rutina genera una condición de STOP ; ;***************************************************************** BSTOP banksel PIR1 bcf PIR1,SSP1IF ; limpia el flag SSP banksel SSP1CON2 bsf SSP1CON2,PEN ; Genera condición de STOP banksel PIR1 btfss PIR1,SSP1IF ; Comprueba final de operación goto $-1 ; Sino, continua comprobando retlw 0 ;*******************Subrutina de Transmisión de DATOS ************ ; Esta subrutina transmite el byte almacenado ; en la variable DATAO al dispositivo EEPROM. ;*************************************************************** TX banksel PIR1 bcf PIR1,SSP1IF ; limpia el flag SSP banksel datao movf datao,W ; Copia datao a WREG banksel SSP1BUF movwf SSP1BUF ; Se envía los datos a escribir banksel PIR1 btfss PIR1,SSP1IF ; Comprueba final de operación goto $-1 ; Sino, continua comprobando retlw 0 ;*******************Rutina de recepción de datos***************** ; Esta subrutina lee un byte del dispositivo EEPROM ; lo guarda en DATAI ;**************************************************************** RX banksel PIR1 bcf PIR1,SSP1IF ; limpia el flag SSP banksel SSP1CON2 bsf SSP1CON2,RCEN ; Inicia la recepción del byte banksel PIR1 btfss PIR1,SSP1IF ; Comprueba final de operación goto $-1 ; Sino, continua comprobando banksel SSP1BUF movf SSP1BUF,W ; Copia el yte a WREG banksel datai movwf datai ; Copia WREG a DATAI 64 Capítulo VI. Apéndice. Código del programa banksel bcf banksel bsf banksel btfss goto retlw PIR1 PIR1,SSP1IF SSP1CON2 SSP1CON2,ACKEN PIR1 PIR1,SSP1IF $-1 ; limpia el flag SSP ; Genera el bit de ACK/NO ACK ; operación completada? ; Sino, continua comprobando 0 ;*******************Subrutina de escritura en EEPROM************* ; Esta subrutina escribe en las posiciones de memoria ; proporcionadas por el usuario en las variables: ; address_high y address_low ;***************************************************************** ByteWrite call BSTART ; Genera condición de START banksel WRITE_ADDR movlw WRITE_ADDR ; Byte de control escritura banksel datao movwf datao ; lo copiamos a los datos de salida call TX ; enviamos el byte de control ; Enviar el byte address high banksel movf movwf call address_high address_high,0 datao TX ; Enviar el byte address low banksel movf movwf call ; Enviar el byte banksel movf movwf call address_low address_low,0 datao TX de datos data_to_write data_to_write,0 datao TX ; Generar condición de STOP call call call retlw BSTOP Poll Add_mannager ; Siguiente posición de memoria 0 ;*******************Subrutina de Lectura********************* 65 Capítulo VI. Apéndice. Código del programa ; Esta subrutina lee de las posiciones de memoria ; proporcionadas por el usuario en las variables: ; address_high y address_low ;***************************************************************** ByteRead call BSTART ; Generar condición de START ; Enviar Byte de control de escritura banksel WRITE_ADDR movlw WRITE_ADDR ; Byte de control de escritura banksel datao movwf datao call TX ; Enviar byte de control ; Enviar posición banksel movf movwf call de memoria alta address_high address_high,0 datao TX ; Enviar posición banksel movf movwf call de memoria baja address_low address_low,0 datao TX ; Generar condición de RESTART call BRESTART ; Enviar byte de control de lectura banksel READ_ADDR movlw READ_ADDR banksel datao movwf datao call TX ; Leer byte de datos banksel SSP1CON2 bsf SSP1CON2,ACKDT call RX call BSTOP retlw ;Enviar señal de NO ACK ; Leer datos ; Generar condición de Stop 0 ;*******************Subrutina de encuesta de ACK **************** ; Esta subrutina encuesta el dispositivo EEPROM para ; comprobar si el ciclo de escritura interno se ha ; completado. ;***************************************************************** Poll banksel pollcnt movlw .40 movwf pollcnt ;Máximo 40 encuestas polling call BRESTART ; Generar bit de START banksel WRITE_ADDR movlw WRITE_ADDR ; byte de control banksel datao movwf datao call TX banksel SSP1CON2 btfss SSP1CON2,ACKSTAT ; El bit de ACK a nivel bajo? 66 Capítulo VI. Apéndice. Código del programa goto banksel decfsz goto exitpoll call retlw exitpoll ; si es SI, stop polling ; Sino, continua encuestando pollcnt pollcnt,F polling ; esta el poll_counter a cero? ; sino, encuentra otra vez BSTOP ; Generar bit de STOP 0 ;*******************Address Mannager subroutine**************** ; Esta subrutina gestiona la asignacion de posiciones de ; memoria en la operacion de escritura. ;***************************************************************** Add_mannager decfsz goto decfsz goto goto full_memory sleep inc_low banksel incf goto inc_high banksel incf clrf goto fin retlw ad_low_counter,F inc_low ad_high_counter,F inc_high full_memory address_low address_low,1 fin address_high address_high,1 address_low fin 0 ;*******************Subrutina de lectura de acelerómetro********* ; Esta subrutina lee el estado del acelerómetro. ; Se le indica el registro que se desea leer, devuelve ; el valor a través de la variable ORIENTACION ;***************************************************************** Read_accel call banksel movlw banksel movwf call BSTART WRITE_ACCEL_ADDR WRITE_ACCEL_ADDR datao datao TX ; Enviar dirección de registro banksel reg_addr movf reg_addr,0 movwf datao call TX ;Indicar el registro ; Generar Restart condition call BRESTART ; Enviar byte de control 67 Capítulo VI. Apéndice. Código del programa banksel movlw banksel movwf call ; Leer byte banksel bsf call movf movwf call retlw READ_ACCEL_ADDR READ_ACCEL_ADDR datao datao TX ;byte de control SSP1CON2 SSP1CON2,ACKDT RX datai,0 orientacion BSTOP ; Leer datos ; Generar Stop CONDITION 0 ;*******************Subrutina de escritura en acelerómetro********* ; Esta subrutina permite modificar el valor de un registro ; del acelerómetro. ;***************************************************************** Write_accel call banksel movlw banksel movwf call BSTART WRITE_ACCEL_ADDR WRITE_ACCEL_ADDR datao datao TX ; Generar Start condition ; enviar dirección de regitro banksel reg_addr movf reg_addr,0 movwf datao call TX ; Enviar byte banksel movf movwf call data_to_write data_to_write,0 datao TX ; Generar Stop condition call BSTOP retlw 0 ;//////////////////////////////////////////////////////////////////// ;/////////////////// LEER EJES X Y Z /////////////////////////////// ;// Escribe el valor MSB de los ejes X, Y y Z de la /////////////// ;// orientacion del acelerometro. Requiere de 3 posiciones /////// ;// de memoria consecutivas ////// ;/////////////////////////////////////////////////////////////// ;Lee_ejes inicio banksel movlw movf movlw movwf registro 0x01 registro .4 var ;iniciamos leyendo 0x01 ;variable de control 68 Capítulo VI. Apéndice. Código del programa loop decfsz goto goto operacion banksel movf banksel movwf call banksel movf banksel movwf call banksel incf incf goto final var,F operacion final registro registro,0 reg_addr reg_addr Read_accel orientacion orientacion,0 data_to_write data_to_write ByteWrite registro registro registro loop ;Check if finished looping ;Copiamos el valor del registro a ; reg_addr ;Escribimos el valor de la ; orientacion en la EEPROM ;Incrementamos 2 veces el registro ;los valores de 0x01, 0x03 y 0x05 retlw 0 END 69