2015年8月29日

1.簡単なOSを作成する ~タイマー割込み編その2~

前回(1.簡単なOSを作成する ~タイマー割込み編~)からの続き

0.04sec で満了するので、250回して1secタイマー作ってみました。
でもこれだと、満了した時すぐに次のタイマーが開始されるので、
if(T_TISRA.BIT.IMF == 0x01) 文の判定タイミングとずれが生じてしまう。

オシロスコープを使って、そのズレの検証を行ってた。

  • そーす
int main(void)
{
    serial_init(SERIAL_DEFAULT_DEVICE);

    puts("-----------------Led1 and 2 is Light start!!\n");   
    /* p4ddr(P46 and P47) output setting 0x0c = 1100 0000  */
    /* p4dr (P46 and P47) output         0x0c = 1100 0000  */

    P4DDR.BYTE        = 0;
    P4DDR.BIT.B6    = ENABLE;
    P4DDR.BIT.B7    = ENABLE;

    P4DR.BYTE        = DISABLE;
   
    P4DR.BIT.B6     = LED_ON;
    P4DR.BIT.B7     = LED_OFF;
   
    /**
     * カウンター
    */
    int T_16TCR0_COUNTER = 0;
    int secCount = 0;
   
    /**
     * カウントクロック設定 φ/8
     */
    T_16TCR0.BIT.TPSC = 0x03;
    //T_16TCR1.BIT.TPSC = 0x03;
   
    /**
     * カウンタクリア要因の選択
     */
    T_16TCR0.BIT.CCLR = 0x01; // GRA
    //T_16TCR1.BIT.CCLR = 0x01; // GRA
   
    /**
     * アウトプットコンペアレジスタの選択
     */
    T_TIOR0.BIT.IOA = 0x02; // GRA コンペアマッチ 1出力
    //T_TIOR1.BIT.IOA = 0x02; // GRA コンペアマッチ 1出力
   
    /**
     * IMF フラグ割込 要求許可
    T_TISRA.BIT.IMIE = 0x01; //割込 要求許可
    T_TISRB.BIT.IMIE = 0x01; //割込 要求許可
     */
   
    /**
     * 周期設定
     */
    T_GRA0_H.BYTE = 0x27; // 10000
    T_GRA0_L.BYTE = 0x10;
    //T_GRA1_H.BYTE = 0x00; //   250
    //T_GRA1_H.BYTE = 0xFA;
   
    /**
     * TIMER START
     */
    T_TSTR.BYTE = 0x01; // 16TCNT0 Start
   
    while(1)
    {
        puts("T_16TCNT0:");   
            putxval(T_16TCNT0_H.BYTE,2);
            putxval(T_16TCNT0_L.BYTE,2);
        puts("\n");   
        if(T_TISRA.BIT.IMF == 0x01)
        {
           
            T_16TCR0_COUNTER++;
            puts("T_16TCR0_COUNTER:");   
                putxval(T_16TCR0_COUNTER,3);
            puts("\n");   
           
            if(T_16TCR0_COUNTER >= 25)
            {
               
                P4DR.BIT.B6     =~ P4DR.BIT.B6;
                P4DR.BIT.B7     =~ P4DR.BIT.B7;
                T_16TCR0_COUNTER = 0;
                secCount++;
                puts("----------------secCount:");   
                    putxval(secCount,3);
                puts("\n");   
               
                if(secCount > 10)
                {
                    break;
                }
            }
           
        }
    }
   
  return 0;   
}

  • オシロスコープ計測
ズレを計測してみた。
 右上のdx:が1.018secになっている。交差0.98%なのでこれくらいならOKかな。




次は、タイマー割り込みをCPUに割り込みを行い、
割り込みハンドラを使ってオシロスコープで計測してみる。

交差はもっと正確なのか?



  • GitHub

sto@sto-PC ~/src
$ git commit -m "LED 1sec Lighting"
[master a66b547] LED 1sec Lighting
 2 files changed, 247 insertions(+), 73 deletions(-)
 rewrite 02-1/bootload/main.c (81%)

sto@sto-PC ~/src
$ git push origin master:master
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 1.97 KiB | 0 bytes/s, done.
Total 6 (delta 2), reused 0 (delta 0)
To https://github.com/satoshishimizu/mae_h8_3069f.git
   4f11c2d..a66b547  master -> master