Control de potenciómetro digital

Hola! Quiero usar la familia de potenciómetros digitales X9C104 y X9C503 https://www.intersil.com/content/dam/Intersil/documents/x9c1/x9c102-103-104-503.pdf y estoy teniendo problemas con el control en lenguaje C.

He leído el datasheet, teniendo el cuenta todos los aspectos pero sólo soy capaz de hacer "subir" el wiper, no puedo bajarlo y no se qué hacer. Os muestro el código por si se me está escapando algo (los delay los he puesto tan altos por hacer pruebas, lo tengo a 5 ms normalmente)

Código:
#define Dpot_increment  PIN_A4    // POT1
#define Dpot_direction  PIN_A2    // POT2
#define Dpot_select     PIN_A0    // POT3



int target_value;         // sus valores son definidos en el .c principal
int current_value;       // sus valores son definidos en el .c principal

int Dpot(){

output_high(Dpot_increment);

   if (target_value > current_value) { 
   delay_ms(50);
     output_low(Dpot_select) ;    // changes available
    delay_ms(50);
     output_high(Dpot_direction) ; //subir
     
      for (int i = target_value - current_value; i>0;  i--){
         delay_ms(50);
        output_high(Dpot_increment);
         delay_ms(50);
        output_low(Dpot_increment);  
         output_high(pin_b3);   // enciende led verde
         
      }
      }
      
     if (target_value < current_value) {
      delay_ms(50);
      output_low(Dpot_select);    // changes available
        delay_ms(50);
      output_low(Dpot_direction); //BAJAR
      
         for (int j = (current_value - target_value); j>0;  j--){
         delay_ms(50);
         output_high(Dpot_increment);
         delay_ms(50);
         output_low(Dpot_increment);
           output_high(pin_b0);  //enciende led rojo 
                 
      }
      }
      
   delay_ms(100); 
  output_high(Dpot_increment);   
   delay_ms(100); 
  output_high(Dpot_select);              //configuración para guardar en memoria no volátil
   delay_ms(100);
   
   
   output_low(pin_b3);
    output_low(pin_b0);
   return 0;
}

Gracias de antemano, si conocéis un código que funcione os lo agradecería, porque no entiendo el problema :(
 
Aqui te muestro un test que realize hace mucho, dale una leida y me cuentas que tal funciono.

Código:
/*botones de control*/
#define arriba      pin_c1
#define abajo       pin_c2
/********************/


/*atenuador*/
#define  up_down     pin_d0   //1--> arriba   0--> abajo    
#define  select      pin_d1   //0--> se activa cambio  1--> se desactiva cambio
#define  increment   pin_d2   //1--> para activar el incremento y decremento
/**********/


/*funciones a usar*/
void reincia_pot(void);
/**************/


void main()
{

delay_ms(1000);
output_high(select); 
reincia_pot();


   while(true)
   {


 if(input(arriba)==1)	//incremeta
      {
      output_high(up_down);
      delay_ms(10);
      output_low(select); //se activa el cambio de R
      delay_ms(10);
      output_high(increment);
      delay_ms(100);
      output_low(increment);
      output_high(select); //se desactiva el cambio de R      
      }
      
   else if(input(abajo)==1)	//decrementa
      {     
      output_low(up_down);
      delay_ms(10);
      output_low(select); //se activa el cambio de R
      delay_ms(10);
      output_high(increment);
      delay_ms(100);
      output_low(increment);      
      output_high(select); //se desactiva el cambio de R            
      }
      


   }
}//fin de main 


 
   
   
void reincia_pot(void)	//decrementa al maximo
{
int a;

   for(a=0;a<100;a++)
   {
   output_low(up_down);
   delay_us(10);
   output_low(select); //se activa el cambio de R
   delay_us(10);
   output_high(increment);
   delay_us(10);
   output_low(increment);      
   output_high(select); //se desactiva el cambio de R
   }

}

Codigo probado, funciona al 100.
 
Última edición:
En tu código no tienes rutina principal <main> ni un bucle infinito <while>, así que tu código carece de programación en lenguaje C para el control constante de una variable. El código de solhaz tiene mas sentido porque sigue el protocolo de programación en lenguaje C.
 
Aqui te muestro un test que realize hace mucho, dale una leida y me cuentas que tal funciono.

Código:
/*botones de control*/
#define arriba      pin_c1
#define abajo       pin_c2
/********************/


/*atenuador*/
#define  up_down     pin_d0   //1--> arriba   0--> abajo    
#define  select      pin_d1   //0--> se activa cambio  1--> se desactiva cambio
#define  increment   pin_d2   //1--> para activar el incremento y decremento
/**********/


/*funciones a usar*/
void reincia_pot(void);
/**************/


void main()
{

delay_ms(1000);
output_high(select); 
reincia_pot();


   while(true)
   {


 if(input(arriba)==1)	//incremeta
      {
      output_high(up_down);
      delay_ms(10);
      output_low(select); //se activa el cambio de R
      delay_ms(10);
      output_high(increment);
      delay_ms(100);
      output_low(increment);
      output_high(select); //se desactiva el cambio de R      
      }
      
   else if(input(abajo)==1)	//decrementa
      {     
      output_low(up_down);
      delay_ms(10);
      output_low(select); //se activa el cambio de R
      delay_ms(10);
      output_high(increment);
      delay_ms(100);
      output_low(increment);      
      output_high(select); //se desactiva el cambio de R            
      }
      


   }
}//fin de main 


 
   
   
void reincia_pot(void)	//decrementa al maximo
{
int a;

   for(a=0;a<100;a++)
   {
   output_low(up_down);
   delay_us(10);
   output_low(select); //se activa el cambio de R
   delay_us(10);
   output_high(increment);
   delay_us(10);
   output_low(increment);      
   output_high(select); //se desactiva el cambio de R
   }

}

Codigo probado, funciona al 100.


Voy a trastear con él y ahora te digo. Muchas gracias!



En tu código no tienes rutina principal <main> ni un bucle infinito <while>, así que tu código carece de programación en lenguaje C para el control constante de una variable. El código de solhaz tiene mas sentido porque sigue el protocolo de programación en lenguaje C.

Hola! Gracias por la respuesta pero el código que he posteado es un ".c"a parte del codigo principal. Quiero decir que por medio de un #include y llamando a la función Dpot( ); lo quiero ejecutar. Todo esto para no saturar mucho el principal.

Aún así voy a probar el de solhaz que pinta bien.

Saludos!
 
Última edición:
Atrás
Arriba