PICKIT3を使ってみよう
by K.I
2010/03/16〜2010/03/24
Index
- 久々にPICでも弄ってみようかと思ったんだけど、 JDMプログラマが調子悪いので、調べてみると秋月でPICKITを売っている。
- それじゃ、この際、純正のライタというやつを買ってみようか、ということで。
- PICKIT2とPICKIT3があるんだけど、いろいろ調べるとあまり差はなさそうだし、PICKIT2の方が安いし、情報が多いし
- で良さそうなんだけど、迷ったけど赤いのでPICKIT3にしました。まぁ、新しい方が良いかも1ということで。
→ケーブルも赤い。。
- よく分からないので、ちょっと高いけどPICKKIT3デバッグエクスプレスって奴にしました。
- うーん。この名前からすると、PICKIT3はデバッガの機能も持っているのかな?
1実際、PICKIT3の方が書き込みがちょっと速いらしいので、良かったのかも。価格の差の分があるかどうか分からんけど。
[top]
- MPLAB-IDEv8.36をインストール
- 途中でFiles in UseのWarning?が出るが、「Ignore」する。
- QuestionのDialogで、HI_TECH Cのインストールをするか聞いてくるので、「はい」とする。
- Hi-Tech C のLite版がインストールされるようだ。
- 自分は、CCSCの方が慣れてるけど、せっかくなので今回はHi-Tech Cを使ってみよう。
- とりあえず、お手軽にということで、8ピンの12F683という奴を使ってみる。
- 使うの初めてだけど、最近はポピュラーな石らしい。12F675とかと比べて機能アップしてるようだ。
- PICKIT3用に、L型ヘッダ2を付けてブレッドボードに配線してみた。
→配線は簡単!
- PICKIT3と12F683の接続は、以下のようにする。
PICKIT3ピン番号 | PICKIT3端子名 | 12F683ピン番号 | 12F683端子名 |
1 | ▼Vpp/MCLR | 4 | MLCR |
2 | Vdd | 1 | Vdd |
3 | Gnd | 8 | Gnd |
4 | ICSPDAT/PGD | 7 | ICSPDAT |
5 | ICSPCLK/PGC | 6 | ICSPCLK |
6 | LVP | | |
- ターゲットのPICの各端子に接続すればOK。
- LVPピンは接続しなくて良い
- MCLR端子は、4.7k〜10kΩ程度の抵抗でプルアップする。
- あと、1kΩの抵抗を通して、GP2(5pin)にLEDを接続しておく。
#include <htc.h>
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif
void main(void){
TRISIO = 0xFA;
OSCCON = 0x61; //4MHz Internal OSC
while(1){
__delay_ms(125);__delay_ms(125);__delay_ms(125);__delay_ms(125); //500ms delay
GPIO = 0x04;
__delay_ms(125);__delay_ms(125);__delay_ms(125);__delay_ms(125); //500ms delay
GPIO = 0x00;
}
}
Hi-Tech Cでは、クロック単位のディレイルーチン _delay を使えるようだ。
- us単位の __delay_us と、ms単位の __delay_ms も用意3されている。
但し、500ms,250msを指定したら、大きすぎると言われたので、
- このプログラムでは、500msのディレイのために125msを4回読んでいる。
GPIOのbit2にLEDを接続しているので、0と1を代わりばんこに出力してるだけだ。
- 早速、ブレッドボードのL型ヘッダに、PICKITを接続する。
→接続も簡単だ
- Programmerメニュー→Select Programmer→PICkit3を選択
PK3Err0045: You must connect to a target device to use PICkit
うーん。接続してあるし、PICKIT3のコネクトは出来てるのに、何でだろう?
- Programmerメニュー→Setting→Powerタブで、Power target circuit from PICkit3を選択、電源を供給するようにして、OK。
- PICKIT3から電源が供給出来るし、簡単に使えるから良いな〜。
- デバッガも使えるんだろうか?
- Debuggerメニュー→Select Tool→PICkit3を選択
- Programmer In Useのダイアログが出る。プログラマの代わりにデバッガを繋ぐかどうか聞いてくる
- つまり、プログラマかデバッガのどちらかしか起動出来ないってことか。
- デバッガもプログラマと同様に、電源を供給する場合は、
- Debuggerメニュー→Setting→Powerタブで設定しておく必要がある。
A debug header is required in order to debug this part.
Please make sure you are using the header part before continuing.
Press OK to continue or Cancel to quit.
うーん。つまり、デバッグヘッダというものが必要だよ!と言っているようだ。
- ググって見ると、多くのデバイスはデバッグヘッダというものが無いとデバッグ出来ないらしい。
- 例えば、12F683はデバッグ用の端子を持たないが、12F683用のデバッグヘッダには、12F683にデバッグ機能が追加されたデバイスが搭載されている。
- デバッグヘッダには8ピン端子が出ているので、それをデバッグ対象の基板の12F683の代わりに挿せばデバッグが出来るというわけらしい。
- 12F683用のデバッグヘッダは、 AC162058という品番らしい。
- でも、ちょっと高いなぁ。PICKIT3だと接続ケーブル( AC164110 )も必要みたいだし。
- まぁ、ケーブルぐらいは自分で作っても良いのかもしれないけど。
- デバイス毎に、別のデバッグヘッダが必要というのは、ちょっと面倒だなぁ。
- まぁ、12F683は使いでがありそうだから、よく使うなら持ってても良いかもしんない。
22列のL型ヘッダの短い方のピンを抜いて1列にしたもの。
3includeディレクトリの、pic.hを参照。
[top]
- お米粒のように小さい、10F2xxのSOT23パッケージを使ってみる。
- 以前、買ったんだけど放っておいたAC163020がやっと使えるな〜。
- 10F2xx用のユニバーサルプログラマアダプタ。
- PICKIT,ICD,BFMPのいずれかのライタでも、10F2xxを書き込むことが出来る基板。
- PICKIT2でも使えるということなので、PICKIT3でも使えるだろう。
- MicroChipの資料によると、AC163020のBFMP端子の1番ピンは上の方だと書いてあるんだけど、
- 自分でテスターで確認したところでは、PICKIT3の1番ピン(MCLR)はBFMP端子の下の方になるようだ。
- Internetを探し回ったが、見つからないので、
- とりあえず自分で、全端子のピン割当てを調べてみた。
- このボードでは、ICDやBFMP,PICKITのいずれを使っても、PIC10F2xxに書き込み可能。
- BFMP端子から、PICKIT2,PICKIT3の書き込みも出来るはずだ。
- ADAPTERの処には、基板の裏側にICソケットが付いてるので、オス-オスのピンソケットを使って
- この基板のまま、ブレッドボードに挿してデバッグすることも出来る。
- ADAPTERのピン配置は、何故か10F2xxの8ピンタイプのピン配置じゃなくて、
- 16F683等の8ピンタイプのピン配置と同じになってるので注意。
- 今回はブレッドボードを使うのも面倒なので、DIP8のソケットを利用して、抵抗とLEDを接続してみた。
- 上の8ピン以外は、NCなので自由に使える。→でも接続はされていないので、ICクリップで繋いだ。
→GP2にLEDを接続したので、PICKIT3を繋いだままデバッグできる
- 12F683と同じLED点滅プログラムを使ってみる。でも、デバイスによる違いがあるので、以下の変更。
- 10F2xxの場合、I/O設定はTRISIOではなく、TRISGPIOになる。
- OSCCONというレジスタは無いので、その設定はいらない。
- 調べてみると、GP2はT0CKI(外部タイマクロック)が優先なので、設定しないとI/Oポートとして使えないらしい。
- 12F683の時は、なんで設定しなくて大丈夫だったんだろう?まぁ、ちょっと仕様が違うのかな。
- ということで、OPTIONレジスタを0xC7に設定。
- でも、それでもダメ。試しにループの前で点灯させてみると、ちゃんと点灯する。
- ということは、delayルーチンが使えないのかなぁ。10F2xxはスタック2段だからサブルーチン使えないとか。
- でもなぁ、delayルーチンはマクロだから、せいぜい1段ぐらいしか使わないだろうし。
- それともdelayが長すぎるとか。まぁ、いくら10F2xxの規模が小さいからって、そんな制限はなさそうだけど。。
- 試しに、__delay_ms(10)とかにしてみると、delayの後でも点灯するみたい。
- あれ、なんでdelayを小さくすると動くんだろ?うーん。それに、1回目のディレイの後の設定しか効かない。。???
- 最初の方しか動いていないのか。。あっ、そうかWatchDogタイマだ。
- これに気が付くのに、丸一日悩んでしまいました。→GP2のT0CKI以外の設定をいろいろ疑ってた。
#include <htc.h>
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif
void main(void){
int i;
OPTION = 0xC7;
TRISGPIO = 0xFA;
GPIO = 0x00;
CLRWDT();
while(1){
for (i=0; i<50 ;i++) { __delay_ms(10); CLRWDT(); } //500ms delay
GPIO = 0x04;
for (i=0; i<50 ;i++) { __delay_ms(10); CLRWDT(); } //500ms delay
GPIO = 0x00;
}
}
- つまり、WDTが動作しているので、WDTを時々クリアする必要がある。そうしないと、
- 勝手にリセットが掛かって、初めからプログラムをやり直すということを繰り返していたという事でした。
- これでちゃんと動作するようになった。でも__delay_msの値を16より大きくすると、点滅しなくなる。
- 10F200のデータシートをみると、電源投入時18ms遅延があるということなので、まぁ、そんなもんか。
- そもそも、PICはCONFIGレジスタを設定しなきゃいけないんだけど、
- Hi-Tech Cは、どうやって設定するんだろうと思っているうちに、12F683は設定なしで動いちゃったので忘れてた。
- Hi-Tech Cのマニュアルによると、__CONFIGマクロを使えば良いらしいけど、問題は()の中身だな。
- Hi-Tech Cの、includeディレクトリのpic10f20x.hの最後の方に、CONFIGの設定4がある。
- つまり、複数の設定があったら、&で繋げば良いってこと。
- 結局、CONFIGレジスタを設定すれば、LED点滅プログラムは、16F683と同様に以下のように書ける。
#include <htc.h>
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif
__CONFIG(MCLRDIS & WDTDIS & UNPROTECT);
void main(void){
OPTION = 0xC7;
TRISGPIO = 0xFA;
while(1){
__delay_ms(125);__delay_ms(125);__delay_ms(125);__delay_ms(125); //500ms delay
GPIO = 0x04;
__delay_ms(125);__delay_ms(125);__delay_ms(125);__delay_ms(125); //500ms delay
GPIO = 0x00;
}
}
16F683も、本当はこんな風に、ちゃんとCONFIG設定しなきゃダメってことか。
4この設定はデバイス毎に違うので、確認する必要がある。
[top]
- PICKIT3は、ライタとして高速だし、すごく気に入ったんだけど、ほんとはデバッガとしての機能もあるんだよね。
- 使ってみたいけど、デバッグヘッダを持っていないしなぁ。。
- でも、どうやら16F88は単体でデバッグ機能が使えるらしい。ほんとかな?
- 16F88も、やっぱりブレッドボードで、簡単に配線する。
- デバッグ機能を使うからといって、普通のICSPの配線と特に違いは無い。
- 16F88のデータシートを眺めて、関係ありそうな設定は、
- OSCCON = 0x60; // Internal RC Osc 4MHz
- ANSEL = 0x00; // All Degital I/O Select
- CMCON = 0x07; // Comparator OFF
- CVRCON = 0x00; // CVR OFF
- ADCON0 = 0x00; // ADC OFF
- CMCON,CVRCON,ADCON0は、リセット時に設定されるが、少なくともOSCCONとANSELの設定は必要。
- CONFIGURE設定は、やはりincludeディレクトリのPIC16F87.hを、まず確認する。
- 今まで通り、書き込んでみると、LEDはちゃんと点滅した。
- しかし、LEDの光り方が、なんか不安定だ。手を近づけると点滅が止まったりする。
- 何だこれ?どっかの端子がフローティングになってるような動きだ。
- OPTIONを0x00に設定して、RBボートをプルアップしたりしても変わらない。
- Debuggerメニューから、SelectToolで、PICkit3を選択、
- Setting→Powerタブで電源を供給するようにして、改めてリビルドする。
- それで、Debuggerメニューから、Runすると安定して点滅動作するようになった。
- デバッガをONにすると、Debuggerじゃないと、ちゃんと動作しないのかな?まぁ、いいや。
- DebugメニューからHaltして、Step動作させようとしたら、そのまま操作不能になってしまう。
- ちょっとググって見ると、どうもデバッガを使う時は、MCLRをOFFにしちゃダメらしい。
- CONFIG設定で、MCLRENにして、書き直してみる。
- PICGAMES.ORGさんの情報によると、MCLRをOFFにして書き込むと、それ以降書込みも出来なくなっちゃうらしい。
- 自分はちゃんと書き直せたみたいので、どうもPICKIT3ではそこらへん改良されたのかもしれない。
- とにかく、これでステップ動作できるようになった。やった〜!
- しかしステップで、delayルーチンに入るとやたら時間が掛かるなぁ。。というか戻ってこない。。。
- なんか良く見ると、delayの処で変なエラーが出てる。
PK3Err0033: 4 bytes expected, 2 bytes received
Stepping target failed
ようするに、Debugger-to-PC Communication Error らしい。
まぁ、とりあえず、これで何とかデバッグできるようになった。
- Haltすれば、レジスタの値とか見れるし、便利!だと思う。
- デバッガを使う時は、ICSPのデータとクロック、それにMCLRの3本の端子を使うらしい。
- 結局、プログラマを使う時と基本的に同じということか。。
- delayでエラーになっちゃったり、ちょっと問題もありそうなんだけど、
- 現状では18ピンでポピュラーな、16F88で簡単にデバッガが使えるのは、素晴らしい!
- 書込み速度は、デバッガ時はちょっと遅くなる感じだけど、まぁこれは仕方がないかな。
- 基本的には、PICKIT3の使い心地は、けっこう満足している。
- でも、デバッグエクスプレスのボードは、自分的にはあまり使わないかも。
[top]
- 後から、いろいろ試した時に引っ掛かったことをメモしておく。
The following memory regions failed to program correctly
16F785のRA1端子をVREF出力として使っていたので、回路的に0.1uFの容量が付いていた。
- RA1はICSPCLK端子でもあるので、試しに10kΩを通して0.1uFを接続するようにしたら書込めるようになった。
- 書込み時には、ICSP端子はフリーに出来るようにしなきゃダメかもしれないなぁ。
- 今まで書込めていたのに、突然こんなエラーが出るようになった。
PICkit 3 Connected.
The overcurrent logic has detected a fault condition on
either VPP or VDD. Please disconnect your circuit check
MCLR or VDD for a short circuit and then reconnect. Also,
ensure that your target current requirements do not exceed
the specified limits.
- 回路のショートを確認したが、特に問題が無い。
- PICkit3のみ接続して、再コネクトしても出る。
- 結局、USBハブの電源が抜けていただけでした。
- つまり、USB電源の電圧が低下して、それを検出したらしい。
- GP5だけ、どうしても出力設定に出来ない。
- 12F683の場合、GP3はinput onlyだが、何故かTRISIOを設定しても、GP5がフローティング状態になっている。
- 初期設定は、以下のようにした。これで十分のはずなんだけど。。
TRISIO = 0xCC; // GP0,1,4,5を出力設定
CMCON0 = 0x07; // コンパレータをOFFに
ANSEL = 0x00; // 全端子をデジタルI/Oに設定
- 結局、Configレジスタの設定が間違っていた。
- RCIOは、外部RC発振なので、GP5が入力になるらしい。
- GP5が開放でも、発振はするようで、動いていたので間違いに気が付かなかった。
- GP5以外は、普通に入出力出来ていたので、さらに分り辛かった。。。
- MicroChipから、PICKIT3用のスタンドアロンの書込みツールも出たみたいです。
- これで、HitechC以外でもデバイスの書込みは普通に出来ると思います。
- HitechCで、 EEPROMの読書きをやったことが無いので調べてみた。
- EEPROM_READ(adrs), EEPROM_WRITE(adrs,data)というマクロを使えば良いらしい。
- でも、 air_variableさん、 浜松工房さんの記事を見ると、マクロなのでそのまま使うとメモリを無駄にすることがあるらしい。
- これは貴重な情報だ。忘れないように、メモしておこう。
- ちなみに初期値を設定するには、__EEPROM_DATA()マクロで、0番地から8wordづつ定義すれば良いらしい。
- コメントでTomyさんから、PICKIT3で電源供給する場合に、設定した電圧より低いという情報があったので、
- 150Ωの固定抵抗と、1kΩの可変抵抗器を直列にして、負荷とした。
- 計算上は、5V/150Ω=33.33mA〜5V/1150Ω=4.35mAぐらいの電流が流れるはず
電流 | USB電源電圧 |
3.76mA | 5.06V |
5mA | 5.06V |
10mA | 5.05V |
15mA | 5.04V |
20mA | 5.03V |
25mA | 5.03V |
30mA | 5.02V |
- PICKIT3で、電源供給を5Vに設定した場合の電源電圧の低下
- PICKIT3は、2つ持ってるので両方測定してみたが、大体同じ値になっている
電流 | PICKIT3電源① | PICKIT3電源② |
3.53mA | 4.75V | 4.74V |
5mA | 4.74V | 4.74V |
10mA | 4.72V | 4.71V |
15mA | 4.69V | 4.69V |
20mA | 4.67V | 4.67V |
25mA | 4.65V | 4.65V |
28.7mA | 4.64V | 4.64V |
- 無負荷は測ってないんだけど、ほとんど電流流れなくても、既に電圧低下がある。
- 30mA近く流した場合、これぐらいだとPIC自体は多分問題なく動作すると思うが、
- 電圧低下で書込み時にエラーになる場合があるらしい。
- そうなると、書き込み時は負荷の大きい回路を切り離して、書き込む等が必要になるかもしれない。
- 書込みエラーになる場合、PICKITから供給される電源電圧をチェックしてみると良いかも
- 秋月のPICKIT2互換機はもっと電流供給能力があるらしい。
5これは自分のPCのUSBポートの場合なので、ノートPC等は注意が必要。
[top]
[電子工作関連に戻る]