2012年5月11日金曜日

付属FM3基板 第二歩 タイマ割り込み。

Interface誌 付属FM3基板 で タイマ割り込みがようやく使えるようになりました。デュアルタイマ、多機能タイマ何れもタイマ割り込みによるLEDの点滅が実現できました。

苦戦1週間余り、富士通からダウンロードしたサンプルプログラム(mb9bf51xt_dualtimer-v10)を幾度も見直すのですが、これが難解、ただ単に、ただ単に3つのレジスタを設定するだけでタイマを使えるようになるはず、と思いながら、解読。
レジスタおよび、レジスタの項目ごとの設定順をああでもない、こうでもないと。

実際にタイマが機能し始めたとき、このプログラムは何度か試したと思い。なんでこんな簡単なプログラムに手間取ったのか、少々じくじたる思い。

以下にそのプログラムソースを記します。(最も簡単なタイマ割り込みプログラム。

◎多機能タイマについて。
 
 
  多機能タイマのユニット2(3つ目のユニット)が機能しない。富士通のデータシート等を見ると、MB9BF610Tシリーズの多機能タイマは3(最大)となっていて、ほかの資料も最大3ユニット、「ほんとは2ユニット、1ユニット??」という気になる。

 
 
 また、多機能タイマのコーディングでは、しばらく、ユニットと、チャネルとを取り違えるミスをしていて気が付かなかった。凡ミスでユニット2が機能しないだけのことかもしれません。


=======デュアルタイマ  main.c ========
#include "mcu.h"
static volatile uint16_t int_count;

void DT_Handler(void)
    {
     /* Clear Interrupt */
     FM3_DTIM->TIMER1INTCLR = 0xffffffffU;

     int_count++;
     int_count &= 0x7fff;
     FM3_GPIO->PDOR5_f.P1 = (int_count & 0x0040) >>6;
     FM3_GPIO->PDOR5_f.P2 = (int_count & 0x0100) >>8;
}

int32_t main(void)
{
    int i;
     int_count = 0;
     // for LED1
    bFM3_GPIO_DDRF_P3=1;
    // Test Output Port (LED_A LED_B LED_C)
    bFM3_GPIO_DDR5_P0=1;
    bFM3_GPIO_DDR5_P1=1;
    bFM3_GPIO_DDR5_P2=1;

    // Configuration ( Dual Timer )
    /* Clear Interrupt */
    FM3_DTIM->TIMER1INTCLR = 0xFFFFFFFFU;
    FM3_DTIM->TIMER1CONTROL =0x00000000U;
        
    FM3_DTIM->TIMER1CONTROL_f.ONESHOT =0;
    FM3_DTIM->TIMER1CONTROL_f.TIMERMODE =1;
    FM3_DTIM->TIMER1CONTROL_f.TIMERPRE0 =0;
    FM3_DTIM->TIMER1CONTROL_f.TIMERPRE1 =0;
    FM3_DTIM->TIMER1CONTROL_f.TIMERSIZE =1;
    FM3_DTIM->TIMER1CONTROL_f.INTENABLE =1;
    FM3_DTIM->TIMER1LOAD = 0xFFFFFFFFU;
     /* enable interrupt */
    NVIC_EnableIRQ(DTIM_QDU_IRQn);

    //Set the count cycle
    FM3_DTIM->TIMER1LOAD = 0x00020000;
    FM3_DTIM->TIMER1CONTROL_f.TIMEREN =1;

    while(1){
        for(i=0;i<200000;i++){
           bFM3_GPIO_PDORF_P3 =1;
       }
        for(i=0;i<200000;i++){
       bFM3_GPIO_PDORF_P3 =0;
      }
  }
 
}
=======多機能タイマ  main.c ========
#include "mcu.h"

static volatile uint16_t int_count;

void MFT_FRT_IRQHandler(void)
{
    /* Clear Interrupt */
    FM3_MFT0_FRT->TCSA0_f.ICLR = 0x00;
    int_count++;
    int_count &= 0x7fff;
    FM3_GPIO->PDOR5_f.P0 = (int_count & 0x0020) >>5;
    FM3_GPIO->PDOR5_f.P1 = (int_count & 0x0040) >>6;
    FM3_GPIO->PDOR5_f.P2 = (int_count & 0x0080) >>7;
}

int32_t main(void)
{
    int i;

    int_count = 0;

    // LED1
    bFM3_GPIO_DDRF_P3=1;
    // Test Output Port (LED_A LED_B LED_C)
    bFM3_GPIO_DDR5_P0=1;
    bFM3_GPIO_DDR5_P1=1;
    bFM3_GPIO_DDR5_P2=1;

    // Configuration ( // Configuration ( Multi-function Timer ))
    FM3_MFT0_FRT->TCSA0 = 0x00;
    FM3_MFT0_FRT->TCSA0_f.CLK0 = 0x01;
    FM3_MFT0_FRT->TCSA0_f.CLK1 = 0x01;
    FM3_MFT0_FRT->TCSA0_f.CLK2 = 0x00;
    FM3_MFT0_FRT->TCSA0_f.CLK3 = 0x00;
    FM3_MFT0_FRT->TCSA0_f.MODE = 0x00;
    FM3_MFT0_FRT->TCSA0_f.SCLR = 0x00;
    FM3_MFT0_FRT->TCSA0_f.STOP = 0x01;
    FM3_MFT0_FRT->TCSA0_f.BFE = 0x00;
    FM3_MFT0_FRT->TCSA0_f.ICRE = 0x01;
    FM3_MFT0_FRT->TCSA0_f.ICLR = 0x00;
    FM3_MFT0_FRT->TCSA0_f.IRQZE = 0x00;
    FM3_MFT0_FRT->TCSA0_f.IRQZF = 0x00;
    FM3_MFT0_FRT->TCSA0_f.ECKE = 0x00;

    FM3_MFT0_FRT->TCSB0 = 0x00000000;
    FM3_MFT0_FRT->TCDT0 = 0x0000;
  
    NVIC_EnableIRQ(FRTIM_IRQn);

    FM3_MFT0_FRT->TCSA0_f.SCLR = 0x01;

    //Set the count cycle
    FM3_MFT0_FRT->TCCP0 = 0x1000;
 
    FM3_MFT0_FRT->TCSA0_f.STOP = 0x0;

    while(1){
        for(i=0;i<200000;i++){
         bFM3_GPIO_PDORF_P3 =1;
       }
        for(i=0;i<200000;i++){
        bFM3_GPIO_PDORF_P3 =0;
      }
   }
}

0 件のコメント:

コメントを投稿