since 2007.8 by K-ichi


PIC24への書き込みと動作の様子
マイコン工作では、8bitのPIC12F675などを使ってきた。ロジックICとは違う世界が広がったわけだが、しかし欲はふくらむもの。
もう少しメモリが、もう少しスピードが……ということで選んだのが、16bit PICであるPIC24FJ64GA004。機能は多くない基本タイプだが、4年前にマルツで200円ちょっとで買えた。

さて、データシート(英語)を眺めてみる。特段の外付け無しで16MIPSの処理能力があるらしい。これは、水晶外付けで頑張った12F675の3倍以上。
命令数は倍増。「普通の条件分岐命令」が存在し、条件の種類も多い。掛け算やバレルシフタもある。Wレジスタが16本もあり、[++W0]などC言語を思わせるようなアドレッシングまでできる。

とりあえず、アセンブラで簡単なテストプログラムを書いてみた。定番のLEDチカチカ(Lチカ)で、1秒ごとにLEDが点滅するもの。
冒頭の映像は、書き込んで動作するまでの様子。ライタはPICkit3を使っている。映像後半では、ライタを外して本来の電源ラインに供給して動作させている。

実際に動くまでには、プログラム作成以上に壁があった。ググってもC言語のページばかり。アセンブラのみで動かす、その手順一通りを記しておく。後の自分のためにも。


■ 下準備:MPLABのインストール ■
まずは開発環境を作らなくてはいけない。
現在はMPLAB X IDE v5.10が最新の環境になる。MPLAB® X Integrated Development Environment (IDE)ページの下の方にDownloadsというタブがあり、そこからダウンロードできる。
当方では数年前にv2.35をインストールしてあったので、今回はそのまま使った。

ここへたどり着くには、トップページから、Products → Microcontrollers and Microprocessors → 16-bit MCUsと進めて、16-bit PIC® Microcontrollers Family Overviewを開く。
Software Development Toolsをクリックすると、MPLAB関連各ページへのリンクが現れ、その中にある。

■ 下準備:XC16のインストール ■
MPLABには、8bit用アセンブラであるMPASMしか入っていない。
16bitPICのC言語環境はC30、アセンブラはASM30などという記述に惑わされたが、現在はすべてひっくるめてXC16コンパイラに統合されている。MPLAB® XC Compilersページの下のDownloadsタブから、v1.35が入手できる。
この最新版を導入したはずだが、MPLAB上ではv1.36と表示されている。

■ MPLAB:プロジェクト立ち上げの際の注意 ■
MPLAB上で何かを作るには、最初にプロジェクトを構築する。
File → New Projectでダイアログを立ち上げ、Choose Project:Microchip Embedded/Standalone Project(デフォルト) → Select Device:PIC24FJ64GA004を選択 → Select Header:NONE(デフォルト) → Select Tool:Pickit3を選択 → Select Compiler:XC16を選択 → Select Project Name and Folder:……、と進める。

最後に設定するpathには、全角文字やスペースは入れない方がいいらしい。コンパイル時にワーニングが出る。ただし、フォルダ名に半角スペースが入ったpathを使っているが、実害は出ていない。
EncodingはUTF-8に変更しておく。これで日本語も特殊文字も使えるようになる。日本語だけならShift-JISでもかまわない。
これら設定は、後でプロジェクトのプロパティから変更することもできる。


プロジェクト立ち上げの最初の画面

プロジェクト立ち上げの最後の画面

■ MPLAB:プログラム作成にはテンプレートを利用 ■
アセンブラソースをいきなり食わせても、エラーを吐いて止まってしまう。コンパイラに渡す手続きなども記述する必要がある。
とりあえず動いてほしいので、ここではテンプレートを利用する。プロジェクトツリーのSource Filesフォルダを右クリック → New → mainasm24f.sを選択する。デフォルトでnewmainasm24f.sというファイル名になる。
これには必要な設定のほか、領域確保や簡単なプログラムも入っている。.text以降にプログラム本体、その前にコンフィギュレーション設定を記述すれば、とりあえず動かせる。

ドットで始まる擬似命令(directive)など、アセンブラに関する情報は、MPLAB XC16 Assembler, Linker and Utilities User's GuideDS50002106D.pdf50002106C.pdfなど)にある。日本語版は見当たらない。


テンプレートはコレを使用

■ MPLAB:Make and Program Deviceがグレーアウトしてる場合 ■
ソースからICへ矢印が刺さっているアイコン(Make and Program Device)をクリックすると、コンパイルから書き込みまでが行われる。
ところがなぜかグレーアウトして押せないことがあった。前項画像のHelpメニューの右下のアイコンがそれで、まさにその状況。
ググってみると、シミュレーション中はグレーアウトする、ような記述がある。それなら赤四角アイコンで停止すればいいが、上の画像はそうではない。

結局よく解らないまま、MPLAB自体を再起動したら押せるようになった。

■ MPLAB:電源供給の確認 ■
デフォルトでは、書き込み時にPICkit3から電源を供給しない。ターゲット側で確保する。
今回は電源も含めてトラブルシュートする意味で、電源とICSP(書き込み)は排他的に接続することとした。したがって、PICkit3から供給するように設定変更する。

プロジェクトアイコンを右クリックしてプロパティを開き、ツリーでPICkit3を選択、Option CategoriesでPowerを選択すると設定画面になる。
Power target circuit from PICkit3にチェックを入れる。電圧はデフォルトの3.25Vのままでよい。


電源供給設定を変更

回路図

■ ハードウェア:ピン番号に注意 ■

PIC24FJ64GA004チップ
QFPの場合、1ピンの角は削られ、丸い凹みも付いている。ただし、少々見づらい。DIPと同じ考え方で、印刷が読める向きに置くと、左下が1ピンになり左回りにカウントアップする。
パターンの取り回し上、基板左上に1ピンを置いているが、読める向きにハンダ付けしてしまった。データシートのピンアサインページのイメージに引っぱられた。

ヒートガンは持ってないので、低温ハンダの記事を読み返しつつ貼り替えることにする。この合金の融点は95℃らしいが、しっかり盛れば十分余裕を持って作業ができる。フラックスは通常のものでよい。
低融点合金は、現在もモリタ直販がもっとも安そう。値段が上がった気がするが、内容物も倍になっている模様。粒形状でよければロシア産が手に入るが、値段は変わらない。いずれも70~80gで1000円しないぐらい。
モリタ万歳!

■ プログラム:16bit PICの仲間たち ■
PICの上位ラインナップは、32bitにPIC32シリーズ、16bitにPIC24/dsPIC30/dsPIC33といったシリーズがある。
PIC32は、MIPSアーキテクチャを使ったもので、従来のPIC系統とはまったく異なるもの。
dsPICは、従来のPICシリーズを拡張整理した上で、DSP処理に適した命令などを持たせたもの。dsPIC33は、dsPIC30をマイナーバージョンアップした3V版になる。
今回使ったPIC24は、DSP関連を削ったdsPIC33のサブセット版で、MCUとしての性能は同等。PIC24にも性能によって、PIC24F/PIC24H/PIC24Eのシリーズ分けがある。

16bitPICの資料を探す際には、PIC24よりもdsPICやdsPIC30/33などで当たった方が見つけやすい。
マシン語ほか詳細については、16-Bit MCU and DSC Programmer’s Reference Manual70000157g.pdf70157d.pdfなど)がある。

■ プログラム:コンフィギュレーションの設定 ■
MPLABには、コンフィギュレーションビット設定のための支援ツールがある。
Window → PIC Memory Views → Configuration Bitsと進むと、右下に一覧が表示される。設定後、Generate Source Code to Outputボタンを押すとソースコードが生成されるので、それをコピペして使う。
ただしこれはC言語用。アセンブラ用は出てこないので、手で書くしかない。

各ビットの定義は、インクルードファイルの後半にある。同時に、その解説や設定方法も書かれているので、それを参考にする。
インクルードファイルは、標準的なインストールであれば、C:\Program Files (x86)\Microchip\xc16\v1.36\support\PIC24F\incあたりに、<デバイス名>.incというテキストファイルとして存在する。
なおこのファイルは、LF(0AH)だけの改行になっている。メモ帳では改行されないので注意。

MPLABでは、Cファイル内で#pragmaで設定(上記MPLABで生成されたもの)することを推奨している。
インクルードファイル内ではconfigというマクロが定義されているが非推奨という。とはいえ今回はアセンブルファイルにまとめたかったので、マクロは使わないがそれと同様の設定方法で記述した。

■ プログラム:アナログ入力の無効化 ■
8bitPICでもおなじみの嵌まりポイント。
PICの多くのピンはアナログ入力と併用されている。アナログ入力を切らないとデジタルI/Oとしては使えない。

■ プログラム:レジスタ名などは大文字で ■
インクルードファイル内でレジスタ名などが定義されているが、これは大文字になっている。したがって大文字で書く必要がある。
ニーモニックやWレジスタは小文字でも構わない。

■ プログラム:実際に使ったプログラムについて ■
単にテンプレートに追記する形をとったので、無駄な部分もあるが置いておく。ポイントのみ抜粋し以下に記す。

<newmainasm24f.s>
/*
 * File:   %<%NAME%>%.%<%EXTENSION%>%
 * Author: %<%USER%>%
 *
 * Created on %<%DATE%>%, %<%TIME%>%
 */

        .include "p24Fxxxx.inc"

エラーが出そうだが、インクルードファイル名はこのままで通った。特定デバイス名にしなくても問題ないらしい。
p24Fxxxx.inc内では、各デバイス用のインクルードファイルを呼び出している。プロジェクトを立ち上げる際にはデバイス名を指定しているので、それがどこかで定義に使われていると思われる。

<<<中略>>>

.textの前にコンフィギュレーション定義を、後にプログラム本体を置く。追記したのは、この2箇所のみ。
コンフィグ設定は.textの前に置かないと、Link Error: region CONFIG1 is fullのようなエラーになる。

__reset:からの部分は既存のまま。スタックポインタ定義で、特にこだわりがなければこのままでいいらしい。適当な値をリンカが設定してくれる。

.section __CONFIG2.sec, code
.global __CONFIG2
__CONFIG2: .pword POSCMOD_NONE & I2C1SEL_PRI & IOL1WAY_ON & OSCIOFNC_ON & FCKSM_CSDCMD & FNOSC_FRCPLL & SOSCSEL_SOSC & WUTSEL_LEG & IESO_ON
.section __CONFIG1.sec, code
.global __CONFIG1
__CONFIG1: .pword WDTPS_PS32768 & FWPSA_PR128 & WINDIS_ON & FWDTEN_OFF & ICS_PGx1 & BKBUG_OFF & GWRP_OFF & GCP_OFF & JTAGEN_OFF

;..............................................................................
;Code Section in Program Memory
;..............................................................................

.text                             ;Start of Code section
__reset:
        MOV #__SP_init, W15       ;Initalize the Stack Pointer
        MOV #__SPLIM_init, W0     ;Initialize the Stack Pointer Limit Register
        MOV W0, SPLIM
        NOP                       ;Add NOP to follow SPLIM initialization

        CALL _wreg_init           ;Call _wreg_init subroutine
                                  ;Optionally use RCALL instead of CALL

以下が、Lチカ本体。
32MHz化、アナログポート無効化、全ピン'0'出力、としたのち、約1秒待ち、RC0='1'で点灯、1秒待ち、RC0='0'で消灯、を繰り返す。

        ;<<insert more user code here>>

        clr  CLKDIV       ;set 8MHz&4xPLL
        mov  #0xffff,w0
        mov  w0,AD1PCFG   ;set all ANx to digital mode
        clr  LATA         ;clear all I/Os
        clr  LATB
        clr  LATC
        clr  TRISA        ;set all I/Os to output mode
        clr  TRISB
        clr  TRISC
loop:
        call wait
        bset LATC,#0
        call wait
        bclr LATC,#0
        bra  loop
wait:
        clr  w0
        mov  #81,w1
0:      dec  w0,w0
        bra  nz,0b
        dec  w1,w1
        bra  nz,0b
        return


<<<中略>>>

;--------End of All Code Sections ---------------------------------------------

.end                               ;End of program code in this file

0 件のコメント:

コメントを投稿

.

関連記事


この記事へのリンク by 関連記事、被リンク記事をリストアップする」記事

ブログ アーカイブ