硬件仿真與燒寫程序結(jié)果不一樣原因總結(jié)
一,配置問題:實際燒片時單片機的配置字與仿真的時候是不是一樣?燒寫時是否配置正確?
本文引用地址:http://butianyuan.cn/article/201609/297021.htm二,資源問題:單片機的ROM、RAM大小與仿真器的ROM、RAM大小是不一樣的!
三,驅(qū)動能力問題:通常仿真器的驅(qū)動能力比單片機要強;可以分兩步檢查,一是分別用仿真器與單片機時對應(yīng)IO口波形進行對比,二是當仿真器與外設(shè)連接與不連接時波形的對比;
要進行基本要素分析:單片機供電正常?起振沒有?復(fù)位電路正常?芯片損壞?
【單片機上電不運行情況的分析】
1.單片機是沒有運行,還是運行不正確?
2.如果是沒有運行,檢測單片機的基本參數(shù)是否已經(jīng)滿足<工作電壓要在芯片的引腳處測量><復(fù)位引腳的復(fù)位曲線如何><晶振是否已經(jīng)起振><芯片損壞,或者部分功能損壞>。
3.如果是運行不正確,檢測<用了看門狗,沒有處理好,芯片上電后處于不停的復(fù)位狀態(tài),看起來就象沒有沒有工作起來><是否進入了ISP狀態(tài)><對單片機寫入對所有的IO口以1秒取反一次的程序進行測試>
【單片機調(diào)試辦法】
用LED進行狀態(tài)指示,用串口進行數(shù)據(jù)指示,比用其它外設(shè)指示更可靠;
加入斷點,燒寫時是在不同的語句后面加入WHILE(1);
分模塊調(diào)試,把每個小功能先調(diào)試通過,再進行組合。
Keil C本身就是編譯與仿真一體的,當不要外部數(shù)據(jù)時很方便,當要外部輸入時(比如用定時器作計數(shù)器用)它提供幾個調(diào)試輸入用的窗口可用它們來摸擬輸入,同時Keil C本身提供一種調(diào)試函數(shù)用來配置摸擬外部輸入的功能,這我在學(xué)習(xí)時看的一本書上講過如用定時器作外部事件計數(shù),調(diào)試函數(shù)由自己根據(jù)需要按特定的格式來編輯再按KEIL C的要求調(diào)入即可。學(xué)習(xí)時可用這種方法,做產(chǎn)品時最好是用仿真器調(diào)試。下面我給出我以前試過的用定時器作外部事件計數(shù)時摸擬外部輸入的調(diào)試函數(shù),并寫出Keil C調(diào)用的步驟如下:
1、編寫如下信號函數(shù):
single void t0_singal(void)
{
while(1)
{
PORT3|=0x10;//pull INT0(P3.4) high again
PORT3&=~0x10;//pull INT0(P3.4) low and generate interrupt
PORT3|=0x10;//pull INT0(P3.4) high again
twatch(CLOCK);//wait for 1 second
}
}
2、在DEBUG狀態(tài)下單擊DEBUG菜單在下拉菜單中單擊“Function Editor(Open Ini File)... "選項, 彈出新屏幕后,將“打開”窗口關(guān)閉,這時屏上有Function Edito窗;
3、在Function Editor窗中輸入上面的函數(shù);
4、保存(注意:擴展名為.ini),編譯該程序,成功后關(guān)閉Function Editor窗口;
5、執(zhí)行用戶程序(必須連續(xù)執(zhí)行);
6、在屏幕左下腳的命令窗口中,鍵入t0_singl()后(必須回車)媽可向P3.4源源不斷地提供脈沖信號。
我們使用Keil C調(diào)試某系統(tǒng)時積累的一些經(jīng)驗
1、由于Keil C對中文支持不太好,因而會出現(xiàn)顯示的光標與光標實際所在不一致的現(xiàn)象,這會對修改中文注釋造成影響。在Windows2000下面,我們可以把字體設(shè)置為Courier,這樣就可以顯示正常。
2、當使用有片外內(nèi)存的MCU(如W77E58,它有1K片外內(nèi)存)的時候,肯定要設(shè)置標志位,并且編譯方式要選擇大模式,否則會出錯。
3、當使用Keil C跟蹤程序運行狀態(tài)的時候,要把引起Warning的語句屏蔽,否則有可能跟蹤語句的時候會出錯。
4、在調(diào)用數(shù)組的時候,Keil C是首先把數(shù)組Load進內(nèi)存。如果要在C中使用長數(shù)組的時候,我們可以使用code關(guān)鍵字,這樣就實現(xiàn)了匯編的DB的功能,Keil C是不會把標志code的數(shù)組Load入內(nèi)存的,它會直接讀取Rom。
5、當編程涉及到有關(guān)通信,時序是很重要的。拉高管腳的執(zhí)行速度遠遠比檢查管腳電平的要快。
6、在等待管腳電平變化的時候,我們需要設(shè)置好超時處理,否則程序就會因為一個沒有預(yù)計的錯誤而死鎖。
7、能用C語言實現(xiàn)的地方,盡量不要用匯編,尤其在算法的實現(xiàn),用匯編是晦澀難懂。
8、程序的幾個參數(shù)數(shù)組所占篇幅很大,其中液晶背景數(shù)組最長,有四千個Byte,因而把那些初始化數(shù)組都放在另外一個C文件,在主文件使用使用關(guān)鍵字extern定義,這樣就不會對主文件的編寫造成干擾。
9、所有函數(shù)之間的相關(guān)性越低越有利于以后功能的擴展。
10、6.20版在編譯帶code關(guān)鍵字的數(shù)組時,編譯通過但是單片機運行結(jié)果是錯誤的,改用6.14版后正常。
評論