2008年10月24日 星期五

[技巧] DEBUG

在這裡我要教大家一個單字

" DEBUG "

它照字面上的意義是除蟲
也就是把你整個系統中的問題給抓出來!!

我們在微控制器這一堂課要學的東西很多
但我個人認人,最重要該學會的覺對不是如何使用8051
或是如何看懂電路圖跟了解各種元件的電路特性
最重要的是要學會的就是


" 除錯 "

除了天才跟運氣好的人,沒有人可以第一次上手就第一次把每個實驗做好
裡頭一定會暗藏一些小蟲,你要學會如何把這些小錯誤給它抓出來,解決掉
這才是你真正該學會的!!

世面上的IC千百種,就算過了我們這一堂微控制器的課,你一百分PASS了,還是只會使用這顆IC功能的一半不到,更何況其他形形色色的各種IC,我們不可能教會你們所有IC的使用方法。你也不可能一輩子遇到問題就有助教可以問。所以在我們這堂課裡,希望大家都可以學會如何分析系統中的錯誤如何利用各種方法確認錯誤找到錯誤之後如何去解決。只要學會了這三件事(其實是一件事嘛),你以後就可以無往不利,無所不能,天下無敵!!!!



----------
那嘛,除錯要如何開始呢?
1、 你會發現系統出了錯誤,你的輸出或現象不是你所期望的

2、 當我們發現一個東西有錯時,不可能所有東西都是錯的,一定是其中某一小部分不對了
所以先把整個系統切成很多很多個小塊,分多小呢?
以你可以很方便的檢查它這一小塊是不是有問題為主。

3、 你要很努力很努力的攪盡腦汁,分析並猜測錯誤最有可能發生在哪一小塊裡?

4、 將你覺得最有可能有問題的那一小塊想一個辦法證明它是沒問題/有問題 的,

5、 若在步驟 4 之中確定那一小塊是沒問題的,則回到步驟 3 ,不然可以前進到步驟 6。

6、 確認這一小塊有問題之後,仔細分析,看是否能知道問題的關鍵在哪裡,是否可以把問
題給修正? 若可以修正則到 8 ,若不行則到7

7、 把它切成更細更細的小塊,然後從步驟 3 開始做,直到你可以很完整的確定問題在哪一
個元件、哪一行程式、哪一隻小蟲為止。

8、 想一個確定沒問題的方法把問題給修正。

結束
--------

舉個範例
最近常有學弟來問說在實驗四裡面,它的LED燈不聽話。我們來依照這個題進行分析吧
實驗四是簡單的8051 INPUT、OUTPUT練習,有一個8pin的指播開關作為輸入,讓8051取得指翻開關的輸入後,轉換成輸出以控制8pin 的LED燈。

發生的問題: LED燈一直亮,不會變暗

解決:
1、把整個系統切成兩半,一半是指播開關電路讀取系統,另一半是LED電路輸出系統
2、我猜測是LED系統出了問題,則我先不管指播開關系統
3、寫程式命令LED全亮,再寫程式命令LED全暗,看是否會正常執行,若否則跳到下一步,
若可以正常執行,則就是指播開關讀取系統的問題(自已想辦法找出問題吧!)。
4、我把LED系統分成8051程式輸出部分及LED電路部分
5、我對各個部份進行測試
*8051程式輸出部分:
(1) 確認8051排線上40個PIN的各個腳位用途(這邊不再細述如何確認)
(2) 確認8051有確實執行我的程式 (以PORT0 作為範例)
->先命令PORT0 全部輸出高電位,拿三用電表量取輸出的值,確定它都輸出了高電位
->再命令PORT0 全部輸出低電位,拿三用電表量取輸出的值,確定全部都是低電位

*LED電路部分:
(1) 到網路上查LED是什麼東東,要如何正確的使用
(2) 利用正確的使用法,一邊接電阻再接5V,另一邊接GND
(3) 確認燈是否會亮,如果會它就沒問題,不會亮它就有問題


如果在其中有發現任何問題的話,那就解決問題吧!
但如果你發現你LED各細部可以正常運作,但組起來就是不照程式跑,那就要自已想其他的可能性囉!

☆☆☆☆☆ 另外教你們一個五顆星的大絕招,如果你實在想不出辦法確認說某一個元件到底
是不是壞掉的,就找同學借一個一樣的,如果他可以正常工作的話,就代表他的
那樣物品是好的,如果你換過來因此而使系統正常的話,恭喜你,你找到小蟲了!!

--------

DEBUG是一種訓練邏輯思考的過程,有了良好的習慣不止在工程上面適用,對解決一般生活中的小問題也有很大的幫助,花點時間分析嘗試,絕不吃虧。

最後,如果實在DEBUG不出來的話,可以來問助教,但是我會希望你過來時,可以把你已經想過的所有辦法及結果全部告訴我,這樣我才能幫上忙,而且我最多也只是告訴你你所沒想到的DEBUG方法,不可能幫你實際找出錯誤。

自已學會怎麼DEBUG
才是王道呀!!

2008年10月23日 星期四

[教學] 如何用程式對port作輸出入控制

這一篇的教學文件主要可以告訴你,如何用程式控制8051之外的硬體
IO怎麼控制?

首先我要說明的方法是-
找參考書!!

在坊間有很多介紹8051如何與KEIL C一起工作的參考書,不止一家書商有出
在其內容除了介紹基本的C語言運算,8051各個暫存器的用途及使用方式,更有許多實作的範例,其中有許多的範例跟我們實驗的內容不謀而合,完全一樣! 只要照著書上一步一步的接,程式一步一步的寫,就可以完程實驗,可以減少很多錯誤的路徑。

可是,我們在驗收的時候,不只會要求你把實驗的內容給一模一模的完成,可能會要求你現場作一些簡單的變化,如果你沒有完全了解其內部的運作過程,並且有能力進行修改的話,也是過不了驗收的!! 所以儘管買參考書可以讓你實驗快速完成,但你還是要一步一步的學習每一個實驗應該要學會的東西,不能只按照書上寫的完全照抄。

另外,如果不想買書的話,我記得在圖書館有很多相關的書藉,大家可以去借來看,如果已經被借走的話,有很大的可能是自已同學借的,所以查一下是誰借走的,去敲他房門借來看唄!!






-------------------------------
方案二--看懂DATASHEET 從底層自已來
-------------------------------
1、邏輯相關的語法
基本上在KEIL C裡面對於邏輯的運算即是一般的C語言,所有的運算符號就是那幾個,在網路上可以找到很多C語言的相關資料,動動手試幾個關鍵字,例如 「C語言 教學」、「C語言 語法」之類的,找英文網站會有更多的教學資訊,台灣的教學網站是很貧脊的!!

2、與port溝通的方式
在8051上面,具有很多個不同的port,每個port在8051內都各自代表了一個 "暫存器",而每一個 "暫存器" 具有一個自已的 "地址(ADDRESS)" ,這個地址跟我們的門牌號碼一樣,是由許多16進位的數值在命名。

當你要對一個port進行寫入,讓它執行你想要的值時,你需要做的事就是,去寫入那個腳位所在位置的值。舉個例子,當你要寫入Port0,你需要做的事是寫入8051中 address為0x80(hex) (這個位置具有1個byte的內容) 這個位置裡的值。
當然要執行上述的過程很麻煩,使用keil c時它會有比較方便又好記的作法,我們在寫一個程式時,會在最上方加入
#include
加入之後我們就可以使用所有在reg52.h中的定義。 在這個定義檔中有一行是這樣子寫的
sfr P0 = 0x80;
這一行的意思是,將"P0"定義成一個特殊的名字,它代表0x80這個位置,當你要對0x80這個位置的暫存器進行寫入時,就直接把值丟給P0作處理即可
例如 P0 = 254;
代表將數值254寫入P0也就是位置0x80裡面。

要讀出這個腳位的值時也一樣,直接讀出P0內的值即可
例如 tmp=P0;
這樣子就會把P0的值寫入到"tmp"這個暫存器裡面去了。

其他暫存器的名字與功能還有在keil c中對應的特殊名字,都可以在8051的datasheet以及REG52.H這個定義檔裡面找到。
8051的datasheet網址


-----
3、如何控制一個port中的某一個特定腳位
在這裡我提供兩個方法來控制單一的腳位
(1)第一個方法是運用邏輯的概念
先解釋名字 " | "這個符號是 or的意思," & "是AND的意思
a |= b; 這一行的意義是 先將a與b中每一個bit作 or 的運算後,將運算的結果填回a中
所以當我們要對P0中第5個腳位寫入1的話可以用這樣的式子
P0 |= 0x20;
這樣子就會把1寫入到Port
同樣的,如果要把0寫的P0中第0個腳位的話,可以用
P0 &= 0xfe;
來達成其效果。

(2) 用sbit 來定義每一個腳位,但在已預設的定義檔裡面沒有幫每個腳位作定義,所以你需要自行定義。方法很簡單,照下面作就ok了

sbit P0_0 = P0^0; //裡面P0_0是自定的名稱,可以更改,如改成ABC或XYZ也可以

當你要使用P0中第0個腳位時,只要使用P0_0這個名稱就可以了

例 P0_0 = 1; 這樣子就把P0第0個腳位寫入成HIGH
tmp = P0_0; 也同樣的可以把第0個腳位的值給讀回來。

--
有了這麼方便的方法應該大家都改用這個了吧……
重點還是要學會看懂DATASHEET才是永久之道呀!

-----

以上是臨時打的教學文章
如果有發現任何錯誤或疑問的話,儘管下面留言!!

[開放提問] 實驗四

關於實驗四有遇到自已解決不了
同學也無法回答的問題可以在下面的意見欄提問

2008年9月25日 星期四

[技巧] 畫流程圖的工具

今天有學弟來問畫流程圖的方法
下面是以OFFICE WORD為範例
分為OFFICE 2003 與OFFICE 2007 兩種界面
如果不是使用這兩種界面的話,就自已找一找吧
或是用GOOGLE搜尋 "流程圖 工具" 之類的關鍵字


OFFICE 2003



OFFICE 2007





另外,流程圖有一定的規範,各種不同的圖型代表著不用的意義
在使用前,請自行上網搜尋流程圖的使用方法。並按照正確的方法使用。

[公告] 微控實驗一的勘誤表

微控實驗一的勘誤表已有更改
原本的勘誤表將乘法表改成月曆
現在已改回,直接寫乘法表即可


所以,9/23號的實驗課中
完成乘法表並簽名的同學
來驗實驗時,只要帶結報過來即可,不用再驗一次
當日沒有到場完成乘法表的同學要另外帶寫好的程式來操作