風邪がなかなかすっきり直らない。痰のからんだ咳がいつまでも出ている。
クリスマスの電飾、電子工作部分はほぼ完成。あとはディフューザー(100均で買ったピンポン球)に LED を仕込めばできあがり。なんとかクリスマスイブにはぎりぎり間に合いそうだな。
マイコン制御は Arduino ではなくて、ATTiny2313V を使っているのだが、ちょっと手こずった。この間 Arduino で試したプログラムを ATTiny2313V に移植したら、なんかうまく動かない。プログラムサイズは 1K ちょっとでまだまだ余裕あるし、そんなにたくさん変数使ってないし、なんでだろう?とだいぶ悩んだが、どうもここが問題だったらしい。
const unsigned char table[256] = { ...(省略)... }; ... pwm[i * 3 + j] = table[((int)colors[i * 3 + j] * c) / 128]; ...
const unsigned char ...
としたから配列データは当然 ROM 領域に置かれるでしょ、と思い込んでいたのが落とし穴。ATTiny2313 はプログラム領域とデータ領域が完全に分かれているので、プログラム領域にデータを置いて使うには特別なテクニックが要る。こう書くのが正しいらしい。
#include <avr/pgmspace.h> PROGMEM prog_uchar table[256] = { ...(省略)... }; ... pwm[i * 3 + j] = pgm_read_byte(table + ((int)colors[i * 3 + j] * c) / 128); ...
本当はアセンブリ言語でちゃんと書いた方がいいんだと思うんだけど、AVR のアセンブリ言語を勉強する時間はさすがに無いな…