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
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.
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).
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
Ok, danke euch, probiere es mal mit den Interrupts und Timer. Gruss Rudolf
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.