So-net無料ブログ作成
検索選択

お試しでPIC24FJ64GA002を動かしてみた [PICkit3]

(2012.11.22)
随分前のことですが、プログラム・メモリとデータ・メモリの大きさに惹かれて、PIC24FJ64GA002を一個だけで購入しました。何を作るという目的があった訳でも無く、単なる”お試し”のつもりでした。

先日、”SDカードを使ったFAT16フォーマットのファイル入出力機能”の実験を思い立ち、PIC24FJ64GA002を部品箱の底から引っ張り出してきました。プログラムは”後閑さん”の所から頂いてきた『これ』を使います。

元のソースを一部(PIC24FJ32GA002用だったり、ICD2用だったりするところを)書き換えて、PICkit3のデバッグ環境に合わせました。コンパイル/リンクまで通ったので、ブレッド・ボードに取り付けたPIC24FJ64GA002にPICkit3を接続して、プログラムを書き込みました。

ここまで順調に進んできたのですが、いざ実行してみるとどうも様子がおかしいのです。設定したブレーク・ポイントで止まってくれません。STOPすると”プログラム・カウンタが読み取れない”とか、”デバイスコンフィギュレーションを見直せ”などと、デバッガのエラーが頻発します。プログラムの書き込みも、予めFLASHメモリをクリアしておかないと、プログラミング・エラーになってしまいました。

『あれ~、PICkit3じゃ上手くデバッグできないとか?』(<==自分がミスしたと思っていない)

訳が判らないままWEB検索を掛けて、こちらの方のページを見つけました。

『ん!Vcap?DISVREG?』
あわてて、マニュアルを見直し、”23.2 On-Chip Voltage Regulator”の記述に気付きました。実は、マニュアルにちゃんと目を通さず、実験を開始していたのです。(コンフィグ設定も”後閑さん”のコードをそのままパクッた)

マニュアル通り、Vcapに10μFのセラコンを付け、DISVREGをVssに接続すると、PICkit3でちゃんとデバッグできるようになったのでした。

お粗末・・・

にほんブログ村 IT技術ブログへ
に

ほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

RB7(PGD)とRB6(PGC)を入力ポートとして使うのはNG [PICkit3]

(2012.02.29)
これまでPGDやPGCはポートとして使用することを避けてきましたが、今回製作したUSB_ControlerではRB7(PGD)とRB6(PGC)をSW入力に使いました。

RB76.pngPGDとPGCを入力ポートとして使った

タクトSWがオフならPICkit3の動作に問題は生じない筈です。そして、マニュアルにある以下の記述も『まぁ、当然のこと』と考えていました。

”All other pin functions are disabled when ICSP. or ICD operation is enabled.”

問題は”ICSP operation is enabledになるのは何時か”ということです。プログラミング中とデバッガでhaltしたときは、PICkit3とターゲット間の通信が発生するので当然”ICSP operation is enabled”だろうと思いましたが、それ以外はPGDやPGCがHi-Zになり入力ポートとして使えるのではないかと思ったのです。

結果は”駄目”でした。Programmerで書き込み後、”Release From Reset”してもPGD,PGCは1.0V位の電圧を示し、Hi-Zにはなりません。つまりPICkit3を外さないとRB7とRB6を入力ポートとして使えないのです。orz

幸いこのSW機能を省いてもUSB_Controlerの動作に支障はないのですが、RB7(PGD)とRB6(PGC)を入力ポートとして使うのはNGです。(追記をご参照下さい)

-----------------------------------------------------------------------------------------
(2012.05.14)
『PICkit3側についているプルダウン抵抗の問題だ』というご指摘を頂き、早速ユーザース・ガイドでPICkit3の出力回路を調べてみました。

PICkit3_circuit.png4.7kでプルダウンしている

”weak pull_upは20kΩ程度のプルアップ抵抗に相当する”と考えるのが良いようで、"PICkit3側でプルダウンされるピン(PGDとかPGCとか)は3.3k以下の外付け抵抗でプルアップするか、もしくはプルダウン型(SWオンでHiになる)にしなければならない”と言うことのようです。ご指摘頂き、有難うございました。
-----------------------------------------------------------------------------------------

にほんブログ村 IT技術ブログへ
に

ほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ

nice!(0)  コメント(4)  トラックバック(0) 
共通テーマ:日記・雑感

要素試作がほぼ終わりました [PICkit3]

USB_Controler(PIC18F2550)とPIC10F322のシリアル通信が実機レベルで動くようになりました。
(パチパチパチ~)

MPLAB SIMを使ってロジックを入念にテストしましたが、”実機テストが一発で通る”という訳には参りませんでした。割り込み処理と割り込みタイミングの関係が思っていたよりも厳しく、割り込み処理の順番を見直し、TMR2割り込みのタイミングを見直して、ようやくステータス・コマンド(PIC18F2550==>PIC10F322)とステータス・レスポンス(PIC10F322==>PIC18F255)の送受が出来るようになりました。

youso_sisaku.PNGシリアル通信ライン

タイミング・マージンがどれくらい確保できているか見極められていませんが、要素試作はほぼ終了しました。いよいよ、コンテストに応募する回路の試作に取り掛かろうと思います。

割り込みハンドラに組み込まれた(by HITECH-C)レジスタの退避復帰処理
interrupt_function:
  movwf	saved_w
  swapf	status,w
  movwf	(??_intsrv+0)
  movf	fsr0,w
  movwf	(??_intsrv+1)
  movf	pclath,w
  movwf	(??_intsrv+2)
  movf	btemp+1,w
  movwf	(??_intsrv+3)
  ljmp	_intsrv

(ここにユーザが定義した処理が入る)

  movf	(??_intsrv+3),w
  movwf	btemp+1
  movf	(??_intsrv+2),w
  movwf	pclath
  movf	(??_intsrv+1),w
  movwf	fsr0
  swapf	(??_intsrv+0)^00h,w
  movwf	status
  swapf	saved_w,f
  swapf	saved_w,w
  retfie


上に示したレジスタの退避復帰処理に凡そ10μS掛かります。PIC10F322の割り込みにはプライオリティ制御が無いので、NCO割り込み(現時点では動いていない)が入るとTMR2やIOCの割り込み処理タイミングが10μS以上遅れる場合が出てきます。これをカバーするだけのタイミング・マージンは無さそうなので、さらに一工夫する必要がありそうです。

にほんブログ村 IT技術ブログへ
に

ほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

USB_Controlerのプログラム(on PIC18F2550) [PICkit3]

PIC10F322から移植したシリアル通信ライブラリがそこそこ動くようになったので、USB_Controler用のプログラムを書き始めました。

さくさく、さくさく・・・

データ・メモリにも、プログラム・メモリにも余裕があるので、気楽に書き飛ばしています。PIC10F322のデバッグでは味わえなかった開放感です。

”いや、気持ち良いなぁ~”
(調子こいていると遠からずズッコケルのですが・・・)

いま暫くは、このまま行かせて下さい。

にほんブログ村 IT技術ブログへ
に

ほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

USB_Controlerのデバッグ(on MPLAB SIM) [PICkit3]

MPLAB SIMでUSB_Controlerのデバッグを開始しました。デバッガも使える(USB_ControlerにはPIC18F2550を使っている)のですが、以下に示すメリットがあるため、”MPLAB SIM+Stimulus”でロジックのデバッグを行うことにしました。

<MPLAB SIM+Stimulusのメリット>
(1)設定できるBreakPoint数に制限が無い。
(2)アプリケーションで使っていないAD割り込みを使い、適当なタイミングを狙ってBreakが掛けられる。
(3)一度Stimulusファイルを作成すれば、Reset & Runでデバッグしたい状況を再現できる。

実機デバッグの場合、デバッグしたい状況を再現するために、一連のシーケンスを辿るのは結構大変(右ボタンを長押し、左ボタンを3回短押してから、右ボタンを2回長押し・・・)です。

あり難いことにPIC18F2550のMPLAB SIMはTMR2割り込みもIOC割り込みも、割り込みハンドラが正しく呼び出され(それが当然と言えばそうですが)、TMR0とTMR2のクロック・レートも設定どおりに動いています。

何はともあれUSB_Controlerもまじめにテスト仕様を書いて、きちんと動作を確認しようと思います。(実機テストが一発で通ることを期待して・・・)

にほんブログ村 IT技術ブログへ
に

ほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

PIC10F322のデバッグ(on MPLAB SIM)終了 [PICkit3]

(2012.01.31)
MPLAB SIMを使ったPIC10F322のデバッグが終了しました。”TMR2、IOC、NCO割り込みが入らない”とか”TMR0割り込みとStimulusの時刻が一致しない”とか、色々不都合な点もありましたが、無理やり押さえ込んで(詳細はこちら)、ロジックに誤りが無いことを確認しました。

テスト仕様はこんな感じです。

1.初期状態(sync_sequence = IDLE_CHECKで起動する)
Break on Initialize@main()
Reset & Run
Break at Initialize
Step Over
==> sync_sequence = 0
==> T2CON = 0x04
==> PR2 = 0xC7
==> INTCON = 0xE8
==> PIE1 = 0x12

2.アイドル状態検出(sync_sequence = IDLE_CHECKでSERIAL_IN = 1が3cycle以上継続するとsync_sequence = START_BIT_SYNCになる)
Read stim2.sbs
Stimulus Set High RA2 fired
Break on TMR2IF
Break on check_idle_common
Run
break at TMR2IF
==> sync_sequence = 0
==> idle_count = 0
==> PORTA = 0x04

Run
break at TMR2IF
==> sync_sequence = 0
==> idle_count = 1

Run
break at TMR2IF
==> sync_sequence = 0
==> idle_count = 2

Run
break at check_idle_common
==> sync_sequence = 0
==> idle_count = 3

Step Over
==> sync_sequence = 1
==> idle_count = 3
==> INTCONbits.IOCIF = 0;
==> INTCONbits.IOCIE = 1;
==> T2CONbits.TMR2ON = 0;
==> PIR1bits.TMR2IF = 0;

同様に以下の項目について、確認手順と確認項目を記してテストを実施しました。
3.STARTビット検出
4.受信
5.コマンド処理
6.送信準備
7.送信

次はコントローラ側のデバッグですが、予定よりかなり遅れているのが心配です。

にほんブログ村 IT技術ブログへ
に

ほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

"cgpic.exe"がクラッシュ [PICkit3]

(2012.01.29)
PIC10F322のプログラム・サイズが厳しくなってきて、殆どの関数をインライン・アセンブラで書き直しています。HITECH-Cが生成したコードの無駄を省くだけで何とかなりそうな見通しですが、デバッグは未だこれからなので、少しでも余裕を設けておく必要があります。

そこで、さらにインライン・アセンブラ化を進めたところ・・・

cgpic_exe.pngエラー・メッセージが表示された

初めて遭遇するエラー(というかリンカのバグ?)です。リビジョン管理などせずにコードをガシガシ書き換えたので、簡単には元に戻せません。エラー箇所を特定する常套手段(エラーが出なくなるまでプログラムをコメント・アウトする)で、不具合状況が明らかになりました。
<エラーを起こしたコード>
void serial_comm_main(void)
{
#asm
_s_comm_main1:
 movf (_sync_error),w
  |(省略)
_reset_command:
 fcall _nco_reset
 goto _s_comm_main44

<エラーにならないコード(nco_resetを呼び出す所だけCの関数コールにする)>
_reset_command:
#endasm
 nco_reset();
#asm
   goto _s_comm_main44

nco_resetは別のCソース・ファイルに定義された関数で、main.cでも呼び出し(nco_resetはglobal定義されている)ています。それをserial_comm.cの中から呼び出す部分をインライン・アセンブラにした結果、生じたエラーです。HITECH-Cはv9.83を使っています。

ちゃんと勉強しないで適当に作業を進めているので、HITEC-Cのリンカに適切な指示を出す方法が判りません。orz

コード・サイズには影響しないようなので、このまま作業を進めるつもりです。

にほんブログ村 IT技術ブログへ
に

ほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

イマイチでも(なんとか)使う [PICkit3]

(2012.01.27)
先日、”Stimulusが使えるようになってシミュレータを利用するメリットを感じた”と書いたのですが、やっぱり”イマイチ”な部分が出てきて悩まされています。

実機では入る割り込み(TMR2、IOC、NCO)がMPLAB SIMでは入りません(要求フラグが立っても割り込みハンドラが呼び出されない)。”StimulusでPIRbits.TMR2IFをセットすると割り込みハンドラが呼び出される”と思ったのも勘違いでした。

シミュレーション開始から100μSインターバルでPIRbits.TMR2IFをセットするようにStimulusを設定したところ、TMR2の割り込みハンドラが呼び出されました。

『しめしめ、これなら行ける!』と思ったのですが・・・

色々試していて、StimulusのPIRbits.TMR2IF設定とTMR2割り込みハンドラの呼び出しが一致しないことに気付きました。

結局、割り込みハンドラを呼び出していたのは、インターバル(=1ms)が正しくシミュレートできていないTMR0割り込みでした。(シミュレーション開始から600μS以内にTMR0割り込みが3回入っていた)

Stimulusについて判ったことは以下の通りです。

(1)リセットするとStimulusのシミュレーション時刻は0クリアされる。

(2)”Run==>Break”を繰り返す間も、シミュレーション時刻は経過し、Stimulusの設定に応じた割り込み要求信号等が設定される。

(3)以下のように設定すると、(ほぼ)所定の時刻にTMR2割り込みハンドラを呼び出すことが出来る。
 時刻  TMR2IF TMR0 TMR2
150μS     1   FF      00
250μS     1   FF      00
350μS     1   FF      00

ただし、TMR0割り込みハンドラも呼び出される。

(4)IOCAFを設定するとIOCIFが設定される(2012.01.31 誤りでした)入力信号を変えてもIOCIFは設定されない。以下のように設定すると、(ほぼ)所定の時刻にIOC割り込みハンドラを呼び出すことが出来る。
  時刻   RA2  IOCAF2  IOCIF  TMR0
     0μS    1                    FF  
1100μS    0        1         1       FF
1150μS    1         1          0       <== IOCIE = 0なのでIOCIFも0のまま
1250μS    0         1          1       FF
1350μS    1         1          1       FF

ただし、TMR0割り込みハンドラも呼び出される。

(5)StimulusでADIFを設定すると(ADON=0でも)AD割り込みハンドラを呼び出すことができる。AD割り込みハンドラ内にブレー・ポイントを設定しておくと、(ほぼ)所定の時刻にシミュレーションを停止できる。(その後、シミュレーションを再開することもできる)

これで、なんとかシリアル通信の制御ロジックをデバッグするつもりです。

にほんブログ村 IT技術ブログへ
に

ほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

MPLAB SIMが役に立った [PICkit3]

TMR2割り込みが入らなかったり、設定してもNCOが動かなかったりして、PIC10F322のMPLAB SIMには”イマイチ使えない感”を抱いていたのですが、”Stimulus”が使えるようになって漸くシミュレータを利用するメリットを感じました。

PIC10F322にシリアル通信機能を持たせる計画ですが、そのデバッグをどのように進めるか悩みました。テスト信号(動的に変化する入力信号)を加えて受信機能をテストしようと思っても、内部の動作が判らないのではデバッグになりません。(一か八かで試すことは出来ても、カットandトライでデバッグする気にはなれない)

そこでMPLAB SIMのUser's Guideを読み直し、Stimulus機能を使ってみました。動的な制御が必要なので”Pin/Register Actionsタブ”で時刻に応じてポート入力や割り込み要求フラグを制御してみました。

μS単位でRA2,IOCIF,TMR2IFの動作を設定して、”Apply”ボタンをクリックすると、シミュレータの応答メッセージがOutputウィンドウに表示されます。

stimulus1.pngこんな感じ

そこで”Run”する(F9キーを押す)と・・・

stimulus2.pngブレーク・ポイントで止まる

AD割り込みにブレーク・ポイントを設定しておく(シミュレーション終了時刻=1600μSにPIR1.ADIFをセットしている)と、シミュレーション直後の状態が確認できるという訳です。

始めたばかりですが、”MPLAB SIMのStimulus”はなかなか使えそうです。

にほんブログ村 IT技術ブログへ
に

ほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

なんとか復旧しました [PICkit3]

グシャグシャになってしまったPIC10F322の開発環境ですが、何とか復旧させることができました。

アップデートしたMPLAB IDEをアン・インストールしても元に戻らない”と書きましたが、実はアン・インストール後も”C:\Program Files\Microchip\MPLAB IDE”以下にファイルが残っていることが気になっていました。

それをマニュアル操作で削除して、MPLAB IDEの最新版(V8.83)をインストールし直しました。しかし、それだけでは駄目(ターゲット・デバイス ミスマッチ)で、PICkit3を(パソコンから一旦外して)接続し直したところ、プログラマで書き込める(元の)状態に戻りました。(パチパチパチ~)

デバッガは相変わらずターゲット・デバイス ミスマッチになり、シミュレータの動作も変なままですが、取りあえず開発を進めることが出来るようになりました。

空きポートにLEDを付けて、割り込みの発生状況を確認したところ、TMR0割り込みもTMR2割り込みもちゃんと機能していました。NCO割り込みも入って一安心と思ったら、NCO1INCレジスタの値を変えてもNCO割り込みのインターバルが変化しません。NCOもシミュレータでは動作しないので、実機の中で何が起きているのか見当もつかず、暫く途方にくれていました。

NCO割り込みのインターバルから、NCO1INCレジスタが初期値のまま動作している(書き換わっていない)ように思われたので、NCO1INCLレジスタの設定方法(NCOをイネーブルする前にNCO1INCLレジスタを設定していた)を見直すことにしました。

マニュアルには以下のように書かれています。

20.1.4 INCREMENT REGISTERS

<一部省略>
The buffer loads are immediate when the module is disabled.
Writing to the MS register first is necessary
because then the buffer is loaded synchronously with
the NCOx operation after the write is executed on the
lower increment register.

前半部分を読むと、”NCOをイネーブルする前にNCO1INCLレジスタを設定する方法”で良さそうに思ったのですが、後半の”the buffer is loaded synchronously with the NCOx operation”に着目して、NCOをイネーブルしてからNCO1INCH、NCO1INCLの順にレジスタを設定してみました。すると・・・

”ビンゴ~!”

何だか釈然としませんが、取りあえずNCO割り込みも期待通りの動作になりました。

====================================
”PICの開発はLEDピカピカから始まる”という鉄板セオリーはPICkit3になっても健在です。
====================================

にほんブログ村 IT技術ブログへ
に

ほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。