Forum: Mikrocontroller und Digitale Elektronik DHT11 auf PIC16F883


von Dulkanovic K. (htlw10)


Angehängte Dateien:

Lesenswert?

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.
Zurzeit bin ich soweit gekommen, nun kann ich nichts ausgeben da am 
PORTB mein Modul hängt und ebenfalls die 7-Segmentanzeige, wie mache ich 
dies am Besten...
1
; PROZESSOR: PIC16F883, Programmaufbau, Header einfach für Übungsboard seriell
2
; NAME: 
3
; PROGRAMM:
4
5
;Programmbeginn
6
; Angaben für den Assembler ******************************************************
7
   list      p=16F883      ; Prozessortypdefinition   
8
   #include    <P16F883.INC>   ; Bibliothek einbinden
9
   errorlevel   -302
10
11
; Konfiguration für den Prozessor ************************************************
12
   __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
13
   __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V    ; _INTRC_IO interner Oszillator   
14
15
; Variablendeklaration ***********************************************************
16
   cblock   0x020         ; Variablenblock beginnend bei Adresse 020 (Hex)
17
   Warte1
18
   Warte2
19
   Variab1
20
   Kiki
21
   Kikislave
22
   endc               ; Ende des Variablenblockes
23
24
; Adressendefinition  ************************************************************
25
   ORG      0x000         ; Reset-Vektor (Hex)
26
   
27
; Intitialisierung  **************************************************************
28
Init
29
   bsf      STATUS, RP0      ; auf Bank 1 umschalten
30
   movlw   b'00001000'
31
   movwf   OPTION_REG
32
   movlw   b'01100001'      ; interner RC-Oszillator, Frequenz 4MHz
33
   movwf   OSCCON         ; in OSCCON laden
34
   movlw   b'00000011'      ; RA0 und RA1 als Eingänge, Rest als Ausgänge definieren
35
   movwf   TRISA         ; in TRISA laden (RA0 Trimmer, RA1 Taster)
36
   clrf   TRISB         ; PORTB als Ausgänge definieren (7-Segmentanzeigen)
37
   movlw   b'11011000'      ; SDA, SCL, RX und TX auf Eingänge, Rest als Ausgänge definieren
38
   movwf   TRISC         ; in TRISC laden (RC0 Vorzeichen LED)
39
   bsf      STATUS, RP1      ; auf Bank 3 umschalten
40
   movlw   b'00000001'      ; RA0 als anlog, Rest als digital I/O definieren
41
   movwf   ANSEL         ; in ANSEL laden   
42
   clrf   ANSELH         ; ANSELH löschen, alle I/O als digital definieren
43
   movlw   b'00000001'      ; RA0 als anlog, Rest als digital I/O definieren
44
   movwf   ANSEL         ; in ANSEL laden   
45
   bcf      STATUS, RP0      ; auf Bank 0 zurückschalten
46
   bcf      STATUS, RP1
47
   bcf      ADCON0, ADON   ; A/D-Wandler ausschalten
48
   clrf   PORTA         ; alle PORTA-Ausgänge auf 0 setzen
49
   clrf   PORTB         ; alle PORTB-Ausgänge auf 0 setzen
50
   clrf   PORTC         ; alle PORTC-Ausgänge auf 0 setzen
51
   clrf   Kikislave
52
   clrf   Kiki
53
54
; Hauptprogramm  *****************************************************************
55
main
56
   movlw   b'00000110'   
57
   movwf   PORTB
58
   bcf      PORTB,RB1
59
   call   warte18ms
60
   bsf      PORTB,RB1
61
   bsf      STATUS,RP0
62
   movlw   b'00000010'
63
   movwf   TRISB
64
   bcf      STATUS,RP0
65
   btfsc   PORTB,RB1
66
   goto   $-1
67
   btfsc   PORTB,RB1
68
   goto   $-1
69
70
Abfragen
71
   btfsc   PORTB,RB1
72
   goto   $-1
73
   btfss   PORTB,RB1   
74
   goto   $-1
75
   bcf      INTCON,TMR0IF
76
   movlw   d'0'
77
   movwf   TMR0
78
   btfsc   PORTB,RB1
79
   goto   $-1
80
   movlw   d'50'
81
   subwf   TMR0,w
82
   rlf      Kiki,f
83
   incf   Kikislave,f
84
   movlw   d'8'
85
   subwf   Kikislave,w
86
   btfss   STATUS,Z
87
   goto   Abfragen
88
   movlw   b'11111000'
89
   andwf   Kiki,f
90
   movf   Kiki,w
91
   iorwf   PORTC,f
92
   
93
94
   clrf   Kikislave
95
   call   warte18ms
96
   call   warte18ms
97
   goto   main
98
         
99
   
100
   
101
   
102
   goto $               ; Sprung auf sich selbst
103
   ;goto   main         ; Sprung zum Hauptprogrammbeginn
104
105
; Unterprogramme *****************************************************************
106
warte18ms
107
108
   movlw   d'30'
109
   movwf   Warte1
110
Loop         
111
   movlw   d'200'
112
   movwf   Warte2
113
   decfsz   Warte2,f
114
   goto   $-1
115
   decfsz   Warte1,f
116
   goto   Loop
117
      
118
   return
119
   end                  ; Assemblerende   
120
; Programmende *******************************************************************

Danke im vorraus!
Gruß, Kris.

von Witkatz :. (wit)


Lesenswert?

Dulkanovic K. schrieb:
> 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

Bitte nicht HIGH und LOW Pegel mit dem logischen Wert vermischen. Das 
Bit-Frame mit LOW-HIGH codiert den logischen Wert des übertragenen Bits. 
Bei logisch "0" dauert die HIGH Phase 26-28µs und bei "1" dauert sie 
70µs.

Dulkanovic K. schrieb:
> dabei müsste ich mit dem TIMER arbeiten,

Nicht zwingend. Man kann auch nach der Low-High Flanke 40µs in einer 
Warteschleife warten und das Signal einfach abfragen.

von HTLW10 (Gast)


Lesenswert?

Witkatz :. schrieb:
> Dulkanovic K. schrieb:
>> 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
>
> Bitte nicht HIGH und LOW Pegel mit dem logischen Wert vermischen. Das
> Bit-Frame mit LOW-HIGH codiert den logischen Wert des übertragenen Bits.
> Bei logisch "0" dauert die HIGH Phase 26-28µs und bei "1" dauert sie
> 70µs.

Verwechselt wurde da nichts, gemeint war;
- Wenn das high Signal 70µs andauert = logisch 1
- Wenn das high Signal 24-27µs andauert = logisch 0


> Dulkanovic K. schrieb:
>> dabei müsste ich mit dem TIMER arbeiten,
>
> Nicht zwingend. Man kann auch nach der Low-High Flanke 40µs in einer
> Warteschleife warten und das Signal einfach abfragen.

Wenn ich das Programm kurz und bündig halten möchte dann wäre das 
Arbeiten mit Timer vernünftiger.

Ich brauche ANTWORTEN und keine "falschen" Ergänzungen oder Kommentare.

Gruß,
Kris.

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.