Forum: Mikrocontroller und Digitale Elektronik DHT22 auslesen


von Dirk (Gast)


Lesenswert?

Hallo zusammen,

ich möchte versuche gerade einen guten Code für den DHT22 zu schreiben.

Dieser muss einen 1-Draht-Bus auswerten. Es müssen Pulslängen gemessen 
werden, um 1 und 0 festzustellen (ähnlich DCF77).
Die Pulslängen sind im zweistelligen µs Bereich.

Wie ich es von FPGAs gewohnt bin, hätte ich jetzt einfach mit einem 
Timer und 1µs abgetastet und dann ausgewertet. Leider ist dies nicht 
möglich, da der Prozessor an seine Grenzen stößt. Er braucht ja schon 
allein ein paar Takte um bei Interruptaufruf alles auf den Stack zu 
kopieren etc.

Wie macht man das also richtig?

Externer Interrupt? -> Eigentlich optimal, doch was ist mit Störungen
Abtasten -> Prozessor ist so gut wie ausgelastet
in der main mit delays -> da wird mir irgendwie schlecht, da ich die 
timings nicht abschätzen kann.
Hardwareeinheit missbrauchen -> Keine Ahnung welche sich eignet.

Hat jemand Tipps und Ansätze? Ich wollte eventuell mehrere Sensoren 
auslesen und noch GANZ viele andere Dinge darauf laufen lassen....

Ich bedanke mich im Vorraus...

von Draco (Gast)


Lesenswert?

Dann nimm doch einfach einen SHT20, den kannst du Zeitunkritisch seriell 
auslesen und kannst auch mehrere an einen einzigen Bus hangen.

von Jim M. (turboj)


Lesenswert?

Dirk schrieb:
> Hardwareeinheit missbrauchen -> Keine Ahnung welche sich eignet.

Ein Timer mit Capture würde sich eignen. Steigende Flanke startet den 
Timer, fallende Flanke hält ihn an und löst den Interrupt aus. Gibt noch 
mehr Varianten aber das ist die Enfachste.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Diese Chinesensensoren sind für die Tonne.
Dazu gibts hier genug Beiträge im Forum.

Also schwenke zu nem Senbsor über der eh SPI oder I2C hat.

von Reiner W. (reiner_w)


Angehängte Dateien:

Lesenswert?

Jim M. schrieb:
> Ein Timer mit Capture würde sich eignen.

Genau so. Da reichen 10us Timerimpulse.

Simple Methoden (Arduino Lib) machen es so:
1
   ... 
2
   while (digitalRead(_pin) == level) {
3
      if (count++ >= _maxcycles) {
4
        return 0; // Exceeded timeout, fail.
5
      }
6
   ...

Die arbeiten dann aber im blocking-mode.
Du solltest 2 Timer einsetzen.
Eine zur Ermittlung der Impulsbreite. Und einen über das komplette 
datagramm. So kannst du noch auf timeout reagieren.

Ich habe es mal zur Übung non-blocking als state machine realisiert. Die 
eigentlich kritische isr zählt hier nur die 10us Impulse.

: Bearbeitet durch User
von Alex D. (allu)


Angehängte Dateien:

Lesenswert?

Dirk schrieb:
> Hat jemand Tipps und Ansätze? Ich wollte eventuell mehrere Sensoren
> auslesen und noch GANZ viele andere Dinge darauf laufen lassen....

Die gesamte Datenabfrage des DHT22 (= AM3202) ist in maximal 7 msec 
abgeschlossen. Die Auswertung ist ohne jeden Timer durch Auszählen der 
Impulsbreiten per Assemblerprogramm machbar.

Unter Verwendung einen CTC-Timer mit 20 msec, ergibt das 50 Slots pro 
sec. Damit lassen sich ohne weiters 50 Sensoren abfragen und auswerten. 
In Betrieb habe ich einen Prozessor nach diesem Prinzip - DCF77 
auswerten, 8 Slaves abfragen, einen AM2302 abfragen usw.

Mein Testprogramm habe ich als Beispiel mal angehängt.

Gruß  Alex

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.