|
沙發(fā)的回答非常正確,18B20沒(méi)有必要一口氣讀完,可以按步數(shù)慢慢的讀,板凳的說(shuō)法不對(duì),18B20在寫(xiě)命令和讀出數(shù)據(jù)期間不能被任何中斷打斷,否則數(shù)據(jù)就會(huì)錯(cuò)亂,解決的方法就是兩個(gè),一是18B20在寫(xiě)命令和讀出數(shù)據(jù)期間關(guān)閉中斷,二是關(guān)閉中斷影響程序運(yùn)行就把18B20程序放在中斷里一步一步的讀寫(xiě),如果還有中斷嵌套就把18B20程序放在最后一級(jí)中斷里,最后一級(jí)中斷不能有不響應(yīng)的情況,如果有,還要再想其它方法。曾經(jīng)我過(guò)零觸發(fā)可控硅還要調(diào)功,就把18B20程序放在定時(shí)中斷里,做到了調(diào)功的情況下也可以讀18B20的溫度,后來(lái)發(fā)現(xiàn)不需要調(diào)功,又把18B20程序放回外中斷。
18b20.jpg (26.92 KB, 下載次數(shù): 76)
下載附件
2021-5-1 16:57 上傳
這是我在觸發(fā)可控硅外中斷過(guò)零檢測(cè)程序里分9步讀出18B20溫度,每一步開(kāi)頭置高一個(gè)I/O口結(jié)束拉低I/O口得到的波形圖,上面的波形是過(guò)零信號(hào),下面波形高電平部分就是18B20每一步的時(shí)間,一開(kāi)始測(cè)試分別置高拉低兩次I/O口把每一步的時(shí)間檢測(cè)出來(lái),然后再置高拉低一次I/O口把每一步的時(shí)間檢測(cè)出來(lái),第一步的時(shí)間分別是20.9和16.6微秒,第二步的時(shí)間分別是68.4和61.3微秒,我就大概知道置高拉低一次I/O口的時(shí)間是4微秒左右,我把第二次測(cè)試的時(shí)間減去4微秒,就比較精確的知道每一步的具體時(shí)間,最短的一步是4.88微秒,最長(zhǎng)的一步是826微秒,也就是最后一步讀出數(shù)據(jù),感覺(jué)好像有點(diǎn)不太對(duì),時(shí)間有點(diǎn)長(zhǎng),這個(gè)程序運(yùn)行了好幾年了,沒(méi)有發(fā)現(xiàn)問(wèn)題,AVR單片機(jī)內(nèi)部1兆R(shí)C振蕩器編出來(lái)的。9步一共花了3412.88微秒,這個(gè)時(shí)間感覺(jué)也是偏長(zhǎng), 3412.88微秒是18B20占用單片機(jī)的總時(shí)間,對(duì)于單片機(jī)的一個(gè)循環(huán)周期,18B20占用單片機(jī)的時(shí)間最大就是826微秒,所以,我這樣編程CPU應(yīng)用率算是比較高的,9步讀出18B20溫度的全部時(shí)間是80.6毫秒,這是示波器測(cè)量出來(lái)的時(shí)間,都快有0.1秒了,這個(gè)時(shí)間肯定是嚴(yán)重偏長(zhǎng),但是,問(wèn)題不大,溫度基本上都是漸變,不太可能是突變,就是花一秒鐘把溫度讀出來(lái)也沒(méi)有任何影響。至于5樓說(shuō)的DS18B20讀一次需要1250us,這個(gè)1250us是讀出18B20溫度的總時(shí)間還是某一步的最長(zhǎng)時(shí)間,我也搞不清楚了。我多次說(shuō)過(guò)編單片機(jī)程序必須要有仿真器和示波器,沒(méi)有這兩樣?xùn)|西,我寧愿不編程序,因?yàn)榫幊绦侍土耍覐膩?lái)不計(jì)算任何程序的時(shí)間,都是設(shè)計(jì)電路的時(shí)候多預(yù)留一個(gè)I/O口,就用這個(gè)口靠示波器測(cè)量,示波器是300元左右的虛擬示波器,基本夠我用了,檔次高的示波器測(cè)量的精度肯定更高。
所以,樓主想讓18B20與單片機(jī)定時(shí)器中斷共存,把18B20的程序放在中斷里就可以了,只要pwm的最小脈沖不要小于1000Hz的那個(gè)脈沖寬度,18B20與單片機(jī)定時(shí)器中斷共存,沒(méi)有什么難度。
|
|