close
我使用的硬體環境如下
使用的實驗板:APP001
使用的Mcripchip型號:PIC18F45K22
使用的燒錄工具:PICkit 3
 
因為我的電腦已經把軟體MPLAB x IDE含MCC都安裝好了,所以這部分的安裝分享晚點再製作。
就先在已經安裝好的基礎上繼續學習使用
 
另外實驗板上的資料可以從下列官方網站獲得
 
 
 
而燒錄工具使用PICkit 3
燒錄器先接到實驗板上的PICkit 3接頭後,啟動MPLAB x IDE軟體
 
 
由於MPLAB x IDE是使用Java寫的,所以執行上的消耗的資源比較大
電腦設備比較老舊的可能會跑久一點
 
從創建新專案開始
打開左上角File -> New Project
照下圖勾選後,按NEXT
 
因為實驗板上Microchip型號使用PIC18F45K22,所以這邊我的設定就是如下圖選擇
 
接下來是選擇燒錄工具,這邊我是使用PICKit 3,這邊也有抓到SN
選擇後(顏色填滿)後按NEXT
 
compiler選擇XC8
 
Project Name我取MyTest
最後按下Finish
左邊視窗已經創建好一些目錄了
 
創建main.c
在剛剛左邊視窗內,滑鼠移到「Souces Files」按下滑鼠右鍵,New -> main.c
彈出如下視窗,
File Name我改成main
按Finish離開
 
 
可以看到main.c已經新增至Source Files
 
建立的main.c的內容只是很簡單的main入口
 
 
使用MCC來創建Code
MCC是 MPLAB Code Configurator縮寫,顧名思義就是一個可以透過GUI勾選周邊硬體而產生對應的周邊硬體初始化程式
 
現在要使用MCC
來產生一個使用Timer1,每1秒觸發一次,讓實驗板上的LED_D8轉態
 
啟動MCC
點選上方工具Tools -> Embedded -> MAPLAB Code Configurator
 
﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍
若是點選上方工具Tools->Embedded但是沒有跳出MPLAB Code Configurator
那是因為沒有安裝MCC的plugin
 
安裝plugin的方式如下
點選上方工具Tools->Plugins,跳到如下畫面
在點選安裝MCC plugin, 最後按下Install
 
 
安裝完後就可以使用MCC去產生周邊硬體程式
另外MCC目前也會再進版,所以有可能最新版的MCC和教學上的圖片(MCC V3版的)會有落差
﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍
 
 
決定系統主頻
滑鼠點選左邊視窗System,右邊視窗畫面會出現關於System一些調整參數的畫面
 
設定系統主頻使用FOSC,以及頻率設定為1MHz
 
使用Generate Code會在原專案多了如下圖的檔案
之後想要重新設定都可以透過滑鼠Double-click「MCC CConfiguration」
等下全部設定完後再來解釋檔案結構
 
 
剛剛設定好的相關系統主頻的Code會放在mcc.h及mcc.c內
我想透過這樣的方式去比對Datasheet來驗證這些設定
 
<比對Datasheet>
OSCCON = 0x30
SCS=00選擇使用Primary Clock
IRCF選擇使用Internal RC Oscillator Frequency - 1MHz
 
 
 
 
OSCCON2 = 0x04
使用Primary Oscillator但沒有打開PLL
 
因此剛剛的使用MCC設定系統主頻後,自動產生的peripheral registers已經設置好了
 
以Datasheet Oscillator System Block Diagram走的路徑
 
其他和系統主頻有關的暫存器
 
 
設置GPIO
因為要控制的LED位於實驗板(AP0001)上的編號D8
看電路圖此D8連接於PIC18F45K22的RD7腳位
 
 
 
所以我們要設置的是PIC18F45K22的GPIO RD7
設置方式如下
 
先選擇正確的IC包裝,因為我用的包裝是DIP,所以修正的方式如下
Package換成PDIP40,上方的IC圖片也會一併更換到DIP包裝
 
接下來選擇RD7,RD7是Port D的第7 pin
因為是要控制LED,所以要在Pin Module的Direction = output的第7 pin滑鼠點一下
顏色會從藍變為綠
 
 
Project Resource切到Pin Module可以針對剛剛勾選的GPIO做更細部的操作
 
 
以LED D8的應用我做了如下的修改
把名稱變更為LED_D8,名稱最好取讓自己易懂的,因為等下MCC會根據此名稱建立GPIO的函示呼叫
而因為沒有用到Analog 所以我取消勾選
 
 
在產生一次Generate Code
這次來分析一下GPIO的設定增加到哪裡以及改了什麼暫存器
剛剛的設定跑在pin_manager.c的函式
void PIN_MANAGER_Initialize(void)
 
 
以上圖來說,可能又要回頭翻一下IC的Datasheet才能清楚瞭解設定什麼
 

<PIC18F45K22 Datasheet關於GPIO的說明>
 
PIC18F45K22有5個Port可以當成GPIO使用
當然pin角除了當成GPIO使用以外,也有許多複合功能
 
每一個Port都有5個registers設定,這5個register分別是
1.TRIS register(data direction register)
2.PORT register(reads the levels on the pins of the device)
3.LAT register(output latch)
4.ANSEL register(analog input control)
5.SLRCON register(port slew rate control)
 
其中LAT register通常只用於read-modify-write的操作
 
 
PORTD Registers
PORTD是一個8-bit寬的雙向的port,設定Output/Input方向的Register是TRISD,每個pin對應於TRISD的每一個bit
Setting TRISD bit = 1, 將使PORTD 一個pin變成input
Clearing TRISD bit =0,將使PORTD 一個pin變成output
 
 
所以根據上表,RD7我要使用當成GPIO output
TRISD = 0x7F
ANSELD = 0x7F
 
而pin_manager.h 則是MCC自動產生GPIO RD7的OUTPUT函式
 
現在可以把MCC產生的GPIO程式加入至main.c中
把MCC產生的mcc.h加至main.c內,再打開LED_D8透過
LED_D8_SetHigh();
 
我這邊看到的確實驗板上的APP001上的LED_D8被打開
 

 
 
操作MCC使Timer1 產生1Hz
 
進入MCC設定畫面,如下圖選擇Timer -> TMR1,並Double-Click
 
可以打開Timer1的參數設定
 
修改如下參數使Timer1, 1秒觸發一次
 
可以使MCC產生Code了
 
MCC產生的檔案多了,tmr1.c及tmr1.h
 
 
tmr1.h內有一些關於timer1函式及範例可供參考
我這邊先根據範例並加在main.c內,範例最終的目的
就是使用timer1,1秒觸發一次並改變LED_D8的狀態
 
 
 
 
剛剛設定的Timer1,經由MCC產生的Code,設置暫存器如下
 
T1CON = 0x20
選擇prescale值為4
Timer1/3/5的Clock Source 為Timer1/3/5 clock source is instruction clock(Fosc/4)
 
而剛剛MCC輸入的1s,就會使用
TMR1H=0x0B
TMR1L=0xDC
當遞增到溢位時,就會把TMR1IF bit給setting
 

研讀一些PIC18F45K22關於Timer1的datasheet
 
Timer 1/3/5 module是一個16-bit寬的timer/counter, PIC18F45K22的Timer有如下特性
  1. 16-bit timer/counter register pair(TMRxH : TMRxL)
  2. Clock Source可以選擇internal或external
  3. 2-bit prescalar
     4. Dedicated Secondary 32 kHz oscillator circuit
 
 
 
Timer1/3/5 Operation
Timer1/3/5是一個16-bit寬的遞增counter,而這Counter被直接更新可直接藉由寫值至TMRxH : TMRxL
 
如果選擇使用內部clock source,the module只能當timer使用,遞增隨者每一次instruction cycle
如果選擇使用外部clock source, the module可當timer或counter,遞增隨著每一次外部源的edge
 
Timer1/3/5被啟動藉由設定Registers TxCON和TxGCON內的TMRxON及TMRxGE bit
下表是設定TMRxON及TMRxGE對應的Timer1/3/5動作
 
Clock Source Selection
TMRxCS<1:0>及TxSOSCEN(都位於Register TxCON)是用來選擇Timer1/3/5的Clock Source
Setting TxSOSCEN bit將啟動the Secondary Oscillator Circuit並用來當作Timer1/3/5的Clock Source
 
Internal Clock Source
當選擇使用FOSC Internal Clock Source,Timer1/3/5 register的值每一次instruction clock cycle增加4個counts。
但是當讀取Timer1/3/5的值時會有2 LSB的error發生,因此所是要使用到Timer1/3/5降低error的發生,就必須使用asynchrous input signal去gate Timer1/3/5 input clock
 
若是要使用asynchronous sources的設定
1.Asynchronous event on the TxG pin to Timer1/3/5 Gate
2.C1 or C2 comparator input to Timer1/3/5 Gate
 
Timer1/3/5 Prescaler
Timer1/3/5有四個prescaler options, 1, 2, 4, 8 divisions of the clock input.
TxCON內的TxCKPS bits就是用來選擇prescaler counter
 

 
其實使用完MCC後,我個人感覺是向上述清除Timer1的over flag沒有現成函式可供呼叫
就變成我必須自己增加PIR1bits.TMR1IF = 0;才行,或許下次進版才會補齊功能
Microchip的MCC 和其他我用過的ST及瑞薩比起來,函式庫的創建比較清楚明白,只是仍然有很多
功能函式沒有建立,就變成自己還是需要查Datasheet
 
這一版的MCC v3還是有一個bug就是
如果我設定完GPIO後,產生程式後離開
再去設定Timer,也一樣產生程式後離開
會造成原來寫好的GPIO的名稱又回復到原來
 
變成我再使用MCC時,必須等到所有功能都改好後離開才不會有問題
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 凱文先生的部落格 的頭像
    凱文先生的部落格

    凱文的八卦俱樂部小天地

    凱文先生的部落格 發表在 痞客邦 留言(3) 人氣()