Inicio este post luego de varios años de abandono :V para crear una colección de fragmentos de código útiles para CCS PIC C para controlar ICs potenciómetros digitales.
A estos códigos que estaré compartiendo, pueden hacerle correcciones y/o sugerencias para mejorarlos, ya que tomando en cuenta que la comunicación serial me da ansiedad, puede que necesiten mejoras, e incluso yo mismo estaré agregando actualizaciones al código para hacerlo más corto y eficiente. Sin más que agregar, acá los códigos:
Constantes en común en los fragmentos de código
Serie AD5206
Serie PGA231X
Serie LMC835
A estos códigos que estaré compartiendo, pueden hacerle correcciones y/o sugerencias para mejorarlos, ya que tomando en cuenta que la comunicación serial me da ansiedad, puede que necesiten mejoras, e incluso yo mismo estaré agregando actualizaciones al código para hacerlo más corto y eficiente. Sin más que agregar, acá los códigos:
Constantes en común en los fragmentos de código
C:
//Acá declaramos los pines que usaremos para controlar el potenciómetro
#define CS PIN_A0 //Lo usamos como Circuit (Chip) Select o Strobe, según sea el caso
#define CLK PIN_A1 //Lo usamos como señal de reloj (Clock)
#define SDO PIN_A2 //Lo usamos como señal de datos seriales
Serie AD5206
C:
void ad520x(int address, int data){
int j;
//Iniciamos la conexión con el AD520X
output_low(CS);
for(j=0; j<11; j++){
output_low(CLK);
if(j<3){
output_bit(SDO,bit_test(address,11-j)); //Enviamos los primeros 3 bits para seleccionar los potenciómetros del 1 al 4 ó 6
}
else{
output_bit(SDO,bit_test(address,11-j)); //Enviamos la pocisión del potenciómetro seleccionado
}
delay_us(2);
output_high(CLK);
delay_us(2);
}
j=0;
//Finalizamos la conexión con el AD520X
output_high(CS);
}
Serie PGA231X
C:
void pga231x(int left, int right){
int k;
//Iniciamos la conexión con el PGA231X
output_high(CS);
output_high(CLK);
delay_us(2);
output_low(CS);
for(k=0; k<16; k++){
//Para controlar el PGA231X se envían 2 números consecutivos de 8 bits,
//donde primero se envían los datos del canal derecho y luego el izquierdo...
output_low(CLK);
//Hacemos un conteo de los primeros 8 bits, al cumplirse la condición, se enviarán los datos al otro canal
if(k<8){
output_bit(SDO,bit_test(left,16-k));
}
else{
output_bit(SDO,bit_test(right,16-k));
}
delay_us(2);
output_high(CLK);
delay_us(2);
}
k=0;
output_high(CS);
output_high(CLK);
}
Serie LMC835
C:
void lmc835(int address, int data){
//Establecemos una tabla de datos con las direcciones de las bandas y las posiciones
int band[14]={0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71};
int level[26]={0x00, 0x04, 0x08, 0x10, 0x20, 0x40, 0x48, 0x54, 0x68, 0x80, 0x94, 0xB4, 0xF4, 0x02, 0x06, 0x0A, 0x12, 0x22, 0x42, 0x4A, 0x56, 0x6A, x82, 0x96, 0xB6, 0xF6};}
n=0;
//Establecemos conexión con el LMC835
output_high(CS);
delay_us(2);
//Enviamos parámetros sobre la banda seleccionada, acá seleccionamos la banda y la escala que en este caso será 12dB
for(n=0; n<8; k++){
output_high(CLK);
output_bit(SDO,bit_test(band[addres],n));
delay_us(2);
output_low(CLK);
delay_us(2);
}
n=0;
//Indicamos al IC que ahora recibirá los datos del nivel
output_high(CLK);
delay_us(2);
output_low(CS);
delay_us(2);
output_high(CS);
//Enviamos el nivel de la banda seleccionada de -12dB a +12dB, 25 posiciones en total
for(n=8; n<16; k++){
output_high(CLK);
output_bit(SDO,bit_test(level[data],n));
delay_us(2);
output_low(CLK);
delay_us(2);
}
//Finalizamos conexión
output_high(CLK);
output_high(CS);
}
Última edición: