PIC を用いた、メロディー自動演奏回路の製作




 今回の実習では、PIC を用いて、音楽のメロディーを自動的に演奏する装置を作ってみることにします。

 PIC でクロックを分周して、指定した周波数のビープ音を作り出します。好きな周波数が作れるようになれば、あとは、楽譜にしたがって、データを入力してやるだ けで いいわけです。

 私は音楽のセンスがなく、小学校の時は音楽の授業が大嫌いだったので、まず、楽譜の読み方から復習しなければなりませんでした。それから、音階と周波数 の関係について調査しました。その結果、以下のようなことが分かりました。

1. いわゆる、「ドレミファソラシド」の「ラ」音は、周波数440Hzである。
2. 1オクターブ音階が上がると、周波数は2倍になる。
3. 音階には、「倍率の法則」がある。
4. 4分音符の長さが1秒となる速さを、テンポ60と言う(1分間に4分音符を60回打つ速さ)。

ここで、上に出てきた「倍率の法則」について説明します。「ド」音を基準にすると、各音階は、以下の表のようになります。


音 階
音名
倍率
完全1度
1.0000
短2度

1.0595
長2度
1.1225
短3度

1.1892
長3度
1.2599
完全4度 ファ 1.3348
増4度(減5度) ファ#
1.4142
完全5度 1.4983
増5度(短6度)
1.5874
長6度 1.6818
減7度
1.7818
長7度 1.8877
完全8度
2.0000

表 1


 倍率は、周波数の倍率を示します。これによれば、「ラ」音が 440Hz ですから、「ド」音は 440 ÷ 1.6818 = 261.6 (Hz) ということになります。「レ」音はその 1.1225 倍で、261.6 × 1.1225 = 293.6 (Hz) と求められます。これをまとめたのが、下の表の f (Hz) の欄です。


音名
倍率
f (Hz) T (ms) T/2 (ms) サイクル
波 数
1.0000 261.6 3.82 1.91 420.5 65.4

1.0595 277.2 3.61 1.80 396.8 69.3

1.1225 293.7 3.41 1.70 374.6 73.4

1.1892 311.1 3.21 1.61 353.6 77.8

1.2599 329.6 3.03 1.52 333.7 82.4
ファ
1.3348 349.2 2.86 1.43 315.0 87.3
ファ#
1.4142 370.0 2.70 1.35 297.3 92.5

1.4983 392.0 2.55 1.28 280.6 98.0

1.5874 415.3 2.41 1.20 264.9 103.8

1.6818 440.0 2.27 1.14 250.0 110.0

1.7818 466.2 2.15 1.07 236.0 116.5

1.8877 493.9 2.02 1.01 222.7 123.5

2.0000 523.2 1.91 0.96 210.2 130.8

表 2


 周波数が分かれば、周期を計算することができます。周期は周波数の逆数です。単位をミリ秒とするために、1000倍することにします。すなわち、T =1000 ÷ f  です。それが、上の表の T(ms) の欄です。その右隣が、半周期の時間 T/2(ms) となります。
 PIC では、半周期ごとに 0 と 1 を交互に出力して、矩形波を作ります。矩形波の幅は、空ループを回す回数で調節することとします。
 今、PIC のクロックを仮に 880 (kHz) とすると、クロック周期は 1.136 マイクロ秒となり、PIC において1サイクルは4クロックと決まっていますから、1サイクルの時間は 4.545 マイクロ秒、つまり、0.004545 (ms) となります。先ほど求めた、T/2 (ms) の欄の数字をこれで割れば、その音階 の半周期がPICの何サイクルであるかが分かります。小数点以下は四捨五入することとして、たとえば、空ループを 421回まわせば、「ド」の音を、250回まわせば「ラ」音を、 PIC がそれぞれ出力してくれることとなります。これを図示したのが、下の図です。



 次に、8分音符を作るのに必要な波数を計算します。テンポ120であるとすると、4分音符の継続時間は、0.5秒となります。したがって、8分音 符の継続時間は、250 (ms) です。1秒間の波の数が周波数ですから、250 (ms) 間の波の数は、その4分の1となります。そこで、f (Hz) の欄の数字を4で割った値を、波数の欄に書き入れます。


  次に、ハードウェアの製作にかかります。今回設計した回路は、以下の通りです。



 PIC としては、前回、前々回の実習と同じく、PIC12F629 を用いました。

 この PIC について、再度簡単に説明しておきます。1番ピンは電源のプラス(VDD)、8番ピンは電源のマイナス(VSS)です。2番ピンはクロック入力端子です。 ここでは、簡単に、普通の RC 発振回路とすることにします。R1=4.7(kΩ)、C1=33(pF) として、大体 880 (kHz) の発振周波数となりました(電源電圧 5(V) の場合)。電池で駆動する場合は、電源電圧が 3(V) 程度になりますので、発振周波数はもう少し高くなって 1 (MHz) を超えるようですが、まあ、あまり気にしないことにします。
 PIC のピンのうち、使わない出力ピンはそのままにしておいてかまいませんが、使わない入力ピンは、抵抗でプルアップまたはプルダウンしなければなりません。4 番ピン(ポート3)は入力専用のピンですので、R2=1(kΩ)でグランドにプルダウンすることにしました。
 他のピンは、入力用にも出力用にもできます(プログラム中で設定する)が、出力用としておけば、プルアップまたはプルダウンする必要がなくなりますの で、回路が簡単になります。そこで、そうすることとします。
 PIC12F629 では、7番ピンをポート0、6番ピンをポート1、5番ピンをポート2、4番ピンをポート3と名づけています。このうち、ポート3だけは、上述のように、入 力専用となっています。RC発振モードの場合、3番ピンは発振クロックの出力端子となっています(RCIOモードでは、ポート4として入出力に使える)。
 出力はどのピンから取ってもいいのですが、今回は、5番ピン、すなわち、ポート2から取ることにします。直流カット用のコンデンサー C2 をはさみ、R3 を通して、スピーカーにつなぎます。結合コンデンサー C2 が 104 (つまり 0.1(μF))では小さすぎるような気もしますが、もっと大きな値のコンデンサーに変えてみても、あまり結果に差はありませんでした。R3 は、100 (Ω) とすることにしました。これも、かなり幅がありますから、50(Ω) 〜 470(Ω) ぐらいの間なら、適当な値でかまわないと思います。
 C3とC4は電源ラインのインピーダンスを下げるためのパスコンです。これらはもう定石ですね。

 その次に、プログラミングにかかります。まず、「ド・レ・ミ・ファ・ソ・ラ・シ・ド」と鳴るようなプログラムを組んでみます。

 各音階ごとにサブルーチンを作り、それを並べるだけという原始的(!?)な方法ですが、いろいろ試した結果、結局は、このような原始的な方法が一番よい という結論になりました。

 リストは、以下のようになります(下のリストでは、全角スペースが 入っているかもしれませんので、コピーアンドペーストする場合は注意してください)。

    LIST    P=12F629
    INCLUDE    P12F629.INC
    ERRORLEVEL -302

CB = _CPD_OFF
CB &= _CP_OFF
CB &= _BODEN_ON
CB &= _MCLRE_OFF
CB &= _PWRTE_ON
CB &= _WDT_OFF
CB &= _EXTRC_OSC_CLKOUT

    __CONFIG    CB
    __IDLOCS    H'0100'

    CBLOCK        H'20'
      CNT1
      CNT2
    ENDC
;---------------------------------
    ORG            H'0'
    GOTO        L1
;---------------------------------
    ORG            H'4'
    RETFIE
;---------------------------------
L1:
    BANKSEL      CMCON
    MOVLW        B'00000111'
    MOVWF        CMCON

    BANKSEL      TRISIO
    MOVLW        B'00001000'
    MOVWF        TRISIO

    BANKSEL      GPIO
L2:
    CALL         DO
    CALL         RE
    CALL         MI
    CALL         FA
    CALL         SO
    CALL         RA
    CALL         SI
    CALL         DO2
    GOTO         L2
;---------------------------------
DO:
    MOVLW        D'65'
    MOVWF        CNT2
L_DO:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'231'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'231'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_DO
    RETURN
;---------------------------------
RE:
    MOVLW        D'73'
    MOVWF        CNT2
L_RE:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'185'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'185'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_RE
    RETURN
;---------------------------------
MI:
    MOVLW        D'82'
    MOVWF        CNT2
L_MI:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'144'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'144'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_MI
    RETURN
;---------------------------------
FA:
    MOVLW        D'87'
    MOVWF        CNT2
L_FA:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'125'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'125'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_FA
    RETURN
;---------------------------------
SO:
    MOVLW        D'98'
    MOVWF        CNT2
L_SO:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'91'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'91'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_SO
    RETURN
;---------------------------------
RA:
    MOVLW        D'110'
    MOVWF        CNT2
L_RA:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'60'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'60'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_RA
    RETURN
;---------------------------------
SI:
    MOVLW        D'124'
    MOVWF        CNT2
L_SI:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'33'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'33'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_SI
    RETURN
;---------------------------------
DO2:
    MOVLW        D'131'
    MOVWF        CNT2
L_DO2:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'20'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'20'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_DO2
    RETURN
;---------------------------------
WA:
    MOVWF        CNT1
L3:
    GOTO         $+1
    DECFSZ       CNT1,F
    GOTO         L3

    MOVLW        D'190'
    MOVWF        CNT1
L4:
    GOTO         $+1
    DECFSZ       CNT1,F
    GOTO         L4
    RETURN
;---------------------------------
 
    END

使用するPICの宣言
インクルードファイル
エラーメッセージの抑制

環境設定
(コンフィギュレーションビット)







プログラムのバージョン=1.00

メモリーアドレス 20H
 ループカウント用の変数
 波数カウント用の変数


プログラム開始アドレス


割り込みベクター




デジタル I/O モードに設定



ポート 0,1,2 = OUT、ポート 3 = IN




 ド音
 レ音
 ミ音
 ファ音
 ソ音
 ラ音
 シ音
 1オクターブ上のド音
繰り返し

「ド音」発生ルーチン
波数 65 回


ポート 2 を 0 (V) にする。

空ループのサイクル数設定

ポート 2 を 5 (V) にする。

空ループのサイクル数設定

波数のカウント



「レ音」発生ルーチン















「ミ音」発生ルーチン















「ファ音」発生ルーチン















「ソ音」発生ルーチン















「ラ音」発生ルーチン















「シ音」発生ルーチン















1オクターブ上の「ド音」発生ルーチン















空ループ
1つ目のループは CNT1 回





2つ目のループは 190 回








プログラムの末尾を表す制御命令


 ここで、たとえば、「ド音」を発生させるサブルーチンについて見てみます。ド音を出すのに必要なサイクル数と波数を上の表から調べます。回数は整数でな ければならないので、四捨五入することにします。プログラム中では、CNT2 に波数を設定します。同様に、サイクル数を CNT1 に設定すればよいのですが、PIC12F629 の変数はすべて8ビット幅なので、0 から 255 までの間の値しか設定することができません。 そこで、「WA」という名前のサブルーチンを作り、空ループを2つまわすことにします。1つ目の空ループではCNT1回の、2つ目の空ループでは 190 回のループをまわして時間稼ぎをすることとします。そうすると、CNT1に設定すべき値は、サイクル数から 190 を引いた値となり、0 から 255 の範囲の値に収まります。それが、下の表です。CNT1 はサイクル数から 190 を引いた値、CNT2 は波数と同じ値になっています。

 WA ルーチン内で、「GOTO $+1」は時間稼ぎのために入れています。波数は8分音符を基準に作ったのですが、少し速すぎるので入れました。


音名
サイ クル
波数
CNT1
CNT2

421
65
231
65

375
73
185
73

334
82
144
82
ファ
315
87
125
87

281
98
91
98

250
110
60
110

223
124
33
124

210
131
20
131

表 3



では、ハードウェアの製作に取りかかります。


写真1  まず、8ピンの IC ソケットを取り付けます。




写真2 部品です。上が抵抗、下がコンデンサーです。




写真3 C1、R1、R2 を取り付けます。




写真4 少し斜めから見たところです。




写真5 C2 と R3 を取り付けます。 続いて、C3 と C4 も取り付けます。
C4 は電解コンデンサーですので、+− に注意します。




写真6 上面図です。




写真7 裏面図です。




 これで、ハードウェアの製作は完了しました。


続いて、アセンブラープログラムの作成と、PICへの焼き込みを行います。大雑把な手順は以下のようになります。

  1. MPLABを起動し、「新規作成」で、新しいソースファイルを作ります。
  2. そこに、ソースプログラムを入力します。
  3. 「melody」というフォルダーを作成し、そこに、「melody.asm」という名前で保存します。
  4. 「プロジェクトウィザード」で、新規プロジェクトを作成します。PICの型番を指定し、3.で作成したソースファイルをプロジェクトに追 加します。
  5. 「make」で、HEXファイルを作ります。
  6. PIC Programmer を起動し、HEXファイルをロードします。
  7. それを PIC に焼きこみます。

では、実際に見ていきましょう。

MPLAB を起動し、「File」の「New」を選びます。




新規作成のウインドウが開きました。




ソースコードを入力します。




「File」の「Save As」を選びます。フォルダーを新規作成します。




ここでは、「melody」という名前のフォルダーとすることにしました。




作成したフォルダーに移動し、ファイル名を「melody.asm」として保存します。拡張子の「.asm」は付けたほうが安全です(付けないと、拡張子が「.c」になってしまうことがある)。




保存し終わりました。コードウインドウのタイトルが、ソースファイル名に変わりました。




「Project」から、「Project Wizard」を選びます。




指示に従って、PIC名などを選んで、「次へ」を押して行きます。以下のような画面になれば、プロジェクト名を「melody」にします。




次に、プロジェクトディレクトリーの横の「Browse」ボタンを押し、さっき作成したフォルダーを指定します。




指定できたところです。




次のステップで、ソースファイルをプロジェクトに追加します。左側のウインドウで、「melody.asm」を選んで、「Add」ボタンを押します。




右側のウインドウに追加されました。チェックは入れておくほうが安全です。




「次へ」を押すと、サマリーが出ます。それでよければ、「完了」を押します。元の画面に戻ってきますので、プロ ジェクトウインドウの中に「melody.mcp」が作成され、その中の「Source Files」の項に「melody.asm」が登録されていることを確認します。




なお、ソースコードを確認したければ、プロジェクトウィンドウ内の「melody.asm」をダブルクリックします。ソースコードのエディットウインドウが開きます。




今から、アセンブルします。「Project」の「Make」を選びます。




アセンブル中です。




エラーなく、アセンブルが完了しました。もし、エラーがあった場合は、ソースコードを修正し、再度、「make」を実行します。




エクスプローラで見てみると、確かに、「melody.HEX」という、バイナリファイルが出来ています。




さて、出来た HEX ファイルを、PIC に焼きこみます。

PIC ライターをパソコンのシリアルポートに接続し、電源を入れます。




PIC を所定の位置に取り付けます。




PIC Programmer を起動します。デバイスが PIC12F629 になっていることと、各種環境を確認しておきます。特に、「FOSC」が「RC」になっていることを確認しておきます。




「HEX ロード」ボタンを押して、「melody.HEX」をロードします。




ロードされました。




「プログラム」ボタンを押します。PIC への書き込みが始まります。




書き込みが終了しました。





さらに詳しいことについては、前回の実習、「PICを用いたLED点灯回路の実験」を参照してください。

では、早速、スピーカーと電池ボックスを接続してみます。






発振波形です。高い方の「ド」音ですが、527 (Hz) となりました。ほぼ設計どおりです。




消費電流です。約 0.9 (mA) となっています。




「ド・レ・ミ・ファ・ソ・ラ・シ・ド」がうまく行ったので、次に、滝廉太郎の「花」をプログラムしてみました。

ポーズを置く(楽譜で言うところの休符)ために、PAというサブルーチンを追加しました。

また、ファのシャープ(ファよりも半音だけ高い)が出てきますので、これのサイクル数と波数を用いて、FASというサブルーチンを追加しました。表2の 「ファ#」の行より、サイクル=297、波数=93と分かります。よって、CNT1 には 107 を、CNT2 には 93 を設定します。

これ以外に、普通の「シ」より1オクターブ低い「シ」と、普通の「レ」より1オクターブ高い「レ」が出てきます。1オクターブ低い場合は、サイクル数を2 倍にし、波数を半分にします。1オクターブ高い場合は逆に、サイクル数を半分にし、波数を倍にします。ですから、普通の「シ」より1オクターブ低い「シ」 の場合は、表2より、サイクル数が 222.7×2=445.4、波数が 123.5÷2=61.8 となります。そこで、CNT1 は 445 から 190 を引いて 255、CNT2 は 62 とします。それが、SI0 というルーチンです。同様に、普通の「レ」より1オクターブ高い「レ」を計算すると、CNT1は -3 になってしまうので、少し音程がずれますが、1 にしてごまかしておきましょう(どうして0にせずに1にしたか分かりますか?)。

長音は、長さに応じて例えば「CALL DO」文を2つとか3つとか続けて書くという、原始的極まりない方法ですが、まあ、笑わないでください。


こうして出来上がった、「花」演奏プログラムです(下のリストでは、全角スペースが 入っているかもしれませんので、コピーアンドペーストする場合は注意してください)。


    LIST    P=12F629
    INCLUDE    P12F629.INC
    ERRORLEVEL -302

CB = _CPD_OFF
CB &= _CP_OFF
CB &= _BODEN_ON
CB &= _MCLRE_OFF
CB &= _PWRTE_ON
CB &= _WDT_OFF
CB &= _EXTRC_OSC_CLKOUT

    __CONFIG    CB
    __IDLOCS    H'0100'

    CBLOCK        H'20'
      CNT1
      CNT2
    ENDC
;---------------------------------
    ORG            H'0'
    GOTO        L1
;---------------------------------
    ORG            H'4'
    RETFIE
;---------------------------------
L1:
    BANKSEL      CMCON
    MOVLW        B'00000111'
    MOVWF        CMCON

    BANKSEL      TRISIO
    MOVLW        B'00001000'
    MOVWF        TRISIO

    BANKSEL      GPIO
L2:
    CALL         RE
    CALL         RE
    CALL         PA
    CALL         RE
    CALL         SO
    CALL         SO
    CALL         PA

    CALL         SO
    CALL         RA
    CALL         SO
    CALL         FAS
    CALL         MI
    CALL         RE
    CALL         RE
    CALL         RE
    CALL         PA

    CALL         SI0
    CALL         RE
    CALL         SO
    CALL         RA
    CALL         SI
    CALL         SI
    CALL         RE2
    CALL         RE2
    CALL         RA
    CALL         RA
    CALL         RA
    CALL         RA
    CALL         PA
    CALL         PA
    CALL         PA

    CALL         RE
    CALL         RE
    CALL         PA
    CALL         RE
    CALL         SO
    CALL         SO
    CALL         PA

    CALL         SO
    CALL         RA
    CALL         SO
    CALL         MI
    CALL         FAS
    CALL         RE
    CALL         RE
    CALL         RE
    CALL         PA

    CALL         RA
    CALL         RA
    CALL         PA
    CALL         RA
    CALL         RA
    CALL         RA
    CALL         SI
    CALL         SI
    CALL         SO
    CALL         SO
    CALL         SO
    CALL         SO
    CALL         PA
    CALL         PA
    CALL         PA
    CALL         PA

    CALL         RE2
    CALL         RE2
    CALL         PA
    CALL         RE2
    CALL         RE2
    CALL         RE2
    CALL         PA

    CALL         SI
    CALL         DO2
    CALL         DO2
    CALL         PA
    CALL         DO2
    CALL         DO2
    CALL         DO2
    CALL         PA

    CALL         RA
    CALL         SI
    CALL         SI
    CALL         SI
    CALL         PA
    CALL         MI
    CALL         MI
    CALL         RA
    CALL         RA
    CALL         RE
    CALL         RE
    CALL         RE
    CALL         PA
    CALL         PA
    CALL         PA

    CALL         RE
    CALL         RE
    CALL         PA
    CALL         RE
    CALL         SO
    CALL         SO
    CALL         PA

    CALL         SO
    CALL         RA
    CALL         SO
    CALL         FAS
    CALL         MI
    CALL         RE
    CALL         RE
    CALL         RE
    CALL         PA
    CALL         PA

    CALL         RA
    CALL         PA
    CALL         RA
    CALL         SI
    CALL         DO2
    CALL         DO2
    CALL         RA
    CALL         RA
    CALL         SO
    CALL         SO
    CALL         SO
    CALL         SO
    CALL         PA
    CALL         PA
    CALL         PA
    CALL         PA
    GOTO         L2
;---------------------------------
PA
    MOVLW        D'62'
    MOVWF        CNT2
L_PA:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'255'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_PA
    RETURN
;---------------------------------
SI0:
    MOVLW        D'62'
    MOVWF        CNT2
L_SI0:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'255'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'255'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_SI0
    RETURN
;---------------------------------
DO:
    MOVLW        D'65'
    MOVWF        CNT2
L_DO:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'231'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'231'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_DO
    RETURN
;---------------------------------
RE:
    MOVLW        D'73'
    MOVWF        CNT2
L_RE:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'185'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'185'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_RE
    RETURN
;---------------------------------
MI:
    MOVLW        D'82'
    MOVWF        CNT2
L_MI:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'144'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'144'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_MI
    RETURN
;---------------------------------
FA:
    MOVLW        D'87'
    MOVWF        CNT2
L_FA:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'125'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'125'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_FA
    RETURN
;---------------------------------
FAS:
    MOVLW        D'93'
    MOVWF        CNT2
L_FAS:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'107'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'107'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_FAS
    RETURN
;---------------------------------
SO:
    MOVLW        D'98'
    MOVWF        CNT2
L_SO:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'91'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'91'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_SO
    RETURN
;---------------------------------
RA:
    MOVLW        D'110'
    MOVWF        CNT2
L_RA:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'60'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'60'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_RA
    RETURN
;---------------------------------
SI:
    MOVLW        D'123'
    MOVWF        CNT2
L_SI:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'33'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'33'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_SI
    RETURN
;---------------------------------
DO2:
    MOVLW        D'131'
    MOVWF        CNT2
L_DO2:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'20'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'20'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_DO2
    RETURN
;---------------------------------
RE2:
    MOVLW        D'147'
    MOVWF        CNT2
L_RE2:
    MOVLW        B'00000000'
    MOVWF        GPIO
    MOVLW        D'1'
    CALL         WA
    MOVLW        B'00000100'
    MOVWF        GPIO
    MOVLW        D'1'
    CALL         WA
    DECFSZ       CNT2,F
    GOTO         L_RE2
    RETURN
;---------------------------------
WA:
    MOVWF        CNT1
L3:
    GOTO         $+1
    DECFSZ       CNT1,F
    GOTO         L3

    MOVLW        D'190'
    MOVWF        CNT1
L4:
    GOTO         $+1
    DECFSZ       CNT1,F
    GOTO         L4
    RETURN
;---------------------------------
 
    END






















































































































































































ゼミ作品に戻る