I²C - ein Byte zu viel

OP #2749715
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
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.
OP
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.
OP
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.