先日探索を兼ねアチコチのHPを見ていたら、気になるノウハウが出ていました。プログラムをのぞき見るだけでは充分理解出来ませんので、作ってみる事にしました。
スイッチDATA(端子)を取り込み、それから周波数DATAに変換し、タイマー(TMR0)にセットして端子をON-OFFし音を出そうというものです。詳細については[ここ(パルス発振器)]のHPをご覧下さい。
サンプルはPIC10F206ですが手持ちのPIC10F200に移植しました。下位のPICですがメモリーの範囲内なので、簡単に動くと思いました。
作ると始め動かなかった。
SGの周波数実験 予 定 実 測 実測(補正後) 10KHz 9.76KHz 10.4KHz 5 4.30 4.85 2 1.73 1.95 1 0.848 988Hz 500Hz 433Hz 521 200 198 198 100 87 100 50 43 49 1.コマンドの打ち込みに一つミスがあり、直しましたが直ぐには動かなかった。
2.今度は音は出るものの、SWを切り替えても音が変わらない?
3.PIC10F200には無いRAM領域を使っていたので、アセンプルは通っても作動しなかった。これはシュミレータを動かして分り、0x08から上をRAMが入っているものを0x10からに変更した。
これで色々な音が出るようになった。これだけでは完全ではない、実測すると周波数が微妙に違っていた。これは周波数の補正プログラムを除外している為です。
当初、OSCCALの部分はカットしていたのでこの状態になりました。これは初めから分っていましたが実測すると16%の誤差があって許容範囲を超えている感じなので修正することにしました。
これでかなり周波数は合う様になった。周波数の自動補正の仕方が分りません、PIC12F629のやり方ではエラーになってアセンブル出来ませんでした。
仕方なく秋月電子のライターで読み出し、そのDATAを書き込む事にしました。
手元のICに付いて調べると[C2E,C32,C26,C2C]とバラバラです。一々調べてアセンブルして書き込むのは面倒です!
[ ノウハウ ]
音出しの精度はあまり高くありません。内部発振のため電圧や温度などによって微妙に変わります。私は次の点に興味があり、試してよかったと思っています。
1.テーブルを使ってDATAを読み出す事。SW DATA(0-7)からタイマ0用のプリスケラとTMR0のDATA2つを読み出している。
プログラムカウンタにDATAを加算して「周波数DATAをWレジスタにいれ戻る」。普通[RETLW K]とするのですが作動するのか不安だった。でもシュミレータを動かすとちゃんとDATAの受け取りをしていたのを確認!2.タイマ0の割り込みが無いので「ver flowをどうチェックしているのかなー」と思っているとTMR0レジスタを呼び出しDATAをマスキングしてチェックしていました。
LOOP MOVF TEMP0,W ANDLW 0xF8 BTFSS STATUS,Z GOTO LOOPループ間は5クロックを使うので「8クロックでチェックをすれば引っかかって来る」はずです。精度は取れないがこれはやむを得ない。でも良く考えている。
[ 音程の作り方 ]
タイマ0を使って待ち時間を作っています。
例] 500Hzの場合、プリスケラ1/8・TMR0=84h(132)なので
8x(256-132)=992μS + 処理プログラム
これで端子をON-OFFしている(2回で500Hzとなる)。応用として、電子オルガンやチャイム、時報(プ・プ・ポーン)など、デジタルなので音は良くないがそれなりに楽しめそうです。
[ ハードの製作 ]
ブレッドボードに部品を並べて実験しました。部品点数は少なく、電池(NI-MH x2の2.5Vです)と圧電ブザーの接続程度です。音変化の確認用としてSWの代わりにピンを挿したりはずして音出しをしました。
音は出っ放しで、切り替えると音が変わる方式です。電子オルガンにするには「適当な時間音が出て止まる」ようにする必要があります。正式な音出し用としては少し寂しいので、プログラムテクニックの勉強用にと作ったものです。実際に作るとプログラムに付いての知識の他、改善すべき点も少し見えたり、ここは苦労したかもと思われる点も見えて面白いです。使わせてもらう者として、先輩に感謝です!
2009年7月17日
アセンブラに付いては、前記のHPに記載がありますので省略します。
PIC10F200のHex DATAです。:020000040000FA :100000002E0C250006040E0C06009B0C2100900C03 :1000100002001B0AE2019808DC089808A908980861 :1000200013089108860892088408930864089408C5 :100030006408950864080602F10D30007002100291 :100040000A09020090020A09310021000102F80E9B :100050004307260A0602010F2600110221000602AC :10006000F10D3200520290004306260A0602F10DFD :100070003000700210020A09020090020A093100E1 :040080002100260A2B :021FFE00EB0FE7 :00000001FF