最近調(diào)試122檢測(cè)小電流,有一種遇到鬼打墻的狀態(tài),就是看到寄存器的值在數(shù)據(jù)轉(zhuǎn)移時(shí)改動(dòng)了。要不是親眼見,還真不會(huì)相信。在ADC中寫入了這么一小段:
AD_Start=1;//Skip first ADC, can delete by your select
while(!AD_DONE)
ad_temp$1 = adcrh;
ad_temp$0 = adcrl;
你說(shuō)要是有問題,你在檢測(cè)內(nèi)部1.2V時(shí)也有問題,那也更容易查找問題吧。可是在轉(zhuǎn)換以內(nèi)部1.2V為一路輸入電壓時(shí)又沒有問題,而且這個(gè)程序,在以前的調(diào)試好象也問題。
可是一到轉(zhuǎn)換另外一路小電壓的時(shí)候,就出現(xiàn)問題了??窗烧{(diào)試窗口里的數(shù)據(jù)明明提示ADCRH的值為0x01,ADCRL的值為0x17. 在轉(zhuǎn)移到ad_temp 時(shí),變成了ad_temp$1的值為00x03,ad_temp$0為0x17還是正常的。這個(gè)問題,以前也弄出來(lái)過,可能是后來(lái)把系統(tǒng)時(shí)鐘改低了,系統(tǒng)時(shí)鐘跑1mips,當(dāng)時(shí)又正常了,所以就沒有懷疑程序的問題了。
后來(lái)沒有明白問題出在哪里,多弄了一次判斷,不想等再讀一次,想想雖然操作可笑,但也是一種方法:
AD_Start=1;//Skip first ADC, can delete by your select
while(!AD_DONE)
ad_temp$1 = adcrh;
ad_temp$0 = adcrl;
if(ad_temp$1 != adcrh) ad_temp$1 = adcrh;
ad_temp = ad_temp >> 4;
ad16 += ad_temp ;
這樣一改,結(jié)果是對(duì)了,但是還是沒有明白問題出在哪里?
后來(lái)想到可能系統(tǒng)時(shí)鐘跑太快了,讀數(shù)有問題,所以就在while(!AD_DONE)后面加了兩個(gè)nop;這樣也正常了。后來(lái)終于想明白。數(shù)據(jù)轉(zhuǎn)移出錯(cuò),確實(shí)和系統(tǒng)時(shí)鐘跑得快有關(guān)系,所以在頻率較低時(shí),上面的程序不會(huì)出問題。其實(shí)真正的問題就是出在“while(!AD_DONE)”這里,這里少了一個(gè)“;”,編譯器沒有提示錯(cuò)誤,本來(lái)也是可以不提示錯(cuò)誤的,編譯器不知道你等待的時(shí)候具體是需要干嘛。因?yàn)橛小埃弧睍r(shí),在等待AD轉(zhuǎn)換完的時(shí)間里,編譯器會(huì)自動(dòng)增加一條nop指令,而沒有“;”時(shí),在等待的時(shí)間里是一直在讀AD轉(zhuǎn)化的高位,等AD結(jié)束后,馬上是讀取AD轉(zhuǎn)換的低位。所以在等待的過程中,讀取的高位,是一個(gè)還沒有轉(zhuǎn)化完。而低位則是轉(zhuǎn)換結(jié)束后的數(shù)據(jù),所以讀起來(lái)不會(huì)錯(cuò)了。加上NOP后,再等待的時(shí)間強(qiáng)制是執(zhí)行空指令了,結(jié)束完還會(huì)執(zhí)行一個(gè)空指令再取高位,所以都不會(huì)有問題了。
審核編輯:劉清
-
寄存器
+關(guān)注
關(guān)注
31文章
5363瀏覽量
121158 -
輸入電壓
+關(guān)注
關(guān)注
1文章
506瀏覽量
16624 -
AD轉(zhuǎn)換器
+關(guān)注
關(guān)注
4文章
250瀏覽量
41522 -
系統(tǒng)時(shí)鐘
+關(guān)注
關(guān)注
1文章
30瀏覽量
9363 -
pfs
+關(guān)注
關(guān)注
0文章
5瀏覽量
5106
原文標(biāo)題:PFS122 AD調(diào)試心得分享---小電流檢測(cè)
文章出處:【微信號(hào):應(yīng)廣單片機(jī),微信公眾號(hào):應(yīng)廣單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論