久々に、DigiSparkを持ち出して、すこしだけLED
ホワンホワンでロウソクの1歩を進めてみる。
コアがTINY85なので、MEGA328系列のAVRではないから、
タイマ割り込み関係のライブラリが全然流用できない。
ってことで、なにかタイマ割り込み関係でいい情報が
ないかな、と漁る。
http://hello-world.blog.so-net.ne.jp/2016-10-22
こちらに色々タイマ関係の情報と、レジスタ周りの情報
がまとまってる。ただ、ディレイ用の処理に使っている
ので、割り込み関係のISRとかは弄ってないみたい。
重要な情報としては、
>Digisparkでは、やんごとなき理由でミリ秒のカウント用
>にタイマー1を使っているそうです。
>タイマー0を使うか、タイマー1の割り込みを殺すかになり
>ます。
って部分。普通のArduinoは、タイマ0がdelayとかmillis
とかの処理に使われてたと思うんだけど、多分その辺が
タイマ1で実装されてるんだろうな。
というわけで、タイマ0で割り込みかけるような情報を漁って
みる。
https://www.olimex.com/forum/index.php?topic=3333.0
Olimexino85っていう、DigiSparkとはちょっと違うボード
用のコードみたいなんだけど、中身は多分AVR-GCCだから、
きっと動くだろうと思って、そのままArduino-IDEで
コンパイル掛けてみる。
通った。文法的には大丈夫っぽい。なので、ゴニョゴニョ
とチューニング施しながら、一定周期で割り込み発生
させるような感じに直していく。
本当なら、やっぱArduinoのタイマ関係ライブラリみたい
に、「関数の名前(関数の入り口)」と「割り込み周期」
を初期化処理で渡しちゃえば、あとはライブラリに全部
お任せ、って感じのものがいいんだろうけど、そういう
汎用性高い処理にするのはなかなかめんどいし、なにより
直近のゴールはロウソクなので、あまり遠回りしない
ことにする。
で、悪戦苦闘しながら色々弄繰り回して、およそ1秒
ごとにLEDをチカチカするという、世に言うLチカを
なんとか作った。こんなスケッチ。
(例によってこのブログの制約で、不等号記号は
全角文字に直してあるので、使うのであれば半角に
変換してから使ってください)
#include <avr/io.h>
#include <avr/interrupt.h>
int ledPin1 = 1;
int ledPin2 = 0;
boolean s = false;
volatile int i;
ISR(TIM0_COMPA_vect) {
// 16.5 Mhz / (256*256) = 251.77 Hz
i++;
}
void setup()
{
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
cli();
//initialize the timer0
TCCR0A = (1<<WGM01); // Put timer0 in CTC mode and clear other bits
TCCR0B = (1<<CS02) ; // Timer0 prescaling 256 and clearing other bits
TIMSK |= (1<<OCIE0A); // enable timer1 compare interrupt
//set the timer0 count
OCR0A = 255; // Count 255 cycles before calling ISR interrupt
PORTB |= (1<<PINB1); // Set PortB Pin1 high to turn on LED
//initialize global interrupts before beginning loop
sei();
digitalWrite(ledPin1, 0);
digitalWrite(ledPin2, 0);
}
void loop(){
cli();
if (i > 252) { // 16.5 MHz / (256*256) / 252 ~= 1 Hz
i = 0;
s = !s;
}
sei();
digitalWrite(ledPin1, s);
digitalWrite(ledPin2, s);
}
252で比較しているのは、
16,500,000MHz ÷ 256 ÷ 256 = 251.77001953125
だから。
256の片方は、タイマ0に設定してるプリスケーラで、
もう片方は、タイマ0のオーバーフロー割り込み(8ビット)
のため。
さいしょ、プリスケーラだけ気にしてて、165MHz÷256で
計算してて、全然上手く動かなくて、
なんだこれ。全然うごかねーじゃん!!
って怒ってたのは内緒。なんか、微妙に動いたり、
動かなかったりと、機嫌悪いスケッチだなと思って
いたんだけど、機嫌が悪いのはオイラだけだった。
で、こいつをDigiSparkに書き込むと、オンボードの
LEDが約1秒でチカチカするんだけど、そもそも内蔵RC
発振だし、小数以下切捨てなので、全然正確に1秒では
ないので注意。(誤差数パーセント)
というわけで、とりあえずLチカはできたんだけど、
欲しいのは1秒級のタイマ割り込みじゃなくて、この
最小単位くらいの割り込み周期。大体1/252秒くらい
だから、4ミリ秒周期くらいかな?これで十分かな。
あとは、PWM(analogWrite)と搗ち合ってなければ
いいんだけどな。
もしくは、DigiSpark内蔵のソフトPWMあたりでLEDの
制御が支障なければまぁよし。やりたいと思っている
ことは、一定周期でタイマ割り込みを掛けつつ、その
割り込み処理の中で、PWMのデューティー比を変化
させるっていう、そんなたいしたこと無い処理なんだ
けどな。
でも、「タイマ割り込み」「PWM」「アナログ入力」の
3つの機能がお互いに邪魔せずに動いてくれないと、
目論見がパーになっちゃうんだよな。
https://www.re-innovation.co.uk/docs/fast-pwm-on-attiny85/
うーーーん。なんか、ここを読んでいると、PWMを独自に
タイマ0使って微調整したりしてるんだけど、これって、
DigiSparkのPWMも、タイマ0使ってたりするのかな?干渉
しそうだな。あとでもうちょっと読み直そう。
普通に考えれば、タイマ割り込みとPWMを両立するように
レジスタを設定すればいいんだけどな。
https://twitter.com/9th_ninth/status/951461022904213506
ケッテンクラートのラジコン。ちっちゃくてとてもいい。
https://headlines.yahoo.co.jp/hl?a=20180112-00000078-mai-bus_all
ニンテンドーの勢い回復って、
https://twitter.com/zapa/status/951013938602233857
こっちの問題だったりするんじゃないの?
https://twitter.com/tyranusII/status/951525746542985217
おわん型モーションシミュレータ。
これいいな!! これいいな!! すごい欲しい!!!
これで、カーレースシミュレータとか、フライトシミュ
レータとかやりてー。
https://twitter.com/FakeYashu/status/951061685938274305
5歳の才能。すごいな。すごいクリーンだし。
https://ja.wikipedia.org/wiki/%E9%87%8E%E7%94%B0%E8%8B%B1%E6%A8%B9
野田英樹の娘さんもすごいけど、5歳だよ?
https://twitter.com/felis_silv/status/951025563501670408
いやいやいや。ベンツでもウニモグでもないよねぇ。
無駄遣いに、かっこよさとか、実用性とか、乗り心地
とか求めじゃ駄目でしょ。
やっぱ、ロータスエリーゼかスーパーセブンしか
ありえないよな。
https://twitter.com/felis_silv/status/951039584296579078
「投機的アップデート」
https://twitter.com/felis_silv/status/951328049915617286
しょぼいPCって、i5じゃないでしょ。
うちの現役で動いてるソケット775の2台のPCのこと
でしょう。
そういえば、なんか妙に遅くなった感じが無くも無い。
微妙に遅い時がある気がする。
Firefoxが妙に遅くなったり、酷いときはフリーズして
二度と帰ってこないときがある気がする。
これ、Firefoxのせいなのか、この爆弾のせいなのか…
https://twitter.com/newsupertikubi/status/950616044128804865
ペンギン詐欺。
https://twitter.com/Danger_Z/status/951265815885635584
マジで?鉄剣タローのこの自販機、確かオイラが前に
行ったときは、故障してたんだよな。しかも、直す
のが大変だからって貼紙貼ってあった気がしたけど。
直ったのか。というか、直す人が相模原に居たのか。
すごいな。
https://twitter.com/yoppymodel/status/951002544003678208
マクドナルドに怒られそう。
https://twitter.com/yumu19/status/951425094064095236
「1行直すだけってそんなに大変なの?」
大変だよ。っていうか、なんで1行だけ直せばいいって
判断しちゃったの?という…
https://ja.wikipedia.org/wiki/%E8%8C%B9%E3%81%A7%E3%82%AC%E3%82%A8%E3%83%AB
茹でガエルって、まさに今の日本なんじゃない?
といっても、茹でてるのはジーサンバーサンで、
茹でられているのが若い人たち。
そういえば、Windows7内蔵のIMEで、「データマイニング」
って変換したんだけど、これまでにも何度も何度も何度も
この言葉使ってきてるはずなのに、
「デー玉イニング」
とか、さらっと変換しやがった。
バーカバーカ。
学習機能がお馬鹿だから、無駄な学習しないように設定
して置いたんだけど、それでもなんか変な学習を勝手に
しちゃうらしい。もちろん、これだけじゃなくて、
あれこれアホな変換をしまくってくれる。その都度、
いちいち思考中断されちゃうんだよな。
もう一回言っちゃうよ。
バーカバーカ。(文字通り)
日本語変換エンジンで一番賢いのって、今まで使った中
では、Mozcなんだけど、Mozcでどうしても受け入れられ
ないのは、「F10」を押して半角ローマ字変換したい
時に、その選択の順番がいちいち前回のステートを
記憶しちゃってることなんだよな。
数分前とか数時間前とかに変換した結果なんて、記憶に
残って無いし、1回目で半角小文字、2回目で半角大文字、
3回目で先頭だけ半角大文字っていう操作に慣れて
しまってるから、それ以外の操作方法をわざわざ採用
する意味がわからないよ。なんで?
そこだけ直してくれたら、Mozc信者になってもいいん
だけどな。