PICのプログラム作成手順

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

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

Bank(Page)はSpecial Registerである「STATUS」レジスタの
「RP0」ビットを書き替えることによって切替えます。

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

 

 

下図に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ポート用意されています。しかもそれぞれが独立に入力か出力かを
   プログラムで決めることが出来ます。
   以下に具体的なプログラミング方法を例題で説明します。
  

@入出力の設定の仕方
  入出力は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)に戻る

A出力の仕方
  (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にセット

B入力の仕方
  (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がバージョンアップされました。

* 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のチップに書き込む
   ためには、ROMライタと書き込みプログラムが必要になります。
   この詳細は別章の「ROMライタの作り方」で詳細に説明しています。

さて次ぎは開発方法の詳細です。


      目次ページへ