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
Danke, leider geht er nirgens genauer auf dieses HP03S Modul ein .... mfg Matthias
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
Hast du mal ein Bild von dem Timing mit deinem Logic Analyser?
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
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
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.
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
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
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.
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?
1 | .equ XTAL = 419200 |
Was ist das für eine Frequenz? 419.2kHz ?? als XTAL?
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
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
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
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
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
Hallo, Mein Modul ist heut angekommen. Werde aber erst morgen zum testen kommen. Steffen
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
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
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
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
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
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
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.