Autor Tema: Asignar rangos a una variable (ayuda)  (Leído 1675 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado matias29

  • PIC10
  • *
  • Mensajes: 13
Asignar rangos a una variable (ayuda)
« 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
« Última modificación: 22 de Octubre de 2014, 23:42:03 por matias29 »

Desconectado BINARIO

  • PIC16
  • ***
  • Mensajes: 156
Re: Asignar rangos a una variable (ayuda)
« Respuesta #1 en: 23 de Octubre de 2014, 13:05:59 »
Podes ser mas especifico? con un ejemplo
000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100 101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00 00011111111 0011111 011110001111111111 1011111111101100000000

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Asignar rangos a una variable (ayuda)
« Respuesta #2 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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Asignar rangos a una variable (ayuda)
« Respuesta #3 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