Forum: Mikrocontroller und Digitale Elektronik AVR Feuchtesensor auslesen?


von Rudolf.Z (Gast)


Lesenswert?

Hi,

Ich habe folgenden Feuchte- und Temperatursensor, welchen ich gerne mit 
einem ATMega8 auslesen würde:

http://akizukidenshi.com/download/ds/aosong/AM2302.pdf

Meine Idee: Ich initialisiere einen Interrupt auf fallende Flanke und
starte nach jeder Flanke einen Timer, der mir die Zeit bis zur nächsten 
fallenden Flanke misst. Wenn nun die gemessene Zeit grösser als eine 
bestimme (aus dem Datenblatt) maximale Zeit ist, dann handelt es sich um 
eine "1", sonst um eine "0". Macht man das normalerweise auch so oder 
wie würdet ihr das machen?

Gruss Rudolf

von Sascha (Gast)


Lesenswert?

Hört sich unnötig kompliziert an, auch ohne das DB gelesen zu haben.

DB jetzt überflogen: Das ist ein serielles Single-Wire 
Kommunikationssystem. Sowas ähnliches wie I2C, wofür es bereits 
Bibliotheken gibt.

Und zu deiner Frage: Ja würde man möglicherweise, wenn die AVRs keine 
dedizierte Hardware für 2-wire Kommunikation (SPI und I2C/TWI) eingebaut 
hätten. Da die das aber haben, ist das unnötig kompliziert.

von Sebastian (Gast)


Lesenswert?

Klingt nach einer guten Vorgehensweise. Vorausgesetzt natürlich, daß am 
Interruptpin keine Störungen auftreten, die unerwünschte Interrupts 
auslösen. Ansonsten könnte man die Impulse auch einfach in einem 
Timer-Interrupt erfassen, sofern dieser schneller läuft als sie kürzeste 
Impulszeit (2x minimal, mehr für Oversampling).

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Rudolf.Z schrieb:
> wie würdet ihr das machen?
Ich würde auf das Signal eine Flankenerkennung setzen, und bei 
einer/jeder fallenden Flanke damit beginnen, so oft wie möglich abtasten 
und die high-  und low-Pegel bis zur nächsten fallenden Flanke zur 
nächsten zählen. Danach diese beiden Werte ins Verhältnis setzen, und 
wenn über 0,5 herauskommt wars eine '1', wenn weniger als 0,5 dann ists 
eine '0'...

Damit wäre dann irgendeine Änderung der Bit-Zeiten komplett irrelevant. 
Denn wenn die high-Dauer z.B. wegen Erwärmung länger wird, dann wird es 
auch die low-Zeit.

Sascha schrieb:
> DB jetzt überflogen: Das ist ein serielles Single-Wire
> Kommunikationssystem. Sowas ähnliches wie I2C, wofür es bereits
> Bibliotheken gibt.
Mein Stichwort zum Thema: OneWire Protokoll

: Bearbeitet durch Moderator
von Rudolf.Z (Gast)


Lesenswert?

Ok, danke euch, probiere es mal mit den Interrupts und Timer.

Gruss Rudolf

von Alex D. (allu)


Lesenswert?

Sascha schrieb:
> Sowas ähnliches wie I2C

Ähnlich, aber kein i2C.
Nach dem Resetimpuls (etwa eine msec) schiebt der Am2302 seinen 
Datensatz mit seiner eigenen Zeittaktung heraus.

Empfehlung: 1er Zeiten messen, in den Pausen rechnen.

Für welche Programmiersprache soll's den sein ?
Einen Bascom-Assembler-Mix könnte ich anbieten.
Gruss  Alex

von Sascha (Gast)


Lesenswert?

https://learn.adafruit.com/dht

Klick dich da mal durch, die haben schon ne cpp lib dafür.

von Hermann (Gast)


Lesenswert?

Rudolf.Z schrieb:
> probiere es mal mit den Interrupts und Timer

Das ist zwar ganz übersichtlich und sauber, aber ich mache es lieber mit 
Polling (wenn es die Aufgabe zulässt), weil der Interrupt einfach zu 
lange dauert.
Ich habe extra noch mal in der Simulation von Bascom nachgemessen:
58 Takte vom Interrupt bis zum 1.Statement im Interrupt-Up.
57 Takte vom Return bis zum Statement im Programm.
Macht also 115 Takte Overhead für das reine Interrupt-Handling ohne dass 
ein Statement gerechnet wurde.

Wie will man denn jetzt die typisch 26µs für das "0"-Signal des Sensors 
messen? Mit einem normalen AVR-Takt ist alles vorbei, bevor man im 
Interrupt-Up ankommt.
Jedenfalls habe ich das mit Polling auf dem Signal gemacht und jeweils 
am 1MHz-Timer die Zeit abgelesen. Zu Beginn messe ich noch die 80µs des 
Antwortimpulses zu Beginn und kann dann die "0"-/"1"-Schwelle genau auf 
den Sensor einstellen ("0"-Signal schwankt ± 15,4%)

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.