V850にはリアルタイム出力という機能があります。これはタイマー割り込みのタイミングでハードウェア的に事前に設定していた値をポートに出力する機能です。
リアルタイム出力を使わないやり方だと割り込みが発生してからソフトで何か出力するわけですが、割り込み処理が実行されるのは、割り込み要因が発生した時に実行している命令が終了してからなので、その命令の実行クロック数によっては微妙にタイミングがずれます(ジッタといいます)。リアルタイム出力では、割り込み要因が発生した瞬間に出力してしまうのでジッタが生じないことになります。精密なハードウェアの制御が必要なときに使えそうな機能です。ユーザーズ・マニュアルの12章に説明が載っています。ユーザーズ・マニュアルではステッピングモーターの制御に最適と書かれています。
リアルタイム出力自体は4通りの出力形態を選べます。
(1) 6bit x 1ch
(2) 4bit x 1ch
(3) 2bit x 1ch
(4) 4bit x 1ch + 2bit x 1ch
6bit x 1chにすると、6bit幅の出力をリアルタイムに行うことができます。このとき6つポートを占有してしまいます。リアルタイム出力はポート5と兼用になっています。RTP0~RTP5がポートの名前です。4bit出力は下位のRTP3~RTP0、2bit出力は上位のRTP5~RTP4です。ポート機能の切り替えは正しく行わなければいません。1bitだとかそういうのは駄目みたいです。
ピン配置は次のようになっています。
リアルタイム出力は、単体では機能しなくて必ずタイマー割り込みとセットで使わなければいません。タイマー割り込みは例えばインターバルタイマーTMP4のINTTP4CC0とかになります。どのタイマーを使用できるかはある程度制限があって自由に選べるわけではないようです。
タイマー割り込みとインターバルタイマーを使ったLEDチカチカを作ってみます。2つのLEDを交互に点滅させます。P50(CON2の10pin)にLEDのAを接続してLEDのKを1kΩくらいの抵抗を介してGNDにつなぎます。P51(CON2の12pin)にも同じようにLEDを接続します。あいかわらずブレッドボードです。本当はオシロとかの波形を見るのがいいのでしょうね。
appliletで雛形を作ります。
- システムはウォッチドッグタイマー2を使用しない、オンチップディバグを使用する。
- タイマーはタイマーP4をインターバルタイマーにして、詳細ボタンで、設定単位をms、TMP4とCCR0の一致で割り込み発生を選びます。インターバル時間を変えることで点滅速度を変更できます。
- リアルタイム出力は6ビットx1チャネルを選びます。
メインはこんな感じです。初期設定して後は無限ループです。
タイマー割り込みはTIMER_user.cに作られています。
割り込み処理では、既に値が出力されているので、次に出力する予定の値をセットしておきます。
このリアルタイム出力は他のマイコンにないV850独自の機能だと思います(知らないだけかもしれませんが^^)。
リアルタイム出力を使わないやり方だと割り込みが発生してからソフトで何か出力するわけですが、割り込み処理が実行されるのは、割り込み要因が発生した時に実行している命令が終了してからなので、その命令の実行クロック数によっては微妙にタイミングがずれます(ジッタといいます)。リアルタイム出力では、割り込み要因が発生した瞬間に出力してしまうのでジッタが生じないことになります。精密なハードウェアの制御が必要なときに使えそうな機能です。ユーザーズ・マニュアルの12章に説明が載っています。ユーザーズ・マニュアルではステッピングモーターの制御に最適と書かれています。
リアルタイム出力自体は4通りの出力形態を選べます。
(1) 6bit x 1ch
(2) 4bit x 1ch
(3) 2bit x 1ch
(4) 4bit x 1ch + 2bit x 1ch
6bit x 1chにすると、6bit幅の出力をリアルタイムに行うことができます。このとき6つポートを占有してしまいます。リアルタイム出力はポート5と兼用になっています。RTP0~RTP5がポートの名前です。4bit出力は下位のRTP3~RTP0、2bit出力は上位のRTP5~RTP4です。ポート機能の切り替えは正しく行わなければいません。1bitだとかそういうのは駄目みたいです。
ピン配置は次のようになっています。
P50/RTP00 CON2 10pin P51/RTP01 CON2 12pin P52/RTP02 CON3 4pin P53/RTP03 CON3 5pin P54/RTP04 CON3 2pin P55/RTP05 CON3 3pin
リアルタイム出力は、単体では機能しなくて必ずタイマー割り込みとセットで使わなければいません。タイマー割り込みは例えばインターバルタイマーTMP4のINTTP4CC0とかになります。どのタイマーを使用できるかはある程度制限があって自由に選べるわけではないようです。
タイマー割り込みとインターバルタイマーを使ったLEDチカチカを作ってみます。2つのLEDを交互に点滅させます。P50(CON2の10pin)にLEDのAを接続してLEDのKを1kΩくらいの抵抗を介してGNDにつなぎます。P51(CON2の12pin)にも同じようにLEDを接続します。あいかわらずブレッドボードです。本当はオシロとかの波形を見るのがいいのでしょうね。
appliletで雛形を作ります。
- システムはウォッチドッグタイマー2を使用しない、オンチップディバグを使用する。
- タイマーはタイマーP4をインターバルタイマーにして、詳細ボタンで、設定単位をms、TMP4とCCR0の一致で割り込み発生を選びます。インターバル時間を変えることで点滅速度を変更できます。
- リアルタイム出力は6ビットx1チャネルを選びます。
メインはこんな感じです。初期設定して後は無限ループです。
unsigned char val = 0x15; void main( void ) { RTO0_Output(val); // 出力予定の初期値 RTO0_Enable(); // リアルタイム出力許可 TMP4_Start(); // タイマー4開始 while(1) __halt(); // 無限ループ }
タイマー割り込みはTIMER_user.cに作られています。
__interrupt void MD_INTTP4CC0( void ) { extern unsigned char val; val ^= 0x3f; // 反転 RTO0_Output(val); // 次に出す予定の値を設定 }
割り込み処理では、既に値が出力されているので、次に出力する予定の値をセットしておきます。
このリアルタイム出力は他のマイコンにないV850独自の機能だと思います(知らないだけかもしれませんが^^)。
※コメント投稿者のブログIDはブログ作成者のみに通知されます