「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



MsTimer2の作者さんに、なれない英語でメールを
書いてたんだけど、送信ボタン押した途端にメールが
行方不明になった… 有り得ねー!!

オイラ英語苦手なのに、がんばって英語で真剣に
説明を書いたのに…

webメールだから、ブラウザの戻るボタンで復活
しないかなぁ?と思ったんだけど、だめだった…
(TへT)


もうアレだな。某社のサービスとは縁を切ろう…。
サービスレベルも品質も低いのに、いつまで経っても
改善されないからな… フィルター機能とか、もう
最低レベルじゃないかと。

すごくがっかりしちゃったので、また明日やり直し
しよう…。

それにしても。
http://help.yahoo.co.jp/help/jp/mail/anti-spam/anti-spam-40.html
やっぱこれかな。無料で使えるし。



コメント ( 0 )




懸案のMsTimer2をCTC使ってモディファイするという
お話。とりあえずCTCを使ったものに書き換えてみました。

mstimer2_updated.zip
(zipファイル中に、ccpファイルとhファイルを封入)

色々弄っているので、もしかしたらバグが残っている
可能性がありますが、とりあえず現時点で確認できた
ことを以下にまとめて起きます。

・mega168搭載ボード(reduino-nano)を使って、
 サンプル(LEDを0.5秒毎に点滅するスケッチ)
 を4分間動かしてみたところ、腕時計とぴったり
 一致したことを確認
・mega8搭載ボード(NG)用にコンパイルを行い、
 エラーが出ないことを確認

16Mhz÷(64クロック×250カウント)=1ミリ秒
なので、とりあえず4分(=240秒)ほど回してみれば、
250カウントがきちんと数えられているかどうかが
確認できるはずだろう、と。
(カウント数がずれていれば4分で1秒程度の誤差が
 生じるはず)

というわけで、こんなスケッチを以って作者の方に
メールを送って確認していただこうかと思ってます。

バグなどお気づきの方はとりあえず私宛までお知らせ
いただけるとありがたく、よろしくお願いいたします。




コメント ( 0 )




http://headlines.yahoo.co.jp/hl?a=20101117-00000908-yom-sci

日本の地球シミュレータがFFTの計算でスパコンの
ナンバーワンに返り咲き…とのこと。

単にFLOPS値争いってことではなく、FFTの
ような複雑な(実利的な?)計算で返り咲きって
言うのはなかなか…。

FLOPS値で54位のコンピュータでもFFTなら
1位っていうのは、処理ロジックの勝利なのかな?

まぁ、この件もそうだし、はやぶさの件もそうだし、
なにやらおめでたい…。



コメント ( 0 )




(続きです)

MsTimer2を使ったスケッチのアセンブリ言語展開リスト
を眺めないと正確なことは言えないんですが、多分
レジスタ類の退避(push処理)と、割り込みベクタの
ジャンプ処理などモロモロ合わせると64クロック以内
にTCNT2がクリアされている可能性は低いと思います。
(少なくとも将来にわたってあらゆる使い方には無担保)

一方、タイマー2関係のレジスタは、TCNT2も含めると
破壊されています。破壊されるということは、コアの
標準機能含めあらゆるタイマー2関係の処理とは
排他的に利用されることになります。

まぁ、ソースコード上は入出力ピン関係のレジスタ・
ビットを変化させてないのでアナログ出力(PWM)
を使用中にMsTimer2を使い始めた場合もPWM出力は
引き続き動作するコードになっているみたいですが、
動作中にTCNT2の値を弄り回しているので、PWMのピン
に出力される波形は期待とは異なるものになる
はずです。


さて、まぁ大体予想したとおりといえば予想したとおり
ですが、これらを踏まえてMsTimer2をどのように変更
すればいいか?
ikkeiさんやarms22さんからのご指摘を踏まえると
以下のようになるのかなぁ?と。


タイマー0を使ったmillis() 関数のように誤差を途中
途中で補正すればよいのか?(誤差が累積した際に2連発
で指定関数の呼び出しを行うなど)
  →多分ノーでしょう。

これだと、一定の時間間隔ごとに処理をしたいっていう
場合に、途中途中で意図しない極小間隔で処理を連発
されてしまう恐れがあるため。
たとえばステッピングモーターをドライブすることを
想像すると、ほぼ一瞬で2ステップ分進むことになり、
モーターが追従できなくなる(→誤動作の元)

また、既存のタイマー2関係の処理とは完全に切り離した
世界で動かす前提になっているので、MsTimer2単体だけの
ことを考えてモディファイしても他機能に影響は無い。

加えて、タイマー2はmega48系のチップだけでなく、
mega8、mega128でもCTCモードで動作することが可能。
(c.f.mega8のタイマー0はCTCが使えない)
つまり、機種依存性は無い。


というわけで、やはりikkeiさんのおっしゃるように
CTCモードを使用する様に修正してしまうのがよさそう
です。

私がざーーーーっと調べてみたところではそんな感じ
なのですが、間違えがありましたらご指摘いただければ
ありがたく…。


まぁ、あとは実際にMsTimer2ライブラリをモディファイ
してみてから、作者の方にそれで問題ないか聞いてみる
って作業があるんだな。まぁ、できるだけ早めに…。



コメント ( 0 )




まじめにコードを追ってみる事に。arduinoの
MsTimer2の件。

まずはarduinoコアの元々のタイマー関係処理について
どうなっているのかを整理。コードを追ってみた結果
はこんな感じです。


[TIMER0関係の処理]

・初期化処理にて、高速PWMに設定(ここ注意)
・オーバーフロー割り込み処理は1024us(16Mhz時)もしくは
 2048us(8Mhz時)ごとに1回発生に設定
・オーバーフロー割り込みをオン
とした上で、

16MHZの場合
・割り込み発生ごとに「ミリ秒」を1カウントアップ…(a)
・併せて、24usの誤差を蓄積
・誤差がミリ秒単位に達している場合、(a)に加えて
 1カウントアップ

 →1ミリ秒より少し長い時間ごとに「ミリ秒」がカウント
  アップされていくが、蓄積誤差が1ミリ秒に達した時
  にはいっぺんに2ミリ秒カウントされる
  (およそ41~42回のオーバーフロー割り込みごとに
   2ミリ秒カウントされるケースが発生する)

8MHZの場合
・オーバーフロー割り込み処理自体は2048usごとに1回発生
・割り込み発生ごとに「ミリ秒」を2カウントアップ…(b)
・併せて48usの誤差を蓄積
・誤差がミリ秒単位に達している場合、(b)に加えて
 1カウントアップ

 →2ミリ秒より少し長い時間ごとに「ミリ秒」がカウント
  アップされていくが、蓄積誤差が1ミリ秒に達したとき
  はいっぺんに3ミリ秒カウントされる
  (およそ20~21回のオーバーフロー割り込み毎に3ミリ秒
   カウントされるケースが発生する)

16MHZ、8MHZどちらも、長時間に渡って誤差は1クロック
単位で累積しないまた、PWM(アナログ出力)とタイマー
割り込みが両立する様に設定されている


[TIMER1関係の処理]

・位相補償PWMを使用(ここ注意)
・割り込みは使用しない
・プリスケーラ値64でフリーラン
・入出力ピンはノーマル動作状態(PWMの出力が未接続)

(注)TCCRxAの値はイニシャル値=0のため、初期化の
   直後は入出力ピンにはPWMの出力が取り出されて
   おらず、普通のデジタルI/Oになっている


ということで、タイマー0についてはアナログ出力用の
設定を行いつつミリ秒ごとに経過時間を計測している
けど、瞬間的には最大で1ミリ秒(8Mhz機の場合2ミリ秒)
ほどの誤差が生じている可能性がある…ということに
なります。ただ、誤差は蓄積していかず、こまめに補正
されています。

仮にタイマー0のミリ秒計測…millis() 関数…を使って
時計を作るとしたら、理論上は1ミリ秒の誤差が瞬間的
に生じるけど、蓄積誤差は水晶発振の1クロック単位で
ゼロということになります。

なお、タイマー2も初期化時にPWM(アナログ出力)の設定を
行いつつ、I/Oは通常のデジタルI/Oのままとなっています。


さてこれらを踏まえ、MsTimer2ライブラリを取り込むと
どういうことになるのか…

[MsTimer2の処理]

・プリスケーラは16Mhz時8Mhz時とも64に設定(変化無し)
・位相補償PWMに設定(変化無し)

としてから、MsTimer2::start() にて

・オーバーフロー割り込みを許可
・割り込の都度TCNT2をプログラム上でクリア(※要注意)
・指定したミリ秒経ったか判断して、経過していれば
 指定の関数を呼び出し

という感じです。オーバーフロー割り込みが発生してから
TCNT2のクリア処理を行うまでに64クロック以上経過
している場合、やはり遅延を生じることとなり、この
遅延は時間経過にしたがって蓄積していきます。

(長くなってきたので次の記事に続きます)

(追記:MsTimer2は位相補償PWMじゃなくて、ノーマル
 タイマーですね…訂正してお詫びします)



コメント ( 0 )



« 前ページ 次ページ »