Topics | PICkit2 | Sound | Interrupt | TIMER0 | SLEEP | PIC12F675 | PIC12F629 | 12F1822 | 12F1501 | Snap | MPLABX |
MPLAB SNAP対応!(PIC12F1822のみ)
これらの圧縮ファイルは予め各曲のHexファイルが入っているので、そのまま書き込んで使用可能です。
SNAPを使用する場合、一度でも高電圧書き込みを行ったPICマイコンには書き込みができないため、新品のPICマイコンを使用するか、PICkit4などの高電圧書き込み可能PICプログラマでプログラムすることになります。
Date | version | Build | Folder | note |
---|---|---|---|---|
New! 2025/4/19 |
2.10 | MPLAB X IDE v6.20 MPLABXC8 v2.50 |
melody_12f1501.X | スリープ時は0.1μA@3Vです 4種類の曲を同梱。MPLAB Snap対応。 Ievan Polkka like sound Mayim Mayim like sound Mikku Miku ni Shite yanyo like sound Jingle Bells like sound 歌って楽しい楽譜リンク |
Date | version | Build | Folder | note |
---|---|---|---|---|
2024/12/1 | 2.00 | MPLAB X IDE v6.20 MPLABXC8 v2.50 |
melody_12f1822.X | 下記と同様の曲を同梱。MPLAB Snap対応。 スリープ時は24μA@3Vです |
2011/12/18 | 1.01 | MPLAB8.80,Hitech PICC Pro lite mode v9.83 | C:\picsrc\piccpro\melody_12f1822 | 4種類の曲を同梱 Ievan Polkka like sound Mayim Mayim like sound Mikku Miku ni Shite yanyo like sound Jingle Bells like sound 歌って楽しい楽譜リンク |
Date | version | Build | Folder | note |
---|---|---|---|---|
2024/12/1 | 2.00 | MPLAB X IDE v6.20 MPLABXC8 v2.50 |
melody_12f675.X | 下記と同様の曲を同梱 プロジェクトは12F675になっているので、12F629の場合は再ビルドしてください。 スリープ時は0.06μA@5Vです。SNAP非対応。安定させるには、configでブラウンアウトリセットを有効にさせますが、その時のスリープ時は120uAに増えます。 |
2011/12/18 | 1.01 | MPLAB8.80,Hitech PICC Pro lite mode v9.83 | C:\picsrc\piccpro\melody_12f675 | 3種類の曲を同梱 Ievan Polkka like sound Mayim Mayim like sound Jingle Bells like sound |
古いプログラムは過去の記事に掲載しています。
New!プログラム Ver2以降 | 旧プログラム用 |
---|---|
New!プログラム Ver2以降 ※PIC12F1822のMPLAB Snapに対応させるため、スイッチの接続位置を変更しています。Snapは給電未対応のため、電源を投入した状態で書き込みます。 PIC12F629/675は低電圧書き込みがないためSnapは使用できません。 |
※ICSPを利用する場合は、コイン電池を外して書き込みます。書き込み時は押しボタンスイッチを操作しないでください。 |
![]() |
![]() |
MML仕様書 音符を打ち込む時はMML仕様を参考にしてください。
ボードレイアウト
Make Tokyo Meeting 07(2011/12/3,4)開催で頒布したキットのドキュメント一式です。
MS word 形式、パターン図、MBE基板図
PIC12F_general_evalution_system01_20111203-021234.ZIP
電源を入れると、一瞬LEDが光り待機状態になります。
スイッチを押すと曲が流れます。
曲が流れている時にスイッチを押すと、曲が途中で止まります。更にスイッチを押すと途中から曲が始まります。
曲が一周すると、待機状態となります。
音符を打ち込む時はMML仕様を参考にしてください。
ボタン電池で動作させる場合、CR2032等のボタン電池は200〜240mAh程度(FDK参考)なので、スタンバイ電流の小さいPIC12F629がオススメです。PIC12F1822の場合、同一条件では1年強の電池寿命になります。PIC12LF1822ではデータシート上では20nAと1000分の1の電力となる様です。
クリスマス企画として、イルミネーションでもやろうかと思ったんですが、74HC14を並べてランダムにLEDを光らせるとか、何だかありふれているので、ここは一つ実用的で、なおかつスキルの上がるような事をやろうかなと考えました。
で、何をしようか、そうだオルゴールを作ろう。というわけで、マイクロチップテクノロジー社の安いマイコン、PICを使って、オルゴールを作ってみることにしました。
ぬいぐるみへの実装例はこちらです。
手持ちのPIC12C508/JWでやろうかと思いましたが、あんな紫外線でいちいち消さないといけないような、命令のさらにしょぼくなった割込みの無い8ピンデバイスをつかうよりも、14ビットでフラッシュ内蔵で150円で買えるマイコンの方がはるかに扱いやすいわけなので、今回は12F675を使うことにしました。※12F629でも使用できます。
![]() |
なんとか完成しました。曲を止められる機能がついています。12F675のスリープ命令を使っています。ボタンを押すと曲が始まり、曲が終わると停止します。 途中でボタンが押されると、曲が途中で停止し、その後またボタンが押されると、途中から開始します。 電池は手持ちに浮き電池(パナソニックBR435 3V 50mAh)があったのでそれを使いました。待機時の電流は、殆ど0です(手持ちのテスターでは測定不能)。電池の経年変化によるリーク電流の方が多いかもしれません。CR2032あたりは220mAhですので良く鳴らす場合にはこちらを使ったほうが良いでしょう。アルカリ単三だと、電池の方が先に腐るんじゃないかな?LEDは動作試験用のためにつけている程度です。LEDをはずせば消費電流を抑えられます。 |
ハードスペック
電源 | 2.2V〜5.5V |
動作電流 | LED無で最大410μA、LED付は700μアンペア |
待機電流 | 0.06μA (melodyのBORをoffに設定した場合。通常では100uA消費) |
ソフト対応状況 MML仕様書
Step | Program | Hex | Sound Out | Max note | Hard | GP0 | GP1 | GP2 | GP3 | Introduction |
melody(SDCC) | zip | mono3oct | >360 | 4 | - | #LED | Piezo | #SW | PICkit2対応 SDCCコンパイラ対応版(12F675/629) |
|
melody | zip | mono3oct | >360 | 4 | - | #LED | Piezo | #SW | PICkit2対応 mplab7.62/PICC9.60対応版(12F675/629) |
|
melodyd | txt | txt | 2voice 3oct | Unknown | 3 | - | Piezo- | Piez+ | - | 2和音(Timer0,1を使用する) |
melodyc2 | txt | txt | mono3oct | 377 | 2 | #SW | #LED | Piezo | - | サスペンド・レジウム対応 |
melodyc | txt | mono3oct | 406 | 1 | - | - | Piezo | - | 音符がたくさん入る | |
melodyb | txt | mono3oct | 237 | 1 | - | - | Piezo | - | プログラム構造が理解しやすい |
●Pickit2対応版(電子砂時計の回路と兼用)
●単音用(サスペンドレジウム対応)
●2和音用(研究用)
※オルゴールのプログラムについては、営利目的以外であり、個人の使用を始め、学校関係や地域振興用等の教材ご使用される分にはご自由にお使いください。但し、サポートに付いては私の趣味のサイトである関係で、基本的にノーサポートとします。
以下の2つをインストールします。
sdcc Windows package with installer (i586-mingw32msvc-setup)サイトへ移動してダウンロード
gputils-win32 0.13.4 Notes (2006-08-19 18:19) サイトへ移動してダウンロード
どちらのファイルも、インストーラ形式で、インストールの最後にパスを通すかどうかの質問でNOにフォーカスされていますが、YESに選択し直してインストールを完了させます。
その後、このファイルを適当なフォルダに解凍して、make.batを実行すると、melody.hexが作成されます。(色々warning が出ますが、まだテストなので今はまだ意味がわかっていません)このhexファイルをライタで書き込めば、動作します。
以下は開発日記です。ご参考までに。
2003/12/29
とりあえず和音でメロディが鳴るようになりました。まだ、割込みの誤差分のテーブルとか、メモリー効率の検討とかやっていないので、高い音で音程が若干狂っていたりしていますが、これだけの部品で和音が鳴るようになったので暫定公開します。音の出力は5番と6番ピンから個別で出力されます。
ピエゾを使うときは、ピエゾの片側ずつ5番ピンと6番ピンにピエゾをつなげます。外部に接続する時は10kΩ程度の抵抗をそれぞれのピンに接続して適当なコンデンサをいれてください。後ほど回路図を公開します。サンプル音楽はこれです。サンプルではOSCCALを設定しなかったので、内部発振が低くなり音程が半音下がっています。(ジオシティズはmp3を直接置けないので、圧縮しておきました)
2003/12/24
これからの課題は、やっぱり和音と、ポーンとかいうエンベローブ処理かな。和音のプログラムに着手していますが、難しい。和音はなったんだけど、テンポがよれとる。ある程度できたら報告します。
電流を測定している時に、やっぱり10μAは食いすぎだなと思って色々調べたらMCLRが浮いていると、sleep時に余計な電流が流れる(といってもマイクロアンペア)事が分かりました。内蔵プルアップは、このポートだけありません。
これで、測定したら、sleep時は0.0μAとなりました。(この状態で数秒間電池を外してつなげても、パスコンのチャージ分でsleepを保持しているらしく、曲が途中から始まります。電解コンデンサなんてつけたらどうなるんでしょう。sleepを応用すれば、何らかのバックアップに応用できそうです)
あと、細かいところですが、ピンがスイッチ以外すべてプルアップ無しになっていましたが、このままだと静電気に弱くなるので、sleepさせる前にWPUで全てのポートをプルアップするようにしておきました。使用しないピンを出力にすることでも良かったんですが、入力の方が開発上安全かと(w
MPLAB6とHI-TECHCとの組み合わせのデバッガはリアルタイムでCのソースを追っかけながら、ピンのシミュレートができるし、命令間の時間計測もできるので、まさにホビーでの最強開発環境といったところでしょう。
事のきっかけは、温存していたFM音源チップを使ってMIDI音源をPICで作ろうと考えたものの、いきなりはちょっとむりっぽだったので、手始めに「音階の出るブザーでいいや」と気軽な気持ちで始めました。思ったより悪戦苦闘するもんです。お陰で随分と勉強になりました。頭で考えていても実際にやってみると相当な量の問題があるわけです。最初になった音痴な音は、小学生の頃電子工作で遊んだ記憶が蘇るほど感動しました。時には填って気が付いたら朝とか。結果としては、ソースとかが大した量でもなかったりとかしますが、それ以上にこの過程を学ぶ事が大事な事を非常に痛感しました。
※YM2413は現在でも量産されています。使われているところは、パチスロ機が多い(多かった)です。相当売ったみたいですねヤマハさん。手持ちのYM2413はN-MOSだから電気食うんだよね。B無しが40mAでB付が5mAに改善されています。
2003/12/23
電源のオンオフをスライドスイッチで行っていましたが、この12F675は、驚異的なスリープ電流を誇っているのですから、これを使わない手はありません。電源を入れっぱなしにしておいて、スリープ命令にて曲のオンオフを行うことにしました。12F675のスペックシートにはものすごい低消費電流値が記載されています。0.00099マイクロアンペアっておい。これは、あくまでもコア消費電流なので、実際はこれより少し大きくなりますが、今回作ったオルゴールのsleep時でも、0.1マイクロアンペアまで測定できるテスターで0.0でしたから、これは脅威的な省電力と思いました。
音符は377音符までとなりますが、一曲入れるには何とか事足りる事と思います。
スリープ命令は、通常sleepの実行後、リセットが掛かるか、割込みが掛かるかなどの要因で復帰し、割り込みの場合は、sleep命令の次の命令を実行後、インタラプトアドレスの0004番地へ飛びます。今回は割込み(GIE)を禁止することにより、sleepの次の命令から順次実行されるようになります。(詳しくはソースを参照してください)
2003/12/20
あれから、曲を入れていると237音はデータ量として少ないかなと。
それもそのはず、置換マクロでテンポを入れているから効率が悪い。かといって、データの打ちやすさを犠牲にするのも何ですし。色々、考えた結果、constで配列指定してあげる事にしました。
曲データの最大容量が、1KWの癖に倍近くの405音符まで入ります。これは結構長い曲もサポートします。
曲を1度だけ鳴らすか、リピートで鳴らすかは、ソースの中でコメントアウトしてある永久ループ部分のコメントを外せば電源投入後一度だけ音楽が鳴るようになります。
データフォーマットは殆ど変っていません。今までのデータがそのままつかえます。
途中のテンポチェンジの所は構文が変ります。
あと、L2,L1(2分音符、全音符)については、長さカウンターの都合で、同じ音を数回指定することになります。
例
C L2 → C L4 C L4
F$ L1 → F$ L4 F$ L4 F$ L4 F$ L4
メモリー効率は悪くなりますが、オルゴールでこんなに長い音符はそう無いだろうと考え、このようにしました。
const char songdata[]={
CMD 100 TEMPO //tempocont (except 255)
A$L L16
R L16
A$L L16
|
|
//Rest
R L4
//stop
CMD END // Music Last of data
};
どんな方法で、デバッグしていたのかを紹介します。
秋月のライターに、なんか、クリスタルイヤホンが(圧電素子)
ラッピングワイヤ用のソケットを使って、給電部を足上げして、別に電源を取ってます。
しかも、プラス側から音の出力をとっているし。
単に絡げているだけです。半田付けくらいしろよと。
圧電サウンダ素子の出力は、書き込み用のポートとぶつかっていないので、こんな荒業でデバッグをしています。デバッグが終わればきちんと基板を作る予定です。ワニ口付のクリスタルイヤホンは何かと便利です。
プログラムのシンボルについて
ソースを見ると、いきなりGPIOがなに、とかTRISIOが何とか書いてありますが、これは
C:\Program Files\MPLAB IDE\MCHIP_Tools
の中に、xxxxxx.incというものがあって、その名前を使えるのです。最初のうちはプリントアウトしておくといいでしょう。中の内容は書き換えると大変かも。*.incのコピーを取っておくといいでしょう。
(2004/2/27)12F675のプルアップコントロールレジスター
IOCについて、HI TECHにあるユーザーフォーラムに
かなり怪しい英語を使って質問してきました。For some reason, the 12F675's IOC register
is named "IOCB" in pic12f6x.h.
なんと、IOCBというシンボルにすればよかったみたいです。聞いて見るもんですね。
2003/12/19
あ、回路かいてなかった。
これです。簡単でしょう。他のPICと違い、12F675のブラウンアウトリセットは約2.1Vで機能します。
音楽を聴いてどうでしたか?え?なにこの曲?
あえて、曲名は申しあげません。
曲は各自簡単に入れられるようにしてあるのです。
ら#低いほう | 16分音符 | A$L L16 |
休符 | 16分音符 | R L16 |
ら#低いほう | 16分音符 | A$L L16 |
休符 | 16分音符 | R L16 |
そ#低いほう | 16分音符 | G$L L16 |
そ低いほう | 16分音符 | GL L16 |
ふぁ低いほう | 12分音符 | FL L12 |
休符 | 32分音符 | R L32 |
こんな感じで採譜してつくりましょう。同じ音が連続する場合は、細かい休符をいれるといいです。またメリハリをつけるにも、休符を入れたほうがイイ場合があります。
音は、3オクターブ、音符数は約237音入ります。
ポートとか余ってますから、2曲以上の選択とか、停止とかできます。
それと、中のテンポは、数字が大きいほど遅くなります。聴きながら調整してください。
OSCCALの設定をすれば解消されます。詳しくはワンポイントへ。
音階 | タイマー0の割数 | 基準周波数 | カウンター値 | ソフト誤差 | ソフト遅れを考慮 | ソフト割算 | 整数化 | セットするカウント値 | |
Hz | Hz | 2 | 10進 | ||||||
C | 261.63 | 8 | 125000 | 477.78 | 4 | 473.78 | 236.89 | 237 | 19 |
C# | 277.18 | 8 | 125000 | 450.97 | 4 | 446.97 | 223.48 | 223 | 33 |
D | 293.66 | 8 | 125000 | 425.66 | 4 | 421.66 | 210.83 | 211 | 45 |
D# | 311.13 | 8 | 125000 | 401.77 | 4 | 397.77 | 198.88 | 199 | 57 |
E | 329.63 | 8 | 125000 | 379.22 | 4 | 375.22 | 187.61 | 188 | 68 |
F | 349.23 | 8 | 125000 | 357.93 | 4 | 353.93 | 176.97 | 177 | 79 |
F# | 369.99 | 8 | 125000 | 337.84 | 4 | 333.84 | 166.92 | 167 | 89 |
G | 392.00 | 8 | 125000 | 318.88 | 4 | 314.88 | 157.44 | 157 | 99 |
G# | 415.30 | 8 | 125000 | 300.98 | 4 | 296.98 | 148.49 | 148 | 108 |
A | 440.00 | 8 | 125000 | 284.09 | 4 | 280.09 | 140.05 | 140 | 116 |
A# | 466.16 | 8 | 125000 | 268.15 | 4 | 264.15 | 132.07 | 132 | 124 |
B | 493.88 | 8 | 125000 | 253.10 | 4 | 249.10 | 124.55 | 125 | 131 |
C | 523.25 | 8 | 125000 | 238.89 | 4 | 234.89 | 117.45 | 117 | 139 |
C# | 554.37 | 8 | 125000 | 225.48 | 4 | 221.48 | 110.74 | 111 | 145 |
D | 587.33 | 8 | 125000 | 212.83 | 4 | 208.83 | 104.41 | 104 | 152 |
D# | 622.25 | 8 | 125000 | 200.88 | 4 | 196.88 | 98.44 | 98 | 158 |
E | 659.26 | 8 | 125000 | 189.61 | 4 | 185.61 | 92.80 | 93 | 163 |
F | 698.46 | 8 | 125000 | 178.97 | 4 | 174.97 | 87.48 | 87 | 169 |
F# | 739.99 | 8 | 125000 | 168.92 | 4 | 164.92 | 82.46 | 82 | 174 |
G | 783.99 | 8 | 125000 | 159.44 | 4 | 155.44 | 77.72 | 78 | 178 |
G# | 830.61 | 8 | 125000 | 150.49 | 4 | 146.49 | 73.25 | 73 | 183 |
A | 880.00 | 8 | 125000 | 142.05 | 4 | 138.05 | 69.02 | 69 | 187 |
A# | 932.33 | 8 | 125000 | 134.07 | 4 | 130.07 | 65.04 | 65 | 191 |
B | 987.77 | 8 | 125000 | 126.55 | 4 | 122.55 | 61.27 | 61 | 195 |
C | 1,046.50 | 8 | 125000 | 119.45 | 4 | 115.45 | 57.72 | 58 | 198 |
C# | 1,108.73 | 8 | 125000 | 112.74 | 4 | 108.74 | 54.37 | 54 | 202 |
D | 1,174.66 | 8 | 125000 | 106.41 | 4 | 102.41 | 51.21 | 51 | 205 |
D# | 1,244.51 | 8 | 125000 | 100.44 | 4 | 96.44 | 48.22 | 48 | 208 |
E | 1,318.51 | 8 | 125000 | 94.80 | 4 | 90.80 | 45.40 | 45 | 211 |
F | 1,396.91 | 8 | 125000 | 89.48 | 4 | 85.48 | 42.74 | 43 | 213 |
F# | 1,479.98 | 8 | 125000 | 84.46 | 4 | 80.46 | 40.23 | 40 | 216 |
G | 1,567.98 | 8 | 125000 | 79.72 | 4 | 75.72 | 37.86 | 38 | 218 |
G# | 1,661.22 | 8 | 125000 | 75.25 | 4 | 71.25 | 35.62 | 36 | 220 |
A | 1,760.00 | 8 | 125000 | 71.02 | 4 | 67.02 | 33.51 | 34 | 222 |
A# | 1,864.66 | 8 | 125000 | 67.04 | 4 | 63.04 | 31.52 | 32 | 224 |
B | 1,975.53 | 8 | 125000 | 63.27 | 4 | 59.27 | 29.64 | 30 | 226 |
基準周波数というのは、クロック4メガヘルツの1/4がタイマー0のクロックとなり、更にそのプリスケーラ値8で割った数です。
これを音階の周波数で割ると、カウントする値が出てきます。
割り込み発生から処理までに遅れがあるので、その分のカウント値を考慮しています。どれだけ遅れていたかということが分かったのは、一度ビルドしたアセンブルソースから割り出したわけです。これしないと、高い所でかなーりずれた音程になります。
タイマー0は足し算されて増えていきます。割り込み発生する時は255から過ぎて0になった時、オーバーフロー割り込みとして割り込まれます。つまり、255からリーチカウント値を引くわけでなくて、
256(0x100)から引いた値をカウンターにセットするのが正解です。
音の基準は、Aの音を440Hzとして、高いほうは、2^(1/12)*基準周波数、低いほうは2^(-1/12)*基準周波数で平均律を求めています。
もし、検索エンジンなどでこちらへ来られた方は、一旦ここをクリックして最初のページへ進んでください。
履歴
2024/12/1 MPLABX ver.6.20 XC8 ver.2.50対応。MPLAB Snap書き込み対応。
2012/12/9 キット頒布の告知
2011/12/18 Jingle Bellsを追加
2011/12/3 MTM07頒布用ドキュメント追加
2011/9/3 HI-TECH C PRO for the PIC10/12/16 MCU Family (Lite mode)に対応。12F1822追加。
2007/8/19 Pickit2対応版に修正
2007/7/29 最新ツールで使用できるようにしました。
2005/1/22 説明間違いの後始末(^^;色々な所で火消しをしました(爆
2004/5/24 OSCCAL対策のプログラムに修正しました。
2003/12/23 書き始め
(C)2003-2024 air variable All Rights Reserved..