PICの開発環境

  1. MPLAB

    1. MPLAB

      MPLABはエディタ、アセンブラ、デバッガ、等を含むPICの開発環境で、一部(エディタ、アセンブラ、デバッガ)は無償で提供されています。

    2. ダウンロード

      マイクロチップのwebページから、最新版をダウンロードします。
       http://www.microchip.com/1010/pline/tools/picmicro/devenv/mplabi/mplab6/index.htm
      現在の最新版は6.4で、mp64o.zip をダウンロードします。Lhasa等のツールで解凍すると、MPLABv6.4.EXE が現れます。

    3. インストール

       MPLABv6.4.EXEダブルクリックすると、セットアップが開始されます。問い合わせに対しては、すべて next で良いでしょう。必要があればインストール先を指定できます。
       セットアップの後半で USBdriver の組み込み画面が現れます。next で次に進み、endで終了します。USB組込用のwebページは無視してかまいません。

    4. プログラム作成の流れ

       プログラムはソースファイルをアセンブルして機械語に変換します。可能なら、デバッガでその動作をシミュレーションします。作成したプログラムをPICライタで書き込みます。


  2. プロジェクトの作成

    1. MPLABの起動

       MPLAB.exeのロゴ( )を ダブルクリックして、起動します。 メニューは英語です。
      ProjectメニューのProject wizard を選択し、プロジェクトを生成します。最初に、「selectDevice」で利用する PIC の型番を選択します。ここでは、16F628A を選択します。次は 「languagetool suite」の選択です。「Active Toolsuite」として、アセンブラを用いる場合 MicroChip MPASM Toolsuite を選択し、「Toolsuite contents」に MPASM Assembler を選択します。
       次の画面で、生成するプロジェクトの位置と名前を指定します。「Browse」を選択しプロジェクトを置くフォルダを指定し、「Projectname」にプロジェクト名を設定します。ここでは[PortA2B」を指定します。英語版なので、漢字を利用すると文字化けします。
       次は、プロジェクトに加えるファイルを選択する画面となります。予め作成しているファイルがあれば、ここで指定します。後から追加することもできますから、ここでは 「次」を選択します。「Summary」が表示され、「完了ボタンで「完了」します。

    2. ソースファイルの作成と追加

       Fileメニューの「new」で、アセンブラのソースファイルを作成し、「save」メニューで .asm の拡張子で保存します。このとき、フォルダの名前を含めて漢字を使用すると、正常に保存できません。
       保存したソースファイルを project メニューの「add file to project」でプロジェクトに追加します。viewメニューで、「project」をチェックすると、.SourceFile に追加した asm ファイルが表示されます。これをクリックすると、ソースファイルが表示されます
       フォントを指定しないと、漢字は文字化けします。


       ソースを入力するとき、、ラベル、命令、オペランドの間にTabを入力すると、空白がTabの倍数で設定できます。Tabの値は初期設定では4ですから、次のように 8 にすると、例のような画面になります。

       ラベル Tab 命令 Tab オペランド ; 注釈

      の順に入力します。listやincludeは「命令」扱いなので、先頭にTab(または空白)を入力しないと、警告メッセージがでます。
      ここでは、以下のプログラムを入力して下さい。漢字の変換窓は入力ウインドウの外に現れます。漢字の部分は、下の画面から、コピー&ペーストして下さい。
       __CONFIG は PIC へのコンフィグレーション(構成)の設定で、内部クロックの利用(_INTRC_OSC_NOCLKOUT)と電源ON時のリセット(_PWRTE_ON)を指示しています。

      ;*********************************************
      ; PIC16F628
      ; RA3,2,1にスイッチを接続
      ; RB1,2,3に発光ダイオードを接続
      ; RAのスイッチで発光ダイオードを点滅する
      ;*********************************************
      LIST P=16F628, ST=OFF, R=DEC, F=INHX8M
      INCLUDE P16F628.INC
      
      __CONFIG _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _CP_OFF
      
      
      ;  メインルーチン
              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           ;RB3,3,1,0を出力に
      
              bcf     STATUS, RP0     ;BANK0に戻す
      
      ;ポートAから入力し、ポートBに出力、
      LOOP
              movf      PORTA,W 
              movwf   PORTB
      
              goto     LOOP
      ;               
              end
              

    3. フォントなどの調整

       フォントの調整しないとソースファイルの漢字が正しく表示されません。Editメニューの「properties」で、メニューを出します。
      Editor Option の「Editor」メニューで、Linenumberをチェックすると、行番号が表示されます。「Text」タブの「selectFont」で表示フォントを指定できます。ここでは「MS ゴシック」の 10 points に設定します。
       また、「chooseColor」で、reserbed word の bold(太文字) の設定をはずし、「tabs」の設定で 「Tab Size」を8にすると読みやすくなります。


    4. ソースの入力

      ソースを入力するとき、、ラベル、命令、オペランドの間にTabを入力すると、空白がTabの倍数で設定できます。Tabの値は初期設定では4ですから、次のように 8 にすると、例のような画面になります。

       ラベル Tab 命令 Tab オペランド ; 注釈

      の順に入力します。listやincludeは 命令 扱いなので、先頭にTab(または空白)を入力しないと、警告メッセージがでます。
      ここでは、以下のプログラムを入力して下さい。漢字の変換窓は入力ウインドウの外に現れます。漢字の部分は、下の画面から、コピー&ペーストして下さい。

      ;*********************************************
      ; PIC16F628
      ; RA3,2,1にスイッチを接続
      ; RB1,2,3に発光ダイオードを接続
      ; RAのスイッチで発光ダイオードを点滅する
      ;*********************************************
      LIST P=16F628, ST=OFF, R=DEC, F=INHX8M
      INCLUDE P16F628.INC
      
      __CONFIG _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _CP_OFF
      
      
      ;  メインルーチン
              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           ;RB3,3,1,0を出力に
      
              bcf     STATUS, RP0     ;BANK0に戻す
      
      ;ポートAから入力し、ポートBに出力、
      LOOP
              movf      PORTA,W 
              movwf   PORTB
      
              goto     LOOP
      ;               
              end
              

    5. アセンブル

       Projectメニューの「make」でアセンブルを実行します。エラーや警告が「output」に表示されます。エラー表示の行をダブルクリックすると、ソースファイルの対応する行にカーソルが移ります。


      エラーがあると、赤色の表示がでます。
       Error[108] G:\PIC\EX\PORTA2B\PORTA2B.ASM 18 : Illegal character (0)
      のように表示されます。18 が異常を検出した行番号です。Warning は「警告あるいは注意」の意味で、多くの場合実行には支障はありません。プログラムを修正して、make し直して下さい。

  3. デバッグ機能

    1. デバッガ

      デバッガは作成したプログラムをシミュレーションする機能です。外部に接続された回路の動作はシミュレーション出来ませんが、命令の実行によるレジスタの変化や、外部から入力される値を設定することはできます。

    2. Toolの選択

       debuggerメニューで 「select Tool」を選択し、メニューから MPLAB SIM をチェックします。これはソフトウエアシミュレータで、作成したプログラムをソフトウエアでシミュレーションして実行します。実行時間や実際の入出力は実行できませんが、プログラムの理解や確認には有効です。

    3. ステップ実行

       アセンブル後、Debugerメニューの「stepInto」で一命令づつ実行することができます。F7キーでも同じ処理をします。これで、1命令単位のプログラムの実行の様子やレジスタの値の変化を観察することができます。

    4. View機能と値の変更

       view機能で、デバッグ中のレジスタファイルやEEROMの内容、各SFRの値やプログラムメモリの内容を表示することができます。また、レジスタやEEROMの表示されている値をクリックして、値を変更することもできます。
       「View」メニュで「watch」を選択します。下のウインドウが現れます。Add SFR の横の▼ボタンを押し、メニューからPORTAを選択し、Add SFR ボタンを押します。どうように、TRISA、PORTB,TRISB を追加します。

      これで、ステップ実行でレジスタが変化する様子を確認できます。変化した値は赤字で表示されます。

    5. 例1

       プログラムを出バックしている様子です。次に実行する命令が、ソースリストの緑の → で表示されています。右の watch 画面でレジスタの値が表示されています。

    6. Stimulas:入力信号の設定

       このままでは、PORTAの値は0のままです。
       デバッガには、SFRの指定した信号の値を設定する機能があります。「Debugger」メニューの「Stimulas」を利用すると、各端子の値を変更できます。選択すると、つぎのウインドウが開きます。

       「AddRow」ボタンで行を追加し、Pin番号とActionを設定し、「Fire」ボタンを押すと、信号がセットされます。

    7. 例2:連続番地への書込み

       次の例は、レジスタファイルへの連続書込みです。wdataは書き込む番地、dcountは書き込む個数、startsは書き込む先頭番地を指定します。最初に、22をFSRに、0をwdataに、6をdcountに初期設定します。
       nextからは繰り返し処理で、まず、wdataをINDFに書き込むことで間接的にレジスタファイルに書き込みます。次にFSRとwdataを増やし、dcountを減らします。dcountを減らすとき、スキップ機能を利用し減らした結果0でないとき、nextへ戻します。

      ;indirect access
              List    p=pic16F628A
              include "p16F628A.inc"
              
      wdata   equ     20h
      dcount  equ     21h
      starts  equ     22h
      
              org     0h
              movlw   starts
              movwf   FSR    ;先頭番地
              movlw   0
              movwf   wdata  ;書き込むデータ
              movlw   6
              movwf   dcount  ;書き込む個数
              
      next    
              movfw   wdata    ;書き込む値を設定  
              movwf   INDF      ;書き込む
              incf    FSR,F    ;番地を増す
              incf    wdata,F  ;書き込む値を増す
              decfsz  dcount,F  ;個数を減らす、スキップ
              goto    next      ;繰り返す
      loop    
              goto    loop
              end

       実行後のレジスタファイルの値を示します。これは、View メニュの 「FileRegister」で表示されます。

       20h番地が書込むデータ、21h番地が残りの個数、22h番地以後が書き込んだ値です。

    8. 変数の値

       デバッグ処理中に、ソースリストの変数にマウスを置きクリックすると、変数の値が表示されます。

    9. ブレークポイント

      ステップ処理では、長いプログラムの処理に手間がかかります。Debugメニューで 「run」 を選択すると、連続実行ができますが、これでは途中結果が確認できません。そこで、「ブレークポイント」を利用します。プログラムの指定行に予め「ブレークポイント」を設定しておきます。デバッグの「run」実行中に、「ブレークポイント」に到達すると、実行を一次中断します。ここで、各種の値を確認することができます。
       リストでブレークポイントを設定したい場所をマウスで指定し、右クリックをすると、「set Berak Point」のメニューが出ます。また、「Debugger]メニューの「BreakPoint」を選択すると、BreakPointsウインドウが表示され、現在のブレークポイントが表示されます。ここで、Break at に 「設定したい番地」を入力します。
       また、ブレークポイントの前のチェックをはずすと、一時的の無効にすることができます。
       

    10. ストップウオッチ

       ストップウオッチはブレークポイント間の経過時間を表示する機能です。まず、DebuggerメニューのsとpWatchで、StopWatchウインドウを表示します。clockFreqency(クロック周波数)を設定してます。 

       Zeroをクリックすると、Instruction Cycles を0にします。以後、ステップ処理やrunで実行した命令数を Instruction Cycles に累積し、クロックから計算できる実行時間を Time に表示します。

  4. アセンブラの出力

    1. 機械語

       View メニューの 「programMenu」 で、16進表示された機械語を見ることが出来ます。

      また、この値は PORTA2B.HEX ファイルに書き込む番地やチェック用の数値と共に記録されています。

      :1000000007309F0083160F308500F0308600831282
      :0600100005088600082827
      :02400E00103F61
      :00000001FF

      このファイルを、プログラムライタに渡すことで、プログラムの書き込みが実行できます。行の先頭2バイトがデータ数、次の4バイトが書き込み番地、以後は書き込みデータです。第一行は、0番地から0x10個の書き込みデータを、2行は0x0010番地から6バイトのデータがあります。なお、1命令は12ビットですから、ここでは1命令2バイトで表現され、下位バイトが先に記録されています。
       最後の400E番地からの2バイトはコンフィギュレーション(構成)ビットです。