Buenass!!!!hacia tiempo que no posteaba ningun ejemplito asi que ya es hora!jeje bien, como bien sabemos, el 16F648A no tiene conversor A/D asi que para trabajar con medidas y tal necesitamos un chip conversor, en este caso vamos a usar uno que tiene bastante aceptacion y hay informacion en algun que otro libro, es el fabricado por Philips el
PCF8591, sirve tanto como A/D y D/A, he realizado una "mini libreria" para su manejo, aqui esta:
///////////////////////////////////////////////////////////////////////////////////////////////////
/// VsZeNeR"06 ///
/// 13/Marzo/06 ///
///
vszener@gmail.com ///
/// ///
/// Libreria: vs_pcf8591.c Compilador: CCS ///
/// Version: 0.0 ///
/// ///
/// Notas: Controlador para manejo del dispositivo pcf8591 ///
/// de Philips. ///
/// Este dispositivo se encarga, mediante I2C, del tratamiento de ///
/// conversor A/D como D/A. ///
/// Modo: ///
/// ¨¨¨¨¨¨ ·D/A: 8 bits ///
/// ·A/D: 8 bits con 4 entradas analogicas ///
/// ///
/// Funciones: ///
/// MODO D/A ///
/// -------- ///
/// pcf8591_dac_init( ); -> Inicializa el dispositivo ///
/// write_dac_value(int data); -> Escribe el volatje a mostrar ///
/// por AOUT(8 bits) ///
/// stop_dac( ); -> Para el dispositivo. Una vez ///
/// realizada esta opcion, para ///
/// a utilizar AOUT debemos ///
/// inicializarlo de nuevo! ///
/// MODO A/D ///
/// -------- ///
/// pcf8591_adc_init(control); -> Inicializa el dispositivo. ///
/// Debemos enviar el byte de ///
/// control: ///
/// Byte de control: 0 X XX 0 X XX ///
/// 0 A EA 0 I NC ///
/// ///
/// A: Permiso Salida analogica 0 -> AOUT alta impedancia ///
/// 1 -> AOUT habilitada ///
/// EA: Programacion entradas analogicas: 00 -> 4 entradas simples ///
/// 01 -> 3 entradas dif. ///
/// 10 -> Simples y dif ///
/// 11 -> 2 entradas dif. ///
/// I: Incremento 0 -> No hay autoincremento ///
/// 1 -> Autoincremento de la entrada del A/D ///
/// NC: Numero del canal de la entrada 00 -> Canal 0 ///
/// 01 -> Canal 1 ///
/// 10 -> Canal 2 ///
/// 11 -> Canal 3 ///
/// read_adc_value(int data); -> Lee el volatje a mostrar ///
/// ///
/// La direccion del dispositivo se configura con los pines A2A1A0, donde en este ///
/// caso se ha elegido GND(000). Se he habilitado siempre la salida AOUT en D/A ///
/// y deshabilitado siempre en A/D. ///
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef PCF8591_SCL //para definir los pines de manejo del pcf8591...
#define PCF8591_SCL PIN_B0
#define PCF8591_SDA PIN_B1
#endif //...en caso de no ser definidos en el programa principal
#use i2c(master,sda=PCF8591_SDA, scl=PCF8591_SCL) //i2c
/////////////MODO: D/A ///////////////////////////////////////////////////////////////////////////
void stop_dac(void){ //funcion para parar el dac
i2c_stop( );
}
void write_dac_value(int data){ //funcion que escribe en AOUT
i2c_write(data);
}
void pcf8591_dac_init(){ //funcion para inicializar pcf8591
output_high(PCF8591_SDA);
output_high(PCF8591_SCL);
i2c_start( );
i2c_write(0b10010000); //direccion en modo escritura
i2c_write(0b01000000); //palabra de control habilitando AOUT
}
/////////////MODO: A/D ////////////////////////////////////////////////////////////////////////////
int read_adc_value(void){ //funcion para la lectura del pcf8591
byte data;
data=i2c_read(1); //lee y se almacena en la variable data
return data; //devuelve la informacion leida
}
void pcf8591_adc_init(int control){ //funcion para inicializar pcf8591
output_high(PCF8591_SDA);
output_high(PCF8591_SCL);
control=(0b00110111 & control); //palabra de control correcta -> deshabilita AOUT
i2c_start( );
i2c_write(0b10010000); //direccion en modo escritura
i2c_write(control); //palabra de control
i2c_stop( );
i2c_start( ); //iniciamos comandos...
i2c_write(0b10010001); //...de lectura
}
Bien, pues con esta "mini libreria" trabajaremos en un par de ejemplitos!
Hasta otra!!!
