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: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum