;***** DHT22.sub ********************************************************** ; ; デジタル温度湿度センサーモジュール DHT22 制御サブルーチン ; ; (dht22_measure) ; ; Copyright (C) 2021 by M.Yamamoto. All rights reserved. ; ; ( coding: Ver. 0.00 2021/01/15 by M.Yamamoto ) ; coding: Ver. 1.00 2021/01/15 ; update: Ver. 1.01 2021/01/24 変数名を変更 ; bugfix: Ver. x.xx ; ;******************************************************* PicAsm 0259 ****** ;#define TRISX TRISC ;例. DHT22 で使用する DATA ポートを ;#define PORTX PORTC ;include する側で #define 定義をすること ;<使用外部ルーチン> ;(wait_10us, wait_1ms) ;<使用レジスタ> ;humidity_h ;湿度上位 8 bit ;humidity_l ;湿度下位 8 bit ;temperature_h ;温度上位 8 bit ;temperature_l ;温度下位 8 bit ;time_cnt ;bit0-5:時間計測カウンタ, ;bit6:チェックサム(CRC)エラー, bit7:タイムアウトエラー ;lp_cnt1 ;汎用ループカウンタ ;lp_cnt2 ;汎用ループカウンタ ;work1 ;ワーク ;work2 ;ワーク ;========================================================================== ; デジタル温度湿度センサーモジュール DHT22 から読み出し ;========================================================================== dht22_measure bsf STATUS,RP0 ;バンク 1 bcf TRISX,DHT ;出力ポート bcf STATUS,RP0 ;バンク 0 bcf PORTX,DHT ;DHT="L", スタート信号 call wait_1ms ;1m 秒ウェイト bsf STATUS,RP0 ;バンク 1 bsf TRISX,DHT ;入力ポート, プルアップで DHT="H" bcf STATUS,RP0 ;バンク 0 call dht_low ;DHT22 からの応答信号 "L" を待つ btfsc time_cnt,7 ;タイムアウトエラー か? goto dht_m05 ;Yes movlw humidity_h ;湿度上位 8 bit のアドレス movwf FSR ;間接アドレスに設定 clrf work1 ;ワーク, チェックサム計算用 movlw 5 movwf lp_cnt1 ;バイトカウンタ dht_m01 clrf work2 ;ワーク, ビットデータ保管用 movlw 8 movwf lp_cnt2 ;ビットカウンタ dht_m02 call dht_low ;DHT22 からのビットの同期信号 "L" を待つ btfsc time_cnt,7 ;タイムアウトエラー か? goto dht_m05 ;Yes call dht_high ;DHT22 からの "H" 信号の長さを計測 btfsc time_cnt,7 ;タイムアウトエラー か? goto dht_m05 ;Yes bcf STATUS,C rlf work2,F ;左にシフト movlw 4 ;3 〜 4 subwf time_cnt,W btfsc STATUS,C ;time_cnt >= 4 か? bsf work2,0 ;Yes. ビット "1" decfsz lp_cnt2,F ;ビットカウンタ lp_cnt2 - 1 = 0 か? goto dht_m02 ;No movf work2,W ;受信データ 1 バイト decfsz lp_cnt1,F ;バイトカウンタ lp_cnt1 - 1 = 0 か? goto dht_m03 ;No goto dht_m04 ;Yes dht_m03 movwf INDF ;受信データ格納 incf FSR,F ;間接アドレスの更新 addwf work1,F ;チェックサムの計算 goto dht_m01 ;No dht_m04 subwf work1,W ; btfss STATUS,Z ;チェックサムは一致 か? bsf time_cnt,6 ;No. チェックサム(CRC)エラー dht_m05 return ;-------------------------------------------------------------------------- ; DHT22 からの "L" 信号を待つ "H" → "L" → "H" dht_low call dht_high ;DHT22 からの "H" 信号の長さを計測 btfsc time_cnt,7 ;タイムアウトエラー か? goto dht_l02 ;Yes clrf time_cnt ;初期設定 dht_l01 call wait_10us incf time_cnt,F ; btfsc PORTX,DHT ;DHT="H" か? goto dht_l02 ;Yes movlw 10 subwf time_cnt,W btfss STATUS,C ;time_cnt >= 10 か? goto dht_l01 ;No bsf time_cnt,7 ;タイムアウトエラー dht_l02 return ;-------------------------------------------------------------------------- ; DHT22 からの "H" 信号の長さを計測 dht_high clrf time_cnt ;初期設定 dht_h01 call wait_10us incf time_cnt,F ; btfss PORTX,DHT ;DHT="L" か? goto dht_h02 ;Yes movlw 10 subwf time_cnt,W btfss STATUS,C ;time_cnt >= 10 か? goto dht_h01 ;No bsf time_cnt,7 ;タイムアウトエラー dht_h02 return ;=============================================================== end ======