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...
Dann nimm doch einfach einen SHT20, den kannst du Zeitunkritisch seriell auslesen und kannst auch mehrere an einen einzigen Bus hangen.
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.