Post by j***@gmail.comtemperatura=(int16_t)(I2C_DS1631_Get_Data()<< 8 ); /*Inserto la
primera palabra de 8 bits en la de 16 y la pongo a izqdas.*/
Yo quitaría el parentesis, primero lo conviertes
a entero de 16 bits y luego lo desplazas:
temperatura=(int16_t)I2C_DS1631_Get_Data() << 8;
Post by j***@gmail.comtemperatura |= (int16_t)(I2C_DS1631_Get_Data()>>8 ); /*Inserto la
segunda palabra de 8 bits en la de 16 y la pongo a drchas*/
Esto te pierde el contenido del byte leído al
desplazarlo, mejor:
temperatura |= (int16_t) I2C_DS1631_Get_Data();
Supuesto que int8_t sea unsigned, porque si es
con signo tampoco funcionará, podrías probar:
temperatura |= (int16_t) I2C_DS1631_Get_Data() & 0x00FF;
Y cruzas los dedos (no estoy seguro de que funcione,
puede depender del tamaño del entero de este compilador)
Lo más facil sin embargo seria escribir directamente
cada byte en su sitio,
unsigned char *pp = (unsigned char*) &temperatura;
pp[0] = I2C_DS1631_Get_Data();
pp[1] = I2C_DS1631_Get_Data();
O al revés (depende del compilador):
pp[1] = I2C_DS1631_Get_Data();
pp[0] = I2C_DS1631_Get_Data();
Lo que hagas luego ya depende de lo que necesites,
por ejemplo si eso son décimas de grado y quieres
mostrarlo en un lcd o similar, tandrás que descomponer
el numero en sus digitos en formato decimal o bien
comprobar si printf lo hace:
printf("%d", temperatura);
si esto te da la temperatura en decimas de grado
y quieres añadir el punto decimal en el medio
podrías hacer algo así:
if(temperatura < 0){
putchar('-');
temperatura = - temperatura;
}
printf("%d", temperatura / 10);
putchar('.');
printf("%d", temperatura % 10);
Aún así la division por diez es un lujo en un micro de estos,
muchas veces es mejor recurir a tablas o a algoritmos
raros para para evitar multiplicaciones y divisiones.
Saludos :-) -Pedro-
http://www.maicas.net/
e-mail en www.maicas.net