Autor Tema: Cómo enviar o recibir sólo 4bits usando interfaz spi...  (Leído 8134 veces)

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

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: Cómo enviar o recibir sólo 4bits usando interfaz spi...
« Respuesta #15 en: 23 de Enero de 2011, 18:32:58 »
Hola a todos. Hace tiempo que no se escribe nada en este hilo.. jaa Bueno les cuento que empeze a trabajar con el HM55B, he leeido la hoja de datos del dispositivo e interpreté el protocolo de comunicación. Tengo el problema que no logro inicializar el modulo. Si alguien todabia recuerda un poco de esto que me de una mano. El programa nunca sale del while done compara el dato recibido por el giroscopo y el FLAG de que la converción a finalizado. Gracias.


#include <16F887.h>
#device adc=10
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=12000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#FUSES DEBUG

#define SDO PIN_C4
#define SDI PIN_C1
#define SCK PIN_C3
#define HM55B_ENABLE  PIN_C2       ///CS Chip Select Input (Low = Select, High = Disable)


int16 dato_x,dato_y;
#use spi (MASTER,CLOCK_HIGH=5,CLOCK_LOW=5,DI=SDI,DO=SDO,CLK=SCK,MSB_FIRST,MODE=1,STREAM=brujula_out)
#use spi (MASTER,CLOCK_HIGH=5,CLOCK_LOW=5,DI=SDI,DO=SDO,CLK=SCK,LSB_FIRST,MODE=1,STREAM=brujula_in)

#include <HDM64GS12.c>
#include <graphics.c>
#include <HM55B.c>
#include <math.h>


void main()
{
float x,y,angulo;

while(TRUE){
getCompasXY();
if (bit_test(dato_x,10)==1) dato_x = dato_x | NEG_MASK ;
if (bit_test(dato_y,10)==1) dato_y = dato_y | NEG_MASK ;
x=(float)dato_x;
y=(float)dato_y;
angulo = atan2 (-y,x);
angulo*=57.2958;
printf ("Angulo= %f\n\r",angulo);
delay_ms(150);
}         
}


// SPI mode definitions.
#define SPI_MODE_0  (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_1  (SPI_L_TO_H)
#define SPI_MODE_2  (SPI_H_TO_L)
#define SPI_MODE_3  (SPI_H_TO_L | SPI_XMIT_L_TO_H)

//========================================================
//Command Set
//These commands are shifted-out to the Compass Module.

#define         HM55B_RESET      0b0000               //Reset command for HM55B
#define         HM55B_START      0b0001               //Start measurement command
#define         HM55B_REPORT              0b0011               //Report measurement status (and transmit the measurement if it's ready)
#define         HM55B_READY      0b1100               //11 -> Measurement completed; 00 -> no errors

#define         NEG_MASK      0b1111100000000000      //For 11-bit negative to 16-bits   


//
// This Hitachi HM55B compass module test program displays x (N/S) and y (W/E)
// axis measurements along with the direction the compass module is pointing,
// measured in degrees clockwise from north.
//

void getCompasXY()
{

int hm55bStatus=0;      //variable utilizada para guardar el valro del flag de fin de conversion


// Send a reset command to HM55B

    output_high(HM55B_ENABLE);
   delay_us(20);
    output_low(HM55B_ENABLE);
    spi_xfer(brujula_out,HM55B_RESET,4);
    output_high(HM55B_ENABLE); //Controlar esta linea. En el pdf lo especifica pero en los programas ejemplo no lo hacen.
    delay_us(20);

// Send a start measurement command to HM55B
   
   output_low(HM55B_ENABLE);
    spi_xfer(brujula_out,HM55B_START,4);
   delay_us(20);
   output_high(HM55B_ENABLE);
   delay_us(20);
    output_low(HM55B_ENABLE);

 while (hm55bStatus != HM55B_READY)
    {
              
    spi_xfer(brujula_out,HM55B_REPORT,4);
    hm55bStatus = spi_xfer(brujula_in,0b0000,4);
   
   }

dato_x=spi_xfer(brujula_in,HM55B_RESET,11);
dato_y=spi_xfer(brujula_in,HM55B_RESET,11);
}


Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Cómo enviar o recibir sólo 4bits usando interfaz spi...
« Respuesta #16 en: 27 de Enero de 2011, 19:14:00 »
Qué tal Pchuqi_1!

Tengo el problema que no logro inicializar el modulo. Si alguien todabia recuerda un poco de esto que me de una mano. El programa nunca sale del while done compara el dato recibido por el giroscopo y el FLAG de que la converción a finalizado. Gracias.

Bueno ya tengo tiempo que no he vuelto a trabajar con brújulas electrónicas...
Pero como mencioné antes, este código de que me funcionó me funcionó...  :D

Tu código lo veo muy bien, sólo veo un detalle acá que a mí también me causó problemas:
Código: C
  1. while (hm55bStatus != HM55B_READY)  // y HM55B_READY esta definido como 0b1100

A mí esa parte del código definido así nunca me funcionó... porque lo que me recibía el micro de la brújula no era 1100 sino 0011 (en decimal: 3)
Por eso fue que lo coloqué así:
Código: C
  1. while (estado != 3)

Yo te recomendaría hacer lo que hice yo, que le mencioné a begoña:

Yo por ejemplo tuve que hacer varias cosas.
Primero, le enviaba los datos de reset y activación y recibía el dato que mandaba la brújula, y enviaba ese valor por puerto serial para monitorear qué estaba mandando la brújula.

Así podrás ver si la brújula está respondiendo o no...
Tal vez si está respondiendo y el problema sea esa comparación en el while.

Bueno ojalá puedas resolver tu problema... cualquier cosa la mencionas por acá y seguro no sólo yo, sino los grandes master del foro -yo sólo soy un novatillo jeje- podrán ayudarte...

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 Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: Cómo enviar o recibir sólo 4bits usando interfaz spi...
« Respuesta #17 en: 30 de Enero de 2011, 14:28:39 »
Hola firepic. Gracias por contestar. Te cuento que ya tengo andando el modulo. El problema estaba en el modo de funcionamiento de SPI. Para que funciones hay que poner MODE=2. Quisiera saber si hiciste algún tipo de librería para la calibración de la brújula?? En la hoja de datos menciona que se hace una "interpolación de valores", pero no me queda bien claro que es lo que hace.
Me estoy guiando por los programas echos con los micros de parallax para hacer mi libreria, y se que ellos toman datos y lo guardan en la eeprom para despues compararlos.
 MUCHAS GRACIAS.
« Última modificación: 30 de Enero de 2011, 14:33:37 por Pchuqui_1 »

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Cómo enviar o recibir sólo 4bits usando interfaz spi...
« Respuesta #18 en: 30 de Enero de 2011, 15:01:35 »
Qué tal Pchuqi_1! Me alegra que hayas echado a funcionar el módulo, felicitaciones!!  :-/
Mira no, cuando trabajé con ese módulo en realidad estaba ayudando a otra persona, no era un proyecto personal... y no tocamos la parte de la calibración... aunque yo hice bastantes pruebas comparando con una brujula común y era bastante exacta siempre la medición que me daba el módulo...

Si logras hacerte con algo bueno para el manejo de esa parte no dejes de publicarlo eh! Seguro le puede ayudar a alguien más adelante.
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 Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: Cómo enviar o recibir sólo 4bits usando interfaz spi...
« Respuesta #19 en: 30 de Enero de 2011, 15:04:45 »
Creo que si no lo calibras, el modulo no tiene referencia de los ejes y mide datos muy erroneos. Voy a seguir investigando haber si logro descubrir como lo hace. Saludos


 

anything