概要
今回はdsPIC33AKシリーズにてTimer1割り込みの使い方に関して紹介します。
dsPIC33AKシリーズのタイマーは、従来の16ビットから32ビットに拡張されました。これにより、タイマーの性能が大幅に向上し、特に長時間のカウントが必要な場合において、その利便性が格段に増しました。
以前のdsPIC33Cシリーズでは、長時間のタイマーを生成する際に、プリスケーラで調整したり、入力クロックを調整したリファレンスクロックを使用するなど、さまざまな考慮が必要でした。しかし、dsPIC33AKシリーズでは32ビットに拡張されたことで、ペリフェラルクロック(100MHz)をプリスケーラなしでも約42秒間カウントすることが可能となりました。
このため、プリスケーラを使用する必要性が大幅に減少し、よりシンプルで効率的なタイマー設定が可能となっています。新しい32ビットタイマーの導入により、システム設計の柔軟性が向上し、さまざまなアプリケーションでの使用が期待されます。
| 記事 | リンク | |
| 第1回 | dsPIC33AKシリーズについて | dsPIC33Aシリーズに関して – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第2回 | 開発ボード、コンフィグレーション設定、クロック設定について | dsPIC33AKシリーズ②開発ボード,コンフィグレーション設定,クロック設定について – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第3回 | CPU性能について | dsPIC33AKシリーズ③CPU性能について – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第4回 | FPU性能について | dsPIC33AKシリーズ④FPU性能について – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第5回(執筆中) | DSP性能について | |
| 第6回(本記事) | タイマー1割り込みについて | dsPIC33AKシリーズ⑥Timer1割り込みの使い方 – ぴくおの電子工作的な何かWP (electricpico.com) |
開発環境
開発環境を以下に示します。
| 項目 | 値 | リンク |
| ベースボード | dsPIC33A CURIOSITY PLATFORM DEVELOPMENT BOARD | dsPIC33A Curiosity Platform Development Board User’s Guide (microchip.com) |
| CPUボード | EV68M17A – dsPIC33AK128MC106 Motor Control DIM | dsPIC33AK128MC106 Motor Control Dual In-Line Module (DIM) Information Sheet (microchip.com) |
| 統合開発環境 | MPLAB X IDE v6.20 | MPLAB® X IDE | Microchip Technology |
| コンパイラ | MPLAB XC DSC v3.10 | MPLAB® XC DSC Compiler | Microchip Technology |

タイマー1 ブロック図
タイマー1は、非常にシンプルな32ビットカウンタです。マイコンの起動からフリーランカウンタとして使用できるほか、1秒や1ミリ秒といった定期処理の実行にも適しています。その名の通り、時間をカウントするための基本的な機能を備えています。


タイマー1レジスタ
タイマー1のレジスタは以下の通り
| レジスタ名 | ビット名 | 機能 |
| T1CON | ON | タイマーの有効/無効 |
| SIDL | アイドル時動作 | |
| TMWDIS | 非同期タイマー書込み無効化ビット | |
| TMWIP | 非同期タイマー書込み状態ビット | |
| PRWIP | 非同期周期書込み状態ビット | |
| TECS | 外部クロックソース | |
| TGATE | 外部信号ゲート設定 | |
| TCKPS | 入力クロックプリスケーラ | |
| TSYNC | 外部クロック同期 | |
| TCS | タイマークロックソース | |
| TMR1 | TMR | カウントレジスタ |
| PR1 | PR | 周期レジスタ |
タイマー1 動作&割り込み確認
ソースコード
コンフィグレーションファイル、クロック設定ファイルは以下のファイルをインクルードしてください。
■コンフィグレーションファイル (config.h)
■クロック設定ソースファイル(Clock_Driver.c)
■クロックヘッダーファイル(clock_driver.h)
基本的な記述は従来とほぼ同じで、問題なく動作が確認できました。
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include "confog.h"
#include "clock_driver.h"
#include <dsp.h>
int main()
{
/*----------------------------------------------------------------------------*/
/*初期化*/
/*----------------------------------------------------------------------------*/
vdg_Clock_Set_Register();
TRISDbits.TRISD9 = 0u;
PR1 = 100000; //100MHz / 1kHz = 100000
T1CONbits.TCKPS = 0; //プリスケーラ 1:1
T1CONbits.ON = 1; //T1有効化
IFS1bits.T1IF = 0; //T1割り込みフラグ消去
IEC1bits.T1IE = 1; //T1割り込み有効化
IPC6bits.T1IP = 3; //T1割り込みプライオリティ
INTCON1bits.GIE = 1; //全割り込み有効化
/*----------------------------------------------------------------------------*/
/*メインルーチン*/
/*----------------------------------------------------------------------------*/
while(1)
{
}
}
void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void)
{
if ( LATDbits.LATD9 == 1)
{
LATDbits.LATD9 = 0;
}
else
{
LATDbits.LATD9 = 1;
}
IFS1bits.T1IF = 0u;
}
結果
下図では、LATD9ピンが1ミリ秒ごとにトグルしている様子が確認できます。

記事についての注意点
本記事は慎重に内容を検討し正確さに努めておりますが、もし内容に誤りがあったとしても、この記事を参考にして生じた損害等については一切の責任を負いません。

コメント