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
administrator: přesunuto z "Elektronika s mikrokontroléry, procesory"