AM2302溫濕度傳感器采用單總線方式與MCU通信,這就要求MCU有一定的處理速度, 才能正確解析收到的AM2302發(fā)送過(guò)來(lái)的數(shù)據(jù)。
MCU處理AM2302數(shù)據(jù)的方式
AM2302一次傳送40位數(shù)據(jù)給MCU。數(shù)據(jù)位0由50微妙低電平加26微妙高電平組成。
數(shù)據(jù)位1有50微妙低電平加70微妙高電平組成。這種編碼方式有點(diǎn)象NEC的紅外傳輸協(xié)議。
另外AM2302需要由MCU發(fā)起啟動(dòng)信號(hào)。所以針對(duì)這種單線協(xié)議,雖然可以采用電平變化中斷+計(jì)數(shù)器,或輸入捕捉來(lái)解析40位數(shù)據(jù)位。但這就需要切換端口的輸入輸出配置及控制相應(yīng)外設(shè)的介入時(shí)機(jī)。
本文介紹的方法采用簡(jiǎn)單的端口讀+延時(shí)操作來(lái)解析40位數(shù)據(jù)位。
if (data_port == 1)
delay_us(30);
if (data_port == 1)
//bit = 1
else
//bit = 0
起始信號(hào)通過(guò)把端口改為輸出,然后通過(guò)寫(xiě)端口+延時(shí)來(lái)實(shí)現(xiàn)。
//改變data_port為輸出
data_port = 0;
delay_us(1000);
data_port = 1;
delay_us(20);
//改變data_port為輸入
數(shù)據(jù)讀取函數(shù)實(shí)現(xiàn)
根據(jù)上述協(xié)議的描述,很容易抽象出如下函數(shù):
static unsigned char am2302_read_byte(void)
{
unsigned char i = 0;
unsigned char data = 0;
for (i = 0; i < 8; i++)
{
//50us low
while (0 == data_port)
{
}
delay_us(40);
if (0 == data_port)
{
continue;
}
else
{
data += (0x80U >> i);
while (1 == data_port)
{
}
}
}
return data;
}
通過(guò)調(diào)用am2302_read_byte() 5次,把40位數(shù)據(jù)讀取出來(lái)。
humidity_hign = am2302_read_byte();
humidity_low = am2302_read_byte();
temperature_high = am2302_read_byte();
temperature_low = am2302_read_byte();
checksum = am2302_read_byte();
為什么上面的函數(shù)不能使用了
在某些應(yīng)用場(chǎng)景下,為了降低功耗,需要把MCU的工作頻率降到盡可能的低。
如果在系統(tǒng)時(shí)鐘很低的情況,指令周期就成為需要考慮的關(guān)鍵因素。
這里拿PIC單片機(jī)舉例,如果系統(tǒng)時(shí)鐘為1M Hz,則它的指令周期為4微妙,
(指令周期為系統(tǒng)時(shí)鐘的4倍)。
這個(gè)時(shí)候如果使用上面提到的函數(shù)調(diào)用的方法,將無(wú)法得到正確的數(shù)據(jù)。
因?yàn)榧由虾瘮?shù)調(diào)用的開(kāi)銷,當(dāng)am2302_read_byte()進(jìn)行電平判斷的時(shí)候,
很可能已經(jīng)錯(cuò)過(guò)了起始電平,導(dǎo)致解析不正確。另外當(dāng)判斷是數(shù)據(jù)位1的時(shí)候,
data += (0x80U >> i);
while (1 == data_port)
{
}
理論上上面的操作要在40~50微妙的時(shí)間內(nèi)完成,大概是10~12個(gè)匯編指令。
但目前上面的操作會(huì)轉(zhuǎn)換成很多匯編指令,耗費(fèi)過(guò)多的時(shí)間,導(dǎo)致后續(xù)數(shù)據(jù)位解析不正確。
解決方案
簡(jiǎn)單的方案,繼續(xù)使用上面的函數(shù),但需要在調(diào)用之前提高系統(tǒng)時(shí)鐘,縮短指令周期即可。
但對(duì)功耗上有些許影響,但基本影響不會(huì)太大。這里比較要命的是你提高了系統(tǒng)之中,依賴 系統(tǒng)時(shí)鐘的外設(shè)都要重新設(shè)置,例如定時(shí)器。當(dāng)完成溫濕度的讀取,又要全部切換回來(lái)。
考驗(yàn)功力的方案,有沒(méi)有可能優(yōu)化上面的數(shù)據(jù)讀取函數(shù),減少生成的匯編指令,使它能夠
在1 MHz的系統(tǒng)時(shí)鐘下,完成數(shù)據(jù)讀???
如何改進(jìn)利用空間換時(shí)間的思路,取消函數(shù)調(diào)用,把里面的邏輯展開(kāi)。這里可以利用宏函數(shù)實(shí)現(xiàn)。
#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)
優(yōu)化數(shù)據(jù)位1的實(shí)現(xiàn)邏輯,把移位操作轉(zhuǎn)換成定值的賦值操作。
#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)
{
NOP();
NOP();
if (1 == am2302_data_PORT)
{
data += bitmask;
while (1 == am2302_data_PORT)
{
}
}
}
但在實(shí)際的調(diào)試過(guò)程中,發(fā)現(xiàn)有時(shí)候還是無(wú)法完整的解析數(shù)據(jù)。特別是當(dāng)數(shù)據(jù)位1特別多的 時(shí)候,往往不能夠正確解析。這時(shí)候就需要仔細(xì)的分析數(shù)據(jù)位1的生成匯編代碼。
movlb 0 ; select bank0
btfss 12,0 ;volatile //對(duì)I/O進(jìn)行判斷,相當(dāng)于if (1 == am2302_data_PORT)
goto l435 //I/O不是1,跳轉(zhuǎn)到下一個(gè)數(shù)據(jù)位判斷邏輯
movlw 128 //I/O是1,對(duì)數(shù)據(jù)進(jìn)行加1操作,這里使用了兩條指令
addwf _g_th,f
l435:
使用|=替換+=,把兩條指令的加1操作變成一條指令。
if (1 == am2302_data_PORT)
{
data |= bitmask;
while (1 == am2302_data_PORT)
{
}
}
它生成的匯編代碼變成:
movlb 0 ; select bank0
btfss 12,0 ;volatile
goto l435
bsf _g_th,7
l435:
結(jié)束
使用上述方案,可以使PIC單片機(jī)在1 MHz的系統(tǒng)時(shí)鐘下,與AM2302進(jìn)行單線通信。
上一篇:使用PIC單片機(jī)連接旋轉(zhuǎn)編碼器的方法
下一篇:單片機(jī)按鍵掃描程序和顯示程序及延時(shí)程序解析
推薦閱讀
史海拾趣
經(jīng)過(guò)多年的發(fā)展,協(xié)順電子已經(jīng)成為中國(guó)電子連接器行業(yè)的領(lǐng)軍企業(yè)之一。展望未來(lái),公司將繼續(xù)堅(jiān)持“以顧客為中心”的經(jīng)營(yíng)理念,不斷提升產(chǎn)品質(zhì)量和技術(shù)水平;同時(shí),公司也將積極探索新的業(yè)務(wù)領(lǐng)域和市場(chǎng)機(jī)會(huì),推動(dòng)公司的持續(xù)發(fā)展。此外,協(xié)順電子還將加強(qiáng)與國(guó)際知名企業(yè)的合作與交流,共同推動(dòng)電子行業(yè)的發(fā)展和進(jìn)步。
請(qǐng)注意,以上故事框架僅供參考,具體的故事內(nèi)容需要根據(jù)協(xié)順電子(Finecables)公司的實(shí)際情況和發(fā)展歷程進(jìn)行創(chuàng)作和補(bǔ)充。
除了能源管理領(lǐng)域外,伊頓公司還在商用車領(lǐng)域取得了顯著成就。自1985年首次將技術(shù)引進(jìn)中國(guó)以來(lái),伊頓的變速器產(chǎn)品已經(jīng)進(jìn)入中國(guó)市場(chǎng)30多年。通過(guò)與國(guó)內(nèi)各個(gè)商用車生產(chǎn)企業(yè)的緊密合作,伊頓成功地將其先進(jìn)的變速器技術(shù)應(yīng)用于各種商用車型中,提高了車輛的燃油經(jīng)濟(jì)性和駕駛舒適性。特別是在物流行業(yè),伊頓的變速器產(chǎn)品幫助車隊(duì)降低了油耗成本,提高了運(yùn)營(yíng)效率。
在電子行業(yè)中,產(chǎn)品質(zhì)量是企業(yè)的生命線。ABCircuits深知這一點(diǎn),因此從成立之初就建立了嚴(yán)格的質(zhì)量管理體系。公司注重從原材料采購(gòu)到生產(chǎn)制造的每一個(gè)環(huán)節(jié)的質(zhì)量控制,確保每一件產(chǎn)品都符合高標(biāo)準(zhǔn)的品質(zhì)要求。這種對(duì)品質(zhì)的堅(jiān)持讓ABCircuits贏得了客戶的信賴和口碑,使其在市場(chǎng)中脫穎而出。
為了進(jìn)一步提升產(chǎn)品的競(jìng)爭(zhēng)力,馳興電感積極開(kāi)展國(guó)際合作。公司與國(guó)際知名電子元器件廠商建立了長(zhǎng)期穩(wěn)定的合作關(guān)系,共同研發(fā)新產(chǎn)品、新技術(shù)。這些國(guó)際合作不僅使馳興電感能夠借鑒國(guó)際先進(jìn)經(jīng)驗(yàn)和技術(shù),還為公司帶來(lái)了更多的市場(chǎng)機(jī)會(huì)和資源。
70年代,隨著電子技術(shù)的飛速發(fā)展,導(dǎo)熱材料行業(yè)迎來(lái)了前所未有的機(jī)遇。Bergquist Company敏銳地捕捉到了這一機(jī)遇,開(kāi)始涉足導(dǎo)熱材料領(lǐng)域。公司投入大量資金進(jìn)行研發(fā),成功開(kāi)發(fā)出了一系列具有創(chuàng)新性的導(dǎo)熱產(chǎn)品。這些產(chǎn)品不僅性能卓越,而且價(jià)格合理,深受市場(chǎng)歡迎。憑借這些優(yōu)勢(shì),Bergquist Company逐漸在導(dǎo)熱材料行業(yè)嶄露頭角,成為了行業(yè)的領(lǐng)軍企業(yè)。
隨著市場(chǎng)的不斷擴(kuò)大,DFRobot意識(shí)到單一的產(chǎn)品代理無(wú)法滿足客戶的需求。于是,公司開(kāi)始加大研發(fā)投入,自主研發(fā)機(jī)器人和開(kāi)源硬件產(chǎn)品。同時(shí),為了保證產(chǎn)品的質(zhì)量和生產(chǎn)效率,DFRobot在成都和北京設(shè)立了生產(chǎn)基地,引進(jìn)先進(jìn)的生產(chǎn)設(shè)備和技術(shù)。這種研發(fā)與生產(chǎn)一體化的模式,使DFRobot能夠更快速地響應(yīng)市場(chǎng)變化,推出符合客戶需求的新產(chǎn)品。
arm學(xué)習(xí)報(bào)告一二三 非常經(jīng)典!! 網(wǎng)上廣為流傳的ARM學(xué)習(xí)資料, 作者功務(wù)深厚, 精神可佳, 是學(xué)習(xí)ARM開(kāi)發(fā)的上好資料, 其中包括"ARM學(xué)習(xí)報(bào)告003——Bios源碼分析.pdf","BootLoader源代碼級(jí)分析第一部分-GNU之映象機(jī)理.pdf","ARM映象文件及執(zhí)行機(jī)理.rar"三部分組成. ...… 查看全部問(wèn)答∨ |
請(qǐng)教BiCMOS反相器的理解問(wèn)題,以前貌似有人問(wèn)過(guò),但還是沒(méi)弄明白 如下圖,當(dāng)輸入Vi為H,前級(jí)反相器的輸出(即T1管的基極)為L(zhǎng),此時(shí)T1管就截止了,相當(dāng)于斷開(kāi) 同時(shí)N3管的柵極也為L(zhǎng),N3也是截止的,N2的柵極是原始輸入信號(hào)為H,N2可以導(dǎo)通,但是T2 ...… 查看全部問(wèn)答∨ |
愛(ài)因迪生:咦,又上來(lái)一位和色環(huán)電阻長(zhǎng)得很像的元件。是誰(shuí)呢?不過(guò)她長(zhǎng)得很碩壯。為了再次出錯(cuò),我還是先驗(yàn)證一下是不是電阻再說(shuō)。 愛(ài)因迪生拿了個(gè)萬(wàn)用表在手上,來(lái)到舞臺(tái)上。 愛(ài)因迪生:千萬(wàn)別告訴我你是什么元件。我要自己猜猜。來(lái)來(lái)來(lái),讓我量 ...… 查看全部問(wèn)答∨ |
|
為了使大家對(duì)使用中或者使用過(guò)的PLC能有個(gè)總結(jié),特征集討論三菱、西門子、歐姆龍最常用的3種PLC的使用心得。我本人用過(guò)最多的是三菱的FX、FX1N、FX2N系列PLC,感覺(jué)編寫(xiě)程序容易,初學(xué)上手快,組網(wǎng)簡(jiǎn)單,故障率低。希望大家也說(shuō)說(shuō)自己的工程和維修心 ...… 查看全部問(wèn)答∨ |
autocorrelation(自相關(guān))function 應(yīng)該怎么用呢? 各位前輩,我是才剛剛開(kāi)始接觸DSP(digital sound processing)的學(xué)生,現(xiàn)在要用autocorrelation funtion 找出一個(gè)periodic signal 的周期,但是實(shí)在是不知道autocorrelation function 應(yīng)該怎么用~~~比方說(shuō)我得到一個(gè)sinusoidal signal(有噪音) ...… 查看全部問(wèn)答∨ |
一條C程序?qū)崿F(xiàn)以下3種功能: 1、按一下LED全亮,再按一下半亮,按第三下LED滅; 2、按住3秒,LED閃爍(500ms關(guān),100ms開(kāi)),再按LED滅; 3、快速按3下,不斷循環(huán):LED顯示方波為:開(kāi)80ms,關(guān)500ms,(開(kāi)50ms,關(guān)100ms,做5次),關(guān)500ms。   ...… 查看全部問(wèn)答∨ |
經(jīng)過(guò)了前期的反復(fù)討論,決定使用MSP430G2333這個(gè)MCU去做一個(gè)新的產(chǎn)品,主要是應(yīng)用到觸摸,10位AD,另外因需要的IO口也比較多的原因,決定用32個(gè)腳的QFN,于是一大早,就興沖沖的跑到華強(qiáng)/賽格去找樣。在來(lái)之 ...… 查看全部問(wèn)答∨ |
Timing Summary: --------------- Speed Grade: -2 Minimum period: 7.205ns (Maximum Frequency: 138.793MHz) Minimum input arrival time before clock: 6.429ns Maximum output required time afte ...… 查看全部問(wèn)答∨ |
關(guān)于MDK460!!!大師指點(diǎn)下啊。。。 今天將MDK423升級(jí)到了MDK460,發(fā)現(xiàn)原來(lái)在MDK423下編譯成功的工程,用MDK460打開(kāi)編譯,會(huì)報(bào)N多錯(cuò)誤,怎么解決啊???例如: ..\\lib\\stm32f10x_systick.c(50): error: #20: identifier \"SysTick\" is undefined; ..\\lib\\stm32f10 ...… 查看全部問(wèn)答∨ |
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- VS Code+PlatformIO搭建ESP32 Arduino開(kāi)發(fā)環(huán)境
- ESP32學(xué)習(xí)筆記(49)——RFID RC522使用
- Esp32環(huán)境離線搭建參考
- ESP32使用舵機(jī)庫(kù)時(shí)的錯(cuò)誤
- ESP32 S3接ST7789屏幕線序
- Arduino IDE安裝ESP32開(kāi)發(fā)環(huán)境的最簡(jiǎn)單方法
- 基于S3C44B0X和μC/OS-Ⅱ智能家居嵌入式系統(tǒng)設(shè)計(jì)
- 8位還能打,新唐推出全新工業(yè)級(jí)MCU
- stm32與Arduino的比較
- 電動(dòng)車電池成本降一半,續(xù)航卻減一半?寧德時(shí)代新電池能突圍嗎?
- 從“不可修”到可拆可換:CTP電池的售后怎么辦?
- 區(qū)域控制器ZCU國(guó)產(chǎn)化:從物料齊全到系統(tǒng)話語(yǔ)權(quán)
- 總額超260億-盤點(diǎn)全球移動(dòng)機(jī)器人領(lǐng)域融資TOP10企業(yè)
- 安森美CEO談?wù)撾妱?dòng)汽車與AI服務(wù)器前景
- LILYGO T-LoRa Pager:復(fù)古造型與前沿技術(shù)結(jié)合的物聯(lián)網(wǎng)手持設(shè)備
- VS Code+PlatformIO搭建ESP32 Arduino開(kāi)發(fā)環(huán)境
- Esp32環(huán)境離線搭建參考
- ESP32使用舵機(jī)庫(kù)時(shí)的錯(cuò)誤
- ESP32 S3接ST7789屏幕線序
- 免費(fèi)申請(qǐng)測(cè)評(píng) | RDK X3機(jī)器人開(kāi)發(fā)套件
- 有獎(jiǎng)直播 | TI MSPM0 系列 MCU 再添新成員
- TI帶你一起玩轉(zhuǎn)復(fù)雜汽車電子設(shè)計(jì)技能
- 【免費(fèi)試用】DFRobot micro:bit編程小車-麥昆
- 下載泰克電源設(shè)計(jì)測(cè)試方案+圖文攻略 幫助工程師解決電源效率問(wèn)題。有好禮
- 醫(yī)用/工業(yè)CT醫(yī)療影像探測(cè)器芯片應(yīng)用與解決方案
- 安森美半導(dǎo)體工業(yè)物聯(lián)網(wǎng)解決方案下載有驚喜!
- TWS殺進(jìn)無(wú)線耳機(jī)市場(chǎng),它的亮點(diǎn)有哪些
- 集創(chuàng)“芯”引領(lǐng)小間距時(shí)代 集創(chuàng)北方LED顯示驅(qū)動(dòng)芯片問(wèn)市
- 臺(tái)灣存儲(chǔ)產(chǎn)業(yè)衰敗給大陸存儲(chǔ)發(fā)展敲響了警鐘
- 閃存技術(shù)52年風(fēng)雨之路一覽
- DC/DC 轉(zhuǎn)換器 EMI 工程師指南 -規(guī)范和測(cè)量
- RISC-V處理器上跑安卓10!平頭哥玄鐵910已實(shí)現(xiàn)
- 榮耀CEO趙明:新榮耀超50%的人員是研發(fā)工程人員
- 榮耀CEO趙明:過(guò)去五個(gè)月艱難 未來(lái)將走向中高端
- 三星無(wú)聲語(yǔ)音助手 靜默式的交互體驗(yàn)
- 揭秘維安的SGT MOSFET,三大優(yōu)勢(shì)前途無(wú)量