PCでmsec時間測定(3) - 割り込み

blog20100626-msecTimerOpFlow

前回LinkAtmelのUSB-シリアルポート変換サンプルプログラムLink の動作を確認したので、これをベースに改造していくことに(だって一から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氏Link の記事を参考にしながら割り込み処理を追加。

blog20100626-AVRCDCandTimer_TerminalOutput

今回変更したのはcdc_task.cのみ。変更内容は
  • RXD-TXD接続なしにプログラム内でループバック。
  • 1秒に1回USB側にピリオドを送信
結果がTeratermの画面。1秒に1個ピリオドが表示されつつ、PCからの入力に対してオウム返しします。この1秒間隔内で、axion/sakura/ne/jpとキーを叩けば、このサイトのアドレスが画面に表示されることになるのですが、キータイプが遅くてなかなかsakuraが入力できませんでしたorz

[参考]AVR でタイマー割り込み (Sim's blog 2008/9/20)Link

[2010/7/2 追記] つづきLink

[2010/10/12 追記] この記事に貼りつけてあるcdc_task.cを使用したHEXファイルをアップロード。TXD-RXDの短絡不要でPCから打ち込んだ文字をそのまま返します。また1秒に1回PC側に'.'(ピリオド)を送信します。

— posted by mu at 10:51 pm   commentComment [0]  pingTrackBack [0]

PCでmsec時間測定(2) - AT90USB162購入

blog20100624-AT80usb162

前回Link の内容で提案してみたところ、AVRでゴーサイン(というか、できるやつでやってて感じw)出たので、ストロベリーリナックスLink のボードを購入。

この手のワンチップマイコンはPIC&アセンブラしかやったことないので、まずは開発環境の使い方を知る意味で手堅くサンプルプログラムのCDC(USBシリアルポート)を動かしてみることに。

  • AVR Studio 4.18LinkFLIP 3.4.1LinkWinAVR-20100110Link をダウンロード、インストール。
  • AT80USB162が分類されるSeries 2 software packageLink からAVR272: USB CDC Demonstration: UART to USB BridgeLink をダウンロード、ZIPファイルの中からSTK526-series2-cdc-2_0_3-doc.zipを適当なところに展開。
  • AVR Studio 4を立ち上げ、(展開したディレクトリ)¥STK526-series2-cdc-2_0_3¥demo¥STK526-series2-cdc¥gcc内にあるapsファイルを開く。
  • (展開したディレクトリ)¥STK526-series2-cdc-2_0_3¥demo¥STK526-series2-cdc¥conf¥config.hを開き、#define FOSC 8000を16000に変更。
ここまではすん氏Link のサイトに書いてあったことに従っただけ。ここでコンパイルすると、
../main.c:107: error: expected expression before 'do'
../main.c: In function '__low_level_init':
../main.c:126: error: expected expression before 'do'
なるエラーが出て二日悩む。答えはSTK526-series2-cdc-2_0_3¥lib_mcu¥power_drv.hの以下の部分を以下のように()を削除。
#ifdef  __GNUC__
   #define Clear_prescaler()   (clock_prescale_set(0))
    ↓
   #define Clear_prescaler()    clock_prescale_set(0)
関数clock_prescale_setがWinAVR側のヘッダファイルでマクロとして定義されているのですが、これがカッコ内で展開されると文法エラーになるため。たぶんここLink に書いてあるinline関数を使っても解決できると思います。

すん氏のサイトを参考に、gccディレクトリにできたSTK526-series2-cdc.hexファイルをFLIP 4を使って書き込み。一度抜いて差し込むと新規デバイスとして認識するので、STK526-serise2-cdc-2_0_3-doc¥demo¥sTK526-series2-cdcディレクトリにあるINIファイルを指定してドライバをインストール。無事XP/Vista上で仮想COMポートとして認識される。

ところがループバック(入力をオウム返しする)はずなのにターミナルソフトで通信しても何の反応もないことにまた二日悩み、ある勘違いに気づく。このプログラム、USB側に対してオウム返しするデバイスになるんじゃなくって、USBと本当のCOMポートの変換しているのね。

AT80USB162の端子でCOMポートの役割を担っているのが、PD2(RXD)・PD3(TXD)・PD5(XCK)・PD6(RTS)の4つ。これを9ピンD-Subに接続すれば本当にUSB-COMポート変換機。ループバックさせるにはRXDとTXDを接続して、自分が発した信号を自分で受け取るようにしないといけないわけか。同期信号は自分で自分の出した信号受けるから不要(自然と同期されている)と。すん氏のページよく読んだら両方を接続しろと書いてあるぢゃないかorz

写真のようにPD2とPD3を短絡して再度ターミナルソフトで入力すると無事オウム返しするのを確認。またcdc_task.cを
uart_putchar(uart_usb_getchar());   // loop back USB to USART
↓
uart_putchar(uart_usb_getchar()+1);   // loop back USB to USART
と変更して、入力文字がアルファベット順で一文字ずれる(HALとタイプするとIBMと返ってくる)のも確認。よし、これでPCと通信ができるようになりましたと。

[参考]

[2010/6/26 追記] 続きLink

[2010/10/12 追記] 16MHz用機能変更なしのHEXファイルをアップロード。USB側に接続したPCがデータを受け取るにはRXDとTXDを接続する必要があります。

添付ファイル: STK526-series2-cdc_default_16MHz.hex 

— posted by mu at 10:38 pm   commentComment [11]  pingTrackBack [0]

 

開発段階でエラーを隠すなぁ

前々から思っていたことですが、たまたま以下の記事を見つけたのでこの際書くことに。

[.NET] Re: 例外について (biac の それさえもおそらくは幸せな日々@nifty 2009/8/10)Link

これ、全面的に同意。今やってる仕事である人がやった部分には以下のようなのが至る所に。
public bool f1(MyEnum anEnum)
{
  try
  {
    if(anEnum == MyEnum.Item1) return true else return false;
  }
  catch(Exception)
  {
    /* なにもないよ~ */
  }

  return false;
}
関数1行目がtry。勘弁してよ関数全部例外無視ってorz if文で値比較するだけのどこに例外が出ること恐れてるのよ、むしろ出たときの方が知りたいぞ。

別の先輩の話。Visual BasicにはOption ExplicitLink という機能がありまして、これを指定すると全変数をあらかじめ宣言しないとコンパイル時にエラーを出すというもの。一見面倒くさくなるだけの機能に思えますが、変数名の打ち間違えを未然に防いでくれるLink ので、この辺で悩んだ事のある人には便利な機能のはず。Visual Studioでは新しいVBファイルを作るたびに自動的にこの行を入れてくれる設定があります。ところが彼は「Option Explicitを削除するとコンパイル時のエラーが減るんですよ」と、耳寄り情報のように教えてくれたそうで。

製品としてリリースした後ならともかく、開発時やら説明すれば理解してくれる限定ユーザー向けならば、エラーは恐れずどんどん表示してください。放置すると後で分けの分からない現象に悩んだり、たまたま動いているプログラムで満足しているといいプログラマーにはなれないと思います。お願いします、本当に… (直すこっちが迷惑だorz)

[2010/8/31 追記] 前者「関数1行目がtry」な方が書いたコードを久しぶりに見直したら、以下の部分が orz 意味が無いにも程がある。関数の書き始めはtryが癖になっているらしい。
public void foo()
{
  try
  {
    処理
  }
  catch (Exception e)
  {
    throw e;
  }
}

— posted by mu at 02:44 pm   commentComment [0]  pingTrackBack [0]

Windows server一般ユーザーでタスクスケジューラ

備忘録。

Windows Server 2003やWindows Home Serverで一般ユーザーはタスクスケジューラの使用が制限されてます。使えるようにするには、
%SYSTEMROOT%¥Tasksディレクトリにアクセス権限を与える
通常アクセス権限はエクスプローラからアイコンを右クリック→プロパティでセキュリティタブから行えるのですが、このディレクトリはプロパティを開いてもセキュリティタブがありません。コマンドラインから
CACLS %SYSTEMROOT%¥Tasks /E /G ユーザー名:C
  
これでアクセサリ→システムツール→タスクを開くことができます。
at.exe/schtasks.exeに読み取り・実行権限を与える
これらのコマンドを使用する場合。これらのコマンドは通常%SYSTEMROOT%¥system32ディレクトリにあります。こちらはエクスプローラから右クリック→プロパティ→セキュリティタブで設定可能。

一般ユーザーにはコマンドにも権限を与えないとは、さすがはサーバOSと思ったり。

[参考]

[2010/6/25 追記] Windows Home Server再起動後、タスクスケジューラのサービスがアクセス拒否のエラーを表示して起動せず。要調査。

[2010/6/26 追記] 25日の原因は/Eオプションを忘れて実行しちゃったため、既存のシステムユーザーIDのアクセス権を削除してしまってた。

[2020/3/2 追記] Windows Server 2016ではat.exe/schtasks.exeは一般ユーザーにも実行権限が与えられているようです。代わりに管理者でも権限変更不能でしたが。

— posted by mu at 11:45 pm   commentComment [0]  pingTrackBack [0]

 

N’EXのアナウンス

首都圏には羽田空港と成田空港があります。正式名称はそれぞれ東京国際空港と新東京国際空港なのですが、あまりこちらで呼ぶ人は少ないようで。今回は成田空港の話。JR東日本では成田空港往来専用特急「成田エクスプレス」、通称N'EX (Narita EXpress)を提供しています。NをHやSやTで始まる地名に置き換えるというのをついやりたくなるのは、今回のネタではありませんw

成田空港ではN'EXが停車する駅が「空港第2ビル」と「成田空港」の2つあり、航空会社によって降りる駅が違います。大きなところではJALが空港第2ビル駅下車で、ANAは成田空港駅。降りる駅を間違えても無料シャトルバスで反対側に行けるのですが、慣れてない人は目的の航空会社のカウンターが見つからないなどパニックになりかねません。

そのためN'EXでは空港に近づくとアナウンスが流れます。私は早朝に乗ることが多いのでまともに聞くことなく寝ていることが多いのですが、概ねの内容は
  • 利用する航空会社で降車駅が異なります
  • 第2ターミナルを利用する場合は空港第2ビル駅で降車
  • 第1ターミナルを利用する場合はこのまま乗車し、次の成田空港駅で降車
だったかと。続いて英語のアナウンスが流れるのですが、会社のアメリカ人によると以下のことを言っているらしい。
Passengers getting off at Narita Airport Terminal 2 should get off at Narita Airport Terminal 2 and those going onto Narita Airport stay on the train and get off at Narita Airport.
空港第2ターミナルで降りる予定の乗客は空港第2ターミナル駅で、成田空港に行く予定の乗客はこのまま車内にとどまり成田空港駅で降車してください
そのアメリカ人に言わせると、当たり前のことでアナウンスする意味がないだろうと。うん、東京駅で降りたい人は東京駅で降りてくださいと言っているようなもんだね。私も常々「それよりも自分はどちらで降りればいいのかを教えてよ」と思っていたりします(一応各車両室内の前後に航空会社別降車駅の張り紙はあります)。また第1だろうと第2だろうと成田空港なわけでして、成田空港駅という駅名変えたほうがいいんじゃないかなぁ。

てなわけで考えられた末の文章かもしれませんが、奇妙に思う外国人はいるようです >JR東日本様

— posted by mu at 12:19 pm   commentComment [0]  pingTrackBack [0]

T: Y: ALL: Online:
ThemeSwitch
  • Basic
Created in 0.0159 sec.
prev
2010.6
next
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30