このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| exercise4_タイマー割り込みcmt [2015/03/01 14:09] – member | exercise4_タイマー割り込みcmt [2016/03/08 18:58] (現在) – member | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | ======Exercise4 タイマー割り込み====== | ||
| + | |||
| 注意 | 注意 | ||
| - | タイマー割り込みを実行するためにはinterrupt_handlers.cの385行目あたりを以下のように書き換えてください(HEWであればintprg.cに載っています) | + | タイマー割り込みを実行するためには**interrupt_handlers.c**の385行目あたりを以下のように書き換えてください(HEWであればintprg.cに載っています) |
| <code c> | <code c> | ||
| void interrupt_cmt0(void); | void interrupt_cmt0(void); | ||
| - | #pragma interrupt | + | #pragma interrupt |
| void INT_CMT0_CMI0(void){ | void INT_CMT0_CMI0(void){ | ||
| interrupt_cmt0(); | interrupt_cmt0(); | ||
| 行 11: | 行 13: | ||
| </ | </ | ||
| - | さて、タイマー割り込みとは何でしょう。 | + | ただし、e2studioを使っている場合は、次のとおり書き換えてください。 |
| + | |||
| + | <code c> | ||
| + | void interrupt_cmt0(void); | ||
| + | void INT_CMT0_CMI0(void){ | ||
| + | interrupt_cmt0(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | また、**reset_program.c**の21行目のSR_Initの0x000000F0を0x00000000にしましょう。 | ||
| + | |||
| + | |||
| + | さて、**タイマー割り込み**とは何でしょう。 | ||
| 今まで書いてきたプログラムは、上から下まで順に実行する(サブルーチンはその通り飛ぶとして)ものです。 | 今まで書いてきたプログラムは、上から下まで順に実行する(サブルーチンはその通り飛ぶとして)ものです。 | ||
| 行 27: | 行 42: | ||
| 何かのアプローチがあって割り込みが入る場合もありますが | 何かのアプローチがあって割り込みが入る場合もありますが | ||
| 今回は、時間で割り込みをかけてみたいと思います。 | 今回は、時間で割り込みをかけてみたいと思います。 | ||
| - | 1sごとに指定された割り込み文を実行する、などと言うことです。 | + | 1msごとに指定された割り込み文を実行する、などと言うことです。 |
| - | 実際にやってみる | + | |
| まず、時間を使って割り込む事をタイマー割り込みといいます。 | まず、時間を使って割り込む事をタイマー割り込みといいます。 | ||
| + | |||
| タイマー割り込みをつかうには、初期設定が必要です。 | タイマー割り込みをつかうには、初期設定が必要です。 | ||
| - | main文の上のほうに初期設定を以下のように書きます。 | + | main文の上のほうに1msで割り込むCMTの初期設定を以下のように書きます。 |
| <code c> | <code c> | ||
| 行 47: | 行 63: | ||
| CMT0.CMCSR.BIT.CMIE = 1; // | CMT0.CMCSR.BIT.CMIE = 1; // | ||
| CMT0.CMCSR.BIT.CKS | CMT0.CMCSR.BIT.CKS | ||
| - | CMT0.CMCSR.BIT.CMF | + | CMT0.CMCSR.BIT.CMF |
| CMT0.CMCOR | CMT0.CMCOR | ||
| - | INTC.IPRJ.BIT._CMT0 = 0xe;// | + | INTC.IPRJ.BIT._CMT0 = 0xf;// |
| } | } | ||
| 行 56: | 行 72: | ||
| この初期設定は**initCMT**という関数に収められています。この関数をmain文の最初のほうで呼び出しましょう。\\ | この初期設定は**initCMT**という関数に収められています。この関数をmain文の最初のほうで呼び出しましょう。\\ | ||
| - | なぜ関数に初期設定を収めたというと、main文にまとめて初期化の文を書いてしまうと分かりにくくなってしまうためです。 | + | なぜ関数に初期設定を収めたというと、main文にまとめて初期化の文を書いてしまうと分かりにくくなってしまうためです。\\ |
| 実際にCMTを動かすためには割り込み時に実行するプログラムを書く必要があります。\\ | 実際にCMTを動かすためには割り込み時に実行するプログラムを書く必要があります。\\ | ||
| 行 65: | 行 81: | ||
| void interrupt_cmt0(){// | void interrupt_cmt0(){// | ||
| + | CMT0.CMCSR.BIT.CMF = 0;// | ||
| //中身 | //中身 | ||
| - | |||
| } | } | ||
| 行 85: | 行 100: | ||
| ヒントはCMTの初期設定のCMCORの部分です。\\ | ヒントはCMTの初期設定のCMCORの部分です。\\ | ||
| - | CMCORとはCMTの割り込み周期を変更できるレジスタで、式は以下のようになります。 | + | CMCORとはCMTの割り込み周期を変更できるレジスタで、式は以下のようになります。\\ |
| + | **割り込み周波数: | ||
| - | 実際に計算をしてみましょう。\\ | + | これで割り込む周期を設定できます。1msくらいがいいと思います。\\ |
| - | Coming soon. | + | データシートを見たり、周期と周波数の関係を思い出しながら実際に計算をしてみましょう。\\ |