V850のタイマー機能の一つにPWM出力があります。レジスタに周期とデューティ比を設定しておくと勝手に点滅してくれます。appliletで設定してタイマーを開始する(TMP0_Start()等)だけでLEDチカチカができてしまいます。
デューティ比をどんどん書き換えてボワッと点いたり消えたりするのを作ってみました。タイマーはタイマーP0を使いました。タイマーP0専用の出力TOP01はCON2の17pinなので基板搭載のLEDは使えません。
CON2の17pin(TOP01) → LED+
LED- → 抵抗(1kΩ) → CON3の10pin(GND)
のようにつなぎました。
appliletの設定は次のようにしました。
- システムは、ウォッチドッグなし、(デバッグあり)
- タイマーはタイマーP0タブでPWM出力。詳細ボタンで
設定単位msec、周期1、デューティ比0、TOP01端子出力の許可にチェック。
プログラムはこんな感じです。
void main( void )
{
int i, d, t;
TMP0_Start(); // タイマースタート
d = 0; // 方向は増加
t = TM_TMP0_PWMWIDTH; // デューティ比初期値
while (1) {
for(i = 0; i < 60000; i++) __nop(); // 適当に待つ
if(d == 0){ // 明るくなる処理
t += 1000;
if(t >= TM_TMP0_PWMCYCLE){ // 最大を超えた
t = TM_TMP0_PWMCYCLE; // 最大値
d = 1; // 方向は減少に変更
}
} else { // 暗くなる処理
t -= 1000;
if(t < 0){
t = 0; // 最小値
d = 0; // 方向は増加に変更
}
}
TP0CCR1 = t; // デューティ比を書き込む
}
}
タイマーP0は周期がTP0CCR0、デューティ比がTP0CCR1に書き込むことで変更できます。動作は、タイマースタートすると出力を1にして0からカウントアップしていって、TP0CCR1になったら出力が0になって、TP0CCR0になったら0から繰り返しです。ソフトからは何もいじらなくても勝手にハードで実行してくれます。
TM_TMP0_PWMCYCLEとTM_TMP0_PWMWIDTHはappliletが計算してくれたTP0CCR0とTP0CCR1の初期値です。デューティ比は0~TM_TMP0_PWMCYCLEの間の数にします。カウンターの値なのでかなり細かく設定できます。
PWM出力はTOP00だと駄目でTOP01じゃないといけないみたいです。
TP0CCR1の変更はカウンタがTP0CCR1を超えた後でないといけないそうなので、本来ならTP0CCR1を超えたときに発生する割り込みのタイミングで変更するのがよさそうです。手抜きでソフトウェアタイマーで適当にごまかしました。