LEDフリーラン点滅

システムタイマ(Timer System Service)の
コールバック関数を
使った場合

 (→プロジェクトファイル(Harmony Ver.2.04版) ダウンロード


   LEDのフリーラン点滅を システムタイマ(Timer System Service)を使って行う場合の例を以下に説明します。
  
 
     
<仕様>
 ・ PIC32MZを使用する
 ・ LED1は1sec ON、1sec OFFを繰り返す。LED2、LED3、LED4は、20msec ON、20msecOFFを繰り返す
 ・ 動作クロックは外部に24MHzの水晶発振器を接続しこれを使用する
 ・ 時間制御は、Harmonyのタイマシステムサービスを使うこと。
 ・ 関数SYS_TMR_ObjectCreate( ) と SYS_TMR_CallbackPeriodic( )を使用のこと。    
 
<回路図>( → 回路図のPDFファイル


 

<外観>PIC32MZ評価ボード(→購入方法)を使った実験品の外観です。





<動作結果>( → 動画:1080pのHD動画を見ることができます。)  


   LED2、LED3、LED4 動作波形
        1.0V/div   10msec/div





<解説>

■ MHC
 ■ options

項目 ①Config設定
Device & Project Configuration
  > PIC32MZ2048 Device Configuration 
②System Service 設定
Harmony Framework Configuration
 > System Service > Timer
③Driverr設定
Harmony Framework Configuration > Drivers
 > Timer 
MHC
備考 デフォルトからの変更要領:
 FPLLIDIV: DIV3
 FPLLICLK: PLL_POSC
 POSCMOD: EC

システムクロック周波数: 200MHz
外部OSC: 24MHz
タイマ用ペリフェラルクロック
     周波数(PBCLK3): 100MHz


#pragma config FNOSC = SPLL
#pragma config POSCMOD = EC
#pragma config FPLLIDIV = DIV_3
#pragma config FPLLICLK = PLL_POSC
#pragma config FPLLMULT = MUL_50
#pragma config FPLLODIV = DIV_2  
デフォルトからの変更要領:
 □Use Timer System Service? チェックを入れる
デフォルトからの変更要領:
 □Use Timer Driver? チェックを入れる

 
 ■ pin settings

項目  ④ポート設定  ⑤ポート設定
MHC
備考 デフォルトからの変更要領:
 RG15/Function: GPIO_OUT
        (LED1用出力ポート設定)
デフォルトからの変更要領:
 RD4/Function: GPIO_OUT
        (LED2用出力ポート設定)
 RA15/Function: GPIO_OUT
        (LED3用出力ポート設定)
 RA14/Function: GPIO_OUT
        (LED4用出力ポート設定)




 app.cに、青字部分を追加します。


➀システムタイマのハンドルなどを定義します
  SYS_TMR_HANDLE handle1000msec;
  SYS_TMR_HANDLE handle20msec;

  int LED;
  int LED2;


➁ システムタイマのコールバック関数を定義します。
  void Test_Callback ( uintptr_t context, uint32_t currTick )
  {
    if(LED2 == 0)
    {
      LED2 = 1;
      LATDbits.LATD4 = 1;
      LATAbits.LATA15 = 1;
      LATAbits.LATA14 = 1;
    }
    else
    {
      LED2 = 0;
      LATDbits.LATD4 = 0;
      LATAbits.LATA15 = 0;
      LATAbits.LATA14 = 0;
    }

  }

  void Timer_Callback ( uintptr_t context, uint32_t currTick )
  {
    if(LED == 0)
    {
      LED = 1;
      LATGbits.LATG15 = 1;
    }
    else
    {
      LED = 0;
      LATGbits.LATG15 = 0;
    }

  }

③APP_Tasks()の中でSYS_TMR_ObjectCreate( )関数でコールバック関数を定義します。
 APP_Initialize ( )関数の中で定義しても、コンパイルはできますが動作はしません。
  handle20msec = SYS_TMR_ObjectCreate ( 20, 1, Test_Callback, SYS_TMR_FLAG_PERIODIC ); //ここで初期化
  //非繰り返しの場合:SYS_TMR_FLAG_SINGLE
  handle1000msec = SYS_TMR_CallbackPeriodic(1000, 1, Timer_Callback); //ここで初期化

  //非繰り返しの場合:SYS_TMR_CallbackSingle()




以下、app.c