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