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 LEERFUNCION 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 Avoid escribir_i2c(int8 direccion, int8 registro, int8 dato)
{
i2c_start(); // inicio de la comunicacion
i2c_write(direccion); // direcion del esclavo + bit de escritura
i2c_write(registro); // direccion donde escribira el dato
i2c_write(dato); // escritura del dato en el bus
i2c_stop(); // fin de comunicacion
delay_us(150); // retardo en micro segundos
}
- Version Bvoid escribir_i2c(int8 direccion, int8 dato)
{
i2c_start(); // inicio de la comunicacion
i2c_write(direccion); // direcion del esclavo + bit de escritura
i2c_write(dato); // escritura del dato en el bus
i2c_stop(); // fin de comunicacion
delay_us(150); // retardo en micro segundos
}
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//Definicion del esclavo
#define S1 0xA2 // direcciones pares
#define R1 0x10 // donde escribe.
void escribir_i2c(S1, R1, 5);
- Version B//Definicion del esclavo
#define S1 0xA2 // direcciones pares
void escribir_i2c(S1, 5);
## porfavor comente si encuentran algun error ##.....