Hallo zusammen
Dieses Thema DHT11 Sensor bringt AtMega8 zum Reset hat mich dazu motiviert, eine Auslese-Routine für den DHT11 zu schreiben, die auch bei 1MHz Systemtakt und vielleicht auch bei geringerem Takt noch zuverlässig funktioniert.
Das Problem war ja, dass die DHT11-Routine in obigem Thread in Basic geschrieben war, und daher einfach nicht mehr in der Lage war, den Sensor bei 1MHz Systemtakt auszulesen.
Ich hab es selbst dann in Basic mal versucht, das funktioniert aber nicht mehr.
Also habe ich gleich alles in Assembler gemacht habe.
Also das Maximum an Geschwindigkeit rausgeholt habe, was geht. Vielleicht kann man noch bisschen dran feilen
Das Ergebnis:
Entstanden ist ein Modul Namens "DHT11.inc", welches einfach in eigene Projekte einzubinden ist und den DHT11 bei Systemtakten von 500kHz bis 2MHz verfügbar macht. Getestet habe ich bis Systemtakt 450kHz (ext. RC-Oszillator) runter, das hat bei mir noch fehlerfrei funktioniert.
Ist doch erstaunlich!
Um das zu erreichen, wurde Timer0 verwendet, aber keinerlei Interrupts.
Interrupts sollten übrigens beim Lesen des Sensors abgeschaltet werden, da die Sache sehr zeitkritisch ist!
Ich möchte für künftige Anwendungen dieses Demo mit Modul "DHT11.inc" (Lib im weiteren Sinne) zur Verfügung stellen.
Damit man nicht gleich zum mal Reinschauen alles Herunterladen muss, hier mal die Demo und dann das Modul vorab.
Am Schluss kann dann alles als Zip heruntergeladen werden. Enthalten ist da auch eine kleine Beschreibung und ein Datenblatt.
Hier das Hauptprogramm:
Man muss lediglich das "DHT11.inc" Modul einbinden (Zeile 51) und in der Hauptschleife 3 Funktionen aufrufen.
Pin für DHT-Anschluss wird im Modul angegeben.
Alles anzeigen
Ich muss es aufteilen. Rest im nächsten Beitrag.
Dieses Thema DHT11 Sensor bringt AtMega8 zum Reset hat mich dazu motiviert, eine Auslese-Routine für den DHT11 zu schreiben, die auch bei 1MHz Systemtakt und vielleicht auch bei geringerem Takt noch zuverlässig funktioniert.
Das Problem war ja, dass die DHT11-Routine in obigem Thread in Basic geschrieben war, und daher einfach nicht mehr in der Lage war, den Sensor bei 1MHz Systemtakt auszulesen.
Ich hab es selbst dann in Basic mal versucht, das funktioniert aber nicht mehr.
Also habe ich gleich alles in Assembler gemacht habe.
Also das Maximum an Geschwindigkeit rausgeholt habe, was geht. Vielleicht kann man noch bisschen dran feilen
Das Ergebnis:
Entstanden ist ein Modul Namens "DHT11.inc", welches einfach in eigene Projekte einzubinden ist und den DHT11 bei Systemtakten von 500kHz bis 2MHz verfügbar macht. Getestet habe ich bis Systemtakt 450kHz (ext. RC-Oszillator) runter, das hat bei mir noch fehlerfrei funktioniert.
Ist doch erstaunlich!
Um das zu erreichen, wurde Timer0 verwendet, aber keinerlei Interrupts.
Interrupts sollten übrigens beim Lesen des Sensors abgeschaltet werden, da die Sache sehr zeitkritisch ist!
Ich möchte für künftige Anwendungen dieses Demo mit Modul "DHT11.inc" (Lib im weiteren Sinne) zur Verfügung stellen.
Damit man nicht gleich zum mal Reinschauen alles Herunterladen muss, hier mal die Demo und dann das Modul vorab.
Am Schluss kann dann alles als Zip heruntergeladen werden. Enthalten ist da auch eine kleine Beschreibung und ein Datenblatt.
Hier das Hauptprogramm:
Man muss lediglich das "DHT11.inc" Modul einbinden (Zeile 51) und in der Hauptschleife 3 Funktionen aufrufen.
Pin für DHT-Anschluss wird im Modul angegeben.
BASCOM-Quellcode: Main.bas
- ' Demo DHT11
- ' Autor: Mitch64 (Bascomforum.de)
- ' Erstellt: Januar 2020
- ' Version : 1.0.0
- ' Beschreibung:
- ' Demonstriert die Einbindung und Verwendung des Modul DHT11.inc
- ' Mit der funktion DHT_Read wird der Sensor ausgelesen. Der Rückgabewert
- ' wird in Variable Result gespeichert und enthält ein Fehlercode (siehe DHT11.inc).
- ' Ist der Fehlercode = DHT_ERR_SUCCESS,
- ' war das Auslesen erfolgreich und die Werte für Feuchte und Temperatur
- ' konnen mit den Functionen DHT_Feuchte() und DHT_Temoeratur()
- ' aus dem internen DHT-Buffer extrahiert werden.
- ' Durch die Rückgabe des Fehlercodes kann im Programm entsprechend reagiert werden
- ' und beispielsweise dem Anwender mitteilen, dass der Sensor nicht funktioniert.
- ' Hinweis:
- ' Der Datenpin (DHT11) kann im Modul DHT11.inc im Abschnitt "Konfiguration"
- ' geändert werden.
- ' Die geringe Baudrate wurde gewählt, um die serielle Ausgabe
- ' bei 500kHz Systemtakt noch gewärleisten zu können.
- ' Der Source-Code wurde getestet und funktioniert von 500kHz bis 2MHz.
- ' Bei 450kHz habe ich aufgehört zu testen, da funktionierte der Code noch.
- ' Bei 4MHz funktionierte der code nicht mehr.
- $Regfile = "m8def.dat"
- $HWStack = 30
- $SWStack = 30
- $FrameSize = 30
- '$Crystal = 14745600
- $Crystal = 1000000 ' int. Oszillator
- '$SIM
- $Baud = 1200
- Config SubMode = New
- Config Base = 0
- Const FALSE = 0
- Const TRUE = 1
- Dim Result as Byte
- Dim Feuchte as Byte
- Dim Temperatur as Byte
- $Include "Include\DHT11.inc" ' Sensor DHT11 einbinden
- Wait 1
- Enable Interrupts
- Print "Start DHT11 Demo!"
- Do
- Print : Print "Takt: " ; _xtal
- Result = DHT_Read() ' DHT11 lesen
- Select Case Result
- Case DHT_ERR_SUCCESS ' Auslesen war erfolgreich
- Feuchte = DHT_Feuchte() ' Feuchte aus DHT-Buffer lesen
- Temperatur = DHT_Temperatur() ' Temperarur aus DHT-Buffer lesen
- Print "Temperatur: " ; Temperatur
- Print "Feuchte: " ; Feuchte
- Case DHT_ERR_NO_RESPONSE ' Keine Antwort von DHT
- Print "Fehler: Der DHT11 antwortet nicht!"
- Case DHT_ERR_CHECKSUM_FAIL ' Checksumme fehlerhaft
- Print "Fehler: DHT11 Checksumme nicht korrekt!"
- End Select
- Waitms 1000
- Loop
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Mitch64 ()