Autor Tema: Cómo trata el CCS los números negativos? Complemento a dos? (solucionado)  (Leído 4313 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
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:

Código: C
  1. void main (void)
  2. {
  3.         float angulo,x,y;
  4.         set_tris_a(0b00000000);
  5.         set_tris_b(0b00000010);
  6.         set_tris_c(0b10010000);
  7.         output_high(EN);
  8.         while(TRUE)
  9.         {
  10.                 recibe_brujula(); //En esta función está el código para recibir los datos vía spi. Esto está probado y funciona bien.
  11.                 if (bit_test(dato_x,10)==1) dato_x |= negmask;
  12.                 if (bit_test(dato_y,10)==1) dato_y |= negmask;
  13.                 x=(float)(dato_x);
  14.                 y=(float)(dato_y);
  15.                 angulo=atan2(x,-y);
  16.                 printf ("Angulo= %f\n\r",angulo);
  17.                 delay_ms(150);
  18.         }      
  19. }

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!  :mrgreen:
 
« Última modificación: 22 de Junio de 2008, 17:33:16 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Cómo trata el CCS los números negativos? Complemento a dos?
« Respuesta #1 en: 06 de Junio de 2008, 16:22:39 »
He tomado otra muestra, pero esta vez girando el protoboard 360º en un mismo sentido.
Aquí está el resultado arrojado (ángulos en radianes):

-1.05
-1.05
-1.06
-1.08
-1.05
-1.06
-1.04
-1.04
-1.06
-1.06
-1.03
-1.05
-1.05
-1.10
-1.14
-1.15
-1.21
-1.24
-1.31
-1.33
-1.41
-1.48
-1.46
-1.48
-1.53
-1.50
-3.13
-3.13
-3.13
-3.13
-3.13
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
-2.21
-3.12
-3.13
-3.13
-3.13
-3.13
-3.14
-3.14
-3.14
-3.14
-3.14
-3.14
-3.14
0.00
-3.14
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
1.57
1.57
1.57
1.65
1.81
1.81
1.89
2.03
2.03
2.21
2.21
2.31
2.31
2.31
2.26
2.35
2.39
2.43
0.67
1.57
1.57
1.57
1.57
1.57
1.57
1.57
1.57
1.57
1.57
1.57
1.57
1.57
1.57
1.57
1.57
1.57
1.57
1.56
1.56
1.56
1.56
1.56
1.56
1.56
1.56
1.56
1.56
1.56
1.56
1.56
1.56
1.56
1.56
1.56
1.56
1.56
1.56
1.56
1.56
1.56
1.56
-0.02
-0.04
-0.14
-0.17
-0.21
-0.27
-0.32
-0.33
-0.34
-0.38
-0.45
-0.45
-0.48
-0.55
-0.59
-0.61
-0.61
-0.62
-0.67
-0.72
-0.74
-0.74
-0.81
-0.87
-0.88
-0.88
-0.93
-0.91
-0.92
-0.93
-0.93
-0.93
-0.92
-0.95
-0.93
-0.93
-0.97
-0.94
-0.95
-0.96
-0.97
-0.93
-0.94
-0.94
-0.95
-0.97
-0.97
-0.95
-0.95
-0.97
-0.95
-0.95
-0.92

Qué les parece?
Ok saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Cómo trata el CCS los números negativos? Complemento a dos?
« Respuesta #2 en: 06 de Junio de 2008, 23:00:37 »
Hola Fire.

Por mi parte no detecto errores con los castings, lo que me extraña es que la variación en el valor del ángulo posee bastante poca resolución, tal vez puede ser por el método de prueba "a ojo" :mrgreen: que estas utilizando. Puedes verificar si el angulo es correcto colocando una hoja debajo del protoboard que contenga una escala polar con marcas cada 15 o 30º y comprobar que realmente esta indicando el angulo correcto.
No se que tan sensible son estas brujulas pero yo no las colocaría cerca de nada que emita un campo magnético porque la medición no va a ser consistente.

Esperamos más resultados de tus pruebas, la verdad que cada vez que posteas una pregunta acerca de tus proyectos fire me dan ganas de empezar con algo de lo que estás haciendo :mrgreen: Estás contagiando entusiasmo electronico  :-/.

Saludos.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Cómo trata el CCS los números negativos? Complemento a dos?
« Respuesta #3 en: 06 de Junio de 2008, 23:14:24 »
Gracias por tu respuesta dr. Gonzalo.
Bueno pues tienes razón en lo que mencionas. Pero aún así no te parece raro el brinco que hace el ángulo de repente?
Como en la parte que pasa de -3.13 a 0 y luego a -2.21... eso es lo que me desconcierta.
Lo que también estoy pensando hacer es en conseguirme una brújula analógica y así ver qué tal va la medición.
Se supone que hacia el norte magnético debería indicar 0.
Y tienes razón, el manual también menciona eso de no colocar el módulo cerca de un campo magnético pues ocasiona distorsión en la medición.
Esto es importante para el proyecto que estoy desarrollando, pues la lectura de la brújula sera la base para el control automático de navegación de un cohete.
En lo que consiga la brújula analógica haré las pruebas y les cuento.... la cuestión es ver quién tendrá una brújula  :?
Ok ya les diré.
Si tienen algún otro comentario importante sobre esto se los agradezco.
Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Cómo trata el CCS los números negativos? Complemento a dos?
« Respuesta #4 en: 13 de Junio de 2008, 23:10:13 »
Bueno aún me falta algo por resolver con lo de la brújula, pero sólo quería acotar sobre la pregunta del hilo "Cómo trata CCS los números negativos"... en efecto, es complemento a dos. Cuando uno declara una variable "signed int", CCS usa el complemento a dos para manejar los números. De esta forma puede almacenar valores positivos o negativos.
Ok es todo por ahora.
Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Cómo trata el CCS los números negativos? Complemento a dos?
« Respuesta #5 en: 14 de Junio de 2008, 23:05:41 »
Finalmente, lo he resuelto, gracias a Dios.
En este hilo: http://www.todopic.com.ar/foros/index.php?topic=22186.0 he añadido algunas breves consideraciones para trabajar con el HM55B compass module.
Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web