připojení HMC6352 kompasu po i2c

Zdravím,

snažím se připojit tento kompas přes i2C ke kontroleru at89c51ed2. Tento kontroler nemá i2C rozhranní, takže sem si stáhnul knihovnu pro softwarové i2C.

Po chvilce laborování se mi podařilo dostat z kompasu data. Problém je že kompas vrací data ve dvou po sobě jdoucích bytech. Ten první se však vůbec nemění.

MSB je vždy 0x09 (1001 binarne)
LSB uz je v poradku a meni se s natocenim kompasu

Netusi nekdo kde by mohla byt chyba? Datasheet je tady:

ssec.honeywell.com/magnetic/ … MC6352.pdf

V kodu mam pouzitou dostatecnou pauzu mezi zapisem prikazu pro cteni a samotnym ctenim (v datasheetu je uvedeno 6 ms)

Takhle vypada kod:

[code] stat=1;
lcd_command(0x01); //vymaz displej
start();
if(write(0x42)!= ACK ) { //adresa kompasu
stat=0;
}
if(write(0x41)!= ACK ) {//prikaz A
stat=0;
}

stop();
lcd_wait(); //pockej minimalne 6 ms

start();
if(write(0x43)!= ACK ) {//prikaz pro cteni
 	stat=0;
}	
if(stat==1){
	i=read(0);
	lcd_gotoxy(1,2);
	p=read(1);
}
else{
	 lcd_sendstring("Chyba cteni kompasu");
}
    stop();

[/code]

Takhle vypada knihovna i2c

[code]/* I2C functions */

void start()
{
/* I2C START condition */
SCL = SDA = HIGH;
nop();
SDA = LOW;
nop();
SCL = LOW;
}

void stop()
{
/* I2C STOP condition */
SDA = LOW;
SCL = HIGH;
nop();
SDA = HIGH;
nop();
SCL = LOW;
}

unsigned char clock()
{
/* A subroutine to generate a clock pulse and return the
* status of the data bus during the clock period /
unsigned char status = 0;
SCL = HIGH;
nop();
while(!SCL); /
eliminate ripples */
status = SDA;
SCL = LOW;
return (status);
}

unsigned char write(unsigned char byte)
{
/* I2C WRITE operation, Write a byte on SDA and return the
* acknowledgement */
unsigned char mask = 0x80;
unsigned char status= ACK;

for ( ; mask > 0 ;  ) {
	SDA = (byte & mask) ? ( 1 ):( 0 ) ;
	mask >>= 1;
	clock();
}
return (clock());	/* return the status of SDA line on
			 * the 9th pulse */

}

unsigned char read(unsigned char status)
{
/* I2C READ operation, read one byte from the transmitter and
* give ack/nack to it /
unsigned char byte = 0;
unsigned char count, level = 0;
SDA = HIGH; /
configure SDA as input /
for ( count = 0; count < 8; count++ ) {
byte <<= 1;
level = clock();
if(level==0){
lcd_sendstring(“0”);
}
else{
lcd_sendstring(“1”);
}
byte |= level;
}
SDA = status; /
status = 1 :- NACK
* status = 0 :- ACK */
clock();
return byte;
}[/code]

Diky vsem za pomoc nebo cim by to mohlo byt

:arrow_right: administrator: přesunuto z "Elektronika s mikrokontroléry, procesory"

Tak si odpovím sám, dnes jsem na to konečně přišel. Zkoušel jsem měnit módy přenosu, obnovovací frekvence a samé kraviny. Dnes jsem kompas vzal vyndal z nepajiveho pole pripojil ke kabelu a dal dal od nepajiveho pole, hle, hodnoty se menili krasne podle natoceni na svetovou stranu. Takze to zrejme bylo tim ze nepajive pole je primontovane na kovovou desku a ta ovlivnovala jeho magneticke pole.

Takze pro ostatni je to opravdu citlive na veskere ruseni, takze pozor.