Forum: Mikrocontroller und Digitale Elektronik HH10D Frequenz zu niedrig


von frank (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

anhand der angehängten hum_sens.c versuche ich einen HH10D 
Luftfeuchtesensor von Pollin abzufragen.
Die Werte, die per I²C abgefragt werden schauen richtig aus (also 
entsprechen der Größenordnung wie im Beispiel auf der 
"Packungsbeilage").

Die Frequenz, die der HH10D ausspuckt ist jedoch viel zu niedrig.
Laut Datenblatt sollen 5kHz bis 10kHz ausgegeben werden, ich messe 
allerdings deutlich niedrigere Frequenzen (<1kHz).
Eine Änderung der Betriebsspannung (3.3V/5V) ändert die Frequenz zwar, 
jedoch nicht deutlich genug um im angegebenen Bereich zu landen, die 
Registerwerte verändern sich dabei nicht/kaum.

Ich habe hier im Forum (und, ja auch über google) schon nach ähnlichen 
Problemen gesucht, bin aber bisher noch nicht fündig geworden.
Ich hoffe also jetzt darauf hier den richtigen Tipp zu finden.
(F_CPU = 4000000UL, µC ist auch so gefused und empfängt Takt von einem 
4Mhz-Quarz)

Gruß

Frank

von MWS (Gast)


Lesenswert?

Wie soll das hier zusammengehen ?

> int   freq = 0;
> ...
> freq = (NrOverflows * 65536) + EndTime - StartTime;

von frank (Gast)


Lesenswert?

Den Code hab ich (bis auf meine Debugausgaben) so gefunden.
Nach meinen Recherchen basiert er auf einem Frequenzausleser, der auch 
hier im Forum gepostet wurde (sry, bin noch auf der Suche nach dem 
link).

wenn int == 8bit, dann könnte das auch schon der Fehler sein.
Die Wertrückgabe als float gefällt mir auch nicht, aber zuerst brauche 
ich eine sinnvolle Frequenz :(

von frank (Gast)


Lesenswert?

http://www.mikrocontroller.net/attachment/20833/FreqCount.c

Datei gefunden.
Und Fehler damit vermutlich auch -> hier wird die Frequenz als double 
(somit mehr als 8 bit?) berechnet.

Werde, sobald ich meinen Programmer in die Finger krieg' das beheben.

sry wegen Doppelpost

von MWS (Gast)


Lesenswert?

frank schrieb:
> Und Fehler damit vermutlich auch -> hier wird die Frequenz als double
> (somit mehr als 8 bit?) berechnet.

Ein int in AVR GCC hat üblicherweise 16Bit, aber auch damit läuft die 
Variable NrOverflows * 65536 nach einem gezählten Overflow über.
Und ja, double ist was anderes als 8Bit.

von frank (Gast)


Lesenswert?

mit NrOverflows * (max_int+1) bekommt man ja wieder NrOverflows -> 
sinnlos, mit NrOverflows +EndTime - Starttime müsste ja das gleiche 
Ergebnis 'rauskommen. (Wenn ja, dann ist der Fehler ja wieder woanders)
Bei der Berechnung mit double könnte das ganze natürlich wieder 
funktionieren.

von frank (Gast)


Angehängte Dateien:

Lesenswert?

Mein letzter Stand (nach längerer frustbedingter Pause ^^):
es funktioniert :D

Anschluss µC sowie HH10D mit 5V, kein Pegelwandler.

Problem war vermutlich ein Fehler bei der Berechung der Frequenz.
1
freq = F_CPU/freq;
obwohl wie gewohnt in den header-Dateien definiert war die Berechnung 
erst korrekt sobald F_CPU in der source-Datei neu definiert war.

Den beiliegenden Code habe ich so irgendwo im Internet gefunden. Er 
beruht auf einer frühen Version des FrequenzCounters, welcher in der 
Codesammlung zu finden ist. Meine Änderungen sollten die letzten 
Anpassungen des Frequenzcounters übernehmen. Verhalten sowie 
Rückgabewert (uint32_t) gefallen mir zwar noch nicht sonderlich, aber 
...

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.