Forum: Mikrocontroller und Digitale Elektronik Luftdruck-Modul HP03S mit Atmega8


von Matthias (Gast)


Lesenswert?

Hallo,

Ich stehe vor einigen Problen mit diesem Modul.

Auf MCLK liegt die benötigte Frequenz an und XCLR ist lt Datenblatt 
richtig gesetz.

Ich kann alles aus dem EEPROM auslesen.

Aber mit dem ADC funkts nicht.

Hab schon einiges versucht und alles mit einem Logic Analyser mit 
beobachtet.

Es gibt auch zwei verschiedene Datenblätter/Beschreibungen, da sind die 
Timing-Sequenzen für die Messung jeweils anders beschrieben.
Einmal soll beim senden an den Slave das ACK vom Master kommen??????
Beim zweiten soll korrekterweise das ACK von  Slave kommen, tut es aber 
nicht.

Hat schon jemand mit diesem Modul gearbeitet, der mir einen 
funktionierendes Prog. zur fehlersuchen geben kann.
Vorzugsweise in Assembler, C ist auch OK.

mfg
Matthias

von Steffen H. (avrsteffen)


Lesenswert?


von Matthias (Gast)


Lesenswert?

Danke,

leider geht er nirgens genauer auf dieses HP03S Modul ein ....

mfg
Matthias

von Steffen H. (avrsteffen)


Lesenswert?

Matthias schrieb:
> Es gibt auch zwei verschiedene Datenblätter/Beschreibungen, da sind die
> Timing-Sequenzen für die Messung jeweils anders beschrieben.
> Einmal soll beim senden an den Slave das ACK vom Master kommen??????
> Beim zweiten soll korrekterweise das ACK von  Slave kommen, tut es aber
> nicht.

Also zweiteres ist wohl richtig. Auf Adresse und einen Write antwortet 
immer der Slave. Wenn es ein richtiges I2C Interface ist (was ich 
bezweifle) kann der Slave auch den SCL auf LOW halten (verzögern) bevor 
er ACK/NACK gibt. Sowas würd ich mal noch mit abfragen. Also wenn man 
den SCL wieder hochohmig macht (weil pullup gegen Vcc) mal den SCL 
abfragen und warten bis er auch wirklich High ist bevor man das ACK/NACK 
des Slaves abfragt.

Weil ich denke das es ein Timingproblem ist. CLK max. 500kHz ! Wow..

Steffen

von Steffen H. (avrsteffen)


Lesenswert?

Hast du mal ein Bild von dem Timing mit deinem Logic Analyser?

von Matthias (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Hier die Screenshots!

Teil-1 = Messung auslösen
Teil-2 = Messwert laden (nach 50us Delay)

Versuch 1 (lt. Datenblatt):
Teil-1: Ich bekomme ich kein ACK

Teil-2: Dieses Stop/Start komm vom Modul und damit verliert der uC den 
Bus.

Versuch 2:
Teil-1: Wenn ich irgend etwas davor sende, bekomme ich auch die ACK's

Teil-2: Gleich wie bei Versuch 1, bun einen Schritt weiter.



mfg
Matthias

von Matthias S. (matthias2525)


Lesenswert?

Hat keiner Erfahrungen mit diesem Modul?

von Steffen H. (avrsteffen)


Lesenswert?

Hallo Matthias

Leider kann ich die SCL Frequenz nicht so korrekt bestimmen. Aber ich 
glaub die ist noch zu hoch. Bin auf irgendwas über 500kHz gekommen. 
(666kHz?)

Die könntest du nochmal nachmessen.

>Teil-2: Dieses Stop/Start komm vom Modul und damit verliert der uC den
>Bus.

Meinst du diese Spitze auf SDA am Ende?


Hast du mal das noch eingebaut was ich weiter oben geschrieben hab? Den 
SCL mal vor dem ACK/NACK abfragen, ob er vom Slave noch auf low gehalten 
wird?

Zeig doch bitte noch deine I2C Software Routine her.


Gruß Steffen

von Steffen H. (avrsteffen)


Lesenswert?

Matthias S. schrieb:
> Hat keiner Erfahrungen mit diesem Modul?

Noch nicht, aber ich hab es mir soeben bestellt. Ich will mir auch ein 
Modul mit bauen für den Luftdruck.

Deswegen kann ich hier nur theoretisch was drüber sagen.

von Matthias S. (matthias2525)


Lesenswert?

Steffen H. schrieb:

> Leider kann ich die SCL Frequenz nicht so korrekt bestimmen. Aber ich
> glaub die ist noch zu hoch. Bin auf irgendwas über 500kHz gekommen.
> (666kHz?)
>
> Die könntest du nochmal nachmessen.

Diese ist auf ca. 100kHz, habe es schon mit einigen schneller und 
langsamer versucht.


>>Teil-2: Dieses Stop/Start komm vom Modul und damit verliert der uC den
>>Bus.
>
> Meinst du diese Spitze auf SDA am Ende?

Ja

> Hast du mal das noch eingebaut was ich weiter oben geschrieben hab? Den
> SCL mal vor dem ACK/NACK abfragen, ob er vom Slave noch auf low gehalten
> wird?

Nein, gib mir bitte einen Denkanstoß, ... Der SCL wird ja wieder high, 
also kann er ja nicht auf low gehalten werden.


> Zeig doch bitte noch deine I2C Software Routine her.
>

ja werde ich gleich machen.

mfg
Matthias

von Matthias S. (matthias2525)


Angehängte Dateien:

Lesenswert?

Quellcode im Anhang!

Da es meine ersten TWI versuche sind, dementsprechend ...

Er ist auch noch ohne ERROR-Routine.

Daten die das Modul ausgibt, habe ich vorerst nur mit den Logic-Analyser 
kontrolliert.

mfg,
Matthias

von Steffen H. (avrsteffen)


Angehängte Dateien:

Lesenswert?

Solange wie ich deinen Quellcode studiere geb ich dir mal meine I2C 
Routine für einen Software I2C. Die Waits sind natürlich für einen 
400kHz Bus.

Muss man halt anpassen. Also statt "wait1us" = 1µs muss man da halt 1ms 
draus machen.

von Steffen H. (avrsteffen)


Lesenswert?

Aha, du arbeitest mit dem Hardware TWI. Ich weiß nicht, ob das so 
optimal ist mit diesem HP03S Modul. Da man ja auch nicht weis, ob das 
überhaupt I2C konform ist was das Modul da als Schnittstelle anbietet.

Wie ist es denn überhaupt mit dem MCLK? Muss der ständig anliegen?

von Steffen H. (avrsteffen)


Lesenswert?

1
.equ XTAL = 419200
Was ist das für eine Frequenz? 419.2kHz ?? als XTAL?

von Matthias S. (matthias2525)


Lesenswert?

Sollte 4 194 000 sein also 4.194 MHZ

von Steffen H. (avrsteffen)


Lesenswert?

Hallo Matthias

Du setzt doch vor dem ersten Zugriff auf den Bus und HP03S den XCLR auf 
High.
So steht es ja auch in Datenblatt (von pollin, Vertrauen==0).
Hast du mal versucht XCLR gänzlich immer auf high zu lassen? Oder 
wenigstens wenn du XCLR auf high setzt danach mal noch eine Pause 
(vielleicht 50ms) einzufügen, bevor du mit dem ersten I2C Start 
beginnst?

Ein Versuch wäre es doch Wert.

Steffen

von Matthias S. (matthias2525)


Lesenswert?

Hallo Steffen,

dass wahr eine gute Idee!!

Jetzt liefert das Modul ein ACK!

Aber immer noch keinen Messwert.

Es funktionieren auch nur ein par Taktfrequenzen: 250kHz, 100khz, ...
Bei zwischenstufungen z.b ca. 95kHz oder oder ca. 105kHz macht das Modul 
komische dinge.

Ich habe auch den MCLK unterschiedlich (während/zwischen TWI zugriff) 
aktiviert und deaktiviert.
Da kommen auch unterschiedliche Ergebnisse, abei kein Messwert.

Ich kann erst ab Donnerstag Abend wieder größere Versuche machen, ...


mfg,
Matthias

von Michael U. (amiga)


Lesenswert?

Hallo,

oben wurde auf meine Nasteleien verwiesen, die Sachen liegen unter
http://www.avr.roehres-home.de/sensoren/i_druck_sensor.html

Es gibt davon nur eine Assembler-Version.

Ich habe da seit Ewigkeiten nichts dran gemacht, es läuft aber 
immernoch.

Vielleicht hilft es ja weiter.

Gruß aus Berlin
Michael

von Steffen H. (avrsteffen)


Lesenswert?

Oh danke Michael.

Wenn mein HP03S Sensor nächste Woche da ist, kann ich ja auch endlich 
ein paar Experimente machen.

Matthias S schrieb:
>Jetzt liefert das Modul ein ACK!
Das ist doch schon mal was.

>Aber immer noch keinen Messwert.
Das ist nicht schön :(

>Ich kann erst ab Donnerstag Abend wieder größere Versuche machen, ...
Das hoffe ich dann auch für mich ;-)


Michael hat ja seine Modul-Sourcen zur Verfühgung gestellt. Und die 
funktionieren ja schon. Desweiteren sind sie in ASM. Jetzt sollte doch 
der Fehler schnell auswendig gemacht werden können.

Danke Michael.
 ..und hattest du denn keine Probleme bei der Ansteuerung dieses HP03S 
gehabt?

Steffen

von Matthias (Gast)


Lesenswert?

Hallo,

Danke Michael für deine Modul-Sourcen!

Du hast die Register r22, und r23 zwei mal definiert!
Deine Formel für I2C_CLOCK (Wert für TWBR) ist meiner Meinung nicht ganz 
richtigt - habe ich angepasst.

Ich habe den Code auf das nötige gekürzt, und diesen für den Atmega8 
angepasst (statt sts/lds - out/in).

Leider bekomme ich das gleiche Ergebnis wie oben.

Habe jetzt noch den Clock (MCLK) angepasst - erst vor der Messung 
(erster TWI zugriff) starten, etc. ...

Das muss ich aber erst bei Gelegenheit testen.


Achja - hab es schon mit drei Modulen versucht, also daran kann es daran 
nicht liegen.

Wenn das nicht funktioniert, kaufe ich mir die gleichen Komponenten wie 
Michael und baue alles 1:1 nach - dass kanns ja nicht sein!!!!


mfg
Matthias

von Steffen H. (avrsteffen)


Lesenswert?

Hallo,

Mein Modul ist heut angekommen. Werde aber erst morgen zum testen 
kommen.

Steffen

von Carsten M. (ccp1con)


Lesenswert?

Also ich habe das Modul ganz gut im Griff (würde ich mal behaupten).
Kann aber aus dem langen Thread nicht mehr genau das Problem erkennen.
Also wenn du nochmal zusammenfassen würdest ...

Außerdem habe ich in der Codesammlung (HP03 Drucksensor - C Code) mein 
Testprogramm veröffentlicht. Vielleicht willst du das mal anschauen.

Gruß
Carsten

von Matthias S. (matthias2525)


Lesenswert?

GELÖST!!!!

Zum Glück tut Blödheit nich weh!

Ich habe eine Doppelseitige SMD Platine angefertigt, mit folgender 
Bestückung.

Atmeaga8L, ST485(für Busankopplung), HP03S und HH10D (Luftfeuchte)

...und das Ganze in einem Wandgehaüse.

Ich habe halt bei der Planung ein paar Masse durchkontaktierungen 
vergessen, diese ich nach erster Durchsicht auch gefunden habe.

Leider hatte mein HP03S immer noch keine MASSE.

VIELEN DANK für eure Bemühungen!!!

Für Fragen stehe ich gerne zur Verfügung!!!


mfg
Matthias

von Steffen H. (avrsteffen)


Lesenswert?

Hallo Mathias,

Zum Glück tut Blödheit bei mir auch nicht weh :-)
Hab den selben Fehler wie du gemacht. GND vergessen zu verbinden auf 
meinem Sensor-Aufnahme-PCB..

So, jedenfalls funktioniert bei mir nun auch endlich die I2C 
Kommunikation. Jetzt geht es ran an den Berechnungen der Werte.

Die Koefizenten muss man wenn XCLR = LOW ist auslesen? Hab ich das so 
richtig dem Datasheet entnommen?

Wie sieht es mit dem MCLK aus? Muss der ständig anliegen? Oder kann man 
den auch abschalten wenn man nichts auslesen will?

Es geht mir darum, Strom zu sparen. Und dazu geht der ansteuernde µC in 
den Sleep-Modus. Dann hab ist der Timer ja auch aus und demzufolge auch 
der MCLK.

Steffen

von Matthias S. (matthias2525)


Angehängte Dateien:

Lesenswert?

Hallo Steffen,

> Zum Glück tut Blödheit bei mir auch nicht weh :-)
> Hab den selben Fehler wie du gemacht. GND vergessen zu verbinden auf
> meinem Sensor-Aufnahme-PCB..

Du hst sicherlich nicht so lange gedauert wie bei mir, um den Fehler zu 
finden.

> Die Koefizenten muss man wenn XCLR = LOW ist auslesen? Hab ich das so
> richtig dem Datasheet entnommen?

Ja! Lass den XCLR immer auf LOW, um Strom zu sparen. Setzte ihn nur vor 
der Messung auf HIGH, aber AUCHTUNG, du musst dann ein delay vor dem 
ersten TWI zugriff geben. Ich weiß nicht wie lange es dauern sollte, bei 
mir spielt Zeit fast keine Rolle also hab ich mal 4ms gegeben. Versuch 
es einmal mit einer Zeit von 1 bis 8 Takten der 32kHZ.


> Wie sieht es mit dem MCLK aus? Muss der ständig anliegen? Oder kann man
> den auch abschalten wenn man nichts auslesen will?

Nein! Nur während der Messung. Ich schalte ihnn aber vor dem XCLR=HIGH 
ein.

Für was möchtest du dein Modul einzetzten?

Zu den Berechnungen.
Ich hab alles in ASM geschrieben. Daher sind die Berechnungen eine 
enorme Aufgabe. Es ergeben sich dadurch, halt auch einige 
Ungenauigkeiten.
Luftdruck: +/- ca.1,5 hpa (je nach D1, D2 und Konstaten)
Temperatur: +/- ca. 0,7 °C (je nach D1, D2 und Konstaten)

Bin auf deine Ergebnisse gespannt.

Vergiss nicht die Höhenkorrektur beim Luftdruck.

mfg,
Matthias

von Steffen H. (avrsteffen)


Lesenswert?

Hallo Mathias

>Zu den Berechnungen.
>Ich hab alles in ASM geschrieben. Daher sind die Berechnungen eine
>enorme Aufgabe. Es ergeben sich dadurch, halt auch einige
>Ungenauigkeiten.
>Luftdruck: +/- ca.1,5 hpa (je nach D1, D2 und Konstaten)
>Temperatur: +/- ca. 0,7 °C (je nach D1, D2 und Konstaten)

Ich hab jetzt einen ganzen Tag mit den Berechnungen verbracht.. Ist 
wirklich heftig. Und mein ATtiny2313 ist so ziemlich voll (98.2%). Der 
hat halt auch noch keinen Hardware-Multiplizierer.
Zu der Genauigkeit kann ich leider keine Aussage treffen. Ich weiß auch 
nicht, wie du die berechnet hast.

Ich habe jedenfalls versucht bei den Berechnungen keine Floats zu 
bekommen. Die zweite Schwierigkeit lag dann an den signet Berechnungen. 
Da bekomm ich auch einen kleinen Fehler mit rein. Das muss ich mir 
nochmal genauer ansehen. Aber soweit funktioniert das jetzt ganz gut.

>Für was möchtest du dein Modul einzetzten?
Es wird ein Funk-Modul via RFM02 das mir halt die Temperatur und den 
Luftdruck liefert. Wenn ich soweit bin, werd ich es noch veröfentlichen. 
Ein Modul gibt es ja schon. Allerdings erstmal nur Temperatur.
Siehe: [Beitrag "[ASM] RFM02 sendet an RFM01 Sensor Daten"]


>>zu Michael U.
Danke für die Bereitstellung deiner Sourcen! Die haben mir sehr 
geholfen. Und ein DICKES LOB an deinen sehr schönen dokumentierten 
Programmierstil. Sowas sieht man selten. Ließt sich sehr gut.

So, werd mal Leiterplatten ätzen..

Gruß Steffen

von Steffen H. (avrsteffen)


Angehängte Dateien:

Lesenswert?

Ach ja, hier schonmal nur die HP03S Routinen im Vorcast.

von Steffen H. (avrsteffen)



Lesenswert?

Hallo Mathias

Ich hab jetzt mal ein paar Bilder von meinen Modulen und der Anzeige 
gemacht. Jedes Modul hat noch einen Schaltwandler (TPS61016) mit drauf. 
Dieser holt mir das letzte Volt aus einer Batterie (Vbatt = 0,85V.. 
3,6V) und generiert mir daraus 3.3V

Wenn der Strombedarf weniger als 1mA sinkt (Sleep Modus) geht auch der 
Schaltregler in so eine Art Schlaf-Modus und pulst nur noch den Ausgang 
damit die Stromversorgung aufrechterhalten wird.

Mal sehen wie lange dann eine 1,5V Batterie (AAA) hält. Kann wohl ein 
weilchen dauern bis ich zu einem Ergebnis gekommen bin :-)


Demnächst will ich die Empfängerseite auf RFM12 umbauen, um auch senden 
zu können. Das brauch ich noch um einen RFID-Leser per Funk mit 
anzubinden.

Das Layout der Module könnte ich bei Interesse auch noch hochladen.

@Mathias
>Zu der Genauigkeit kann ich leider keine Aussage treffen. Ich weiß auch
>nicht, wie du die berechnet hast.

Kannst du dazu noch näheres schreiben?

Gruß Steffen

von Matthias S. (matthias2525)


Lesenswert?

Hallo Steffen,

Ich habe leider noch keine Zeit gehabt, weiter zu proggen.

Ich habe die Messwerte und Konstanten in den uC eingelesen und berechnen 
lassen.
Zugleich habe ich diese Messwerte mit dem Logicanalyser geloggt, und mit 
mit dem PC berechnet, natürlicht mit Kommastellen.
Dann habe ich je nach D1, D2 unterschiedliche Abweichungen zu den 
genaueren Werten am PC festegstellt. Siehe vorherigen Beitrag.

mfg Matthias

von Steffen H. (avrsteffen)


Lesenswert?

Ach so, du bekommst also durch die Fließkommaarethmetik einen Fehler in 
die Berechnung auf dem µC.

Das hab ich weitestgehend vermieden. Ich hab die Werte immer soweit 
aufgebohrt dass ich keine Fließkommazahl zur Berechnung oder nach einer 
Berechnung auf dem µC habe. Allerdings muss man dann auch mal schnell 
mit 32Bit Zahlen rechnen :-).

Dann sollte ja mein Fehler ziemlich klein sein.

Wie hast du denn noch die Höhenanpassung gemacht? Ich weiß ja, dass der 
Druck mit zunehmender Höhenlage gegenüber NN sinkt. Aber um wieviel pro 
Meter?

Laut der Formel aus dem Wiki haut das irgendwie nicht hin. Verglichen 
habe ich mit den Werten der Wetterstation hier in meiner Nähe. (im 
selben Ort, ca. 600m entfernt von mir).

Gruß Steffen

von Matthias (Gast)


Lesenswert?

JaSteffen H. schrieb:
> Ach so, du bekommst also durch die Fließkommaarethmetik einen Fehler in
> die Berechnung auf dem µC.

Ja

> Das hab ich weitestgehend vermieden. Ich hab die Werte immer soweit
> aufgebohrt dass ich keine Fließkommazahl zur Berechnung oder nach einer
> Berechnung auf dem µC habe. Allerdings muss man dann auch mal schnell
> mit 32Bit Zahlen rechnen :-).
>
> Dann sollte ja mein Fehler ziemlich klein sein.

Hab ich teils/teils - vl. hättest du etwas Code für mich?

> Wie hast du denn noch die Höhenanpassung gemacht? Ich weiß ja, dass der
> Druck mit zunehmender Höhenlage gegenüber NN sinkt. Aber um wieviel pro
> Meter?

Laut meinen Recherchen sinkt der Druch um 1 hpa pro 8m.
Ich bin auf 652m, also habe ich 81,5 hpa zum gemessenen Wert addiert.

mfg
Matthias

von Herbert K. (avr-herbi)


Lesenswert?

Hallo,
vielleicht hilft das?
(da sind ein paar Links in den Antworten)
Beitrag "Re: MS5534 MS5534C Barometer Luftdruck ist 10 hPa zu gering"
Viele Grüße und 1 schönen 1. Advent

von Steffen H. (avrsteffen)


Lesenswert?

Danke Herbert. Jetzt kommt es schon besser hin.

von Steffen H. (avrsteffen)


Lesenswert?

Matthias schrieb:
> Hab ich teils/teils - vl. hättest du etwas Code für mich?

Der steht doch weiter oben:
[Beitrag "Re: Luftdruck-Modul HP03S mit Atmega8"]

Und hier nur mal ein Auszug:
1
;************************** Sensor HP03S ***********************************
2
; Sub: Berchnet an Hand der Koeffizienten und der Sensordaten den Druck und die Temperatur
3
; Parameter:  -
4
; Return:    PRESSURE_calc,TEMPERATURE_calc im SRAM
5
; Scratch-Reg:  r16..r27
6
;***************************************************************************
7
8
convert_sensor_data:
9
; dUT calculation ---------------------------------------------------------
10
    lds    r16,TEMPERATURE+1    ; load D2 LSB
11
    lds    r17,TEMPERATURE+0    ; load D2 MSB
12
    lds    r18,COEFICIENT_C5+1    ; load C5 LSB
13
    lds    r19,COEFICIENT_C5+0    ; load C5 MSB
14
    sub    r16,r18          ; D2-C5 [LSB]
15
    sbc    r17,r19          ; D2-C5 [MSB]
16
    sts    DELTA+0,r17        ; [MSB]
17
    sts    DELTA+1,r16        ; [LSB]
18
    lds    r18,COEFICIENT_A
19
    brpl  convert_sensor_data_delta_pos
20
    lds    r18,COEFICIENT_B
21
convert_sensor_data_delta_pos:
22
    sts    VAR_C,r18        ; VAR_C: Coefficent A oder B
23
    mov    r18,r16
24
    mov    r19,r17
25
    rcall  mul16s          ; (D2-D5)^2    
26
    mov    r23,r21          ; vorbereiten zur mul32
27
    mov    r22,r20          ; vorbereiten zur mul32
28
    mov    r21,r19          ; vorbereiten zur mul32
29
    mov    r20,r18          ; vorbereiten zur mul32
30
    lds    r16,VAR_C
31
    rcall  mul32b          ; ((D2-D5)^2) * coef_A oder coef_B
32
    lds    r25,COEFICIENT_C
33
    subi  r25,-14          ; Matisse + Coefficent C = 2^14+C
34
convert_sensor_data_loopa:        ; (((D2-C5)^2) * (coef_A oder coef_B)) / 2^14+C
35
    lsr    r24
36
    ror    r23
37
    ror    r22
38
    ror    r21
39
    ror    r20
40
    dec    r25
41
    brne  convert_sensor_data_loopa
42
    lds    r18,DELTA+1
43
    lds    r19,DELTA+0
44
    sub    r18,r20
45
    sbc    r19,r21
46
    sts    dUT+1,r18        ; dUT = (D2-C5) - (((D2-C5)^2) * (coef_A oder coef_B)) / 2^14+C
47
    sts    dUT+0,r19

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.