Autor Tema: ## :: DEFINICION DE FUNCIONES PARA MANEJO DE I2C :: ##  (Leído 2164 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
## :: DEFINICION DE FUNCIONES PARA MANEJO DE I2C :: ##
« en: 14 de Junio de 2012, 09:32:55 »
HOLA a todos
Espero no estar solo en esto...

Debido a los problemas acontecidos con el i2c
en la comunicación entre 3 PIC: 1 master y 2 esclavos
y no resuelvo el problema aun después de leer montones de hilos
y líneas de código he optado por aplicar:

"si te pierdes por el camino lo mas sensato es deshacer lo hecho
y empezar de nuevo".





- Las funiones principales son 2: ESCRIBIR y LEER

FUNCION ESCRIBIR : Un master escribe sobre un esclavo

El esclavo debe de tener una direcion,
se recomienda en muchos sitios que sea una direcion par
cuando se escribe se le suma 0 es la propia dirección pero
cuando se lee se le suma 1



- La secuencia para escritura es esta:


1.    Enviar una secuencia de inicio.
2.    Enviar la dirección de dispositivo con el bit de lectura/escritura en bajo.
3.    Enviar el número de registro interno en el que se desea escribir.
4.    Enviar el byte de dato.
5.    Opcionalmente, enviar más bytes de dato.
6.    Enviar la secuencia de parada.



- Vesiones de funciones escritura:

Pero de la funcion escribir encontre dos versiones:
en una (Versión A) escriben en una direción que especifica entre la direcion del esclavo
y el dato a enviar, y la otra version (Version B) que al parece no escribe el dato en ningun
lado solo lo envia por el bus i2c, es decir no hay paso 3.


- Version A

Código: C++
  1. void escribir_i2c(int8 direccion, int8 registro, int8 dato)
  2. {
  3.    i2c_start();                 // inicio de la comunicacion
  4.    i2c_write(direccion);        // direcion del esclavo + bit de escritura
  5.    i2c_write(registro);         // direccion donde escribira el dato
  6.    i2c_write(dato);             // escritura del dato en el bus
  7.    i2c_stop();                  // fin de comunicacion
  8.    delay_us(150);               // retardo en micro segundos
  9. }


- Version B

Código: C++
  1. void escribir_i2c(int8 direccion, int8 dato)
  2. {
  3.    i2c_start();                 // inicio de la comunicacion
  4.    i2c_write(direccion);        // direcion del esclavo + bit de escritura
  5.    
  6.    i2c_write(dato);             // escritura del dato en el bus
  7.    i2c_stop();                  // fin de comunicacion
  8.    delay_us(150);               // retardo en micro segundos
  9. }

Al realizar la simulacion con proteus
mediante el uso del debug de i2c de isis nos devuelve esto:

56.281ms  56.484ms S A2 A 05 A P

  S: Start o inicio de comunicacion
A2: Direcion del esclavo+ bit escritura(0)
  A: ACK
05: Dato
  A: ACK
  N: No ACK
  P: bit de parada
Sr: Reset de inicio

para la llamada la haremos asi:


- Version A

Código: C++
  1. //Definicion del esclavo
  2. #define S1 0xA2 // direcciones pares
  3. #define R1 0x10 // donde escribe.
  4.  
  5. void escribir_i2c(S1, R1, 5);


- Version B

Código: C++
  1. //Definicion del esclavo
  2. #define S1 0xA2 // direcciones pares
  3.  
  4. void escribir_i2c(S1, 5);


## porfavor comente si encuentran algun error ##

.....

« Última modificación: 07 de Septiembre de 2012, 15:43:09 por pajaro »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: ## :: DEFINICION DE FUNCIONES PARA MANEJO DE I2C :: ##
« Respuesta #1 en: 14 de Junio de 2012, 09:33:56 »

FUNCION LEER: Un master lee sobre un esclavo


La secuencia es esta:


1.    Enviar una secuencia de inicio
2.    Enviar la dirección de dispositivo con el bit de lectura/escritura en bajo.
3.    Enviar la dirección interna del registro que se va a leer.
4.    Enviar una secuencia de inicio (inicio reiterado)
5.    Enviar la dirección de dispositivo con el bit de lectura/escritura en alto.
6.    Leer un byte de dato.
7.    Enviar la secuencia de parada.



Código: C++
  1. int8 leer_i2c(int8 direccion)
  2. {
  3.    int8 dato = 0;
  4.    i2c_start();                      // inicia comunicacion
  5.    i2c_write(direccion);             // direccion del sclavo
  6.        
  7.    i2c_start();                      // reinicio o inicio de start
  8.    i2c_write(direccion+1);           // direccion del esclavo + bit de lectura (1)
  9.    dato = i2c_read(0);               // leo dato
  10.  
  11.    i2c_stop();                       // para comunicacion
  12.    
  13.    return(dato);                     // retorna el dato leido
  14. }
.....

« Última modificación: 14 de Junio de 2012, 17:31:37 por pajaro »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: ## :: DEFINICION DE FUNCIONES PARA MANEJO DE I2C :: ##
« Respuesta #2 en: 14 de Junio de 2012, 09:34:34 »
Funcion TEXT SClavo

como leer un esclavo
la interrupcion de lectura


« Última modificación: 22 de Junio de 2012, 16:25:29 por pajaro »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: ## :: DEFINICION DE FUNCIONES PARA MANEJO DE I2C :: ##
« Respuesta #3 en: 14 de Junio de 2012, 09:35:50 »
otras modalidades de LECTURA y ESCRITURA

multimaestro
red de esclavos
broadcast en esclavos

..
« Última modificación: 14 de Junio de 2012, 09:54:17 por pajaro »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: ## :: DEFINICION DE FUNCIONES PARA MANEJO DE I2C :: ##
« Respuesta #4 en: 14 de Junio de 2012, 09:39:29 »
Proteus
Aclaraciones
enlaces

http://atc.ugr.es/~afdiaz/fich/bus_i2c.pdf

http://www.best-microcontroller-projects.com/i2c-tutorial.html

http://www.robot-electronics.co.uk/acatalog/I2C_Tutorial.html

http://www.todopic.com.ar/foros/index.php?topic=34581.0

http://www.todopic.com.ar/foros/index.php?topic=31010.msg258685#msg258685

http://robots-argentina.com.ar/Comunicacion_busI2C.htm

::==> http://www.todopic.com.ar/foros/index.php?topic=30161.0 error critico

funcionando en...


.... en proceso

esto sera a modo un manual de todo que replegado
de todos lados, y de gente que me presto o esta prestado ayuda,
por un lado soluciono mis dudas y problemas y por otro enriquecemos el foro.

un salaludo.
« Última modificación: 20 de Agosto de 2012, 16:23:49 por pajaro »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: ## :: DEFINICION DE FUNCIONES PARA MANEJO DE I2C :: ##
« Respuesta #5 en: 07 de Septiembre de 2012, 15:49:58 »

:: Ordenar indice::
 
  - Teoría del I2C [enlace...]
  - Definición de librieria
  - Definición de dispositivos
  - Libreria de dispositivos