Saludos gente todopic!
Pues se me ha presentado una dudilla y tiene que ver pues con eso, con los números negativos en CCS.
El caso es que estoy trabajando con una brujulita electrónica: "compass module hitachi hm55b"...
Aqui pueden ver el manual completo.
Para que no tengan que esperar a que se cargue todo el archivo, creo que las partes más relevantes referentes al tema son esta:
Y esta otra:
Lo que se entiende es que el módulo manda los datos de X y Y en complemento a dos.
Luego también menciona por allí que hay que usar una 'máscara negativa' (negmask) para los 5 bits faltantes (ya que la transmisión es a 11 bits)....
Entonces si el bit 10 es 1, entonces hacer un dato_x=dato_x|1111100000000000, lo mismo con dato_y.
Ahora bien, la cosa se presenta cuando voy a hacer la operación para conseguir el ángulo, angulo = arctan (-y/x)
Porque dato_x y dato_y los tengo definidos como "signed int16", pero luego los paso a float... no sé si lo estoy haciendo correctamente.
El código relevante, después que obtengo los valores dato_x y dato_y por interfaz spi, es este:
void main (void)
{
float angulo,x,y;
set_tris_a(0b00000000);
set_tris_b(0b00000010);
set_tris_c(0b10010000);
output_high(EN);
while(TRUE)
{
recibe_brujula(); //En esta función está el código para recibir los datos vía spi. Esto está probado y funciona bien.
if (bit_test(dato_x,10)==1) dato_x |= negmask;
if (bit_test(dato_y,10)==1) dato_y |= negmask;
x=(float)(dato_x);
y=(float)(dato_y);
printf ("Angulo= %f\n\r",angulo
); delay_ms(150);
}
}
No estoy seguro de si lo estoy haciendo correctamente por el resultado.
Tengo el circuito montado en protoboard, y veo lo que envía el pic en el terminal de la pc. Giro el proto a la izquierda y luego a la derecha y veo esto:
Angulo= -1.06
Angulo= -1.05
Angulo= -1.07
Angulo= -1.07
Angulo= -1.08
Angulo= -1.05
Angulo= -1.05
Angulo= -1.04
Angulo= -1.05
Angulo= -1.07
Angulo= -1.04
Angulo= -1.01
Angulo= -0.93
Angulo= -0.86
Angulo= -0.81
Angulo= -0.75
Angulo= -0.69
Angulo= -0.65
Angulo= -0.54
Angulo= -0.46
Angulo= -0.38
Angulo= -0.34
Angulo= -0.26
Angulo= -0.18
Angulo= -0.13
Angulo= -0.06
Angulo= -0.06
Angulo= 1.56
Angulo= 1.56
Angulo= 1.56
Angulo= 1.56
Angulo= 1.56
Angulo= -0.12
Angulo= -0.22
Angulo= -0.29
Angulo= -0.38
Angulo= -0.50
Angulo= -0.64
Angulo= -0.77
Angulo= -0.89
Angulo= -1.00
Angulo= -1.15
Angulo= -1.33
Angulo= -1.48
Angulo= -3.13
Angulo= 0.00
Angulo= 0.00
Angulo= 0.00
Angulo= -2.08
Angulo= -3.13
Angulo= -3.13
Angulo= -3.14
Angulo= -3.14
Angulo= 0.00
Angulo= 0.00
Angulo= 0.00
Angulo= -3.14
Angulo= -3.14
Angulo= -3.13
Angulo= 0.00
Angulo= 0.00
Angulo= 0.00
Angulo= -3.13
Angulo= -1.53
Angulo= -1.33
Angulo= -1.15
Angulo= -1.04
Angulo= -1.02
Angulo= -1.01
Angulo= -1.01
Angulo= -1.03
Angulo= -1.03
Angulo= -1.04
Angulo= -1.00
Angulo= -1.02
Angulo= -1.02
Angulo= -0.99
Angulo= -1.03
Angulo= -1.00
Angulo= -1.02
Angulo= -1.00
Angulo= -1.04
Angulo= -1.03
Claro debo aclarar que esos ángulos están en radianes. Lo raro que veo es que moviendo en un mismo sentido, de repente muestra cero, de repente pasa a -3.14... será eso correcto o es un error en la programación?
Estoy haciendo correcto el código al pasar de entero a float de esa forma? Bueno todo depende de cómo trata CCS los "signed int"... complemento a dos?
No sé si estoy haciendo algo mal o está correcto... pero es que me parece raro los datos que veo.
Desde ya les agradezco sus respuestas.
Nos leemos!