Forum: Mikrocontroller und Digitale Elektronik BMP085 brauche Hilfe bei C Pseudocode


von Norbert S. (norberts)


Lesenswert?

Moin,

ich möchte den Drucksensor BMP085 auslesen und das Datenblatt ist etwas 
knapp bzw. kapier ich ein Detail nicht sicher, u.a. auch weil ich kein C 
kann und die Beschreibung basiert teilweise auf C-Pseudocode.
Da die Auswertung schweinekompliziert ist, (11 Calibrier-Words), dürfte 
Ausprobieren sehr schwierig werden.
Also, zum Messen des Drucks gibt es 4 Befehle, die jeweils sagen, wie 
oft gesamplet werden soll.
Dazu gibt es eine Variable osrs, die 0...3 sein kann, was jeweils 1, 2, 
4 und 8 Samples entspricht, die Befehle dazu sind 0x34, 0x74, 0xB4 und 
0xF4.
Offensichtlich ist osrs in den oberen Bits 5, 6 und 7 des Lesebefehls.
Zum Lesen steht da:
write 0x34+(osrs<<6)
Wie gesagt, C kann ich nicht aber ich vermute, osrs<<6 bedeutet, osrs 
von links um 6 Stellen reinschieben? Also um eine 1 an Bit 2 (0000 0100) 
zu schreiben würde es heissen 1<<3, richtig?
Während ich das hier beschreibe, fange ich fast an, es zu kapieren...
Dann liest man das MSB, LSB und das XLSB für die erweiterte Auflösung 
und das Ergebnis soll man sich so zusammenbauen:
UP = (MSB<<16 + LSB<<8 + XLSB) >> (8-osrs)
Wenn ich das richtig verstehe, wäre also das Ergebnis bei einem Sample 
bzw. osrs=0 z.B. so, "A" sind meine Bits, X werden nach rechts 
rausgeschoben:
&B AAAA AAAA AAAA AAAA XXXX XXXX
Ich schiebe 8 Stellen nach rechts und habe mein Ergebnis:
&B AAAA AAAA AAAA AAAA

Bei osrs=3 wäre es:
&B AAAA AAAA AAAA AAAA AAAX XXXX
5 Stellen nach rechts und ich bekomme
&B AAA AAAA AAAA AAAA AAAA

Haut das so hin?

In der Berechnung tauchen dann noch die Ausdrücke (50000>>osrs) und 
(blabla)<<osrs auf.
Sehe ich richtig, daß das "Schieben um osrs Stellen bedeutet?
Also X>>2 ist X/4 und X<<3 wäre X*8?

Falls einer sich tatsächlich die Mühe macht ins Datenblatt zu schauen: 
Da ist mal die Rede von osrs und mal von oss. Ich gehe davon aus, daß 
das ein Fehler ist und damit das Gleiche gemeint ist.

Bin für jeden Tipp dankbar, ausser, daß ich mir ein C-Buch kaufen solle 
;-)

Das Ganze wird übrigens eine Navigationshilfe für einen Quadrocopter.
Ich habe ein KK2.0 Board (sowas zu programmieren tue ich mir nicht an 
und das funktioniert prima) und klinke mich mit meinem ATMega324 
zwischen Empfänger und KK2.0-Board ein.
Ein Heading-Lock mittels Kompass funktioniert schon.

Gruß,
Norbert

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Norbert S. schrieb:
> Also um eine 1 an Bit 2 (0000 0100) zu schreiben würde es heissen 1<<3,
> richtig?

Nein.

Um aus 0001 den Wert 0100 zu gewinnen, muss man zweimal schieben, 
nicht dreimal.

von Jim M. (turboj)


Lesenswert?

Norbert S. schrieb:
> Also um eine 1 an Bit 2 (0000 0100)
> zu schreiben würde es heissen 1<<3, richtig?

Nope. 1<<3 ist 8 (0x10 oder 0b00001000). Es ist "eins, dreimal nach 
links geschoben".

Installier Dir auf Deinem PC mal einen C-Compiler und mach ein paar 
eigene Experimente - oder kauf Dir ein C-Buch. Siehe auch 
Bitmanipulation.

Vorsicht: int auf dem PC ist 32 Bit, auf AVR nur 16 Bit.

von Norbert S. (norberts)


Lesenswert?

Hi,

ok, so wie ihr es schreibt hätte ich es auch gedacht, macht ja Sinn.
Das passt aber nicht mit dem Datenblatt:

Dazu gibt es eine Variable osrs, die 0...3 sein kann, was jeweils 1, 2,
4 und 8 Samples entspricht, die Befehle dazu sind 0x34, 0x74, 0xB4 und
0xF4.
Offensichtlich ist osrs in den oberen Bits 5, 6 und 7 des Lesebefehls.
Zum Lesen steht da:
write 0x34+(osrs<<6)

Das müsste doch dann write 0x34+(osrs<<5) sein, oder?
osrs ist meinetwegen 2 oder 0000 0010 und soll an 0100 0000 verschoben 
werden. Das müsste doch <<5 sein?

Waaaaa - vedammt!
Ich hab den Denkfehler gefunden.
osrs ist nur 2 bit groß, verschiebt das Ergebnis aber um maximal 3 bit.

Ich lass den Quatsch oben jetzt stehen, damit Andere das vielleicht 
später nachvollziehen können.

Gruß,
Norbert

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.