﻿/*
 *  タイマーによるパルス生成
 *
 *  OS: T-Kernel
 *
 */

#include <tk/tkernel.h>  /* T-Kernel ヘッダ */
#include <tk/sysdef.h>   /* ハードウェア定義 */
#include "tmrb.h"        /* タイマーBのハードウェア定義 */

/* オブジェクト ID 番号 */
LOCAL ID tidA;           /* タスク A の ID */

/* タイマーを設定する */
LOCAL void set_timer(INT duty)
{
    TBxEN(4) = 0x80;   /* タイマーにクロック供給 */
    TBxRUN(4) = 0;     /* タイマー停止 */
    TBxRG1(4) = 45000; /* 周波数 (18 MHz / 4) / 45000 = 100 Hz */
    TBxRG0(4) = 45000 * (100 - duty) / 100; /* デューティー比 */
    TBxFFCR(4) = 0x0e; /* パルス発生 */
    TBxMOD(4) = (1 << 6) | (1 << 3) | (2 << 0); /* 2: 1/4分周 */
    TBxIM(4)  = 0x07;  /* 割込みなし */
    TBxRUN(4) = 0x05;  /* タイマー動作 */
}

/* タスク A */
LOCAL void taskA(INT stacd, void *exinf)
{
    /* PH1/TB4OUTにタイマーから出力するように設定する */
    PIO_IE(H)  &= ~(1 << 1);
    PIO_CR(H)  |=  (1 << 1);
    PIO_FR2(H) |=  (1 << 1);

    /* タイマーを設定する */
    set_timer(80); /* デューティー比 80 % */

    /*??*/;        /* 自タスク終了・削除 */
}

/* 初期化処理 */
EXPORT INT usermain(void)
{
    T_CTSK ct;

    /* タスク A を生成する */
    ct.exinf = (void*)('t' | 's' << 8 | 'k' << 16 | 'A' << 24); /* 拡張情報 */
    ct.tskatr = TA_HLNG | TA_RNG0;  /* タスク属性 */
    ct.task = taskA;                /* タスク起動アドレス */
    ct.itskpri = 1;                 /* タスク起動時優先度 */
    ct.stksz = 1024;                /* スタックサイズ */
    tidA = /*??*/;                  /* タスク A を生成 */
    if (tidA < E_OK) return tidA;   /* タスク生成失敗時 */

    /*??*/;            /* タスク A を起動 */

    return E_OK;
}
