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);
}