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.