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 Joerg - 17.12.2010 7:32)
Als Antwort auf Re: Beschleunigungssensor über I2C auslesen von Tim - 16.12.2010 19:32
Ich nutze:
C-Control Pro Mega128
> > > > > 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



    Antwort schreiben


Antworten:

Re: Beschleunigungssensor über I2C auslesen (von Tim - 18.12.2010 14:22)
    Re: Beschleunigungssensor über I2C auslesen (von Jörg - 18.12.2010 18:07)