PIC24への書き込みと動作の様子
もう少しメモリが、もう少しスピードが……ということで選んだのが、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 Guide(DS50002106D.pdf、50002106C.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のままでよい。
■ ハードウェア:ピン番号に注意 ■
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 Manual(70000157g.pdf、70157d.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 件のコメント:
コメントを投稿
.