Re: Beschleunigungssensor über I2C auslesen Kategorie: I²C-Bus (von Tim - 16.12.2010 19:32) | |
Als Antwort auf Re: Beschleunigungssensor über I2C auslesen von Joerg - 16.12.2010 13:32
| |
> > > > 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 | |
Antwort schreiben Antworten: ![]() ![]() ![]() ![]() |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum