PIC微控制器與AM2302溫濕度感測器通訊優化

2021-07-09 11:39:04 字數 2969 閱讀 3630

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.當系統開放某一中斷源時候,中斷源就通過過中斷標誌位向...