denshikobo’s blog

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

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の設定メニューを見つけることが出来ました。

 

 

やれやれ

 

Pic-colo試作基板が動いた

5枚のPic-colo試作基板を組み立てたのは10日以上前です。

f:id:denshikobo:20171121153625j:plain

基本モデルを2枚、WiFiモデルを2枚、LCDシールドモデルを1枚、計5枚を組み立てました。


早速動かしてみたのですが、Pic-coloコンソールとPic-coloデバッガ間の通信が動いたり動かなかったり・・・

 

FT231XSの半田付けの手直しを繰り返しながら暫くジタバタした挙げ句、基本に立ち返ってLOOPBACKテストの実施を決めました。


USBシリアル変換IC(FT231XS)単独のLOOPBACKテストで、これまで重宝していたJAVAのCOMMライブラリ(<==自作)にバグが見つかりました。結局、試作基板(5枚)がLOOPBACKテストに通るまで二日掛かりました。

 

しかし、相変わらずPic-coloコンソールとPic-coloデバッガ間の通信が動いたり動かなかったり・・・orz

 

USBシリアル変換ICとPICを合わせたLOOPBACKテストに試作基板が全て通るまで、さらに三日掛かりました。

 

まさかUSBシリアルのLOOPBACKテストにこれ程時間が掛かるとは思いませんでしたが、ようやくPic-coloの開発を先に進めることが出来るようになりました。

やれやれ。

ラズパイマガジンの「パイ専ボード」を見て考えた

ラズパイマガジンが雑誌連動企画で「パイ専ボード」(ESP32を搭載したRaspiのドータ・ボード)を販売するようです。

ラズパイマガジン <お得な>Raspberry Pi販売サイト

しかし、『ESP32とRaspberry pi3との組み合わせ』っていうのは、どうもしっくりしません。

 

PIc-coloにESP-WROOM-02の搭載を決めた時も悩みました。IoTデバイスとしてESP8266を単独で活用する事例もあるのに、敢えてPICと組み合わせる意味はあるのだろうか?

 

Pic-coloは『新しいPICの開発環境を提供すること』が最大のテーマですから、PIC無しという選択は考えられません。ESP-WROOM-02の搭載は、PICにWifi機能を追加する最も手頃な手段です。

 

しかし、PIC16F1788とESP-WROOM-02が組み合わされていることに技術的な合理性が見いだせないと・・・

 

『温度や気圧を測ってパソコン画面に表示してみました』ではPic-colo+ESP-WROOM-02の実用アプリケーションとは呼べません。

 

やっぱり、PICのリアルタイム制御機能を生かした倒立ロボットでしょうか?

ハードル高いなぁ~(<==実はPIC24を使って一度失敗している)

 

 

Pic-coloアプリケーションの候補ができた

Pic-coloはPICを使った実用アプリの開発環境として提案していく予定です。

 

となると、PICの機能を紹介するサンプル・プログラムだけでは不十分で、実用アプリの開発例を提示しなければなりません。

 

実用アプリの候補はいくつかあります。しかし、どれも地味というか・・・華がないというか・・・

 

そんな中で何とか実現したいと考えているのが『Pic-colo Theremin』です。

 手の動きで音を操作する装置(楽器)で、DACの分解能が課題です。

 

『8bitDACのVref+とVref-に5bitDACの出力を加え、二つの5bitDACの出力差を256分割して12(13)bitDACを構成する』という方式を考えていて、その実現可能性を早急に確かめる必要があります。

 

MCCを使ってペリフェラルをサクサク設定して、DAC1、DAC2、DAC4の設定を変えながらAD変換した結果を画面表示する・・・Pic-coloなら簡単に実現できます。

 

早速、回路を組んでみたのですが、どうも5bitDACの出力がおかしいのです。5bitDACのPositive ReferenceにFVR_buf2を設定したのですが・・・

f:id:denshikobo:20171106180040p:plain

(MCCで Positive ReferenceにFVR_buf2を設定した)

 

マニュアルを調べると、Positive Source Selectは1bitで、VccまたはVref+のいずれかを指定することになっていました。orz

f:id:denshikobo:20171106180059p:plain

(5bitDACのPositive ReferenceにFVRは選べない)

 

Verf+には5bitDACの出力を接続しなければならないので、5bitDACのPositive Referenceとしては使えません。Vddを選択して5bitDACから0V~3.3Vの出力が得られるようになりました。(<==電源ノイズの影響が気になる)

 

実際、Raspiの3.3V電源だと12bitADCの計測値はばらつきます。しかし、平均化処理を施した結果を見ると、12bitbit分解能のDACとして動作していることが確認されました。

パチパチパチ~

 

この12bitDACが音源として使えるかどうか(?)まだ分かりませんが、『Pic-colo Theremin』の実現に向けて一歩前に進みました。