denshikobo’s blog

PICプログラミングやPCの操作で感じた日々の由無し事を綴ります

Pic_coloにRESETモニタ機能を加えた

Pic_colo_Thereminを5Vで動かそうとして、暫く嵌まりました。
 
VddをUSB電源(5V)から直接とって、DAC1のVref+にVddを接続するとPIC STATUSがERRORになるという症状に見舞われました。Pic_coloコンソールとPic_coloデバッガ間の通信異常です。何が起きているのか全く分からず、(やむなく禁じ手の)Pickit3で動作を調べてみると、Vref+にVddを接続したときにResetが掛かっていました。
 
とりあえず状況は分かりましたが・・・
 
 『Pickit3無しでPICのプログラム開発が出来る』と謳っているのに、これでは形無しです。orz
 
そこで、PCONレジスタの値をpcon_reg(@0x0e8)にコピーする機能と、Pic_coloデバッガが起動した回数をreset_counter(@0x0e9)に記録する機能を新たに追加しました。User_FrameからPICのメモリを操作する機能は既に組み込んであるので、これだけでRESETモニタの完成です。

f:id:denshikobo:20180128140209p:plain

1 set_val 0xe8 0000で初期化する(completeが返ってくる)
2 メイン・コンソールのResetをクリックする
3 get_val 0xe8 2でpcon_regとreset_counterを読み取る(1b01が返ってくる)
4 DAC1のVref+にVddを接続する(PIC STATUS ERRORになる)
5 Vref+の接続を除く(PIC STATUS IDLEになる)
6 get_val 0xe8 2でpcon_regとreset_counterを読み取る(1c85が返ってくる)
 
/PORと/BORが落ちているのでVddの瞬停が起きていること、reset_counterが0x85なので何度もResetを繰り返していることなどが分かるようになりました。
 
『Pickit3無しでReset状況が分かる』というのが大変重要なポイントです。
 
3.3Vのレギュレータを通せばDAC1のVref+にVddを接続しても大丈夫なので、Pic_colo_Thereminの電源は3.3Vにして、超音波センサーの信号は分圧して受けることにします。
 
ひとしきりジタバタしましたが、Pic_coloのデバッグ機能がまた一つ向上したので、まぁ良しとしましょう。
 
やれやれ
 

User_Frameが良い感じに動き出した

先日、User_FrameからPICのメモリやレジスタに直接アクセスできるように仕様変更したのですが、良い感じに動き出しました。

f:id:denshikobo:20180117180822p:plain

DAC_ADC用のUser Frame)

 

以下のコマンドを中段のText_Areaに書き込み、Sendボタンをクリックすると、結果が下段のText_Areaに表示されます。

 

get_var  変数名

set_var  変数名 書き込みデータ

get_reg  レジスタ

set_reg  レジスタ名 書き込みデータ

 

TextAreaを介さずコマンド・バッファに直接コマンドを書き込めば、ユーザ・アプリケーションから簡単にPICを操作できます。

 

配列なども扱えるともっと使いやすくなりますが、Pic_coloコンソールで行う変数の表示/編集機能との使い分けが課題になりそうです。

 

 

 

 

Pic_coloの仕様を変更することにした

Pic_coloには自由にカスタマイズできるユーザ・フレームが用意されています。

ユーザ・フレーム表示のON/OFFは、Setting==>Other==>CustomWindowをクリックして切り替えます。

f:id:denshikobo:20180115151838p:plain

(背景が水色のウィンドウがデフォールトのユーザ・フレームです)

 

ユーザ・アプリケーションは、ユーザ・フレームとPICプログラム間でデータを送受することになるのですが・・・

 

このデータ送受を、Pic_coloコンソール(JAVAプログラム)とPic_coloデバッガ(PICプログラム)間で行うUART通信で、カプセル化して中継しようと考えて(<==未だ実装していなかった)いました。いよいよ、ユーザ・フレームとPICプログラム間のデータ送受を組み込もうとして、ユーザ・アプリケーションにとってデータ通信というのは手段にすぎないということに気付きました。

 

通信文字列を組み立て、それを解釈実行して、応答文字列を組み立て・・・

 

そんなことをやるよりも、データはPICのメモリやレジスタ上にあるのですから、それを直接読み書きする方がずっと簡単です。Pic_coloに組み込んであるPICの変数やレジスタをRead/Writeする機能をユーザ・フレームから呼び出せれば良いのです。

 

これは良いことを思いつきました。

新年、最初のヒットです!

 

XC8コンパイラは賢い

タイマー割り込みのインターバルをどこまで早く出来るか?が問題になって、割り込みハンドラの中を覗いてみました。

プログラム・コードはこんな感じ

void TMR1_ISR(void)
{

 PIR1bits.TMR1IF = 0;

 TMR1H = (timer1ReloadVal >> 8);   <==これが
 TMR1L = timer1ReloadVal;

}

1749 0020 movlb 0 ; select bank0
174A 1011 bcf 17,0 ;volatile
174B 0879 movf _timer1ReloadVal+1,w ;volatile  <==こうなっている!
174C 0097 movwf 23 ;volatile
174D 0878 movf _timer1ReloadVal,w ;volatile
174E 0096 movwf 22 ;volatile
1759 0008 return

 timer1ReloadValを右に8bit-shiftした値をTMR1Hレジスタに書き込む処理ですが、_timer1ReloadValの一つ先のアドレスを読み取って、23番地(<==多分TMR1H)に書き込んでいます。

 

こうしたいと思うことを先に(黙って)やってくれています。

なかなか、賢いコンパイラです。

自分自身の機能を変更する方法を考えてみた

Pic_coloはユーザ・プログラムを書き換えて実行することができます。ユーザ・プログラムをあれこれ書き換えて、動作を確認するのにとても重宝しています。

 

Pic_colo_1788本体を変更するときにPicKIT3を接続して書き換えるのが、段々面倒になってきました。(<==すぐに横着したがる奴)

ユーザ・プログラムの書き換えと、同じようにPic_colo_1788本体を自分自身で書き換えることは出来ないものでしょうか?

 

暫し黙考・・・・・・・・・・・・・・・・・

実行中のコードさえ書き換えなければ良い訳だから・・・・・

基本的な機能(割り込みetc.)と、コマンド処理機能に分割して・・・ん!

行けるんじゃない?

 

Pic_colo_1788本体を書き換える機能だけに絞ったコマンド処理モジュールを追加して、従来のコマンド処理モジュールと切り替えるようにすれば良さそうです。

 

『Pic_colo_1788自身の機能変更が出来る』っていうのも良いんじゃないでしょうか?

これは是非実現しなければなりません!

 

変数領域についても考慮が必要です。しかし、Pic_colo_1788本体が元々自動変数を使わないように書かれているので簡単に分割できる筈です。多分・・・

 

 

PWMの動作をどうやって確認するか?

PIc-colo単体で動作する以下のプログラムをサンプル提供しようと考えています。

 Lチカプログラム
 SW操作プログラム
 PWMプログラム
 DAC-ADCプログラム

プログラム動作を確認しようとして、大きな欠陥に気づきました。

 

LチカプログラムはPic-colo基板に搭載されたLEDが1秒間隔で点滅します。SW操作プログラムはLEDの点滅パターンがSW操作によって変化します。DAC-ADCプログラムは3chのDAC出力をAD変換した結果を画面に表示します。何れもプログラム動作の確認はPic-colo単体で出来そうです。

 

問題はPWMプログラムで、PWMの出力をPic-colo単体でどうやって確認すれば良いのでしょうか?

 

PWM出力をLEDに接続してPWMの設定値を変えても、LEDの明るさは殆ど変化しません。出力ポートの電圧をテスターで計っても、計測分解能が不足してPWMの評価には使えません。orz

 

オシロ(またはロジアナ)が使えれば簡単なのですが・・・

f:id:denshikobo:20171214172044p:plain オシロジで計測した

 

Pic-colo単体でPWMのdutyを確認する方法は・・・・・・・・・・・・・・・ ん!

PWMの出力ポートのHi-Lowをメインループでモニタして、そのdutyを計算して求めるっていうのは?

 

早速試してみました。

f:id:denshikobo:20171214174054p:plain

1秒インターバルでモニタしたduty値は僅かにオフセットしますが、PWM設定値の1LSBの変化をしっかり捉えています。

パチパチパチ~

 

大雑把な変化をLEDで確認(明るいとか暗いとか)して、PWM設定値の細かい変化は計算で求めたduty値で確認してもらうのが良さそうです。

  

これにて一件落着~

CCP3の出力pinの設定で戸惑った

便利に使っているMPLAB® Code Configurator (MCC) ですが、時々『あれ?』と戸惑うことがあります。

 

Pic-coloのPWM機能のサンプル・プログラムを書いていたときのことです。CCP3のデフォールト出力(RC6)がUARTのTXピンと重なっていたので、RB5に割り当てようとしたのですが・・・

Pin Managerが管理するModuleにCCPが有りません。orz 

f:id:denshikobo:20171207165242p:plain

CCP3をRB5に割り当てるためにはAFPCON2は0x01で初期化しなければならないのですが、MCCが生成したプログラムはAFPCONレジスタを0x00で初期化しています。orz

 

MCCが生成したプログラムを書き換えることは簡単ですが、果たしてそれは正しい手順なのでしょうか?一体どうすれば良いのか?

 ・・・・・・

ふと思いついて、Registersタブをクリックして設定リストを調べてみると・・・

ビンゴ~

f:id:denshikobo:20171207172459p:plain

AFPCON1、AFPCON2の設定メニューを見つけることが出来ました。

 

 

やれやれ