TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Thulsa Doom en 15 de Agosto de 2012, 18:28:24

Título: Duda en una instrucción
Publicado por: Thulsa Doom en 15 de Agosto de 2012, 18:28:24
Buenas noches a todos, pues estudiando un driver para hacer un proyecto he visto una instrucción que no se muy bien lo que hace, la instrucción es esta
Código: [Seleccionar]
data=data*9;
y pertenece a este programa
Código: [Seleccionar]
i2c_start();
   i2c_write(0x90 | (address<<1));
   i2c_write(0xaa);
   i2c_start();
   i2c_write(0x91 | (address<<1));
   datah=i2c_read();
   datal=i2c_read(0);
   i2c_stop();

   data=datah;
   data=data*9;

   if(bit_test(datal,7))
   {
      if(data < 0)
          data -= 4;
      else
         data += 4;
   }
   data = (data / 5) + 32;

sé que el programa lo que hace es leer un valor por el protocolo i2c, guarda el primer byte, el byte más alto en la variable datah.
seguidamente guarda el valor de datah en data y ya el siguiente paso me pierdo.
Otra instrucción que no comprendo muy bien es la de
Código: [Seleccionar]
data-=4;y
Código: [Seleccionar]
data+=4;creo que estas sentencias lo que hacen es decrementar data e igualar a 4 pero no estoy nada seguro

Saludos
Título: Re: Duda en una instrucción
Publicado por: MerLiNz en 15 de Agosto de 2012, 19:10:02
 :shock:
data=data POR nueve osea data=data multiplicado por 9 (*=multiplicacion)

lo otro de data-=4 es una abreviacion pero es lo equivalente a poner data=data-4 (data menos 4), con el + ocurre lo mismo.

Título: Re: Duda en una instrucción
Publicado por: KALLITOS en 15 de Agosto de 2012, 19:14:35
Hola thulsa te ayudo:

data = data*9;

lo que hace es multiplicar el valor de la variable data por 9 y lo guarda en la misma variable, ejemplo:
data = 3;
data = data * 9;     
aqui la variable data vale 27.

data -= 4;

Es lo mismo que lo anterior pero mas "profesional"

Al valor de data le resta 4 y lo guarda en data, ejemplo

data = 12;
data -= 4;
data vale 8

Lo mismo pasa con

x += 1;     
x -= 1;
x *= 1;
x /= 2;

++x; ó x++; aumenta en 1 la variable es lo mismo que x += 1; o x = x+1;
--x; ó x--;  disminuye en 1 la variable es lo mismo que x -= 1; o x = x-1;

otra cosa a tener en cuenta es en las condidionantes por ejemplo
x = 10;
if(++x == 11)    esta condicion es verdadera por que primero incrementa la variable y luego hace la comparación
if(x++ == 11)    esta condicion es falsa por que primero hace la comparación y luego incrementa la variable

espero te sirva.

Otra cosa a tener en cuenta en tu driver es que hacen la comparación:

if(data < 0)   esto sera verdadero siempre y cuando data sea tipo signed, si no lo es, nunca entrara en esa parte del codigo.


saludos.
Título: Re: Duda en una instrucción
Publicado por: Suky en 15 de Agosto de 2012, 20:02:51
Leer un tutorial cualquier de C no vendría mal  :mrgreen:
Título: Re: Duda en una instrucción
Publicado por: Thulsa Doom en 16 de Agosto de 2012, 18:27:26
Pues gracias por la explicación, el compañero  suky tiene razón con el comentario, he estudiado sobre eso pero no lo vi, pensé que hacía otra cosa, (se me saturo la mente lo siento  :oops:), el problema que tenía es que se supone que ese programa me da una medida en ºf de un termopar y al pasarlo a ºc me daba un valor aproximado pero no justo por el tema ese del error relativo y demás y por eso no llegaba a verlo pero al final ,me di cuenta.
 lo que he hecho es reescribir el programa y ajustarlo para que el valor me lo de en ºc directamente