am2302溫濕度感測器採用單匯流排方式與mcu通訊,這就要求mcu有一定的處理速度,
才能正確解析收到的am2302傳送過來的資料。
am2302一次傳送40位資料給mcu。資料位0由50微妙低電平加26微妙高電平組成。
資料位1有50微妙低電平加70微妙高電平組成。這種編碼方式有點象nec的紅外傳輸協議。
另外am2302需要由mcu發起啟動訊號。所以針對這種單線協議,雖然可以採用電平
變化中斷+計數器,或輸入捕捉來解析40位資料位。但這就需要切換埠的輸入輸出
配置及控制相應外設的介入時機。
本文介紹的方法採用簡單的埠讀+延時操作來解析40位資料位。
if (data_port == 1)
delay_us(30);
if (data_port == 1)
//bit = 1
else
//bit = 0
起始訊號通過把埠改為輸出,然後通過寫埠+延時來實現。
//改變data_port為輸出
data_port = 0;
delay_us(1000);
data_port = 1;
delay_us(20);
//改變data_port為輸入
根據上述協議的描述,很容易抽象出如下函式:
static
unsigned
char am2302_read_byte(void)
delay_us(40);
if (0 == data_port)
else}}
return data;
}
通過呼叫am2302_read_byte() 5次,把40位資料讀取出來。
humidity_hign = am2302_read_byte();
humidity_low = am2302_read_byte();
temperature_high = am2302_read_byte();
temperature_low = am2302_read_byte();
checksum = am2302_read_byte();
在某些應用場景下,為了降低功耗,需要把mcu的工作頻率降到盡可能的低。
如果在系統時鐘很低的情況,指令週期就成為需要考慮的關鍵因素。
這裡拿pic微控制器舉例,如果系統時鐘為1m hz,則它的指令週期為4微妙,
(指令週期為系統時鐘的4倍)。
這個時候如果使用上面提到的函式呼叫的方法,將無法得到正確的資料。
因為加上函式呼叫的開銷,當am2302_read_byte()進行電平判斷的時候,
很可能已經錯過了起始電平,導致解析不正確。另外當判斷是資料位1的時候,
data += (0x80u >> i);
while (1 == data_port)
理論上上面的操作要在40~50微妙的時間內完成,大概是10~12個彙編指令。
但目前上面的操作會轉換成很多彙編指令,耗費過多的時間,導致後續資料位解析不正確。
#define am2302_read_byte(data) \
am2302_read_bit(data) \
am2302_read_bit(data) \
am2302_read_bit(data) \
am2302_read_bit(data) \
am2302_read_bit(data) \
am2302_read_bit(data) \
am2302_read_bit(data) \
am2302_read_bit(data)
#define am2302_read_byte(data) \
am2302_read_bit(data, 0x80) \
am2302_read_bit(data, 0x40) \
am2302_read_bit(data, 0x20) \
am2302_read_bit(data, 0x10) \
am2302_read_bit(data, 0x08) \
am2302_read_bit(data, 0x04) \
am2302_read_bit(data, 0x02) \
am2302_read_bit(data, 0x01)
#define am2302_read_bit(data, bitmask) \
while (0 == am2302_data_port) \
\__delay_us(26); \
if (1 == am2302_data_port) \
\} \
}
movlb 0 ; select bank0
btfss 12,0 ;volatile
//對i/o進行判斷,相當於if (1 == am2302_data_port)
goto l435 //i/o不是1,跳轉到下乙個資料位判斷邏輯
movlw 128
//i/o是1,對資料進行加1操作,這裡使用了兩條指令
addwf _g_th,f
l435:
if (1 == am2302_data_port) \
\} \
它生成的彙編**變成:
movlb 0 ; select bank0
btfss 12,0 ;volatile
goto l435
bsf _g_th,7
l435:
使用上述方案,可以使pic微控制器在1 mhz的系統時鐘下,與am2302進行單線通訊。 PIC微控制器引腳
微控制器的訊號引腳是微控制器外特性的體現,在硬體上使用者只能使用引腳,通過引腳的連線組建微控制器系統。pic 8位微控制器系列和mcs 51系列微控制器一樣,其引腳除電源 vdd vss為單一功能外,其餘的訊號引腳常是多個功能,即引腳的復用功能。常見的引腳符號和主要功能如下 1 clr vpp 清除...
PIC系列微控制器
pic系列微控制器 由美國microchip公司推出的pic微控制器系列產品,首先採用了risc結構的嵌入式微控制器,其高速度 低電壓 低功耗 大電流lcd驅動能力和低價位otp技術等都體現出微控制器產業的新趨勢。現在pic系列微控制器在世界微控制器市場的份額排名中已逐年公升位,尤其在8位微控制器市...
PIC微控制器之中斷
1 微控制器在任何情況下的復位,均會導致總遮蔽位和其他的中斷遮蔽位清0,即在預設狀態下,禁止cpu響應所有的中斷。2.中斷標誌位的狀態與該所有的終端遮蔽位無關,即不管是否允許cpu響應中斷源的中斷請求,只要滿足了中斷條件,中斷標誌位就會被置1 3.當系統開放某一中斷源時候,中斷源就通過過中斷標誌位向...