TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: matias29 en 22 de Octubre de 2014, 23:34:39

Título: Asignar rangos a una variable (ayuda)
Publicado por: matias29 en 22 de Octubre de 2014, 23:34:39
hola tengo una pequeña duda, queria saber si se puede y como asignarle rangos a una variable. ejemplo que x trabaje con un rango de 0 a 1000.
el cual x sera el duty de un pwm. para que haci solo trabaje entre esos rangos.gracias
Título: Re: Asignar rangos a una variable (ayuda)
Publicado por: BINARIO en 23 de Octubre de 2014, 13:05:59
Podes ser mas especifico? con un ejemplo
Título: Re: Asignar rangos a una variable (ayuda)
Publicado por: migsantiago en 23 de Octubre de 2014, 13:10:18
Hola, sí se puede, sólo que en potencias de dos. Digamos que quieres una variable que mida de 0 a 1023:

Código: [Seleccionar]
typedef struct uint10_tag
{
   unsigned int var : 10;
}uint10_t;

El rango final es de 0 a (2^10 - 1) por ser sin signo.

Y la usas así:

Código: [Seleccionar]
uint10_t dato;

dato.var = 333;

Si le pusieras un valor mayor al que puede guardar entonces se trunca como cualquier otro downcasting que ya existe; por ejemplo si guardas 0xABCD en un uint8_t, te queda 0xCD.

Saludos.
Título: Re: Asignar rangos a una variable (ayuda)
Publicado por: KILLERJC en 23 de Octubre de 2014, 17:25:27
Podes ser mas especifico? con un ejemplo

Esta bastante claro el ejemplo que te dieron arriba. Su ejemplo se basa en que lee una entrada ( pin ) y actua de la manera que vos quieras.

Código: [Seleccionar]
      if (input(PIN_X)==0)  // Aca se fija si presionaste el boton para subir el el valor de X ( en este caso la variable se llama pwm )
      {
         if (pwm<=100) pwm++;  // Si es menor o igual a 100, este es tu limite superior (en realidad seria 100 + el incremento), incrementas en la cantidad que vos quieras, aca en 1 solo.
         delay_ms(25);                // Un delay para que no se ejecute muchas veces, aunque hay mejores formas
      }

// Esta parte es igual, detecta otro pin, y si esta presionado se asegura que no sea menor que uno y procede a restarlo dando como valor minimo pwm=0
      if (input(PIN_X)==0)
      {
         if (pwm>=1) pwm--;
         delay_ms(25);
      }

Si tu chequeo no requiere el leer puertos o pines es mas simple
Si queres los valores esten siempre en valor exacto se me ocurre


Código: [Seleccionar]
      if (input(PIN_X)==0) 
      {
         if (pwm<=(100-incremento)) pwm++;  // En este caso se incrementa 1, pero podes hacer que sea un incremento de a 10, y donde dice incremento pones 10
         delay_ms(25);
      }
        // De la misma forma el caso de tu limite inferior