今日は「ハードウェア制御ソフトのノウハウ」講座のARM ボードを使った演習でした。
IDE(統合開発環境)はIARのでした。この辺はどこも似ているので何とか使えました。
しかし、ARM Cortex-M3はまだいじったことが無かったので、解答例を見ながら
レジスタの設定とかやってみました。
こうなってくると、ARMと言えども他のマイコンと大して変わらず煩雑な感じです。
1問目はタイマ割り込みを使って、D/Aコンバータから色々な波形を出力するファンクションジェネレータの演習です。
一応、課題の矩形波、三角波、鋸波、正弦波とも全部出来ました。
私は課題の仕様通り、どの波形の周期も同じになるように実装しましたが、
解答例をみると波形ごとにバラバラになっていました。こんなんで良いのかな?
2問目は割り込みの処理の遅延時間の測定。
3問目は割り込みの優先度をLEDの点灯時間で見るというもの。
4問目はDMA機能の確認。
5問目はポーリングの処理の遅延時間の測定。
一応、やってみるものの、だんだんつまらなくなってきました。
もうちょっと楽しめる物を題材にしてもらったら、元気が出るかも。
と言うわけで、データシートを見ていたら、PWMの出力がちょっと気になりました。
それは、コンペアレジスタを使って周期とパルス幅を出力する構成になっていたからです。
同じようにコンペアマッチで出力するルネサスの場合、コンペア値を変化させると
タイミングによって1パルス抜けると言うクセがあるからです。
これを回避するためにはダブルバッファにする必要があります。
H8はその機能がありますが、コンペアが3値から1値に減ってしまうのです。
それで、ARM Cortex-M3 のデータシートを詳しく見ると
コンペアレジスタにはプリロードとシャドウの2つのレジスタが有ることが分かりました。
さすがですね。初めからダブルバッファになっているじゃありませんか。
IDE(統合開発環境)はIARのでした。この辺はどこも似ているので何とか使えました。
しかし、ARM Cortex-M3はまだいじったことが無かったので、解答例を見ながら
レジスタの設定とかやってみました。
こうなってくると、ARMと言えども他のマイコンと大して変わらず煩雑な感じです。
1問目はタイマ割り込みを使って、D/Aコンバータから色々な波形を出力するファンクションジェネレータの演習です。
一応、課題の矩形波、三角波、鋸波、正弦波とも全部出来ました。
私は課題の仕様通り、どの波形の周期も同じになるように実装しましたが、
解答例をみると波形ごとにバラバラになっていました。こんなんで良いのかな?
2問目は割り込みの処理の遅延時間の測定。
3問目は割り込みの優先度をLEDの点灯時間で見るというもの。
4問目はDMA機能の確認。
5問目はポーリングの処理の遅延時間の測定。
一応、やってみるものの、だんだんつまらなくなってきました。
もうちょっと楽しめる物を題材にしてもらったら、元気が出るかも。
と言うわけで、データシートを見ていたら、PWMの出力がちょっと気になりました。
それは、コンペアレジスタを使って周期とパルス幅を出力する構成になっていたからです。
同じようにコンペアマッチで出力するルネサスの場合、コンペア値を変化させると
タイミングによって1パルス抜けると言うクセがあるからです。
これを回避するためにはダブルバッファにする必要があります。
H8はその機能がありますが、コンペアが3値から1値に減ってしまうのです。
それで、ARM Cortex-M3 のデータシートを詳しく見ると
コンペアレジスタにはプリロードとシャドウの2つのレジスタが有ることが分かりました。
さすがですね。初めからダブルバッファになっているじゃありませんか。
Cortexのデータシートつらつら見てたら、ARM7 TDMI? より改善されたとか何とかあった様に思いますが。
多重割込みもどーのこーのと。
正弦波出力は、やはり1/4周期分のテーブル持っておくんでしょうか。発生周波数にもよりますが、ARMやったら多項式で都度演算しても間に合う様な気もしますが。
速いかどうかは分かりません。
正弦波のテーブルは普通1/4周期ですよね。
ところが、ご丁寧に0.1度刻みで3600個のテーブルでした。
リソースが少ない云々と説明しておきながらこれではお手本にもなりません。せめて2のn乗だったら良かったのですが。
はい、DUal buffer EdiTor の略のつもりでした。強引でした。
今思えば、コピペのハシリでしたね。