// Las funciones están pensadas para funcionar como DIRECCION ó Nodo 6 (110)
// Seleccionamos el módulo PCF8591P del bus I2C y damos un valor a la salida analógica
void writePCF8591P(int dato)
{
i2c_start(); // Inicio comunicación I2C
i2c_write(0b10011100); // Envío Dirección I2C del PCF8591 (Nodo6)
i2c_write(0b01000000); // Envío Configuración del PCF8591 para Conv. DA
i2c_write(dato); // Envío el dato de salida analógica
i2c_stop(); // Detengo comunicacion I2C
}
// Lectura analogica 4 canales del módulo PCF8591P.
int readPCF8591P(int canal)
{
int lectura,control,addressWrite,addressRead;
if(canal<=3)
{
addressWrite=0b10011100;
addressRead=0b10011101;
switch(canal)
{
case 0: control=0b01000001; // Para leer el canal 0 hay que indicar que leemos queremos leer el 1
break;
case 1: control=0b01000010; // Para leer el canal 0 hay que indicar que leemos queremos leer el 2
break;
case 2: control=0b01000011; // Para leer el canal 0 hay que indicar que leemos queremos leer el 3
break;
case 3: control=0b01000000; // Para leer el canal 0 hay que indicar que leemos queremos leer el 0
break;
}
i2c_start();
i2c_write(addressWrite); // Byte de dirección. Modo Escritura, nodo 6.
i2c_write(control); // Byte de control.
i2c_write(0); // Dato salida analógica.
i2c_stop();
i2c_start();
i2c_write(addressRead); // Modo Lectura Nodo 6
lectura=i2c_read(0); // Lectura de datos.
i2c_stop(); // Detengo comunicacion I2C
}
else
lectura=0;
return lectura;
}
// Funcion que ejecuta la Lectura y Escritura sobre el módulo PCF8591P
int rwPCF8591P(int canal, int write)
{
int lectura,control,addressWrite,addressRead;
if(canal<=3)
{
addressWrite=0b10011100;
addressRead=0b10011101;
switch(canal)
{
case 0: control=0b01000001; // Para leer el canal 0 hay que indicar que leemos queremos leer el 1
break;
case 1: control=0b01000010; // Para leer el canal 0 hay que indicar que leemos queremos leer el 2
break;
case 2: control=0b01000011; // Para leer el canal 0 hay que indicar que leemos queremos leer el 3
break;
case 3: control=0b01000000; // Para leer el canal 0 hay que indicar que leemos queremos leer el 0
break;
}
i2c_start();
i2c_write(addressWrite); // Byte de dirección. Modo Escritura, nodo 6.
i2c_write(control); // Byte de control.
i2c_write(write); // Envío el dato de salida analógica
i2c_stop();
i2c_start();
i2c_write(addressRead); // Modo Lectura Nodo 6
lectura=i2c_read(0); // Lectura de datos.
i2c_stop(); // Detengo comunicacion I2C
}
else
lectura=0;
return lectura;
}