dsPIC33AKシリーズ⑥Timer1割り込みの使い方

dsPIC33Aシリーズ

概要

今回は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)
(fig.1-1)各関連記事リンク

開発環境

開発環境を以下に示します。

項目リンク
ベースボードdsPIC33A CURIOSITY PLATFORM
DEVELOPMENT BOARD
dsPIC33A Curiosity Platform Development Board User’s Guide (microchip.com)
CPUボードEV68M17A – dsPIC33AK128MC106 Motor Control DIMdsPIC33AK128MC106 Motor Control Dual In-Line Module (DIM) Information Sheet (microchip.com)
統合開発環境MPLAB X IDE v6.20MPLAB® X IDE | Microchip Technology
コンパイラMPLAB XC DSC v3.10MPLAB® XC DSC Compiler | Microchip Technology
(fig.2-1)本記事の動作確認環境
(fig.2-2)ベースボード+CPUボード(EV68M17A)

タイマー1 ブロック図

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

(fig.3-1)タイマー1ブロック図 (dsPIC33AK128MC106 Family Data Sheet (microchip.com) p.1217より抜粋)
(fig.3-2)タイマー1 クロック入力ブロック図 (dsPIC33AK128MC106 Family Data Sheet (microchip.com) p.1217より抜粋)

タイマー1レジスタ

タイマー1のレジスタは以下の通り

レジスタ名ビット名機能
T1CONONタイマーの有効/無効
SIDLアイドル時動作
TMWDIS非同期タイマー書込み無効化ビット
TMWIP非同期タイマー書込み状態ビット
PRWIP非同期周期書込み状態ビット
TECS外部クロックソース
TGATE外部信号ゲート設定
TCKPS入力クロックプリスケーラ
TSYNC外部クロック同期
TCSタイマークロックソース
TMR1TMRカウントレジスタ
PR1PR周期レジスタ
(fig.4-1)タイマー1レジスタ

タイマー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ミリ秒ごとにトグルしている様子が確認できます。

記事についての注意点

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

コメント

タイトルとURLをコピーしました