娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

淺談單片機調試方法希望對初學者有幫助

發布者:PositiveEnergy最新更新時間:2016-05-11 來源: eefocus關鍵字:單片機  調試方法  初學者 手機看文章 掃描二維碼
隨時隨地手機看文章
淺談單片機調試方法(希望對初學者有幫助)

傅紹兵 2011-01-31

1.     利用I/O

1.1   利用LED進行可視化管理

這種方法需要有多余的I/O。(如果可能,也可以將實現次要功能的I/O暫時借來一用。)

其電路很簡單,如圖一所示。I/O設置為輸出方式。

       我們可以用下面的宏來定義LED的操作。

#define           LED_YELLOW_ON()                  PA6D=0

#define           LED_YELLOW_OFF()                PA6D=1

#define           LED_YELLOW_FLASH()            PA6D^=1

       舉個例子說明它的用法。在低功耗的產品設計中,我們一般采用“睡眠à醒來工作à睡眠à醒來工作”的工作模式,其程序結構如下:

while(1)

{

       HLT = 1;                      //進入睡眠

       nop();

       clear_WDT();               //清看門狗

 

       //醒來,處理各種事務

}

       如果我們在程序醒來時點亮LED,事務處理完畢時熄滅LED,那么我們就能“看見”程序的工作狀態,LED將周期性地閃爍。這就是我們稱之為可視化管理的原因。(不記得在哪本書上看到“可視化管理”這個概念,我借用一下)

       其軟件結構是這樣:

while(1)

{

       HLT = 1;                      //進入睡眠

       nop();

       clear_WDT();               //清看門狗

      

       LED_YELLOW_ON();          // debug

       //醒來,處理各種事務

       LED_YELLOW_OFF();        // debug

}

       其實有些仿真器已經提供了這種監視程序睡眠狀態的方法。如果沒有提供,就可以用以上方法自行實現。

       它的使用很靈活。比如可以用來在雙時鐘系統中監視快時鐘的打開和關閉情況(慢時鐘一般總是打開,因為要用作實時時鐘的時鐘源,而且慢時鐘耗電很小)。你可以在打開快時鐘時點亮LED,關閉快時鐘時熄滅LED,這樣一來快時鐘的打開和關閉就一目了然了。

       你也可以在某個中斷中將LED的狀態取反(使用LED_YELLOW_FLASH()),用來監視此中斷的產生是否正常。雖然設置斷點也可以知道中斷是否產生,但會中斷程序的執行,造成不便。

       如果你想知道程序有沒有執行到某個地方,你也可以將LED_YELLOW_FLASH()放到該位置。

依次類推,你可以用這個方法觀察任何你想觀察的事件。

當然你必須互斥地觀察不同的事件。就是說,對于一個LED,在一次調試中,一般只能觀察一個事件,否則你自己也弄不清LED的變化到底是代表發生哪一事件。

       另外,你還可以同時使用兩個或者更多不同顏色的LED來監視不同的事件,前提你有多余的I/O。

不中斷程序的執行,又能看到程序的執行情況,應該說是一種很有效的調試程序的方法。相比開發工具所提供的單步、斷點、觀察變量等調試手段,這可以算是一種有效的補充。

1.2   利用示波器測試時間

利用上面的方法,再加一個示波器,就可以測量程序執行的時間了。(你可以自己決定

接不接LED)。

       比如,在初始化程序中,在打開總中斷之前,寫如下代碼:

LED_YELLOW_ON();

nop();

LED_YELLOW_OFF();

       使用示波器,在捕獲模式下,你應該能捕獲到一個脈沖,測試它的寬度,假如為30.5us。以OKI ML610Q431為例,一條nop指令包括1 cycles,1 cycles包括1 system clock。這里system clock等于振蕩周期。(注意,不同的單片機對cycles, system clock的定義是不同的,需要參考各自的用戶手冊)。

       那么我們可以這樣計算振蕩器的頻率:1*1*(1/f)=30.5/1000000.

       f=32786Hz    

       當然,如果示波器測量精度不夠,可以多放幾個nop指令,計算時再求平均。如果嫌示波器的捕獲模式太麻煩,還可以采用循環結構,輸出一串方波。比如:

while(1)

{

LED_YELLOW_ON();

nop();

LED_YELLOW_OFF();

nop();

clear_WDT();               //清看門狗

}

       這種方法的使用也很靈活。你可以用來測試主循環的執行時間,調用某個函數所花的時間,以及某個中斷處理的時間(不包括響應中斷和退出中斷的時間)等等。

       當你發現某些時候主循環的執行時間特別長時,可以采用逐步縮小范圍的方法來找出到底是哪個函數花費時間長,有沒有可能將其優化。

       下面是測試主循環執行時間的程序結構。

while(1)

{

       HLT = 1;                      //進入睡眠

       nop();

       clear_WDT();               //清看門狗

      

       LED_YELLOW_ON();          // debug

       Fun1();

       Fun2();

Fun3();

Fun4();

       LED_YELLOW_OFF();        // debug

}

       如果發現上面的執行時間異常(比如太長),你可以調整測試的位置,如下所示:

while(1)

{

       HLT = 1;                      //進入睡眠

       nop();

       clear_WDT();               //清看門狗

      

       Fun1();

LED_YELLOW_ON();          // debug

       Fun2();

Fun3();

Fun4();

       LED_YELLOW_OFF();        // debug

}

       這樣,你就可以確定執行時間過長是不是因為Fun1()引起。如果不是,則繼續調整測試位置,逐個排除,直到找到真正費時的函數,對其進行分析,看看有沒有可能優化。

       當然,我們還可以用兩個或更多I/O對多個事件進行邏輯分析,觀察他們的先后順序以及測試其時間間隔。這種方法也很有用,很靈活。在此不詳述。

2.     利用LCD進行可視化管理

如果你的產品帶LCD顯示,又沒有多余的IO可供調試,或者你只是想臨時的調試某個

功能,那么你可以臨時使用LCD上的某個圖標來指示某個事件。當某個事情發生時,顯示該圖標,否則清除該圖標。

       如果想在程序運行中獲得更復雜、更豐富的信息,可以對不同的事件顯示不同的數值。

3.     小結

不中斷程序的執行,又能觀察程序的執行情況,應該說是一種很有效的調試程序的方法。

相比開發工具所提供的單步、斷點、觀察變量等調試手段,這可以算是一種有效的補充。

實際上,這些調試方法很像PC應用開發的printf調試手段。它可以在不打斷程序運行

的情況下,借助于I/O,LED,示波器,數碼管或LCD顯示,給出各種各樣的提示信息,幫助我們調試程序。

關鍵字:單片機  調試方法  初學者 引用地址:淺談單片機調試方法希望對初學者有幫助

上一篇:單片機C語言模塊化設計
下一篇:基于單片機C語言編程格式

推薦閱讀最新更新時間:2024-03-16 14:53

Mouser榮獲優秀MCU分銷渠道企業大獎
半導體與電子元器件業頂尖工程設計資源與授權分銷商貿澤電子(Mouser Electronics)宣布榮獲《中國電子報》優秀MCU分銷渠道企業大獎,該獎項評選基于中國MCU分銷行業總體概況的多角度分析,綜合分銷渠道在功能、類型、設計、管理、風險應對和服務等方面的表現進行嚴格評分,最終評選出獲獎公司。Mouser以廣大工程師的利益為己任的原則,竭盡全力為中國工程師提供最快捷供貨和最優質的支持服務。 “作為一流的半導體和電子元器件授權分銷商,Mouser的e化供應鏈服務擅長于以最快的速度提供最新的半導體和電子元器件,全面支持客戶在產品設計階段的需求。”Mouser亞洲區資深營運副總裁Mark Burr-Lonnon表示,“我們推出一
[單片機]
單片機內程序運行的時候ram空間是如何分配的?
我現對一個程序進行減少片內ram的使用的優化,有一些效果,同時也產生了些疑問,在此向各位大蝦請教: 一、現象: 1、 我在通過減少全局變量、函數內變量的使用,減少函數間參數傳遞等手段來優化,發現某些時候我減少一個變量的使用,keil編譯的結果就顯示data減少了一字節,有時候這樣一直減少幾個變量的使用,data值一直都不會變,接著再減少變量的使用,又會一個一個的減少,到后來又不減少了。 2、 我屏蔽程序中一些代碼之后編譯,顯示data反而是增加了。 二、疑問: 1、單片機程序運行的時候,內部ram是如果分配管理的,data值由哪些部分組成? 2、之前描述的兩個現象如何解釋? 3、data值是不包括堆棧空間的,那么程序運行的堆棧
[單片機]
單片機微控制器和微處理器有什么區別?
1. 問:單片機、微控制器和微處理器有何區別? 答:處理器通常指微處理器、微控制器和數字信號處理器這三種類型的芯片。微處理器(MPU)通常代表一個功能強大的CPU,但不是為任何已有的特定計算目 的而設計的芯片。這種芯片往往是個人計算機和高端工作站的核心CPU。最常見的微處理器是Motorola的68K系列和Intel的X86系列。 早期的微控制器是將一個計算機集成到一個芯片中,實現嵌入式應用,故稱單片機(single chip microcomputer)。隨后,為了更好地滿足控制領域的嵌入式應用,單片機中不斷擴展一些滿足控制要求的電路單元。目前,單片機已廣泛稱作微控制 器(MCU)。 也有由微處理器發展的微控制器。比如,Int
[單片機]
8051單片機指令定義詳解——AJMP addr11(4)
8051單片機指令定義詳解 (AJMP addr11) AJMP addr11 功能:絕對跳轉。 描述:AJMP指令用于將程序轉到相應的目的地址去執行,該地址在程序執行過程之中產生,由PC值(兩次遞增之后)的高5位、操作碼的7-5位和指令的第2字節連接形成。要求跳轉的目的地址和AJMP指令的后一條指令的第1字節位于同一2KB的程序存儲頁內。 示例:假設標號AJMADR位于程序存儲器的0123H,指令 AJMP JMPADR 位于0345H,執行完該指令后PC值變為0123H。 AJMP addr11 字節數:2 執行周期:2 機器碼:aaa00001 aaaaaaaa 注意:目的地
[單片機]
愛特梅爾批量付運基于ARM? Cortex?-M0+的MCU器件
特梅爾公司(Atmel? Corporation) 宣布現在付運及批量生產全新SAM D20產品,SAM D20 MCU是基于ARM? Cortex?-M0+處理器的新型超低功率嵌入式快閃微控制器系列中的首個產品系列。 在這個物聯網(IoT)時代中,用于樓宇自動化、消費電子產品、智能計量,以及工業控制產品的智能性和連接性日益增強。使用愛特梅爾為批量市場提供的新型SAM D20 MCU器件,設計人員現在可以使用基于Cortex M0+ 新的MCU器件,輕易為下一代IoT設備增添更多的智能性和連接性。 新產品系列結合了經過驗證的創新技術,包括帶有愛特梅爾事件系統的智能外設,以及用于按鍵、滑條和滾輪功能及接近感測的電容式觸摸支持。全新
[單片機]
STC12C60S2單片機雙485通訊開發雙485通訊控制程序
電路原理圖如下: 程序說明 接線:MAX485-1 D+ 鏈接 MAX485-2 D+ ;MAX485-1 D- 鏈接 MAX485-2 D- 功能:串口一 自動發送一個tab數據,串口二接收,接收后數據顯示在P0口的led燈上 串口二 自動發送一個tab數據,串口一接收,接收后數據顯示在p0口的led燈上 按key1,P0口顯示0xAA 按key2,P0口顯示0x55 按key3,P0口顯示0xf0 按key4,P0口顯示0x0f *******************************************************
[單片機]
STC12C60S2<font color='red'>單片機</font>雙485通訊開發雙485通訊控制程序
ADC0809與51單片機的連接方式
模數轉換器定位為單片機的外部RAM單元,因此與單片機的連接就有很多種。大體上說ADC0809在整個單片機系統中是作為外部RAM的一個單元定位的。具體到某一個連接方式,定位又有區別。adc0809與單片機典型的連接有以下三種: ADC0809與51單片機的第一種連接方式 這是數據線對數據線、地址線對地址線的標準連接方式,如圖2.2所示。由于ADC0809片內沒有時鐘,可利用單片機提供的地址鎖存信號ALE經D觸發器2分頻后獲得,ALE引腳的頻率是單片機時鐘頻率的1/6,如果單片機時鐘頻率采用6MHz,則ALE引腳的輸出頻率為1MHz,再經過2分頻后為500kHz,恰好符合0809對時鐘的要求。 由于ADC0809具有輸出
[單片機]
ADC0809與51<font color='red'>單片機</font>的連接方式
51單片機P0口的特性及使用方法解析
一、P0口特性: P0口為三態雙向I/O口。對于內部有程序存貯器的單片機基本系統(如定制的8051),P0口可以作為輸入/輸出口使用,直接連外部的輸入/輸出設備;也可以作為系統擴展的地址/數據總線口。對于內部沒有程序存貯器的單片機(如8031),P0口只能作為地址/數據總線口使用。 1、P0口的輸出驅動器中也有一個多路電子開關。輸出驅動器轉接至口鎖動器的Q端時,P0口作為雙向I/O口使用。 這時,CPU發來的控制信號為低電平,使輸出驅動電路的上拉場效應管T1截止。P0口的鎖存器為“1”時,輸出驅動器中的兩個場效應管均截止,引腳浮空;由于P0口輸出電路是漏極開路的電路,必須外接10kΩ拉高電阻才能有高電平輸出。而寫入“0”時,下
[單片機]
51<font color='red'>單片機</font>P0口的特性及使用<font color='red'>方法</font>解析
小廣播
添點兒料...
無論熱點新聞、行業分析、技術干貨……
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

電子工程世界版權所有 京B2-20211791 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 莱阳市| 鸡西市| 双牌县| 通榆县| 盘锦市| 略阳县| 平凉市| 永善县| 龙游县| 茂名市| 安康市| 西藏| 米易县| 巩留县| 武山县| 汝城县| 奎屯市| 侯马市| 休宁县| 社旗县| 成都市| 昆明市| 神木县| 汝南县| 汨罗市| 湛江市| 定安县| 四川省| 闸北区| 响水县| 榆树市| 长治市| 永年县| 喀喇| 两当县| 城固县| 开封县| 无为县| 乐清市| 万全县| 喀什市|