PICの使い方(プログラム編)


ここでは、PICの簡単なプログラムを実際に作成する方法を説明しています。
わずか35個の命令を扱うだけですから、直ぐに覚えられます。

1.基本的なこと

(1)使えるメモリとサイズ
  PICに内蔵されているメモリには幾つかの種類があります。

  ・プログラムメモリ 1Kワード(PIC16F84の場合)
     1000個までの命令が書けるということ。PICライタで書き込む。
  ・レジスタ  68バイト(PIC16F84の場合)
     変数として利用できるメモリで Register Fileとして独立のエリアが確保
     されています。データの扱いはバイト(8ビット)単位なので注意。
  ・Special Register 16種類
     PIC全体の動作モードを指定するためのレジスタ類で、独立の
     Register File として用意されています。
  ・EEPROMデータ 64バイト(PIC16F84の場合)
     電源をOFFしても消えないメモリへデータを書き込めます。ただし、動作
     が遅いのと、書き込み回数に制限があるので、一般のプログラム変数
     としては使えません。使い方としては、パラメータで覚えておきたいものを
     書き込んでおき、再スタート時にレジスタに呼び出して使うという使い方に
     なります。
  ・Configration Bits
     プログラムメモリのアドレス2007H番地にある特別なメモリで、PICの基本
     的な条件を設定します。このメモリはプログラミングの時だけしか
     Read/Writeができません。
     設定内容は、プログラム保護の有無、電源ON時のRESET条件、
     WatchDog Timerの有無、発振子の種類です。

 (2)Register Fileの見方とBankの切替え
  PICには汎用のレジスタ以外に、各種の動作モードを設定するための
  Special Register と呼ばれるものが用意されています。
  PICを動かすにはまずこのSpecial Registerの設定から始めます。
  そしてそれらは全て、Register File と呼ぶメモリとして用意されています。
  そのRegister Fileは Bank0とBank1とよぶ2ページになっている
  ため、多少アクセスの仕方が面倒です。
  つまりRESET後の通常は、Bank0となっているので、Bank1側のレジスタに
  アクセスするときはBankの切替えをしてからとなります。
  またBank0とBank1に同じ物があるときには、どちらでも同じ様に使えます。
  さらに、標準のInclude Fileを使った場合には、下図によるラベルでアセンブラ
  リストに書くことが出来ます。
 
【例】Bankの切替え方
BankはSpecial Registerである「STATUS」レジスタの「RP0」ビットを書き替える
ことによって切替えます。

   BSF   STATUS,RP0  ;STATUSレジスタのRP0ビットを1にして
               ;Bank1に切替える
   CLRF   TRISA     ;PORTAをすべて出力モードに設定する
   MOVLW  0F0H     ;11110000をセット
   MOVWF  TRISB     ;PORTBは上位4ポートを入力に設定
   BCF   STATUS,RP0  :Bank0に戻る

 

 

下図にRegister Fileの内容を示します。




 (3)プログラムはどこから始まるか
   PICは電源が入った時自動的に「RESET」されます。RESETされるとプログラムは
   アドレス0番地から実行されます。
   従って、プログラムの最初は0番地ということになります。

   これに対して、プログラムが実行中に「割込み」が許可されていると、この割込みが
   入った時には、強制的にアドレス4番地にジャンプします。従って、割込みに関する
   プログラムは4番地から実行されます。そこで、普通プログラムを書く時には下記の
   様にして8番地以降に実際のプログラムを書くようにします。

    ORG  0     ;RESETで0番地から始まる
    GOTO  MAIN    ;0番地はGOTOでMAIN処理へジャンプ
    ORG  4     ;割込みで4番地から始まる
    GOTO  INTERRUPT ;4番地はGOTOでINTR処理にジャンプ

    ORG  8     ;8番地を指定
MAIN  ----   以降実際のMAINプログラム

INTR  ----   以降実際の割込み処理部

 (4)I/Oポートのプログラミング方法
    PIC16C/F84には入出力ポート(I/Oポートという)がAとB全部合わせて
   13ポート用意されています。しかもそれぞれが独立に入力か出力かを
   プログラムで決めることが出来ます。
   以下に具体的なプログラミング方法を例題で説明します。
  

(a)入出力の設定の仕方
  入出力はTRISA、TRISBというSpecial Registerで設定します。
  この各ビットがPORTAとPORTBの各ポートに対応し、入力:「1」
  出力:「0」で指定します。
  また電源ON後やRESET後はすべて「入力」として設定されています。
   BSF  STATUS,RP0 ;STATUSレジスタのRP0ビットを1にして
             ;Bank1(Page1)に切替える
   CLRF  TRISA    ;PORTAをすべて出力モードに設定する
   BSF  TRISA,1   ;PORTAのRA1だけを入力にする
   MOVLW 0F0H    ;11110000をセット
   MOVWF TRISB    ;PORTBの上位4ポートを入力、下位は
             ;出力に設定
   BCF  STATUS,RP0 ;Bank0(Page0)に戻る

(b) 出力の仕方
  (PORTBの下位4ポートが出力とします)
   BSF   PORTB,1  ;PORTBのRB1をHighにセット
   BCF   PORTB,0  ;PORTBのRB0をLowにセット
   MOVLW  0CH    ;00001100をロード
   MVWF   PORTB   ;PORTBの下位に1100をセット
             ;つまりRB0,RB1がLow、RB2,RB3がHigh
   CLRF   PORTB   ;すべてのPORTBのポートをLowにセット

(c) 入力の仕方
  (PORTBの上位4ポートが入力とします) 
   MOVF   PORTB,W  ;PORTBをWレジスタに入力
   MOVWF  DATA    ;入力したPORTBのデータをDATAに格納
   BTFSC  POTRB,RB7 ;RB7をテストしLowだったらスキップする
   GOTO   HIGHWAY  ;RB7がHighのときHIGHWAYにジャンプ
   ???         ;RB7がLowのときにここへスキップする
   BTFSS  PORTB,RB6 ;RB6をテストしHighだったらスキップする
   GOTO   LOWWAY   ;RB6がLowのときLOWWAYにジャンプする
   ???         ;RB6がHighのときここにスキップする

  【注意】BSF、BCFでポートの出力をする場合
     BSF、BCFで出力をするとき例えば、「BSF POTRB,RB0」という命令を
     実行すると実際の動作は下記手順で実行されます。

      ・まずポートBの全ビットをCPUに読み込む
      ・CPUでビット0に1をセットする演算をする
      ・演算結果をポートBに出力する

     つまり出力する前に入力を実行します。その時、たまたま出力電圧
     が低い負荷の場合(トランジスタの直接ドライブの様な場合)には
     出力にHighを出していても約0.7V程度にしかならないため、その
     ポートを入力するとLowとみなしてしまいます。従って、演算結果
     を出力する時にLowとして再セットするため、Highを出力していた
     直接関係無いビットが突然 Low となってしまうという誤動作となっ
     てしまいます。
     これを避けるには、ポートを入力出力混在で使う場合には、MOVWF
     命令で常に全ポートを意識して同時に出力してやることが必要です。
     出力が中途半端な出力電圧になる心配が無いときは気にしなくても
     OKです。




2.プログラムを書く

さて次には実際のプログラムの書き方を説明します。
題材は、ハードウェア編で作ったLED点滅回路を実際に動かすプログラムとします。

(1)フローチャートの作成
   自作ハードウェアに必要な機能を考え、まずは全体のフローチャート
   を描いてみます。

   【例題】LED点滅プログラム
          START
            ↓
          PORTの初期設定  A,Bとも全て出力
        +--→ ↓
        | PORT Aに1を出力  LEDの点灯
        |   ↓
        | 0.5秒間待ち     ループ
        |   ↓
        | PORT Aに0を出力  LEDの消灯
        |   ↓
        | 0.5秒間待ち
        |______|


(2)プログラムを書く
   次に実際にエディタを使ってプログラムを書きます。使うエディタに特に制限は
   ありません。高速でプログラムリスト作成に向いているエディタには下記のよう
   なものがあります。
   「MPLAB」というMicroChip Technology社が出している統合開発環境を使えば
   エディタも含まれているし、そのまま即アセンブルやデバッグもできるので便利
   です。おまけにフリーソフトです。但し、Windows環境でしか使えませんが。

    ・秀丸エディタ(Windows95対応)DOS版もあり
          Nifty Serve  FIBMJ  LIB20 (シェアウェア)
    ・akira32(Windows95対応)
        Nifty Serve  FWINALL LIB08 (シェアウェア)

(3)プログラムの書き方
   ・全体の構成は下記のようにすると分かり易いと思います。

     ヘッダ部分      CPUチップの種類を指定する
                   例  LIST P=PIC16F84
                  includeファイルを定義
                  いつも共通で使う変数をまとめて定義する
                  アセンブラに標準で添付されている。
                   例  INCLUDE "P16F84.INC"
     変数定義       変数名をレジスタメモリに割り当てる
                   例  DATA EQU 0DH
     開始番地定義    プログラムのスタート番地を定義する
                   例 ORG 0       MAIN (main program)
     メインプログラム   同じ繰り返しの部分はサブルーチンとする
                   例  CALL SECTIM
     サブルーチン     何回もメインプログラムで使う部分を
                  サブルーチンとしてまとめる。
                   例  0.5秒待ちルーチン

(4)プログラムリスト例
  ダウンロードし解凍したあと普通のエディタで見て下さい。

      ★LED点滅制御のプログラムリスト

  【命令一覧表】便利な道具
    PIC16C84/PIC16F84の命令をA4用紙1枚の一覧表にまとめたもので
    プログラミングするときに便利です。
    MS-WORDの文章になっています。解凍後MS-WORDで印刷して下さい。

        ★命令一覧表


3.アセンブルする
  プログラムを書き終わったら次ぎはアセンブル作業です。このアセンブルとは
  人間が書いた記号のリストから、機械語に変換し、ROMに書き込めるデータに
  変換する作業のことを言います。

 (1)開発用ソフトを手に入れる
   開発用ソフトはマイクロチップテクノロジー社のwwwからダウンロード
   するのが最新版が入手でき、また無料のフリーソフトであることから
   最も便利と思います。
   現在入手できるものには下記のような開発ツールがあります。

* MPLAB-IDE
* MPASM

    ここで MPLAB がWindows上で実行できるエディタ、アセンブラ、
    シミュレータを一体化したものですので便利です。
    またこれらの説明書は英語版ですが上記からダウンロードできます。


 (2)アセンブルする
   上記で入手したMPLAB(アセンブラを含む)を使って、書いたプログラムを
   アセンブルします。
   MPASMの場合には、アセンブラを起動すると設定画面が現れるので、CPUの種類と、
   CASE Sensitiveをオフ、出力フォーマットをINHX8Mに設定します。
   
    このアセンブル結果が”error 0”になるまで繰り返します。error が出る間はリストに
   何か間違いがあるということです。根気良くつぶしましょう。
   (例題ではWarning Messageが1個所残りますが気にしなくて大丈夫です)
   errorが無くなると自動的にオブジェクトファイル(*.hex)が作成されます。このファイル
   がPICのプログラムメモリに書き込むプログラムのデータとなります。

 (3)シミュレーションする
   アセンブルが”error 0”になったら次はパソコン上でシミュレーションしながら実際に
   実行してみます。 このシミュレーションには上記開発ツールの中の”MPSIM”か
   ”MPLAB”を使います。  MPSIMはDOS版ですのでIBM互換機が必要です。
   このシミュレーションには結構「コツ」が必要でプログラムを作るより難しく感じるかも
   知れません。しかし、実機に実装して動かない時は手探りになりますから、このシミュ
   レータで走らせて確認した方が早く動かない原因を発見することが出来ます。
   このデバッグの詳細については別章の「MPLABの使い方」を参照して下さい。

 (4)プログラム書き込み
   出来あがったオブジェクトファイルを実際のPICのチップに書き込むためには、PICライタ
   と書き込みプログラムが必要になります。 この詳細は別章の「PICライタの作り方」で
   詳細に説明しています。



      目次ページへ