Forum: Mikrocontroller und Digitale Elektronik DHT22 auslesen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Dirk (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.