在一開始先來談點無關主題的事情,哈哈前兩天更新了相片部分,上傳了Key所出產的兩部經典戀愛文字的H-GAME,
因為劇情太好了,因此相繼推出普及版的並推出卡通及漫畫,沒錯這兩部就是Kanon(雪之少女)以及Clannd(這個中文我就沒聽過了),
其中Clannad還是天雷推薦我才看的XD~~~,現在換我推薦給妳們看,當然製成卡通與遊戲中的劇情當然是有點差異,
因為是戀愛遊戲都會有主攻一個女主角的故事,當然卡通也只是選某個主角的劇情播出,
其中Kanon則是選擇裏面我最喜歡的月宮亞由(つきみやあゆ! tsu ki mi ya a yu <==給看不懂日文的)
而Clannad則是主攻裡面的女主角古河渚,但我還是比較喜歡智代~~~在第一步的番外篇就是他的劇情XD讚啦!(看來智代也蠻受歡迎的)
好啦談完更新相片的事情並說明圖片的來源,不然很多人看了還不知道那是啥卡通哩XD~~~
 
在此先聲明,以下教學純屬本人經驗,
並不代表是正確的學習過程,解說的內容也並非完全正確,
全是本人主觀概念,若與您不同,且請您多多包涵。
 
接著進入主題啦!沒錯近期內我的確學了很多晶片,
這些晶片的學習其實都是大同小異,但是可分成FPGA跟Microcontroller部分,
這兩個學習過程完全不一樣,而今天討論的主題是Microcontroller的部分,
 
我想8051這個晶片大家都不陌生吧!(以工科並走技職體系的眼光出發)
沒錯這個是大家最一開始學習晶片一定會用到的,當時所上的課你或許也是聽了也聽不懂吧!
或是了解怎麼用但也不清楚為啥會這樣用吧!
那時候的學習只是要讓你認識有這樣的東西,
而像我真正從零開始的晶片就是PSoC(Cypress出的),
 
學習的這麼多晶片,現在再拿一個新的晶片給我,我也許仍可以很容易上手,
因為學習這晶片過程都是一定的,不用懷疑,
那麼我今天就來教學啦!(PS:以下圖片會不清楚是因為微軟的Space空間會壓縮=_=,或許有違反著作權的圖片,若真的違反到請煩勞通知,我會刪除的!)
 
今天就隨便講一個晶片吧!那就一顆大家可能用過的晶片討論起吧!
為了不打廣告嫌疑,所以不說晶片型號只講學習過程,
那剛拿到或是預定要用的晶片後,您該如何進行學習呢?
 
首先:當然是找到這個晶片的datasheet、開發環境。
datasheet是用來閱讀晶片有哪些功能。
開發環境是用來撰寫程式用的。
那拿到datasheet後我們該閱讀哪些東西呢?
(哇靠376頁我要看到哪時候啊!)
不用緊張啦!首先要先看的就是接腳的使用、使用的頻率、工作電壓,
因為頻率對於應用場合很重要,電壓也不要隨便亂加XD,
再來就是要先學會使用跑馬燈,
 
很好這個晶片是可以到20MHz,5V,
那I/O的使用用到了三組控制記憶體,
控制記憶體???這是啥阿,很多人可能冒出很多問號吧!
因為這個名詞是我在說的啦!一般在晶片的使用重點就是在相對應的記憶體位置放入相對應的數值就可以控制它,
(實際的晶片內部是跟FPGA撰寫的方式有關,若懂FPGA寫法的話,就是到為啥這些記憶體在做啥的勒)
而有些記憶體則是放置資料,例如下面這張圖大家或許很常看到吧!
旁邊寫著0xAA,那就是代表這個記憶體位址,而裡面可放資料則就由CPU支援的bit數來看了,
像目前這個範例是一個8bit的CPU,而16bit可能就會用兩個位址組成,而像現在的64bit就是代表一個處理指令就會用掉8個位址XD,
好啦別扯太深,那這個記憶體代表啥呢?
我們找尋datasheet某段文字發現如下圖
可到看很多吧!就以DDRB這個記憶體來說好了,圖中在7~0就是代表這個記憶體的8bit,其中他的相對應位址就在0x04,
所以當燒錄進程式後,可在0x04(實際位址)看到此記憶體的變化,就代表正在控制DDRC的功能,
所以不同記憶體位址事實上就是放置著不同功能或資料,而這些定義就是在開發這個晶片時所定義下來的,
在使用前我們就是要了解不同記憶體的功能是在做啥用的,
因此我們回顧一下8051(不好意思我目前手邊沒那個資料所以就憑印象說,可能會說錯)
在8051中0x00~0x08放置著bank 0的R0~R7,這是CPU運算時的直接暫存器,
最常用來放置變數吧!所以以前在學習時,常常用到bank0~bank3的這些R,
再來0x30~0x7F是使用者定義的範圍
而接著就是PortA放置在0x80,PortB 0x90….因此這些記憶體就是在對外用的,
因此以8051的256BYTE RAM裡面0x00~0xFF就是在放置這些東西,
而每個位址都有相對應的功能,填入不同值也就會有不同的效果出來啦!
 
了解了記憶體的操作那我們再回歸到上上圖Table13-1那個,
假設我現在對這個晶片要把PortB更改為輸出時,要怎麼控制呢?
首先要先把DDRB這個記憶體改成1,
再來要控制High、Low則是PortB這個記憶體控制,
所以我們要讓PortB為輸出時且輸出為LOW時,程式就要這樣寫,
 
C語言下:
DDRB=0xFF;
PORTB=0x00;
 
組語下:
mov DDRB,#0xff
mov PORTB,#0x00
 
這時候就有人會問啦!對阿剛剛不是說控制記憶體,
那為啥不是值寫入到記憶體而是寫到變數呢?
這個客觀問的好,事實上無論在C或組語中,
在撰寫程式前,還記得都會include檔案嗎?
我們加入那個檔案的作用就是在定義這些變數的記憶體位址,
 
而這些資料就是在組譯或編譯的時候參考用的,
組譯就是把組合語言轉成機械語言,而編譯則是C語言轉成組合語言再轉乘機械語言,
然而不同的晶片會有不同的組合語言指令,因此在使用不同的晶片時,
就會有不同的組譯或編譯器,
以這張圖片來說好了!
 
黃色那段程式我原本的C語言是
runmode = 0;
轉成組合語言後變成了
CLR _runmode
而因為_runmode在組譯過程中會自動幫您編排記憶體位址,
故這個程式就是幫我轉到4DH這個位址(0x4D),當然也可以自己去設定,
而經過組譯後機械語言就是"1F4D" <==因此1F就是代表這個晶片的CLR的指令,
20就是CALL指令,00就是RET,這樣會看了嗎?也了解組譯編譯了嗎?
聽到這裡大家就會知道為啥會有反組譯出現了吧!
沒錯因為只要知道這晶片的機械語言相對應的指令就可以轉成組合語言,
而組合語言就可以了解程式的寫法,厲害的人就可以轉成C語言了!
 
 那接下來就是要討論include那個檔案的內容啦!
注意不同編譯器會有不同的內容,所以必須自行去研究.h或.inc檔案
以下範例是由Winavr這個免費編譯器.h的內容
例如以下資料:

#define DDRB    _SFR_IO8 (0x04)
/* DDRB */
#define DDB7    7
#define DDB6    6
#define DDB5    5
#define DDB4    4
#define DDB3    3
#define DDB2    2
#define DDB1    1
#define DDB0    0

#define PORTB   _SFR_IO8 (0x05)
/* PORTB */
#define PB7     7
#define PB6     6
#define PB5     5
#define PB4     4
#define PB3     3
#define PB2     2
#define PB1     1
#define PB0     0

 有發現了嗎?DDRB與我們由記憶體中看到的位址一模一樣吧!
懂C語言的就可以知道
#define的功能吧
舉個例子好了!當程式定義了下面這個程式
 #define min 5
此時程式中
x = min;
在編譯的時候因為在開頭有先define了,所以編譯過程min全部視為5這個字
編譯時程式就看成,"x = 5" 這樣了解了嗎?
也就是當我們include那個開頭檔後,我們接下來就可以從Datasheet直接看變數來使用了,
這當然要先閱讀過.h檔,看是否定義是一樣的啦!(一般而言都會是一樣的),
 
當然在.inc中也是有相同的資料啦!
ex:
.equ PORTD = $0B  ; – PORTD –
.equ DDRD = $0A
.equ PIND = $09 
.equ PORTC = $08  ; – PORTC –
.equ DDRC = $07
.equ PINC = $06
.equ PORTB = $05  ; – PORTB –
.equ DDRB = $04
.equ PINB = $03
 
在組語中分號不是結束符號而是註解唷!
了解記憶體使用的觀念後,那在對於讀Datasheet有進一步了解了吧!
也就是I/O也好,其他功能也好,
事實上就只需看看記憶體的裡面那個Bit的功能去設定就OK啦!
 
就像是下面這張圖片,這是這顆晶片ADC轉換眾多的記憶體中某個記憶體的功能介紹(這是最短那個所以剪他來用不然其他的太長~~)
所以在要使用這個ADC時,除了I/O要設定為輸入,這個記憶體也設定著是否要為數位輸入還是當作類比輸入,
當此記憶體為1時,代表此時作為類比輸入,<==不是照字面翻譯不要跟我爭這個問題說我翻譯錯誤唷!
When this bit is written logic one, the digital input buffer on the corresponding ADC pin is disabled
 
也就是談到這邊,你應該就會這晶片的50%了!
因為若想要用哪些功能只要看他記憶體怎樣設定,設定會有哪些功能,
這都可以在Datasheet找到,至於說找不到?那應該是你英文看不懂吧=_=,
 
那接下來要學哪些東西呢?就是中斷的使用,
因為每個晶片的中斷都不一樣,且會隨著編譯器的不同寫法也會有不同,
所以接著就是去了解那個編譯器是否有相關中斷範例,
而大致上中斷中斷,常常可以聽到中斷旗標,中斷向量表,
那是做啥的,簡單說中斷旗標是用來通知硬體說有中斷發生,
他自動會去找尋程式這個旗標所對應的位址就是中斷向量表,
當旗標被設定為1時,程式就會自動跳到中斷向量表的相對應位址執行程式,
 
這部分可能需要下功夫去了解,因為我已經打了兩個小時,明天要上班,
所以可能沒辦法在打詳細下去了,用一個圖帶過吧!(留給你自己去體會)
 
中斷的確定與使用當然要學會每套開發軟體啦!那當然也是要自己去摸索,就像是Windows、office也是要自己去研究啊!
這篇只是讓你更了解如何入手一個陌生晶片,如何閱讀他的datasheet而已,
實際的操作還是要你自行使用過才會更加且更快速的學習啊!
而操作軟體大致上也可以在晶片公司的網頁可以下載的到,或是到各大論壇找找範例教學(這部分對岸的同胞可就厲害了!)
好拉今天先打到這邊,我想睡覺了=_=,而且現在是在筆電上打文章,所以等等筆電還要收拾=_=,今天教學到這邊啦!
且文章太長說真的沒人會想要看完啊!就像我自己也是這樣,
裡面或許有很棒的內容,但是大篇長論真的會讓人看不下去啊!