PICマイコン演習 サンプルプログラム(1)

I/O制御の基本

‐ 振動スイッチのON/OFFを調べ点灯するLEDを変える -


■ 目的(要求)と考え方

 「振動スイッチのON/OFFを調べる」

  → スイッチの端子電圧をマイコンに入力(Input)し、その電圧(High or Lowレベル?)を判定する
 
 「スイッチがONならばLED1を点灯、OFFならばLED2を点灯」
 
  → LED1、LED2をそれぞれマイコン端子に接続する。それら端子に出力(Output)する信号電圧によってLEDの点灯を制御する。

 * 下線部の「電圧を判定する」や「信号を出力する」手続きがプログラムで記述される。

 

                    入出力関係


     ブレッドボードの部品配置例

                   

■ 回路構成

 振動スイッチをRA5(4ピン)に接続する。このRA5ピンは抵抗R1によってプルアップされており、スイッチがオープン(OFF)の時にHigh(1)、クローズ(ON)の時にはLow(0)の値を得る。また、LED1から4の発光ダイオードは、抵抗器を介してアノード側を電源3Vに、カソード側をマイコンに接続している。マイコンにおいて0(ゼロ)を出力した時、LEDの両端子間には電圧差が生じるため、LEDは点灯する

      *このサンプルでは、LED3及びLED4は不要です。

■ 処理の流れ

 スイッチの状態(ON/OFF)を調べ[CHECK1の部分]、その結果を受けて処理が2つ[SELECT1, SELECT2]に分かれる。

 

■ サンプルプログラム LED03A.asm

;
;       SAMPLE 01 - 振動スイッチのON/OFFに応じて2つのLEDを点灯
;
;--- デバイスの選択,コンフィグレーションの設定 ---
        LIST P=PIC16F648A
        INCLUDE "P16F648A.INC"
        __CONFIG _INTOSC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_OFF & _LVP_OFF & _CP_OFF 

;--- ユーザエリア ----------------
#DEFINE UA              30H
#DEFINE UB              31H
#DEFINE UC              32H
;--- リセット, 割り込みベクタ ---
        ORG     0
        GOTO    MAIN
        ORG     4
        GOTO    MAIN
;========= メインルーチン ============== 
MAIN
        BCF     INTCON,7        ;割り込み不許可
        BSF     STATUS,RP0      ;バンク1に切り替え
        MOVLW   20H             ;20H = B'00100000'
        MOVWF   TRISA           ;ポートAのデータ方向(入出力)設定
        MOVLW   00H
        MOVWF   TRISB           ;ポートBのデータ方向(入出力)設定

        BSF     PCON,OSCF       ;内部発生クロック 4MHz選択
        ;--------------------------
        MOVLW   080H            ;オプションレジスタの設定
        MOVWF   OPTION_REG
        BCF     STATUS,RP0      ;バンク0に切り替え
        NOP

CHECK1
        BTFSC   PORTA,5         ;ポートAの5ビット(PA5)を検査、0(クリア)なら次の命令をスキップ
        GOTO    SELECT2         ;SELECT2へジャンプ
SELECT1
        MOVLW   B'01111111'     ;01111111をwレジスタに保存
        MOVWF   PORTB           ;wレジスタの内容をポートBへ出力(LED1が点灯)
        GOTO    CHECK1          ;CHECK1へジャンプ
SELECT2
        MOVLW   B'10111111'     ;10111111をwレジスタに保存
        MOVWF   PORTB           ; (LED2が点灯)
        GOTO    CHECK1

        end                                     ;ソースファイルの終わりを宣言

ちょこット解説

1)MAINルーチンでは、ポートAとポートBに対してデータ方向(入出力)の設定が行われている。ここで「1」を指定したビットが入力用として扱われ、「0」の指定では出力用として扱われる。

2)振動スイッチの状態検出には、BTFSC(Bit Test F Skip Clear)命令が用いられている。ポートAの5ビット(RA5)がクリア(0)の場合には、次の命令(GOTO)がスキップされ、SELECT1へ進む。SELECT1ルーチンでは、最上位の7ビットが0となっており、ポートBの7ビット(RB7)に接続したLED1が点灯する。

・2012/1/13 Q9のエラー対応済み(LED03A.asmの6行目 __CONFIGにおいて "&_DATA_CP_OFF"を削除)

< Back >