Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > > > > > > > > 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