TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: T0ni0 en 19 de Noviembre de 2004, 11:21:00

Título: divisiones CCS
Publicado por: T0ni0 en 19 de Noviembre de 2004, 11:21:00
Hola a todos, tengo dos numeros el rango de los cuales es de 0 a 1000. Estoy utilizando CCS y no consigo realizar una division entre ellos. He probado int, unsigned int float etc... y nada al dividir me da 0

   n=t1/t2;


int=int/int;

long int=long int/long int;

como podria realizar tal operación con garantias?RollEyes
Título: RE: divisiones CCS
Publicado por: rferrero en 19 de Noviembre de 2004, 11:33:00
   
     Quieres dividir 2 enteros?? A que te refieres con eso de las garantias??

     Un saludo.

Título: RE: divisiones CCS
Publicado por: Modulay en 19 de Noviembre de 2004, 11:46:00
Con eso que has puesto no entiendo lo que quieres hacer
"n" la has declarado como float?
Título: RE: divisiones CCS
Publicado por: T0ni0 en 19 de Noviembre de 2004, 11:54:00
Lo que quiero hacer es lo siguiente:

(T1/T2)-0.5

Garantias?  pues que me de el valor correcto T1/T2 es un duty cicle por lo que sera un tanto por ciento
por lo tanto lo que estoy haciendo es esto:

(100T1-50T2)/t2 y listo ya tengo %

ahora a probarlo si se les ocurre alguna cosa ...
Título: RE: divisiones CCS
Publicado por: pocher en 19 de Noviembre de 2004, 12:26:00
Debe ser alguna tontería de declaración de variables ... quizá viendo el programa.

Un saludo
Título: RE: divisiones CCS
Publicado por: rferrero en 19 de Noviembre de 2004, 12:34:00
   
   Y por que no pones T1 y T2 como float y ya esta?? Si trabajas como enteras y las divides, no vas a tener decimales y 980/300 sera 3, no 3 y pico.

   
Título: RE: divisiones CCS
Publicado por: T0ni0 en 19 de Noviembre de 2004, 13:04:00
Pues la teoria es muy facil y bonita pero en la practica... ni float ni na ya creo q he probado todas las posibilidades

Codigo:
      #include <12F675.h>
   #use delay(clock=4000000,RESTART_WDT)
   #fuses NOWDT,INTRC_IO, CPD, PROTECT, MCLR, NOPUT, NOBROWNOUT
   #use rs232(baud=9600,parity=N,xmit=PIN_A2,bits=8)

void main()
{

   long int t1,t2;
   float n;
    setup_counters(RTCC_INTERNAL,RTCC_DIV_32);
    disable_interrupts(GLOBAL);

   while (TRUE) {

//captura X*************************************************+
   if (input(PIN_A5))
   {
   while (input(PIN_A5)){}   // espero que baixi nivell
   }

   while (!input(PIN_A5)){}   // espero que pugi nivell

   set_rtcc(0x00);         //activo timer
   while (input(PIN_A5)){}
   t1=get_rtcc();
   t1=t1*32;
   set_rtcc(0x00);         //activo timer
   while (!input(PIN_A5)){}
   t2=get_rtcc();
   t2=t2*32;
   t2=t2+t1;

   n=t1/t2;
   n=n-0.5;

 //   printf("Valor:%f",n);
   delay_ms(1000);
//********************************************************* */
    }
}




Título: RE: divisiones CCS
Publicado por: pocher en 19 de Noviembre de 2004, 13:39:00
Si t2 es siempre mayor que t1 el resultado de la división va a ser siempre 0.
Título: RE: divisiones CCS
Publicado por: Modulay en 19 de Noviembre de 2004, 14:07:00
Bien visto,Pocher,pero fíjate que al ser n de tipo flotante la división será siempre menor que 1 pero no tiene pq ser 0.
Eso sí,Tonio,si después le restas 0.5 puedes casi asegurarte el 0.
Título: RE: divisiones CCS
Publicado por: rferrero en 19 de Noviembre de 2004, 14:53:00

   Claro, es que es eso. Para qué usar int teniendo float?? Ten en cuenta que es lo que bien comenta pocher, t2>t1 -> 0. No va a ser 0,xxxx ...
 
    Si finalmente lo quedas así, deberías poner una rutina para que compruebe que t2 es mayor que t1 y avisar o actuar en consecuencia ... siempre que quieras o lo necesites así, claro.
 
   
Título: RE: divisiones CCS
Publicado por: Nocturno en 19 de Noviembre de 2004, 17:04:00
Os parecerá una tontería, pero para depurarlo yo lo que haría sería sacar todos los pasos por el printf, así:

   
Codigo:
printf("%u %u %f %f %f",t1,t2,t1/t2,t1/t2-0.5,n);


con lo que salga, ante la duda cogemos la calculadora y no queda más remedio que detectar el problema, aunque muy probablemente sea lo que están comentando los colegas, t1<t2 y encima restas medio punto...
Título: RE: divisiones CCS
Publicado por: rferrero en 19 de Noviembre de 2004, 17:08:00

   Pero esi es que es éso.  Si son número parecidos, la división da como resultado 1, ya que estás dividiendo enteros. Y luego le quitas la mitad .... No hay más vueltas que darle.  O escalas la variable que está en el numerador (para que no dé próximo a 1), o cambias a decimales (float). Otra cosa no se puede hacer (creo yo).   RollEyes

Título: RE: divisiones CCS
Publicado por: Nocturno en 19 de Noviembre de 2004, 17:11:00
Uff, vaya como te ha salido el texto, rferrero Giño

Parece que tuvieras el mismo problema que Pocher con el Proteus y el I2C...Sonrisa Gigante
Título: RE: divisiones CCS
Publicado por: rferrero en 19 de Noviembre de 2004, 17:20:00

   Ostras! Es verdad. Perdonen ustedes. He instalado el mozilla firefox y he quitado el explorer.  http://seguridad.internautas.org/index.php?op=1&id=390
 
    Parece ser que no se lleva muy bien con las tildes ... jejeje ...  Muchas risas

    El caso es que no hay cera que la que arde en referencia al tema anterior. O se pasa a decimales (float), o escala el numerador.

    Un saludo.
 
Título: RE: divisiones CCS
Publicado por: pacalaconcurso en 20 de Noviembre de 2004, 15:56:00
cuidado con los %u y %f con la 3.211 tiene un fallo como un camiondesquiciado
ya me calente el coco un buen ratoNoche

saludos
Título: RE: divisiones CCS
Publicado por: T0ni0 en 22 de Noviembre de 2004, 02:23:00
No se no se.

Lo primero, es un 12F675 con 1024B de flash por lo que no puedo realizar muchas operaciones en Float y no puedo hacer printf Ardiendo
Por eso estoy mirando los resultados con un watch.

T2 siempre será mas grande q T1, por lo que T1/T2 será 0-1 puedo hacer esa division en float y luego multiplico por 100 y la paso a int ?

El problema es que hago la división en Float y el valor que obtengo no es el esperado por lo que estoy desconfiando de todo ahora mismoHelado
Título: RE: divisiones CCS
Publicado por: Nocturno en 22 de Noviembre de 2004, 02:37:00
Bueno, y aunque debería ser igual, ¿porqué no te olvidas de la propiedad conmutativa y realizas primero la multiplicación por 100 y luego la división?
Título: RE: divisiones CCS
Publicado por: pocher en 22 de Noviembre de 2004, 04:40:00
Mira a ver si te vale esto, por lo menos caber, cabe:

Codigo:
      #include <12F675.h>
   #use delay(clock=4000000,RESTART_WDT)
   //#fuses NOWDT,INTRC_IO, CPD, PROTECT, MCLR, NOPUT, NOBROWNOUT
   #use rs232(baud=9600,parity=N,xmit=PIN_A2,bits=8)

void main()
{
   //long n,t1=33,t2=56;
   long n,t1,t2;
   char cadena[20];
    setup_counters(RTCC_INTERNAL,RTCC_DIV_32);
    disable_interrupts(GLOBAL);

   while (TRUE)
    {

//captura X*************************************************+
      if (input(PIN_A5))
      {
         while (input(PIN_A5)){}   // espero que baixi nivell
      }

      while (!input(PIN_A5)){}   // espero que pugi nivell

      set_rtcc(0x00);         //activo timer
      while (input(PIN_A5)){}
      t1=get_rtcc();
      t1=t1*32;
      set_rtcc(0x00);         //activo timer
      while (!input(PIN_A5)){}
      t2=get_rtcc();
      t2=t2*32;
      t2=t2+t1;

      n=(10000*t1)/t2;
       printf("n=%lu ",n);
      sprintf(cadena,"%lu",n);

       printf("n=0.%s",&cadena[0]);
      delay_ms(1000);
//********************************************************* */
    }
}

Título: RE: divisiones CCS
Publicado por: Nocturno en 22 de Noviembre de 2004, 04:58:00
uff, no había visto nunca el sprintf, pero intuyo su potencia. ¡No me digas que formatea los datos como el printf y los vuelca sobre un string!.
Gracias maestro.
Título: RE: divisiones CCS
Publicado por: pocher en 27 de Noviembre de 2004, 12:11:00
Tonio ¿lograste salir del atolladero?
Título: RE: divisiones CCS
Publicado por: T0ni0 en 29 de Noviembre de 2004, 03:41:00
Aunque aún me falta una parte del proyecto, he podido realizar la división haciendo Float y después paso a long int para interpretarlo.

Codigo:

   t1=t1*32000;
   t2=t2*2;
   t1=t1/t2;
   n=t1;



ahora podré comparar valores con trankilidadPayaso