プログラムの作成(初期化とメイン)

【初期化とメイン処理部の作成】

まず作らなければならないのは初期化処理とメインルーチンです。
この部分のフローチャートは下図ですから、これに従って作成します。



 ラベルはSTARTとMAINとする

【初期化処理部】

初期化ですることは、まず、入出力ピンの入出力モードの設定で、
次は変数で初期化が必要なもののセットをします。

(1)入出力の設定の仕方
  この設定の手順はパターンが決まっていて下記のようにします。
  入出力はTRISA、TRISBというSpecial Function Registerで設定
  します。
  TRISA、TRISBの各ビットがPORTAとPORTBの各ピンに対応し、
  入力のときは「1」に、 出力の時は「0」にセットします。
  電源ON後やRESET後はすべて「入力」として設定されています。
  TRISAやTRISBなどのSpecial Function Registerにアクセスする
  時には、Page1に切り替えて行う必要があります。この詳細は
  別ページを読んで頂くこととし、ここでは決まったパターンだと
  思って下記の様にソースを書いて下さい。


    ORG  0      ;0番地スタート
 START          ;STARTラベル
    BSF  STATUS,RP0 ;STATUSレジスタのRP0ビットを1に
              ;してBank1に切替える
    MOVLW 0FFH    ;入力モード用の1をセット
    MOVWF TRISA    ;PORTAをすべて入力モードに設定
    CLRF  TRISB    ;PORTBを全て出力モードに設定
    BCF  STATUS,RP0 ;Bank0に戻る
    MOVLW 0FFH    ;8ビットの1をセット
    MOVWF PORTB    ;PORTBに全て1を出力して全消灯

これで入出力モードの設定とまずは全ての発光ダイオードを消灯
するところまで完了です。
ここで全く定義していないSTATUSとかRP0とかの多くのラベルが
いきなり使われていますが、これらは全て標準ヘッダーファイルの
中で定義されていますので、アセンブルしてもエラーにはなりません。

(2)変数の初期化
  今回のプログラムは、初期化の中で設定が必要な変数は、今の
 ところ、ありませんので、取りあえず何もせずです。

【メイン処理部】

メインでの処理は、キースイッチの入力があるかどうかのチェックを
繰り返すことです。
これには、入力の仕方と判断の仕方を、どうプログラムで書くかが
必要になります。
まず、入力の仕方ですが、入出力ピンも汎用レジスタと同様に扱う
と考えれば簡単です。
つまり入出力レジスタから、ワーキングレジスタにデータを取り出す
には、下記の様にします。

    MOVF  PORTA,W  ;これでPORTAがWregに写される

また、今回の様に、キースイッチ入力があるかどうかを調べるには
下記の様にします。

    BTFSS  PORTA,4  ;PORTAのRA4が1ならスキップ

キースイッチ1はRA3に、キースイッチ2はRA4に接続されており、
かつ、キースイッチがOFFの時は入力は5ボルトで、これを読み
こむと「1」です。逆にONのときは、0ボルトとなりますから「0」に
なります。従ってキースイッチの入力チェックのメイン処理部は
下記の様にすることで実現できます。


MAIN
   BTFSS  PORTA,3 ;RA3のスイッチ1をチェック
   CALL   PATAN1  ;ONならパターン1の処理へ
   BTFSS  PORTA,4 ;RA4のスイッチ2をチェック
   CALL   PATAN2  ;ONならパターン2の処理へ
   GOTO   MAIN   ;繰り返し




【プログラミングテクニック】

プログラムの中で良く使う手順の中に「条件判断と分岐」が
あります。PICでこれを実現する手法のいくつかを紹介します。


(1)終了判定による分岐
  カウンタ(CONTR)が0になったことによる終了判定
   
    DECFSZ  CONTR,F  ;CONTR-1しかつゼロ判定をする
    GOTO   CNTINUE  ;まだ終了でないとき続ける
    end process     ;終了したとき

(2)フラグによる分岐
  フラグ(FLG)の0ビット目がゼロとゼロでないときで
  分岐する。ゼロならAへゼロで無ければBへ分岐
 
    BTFSC  FLG,0  ;0ビット目をテスト
    GOTO  B    ;ゼロでないときBへ分岐
  A  zero case    ;ゼロの時Aへ分岐

 
(3)レジスタのデータがゼロかどうかで分岐
  レジスタ(DATA)がゼロならAへゼロでなければBへ分岐

     MOVF   DATA,W   ;DATAをWregへロード
     BTFSC  STATUS,Z  ;Zeroフラグをテスト
     GOTO   A
   B  not zero case

(4)比較結果で分岐(IF文)
  DATA_AとDATA_Bを比較し、DATA_Aが大きければAへ
  そうでなければBへ分岐

    MOVF  DATA_B,W  ;DATA_Bをロード
    SUBWF  DATA_A,W  ;DATA_A - DATA_B
    BTFSC  STATUS,C  ;? DATA_A < DATA_B
    GOTO  A
  B (Aが小さいときか等しい時)

   (注)SUBWF命令は f−Wreg で結果が正のとき
      Carry FlagがONとなる(Z80等と逆)

(5)データの値による分岐(CASE文)
  DATAが1ならA、2ならB 3ならCその他ならDへ分岐する

    MOVF  DATA.W   ;DATAをロード
    MOVWF  TEMP    ;一時保存用のレジスタ
    DECF  TEMP,F   ;TEMP-1
    BTFSC  STATUS,Z  ;ゼロかつまり1かテスト 
    GOTO  A      ;1ならAへ分岐
    DECF  TEMP,F   ;TEMP-1
    BTFSC  STATUS,Z  ;2かをテスト
    GOTO  B      ;Bへ分岐
    DECF  TEMP,F   ;TEMP-1
    BTFSC  STATUS,Z  ;3かをテスト
    GOTO  C      ;Cへ分岐
    GOTO  D      ;Dへ分岐


   次のページへ      目次ページへ