Buscar este blog

Información semanal de las clases de electrónica y las sucesivas prácticas realizadas por Guillermo Cayetano Espejo alumno del Ciclo de Grado Superior de Manteniemintos Electronicos de 2º Curso del CIFPN1 (Peñacastillo,Santander) Dpto:Electricidad y Electrónica

sábado, 22 de octubre de 2016

Bus I2C



Esta semana hemos visto teoría casi toda la semana y también se nos presentó la practica 2 (si contamos la placa como la 1), así que empezare explicando por encima dicha práctica (ya que creare una entrada exclusiva para dicha práctica) y luego comentare la teoría dada durante la semana.

-Practica del I2C:

Vamos a seguir el guion de un página de Internet el cual añado a continuación el enlace:


En la página de internet viene la práctica desarrollada y más o menos explicada, lo que nosotros debemos hacer es realizar dicha práctica simulándola en Proteus y conocer todo lo que se hace, ya sean comandos, dispositivos, reglas…etc.

También tendremos que saber cómo lo simula Proteus y que significa cada método que utiliza y que significan los datos que obtiene. Es decir debemos conocer el funcionamiento al completo del chip ( o chips) que manejamos y conocer como está siendo simulado.

Para saber cómo funcionan los chips habrá que indagar en sus respectivos PDFs.

- Teoría de la semana:

Hablamos de los chips que se trabajaran en la práctica anteriormente mencionada y de sus protocolos y demás características.
            -El BUS I2C: Es un bus de comunicación serie, se creó para comunicar chips en placa, se comunica mediante dos líneas que son SDA, que incluye los datos y SCL que es la señal de reloj. Al solo haber una línea de datos solo se podrá comunicar de uno en uno.

Hay que destacar que entre chips se comunica mediante dos líneas ya que utiliza la referencia (GND) de los chips que comunica, sin embargo si utilizáramos esta comunicación para comunicar dos placas habría que incluir una tercera línea de referencia (GND).

Este tipo de comunicación funciona con maestros y esclavos, es decir, uno es el maestro ( el micro en nuestro caso), que es el que decide con quien se comunica, esto no quiere decir que no pueda ser receptor, puede tanto recibir como emitir datos sin embargo es el quien controla la comunicación en cualquier momento puede cortar la comunicación con ese chip y empezar a comunicarse con otro, eso si, siempre de uno en uno.

Esta comunicación sigue una pauta estricta:

Primero se envía un bit de condición de start (S) que inicia la comunicación.

Después se envían 7 bits que son la dirección a donde se dirige la comunicación.

Luego otro bit que indica si es lectura o escritura.

Y por último se envía un bit de reconocimiento para ver si el chip a recibido lo anterior.

Después se enviaría el dato en cuestión y otro bit de reconocimiento.

Si se quisiera cambiar de chip esclavo o de acción se utilizaría la condición de inicio repetida.

La diferencia entre un esclavo y un maestro es que este ultimo tiene “cerebro” por eso suele ser el micro-controlador.

El I2C como hemos mencionado antes tiene un reloj propio, este reloj es de una velocidad de KHz, mientras que el reloj del micro es de 16 MHz, esto quiere decir que al mandar una instrucción al I2C, mientras se ejecuta, el micro sigue ejecutando instrucciones ya que es mucho mas rápido.

Al comunicar dos chips por un BUS I2C, se colocan do resistencias PULL UP en sus líneas de comunicación, esto sirve para que si en las líneas no hay datos, se pongan a nivel alto y pueda haber cambios en esas líneas.

La capacidad del BUS I2C está limitada por el número de chips ya que al ser direcciones de 7 bits solo podrá ofrecer 2^7  direcciones es decir solo puede conectar con 128 chips diferentes. También está limitado por la capacidad total de los chips esta no puede superar los 400pF.

Cada Chip tiene su propio protocolo de comunicación basado en I2C.

En la práctica utilizamos el chip DS162 para medir la temperatura, este chip responde a una serie de comandos que explicare a continuación.

Command Set (Conjunto de comandos):  El DS1621 lee y escribe la información como se muestra en la figura:





Para escribir el maestro emitirá la dirección del esclavo y pondrá el bit de lectura/escritura a cero, enviara el bit de reconocimiento y seguidamente mandara un byte de protocolo de comandos, otro bit de reconocimiento y el byte de datos. Si se va a leer, el maestro debe enviar el byte de protocolo de comandos como antes y seguidamente la condición de inicio repetida y  otra vez el byte de control (supongo que es el byte con la dirección) esta vez con el bit de escritura/lectura a 1 para permitir leer los datos del DS1621.
           
·        Read Temperature(AAh*): Lee el resultado del último valor de temperatura convertido. El DS1621 manda dos bytes.* La h indica que es formato hexadecimal.
·        Acess TH (A1h): Si el bit escritura/lectura está a 0, este comando escribe en el registro TH. Después de enviar este comando se enviaran dos bytes (mismo formato de antes) los cuales fijaran un límite de temperatura para el funcionamiento de Tout. Si el valor de escritura/lectura es 1, simplemente e leerá el valor que tenga almacenado ese registro.
·        Acess TL (A2h): Igual que TH pero con el límite de temperatura baja.
·        Acess Config (Ah): Si la lectura/escritura es 0, este comando escribe en el registro de configuración, el siguiente byte enviado después del comando será el valor que será escrito en el registro de configuración. Si la lectura/escritura es 1, el byte siguiente será la lectura del byte almacenado en el registro de configuración.
·        Read Counter (A8h): Lee el valor de Count_Remain, este comando solo es válido solo si la lectura/escritura es 1.
·        Read Slope (A9h): Lee el valor de Count_Per_C, este comando solo es válido solo si la lectura/escritura es 1.
·        Start Convert T (EEh): Este comando inicia la conversión de temperatura, no necesita datos, en modo un disparo convertirá y transformara la temperatura y después el DS1621 permanecerá en espera, en modo continuo este comando iniciara la conversión continua de temperatura.
·        Stop Convert T (22h): Este comando detiene la conversión de temperatura, no necesita datos, puede ser utilizado para detener al DS1621 en el modo de conversión continua, tras enviar este comando la medida de temperatura actual será completada y el DS1621 permanecerá en espera hasta que se envié el comando Start Conver T para reanudar el funcionamiento continuo.


Para comunicarnos con el BUS I2C utilizaremos la librería wire.h
Vamos a descomponer la línea de código siguiente:
#include <Wire.h>
·        # : La almohadilla indica que son directivas, es decir instrucciones para el compilador.
·        Include: directiva que le dice al compilador que busque, en este caso la librería Wire.
·        <…> : Si ponemos la librería entre estos signos de mayor y menor, le indicamos que busque la librería en el sitio que tengamos por defecto. Si quisiéramos buscar la librería en otro sitio escribiríamos entre comillas””, la ruta donde se encuentre la librería. Si ponemos solo comillas “” ( y el nombre de la librería, nos la buscara donde este guardando nuestro programa ,el archivo .ino .
En Proteus podemos ver donde guarda las librerías por defecto en System Setting.
Int : define una variable de tipo entero, que ocupa 16 bits (2 bytes) esto quiere decir 65536 combinaciones diferentes por lo que, en positivos solo abarcara un rango de números de 0 a 65535 y en negativos de -32767 a 32768 ( el 0 cuenta como positivo).

          Int dirección=0x48

La línea de arriba lo que hace es asignar a dirección un numero de tipo entero en formato hexadecimal (0x número, indica formato hex).

Variable Global: Se guarda en la SRAM( 2k), cada dirección ocupa un byte por lo tanto solo se podrán tener 2048 direcciones (en teoría).

Cuando tenemos el siguiente formato de código:

            Serial.beguin

            Lo que se encuentra a la izquierda del punto es una clase y lo que está a la                     derecha es un método o función de esa clase.

En Proteus Cuando simulas se habilitan varios modos, uno es el modo Debug, en le cual se puede encontrar el compilador (AVR complidaor de Atmel) esa pestaña nos da opción de ver una serie de cosas que explicare a continuación:

1.     Código Fuente: Es el programa que escribimos nosotros, el programa principal.

2.     Variables: Las variables que hemos definido en el programa, globales y locales. En este modo nos aparecerá la siguiente configuración en la SRAM :
****0138   40
La primera columna es la dirección de la variable, pero solo los 4 últimos dígitos, la columna contigua es el valor en decimal.

3.     Registros CPU: Incluye los puertos (Registros I/O), Conversores analógicos-digitales, temporizadores… etc.

4.     Memoria de datos: Es la RAM más concretamente es la SRAM.

5.     Memoria EEPROM: Es donde guardaremos lo que no queremos perder al dejar de alimentar.

6.     Memoria de programa: Es la memoria Flash.

7.     Registros I/O: Los puertos de los Registros de la CPU de una manera más detallada.

Extensiones: .elf y .hex son las que se compilan para llevarlas al micro la primera la utiliza Proteus, y la hex hace falta un programador para llevarla al micro                       ( ArduinoUSBtinyISP).

            .elf: Extensión que Proteus utiliza para simular y depurar.

.hex: Igual que la extensión .elf con la salvedad de que no depura, solo simula y no puedes ver los registros ni los recursos.

En el ID en herramientas, hay una opción que es quemar bootloder, que nos mete el firware al micro si nos hace falta.

Formato IntelHexadecimal
            Ej: :10000000…..(16bits)….00

Los dos primeros bits indican el número de datos que se van a enviar en hexadecimal en este caso 10 en hex es 16 en dec.

Los cuatro siguientes la dirección de grabado.

Los dos siguientes el tipo de línea, si es 00 se puede grabar, si es 01 se acaba el grabado.

Los 16 bits siguientes son el dato y los dos últimos son el cheksum que comprueba si se a enviado correctamente.

RISC: Conjunto de instrucciones reducidas.
Ortogonal: El micro puede hacer movimientos entre registros.
Harvard: Puedes acudir al BUS de datos y al de direcciones “a la vez”( no es estrictamente a la vez pero si de manera muy rápida).
En Proteus al abrir el I2C saldra un cuadro como el siguiente:


La primera columna es el momento en el que empieza la instrucción y la segunda en la que acaba, si los restas tienes el tiempo que le llevo hacerlo.

La tercera columna (S) indica el bit de inicio.

La Cuarta columna (90 o 91) es la dirección y el bit de escritura/lectura todo junto, en hexadecimal deberás pasarlo a binario y el bit LSB será el de escritura/lectura y los demás la dirección.

La siguiente columna (A) es el bit de reconocimiento.

La siguiente él es byte de datos (el comando por ejemplo) en hexadecimal.

La siguiente columna es el bit de reconocimiento (A) aunque puede ser un (N) de no reconocimiento es quiere decir que el maestro a interrumpido la comunicación.

El último bit es el de paro.

El Micro-controlador tiene 32 registros de propósito general.



No hay comentarios:

Publicar un comentario