PIC24FJ64GB002などのUSB Hostモジュールが内蔵されているPICマイコンについて、どうもこのモジュール内に独立した1msecのタイマーが内蔵されているのを知りました。プリスケーラなどの設定が不要で、1msec経つと割り込みが発生するシンプルな仕組みです。
下記の例では、100ms経過ごとに26番ピン(LATB15)に接続したLEDを点滅させるプログラムになる。オシレータ、ピン設定などはMCCを使っています。
ポイントとしては、USBモジュール内にあるようなので、このモジュールの電源ONすることと、USBモジュールとそのタイマーの割り込みをONしておきます。1msごとの割り込みなので、カウンターを使って100カウントしたらON/OFFしています。
MLAやMCCでUSB機能を有効にしたときに追加されるusb_host.c
内でも使っています。データシートにはレジスタぐらいしか触れてないので知りませんでした。USB機能を使うときにタイマーを使ってdelayしたくなります。このときに通常のタイマーはべつの目的にで使う使いたい?と思ってたので丁度良いです。
#include "mcc_generated_files/system.h"
static volatile uint16_t msec_count = 0;
void __attribute__((interrupt,auto_psv)) _USB1Interrupt(){
IFS5bits.USB1IF = 0;
if(U1OTGIEbits.T1MSECIE && U1OTGIRbits.T1MSECIF){
U1OTGIRbits.T1MSECIF = 1;
msec_count += 1;
}
}
int main(void)
{
SYSTEM_Initialize();
_LATB15 = 0;
// usb module on
U1PWRCbits.USBPWR = 1;
// interrupt on
U1OTGIEbits.T1MSECIE = 1;
IEC5bits.USB1IE = 1;
IPC21bits.USB1IP = 1;
while (1){
// interval 100msec
if( msec_count >= 100 ){
_LATB15 ^= 1;
msec_count = 0;
}
}
return 1;
}