1. 割り込み処理とは


演習 5-1 (個人PC): INT 割り込みを使ってみましょう。プログラムの仕様は以下の通りです。

仕様:

  1. INT (6ピン) にタクトスイッチを接続する
  2. プログラムを実行すると int 型変数 count の値を表示し続ける
  3. タクトスイッチを押すと INT 割り込みが生じて count の値が 1 増える
  4. INT 割り込みを行うタイミングは「立ち下がり」とする(※)

※ タクトスイッチはプルアップされてるので、押すと「High → Low」と変化する事に注意

プロジェクト「IO_4_2」を「IO_5_1」にコピーします(プロジェクト名を右クリックして Copy を選択)。
プロジェクト IO_4_2 を閉じます(プロジェクト名を右クリックして Close を選択)。
(もし開きっぱなしになっていたら) 前のプロジェクトで開いていたソースを全て閉じます。
(IDEのバージョンによっては) プロジェクトのプロパティを開き、そのまま「Apply」ボタンを押して設定ファイルを更新します。※ 通常は自動で設定ファイルが更新されますが、バージョンによってはバグのため自動更新されないようです
setting.h を開き、一旦全ての機能をオフにします。
シリアル通信(USE_UART)、INT割り込み(USE_RB0INT)のコメントアウトを解除します。
Modlules/rb0int.c を開いてコメントに従って設定します。
main.c を開き、ファイルの中身をテンプレートの内容に置き換えて下さい。
isr.c を開き、ファイルの中身をテンプレートの内容に置き換えて下さい。
穴埋め問題になっていますので、プログラム内のコメントを参考に?のところを正しい内容に修正してください。
回路を作成します。

以下の設定に従って回路を作成して下さい。
(*) が前の演習からの変更箇所です。

ピン配置設定・回路接続方法:

1: RA2
2: RA3
3: CCP4 (PWM) -- 圧電スピーカ
4: MCLR/VPP -- PICkit の 1: NMCLR
5: VSS -- GND
(*)6: RB0/INT (GPIO入力/INT割り込み) -- タクトスイッチ ※ 実際には回路に変更はありません
7: RB1
8: Rx (UART) -- RN-42 の J2-6 : TX (UART)
9: CCP1 (PWM) -- オシロスコープ

10: RB4
11: Tx (UART) -- RN-42 の J2-7 : RX (UART)
12: ICSPCLK -- PICkit の 5: PGC
13: ICSPDAT -- PICkit の 4: PGD
14: VDD -- 3.3V
15: RA6
16: RA7
17: RA0 (GPIO出力) -- LED
18: AN1 (ADC) -- 可変抵抗の中央ピン

書き込みボタンを押して正常に動作する事を確認して下さい。
指定場所に「rb0int.c」と「main.c」と「isr.c」を記入してください。


演習 5-2 (個人PC): タイマー割り込みを使ってみましょう。プログラムの仕様は以下の通りです。

仕様:

  1. タイマーとして 16bit タイマーの Timer1 を使う
  2. Timer1 の動作クロックは FOSC/4 = 1 MHz とする
  3. Timer1 の prescale は x8 とする
  4. プログラムを実行すると int 型変数 count の値を表示し続ける
  5. 500 ミリ秒毎にタイマー割り込みが生じて count の値が 1 増える
  6. タクトスイッチを押すと INT 割り込みが生じて count の値が 0 にリセットされる

プロジェクト「IO_5_1」を「IO_5_2」にコピーします(プロジェクト名を右クリックして Copy を選択)。
プロジェクト IO_5_1 を閉じます(プロジェクト名を右クリックして Close を選択)。
(もし開きっぱなしになっていたら) 前のプロジェクトで開いていたソースを全て閉じます。
(IDEのバージョンによっては) プロジェクトのプロパティを開き、そのまま「Apply」ボタンを押して設定ファイルを更新します。※ 通常は自動で設定ファイルが更新されますが、バージョンによってはバグのため自動更新されないようです
setting.h を開き、一旦全ての機能をオフにします。
シリアル通信(USE_UART)、INT 割り込み(USE_RB0INT)、Timer 1 割り込み(USE_TIMER1)のコメントアウトを解除します。
Modlules/timer.c を開きます。
Timer 1 を使うので、Timer 1 の初期化関数( void init_timer1( void )をコメントに従って設定します。
main.c を開き、ファイルの中身をテンプレートの内容に置き換えて下さい。
isr.c を開き、ファイルの中身をテンプレートの内容に置き換えて下さい。
穴埋め問題になっていますので、プログラム内のコメントを参考に?のところを正しい内容に修正してください。
回路には変更ありません。
書き込みボタンを押して正常に動作する事を確認して下さい。
指定場所に「timer.c」と「main.c」と「isr.c」を記入してください。


(追加課題) 演習 5-3 (個人PC): コンペア割り込みとタイマー割り込みを組み合わせて PWM 出力をしてみましょう。プログラムの仕様は以下の通りです。

仕様:

  1. コンペア出力モジュールとして CCP1 を使用する
  2. CCP1 の出力ピンは 9 pin とする
  3. CCP1 に接続するタイマーとして Timer1 を使う ※ コンペアモードではTimer1しか接続できません
  4. Timer1 の動作クロックは FOSC/4 = 1 MHz とする
  5. Timer1 の prescale は x8 とする
  6. タクトスイッチを離している時は PWM周期 16 ミリ秒、パルス幅 8 ミリ秒
  7. タクトスイッチを押している時は PWM周期 8 ミリ秒、パルス幅 6 ミリ秒

プロジェクト「IO_5_2」を「IO_5_3」にコピーします(プロジェクト名を右クリックして Copy を選択)。
プロジェクト IO_5_2 を閉じます(プロジェクト名を右クリックして Close を選択)。
(もし開きっぱなしになっていたら) 前のプロジェクトで開いていたソースを全て閉じます。
(IDEのバージョンによっては) プロジェクトのプロパティを開き、そのまま「Apply」ボタンを押して設定ファイルを更新します。※ 通常は自動で設定ファイルが更新されますが、バージョンによってはバグのため自動更新されないようです
setting.h を開き、一旦全ての機能をオフにします。
デジタル入力(USE_INPUT)、タイマー 1 割り込み(USE_TIMER1)、コンペア割り込み(USE_CCP1_COMPARE) のコメントアウトを解除します。
Modlules/timer.c の設定は演習 5-2 のままです。
Modlules/ccp_compare.c を開きます。
CCP1 を使うので、CCP1 の初期化関数( void init_ccp1_compare( void )をコメントに従って設定します。
main.c を開き、ファイルの中身をテンプレートの内容に置き換えて下さい。
isr.c を開き、ファイルの中身をテンプレートの内容に置き換えて下さい。
穴埋め問題になっていますので、プログラム内のコメントを参考に?のところを正しい内容に修正してください。
回路には変更ありません。
書き込みボタンを押して正常に動作する事を確認して下さい。
指定場所に「ccp_compare.c」と「main.c」と「isr.c」を記入してください。