PICマイコンのタイマーを使ってLEDを点滅させる

PICマイコンのタイマーを使用し、500ms間隔でLEDの点灯と消灯を切り替えます。
回路は前回作成したものと同じでプログラムだけ変更します。

次のようなステップになります。

  1. 前回作成した回路を用意する
  2. MPLABのプロジェクトを作成する
  3. C言語でプログラムを作成する
  4. MPLAB X IDEでプログラムをPICに書き込む
  5. PICをブレッドボードに取り付けてLEDを点灯させる

1. 前回作成した回路を用意する

省略

2. MPLABのプロジェクトを作成する

前回と同様にプロジェクトを作成します
名前は、pic_0002_led_timerとします。

3. C言語でプログラムを作成する

まずは、タイマー割り込みの間隔を決定します。タイマーの割り込み間隔は以下の式で決定します。

タイマーの割り込み間隔[s] = 1 / (タイマクロック[Hz] / プリスケーラーレート / タイマカウント値)

タイマクロックはシステムクロック(FOSC)の4分の1の値(FOSC/4)です。
プリスケーラーレートが取りうる値は、2~256です。
タイマカウント値が取りうる値は、8bitタイマーなので1~256です。

この条件を満たすようにそれぞれの値を決定します。なお、現在の回路のシステムクロックは20[MHz]なので、タイマクロックは5[MHz]です。

タイマーの割り込み間隔によっては、複数の組み合わせが存在します。例えば、

  • タイマーの割り込み間隔を10[ms]にしたい場合
    • プリスケーラーレートは256、タイマカウント値は195
      • 195 = 10[ms] * 5[MHz] / 256
  • タイマーの割り込み間隔を2[ms]にしたい場合
    • プリスケーラーレートは128、タイマカウント値は78
      • 78 = 2[ms] * 5[MHz] / 128
    • プリスケーラーレートは64、タイマカウント値は156
      • 156 = 2[ms] * 5[MHz] / 64

タイマの割り込み間隔は10[ms]間隔とし、前回と同様にソースファイルをプロジェクトに追加します。

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>

#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config CP = OFF
#define _XTAL_FREQ 20000000

// 195 = 10[ms] * 5[MHz] / 256
#define TMR0_VALUE (256 - 195)

#define TMR0_500_MS_COUNT 50

static unsigned short t0 = 0;

void interrupt tc_int(void) {
if (T0IF != 1) {
return;
}

T0IF = 0;
t0++;

if (t0 < TMR0_500_MS_COUNT) {
TMR0 = TMR0_VALUE;
return;
}
t0 = 0;

PORTBbits.RB0 ^= 1;
TMR0 = TMR0_VALUE;
}

int main() {
GIE = 1; // Enables all unmasked interrupts
T0IE = 0; // Disable the TMR0 interrupt
T0CS = 0; // Internal instruction cycle clock (CLKOUT)
PSA = 0; // Prescaler is assigned to the Timer0 module

OPTION_REGbits.T0CS = 0; // Internal instruction cycle clock
OPTION_REGbits.PS = 7; // Prescaler Rate = (1:256)
OPTION_REGbits.PSA = 0; // Timer0

TRISBbits.TRISB0 = 0;

TMR0 = TMR0_VALUE;
T0IE = 1; // Enable the TMR0 interrupt

while(1) {
}

return 0;
}

解説

割り込み間隔は10[ms]なので、50回割り込みが発生すると500[ms]経過していることになります。
50回割り込みが発生したらPORTBbits.RB0を反転します。
これでLEDが500[ms]間隔で点滅します。

4. MPLAB X IDEでプログラムをPICに書き込む

省略

5. PICをブレッドボードに取り付けてLEDを点滅させる

省略