![]() |
| |||
| Hola: Estoy programando un microcontrolador atmel atmega32 y atraves del "puerto" i2c tengo conectado un termometro DS1631 que me da la temperatura en 2 palabrase de 8 bits. Lo que hago para pasar eso a grados centigrados es: unsigned char MSB; unsigned char LSB; float temp_c; temp_c = (float)((MSB<<8 + LSB) - 65536) * 0.0625; Es correcto, ya que no me da lectura ninguna. ¿? S2. |
| | ||||
| ||||
| |
| |||
| Primero comprueba que en MSB y LSB tienes valores. Suponiendo que tengan valores, ya que no se cómo ni cuando cambia los unsigned char a int, lo haría yo explicitamente así: temp_c = (float)((((unsigned int)MSB)<<8u + (unsigned int)LSB) - 65536u) * 0.0625; O si tienes int de 16 bits, te podrías ahorrar el desplazamiento y la suma con un union de un int con dos unsigned char. <jgenicio***gmail.com> escribió en el mensaje news:1175846983.935227.103210***o5g2000hsb.googlegro ups.com... Hola: Estoy programando un microcontrolador atmel atmega32 y atraves del "puerto" i2c tengo conectado un termometro DS1631 que me da la temperatura en 2 palabrase de 8 bits. Lo que hago para pasar eso a grados centigrados es: unsigned char MSB; unsigned char LSB; float temp_c; temp_c = (float)((MSB<<8 + LSB) - 65536) * 0.0625; Es correcto, ya que no me da lectura ninguna. ¿? S2. |
| |||
| Primero comprueba que en MSB y LSB tienes valores. Suponiendo que tengan valores, ya que no se cómo ni cuando cambia los unsigned char a int, lo haría yo explicitamente así: temp_c = (float)((((unsigned int)MSB)<<8u + (unsigned int)LSB) - 65536u) * 0.0625; O si tienes int de 16 bits, te podrías ahorrar el desplazamiento y la suma con un union de un int con dos unsigned char. <jgenicio***gmail.com> escribió en el mensaje news:1175846983.935227.103210***o5g2000hsb.googlegro ups.com... Hola: Estoy programando un microcontrolador atmel atmega32 y atraves del "puerto" i2c tengo conectado un termometro DS1631 que me da la temperatura en 2 palabrase de 8 bits. Lo que hago para pasar eso a grados centigrados es: unsigned char MSB; unsigned char LSB; float temp_c; temp_c = (float)((MSB<<8 + LSB) - 65536) * 0.0625; Es correcto, ya que no me da lectura ninguna. ¿? S2. |
| |||
| Primero comprueba que en MSB y LSB tienes valores. Suponiendo que tengan valores, ya que no se cómo ni cuando cambia los unsigned char a int, lo haría yo explicitamente así: temp_c = (float)((((unsigned int)MSB)<<8u + (unsigned int)LSB) - 65536u) * 0.0625; O si tienes int de 16 bits, te podrías ahorrar el desplazamiento y la suma con un union de un int con dos unsigned char. <jgenicio***gmail.com> escribió en el mensaje news:1175846983.935227.103210***o5g2000hsb.googlegro ups.com... Hola: Estoy programando un microcontrolador atmel atmega32 y atraves del "puerto" i2c tengo conectado un termometro DS1631 que me da la temperatura en 2 palabrase de 8 bits. Lo que hago para pasar eso a grados centigrados es: unsigned char MSB; unsigned char LSB; float temp_c; temp_c = (float)((MSB<<8 + LSB) - 65536) * 0.0625; Es correcto, ya que no me da lectura ninguna. ¿? S2. |
| |||
| Primero comprueba que en MSB y LSB tienes valores. Suponiendo que tengan valores, ya que no se cómo ni cuando cambia los unsigned char a int, lo haría yo explicitamente así: temp_c = (float)((((unsigned int)MSB)<<8u + (unsigned int)LSB) - 65536u) * 0.0625; O si tienes int de 16 bits, te podrías ahorrar el desplazamiento y la suma con un union de un int con dos unsigned char. <jgenicio***gmail.com> escribió en el mensaje news:1175846983.935227.103210***o5g2000hsb.googlegro ups.com... Hola: Estoy programando un microcontrolador atmel atmega32 y atraves del "puerto" i2c tengo conectado un termometro DS1631 que me da la temperatura en 2 palabrase de 8 bits. Lo que hago para pasar eso a grados centigrados es: unsigned char MSB; unsigned char LSB; float temp_c; temp_c = (float)((MSB<<8 + LSB) - 65536) * 0.0625; Es correcto, ya que no me da lectura ninguna. ¿? S2. |
| |||
| Primero comprueba que en MSB y LSB tienes valores. Suponiendo que tengan valores, ya que no se cómo ni cuando cambia los unsigned char a int, lo haría yo explicitamente así: temp_c = (float)((((unsigned int)MSB)<<8u + (unsigned int)LSB) - 65536u) * 0.0625; O si tienes int de 16 bits, te podrías ahorrar el desplazamiento y la suma con un union de un int con dos unsigned char. <jgenicio***gmail.com> escribió en el mensaje news:1175846983.935227.103210***o5g2000hsb.googlegro ups.com... Hola: Estoy programando un microcontrolador atmel atmega32 y atraves del "puerto" i2c tengo conectado un termometro DS1631 que me da la temperatura en 2 palabrase de 8 bits. Lo que hago para pasar eso a grados centigrados es: unsigned char MSB; unsigned char LSB; float temp_c; temp_c = (float)((MSB<<8 + LSB) - 65536) * 0.0625; Es correcto, ya que no me da lectura ninguna. ¿? S2. |
| |||
| On 6 Apr 2007 01:09:43 -0700, "jgenicio***gmail.com" <jgenicio***gmail.com> wrote: >temp_c = (float)((MSB<<8 + LSB) - 65536) * 0.0625; > >Es correcto, ya que no me da lectura ninguna. ¿? Eso es matar moscas a cañonazos, en un micro sin unidad de coma flotante, sin apenas memoria de programa ni ram, y sobre todo sin ninguna necesidad, no deberías usar float, aunque el compilador lo soporte seguro que te mete ahí un motón de código. Por otro lado el msb<<8 es sopechoso de que te va a perder su contenido, como al compilador le de por no convertirlo a entero (y supuesto un entero de 16 bits, que habría que verlo, igual el entero es de 8 bits en este caso). Aún con 16 bits, la operacion -65536 no parece tener mucho sentido, puesto que con dos bytes nunca vas a tener una lectura 65536, ¿ entonces el 'cero' cual seria ? Y para colmo, multiplicar por 0.0625 es lo mimso que dividir por 16, es decir lo mismo que hacer un desplazamiento de cuatro bits, ... todo bastante absurdo. Saludos :-) -Pedro- http://www.maicas.net/ e-mail en www.maicas.net |
| |||
| On 6 Apr 2007 01:09:43 -0700, "jgenicio***gmail.com" <jgenicio***gmail.com> wrote: >temp_c = (float)((MSB<<8 + LSB) - 65536) * 0.0625; > >Es correcto, ya que no me da lectura ninguna. ¿? Eso es matar moscas a cañonazos, en un micro sin unidad de coma flotante, sin apenas memoria de programa ni ram, y sobre todo sin ninguna necesidad, no deberías usar float, aunque el compilador lo soporte seguro que te mete ahí un motón de código. Por otro lado el msb<<8 es sopechoso de que te va a perder su contenido, como al compilador le de por no convertirlo a entero (y supuesto un entero de 16 bits, que habría que verlo, igual el entero es de 8 bits en este caso). Aún con 16 bits, la operacion -65536 no parece tener mucho sentido, puesto que con dos bytes nunca vas a tener una lectura 65536, ¿ entonces el 'cero' cual seria ? Y para colmo, multiplicar por 0.0625 es lo mimso que dividir por 16, es decir lo mismo que hacer un desplazamiento de cuatro bits, ... todo bastante absurdo. Saludos :-) -Pedro- http://www.maicas.net/ e-mail en www.maicas.net |
| |||
| On 6 Apr 2007 01:09:43 -0700, "jgenicio***gmail.com" <jgenicio***gmail.com> wrote: >temp_c = (float)((MSB<<8 + LSB) - 65536) * 0.0625; > >Es correcto, ya que no me da lectura ninguna. ¿? Eso es matar moscas a cañonazos, en un micro sin unidad de coma flotante, sin apenas memoria de programa ni ram, y sobre todo sin ninguna necesidad, no deberías usar float, aunque el compilador lo soporte seguro que te mete ahí un motón de código. Por otro lado el msb<<8 es sopechoso de que te va a perder su contenido, como al compilador le de por no convertirlo a entero (y supuesto un entero de 16 bits, que habría que verlo, igual el entero es de 8 bits en este caso). Aún con 16 bits, la operacion -65536 no parece tener mucho sentido, puesto que con dos bytes nunca vas a tener una lectura 65536, ¿ entonces el 'cero' cual seria ? Y para colmo, multiplicar por 0.0625 es lo mimso que dividir por 16, es decir lo mismo que hacer un desplazamiento de cuatro bits, ... todo bastante absurdo. Saludos :-) -Pedro- http://www.maicas.net/ e-mail en www.maicas.net |
| |||
| On 6 Apr 2007 01:09:43 -0700, "jgenicio***gmail.com" <jgenicio***gmail.com> wrote: >temp_c = (float)((MSB<<8 + LSB) - 65536) * 0.0625; > >Es correcto, ya que no me da lectura ninguna. ¿? Eso es matar moscas a cañonazos, en un micro sin unidad de coma flotante, sin apenas memoria de programa ni ram, y sobre todo sin ninguna necesidad, no deberías usar float, aunque el compilador lo soporte seguro que te mete ahí un motón de código. Por otro lado el msb<<8 es sopechoso de que te va a perder su contenido, como al compilador le de por no convertirlo a entero (y supuesto un entero de 16 bits, que habría que verlo, igual el entero es de 8 bits en este caso). Aún con 16 bits, la operacion -65536 no parece tener mucho sentido, puesto que con dos bytes nunca vas a tener una lectura 65536, ¿ entonces el 'cero' cual seria ? Y para colmo, multiplicar por 0.0625 es lo mimso que dividir por 16, es decir lo mismo que hacer un desplazamiento de cuatro bits, ... todo bastante absurdo. Saludos :-) -Pedro- http://www.maicas.net/ e-mail en www.maicas.net |
| |
| |
![]() |
| Herramientas | |
| Desplegado | |
| |
Temas Similares | ||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Calculos en informe | Pancho | Newsgroup microsoft.public.es.access | 4 | 24-03-2008 16:13:55 |
| Excel Calculos | Carlos González | Newsgroup microsoft.public.es.excel | 1 | 11-01-2008 16:16:29 |
| Cálculos en LaTeX | Pelines | Newsgroup es.comp.lenguajes.tex | 48 | 27-03-2007 20:20:02 |
| Hojas de Calculos y Graficos | Carlos | Newsgroup microsoft.public.es.frontpage | 6 | 15-01-2007 01:43:38 |
| calculos | Mg | Newsgroup es.tecnica.arquitectura | 18 | 17-02-2005 08:21:11 |