Plurk噗浪留言板

   

2009年5月26日 星期二

單晶片入門

我想用一種門外漢的角度,來寫篇單晶片的入門文章。非相關科系的人要學單晶片最大的問題是,不知從何著手。網路上找到的資訊通常都蠻零散的,只能靠自己一 點一點慢慢拼湊;而市面上的書籍內容通常較為專一,很難獲得較全面的訊息。這篇文章算不上是教學吧?不過我儘量把我在學的時候遇到的問題作個整理,想學的 人看一看也許能夠有個方向。


.關於單晶片
CPU(Central Processing Unit, 中央處理器)相信大家都知道這是什麼。比較小,比較遜的CPU就叫作MPU(Micro Processing Unit, 微型處理器)。今天的主角叫作MCU(Micro Control Unit, 微型控制器), 又稱作單晶片微電腦(Single Chip Microcomputer),在台灣習慣稱作「單晶片」,在大陸則管他叫「單片機」。MCU跟MPU一樣可以看作是一種微型處理器,但不同的是MCU通 常會將CPU、RAM、ROM、I/O介面等全都包含在同一顆晶片上。也就是說一顆MCU晶片就可以看作是一部超迷你型的電腦。
MCU通常是拿來作一些小型的控制,像是家電、自動控制、玩具等等,需要作一些電腦控制,但又不可能把一台電腦放進去的那種場合,就非常的好用。在業界很 多人是靠這個吃飯,但喜歡的話可以拿來作點小玩具玩,比如沒事可以來作個CD-Pro2,或是小機器人之類的,也蠻不錯的。


.認識8051
學單晶片一定會聽過「8051」。8051是Intel在1980年發表的一顆單晶片處理器,和早期個人電腦的CPU 8086/8088是差不多年代(1978/1979)的東西。8086/8088現在我們可能很少用到了,他後來變成了大家比較熟悉的80286、 386、486、Pentium等等等;但8051從2x年前一直到今天他都還是8051,而且一直被廣泛使用著。Intel的8051家族還有一些兄弟 姊妹,包含8031/8051/8751和8032/8052/8752等等,他們只差別在於ROM的型式、容量,或是功能的擴充,其它基本的功能和內部 指令都是相同的。這些與8051指令集相容的MCU,通稱作MCS-51。
8051因為發展的早,使用的廣,幾乎可說是單晶片入門的代名詞。學校的單晶片課程大都以8051作為教學內容,市面上的參考書籍、網路上的參考資料,全 都是以8051最多。尤其在台灣,其它單晶片的資料相較之下簡直是少的可憐。另外和程式開發有關的,像整合編輯器(IDE)、編譯器 (Compiler)、軟體模擬器(Simulator)等等的,也都是以8051的數量最多。所以8051在學習和使用上有著極大的優勢。


.MCS-51的變種
許多Intel以外,像是Atmel/DALLAS/Philips/STC/Winbond等等等的一堆廠商,也生產了許多MCS-51的相容晶片。他 們和8051的指令集相同,但是功能可能更強大。所以學會8051不止是可以用8051而已,也等於同時也能夠使用這些8051的相容/變種晶片。像現在 市面上能買到的"標準"8051,幾乎都是Ateml生產的AT89C51/AT89S51系列。又例如8051的標準運作時脈只有12MHz,嫌不夠快 怎辦?Winbond有出一堆40MHz的MCS-51,甚至還可找到其它縮短指令週期,或是更高頻率的版本。而標準的8051是40pin,若覺得 40pin的IC體積太大,又用不到那麼多IO port,也可以找到更小的版本,像Atmel 2051系列,包含89C1051/89C2051/89C4051和89S1051/89S2051/89S4051,刪除了兩個IO port,只剩下20pin,小小一顆可愛多了。
那怎樣找這些變種51的資訊呢?方法是,先想辦法知道那些廠商有生廠51相容晶片(像是上面已經提到好幾家了),然後去他們網站,把規格表抓下來一個一個看,就會知道有那些東西可以用,慢慢的就會認識越來越多型號了。


.其它的單晶片
51系的好處前面有提到,相關資料超多、開發環境較成熟、相容晶片多,真的是好學好用。但是,這世界上並不是只有MCS-51而已,去看看其它的單晶片我想也不是什麼壞事。問題又來了,要去那裏看?怎麼知道有那些可以看?
好吧,單晶片百百種,但簡單講,除了51系之外,一般比較常見有人在討論/比較容易找到資料的小型單晶片,其實只有Atmel的AVR系列,和 Microchip的PIC系列,就這兩種而已。至於其它的嘛,光是為了找資料大概都會搞死人,我想以非專業用途來講可以不太需要管他們了。所以不想侷限 只用51系的話,AVR/PIC都是不錯的選擇。雖然他們的相關資源跟51比起來可能差了一大截,但也還算的上是豐富的了。
學51以外的單晶片雖然可能會比較困難,但AVR/PIC有些特點是51沒有的:
- 接腳數的選擇:51系就我現在知道的,最少接腳數是20pin,如果想用在空間很小的場合可能較不適用。AVR就我所知最小作到8pin,PIC則是6pin。
- AVR/PIC的架構和51比較起來可能會比較先進,畢竟51也算是很有歷史的一顆單晶片了。51系使用的是複雜指令集(CISC),AVR/PIC則是使用精簡指令集(RISC)。
- AVR/PIC大都有ISP(線上下載)功能,可以不經由專用燒錄器燒錄,在開發電路板上不需要拔MCU,直接經由傳輸線傳輸燒錄即可。
- AVR/PIC大都內建RC振盪線路(雖然內建的速度可能不快),可以省掉石英振盪器的外接線路用起來更方便。
舉些例子,像是最近熱門的Wii改機晶片,用的其實就是Microchip的PIC12F629,小小一顆,只有8支腳又內建振盪線路,完全不需外接其它 電路,所以把程式燒錄進去後直接丟進Wii就可以用了,連燒錄器都可以很容易的自製。另外像Atmel的ATtiny2313,腳位和80251完全相 容,可以直接取代80251使用,但速度快了大概十倍,且有ISP,也內建RC振盪,唯一的差別就是他是AVR系列,指令和51完全不相容,程式需要重新 寫過。


.單晶片的選擇
一開始得先選定其中一種單晶片來學,才有個方向,所以需要知道每家單晶片的特點。
- MCS-51系列
資源多,找資料容易。變種多,學一種可以用一百種。開發環境成熟,可以找到很多的相關工具。

- Atmel AVR系列
AVR跟其它單晶片比起來,特異功能特別多。像是內建A/D轉換、PWM輸出之類的,都是其它家比較缺乏的。
AVR八位元系列又分為mega系列和tiny系列。顧名思義,mega系列就是長的比較大的,tiny系列就是小小一顆的。大的功能特多,小的體積小但功能也不簡單。此外還有90系列,現在多屬USB、PWM之類的專門用途。

- Microchip PIC系列
PIC系列最厲害的就是晶片的種類多的數不完,可以依不用需求來作選擇。
PIC又分為PIC10/12/14/16/18
依接腳數來看:
PIC10: 6pin / PIC12: 8pin /PIC16: 18~40pin / PIC18: 28pin以上
因為是使用RISC精簡指令集,指令數少,易記易學
例如:
12位元核心,如PIC12C5XX,指令數33個
14位元核心,如PIC16CXX, 指令數35個
16位元核心,如PIC18CXX, 指令數77個
但也因為PIC系列種類太多,各系列間指令不同無法互用是比較麻煩的地方。

可以依自己學單習晶片的目的來選擇比較適合的單晶片系列。要容易學的話可選51,需要用到PWM之類的話可考慮AVR,想作小東西的話PIC就蠻適合。另 外51/AVR/PIC以外可能會用上的MCU也不是沒有,像作機器人的話可能會用到BASIC Stamp這類的MCU,這種的碰上的時候就會知道了。


.程式語言的選擇
單晶片的基本程式語言是組合語言。雖然以學習上來講不會很困難,但比較大的問題是每換一種單晶片,就得去重新瞭解他的指令集,程式要移植也不容易。用C語 言來寫是一種不錯的選擇,複雜的程式比較容易寫,移植容易。現在的編譯器都作蠻不錯的了,用C寫的程式容量和執行速度都可和直接用組合語言寫的相當接近。 所以除非是單晶片儲存容量超小、或是速度方向需要極斤斤計較的情況,不然一般來講用C寫會比較好些。


.C語言的開發環境
不過用C寫有一個問題,就是開發工具的選擇。原廠提供的開發工具通常都只有組合語言的版本,要用C寫的話得尋找其它第三方的整合編輯器(IDE )或編譯器(Compiler)。除了開發工具的額外花費以外,IDE有用的順不順手的問題,Compiler有編譯效率的問題;除此之外,C語言雖然有 一定的標準,但是各家的編譯器對C語言的解釋都會有些不同;像是光就PC上來講,在Borland c可以跑的程式就不見得能在gcc上執行。所以選擇合用的C開發工具恐怕也是得多花些精神的。


.除錯工具
單晶片程式開發最陽春的辦法就是:寫完程式,用燒錄器將程式燒錄進MCU,把MCU插上電路板上測試。有錯誤的話,修改程式之後拔下MCU,放上燒錄器重新燒錄,插回電路板再作測試。這樣的反覆插拔MCU的過程很煩人,而且也容易造成損壞,得找些方便點的方法才行。
- 使用線上模擬器(In Circuit Emulator, 簡稱ICE):ICE是一種硬體的模擬器,可替代MCU插入電路板的插槽進行模擬,另一端則接上電腦下載程式,省去重覆插拔的麻煩,使用上很方便。但缺點 是價格不便宜,且每換一種MCU都得搭配對應的ICE才行。另外也有結合燒錄功能的線上模擬器,可作測試也可燒錄MCU,這種的則稱作燒模器。
- 使用ISP燒錄:現在許多MCU有ISP燒錄功能,只要在電路板上多留一組接頭連接到電腦,就可以直接下載寫好的程式到MCU進行測試。和ICE不同的是,這些ISP的線路大都相當簡單,可自行製作,費用也不高。但這功能就必需要MCU本身有支援才行。
- 使用軟體模擬器(Software Simulator):軟體模擬器最基本的就是MCU模擬器。將編譯好的程式交給MCU模擬器執行,可以追蹤各暫存器的數值、IO腳位的電位高低變化等 等。MCU模擬器經常會整合於程式開發的IDE介面上,像Atmel原廠提供於AVR開發的AVR Studio,或普遍使用於MCS-51開發的Keil,都內建有MCU模擬器供測試使用。Keil內的模擬器甚至還提供了像波形產生器等軟體工具,對軟 體模擬開發有不少幫助。這種模擬器可以提供初步的MCU程式執行測試,但缺點則是是不容易看出整個電路的實際運作情況。
- 使用軟體電路模擬器:另外還有一種更進一步模擬整個電路的運作的軟體模擬器,像是以MCS-51為基礎的電路模擬器就可找到不少,例如「SIMLAB- 8051」,用起來就像一般8051的實習套件一般,可以模擬LED、七段LED、單色/彩色點矩陣LED、鍵盤、喇叭、指撥開關等等。在AVR/PIC 方面雖然比較找不到這方面的專用軟體,不過先前文章中曾提到過Proteus VSM這套電路模擬軟體,不單是可以模擬一般類比/數位電路的運作,他對MCS-51/AVR/PIC等眾多MCU晶片也支援了程式的執行,甚至在上面放 上小型LCD顯示器執行Linux都不是問題。對設計來講是蠻方便的方法,可以先以軟體方式模擬,最終再燒錄進行實際電路測試。


.參考書籍的選擇
一開始要學單晶片,可能連「該買什麼書來看」都很頭痛。但能夠瞭解並確定了要用的單晶片類型、選用的程式語言、開發環境之後,再來要選本書來看不會那麼困 難了。例如若選擇以MCS51+Keil+C來開發,那就去找本類似「8051單晶片設計:使用Keil C」這樣書名的書來看。不然萬一你去買了本「8051實作入門」,結果裏面講的全是組合語言,保證看完還是一樣茫茫然。不過組合語言的東西說實在看看是不 賴啦,對認識單晶片的運作蠻有幫助的。
買本適合的書,用力的K,裏面的程式照著寫,電路照著作,再來....應該就不會有什麼大問題了。

沒有留言:

張貼留言