Está en la página 1de 11

LABORATORIO DE MICROPROCESADORES II

PRCTICA N3
1. Objetivo: Desarrollar una aplicacin que permita comunicar un circuito
integrado con el microcontrolador PIC18F4550 mediante el protocolo I
2
C.
2. Marco terico: Para el laboratorio utilizaremos el protocolo de comunicacin
I
2
C que fue desarrollado por Phillips en el ao 1980.
Las caractersticas del protocolo I
2
C son las siguientes:
Modo sncrono: La transferencia de datos es iniciada siempre por el
dispositivo maestro. Una seal de reloj (SCL) sincroniza la transferencia
de datos. La frecuencia de reloj puede cambiar sin afectar a la calidad
de los datos.
Modo maestro esclavo: El dispositivo maestro controla la lnea de reloj
SCL. Esta lnea determina la temporizacin de la transferencia de datos
sobre el bus I
2
C.
Transferencia de datos bidireccional: Los datos pueden ser transmitidos
en cualquier direccin sobre el bus I
2
C.
Mtodo de interface serial: El protocolo I
2
C solo utiliza las lneas SCL y
SDA. La seal SCL es la seal de reloj serial, mientras SDA es la lnea
de datos serial, siendo que esta lnea tambin puede transportar
direcciones.
2.1 Niveles en las seales del protocolo I
2
C: Solo puede tener dos posibles
estados elctricos: flotante en alto y bajo. El dispositivo maestro o esclavo
manejan el bus I
2
C mediante un driver de drenador abierto o colector abierto.
Las lneas SDA y SCL son llevadas a Vdd mediante resistores de pull up.
Debido a que el driver es de drenador abierto, solo puede llevar el bus I
2
C a
nivel bajo. Cuando la salida de reloj esta en nivel lgico bajo, el transistor
NMOS es apagado. En este caso no fluye corriente desde y hacia el transistor
NMOS y por lo tanto el bus es llevado a nivel lgico alto por los resistores de
pull up. En caso contrario el transistor NMOS es encendido y se lleva las lneas
a nivel lgico bajo. El valor del resistor de pull up depende de la capacitancia
de la lnea de comunicacin y la velocidad de comunicacin. Se recomiendan
valores de 2,2 K y 1 K para los modos de comunicacin estndar y de alta
velocidad (no soportado por PIC 18).










Conexin de los dispositivos al bus I
2
C en modos estndar y alta velocidad
2.2 Seales utilizadas para la transferencia de datos con I
2
C
1. S (Condicin de inicio): Una condicin de inicio indica que un dispositivo
podra transferir datos a travs del bus I
2
C. Una condicin de inicio es
representada por un flanco descendente en la lnea SDA cuando la seal
de reloj se encuentra en nivel lgico alto.





2. P (Condicin de parada): Una condicin de parada indica que un
dispositivo desea dejar libre el bus I
2
C. Una vez liberado el bus, otros
dispositivos podrn utilizarlo para transmitir datos. Una condicin de
parada es representada por un flanco ascendente en la lnea SDA cuando
la seal de reloj se encuentra en nivel lgico alto. Una vez que la condicin
de parada se completa ambas seales SDA y SCL se mantienen en alto,
condicin conocida como bus desocupado.



3. (R) Condicin de inicio repetido: Una seal de inicio repetido es una
seal de inicio generada sin haber antecedido una seal de paro (P). Esta
seal es utilizada por el dispositivo maestro para comunicarse con otro
dispositivo esclavo o con el mismo esclavo en un modo diferente de
comunicacin sin dejar de usar el bus.





4. Datos: El bloque de datos representa la transferencia de un paquete de
datos de 8 bits de informacin. Los datos son enviados por la lnea SDA,
mientras los pulsos de reloj son enviados por la lnea SCL. La seal de reloj
puede ser alineada para con los datos para indicar si cada bit es 1 o 0.
Los datos son vlidos en la lnea SDA solo cuando la seal de reloj es alta.
Cuando SCL no est en alto es posible cambiar los datos.



5. ACK (Condicin de reconocimiento): La transferencia de datos en el bus
serial bajo el protocolo I
2
C necesitan ser reconocidas positivamente (ACK)
o negativamente (NACK). Un dispositivo puede reconocer (A) la
transferencia de cada byte colocando la lnea SDA en nivel bajo durante el
noveno pulso de reloj.
Si el dispositivo en cambio mantiene la lnea SDA flotante en alto transmite
un reconocimiento negativo (NACK).




2.3 Sincronizacin: Todos los maestros generan sus propias seales de
reloj sobre la lnea SCL para transferir datos. Los datos son validos solo
durante el periodo en que se encuentra en nivel lgico alto la seal de
reloj. Por lo tanto es necesaria una seal de reloj para arbitrar la
transferencia de todos los bits. Para la mayora de los
microcontroladores incluyendo el PIC 18 la seal de reloj SCL es
generada por un contador que cuenta en forma descendente un valor
previamente programado.
La sincronizacin de la seal de reloj es realizada utilizando la conexin
AND cableada del interface I
2
C a la lnea de reloj SCL. Esto significa
que una transicin de nivel alto a bajo en la lnea SCL causar que los
dispositivos que deseen iniciar la comunicacin empezaran a contar su
periodo en bajo y una vez que un dispositivo ha generado una seal de
reloj en bajo mantendr la seal de reloj en ese estado hasta que se
alcance un estado alto.







La transicin de bajo a alto de este reloj no cambiar el estado de la lnea
SCL si otra seal de reloj (CLK2) se encuentra en nivel lgico bajo. La
lnea SCL se mantendr en nivel lgico bajo por causa del dispositivo con
mayor periodo en nivel bajo. Los dispositivos con periodo de reloj ms
corto se mantendrn en estado de espera durante este tiempo.
Cuando todos los dispositivos han realizado el conteo de su periodo en
nivel lgico bajo, la seal de reloj ser liberada y se cambiar a nivel alto.
La sincronizacin de reloj ocurre cuando varios maestros tratan de
manejar el bus I
2
C y por lo tanto el arbitraje del bus debe seleccionar cual
es el maestro ganador.
2.4 Arbitraje: El protocolo I
2
C permite la existencia de mltiples maestros
en el mismo bus. En caso de que ms de un maestro desee comenzar
la transferencia de datos al mismo tiempo un esquema de arbitraje es
empleado para forzar a un maestro a abandonar el bus. El dispositivo
maestro continua transmitiendo hasta que uno intenta un nivel lgico
alto mientras el otro transmite un nivel bajo. Como el driver del bus es
de tipo drenador abierto el bus ser llevado a nivel bajo. El maestro
intentando transferir una seal en nivel alto detectar un nivel bajo en la
lnea SDA y abandonar el bus cerrando su puerto de salida de datos.
El maestro ganador continuar su transmisin mientras el perdedor se
convertir en esclavo. Este esquema de arbitraje es no destructivo, un
dispositivo gana y los datos no se pierden.








2.5 Formato de la transferencia de datos: El protocolo I
2
C permite a un
dispositivo utilizar direcciones de 7 o 10 bits para especificar a un
dispositivo esclavo para la transferencia de datos. Los siguientes son los
posibles formatos para la transferencia de datos en el protocolo I
2
C.
Maestro transmisor esclavo receptor: La direccin de
transferencia no cambia.






Maestro lee al esclavo inmediatamente despus del primer
byte: En el momento del primer reconocimiento de comunicacin
valida (ACKNOWLEDGE) el maestro emisor se convierte en
maestro receptor y el esclavo receptor se convierte en esclavo
transmisor. El primer ACK es generado por el esclavo. La
condicin de STOP es generada por el maestro el cual enva
previamente un ACK negativo (A).



Formato combinado: Durante un cambio de direccin dentro
una transferencia la condicin de inicio (START) y la direccin del
esclavo son repetidas pero con el bit R/W invertido. Si un maestro
receptor enva una condicin de inicio repetida previamente enva
un ACK negativo.





2.6 Direccionamiento de 7 bits: El procedimiento de direccionamiento
para el protocolo I
2
C es tal que el primer byte despus de la condicin
de inicio determina cual esclavo ser seleccionado por el maestro. La
excepcin es el direccionamiento general el cual direcciona todos los
dispositivos. El primer byte despus del bit de inicio transporta la
direccin de 7 bits y la direccin del mensaje. Cuando el bit menos
significativo es 1 el dispositivo maestro lee informacin del esclavo
seleccionado. En caso de 0 el maestro escribe informacin en el
esclavo seleccionado.



Cuando una direccin es enviada cada dispositivo en el sistema
compara los primeros 7 bits despus de la condicin de START con su
direccin. Si ambas son iguales, el dispositivo se considera direccionado
por el maestro y es por lo tanto un esclavo receptor o esclavo
transmisor, dependiendo del bit R/W.
El comit tcnico encargado de normar el uso del protocolo I
2
C
determina la ubicacin de las direcciones tal como se detalla en la
siguiente tabla:
DIRECCIN
ESCLAVO
Bit
R/W
DESCRIPCIN
0000000 0 Direccin de llamada general
0000000 1 Byte de inicio
0000001 X Direccin CBUS
0000010 X Reservado para diferentes formatos de
bus
0000011 X Reservado para propsitos futuros
00001XX X Cdigo de modo maestro
11111XX X Reservado para propsitos futuros
11110XX X Direccionamiento en modo esclavo de
10 bits

2.7 Uso del mdulo MSSP con el protocolo I
2
C: El microcontrolador
PIC18 cuenta con el mdulo MSSP que implementa el protocolo I
2
C en
los modos maestro y esclavo. Permite el funcionamiento en el modo de
interrupcin de los bits de inicio (START) y parada (STOP) mediante
hardware para determinar si el bus esta libre (modo multi maestro). Este
mdulo MSSP permite el direccionamiento en los modos de 7 y 10 bits.
Se utilizan los pines RC3/SCK/SCL para la seal de reloj serial SCL y
RC4/SDI/SDA para la transmisin de datos serial SDA.
2.8 Librera de MikroC para el bus I
2
C: La biblioteca Software_I2C de
mikroC PRO contiene las funciones necesarias para establecer la
comunicacin con dispositivos I
2
C. Estas funciones pueden emplearse
con cualquier microcontrolador PIC (aunque no disponga de mdulos
I
2
C). Las funciones incorporadas permiten que el usuario emplee un
microcontrolador PIC como maestro (el modo multi-maestro no est
disponible). La tabla muestra las funciones que pueden ser utilizadas
para la comunicacin I
2
C:


FUNCIN DESCRIPCIN
Soft_I2C_Init() Configura el mdulo I
2
C por software
Soft_I2C_Start() Determina si el bus I
2
C est libre y
enva una seal de START
Soft_I2C_Read(ack) Lee un byte del esclavo y responde con
una seal NOACK (ack == 0) o ACK
(ack == 1)
Soft_I2C_Write(dato) Enva un byte dato por el bus I
2
C
Soft_I2C_Stop() Enva una seal de STOP
Soft_I2C_Break() Todas las funciones de la biblioteca
Software_I2C pueden bloquear el flujo
de programa. Si se ejecuta esta funcin
desde la funcin de interrupcin se
producir el desbloqueo del programa.

Cuando se utiliza la biblioteca Software_I2C se debe deshabilitar las
interrupciones. Los pines utilizados en la comunicacin deben estar
conectados a resistores de pull up.
3. Trabajo de laboratorio:
3.1 Implementar la comunicacin del microcontrolador PIC18F4550 con una
memoria serial 24C02 o alguna similar bajo el protocolo I
2
C, donde se permita
leer o escribir en la misma.
Es preciso que la informacin a ser grabada deba ser introducida por el
microcontrolador por los pines RC3 y RC4 del puerto C. La informacin que se
lea de la memoria debe ser mostrada mediante leds en el puerto B del
microcontrolador. Realizar la verificacin del programa con el software MikroC
y la simulacin mediante Proteus.
Se debe considerar que la memoria serial tiene una trama de bits que se deben
cumplir para leerla o escribirla. Se adjunta la hoja de datos completa para la
memoria 24C02 de Microchip, as como un programa de ejemplo.





















3.2 Implementar la comunicacin del microcontrolador PIC18F4550 con una
memoria serial 24C02 o alguna similar bajo el protocolo I
2
C, donde se permita
leer o escribir en la misma. El circuito debe:
Utilizar 8 switches para introducir datos por el puerto D.
Salida de 8 bits por el puerto A.
Un pulsador conectado al pin C.0 del puerto C.
Toda la circuitera para comunicacin I2C por los pines de SDA, SCL del
puerto B del PIC, con la memoria establecida y las resistencias de pull-up
para el mismo.
Elaborar un programa en MikroC, el cual nos permita introducir 5 datos de 1 byte
cada una, a la memoria EEPROM externa, implementada en el circuito, esto por
el puerto D cada vez que se realice una pulsacin en el pin 0 del puerto C.
Una vez concluida las 5 pulsaciones la sexta pulsacin debe mostrar en el puerto
A de manera secuencial con un retardo que permita visualizar por medio de la
vista, los mismos datos introducidos en la memoria EEPROM.
Los procesos de grabacin y lectura se deben efectuar con el protocolo de
comunicacin serial sncrono I2C.
Tanto el programa como el circuito son detallados a continuacin:
unsigned short valor=0; //Variable para guardar dato temporalmente
unsigned short mem=0; //Variable para la direccin de memoria
void main() {
ADCON1=0x0F; //Puertos de E/I digitales
CMCON =0x07; //Comparadores Digitales
INTCON=0x00; //Deshabilitar Interrupciones
LATC =0; //Puerto C en estado bajo
TRISB =0x00; //Configuracin del puerto B como salida
TRISD =0xFF; //Configuracin del puerto D como entrada
TRISC.B0=1; //Pin C.0 entrada para Guardar y Leer datos en EEPROM
I2C1_Init(100000); //Iniciamos el modulo de comunicacin I2C
//***************** Seccin para grabar los datos una vez **********
//***************** Pulsado el botn **********
Grabar:
if (PORTC.B0 == 0)
{
delay_ms(300); //Espera para eliminar rebotes
valor=PORTD; //Cargamos el valor del puerto D
I2C1_Start(); //I2C start
I2C1_Wr(0xA0); //I2C (Clave + Numero de EEPROM + W=0"Escritura")
I2C1_Wr(mem); //I2C direccin de memoria EEPROM
I2C1_Wr(valor); //I2C Enviamos el valor a direccin
I2C1_Stop(); //I2C stop
delay_ms(100); //Retardo
mem++; //Incrementamos mem para la prxima direccin
if (mem == 5) //Testeamos los 5 datos
{
mem=0; //Borramos variable
goto Mostrar; //Salta a etiqueta si es cierto
}
}
goto Grabar;
//***************** Seccin para mostrar los datos una vez **********
//***************** Pulsado el mismo botn **********
Testeo:
if (PORTC.B0 == 0 )
{
delay_ms(300);
goto Mostrar;
}
goto Testeo;
Mostrar:
I2C1_Start(); //I2C start
I2C1_Wr(0xA0); //I2C (Clave + Numero de EEPROM + W=0"Escritura")
I2C1_Wr(mem); //I2C Direccin de memoria EEPROM
I2C1_Repeated_Start(); //I2C Repetimos start
I2C1_Wr(0xA1); //I2C (Clave + Numero de EEPROM + W=1"Lectura"))
LATA = I2C1_Rd(0); //I2C Leemos el valor
I2C1_Stop(); //I2C stop
delay_ms(2000); //Retardo de muestreo de dato en el puerto
mem++; //Incremento Direccin de memoria
if (mem == 5)
{
PORTA=0; //Borramos el puerto
mem=0; //Borramos variable
goto Grabar; //Salta a etiqueta para nuevos datos
}
goto Mostrar;
}

También podría gustarte