forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

 
připojení HMC6352 kompasu po i2c

 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> 8051 / 8052
 
doktor.rakev
Častý přispěvatel
Častý přispěvatel


Založen: 23.3.2010
Příspěvky: 37

PříspěvekZaslal: 09 srpen 2010, 10:20    Předmět: připojení HMC6352 kompasu po i2c Citovat

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:

http://www.ssec.honeywell.com/magnetic/datasheets/HMC6352.pdf

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


Takhle vypada kod:

kód:
    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();


Takhle vypada knihovna i2c




kód:
/* 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;
}


Diky vsem za pomoc nebo cim by to mohlo byt

Arrow administrator: přesunuto z "Elektronika s mikrokontroléry, procesory"
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
doktor.rakev
Častý přispěvatel
Častý přispěvatel


Založen: 23.3.2010
Příspěvky: 37

PříspěvekZaslal: 20 srpen 2010, 10:46    Předmět: kompas Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> 8051 / 8052 Časy uváděny v GMT + 2 hodiny
 
Strana 1 z 1
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2017 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)