Skocz do zawartości

Czujnik HMC5883L nie odpowiada


Mateusz

Pomocna odpowiedź

Witam.

Mam problem z czujnikiem pola magnetycznego HMC5883L a mianowicie nie funckja HMC5883L_init() zwraca mi błąd. Do I2C podłączony mam także inny czujnik który działa bez zarzutów. Schemat w załączniku.

Kod:

hmc5883L.h

/*
* hmc5883l.h
*
* Created: 2012-03-14 15:06:24
*  Author: mati
*/ 
#ifndef HMC5883L_H_
#define HMC5883L_H_
#define HMC5883L_WRITE 0x3C // write address
#define HMC5883L_READ 0x3D // read address
#define pi 3.142

void HMC5883L_init(void);
int getHeadingHMC(void);
void readBHMC(void);
int getHeadingHMC_TiltComp(float pitch, float roll);
int* getHeadingHMC_tab();

int tablica_xyz[3];

#endif /* HMC5883L_H_ */

hmc5883L.c

/*
* hmc5883l.c
*
* Created: 2012-03-14 15:05:01
*  Author: mati
*/ 
#include <avr/io.h>
#include "hmc5883l.h"
#include <math.h>

void HMC5883L_init(void)
{
char buf[20];
char err;

err=i2c();

i2c();

i2c();

sprintf(buf,"HMC: %i\n",err);
USART_send_string(buf);

/*i2c();
i2c_rep(void)
{
   /* send stop condition */
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);

// wait until stop condition is executed and bus released
int a=100;
while(TWCR & (1<<TWSTO) && a>0)
{
	_delay_us(10);
	a--;
}

}/* i2c_stop */


/*************************************************************************
 Send one byte to I2C device

 Input:    byte to be transfered
 Return:   0 write successful 
           1 write failed
*************************************************************************/
unsigned char i2c_write( unsigned char data )
{	
   uint8_t   twst;

// send data to the previously addressed device
TWDR = data;
TWCR = (1<<TWINT) | (1<<TWEN);

// wait until transmission completed
int a=100;
while(!(TWCR & (1<<TWINT)) && a>0)
{
	_delay_us(10);
	a--;
}

// check value of TWI Status Register. Mask prescaler bits
twst = TW_STATUS & 0xF8;
if( twst != TW_MT_DATA_ACK) return 1;
return 0;

}/* i2c_write */


/*************************************************************************
Read one byte from the I2C device, request more data from device 

Return:  byte read from I2C device
*************************************************************************/
unsigned char i2c_readAck(void)
{
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
int a=100;
while(!(TWCR & (1<<TWINT)) && a>0)
{
	_delay_us(10);
	a--;
} 

   return TWDR;

}/* i2c_readAck */


/*************************************************************************
Read one byte from the I2C device, read is followed by a stop condition 

Return:  byte read from I2C device
*************************************************************************/
unsigned char i2c_readNak(void)
{
TWCR = (1<<TWINT) | (1<<TWEN);
int a=100;
while(!(TWCR & (1<<TWINT)) && a>0)
{
	_delay_us(10);
	a--;
}


   return TWDR;

}/* i2c_readNak */

Bardzo proszę o pomoc bo jest do dla mnie niesamowicie ważne aby zaczęło to działać. Wcześniej myślałem, że to wina czujnika ale wlutowałem nowy i dalej nie działa.

Link do komentarza
Share on other sites

Przed wszystkim sprawdź, czy Twoja wersja tego czujnika to rzeczywiście HMC5883L bo wersja bez tej ostatniej literki ma trochę inne obłożenie pinów i trzeba zmieniać schemat.

Jak rozumiem, pierwsze wywołanie funkcji USART_send_string() jest w HMC5883L_init() i to tam dostajesz kod błędu? Wcześniej są tylko trzy wywołania prostych zapisów do rejestrów ale tylko pierwszy zapamiętuje kod błędu więc jest tak, że niepowodzi się już pierwsza funkcja i2c - to bezwarunkowo zakończy ewentualną aktywność na magistrali. Nie pokazałeś main() więc nie bardzo wiadomo co robisz i jaka jest kolejność operacji po starcie programu.

Szczerze mówiąc takich wypadkach oscyloskop zastępuje godziny zgadywania.

EDIT2: PPM_IN i PPM_OUT - czy to jakiś autopilot ? 🙂 Napisz coś więcej.

Link do komentarza
Share on other sites

Zrobiłem pomiary na oscyloskopie linii SDA i SCL

Zauważyłem też, że na kondensatorze C7 nie odkłada się żadne napięcie. Nie wiem czy powinno czy nie ale może to na coś nas nakieruje 😉.

Program główny wyglądał podczas pomiarów tak:

/*
* atmega32_HeadSens.c
*
* Created: 2012-09-06 14:12:38
*  Author: mati
*/ 
#include <avr/io.h>
#include <stdlib.h>
#include <stdio.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/wdt.h> //Biblioteka WatchDog
#include "atmega32_HeadSens.h"
#include "atm32_comm/UART_ATM32.h"
#include "atm32_comm/i2cmaster.h"
#include "usbdrv/mouse_lib.h"
// Moje biblioteki
#include "moje_lib/mma7455l.h"
#include "moje_lib/hmc5883l.h"
#include "moje_lib/ppm.h"

int send=0;
volatile char rx_data;

int main(void)
{	
//Sens
int pomiar_akc_x[40];
int pomiar_akc_y[40];
int pomiar_akc_z[40];
int radio=1;
//Mouse
uchar button=0;
char dx=0, dy=0;

DDRD = 0x00;
PORTD = 0xFF;

if(!(PIND & (1<<1)))
{
	radio=0;
}

DDRB = 0xFF;
PORTB = 0xFF;
DDRC = 0xFF;
PORTC = 0xFF;
DDRD = 0x80;
PORTD = 0x00;
wdt_enable(WDTO_1S); // enable 1s watchdog timer

//If mouse
if(radio==0)
{
	mouse_init();
}else
{		
	//If RC transmitter
	/*USART_Init();
	sprintf(buf,"Radio\n");
	USART_send_string(buf);

	ppm_send_init();
	ppm_receive_init();*/
	i2c_init();
}

wdt_reset(); // keep the watchdog happy
HMC5883L_init();

sei();
while(1)
   {
	HMC5883L_init();
	_delay_ms(100);
   }
}

Żółty SDA czerwony SCL

Na układzie napisane jest L883 2132.

A układ ma służyć do śledzenia ruchów głowy i za pomocą nadajnika RC poruszać będzie kamerą pokładowa dowolnego pojazdu, i dodatkowo można za jego pomocą poruszać myszką komputerową 🙂.

Dodałem jeszcze linijkę w i2c_write która wysyła mi rodzaj błędu:

unsigned char i2c_write( unsigned char data )
{	
   uint8_t   twst;

// send data to the previously addressed device
TWDR = data;
TWCR = (1<<TWINT) | (1<<TWEN);

// wait until transmission completed
int a=100;
while(!(TWCR & (1<<TWINT)) && a>0)
{
	_delay_us(10);
	a--;
}

// check value of TWI Status Register. Mask prescaler bits
twst = TW_STATUS & 0xF8;

char buf[20];
sprintf(buf,"twst: %i\n",twst);
USART_send_string(buf);

if( twst != TW_MT_DATA_ACK) return 1;
return 0;

}/* i2c_write */

I otrzymuję wartość 48. Czyli chyba SLA+R transmitted, NACK received.

Co ciekawe nie wiem czemu mi się procesor resetuje po czymś takim.

Z terminala

Radio

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

HMC: 1

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

HMC: 1

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

HMC: 1

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

HMC: 1

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

HMC: 1

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

HMC: 1

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

HMC: 1

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

HMC: 1

Radio

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

HMC: 1

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

twst: 48

Najgorsze jest to że nie ma jak sprawdzić czy układ jest dobrze przylutowany. :/

Dodatkowo sprawdziłem co podczas wykonywania funkcji i2c_start zwraca mi I2C.

Start: twst: 8

Start2: twst: 32

/*************************************************************************	
 Issues a start condition and sends address and transfer direction.
 return 0 = device accessible, 1= failed to access device
*************************************************************************/
unsigned char i2c_start(unsigned char address)
{
   uint8_t   twst;

// send START condition
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);


// wait until transmission completed
int a=100;
while(!(TWCR & (1<<TWINT)) && a>0)
{
	_delay_us(10);
	a--;
}

// check value of TWI Status Register. Mask prescaler bits.
twst = TW_STATUS & 0xF8;
char buf[20];
sprintf(buf,"Start: twst: %i\n",twst);
USART_send_string(buf);
if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;

// send device address
TWDR = address;
TWCR = (1<<TWINT) | (1<<TWEN);

// wail until transmission completed and ACK/NACK has been received
a=100;
while(!(TWCR & (1<<TWINT)) && a>0)
{
	_delay_us(10);
	a--;
}


// check value of TWI Status Register. Mask prescaler bits.
twst = TW_STATUS & 0xF8;
sprintf(buf,"Start2: twst: %i\n",twst);
USART_send_string(buf);
if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;

return 0;

}/* i2c_start */
Link do komentarza
Share on other sites

Procesor resetuje się dzięki watchdogowi, którego odpalasz a potem zapominasz go "uszczęśliwiać". Może na razie daj sobie z nim spokój, nie włączaj go a zajmiesz się nim gdy już dużo rzeczy będzie śmigać.

Czuję, że jest problem z zaadresowaniem układu na co wskazywałby status błędu. Pierwszy wynik operacji START to 8, czyli OK ale już kolejne 32 to szesnastkowo 20 czyli "SLA+W transmitted, NACK received". Nie powiodło się wysłanie adresu, znaczy on poszedł ale nie dostałeś ACK - nie ma układu o takim adresie na szynie. Funkcja i2c_write() to za daleko, problem jest wcześniej.

Jeśli już dajesz przebiegi z oscyloskopu to takie, żebyś i Ty i ja mógł coś zobaczyć. W tej rozdzielczości to mogę jedynie powiedzieć gdzie był początek i koniec ramki I2C. Poproszę o operację START i pierwszy bajt wraz z bitem ACK. Jeśli nie masz specjalnego wyzwalania od I2C to przynajmniej wstaw opóźnienia w kodzie takie, by oscyloskop wyzwolił się od STARTu. Jeżeli przebiegi w rozciągniętej skali będą wyglądały sensownie (zbocza, opóźnienia) i adres będzie prawidłowy a ACK wciąż nie będzie, trzeba będzie szukać w płytce i połączeniach.

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

Mam takie przebiegi chyba będzie z nich więcej widać:

Jest to funkcja HMC5883L_init();

Zrobiłem prosty skaner adresów i niestety nie znalazł mi kompasu, tylko akcelerometr.

Addr 0: 1

Addr 1: 1

Addr 2: 1

Addr 3: 1

Addr 4: 1

Addr 5: 1

Addr 6: 1

Addr 7: 1

Addr 8: 1

Addr 9: 1

Addr 10: 1

Addr 11: 1

Addr 12: 1

Addr 13: 1

Addr 14: 1

Addr 15: 1

Addr 16: 1

Addr 17: 1

Addr 18: 1

Addr 19: 1

Addr 20: 1

Addr 21: 1

Addr 22: 1

Addr 23: 1

Addr 24: 1

Addr 25: 1

Addr 26: 1

Addr 27: 1

Addr 28: 1

Addr 29: 1

Addr 30: 1

Addr 31: 1

Addr 32: 1

Addr 33: 1

Addr 34: 1

Addr 35: 1

Addr 36: 1

Addr 37: 1

Addr 38: 1

Addr 39: 1

Addr 40: 1

Addr 41: 1

Addr 42: 1

Addr 43: 1

Addr 44: 1

Addr 45: 1

Addr 46: 1

Addr 47: 1

Addr 48: 1

Addr 49: 1

Addr 50: 1

Addr 51: 1

Addr 52: 1

Addr 53: 1

Addr 54: 1

Addr 55: 1

Addr 56: 1

Addr 57: 1

Addr 58: 0

Addr 59: 0

Addr 60: 1

Addr 61: 1

Addr 62: 1

Addr 63: 1

Addr 64: 1

Addr 65: 1

Addr 66: 1

Addr 67: 1

Addr 68: 1

Addr 69: 1

Addr 70: 1

Addr 71: 1

Addr 72: 1

Addr 73: 1

Addr 74: 1

Addr 75: 1

Addr 76: 1

Addr 77: 1

Addr 78: 1

Addr 79: 1

Addr 80: 1

Addr 81: 1

Addr 82: 1

Addr 83: 1

Addr 84: 1

Addr 85: 1

Addr 86: 1

Addr 87: 1

Addr 88: 1

Addr 89: 1

Addr 90: 1

Addr 91: 1

Addr 92: 1

Addr 93: 1

Addr 94: 1

Addr 95: 1

Addr 96: 1

Addr 97: 1

Addr 98: 1

Addr 99: 1

Addr 100: 1

Addr 101: 1

Addr 102: 1

Addr 103: 1

Addr 104: 1

Addr 105: 1

Addr 106: 1

Addr 107: 1

Addr 108: 1

Addr 109: 1

Addr 110: 1

Addr 111: 1

Addr 112: 1

Addr 113: 1

Addr 114: 1

Addr 115: 1

Addr 116: 1

Addr 117: 1

Addr 118: 1

Addr 119: 1

Addr 120: 1

Addr 121: 1

Addr 122: 1

Addr 123: 1

Addr 124: 1

Addr 125: 1

Addr 126: 1

Addr 127: 1

Addr 128: 1

Addr 129: 1

Addr 130: 1

Addr 131: 1

Addr 132: 1

Addr 133: 1

Addr 134: 1

Addr 135: 1

Addr 136: 1

Addr 137: 1

Addr 138: 1

Addr 139: 1

Addr 140: 1

Addr 141: 1

Addr 142: 1

Addr 143: 1

Addr 144: 1

Addr 145: 1

Addr 146: 1

Addr 147: 1

Addr 148: 1

Addr 149: 1

Addr 150: 1

Addr 151: 1

Addr 152: 1

Addr 153: 1

Addr 154: 1

Addr 155: 1

Addr 156: 1

Addr 157: 1

Addr 158: 1

Addr 159: 1

Addr 160: 1

Addr 161: 1

Addr 162: 1

Addr 163: 1

Addr 164: 1

Addr 165: 1

Addr 166: 1

Addr 167: 1

Addr 168: 1

Addr 169: 1

Addr 170: 1

Addr 171: 1

Addr 172: 1

Addr 173: 1

Addr 174: 1

Addr 175: 1

Addr 176: 1

Addr 177: 1

Addr 178: 1

Addr 179: 1

Addr 180: 1

Addr 181: 1

Addr 182: 1

Addr 183: 1

Addr 184: 1

Addr 185: 1

Addr 186: 1

Addr 187: 1

Addr 188: 1

Addr 189: 1

Addr 190: 1

Addr 191: 1

Addr 192: 1

Addr 193: 1

Addr 194: 1

Addr 195: 1

Addr 196: 1

Addr 197: 1

Addr 198: 1

Addr 199: 1

Addr 200: 1

Addr 201: 1

Addr 202: 1

Addr 203: 1

Addr 204: 1

Addr 205: 1

Addr 206: 1

Addr 207: 1

Addr 208: 1

Addr 209: 1

Addr 210: 1

Addr 211: 1

Addr 212: 1

Addr 213: 1

Addr 214: 1

Addr 215: 1

Addr 216: 1

Addr 217: 1

Addr 218: 1

Addr 219: 1

Addr 220: 1

Addr 221: 1

Addr 222: 1

Addr 223: 1

Addr 224: 1

Addr 225: 1

Addr 226: 1

Addr 227: 1

Addr 228: 1

Addr 229: 1

Addr 230: 1

Addr 231: 1

Addr 232: 1

Addr 233: 1

Addr 234: 1

Addr 235: 1

Addr 236: 1

Addr 237: 1

Addr 238: 1

Addr 239: 1

Addr 240: 1

Addr 241: 1

Addr 242: 1

Addr 243: 1

Addr 244: 1

Addr 245: 1

Addr 246: 1

Addr 247: 1

Addr 248: 1

Addr 249: 1

Addr 250: 1

Addr 251: 1

Addr 252: 1

Addr 253: 1

Addr 254: 1

Addr 255: 1

Na tym schemacie kondensator C1 jest ceramiczny albo tantalowy. Czy może być tutaj błąd? Bo ja dałem elektrolit.

http://dlnmh9ip6v2uc.cloudfront.net/datasheets/BreakoutBoards/HMC5883L_Breakout-v11.pdf

Link do komentarza
Share on other sites

Elektrolit to błąd, bo ma dużo większe opory wewnętrzne i będzie wolniej reagował na gwałtowne spadki napięcia. To będzie wprowadzało tylko błędy w pomiarze, a nie będzie mieć wpływu na komunikację cyfrową z układem.

Daj jeszcze layout płytki, bo może masz złą bibliotekę?

Jutro jak będę przy moim desktopie to rzucę okiem na mój kod, jednak skoro nie wykrywa czujnika to ewidentnie wina po stronie złej kości lub lutowania. Jak potrzebujesz to mam w sprzedaży gotowy moduł z tymi czujnikami, więc mógłbyś na początek podłączyć coś sprawdzonego.

Link do komentarza
Share on other sites

Jeśli po demontażu poprzedniego i wstawieniu kolejnego wciąż nie ma komunikacji to albo naprawdę masz poważne kłopoty z lutowaniem (może opisz jak to robisz, jaki masz sprzęt) albo problem w płytce - to byłoby obecnie najszczęśliwsze rozwiązanie. Czy możesz sprawdzić (przy wyłączonym zasilaniu) połączenia między procesorem a padami szyny I2C kompasu? Może też zmierz wprost na jego nóżkach połączenia z szynami zasilania i (to bardzo ważne) z masą?

Skaner adresów to bardzo przydatna funkcja - miałem Ci zaproponować taki test a tu proszę, już są wyniki 🙂

Z przebiegów oscyloskopowych widać jak na dłoni, że 9 bit bajtu adresu (czyli ACK) nie jest przez moduł Slave ściągany do masy i zostaje w stanie 1. W takiej sytuacji wysyłanie dalszych bajtów (także niepotwierdzanych ACK) nie ma sensu i jest to jakaś ułomność tej wersji funkcji i2c_start() oraz niezgodność z protokołem ale chyba nieszkodliwa. I tak ramka prawidłowo kończy się na STOP.

Jeśli wszystkie połączenia okażą się OK, to rozwiązanie Mirka z gotowym, wlutowanym scalakiem chyba jest warte rozważenia.

Mirek: jakie są oznaczenia na Twoich układach kompasów? Może jest jakiś problem ze zgodnością typów? Honeywell to jednak dość egzotyczna jak na nasze warunki firma i nie mogę się dokopać do jej "Markings" czyli kodowych oznaczeń drukowanych na obudowach scalaków.

Link do komentarza
Share on other sites

Wcześniej miałem układ od Mirka i na innej płytce mi działał a technologii lutowania nie zmieniłem. Teraz na nowej płytce i z nowym układem mam problemy.

Może rzeczywiście jest jakiś inny scalak bo aż dziwne żeby tak milczał. Lutowałem raz na takiej lutownicy stołowej która grzeje od góry czymś dziwnym 😃 (nie gorące powietrze), a drugi układ lutował mi mój znajomy (hot air) który prowadzi serwis urządzeń elektrycznych więc się na tym zna.

Czujnik kupiłem taki:

http://pl.farnell.com/jsp/search/productdetail.jsp?SKU=1971743

PCD, trochę się różni od tej wytrawionej ale jeśli chodzi o I2C to nic nie zmieniałem. Musiałem zewrzeć piny procka, co widać na zdjęciach.

Zdjęcia płytki. Już trochę zmaltretowana ale powinna działać. A te pady których nie ma pod czujnikiem pola magnetcyznego po prostu były nieużywane i przez to, że są takie małe i nie były podłączone do żadnej ścieżki która by chociaż trochę odprowadzała ciepło odpadły podczas wielokrotnego lutowania.

Jak dostane czujnik od Mirka to wlutuję na nową płytkę wszystko.

Tutaj widzę że jest trochę inny numerek na obudowie niż ja mam.

https://dlnmh9ip6v2uc.cloudfront.net/images/products/1/0/5/3/0/10530-01c.jpg

Ja mam

L883

2132

Może w tym jest problem.

A wcześniej ten układ co działał to był właśnie z końcówką 2105

No ale to chyba chore żeby układ miał taki sam symbol i taką samą obudowę tylko różnie rozmieszczone piny.

Link do komentarza
Share on other sites

Nie bardzo mam jak to sprawdzić. Aczkolwiek na żywo wszystko wygląda dobrze, układ jest osadzony na środku, ładnie osiadł na padach więc wydaje mi się, że to nie w tym problem, tym bardziej, że to już drugi taki układ. Zamówiłem już jeden od Mirka z robodudes i zobaczymy co mi z tym czujnikiem wyjdzie.

Link do komentarza
Share on other sites

No i rozłożenie niektórych elementów wygląda na troszkę przypadkowe. Żaden z czujników nie ma prawidłowo zablokowanego zasilania a już kondensator do autokalibracji kompasu w długiej pętelce wokół dużego elektrolitu to wyczyn. Sam kompas powinien być umieszczony z dala od wszelkich innych scalaków, bo ich ażury na których montuje się struktury krzemowe nie są obojętne magnetycznie. W każdym razie nie są to na pewno przyczyny niedziałania I2C choć opóźnione efekty takiego PCB mogą być niespodziewane i ciekawe.

Oznaczenie L833 jest OK - to dobry układ. Druga linijka to zwykle kod daty i/lub miejsca produkcji.

Czy udało się dokładnie sprawdzić połączenia? Jeśi część padów już odpadła to te które zostały mogą być odłamane od ścieżki. Normalnie tego nie widać ale dobra lupa lub mikroskop, latarka i powodzenia. Napisz jeśli coś odkryjesz albo gdy coś ruszy.

Link do komentarza
Share on other sites

Moje czujniki mają oznaczenie L883, więc takie samo.

Spoglądanie na layouty po 10h pracy to jednak zły pomysł. Layout jest teoretycznie ok, chociaż od strony szumów i wpływu elementów na pomiar pola magnetycznego jest bardzo kiepski.

Wygląda na to, że problem jest z lutowaniem lub ew. z samymi układami, ale w to ostatnie aż trudno uwierzyć.

PS. Tak jak się umawialiśmy jutro mój moduł + HMC5883L pojadą do Ciebie. Przyjrzyj się jak wygląda layout mojego modułu - generalnie to co powiedział Marek, czyli dookoła magnetometru przestrzeń wolna, kondensator ceramiczny a nie elektrolityczny (jak potrzebujesz to mogę podesłać odpowiedni, ale daj jak najszybciej znać), pod tym scalakiem absolutnie nie mogą iść ścieżki i przelotki też najlepiej trzymać kilka mm dalej...

PPS. Nie narzekajcie na układy HMC. Ja z nimi nigdy nie miałem problemów. Dogadajcie się z MEMSICiem na temat czujników magnetycznych - tam to dziwactwa odchodzą.

Link do komentarza
Share on other sites

W pierwszym układzie jaki zrobiłem z tym czujnikiem tj.

Też jakoś szczególnie się z nim nie obchodziłem (w kwestii rozmieszczenia) i pomiary były stabilne i dobre więc wydaje mi się, że nie ma co przesadzać 😉. No ale macie rację, że lepiej dmuchać na zimne i przy następnej wersji wezmę wasze uwagi po uwagę 😉.

Przykładowe odczyty:

odczyty zczujnikow.pdf

Link do komentarza
Share on other sites

No to teraz mam dopiero zonka. Podłączyłem układ od Mirka i tez mi go nie wykrywa. Tak, że już nie mam pojęcia o co chodzi.

Podłączyłem jak na zdjęciach, Drdy nie jest podłączone a VDDIO zwarte Z VDD.

Dodatkowo załączam proejekt w C. Bardzo proszę o pomoc bo zależy mi mocno na czasie.

Addr 0: 1

Addr 1: 1

Addr 2: 1

Addr 3: 1

Addr 4: 1

Addr 5: 1

Addr 6: 1

Addr 7: 1

Addr 8: 1

Addr 9: 1

Addr 10: 1

Addr 11: 1

Addr 12: 1

Addr 13: 1

Addr 14: 1

Addr 15: 1

Addr 16: 1

Addr 17: 1

Addr 18: 1

Addr 19: 1

Addr 20: 1

Addr 21: 1

Addr 22: 1

Addr 23: 1

Addr 24: 1

Addr 25: 1

Addr 26: 1

Addr 27: 1

Addr 28: 1

Addr 29: 1

Addr 30: 1

Addr 31: 1

Addr 32: 1

Addr 33: 1

Addr 34: 1

Addr 35: 1

Addr 36: 1

Addr 37: 1

Addr 38: 1

Addr 39: 1

Addr 40: 1

Addr 41: 1

Addr 42: 1

Addr 43: 1

Addr 44: 1

Addr 45: 1

Addr 46: 1

Addr 47: 1

Addr 48: 1

Addr 49: 1

Addr 50: 1

Addr 51: 1

Addr 52: 1

Addr 53: 1

Addr 54: 1

Addr 55: 1

Addr 56: 1

Addr 57: 1

Addr 58: 0

Addr 59: 0

Addr 60: 1

Addr 61: 1

Addr 62: 1

Addr 63: 1

Addr 64: 1

Addr 65: 1

Addr 66: 1

Addr 67: 1

Addr 68: 1

Addr 69: 1

Addr 70: 1

Addr 71: 1

Addr 72: 1

Addr 73: 1

Addr 74: 1

Addr 75: 1

Addr 76: 1

Addr 77: 1

Addr 78: 1

Addr 79: 1

Addr 80: 1

Addr 81: 1

Addr 82: 1

Addr 83: 1

Addr 84: 1

Addr 85: 1

Addr 86: 1

Addr 87: 1

Addr 88: 1

Addr 89: 1

Addr 90: 1

Addr 91: 1

Addr 92: 1

Addr 93: 1

Addr 94: 1

Addr 95: 1

Addr 96: 1

Addr 97: 1

Addr 98: 1

Addr 99: 1

Addr 100: 1

Addr 101: 1

Addr 102: 1

Addr 103: 1

Addr 104: 1

Addr 105: 1

Addr 106: 1

Addr 107: 1

Addr 108: 1

Addr 109: 1

Addr 110: 1

Addr 111: 1

Addr 112: 1

Addr 113: 1

Addr 114: 1

Addr 115: 1

Addr 116: 1

Addr 117: 1

Addr 118: 1

Addr 119: 1

Addr 120: 1

Addr 121: 1

Addr 122: 1

Addr 123: 1

Addr 124: 1

Addr 125: 1

Addr 126: 1

Addr 127: 1

Addr 128: 1

Addr 129: 1

Addr 130: 1

Addr 131: 1

Addr 132: 1

Addr 133: 1

Addr 134: 1

Addr 135: 1

Addr 136: 1

Addr 137: 1

Addr 138: 1

Addr 139: 1

Addr 140: 1

Addr 141: 1

Addr 142: 1

Addr 143: 1

Addr 144: 1

Addr 145: 1

Addr 146: 1

Addr 147: 1

Addr 148: 1

Addr 149: 1

Addr 150: 1

Addr 151: 1

Addr 152: 1

Addr 153: 1

Addr 154: 1

Addr 155: 1

Addr 156: 1

Addr 157: 1

Addr 158: 1

Addr 159: 1

Addr 160: 1

Addr 161: 1

Addr 162: 1

Addr 163: 1

Addr 164: 1

Addr 165: 1

Addr 166: 1

Addr 167: 1

Addr 168: 1

Addr 169: 1

Addr 170: 1

Addr 171: 1

Addr 172: 1

Addr 173: 1

Addr 174: 1

Addr 175: 1

Addr 176: 1

Addr 177: 1

Addr 178: 1

Addr 179: 1

Addr 180: 1

Addr 181: 1

Addr 182: 1

Addr 183: 1

Addr 184: 1

Addr 185: 1

Addr 186: 1

Addr 187: 1

Addr 188: 1

Addr 189: 1

Addr 190: 1

Addr 191: 1

Addr 192: 1

Addr 193: 1

Addr 194: 1

Addr 195: 1

Addr 196: 1

Addr 197: 1

Addr 198: 1

Addr 199: 1

Addr 200: 1

Addr 201: 1

Addr 202: 1

Addr 203: 1

Addr 204: 1

Addr 205: 1

Addr 206: 1

Addr 207: 1

Addr 208: 1

Addr 209: 1

Addr 210: 1

Addr 211: 1

Addr 212: 1

Addr 213: 1

Addr 214: 1

Addr 215: 1

Addr 216: 1

Addr 217: 1

Addr 218: 1

Addr 219: 1

Addr 220: 1

Addr 221: 1

Addr 222: 1

Addr 223: 1

Addr 224: 1

Addr 225: 1

Addr 226: 1

Addr 227: 1

Addr 228: 1

Addr 229: 1

Addr 230: 1

Addr 231: 1

Addr 232: 1

Addr 233: 1

Addr 234: 1

Addr 235: 1

Addr 236: 1

Addr 237: 1

Addr 238: 1

Addr 239: 1

Addr 240: 1

Addr 241: 1

Addr 242: 1

Addr 243: 1

Addr 244: 1

Addr 245: 1

Addr 246: 1

Addr 247: 1

Addr 248: 1

Addr 249: 1

Addr 250: 1

Addr 251: 1

Addr 252: 1

Addr 253: 1

Addr 254: 1

Addr 255: 1

atmega32_HeadSens.zip

Link do komentarza
Share on other sites

Tak na szybko:

1. To jest kod od tego testera adresów? Bo nie widzę w nim tego miejsca, gdzie testujesz wszystkie adresy...

2. Ustawiasz poprawnie F_CPU?

W twimaster.c masz:

TWBR = ((F_CPU/SCL_CLOCK)-16)/2; /* must be > 10 for stable operation */

Jak F_CPU jest zle ustawione (np 1000000) to tutaj pojawia się duży problem, bo I2C będzie bardzo szybkie, a HMC5883L ma ograniczenie do 400KHz.

Wpisz tutaj wartość z ręki zamiast tego wzoru i zobacz co wyjdzie.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.