Forum: Mikrocontroller und Digitale Elektronik Drucksensor HP03 und Bascom-AVR


von gpsklaus (Gast)


Lesenswert?

Hallo,
ich habe mit dem Hope Drucksensor HP03 etwas experimentiert und dafür 
ein Programm in Bascom-AVR geschrieben.
Nach einigen Anlaufschwierigkeiten liessen sich die Kalibrierdaten 
auslesen und auch der Zugriff auf die Luftdruck- und Temperaturdaten 
klappt grundsätzlich.
Während der Rohwert der Luftdruckdaten (D1) mit etwa 30000 im 
erwartbaren Bereich liegt, sind die Werte meiner ausgelesenen 
Roh-Temperaturwerte (D2) mit ca. 36000 m.E. viel zu hoch. Im Beispiel 
des Datenblatts liegen sie bei 4100 und bei anderen Nutzern ( die mit 
einem völlig anderen Prozessorsystem unter Verwendung auch einer anderen 
Programmiersprache arbeiten ) lagen sie auch im Bereich zwischen etwa 
3000 und 8000.
Bei unzähligen Versuchen habe ich dann irgendwann festgestellt, dass ich 
"vernünftige" Temperatur- und Luftdruckwerte erhielt, wenn ich vom 
ermittelten D2-Wert den Betrag 32768 abzog und damit in eine 
Größenordnung von etwa 3000 kam!
Jetzt kann ich mit dem System zwar irgenwie arbeiten, aber es ist 
natürlich hochgradig unbefriedigend nicht zu wissen, warum die 
abgefragten D2-Werte so danebenliegen. Hat dazu vielleicht Jemand eine 
Idee?

Klaus

Anbei noch die Befehlsfolge, die ich zum Abruf der D2-Temperaturrohdaten 
verwende:
'hole Rohdaten Temperatur
'----------------------------------------------------------------------- 
---
Portd.7 = 1  'hierueber steuere ich XCLR
Waitms 50
I2cstart
I2cwbyte &HEE
I2cwbyte &HFF
I2cwbyte &HE8
I2cstop
Waitms 50
I2cstart
I2cwbyte &HEE
I2cwbyte &HFD
I2cstart
I2cwbyte &HEF
I2crbyte Hi , Ack
I2crbyte Lo , Nack
I2cstop
Portd.7 = 0
Hi = Hi * 256
D2 = Hi + Lo

'Hi, Lo und D2 wurden vorher als "Long" dimensioniert

von spess53 (Gast)


Lesenswert?

Hi

>...ermittelten D2-Wert den Betrag 32768 abzog...

Damit löscht du das höherwertigste Bit eines 16-Bit Wertes. Bei einem 
16-Bit Integer ist das das Vorzeichen. Kann es sein das da irgend etwas 
mit vorzeichenlosen und vorzeichenbehafteten Werten 
durcheinandergekommen ist?

MfG Spess

von gpsklaus (Gast)


Lesenswert?

> Kann es sein das da irgend etwas mit vorzeichenlosen und
> vorzeichenbehafteten Werten durcheinandergekommen ist?

So etwas Ähnliches hatte ich auch schon vermutet. Versuchsweise habe ich 
daraufhin die zum Auslesen benutzen Variablen nur noch als "Word" 
deklariert und schliesse damit negative Vorzeichen aus. An dem Ergebnis 
hat das aber leider auch nichts geändert.
Viel mehr als zuerst das MSB auszulesen, es mit 256 zu multiplizieren, 
danach das LSB auszulesen und Beides zu addieren kann man doch nicht 
machen, zumal das Ganze bei den Luftdruckwerten so auch einwandfrei 
klappt!

Klaus

von Sascha M. (Firma: Privat) (sascha90)


Lesenswert?

Hallo...

Wäre es möglich, dass du den Code postest oder ihn mir schickst?

Gruß,
Sascha

von Thomas R. (gastrodus)


Lesenswert?

Hallo ....
Ich wäre am Code auch sehr interessiert, da ich ähnliche Probleme 
festgesgtellt habe.
Dank und Grüsse

von Norbert S. (norberts)


Lesenswert?

Hi,

die Werte kommen vermutlich als Integer mit Vorzeichen (so wie das in 
Bascom dimensioniert ist).
Mach mal:

Dim Hi as Integer
Dim Lo as Byte
Dim D2 as Integer

nach dem Auslesen:
Shift Hi , Left , 8
D2 = Hi + Lo

Das müsste dann tun.

Edit:
Im Datenblatt müsste irgendwo was von Zweierkomplement stehen, das ist 
das Stichwort für den Hintergrund.

Gruß,
Norbert

von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

gpsklaus schrieb:
> I2crbyte Hi , Ack
> I2crbyte Lo , Nack
> I2cstop
> Portd.7 = 0
> Hi = Hi * 256
> D2 = Hi + Lo
>
> 'Hi, Lo und D2 wurden vorher als "Long" dimensioniert

Was soll das eigentlich?
Wenn Hi als Long definiert ist, dann ist es eine 4 Byte Zahl (mit 
Vorzeichen) und "eigener Speicherlogik".

Es ist schlicht unzulässig, 1 Byte in eine Long-Variable einzulesen 
(hatte ich auch einmal, hatte der Long-Variablen 24 zugewiesen und im 1. 
Byte steht 96). Nimm doch Hi1 und Lo1 als Byte definiert und lese die 
mit I2crbyte ein, dann kannst du: Hi=Hi1*256 und D2=Hi1+lo1 berechnen.

von Tom Z. (tom_z)


Lesenswert?

Hallo,

ich wäre auch an dem Code interresiert. Hab auch Probleme mit dem Modul.

MfG Tom

von Karl (Gast)


Lesenswert?

Nur mal so am Rande. Warum benutzt eigentlich niemand MAKEINT?

von Norbert S. (norberts)


Lesenswert?

Karl schrieb:
> Nur mal so am Rande. Warum benutzt eigentlich niemand MAKEINT?

Das sollte eigentlich egal sein in diesem Fall.
Auch mit Integer oder Single müsste das funktionieren, da sich alles 
weit weg vom Vorzeichenbit abspielen sollte.

Lies doch mal die Bytes separat aus (als Byte) und lass sie anzeigen.
Ich glaube jetzt nicht mehr, daß es an den Variablen liegt denn wie 
gesagt, das müsste mit auch mit Integer oder Long funktionieren wenn da 
nix negatives bei ist.

Gruß,
Norbert

von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

Norbert S. schrieb:
> Karl schrieb:
>> Nur mal so am Rande. Warum benutzt eigentlich niemand MAKEINT?
>
> Das sollte eigentlich egal sein in diesem Fall.
> Auch mit Integer oder Single müsste das funktionieren, da sich alles
> weit weg vom Vorzeichenbit abspielen sollte.

Eben nicht, wenn ich ein Byte in eine Long-Variable einlese, dann wird 
die in das Byte1 der Long-Variablen gelesen, die Long-Variable wird aber 
anders gespeichert. Also wenn ich x=24 sage, steht z.B. in der 
Long-Variablen x im Byte 1 der Wert 96. Also unbedingt Bytes in 
Byte-Variablen einlesen.
>
> Lies doch mal die Bytes separat aus (als Byte) und lass sie anzeigen.
Eine gute Idee

von Norbert S. (norberts)


Lesenswert?

Manfred S. schrieb:
> Eben nicht, wenn ich ein Byte in eine Long-Variable einlese, dann wird
> die in das Byte1 der Long-Variablen gelesen, die Long-Variable wird aber
> anders gespeichert. Also wenn ich x=24 sage, steht z.B. in der
> Long-Variablen x im Byte 1 der Wert 96. Also unbedingt Bytes in
> Byte-Variablen einlesen.

Nö, siehe Simulation.

von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

Norbert S. schrieb:
> Manfred S. schrieb:
>> Eben nicht, wenn ich ein Byte in eine Long-Variable einlese, dann wird
>> die in das Byte1 der Long-Variablen gelesen, die Long-Variable wird aber
>> anders gespeichert. Also wenn ich x=24 sage, steht z.B. in der
>> Long-Variablen x im Byte 1 der Wert 96. Also unbedingt Bytes in
>> Byte-Variablen einlesen.
>
> Nö, siehe Simulation.

Ausprobieren, bei i2crbyte bin ich mir sicher, dass er nicht die ganze 
Long-Variable bedienen kann, sondern nur das Byte0 mit Daten versorgt. 
Was dann, wenn vorher in den anderen 3 Bytes schon was drinnen gestanden 
ist (z.B. aus der Multiplikation in der Schleife) -  Warum also nicht 
(sicherheitshalber) Byte-Variablen zum Einlesen verwenden. Hab selbst 
leidvoll erfahren müssen, dass implizite Typkonvertierungen in Bascom 
immer zu schleierhaften Fehlern führen..

von Norbert S. (norberts)


Lesenswert?

Hi,

Manfred S. schrieb:
> Ausprobieren, bei i2crbyte bin ich mir sicher, dass er nicht die ganze
> Long-Variable bedienen kann, sondern nur das Byte0 mit Daten versorgt.
> Was dann, wenn vorher in den anderen 3 Bytes schon was drinnen gestanden
> ist (z.B. aus der Multiplikation in der Schleife)

Linke Nummer wenn das so ist.
Bei einer einfachen Zuweisung wie
Long = Byte
wird alles in der Long überschrieben.
Kann natürlich sein, daß das bei I2crbyte nicht so ist.

Also müsste mit Sicherheit das hier gehen:

Dim Hi as Byte
Dim Lo as Byte
Dim D2 as Integer

nach dem Auslesen:
D2 = Hi
Shift D2 , Left , 8
D2 = D2 + Lo

Gruß,
Norbert

von Karl (Gast)


Lesenswert?

Bei Pollin gibt es eine recht umfangreiche Dokumentation. Unter anderem 
folgenden Hinweis:

"Setzen Sie Pin XCLR auf low bevor Sie die Koeffizienten auslesen, 
andernfalls können die ausgelesenen Daten
fehlerhaft sein."

Liegt es evtl. daran?

Die Prozedur zum Auslesen der Druckdaten und Temperaturdaten sieht 
gleich aus (siehe Programmbeispiel in der Dokumentation).

von Weingut P. (weinbauer)


Lesenswert?

noch ein tip ... das geshifte und addieren kann man sich komplett 
schenken
durch Overlayvariablen.
Dann stehen die bytes gleich da wo sie hin gehören.


Dim D2 as Integer
Dim Hi as Byte at D2 overlay
Dim Lo as Byte at D2+1 overlay

Portd.7 = 1  'hierueber steuere ich XCLR
Waitms 50
I2cstart
I2cwbyte &HEE
I2cwbyte &HFF
I2cwbyte &HE8
I2cstop
Waitms 50
I2cstart
I2cwbyte &HEE
I2cwbyte &HFD
I2cstart
I2cwbyte &HEF
I2crbyte Hi , Ack
I2crbyte Lo , Nack
I2cstop
Portd.7 = 0

von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe mir den Sensor kürzlich gekauft und ihn unter BASCOM zum laufen 
bekommen. Das Programm gibt momentan die Temperatur und den 
physikalischen Luftdruck über die serielle Schnittstelle aus. Vielleicht 
hilft es Euch ja weiter.

von Thomas R. (gastrodus)


Lesenswert?

Hallo Sebastian

Leider bist du nur als Gast angemeldet. Dein Code sieht ja super aus.
Wie ich sehe, hast du sogar den 32K Quarz per Software emuliert. Ich
hätte aber dennoch Fragen, könntest du dich mal bei mir melden?

Ich wollte das Ganze auf einem ATmega8 laufen lassen, aber das
scheint nicht zu klappen, das Programm wird gar nicht ausgeführt...

Viele Grüsse
Thomas

von Sebastian (Gast)


Lesenswert?

Hallo Thomas,

was genau funktioniert denn nicht?

Ein paar Zeilen vom Code solltest natürlich anpassen, insbesondere:

$crystal = 16000000

Dann kannst Du noch $lib "i2c_twi.lbx" auskommentieren und die 
Geschwindigkeit der TWI (I2C) Schnittelle mit TWI=xxxx beeinflussen.

Den Timer solltest Du natürlich auf den Quarz anpassen.

$hwstack = 64
$swstack = 64
$framesize = 64

habe ich nur auf verdacht gesetzt. Vielleicht ist das der Grund.

Bei avr-praxis habe ich einen Diskussionsbeitrag darüber eröffnet.

Viele Grüße,
Sebastian

von Sebastian (Gast)


Lesenswert?

Da ich gerade ATmega8 lese. Der Sensor ist für max 3.6 V ausgelegt.

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.