/* RTP_sp_3-3 */ /* * タイマーによる PWM 制御 * * OS: T-Kernel * */ #include /* T-Kernel ヘッダ */ #include /* ハードウェア定義 */ #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) { INT duty; /* PH1/TB4OUTにタイマーから出力するように設定する */ PIO_IE(H) &= ~(1 << 1); PIO_CR(H) |= (1 << 1); PIO_FR2(H) |= (1 << 1); for (;;) { /* デューティー比を50%, 51%, ..., 98% に設定する */ for (duty = 50; duty < 99; duty += 1) { set_timer(duty); tk_dly_tsk(20); } /* デューティー比を99%, 98%, ..., 51% に設定する */ for (; duty > 50; duty -= 1) { set_timer(duty); tk_dly_tsk(20); } } /* このタスクは終了しない */ } /* 初期化処理 */ 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 = tk_cre_tsk(&ct); /* タスク A を生成 */ if (tidA < E_OK) return tidA; /* タスク生成失敗時 */ tk_sta_tsk(tidA, 0); /* タスク A を起動 */ return E_OK; }