mikrocontroller.net

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


Autor: gpsklaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gpsklaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha Markwardt (Firma: Privat) (sascha90)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo...

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

Gruß,
Sascha

Autor: Thomas Riesen (gastrodus)
Datum:

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

Autor: Norbert S. (norberts)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Manfred S. (Firma: Manfred) (xfred343)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom Z. (tom_z)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

MfG Tom

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur mal so am Rande. Warum benutzt eigentlich niemand MAKEINT?

Autor: Norbert S. (norberts)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Manfred S. (Firma: Manfred) (xfred343)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Norbert S. (norberts)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Manfred S. (Firma: Manfred) (xfred343)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Norbert S. (norberts)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Weingut Pfalz (weinbauer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Riesen (gastrodus)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.