2009年の終わり頃にArduinoを始めたので、たぶん2010年だったと思うけど、
LEDのダイナミック点灯をするために、Arduinoのホームページにある
MsTimer2と言うライブラリを使っていました。
Charlieplexingを知ったのもこの頃で、
販売されていたLoL Shield もCharlieplexingを使っていることが分かりました。
そこで、LoL Shield を買って作ってみて、ライブラリの参考にしようと思って
ライブラリのソースを見てみたら、MsTimer2ライブラリのデッドコピーでした。
さらに、詳しくソースを読んでいくと、
Timer2に1msの値をセットして、タイマー割り込みが掛かると
なんと、再度1msの値をソフトでセットしていました。
ソフトでセットすると、その分が誤差になり、それが累積していきます。
こういう場合、普通のマイコンでは誤差の累積を防ぐために、
ハードウェアで自動的にタイマに再セットされるモードを使います。
AVRには、それが無いのかと思ってデータシートを読んだら、
CTCモードと言ってハードウェアで再セットするモードがTimer2にもありました。
では、なぜMsTimer2はCTCモードを使わないのだろうと思っていたところ、
CTCモードを使っていると詳しく説明しているサイトがありました。
それは違う、MsTimer2はCTCモード使ってないよと指摘したら、
どうやら、CTCモードを当然使っているはずだと思って書いていたらしい。
そしたら、その人はCTCモードを使うようにMsTimer2を書き換えて作者にメールしてくれました。
しかし、2年経った今もまだ放置されたままです。 orz
CTCモードが理解できないのか、修正するのがめんどくさいのか分かりませんが、
Arduinoのライブラリやスケッチの中には、結構酷いものが混じっています。
ちなみに、私の「ちっちゃいーの」や「ikkeiplexing shield」のライブラリに
含まれているMsTimer2はCTCモードに書き直された方を使っています。
でも、Charlieplexingのライブラリの中身は、まだC++のクラスになっていません。
なんとかしたいと思っているんですが..... (^_^;
LEDのダイナミック点灯をするために、Arduinoのホームページにある
MsTimer2と言うライブラリを使っていました。
Charlieplexingを知ったのもこの頃で、
販売されていたLoL Shield もCharlieplexingを使っていることが分かりました。
そこで、LoL Shield を買って作ってみて、ライブラリの参考にしようと思って
ライブラリのソースを見てみたら、MsTimer2ライブラリのデッドコピーでした。
さらに、詳しくソースを読んでいくと、
Timer2に1msの値をセットして、タイマー割り込みが掛かると
なんと、再度1msの値をソフトでセットしていました。
ソフトでセットすると、その分が誤差になり、それが累積していきます。
こういう場合、普通のマイコンでは誤差の累積を防ぐために、
ハードウェアで自動的にタイマに再セットされるモードを使います。
AVRには、それが無いのかと思ってデータシートを読んだら、
CTCモードと言ってハードウェアで再セットするモードがTimer2にもありました。
では、なぜMsTimer2はCTCモードを使わないのだろうと思っていたところ、
CTCモードを使っていると詳しく説明しているサイトがありました。
それは違う、MsTimer2はCTCモード使ってないよと指摘したら、
どうやら、CTCモードを当然使っているはずだと思って書いていたらしい。
そしたら、その人はCTCモードを使うようにMsTimer2を書き換えて作者にメールしてくれました。
しかし、2年経った今もまだ放置されたままです。 orz
CTCモードが理解できないのか、修正するのがめんどくさいのか分かりませんが、
Arduinoのライブラリやスケッチの中には、結構酷いものが混じっています。
ちなみに、私の「ちっちゃいーの」や「ikkeiplexing shield」のライブラリに
含まれているMsTimer2はCTCモードに書き直された方を使っています。
でも、Charlieplexingのライブラリの中身は、まだC++のクラスになっていません。
なんとかしたいと思っているんですが..... (^_^;