Forum: Mikrocontroller und Digitale Elektronik I²C - ein Byte zu viel


von Wolfgang R. (eg61ejub)


Lesenswert?

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

von Werner B. (werner-b)


Lesenswert?

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.

von Ron (Gast)


Lesenswert?


von Daniel V. (danvet)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Wolfgang R. (eg61ejub)


Lesenswert?

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.

von Wolfgang R. (eg61ejub)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.