1 Portada

Anuncio
Prácticas del uso del bus I2C para PIC
16F876 de Microchip.
AUTORA: Natalia Parody López
DIRECTOR: Nicolau Cañellas Alberich
FECHA: Enero/ 2006
1.ÍNDICE
2.- MEMORIA DESCRIPTIVA
6
2.1. INTRODUCCIÓN
2.1.1. Antecedentes
2.1.2. Objetivos
7
7
7
2.2. SOLUCIÓN ADOPTADA
2.2.1. Los microcontroladores. Consideraciones previas
2.2.2. Ventajas de los diseños basados en microcontroladores
2.2.3. Arquitectura básica de los µC
2.2.3.1.
CPU (Central Process Unit)
2.2.3.2.
Memoria de programa
2.2.3.3.
Memoria de datos
2.2.3.4.
Puertos entrada / salida
2.2.3.5.
Watch-Dog
2.2.3.6.
Brown-out
2.2.3.7.
Contador / timer
2.2.3.8.
ADC y DAC
2.2.3.9.
PWM
2.2.3.10.
Comunicación Serie
2.2.4. Microcontroladores PIC
2.2.4.1.
Diferencias con otros µC
2.2.5. Características de los microcontroladores PIC
2.2.5.1.
Famílias PICmicro
2.2.5.2.
¿Que PIC escogemos?
2.2.5.3.
PIC 16F876 y 16F877
9
9
10
11
11
11
12
12
13
13
13
13
13
13
14
14
14
15
16
16
2.3. PRÁCTICAS DE LA ASIGNATURA
2.3.1. Descripción del MPLAB
2.3.1.1.
Introducción programa
2.3.1.2.
Funcionamiento del MPLAB IDE
2.3.3. Explicación del Kit MPLAB-ICD
2.3.3.1.
Introducción
2.3.3.2.
Características del MPLAB-ICD Module
2.3.3.3.
Características del MPLAB-ICD Header
2.3.4. Placa base de laboratorio
2.3.4.1
Descripción de la paca usada en laboratorio
2.3.4.2.
Regulador de tensión
2.3.5. Descripción Pantalla LCD
2.3.5.1.
Introducción
2.3.5.2.
Que pantalla LCD vamos a utilizar?
2.3.5.3.
Funcionamiento de la pantalla LCD
2.3.6. Descripción teclado
2.3.6.1.
Introducción
2.3.6.2.
Funcionamiento del teclado
18
18
18
19
21
21
21
22
23
23
23
24
24
24
24
26
26
26
2
2.4. EL BUS I2C
2.4.1. Introducción
2.4.1.1
Introducción a las especificaciones I2C
2.4.2 El concepto del bus I2C
2.4.3 Generalidades
2.4.3.1.
Características de una conexión en colector abierto
2.4.3.2.
La transferencia del bit
2.4.3.3.
Instrucciones en el bus I2C
2.4.4. Arbitraje y generación de señales de reloj
2.4.4.1
Sincronización
2.4.4.2
Arbitraje
2.4.5. Formato
2.4.6 Direccionamiento
2.4.6.1.
Explicación del 1er byte de direccionamiento
2.4.7 Especificaciones eléctricas y de tiempos
28
28
30
30
31
32
33
33
36
36
37
39
41
42
44
2.5. DESCRIPCIÓN FUNCIONAL DE LAS PRÁCTICAS I2C
2.5.1. Visión general
2.5.2 Descripción práctica 1.
2.5.3 Descripción práctica 2.
2.5.4 Descripción del hardware utilizado en las prácticas
2.5.4.1.
Memoria EEPROM M24C01
2.5.4.2.
El teclado
2.5.4.3.
Pantalla LCD
2.5.5. Enunciados de las prácticas
2.5.5.1. Práctica num.1:
Comunicación I2C con EEPROM M24C01
2.5.5.2. Práctica num.2:
Comunicación I2C entre dos microcontroladores PIC
45
45
45
46
47
47
48
49
51
3.- MEMORIA DE CÁLCULO
51
58
66
3.1. CÁLCULOS DEL PROGRAMA ASM
67
3.2. CÁLCULOS DE LA COMUNICACIÓN I2C
68
3.3. CÁLCULO DE LOS CIRCUITOS ELÉCTRICOS
70
4.- PRESUPUESTO
71
4.1. LISTA ELEMENTOS
4.1.1. Lista de elementos del hardware de la práctica 1
4.1.2. Lista de elementos del hardware de la práctica 2
3
72
72
73
4.2. LISTA DE PRECIOS UNITARIOS
4.2.1. Lista de precios unitarios de elementos de la práctica 1
4.2.2. Lista de precios unitarios de elementos de la práctica 2
74
74
75
4.3. COSTE TOTAL
4.3.1. Coste total de la práctica 1
4.3.2. Coste total de la práctica 2
76
76
77
4.4. RESUMEN DEL PRESUPUESTO
78
5.- PLANOS
79
5.1. ESQUEMAS DE ELEMENTOS
5.1.1. Esquema Regulador fuente tensión
5.1.2. Esquema comunicación I2C
5.1.3. Conector teclado
5.1.4. Esquema conector pantalla LCD
80
80
80
81
81
5.2. ESQUEMAS PRÁCTICAS
5.2.1. Esquemas Práctica 1
5.2.2. Esquemas Práctica 2
82
82
82
ANEXOS
A. MODULO DE PUERTO SERIAL SINCRÓNICO (MSSP)
A.1. SSP en operación I2C
A.1.1. Registros para las operaciones I2C
A.1.1.1. Registro de control SSP
A.1.1.2. Registro de Control SSP2
A.1.1.3 Registro de estado SSP
A.1.1.4 Registro de desplazamiento SSP
A.1.1.5 Registro de Direcciones
A.2 Modo Esclavo
A.2.1 Direccionamiento
A.2.2. Recepción y transmisión en modo slave
A.3 Llamada General
A.4 Operación SLEEP
A.5. Efecto del Reset
A.6. Registros asociados con la operación I2C
A.7. Modo Master
A.7.1. Repetición de la señal de START
A.7.2 Secuencia de reconocimiento ACK
4
II
II
IV
IV
V
VI
VI
VI
VIII
VIII
IX
X
X
X
XIII
XIII
XVI
XX
A.7.3 La condición de STOP
B. MEMORIA EEPROM ST M24C01
B.1.
B.2.
B.3
B.4.
Descripción
B.1.1 Power on Reset: Vcc Lock-Out Write Protect
Descripción de las Señales
B.2.1 Serial Clock (SCL)
B.2.2 Serial Data (SDA)
B.2.2 Chip Enable
B.2.3 Write Control
Operaciones del dispositivo
B.3.1 Condición de Start
B.3.2 Condición de Stop
B.3.3 Bit de reconocimiento (ACK)
B.3.4 Data Input
B.3.5 Direccionamiento de memoria
B.3.6 Operaciones de escritura
B.3.7 Operaciones de lectura
Estado Inicial
C. PROGRAMAS DE LAS PRÁCTICAS .ASM
5
XX
XXIV
XXIV
XXV
XXV
XXV
XXVI
XXVI
XXVI
XXVI
XXVI
XXVII
XXVII
XXVII
XXVII
XXVII
XXX
XXXI
XXXII
Memoria Descriptiva
2. Memoria Descriptiva.
6
Memoria Descriptiva
2.1. Introducción
En este proyecto encontraremos dos prácticas para la asignatura de “Sistemes
electrònics amb microcontrolador”, en las cuales se pretende que el alumno aprenda a
programar un microcontrolador.
Estas prácticas pretenden introducir a los alumnos a la comunicación de
microcontroladores por medio de un protocolo de comunicación sencillo a la par que rápido, el
I2C, de forma que los grupos de prácticas aprendan a comunicarse con el exterior del
microcontrolador y observen que se puede comunicar cualquier microcontrolador casi con
cualquier protocolo y poder así abrir miras y no conformarnos sólo con el protocolo serie
RS232.
Para ello, este proyecto de final de carrera pretende montar el hardware y el software
adecuado para la realización de estas prácticas de comunicación
2.1.1. Antecedentes
Nuestro antecedente será un proyecto realizado para la asignatura de “Sistemes
electrònics amb microcontrolador” que realiza la simulación de una maquina de vending y se
comunica por el protocolo RS232 con otro microcontrolador
La asignatura de “Sistemes electronics amb microcontrolador” tiene 3 créditos
prácticos con lo cual este proyecto pretende complementar las prácticas ya existentes
utilizando al máximo los recursos de hardware ya existentes en estas prácticas.
2.1.2. Objetivos
La finalidad de este proyecto es realizar una serie de prácticas con el objetivo de que
los alumnos puedan utilizarlas para aprender a programar un microcontrolador mediante el
MPLAB.
Como el objetivo principal de estas prácticas es la comunicación i2c, un protocolo
multimaster y bidireccional, pretenderemos que los alumnos puedan introducirse en
interactuar con conceptos como maestro y esclavo.
También se dejan abiertas una serie de posibilidades para poder añadir diferentes
prácticas a estas para mejorar la simulación, con lo cual los alumnos podrían proponer alguna
práctica nueva o para un posible proyecto futuro que ampliase los módulos y el número de
prácticas.
Las prácticas tienen unos objetivos comunes, pero consideramos que han de
introducirse de forma paulatina, y que los alumnos obtengan unos conocimientos afianzados,
claros y simples, de forma que, una vez asimilados, los alumnos estén capacitados para poder
curiosear con otros protocolos y perder el miedo a la comunicación de periféricos.
7
Memoria Descriptiva
Las diferentes prácticas a realizar tienen como objetivos:
-
PRÁCTICA 1: A modo introductoria en la comunicación I2C realizaremos
una práctica sencilla donde comunicaremos el dispositivo master, en nuestro
caso el PIC 16F876, con el dispositivo slave, la EEPROM 24C01C. En esta
práctica solo se tendrá que realizar el programa master ya que debido a la
lógica interna de la memoria no hará falta programarla ya que la
gestionaremos desde el master.
-
PRÁCTICA 2: Realizar la comunicación i2c entre dos microcontroladores de
forma que ampliemos el concepto de esclavo, y podremos observar la
interacción entre ambos microcontroladores. Para ello se realizarán dos
programas de forma que uno de los microcontroladores se configure como
master y el otro como esclavo.
8
Memoria Descriptiva
2.2. Los microcontroladores.
2.2.1. Consideraciones previas.
Antes que nada, nos interesa saber que es un microcontrolador, así que partiremos de
las funciones que éste hace y haremos una pequeña comparación con otros dispositivos que
también hacen esas o otras funciones similares para ello, haremos unas definiciones previas:
Controlador: Dispositivo usado por control automático de un conjunto de procesos
Controlador digital: Controlador con lógica de control digital
Implementaciones de los controladores digitales:
- Lógica discreta
•
•
•
•
Baja densidad de integración
Diseño (Hardware) sencillo / medio / complejo
Poco generalizable
Coste bajo / medio / alto
- PLC (Programmable Logic Controller)
•
•
•
•
Mayor densidad de integración
Diseño (Software) sencillo
Muy generalizable
Coste elevado
- Microprocesador + RAM + ROM + Periféricos (A/D, Timers...)
•
•
•
•
Elevada densidad de integración
Diseño (Software + Hardware) medio / complejo
Generalizable
Coste bajo / medio
- Microcontrolador
•
•
•
•
Densidad de integración muy elevada
Diseño (Software + Hardware) sencillo / medio
Muy generalizable
Coste bajo
9
Memoria Descriptiva
2.2.2. Ventajas de los diseños basados en microcontroladores
•
•
•
•
•
Reducción del tamaño y precio: El elevado grado de integración de un
microcontrolador (µC) en circuito integrado permite una elevada funcionalidad
por área a bajo coste y un menor tamaño del PCB.
Elevada flexibilidad: Un mismo microcontrolador (µC) puede ser usado por un
elevado número de aplicaciones variando solo el software.
Rapidez de desarrollo: La adaptación de un µC en otra aplicación puede
consistir en adaptar el software y muy poco hardware.
Aumento de la fiabilidad: La disminución de componentes en placa hace
disminuir también los riesgos de averías.
Buenas prestaciones: Los µC usan µP que permiten la ejecución eficiente de
algoritmos de control.
2.2.3. Arquitectura básica de los µC
En este apartado se muestran todos los elementos que puede tener un µC, no quiere
decir que todos lo µC tengan estos dispositivos, esto depende de la versión del µC que
escojamos. Este µC se escoge dependiendo de las aplicaciones que necesitemos.
Fig. 1. Arquitectura de los µC
10
Memoria Descriptiva
Viendo la descripción de cada uno de los elementos que aparecen en el diagrama
anterior, se puede entender mejor.
2.2.3.1. CPU (Central Process Unit)
Es el microprocesador del sistema. Sus características y funcionalidad se definen
sobretodo a partir de tres clasificaciones:
- Clasificación en función del tamaño de los datos:
•
•
•
•
4 bit: Aplicaciones muy sencillas y muy económicas
8 bit: Aplicaciones sencillas /medias y económicas. Es el tipo de µC dominante
en el mercado
16 bit: Aplicaciones medias y coste medio
32 bit: Aplicaciones complejas y de coste elevado
- Clasificación en función del conjunto de instrucciones:
•
•
RISC (Reduced Instruction Set Code). Instrucciones sencillas y de rápida
ejecución.
CISC (Complex Instruction Set Code). Instrucciones más complejas y de mayor
tiempo de ejecución.
- Clasificación en función de la arquitectura de buses:
•
•
Von Newmann: Buses de datos y direcciones compartidos por la memoria de
datos y de programa. Simplifica el diseño y el coste.
Harvard: Buses de datos y direcciones diferentes por la memoria de datos y de
programa. Permite acceso simultáneo.
2.2.3.2. Memoria de Programa
Ésta es la memoria donde se guarda el programa que escribimos. Es una memoria que
se mantiene aunque apaguemos el sistema que la contiene. Existen diferentes tipos de
memoria de programa en función de la forma de gravarla y/o borrarla:
•
•
•
•
ROM: Dispositivo OTP grabado en fábrica
EPROM: Dispositivo OTP o borrable (con ventana)
EEPROM: Dispositivo regrabable in-system con Vpp = 12v
FLASH: Dispositivo regrabable in-system
11
Memoria Descriptiva
2.2.3.3. Memoria de datos
La podemos diferenciar en dos tipos de memoria, dependiendo de si ésta se mantiene o
no en desconectar el programa. Así tenemos:
- Memoria volátil de datos: Es la memoria donde se guardan temporalmente variables
usadas en el programa. Tenemos dos, una genérica y otra más específica:
•
•
RAM: Almacenaje de variables del programa
SFR: (Special Function Regiters). Usados para hacer servir los periféricos, las
interrupciones,...
- Memoria no volátil de datos: Es un tipo de memoria como la anterior, ya que sirve
para almacenar datos, pero con la particularidad de que éstos se mantienen en memoria. Es
muy útil, por ejemplo, para guardar en memoria algunos datos que queramos llamar desde
diversos programas, como datos de configuración o de seguridad. Existen dos tipos:
•
•
EEPROM
FLASH
2.2.3.4. Puertos de Entrada / Salida
Son los pines que sirven para la entrada y salida de datos desde o al exterior. Son
generalmente de 8 bits, aunque pueden variar según el puerto y algunos de ellos incorporan
resistencias de pull-up, la función de las cuales es evitar ponerlas exteriormente en algún tipo
de conexión, como entradas procedentes de fuentes de tensión, corriente,... donde tenemos que
controlar, por ejemplo las corrientes de entrada. Esto nos hace ahorrar especialmente espacio.
2.2.3.5. WatchDog
El WatchDog es un temporizador especial y su función es realizar un reset del
microcontrolador periódicamente para refrescarlo. Su funcionamiento no está predefinido,
sino que tenemos que introducir un código de programa para hacerlo funcionar como mejor
nos convenga y para reinicializarlo en el momento determinado.
2.2.3.6. Brown-out
El Brown-out es un circuito interno que sirve como detector de posibles errores en la
alimentación del microcontrolador, paralizando el sistema para evitar posibles daños en éste.
2.2.3.7. Contador /Timer
En este apartado definimos el contador como un contador de pulsaciones procedentes
de un reloj o un dispositivo asincrónico externo y recibidos por un pin destinado a esta
función.
12
Memoria Descriptiva
En cambio, llamamos Timer al contador de ciclos de una señal de reloj generado
internamente en el dispositivo, pudiendo programarlo como el anterior para que produzca
algún evento en el momento determinado que nos interese según lo programemos. Tanto uno
como el otro suelen incluir pre-scaler para multiplicar el valor programado y conseguir así
posibles temporizaciones más altas.
2.2.3.8. ADC y DAC
Estas opciones son una la inversa de la otra. La primera, mucho más fácil de encontrar,
se refiere a la conversión de un valor analógico procedente del exterior en uno de digital
dentro de nuestro dispositivo, por esto poder tratarlo. En cambio, el conversor digital
analógico nos interesa para transformar un valor que tenemos en formato digital en nuestro
dispositivo analógico a la salida al exterior. Pensamos que las señales externas pueden estar en
los dos formatos, mientras que en nuestro microcontrolador sólo las podemos tratar en formato
digital, de forma que es lógico que el A/D sea en la dirección exterior-interior y el D/A en
dirección inversa.
2.2.3.9. PWM
El PWM (Pulse Width Modulator) es, como su nombre indica, un generador de pulsos
de anchura variable, útil para controles del mismo tipo haciendo la función de duty-cycle, es
decir, variaciones en las duraciones de los semiciclos positivos y negativos para obtener
tensiones medias variables y conseguir así, por ejemplo, controlar la velocidad de un motor
DC.
También existe la posibilidad de variar la frecuencia de estos pulsos y conseguir así,
por ejemplo, emitir diferentes sonidos en una aplicación.
2.2.3.10. Comunicaciones Serie
Los microcontroladores son capaces de enviar o recibir datos del exterior por medio de
las comunicaciones serie. Dependiendo del microcontrolador, éstos pueden ser:
•
•
•
•
•
•
SPI (Serial Peripherical Interface)
I2 C (Inter-Integrated Circuit)
UART (Universal Asynchronous Receiver-Transmiter)
USART (Universal Synchronous-Asynchronous Receiver-Transmiter)
CAN (Controller Area Network)
USB (Universal Serial Bus)
13
Memoria Descriptiva
2.2.4. Microcontroladores PIC
Un PIC es un microcontrolador fabricado por Microchip Inc. De este fabricante de
µC’s será el nuestro. Aparte de este fabricante existen diferentes fabricantes de
microcontroladores, National, Motorola, Intel, Zilog, Thomson.
2.2.4.1. Diferencias con otros µC.
Las principales diferencias entre los PIC y otras marcas es que tienen gran variedad de
modelos que permiten seleccionar el que más convenga para tu proyecto. Que tienen gran
variedad de herramientas para desarrollar hardware y software. Por su longitud de palabra de
12 bits son los que menos espacio ocupan en la memoria de instrucciones. Y son bastante más
rápidos que la mayoría.
Después de estas diferencias parece que los PIC son los mejores, cosa que no es verdad
para aplicaciones muy especificas en los que las otras marcas pueden dar unas prestaciones
más elevadas.
2.2.5. Características de los microcontroladores PIC
•
RISC (Reduced Instruction Code)
o Gama baja (PIC 16C5X) 33 instrucciones
o Gama media (PIC 16CXXX) 35 instrucciones
o Gama alta (PIC 17CXXX/18CXXX) 58/77 instrucciones
•
Arquitectura Harvard (Buses diferentes para las memorias de datos y
direcciones)
o Memoria de datos de 8 bits
o Memoria de programa de 12/14/16 bits
Arquitectura Pipeline
o Todas las instrucciones ocupan 1 palabra de instrucción
o Ejecución de todas las instrucciones en 2 ciclos
o Throghput 1 ciclo de instrucción, excepto saltos que son 2 ciclos
•
•
•
•
•
•
•
•
•
Pila Hardware
WatchDog Timer (WDT)
Power on Reset (POR)
Modo de bajo consumo (SLEEP)
Líneas E/S de alta corriente (20/25 mA)
Protección de código
Número de serie/código de identificación
Programación:
o C = CMOS OTP/EPROM
o CR = CMOS ROM
o CE = CMOS OTP/EPROM+EEPROM
14
Memoria Descriptiva
o
o
o
o
o
F = FLASH
HV = High Voltage (15v)
LF = Low Voltage Flash
LC = Low Voltage OTP
LCR = Low Voltage ROM
2.2.5.1. Familias PICmicro
Seguidamente se muestran las familias PIC pertenecientes a la marca Microchip, a
partir de las características de las cuales escogemos el modelo más apropiado para nuestra
aplicación.
•
Familia PIC 16C5X
o 12-bit program word
o Familia base
o 2 Niveles de pila hardware
o No interrupciones
o 1 Timer-8bits + WDT
•
Familia PIC 12C5XXX
o 12-bit/14-bit program word
o EEPROM
o Interrupciones
o 1 Timer-8bits + WDT
•
Familia PIC 16CXXX, 16 FXXX
o 14-bit program word
o Prestaciones medias
o Gran variedad de periféricos on-chip: Comparadores, PWM, 3 Timers,
Conversores A/D, EEPROM de datos, USART,...
o 8 Niveles de pila hardware
o Interrupciones internas y externas
•
Familia PIC 17CXXX
o 14-bit program word
o Otras prestaciones
o Gran variedad de periféricos on-chip: Comparadores, PWM, 3 Timers,
Conversores A/D, EEPROM de datos, USART,...
o 16 Niveles de pila hardware
o Interrupciones vectorizadas
Familia PIX 18CXXX
o 16-bit program word
o Muchas otras prestaciones (10 MIPS)
o Gran variedad de periféricos on-chip: Comparadores, PWM, 3 Timers,
Conversores A/D, EEPROM de datos, USART,...
o 32 Niveles de pila hardware
•
15
Memoria Descriptiva
o Interrupciones vectorizadas (internas y externas)
2.2.5.2. ¿Que PIC escogemos?
Como hemos explicado anteriormente, el PIC a escoger será 16F876 debido a que
actualmente en las clases prácticas ya se utiliza este microcontrolador, con lo cual tendremos
ya los microcontroladores e incluso los kits del ICD-DEBUGER, con lo que nos podemos
ahorrar una gran parte del presupuesto.
También lo elegimos ya que es un micro de gama media. Con lo cual tenemos
funciones de sobra en el micro para poder realizar las prácticas diseñadas, he incluso sirve
para posteriores ampliaciones, ya que no gastamos todos los recursos que nos da el
microcontrolador.
Se utilizarán dos PIC debido a que queremos hacer una segunda práctica de
comunicación por medio del protocolo i2c, de los cuales uno de ellos se utilizará para la
primera práctica de comunicación con la EEPROM.
2.2.5.3. PIC 16F876 y 16F877
A continuación se exponen las características principales de estos microprocesador.
Estos PIC’s disponen de:
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Arquitectura Harvard (Memoria de datos y programa separados)
Memoria de datos de 8 bit
Memoria de programa de 14 bit
Líneas E/S de alta corriente
Memoria RAM de 368 Bytes
Memoria de datos EEPROM de 256 Bytes
Memoria FLASH de programa de 14336 Bytes (14bit*8192 word)
3 Puertos de Entrada/Salida (1 de 6 bits, 2 de 8bits) en el 16F876 y 5 Puertos de salida
en el 16F877 (1 de 3 bits, 1 de 6 bits, 3 de 8 bits) en el 16F877
WatchDog (Temporizador especial que hace un reset periódicamente)
Timer de 16bit
2 Timer de 8 bit
5 conversores A/D de 10 bits en el 16F876 y 8 conversores A/D de 10 bits en el
16F877
1 Puerto Serie para comunicación
1Puerto Paralelo para comunicación en el 16F877
Posibilidades de interrupciones internas / externas
Posibilidad de interrupción del Puerto Serie
16
Memoria Descriptiva
Figura 2. Diagrama de bloques del PIC 16F876
17
Memoria Descriptiva
2.3. Prácticas de la asignatura
Para la realización de estas prácticas usaremos un entorno como el del laboratorio de la
asignatura de “Sistemas electrónicos con microcontrolador”. Conviene entonces explicar el
programa que utilizaremos, MPLAB, así como los dispositivos que conectaremos el teclado, la
pantalla LCD y el kit MPLAB-ICD.
2.3.2. Descripción del MPLAB
2.3.2.1. Introducción programa
En este apartado explicamos el programa que tienen que utilizar los alumnos para
programar y realizar las pruebas sobre el µC.
Hay varios programas en la página de microchip, la relación de estos es:
Development
Tools
Simulator
Part
Number
Linker
Demo
Integrated Free
Library Development Download Download Compiler Assembler
Environment Available Available
MPLAB®
IDE v6.60
Yes
SW007002
Yes
Yes
Yes
Yes
No
No
Yes
MPLAB C18 Yes
Application
No
Maestro
Software
MPLAB C30 Yes
MPLAB
Visual Device
Initializer
MPLAB C17 Yes
SW006011
Yes
Yes
No
No
Yes
Yes
Yes
Motor Control
Graphical
User Interface
(MC-GUI)
FilterLab
filter
design No
software
Yes
Yes
SW006012
Yes
Yes
No
Yes
Yes
Yes
Yes
SW006010
Yes
Yes
No
No
Yes
Yes
Yes
No
No
No
Yes
No
No
No
Tabla1. Relación de programas
Como se puede comprobar, el programa que vamos a utilizar es el MPLAB© IDE ya
que es el único con el cual podemos utilizar el kit MPLAB-ICD. La única diferencia es que
utilizaremos una versión más antigua, la del MPLAB v4.1 que es la que está instalada en los
ordenadores de los laboratorios de la universidad.
18
Memoria Descriptiva
2.3.2.2. Funcionamiento del MPLAB IDE
Al ejecutar el programa saldrá la siguiente pantalla del MPLAB:
Figura. 3. Pantalla MPLAB
En la cual se puede ver las diferentes barras de elementos y los diferentes menús. Esto
es como se abriría en el caso de que no se hubiese trabajado anteriormente con él, si no
preguntará si abre los archivos y el proyecto último con el que se estaba trabajando antes de
cerrar por última vez.
A nosotros nos interesa como crear un nuevo proyecto. Los pasos a seguir serian ir al
menú ‘PROJECT’ y crear un nuevo proyecto.
Figura 4. Menú “New Project”
19
Memoria Descriptiva
Una vez dado el nombre se abrirá la ventana ‘EDIT project’ donde tenemos que
asignar un nodo al proyecto que será el archivo .ASM en donde está código del programa a
funcionar.
Figura 5. Ventana “Edit project”
Por último tenemos que seleccionar el procesador que queremos utilizar e ir a
‘DEVELOPMENT MODE’ en donde tenemos que asignar si queremos trabajar como
simulador, que sería simplemente para que funcione el código en el PC simulando el
ordenador al µC, o utilizar el ‘MPLAB-ICD Debugger’ que para ello tenemos que tener el kit
MPLAB-ICD.
Una vez terminada la creación del proyecto y terminado el código del programa que
queremos probar tenemos que dar al botón de linkar el programa para crear el archivo que se
tiene que guardar en la memoria de programa del micro y después, ejecutar el programa desde
la barra de herramientas. Ver figura 6.
Para ver
Linkar el
toda la
programa
memoria
para ver si
RAM
hay errores
Para ver el
programa
grabado en
la ROM del
µC
Figura 6. Barra de herramientas MPLAB
Ejecutar el
programa
Ejecutar
paso a
paso
20
Para ver los
registros
especiales
del µC
Memoria Descriptiva
Para ver la memoria de la EEPROM, que lo necesitaremos cuando trabajemos con ella, se
tendría que seleccionar en el menú de ‘Windows->EEPROM’ con lo cual se nos abriría una
ventana donde saldrían los valores de la EEPROM.
2.3.3. Explicación del Kit MPLAB-ICD.
2.3.3.1. Introducción
Este kit es el sistema a través del cual comunicamos el PC con el µC, a través de él
conseguimos poder utilizar todas las funciones del MPLAB.
La finalidad de este kit es poder programar un PIC y poder ejecutar el código paso a
paso para probar el funcionamiento del código volcado en el µC. Esto es ideal para realizar
nuevos códigos que están en un proyecto de una fábrica en el laboratorio de I+D por ejemplo,
o como en nuestro caso, para los laboratorios de clase, ya que el alumno tiene que programar
una y otra vez el código hasta que funcione.
Esta opción de programar a los µC es la ideal por si tienes que reprogramar una y otra
vez el µC debido a que tengas que corregir el código debido a que el micro tiene memoria
FLASH.
Para programar el µC una vez el código está correcto se hace de diferentes formas. Si
es una fábrica y tiene que fabricar muchos, los fabrica con el código ya programado con
memoria ROM. Si es un usuario que a lo mejor programa algunos para uso personal lo hace
mediante un programador del tipo T-20, que resulta mucho más económico.
2.3.3.2. Características del MPLAB-ICD Module
Este kit está compuesto de dos partes, una que es el ICD module y la otra es el ICD
Header. El esquema del ICD module es:
Figura 7. MPLAB ICD Module
21
Memoria Descriptiva
Esta parte se encarga de comunicarse a través del puerto serie ‘J2’ con el PC y a través del
conector ‘J3’ con el MPLAB Header.
2.3.3.3. Características del MPLAB-ICD Header
El MPLAB Header sirve para poder conectarlo a un dispositivo de DIP-28 como es el
18F876, o como para un dispositivo DIP-40 como el 18F877. Un esquema de la placa base
sería el siguiente:
Figura 8. MPLAB ICD Header
22
Memoria Descriptiva
2.3.4. Placa base del laboratorio
2.3.4.1.Explicación placa base del laboratorio
La placa base de la que vamos a hablar ahora es de la que se dispone en laboratorio de
prácticas de la asignatura de “Sistemas electrónicos con miro controladores”. Dicha placa está
compuesta por un regulador de tensión a 5V, Un conector para una pantalla de LCD y un
conector para un teclado. Que serán explicados en lo siguientes apartados.
2.3.4.2.Regulador de tensión
Este regulador se coloca en las placas donde tenemos el µC para alimentarlo, con el
regulamos la tensión de alimentación al valor que necesitamos (5V), de tal forma que nos
permite tener una tensión estable para el mejor funcionamiento de nuestro sistema y nos
permite que la fuente de alimentación de la placa pueda variar entre 8 y 15V
aproximadamente.
Este circuito está compuesto por:
•
•
•
•
•
•
2 condensadores de poliéster 100nF
1 condensador electrolítico 47µF
1 resistencia de 1kΩ
1 regulador de tensión LM7805
1 conector de 2 pins para conectar la placa a la fuente de alimentación
1 LED rojo de 5mm
U1
LM7805CT
J1
Vreg
IN
HDR1X2
LED1
47uF
100nF
C1
C2
OUT
100nF
C3
Figura 9. Regulador de tensión 5V
23
LED_red
R1
1.0kohm
Memoria Descriptiva
2.3.5. Descripción Pantalla LCD
2.3.5.1. Introducción
Un microcontrolador necesita dispositivos para poder comunicarse con el exterior, de
la misma forma que un ordenador necesita un teclado y una pantalla, al µControlador le vamos
a suministrar los teclados de 16 teclas y una pantalla LCD alfanumérica.
La mayoría de los LCD’s están basados en el microcontrolador HITACHI 44780 u otro
similar, con lo cual la mayoría de estos se programan de forma similar. El tamaño de los
caracteres que se muestran son de 5x7 o 5x10 pixels. Todos ellos tienen como método para
escribir los datos a través de un bus de 8 bits que se conecta al µC/µP aunque también
permiten la conexión a través de 4 bits, simplemente lo que hacen es dividir los datos a enviar
en dos bloques para enviar los datos.
Hay pantallas de muchos tipos. La forma más fácil de clasificarlas es por el número de
caracteres y por el número de líneas (caracteres x línea) que se pueden introducir. Existen los
siguientes tipos:
• 8x2
• 16x1, 16x2, 16x3 y 16x4
• 20x2 y 20x4
• 24x2
• 40x2 y 40x4
2.3.5.2. Que pantalla LCD vamos a utilizar
Para estas prácticas vamos a utilizar las pantallas ya existentes en el laboratorio de
prácticas para abaratar los costes. Son pantallas de 16x2 con retro-alimentación con 16 pines
de conexión con el µC.
2.3.5.3. Funcionamiento de la pantalla LCD
La configuración de los pins de la pantalla de LCD que vamos a utilizar en las
prácticas es la siguiente:
Asignación de los pines del JM162A
#PIN
Nombre
Función
1
Vss
Masa (0V)
2
Vdd
Alimentación (+5V)
3
Vee
Contraste (Vss=Vee=Vdd)
4
RS
Selección de modo (dato=1/comando=0)
5
R/W
Lectura/escritura de comando (lectura=1/ecritura=0)
6
E
Enable ( Validación DB<7:0> en flanco 1? 0)
7
DB0
Bit 0 (LSB) de dato
24
Memoria Descriptiva
8
9
10
11
12
13
14
15
16
DB1
DB2
DB3
DB4
DB5
DB6
DB7
A
K
Bit 1 de dato
Bit 2 de dato
Bit 3 de dato
Bit 4 de dato
Bit 5 de dato
Bit 6 de dato
Bit 7 (MSB) de dato
Ánodo (+) retro-iluminación
Cátodo (-) retro-iluminación
Tabla 2. Asignación de los pins del JM162A
De todos estos pins solamente se van a utilizar 6 de ellos que son los de DB<7:4> para
la comunicación con el µC, no utilizamos los 8 pins para ahorrar salidas en el µC. El
inconveniente es que se tarda algo más en enviar los datos ya que hay que escribir dos veces
en el bus pero la pérdida de tiempo es tan pequeña que nos sale a cuenta reducir el número de
salidas del µC.
Los otros dos pins que vamos a utilizar van a ser el RS y RW
Estas pantallas tienen un juego de instrucciones con las cuales podemos ir escribiendo
los datos en la pantalla, los caracteres que queremos escribir es poniendo el código ASCII en
hexadecimal de la letra que queremos poner en el bus de datos, de tal forma que para escribir
una ‘A’ habría que escribir ‘40’H. El juego de instrucciones de estos teclados es el siguiente:
CODIGO INSTRUCCIÓN
D D D D D
INSTRUCCIÓN
RS RW B B B B B
7 6 5 4 3
Clear
0
0
0 0 0 0 0
Display
D
B
2
D
B
1
D
B
0
0
0
1
Return
Home
0
0
0
0
0
0
0
0
1
X
Entry mode
Set
0
0
0
0
0
0
0
1
I/
D
S
H
Display
0
ON/OFF control
0
0
0
0
0
1
D
C
B
Cursor
or
0
Display Shift
0
0
0
0
1
S/ R/
X
C L
X
Function
Set
0
0
0
0
1
D
L
N
F
X
X
Set CGRAM
Address
0
0
0
1
A
C
5
A
C
4
A
C
3
A
C
2
A
C
1
A
C
0
25
DESCRIPCIÓN
Escribe ‘20’H en DDRAM y coloca
DDRAM address en ‘00H’ de AC
Coloca ‘00H’ en DDRAM address
y vuelve el cursor a la posición
original
Asigna el movimiento el cursor y si
queremos que el cursor se vea o no
Set Display (D), cursor (C), y
parpadeo del cursor (B) on/off bit
de control
Set cursor moving and display shift
bit de control y la dirección, sin
cambiar la DDRAM data.
Asignar la interfaz de longitud de
datos (DL:4-bit/8-bit), números de
líneas del display (N:1-línea/2líneas, Display tipo de fuente(F:0...)
Tiempo
Ejecución
(fosc
=
270KHz)
1.53ms
1.53ms
39µs
39µs
39µs
39µs
Colocar CGRAM address en el 39µs
contador de dirección
Memoria Descriptiva
Set DDRAM
Address
Read Busy
Flag and
Address
Write Data
To RAM
Read Data
From RAM
0
1
A
C
6
A
C
5
A
C
4
A
C
3
A
C
2
A
C
1
A
C
0
0
1
B
F
A
C
6
A
C
5
A
C
4
A
C
3
A
C
2
A
C
1
A
C
0
1
0
1
1
D
7
D
7
D
6
D
6
D
5
D
5
D
4
D
4
D
3
D
3
D
2
D
2
D
1
D
1
D
0
D
0
0
Set DDRAM address en el contador
39µs
de dirección
Whether during internal operation
or not can be known by reading BF.
0µs
The contents of address counter can
also be read
Escribir dato en la RAM
43µs
(DDRAM/CGRAM)
Leer
dato
de
la
RAM
43µs
(DDRAM/CGRAM)
Tabla 3. Juego instrucciones de la pantalla LCD
2.3.6. Descripción del teclado
2.3.6.1. Introducción
El teclado puede ser de dos tipos, 3x4 o 4x4. Aunque nosotros con el de 3x4 para los
teclados del módulo 1 teníamos bastante, escogemos el teclado de 4x4 ya que es del que se
dispone en el laboratorio y por lo tanto no tendríamos que comprar ningún otro teclado.
2.3.6.2. Funcionamiento del teclado
El teclado servirá para comunicarnos con el µC. La disposición de las teclas en el
teclado es la siguiente:
1
2
3
F
4
5
6
E
7
8
9
D
A
0
B
C
Figura 9. Disposición teclas
En nuestro sistema utilizaremos simplemente un teclado y la configuración de las
teclas será la misma que se muestra en la Figura 11. el µC deberá detectar la tecla que se ha
pulsado. Todo esto se hace por software.
26
Memoria Descriptiva
El esquema eléctrico del teclado es:
4x200O
1
2
3
F
4
5
6
E
7
8
9
D
A
0
B
C
Figura 10. Esquema eléctrico del teclado
Con lo cuál, al pulsar una tecla cerramos el interruptor y comunicamos la fila con la
columna, con lo cual dando la fila como entrada y la columna como salida, o viceversa, al
poner un nivel (’0’ o ‘1’) la salida si se pulsa la tecla tendríamos que leer el mismo nivel en la
salida.
27
Memoria Descriptiva
2.4. El bus I2C.
2.4.1. Introducción
Philips Semiconductors desarrolló el bus de dos cables Inter Circuito Integrado para la
comunicación entre circuitos integrados (IC’s) en 1980 y desde entonces, se ha convertido en
el bus serial estándar, implementado en un gran numero de IC’s y con licencias otorgadas a
mas de 50 compañías con un total de 1000 dispositivos compatibles I2C.
Originalmente fue especificado para una velocidad de 100 Kbits/s e intencionalmente
para control simple y señales de estatus, simplificar las conexiones entre los periféricos,
aumentar la inmunidad al ruido, y debido a su bajo coste, su versatilidad técnica y su
simplicidad le han asegurado su popularidad.
El bus serie I2C ha sido extendido para soportar velocidades de hasta 3,4 Mbits/s. Esto
combinado con una función de desplazamiento del nivel de voltaje, en modo High-speed (Hsmode) ofrece una solución ideal para los sistemas de tecnología mixta, donde las altas
velocidades y la variedad de voltajes (5 V, 3V o menor) son comúnmente usados.
El modo Hs es compatible con todos los sistemas existentes del bus I2C, incluyendo el
estándar original (S-mode) y el modo Fast (F-mode), actualización introducida en 1992,
proveyendo 400 Kbits/s en transferencia. Diferentes sistemas de velocidad pueden mezclarse
fácilmente, ya que con un dispositivo maestro en modo Hs especialmente desarrollado, la
conexión en paralelo es usada para conectar las partes mas lentas del sistema, todos los
dispositivos en modo Hs se comunicaran bidireccionalmente a toda velocidad mientras se
utilicen los modos F/S (Fast / Estándar) de velocidades con las partes mas lentas del sistema.
Philips fue el inventor del bus Inter-IC o I2C hace 20 años y ahora esta firmemente
establecido como la solución mundial para las aplicaciones integradas. Es usado en una gran
variedad de microcontroladores y aplicaciones de telecomunicaciones como en control,
diagnostico y administración de potencia. Su simplicidad ha sido retenida independientemente
de las mejoras a la especificación original. Actualmente diseñan dispositivos basados en I2C
muchos fabricantes como Xicor, SGS-Thompson, Siemens, Intel, TI, Maxim, Atmel y Analog
Devices.
La especificación original del bus i2c, o modo de estándar, fue para transferencia de
datos hasta 100 Kbps. La especificación mejorada (modo rápido) está también implementada
en los PIC. La comunicación entre dispositivos se puede realizar en el modo estándar y en el
modo rápido si los dispositivos están unidos al mismo bus. El clock determinará la velocidad
de los datos. La interfaz I2C emplea un protocolo amplio para asegurar una transmisión y
recepción de datos fiable, por lo que tiene numerosas aplicaciones como ser un bus de
interconexión entre dispositivos en una tarjeta o equipo, sistema de configuración y
supervisión en ordenadores servidores, en sistemas de gestión de alimentación.
El bus i2c es una interfaz serie que solo requiere dos líneas, una línea serie de datos
(SDA) y una línea serie de reloj (SCL). Cada dispositivo conectado al bus es direccionado por
software por una única dirección y simples relaciones master/esclavo.
28
Memoria Descriptiva
A grandes rasgos en el protocolo de comunicación, el maestro controla la
comunicación ya que genera la señal de reloj del bus, inicia y termina la comunicación,
direcciona a los esclavos y establece el sentido de la comunicación. Este protocolo requiere
que cada byte de información sea confirmado por el destinatario.
Por cada bit de información que va por la línea SDA es necesario un pulso de la línea
de reloj SCL y estos bits solo pueden cambiar cuando la línea SCL esta a nivel bajo. Las
transferencias de datos son de 8 bits y tras cada byte enviado se necesita una confirmación, el
destinatario (maestro o esclavo) mantiene la línea SDA a nivel bajo durante un tiempo de bit y
el maestro genera un pulso SCL, esta acción se conoce como ACK.
Como ya hemos mencionado el maestro inicia la comunicación enviando una
condición de inicio que se da durante el flanco de bajada en la línea de datos SDA mientras la
línea de reloj SCL se mantiene a nivel alto. Cuando nadie accede al bus hay niveles altos en
ambas líneas. Tras la condición de inicio el maestro envía la dirección del esclavo y un
comando de lectura o escritura en función de si va a leer o a escribir en el dispositivo
direccionado. Finalmente el maestro concluye la comunicación enviando la condición de
parada, flanco de subida en la línea SDA mientras la línea SCL permanece a nivel alto. Por lo
tanto el intercambio de datos se podría resumir en lo siguiente:
Si el maestro envía datos a un esclavo:
- El maestro inicia la comunicación.
- El maestro coloca la dirección y la orden de escritura.
- El esclavo direccionado responde con señal de conformidad (ACK).
- El maestro envía datos.
- El esclavo devuelve conformidad de todos los datos (ACK)
- El maestro termina la comunicación.
Si el maestro recibe datos de un esclavo:
- El maestro inicia la comunicación.
- El maestro sitúa la dirección en el bus y la orden de lectura.
- El esclavo direccionado responde con señal de conformidad (ACK).
- El esclavo envía datos.
- El maestro responde con señal de conformidad a los datos recibidos excepto al ultimo
(ACK).
- El maestro termina la comunicación.
Cabe mencionar que el bus i2c soporta un protocolo Multimaster, por lo que dos
maestros intentando acceder al bus pueden crear conflicto. Para asegurarnos que solo un
maestro tiene el control del bus tenemos un procedimiento de arbitraje, de forma que si un
master esta utilizando el bus no puede ser interrumpido por otro desde la condición de inicio
hasta la condición de parada. Este procedimiento de arbitraje se basa en la conexión del bus
en colector abierto, el sistema de arbitraje actúa sobre la línea de datos SDA mientras la línea
SCL esta a nivel alto. Si dos maestros intenta acceder a la vez al bus, deben escuchar la línea
de datos. Si un master esta intentando enviar un nivel alto y lee un nivel bajo significa que
existe otro master utilizando el bus por lo que debe dejar de transmitir esperando que la línea
quede
libre.
29
Memoria Descriptiva
2.4.1.1 Introducción a las especificaciones I2C
El bus Inter-IC esta orientado a las aplicaciones de 8 bits controladas por un
microprocesador y estas son básicamente los criterios que se deben establecer:
-
Un sistema consiste en al menos un microcontrolador y varios sistemas periféricos
como memorias o circuitos diversos.
El coste de conexión entre los varios dispositivos dentro del sistema debe ser el
mínimo.
El sistema que utiliza este Bus no requiere una alta tasa de transferencia de datos.
La total eficacia del sistema depende de la correcta selección de la naturaleza de los
dispositivos y de la interconexión de la estructura del bus.
2.4.2. El concepto del Bus I2C
El bus I2C soporta cualquier tipo de componente (NMOS, CMOS, bipolar, etc.). Dos
hilos físicos uno de datos (SDA) y otro de reloj (SCL) transportan la información entre los
diversos dispositivos conectados al bus.
Cada dispositivo es reconocido por una única dirección y puede operar cualquiera
como transmisor o emisor de datos, dependiendo de la función del dispositivo. En función de
que envíe o reciba datos se debe considerar los dispositivos como Maestros (Masters) o
Esclavos (Slaves). Un ejemplo de conexionado lo podemos observar en la figura1.
Fig.11 Ejemplo de una configuración del bus I2C.
30
Memoria Descriptiva
Terminología básica del Bus I2C
Términos
Descripción
Transmisor
El dispositivo que envía datos al Bus
Receptor
El dispositivo que recibe datos desde el Bus
Master
El dispositivo que inicia una transferencia, genera las señales del reloj y
(Maestro)
termina un envío de datos
Slave (Esclavo) El dispositivo direccionado por un master
Multi-Master
Mas de un master puede controlar el bus al mismo tiempo sin corrupción de
los mensajes
Arbitraje
Procedimiento que asegura que si uno o mas master simultáneamente
deciden controlar el Bus solo uno es permitido a controlarlo y el mensaje
saliente no es deteriorado
Sincronización Procedimiento para sincronizar las señales del reloj de dos o mas
dispositivos
Tabla 4. Terminología básica del bus I2C
2.4.3. Generalidades
Los master son generalmente microcontroladores, que ocasionalmente también pueden
ser esclavos. La posibilidad de conectar más de un microcontrolador al Bus significa que uno
o más microcontroladores pueden iniciar el envío de datos al mismo tiempo. Para prevenir el
caos que esto ocasionaría se ha desarrollado un sistema de arbitraje:
El sistema de arbitraje actúa sobre la línea de datos (SDA), mientras la señal de reloj (SCL)
se encuentra a nivel alto. Si un maestro esta utilizando el bus no puede ser interrumpido por
otro, desde la condición de inicio hasta la condición de parada. En cambio, si son dos los
maestros que intentan coger el bus, debido a la conexión en colector abierto (que explicare un
poco mas adelante) prevalecen los ceros, de forma que el master que envíe una señal SDA a
nivel alto a la línea de datos, pierde el arbitraje frente a un master que envíe la señal SDA a
nivel bajo. Debido a esto, los maestros a la vez que ponen los datos en el bus, deben escuchar
la línea. Si un maestro esta intentando enviar un nivel alto y lee un nivel bajo, es porque otro
master esta utilizando el bus, por lo que deja de transmitir esperando que la línea quede libre
(condición de parada)
La generación de señales de reloj (SCL) es siempre responsabilidad de los dispositivos
master, cada maestro genera su propia señal de reloj cuando envía datos al bus, las señales de
reloj de un master solo pueden ser alteradas cuando la línea de reloj sufre una caída por un
dispositivo esclavo o por el dominio del control del Bus por el arbitraje de otro
microcontrolador.
Los dispositivos conectados al bus deben ser de colector abierto o drenaje abierto (“en
paralelo”), así los estados de salida de las líneas de reloj (SCL) y datos (SDA) desempeñan la
función de “cable en AND” del Bus.
Durante el tiempo en el cual no hay transferencia de datos (tiempo inactivo), tanto la
línea del reloj, como la línea de datos son “tiradas” arriba a través de resistencias externas
pull-up.
31
Memoria Descriptiva
La única limitación en la conexión de dispositivos en el bus depende de la capacidad
máxima que no puede superar los 400 pF, normalmente dos o tres metros. Los tipos de
transferencia de datos en el bus son:
- Modo Estándar aproximadamente a 100 Kbits/s
- Modo Rápido aproximadamente a 400 Kbits/s
- Modo Alta velocidad a más de 3,4 Mbits/s
Tanto la línea de datos como la señal de reloj (a partir de ahora SDA y SCL,
respectivamente) son bidireccionales conectadas a una fuente de tensión positiva vía
suministro común o resistencias de carga. Esto lo podemos observar en la figura 2.
Fig.12. Conexión de dispositivos en el bus I2C
2.4.3.1 Características de una conexión en colector abierto.
La conexión en colector abierto permite conectar varias fuentes de datos a un mismo
hilo. Tendremos un nivel alto en el bus si ningún dispositivo accede al bus o si ningún
dispositivo transmite un cero. Por el contrario, obtenemos un nivel bajo si un dispositivo pone
un nivel bajo, si dos dispositivos escriben a la vez siempre prevalecen los ceros, debido al
estar conectados en forma de AND cableada.
Si un dispositivo escribe un nivel alto pero lee un cero, indica que otro dispositivo también
esta accediendo al bus.
Este tipo de conexión también tiene sus inconvenientes, ya que las capacidades de la
línea se cargan a través de las resistencias del pull-up. Se puede solucionar utilizando una
carga activa en lugar de un resistor. Lo observamos en las siguientes graficas:
32
Memoria Descriptiva
Gráfica 1. Características de la conexión en colector abierto.
2.4.3.2 La Transferencia del Bit.
Debido a la variedad de tecnologías utilizadas en dispositivos conectados al Bus I2C
los niveles lógicos de ‘0’ (Bajo) y ‘1’ (Alto) no están fijados y dependen de la tensión de
alimentación del circuito. Un pulso de reloj se genera por cada bit de datos transferidos.
Los bits de datos transferidos en la línea SDA deben ser estables cuando la línea SCL
esta a nivel alto. El estado de la línea SDA en ‘1’ ó ‘0’ solo puede cambiar cuando en la línea
SCL la señal es ‘0’.
Figura 13 – Transferencia del Bit en el Bus I2C
2.4.3.3 Instrucciones en el Bus I2C
Para operar un esclavo sobre el Bus I2C solo son necesarios seis simples códigos,
suficientes para enviar o recibir información:
1.
2.
3.
4.
5.
6.
Bit de Start
7 bits o 10 bits de direccionamiento.
un R/W bit que define si el esclavo es transmisor o receptor.
Un bit ACK de reconocimiento
Mensaje dividido en bytes.
un Bit de Stop.
Todos estos campos se explican a continuación.
33
Memoria Descriptiva
2.4.3.3.1 Condiciones de Start y Stop
Dentro del proceso de transferencia de datos en el Bus I2C hay dos situaciones básicas
que son el inicio y fin de toda transferencia de datos. Estas son:
INICIO (START) - Una transición de ‘1’ a ‘0’ (caída) en la línea de datos (SDA) mientras la
línea de reloj (SCL) esta a ‘1’.
FIN (STOP) - Una transición de ‘0’ a ‘1’ (ascenso) en la línea de datos (SDA) mientras la
línea de reloj (SCL) esta a ‘1’
Dichas situaciones se representan en la figura 4.
Figura 14 – Condiciones de Start y Stop.
Las condiciones de Inicio y Stop son siempre generadas por el Master. El bus I2C se
considera ocupado después de la condición de Inicio y libre de nuevo un cierto tiempo después
tras la condición de Stop.
Es decir, al pulso ‘1’ de la línea SCL le puede corresponder un pulso ‘0’ o ‘1’ de la
línea SDA en función de la información del byte que se envíe, recordemos que a cada bit de
SDA le corresponde un bit de SCL, pero nunca salvo en la condición de Inicio a un bit de SCL
le corresponde una situación de ‘1’ a ‘0’ o sea, pasa por dos estados la línea SDA. Ocurre la
situación contraria en la condición de Stop que el Master envía un bit a SCL mientras cambia
SDA de ‘0’ a ‘1’ durante el tiempo que esta enviando la señal de ‘1’ a SCL.
El bus continuará ocupado si se genera una repetición de condición de inicio (repeated
Start, Sr) en lugar de la condición de Stop. En este aspecto, la condición de Start y la
repetición de Start (Sr) son funcionalmente idénticas.
La detección de Start y Stop por los dispositivos conectados al bus es fácil si tienen
incorporada la interfaz hardware necesaria. Sin embargo, microcontroladores que no disponen
de ella tienen que muestrear la línea SDA al menos dos veces por ciclo de reloj para detectar la
transferencia.
34
Memoria Descriptiva
2.4.3.3.2 Transfiriendo datos
Cada byte colocado en la línea SDA debe ser de 8 bits. El número de bytes que se
pueden transmitir no tiene restricción. Cada byte debe ir seguido por un bit de reconocimiento,
enviado por el receptor, el byte de datos se transfiere empezando por el bit de mas peso (7)
precedido por el bit de reconocimiento (ACK). Ver figura 15.
Figura 15- Transferencia del dato en el Bus I2C
Si un dispositivo esclavo no puede recibir o transmitir un byte de datos completo
(puede estar haciendo otra cosa, por ejemplo atendiendo una interrupción), puede mantener la
línea SCL a ‘0’ lo que fuerza al Master a permanecer en un estado de espera. Los datos
continúan transfiriéndose cuando el dispositivo esclavo esta listo para otro byte de datos y
libera la línea de reloj SCL.
2.4.3.3.3 Reconocimiento
El bit de reconocimiento es obligatorio en la transferencia de datos. El pulso de reloj
correspondiente al bit de reconocimiento (ACK) es generado por el Master. El transmisor
libera la línea SDA (‘1’) durante el pulso de reconocimiento.
El receptor debe poner a nivel bajo la línea SDA durante el pulso ACK de modo que
siga siendo ‘0’ durante el tiempo que el master genera el pulso ‘1’ de ACK. Se puede observar
en la siguiente figura:
35
Memoria Descriptiva
Figura 16 – Reconocimiento en el Bus I2C
Normalmente un receptor cuando ha sido direccionado esta obligado a generar un ACK
después de cada byte recibido. Cuando un dispositivo esclavo no genera el bit ACK (porque
esta haciendo otra cosa y no puede atender el Bus) debe mantener la línea SDA a nivel alto
durante el bit ACK. El Master entonces puede generar una condición de STOP abortando la
transferencia de datos o repetir la condición de Inicio enviando una nueva transferencia de
datos.
Si un esclavo – receptor que esta direccionado no desea recibir más bytes, el master
debe detectar la situación y no enviar más bytes. Esto se indica porque el esclavo no genera el
bit ACK en el primer byte que le sigue. El esclavo pone la línea SDA a "1" lo que es detectado
por el Master el cual genera la condición de Stop o repite la condición de Inicio.
Si un Master-receptor esta recibiendo datos de un Esclavo-transmisor debe generar un
bit ACK después de cada byte recibido del esclavo, para finalizar la transferencia de datos no
debe generar el ACK después del último byte enviado por el esclavo. El esclavo-transmisor
debe permitir desbloquear la línea SDA para que el master genere la condición de Stop o de
Inicio.
2.4.4. Arbitraje y generación de señales de reloj
2.4.4.1 Sincronización
Todos los master generan su propia señal de reloj para transferir datos sobre el bus I2C.
El dato solo es valido durante el ciclo de reloj a nivel alto. Por tanto, necesitaremos un clock
definido para el arbitraje bit a bit.
La sincronización del reloj se realiza mediante una conexión AND de todos los
dispositivos del Bus a la línea SCL. Esto significa que una transición de un Master de "1" a
"0" en la línea SCL hace que la línea pase a "0", esto mantiene la línea SCL en ese estado. Sin
embargo la transición de "0" a "1" no cambia el estado de la línea SCL si otro reloj esta
todavía en su periodo de "0". Por lo tanto la línea SCL permanecerá a "0" tanto como el
36
Memoria Descriptiva
periodo mas largo de cualquier dispositivo cuyo nivel sea "0". Los dispositivos que tienen un
periodo mas corto de reloj "0" entran en un periodo de espera.
Cuando todos los dispositivos conectados al Bus han terminado con su periodo "0", la
línea del reloj se desbloquea y pasa a nivel "1". Por lo que hay que diferenciar entre los
estados de reloj de los dispositivos y los estados de la línea SCL, y todos los dispositivos
empiezan a nivel "1". El primer dispositivo que completa su nivel "1" pone nuevamente la
línea SCL a "0".
Resumiendo, la sincronización de la línea SCL se genera a través de la señal a "0" por
el dispositivo con el periodo mas largo de nivel a "0" y la señal a "1" por el dispositivo con el
periodo mas corto de nivel a "1" y se observa en la figura 17.
Figura 17 – Sincronización de señales de reloj durante el arbitraje.
2.4.4.2 Arbitraje
Un master puede iniciar una transmisión solo si el bus esta libre. Dos o más master
pueden generar una condición de Inicio en el bus lo que da como resultado una condición de
Inicio general. Cada Master debe comprobar si el bit de datos que transmite junto a su pulso de
reloj, coincide con el nivel lógico en la línea de datos SDA. El sistema de arbitraje actúa sobre
la línea de datos SDA, mientras la línea SCL esta a nivel "1", de una manera tal que el master
que transmite un nivel "1", pierde el arbitraje sobre otro master que envía un nivel "0" a la
línea de datos SDA. Esta situación continua hasta que se detecte la condición de Stop generada
por el master que se hizo cargo del Bus. Ver figura 18.
37
Memoria Descriptiva
Figura 18 – Arbitraje del bus entre dos masters
En esta figura se ve el arbitraje entre dos maestros, aunque pueden estar involucrados
mas dependiendo de cuantos microcontroladores hay conectados en el bus. En el momento en
que hay una diferencia entre el nivel interno de la línea de datos del master DATA1 y el actual
nivel de la línea de datos SDA, su salida de datos es interrumpida, lo cual significa que un
nivel "1" esta dominando en el Bus. Esto no afecta los datos transferidos inicialmente por el
master que toma el bus.
El arbitraje puede continuar varios bits hasta que se de la circunstancia de control del
Bus por uno de los Master. Tras el arbitraje, los Masters perdedores se deben poner
inmediatamente en modo Master-receptor y esclavo pues los datos que envíe el Master
dominante pueden ser para uno de ellos.
Un master que pierde el arbitraje puede generar pulsos de reloj hasta el fin de byte en
el cual el pierde el arbitraje. En el momento que un master toma el control solo este master
toma las decisiones y genera los códigos de dirección, no existen master centrales, ni existen
ordenes prioritarias en el Bus.
Se debe poner especial atención si durante una transferencia de datos el procedimiento
de arbitraje esta todavía en proceso justo en el momento en el que se envía al Bus una
condición de Stop. Es posible que esta situación pueda ocurrir, en este caso el master afectado
debe mandar condiciones de Inicio o Stop.
38
Memoria Descriptiva
2.4.5. Formato
Los datos transferidos tienen la forma de la siguiente figura:
Figura 19 – Transferencia de dato completa
Después de la condición de Start, se envía la dirección del esclavo con el que se quiere
comunicar, esta dirección tiene 7 bits seguidos por un octavo bit que corresponde a R/W (0indica transmisión/1-indica solicitud de datos). Una transferencia de datos siempre acaba con
una condición de Stop generada por el master, sin embargo si un master todavía desea
comunicarse con el bus, puede generar repetidamente condiciones de Start y direccionar a otro
esclavo sin generar primero la condición de stop.
Varias combinaciones de lectura y escritura son posibles dentro de una misma
transferencia de datos.
Los posibles formatos de transferencia son:
1-Master transmite al esclavo-receptor. Direccionando 7 / 10 bits, no cambia el bit de
dirección Ver figura 20.
Figura 20. Master transmite sin cambiar bit de dirección.
39
Memoria Descriptiva
2 -Master lee a un esclavo inmediatamente después del primer byte. Ver figura 21.
Figura 21. Maestro lee de un esclavo después del primer byte
En el momento del primer reconocimiento el master-transmisor se convierte en un
master-receptor y el esclavo-receptor en un esclavo-transmisor. El primer reconocimiento es
aun generado por el esclavo. La condición de stop es generada por el Master, el cual a enviado
previamente un no-reconocimiento.
3-Formato combinado. Ver figura 22.
Figura 22. Formato combinado
40
Memoria Descriptiva
Durante un cambio de dirección dentro de una transferencia, la condición de Start y la
dirección del esclavo son ambos repetidos, pero con el bit R/W invertido. Si un Masterreceptor envía una condición repetida de Start, el esclavo previamente ha enviado un noreconocimiento
Notas:
1.
2.
3.
4.
5.
6.
7.
Se pueden combinar diversos formatos de direccionamiento
Las decisiones para el mayor o menor acceso a las posiciones de las memorias debe ser tomada por el
diseñador del dispositivo.
Durante el primer byte de datos la posición de la memoria interna debe ser escrita.
Después de la condición Start la dirección del esclavo es repetida los datos pueden ser transferidos.
Cada byte es seguido por un bit de reconocimiento como indican los bloques en la secuencia.
Una condición de Start inmediatamente seguida por una condición de Stop es un formato ilegal.
Los dispositivos compatibles con el bus I2C deben poder reajustar su bus lógico a la recepción de una o
mas condiciones de Start.
2.4.6. Direccionamiento
El procedimiento de dirección para el Bus I2C es tal que el primer byte después de la
condición de Start usualmente determina que esclavo ha sido seleccionado por el Master.
La excepción se da en la "llamada general" (byte 0000 0000) con la que se direcciona a todos
los dispositivos, cuando esta dirección es usada, todos los dispositivos en teoría deben
responder con un reconocimiento (A), sin embargo algunos dispositivos pueden estar
condicionados a ignorar esta dirección. El segundo byte de la "llamada general" define
entonces la acción a tomar (Figura 25).
Hay dos formatos de dirección. El más simple es el formato de 7-bit con un bit R/W que
permite direccionar hasta 128 dispositivos, que en la práctica se reduce a 11 2 debido a que las
restantes direcciones son de uso reservado. (Figura 23). El más complejo es el de 10-bit con un
bit R/W (Figura 24). Para el formato de 10-bit, dos bytes deben ser transmitidos con los
primeros cinco bits que especifiquen una dirección de 10-bit.
Figura 23. Formato de direccionamiento de 7 bits
41
Memoria Descriptiva
Figura 24. Formato de direccionamiento de 10 bits
El direccionamiento de 10-bit permite usar hasta 1024 direcciones adicionales para
prevenir problemas con la localización de direcciones esclavas cuando el número de
dispositivos I2C se expande rápidamente. Esto no cambia el formato de direcciones definido
en la especificación del bus I2C, usando direcciones reservadas en la especificación existente.
El direccionamiento de 10-bit no afecta el direccionamiento existente de 7-bit,
permitiendo a los dispositivos con direcciones de 7-bit o 10-bit ser conectados al mismo bus
I2C, y ambos tipos de dispositivos pueden ser usados en sistemas con modos Standard-, Fast- o
High-speed.
Figura 25. Formato llamada general
2.4.6.1 Explicación del 1er byte de direccionamiento
Los 7 primeros bits del primer byte marcan la dirección del esclavo. Ver figura 26
Figura 26. Primer Byte después de la condición de Start.
42
Memoria Descriptiva
El octavo bit determina la dirección del mensaje, un 0 en la posición 8 del byte
significa que el Master escribirá información en el esclavo seleccionado y un 1 en la posición
8 del byte significa que el Master leerá información del esclavo.
Cuando un Master envía una dirección después de la condición de Inicio cada
dispositivo comprueba los siete primero bits de la dirección con la suya propia. El que
coincida se considera el dispositivo direccionado por el Master siendo un esclavo-receptor o
esclavo emisor dependiendo del bit R/W.
Una dirección puede tener una parte fija y otra programable. Con lo que se pueden
conectar dispositivos idénticos al sistema siendo activados por la parte fija y controlados por la
parte programable.
Existen una serie de direcciones reservadas en los Bus I2C que no se deben utilizar
dado que son direcciones determinadas por Philips para usos generales.
La combinación 11110xx de las direcciones esclavo se reservan para las direcciones de
10 bits.
Dos grupos de 8 direcciones (0000xxx y 1111xxx) se reservan según Tabla 3.
Tabla 5 - Definición de los bits del primer byte.
Notas:
1.
2.
3.
No se permite reconocer a ningún dispositivo en el byte de Start.
La dirección CBUS están reservadas para permitir la compatibilidad entre dispositivos I2C y CBUS en el
mismo sistema. Los dispositivos compatibles del Bus I2C no están autorizados para responder a esta
dirección.
Esta dirección está reservada para combinar el formato I2C con diferentes formatos de Bus y otros
protocolos. Solo los dispositivos compatibles con estos protocolos y formatos que funcionan según I2C
responden a esta dirección.
43
Memoria Descriptiva
2.4.7. Especificaciones eléctricas y de tiempos.
Este tema por su complejidad debe ser ampliado en el manual de Philips, en forma muy
resumida y para circuitos sencillos vale lo que sigue.
Dado la gran cantidad de diferentes dispositivos que se pueden conectar en el Bus I2C
las tensiones dependen por un lado de las necesarias para cada una de los componentes y de
una cierta normativa bastante elástica para las líneas SDA y SCL.
Se debe pretender que la alimentación de las líneas SCL y SDA debe ser a 5V
manteniéndose las siguientes tolerancias:
Máxima tensión permitida a nivel bajo ("0") ---> 1,5 V.
Mínima tensión permitida a nivel alto ("1") ---> 3 V.
Ver la tabla de tiempos.
Tabla 6 - Características de las líneas SDA y SCL para dispositivos I2C
44
Memoria Descriptiva
2.5. Descripción funcional de las prácticas I2C
2.5.1. Visión general
El objetivo principal de estas prácticas es introducir a los alumnos a la comunicación via i2c,
así como los conceptos de arbitraje, sincronización, dispositivo maestro y dispositivo esclavo.
Para poder afianzar estos términos hemos diseñado dos prácticas con su correspondiente
hardware específico.
Práctica 1
PIC
16F876
Práctica 2
EEPROM
M24C01
I2C
PIC
16F876
LCD
I2C
PIC
16F876
LCD
Teclado
Figura 27 - Diagrama de bloques de entradas y salidas de las prácticas
La práctica 1, será la práctica introductoria donde accederemos desde el PIC, que
actuará como dispositivo maestro, a una memoria EEPROM externa que será en este caso el
dispositivo esclavo. Debido a la lógica interna de la memoria, no hace falta programarla, de
manera que la gestionaremos mediante el programa del microcontrolador. Disponemos
también de un LCD para poder visualizar las posiciones de memoria leídas y escritas.
En la práctica 2, la comunicación se produce entre dos PIC de forma que habrá que
programarlos para que sean capaces de intercambiarse datos mediante un teclado y un display
LCD. Del mismo modo que en la primera práctica elegiremos un PIC para que se comporte
como el dispositivo maestro y el otro como dispositivo esclavo.
2.5.2. Descripción práctica 1
En esta práctica los alumnos tienen que realizar un programa para que el PIC sea capaz
de comunicarse con una memoria externa utilizando el protocolo i2c. Para la realización de
esta práctica utilizaremos los siguientes elementos:
•
•
•
EEPROM M24C01
2 resistencias de pull-up de 10 k?
Bus I2C constituido por dos cables
45
Memoria Descriptiva
•
•
PIC 16F876
Display LCD
Con este hardware introducimos a los alumnos a la comunicación entre un PIC y una
memoria externa EEPROM. El microcontrolador debido a su condición será el dispositivo
master y la memoria el dispositivo slave. Como ya se ha mencionado la EEPROM dispone de
una lógica interna la cual gestionaremos desde el master, de forma que no hace falta
programarla.
Desde el master nos encargaremos de crear las rutinas necesarias para realizar las
operaciones de lectura y escritura en la EEPROM. Para dichas rutinas el master tiene que
tener correctamente configurado el modulo MSSP donde se habilita el modo y la forma de
operar el modo i2c (Ver anexo A). Una vez inicializado pasaremos a escribir en la EEPROM,
es decir, se iniciará la comunicación que siempre será a cargo del master. Éste tendrá que
seleccionar al dispositivo slave mandando por el bus el código de selección del dispositivo. La
EEPROM tiene que reconocer este código y entonces se enviara la posiciones de memoria a
escribir y acto seguido el dato que guardaremos en esa dirección. Una vez concluida la
transferencia de datos, terminará la comunicación también por orden del master. Acto seguido
mostraremos por el LCD las posiciones de memoria modificadas. La operación de lectura es
análoga a la de escritura. Mientras no se acceda a la EEPROM, ésta se mantendrá en stand-by,
estado en el que entra de forma automática.
2.5.3. Descripción práctica 2
La práctica 2 intenta ampliar los conceptos adquiridos con la práctica 1 de forma que
los alumnos, comuniquen dos PICs. Hay que tener en cuenta que para la transferencia de
datos de uno a otro, a uno de ellos se le deberá asignar como dispositivo maestro y el otro
como esclavo. De manera que los alumnos deberán realizar dos programas, uno para el master
y otro para el slave.
En la práctica 2 encontramos los siguientes elementos:
•
•
•
•
•
2 PIC 16F876
2 Resistencias de pull-up de 10 k?
Bus I2C constituido por dos cables
Teclado
Display LCD
De forma que el PIC master encargado de iniciar y terminar la comunicación irá conectado
al teclado, y el microcontrolador esclavo, que gestionará la transferencia de datos, estará
conectado al display LCD.
Desde el PIC master nos comunicaremos con el PIC slave de manera que la tecla
pulsada en el teclado conectado al master sea enviada a la pantalla LCD que disponemos
conectada al PIC slave.
46
Memoria Descriptiva
Ambos deberán tener configurados correctamente sus MSSP para poder realizar la
comunicación entre ellos, el dispositivo maestro será el encargado siempre de iniciar y
terminar la comunicación. Una vez enviada la condición de inicio, el PIC master deberá enviar
por el bus el código de selección del dispositivo esclavo. Éste deberá reconocerlo y entonces
se procederá a enviar la tecla pulsada desde el master al slave. Una vez terminado el proceso
de envío, el master iniciará de nuevo la comunicación pero esta vez para recibir del esclavo
una confirmación de que el envío anterior ha resultado correcto.
2.5.4. Descripción del hardware utilizado en las prácticas
En este apartado haremos hincapié en los elementos eléctricos y los conectores que se
encuentran en los módulos. Muchos de los componentes más abajo explicados son comunes en
ambos módulos como se puede observar en la siguiente figura:
2.5.4.1.Memoria EEPROM M24C01
Esta EEPROM se utiliza en el modulo 1, es compatible con el protocolo de
comunicación I2C está organizada en 128 bytes x 8 páginas. Tiene las siguientes
características:
•
•
•
•
•
•
•
•
•
•
Dos líneas para interfaz serie i2c (Soporta protocolo de 400 kHz).
Única alimentación: de 4.5 a 5.5 V.
Bit de Control de escritura.
Escritura de Byte y de página
Modo de escritura aleatoria y secuencial.
Ciclo de programación autotemporizado.
Incremento de dirección automático.
Comportamiento realzado ESD/ Latch –up.
Mas de un millón de ciclos de borrado/escritura
Más de 40 años de retención de datos
Seguidamente observamos el patillaje de la EEPROM:
Figura 28 - Esquema del patillaje de la EEPROM 24C01.
47
Memoria Descriptiva
Funciones de cada uno de los pins de la EEPROM 24C01
Nombre del Pin
Tipo
E /S(5) /P(6)
Nº de Pin
E0,E1,E2
1,2,3
E
SDA
5
E/S
SCL
6
E
7
E
Vss
4
P
Vcc
8
P
WC
(4) Entrada.
(5) Salida.
(6) Power.
Descripción
(4)
Entradas de habilitacion
del chip, bits de menor
peso que forman el
codigo de selección del
chip. Estas entradas
deben ponerse a Vcc o a
Vss para establecer dicho
codigo.
Línea bidireccional de
datos de la comunicación
i2c
Linea de entrada de reloj
de la comunicación i2c
Protege el contenido de
la memoria. Si está a
nivel alto no se puede
escribir
Referencia de masa
Entrada de tension
positiva
Tabla 7 - Funciones de los pines de la EEPROM M24C01
2.5.4.2. El teclado
El teclado es el elemento con el cual entramos datos en el µC como hemos dicho antes.
Lo conectamos a través de un cable paralelo de 10 pins. Las resistencias de 200 ? tienen como
objetivo la proteccion del circuito al que es conectado el teclado. Sabiendo que el esquema
eléctrico del teclado es:
1
2
3
F
4
5
6
E
7
8
A
4x200?
0
9
B
D
C
Figura 29 - Esquema eléctrico del teclado
48
Memoria Descriptiva
La conexión del teclado al microcontrolador tiene la siguiente forma:
Rb0
Rb2
Rc2
Rc6
Rb1
Rb3
Rc5
Rc7
RIBBON 10H
Figura 30 - Esquema de conexión del teclado
2.5.4.3. Pantalla LCD
Como en el apartado anterior, vamos a explicar las conexiones del µC con la pantalla
del LCD. Para ello utilizamos un conector de 16 para cable paralelo. Las conexiones de
la pantalla al conector son las siguientes:
Figura 31 - Conexiones pantalla LCD al conector
49
Memoria Descriptiva
Vcc
Ra1
Ra0
Ra2
Rb0
Rb2
Rb1
Rb3
R IB B O N
1 6 H
Figura 32. Esquema conexión LCD
Lo que hay que tener en cuenta es que como se puede comprobar, los pins DB<3:0>
se utilizan y esto ocurre porque en vez de enviar los datos en paquetes de 8 bits, los enviamos
en paquetes de 4 bits, con lo cual se ahorra pins de salida del µC, aunque perdemos en tiempo
de ejecución ya que hay que pasar dos veces los datos para poder enviarlos.
50
Memoria Descriptiva
2.5.5. Enunciados de las prácticas
2.5.5.1.
Práctica núm.1
Comunicación I2C con EEPROM M24C01
2.5.5.1.1. Equipos y materiales:
Para realizar la práctica utilizaremos:
• Ordenador PC
• Software MPLAB
• Cable comunicación puerto serie
• Kit MPLAB-ICD Debugger
• PIC 16F876
• EEPROM M24C01
• Bus I2C constituido por dos cables.
• 2 Resistencias de pull-up 10 k?
• Display SAMSUNG KS0070
• Cable plano de 16
2.5.5.1.2. Descripción del funcionamiento
En esta práctica tenemos que programar el chip para poder acceder por medio del
protocolo I2C a una memoria externa M24C01. De modo que el PIC actuará de maestro y la
EEPROM será el dispositivo esclavo.
El primer paso a realizar es inicializar el Modulo Serie Síncrono del PIC donde,
habilitando los bits apropiados de los registros asociados, podremos configurarlo en modo i2c.
(Las especificaciones del MSSP se encuentran explicadas en el Anexo A, pero hay un pequeño
resumen en las bases teóricas Apartado 2.5.5.1.4).
Una vez inicializado el master procederemos a realizar una operación de escritura en la
EEPROM, ver el siguiente apartado Funcionamiento de la EEPROM a una dirección de
memoria concreta y a partir de ella escribiremos en cinco posiciones más de memoria. Para
iniciar la comunicación entre el PIC y la memoria, el microcontrolador debe enviar el código
de selección del dispositivo. La memoria lo reconoce y el master envía la posición de memoria
donde guardará el dato. Guardaremos el mismo dato en las cinco posiciones de memoria
siguientes por lo que el master seguirá enviando el mismo dato hasta cinco veces y esperando
el bit de reconocimiento ACK ya que gracias al contador interno de direcciones se
incrementará después de cada byte transferido. Una vez concluida la transferencia, el master
acabará la transmisión enviando la condición de Stop. Una vez recibida esta condición de
parada, se disparará el ciclo de escritura interno de la memoria. Para comprobar las
51
Memoria Descriptiva
direcciones de memoria en las que estamos escribiendo las mostraremos por el display LCD,
así como el dato que hemos escrito.
Una vez realizadas las operaciones de escritura, leeremos la EEPROM. Ya hemos
mencionado que este dispositivo tiene un contador de direcciones interno, el cual se
incrementa cada vez que lee un byte. De forma que el PIC iniciará la transmisión con la
condición de inicio y acto seguido enviará el código de selección del dispositivo. El esclavo lo
reconocerá y colocará el byte direccionado por el contador de direcciones interno. El master
reconocerá el byte de datos recibido y envía unos pulsos de reloj adicionales de forma que la
memoria continúe extrayendo el siguiente byte, así hasta obtener las cinco posiciones de
memoria que hemos escrito anteriormente. Para terminar la cadena de bytes, el master enviará
un NACK tras el último byte y generar la condición de parada. Esta información se encuentra
mas detallada en el Anexo B. Una vez realizadas las operaciones de lectura, enviaremos al
display LCD las posiciones de memoria leídas así como su contenido.
2.5.5.1.3. Funcionamiento de la EEPROM
Esta memoria compatible con el protocolo i2c, está organizada en 128 bytes x 8
páginas. El protocolo i2c utiliza una interfaz serie de dos cables, correspondiendo a una linea
de datos bidireccional (SDA) y una línea de reloj (SCL) para sincronizarse con el dispositivo
maestro.
Figura 33 - Diagrama lógico EEPROM
La EEPROM se comporta siempre como dispositivo esclavo en el protocolo i2c con
todas las operaciones sincronizadas por la línea de reloj SCL. Las operaciones de escritura y
lectura se inician por la condición de inicio, generada por el master que tiene el bus en ese
momento. Antes del envío de la condición de inicio, el master tiene que seleccionar al
dispositivo con el que se quiere comunicar, para ello estos dispositivos tienen un código de
identificación para poder ser direccionados, en este tipo de memorias, el código de
identificación es el 1010b.
Cuando se escribe un dato en la memoria, el dispositivo, inserta un bit de
reconocimiento (ACK) durante el noveno pulso de reloj, siguiendo a la transmisión de 8 bits
del master. Cuando accedemos a la memoria para realizar una lectura, el master debe
reconocer el byte de datos del mismo modo. Las transferencias de datos se terminan con la
condición de Stop después de un ACK para escribir y después de un NACK para la lectura.
52
Memoria Descriptiva
La operaciones de escritura se pueden realizar, escribiendo en un solo byte, o también
escribiendo una página, que permite escribir 16 bytes en un único ciclo de escritura. Las
operaciones de lectura se pueden realizar accediendo a una posición de memoria cualquiera,
haciendo una lectura de la dirección actual, y una lectura secuencial debido a un contador
interno de direcciones. Toda esta información se amplia en el Anexo B, donde se explica con
más detalle la constitución de la memoria así como sus operaciones de lectura y escritura.
2.5.5.1.4. Bases teóricas
En esta primera practica de introducción a la comunicación i2c, accederemos desde el
microcontrolador PIC a una memoria externa. Hay que tener en cuenta que antes de leer o
escribir en la EEPROM, hay que inicializar previamente el modulo encargado de las
comunicaciones serie MSSP. En este modulo se habilitará el modo i2c master, así como la
velocidad de transmisión de los datos y habilitar las interrupciones pertinentes. Para la
comunicación hemos elegido una velocidad de 100 Kbits/s, pero se podría realizar
comunicaciones de hasta 3,4 Mbits/s.
Para inicializar el modulo MSSP habilitaremos los bits de los registros
correspondientes. En primer lugar deberemos configurar en el registro TRISC los bits 3 y 4
como entradas, es decir a ‘1’. Las funciones del modulo SSP se habilitan una vez activado el
bit SSPEN del registro SSPCON. Para seleccionar el modo SSP utilizaremos los bits
SSPM<3:0> del mismo registro, configurándolo en este caso como maestro. El bit CKE
(SSPSTAT <6:7>) pone los niveles de los pines SDA y SCL en cualquiera de los modos,
master o esclavo. Cuando CKE tiene el valor ‘0’ los niveles se conforman según las
especificaciones I2C. En el registro SSPADD, al estar configurando el PIC como maestro,
introduciremos la velocidad con la que se transferirán los datos; si en cambio estamos
inicializando un dispositivo esclavo, es en el registro SSPADD donde se mantiene la dirección
del esclavo. Hará falta también habilitar las interrupciones necesarias tanto en el registro
INTCON como PIE. Esta información se encuentra ampliada en el Anexo A donde se explica
con detalle toda la configuración del modulo serie síncrono, MSSP.
Una vez inicializado comenzaremos los accesos a memoria, en primer lugar pasaremos
a enviar el dato ‘a’ a la posición de memoria elegida. Una vez enviado se incrementará el
contador interno de direcciones y seguiremos almacenando datos durante las cinco siguientes
posiciones. Cada vez que escribamos un dato en memoria mostraremos por el LCD la
dirección escrita y el dato que contiene. El formato podría ser este:
W
D
I
R
@
D
A
T
D
Donde @ es la posición de memoria a escribir y D el dato que contiene.
Una vez terminadas las operaciones de escritura, accederemos a la memoria para leer los datos
de las posiciones de memoria antes escritas. Cada vez que leamos una posición de memoria
mostraremos por el LCD la dirección leída así como el dato que contiene. El formato podría
ser este:
53
Memoria Descriptiva
R
D
I
R
@
D
A
T
D
Donde @ es la posición de memoria a escribir y D el dato que contiene.
2.5.5.1.5. Esquema eléctrico
Como se puede observar el microcontrolador y la EEPROM están unidos mediante las
líneas que componen el bus i2c, y éstas a su vez unidas mediante dos resistencias de pull-up a
la tensión de entrada.
En la EEPROM los pines encargados de la habilitación del chip, E0, E1 y E2 están
conectadas a masa ya que al tratarse de una EEPROM de capacidad pequeña, no se necesitan
más líneas de dirección. El bit WC* también se encuentra unido a masa si no fuese de este
modo no se podría escribir en la EEPROM.
LCD
Vcc
Slave
Vcc
Ra0
Rb3
Ra1
Rb2
Ra2
Rb1
Rb0
E0
Vcc
E1
WC*
E2
SCL
Vss
SDA
PIC
16F876
Vcc
Vss
Rc7
Rc6
Rc2
Rc5
SCL
SDA
Figura 34 - Esquema eléctrico.
54
10nF
Memoria Descriptiva
2.5.5.1.6. Diagrama de flujo
Para entender mejor la práctica a realizar podemos observar los siguientes diagramas de flujo.
La figura 35, muestra la primera parte de la práctica, la escritura en la memoria. A grandes
rasgos se muestra la secuencia de cómo se inicializa el microcontrolador, y los pasos a seguir
para la escritura de la memoria.
INICIO
NO
@=5?
Inicializacion
I2C
SI
Cond.
STOP
Iniciamos
escritura
Iniciamos
Lectura
Envio de
Start + @D
NO
Recibido
ACK?
Cond.
STOP
SI
Envio de @
memoria.
@++
NO
Recibido
ACK?
SI
Envio de
DATO
Recibido
ACK?
NO
SI
Figura 35 - Diagrama de flujo de la operación de escritura.
55
Memoria Descriptiva
En la figura 36, tenemos la segunda parte del programa a realizar, la lectura de la
memoria. Desde el PIC accederemos a las mismas direcciones en las que hemos escrito en la
primera parte de la práctica y comprobaremos, mostrando por el LCD, que la escritura se ha
realizado de manera correcta.
Iniciamos
Lectura
Envio de
Start + @D
NO
Recibido
ACK?
Cond.
STOP
SI
Envio de @
memoria
NO
Recibido
ACK?
SI
Envio de DATO
@++
NO
@=5?
SI
Condicion
de STOP
Datos + @
al LCD
Figura 36 - Diagrama de flujo de la operación de lectura.
56
Memoria Descriptiva
2.5.5.1.7. Resumen de Objetivos.
Tenemos que hacer el código para:
•
Inicializar correctamente el modulo de puerto serie síncrono (MSSP) del
microcontrolador.
•
Configurar correctamente el display LCD para poder enviar los datos a la
pantalla.
•
Realizar la operación de escritura en la EEPROM, que conlleva iniciar la
transmisión, seleccionar el dispositivo, enviar los datos a las posiciones de
memoria deseadas y terminar la comunicación.
•
Realizar la operación de lectura de la EEPROM, que implica iniciar la
transmisión, seleccionar el dispositivo, recibir los datos de la posiciones de
memoria deseadas y terminar la comunicación.
57
Memoria Descriptiva
2.5.5.2.
Práctica num. 2
Comunicación I2C entre dos microcontroladores
PIC
2.1 Equipos y materiales
Para realizar la práctica utilizaremos:
• Ordenador PC
• Software MPLAB
• Cable comunicación puerto serie
• 2 Kit MPLAB-ICD debugger
• 2 PIC 16F876
• Bus I2C constituido por dos cables.
• 2 resistencias de pull-up 10 k?
• Display SAMSUNG KS0070
• Cable plano de 16
• Cable plano de 10
• Teclado 16 teclas
2.5.5.2.2. Descripción de funcionamiento
En esta práctica tenemos que programar dos chips de forma que se pueda realizar una
comunicación bidireccional. Un microcontrolador actuará como dispositivo maestro y el otro
como dispositivo esclavo.
El chip que actúa como maestro tiene conectado un teclado hexadecimal y el que actúa
como esclavo un display LCD. Por lo tanto en el modulo master realizaremos una detección de
tecla y guardaremos la tecla pulsada y procederemos a guardarlo en el registro MensajeOut y
se procederá a enviarla.
Una vez enviada, el esclavo recibirá una interrupción debido a que la comunicación ha
concluido y tendremos el valor de la tecla a mostrar por el LCD en el registro MensajeIn. Para
demostrar que la comunicación es bidireccional una vez recibido el mensaje en el slave,
mandaremos un mensaje al master para concluir que se ha recibido.
2.5.5.2.3. Funcionamiento del teclado.
El teclado, que estará conectado con el microcontrolador master, consta de 16
pulsadores distribuidos en cuatro filas y cuatro columnas. La acción del pulsador cortocircuita
58
Memoria Descriptiva
sus correspondientes lineas de fila y columna, mientras que el resto de pulsadores, no
accionados, deja en circuito abierto sus correspondientes lineas de fila y columna.
La disposición de las teclas podría ser la siguiente:
1
2
3
F
4
5
6
E
7
8
9
D
A
0
B
C
Figura 37 - Disposición del teclado
El teclado consta de una serie de interruptores conectados de la siguiente manera:
Con lo cuál, al pulsar una tecla cerramos el interruptor y comunicamos la fila con la
columna.
1
2
3
F
4
5
6
E
7
8
9
D
A
0
B
4x200O
Figura 38 – Esquema eléctrico del teclado
59
C
Memoria Descriptiva
2.5.5.2.4. Funcionamiento del display.
Las pantallas de cristal líquido LCD (Liquid Crystal Display) alfanuméricas se
clasifican según el número de caracteres y líneas que pueden mostrar. Las configuraciones
más usuales son de 8x1, 16x1, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2, 40x4. Una gran mayoría
de los LCDs están basados en el microcontrolador HITACHI 44780 u otro compatible, de
forma que la configuración y anejo es bastante similar en muchos de ellos. El tamaño de los
caracteres que muestran son de 5x7 o 5x10 píxels. Permiten modos de interfaz de 4-bits u 8
bits a µP/µC. Por otro lado muchos también incorporan retro-iluminación por diodos led
verde, para facilitar su lectura. Para la conexión de un LCD con un sistema electrónico se
disponen generalmente de 14 pins con la siguiente asignación de la Tabla 8. En las pantallas
retro-iluminadas se incluyen los terminales A, K, de los leds de iluminación. En el caso de la
JM162A, se añaden los pines 15 y 16 con esta funcionalidad, tal y como se muestra en la
Figura 39.
#PIN
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Nombre
Vss
Vdd
Vee
RS
R/W
E
DB0
DB1
DB2
DB3
DB4
DB5
DB6
DB7
A
K
Función
Masa (0V)
Alimentación (+5V)
Contraste (Vss=Vee=Vdd)
Selección de modo (dato=1/comando=0)
Lectura/escritura de comando (lectura=1/ecritura=0)
Enable ( Validación DB<7:0> en flanco 1? 0)
Bit 0 (LSB) de dato
Bit 1 de dato
Bit 2 de dato
Bit 3 de dato
Bit 4 de dato
Bit 5 de dato
Bit 6 de dato
Bit 7 (MSB) de dato
Ánodo (+) retro-iluminación
Cátodo (-) retro-iluminación
Tabla 8. Asignación de los pines del JM162A
Figura 39 - Display LCD
60
Memoria Descriptiva
2.5.5.2.5. Bases teóricas.
Esta práctica utiliza un detector de tecla, por lo tanto el chip tiene que interpretar las
señales de entrada y salida que están conectadas al teclado. Hay que tener en cuenta que antes
de hacer esto hay que inicializar tanto el master como el esclavo para prepararlos para la
comunicación i2c en el modo adecuado. Para ello hay que habilitar en cada chip el puerto serie
síncrono, toda la información sobre la configuración de este modulo se encuentra en el Anexo
I.
Una vez realizadas las inicializaciones pertinentes y tengamos una tecla pulsada, ésta
se guardará en el registro MensajeOut. El esclavo hasta el momento que reciba tecla mostrará
el mensaje “ESPERANDO”, una vez recibida la tecla que estará guardada en el registro
MensajeIn, se mostrará la tecla recibida por el LCD donde el formato de presentación puede
ser este:
R
E
C
I
B
O
T
E
C
L
A
-
>
X
Donde X es la tecla recibida en MensajeIn
Una vez mostrada la tecla recibida por el display, el master ha de recibir un OK por
parte del esclavo. Para ello el master tiene que ponerse en modo de recepción (Ver Anexo I).
2.5.5.2.6. Esquema eléctrico.
Como se puede observar las líneas de comunicación SDA y SCL del master están
unidas con las respectivas líneas SDA y SCL del esclavo y están unidas a Vcc mediante dos
resistencias de pull-up.
Del PIC master deriva el teclado, para controlar el teclado hemos optado por tomar
RC<7:5> y RC2 como salida y RB<3:0> como entrada. El funcionamiento seria que al
proporcionarle tensión a una de las salidas de RC, si pulsásemos cualquiera de las dos teclas
que están conectadas a la a la columna activada, en RB obtendríamos un ‘1’ ya que
comunicaríamos la columna con la fila. Si pulsásemos la misma tecla y la columna no
estuviese activada, en RB obtendríamos un ‘0’.
Del chip esclavo deriva el display LCD, utilizaremos RB<3:0> como salidas para
escribir el dato a enviar a la pantalla del LCD y utilizaremos RA<2:0> para controlar RS, RW
y E de la pantalla del LCD respectivamente.
61
Memoria Descriptiva
LCD
Vcc
Master
Teclado
Slave
Rb3
Rb2
Vcc
Rb1
PIC
16F876
Ra0
Rb3
Ra1
Rb2
Ra2
Vcc
Vss
Rb1
Rb0
Rb0
PIC
16F876
10nF
Vcc
Vss
Rc7
Rc7
Rc6
Rc6
Rc2
Rc5
Rc2
Rc5
SCL
SDA
SCL
SDA
Figura 40 - Esquema eléctrico de la práctica 2
62
10nF
Memoria Descriptiva
2.5.5.2.7. Diagrama de flujo.
En esta práctica, como en la primera, tenemos dos diagramas de flujo, uno será el
diagrama de flujo del dispositivo master, figura 41, donde se realiza la detección de la tecla a
enviar al dispositivo esclavo.
INICIO
Inicializacion
I2C
Master
Testear
teclado
NO
Tecla
Apret?
SI
Enviar
Tecla
Cond.
STOP
NO
Recibido
ACK?
SI
Recibir
Cond.
STOP
Recibido
ACK?
SI
NO
Figura 41 - Diagrama de flujo del programa master
63
Memoria Descriptiva
En la figura 42, se observa el diagrama de flujo correspondiente al dispositivo esclavo
que se encargará de mostrar por el LCD la tecla recibida, una vez recibida la interrupción
pertinente.
INICIO
Inicializacion
I2C Slave
Inicializar
LCD
INT
Mostrar LCD
‘Esperando’
NO
Evento
i2c?
SI
Mirar
Estado
NO
Envio
OK?
Recibio
tecla?
SI
SI
Mostrar
tecla LCD
RETURN
Figura 42 - Diagrama de flujo del programa esclavo.
64
Enviamos
OK
Memoria Descriptiva
2.5.5.2.8. Resumen de Objetivos.
Tenemos que hacer el código para el PIC master:
-
Realizar una correcta inicialización para la comunicación i2c
Que se reconozcan los pulsadores cuando apretemos las teclas.
Gestión para el envío del registro MensajeOut al esclavo.
Gestión para la recepción del OK por parte del esclavo.
Código para el PIC esclavo:
-
Realizar una correcta inicialización para la comunicación i2c.
Configuración del LCD
Gestión de la interrupción para los eventos del MSSP.
Envío del registro MensajeIn al display.
65
Memoria de cálculo
3 .MEMORIA DE CÁLCULO.
66
Memoria de cálculo
3.1.
Cálculos del programa ASM
Los cálculos que haremos en el programa serán de los tiempos de espera para la
configuración correcta de la pantalla LCD, que como se puede ver en el apartado 2.3.6.3
en la Tabla 2 ‘Juego de instrucciones de la pantalla LCD’. Según el tipo de instrucción
habrá que esperarse un tiempo determinado.
El menor tiempo de espera es de 39 µs que se utiliza en instrucciones que implican la
escritura del LCD y la situación del cursor. El mayor tiempo de espera es de 1.53 ms
empleado para instrucciones de limpieza de pantalla y situar el cursor en la posición
original.
Estos tiempos de espera son siempre el mínimo tiempo precisado para realizar las
instrucciones correspondientes, de forma que hemos realizado una función genérica
llamada Espera que cuenta 50µs por el valor que introduzcamos en la variable temps.
Para esta función utilizamos el TIMER0 del microcontrolador, para calcular el
tiempo de espera se utiliza la siguiente ecuación:
t ESPERA = 4 × TOSC × (−TMR0) × N
(1)
Donde N es el pre-scaler del registro ‘OPTION-REG’ 1:N, y TOSC es el periodo de
oscilación que es la inversa de la frecuencia de oscilación de 4MHz que tenemos en el
µC y no asignaremos pre-scaler en nuestro caso de forma que N valdrá 1.
Con lo cual tenemos:
t ESPERA = 4 × TOSC × (−TMR0) × N = 4 ×
1
× (−TMR0) × 1 = 4 µs × (−TMR0)
4 MHz
(2)
Por lo que para un tiempo de espera de 50 µs:
t ESPERA = 4 × TOSC × (−TMR0) × N = 4 ×
(−TMR0) =
1
× (−TMR0) × 4 = 4 µs × (−TMR0) = 50µs ⇒
4 MHz
50 µs
= 12.5
4 µs
(3)
Con lo cual necesitaríamos poner como mínimo el TMR0 a –12.5 que eso es en
hexadecimal con 8 bits el CE, con lo cual el código de la funcion Espera quedará de la
siguiente manera:
Espera
; Rutina de Temporizacion, Perdemos 50us x W
BANK1
Bcf OPTION_REG,T0CS
bsf
OPTION_REG,PSA
BANK0
; Seleccionamos Banco 1
;Seleccionamos reloj interno como clock
para
;el TMR0
;Pre-escaler no asignado al TIMER0
67
Memoria de cálculo
carga movlw D’206’
movwf TMR0
timer btfsc TMR0,7
goto timer
decfsz temps,f
goto
carga
return
;Cargamos un tiempo de 50us al Timer 0
Codigo 1. Rutina de temporizacion Espera
De modo que de esta forma, y dependiendo del tiempo de espera necesario para
cada instrucción introduciremos un valor en la variable temps, de forma que se ejecutará
esta función 50 µs x temps.
Otro cálculo que deberemos realizar, es el del valor que hay que escribir en el
registro SSPADD del modulo MSSP para que el generador de baudios vaya a la
velocidad que queremos. Nosotros transferiremos a una velocidad de 100 kHz.
Teniendo en cuenta que la frecuencia de oscilación del microcontrolador es de 4 MHz,
sabremos entonces con la siguiente fórmula cual es el valor que ha de tener SSPADD.
4MHz
Fosc
VGB =
⇒ 100kHz =
⇒ SSPADD = 9( Decimal ) (4)
4 * ( SSPADD + 1)
4 * (SSPADD + 1)
3.2. Cálculos de la comunicación I2C.
Para poder calcular los tiempos de transacción de datos, bien para la práctica 1 o
bien para la práctica 2, primero deberemos calcular el periodo de la línea SCL con la
cual sincronizaremos a los dispositivos conectados.
Para las prácticas hemos utilizado una velocidad de 100 kHz. Conocemos entonces la
frecuencia con la que nos sincronizaremos con el resto de dispositivos por la línea SCL
encargada de enviar la señal de reloj. El periodo de la señal de reloj será entonces:
TSCL =
1
1
=
= 10 µs
FSCL 100kHz
(5)
Teniendo esto en cuenta, podemos observar los cronogramas de ambas prácticas
y realizar un cálculo aproximado de cuando recibiremos el bit de reconocimiento. Los
bits de reconocimiento ACK de los dispositivos esclavos se realizan de manera
automática en cambio, cuando es el dispositivo master el receptor, éste deberá
realizarlo por software.
Como las operaciones de lectura y de escritura que se realizan en la memoria
EEPROM de la práctica 1 son análogas, hemos escogido el cronograma de la operación
de escritura en la EEPROM de un byte.
Figura 43 - Operación de escritura en la EEPROM.
68
Memoria de cálculo
En el cronograma se puede observar como después de cada byte enviado, sea de
selección del dispositivo, dirección, o dato, se recibe el bit de reconocimiento ACK por
parte de la EEPROM. Este bit se recibe en el noveno pulso de reloj de la línea SCL, y se
efectúa a los 5 µs de haber recibido un dato valido como se puede observar en la
siguiente figura donde se muestra la condición de inicio y el envío del byte de control o
selección del dispositivo.
Figura 44 - Condición de Start y envío del byte de control.
En la segunda práctica se puede observar como del mismo modo este bit de
reconocimiento llega del mismo modo.
Figura 45 - Escritura del master al esclavo en la práctica 2.
69
Memoria de cálculo
Al igual que el master, el esclavo deberá esperar el ACK del master en las operaciones
de lectura.
Figura 46 - Operaciones de lectura del esclavo de la Práctica 2
3.3. Cálculo de los circuitos eléctricos.
3.3.1. Cálculo de las resistencias del pull-up del bus I2C
Para la correcta utilización del bus I2C tenemos que calcular el valor de las
resistencias de pull-up. Estas resistencias se utilizan para tener un nivel alto en el bus si
ningún dispositivo accede a él. En varios Data Sheets que se han consultado indican que
para una velocidad de 100 kHz las resistencias de pull-up deben tener un valor de 10
k? . Teniendo en cuenta que la tensión de alimentación del bus es de 5V podemos
observar:
I=
VCC
5V
=
= 0,0005 A = 50 µA
Rpull − up 10kΩ
(5)
La intensidad a través de la resistencia será muy pequeña por lo que no
provocará problemas a la hora de mantener el nivel alto del bus, y mantener un nivel
bajo cuando un dispositivo acceda al bus.
70
Presupuesto
4. PRESUPUESTO
71
Presupuesto
4.1. Lista de elementos
En este apartado sacaremos la lista de elementos necesarios para hacer la placa de las
diferentes prácticas.
4.1.1. Lista elementos del hardware de la práctica 1
CODIGO
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
1.10
1.11
1.12
1.13
1.14
1.15
1.16
1.17
1.18
1.19
1.20
1.21
DESCRIPCIÓN
Regleta de conexiones 2 contactos
LED rojo 5mm
EEPROM M24C01
Condensador electrolítico 47 uF. 25V
Condensador Poliéster 100 nF 400V. raster
Condensador Poliéster 22 nF 400V. raster
Estabilizador de tensión positiva LM7805
Resistencia 1K ohmios 1/4 watio
Resistencia 10K ohmios 1/4 watio
Resistencia 4,7K ohmios 1/4 watio
banana paso 4mm negra
banana paso 4mm roja
Diodo rectificador estándar 1,5 Am
Conector macho C/I para cable plano 10 hilos 1
metro
Conector macho C/I para cable plano 16 hilos 1
metro
Zócalo torneado 28 pines estrecho
Zócalo 16 pines
Placa fotosensible baquelita.1,2 mm 100x160 mm
Horas de montaje
Cable bus I2C D 0.5mm
Resistencia array 5 1k ohmios
Tabla 9. Lista elementos módulo 1
72
CANTIDAD
1
1
1
1
2
1
1
1
2
1
1
1
1
1
1
1
1
1
5
0.5m
1
Presupuesto
4.1.2. Lista elementos del hardware de la práctica 2.
CODIGO
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.8
2.10
2.11
2.12
2.13
2.14
2.15
2.16
2.17
2.18
2.19
2.20
DESCRIPCIÓN
Regleta de conexiones 2 contactos
LED rojo 5mm
Condensador electrolítico 47 uF. 25V
Condensador Poliéster 100 nF 400V. raster
Condensador Poliéster 22 nF 400V. raster
Estabilizador de tensión positiva LM7805
Resistencia 1K ohmios 1/4 watio
Resistencia 10K ohmios 1/4 watio
Resistencia 4,7K ohmios 1/4 watio
banana paso 4mm negra
banana paso 4mm roja
Diodo rectificador estándar 1,5 Am
Conector macho C/I para cable plano 10 hilos 1
metro
Conector macho C/I para cable plano 16 hilos 1
metro
Placa fotosensible baquelita.1,2 mm 100x160 mm
Zócalo torneado 28 pines estrecho
Zócalo 16 pines
Cable bus I2C 0.5mm
Horas de montaje
Resistencia array 5 1k ohmios
Tabla 10. Lista elementos módulo 2
73
CANTIDAD
2
2
2
4
2
2
2
2
2
2
2
2
2
2
2
2
2
1m
5
2
Presupuesto
4.2. Lista de precios unitarios
En este apartado ponemos los precios de cada elemento de cada placa.
4.2.1. Lista de precios unitarios de elementos de la práctica 1
CODIGO
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
1.10
1.11
1.12
1.13
1.14
1.15
1.16
1.17
1.18
1.19
1.20
1.21
DESCRIPCIÓN
Regleta de conexiones 2 contactos
LED rojo 5mm
EEPROM M24C01
Condensador electrolítico 47 uF. 25V
Condensador Poliéster 100 nF 400V. raster
Condensador Poliéster 22 nF 400V. raster
Estabilizador de tensión positiva LM7805
Resistencia 1K ohmios 1/4 watio
Resistencia 10K ohmios 1/4 watio
Resistencia 4,7K ohmios 1/4 watio
banana paso 4mm negra
banana paso 4mm roja
Diodo rectificador estándar 1,5 Am
Conector macho C/I para cable plano 10 hilos 1
metro
Conector macho C/I para cable plano 16 hilos 1
metro
Zócalo torneado 28 pines estrecho
Zócalo 16 pines
Placa fotosensible baquelita.1,2 mm 100x160 mm
Horas de montaje
Cable bus I2C 0.5mm
Resistencia array 5 1k ohmios
Tabla 11. Lista precios unitarios elementos módulo 1
74
PRECIO
0.22 €
0.09 €
0.50 €
0.13 €
0.19 €
0.16 €
0.29 €
0.0187 €
0.0187 €
0.0187 €
0.87 €
0.87 €
0.057 €
0.16 €
0.28 €
0.51 €
0.12 €
0.32 €
15.00 €/h
0.12 €/m
0.18 €
Presupuesto
4.2.2. Lista de precios unitarios de elementos de la práctica 2
CODIGO
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
2.11
2.12
2.13
2.14
2.15
2.16
2.17
2.18
2.19
2.20
DESCRIPCIÓN
Regleta de conexiones 2 contactos
LED rojo 5mm
Condensador electrolítico 47 uF. 25V
Condensador Poliéster 100 nF 400V. raster
Condensador Poliéster 22 nF 400V. raster
Estabilizador de tensión positiva LM7805
Resistencia 1K ohmios 1/4 watio
Resistencia 10K ohmios 1/4 watio
Resistencia 4,7K ohmios 1/4 watio
banana paso 4mm negra
banana paso 4mm roja
Diodo rectificador estándar 1,5 Am
Conector macho C/I para cable plano 10 hilos 1
metro
Conector macho C/I para cable plano 16 hilos 1
metro
Placa fotosensible baquelita.1,2 mm 100x160 mm
Zócalo torneado 28 pines estrecho
Zócalo 16 pines
Cable bus I2C 0.5mm
Horas de montaje
Resistencias array 5 1k ohmios
Tabla 12. Lista de precios unitarios de elementos del módulo 2
75
PRECIO
0.22 €
0.09 €
0.13 €
0.19 €
0.16 €
0.29 €
0.0187 €
0.0187 €
0.0187 €
0.87 €
0.87 €
0.057 €
0.16 €
0.28 €
3.22 €
0.51 €
0.12 €
0.12 €/m
15.00 €/h
0.18 €
Presupuesto
4.3. Coste total
Aquí unimos las cantidades y los precios unitarios para sacar el precio total de cada
módulo.
4.3.1. Coste total de la práctica 1
CODIGO
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
1.10
1.11
1.12
1.13
1.14
1.15
1.16
1.17
1.18
1.19
1.20
1.21
DESCRIPCIÓN
Regleta de conexiones 2 contactos
LED rojo 5mm
EEPROM M24C01
Condensador electrolítico 47 uF. 25V
Condensador Poliéster 100 nF 400V. raster
Condensador Poliéster 22 nF 400V. raster
Estabilizador de tensión positiva LM7805
Resistencia 1K ohmios 1/4 watio
Resistencia 10K ohmios 1/4 watio
Resistencia 4,7K ohmios 1/4 watio
banana paso 4mm negra
banana paso 4mm roja
Diodo rectificador estándar 1,5 Am
Conector macho C/I para cable plano 10
hilos 1 metro
Conector macho C/I para cable plano 16
hilos 1 metro
Zócalo torneado 28 pines estrecho
Zócalo 16 pines
Placa fotosensible baquelita.1,2 mm
100x160 mm
Horas de montaje
Cable bus I2C D 0.5mm
Resistencia array 5 1k ohmios
TOTAL
CANTIDAD
1
1
1
1
2
1
1
1
2
1
1
1
1
1
PRECIO
0.22 €
0.09 €
0.50 €
0.13 €
0.19 €
0.16 €
0.29 €
0.0187 €
0.0187 €
0.0187 €
0.87 €
0.87 €
0.057 €
0.16 €
TOTAL
0.22 €
0.09 €
0.50 €
0.13 €
0.38 €
0.16 €
0.29 €
0.0187 €
0.0374 €
0.0187 €
0.87 €
0.87 €
0.057 €
0.16 €
1
0.28 €
0.28 €
1
1
1
0.51 €
0.12 €
3.22 €
0.51 €
0.12 €
3.22 €
5
15.00
€/h
0.12 €/m
0.18 €
75 €
0.5m
1
Tabla 13. Coste total del módulo 1
76
0.06 €
0.18 €
83.17 €
Presupuesto
4.3.2. Coste total de la práctica 2
CODIGO
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
2.11
2.12
2.13
2.14
2.15
2.16
2.17
2.18
2.19
2.20
DESCRIPCIÓN
Regleta de conexiones 2 contactos
LED rojo 5mm
Condensador electrolítico 47 uF. 25V
Condensador Poliéster 100 nF 400V. raster
Condensador Poliéster 22 nF 400V. raster
Estabilizador de tensión positiva LM7805
Resistencia 1K ohmios 1/4 watio
Resistencia 10K ohmios 1/4 watio
Resistencia 4,7K ohmios 1/4 watio
banana paso 4mm negra
banana paso 4mm roja
Diodo rectificador estándar 1,5 Am
Conector macho C/I para cable plano 10
hilos 1 metro
Conector macho C/I para cable plano 16
hilos 1 metro
Placa fotosensible baquelita.1,2 mm
100x160 mm
Zócalo torneado 28 pines estrecho
Zócalo 16 pines
Cable bus I2C 0.5mm
Horas de montaje
Resistencias array 5 1k ohmios
TOTAL
CANTIDAD
2
2
2
4
2
2
2
2
2
2
2
2
2
PRECIO
0.22 €
0.09 €
0.13 €
0.19 €
0.16 €
0.29 €
0.0187 €
0.0187 €
0.0187 €
0.87 €
0.87 €
0.057 €
0.16 €
TOTAL
0.44 €
0.18 €
0.26€
0.76 €
0.32 €
0.58 €
0.0374 €
0.0374 €
0.0374 €
1.74 €
1.74 €
0.114 €
0.32 €
2
0.28 €
0.56 €
2
3.22 €
6.44 €
2
2
1m
5
0.51 €
0.12 €
0.12 €/m
15.00
€/h
0.18 €
1.02 €
0.24 €
0.12 €
75 €
2
Tabla 14. Coste total del módulo 2
77
0.36 €
88.56 €
Presupuesto
4.4. Resumen del presupuesto
Aquí pongo el precio de lo que costaría el total de realizar los módulos para las
prácticas para los diferentes grupos. Se han pensado 10 unidades del hardware
específico de cada práctica a realizar para que la mitad de los grupos de prácticas
realicen la primera práctica y la segunda práctica para los restantes.
ELEMENTO
PRÁCTICA 1
PRÁCTICA 2
UNIDADES
10
10
PRECIO
83.17 €
88.56 €
TOTAL
IVA 16%
TOTAL CON
IVA
TOTAL
831.70 €
885.60 €
1,711.30 €
273.81 €
1,985.11 €
Tabla 15. Resumen presupuesto
No incluyo los ordenadores, ni los kits del MPLAB-ICD, teclados y pantallas de LCD,
debido a que ya están en los laboratorios de pruebas y no es necesario comprar estos
elementos ya que se pueden aprovechar.
78
Planos
5. PLANOS
79
Planos
En este aparatado se exponen los esquemas eléctricos de los elementos que componen
las prácticas. A continuación los esquemas de cada módulo con los esquemas de sus
respectivas prácticas.
5.1 . Esquemas de elementos
Aquí ponemos los esquemas de los elementos independientes de las prácticas que
vamos a realizar.
5.1.1. Esquema Regulador fuente tensión
U1
LM7805CT
J1
LED1
Vreg
IN OUT
HDR1X2
47uF
100nF
C1
C2
LED_red R1
100nF
1.0kohm
C3
Figura 47 - Esquema regulador fuente tensión
5.1.2. Esquema comunicación I2C
Vcc
2 x 10 k Ohmios
SDA
SCL
SDA
SCL
Figura 48 - Esquema comunicación I2C
80
Planos
5.1.3. Conector teclado
En este apartado se indican las conexiones del teclado que hay en nuestro módulo:
Rb0
Rb2
Rc2
Rc6
Rb1
Rb3
Rc5
Rc7
RIBBON 10H
Figura 49 - Teclado producto
5.1.4. Esquema conector pantalla LCD
Vcc
Ra1
Ra0
Ra2
Rb0
Rb2
Rb1
Rb3
R IB B O N
1 6 H
Figura 50 - LCD módulo 2
81
Planos
5.2 Esquemas Prácticas
5.2.1. Esquemas Práctica 1
LCD
Vcc
Slave
Vcc
Ra0
Rb3
Ra1
Rb2
Rb1
Ra2
Rb0
E0
Vcc
E1
WC*
E2
SCL
Vss
SDA
PIC
16F876
Vcc
10nF
Vss
Rc7
Rc6
Rc2
Rc5
SCL
SDA
Figura 51 - Esquema práctica 1
5.2.2. Esquema Práctica 2
LCD
Vcc
Master
Teclado
Slave
Rb3
Ra0
Rb3
Rb2
Ra1
Rb2
Vcc
Rb1
PIC
16F876
Ra2
Vcc
Vss
Rb1
Rb0
Rb0
PIC
16F876
10nF
Vcc
Vss
Rc7
Rc7
Rc6
Rc6
Rc2
Rc5
Rc2
Rc5
SCL
SDA
SCL
SDA
Figura 52 - Esquema práctica 2
82
10nF
Anexos
ANEXOS
I
Anexos
A. MODULO DE PUERTO SERIE SÍNCRONO (MSSP)
Este módulo se encuentra en numerosos microcontroladores, como en nuestro
caso en el PIC 16F876, por lo tanto en este apartado se explicará la implementación del
i2c en el microcontrolador utilizado.
El módulo puerto serie síncrono (MSSP) es una interfaz serie muy utilizada para
comunicarse con otros dispositivos periféricos o microcontroladores. Estos dispositivos
puedes ser memorias EEPROM, registros de desplazamiento, displays, drivers,
convertidores A/D etc.
El módulo SSP puede operar en dos modos:
• Interfaz Periférica Serie (SPI)
• Inter- Circuito Integrado (I2C)
A.1 SSP en operación I2C
El módulo SSP en modo I2C implementa completamente todas las funciones
master y slave (incluyendo la llamada general) y provoca interrupciones en los bits de
START y STOP en hardware, para determinar el estado del bus (función Multimaster).
El modulo SSP implementa las especificaciones estándar tanto direccionando 7 bits
como 10 bits.
Hay un filtro “glitch” en los pines SCL y SDA cuando son entradas. Este filtro
opera tanto en modo estándar como en High-speed. Cuando estos pines son salidas hay
un control slew rate en el pin que es independiente de la frecuencia del dispositivo.
Figura 53 - Diagrama de bloques en modo I2C en modo esclavo.
II
Anexos
Los pines SDA y SCL se configuran automáticamente cuando se habilita el
modo I2C. Las funciones del modulo SSP se habilitan una vez activado el bit SSPEN
(SSPCON<5>).
III
Anexos
A.1.1 Registros para las operaciones I2C
El modulo SSP tiene seis registros para las operaciones I2C. Estos son:
A.1.1.1 Registro de control SSP (SSPCON).
Bit 7: WCOL. Bit de detección de colisión de escritura
Master: 0- No hay colisión.
1- Escritura en SSPBUF mientras las condiciones I2C no son válidas.
Slave: 0-No hay colisión.
1- SSPBUF es escrito mientras aún se está transmitiendo la palabra
previa (se tiene que borrar por software).
Bit 6: SSPOV. Bit indicador de Overflow en la recepción.
0- No hay overflow.
1- Un byte es recibido mientras SSPBUF espera el byte previo. SSPOV no tiene
importancia en la transmisión. (Se tiene que borrar por software).
Bit 5: SSPEN. Bit de habilitación del SSP. Cuando se habilita los pines se tienen que
configurar como I/O.
0- Se deshabilita el puerto serie y se configuran los pines de puerto como I/O
1- Se habilita el puerto serie y se configura SDA y SCL como fuente de los
pines del puerto serie.
Bit 4: CKP. Bit de selección de polaridad del clock en I2C Ö SCK release control
0- Mantiene el clock bajo (estiramiento del clk). Usado para asegurar un tiempo
setup de los datos.
1- Habilitación del clk.
Bit <3:0>: SSPM <3:0> Bits de selección de modo SSP.
0110: I2C modo esclavo (7 bits)
0111: I2C modo esclavo (10 bits)
1000: I2C modo master Ö fclk: Fosc/4 (SSPADD+1)
1011: I2C modo master controlado por firmware (esclavo inactivo).
1110: I2C modo master controlado por firmware (7 bits) con bits de START y
STOP con interrupciones habilitadas.
1111: I2C modo master controlado por firmware (10 bits) con bits de START y
STOP con interrupciones habilitadas.
1001, 1010, 1100, 1101: Reservados.
IV
Anexos
A.1.1.2 Registro de control SSP2 (SSPCON2).
Bit 7: GCEN. Bit de habilitación de llamada general
0- Interrupción deshabilitada.
1- Interrupción habilitada cuando se recibe llamada general (0000H) en SSPSR.
Bit 6: ACKSTAT. Bit de estado de ACK (Solo en modo master). Transmitiendo.
0- ACK recibido del esclavo.
1- ACK no recibido del esclavo.
Bit 5: ACKDT. Bit de dato del ACK (solo en modo master). Recibiendo. Valor que
será transmitido cuando el usuario inicie una secuencia de reconocimiento al final de
la
recepción.
0- ACK
1- NACK
Bit 4: ACKEN. Habilitación de la secuencia de ACK (solo en modo master).
Recepción.
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 inactivada.
1- Habilita recepción por I2C
Bit 2: PEN. Bit de habilitación de condición de STOP (solo modo master).SCK release
control.
0- Condición de STOP inactivada.
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 inactivada.
1- Inicia la condición de repetición de START en los pines SDA y SCL. Se
limpian automáticamente por hardware.
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.
Nota: Para los bits ACKEN, RCEN, PEN, RSEN, SEN.
V
Anexos
Si el módulo I2C no esta activo, estos bits pueden no estar a ‘1’ y el SSPBUF
puede no
ser escrito (o la escritura en SSPBUF deshabilitada).
A.1.1.3. Registro de estado (SSPSTAT).(Habilitado para I2C )
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)
Bit 6: CKE. Clock edge select
0- niveles de entrada que conforman el I2C
1- niveles de entrada que conforman el SMBUS
Bit 5: D/A*. Bit de dato / dirección.
0- El último byte recibido o transmitido fue una dirección
1- El último byte recibido o transmitido fue un dato.
Bit 4: P. Bit de STOP. Este bit es borrado cuando el módulo, SSPEN =’0’, es
deshabilitado.
0- Un bit de STOP no fue lo último detectado.
1- Bit de STOP fue lo último detectado. (es 0 cuando hay Reset)
Bit 3: S. Bit de START. Este bit es borrado cuando el módulo SSP es deshabilitado.
0- Bit de START no fue lo último detectado.
1- Bit de START fue lo ultimo detectado (este bit es 0 cuando hay Reset).
Bit 2: R/W*. Este bit mantiene la información leída o escrita siguiendo la última
dirección completada. Este bit solo es valido desde la dirección completa hasta el
próximo START, STOP o NACK.
0- Escribir.
1- Leer.
Bit 1: UA. Bit de actualización de dirección. (Solo se utiliza para I2C direccionando 10
bits).
0- la dirección no necesita ser actualizada.
1- Indica que el usuario necesita la dirección en el registro SSPADD
Bit 0: BF. Bit de estado de Buffer.
Recepción: 0- Decepción no completa, SSPBUF vacío.
1- Recepción completa, SSPBUF lleno.
•
•
Transmisión: 0- Transmisión completa, SSPBUF vacío.
1- Transmisión incompleta, SSPBUFF lleno.
Registro de desplazamiento SSP (SSPSR) - no es directamente accesible.
Registro de direcciones (SSPADD).
VI
Anexos
Antes de seleccionar alguno de los modos de I2C, las líneas SDA y SCL se
deben programar como entradas seleccionando los bits apropiados del TRIS.
Seleccionando un modo I2C por la activación del bit SSPEN, habilita las líneas SCL y
SDA para ser utilizadas como línea de reloj y de datos respectivamente.
Se tienen que proporcionar externamente resistencias de pull-up a los pines SDA
y SCL para una operación adecuada del modulo I2C.
El bit CKE (SSPSTAT<6:7>) pone los niveles de los pines SDA y SCL en
cualquiera de los modos master o esclavo. Cuando CKE = ‘0’ los niveles se
conformaran según las especificaciones I2C.
El registro SSPSTAT entrega el estado de la transferencia de datos. Esta
información incluye la detección de los bits de START y STOP especificando si el byte
recibido fue dato o dirección, si el próximo byte es la terminación de una dirección de
10 bits, y si este es una transferencia de datos de lectura o escritura.
SSPBUF es el registro donde la transferencia de datos se escribe en algún
dispositivo o se lee desde algún dispositivo. El SSPBUF es el registro para el cual la
transferencia de datos es escrita hacia o leída desde. El registro SSPSR desplaza el dato
dentro o fuera del dispositivo.
En operación de recepción, el SSPBUF y SSPSR crean un receptor "doubled
buffered". Cuando llegan dos bytes uno se decepciona mientras el anterior es leído.
Cuando el byte completo es recibido, se transfiere hacia el registro SSPBUF y el flag bit
SSPIF es elegido. Si otro byte completo es recibido antes de que el registro SSPBUF
sea leído, se recibe un overflow y el bit SSPOV (SSPCON<6>) es elegido y el byte en
SSPSR se pierde.
El registro SSPADD mantiene la dirección del esclavo. En modo 10-bit, el
usuario necesita primero escribir el byte alto de la dirección (1111 0 A9 A8 0). En
seguida se carga el byte bajo (A7:A0) que completa la dirección.
VII
Anexos
A.2 Modo Esclavo
Cuando el bus I2C se configura como esclavo, las patillas SCL y SDA deberán
configurarse como entradas con los valores apropiados en el registro TRIS. El módulo
SSP anulará el estado de las entradas con los datos de salida cuando así se requiera
(transmisión esclavo). Cuando una dirección o un dato es transferido después de recibir
una dirección el hardware genera automáticamente el impulso ACK y carga los datos a
través del registro SSPSR en el registro SSPBUF.
El módulo SSP no creará el impulso de reconocimiento ACK en cualquiera de las
siguientes dos situaciones (o en las dos a la vez):
•
El bit indicador de “buffer lleno” BF (SSPSTART <0>) se ha puesto a uno antes
de que la transferencia sea recibida.
•
El bit indicador “desbordamiento SSPOV (SSPCON<6>) se ha puesto a uno antes
de que la transferencia sea recibida.
Si el bit BF está a “1”, el registro SSPSR no carga los valores en el SSPBUF pero,
sin embargo, los bits SSPIF y SSPOV si se ponen a “1”.
A.2.1 Direccionamiento
Una vez que el módulos MSSP se ha habilitado, espera que ocurra una condición
Start, a continuación los ochos bits son tomados y desplazados en el registro SSPSR por
cada flanco ascendente de la señal de reloj SDL. El valor del registro SSPSR <7:1> es
comparado con el del SSPADD en el flanco de bajada del octavo impulso de reloj, si la
dirección es igual y además los bits BF y SSPOV están a cero también ocurren los
siguientes eventos:
•
El valor almacenado en el registro SSPSR es cargado en el registro SSPBUF en la
bajada del octavo impulso SCL.
•
El bit BF (“buffer lleno”) se pone a “1” al bajar a cero el octavo impulso de reloj.
•
Se genera un impulso #ACK
•
El Flag de interrupción SSPIF (PIR1<3>) se pone a “1” para generar la
interrupción si es que está habilitada. En el flanco de bajada del noveno pulso de la
señal de reloj SCL
En el modo de direccionamiento de 10-bits, es necesario recibir por el Slave dos
bytes de dirección. Los cinco bits más significativos (MSbs) del primer byte de
dirección especifica si ésta es una dirección de 10 bits. El bit R/W (SSPSTAT <2> debe
especificar escritura, de esta manera el dispositivo slave, recibirá un segundo byte de
dirección.
Para una dirección de 10-bits, el primer byte será igual a ‘1111 0 A9 A8 0 '
dónde A9 y A8 son los dos menos significativos (MSbs) de la dirección. La sucesión de
VIII
Anexos
eventos durante una dirección de 10-bits es como sigue, con los pasos 7 - 9 con el
esclavo-transmitiendo:
1. Recibe el primer byte (alto) de Dirección (los bits SSPIF, BF, y el bit UA
(SSPSTAT <1>) se ponen a "1").
2. Se actualiza el registro SSPADD con segundo (bajo) byte de Dirección (se
ponen a cero los bits UA y se libera la línea SCL).
3. Se leen los registros SSPBUF (se pone a cero el bit BF) y el bit de flag SSPIF
se pone a cero.
4. Se recibe el segundo (bajo) byte de Dirección (los bits SSPIF, BF, y UA se
ponen a uno).
5. Se actualiza el registro SSPADD con el primero (alto) byte de Dirección. Esto
pone a cero el bit UA y deja libre la línea SCL.
6. Se lee el registro SSPBUF (se pone a cero el bit BF) y el bit de flag SSPIF se
pone a cero.
7. Se recibe la condición de Start repetida.
8. Se recibe el primer byte (alto) de Dirección (los bits SSPIF y BF se ponen a
uno).
9. Se lee el registro SSPBUF (se pone a cero el bit BF) y el flag SSPIF se pone a
cero.
Nota: La condición de Start Repetida (paso 7) en el modo del 10-bits se utiliza solo
por la necesidad de emparejar la primera dirección de 7 bits. . El usuario no
actualiza el SSPADD para el segundo byte de la dirección.
A.2.2. Recepción y Transmisión en el modo slave
Cuando el bit R/W del byte de dirección que se ha recibido está a cero y ocurre
una igualdad en la dirección, el bit R/W del registro SSPSTAT se pone a cero y se carga
la dirección recibida en el registro SSPBUF. Cuando el byte de dirección produce un
desbordamiento no se envía el impulso de reconocimiento ACK. Esta situación está
definida porque uno de los bits BF (SSPSTAT<0>) o SSPOV (SSPCON<6>) o ambos,
están a uno. Por cada byte recibido el SSP puede ocasionar una interrupción si
previamente se ha puesto a cero el bit SSPIF (PIR<3>). El registro SSPSAT se utiliza
para conocer el estado del byte recibido.
Si el bit R/W recibido en el byte de dirección se encuentra a “1” y la dirección es
reconocida, el bit R/W del registro SSPSTAT se pone a “1” y la dirección se almacena
en el registro SSPBUF, se envía el impulso de reconocimiento ACK con el noveno bit
de reloj y se mantiene a cero el pin SCL. El dato a transmitir se deberá cargar en el
registro SSPBUF, con lo que también se cargará en el SSPSR, El pin SCL se habilita
con el bit CLK (SSPCON<4>) y el master mantendrá el control de la señal de reloj. El
master obtendrá un bit de datos por cada impulso de reloj, en la bajada del octavo bit
todos los bits estarán ya desplazados en los registros SSPSR. Por cada byte así
transmitido el SSP ocasionará una interrupción si previamente se había puesto a cero el
bit SSPIF (PIR1<3>). El registro SSPSAT se empleará para conocer el estado del byte
transmitido.
El impulso ACK es enclavado en la subida del noveno bit SCL. Si la línea SDA
se mantiene a nivel alto (no hay impulso ACK), el dato a transferir se ha completado. Si
IX
Anexos
el impulso ACK no es enclavado por el esclavo, este se prepara para otro evento Start.
Pero si la línea SDA está a nivel bajo (presencia ACK) el dato a transmitir se cargará en
el registro SSPBUF y por consiguiente en el SSPSR.
ACTUACIÓN DE LOS BYTES RECIBIDOS EN LA TRANSFERENCIA DE DATOS
Estado De los bits en
la transferencia
BF
SSPOV
0
1
1
0
0
0
1
1
Genera impulso Sube a uno el bit SSPIF
ACK
SSPSR
SSPBUF
SI
NO
NO
SI
Æ
SI
NO
NO
NO
(CCP
interrupción
habilitada)
si
genera
está
SI
SI
SI
SI
Nota: Las células sombreadas muestran las condiciones dónde el software del usuario no puso a cero la
condición de desbordamiento.
Tabla 16. Actuación de los bytes recibidos en la transferencia
CRONOGRAMA PARA LA RECEPCION I2C (DIRECCION DE 7 BITS)
Figura 54 - Cronograma del protocolo I2C en recepción y modo de direccionamiento de 7 bits
X
Anexos
CRONOGRAMA PARA LA TRANSMISIÓN I2C (DIRECCION DE 7 BITS)
Figura 55 - Cronograma del protocolo I2C en transmisión y modo de dirección de 7 bits
CRONOGRAMA TRANSMISOR SLAVE EN MODO I2C (10 BITS)
Figura 56 - Cronograma del protocolo I2C slave, en transmisión y modo de dirección de 10 bits
CRONOGRAMA RECEPTOR SLAVE EN MODO I2C (10 bits)
Figura 57 - Cronograma del protocolo I2C slave, en recepción y modo de dirección de 10 bits
XI
Anexos
A.3. Llamada General
Ya hemos comentado que el primer byte que envía el master después de la
condición Start corresponde a la dirección del esclavo al que van dirigidos los siguientes
datos. Excepcionalmente se puede realizar una llamada general. Es decir, a todos los
esclavos, a la que, en teoría, todos deberán responder.
Esta llamada general tiene lugar cuando la dirección enviada tiene todos los bits
a cero (incluso R/W) y es reconocida si el bit GCEN está habilitado (SSPCON2<7> =1).
SECUENCIA DE LLAMADA GENERAL (para 7 y 10 bits)
Figura 58 - En modo I2C se puede realizar una llamada general a todos los esclavos. La dirección es 00H
con R/W a cero.
A.4. Operación SLEEP
Mientras está en modo Sleep, el módulo I2C puede recibir direcciones o datos, y
cuando se empareja la dirección o byte completo se despierta el procesador del modo
Sleep (si la interrupción de SSP se habilita).
A.5. Efecto del Reset
Un reset deshabilita el módulo SSP y termina con la transferencia en curso.
XII
Anexos
A.6. Registros asociados con la operación I2C
Dirección
Nombre
Bit 7
Bit 6
Bit 5
Bit
4
Bit 3
Bit 2
Bit 1
Bit 0
Valor en
POR,BOR
Valor
en el
resto
de
Reset
0Bh,8Bh
INTCON
GIE
PEIE(1)
TOIE
INTE
RBIE
TOIF
INTF
RBIF
0000 000x
0000
000u
10Bh,18Bh
0Ch
PIR1
PSPIF1
ADIF(1)
RCIF
TXIF
SSPIF
CCP1IF
TMR2IF
TMR1IF
0000 0000
8Ch
PIE1
PSPIE
ADIE
RCIE
TXIE
SSPIE
CCP1IE
TMR2IE
TMR1IE
0000 0000
0Dh
PIR2
--
(2 )
--
EEIF
BCLIF
---
---
CCP2IF
-r-0 0 - -0
8Dh
PIE2
--
(2 )
--
EEIE
BCLIE
---
---
CCP2IE
-r-0 0 - -0
0000
0000
0000
0000
-r-0
0 - -0
-r-0
0 - -0
87
TRISC
13h
SSPBUF
PORTC (Direccionamiento de los Datos)
1111 1111
1111
1111
Registro Buffer Transmisión/Recepción del módulo SSP
xxxx xxxx
uuuu
uuuu
0000
0000
--00
0000
14h
SSPCON
WCOL
SSPOV
SSPEN
CKP
SSPM3
SSPM2
SSPM1
SSPPM0
0000 0000
94h
SSPSTAT
SMP
SKE
D/#A
P
S
R/W
UA
BF
--00 0000
Tabla 17 - Leyenda: x = desconocido u= sin cambios
Nota
- = Sin implementar, se lee “0”
1: Estos bit están reservados en los modelos de 28 pines, mantener siempre borrados
2: Estos bits están reservados, mantener siempre borrados
A.7 Modo Master
Trabajando en modo master en el bus I2C puede genera interrupciones cuando
son detectadas las condiciones de START y STOP. Cuando se ocasiona un reset o se
deshabilita el módulo MSSP los bits STOP (P) y START (S) se borran. En este modo
de trabajo las líneas SCL y SDA son manipuladas por el hardware del propio puerto
MSSP. Cuando se habilita la interrupción del SSP el flag SSPIF se pondrá a uno
cuando ocurra uno de los siguientes eventos:
•
Una condición de Start
•
Una condición de Stop
•
Un byte de datos ha sido transmitido/recibido
•
Se ha transmitido el bit de reconocimiento ACK
•
Repetición de condición Start.
XIII
Anexos
Figura 59 - Diagrama de bloques del SSP configurado como I2C en modo Master
Cuando el dispositivo está configurado como master es el encargado de generar
todos los impulsos de reloj y las condiciones START y STOP; la transferencia finaliza
con una condición STOP o con una repetición de la condición START, Con la
repetición de ésta última condición, tiene lugar una nueva transferencia de datos, por lo
que el bus I2C no se libera.
El master que transmite genera un impulso de reloj (SCL) por cada bit a
transmitir por la patilla SDA. El primer byte ha de ser siempre la dirección del
dispositivo esclavo al que ir n destinados los datos (o del que se recibirán). Después de
este primer byte se envía el bit de lectura o escritura, un uno en este bit indica que se
proceder a leer del circuito esclavo, por el contrario, cuando es un cero el esclavo
reconocer los siguientes bytes como bits a escribir en su memoria, registros, etc.
Después de cada byte transmitido el módulo se espera a recibir un bit de
reconocimiento ACK y por último, tendrá lugar una repetición de la condición START
o STOP para finalizar la operación.
Cuando el master tiene que actuar como receptor el primer byte que tiene que
transmitir es la dirección del esclavo del que procederá a leer, seguido del bit R/W (en
este caso, el bit será un uno porque va a proceder a leer de esclavo). Los bits de datos
los recibir a través de la patilla SDA por cada impulso de reloj, SCL, que genere.
Después de cada byte recibido se genera un bit de reconocimiento ACK y se finalizar
con una repetición de la condición START o STOP.
Una secuencia típica de transmisión ser la siguiente:
a)
El usuario genera una condición START habilitando el bit START
(SEN)
del registro SSPCON2.
XIV
Anexos
b)
El SSPIF se pone a uno. El módulo espera el tiempo requerido para
completar la condición de START antes de que se inicie una nueva
operación.
c)
El usuario cargar en el registro SSPBUF la dirección del esclavo.
d)
La dirección es desplazada bit a bit a la salida SDA
e)
El módulo MSSP desplaza el bit ACK del dispositivo esclavo y escribe
su valor en el registro SSPCON2 (SSPCON2<6>).
f)
El módulo genera una interrupción cuando finaliza el noveno impulso
de reloj (pone a uno SSPIF).
g)
El usuario cargar los ocho bits de datos en el registro SSPBUF
h)
Los datos son desplazados bit a bit a la salida SDA hasta transmitir los
ocho bits.
i)
El módulo MSSP desplaza el bit ACK recibido del dispositivo esclavo
y escribe su valor en el registro SSPCON2 (SSPCON2<6>).
j)
Se genera una interrupción al finalizar el noveno impulso de reloj
(pone a “1” SSPIF).
k)
El usuario genera una condición STOP habilitando el bit PEN en el
registro SSPCON2
l)
Se genera una interrupción cuando se completa la condición de STOP.
La condición de START la inicia el usuario cuando habilita el bit SEN
(SSOCIN2<0>). La velocidad del generador de ‚ baudios se recarga con el contenido
de los bits del registro SSPADD<6:0> y se inicia la cuenta. Las dos patillas (SDA y
SCL) se mantendrán a nivel alto hasta que transcurra el tiempo TBRG (BRG=Baud
Rate Generator) después del cual la patilla SDA bajar a cero. Esta acción de bajar
SDA manteniendo a uno la señal de reloj es la que indica que la condición START ha
tenido lugar y causa que suba a uno el bit S (SSPSTAT<3>). Seguidamente, el
generador se vuelve a recargar con el contenido de SSPADD<6:0> y se reanuda de
nuevo la cuenta. Una vez haya transcurrido el tiempo TBRG el bit SEN se borrar y se
suspender la acción de mantener congelada a nivel bajo la patilla SDA. SCL bajará a
cero.
Si el usuario intenta escribir en el registro SPBUF cuando una condición START
está en progreso el bit WCOL subirá a uno y no se cargar el registro SPBUF.
XV
Anexos
A.7.1 Repetición de la señal de START
Hay muchos casos en los que tiene lugar un continuo envió o recepción de datos
del mismo dispositivo esclavo. Para estos casos, no es necesario repetir todas las
secuencias iniciales (una secuencia START seguida de la dirección del esclavo) basta
con repetir una condición START para proseguir con el envío o recepción de datos.
Una repetición de la condición START tiene lugar si después de que baje a cero
el noveno impulso de reloj hay una subida a uno de SDA y se mantiene durante TBRG,
después se sube el reloj y también se mantiene durante TBRG. Por último, se baja a
cero la patilla SDA. En realidad, si observamos el diagrama de tiempos veremos que es
muy similar a la condición START del inicio.
Para ocasionar la repetición hay que poner a uno el bit RSEN (SSPCON2< 1>)
cuando el módulo I2C está inactivo. Al realizarlo, la patilla SCL se mantiene a nivel
cero y el índice de velocidad del generador de baudios se recarga con el contenido del
registro SSPADD<6:0> para iniciar la cuenta. La patilla SDA es liberada (se lleva a
uno) y se desencadena el proceso descrito en el párrafo anterior, finalizando con el
borrado del bit RSEN. Inmediatamente que se detecta la condición START en las
patillas SDA y SCL, el bit S (SSPSTAT<3> subir a uno;
a continuación se
deber escribir en el registro SSPBUF con los siguientes bytes.
XVI
Anexos
Figura 60 - Diagrama de flujos que deberá seguir el programa para generar una condición de START
XVII
Anexos
Figura 61 - Diagrama de flujo que deberá de seguir el programa para generar una repetición de la
condición de START.
XVIII
Anexos
Figura 62 - Continuación del flujo que deberá seguir el programa para generar una repetición de la
condición START.
XIX
Anexos
A.7.2 Secuencia de reconocimiento ACK
La secuencia de reconocimiento se habilita poniendo a uno el bit ACKEN
(SSPCON2<4>). Cuando este bit está a uno la patilla SCL es puesta a cero y el
contenido del bit ACK se presenta en la patilla SDA. Si se desea generar un ACK el bit
ACKDT deber estar borrado, si no, se deberá poner a uno antes de iniciar la secuencia
de reconocimiento. El generador de baudios contará un periodo TBRG antes de llevar
a nivel alto la patilla SCL volver a contar otro periodo y la llevar a nivel bajo. A
continuación, el bit ACKEN será borrado automáticamente, el generador de baudios se
detendrá y el módulo SSP se mantendrá en modo inactivo.
También en este caso, si se trata de escribir en el registro SSPBUF cuando está en
progreso la secuencia de reconocimiento, subir a uno el, bit WCOL y no tendrá efecto
la escritura en el registro.
A.7.3 La condición de STOP
Podemos decir que esta secuencia es la inversa de la START, se inicia
habilitando el bit PEN (SSPCON2<2>). La secuencia finaliza cuando suba a uno la
patilla SDA (también subir a uno el bit P SSPSTAT<4>), transcurra el tiempo TBRG,
se borre el bit PEN y suba a uno el SSPIF.
XX
Anexos
Figura 63 - Diagrama de flujos completo que deberá seguir el programa para una transmisión en modo
master.
XXI
Anexos
Figura 64 - Diagrama de flujos que debe seguir el programa para recepción en modo master
XXII
Anexos
Figura 65 - Diagrama de flujos que deberá seguir el programa para enviar una condición de STOP
XXIII
Anexos
B. Memoria EEPROM ST M24C01C
Esta EEPROM tiene las siguientes características:
-
Dos líneas para interfaz serie i2c (Soporta protocolo de 400kHz)
Única alimentación: de 4.5 a 5.5 V para M24Cxx
Entrada de control de escritura
Escritura de Byte y pagina
Modo de escritura aleatoria y secuencial
Ciclo de programación autotemporizado
Incremento de dirección automático
Realzado comportamiento ESD/ Latch –up
Mas de un millón de ciclos borrado/escritura
Más de 40 años de retención de datos
B.1. Descripción
Esta EEPROM compatible con I2C esta organizada en 128 bytes x 8 páginas .El
protocolo i2c utiliza una interfaz serie de dos líneas, comprendiendo una línea de datos
bidireccional y una línea de reloj. Estos dispositivos llevan un código de identificación
(1010) en concordancia con la definición del bus i2c. Ver diagrama lógico en la
siguiente figura:
Figura 66 - Diagrama lógico
El dispositivo se comporta como esclavo en el protocolo i2c con todas las
operaciones sincronizadas por la línea de reloj. Las operaciones de escritura y lectura se
inician por la condición de inicio, generada por el master que tiene el bus en ese
momento. La condición de inicio precede a código de identificación del dispositivo y el
bit RW* (como se describe el la tabla 18) terminado por un bit de reconocimiento.
Cuando se escribe un dato en la memoria, el dispositivo inserta un bit de
reconocimiento (ACK) durante el noveno pulso de reloj, siguiendo a la trasmisión de 8
bits del bus master. Cuando un dato es leído por el bus master, el bus master reconoce la
recepción del byte de datos del mismo modo. Las transferencias de datos se terminan
XXIV
Anexos
con la condición de Stop después de un Ack para escribir y después un Nack para
lectura.
Tabla 18. Nomenclatura de las señales.
B.1.1 Power on Reset: Vcc Lock-Out Write Protect
Para prevenir la corrupción de datos e inadvertidas operaciones de escritura
durante el Power-up, se ha incluido un circuito de Power on reset. En el power-up el
reset interno se mantiene activo hasta que Vcc ha alcanzado el valor umbral y todas las
operaciones están deshabilitadas – el dispositivo no responde a ningún comando. Del
mismo modo cuando Vcc cae del voltaje operativo, por debajo del valor umbral del
POR todas las operaciones estarán deshabilitadas y el dispositivo no responderá a
ningún comando. Se debe aplicar un valor estable y valido de Vcc antes de aplicar
ninguna señal lógica.
Figura 67 - Esquema del patillaje de la EEPROM
B.2.
Descripción de las Señales
B.2.1. Serial Clock (SCL).
Esta señal de entrada se utiliza para validar todos los datos que entran y salen del
dispositivo. En aplicaciones donde esta señal es utilizada por dispositivos esclavos para
sincronizarse con un reloj más lento, el bus master debe ser de colector abierto y una
resistencia de pull-up que debe conectar la línea SCL con Vcc. En muchas aplicaciones,
este método de sincronización no es utilizado y las resistencias de pull-up no son
necesarias, si el bus master ya esta provisto de una salida en colector abierto.
XXV
Anexos
B.2.2. Serial Data (SDA)
Serial Data (SDA). Esta señal bidireccional es utilizada para la transferencia de datos
del dispositivo. Es una salida en colector abierto que puede cablearse en OR con otra
señal de colector abierto en el bus. Se debe conectar una resistencia de pull-up desde
esta línea hasta Vcc.
B.2.3. Chip Enable (E0, E1, E2).
Estas señales de entrada son utilizadas para poner el valor de los bits menos
significativos (b3, b2, b1) de los 7 bits que forman el código de selección del
dispositivo. Estas entradas deben ponerse a Vcc o a Vss para establecer dicho código.
B.2.4. Write Control (WC*).
Esta señal de entrada es usada para proteger el contenido completo de la
memoria de operaciones de escritura inadvertidas. Las operaciones de escritura al array
de memoria están deshabilitadas cuando el control de escritura esta a nivel alto. Cuando
no esta conectado, la señal internamente se lee como Vil, y las operaciones de escritura
se admiten. Cuando el control de escritura esta a nivel alto, la selección del dispositivo y
los bytes de direcciones son reconocidos pero los bytes de datos no se reconocen.
Tabla 19. Código de Selección del dispositivo.
B.3. Operaciones Del Dispositivo
El dispositivo soporta el protocolo i2c. Cualquier dispositivo que envía datos al
bus es definido como transmisor y cualquier dispositivo que lee dichos datos, receptor.
El dispositivo que controla la transferencia de datos es conocido como bus master y el
otro como el esclavo del bus. Una transferencia de datos solo puede iniciarse por el
master, el cual también proporciona el reloj para la sincronización. La EEPROM
M24Cxx siempre es esclavo en todas las comunicaciones.
B.3.1 Condición de Start
La condición de inicio se identifica como la bajada de la línea de datos mientras
la línea de reloj se mantiene estable a nivel alto. La condición de inicio precede a
cualquier comando de transferencia de datos. El dispositivo continuamente monitoriza
(excepto durante el ciclo de escritura) la línea de datos y de reloj para la condición de
Start y no responde a menos que se de.
XXVI
Anexos
B.3.2 Condición de Stop
La condición de parada se define como la subida de la línea de datos mientras la
línea de reloj se mantiene estable a nivel alto. La condición de stop termina la
comunicación entre el dispositivo y el master del bus. Un comando de lectura seguido
por un NACK puede proseguir con una condición de stop para forzar al dispositivo a
un modo de Stand-by. La condición de stop al final de un comando de escritura dispara
el ciclo de escritura interno de la EEPROM.
B.3.3 Bit de reconocimiento (ACK)
El bit de reconocimiento es utilizado para indicar la correcta transferencia de un
byte. El bus transmisor, puede ser el master o el dispositivo esclavo, libera la línea
SDA después de enviar un byte de datos. Durante el noveno pulso de reloj, el receptor
pone la línea SDA a nivel bajo para reconocer la recepción del byte de datos.
B.3.4 Data Input
Durante la entrada de datos, el dispositivo muestra la línea de datos (SDA) en la
subida de la línea de reloj (SCL). Para una correcta operación del dispositivo, SDA debe
estar estable durante la subida del SCL y la señal de SDA solo puede cambiar cuando
SCL esta a nivel bajo.
B.3.5 Direccionamiento de memoria
Para iniciar la comunicación entre el bus master y el dispositivo esclavo, el
master debe iniciar la condición de inicio. Acto seguido el master debe enviar el código
de selección del dispositivo por la línea de datos SDA, donde el primer bit enviado es el
mas significativo.
El código de selección de dispositivo consiste en 4 bits identificadores del tipo
de dispositivo y 3 bits de habilitación de dirección (E2, E1, E0). Para direccional el
array de memoria, los 4 bits identificadores del dispositivo es 1010b.
Cada dispositivo tiene un único código de 3 bits en las entradas del Chip Enable.
Cuando el código de selección del dispositivo es recibido, el dispositivo solo responde
si la dirección de habilitación del chip es la misma que el valor que tienen las entradas
de habilitación del chip. Sin embargo, aquellos dispositivos con una capacidad de
memoria mas grande, necesitan mas bits de dirección.
El octavo bit es el bit de lectura o escritura (RW*), este bit se pone a 1 para las
operaciones de lectura y a 0 para las operaciones de escritura. Si coincide con el código
de selección de dispositivo, el correspondiente dispositivo manda el bit de
reconocimiento durante el noveno ciclo de reloj. Si el dispositivo no coincide, se
deselecciona así mismo del bus y se pone en stand-by.
B.3.6 Operaciones de escritura
Seguida de la condición de inicio, el bus master envía el código de selección del
dispositivo con el bit R/W a nivel bajo. El dispositivo lo reconoce y espera el byte de
XXVII
Anexos
dirección. El dispositivo responde al byte de dirección con el bit de reconocimiento y
entonces espera a los bytes de datos.
Cuando el bus master genera la condición de parada inmediatamente después del
bit de reconocimiento, o al final de una escritura de byte o de pagina, se dispara el ciclo
de escritura interno de la memoria.
Una condición de inicio en otro momento no dispara el ciclo de escritura interno.
Durante este ciclo de escritura, tanto la línea SDA como SCL son ignoradas y el
dispositivo no responde a ninguna petición.
B.3.4.1 Escritura del Byte
Después del código de selección del dispositivo y el byte de dirección, al master
envía un byte de datos. Si la posición direccionada esta protegida contra la escritura, con
el bit de control de escritura puesto a nivel alto (durante el periodo desde la condición
de inicio hasta el fin del envío del byte de dirección), el dispositivo responde al byte de
datos con un NACK. (Ver figura 68.) y la posición no es modificada. Sin embargo, si la
posición direccionada no esta protegida contra escritura, el dispositivo responde con
ACK. El bus master termina la transferencia generando una condición de parada. (ver
figura 69)
Figura 68 - Secuencia de escritura con WC*=1 (escritura de datos inhibida)
XXVIII
Anexos
Figura 69 – Secuencia de escritura con WC*=0 (habilitada la escritura de datos)
B.3.4.2 Escritura de página
El modo de escritura de página permite escribir 16 bytes en un único ciclo de
escritura, teniendo en cuenta que están posicionados en la misma pagina de memoria.
Esto significa que los bits de dirección de memoria son los mismos. Si se envían más
bytes de los que caben al final de la página, se produce una condición conocida como
‘rollover’. Esta condición debe ser evitada ya que los datos comenzaran a sobrescribirse.
El master envía de 1 a 16 bytes de datos, cada uno de los cuales es reconocido si el bit
de control de escritura esta a nivel bajo. Si la posición direccionada esta protegida
contra la escritura, el dispositivo responderá a los bytes de datos con NACK y las
posiciones no se modificarán. Después de cada byte transferido, el byte interno del
contador de dirección (solo los 4 bits de dirección menos significativos) es
incrementado. La transferencia termina cuando el master genera la condición de stop.
XXIX
Anexos
Figura 70 - Diagrama de Flujo del ciclo de escritura por encuesta utilizando ACK
B.3.7. Operaciones De Lectura
Las operaciones de escritura realizan independientemente del estado de la señal
del control de escritura (WC*). El dispositivo tiene un contador de direcciones interno
el cual se incrementa cada vez que se lee un byte.
B.3.7.1 Lectura de dirección aleatoria
Se realiza una escritura simulada para cargar la dirección en el contador de
direcciones pero sin enviar una condición de parada. (Ver fig.6). entonces el bus master
envía otra condición de inicio y repite el código de selección del dispositivo, con el bit
de RW* a nivel alto. El dispositivo reconoce esto, y saca el contenido del byte de
dirección. El master debe no reconocer el byte, es decir mandar un NACK y termina la
transferencia con una condición de Stop.
B.3.5.2 Lectura de la dirección actual
Para la lectura de la dirección actual, después de la condición de Start, el master
solo envía el código de selección del dispositivo con el bit RW* a nivel alto. El
dispositivo reconoce esto, y saca el byte diseccionado por el contador de direcciones
interno. El contador entonces se incrementa. El master termina la transferencia con una
condición de stop sin reconocer el byte. (ver fig.6).
XXX
Anexos
B.3.5.3 Lectura secuencial
Esta operación se puede utilizar después de leer la posición actual de memoria o
la lectura de una posición aleatoria. El master reconoce el byte de datos recibido y envía
unos pulsos de reloj adicionales de forma que el dispositivo esclavo continua
extrayendo el siguiente byte. Para terminar la cadena de bytes, el master debe enviar un
NACK el ultimo byte y debe generar la condición de parada.(ver fig.6). la salida de
datos vienen de direcciones consecutivas, con el contador interno de direcciones
incrementado automáticamente después de cada byte extraído. Después de la ultima
dirección de memoria, el contador de direcciones entra en condición de ‘rollover’ y el
dispositivo continua sacando datos desde la dirección de memoria 00h.
B.3.5.4. Reconocimiento en modo lectura
Para todos los comandos de lectura, el dispositivo espera, después de cada byte
leído, para el reconocimiento en el noveno pulso de reloj. Si el master no pone a nivel
bajo la línea de datos SDA durante ese tiempo, el dispositivo termina la transferencia y
se pone en modo stand-by.
B.4 Estado Inicial
El dispositivo se entrega con el array de memoria borrado: todos los bits están a
nivel alto (Cada byte contiene FFh).
Figura 71 - Modos de Lectura
XXXI
Anexos
C. PROGRAMAS DE LAS PRÁCTICAS .ASM
XXXII
;Práctica 1
;Programa master para Eeprom 24C01C
;Bus i2c conectado
;el modulo MSSP se utiliza en master mode.
;*** Definición de macros
BANK0
BANK1
macro
bcf
bcf
endm
macro
bsf
bcf
endm
;*** Definicion
#define RS
#define RW
#define E
#define CTRIN
#define CTROUT
#define ADDR
#define DATO
#define BAUD
#define FOSC
;Saltar a Bank 0
STATUS,RP0
STATUS,RP1
;Saltar a Bank 1
STATUS,RP0
STATUS,RP1
de constantes
0
;Definiciones previas para el LCD
1
2
H'A0' ;valor I2c para entrada EEpROm
H'A1'
H'56'
;valor direccion de la eeprom
H'61'
;dato eeprom
d'100' ; velocidad i2c
d'4000' ; oscilador en khz
list p=16f877
include <p16f877.inc>
DIR
DAT
ITE
char
temps
BkW
BkStatus
EQU
EQU
EQU
EQU
EQU
EQU
EQU
0x25
0x26
0x20
0x21
0X22
0X23
0X24
org h'0000'
goto Inicio
Inicio
org h'0005'
banksel PORTB
clrf PORTB
banksel TRISC
movlw b'00011000'
movwf TRISC
clrf TRISB
pagesel Ini_i2c
call Ini_i2c
pagesel CfgLCD
call CfgLCD
Banksel ITE
movlw
d'5'
movwf
ITE
call
Prueba
I2CWrite
;Enviamos condicion de inicio
BANKSEL SSPCON2
bsf
SSPCON2,SEN
call CheckIdle
movlw CTRIN
call SendByte
banksel SSPCON2
btfsc SSPCON2,ACKSTAT
goto I2CFail1
;Mandamos byte de direccion de la eeprom
banksel ADDR
movlw ADDR
Banksel DIR
movwf DIR
pagesel SendByte
call SendByte
call CheckIdle
banksel SSPCON2
btfsc SSPCON2,ACKSTAT
goto I2CFail1
;mandamos y testeamos el dato
movlw
DATO
Banksel DAT
movwf DAT
AKi
movf DAT,w
pagesel SendByte
call SendByte
call CheckIdle
pagesel MostrarDD
call MostrarDD
banksel DAT
incf DAT,1
banksel DIR
incf DIR,1
banksel SSPCON2
btfsc SSPCON2,ACKSTAT
goto I2CFail1
Banksel ITE
decfsz ITE,1
goto AKi
;Condicion de Parada
clrf DIR
clrf DAT
Banksel SSPCON2
bsf SSPCON2,PEN
call CheckIdle
;la escritura se ha completado satisfactoriamente. Empieza la secuencia de
lectura
I2CRead
Banksel ITE
movlw
d'5'
movwf
ITE
;Enviamos la condicion de repeticion de StARt y esperamos que se complete
BANKSEL SSPCON2
bsf
SSPCON2,RSEN
;generamos repeticion de start
call
CheckIdle
;Esperamos que la operacion i2c se complete
;Mandamos y chequeamos el byte de control
movlw
CTRIN
;cargamos CONTROL BYTE (entrada)
call
SendByte
call
CheckIdle
;miramos si la EEPROM i2c esta preparada
BANKSEL SSPCON2
btfsc
SSPCON2,ACKSTAT ;Miramos el bit de estado ACK para mirar si
goto I2CFail2
;esta preparada
;Mandamos y chequeamos el byte de @
banksel ADDR
movlw
ADDR
banksel DIR
movwf
DIR
pagesel SendByte
call
SendByte
call
CheckIdle
BANKSEL SSPCON2
btfsc
SSPCON2,ACKSTAT ;Miramos el bit ACKSTAT para ver si ha fallado
goto
I2CFail2
;Salta si es correcto
;Mandamos repeticion de condicion de inicio
bsf
SSPCON2,RSEN
call
CheckIdle
;Mandamos y testeamos el CONTROL BYTE (out)
movlw
call
call
BANKSEL
btfsc
goto
CTROUT
SendByte
CheckIdle
SSPCON2
SSPCON2,ACKSTAT ;Miramos el bit ACKSTAT para ver si ha fallado
I2CFail2
;Salta si es correcto
;Ponemos el modulo MSSP para recibir en modo i2c
Loop2
bsf
SSPCON2,RCEN
;Habilitamos recepcion i2c
call
CheckIdle
movf
SSPBUF,w
banksel DAT
movwf
DAT
call
MostrarDD
banksel DIR
incf
DIR,1
;Coger el Dato y esperar a ke se complete. el dato estara en SSPBUF cuando acabe
;EL modo de recepcion se deshabilita y termina automaticamente por el modulo
MSSP
call
call
banksel
decfsz
goto
call
CheckIdle
SendAck
ITE
ITE,1
Loop2
SendNack
;Una vez se ha enviado un ACK o NACK, el bit ACKEN se limpia automaticamente por
el MSSP
;Enviamos condicion de Parada
bsf
SSPCON2,PEN
call
CheckIdle
goto $
;El programa ha terminado y completado correctamente.
;Espera en esta posicion siempre
;**** Subrutinas y Errores ****
;------------------------------------------------------------------------------Ini_i2c ; En esta subrutina habilitamos el modulo MSSP del pic para configurarlo
en i2c.
;-------------------------------------------------------------------------------
;configuracion modulo MSSP para modo master
BANKSEL SSPCON
MOVLW B'00101000'
;Habilita MSSP
movwf SSPCON
;Configuramos los niveles de slew rate
banksel SSPSTAT
movlw b'00000000'
movwf SSPSTAT
;Configuramos velocidad
para i2c
;slew rate para 100khz
Banksel SSPADD
movlw(FOSC/(4*BAUD))-1
movwf SSPADD
return
;I2C Operacion Fallida - Esto normalmente no ocurre, pero si acontece
;Se envia en Stop and the entire code is tried again
;-----------------------------------------------------------------------I2CFail1
;Operacion fallida en escritura
;----------------------------------------------------------------------BANKSEL SSPCON2
bsf
SSPCON2,PEN
call
CheckIdle
goto I2CWrite
;----------------------------------------------------------------------------I2CFail2
;Operacion fallida en lectura
;-------------------------------------------------------------------------BANKSEL SSPCON2
bsf
SSPCON2,PEN
call
CheckIdle
goto I2CRead
;Esta rutina envia el contenido del acumulador al SSPBUF, mientras se transmite
el byte
;Entonces el bit SSPIF es testeado para asegurarnos de que se ha mandado
correctamente
;Cuando se ha completado, la rutina existe y ejecuta codigo normal
;------------------------------------------------------------------------------SendByte
;------------------------------------------------------------------------------BANKSEL SSPBUF
movwf
SSPBUF
return
;Esta rutina espera hasta que se complete la ultima operacion i2c
;lo hace encuestando el bit SSPIF en el registro PIR1
;------------------------------------------------------------------------------CheckIdle
;-----------------------------------------------------------------------------BANKSEL PIR1
btfss
PIR1,SSPIF
goto
$-1
bcf
PIR1,SSPIF
Return
;-----------------------------------------------------------------------------SendNack
;Mandamos bit Nack para la secuencia de reconocimiento
;-----------------------------------------------------------------------------BANKSEL SSPCON2
bsf
SSPCON2,ACKDT
;ACK DAto se envia 1-> NACK
bsf
SSPCON2,ACKEN
;enviamos el bit de ACK ahora
return
;----------------------------------------------------------------------------SendAck
;Mandamos bit Ack para la secuencia de reconocimiento
;----------------------------------------------------------------------------BANKSEL SSPCON2
bcf
SSPCON2,ACKDT
;ACK DAto se envia 1-> NACK
bsf
SSPCON2,ACKEN
;enviamos el bit de ACK ahora
return
;-----------------------------------------------------------------------------CfgLCD
;Inicializa el LCD
;-------------------------------------------------------------------BANK0
clrf PORTA
movlw b'00001111'
movwf PORTB
BANK1
movlw
b'0110'
movwf
ADCON1
;Definimos PORTA como i/o digital
bcf OPTION_REG,NOT_RBPU
clrf TRISA
clrf TRISB
;*** esperamos >30ms, concretamente 35ms
movlw
movwf
call
movlw
movwf
call
movlw
movwf
call
D'255'
temps
Espera
D'255'
temps
Espera
D'190'
temps
Espera
;Esta rutina tarda 50u x 255 veces = 12.75ms
;Esta rutina tarda 50u x 255 veces = 12.75ms
;Esta rutina tarda 50u x 190 veces = 9.5ms
;*** Configuramos FUCTION SET (modo de 2 lineas de 5x7 caracteres)
movlw
movwf
call
B'0010'
PORTB
EnvCmd
movlw
movwf
call
B'0010'
PORTB
EnvCmd
movlw
movwf
call
B'0000'
PORTB
EnvCmd
;*** esperamos >39us, concretamente 150us
movlw
movwf
call
D'3'
temps
Espera
;Esta rutina tarda 50u x 3 veces = 150us
;*** configuramos DISPLAY ON/OFF CONTROL (display on, cursor off, blink off)
movlw
movwf
call
B'0000'
PORTB
EnvCmd
movlw
movwf
call
B'1011'
PORTB
EnvCmd
;*** esperamos >39us, concretamente 150us
movlw
movwf
D'3'
temps
call
Espera
;Esta rutina tarda 50u x 3 veces = 150us
;*** Borrar la pantalla (CLEAR DISPLAY)
movlw
movwf
call
B'0000'
PORTB
EnvCmd
movlw
movwf
call
B'0001'
PORTB
EnvCmd
;esperamos >1.53ms, concretament 1.55ms
movlw
movwf
call
D'31'
temps
Espera
;Esta rutina tarda 50u x 31 veces = 1.55ms
;Configuramos el ENTRY MODE SET (increment mode, entire shift off)
movlw
movwf
call
B'0000'
PORTB
EnvCmd
movlw
movwf
call
return
B'0110'
PORTB
EnvCmd
;----------------------------------------------------------------------EnvChar ;envia un caracter al LCD
;----------------------------------------------------------------------movwf
char
;*** esperamos >43us, concretamente 150us
movlw
D'3'
movwf
temps
call
Espera
;Aquesta rutina triga 50u x 3 cop = 150us
swapf
movwf
bcf
bsf
NOP
bsf
NOP
bcf
char,w
PORTB
PORTA,RW
PORTA,RS
movf
movwf
bcf
bsf
NOP
bsf
NOP
bcf
return
char,w
PORTB
PORTA,RW
PORTA,RS
;ponemos en el
PORTB la parte alta de 'char'
;ponemos el LCD en mode escritura
;ponemos el LCD en mode dato
PORTA,E
PORTA,E
;ponemos en el
PORTB la parte baja de 'char'
;ponemos el LCD en mode escritura
;ponemos el LCD en mode dato
PORTA,E
PORTA,E
;----------------------------------------------------------------------------EnvCmd ;Envia un comando a la pantalla LCD
;----------------------------------------------------------------------------bcf
PORTA,RW
;ponemos el LCD en mode escritura
bcf
PORTA,RS
;ponemos el LCD en mode comando
NOP
bsf
PORTA,E
NOP
bcf
PORTA,E
return
;----------------------------------------------------------------------------------Borra
;Ponemos el cursor en el inicion del LCD
;-----------------------------------------------------------------------------------;esperamos >1.53ms, concretamente 1.55ms
movlw
movwf
call
;*** Borramos
D'31'
temps
Espera
;Esta rutina tarda 50u x 31 veces = 1.55ms
la pantalla (RETURN HOME)
movlw
movwf
call
B'0000'
PORTB
EnvCmd
movlw
movwf
call
return
B'0001'
PORTB
EnvCmd
;---------------------------------------------------------------------------------Salto
; Rutina que hace un salto de linea en el LCD
;---------------------------------------------------------------------------------movlw b'1100'
movwf PORTB
call EnvCmd
movlw b'0000'
movwf PORTB
call EnvCmd
return
;--------------------------------------------------------------------------------Prueba
;-------------------------------------------------------------------------------------call Borra
movlw 'E'
call EnvChar
movlw 'S'
call EnvChar
movlw 'P'
call EnvChar
movlw 'E'
call EnvChar
movlw 'R'
call EnvChar
movlw 'A'
call EnvChar
movlw 'N'
call EnvChar
movlw 'D'
call EnvChar
movlw 'O'
call EnvChar
call Salto
return
MostrarDD
call Borra
movlw 'D'
call EnvChar
movlw 'I'
call EnvChar
movlw 'R'
call EnvChar
movlw ':'
call EnvChar
movlw ' '
call EnvChar
Banksel DIR
movf DIR,0
call EnvChar
movlw ' '
call EnvChar
movlw 'D'
call EnvChar
movlw 'A'
call EnvChar
movlw 'T'
call EnvChar
movlw ':'
call EnvChar
movlw ' '
call EnvChar
Banksel DAT
movf DAT,0
call EnvChar
call Salto
return
;-----------------------------------------------------------------------------------Espera ;Rutina de Temporizacion, Perdemos 50us x W
;---------------------------------------------------------------------------------BANK1
bcf
OPTION_REG,T0CS ;Seleccionamos reloj interno como clock para el
TMR0
bsf
OPTION_REG,PSA ;Pre-escaler no asignado al TIMER0
BANK0
carga
movlw
D'206'
movwf
TMR0
;Cargamos un tiempo de 50us al Timer 0
timer
btfsc
TMR0,7
goto timer
decfsz temps,f
goto
carga
return
END
;Programa master Práctica 2
;Bus i2c conectado
;el modulo MSSP se utiliza en master mode.
list p=16f877
include <p16f877.inc>
#define DirSlave
b'01111000'
#define BAUD
d'100' ; velocidad i2c
#define FOSC
d'4000' ; oscilador en khz
tecla
fil_col
temps
MenIn
MenOut
BkStatus
BkW
EQU
EQU
EQU
EQU
EQU
EQU
EQU
0x20
0X21
0X22
0X23
0X24
0X26
0X27
org h'0005'
goto Inicio
Inicio
banksel PORTB
clrf PORTB
clrf PORTC
banksel TRISC
movlw b'00011000'
movwf TRISC
clrf TRISB
banksel MenIn
clrf MenIn
clrf MenOut
call IniI2C
;***Testeamos filas
Testeo_filas
Banksel OPTION_REG
bcf OPTION_REG, NOT_RBPU
movlw b'00001111'
movwf TRISB
movlw b'00011000'
andwf TRISC
Banksel PORTC
clrf PORTC
movlw H'FF'
movwf tecla
; Activamos R push pull del portb
;Miramos en que fila hay tecla pulsada
Filas
btfss
goto
PORTB,0
fila1_pulsada
;Si hay alguna tecla de la "fila 1"
;pulsada (RB0 = '0') salta a subrutina
btfss
goto
PORTB,1
fila2_pulsada
;Si hi ha alguna tecla de la "fila 2"
;pulsada (RB1 = '0') salta a subrutina
btfss
goto
PORTB,2
fila3_pulsada
;Si hi ha alguna tecla de la "fila 3"
;pulsada (RB2 = '0') salta a subrutina
btfss
goto
PORTB,3
fila4_pulsada
;Si hi ha alguna tecla de la "fila 4"
;pulsada (RB3 = '0') salta a subrutina
movlw H'FF'
movwf tecla
goto
Filas
;Si no hi ha cap tecla pitjada, fiquem 0x21 a FF
;Que repeteixi aquest procés fins que es pitgi una tecla
fila1_pulsada
movlw H'FF'
tecla pulsada
subwf tecla,w
bnz Filas
movlw B'0000'
movwf fil_col
goto Testeo_columnas
;Comprobamos que actualmente, no halla ninguna
;Para hacerlo, tecla = FF
;De no haber ninguna tecla pulsada, la fila
;donde hemos encontrado una tecla pulsada
fila2_pulsada
movlw H'FF'
subwf tecla,w
bnz Filas
movlw B'0100'
movwf fil_col
goto Testeo_columnas
fila3_pulsada
movlw H'FF'
subwf tecla,w
bnz Filas
movlw B'1000'
movwf fil_col
goto Testeo_columnas
fila4_pulsada
movlw H'FF'
subwf tecla,w
bnz Filas
movlw B'1100'
movwf fil_col
;***Testeamos columnas
Testeo_columnas
;*** Configuramos los puertos para leer las columnas y escribir sobre las filas
Banksel TRISB
clrf
TRISB
"columnas del teclat"
movlw
iorwf
;Definimos
B'11111100'
TRISC,f
Banksel PORTB
movlw
movwf
;Bank 1, modificaremos OPTION_REG, TRISB, TRISC
el PORT B como salida, leeremos las
;Definimos la parte alta del PORT C como entrada
;Bank 0, leer/escribir PORT B, PORT C
B'0000' ;Escribimos 0's a la parte baja del PORT B
PORTB
;*** Miramos en que columna hay
btfss
goto
PORTC,2
colum1_pulsada
btfss
PORTC,5
tecla pulsada
;Si hay alguna tecla de la "columna 1"
;pulsada (RC2 = '0') salta a subrutina
goto
colum2_pulsada
btfss
goto
PORTC,6
colum3_pulsada
btfss
goto
PORTC,7
colum4_pulsada
goto
Testeo_filas
vuelva a comenzar
colum1_pulsada
movlw B'00'
encontrado una tecla pulsada
addwf fil_col,f
goto mirar_tecla
colum2_pulsada
movlw B'01'
addwf fil_col,f
goto mirar_tecla
colum3_pulsada
movlw B'10'
addwf fil_col,f
goto mirar_tecla
colum4_pulsada
movlw B'11'
addwf fil_col,f
;Si no encuentra ninguna columna pulsada, que
;Guardamos en fil_col la columna donde hemos
;*** MIRAR VALOR TECLA PITJADA
; Aqui metere lo del dirslave y el mensaje out para enviarlo al otro pic
mirar_tecla
movfw
call
movwf
movwf
call
call
goto
fil_col ;Miramos en la tabla la tecla q se ha pulsado
Taula
tecla
;Guardamos el ASCII d la tecla pulsada
MenOut ;Guardamos la tecla en MensajeOut
I2CWrite
I2CRead
Testeo_filas
;*** TAULA D'EQUIVALENCIA ENTRE EL TECLAT I LES TECLES PITJADES
Taula
addwf
PCL,f
dt
'1','2','3','F','4','5','6','E'
dt
'7','8','9','D','A','0','B','C'
;-----------------------------------------------------IniI2C
;configuracion modulo MSSP para modo master
BANKSEL SSPCON
MOVLW B'00101000'
;Habilita MSSP
movwf SSPCON
;Configuramos los niveles de slew rate
para i2c
banksel SSPSTAT
movlw b'00000000'
movwf SSPSTAT
;Configuramos velocidad
Banksel SSPADD
movlw(FOSC/(4*BAUD))-1
movwf SSPADD
return
I2CWrite
movwf
movf
BkW
STATUS,W
;Hace copia de W
;Hace copia de registro de estado
banksel PORTA
movwf
BkStatus
;Enviamos condicion de inicio
BANKSEL SSPCON2
bsf
SSPCON2,SEN
call CheckIdle
Banksel DirSlave
; Enviamos @ esclavo
movlw
DirSlave
call SendByte
call CheckIdle
banksel SSPCON2
btfsc SSPCON2,ACKSTAT
goto I2CFail1
Banksel MenOut
; Enviamos Tecla
movf MenOut,w
call SendByte
call CheckIdle
banksel SSPCON2
btfsc SSPCON2,ACKSTAT
goto I2CFail1
Banksel SSPCON2
bsf SSPCON2,PEN
call CheckIdle
;Restauramos las copias de los registros
movf
BkStatus,W
;Restaura las copias de registros
movwf
STATUS
;registro de estado
movf
BkW,W
;registro W
return
;la escritura se ha completado
satisfactoriamente. Empieza la secuencia de lectura
I2CRead
;Enviamos la condicion de repeticion de StARt y esperamos que se complete
BANKSEL SSPCON2
bsf
SSPCON2,SEN
;generamos repeticion de start
call
CheckIdle
;Esperamos que la operacion i2c se complete
movlw
DirSlave
iorlw
b'00000001'
;cargamos CONTROL BYTE (entrada)
call
SendByte
call
CheckIdle
;miramos si esta preparada
BANKSEL SSPCON2
btfsc
SSPCON2,ACKSTAT ;Miramos el bit de estado ACK para mirar si
goto I2CFail2
;esta preparada
;Ponemos el modulo MSSP para recibir en modo i2c
bsf
SSPCON2,RCEN
;Habilitamos recepcion i2c
call
CheckIdle
movf
SSPBUF,w
movwf
MenIn
;Coger el Dato y esperar a ke se complete. el dato estara en SSPBUF cuando acabe
;EL modo de recepcion se deshabilita y termina automaticamente por el modulo
MSSP
;Mandamos bit Nack para la secuencia de reconocimiento
BANKSEL SSPCON2
bsf
SSPCON2,ACKDT
;ACK DAto se envia 1-> NACK
bsf
SSPCON2,ACKEN
;enviamos el bit de ACK ahora
;Una vez se ha enviado un ACK o NACK, el bit ACKEN se limpia automaticamente por
el MSSP
;Enviamos condicion de Parada
bsf
SSPCON2,PEN
call
CheckIdle
return
;**** Subrutinas y Errores ****
;I2C Operacion Fallida - Esto normalmente no ocurre, pero si acontece
;Se envia en Stop and the entire code is tried again
I2CFail1
BANKSEL SSPCON2
bsf
SSPCON2,PEN
call
CheckIdle
goto I2CWrite
I2CFail2
BANKSEL SSPCON2
bsf
SSPCON2,PEN
call
CheckIdle
goto I2CRead
;Esta rutina envia el contenido del acumulador al SSPBUF, mientras se transmite
el byte
;Entonces el bit SSPIF es testeado para asegurarnos de que se ha mandado
correctamente
;Cuando se ha completado, la rutina existe y ejecuta codigo normal
SendByte
BANKSEL SSPBUF
movwf
SSPBUF
return ; Hecho, devuelve 0
;Esta rutina espera hasta que se complete la ultima operacion i2c
;lo hace encuestando el bit SSPIF en el registro PIR1
CheckIdle
BANKSEL
btfss
goto
bcf
return
END
PIR1
PIR1,SSPIF
$-1
PIR1,SSPIF
;Prog Slave funciona
list p=16f876 ; Fija opciones de listado de salida de ensamblador
include <p16f876.inc>
org
goto
org
goto
; Definiciones del uC que utilizamos
H'0000' ; Comenzamos en el vector de reset
Inicio
h'0004'
Int
;*** Definicion de constantes
#define
#define
#define
#define
DirNodo
RS
RW
E
b'01111000' ;Direccion i2c de este nodo
0
;Definiciones previas para el LCD
1
2
;*** Definicion de variables
MenIn
EQU
MenOut
EQU
BkStatus
EQU
BkW
EQU
Temp
EQU
eventos I2C
temps
EQU
char
EQU
un mayor control
0X20
0X21
0X22
0X23
0X24
;Contendrá el dato recibido por I2C del master
;Contendrá el dato a enviar por I2C al master
;Backup del registro STATUS
;Backup W
;Variable Temporal usada para evaluación de
0X25
0X33
;Variable Temporal Usada para esperas en LCD
;Registro utilizado a modo de flags para tener
;de lo que estoy haciendo
;*** Inicio de programa
Inicio
org
h'0005'
Banksel
clrf
clrf
clrf
movlw
movwf
Banksel
clrf
clrf
clrf
PORTC
PORTC
PORTA
PORTB
b'00011000'
PORTB
TRISC
TRISC
TRISA
TRISB
banksel MenIn
clrf
MenIn
clrf
MenOut
clrf
Temp
call
CfgLCD
call ini_i2c_slave
Banksel MenIn
movlw
0x07
movwf
MenIn
call
Wait
Main
nop
nop
nop
goto Main
;--------------------------------------------------------------
Int
;Rutina servicio a la interrupcion del modulo MSSP
;--------------------------------------------------------------movwf BkW
;salvamos contexto
movf STATUS,w
movwf BkStatus
banksel PIR1
btfss
PIR1,SSPIF
goto
$-1
bcf
PIR1,SSPIF
call
SSP_Handler
movwf
char
call
Recibo
Banksel STATUS
;Restauramos contexto
movf BkStatus,w
movwf STATUS
swapf BkW,F
swapf BkW,0
retfie
;Retorno de interrupcion
;-------------------------------------------------------------------Wait
;-------------------------------------------------------------------call Borra
movlw 'W'
call EnvChar
movlw 'A'
call EnvChar
movlw 'I'
call EnvChar
movlw 'T'
call EnvChar
return
;-------------------------------------------------------------------Recibo
;-------------------------------------------------------------------call Borra
movlw 'R'
call EnvChar
movlw 'E'
call EnvChar
movlw 'C'
call EnvChar
movlw '-'
call EnvChar
movlw '>'
call EnvChar
Banksel char
movf char,w
call EnvChar
return
;-------------------------------------------------------------------CfgLCD
;Inicializa el LCD
;-------------------------------------------------------------------Banksel PORTA
clrf PORTA
movlw 0xFE
movwf PORTB
Banksel ADCON1
movlw
b'0110'
movwf
ADCON1
;Definimos PORTA como i/o digital
bcf OPTION_REG,NOT_RBPU
clrf TRISA
clrf TRISB
;*** esperamos >30ms, concretamente 35ms
movlw
movwf
call
D'255'
temps
Espera
;Esta rutina tarda 50u x 255 veces = 12.75ms
movlw
movwf
call
movlw
movwf
call
D'255'
temps
Espera
D'190'
temps
Espera
;Esta rutina tarda 50u x 255 veces = 12.75ms
;Esta rutina tarda 50u x 190 veces = 9.5ms
;*** Configuramos FUCTION SET (modo de 1 linea de 5x7 caracteres)
movlw
movwf
call
B'0010'
PORTB
EnvCmd
movlw
movwf
call
B'0010'
PORTB
EnvCmd
movlw
movwf
call
B'0000'
PORTB
EnvCmd
;*** esperamos >39us, concretamente 150us
movlw
movwf
call
D'3'
temps
Espera
;Esta rutina tarda 50u x 3 veces = 150us
;*** configuramos DISPLAY ON/OFF CONTROL (display on, cursor off, blink off)
movlw
movwf
call
B'0000'
PORTB
EnvCmd
movlw
movwf
call
B'1111'
PORTB
EnvCmd
;*** esperamos >39us, concretamente 150us
movlw
movwf
call
D'3'
temps
Espera
;Esta rutina tarda 50u x 3 veces = 150us
;*** Borrar la pantalla (CLEAR DISPLAY)
movlw
movwf
call
B'0000'
PORTB
EnvCmd
movlw
movwf
call
B'0001'
PORTB
EnvCmd
;esperamos >1.53ms, concretament 1.55ms
movlw
movwf
call
D'31'
temps
Espera
;Esta rutina tarda 50u x 31 veces = 1.55ms
;Configuramos el ENTRY MODE SET (increment mode, entire shift off)
movlw
movwf
call
B'0000'
PORTB
EnvCmd
movlw
movwf
call
return
B'0101'
PORTB
EnvCmd
;----------------------------------------------------------------------EnvChar ;envia un caracter al LCD
;----------------------------------------------------------------------movwf
char
;*** esperamos >43us, concretamente 150us
movlw
D'3'
movwf
temps
call
Espera
;Aquesta rutina triga 50u x 3 cop = 150us
swapf
movwf
bcf
bsf
NOP
bsf
NOP
bcf
char,w
PORTB
PORTA,RW
PORTA,RS
movf
movwf
bcf
bsf
NOP
bsf
NOP
bcf
return
char,w
PORTB
PORTA,RW
PORTA,RS
;ponemos en el
PORTB la parte alta de 'char'
;ponemos el LCD en mode escritura
;ponemos el LCD en mode dato
PORTA,E
PORTA,E
;ponemos en el
PORTB la parte baja de 'char'
;ponemos el LCD en mode escritura
;ponemos el LCD en mode dato
PORTA,E
PORTA,E
;----------------------------------------------------------------------------EnvCmd ;Envia un comando a la pantalla LCD
;----------------------------------------------------------------------------bcf
PORTA,RW
;ponemos el LCD en mode escritura
bcf
PORTA,RS
;ponemos el LCD en mode comando
NOP
bsf
PORTA,E
NOP
bcf
PORTA,E
return
;----------------------------------------------------------------------------------Borra
;Ponemos el cursor en el inicion del LCD
;-----------------------------------------------------------------------------------;esperamos >1.53ms, concretamente 1.55ms
movlw
movwf
call
;*** Borramos
movlw
movwf
call
D'31'
temps
Espera
;Esta rutina tarda 50u x 31 veces = 1.55ms
la pantalla (RETURN HOME)
B'0000'
PORTB
EnvCmd
movlw
B'0010'
movwf
PORTB
call
EnvCmd
return
;-----------------------------------------------------------------------------------Espera ;Rutina de Temporizacion, Perdemos 50us x W
;---------------------------------------------------------------------------------Banksel OPTION_REG
bcf
OPTION_REG,T0CS ;Seleccionamos reloj interno como clock para el
TMR0
carga
timer
bsf
OPTION_REG,PSA
Banksel TMR0
movlw
D'206'
movwf
TMR0
btfsc
TMR0,7
goto timer
decfsz temps,f
goto
carga
return
;Pre-escaler no asignado al TIMER0
;Cargamos un tiempo de 50us al Timer 0
;------------------------------------------------------------------------------ini_i2c_slave
;Inicializa valores para uso de I2C en Slave
;Ha de ser llamado tras definir TRISC y un valor para
;ClockValue. Para frecuencia SCL=Fosc/(4x(ClockValue+1))
;-------------------------------------------------------------------------------
;Configuramos I2C
banksel
movlw
movwf
banksel
movlw
movwf
banksel
movlw
movwf
banksel
movlw
movwf
banksel
movlw
movwf
bcf
bcf
TRISC
b'00011000'
TRISC
SSPSTAT
b'00000000'
SSPSTAT
SSPCON2
b'00000000'
SSPCON2
SSPADD
DirNodo
SSPADD
SSPCON
b'00110110'
SSPCON
PIR1,SSPIF
PIR1,7
; Pasamos a direccionar Banco 1
; Establece líneas SDA y SCL como entradas...
;..respetando los valores para otras líneas.
; Habilita direccionamiento global
;
;
;
;
;
;
;
Dirección esclavo
Pasamos a direccionar Banco 0
Slave mode, SSP enable, velocidad segun...
... Fosc/(4x(SSPADD+1))
Limpia flag de eventos SSP
Limpia bit. Mandatorio por Datasheet
;Configuración para interrupciones por evento I2C
banksel PIE1
bsf
PIE1,SSPIE
bsf
INTCON,PEIE
bsf
INTCON,GIE
return
;
------------------------------------------------------------------------------------SSP_Handler
; Este manejador controla cada evento SSP (I2C) acontecido.
; El código que se muestra abajo chequea 5 posibles estados.
; Cada uno de los 5 estados SSP son identificados haciendo
; XOR de los bits del registro SSPSTAT con mascaras de bits
; predeterminadas. Una vez que el estado ha sido identificado
; se llevan a cabo las acciones pertinentes. Los estados
; indefinidos son considerados como estados de error.
dirección.
; State 1: Operación de escritura I2C, ultimo byte era de
; SSPSTAT bits: S = 1, D_A = 0, R_W = 0, BF = 1
; State 2: Operación de escritura I2C, ultimo byte era de datos.
; SSPSTAT bits: S = 1, D_A = 1, R_W = 0, BF = 1
dirección.
; State 3: Operación de lectura I2C, ultimo byte era de
; SSPSTAT bits: S = 1, D_A = 0, R_W = 1, BF = 0
; State 4: Operación de lectura I2C, ultimo byte era de datos.
; SSPSTAT bits: S = 1, D_A = 1, R_W = 1, BF = 0
; State 5: Reset lógico del Slave I2C por NACK del master.
; SSPSTAT bits: S = 1, D_A = 1, R_W = 0, BF = 0
;
------------------------------------------------------------------------------------banksel
movf
andlw
banksel
movwf
SSPSTAT
SSPSTAT,W
b'00101101'
Temp
Temp
movlw
banksel
xorwf
btfss
goto
call
b'00001001'
Temp
Temp,W
STATUS,Z
State2
ReadI2C
State1:
; Obtiene el valor de SSPSTAT
; elimina los bits no importantes SSPSTAT.
; para chequeo posterior.
; Operación de escritura, ultimo byte ha sido
; de dirección, el buffer está lleno.
;
; Estamos en el primer estado?
; No, checkeamos siguiente estado
; SI. Hacemos un read SSPBUF (para vaciar
buffer).
; El Hardware se ocupa de mandar Ack
return
State2:
movlw
banksel
xorwf
btfss
goto
call
b'00101001'
Temp
Temp,W
STATUS,Z
State3
ReadI2C
; Operación de escritura, ultimo byte ha sido
; de datos, el buffer está lleno.
; Estamos en el segundo estado?
; NO, checkeamos siguiente estado
; SI, Tomamos el byte del SSP.
;Aquí tenemos en W el valor del dato recibido
Banksel MenIn
movwf
MenIn
return
State3:
master)
State4:
master)
movlw
banksel
xorwf
btfss
goto
b'00001100'
Temp
Temp,W
STATUS,Z
State4
; Operación de lectura, ultimo byte ha sido
; de dirección, el buffer está vacío
; Estamos en el tercer estado?
; NO, checkeamos siguiente estado
;Aquí debemos poner en W el valor del dato a enviar (solicitado por el
Banksel MenOut
movf
MenOut,w
call
WriteI2C
return
movlw
banksel
xorwf
btfss
goto
b'00101100'
Temp
Temp,W
STATUS,Z
State5
; SI, escribimos el byte en SSPBUF
; Operación de lectura, ultimo byte ha sido
; de datos, el buffer está vacío
; Estamos en el cuarto estado?
; NO, checkeamos siguiente estado
;Aquí debemos poner en W el valor del dato a enviar (solicitado por el
Banksel MenOut
movf
MenOut,w
call
WriteI2C
return
State5:
movlw
b'00101000'
transmitían...
banksel Temp
; SI, escribimos el byte en SSPBUF
; Se ha recibido un NACK mientras se
xorwf
btfss
goto
return
I2CErr
Temp,W
STATUS,Z
I2CErr
nop
return
;
;
;
;
;
..datos al master. Lo lógica del Slave..
..se resetea en este caso. R_W = 0, D_A = 1
y BF = 0
Si no estamos en State5, entonces es
que algo fue mal
; Algo fue mal
;--------------------------------------------------------------------WriteI2C
;Usada por SSP_Handler para escribir datos en bus I2C
;--------------------------------------------------------------------banksel SSPSTAT
btfsc
SSPSTAT,BF
goto
WriteI2C
banksel SSPCON
DoI2CWrite
bcf
SSPCON,WCOL
movwf
SSPBUF
; Escribe el dato en W
btfsc
SSPCON,WCOL
goto
DoI2CWrite
bsf
SSPCON,CKP
; Libera el reloj
return
;--------------------------------------------------------------------ReadI2C
;Usada por SSP_Handler para escribir datos en bus I2C
;--------------------------------------------------------------------banksel SSPBUF
movf
SSPBUF,W
return
END
; Toma el byte y lo guarda en W
Descargar