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
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
> 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
Hallo... Wäre es möglich, dass du den Code postest oder ihn mir schickst? Gruß, Sascha
Hallo .... Ich wäre am Code auch sehr interessiert, da ich ähnliche Probleme festgesgtellt habe. Dank und Grüsse
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
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.
Hallo, ich wäre auch an dem Code interresiert. Hab auch Probleme mit dem Modul. MfG Tom
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
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
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.
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..
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
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).
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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.