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



久々に、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信者になってもいいん
だけどな。



コメント ( 0 )