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



ここのところあれこれ画策している、AVRをFM音源に
してしまおうというお話。

音声を出力するためのPWM周りとか、音程・音符の長さ
を制御するタイマー割り込みなどについてアセンブラで
組んでみて、シミュレータ上ではおおよそ上手く動く
ところまで確認できました。

SIN関数のための定数テーブル(includeファイル)も
作ったんですが、2の補数表示用と正の整数表示用の
2つ両方を取り込んだら、MEGA48用メモリの半分近く
を使ってしまうことが判りました。
まぁ、ロジック部分はそれほど長くならないので
少しくらいメモリを圧迫しても良いことにします。

というわけで、一番億劫な骨格部分が動くように
なったので、あとはアプリ部分を組み込んでいくだけ。
今日中にもうちょっと進めたいなぁ。


そうそう。ちょっと想定外だった所がいくつか。

今回はターゲットボードにPLAYERを流用することに
したんですが、このボードの音声出力はPB2(0C1B端子:
timer1のPWM出力端子)に固定されているのですが、
このことで少々厄介なことに。

音声出力は8ビットにしようと思っているので、
timer0やtimer2でも構わなかったんですが、固定されて
いるので、割り込みに使うタイマーは0か2を使う
ことに。
問題はこのときのプリスケーラ。プリスケーラって、
1倍の次は8倍、64倍、256倍なんですよね…。
よく考えると当たり前なんですけど。

500クロックごとに割り込み掛けたいんだけど、
8ビットタイマーではプリスケーラを使っても
上手く設定できません。

対応策としては
・500クロック毎ではなく、2のべき乗で割りやすい
 クロック数に変える
・8ビット表現で間に合うクロック数(250クロック)
 毎の割り込みに変える
・プリスケーラ8倍を使って62または63パルス毎の
 割り込みとし、端数は誤差として諦める

のいずれかなのですが、ひとまずプリスケーラを使わず
250クロック毎に1回割り込みを掛ける方向で
進めることにしました。

割り込みをtimer1に、PWM出力をtimer0か1にして
おけばプリスケーラの心配は要らなかったんだけどなぁ…
この件が1点。


もう一つは、SIN波の定数テーブルのデータ数。
1波形800個(800バイト)にしているのですが、
欲張らずに256個にしておけばよかったかな…

512個や1024個でもいいんだけど、とにかく
2のべき乗個にしなかったせいで
  「800で割った余り」
の計算をしなければいけなくなっちゃいました。
アセンブラでは面倒です。

割り算のあまりといえば、スプライト表示器を作ったとき
に「3で割った余り」を1クロックでも速く計算する
必要に迫られたんですが、このときは値域が狭かったので
余り値を定数テーブルにしちゃうという手で逃げられた
んだけど、さすがに今回はデータの値域が広すぎ。

ちょっと思慮不足だったなぁ。

まぁ、今回はただの実験なので、こういうことが
明らかになっただけでもヨシとしましょう。




コメント ( 0 )