LEDのプログラム点灯

  1. PICとは

    1. PICの概観

       ここでは、型番16F648(あるいは16F88)のPIC(以後単にPICと呼びます)を利用します。PICは組込み制御用のコンピュータで、プログラム実行をするための機能がすべて一つのIC(集積素子)に内臓されています。PICからは、片側9ピン、両側で18ピンの端子が出ています。ピン間は0.1インチ(2.54mm)です。
       PICの外部のピンはプログラムによって制御されます。この例では2進数を計数しその値を出力ピンに出力します。出力ピンにはLEDを接続し、出力の値を表示します。

    2. PICの端子

       下は、ICを上側から見た図です。PICの左下(マークがあります)が1ピンです。上の図で右端が9ピンとなり、その反対側が10ピンになります。各ピンについた英字はその機能を意味しています。

    3. PICのピンの機能

      ここでは、17,18,1,2 の4個のピンのみを利用します。これらのピンは、RA0,RA1,RA2,RA3 で、Aポート(PORT A)の下位4ビットを構成します。ポートはディジタルの値をそのまま出力する機能です。各ピンはプログラムにより複数の機能を切り替えて利用できます。たとえば、1ピンは PORT A のビット2の信号として利用できるほか、AN2としてアナログ入力、Vrefとして比較電圧に利用することができます。

      端子番号 端子名 注意 用途
      RA2 I/O PORT A(bit2)
      AN2 アナログ比較1入力
      Vref アナログ参照電圧生成
      RA3 PORT A(bit3)
      AN3 アナログ比較2入力
      RA4 PORT A(bit4)
      TOCKI 外部カウンタクロック入力端子
      CMP2 比較器2出力
      RA5 入力専用 PORT A(bit5)
      MSCLR マスタークリア
      VPP プログラム書き込み
      VSS 電源(グラウンド)
      RB0 割込使用しないとき PORT B(bit0)
      INT 割り込み
      RB1 PORT B(bit1)
      RX USART入力
      DT 同期データ信号
      RB2 PORT B(bit2)
      TX USART出力
      CK 同期用クロック
      RB3 PORT B(bit3)
      CCP1 比較、PWM出力
      10 RB4 PORT B(bit4)
      PGM ST プログラム入力
      11 PB5 PORT B(bit5)
      12 PB6 PORT B(bit6)
      T1OSO タイマー1発振出力
      T1CK1 ST タイマー1クロック
      13 RB7 PORT B(bit7)
      T1OSI タイマー1発信入力
      PGD プログラムデータ
      14 VDD 電源
      15 RA6 内部発振のとき PORT A(bit6)
      OSC2 振動子1
      CLKOUT 外部クロック出力
      16 RA7 内部発振のとき PORT A(bit7)
      OSC1 振動子1
      CLKIN 外部クロック
      17 RA0 PORT A(bit0)
      AN0 アナログ比較1入力
      18 RA1 要プルアップ PORT A(bit1)
      AN1 アナログ比較1入力
    4. ディジタル出力

       PICの出力端子はHigh:H と Low:L の二つの電圧レベルを持ちます。Hレベル のときは、電源の+電圧に近い値(5V)に、Lレベルのときは電源の - 側の電圧(0V)になります。通常、電源の - 側の電圧を基準の電圧とします。基準の電圧をグランドレベルともいいます。
       PICの各端子は最大25mAの電流を供給可能です。この電流はLEDを点灯することができます。各端子のレベルはプログラムによって定めることができます。

    5. ポートと設定

       ここでは、ポート機能を利用します。ここで利用するPICには内部に二つの8ビットのレジスタ A,B があります。各レジスタは外部端子のポートA (RA7..RA0)とポートB(RB7..RB0) に接続されています。
       外部端子は各端子ごとに入力用または出力用に設定できます。Aポートの入出力の設定はC言語では
           set_tris_a(値)
      関数で設定します。値は2進数で 0B11110000 のように指定できます。最初の 0B は2進数の意味で残りの8個の0,1で値を設定します。値0は出力、値1は入力を指定します。したがって、11110000 はRA7からRA4は入力端子、RA3からRA0は出力用の端子に設定します。
           set_tris_a(0B11110000) 
      を実行すると、ポートは次のように構成されます。

    6. 電源とLEDの接続
       PICを利用するには、まず、PICに電源を接続します。5ピンに電源のー側(0V)、14ピンに電源の+側(5V)を接続します。次に、電源の+側から抵抗、LEDを接続し、LEDの他端をPICのピン1に接続します。このとき、LEDの長い方の端子を抵抗側に接続します。
       PICのピン1はRA2の端子ですから、プログラムでRA2を Lレベルにすると、RA2は電源の-側(0V)に接続されますから、LEDに電流が流れ発光します。プログラムでRA2をHレベルにすると、RA2は電源の+側(5V)に接続されますから、LEDの端子は共にHレベルになり、電流は流れず発光しません。



    7. ポートへの出力

       Aレジスタに値を書き込むと、出力用に設定した端子の電圧が設定されます。RA2が出力に設定されている場合、Aレジスタの2ビットの値が RA2 のピンに対応し、Aレジスタの第2ビットに1を書き込むとRA2の電圧がHレベルに上がります。また、Aレジスタの第2ビットに0を書き込むとRA2の電圧がLレベルに下がります。
      どうように、Aレジスタの0〜7ビットが ピンの RA0〜RA7に対応します。ポートAに値を書き込むには次の関数が利用します。
           output_a(値)
       値には、変数が指定できます。たとえば変数 count の値を出力するには
           output_a(count)
      とします。

  2. 回路の設計

    1. ポート出力端子へのLED接続

       ここでは、プログラムでLEDを点滅することが目的です。4個のLEDをRA3からRA0に接続します。抵抗(330Ω)を電源5V側に接続し 、抵抗の他端をLEDの+側(長い方)に接続します。LEDの短い足をRA0(PICの18ピン)に接続します。どうように、 他の3組の抵抗とLEDをRA1,RA2,RA3に接続します。

    2. 配線図

       まず、PICの5ピン(下側中央)をグランド、14ピンを電源5Vを接続します。これで、PICに電源を供給できます。 5,14ピンはちょうど中央のピンになります。
       次に、330オームの抵抗を 5V の電源バーに接続し、他端をLEDの長いほうの端子に接続します。短いほうを、 PICの17ピン(RA0)に接続します。どうように、RA1,RA2,RA3 にも抵抗ーLEDを接続します。
       実際の接続は以下の写真のようになります。


    3. 回路図

       先の回路図は実際の配線には対応が良いのですが、配線がごちゃごちゃして読みにくい感じがします。そこで、PICのピンを左にポートA、右にポートBにまとめ書き直すと、下のように表現することができます。上下に電源端子を配置し、上に14ピンの5V、下側に5ピンのグランドを接続します。 はグランド、 は電源(5V)の記号です。これはパッチボードでは、上と下の電源バーへの接続を意味します。PICの左はAポート、右がBポートです。
       電源>抵抗>LEDを直列につなぎ、これを、RA0(図ではA0と略記)に接続します。A3,A2,A1にも同様な接続をしています。

       回路の機能的な理解には、この図のほうがわかりやすいと思います。

  3. プログラム

    1. CSCコンパイラ

      ここでは、CCSC(商品名)と呼ばれるC言語コンパラを利用します。このコンパイラはPIC用の専用関数を含むC言語を読み込み、 PIC用の機械語を生成します。この実験では、C言語は見て理解するととどめます。

    2. C言語プログラム

      ここでのC言語のプログラムを示します。

      #include <16f648a.h>
      
      #fuses INTRC_IO,NOWDT,NOLVP,NOMCLR//内部クロック、WDT,LVPなし
      #use delay(CLOCK=4000000) //クロック4MHz
      
      int count;
      void main(){
        count=0;
        set_tris_a(0B1110000);//Aポート下位4ビット出力
      
        while(1){//繰り返す
          count = count + 1; //countを増す
          output_a(~count);  //ポートAに出力      
          delay_ms(1000);    //1秒待つ  
        }
        
      }
      #include <16f648a.h> は PIC 16f648a の属性が記述されたファイル16f648a.h を取り込む指示です。このファイルはコンパイラ側で用意されています。標準のC言語では #include <stdio..h>
      で、標準の入出力関数の定義を取り込みますが、PICではPICの型番に対応した 16f648a.h を取り込みます。
          #fuses INTRC_IO,NOWDT,NOLVP,NOMCL
      はPIC特有の記述で、PICの利用法を指定しています。 INTRC_IO はプロセッサのクロックとして内部クロックを利用することを指定します。NOWDT,NOMCLR、はWDT、NCLRを利用しないことの指定でづが、説明は省略します。
          #use delay(CLOCK=4000000) 
      はプロセッサのクロックの指定で、秒あたり4000000Hz(周波数単位) のクロック(これは内臓クロック)を利用することを指定します。

    3. C言語の処理

           int count 
      は数学の変数の宣言に相当します。count を8ビットの符号なし整数として使用することを宣言しています。
      main() からプログラムの処理を開始します。最初の
           count=0; 
      は変数 count の値を0とします。
           while(1) {   }
      は、無条件に { } の間を繰り返し処理する指定です。1はtrue を意味し、「常に」とか「無条件」の指定です。繰り返しの中で、まず、
           count = count + 1; 
      で count に1を加えます。 = は右辺の値を左辺に代入し、countの値を count + 1 に等しくすることを意味します。
           output_a(~count);
      で、count をビット反転した値をポートAに送ります。ポートAには発光ダイオードが接続されていますから、countの2進数の値に従い発光ダイオードが点灯します。countのビットが0の場合、ビット反転するので出力端子は1になり、LEDは発光しません。countのビットが1の場合、ビット反転するので出力端子は0になり、LEDは発光します。
           delay_ms(1000); 
      のdelay は遅延の意味で、1000ミリ秒経過してから次の処理に進むことを指定する。この遅延処理を入れないと、人の目に見えない速度で発光ダイオードが点滅してしまいます。

    4. プログラムの書き込み

       このプログラムを PIC に書き込む必要があります。この書き込みには、PICライタ(書き込み装置)を利用します。PICをこの装置のソケットに押し込み、書き込み処理を行うことで、PIC内部のフラッシュROM(書き換え可能なROM)にプログラムを書き込むことができます。
       コンパイラは、コンパイルが終了すると、ソース名.HEX ファイルを作成します。このファイルがPICへの書き込みファイルで、このファイルをPICライタなど、PICに「書き込み」を行います。
      この実験では、書き込みを終了したPICを用意しますから、書込み操作は不要です。

    5. 実行

       書き込んだPICをパッチに戻し、電源を接続すれば、LEDが点滅を開始します。ここでは、2進数を計数しますから、
       0000>0001>0010>0011>0100>0101>0110>
        。。。>1100>1101>1111>0000
      と表示します。1が点灯、0は消燈です。