73
Implementación de interfaz I 2 C 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.

Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

  • Upload
    others

  • View
    14

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

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.

Page 2: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

“Como no tenemos nada más precioso que el tiempo,

no hay mayor generosidad que perderlo sin tenerlo en cuenta”

Page 3: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Í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

1.3. INTEGRACIÓN DE EEPROM Y SENSORES CON EL BUS I2C ............................................................................ 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.1. PROTOCOLO I2C ............................................................................................................................ 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

Page 4: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

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

Page 5: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo I. Introducción

1

CAPITULO I

Introducción

_______________________________

Page 6: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo I. Introducción

2

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

FUNCIONAMIENTOSEÑAL ELÉCTRICA

QUE GENERAN

RANGO DE VALORES QUE

PROPORCIONAN

NIVEL DE INTEGRACIÓN

TIPO DE VARIABLE FÍSICA

ACTIVO PASIVO

ANALÓGICO DIGITAL TEMPORAL

DE MEDIA ON - OFF

DISCRETOS INTEGRADOS INTELIGENTES

Figura 1.1. Características de los sensores

Page 7: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo I. Introducción

3

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.

Page 8: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo I. Introducción

4

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

Page 9: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo I. Introducción

5

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

Page 10: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo I. Introducción

6

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.

Page 11: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo I. Introducción

7

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.

Page 12: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo I. Introducción

8

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

Page 13: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo I. Introducción

9

[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

Page 14: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo II. Bus I2C implementado con PIC

10

CAPITULO II

Bus I2C implementado con PIC

______________________________

Page 15: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo II. Bus I2C implementado con PIC

11

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.

Figura 2.1. Esquema de conexión I2C Master-Slave

Page 16: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo II. Bus I2C implementado con PIC

12

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.

Page 17: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo II. Bus I2C implementado con PIC

13

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.

Page 18: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo II. Bus I2C implementado con PIC

14

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.

Page 19: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo II. Bus I2C implementado con PIC

15

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

Page 20: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo II. Bus I2C implementado con PIC

16

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.

Page 21: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo II. Bus I2C implementado con PIC

17

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

Page 22: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo II. Bus I2C implementado con PIC

18

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

Page 23: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

19

CAPITULO III

Aplicación para escritura de

EEPROM externa con I2C

______________________________

Page 24: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

20

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

Page 25: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

21

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

Page 26: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

22

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.

REGULADOR LINEAL

UA78M33CDCYG3

ALIMENTACIÓN

USB

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.

Page 27: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

23

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.

Page 28: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

24

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, e l

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.

Page 29: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

25

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.

Page 30: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

26

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

Page 31: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

27

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 OSCCON

bcf OSCCON,6

bsf OSCCON,5

bsf OSCCON,4

bsf OSCCON,3

;CONFIGURACIÓN DE PUERTOS

;PORTB

banksel TRISB

movlw B'00010010'

movwf TRISB

;PORTA

banksel PORTA

clrf PORTA

;CONFIGURACIÓN I2C MSSP1

;SSP1STAT

banksel SSP1STAT

movlw B'10000000'

movwf SSP1STAT

;SSP1ADD

banksel SSP1ADD

movlw B'00001001'

movwf SSP1ADD

;SSP1CON2

banksel SSP1CON2

clrf SSP1CON2

;SSP1CON1

banksel SSP1CON1

movlw B'00101000'

movwf SSP1CON1

;CONFIGURACIÓN 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

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

Page 32: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

28

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 PIR1

bcf PIR1,SSP1IF

banksel SSP1CON2

bsf SSP1CON2,SEN

banksel PIR1

btfss PIR1,SSP1IF

goto $-1

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

Page 33: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

29

28.24 28.25 28.26 28.27 28.28 28.29 28.3 28.31 28.32 28.330

0.5

1

1.5

2

2.5

3

Time (ms)

Am

plit

ud

e (V

)

Start Condition

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 PIR1

bcf PIR1,SSP1IF

banksel SSP1CON2

bsf SSP1CON2,RSEN

banksel PIR1

btfss PIR1,SSP1IF

goto $-1

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

bcf PIR1,SSP1IF

banksel SSP1CON2

bsf SSP1CON2,PEN

banksel PIR1

btfss PIR1,SSP1IF

goto $-1

retlw 0

Código 3.4.Función que genera la condición de parada (STOP CONDITION).

Page 34: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

30

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.

29.52 29.53 29.54 29.55 29.56 29.57 29.58 29.59 29.6 29.6100.5

11.5

2

2.5

3

Time (ms)

Am

plit

ud

e (V

)

Stop Condition

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 PIR1

bcf PIR1,SSP1IF

banksel datao

movf datao,W

banksel SSP1BUF

movwf SSP1BUF

banksel PIR1

btfss PIR1,SSP1IF

goto $-1

retlw 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

Page 35: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

31

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 pollcnt

movlw .40

movwf pollcnt

polling

call BRESTART

banksel WRITE_ADDR

movlw WRITE_ADDR

banksel datao

movwf datao

Page 36: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

32

call TX

banksel SSP1CON2

btfss SSP1CON2,ACKSTAT

goto exitpoll

banksel pollcnt

decfsz pollcnt,F

goto polling

exitpoll

call BSTOP

retlw 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 ad_low_counter,F

goto inc_low

decfsz ad_high_counter,F

goto inc_high

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

Page 37: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

33

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 LA DIRECCIÓN ALTA

banksel address_high

movf address_high,0

movwf datao

call TX

; SE ENVIA EL BYTE CON LA DIRECCIÓN BAJA

banksel address_low

movf address_low,0

movwf datao

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

Page 38: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

34

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 LA DIRECCIÓN ALTA

banksel address_high

movf address_high,0

movwf datao

call TX

; SE ENVIA EL BYTE CON LA DIRECCIÓN BAJA

banksel address_low

movf address_low,0

movwf datao

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

Page 39: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

35

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 Init

; OPERACIÓN DE ESCRITURA

banksel address_high

movlw 0x00

movwf address_high

movlw 0x00

movwf address_low

movf orientacion,0

movwf data_to_write

call ByteWrite

; OPERACIÓN DE LECTURA

call Init

banksel address_high

movlw 0x00

movwf address_high

movlw 0x00

movwf address_low

call 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

Page 40: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo III. Aplicación para escritura de EEPROM externa con I2C

36

[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

Page 41: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

37

CAPITULO IV

Aplicación para lectura de un

acelerómetro MMA8453Q

______________________________

Page 42: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

38

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.

Page 43: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

39

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

Page 44: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

40

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

pin

MMA8453Q Conexión recomendada

1 VDDIO Alimentación de entre 1.62 a 3.6 V

2 BYPASS Condensador de 0.1μF conectado a GND

3 NC Mantener desconectado

4 SCL Resistor de Pull-up de 4.7Ω requerida por el bus I2C

5 GND Conectar a GND

6 SDA Resistor de Pull-up de 4.7Ω requerida por el bus I2C

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

8 EN Dejar desconectado, conectar a VDD o a GND

9 INT2 Conectar al MCU

10 GND Conectar a GND

11 INT1 Conectar al MCU

12 GND Conectar a GND

13 NC Dejar desconectado, conectar a VDD o a GND

14 VDD Entrada analógica de entre 1.95 y 3.6 V

15 NC Dejar desconectado, conectar a VDD o a GND

16 NC Dejar desconectado, conectar a VDD o a GND

Page 45: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

41

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 ASLP_RATE2 Frecuencia (Hz)

0 0 50

0 1 12.5

Page 46: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

42

1 0 6.25

1 1 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 DR1 DR0 ODR Periodo

0 0 0 800 Hz 1.25 ms

0 0 1 400 Hz 2.5 ms

0 1 0 200 Hz 5 ms

0 1 1 100 Hz 10 ms

1 0 0 50 Hz 20 ms

1 0 1 12.5 Hz 80 ms

1 1 0 6.25 Hz 160 ms

1 1 1 1.56 Hz 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.

Page 47: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

43

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] Descripción

0 0 Portrait Up. Dispositivo en posición vertical respecto a la

orientación normal. Valor por defecto.

0 1 Portrait Down. Dispositivo en posición vertical invertida

1 0 Landscape right. Dispositivo en modo horizontal hacia la derecha

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

Page 48: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

44

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.

Figura 4.9. Distribución del byte de MSB del eje Y

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.10. Distribución del byte de MSB del eje Z

Page 49: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

45

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 BSTART

banksel WRITE_ACCEL_ADDR

movlw WRITE_ACCEL_ADDR

banksel datao

movwf datao

call TX

; Se envia la dirección del registro

banksel reg_addr

movf reg_addr,0

movwf datao

call TX

; Se envía el valor que se desea escribir

banksel data_to_write

movf data_to_write,0

movwf datao

call TX

; Señal de STOP

call BSTOP

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

Page 50: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

46

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.

28.2 28.25 28.3 28.35 28.4 28.45 28.5 28.55 28.6

0.5

1.5

2.5

Time (ms)

Am

plit

ud

e (V

)

0

1

2

3

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

Page 51: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

47

movf reg_addr,0

movwf datao

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

retlw 0

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.

Page 52: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

48

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.

29.3 29.35 29.4 29.45 29.5 29.55 29.6 29.65 29.7 29.75

0

0.5

1

1.5

2

2.5

3

Time (ms)

Am

plit

ud

e (V

)

Stop Condition

NACK

Restart Condition Byte de control Byte de lectura

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.

Page 53: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

49

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 DE “PORTRAIT/LANDSCAPE STATUS”

banksel reg_addr

movlw 0x10

movwf reg_addr

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

Page 54: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

50

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 del

dispositivo Valor del registro

Page 55: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

51

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 del

dispositivo Valor del registro ORIENTACION

Page 56: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

52

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 reg_addr

movlw 0x00

movwf reg_addr

call Read_accel

banksel orientacion

movf orientacion,0

banksel data_to_write

Page 57: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

53

movwf data_to_write

banksel address_high

movlw 0x00

movwf address_high

movlw 0x00

movwf address_low

call ByteWrite

banksel address_high

movlw 0x00

movwf address_high

movlw 0x00

movwf address_low

call ByteRead

banksel datai

movf datai,0

banksel eje_x

movwf eje_x

banksel reg_addr

incf reg_addr

incf 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

Page 58: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

54

movwf address_high

movlw 0x02

movwf address_low

call ByteRead

banksel datai

movf datai,0

banksel eje_z

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

Page 59: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

55

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

Page 60: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo IV. Aplicación para lectura de un acelerómetro MMA8453Q

56

[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

Page 61: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo V. Conclusiones

57

CAPITULO V

Conclusiones

______________________________________________________________________

Page 62: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo V. Conclusiones

58

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.

Page 63: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo VI. Apéndice. Código del programa

59

CAPITULO VI

Apéndice

______________________________________________________________________

Page 64: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo VI. Apéndice. Código del programa

60

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

Page 65: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo VI. Apéndice. Código del programa

61

;datai equ 20h ; Datos de entrada Buffer

;datao equ 21h ; Datos de salida Buffer

;eje_x equ 22h

;address_high equ 23h ; Direccion alta en la EEprom

;address_low equ 24h ; Direccion baja en la eeprom

;data_to_write equ 25h ; Datos que se escribiran en EEprom

;eje_y equ 26h

;eje_z equ 27h

;reg_addr equ 28h ; Direccion del registro accel

;orientacion equ 29h ; Dato leido del acelerometro

;registro equ 30h ; Variable para la rutina Lee_ejes

;var equ 31h ; Variable para la rutina Lee_ejes

;pollcnt equ 32h ; Contador de encuesta

;ad_high_counter equ 33h ; Variables la gestion de memoria

;ad_low_counter equ 34h ; 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 ORG 0xF000

DE "MCHP" ; Place 'M' 'C' 'H' 'P' at address 0,1,2,3

;---------------------------------------------------------------------

; RESET VECTOR

;---------------------------------------------------------------------

ORG 0x0000 ; processor reset vector

PAGESEL START

GOTO START ; 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 Init ; Initializar dispositivo

banksel reg_addr

movlw 0x11 ;Portrait/LandscapE configuration Register

movwf reg_addr

banksel data_to_write

Page 66: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo VI. Apéndice. Código del programa

62

movlw b'11000000' ;PL detection habilitada

movwf data_to_write

call Write_accel ;SE TIENE QUE HACER EN MODO STANDBY

banksel reg_addr

movlw 0x2A ;CONTROL1 Register

movwf reg_addr

banksel data_to_write

movlw b'00000001' ;WAKE mode

movwf data_to_write

call Write_accel

;//////////////////LEER PL STATUS DEL ACELEROMETRO///////////////

banksel reg_addr

movlw 0x10 ;Portrait/LandscapE STATUS

movwf reg_addr ;NEWLP LO 0 0 0 LAPO[1] LAPO[1] BAFRO

call Read_accel

;//////////////////LEER EJES DEL ACELEROMETRO//////////////////////

banksel address_high ; Indicamos la posición de memoria

movlw 0x00 ; en la cual se quiere iniciar la

movwf address_high ; escritura

movlw 0x00

movwf address_low

call Lee_ejes

;//////////////////LEER sysMode y WHO_AM_I//////////////////////

banksel reg_addr

movlw 0x0B ;READ SYSMODE

movwf reg_addr

call Read_accel ; 00000001 -> OK

banksel reg_addr

movlw 0x0D ;Who AM I?

movwf reg_addr

call Read_accel ; 00111010 -> OK

;////////////////// ESCRIBIR Y LEER DE EEPROM ////////////////////

banksel address_high

movlw 0x00

movwf address_high

movlw 0x00

movwf address_low

movf orientacion,0

movwf data_to_write

call ByteWrite ;Escribimos el valor de la orientacion en

;la EEPROM

;*******************Init subroutine*******************************

; Inicializacion de registros

;*****************************************************************

Init

banksel OSCCON

bsf OSCCON,6

bsf OSCCON,5

Page 67: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo VI. Apéndice. Código del programa

63

bcf OSCCON,4

bsf 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 TRISA ;ya estan conectados a GND

movlw b'00100000'

movwf TRISA ;Pongo A0, A1 y A2 a 0

banksel PORTA

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

Page 68: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo VI. Apéndice. Código del programa

64

; 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

Page 69: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo VI. Apéndice. Código del programa

65

banksel PIR1

bcf PIR1,SSP1IF ; limpia el flag SSP

banksel SSP1CON2

bsf SSP1CON2,ACKEN ; Genera el bit de ACK/NO ACK

banksel PIR1

btfss PIR1,SSP1IF ; operación completada?

goto $-1 ; Sino, continua comprobando

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

movf address_high,0

movwf datao

call TX

; Enviar el byte address low

banksel address_low

movf address_low,0

movwf datao

call TX

; Enviar el byte de datos

banksel data_to_write

movf data_to_write,0

movwf datao

call TX

; Generar condición de STOP

call BSTOP

call Poll

call Add_mannager ; Siguiente posición de memoria

retlw 0

;*******************Subrutina de Lectura*********************

Page 70: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo VI. Apéndice. Código del programa

66

; 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 de memoria alta

banksel address_high

movf address_high,0

movwf datao

call TX

; Enviar posición de memoria baja

banksel address_low

movf address_low,0

movwf datao

call 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 ;Enviar señal de NO ACK

call RX ; Leer datos

call BSTOP ; Generar condición de Stop

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

Page 71: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo VI. Apéndice. Código del programa

67

goto exitpoll ; si es SI, stop polling

; Sino, continua encuestando

banksel pollcnt

decfsz pollcnt,F ; esta el poll_counter a cero?

goto polling ; sino, encuentra otra vez

exitpoll

call BSTOP ; Generar bit de STOP

retlw 0

;*******************Address Mannager subroutine****************

; Esta subrutina gestiona la asignacion de posiciones de

; memoria en la operacion de escritura.

;*****************************************************************

Add_mannager

decfsz ad_low_counter,F

goto inc_low

decfsz ad_high_counter,F

goto inc_high

goto 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

;*******************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 BSTART

banksel WRITE_ACCEL_ADDR

movlw WRITE_ACCEL_ADDR

banksel datao

movwf datao

call TX

; Enviar dirección de registro

banksel reg_addr ;Indicar el registro

movf reg_addr,0

movwf datao

call TX

; Generar Restart condition

call BRESTART

; Enviar byte de control

Page 72: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo VI. Apéndice. Código del programa

68

banksel READ_ACCEL_ADDR

movlw READ_ACCEL_ADDR ;byte de control

banksel datao

movwf datao

call TX

; Leer byte

banksel SSP1CON2

bsf SSP1CON2,ACKDT

call RX ; Leer datos

movf datai,0

movwf orientacion

call BSTOP ; Generar Stop CONDITION

retlw 0

;*******************Subrutina de escritura en acelerómetro*********

; Esta subrutina permite modificar el valor de un registro

; del acelerómetro.

;*****************************************************************

Write_accel

call BSTART ; Generar Start condition

banksel WRITE_ACCEL_ADDR

movlw WRITE_ACCEL_ADDR

banksel datao

movwf datao

call TX

; enviar dirección de regitro

banksel reg_addr

movf reg_addr,0

movwf datao

call TX

; Enviar byte

banksel data_to_write

movf data_to_write,0

movwf datao

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

movlw 0x01

movf registro ;iniciamos leyendo 0x01

movlw .4

movwf var ;variable de control

Page 73: Implementación de interfaz I2C con microcontroladores PIC para …deeea.urv.cat/public/PROPOSTES/pub/pdf/1934pub.pdf · 2012-10-08 · C con microcontroladores PIC para sensores

Capítulo VI. Apéndice. Código del programa

69

loop

decfsz var,F ;Check if finished looping

goto operacion

goto final

operacion

banksel registro

movf registro,0

banksel reg_addr

movwf reg_addr ;Copiamos el valor del registro a

call Read_accel ; reg_addr

banksel orientacion

movf orientacion,0

banksel data_to_write

movwf data_to_write

call ByteWrite ;Escribimos el valor de la

banksel registro ; orientacion en la EEPROM

incf registro ;Incrementamos 2 veces el registro

incf registro ;los valores de 0x01, 0x03 y 0x05

goto loop

final

retlw 0

END