Skocz do zawartości

Czujnik HMC5883L nie odpowiada


Mateusz

Pomocna odpowiedź

F_CPU mam ustawione w properties projektu:

A program ten co dałem to nie jest ten do testowania 🙂.

Ten testowy wyglądał tak, że zakomentowałem wszystko w pętli głównej i dodałem:

for(uint8_t i=0;i<=254;i++)	
	{
		char err=i2c();

i2c();

i2c();
}

Następnie w while pobieram dane: kompas_poss = getHeadingHMC();

int getHeadingHMC(void)
{
int16_t raw_x = 0;
int16_t raw_y = 0;
int16_t raw_z = 0;

i2c();

i2c_rep();

int headingDegrees = atan2(raw_y,raw_x)* 57 + 180;

return headingDegrees;
}

I mam kosmosy. Macie jakieś pomysły? Czy mogą być aż takie zawahania przez złe umieszczenie czujnika względem reszty elementów?

[ Dodano: 17-09-2012, 20:05 ]

A taka funkcja:

int read_a(void)
{
int16_t a = 0;

i2c();

return a;
}

Zwraca mi 0 a w funkcji HMC5883L_init ustawiam adres 00 na 70.

Link do komentarza
Share on other sites

Ciesze się, że w końcu ruszyło 😉

W kodzie dałeś czas żeby czujnik zrobił pomiar?

Mój kod wygląda tak...

//HMC5883L
   //start conversion
   temp[0]=0xF0;//average 1 - 307
   I2C_BufferWrite(HMC5883L_SLAVE_ADDRESS,&temp[0],0x00,1);
   temp[0]=0x20;//very small gain
   I2C_BufferWrite(HMC5883L_SLAVE_ADDRESS,&temp[0],0x01,1);

   temp[0]=0x00;//single conversion
   I2C_BufferWrite(HMC5883L_SLAVE_ADDRESS,&temp[0],0x02,1);
   delayms(50);
   //read data
   int x,y,z;
   I2C_BufferRead(HMC5883L_SLAVE_ADDRESS,&tekst[0],0x04,1);
   x=tekst[0];
   I2C_BufferRead(HMC5883L_SLAVE_ADDRESS,&tekst[0],0x03,1);
   x+=((int)tekst[0])<<8;

   I2C_BufferRead(HMC5883L_SLAVE_ADDRESS,&tekst[0],0x06,1);
   y=tekst[0];
   I2C_BufferRead(HMC5883L_SLAVE_ADDRESS,&tekst[0],0x05,1);
   y+=((int)tekst[0])<<8;

   I2C_BufferRead(HMC5883L_SLAVE_ADDRESS,&tekst[0],0x08,1);
   z=tekst[0];
   I2C_BufferRead(HMC5883L_SLAVE_ADDRESS,&tekst[0],0x07,1);
   z+=((int)tekst[0])<<8;

(w funkcji podaje adres a w temp/tekst[0] dana do wysłania lub dana odebrana...)

Link do komentarza
Share on other sites

Mój czujnik pracuje w trybie Continuous-Measurement Mode, i dlatego nie muszę chyba czekać na wyniki bo te aktualizują się same po dokonaniu pomiaru przez czujnik, najwyżej odczytałbym poprzednią wartość. No i zastanawia mnie czemu, źle odczytuje mi wartości z rejestru 0x00.

Ten czujnik mnie dobije 😃

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Teraz czego bym nie, pobrał dostaje w odpowiedzi 61 czyli 0x3D (adres HMC5883L_READ) niezależnie od rejestru.

Pobierałem dane takimi funkcjami:

int readMirek(void)
{
int b = 0;
i2c();

i2c();

i2c();

_delay_ms(50);

i2c();
i2c_rep();
i2c_rep();

i2c_rep();

//char buf[80];
//sprintf(buf,"%d :%d :%d\n", raw_x, raw_y, raw_z);
//USART_send_string(buf);

int headingDegrees = atan2(raw_y,raw_x)* 57 + 180;

return raw_x;
}
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.