昨日、DigiSparkのタイマ0でタイマ割り込みができた
ので、これとanalogWriteは両立するのかなぁ?と思って、
昨日のスケッチを元に色々弄り回す。
とりあえず、昨日の割り込み処理でタイミングを計って、
適当にアナログ出力(PWM)する処理を組み合わせてみた。
…出力が出てこない。
色々弄り回してみると、どうやらタイマ0で割り込み処理
を掛けちゃうと、analogWriteとかち合って出力できない
みたい。
DigiSparkのTINY85は、タイマ0とタイマ1が入ってて、
DigiSparkは内部のタイミング関係にタイマ1を使って
いるっぽいので、アナログ出力にタイマ0を使っている
と言うことみたいだな。
さて、戦略を練り直す。
タイマ割り込みを使いたいのは、そもそもdelay関数とか
millis関数とか使わずに、タイマ割り込みで一定周期
で処理を割り込ませたいからなので、内部で使っている
タイマ1を活かす必要は無い。つぶしてもok。
逆に、analogWriteは使い勝手いいので、こいつを活かす
方向で考えたい。
というわけで、タイマ割り込みはタイマ1のレジスタを
上書きして、タイマ1で占有しちゃうことにする。
色々実験してみたら、上手いこと行くようなので、後で
そこそこ使いまわしできるようなスケッチにしておいた。
タイマ1割り込みとanalogWrite混ぜ混ぜの素材スケッチ。
(例によって、半角不等号はこのブログの制約によって、
全角不等号に置き換えてあるので、修正してから使って
ください)
#include <avr/interrupt.h>
int ledPin1 = 1;
int ledPin2 = 0;
volatile unsigned char vcnt;
ISR(TIM1_COMPA_vect) {
// 16.5 Mhz / (512*126) = 256 Hz
vcnt++;
}
void setup() {
vcnt = 0;
cli();
//initialize the timer1
TCCR1 = (1<<CS13 | 1<<CS11) ; // Timer1 prescaling 512 and clearing other bits
// disconnected from output pin OC1A
//TCCR1 = (1<<CS13 | 1<<CS10) ; // Timer1 prescaling 256 and clearing other bits
// // disconnected from output pin OC1A
//TCCR1 = (1<<CS13) ; // Timer1 prescaling 128 and clearing other bits
// // disconnected from output pin OC1A
TIMSK |= (1<<OCIE1A); // enable timer1 compare interrupt
//set the timer1 count
OCR1C = 126; // Count 126 cycles before calling ISR interrupt (0..255)
//initialize global interrupts before beginning loop
sei();
}
void loop() {
analogWrite(ledPin1, vcnt);
analogWrite(ledPin2, vcnt);
}
プログラム中のコメントにもあるように、プリスケーラ
は現状512に設定してあって、コメントを付け直せば
256とか128とかには簡単に直せるようになってる。
んで、カウンタとのコンペアレジスタには126を入れて
ある。これは、約1秒間隔にしたかったからで、1回の
割り込みが発生する間隔は
16.5MHz ÷ 512
で32,226.5625Hzくらい。この割り込み毎にカウンタ
変数vcntを1ずつカウント。このvcntは、unsigned
char型(8ビット変数…0~255まで)の域値で、
16.5MHz ÷ 512 ÷ 255 = 126
なので、逆にコンペアレジスタに126を入れておけば、
16.5MHz ÷ 512 ÷ 126 = 255
となって、vcntが0~255までカウントして桁あふれ
起こすのは1秒に1回。このvcntをanalogWriteから
出力すれば、丁度1秒ごとにLEDがホワンホワンする
と言う具合。あまり行儀のいいプログラムじゃない
けど、極力短い行数にしてみた。
よく考えたら、126を設定すると、カウンタは0~126
まで127回カウントしちゃうから、1減らしておかないと
いけないんだったっけ?最近タイマ関係のレジスタを
ちゃんと弄ってないから、正確なところを忘れてしまって
いたな。
まぁ、そもそも内部のRC発振で使ってるんだから、
1%以下の細かいところは気にしないでいいや。
で、こんな素材ができたので、ロウソクほわんほわんの
スケッチを、こいつを使って改造してみた。
以前、delay関数使って1ミリ秒ごとにホワンホワンして
いたときとほぼぴったり同じ動作してくれている。
よし。
あとはアナログ入力使って、衝撃センサからの入力に
よって、火が消えそうになるようなシミュレートとか、
電源管理オンオフ制御周りとか、その辺がなんとかなれば
もうばっちりかな。
(追記)
http://nekosan0.bake-neko.net/warehouse_digispark.html
サイトに纏めました。細かい間違えとかも補記してあります。
http://akizukidenshi.com/catalog/g/gM-08619/
秋月に、こんな昇圧回路基板あったのか。
電池1本からでも5V取れて、3V入力時には最大85%。
なかなか便利っぽいな。これはよさげ。知らなかったな。
こないだのWindows Update以来、Windows7機がすんごい
遅い、というか、HDDのアクセスが重すぎて困っている
ので、イベントログに何かエラー出て無いかとか、
変なプログラムがタイマ起動登録されて無いかとか、
色々調べてみた。
Bonjourが大量にエラー吐いてるのはわかったんだけど、
どうやらこれが直接悪いわけでもなさそうなので、
放置しておく。
なんか、あれこれ弄った後にPCを再起動。そしたら、
なんかWindows Updateの残骸っぽいもののインストール
作業が進み始めた。再起動後、いつものように軽くなった
状態に戻ったなぁ。戻った。
なんだよ、Windows Updateの最中に、やれ再起動しろ、
やれ再起動しろとまくし立ててくるのに、最後の1回で
再起動しろなんて言ってこないせいで、こんなに重いPC
を何日も使わされる羽目になったのかよ…
https://twitter.com/felis_silv/status/951039584296579078
投機的再起動…というところかな。
https://twitter.com/YahooNewsTopics/status/951766252808060928
0.04%って…
これ、σで言ったらどのくらいよ?完全な異常値でしょ?
もしこれが「通常値」と言えるのであれば、重力波って、
じつはまだ見つかってなかったんじゃないの?
もう絶滅宣言しても、だれも怒らないよ。
https://twitter.com/false800/status/951260625497309184
日本人ももうじき絶滅するんじゃね?
https://twitter.com/Wu_Niang/status/952155677639651333
バーチャルyoutuberといえば、例の界隈ではポンコが
その走りじゃね?と言っているみたい。
https://www.youtube.com/watch?v=IOD5dup-968&t=235
最後の方で、レモンとふかひれがバシバシ入れ替わってる。
https://twitter.com/nakagawa_ho/status/952112064016732161
にんげんだもの
みつを
https://twitter.com/tokoya/status/951581786319892480
おじーちゃん、もう免許返したでしょ!!
https://twitter.com/Beriozka1917/status/746592298964680704
>先制攻撃をすると敵国条項による制裁攻撃で国連加盟国
>から問答無用で攻撃を受ける
中国とロシアは、核兵器を持った国連加盟国で、しかも
いわゆる仮想敵国だからな。何されても文句言えないし、
アメリカがそのときに守ってくれるなんて考えるだけ
無意味だな。怖い話だな。
(追記)
すっごいの見つけちゃったので、貼っておく。
http://www.nicovideo.jp/watch/sm32581103
「紙でAAA-5 アンタレスをつくってみた」
アンドロメダ級5番艦アンタレス。
すっごいねぇ。なんか、編集画面がメタセコに似てるなぁ
と思ったら、メタセコだった。こんな造形できるツール
だったの?と、改めて思った。すごいねぇ。
紙の展開図にするのって、なにかツールがあるのかな?
なんか、昔、こういう風に紙の展開図にするツールを
どこかで見たような気がするんだけど、内部のキール
みたいのまで自動展開できたりしないよなぁ…