Vous êtes sur la page 1sur 15

INTERCONEXIN SERIAL I2C

La comunicacin serial entre integrados y elementos de una misma placa o circuito impreso
ha sido objeto de investigacin y propuestas diversas por parte de algunos fabricantes o
grupos de ellos. Sin llegar a establecerse como estndares, dos de estas propuestas ocupan
un rol sobresaliente, son los llamados Bus I2C y SPI.
I2C e I2C son denominaciones usadas indistintamente para hacer referencia al Bus de
comunicacin serial creado en 1991 por Phillips bajo el nombre Inter Integrated Circuit.
Tal Bus concibe la existencia de dos lneas para dar soporte a una comunicacin serial
bidireccional entre un dispositivo Maestro y mltiples Esclavos: SCL, seal de reloj
establecida por el Maestro y SDA, canal de datos (figura 1). Una tierra comn a todos los
elementos conectados al Bus, no visible en la figura 1, es un requerimiento sobre entendido.
Vdd
Rp
SCl
SDA

Master

Slave

Slave

Slave

Fig. 1 Esquema general del Bus I2C

El dispositivo Maestro establece comunicacin con cualquiera de los Esclavos a travs de


direcciones que los identifica. La simplicidad del hardware no es gratuita ya que se
compensa con la necesidad de acompaar los datos transmitidos con mltiples transiciones
y convenciones que han de considerarse en la programacin.

MDULO I2C DEL PIC16F887


En el PIC16F887 se implementa un mdulo para comunicacin mediante el Bus I2C, con
las siguientes caractersticas:
-

Soporta direcciones de 7 y 10 bits para los dispositivos esclavos.

Velocidades de trasmisin de 100 Kbits/s y 400 Kbits/s.

Permite la operacin del Bus en modo multi-Maestro.

LECTURA Y ESCRITURA DE UNA MEMORIA SERIAL I2C

Objetivo: Disear un sistema capaz de leer y grabar informacin en una memoria serial no
voltil, mediante el Bus I2C
El objetivo planteado implementar un circuito que har lo siguiente:
-

Permitir la seleccin de dos modos de operacin: programacin y control.

En el modo de programacin se digitalizarn dos niveles de tensin ajustados


externamente y se escribirn en dos registros de una memoria serial.

En el modo de control se leern los dos niveles de tensin previamente almacenados


y se realizar una comparacin de los mismos contra otro digitalizado en forma
continua.

Si la tensin adquirida se encuentra entre los valores ledos desde la memoria, se


activar una seal, en caso contrario se apagar.

Deber comprobarse que los valores almacenados en la memoria no se borran al


desenergizarla.

El diagrama de bloques del circuito a disear es el de la figura 2.

LCD
SCL

Vin
A/D
Selector:
Programacin /
Control

Memoria
Serial

Mdulo I2C
SDA
Microcontrolador

Seal Digital

Fig. 2 Diagrama de bloques: Sistema Lector / Escritor en memoria serial.

SELECTOR DE PROGRAMACIN Y CONTROL

El sistema de seleccin entre los modos de Programacin y Control puede implementarse


con un simple interruptor; no obstante se requieren elementos adicionales para implementar
el funcionamiento requerido. En la figura 3 se muestra un pulsador identificado con el
nombre Enter, el cual ha de usarse cuando el selector se coloque en posicin de
Programacin, de manera que el usuario decida hacer efectiva la introduccin de un valor
de tensin en la memoria serial.
VDD

R5
R6

2.4k

2.4k

CTRL/PROG
Enter

Fig. 3 Selector de Programacin y Control

MEMORIA SERIAL

Aparte del microcontrolador, la memoria serial es el elemento ms importante de este


circuito. Existen muchas y diversas memorias creadas por distintos fabricantes, con
capacidad de comunicacin mediante el Bus I2C; y siendo Microchip uno de ellos, resulta
natural orientar la eleccin hacia uno de sus productos. La memoria EEPROM 24C02C,
visible en la figura 4, es la seleccionada.

6
5
7

SCK
SDA
WP

A0
A1
A2

1
2
3

24C02C

Fig. 4 Memoria serial 24C02C y su mdulo en ISIS Proteus

Entre las caractersticas listadas por Microchip para esta memoria se encuentran:
-

Compatibilidad para conexin en Bus I2C.

Capacidad de 2 kbits organizados como un solo bloque de 256 Bytes.

Compatibilidad para transferencia a 100 kbits/s y 400 kbits/s.

Soporta hasta 1000000 de ciclos de borrado / escritura.

Posee hardware interno de proteccin contra escritura.

Los pines visibles en la figura 4 tienen las siguientes funciones:


SCL, SDA: Conexin a las lneas de reloj y datos del Bus.
WP: Proteccin contra escritura, activa alta.
A2, A1, A0: Direccin de la memoria entre los perifricos Esclavos conectados al Bus. Si
la direccin especificada por el Maestro durante la transferencia de datos coincide con la
combinacin de tensiones lgicas establecidas en estos pines, la memoria resulta
seleccionada.

Secuencias de escritura.
Dos modos de escritura especifica el fabricante: de Bytes y de Pginas. La secuencia o
tramas de bits para la escritura de Bytes puede detallarse a travs de la figura 5.

Fig. 5 Secuencia para escritura de Bytes en la Memoria serial 24C02C


Fuente: Microchip Technology. Datashhet del dispositivo

Bit de Start: Transicin Beta en la lnea SDA, mientras SCL permanece en alto.

Byte de Control: Esta seccin de la trama corresponde a la direccin del dispositivo


Esclavo en el Bus (figura 6). En el caso de esta memoria, el fabricante conforma
dicha direccin mediante la combinacin 1010, seguida de tres bits que han de
corresponder con los niveles a los cuales se conectan los pines A2, A1 y A0. Se
totalizan as 7 bits (con los cuales se podra direccionar hasta 128 dispositivos). El
octavo bit de este Byte es el de lectura/escritura (R/W), el cual debe ajustarse a 0
para operaciones de escritura (como es el caso de la figura 5) y a 1, para
operaciones de lectura.

Fig. 6 Formato del Byte d Control


Fuente: Microchip Technology. Datashhet del dispositivo

Bit ACK: Se trata de una respuesta o reconocimiento devuelto por el dispositivo


Esclavo, cuando el Maestro le enva un byte. Tmese nota de lo siguiente: Al
momento de recibir el bit ACK, el pin del microcontrolador que implementa la lnea
SDA debe reconfigurarse momentneamente como entrada. La programacin con

lenguaje de alto nivel libera al diseador de estos cuidados, pero no as el uso de


lenguaje Assembler.
-

Word Address: Se trata de un Byte correspondiente a la direccin de la palabra o


registro interno de la memoria al cual se quiere acceder. En el caso de la 24C02C es
un valor entre 0 255.

Dato: Luego de otro bit ACK han de enviarse los 8 bits de los cuales consiste el
dato que desea grabarse o escribirse en la memoria.

Bit de Stop: Posterior al dato prosigue un nuevo bit ACK y por ltimo un bit de
parada. ste bit se implementa como una transicin Alfa en la lnea SDA mientras
SCL permanece en alto.

La segunda modalidad de escritura se muestra en la figura 7. El fabricante Microchip la


denomina Page Write y se diferencia de la anterior porque luego de escrito el primer dato
no se finaliza la trama, si no que se siguen enviando bytes, separados por bits ACK, hasta
que se decide finalizar con el Stop bit. Los datos enviados secuencialmente se almacenan en
direcciones consecutivas de la memoria, iniciando desde la primera, explcitamente
indicada.

Fig. 7 Secuencia para escritura de Pginas en la Memoria serial 24C02C


Fuente: Microchip Technolog. Datashhet del dispositivo

Secuencias de Lectura

A semejanza del caso de la escritura existen 2 modalidades de lectura en la memoria


24C02C: Aleatoria (Random) y Secuencial (Sequential). La secuencia para efectuar la
lectura Aleatoria sirve para extraer un Byte desde una direccin especificada (figura 8) y
consiste en:

Fig. 8 Secuencia para lectura aleatoria en la Memoria serial 24C02C


Fuente: Microchip Technology. Datashhet del dispositivo

Bit de Start.

Byte de Control, (1010A2A1A0) seguido del bit R/W igual a 0 (para escritura) y un
bit ACK.

Word Address: Direccin interna de la memoria (0 255) a la cual se accede para


leer el dato. Sigue un bit ACK.

Bit de Start. Por segunda vez ha de introducirse este bit.

Byte de Control, pero ahora finalizado con el bit R/W igual al 1 (para lectura) y
continuado con un bit ACK.

Dato: En este caso el Maestro recibe los 8 bits que conforman el dato ledo desde la
memoria.

No ACK. Se deja transcurrir el tiempo correspondiente a un bit, pero no ha de


esperarse respuesta o reconocimiento por parte del dispositivo Esclavo.

Bit de Stop.

Esta secuencia se modifica a lo mostrado en la figura 9 para la modalidad definida por el


fabricante como Secuencial.

Fig. 9 Secuencia para lectura secuencial en la Memoria serial 24C02C


Fuente: Microchip Technology. Datashhet del dispositivo

La modalidad de lectura Secuencial implica el acceso a datos guardados en direcciones


consecutivas de la memoria. Se ha de enviar la misma trama de la figura 8, pero luego del
primer dato ledo se contina con la lectura de datos adicionales intercalando bits ACK,
hasta que se ha extrado el ltimo dato deseado y se procede a finalizar sin bit ACK y bit de
Stop.

3 SEAL DIGITAL DE SALIDA

Acompaado al medio de visualizacin de la seal de salida manipulada (LED amarillo), se


ha decidido colocar otros dos LEDs: uno azul, que ha de permanecer encendido mientras se
est operando en el modo Control y otro rojo, que har lo propio durante el modo
Programacin (figura 10).

330

330

330

RED-PROG

BLUE-CTRL

YELLOW-OUT

Fig. 10 LEDs para visualizacin de las salidas

CIRCUITO FINAL DEL SISTEMA DE LECTURA ESCRITURA DE LA


MEMORIA SERIAL 24C02C

Respecto al circuito mostrado en la figura 11 es de hacerse notar la conexin de la memoria


al BUS incluyendo 2 resistencias de Pull Up de 2.4 kOhms. Esto es una indicacin del
fabricante en las hojas de especificacin de la memoria.

+5V

LCD1

+5V
50%

LM032L

D0
D1
D2
D3
D4
D5
D6
D7

RS
RW
E

VSS
VDD
VEE

20 MHz

VSS

7
8
9
10
11
12
13
14

4
5
6

1
2
3

10k

VSS

+5V
1k

U2
1
2
3

A0
A1
A2

SCK
SDA
WP

U1
1k

6
5
7

24C02C

SW CTRL/'PRG

R3

10k

10k

15
16
17
18
23
24
25
26

RC0/T1OSO/T1CKI
RE3/MCLR/VPP
RC1/T1OSI/CCP2
RC2/P1A/CCP1
RA0/AN0/ULPWU/C12IN0RC3/SCK/SCL
RA1/AN1/C12IN1RC4/SDI/SDA RA2/AN2/VREF-/CVREF/C2IN+
RC5/SDO
RA3/AN3/VREF+/C1IN+
RC6/TX/CK
RA4/T0CKI/C1OUT
RC7/RX/DT
RA5/AN4/SS/C2OUT
RA6/OSC2/CLKOUT
RD0
RA7/OSC1/CLKIN
RD1
RD2
RB0/AN12/INT
RD3
RB1/AN10/C12IN3RD4
RB2/AN8
RD5/P1B
RB3/AN9/PGM/C12IN2RD6/P1C
RB4/AN11
RD7/P1D
RB5/AN13/T1G
RB6/ICSPCLK
RE0/AN5
RB7/ICSPDAT
RE1/AN6
RE2/AN7

19
20
21
22
27
28
29
30

BOTN

R2

8
9
10

+5V
330

VCC

VSS

330

330

VSS

1
2
3
4
5
6
7
14
13
33
34
35
36
37
38
39
40

PIC16F887
+5V

RED-PROG

BLUE-CTRL

VIN

YELLOW-OUT
40%

1k

+88.8
Volts

Facultad de Ingenieria

Fig. 11 Circuito final del Sistema de lectura / escritura de la memoria serial 24C02C

PROGRAMACIN DEL SISTEMA DE LECTURA ESCRITURA DE LA


MEMORIA SERIAL 24C02C

La lgica de control se especifica en el diagrama de flujos de la figura 12.

Inicio

Configuracin:
PortB: Ctrl LCD. RC3: SCL, RC4: SDA,
Asignar Vin, SW, Enter, LEDS: Blue. Red, Yellow

Inicializacin
LCD, I2C
Yellow
0

Leer N1 MSb (I2C)


Leer N1 LSB (I2C)
V1 N1*5/1024

Leer N2 MSb (I2C)


Leer N2 LSB (I2C)
V2 N2*5/1024

Si

Intercambiar V1 y V2

V2<V1
No

Mostrar V1 y V2

Control
Blue: On, Red: Off

1
SW

Programacin
0
Blue: Off, Red: On

Adquirir Vin
Mostrar Vin

Yellow: ON

Si

Adquirir Vin

No

V1<Vin<V2
No
Yellow: Off

Enter
Si

Escribir N1 LSB (I2C)


Escribir N1 MSb (I2C)
V1 N1*5/1024


Adquirir Vin

No

Enter
Si

Escribir N2 LSB (I2C)


Escribir N2 MSb (I2C)
V2 N2*5/1024

Intercambiar V1 y V2

Si

V2<V1
No
No
Enter

Si

Fig. 12 Diagrama de Flujo: Sistema de lectura / escritura de la memoria serial 24C02C

Las rutinas claves de mikroC son:


- void Soft_I2C_Init(): Inicializa el Bus I2C.
- void Soft_I2C_Start(): Genera el Start bit.
- void Soft_I2C_Stop(): Genera el Stop bit.
- unsigned short Soft_I2C_Write(unsigned short data): Escribe el Byte data. Esta rutina
maneja la espera del bit ACK por lo que, luego de usarla, no hay que hacer una espera
explcita del mismo. Devuelve 0 si no hubo error de escritura y 1 si hubo alguna
coisin en el Bus.

- unsigned short Soft_I2C_Read(unsigned int ack): Devuelve un Byte correspondiente al


dato ledo desde la memoria. En su argumento debe especificarse si luego de la lectura se
esperar el bit ACK (ack = 1) o no (ack=0).
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
// conexiones I2C
sbit Soft_I2C_Scl at RC3_bit;
sbit Soft_I2C_Sda at RC4_bit;
sbit Soft_I2C_Scl_Direction at TRISC3_bit;
sbit Soft_I2C_Sda_Direction at TRISC4_bit;
//
// Entradas y salidas digitales
sbit SW at RD0_bit;
sbit BOTON at RD1_bit;
sbit BLUE at RD2_bit;
sbit RED at RD3_bit;
sbit YELLOW at RD4_bit;
// Fin de entradas y salidas digitales
// Entrada Analgica
sbit Vin at RE0_bit;
// Fin de entrada analgica
void main()
{
float V1;
float V2;
unsigned Vin;
unsigned short Vx;
unsigned short VxL;
unsigned short VxH;
float Vinf;
float Vchange;
char txt[15];
TRISD = 0x03;
// SW y BOTON en RD0 y RD1
TRISE = 1;
// RE0 es entrada
ANSEL = 0x20;
// RE0 ES AN5
ANSELH = 0;
// Puerto B digital
ADCON1 = 0x80;
Lcd_Init();
// Initialize LCD
Lcd_Cmd(_LCD_CLEAR);
// Clear display
Lcd_Cmd(_LCD_CURSOR_OFF);
// Cursor off
//****************INSTRUCCIONES*****************************
//*****SW ON: MANIPULE VIN Y EL BOTON PAR FIJAR V1 Y V2*****
//*****SW OFF: MANIPULE VIN: V1<VIN<V2 OUT ON**************

Delay_ms(2000);
YELLOW = 0;
Lcd_Cmd(_LCD_CLEAR);
Soft_I2C_Init();
// initialize I2C communication
// ******* Lectura de V1 y V2 **************
Soft_I2C_Start();
// issue I2C start signal
Soft_I2C_Write(0xA0);
// Control
Soft_I2C_Write(0);
// Direccin 0 para V1
Soft_I2C_Start();
Soft_I2C_Write(0xA1);
// Control Lectura
VxL = Soft_I2C_Read(1);
// Lectura Byte bajo de V1 con ACK
VxH = Soft_I2C_Read(0);
// Lectura Byte alto de V1 sin ACK
Soft_I2C_Stop();
// issue I2C stop signal
Vin = VxH & 0x00FF;
Vin = Vin << 8;
// Desplazamiento del byte alto de V1
Vin = Vin | VxL & 0x00FF; // Mask para byte bajo y OR con byte alto
V1 = (float)Vin*5/1024;

// formato decimal para V1

Delay_ms(500);
//Pausa
Soft_I2C_Init();
// initialize I2C communication
Soft_I2C_Start();
// issue I2C start signal
Soft_I2C_Write(0xA0);
// Control
Soft_I2C_Write(2);
// Direccin 2 para V2
Soft_I2C_Start();
Soft_I2C_Write(0xA1);
// Control Lectura
VxL = Soft_I2C_Read(1);
// Lectura Byte bajo de V2 con ACK
VxH = Soft_I2C_Read(0);
// Lectura Byte alto de V2 sin ACK
Soft_I2C_Stop();
// issue I2C stop signal
Vin = VxH & 0x00FF;
Vin = Vin << 8;
// Desplazamiento del byte alto de V2
Vin = Vin | VxL & 0x00FF; // Mask para byte bajo y OR con byte alto
V2 = (float)Vin*5/1024;

// formato decimal para V2

// *** El siguiente if logra que V1 siempre sea la cota inferior y V2 la superior ***
if (V2 < V1)
{
Vchange = V1;
V1 = V2;
V2 = Vchange;
}
//
do
{
FloatTostr (V1,txt);
Lcd_Out(1,1,txt);
FloatTostr (V2,txt);
Lcd_Out(1,10,txt);
if (SW == 1) // *** Este es el ciclo de monitoreo y control
{
BLUE = 1;
RED = 0;
Vin = ADC_read(5);
Vinf = (float)Vin*5/1024;
FloatTostr (Vinf,txt);
Lcd_Out(2,1,txt);

if (Vinf > V1 && Vinf < V2)


YELLOW = 1;
else YELLOW = 0;
}
else
// *** Este es el ciclo de programacin de la memoria serial
{
BLUE = 0;
RED = 1;
// *** Dato 1
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1, 1, "Pulse para prog. V1*");
// Antirebote
do
{
Delay_ms(20);
} while (BOTON == 1);
do
{
Delay_ms(20);
} while (BOTON == 0);
// Fin antirebote
Vin = ADC_read(5);
// Lectura del dato
Vx = Vin;
VxL = Vin & 0x00FF;
VxH = (Vin & 0xFF00)>>8;
// Escritura I2C
Soft_I2C_Init();
// initialize I2C communication
Soft_I2C_Start();
// issue I2C start signal
Soft_I2C_Write(0xA0);
// Control Escritura
Soft_I2C_Write(0);
// send byte (address of EEPROM location)
Soft_I2C_Write(VxL);
// send data (data to be written)
Soft_I2C_Write(VxH);
Soft_I2C_Stop();
// issue I2C stop signal

V1 = (float)Vin*5/1024;

// Formato decimal de V1

// *** Dato 2
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1, 1, "Pulse para prog. V2");
// Antirebote
do
{
Delay_ms(20);
} while (BOTON == 1);
do
{
Delay_ms(20);
} while (BOTON == 0);
// Fin antirebote
Vin = ADC_read(5);
// Lectura del dato
Vx = Vin;
VxL = Vin & 0x00FF;
VxH = (Vin & 0xFF00)>>8;
// Escritura I2C
Soft_I2C_Init();
// initialize I2C communication
Soft_I2C_Start();
// issue I2C start signal
Soft_I2C_Write(0xA0); // Control Escritura
Soft_I2C_Write(2);
// send byte (address of EEPROM location)
Soft_I2C_Write(VxL); // send data (data to be written)
Soft_I2C_Write(VxH);
Soft_I2C_Stop();
// issue I2C stop signal

V2 = (float)Vin*5/1024; // Formato decimal de V2


// Intercambio de V1 y V2 en caso de haber sido tomados en descenso
if (V2 < V1)
{
Vchange = V1;
V1 = V2;
V2 = Vchange;
}
// otro pulso para salir, debe ajustarse SW a 1 antes de dar el pulso
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1, 1, "Ajuste SW");
Lcd_Out(2, 1, "Pulse para Ctrl.");
// Antirebote
do
{
Delay_ms(20);
} while (BOTON == 1);
do
{
Delay_ms(20);
} while (BOTON == 0);
// Fin antirebote
Lcd_Cmd(_LCD_CLEAR);
}
} while (1);
}

Vous aimerez peut-être aussi