Hallo, ich hab ein Barometer (BMP085), das ich über I²C mit meinem Mikrocontroller (MSP430) auslesen möchte. Das Barometer liefert 2 Bytes für die Temperatur und 3 Bytes für den Druck. Im Code lese ich immer das MSB (most significant byte) und LSB (least significant byte) für die Temperatur und anschließend das MSB, LSB und XLSB (XLSB = optional Byte für den high resolution mode) für den Druck in dieser Reihenfolge aus. Lass ich mir die Daten ausgeben schaut das (in der csv.Datei) so aus: MSB-Temp, LSB-Druck, 0, MSB-Druck, LSB-Druck, \n XLSB-Temp, MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, \n XLSB-Temp, MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, \n XLSB-Temp, MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, \n XLSB-Temp, MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, \n ... Er verschiebt mir durch diese seltsame 0 mein Auslesen. Woher kommt dieser einmalige Ausrutscher? Wie ich ihn eliminieren kann ist klar, aber ich muss meinem Chef bzw. in meiner Bachelorarbeit auch erklären woher das kommt ;-) Grüße
Evtl. ist er noch nicht fertig und liefert darum eine 0. Wartest du auf das EOC Signal oder beginntst du einfach zu lesen? (Kann ja je nach Auflöung bis zu 25.5ms dauern. Siehe Datenblatt Seite 17) Sonst habe ich keine Idee dazu.
Wolfgang R. schrieb: Das... > Das Barometer liefert 2 Bytes für die Temperatur und 3 Bytes für den > Druck. > und das... > Lass ich mir die Daten ausgeben schaut das (in der csv.Datei) so aus: > MSB-Temp, LSB-Druck, 0, MSB-Druck, LSB-Druck, \n > XLSB-Temp, MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, \n > XLSB-Temp, MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, \n > XLSB-Temp, MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, \n > XLSB-Temp, MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, \n passt für mich nicht zusammen.
Wolfgang R. schrieb: > Lass ich mir die Daten ausgeben schaut das (in der csv.Datei) so aus: > MSB-Temp, LSB-Druck, 0, MSB-Druck, LSB-Druck, \n > XLSB-Temp, MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, \n > XLSB-Temp, MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, \n > XLSB-Temp, MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, \n > XLSB-Temp, MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, \n > ... Hä? Die Datei sieht so aus, wie du sie rausschreibst. Du liest 5 Byte vom IC, du schreibst 5 Werte in die Datei. Wenn deine Datei anders aussieht und die Werte durcheinand gewürfelt sind, dann hast du ganz banal einen Fehler in der Ausgaberoutine.
Oh man... da hab ich mich jetzt auch noch verschrieben -.- MSB-Temp, LSB-Temp, 0, MSB-Druck, LSB-Druck, \n XLSB-Druck, MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, \n XLSB-Druck, MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, \n XLSB-Druck, MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, \n XLSB-Druck, MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, \n ... So ist es natürlich! Und so soll es sein: MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, XLSB-Druck, \n MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, XLSB-Druck, \n MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, XLSB-Druck, \n MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, XLSB-Druck, \n MSB-Temp, LSB-Temp, MSB-Druck, LSB-Druck, XLSB-Druck, \n ... @Werner B. Das Warten von 25.5 ms (oss = 3) beim Druck und 4.5 ms bei der Temperatur halte ich natürlich ein. Da alles in einer Schleife drin ist müsste jeder Fehler erneut auftauchen. Die 0 kommt aber nur einmal ganz am Anfang. @Karl Heinz Buchegger Wenn ich dich richtig verstehe meinst du, dass ich z.B. meine Variablen, in denen ich die Werte auf dem MSP zwischenspeicher, in der falschen Reihenfolge in die Datei schreibe oder dass ich einfach das MSB-Temp als XLSB-Druck abspeicher. Das ist natürlich am naheliegesten und hab ich auch schon zigmal überprüft, aber da ist kein Fehler. Ansonsten wären die ersten beiden Werte ja auch schon falsch.
Um den Thread abzuschließen: Der Fehler lag im auslesen des Multireads. So hatte ich es: write() wait() start_read() MSB = get_value() LSB = get_value() stop_read() So soll es sein: write() wait() start_read() MSB = get_value() stop_read() LSB = get_value() Nach dem "Stop-Generieren" wird vom Slave also vom Barometer noch ein Byte gesendet. Deswegen muss der Stop vor dem letzten Byte, das man auslesen möchte, gesendet werden. Grüße und danke für die Hilfe
Hi >Nach dem "Stop-Generieren" wird vom Slave also vom Barometer noch ein >Byte gesendet. Deswegen muss der Stop vor dem letzten Byte, das man >auslesen möchte, gesendet werden. Nicht ganz. Nicht dein Barometer sendet keine weitere Bytes, sondern dein Controller liest weiter. Beim Lesen muss der Controller das letzte Byte nicht wie üblich mit ACK sondern mit NACK bestätigen. Und genau das wird, incl. Stopbedingung generieren, wird das stop_read() machen. MfG Spess
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.