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