Capítulo I. Introducción

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