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

淺談單片機調試方法

發布者:BlossomSunrise最新更新時間:2016-01-06 來源: eefocus關鍵字:單片機  調試方法 手機看文章 掃描二維碼
隨時隨地手機看文章
1. 利用I/O
1.1 利用LED進行可視化管理
這種方法需要有多余的I/O。(如果可能,也可以將實現次要功能的I/O暫時借來一用。)
其電路很簡單,一個LED通過限流電阻接到VCC電源。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顯示,給出各種各樣的提示信息,幫助我們調試程序。  
關鍵字:單片機  調試方法 引用地址:淺談單片機調試方法

上一篇:單片機IO口結構及上拉電阻
下一篇:單片機中用c編程時頭文件reg51.h及reg52.h解析

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

使用STM32微控制器系列中的DAC生成音頻和波形之DAC特性
《前言》 本應用筆記舉例介紹了使用數模轉換器 (DAC) 外設生成音頻輸出信號的過程,該 DAC 外設內嵌在 STM32F10xx 微控制器系列產品中。 數模轉換器 (DAC) 是一種與模數轉換器功能相反的器件,可以將數字形式的數據轉換為相應的模擬電壓信號。 STM32 DAC 模塊是 12 位字轉換器,帶有兩個支持立體聲音頻的輸出通道。 DAC 可用于多種音頻應用中,例如:安全警報、藍牙耳機、發聲玩具、答錄機、人機接口以及低成本的音樂播放器STM32 DAC 還可實現許多其他模擬用途,如模擬波形產生和控制工程。 《DAC主要特性》 1、數據格式 DAC 可以使用以下三種整型格式的數據:8 位右對齊、12 位右對齊以及
[單片機]
使用STM32<font color='red'>微控制器</font>系列中的DAC生成音頻和波形之DAC特性
51單片機串口通信編程
51單片機是對所有兼容Intel 8031指令系統的單片機的統稱。該系列單片機的始祖是Intel的8004單片機,后來隨著Flash rom技術的發展,8004單片機取得了長足的進展,成為應用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89系列,它廣泛應用于工業測控系統之中。很多公司都有51系列的兼容機型推出,今后很長的一段時間內將占有大量市場。51單片機是基礎入門的一個單片機,還是應用最廣泛的一種。需要注意的是51系列的單片機一般不具備自編程能力。 一、 pc機上的 串口通信編程過程如下: 1.建立項目 打開VC++6.0,建立一個基于對話框的MFC應用程序SCommTest(與我源代碼一致,等會你會方便一點);
[單片機]
51<font color='red'>單片機</font>串口通信編程
一個輕量級的單片機多級菜單實現方法
在 單片機 設計中,往往需要在顯示屏上顯示多級操作菜單,每級菜單都有一些菜單項和對應的按鍵操作,以及為響應各種操作而執行的后續處理程序。參考文獻以函數指針為結構元素,把整個菜單結構拉伸成一個結構數組,內部包含了全部菜單項。這種方法沒有將菜單項數據與功能函數分開設計,而把菜單項數據寫在功能函數中,當菜單項數據需要改變時,必須修改功能函數,這在很大程度上限制了程序的通用性,不利于程序的維護。參考文獻在前者的基礎上略加改進,在原結構體中增加了菜單項顯示文字和按鍵復用標識,這使得結構體較為龐大,且菜單項的文字內容非常固定,保存在EEPROM中,無法靈活改變顯示內容和位置。參考文獻引入Windows系統下的窗口和消息機制實現多級菜單設計
[單片機]
一個輕量級的<font color='red'>單片機</font>多級菜單實現<font color='red'>方法</font>
51單片機與TA8435的步進電機細分控制
  1 步進電機   步進電動機是純粹的數字控制電動機,它將電脈沖信號轉變為角位移,即給一個脈沖,步進電機就轉一個角度,因此非常合適單片機控制,在非超載的情況下,電機的轉速、停止的位置只取決于脈沖信號的頻率和脈沖數,而不受負載變化的影響,電機則轉過一個步距角,同時步進電機只有周期性的無累積誤差,精度高。   步進電動機有如下特點:   1)步進電動機的角位移與輸入脈沖數嚴格成正比。因此,當它轉一圈后,沒有累計誤差,具有良好的跟隨性。   2)由步進電動機與驅動電路組成的開環數控系統,既簡單、廉價,又非常可靠,同時,它也可以與角度反饋環節組成高性能的閉環數控系統。   3)步進電動機的動態響應快,易于啟停、正反轉及變速。
[單片機]
51<font color='red'>單片機</font>與TA8435的步進電機細分控制
簡述51單片機延時函數
C程序中可使用不同類型的變量來進行延時設計。經實驗測試,使用unsigned char類型具有比unsigned int更優化的代碼,在使用時應該使用unsigned char作為延時變量。 以某晶振為12MHz的單片機為例,晶振為12MHz即一個機器周期為1us。擴展閱讀:匯編延時程序算法詳解 一. 500ms延時子程序 程序: void delay500ms(void) { unsigned char i,j,k; for(i=15;i 0;i--) for(j=202;j 0;j--) for(k=81;k 0;k--); } 計算分析: 程序共有三層循環 一層循環n:R5*2
[單片機]
PIC系列單片機采用指令流水線結構
因為PIC系列單片機采用了指令空間和數據空間分開的哈佛結構,用了兩種位數不同的總線。因此,取指令和取數占有可能同時交疊進行,所以在PIC系列微控制器中取指令和執行指令就采用指令流水線結構。當第一條指令被掏出后,隨即進入執行階段,這時可能會從某寄存器取數而送至另一寄存器,或從一端口向寄存器傳送數等,但數據不會流經程序總線,而只是在數據總線中活動,因此,在這段時間內,程序總線有空,可以同時掏出第二條指令。當第一條指令執行完畢,就可執行第二條指令,同時掏出第3條指令,……如斯等等。這樣,除了第一條指令的掏出,其余各條指令的執行和下一條指令的掏出是同時進行的,使得在每個時鐘周期可以獲得最高效率。 在大多數微控制器中,取指令和指令執行都
[單片機]
瞬態電磁脈沖對單片機的輻照效應實驗及加固方法
靜電放電產生的電磁輻射可產生很強的瞬態電磁脈沖(ESD EMP)。隨著電子技術的高速發展,ESD EMP的危害也日趨嚴重。ESD EMP具有峰值大、頻帶寬等特點,作為近場危害源,對各種數字化設備的危害程序可與核電磁脈沖(NEMP)及雷電電磁脈沖(LEMP)相提并論 。因此,研究ESD EMP對電子系統的各種效應及防護方法已成為靜電防護中的一個熱點問題。筆者以單片機系統為實驗對象,進行了ESD EMP對單片機系統的輻照效應實驗,并在實驗的基礎上研究了ESD EMP的防護和加固方法。 1 實驗配置及方法 1.1 實驗配置 實驗配置如圖1所示。它主要由臺式靜電放電抗擾性實驗標準裝置、靜電放電模擬器和數據采集系統組成。 根
[單片機]
伺服電機的調試方法和注意事項
伺服電機(servo motor )是指在伺服系統中控制機械元件運轉的發動機,是一種補助馬達間接變速裝置。 伺服電機可使控制速度,位置精度非常準確,可以將電壓信號轉化為轉矩和轉速以驅動控制對象。 伺服電機轉子轉速受輸入信號控制,并能快速反應,在自動控制系統中,用作執行元件,且具有機電時間常數小、線性度高、始動電壓等特性,可把所收到的電信號轉換成電動機軸上的角位移或角速度輸出。 今天與大家分享的就是伺服電機的調試方法和注意事項。 ①伺服電機的調試方法 ②伺服電機的注意事項 1、伺服電機油和水的保護 A:伺服電機可以用在會受水或油滴侵襲的場所,但是它不是全防水或防油的。因此, 伺服電機不應當放置或使用在水中或
[嵌入式]
伺服電機的<font color='red'>調試</font><font color='red'>方法</font>和注意事項
小廣播
添點兒料...
無論熱點新聞、行業分析、技術干貨……
設計資源 培訓 開發板 精華推薦

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

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

電子工程世界版權所有 京B2-20211791 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 汕头市| 江北区| 潮州市| 平塘县| 南平市| 余江县| 江口县| 军事| 崇义县| 平南县| 和政县| 怀化市| 通渭县| 曲周县| 绍兴市| 泰顺县| 伽师县| 阿巴嘎旗| 通海县| 吴川市| 张家港市| 屏南县| 亚东县| 南康市| 宁河县| 海淀区| 泗阳县| 巴南区| 台南市| 陆丰市| 宜君县| 伊吾县| 山丹县| 西藏| 无极县| 阿拉善右旗| 宁阳县| 富川| 彰化县| 凉山| 曲松县|