Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Beschleunigungssensor über I2C auslesen Kategorie: I²C-Bus (von Jörg - 18.12.2010 18:07)
Als Antwort auf Re: Beschleunigungssensor über I2C auslesen von Tim - 18.12.2010 14:22

> > > > > > > Hallo,
> > > > > > >
> > > > > > > ich beschäftige mich seit kurzer Zeit mit dem Programmieren.
> > > > > > > Nun versuche ich schon seit Tagen einen Beschleunigungssenor (BMA150) über I2C auszulesen.
> > > > > > > Mit Hilfe dieses und anderen Foren konnte ich mir diesen Code erstellen:
> > > > > > >
> > > > > > > void main(void)
> > > > > > > {
> > > > > > >
> > > > > > >
> > > > > > >     word adresse;
> > > > > > >     adresse=0x02;
> > > > > > >
> > > > > > >     int             x_long,y_long,z_long;
> > > > > > >     unsigned int    x_short,y_short,z_short;
> > > > > > >     float           x,y,z;
> > > > > > >
> > > > > > >     I2C_Init(I2C_100kHz);
> > > > > > >
> > > > > > >     I2C_Start();
> > > > > > >     I2C_Write(0x70);
> > > > > > >     I2C_Write(adresse);
> > > > > > >     I2C_Stop();
> > > > > > >
> > > > > > >     I2C_Start();
> > > > > > >     I2C_Write(0x71);
> > > > > > >
> > > > > > >     x_short=I2C_Read_ACK();
> > > > > > >     x_long=I2C_Read_ACK();
> > > > > > >
> > > > > > >     x_long=(((x_long)*4)+(x_short/64));
> > > > > > >
> > > > > > >         if (x_long > 512)
> > > > > > >         {
> > > > > > >             x_long= (x_long - 512);
> > > > > > >             x_long= (512 - x_long);
> > > > > > >             x_long= (x_long*(-1));
> > > > > > >
> > > > > > >             x= (x_long * 0.00390625);
> > > > > > >         }
> > > > > > >          else
> > > > > > >         {
> > > > > > >             x= (x_long * 0.00390625);
> > > > > > >         }
> > > > > > >
> > > > > > >     y_short=I2C_Read_ACK();
> > > > > > >     y_long=I2C_Read_ACK();
> > > > > > >
> > > > > > >     y_long=(((y_long)*4)+(y_short/64));
> > > > > > >
> > > > > > >          if (y_long > 512)
> > > > > > >          {
> > > > > > >               y_long= (y_long - 512);
> > > > > > >               y_long= (512 - y_long);
> > > > > > >               y_long= (y_long*(-1));
> > > > > > >
> > > > > > >               y= (y_long * 0.00390625);
> > > > > > >          }
> > > > > > >          else
> > > > > > >          {
> > > > > > >               y= (y_long * 0.00390625);
> > > > > > >          }
> > > > > > >
> > > > > > >
> > > > > > >     z_short=I2C_Read_ACK();
> > > > > > >     z_long=I2C_Read_NACK();
> > > > > > >
> > > > > > >     z_long=(((z_long)*4)+(z_short/64));
> > > > > > >
> > > > > > >          if (z_long > 512)
> > > > > > >         {
> > > > > > >               z_long= (z_long - 512);
> > > > > > >               z_long= (512 - z_long);
> > > > > > >               z_long= (z_long*(-1));
> > > > > > >
> > > > > > >               z= (z_long *0.00390625);
> > > > > > >         }
> > > > > > >         else
> > > > > > >         {
> > > > > > >               z= (z_long *0.00390625);
> > > > > > >         }
> > > > > > >
> > > > > > >     I2C_Stop();
> > > > > > >
> > > > > > >
> > > > > > >     Msg_WriteFloat(x);
> > > > > > >     Msg_WriteChar(13);
> > > > > > >
> > > > > > >     Msg_WriteFloat(y);
> > > > > > >     Msg_WriteChar(13);
> > > > > > >
> > > > > > >     Msg_WriteFloat(z);
> > > > > > >     Msg_WriteChar(13);
> > > > > > > }
> > > > > > >
> > > > > > > Leider gibt mir das C-Control Programm für x, y und z nur 0.00000 heraus.
> > > Also kann irgendetwas nicht stimmen.
> > > > > > >
> > > > > > > Hat mir jemand einen Tipp?
> > > > > > >
> > > > > > > Danke schonmal für die Mühe.
> > > > > > >
> > > > > > > GruÃ? Tim
> > > > > >
> > > > > > Hallo Tim,
> > > > > >
> > > > > > hat der I2C Pull Ab's???
> > > > > > ich würde mal nach jedem i2C Befehl den I2C_Status ausgeben und mit der Tabelle vergleichen.
> > > > > >
> > > > > > GrueÃ?e Joerg
> > > > >
> > > > > Hallo Joerg,
> > > > >
> > > > > danke für die Schnelle Antwort.
> > > > > Ich verwende die Pull-Up Widerstände des Projectboards Pro32. Diese wurden mit Hilfe von 2 Jumpern gesetzt.
> > > > > Die I2C-Status Ausgabe nach jedem I2C-Befehl zeigt immer nur "00F8" an.
> > > In diesem Forum bin ich auch einen *Fred* gestoÃ?en,
> > > > > in dem jemand die gleiche Ausgaben bekommt. Er hatte wohl die Pull-Ups vergessen.
> > > > >
> > > > > Da ich die Pull-Ups des Projectboards gejumpert habe, gehe ich davon aus, dass es nicht daran liegen kann.
> > > > > Oder muss man die Pull-Up Widerstände des Projectboards eventuell "aktivieren"?
> > > > >
> > > > > GruÃ? Tim
> > > >
> > > > Hallo Tim,
> > > >
> > > > den Status Code 0xF8 gibt es doch gar nicht oder?
> > > > Kommt dieser Wert auch nach I2C_Start();  ???
> > > >
> > > > GrueÃ?e Joerg
> > >
> > >
> > > Hallo Joerg,
> > >
> > > den Code "00F8" gibt es nicht in der Statustabelle.
> > > Aber es scheint, dass andere damit das auch schon ausgelesen bekommen haben.
> > > Dieser Code kommt bei allen I2C-Befehlen, also auch bei I2C_Start().
> > >
> > > Habe heute festgestellt, dass mein BMA150 nicht richtig angelötet wurde.
> > > Hab das dann mit einem anderen BMA150 getestet. Mit dem funktieniert das Programm einwandfrei.
> > > Lag wahrscheinlich alles nur am falsch verlöteten Beschleunigungssensor.
> > >
> > > Danke dir, Joerg, für die Hilfe.
> > >
> > > GruÃ? Tim
> >
> > Hallo Tim,
> >
> > ich habe da noch einmal ein eine andere Frage:
> >
> > In dem Datenbaltt des BMA150 steht, das man die IO's mit maximal 3,6V betreiben darf.
> > Wie hast Du die Daten und Clockleitung an den BMA150 angeschlosen?
> >
> > GrueÃ?e Joerg
> >
>
> Hallo Joerg,
>
> ich habe die Datenleitung und die Clockleitung mit Hilfe eines Levelshifters an den BMA150 angeschlossen.
> Im Anhang findest du einen Schaltplan.
>
> GruÃ? Tim

Hallo Tim,

vielen Dank für die Info.

GrueÃ?e Joerg


    Antwort schreiben


Antworten: