Autor Thema: DHT11 - Luftfeuchtigkeitssensor  (Gelesen 5880 mal)

Offline HTLW10

  • Newbie
  • *
  • Beiträge: 6
    • Profil anzeigen
DHT11 - Luftfeuchtigkeitssensor
« am: Januar 15, 2016, 17:19:57 Nachmittag »
Hallo,

ich bin neu hier und möchte mich erstmal vorstellen.
Ich bin 18 Jahre jung, Schüler an einer HTL im Zweig Elektronik. Besuche zurzeit die 4.Klasse.

Kommen wir zum Eigentlichen; unzwar..
.. ich habe von meinem Lehrer einen Auftrag bekommen, welcher lautet; ich solle einen DHT11 (Modul) programmieren dass er mir die Werte der Luftfeuchtigkeit ausgibt auf einer 7Segment Anzeige.

WICHTIGE INFOS:

Welches Programm verwende ich?  ->  MPBLAB IDE v.8.92
Welchen PIC verwende ich?            ->  PIC16F883

Datenblätter:
http://www.micropik.com/PDF/dht11.pdf


Ich habe eine Vorstellung wie ich es theoretisch machen könnte jedoch bin ich mir nicht ganz sicher.
Unzwar:

Der DHT11 bräuchte erstmals ein LOW dann HIGH Signal um zu erkennen das er jetzt die Werte der Feuchtigkeit auslesen soll, erst dann schickt er mir wieder an den PIC über die Schnittstelle "Data" die Signale inform von HIGH,LOW die ich dann auslesen muss ob diese High oder low waren/sind.
Das Problem ist hierbei: Der DHT11 sendet mir zuerst mal ein low Signal welches 50µs andauert, erst dann kommen die DATEN die ich benötige in welche die Feuchtigkeit der Luft enthalten sind. Das Signal "HIGH" dauert hierbei 70µs. Dieses ist jedoch HIGH
Das Signal "LOW" dauert 26-28µs. Dieses ist jedoch auch HIGH

Da beide Signale High sind, ist es wichtig die Zeit des HIGH Signales erstmal zu kennen, dabei müsste ich mit dem TIMER arbeiten, jedoch weiß ich nicht genau wie dieser die Zeit auslesen soll und sie mir ausgibt.

Bitte um Hilfe, sollte bis Dienstag komplett fertig sein.
Ich bin bereit für Diskussionen, Vorschläge und Sonstiges anzunehmen.
Falls Ihr den Schaltplan benötigt meiner Platine könnte ich diesen hier verlinken.

Danke im vorraus!
Gruß, Kris.
« Letzte Änderung: Januar 16, 2016, 10:44:23 Vormittag von HTLW10 »

Offline Wil

  • Newbie
  • *
  • Beiträge: 7
    • Profil anzeigen
Re: DHT11 - Luftfeuchtigkeitssensor
« Antwort #1 am: Januar 16, 2016, 10:14:00 Vormittag »
Hallo,
das Datenblatt zum PIC17F883 kann ich bei microchip nicht finden???
Im Internet findest Du bestimmt Beispiele zum 1-Wire Interface.
Ich wuerde das mal grundsaetzlich gesehen so angehen:

;angenommen fosc=4MHz
;TMR0-Prescaler = 1:1
;1 Arbeitstakt = 1 Zaehltakt TMR0 = 1us


        bsf PORTB,RB0 ;Ausganslevel = H
;--DHT11 Datenuebertragung starten
bcf PORTB,RB0
bcf INTCON,TMR0IF = 0 ;TMR0 has not overflowed
movlw .186 ;fuer 60us wird TMR0 = 256-60 = 186 gesetzt
movwf TMR0
wait_TMR0_overflow
btfss INTCON,TMR0IF
GOTO wait_TMR0_overflow
banksel TRISB ;bank1
bsf TRISB,RB0 ;RB0 ist Input wird von PullUp auf H gezogen
banksel 0 ;bank0
wait_DHT11_response
btfsc PORTB,RB0 ;wartet auf LowPegel von DHT11
GOTO wait_DHT11_response
;usw natuerlich schreibt man sich fuer die variablen wartezeiten eine kleine sub, der man nur die anzahl mikrosekunden
;uebergibt. Dann spart man sich auch die immer wiederkehrenden abfragen des Overflowbits

mfG Wil

Offline HTLW10

  • Newbie
  • *
  • Beiträge: 6
    • Profil anzeigen
Re: DHT11 - Luftfeuchtigkeitssensor
« Antwort #2 am: Januar 16, 2016, 11:02:28 Vormittag »
Meine Schuld, es handelt sich nicht um ein 17F sondern um ein 16F883
Den Befehl "banksel" liest dieser nicht ein.

Ich hatte folgende Überlegung, dass Problem hierbei ist, ich habe das PORTB bzw. RB0,RB1,RB2 schon für die Versorgung des DHT11 verwendet, gleichfalls liegt meine 7-Segment Anzeige auf PORTB, wie ich dieses Problem löse, weiß ich zurzeit nicht.

Deshalb sehe ich nicht ob das Programm funktioniert, da keine Anzeige vorhanden ist. Ideen wie ich dieses Problem löse?
Ich schicke dir/Euch die Platine meines PIC's ->

Zitat
; PROZESSOR: PIC16F883, Programmaufbau, Header einfach für Übungsboard seriell
; NAME:
; PROGRAMM:

;Programmbeginn
; Angaben für den Assembler ******************************************************
   list      p=16F883      ; Prozessortypdefinition   
   #include    <P16F883.INC>   ; Bibliothek einbinden
   errorlevel   -302

; Konfiguration für den Prozessor ************************************************
   __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
   __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V    ; _INTRC_IO interner Oszillator   

; Variablendeklaration ***********************************************************
   cblock   0x020         ; Variablenblock beginnend bei Adresse 020 (Hex)
   Warte1
   Warte2
   Variab1
   Kiki
   Kikislave
   endc               ; Ende des Variablenblockes

; Adressendefinition  ************************************************************
   ORG      0x000         ; Reset-Vektor (Hex)
   
; Intitialisierung  **************************************************************
Init
   bsf      STATUS, RP0      ; auf Bank 1 umschalten
   movlw   b'00001000'
   movwf   OPTION_REG
   movlw   b'01100001'      ; interner RC-Oszillator, Frequenz 4MHz
   movwf   OSCCON         ; in OSCCON laden
   movlw   b'00000011'      ; RA0 und RA1 als Eingänge, Rest als Ausgänge definieren
   movwf   TRISA         ; in TRISA laden (RA0 Trimmer, RA1 Taster)
   clrf   TRISB         ; PORTB als Ausgänge definieren (7-Segmentanzeigen)
   movlw   b'11011000'      ; SDA, SCL, RX und TX auf Eingänge, Rest als Ausgänge definieren
   movwf   TRISC         ; in TRISC laden (RC0 Vorzeichen LED)
   bsf      STATUS, RP1      ; auf Bank 3 umschalten
   movlw   b'00000001'      ; RA0 als anlog, Rest als digital I/O definieren
   movwf   ANSEL         ; in ANSEL laden   
   clrf   ANSELH         ; ANSELH löschen, alle I/O als digital definieren
   movlw   b'00000001'      ; RA0 als anlog, Rest als digital I/O definieren
   movwf   ANSEL         ; in ANSEL laden   
   bcf      STATUS, RP0      ; auf Bank 0 zurückschalten
   bcf      STATUS, RP1
   bcf      ADCON0, ADON   ; A/D-Wandler ausschalten
   clrf   PORTA         ; alle PORTA-Ausgänge auf 0 setzen
   clrf   PORTB         ; alle PORTB-Ausgänge auf 0 setzen
   clrf   PORTC         ; alle PORTC-Ausgänge auf 0 setzen
   clrf   Kikislave
   clrf   Kiki

; Hauptprogramm  *****************************************************************
main
   movlw   b'00000110'   
   movwf   PORTB
   bcf      PORTB,RB1
   call   warte18ms
   bsf      PORTB,RB1
   bsf      STATUS,RP0
   movlw   b'00000010'
   movwf   TRISB
   bcf      STATUS,RP0
   btfsc   PORTB,RB1
   goto   $-1
   btfsc   PORTB,RB1
   goto   $-1

Abfragen
   btfsc   PORTB,RB1
   goto   $-1
   btfss   PORTB,RB1   
   goto   $-1
   bcf      INTCON,TMR0IF
   movlw   d'0'
   movwf   TMR0
   btfsc   PORTB,RB1
   goto   $-1
   movlw   d'50'
   subwf   TMR0,w
   rlf      Kiki,f
   incf   Kikislave,f
   movlw   d'8'
   subwf   Kikislave,w
   btfss   STATUS,Z
   goto   Abfragen
   movlw   b'11111000'
   andwf   Kiki,f
   movf   Kiki,w
   iorwf   PORTC,f
   

   clrf   Kikislave
   call   warte18ms
   call   warte18ms
   goto   main
         
   
   
   
   goto $               ; Sprung auf sich selbst
   ;goto   main         ; Sprung zum Hauptprogrammbeginn

; Unterprogramme *****************************************************************
warte18ms

   movlw   d'30'
   movwf   Warte1
Loop         
   movlw   d'200'
   movwf   Warte2
   decfsz   Warte2,f
   goto   $-1
   decfsz   Warte1,f
   goto   Loop
      
   return
   end                  ; Assemblerende   
; Programmende *******************************************************************

Offline Wil

  • Newbie
  • *
  • Beiträge: 7
    • Profil anzeigen
Re: DHT11 - Luftfeuchtigkeitssensor
« Antwort #3 am: Januar 17, 2016, 12:55:25 Nachmittag »
Hallo
Gleich zu Anfang moechte ich Dich auf die PIC-Seite von sprut
http://www.sprut.de/electronic/pic/grund/grund.htm
 hinweisen!

"Banksel" wird sehr wohl von MPLAB 8.92 verstanden und in den entsprechenden Assemblercode zur Bankumschaltung bei der Compilierung  des Codes umgesetzt. Siehe dazu auch die Codebeispiele im Datenblatt oder verwende die Hilfe in MPLAB:
Menue -> Help - Topics - Assembler - Search "banksel" -> Thema "- Generate Bank Selecting Code"

Ich gehe davon aus, dass Du die MCU im 28-Pin PDIP-Gehaeuse und den internen Oscillator verwendest. Immerhin stehen Dir dann 24 I/O-Pins zur Verfuegung.

Fuer deine z.B. 7-Segment-Anzeige mit z.B. 3 Digits brauchst Du bei Multiplexbetrieb  7 pins als Segment- und 3 Pins als Digittreiber
= 10 pins.

Fuer den DHT11 brauchst Du nur 1 Portpin den Du entsprechend dem 1Wire-Protokoll mal als Ausgang, mal als Eingang verwendest. An diesem Pin fraegst Du die L und H-Pegel ab, deren Dauer Du parallel mit dem Timer 0 oder auch mit dem Timer 1 (Capture-Mode) kontrollieren kannst. Siehe auch Datenblatt DHT11  "3. typ. Application"

Es bleiben Dir immer noch 13 Pins fuer andere Zwecke.

1-WIRE-PROTOKOLL DHT11
 A complete data transmission is 40bit, and the sensor sends higher  data bit first.
 Data format:
           8bit integral RH data + 8bit decimal RH data
            + 8bit integral T data + 8bit decimal T data
            + 8bit check sum.
 If the data transmission is right, the check-sum should be the last  8bit of
"8bit integral RH data + 8bit decimal RH data  + 8bit integral T data + 8bit decimal T data".
 MCU-Startsignal               DHT-PIN output = Low fuer 18ms
 DHT Antwort anfordern    DHT-PIN input  = High 20-40us
DHT bereit, zieht DHT-PIN input  = Low  80us
                  zieht DHT-PIN input  = High 80us
     danach startet die Datenuebertragung mit LOW-Level
                 zieht DHT-PIN input  = Low  50us           Bit 40
                 Bitwert = 0 DHT-PIN input  = High 26-28us
                 Bitwert = 1 DHT-PIN input  = High 70us

                 zieht DHT-PIN input  = Low  50us           Bit 39
                 Bitwert = 0 DHT-PIN input  = High 26-28us
                 Bitwert = 1 DHT-PIN input  = High 70us
         
 When DHT is sending data to MCU, every bit of data begins with the  50us low-voltage-level and the length of the following high-voltage  -level signal determines whether data bit is "0" or "1"

Programm erstellen:
Zuerst solltest Du die Umwandlung Binaer zu BCD/Dezimal programmieren. Dazu kannst Du als Hilfe den MPLAB-Simulator verwenden. Wenn das klappt gibst Du eine Zahl auf 1 Digit aus. Danach versuchst Du Dich darin die Digits gemultipext anzusteuern. Erst danach beginnst Du mit der Datenabfrage /-auswertung des DHT11.

Du solltest weiterhin keinen Spaghetti-Code verwenden, sondern den Code in Subroutinen gliedern. Damit wird der Code uebersichtlich und weniger fehleranfaellig.

Im nachfolgenden BEISPIEL ist "DHT" der Pin welcher am PIC mit DHT11 Datenausgang verbunden ist:

Main
   SET_DHT_OUTPUT                ;macro, configuriert DHT as output
   CALL     Wait_Taste           ;Tastendruck startet Messung
   ;
   CALL     Master_Ready         ;set DHT 18ms Low
   SET_DHT_INPUT                 ;macro configuriert DHT als input
   ;                                         ;(wird von PullUp auf H gezogen)
   CALL     Wait_DHT_response    ;wait for DHT11-response
   CALL     RX_40BitDHT_Data     ;empfaengt 40 Bit (MSB first)
; das sind 5x8Bit, welche z.B. in Var4:Var0 per Bitshift gespeichert 
; werden. Dann ist das MSByte in Var4 (8bit integral RH data), das
; LSByte in Var0 (8bit check sum.
   CALL     Proof_CheckSum       ;Datenempfang pruefen
   CALL     Display_Feuchte      ;Ausgabe Luftfeuchte
; Binaer in Dezimal wandeln, Dezimalwert als Sprungwert fuer den PCL
; verwenden und Segmenttabelle auslesen und dann gemultiplext ausgeben.
   CALL     Display_Temperatur   ;Ausgabe Lufttemperatur
; Binaer in Dezimal wandeln, Dezimalwert als Sprungwert fuer den PCL
; verwenden und Segmenttabelle auslesen und dann gemultiplext ausgeben.
   GOTO     Main

Es waere noch einiges mehrt als nachfolgend angefuehrt ueber das Schreiben von Code anzumerken. Du kannst praktisch alles zu Deiner Programmieraufgabe auf der Seite von sprut nachlesen!
http://www.sprut.de/electronic/pic/grund/grund.htm


mfG Wil

Offline HTLW10

  • Newbie
  • *
  • Beiträge: 6
    • Profil anzeigen
Re: DHT11 - Luftfeuchtigkeitssensor
« Antwort #4 am: Januar 17, 2016, 13:21:36 Nachmittag »
Mahlzeit,

danke erstmal für das Auseinandersetzen dieses Themas.
Ich habe bezüglich den PIC alle Arbeitsblätter die ich brauche bei mir Zuhause liegen, falls du dir diese mal anschauen möchtest könnte ich diese hochstellen.
Sprut.de ist mir etwas unverständlich von den Erklärungen.

Bezüglich "Banksel" ich mache das umschalten der Banken anderst -> bsf   STATUS,RP1Ebenfalls habe ich einen Befehlszettel mit dem ich nachschlagen kann, welche Befehle ich wofür verwenden kann/soll.

Die MCU ist eine 18-PIN DPIP,SOIC und der Interne Oszillator taktet mit 4MHz (So habe ich ihn eingestellt) was völlig ausreicht meiner Meinung.

Für die 7-Segment Anzeige benötige ich das PORTB (Siehe Bild meiner Platine), dieses PORT hat 8Pins.

Für den DHT11 brauche ich VSS,VDD und DATA Pins, d.h insg. 3PINS.
Jedoch muss ich hierbei die Anschlüsse am PORTB verwenden da die Pinnbelegung des DHT11 nicht kompatibel mit den Pins auf meinem Board. Das Problem ist hierbei dass die Data Leitung in der Mitte liegt deshalb habe ich den DHT11 am PORTB angehängt und die jeweiligen Pins (RB0,RB1,RB2) als Eingang oder Ausgang definiert (Siehe Programmabschnitt).

Kommen wir zum WIRE-Protokoll, da ich nur einen DATA-PIN habe, müsste ich diesen für Input & Output verwenden, welches für mich Schwierigkeiten verursacht dies zu programmieren.
Wie die Datenübertragung erfolgt ist mir schon klar, versuche dies über meinen Programm dir anzuschauen und vielleicht verbessern falls du eine bessere Möglichkeit findest.

Vertstehe folgendes nicht:
Zitat
Zuerst solltest Du die Umwandlung Binaer zu BCD/Dezimal programmieren. Dazu kannst Du als Hilfe den MPLAB-Simulator verwenden. Wenn das klappt gibst Du eine Zahl auf 1 Digit aus. Danach versuchst Du Dich darin die Digits gemultipext anzusteuern. Erst danach beginnst Du mit der Datenabfrage /-auswertung des DHT11.

und
Zitat
  CALL     RX_40BitDHT_Data     ;empfaengt 40 Bit (MSB first)
; das sind 5x8Bit, welche z.B. in Var4:Var0 per Bitshift gespeichert 
; werden. Dann ist das MSByte in Var4 (8bit integral RH data), das
; LSByte in Var0 (8bit check sum.

Offline Wil

  • Newbie
  • *
  • Beiträge: 7
    • Profil anzeigen
Re: DHT11 - Luftfeuchtigkeitssensor
« Antwort #5 am: Januar 18, 2016, 17:32:35 Nachmittag »
Hallo,
Du hast mich angeregt, es mal selbst mit dem DHT11 zu versuchen. Daher habe ich mal ueberlegt wie man einen solchen code schreiben koennte.
Leider kann ich pro Antwort nur 2000 Zeichen senden. Indem der Code heftig kommentiert ist, passt nur die Haelfte davon in diese Antwort. Werde dann eben noch eine 2. Antwort anfuegen.

mfG Wil

;*********************************************************************
; File         16F883 Feuchtesensor_DHT11_V00.ASM
; Author       wil
; Date         2016.01.17
; Version      0.0 erarbeiten der Datenuebertragung 1Wire-Protokoll
;*********************************************************************
;PROJEKTBESCHREIBUNG
; Der Feuchtesensor DHT11 gibt neben der Luftfeuchte, auch die
; Lufttemperatur aus.
; Auslesen des Feuchtesensors DHT11
; Communication Process: Serial Interface (SINGLE-WIRE Two-Way)
; Anzeige des Feuchtewertes
; Anzeige der Temperatur mit Vorzeichen +-
;
;*********************************************************************
;DHT11 Datenformat
; Die Datenfolge Bit 40 - /bit 1, beginnend mit Bit 40, werden
; fortlaufend uebertragen.
; jeweils 16 Bit sind 1 Messwert und sind so zugeordnet:
;
; Bit 40 - 24 (Byte 5:4)
; RH_Integer,RH_Decimal Relative Luftfeuchtigkeit (relative huminidity)
; RH z.B. 82,7 Prozent
;
; Bit 34 - 8 (Byte 3:2)
; T_Integer,T_Decimal   Lufttemperatur (temperature)
; T z.B. "27,3" Grad Celsius
;
; Bit 8-1 (Byte 1)
; Checksumme = letzte 8Bit der Summe Byte 5,4,3,2
;
; Die Wiederholrate des Sensors DHT11 liegt bei 5s (vgl. Datenblatt)
;
;DHT11 ONE-WIRE-INTERFACE
; RA5 fordert vom DHT die Daten an (Output, High), wird dann als
; Input konfiguriert und nimmt 40Bit DHT-Daten entgegen. H-Bit und
; L-Bit unterscheiden sich durch die Dauer des vom DHT ausgegebenen
; H-Levels.
; Als Zeitmesser wird TMR0 verwendet der mit einem Clock-Signal
; = 1MHz getaktet wird.
; Dazu wird der interne Oszillator mit fosc=4MHz verwendet.
; 4MHz / 4 = 1MHz, TMR0 Clock = 1MHz (1us = 1 clock-cycle)
; Prescaler wird NICHT fuer TMR0 verwendet.
;
;1-WIRE-PROTOKOLL DHT11
; A complete data transmission is 40bit, and the sensor sends higher
; data bit first.
; Data format: 8bit integral RH data + 8bit decimal RH data
;            + 8bit integral T data + 8bit decimal T data
;            + 8bit check sum.
; If the data transmission is right, the check-sum should be the last
; 8bit of "8bit integral RH data + 8bit decimal RH data
; + 8bit integral T data + 8bit decimal T data".
; MCU-Startsignal       DHT-PIN output = Low fuer 18ms
; DHT Antwort anfordern DHT-PIN input  = High 20-40us
;     DHT bereit, zieht DHT-PIN input  = Low  80us
;                 zieht DHT-PIN input  = High 80us
;     danach startet die Datenuebertragung mit LOW-Level
;                 zieht DHT-PIN input  = Low  50us           Bit 40
;                 0-Bit DHT-PIN input  = High 26-28us
;                 1-Bit DHT-PIN input  = High 70us
;
;                 zieht DHT-PIN input  = Low  50us           Bit 39
;                 0-Bit DHT-PIN input  = High 26-28us
;                 1-Bit DHT-PIN input  = High 70us
;         
; When DHT is sending data to MCU, every bit of data begins with the
; 50us low-voltage-level and the length of the following high-voltage
; -level signal determines whether data bit is "0" or "1"
;
;*********************************************************************
;DOKUMENTATIONEN
; Datenblaetter
; DHT11 Temperature and humidity module.pdf (Aosong) (englisch)
; DHT11 Humidity & Temperature Sensor D-Robotics UK (deutsch)
;       www.droboticsonline.com
; PIC16F882/883/884/886/887 microchip DS41291F
;
; Grundlageninfos: www.sprut.de (PIC, Assembler, Interface, Basics)
; Foren:    http://www.edaboard.com/thread247608.html (DHT11)
;           http://embedded-lab.com/blog/measurement-of-temperature-and-relative-humidity-using-dht11-sensor-and-pic-microcontroller/
;*********************************************************************
;HARDWARE
;  DHT11 Temperature and humidity module
;  Aosong(Guangzhou) Electronics Co.,Ltd.
;  www.aosong.com
;
;  7-Segmentanzeige 3 Digit
;  Optimal und erheblich einfacher waere die gleichzeitige Ausgabe
;  von Feuchte und Temperatur in einem 2zeiligen LCD-Modul.
;  Beim 3stelligen 7seg-Display kann Feuchtewert und Temperatur
;  nur abwechselnd angezeigt werden
;  Segmentaufteilung
;              AAA
;           F       B
;           F       B
;           F       B
;              GGG
;           E       C
;           E       C
;           E       C
;              DDD      DP
;               
;  Feuchte: Digit 2:3 2stellig,
;  Temperatur: Digit 1 Vorzeichen, Digit 2:3 Temperatur
;
;  PIC16F883   PORTA RA0   Trimmer
;                    RA1   Taster
;                    RA2:4 Digits 1-3
;                    RA5   DHT11 Data connected wit pullup (R=5k1) to Vdd=+5V
;
;              PORTB RB0:6 Segmente a-g
;              PORTC RC7:0 NC
;               
;*********************************************************************
;--SUPPRESSED WARNINGS (do not activate before code is proofed!)
   ERRORLEVEL -207   ;found label after column 1
   ERRORLEVEL -302   ;Register in operand not in bank 0.  Ensure that bank bits are correct.
   ;
;--MCU-CONFIGURATION
   LIST        P=16F883       ; Prozessortypdefinition   
   #INCLUDE    <P16F883.INC>  ; Bibliothek einbinden
  ;
   __CONFIG    _CONFIG1, _LVP_OFF & _INTRC_OSC_NOCLKOUT & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF
   __CONFIG    _CONFIG2, _WRT_OFF & _BOR40V
   ;
   ;_INTRC_OSC_NOCLKOUT  activates internal oscillator, sets RA6:RA7 to I/O-fuction
   ; _BOR40V             Set Brown Out Reset to 4,0V (Vdd-break down)
;*********************************************************************
;--VARIABLES / RAM ALLOCATION
   CBLOCK   0x020 ; Variablenblock starts at adr 020
      RH_Int,RH_Dec     ;Feuchte, Vor-,/Nachkommastellen z.B. 75,80
      T_Int,T_Dec       ;Temper.  "     "                "    23,20
      Chksum            ;Checksumme
      ;
      ACb1,ACb0         ;16bit Binaer zu Dezimal Uebergabevariable
      BCD4,BCD3,BCD2    ;Ausgabe 5 Dezimalstellen
      BCD1,BCD0
      cntDig,cntBit     ;counters
      ;     
      d1,d2,d3          ;Zaehl-Variable in Delays
      Flags             ;Ablaufsteuerung, Errorflag usw
   ENDC
   ;
;--LABELS & CONSTANTS
   DHT      EQU         RA5   ;MCU-Pin connected to DHT-Datapin
   BTTN     EQU         RA1   ;"       "         to Start-Button
   ADJ      EQU         RA0   ;"       "         adjust with Trimm-Poti
   ;
   ERR      EQU         .7    ;Flags,7=1 -> Error detected!
   TEMP     EQU         .6    ;Flags,6=1/0 Temperatur/Feuchte ausgeben
   BITVAL   EQU         .0    ;Flags,0=0/1  received bitvalue 0/1
   ;
   DIG2     EQU         RC2
   DIG1     EQU         RC1
   DIG0     EQU         RC0
   ;
;--MACROS
   SET_DHT_INPUT macro        ;configure RA5 as input
      banksel  TRISA
      bsf      TRISA,DHT
      banksel  0
   endm
   ;
   SET_DHT_OUTPUT macro       ;configure RA5 as output
      banksel  TRISA
      bcf      TRISA,DHT
      banksel  0
   endm
   ;
;*********************************************************************
   ORG   0x000       ; Reset-Vektor
   GOTO  Init
;*********************************************************************
   ORG   0x004       ;Interupt-Vektor (unused)
   RETFIE
;*********************************************************************
Init
;--PORTA                   ;S.39 datasheet
   BANKSEL  PORTA          ;bank0
   clrf     PORTA
   BANKSEL  TRISA          ;bank1
   clrf     TRISA
   bsf      TRISA,DHT      ;RA5 is DHT-input
   bsf      TRISA,BTTN     ;RA1 is Bttn-Input
   bsf      TRISA,ADJ      ;RA0 is adjust-input TrimmPoti
   ;                       ;ANSEL S.40 datasheet
   clrf     ANSEL          ;configure AN4:0 (PORTA-Pins) as digital I/O
   bsf      ANSEL,ADJ      ;set only  RA0/AN0 as analog
   movwf    ANSEL          ;configure AN4:0 in Analog Select Register
   clrf     ANSELH         ;"         AN13:8 as digital I/O S.48 datasheet
   ; 
;--PORTB
   BANKSEL  PORTB
   clrf     PORTB
   BANKSEL  TRISB         ;bank1, configure RB7:0 as LED7Segment outputs
   clrf     TRISB         ;RB6:0  used for segments G-A
   ;
;--PORTC
   BANKSEL  PORTC         ;nicht verwendet
   clrf     PORTC
   BANKSEL  TRISC
   clrf     TRISC
   ;
;--TMR0 CLOCK SOURCE, PORTB-PULLUPS
                              ;TMR0 S.75 datasheet
   BANKSEL  OPTION_REG        ;bank1 S.30 Datasheet
   ;b7=0 PortB pullups are disabled
   ;b5=0 Timer0 Clock Source ist fosc/4
   ;b3=1 Prescaler assigned to watchdog
   ;b2:0=000 Prescaler 2:1
   movlw    b'00001000'       
   movwf    OPTION_REG
   ;
;--INTERNAL OSCILLATOR (4MHz) bank1 S.62 Datasheet
   ;b6:4=110 fosc=4MHz
   ;b0  =1 Int.Osc is used for system clock (fosc)
   movlw    b'01100001'
   movwf    OSCCON         ;OSCCON konfigurieren
   BANKSEL  0              ;zurueck zu Bank 0
   ;
;--Preset Register & Variable
   bsf      PORTB,RA5      ;RA5 set output to H-Level
   clrf     Flags
   clrf     cntBit
   ;
   GOTO     Main
;*********************************************************************
; Tabelle zur Ausgabe einer Dezimalzahl im 7Segment-Display
; wird in page 0 (an dieser Stelle) untergebracht, dies vereinfacht
; das Auslesen der Daten.
;
; Aufruf:    movlw    Offset
;            CALL     table_7seg
;Funktion:
; "addwf  PCL" erhöht den Programmzähler um den Inhalt von WREG
; z.B. Offset im WREG = d'2'
; Das Programm springt dann zur Adresse = Wert des PCL, also z.B. nach
;    retlw   b'10100100'; 2
; Der Wert nach "retlw" wird ins WREG kopiert und danach erfolgt der
; Rücksprung zum nächsten Befehl NACH "CALL table_7seg", wo dann der
; Wert im WREG zur Ausgabe in der 7Segmentanzeige ausgegeben wird.
;
   addwf    PCL,f
    ;      .gfedcba  ;Segmente
;---Gemeinsame Anode
;z.B. KINGBRIGHT SA56-11
;Segment low + Digit low -> zeigt  Segment
;
table_7seg
retlw   b'11000000'; 0    
retlw   b'11111001'; 1          a
  retlw   b'10100100'; 2        -----    Adresse: PCL + 2
retlw   b'10110000'; 3      f|     |b
retlw   b'10011001'; 4       |  g  |
retlw   b'10010010'; 5        -----
retlw   b'10000011'; 6      e|     |c
retlw   b'11111000'; 7       |     |
retlw   b'10000000'; 8        -----
retlw   b'10011000'; 9          d    °DP
retlw   b'01111111'; DP
   ;
;---Gemeinsame Kathode
; movlw   b'xxxxxxxx'; 0-9,DP
; comf Segmente,f
;
table_7seg_Kathode
retlw   b'00111111'; 0 
retlw   b'00000110'; 1
retlw   b'01011011'; 2
retlw   b'01001111'; 3
retlw   b'11000000'; 4
retlw   b'10011001'; 5
retlw   b'10010010'; 6
retlw   b'10000010'; 7
retlw   b'01111111'; 8
retlw   b'01100111'; 9
retlw   b'10000000'; DP   
;*********************************************************************
;  HAUPTPROGRAMM
;*********************************************************************

Offline Wil

  • Newbie
  • *
  • Beiträge: 7
    • Profil anzeigen
Re: DHT11 - Luftfeuchtigkeitssensor
« Antwort #6 am: Januar 18, 2016, 17:35:35 Nachmittag »
Hier der 2. Teil des codes
 "16F883 Feuchtesensor_DHT11_V00.ASM"

mfG Wil

;*********************************************************************
;  HAUPTPROGRAMM
;*********************************************************************
Main
   ;DHT-Data = H before calling DHT11 to start transmission
   SET_DHT_OUTPUT                ;macro, configuriert RA5 as output
   bsf      PORTA,DHT            ;set DHT=1
   clrf     RH_Int               ;clear all previous received DHT11 Data
   clrf     RH_Dec
   clrf     T_Int
   clrf     T_Dec
   clrf     Chksum
   clrf     Flags                ;clear all Flags ERR etc...
   ;
   ;delay nur erforderlich wenn LCd verwendet wird (vgl. "Display_Feuchte")
   movlw    .50                  ;5s delay DHT11 check DHT11 each 5s
   CALL     Delay100ms          ;for actualised data
   ;
;1. send Start-Signal to DHT11
   bcf      PORTA,DHT
   movlw    .18
   CALL     Delay1ms             ;DHT=H waehrend 18ms
   ;
;2. wait for DHT-response H->L within 20-40us
;   DHT is pulled up to High-level by pullup to Vdd
;   Response: DHT11 pulls DHT down to LOW-Level after max 40us
;   a)check for timeout -> error
;   b)check H/Level at DHT-Pin
   ;
   SET_DHT_INPUT                 ;macro, configure DHT/RA5 as input
   bcf      INTCON,T0IF          ;=0, TMR0 has not overflowed
   movlw    .40                  ;set max time waiting for response
   movwf    TMR0                 ;=40us
Main_WaitForResponse
   btfsc    INTCON,T0IF          ;=1? DHT >40us without response?
   GOTO     Main_End             ;YES, Error no response within 40us
   btfsc    PORTA,DHT            ;=0? has DHT changed to Low?           
   GOTO     Main_WaitForResponse ;NO, try it again
   ;                             
;3. DHT response LOW-Signal max.length = 80us
   bcf      INTCON,T0IF          ;TMR0 has not overflowed
   movlw    .80                  ;set max time waiting for response
   movwf    TMR0                 ;=80us
Main_Response0
   btfsc    INTCON,T0IF          ;=1? DHT 80us with no response?
   GOTO     Main_End             ;YES, Error no resonse within 80us
   btfss    PORTA,DHT            ;=1? has DHT11 responsed?           
   GOTO     Main_Response0       ;NO, try it again
   ;
;4. DHT response HIGH-Signal max.length = 80us
   bcf      INTCON,T0IF          ;TMR0 has not overflowed
   movlw    .80                  ;set max time waiting for response
   movwf    TMR0                 ;=80us
Main_Response1
   btfsc    INTCON,T0IF          ;=1? DHT 80us with no response?
   GOTO     Main_End           ;YES, Error no resonse within 80us
   btfsc    PORTA,DHT            ;=0? has DHT11 responsed?           
   GOTO     Main_Response1       ;NO, try it again
   ;
;5. DHT11 starts now with Data transmission and sends 40 Bit
   CALL     RX_DHT_Data          ;receive 40 Databit (MSB first)
   btfsc    Flags,ERR            ;=1 Error occured!
   GOTO     Main                 ;start new transmission
   ;
   ;all DHT-bits 40:1 are now stored in
   ;RH_Int,RH_Dec,T_Int,T_Dec,Chksum
   ; 
   CALL     Proof_CheckSum       ;All Datas OK?
   btfsc    Flags,ERR            ;=0? no error?
   GOTO     Main                 ;NO, checksum error, don't display data
   ;
   btfsc    Flags,TEMP           ;TEMP=0?
   GOTO     Main_Out_Temperatur  ;NEIN, dann Temperatur ausgeben
   ;                             ;JA, Feuchtewert ausgeben           
Main_Out_Luftfeuchte
   movf     RH_Int,w             ;Feuchtewert in Uebergabevariable
   movwf    ACb1                 ;kopieren
   movf     RH_Dec,w
   movwf    ACb0
   CALL     Bin16bit_Dez
   ;
   CALL     Display_Feuchte      ;Feuchtwert -> 7seg LED-Display
   bsf      Flags,TEMP           ;=1 naechste Ausgabe: Temperatur
   GOTO     Main_End
   ;
Main_Out_Temperatur
   movf     T_Int,w              ;Temperaturwert in Uebergabevariable
   movwf    ACb1                 ;kopieren
   movf     T_Dec,w
   movwf    ACb0
   CALL     Bin16bit_Dez
   ;     
   CALL     Display_Temperatur   ;Feuchtwert -> 7seg LED-Display
   bsf      Flags,TEMP           ;naechste Ausgabe: Luftfeuchte
   ;
Main_End
   GOTO     Main
;*********************************************************************
;  SUBROUTINES
;*********************************************************************
Wait_Taste
;Tastenabfrage per polling
;Taste ist Low-aktiv,
;Entprellroutine vorsehen? Evtl. reicht hierfuer auch ein Delay
;von ca. 30-50ms
   RETURN
;*********************************************************************
RX_DHT_Data             
;receives 40 Databits from DHT11 (MSBit first)
   movlw    .40
   movwf    cntBit               ;counts received bits
   ;
RX_DHT_Loop
;1. DHT Low before each H or L Bit
   bcf      INTCON,T0IF          ;TMR0 has not overflowed
   movlw    .50                  ;set max time waiting for response
   movwf    TMR0                 ;=50us
RX_DHT_Low
   btfsc    INTCON,T0IF          ;=1? DHT 50us with no response?
   GOTO     RX_DHT_Error         ;YES, Error no resonse within 50us
   btfss    PORTA,DHT            ;=1? start of Bitvalue?           
   GOTO     RX_DHT_Low           ;NO, try it again 
   ;
;2. length of H-level bestimmt Bitvalue
;   26-28us bitvalue = 0
;   70ua    bitvalue = 1
   CALL     Bit_Value   ;receive 1 Bit, detect value 0 or 1
   ;
;3. move Bits throug storage registers Chksum:4
   bcf      STATUS,C          ;preset C=0
   btfsc    Flags,BITVAL      ;bit value = 1?
   bsf      STATUS,C          ;then set C=1
   ;copy bit value to STATUS,C, rotate left(RLF) Chksum:RH_Int through Carry
   ;CARRY-Bit -> Chksum,0 Chksum,7->T_Dec,0, T_Dec,7->T_Int,0 usw bis RH_Int
   RLF      Chksum,f          ;copy C in bit 0 moves bit 7 to C
   RLF      T_Dec,f           ;copy C in bit 0 "     "   " "  "
   RLF      T_Int,f           ;copy C in bit 0 "     "   " "  "
   RLF      RH_Dec,f          ;copy C in bit 0 "     "   " "  "
   RLF      RH_Int,f          ;copy C in bit 0 "     "   " "  "
   ;sind Bit 40-1 uebertragen, ist RH_Int,7=Bit40 und Chksum,0=Bit1
   decfsz   cntBit,f          ;STATUS,Z=0? Bit 40-1 empfangen?
   GOTO     RX_DHT_Loop       ;NO next Bit
   ;
   GOTO     RX_DHT_End
RX_DHT_Error
   bsf      Flags,ERR         ;Fehler aufgetreten
   movlw    b'00000111'       ;Value=3 fehlernur wird in BCD
   movwf    PORTC             ;an Debug PORTB, LEDs an RC7:0 ausgegeben
   sleep
RX_DHT_End   
   RETURN
;*********************************************************************
Bit_Value
;   26-28us bitvalue = 0
;   70ua    bitvalue = 1
;
   bcf      INTCON,T0IF          ;TMR0 has not overflowed
   movlw    .30                  ;set max time waiting for value=0
   movwf    TMR0                 ;=28us
Bit_Low_Loop
   btfss    INTCON,T0IF          ;=1 has TMR0 overflowed?
   GOTO     Bit_Low_Loop         ;NO, wait 30us
   ;
   btfsc    PORTA,DHT            ;DHT-Pin = 0?
   GOTO     Bit_High             ;NO,check for H-level
   bcf      Flags,BITVAL         ;YES, bit value = 0
   GOTO     Bit_Value_End
   ;
Bit_High
   bcf      INTCON,T0IF          ;TMR0 has not overflowed
   movlw    .40                  ;set max time waiting for value=0
   movwf    TMR0                 ;=30+40us=70us
Bit_High_Loop
   btfsc    INTCON,T0IF          ;=1 has TMR0 overflowed?
   GOTO     Bit_Value_Error      ;YES H-level sustains more then 70us
   btfsc    PORTA,DHT            ;NO, DHT-Level=0?
   GOTO     Bit_High_Loop        ;No,
   bsf      Flags,BITVAL         ;YES, bit value = 1
   ;   
   GOTO     Bit_Value_End
Bit_Value_Error 
   bsf      Flags,ERR         ;Fehler aufgetreten
   movlw    b'00000011'       ;Value=3 fehlernur wird in BCD
   movwf    PORTC             ;an Debug PORTB, LEDs an RC7:0 ausgegeben
   sleep
Bit_Value_End
   RETURN
;*********************************************************************
Proof_CheckSum       ;korrekten Datenempfang pruefen
;Testdaten
   GOTO     Proof_Check1   ;ueberspringt Testdaten
   movlw    .75
   movwf    RH_Int
   movlw    .3
   movwf    RH_Dec
   movlw    .27
   movwf    T_Int
   movlw    .5
   movwf    T_Dec
   movlw    .110           ;=75+3+27+5
   movwf    Chksum
   ;
Proof_Check1
;Checksum berechnen (falls das Ergebnis > 8 bit ist, hat dies keine
;Auswirkung auf die letzten 8 Bit des Ergebnisses, da ein Uebertrag
;bei Ueberlauf des LSB nur in das MSB erfolgt - kann also unter den
;Tisch fallen.
   ;
   movf     RH_Int,w
   addwf    RH_Dec,w
   addwf    T_Int,w
   addwf    T_Dec,w
   ;
   andwf    Chksum,w
   btfss    STATUS,Z    ;Z=1? Chksum = WREG?
   bsf      Flags,ERR   ;Nein, fehlerhafte Daten
   
   RETURN
;*********************************************************************
Bin16bit_Dez         ;16-bit unsigned BINARY to BCD conversion
; Übergabevariable: ACb1 : ACb0 (udata_shr)
; Ergebnisvariable: BCD4 : BCD0 (Steht im FSR)
; Für midrange PICs müssen die Variablen FSR0, INDF0 zu FSR, INDF
; geändert werden.
;
;   CBLOCK
;      BCD4,BCD3,BCD2
;      BCD1,BCD0
;      ACb1,ACb0
;      cntBit,cntDig
;   ENDC     
   ;
   clrf     BCD4           ;MSB 16bit zu Dezimal
   clrf     BCD3
   clrf     BCD2
   clrf     BCD1
   clrf     BCD0
   ;---------Outer loop
   movlw    d'16'          ;16Bit BCD zu Dezimal
   movwf    cntBit         ;bit counter
Bin16bit_Dez1:
   rlf      ACb0,f         ;Shift 32-bit accumulator
   rlf      ACb1,f         ;left to put MSB into Carry
   movlw    BCD0           ;Point to address of least
   movwf    FSR            ;significant bcd digit
   ;
   movlw    d'5'           ;16Bit BCD zu Dezimal
   movwf    cntDig         ; digit counter
   ;---------Inner loop
Bin16bit_Dez2:
   rlf      INDF,f         ;Shift Carry into bcd digit
   movlw    D'10'          ;Subtract ten from digit then
   subwf    INDF,w         ; check and adjust for decimal overflow
   btfsc    STATUS,C       ;If Carry=1 (result >= 0)
   movwf    INDF           ; adjust for decimal overflow
   decf     FSR,f         ;Point to next bcd digit
   decfsz   cntDig,f       ;Decrement digit counter
   GOTO     Bin16bit_Dez2  ; - go if cntDig > 0
   decfsz   cntBit,f       ;Decrement bit counter
   GOTO     Bin16bit_Dez1  ; - go if cntBit > 0
   RETLW    0
;*********************************************************************
Display_Feuchte
;Feuchtewert steht in BCD4-BCD3-BCD2  , BCD1-BCD0
;                     Vorkommastellen , Nachkommastellen
;Es werden nur BCD3,BCD2,BCD1 ausgegeben!
;
;Es ist hier ein "quasi"-PWM verwirklicht, indem die Treiber
;jeweis fuer 10ms (frequenz = 1/0.03 ca 33Hz) umgeschaltet werden.
;
   movlw    .255           ;255 Durchlaufe = 8s Anzeigezeit
   movwf    cntDig
   ;
Display_Feuchte_Loop   
   movf     BCD3,w
   CALL     table_7seg     ;returns with 7seg-Digits in WREG
   movwf    PORTB
   bsf      PORTC,DIG2     ;tens of humidity ON
   movlw    .10
   CALL     Delay1ms
   bcf      PORTC,DIG2     ;tens of humidity OFF
   ;
   movf     BCD2,w
   CALL     table_7seg     ;returns with 7seg-Digits in WREG
   movwf    PORTB
   bsf      PORTC,DIG1     ;ones of humidity ON
   movlw    .10
   CALL     Delay1ms
   bcf      PORTC,DIG1     ;ones of humidity OFF
   ;
   ;Dezimalpoint is continous switched on by hardware (eg with Rv to Vdd)
   movf     BCD1,w
   CALL     table_7seg     ;returns with 7seg-Digits in WREG
   movwf    PORTB
   bsf      PORTC,DIG0     ;1 digit after decimalpoint ON
   movlw    .10
   CALL     Delay1ms
   bsf      PORTC,DIG0     ;1 digit after decimalpoint OFF
   ;
   decfsz   cntDig,f
   GOTO     Display_Feuchte_Loop
   ;
   RETURN
;*********************************************************************
Display_Temperatur
;Temperatur steht in  BCD4-BCD3-BCD2  , BCD1-BCD0
;                     Vorkommastellen , Nachkommastellen
;Es werden nur BCD3,BCD2,BCD1 ausgegeben!
;  T_Dec (T decimal) ausgeben
;  Segmentansteuerung, Digitansteuerung (bei multiplex)
   RETURN
;*********************************************************************
Delay_us
;WREG: Uebergabe Anzahl abzuwartender Arbeitszyklen
;bei fosc=4MHz 1 Arbeitszyklus = 1us
;Minimale delay = 13us
;Besipiel fuer Delay = 30us
;  movlw    .30            ;(max 242)
;  CALL     Delay_us
;
   sublw    .12               ;.12- Wert im WREG = Preset TMR0
   movwf    TMR0
   bcf      INTCON,TMR0IF     ;TMR0IF=0, TMR0 has not overflowed
Bit_Pause_Loop
   btfss    INTCON,TMR0IF     ;TMR0IF=1? TMR0 overflowed 255-0?
   GOTO     Bit_Pause_Loop    ;NO
   nop
   RETURN                     ;YES
;*********************************************************************
Delay1ms
; Übergabe Anzahl 1/1000s*FOSC_MULT im WREG
; d3=100 -> 100.007 instruction cycles incl. CALL
   movwf    d3          ;falls d3=0, Delayzeit = 1ms vorgeben:
   xorlw    .0          ;Vergleich WREG = d3 = 0
   btfsc    STATUS,Z    ;Z=1? WREG=0?
   incf     d3,f        ;JA, d3+1 -> 1ms Delayzeit
Delay1ms_0:
   GOTO     $+1
   GOTO     $+1
   nop
   movlw    .197        ;0xC5
   movwf    d1
   movlw    .1          ;0x01
   movwf    d2
Delay1ms_1:
   decfsz   d1,f
   GOTO     $+2
   decfsz   d2,f
   GOTO     Delay1ms_1
   goto     $+1   
   goto     $+1   
   decfsz   d3,f
   GOTO     Delay1ms_0
   RETURN   ;Generated by http://www.piclist.com/cgi-bin/delay.exe
;********************************************************************
Delay100ms
; Übergabe Anzahl 1/10s*FOSC_MULT im WREG
; d3=100 -> 10.000.008 instruction cycles incl. CALL
   movwf    d3          ;falls d3=0, Delayzeit = 100ms vorgeben:
   xorlw    .0          ;Vergleich WREG = d3 = 0
   btfsc    STATUS,Z    ;Z=1? WREG=0?
   incf     d3,f        ;JA, d3+1 -> 100ms Delayzeit
Delay100ms_0:
   nop
   movlw    0x1E
   movwf    d1
   movlw    0x4F
   movwf    d2
Delay100ms_1:
   decfsz   d1, f
   GOTO     $+2
   decfsz   d2, f
   GOTO     Delay100ms_1   
   GOTO     $+1
   nop
   decfsz   d3,f
   GOTO     Delay100ms_0
   nop
   RETURN   ;Generated by http://www.piclist.com/cgi-bin/delay.exe*
;********************************************************************
   END

Offline Wil

  • Newbie
  • *
  • Beiträge: 7
    • Profil anzeigen
Re: DHT11 - Luftfeuchtigkeitssensor
« Antwort #7 am: Januar 18, 2016, 18:01:37 Nachmittag »
Hallo,
vergass voranzustellen, dass der hier vorgestellte Code nicht fertig ist und durchaus Fehler enthaelt. Zumindest laeuft der in MPLAB-Simulator fehlerfrei durch, was aber nicht ausschliesst, dass logische Fehler im Code enthalten sind.  Bin leider erst in der Lage in ca. 3Monaten mir den DHT11 beschaffen zu koennen.

mfG Willi

Offline HTLW10

  • Newbie
  • *
  • Beiträge: 6
    • Profil anzeigen
Re: DHT11 - Luftfeuchtigkeitssensor
« Antwort #8 am: Januar 18, 2016, 19:15:05 Nachmittag »
Hallo Wil,

ich danke dir vorerst viel um deine großzügige Hilfe und die Zeit die du dir nimmst!

Ich habe nun das Programm einmal per MPLAB SIM sicherheitshalber durchlaufen lassen, dass auch einwandfrei funktioniert hat.
Das Problem ist, die Anzeige zeigt LEIDER nichts an.
Ich bin das Programm mittlerweile 2mal durchgegangen und dabei habe ich nirgends entdeckt wo du eigentlich die PINS für das DHT11 Bauteil definiert hast, also Masse, VDD und DATA.
Ich hoffe die hängen am PORTB (RB0,RB1,RB2) falls ja, hat das Programm noch was an sich.

Ich versuche das Problem zu lösen, jedoch würde ich dich gern bitten mir dabei etwas Unterstützung zu geben.

Gruß,
Kris.

Offline HTLW10

  • Newbie
  • *
  • Beiträge: 6
    • Profil anzeigen
Re: DHT11 - Luftfeuchtigkeitssensor
« Antwort #9 am: Januar 18, 2016, 19:23:25 Nachmittag »
Zitat
;--MACROS
   SET_DHT_INPUT macro        ;configure RA5 as input
      banksel  TRISA
      bsf      TRISA,DHT
      banksel  0
   endm
   ;
   SET_DHT_OUTPUT macro       ;configure RA5 as output
      banksel  TRISA
      bcf      TRISA,DHT
      banksel  0
   endm
   ;

Verstehe ich das richtig? RA5 ist meine Datenleitung in dem Fall Pin 2 meines DHT11.


Offline Wil

  • Newbie
  • *
  • Beiträge: 7
    • Profil anzeigen
Re: DHT11 - Luftfeuchtigkeitssensor
« Antwort #10 am: Januar 18, 2016, 21:12:37 Nachmittag »
Hallo

Fuer Vdd und GND wird kein Portpin verwendet! Vdd wird direkt nach = +5V (Vdd)  und GND an GND der Spannungsversorgung angeschlossen. Der DHT11 zieht in Ruhe nur ca. 60uA.

Der DHT-Data-Pin  ist  PORTA,RA5!
Dieser Pin wurde von mir im Abschnitt "Labels & Constant" so definiert:
                                    DHT  equ  RA5 
man koennte auch schreiben
                                    DHT11_Datenleitung    equ       RA5
hierdurch kann man im Code leichter verstaendlich so weiterarbeiten:
                                    bsf PORTA,DHT
                                   oder noch verstaendlicher
                                    bcf  PORTA,DHT11_Datenleitung
dies traegt nach meinem Verstaendnis zur besseren Lesbarkeit bei, aber auch Aenderungen oder die Umsetzung auf eine andere MCU wir vereinfacht, indem nur im Definitionsteil "Labels & Constant" die neuen Ports, Pins, Constante, Labels zu benennen sind und nicht der gesamte Code nach z.B. RA5 durchsucht werden muss. Dies hat sprut sehr gut erlaeutert.

In meinem Code ist auch die Ausgabe per 7segment aufgezeigt.
Programmiere erst die Ausgabe in der Anzeige, meinetwegen nur fuer 1 Digit. Dann weisst Du dass die Anzeige klappt. Erst dann widmest Du Dich dem weiteren Code. Zwischenergebnisse kannst Du Dir dann ueber eine Hilfsroutine auf der Anzeige ausgeben lassen. Du kannst ja nun Registerinhalte als Dezimalzahl anzeigen lassen! Ausserdem faellt die Unsicherheit weg, dass die Ausgabe nicht funktionieren koennte und Du kannst den Fehler an anderer Stelle im Code suchen.

Bei sprut - auch wenn Du ihn nicht magst - findest Du hervorragende Anleitung zur Ansteuerung von 7segment Anzeigen!

Du kannst ja ein neues ASM-File "Test7segment.ASM" schreiben, indem Du das aktuelle umbenennst und dann konsequent die Teile rausloescht die mit der Anzeige nichts zu tun haben. Also in dem Bereich ab Main (Hauptprogramm).

Wichtig sind diese Programmteile:

1.    table_7segment
      (beachte ob Deine Anzeige gemeinsame Anode, bzw Kathode verwendet!)

Main

2. CALL Proof_Checksum - Daten zuweisen
   dann sind die Feuchte-/Temperaturdaten mit konkreten Werten belegt.

3.   movf     RH_Int,w             ;Feuchtewert in Uebergabevariable
     movwf    ACb1                 ;kopieren
      movf     RH_Dec,w
      movwf    ACb0
     CALL     Bin16bit_Dez         ;wandelt Binaer zu 5 Digits Dezimal
   ;
 4.  CALL     Display_Feuchte      ;Feuchte oder Temperatur im 7seg LED-Display ausgeben
   ;
Main_End
GOTO Main_End
                                           ;
Ich bin jetzt leider fern der Heimat und bis Samstag nicht mehr erreichbar.

mfG Wil

Offline HTLW10

  • Newbie
  • *
  • Beiträge: 6
    • Profil anzeigen
Re: DHT11 - Luftfeuchtigkeitssensor
« Antwort #11 am: Januar 18, 2016, 21:43:00 Nachmittag »
Danke,

ich baue mir morgen ein Steckbrett und verbinde dass nach diesen Vorgaben.
Das Problem ist, dass die einiges an Kenntnisse fehlen um dies alleine programmieren zu können.
Jedoch war es dem Lehrer schnuppe...

Gruß, Kris.

Offline Wil

  • Newbie
  • *
  • Beiträge: 7
    • Profil anzeigen
Re: DHT11 - Luftfeuchtigkeitssensor
« Antwort #12 am: Januar 22, 2016, 15:15:13 Nachmittag »
Hallo Kris,
bin wieder im Lande. Ein Steckboard zu verwenden halte ich fuer eine gute Idee. Dann bist Du von den Vorgaben des Testboards so wie Du es derzeit hattest entbunden.
Ich bin gerne bereit Dir bei der Entwicklung der Software mit Rat und Tat, so gut ich kann zu helfen. :-)

Leider kann ich seltsamer Weise keine Anhaenge senden, warum das bei mir nicht funktioniert weiss ich nicht. Vielleicht komme ich noch dahinter...

mfG Wil

 


* Recent Topics