ポート入出力
  1. ポート入出力

    1. 入出力の設定
      PICにはA,B二つのポートがあり、このポートに書き込むとPICの端子から値が出力され、読み込むと端子に接続されている信号の値を取り込むことができます。

    2. スイッチ素子
       スイッチは、手で操作して二つの端子間をオン・オフする部品です。下の写真では、左のレバーを下にすると、右の中央の端子と上の端子が電気的に接続されます。左のレバーを上にすると、右の中央の端子と下の端子が電気的に接続されます。

        

    3. カーボン抵抗
       カーボン抵抗は炭素を利用した抵抗素子です。



      抵抗のカラーコード
      抵抗の値はカラーコードで示します。カラーの帯で表示すると、五個から見ても抵抗の値を確認することができます。ここでは、10Kオームと330オームの抵抗を利用します。

    4. 発光ダイオード(赤、緑、青)
       発光ダイオードは半導体でできた発光素子で、電流を流すと発光します。発光ダイオードには極性があり、長い方の腺にプラス側を接続します。電圧をかける方向を間違えると発光しません。
      発光ダイオードは数mAから数十mA の電流で発光します。



    5. PIC
       図で上にある「切り欠き」を左に向けると、左下が1ピンになります。5ピンにグランド、14ピンにプラスの電源を接続します。



       Aポートは2,1,18,17 ピン、Bポートは9,8,7,6 ピンになります。

    6. パッチボード
       ここでは、パッチボードの穴に部品を差込、穴の間を 銅線 で接続して配線をします。ボードの上、下の1行は電源用で、横方向に接続されています。パッチボードの上の行に電源の5V(プラス:赤線)、下の行には電源のグランド(0V:黒)を接続します。これで、最上部の行に接続した抵抗は、電源の5Vに接続します。

       ICは中央の溝をまたぐ位置に、切り欠きを左に挿入します。その横に発光ダイオードとスイッチを並べます。
      抵抗は、電源の5Vから発光ダイオードとスイッチに接続するよう差し込みます。
       発光ダイオードは長いほうを上にします。マッチボード中央部の溝の上下の縦列はボードの内部で接続されています。したがって、PICの6ピンの下に接続した赤い線は、6ピンに接続します。
       


    7. 回路図

       ここで、回路図で利用される基本的な記号を紹介します。下図の最初の記号は 接地(グランド)電位と呼ばれ、回路の基準電位を示します。基準電位は通常0ボルトです。
       次の記号は、電源から供給される(グランド電位よりある電圧だけ高い)電圧を意味します。次のギザギザの記号は抵抗素子で、抵抗の値をRm電圧をVとすると、 R ・ I = V (オームの法則)にしたがう、電流が流れます。
       

        

    8. 入力回路
        計算機の入力装置として利用する場合、0,1に対応する二つの電圧が必要です。そこで、次のような回路をくみます。スイッチが下側の接点の場合、0Vレベルの入力となります。スイッチが上側の場合、抵抗を通してVCCの電圧が入力に入ります。抵抗は、入力端子が短絡したとき過大な電流が流れないたmrの保護抵抗です。10Kオーム程度の抵抗を利用します。



  2. 実験
    1. 実験内容
      RB3,RB2,RB1に発光ダイオードを接続します。また、RA3,RA2,RA1にスイッチを接続します。
      プログラムでポートAの読みとった値をポートBに送り、スイッチの値で発光ダイオードを点灯させます。

    2. 実験回路
       スイッチに接続する抵抗は10kオーム、発光ダイオードに接続する抵抗は330オームです。


    3. 配線
       パッチボードで配線します。上の電源バーに電源の5V(VCC)、下の電源バーに電源の0v(GND)側を接続します。PICの5ピンとGNDバー、14ピンとVCCバーを接続します。下の図はスイッチがPICの右ですが、左に配置する方が良いでしょう。
       LEDには電流の流れる方向があります。LEDの長い端子をVCC側に接続します。

  3. プログラム(アセンブリ言語)

    1. 特殊レジスタ
      PICには、SFRと呼ばれる特殊なレジスタがあり、このレジスタに値を書き込むことで、PICの設定が可能です。SFRは固有の番地を持ち、その番地に書き込むことで、値を設定できます。
       PIC(PIC16F648))には、A,B二つのポートがありますが、各端子の入力と出力はSFRのTRISA(85番地)とTRISB(86H)レジスタに書き込むことで、自由に設定できます。共に、バンク1のレジスタですから、書き込む前に、バンク1を選択する必要があります。
       バンク1を選択するには、STATUS レジスタのRP0ビットを1にします。元のバンク0に戻すには、STATUS レジスタのRP0ビットを0にします。

       bsf STATUS, RP0  ;バンク1に切替える
       bcf STATUS, RP0  ;バンク0に戻す

      bsf命令は指定レジスタ(STATUS)の指定ビット(RP0)を1にセットし、bcf命令は0にクリアする命令です。MPLABのアセンブラでPICに対応した .inc ファイルを読み込むことで、STATUSやRP0の記号は番地やビットの番号として利用できます。

    2. ポートの設定
       ポートB(RB7..RB0の端子)は、TRISBレジスタに0を書き込むと出力、1を書き込むと入力に設定されます。次の命令は、ポートBの下位4ビット(RB3,RB2,RB2,RB0)を出力に、上位4ビット(RB7,RB6,RB5,RB4)を入力に設定します。movlw はWレジスタに指定した定数(この場合16進定数 0f)を設定する命令で、movwf はWレジスタの内容を指定レジスタ(TRISB)に書き込む命令です。
       
       bsf   STATUS,RP0    ;バンク1に切り替え
       movlw 0xF0          ;Wレジスタに設定
       movwf TRISB        ;下位4ビットを入力にする
       bcf   STATUS,RP0    ;バンク0に切り替え

      ポートAを利用するには、注意が必要です。ポートのRA3,RA2,RA1,RA0端子は、標準ではアナログ比較器の入力端子として設定されています。これらの端子をポートAとして利用するには、比較器設定レジスタ CMCOM に 7 を書き込み、RA3,RA2,RA1,RA0端子 を比較器の入力から解放する必要があります。その後、TRSIAレジスタに入出力を設定します。次のプログラムでは、上位4ビットを出力、下位4ビットを入力に設定します。

       movlw  0X07
       movwf  CMCOM      ;比較器の出力をオフに設定

       bcf    STATUS ,RP1
       bsf    STATUS ,RP0  ;バンクを1に
       movlw  0xF0        ;
       movwf  TRISA       ;下4ビットを出力に

    3. ポートの読み書き
       ポートA、ポートB のレジスタは PORTA,PORTB として参照できます。したがって、以下のように、ポートAの信号を読みとったり、定数(5)をポートBに書き込むことができます。入力に指定された端子は、書き込んでも値は変化しません。出力に指定された端子は0が読み込まれます。
       
       movf PORTA,W    ;PORTAの値をWレジスタに移す
       
       movlw  0x5       ;定数5をWレジスタに設定
       movwf  POTB     ;Wレジスタの値をポートBに出力

    4. 繰返し
       計算機は命令を実行すると、次の命令を実行しますが、goto 命令は指定した番地の命令に「飛び」ます。下のプログラムで、先頭の LOOP はこの命令の番地に対応づけられます。goto LOOP 命令で、次は LOOP 番地の命令にキャンプして実行します。したがって、movf   PORTA,W の命令を実行します。

      LOOP  movf   PORTA,W     ;ポートAをWに読む
            movwf  PORTB     ;WをポートBに書く
            goto   LOOP      ;LOOPに戻る

       したがって、このプログラムは、
            movf   PORTA,W     ;ポートAをWに読む
            movwf  PORTB
      の命令を繰返し実行します。

    5. プログラム
      アセンブラは先頭で指示命令により、アセンブルする条件を設定します。LIST,__CONFIG,INCLUDE は指示命令です。

      LIST :印刷機能を指定します。P= は使用するプロセッサ、ST は記号表の有無、R= がデフォルトの数字表記でDECは10進です。F= は、16進入るの形式です。

      __CONFIG は 構成ビットの設定です。内部発振と電源オン時のリセットを指定しています。

      INCLUDE <P16F628A.INC> は、16F628A 関連のレジスタや定数の設定ファイルを読み込む指示です。

      ;  メインルーチン
              org         0            ;Reset Start
      
      MAIN        
       ;ポート設定
              movlw   0x07
              movwf   CMCON           ;PORTAをIOとして使用する
      
              bsf     STATUS, RP0     ;BANK1にする
              movlw   B'00001111'
              movwf   TRISA           ;RA3,2,1,0を入力に
              
              movlw   B'11110000'
              movwf   TRISB           ;RB1,2,3,4を出力に
      
              bcf     STATUS, RP0     ;BANK0に戻す
      
      ;ポートAから入力し、ポートBに出力、
      LOOP
              movf    PORTA,W 
              movwf   PORTB
      
              goto     LOOP
      ;               
              end