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 欄位直接輸入要查看的暫存器或變數名稱,而在欄位視窗上面按滑鼠右鍵可以選擇要顯示的欄位,其中 BinaryHex 是滿常用的。

另外在 Value 的欄位可以直接修改暫存器的值,但若該暫存器為輸入模式,則修改會無效,必需用 Stimulus 視窗來達成 (Debugger | Stimulus | New Workbook)


這裡我設了三個狀態
  • Set High 表示將 SW1 放開
  • Pulse Low 10 cyc 表示按下 SW1 10 cycles
  • Pulse Low 100 cyc 表示按下 SW1 100 cycles
有了這三個條件後,就可以開始單步執行程式,在執行的過程中,要觸發那一個狀態只要在對應前面的 Fire 點一下就可以了。 最後執行的結果就可以用模擬的 Logic Analyzer (View | Simulator Logic Analyzer) 來驗證程式的邏輯是否正確。


由波形我們可以發現,不論按鍵時間的長短,電燈亮的時間都是一樣的,所以就確認達成程式的要求了。

留言

這個網誌中的熱門文章

Linux 批次檔的寫法

【分享】如何顯示 Debug Message

[分享] Visual Studio 遠端偵錯