Microcontroladores (Pic) .3
Microcontroladores (Pic) .3
Microcontroladores (Pic) .3
Tabla de Contenido
1 Comunicacion I2C Microcontroladores PIC
o 1.1 ¿Que es el I2C?
o 1.2 ¿Como trabaja la comunicación I2C?
2 Funcionamiento de la Comunicación I2C PIC
o 2.1 Sensor de Presión MPX con PIC
o 2.2 LCD I2C PIC
o 2.3 I2C Arduino
o 2.4 Protocolo de Comunicación I2C con CCS C
3 Protocolo I2C PIC – Ejemplo
o 3.1 Circuito Electronico Comunicación I2C Microcontroladores PIC:
o 3.2 XBEE modo AT
o 3.3 Predictor de Smith con PIC
o 3.4 Adquisición de Datos e Identificación de un Horno con PIC
o 3.5 Código de Implementación de Comunicación I2C PIC:
3.5.1 EEPROM
3.5.2 RELOJ DE TIEMPO REAL DS1307
3.5.3 TERMOMETRO
3.5.4 PRINCIPAL
4 Bibliografia
¿Que es el I2C?
El bus de comunicaciones I2C (nombrado a veces como I cuadrado C, I^2) es un
protocolo que se efectúa por medio de DOS hilos. A través de estos dos hilos
pueden conectarse diferentes dispositivos donde algunos de ellos
serán MAESTROS en cuanto muchos otros dispositivos serán ESCLAVOS.
¿Como trabaja la comunicación I2C?
Para poder reconocer cada uno de los dispositivos conectados a los DOS hilos del
bus I2C, a cada dispositivo se le asigna una dirección.
Así en este tipo de comunicaciones el MAESTRO es el que tiene la iniciativa en la
transferencia y este es quien decide con quien se quiere conectar para enviar y
recibir datos y también decide cuando finalizar la comunicación.
Los DOS hilos del BUS interfaz de comunicación I2C PIC son lineas de colector
abierto donde una de las lineas lleva la señal de reloj y es conocida como (SCL), y la
otra linea lleva los datos y es conocida como (SDA).
Los Pines SDA y SDL I2C se encuentran especificados en todos los componentes
que usan este tipo de protocolo de comunicación.
Para que la comunicación funcione se deben utilizar unas resistencias PULL
UP (resistencias conectadas a positivo) para asegurar un nivel alto cuando NO hay
dispositivos conectados al BUS I2C.
Puede darse el caso también de que una vez el MAESTRO se comunica con el
ESCLAVO, el MAESTRO no abandone el BUS y continúe comunicándose con el
ESCLAVO, para eso el MAESTRO debe generar una nueva condición de START que
se conoce en la literatura como START REPETIDA (Sr), idéntica al START anterior
solo que con un pulso de reconocimiento.
Para trabajar con el modulo de comunicación I2C PIC, se deben configurar los
siguientes registros: SSPCON, SSPCON2, SSPADD, SSPBUF, SSPSTAT y SSPSR.
Estas opciones pueden ir separadas por comas y pueden ser cualquiera de las
siguientes opciones
La directiva (#use i2c) tiene efecto en las funciones: I2C_START, I2C_STOP,
I2C_READ. I2C_WRITE y I2C_POLL. Se utilizan funciones de Software a menos que se
especifique FORCE_HW.
i2c_start();
i2c_stop();
Finaliza la transmisión.
i2c_write(DATO);
En esta función “DATO” es un entero de 8 bits que se envía por el bus. Cuando un
dispositivo que es MAESTRO aplica esta instrucción , se genera una señal de reloj
que marca la velocidad de transmisión del dato; Cuando un ESCLAVO aplica esta
instrucción se queda esperando la señal de reloj que genere el MAESTRO.
Para saber la dirección de la transmisión, se observa el bit de menor peso (LSB) del
primer dato transmitido tras un START (Si el bit es “0” quiere decir que la
información se está transmitiendo de MAESTRO a ESCLAVO)
Dato=i2c_read();
Dato2=i2c_read([ack]);
Dato es un entero de 8 bits leído del BUS. Cuando un dispositivo que es MAESTRO
aplica esta instrucción , se genera una señal de reloj que marca la velocidad de
transmisión del dato; Cuando un ESCLAVO aplica esta instrucción se queda
esperando la señal de reloj que genere el MAESTRO. No hay timeout por lo que
esta instrucción se utiliza junto con i2c_poll() para prevenir bloqueos.
valor=i2c_poll();
estado=i2c_isr_state();
Se utiliza solo si el PIC tiene modulo SSP. Devuelve el estado del bus en modo
ESCLAVO después de una interrupción.
El Menú debe tener una segunda opción que le permita al usuario ver por el puerto
serial los últimos datos almacenados en la EEPROM.
Circuito Electronico Comunicación I2C Microcontroladores PIC:
[sociallocker id=948]
Para solucionar este ejemplo vamos a crear tres librerías para manejar cada uno
de los 3 esclavos del ejemplo.
EEPROM
En entradas pasadas habíamos utilizado la libreria de la EEPROM del PIC para
guardar datos en ella, en este ejemplo vamos a crear nuestra propia libreria I2C
para PIC para entender como programarla por i2c:
La EEPROM M24512 (click para ver datasheet) tiene tres pines E2, E1, E0 que
permiten establecer la dirección de este dispositivo, de esta manera el PIC se
comunicara con la Memoria cuando el envíe por el i2c dicha dirección.
Esta dirección es almacenada dentro de la EEPROM en un byte de control
donde la parte alta de este byte siempre es fija (1010) y la parte
baja corresponde a los estados lógicos de E2, E1, E0, por ultimo viene el
bit de escritura/lectura, como puede ser visto en la siguiente figura:
i2c_start(); //Reinicio
//incorrectas
i2c_start();
status=i2c_write(0xa0);
A continuación se muestra la segunda función de nuestra librería I2C para PIC que
colocaremos en nuestra librería de EEPROM_24512.c
BYTE data;
i2c_start(); //Reinicio
return(data);
Este dispositivo posee una serie de registros donde aparecen los datos necesarios
(tabla 2 de la pagina 8 del datasheet). Estos datos son suministrados en BCD.
En la escritura el segundo byte es un puntero que indica la dirección del dato que
queremos escribir (ver la tabla 2).
En el ciclo de lectura es igual que el de escritura solo que el ultimo byte debe
indicar un NACK al Maestro. Con esto tan solo queda convertir los bytes leídos de
bcd a binario.
Para el manejo del reloj de tiempo real vamos a crear una libreria I2C para PIC
llamada DS1307.c con las siguientes funciones:
int varia;
varia=bcd;
varia>>=1;
i2c_start(); //Escritura
i2c_start(); //Lectura
TERMOMETRO
El termometro digital i2c DS1621 (Clic aca Datasheet) permite medir una
temperatura entre -55°C y 125°C como mostrado en la tabla 2 de la pagina 4 del
datasheet.
Este valor de temperatura es suministrado en dos Bytes. El byte alto es el valor
entero con una resolución de 1°C y el segundo byte es el valor decimal con una
resolución de 0.5°C.
El termómetro tiene tres pines los cuales sirven para darle la dirección al
dispositivo (A2, A1, A0). En nuestro ejemplo tenemos la dirección (0x03).
Al igual que la memoria EEPROM el termómetro tiene un byte de control donde se
almacena la dirección y si se desea escribir o leer. Este byte de control posee en su
parte alta un numero fijo (1001) y la parte baja viene dado por los pines de
dirección (A2, A1, A0) y el ultimo bit (R/W) es de escritura o lectura.
En la pagina 10 del datasheet se muestran todos los comandos que se pueden
usar con este dispositivo y la pagina 9 muestra ejemplos de como debe realizarse
el envío de tramas por el i2c.
Los comandos pueden ser 0xAA para lectura de la temperatura, 0xEE para el inicio
de conversión.
i2c_start();
i2c_stop();
float tura;
BYTE datah;
BYTE datal;
int data;
i2c_start();
i2c_stop();
data=datah;
if (datal==128)
tura=data+0.5;
else
tura=data;
return(tura);
}
PRINCIPAL
Dado que la temperatura es un dato tipo FLOAT, no se puede guardar este dato
directamente en la EEPROM, por lo tanto vamos a utilizar una librería suministrada
por CCS C llamada FLOATEE.c que nos permitirá guardar y leer datos tipo FLOAT
en una EEPROM.
#INCLUDE <16F887.h>
#DEVICE ADC=10
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#BYTE PORTA= 5
#BYTE PORTB= 6
#BYTE PORTC= 7
#BYTE PORTD= 8
#include <lcd.c>
#include <EEPROM_24512.c>
#include <DS1307.c>
#include <TEMP_DS1621.c>
#include <floatee.c>
int16 address=0;
int dat_serie[7];
float dato=0;
#int_rda
void rda_isr(void)
{
dat_in=getc(); //Lee el puerto Serial
printf("%c\r",dat_in);
dat_serie[cnt]=read_ext_eeprom(cnt);
void main()
lcd_init();
set_tris_c(255);
enable_interrupts(int_rda);
enable_interrupts(global);
address=0;
while(1)
{
address=address+4;
lcd_gotoxy(1,1);
printf(lcd_putc,"%2u:%2u:%2u",hr,min,sec);//Visualiza la hora
if (address==0xffff)
dat_in=0;
[/sociallocker]
Bibliografia
1. Compilador C CCS y Simulador Proteus para Microcontroladores PIC, Eduardo
Garcia Breijo,