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