MPLAB 使用心得
這是單晶片的第一個作業,裡面有一些軟體的操作技巧,所以就順便記錄一下。首先是程式需求:
- 使用 PIC18F4520
- RC0 連接 SW1 (Normal Open),Active Low 動作
- RC1 連接 Relay 控制電燈 (或其它電器),Active High 動作
- 按下 SW1 後電燈亮,Timer1 開始計數
- Timer1 計數超過 100 時,將電燈關掉
PS : 這個電路圖是用 LTspice 畫的,因為很多零件找不到,所以就先用其它零件代替來示意了
程式如下:
myapp.h
#ifndef __MYAPP__ #define __MYAPP__ #include <p18f4520.h> #define BIT0 (1) #define BIT1 (1 << 1) #define BIT2 (1 << 2) #define BIT3 (1 << 3) #define BIT4 (1 << 4) #define BIT5 (1 << 5) #define BIT6 (1 << 6) #define BIT7 (1 << 7) #define SET(reg,b) reg |= (b) #define CLR(reg,b) reg &= ~(b) #define TGL(reg,b) reg ^= (b) #define GET(reg,b) (reg & (b)) #typedef enum { FALSE, TRUE } BOOL; #endif // __MYAPP__
main.c
#include "myapp.h" #define LightON() SET(LATC, BIT1) #define LightOFF() CLR(LATC, BIT1) void main(void) { BOOL bLampOn = FALSE; SET(TRISC, BIT0); // RC0 for SW1 input CLR(TRISC, BIT1); // RC1 for Relay1 output CLR(T1CON, BIT0); // Disable timer1 LightOFF(); while (1) { if (!bLampOn && GET(PORTC, BIT0) == 0) { // SW1 ON LightON(); bLampOn = TRUE; SET(T1CON, BIT0); // Enable Timer1 TMR1L = 0; // Reset couter } if (bLampOn && TMR1L > 100) { LightOFF(); bLampOn = FALSE; CLR(T1CON, BIT0); // Disable Timer1 } } }
其中 C 沒有 bool 的資料型態,所以就參考 Using boolean values in C 定義一個新的資料型態 BOOL。以下是一些 Debug 的技巧:
PS : 在單晶片中記憶體是非常寶貴的,所以應該不會用 1 Byte 來記錄 True / False 的狀態,而只會用 1 bit 來記錄。而這裡只是為了方便才這樣寫。
Watch 視窗可以在 Symbol Name 欄位直接輸入要查看的暫存器或變數名稱,而在欄位視窗上面按滑鼠右鍵可以選擇要顯示的欄位,其中 Binary 與 Hex 是滿常用的。
另外在 Value 的欄位可以直接修改暫存器的值,但若該暫存器為輸入模式,則修改會無效,必需用 Stimulus 視窗來達成 (Debugger | Stimulus | New Workbook)
這裡我設了三個狀態
- Set High 表示將 SW1 放開
- Pulse Low 10 cyc 表示按下 SW1 10 cycles
- Pulse Low 100 cyc 表示按下 SW1 100 cycles
由波形我們可以發現,不論按鍵時間的長短,電燈亮的時間都是一樣的,所以就確認達成程式的要求了。
留言