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
由波形我們可以發現,不論按鍵時間的長短,電燈亮的時間都是一樣的,所以就確認達成程式的要求了。
留言