前回 はAtmelのUSB-シリアルポート変換サンプルプログラム の動作を確認したので、これをベースに改造していくことに(だって一からUSBの送受信する部分書きたくないもん)。
現在考えている構成は図の通り。- 右のループはこの手のワンチップマイコンには高確率で搭載されているCPUクロックによる割り込みを利用。1k-10kHz位で割り込みをかけ、その度に内部のカウンタを+1。次に外部に接続されるボタンのOn/Offをチェック、変化があれば左ループに通知する。幸いにもシリコンリナックスのボードはUSB通信する必要があるからか、CPUクロックに水晶発振器を使用しているので精度は期待できそう。できればチャタリング処理もこのループでやりたい。
- 右のループは主にPCとのやり取り。USB経由でPCからの命令を受信し設定変更。またボタンのOn/Offに変化があればそのときのカウンタ値をUSB側に送る。AT80USB162に負荷をかけたくないので、カウンタは右ループで増加するのみ。受信したPC側が前回のOn/Off変化のカウンタ値を記録しておいて、そのカウンタ値の差からOn/Off感覚を計算する。
前回は左側のループで必要なUSB経由でPCとのデータ送受信が確認できたので、今回は右側ループに必要となるUSB通信を維持したまま定期的な割り込み処理ができるかの確認。なのですが、これ、前回にソースコードを読んでいる途中でRXDでデータを受信したときに割り込み処理が使われいるのを見たので、できるだろうなとは分かっていたりします。
とりあえず、今後COMポート側の機能は不要だし変な割り込みかけられても困るので削除。Sim氏 の記事を参考にしながら割り込み処理を追加。
- RXD-TXD接続なしにプログラム内でループバック。
- 1秒に1回USB側にピリオドを送信
[参考]AVR でタイマー割り込み (Sim's blog 2008/9/20)
[2010/7/2 追記] つづき
[2010/10/12 追記] この記事に貼りつけてあるcdc_task.cを使用したHEXファイルをアップロード。TXD-RXDの短絡不要でPCから打ち込んだ文字をそのまま返します。また1秒に1回PC側に'.'(ピリオド)を送信します。
Comments