PICマイコンを別の環境で動かしてみる。
2019/08/11
さて、PICマイコンを使ってパソコンとUSBでHIDで繋げることは出来たのだが、しょせんメーカーのサンプルのままなので、このままではよろしくない。
当然のようにプログラムを大幅に変更したり、場合によってはCPUさえ変更したくなるのである。
問題は、メーカーの作ったサンプルではなく、自分で作った環境でちゃんと動くものがコンパイル出来るのか?ということなのである。
ということで、まずは単純に別の場所に同じプログラムを移動して、コンパイルを行って動くことを確認することを行う。
Microchip社のサンプルをMPLABで開くと、左のように沢山のヘッダーファイルやらCのプログラムファイルが入っているのが見える。
ところがである、そのサンプルのフォルダーをエクスプローラーで覗いても、一部のヘッダーとソースしかなく、他の沢山のものが無いのである。
他のヘッダーファイルやらソースファイルは何処にあるのであろうか?
解らないのである。
いったいどうなっているのであろうか?
どうも、私のボケ気味の頭では理解不能の状況で、困ってしまったのだった。
そこでしかたなく、「頭が使えない人は体を使うべし」ということで、MPLABの画面から、ヘッダーとソースを直接コピーすることにした。
全部で28ファイルをセッセとコピーしてテキストにする。
さて、これらの情報で全てなのであろうか?
この28ファイルさえあれば、別の場所でもちゃんと動くコードが作れるのであろうか?
MPLABで全く別のフォリダーに新規のプロジェクトを作る。
そして、コピーした沢山のヘッダーとプログラムを、またセッセと新しく作ったプロジェクトに入れていく。
そして、コンパイルして実行である。
いくつかのインクルードがうまく繋がらないので、「<」を「"」に変えたりして、なんとかコンパイルを通す。
すると、ちゃんと動くのである。
めでたしめでたし!!
せっかくなので、USBの割り込みがどのくらいで発生しているのか、調べてみる。
LEDの環境の設定を若干変更して、LED3とLED4も使えるようにプログラムを変更する。
割込みの先頭にLED3を反転させる処理を入れる。
void interrupt SYS_InterruptHigh(void)
{
LED_Toggle(LED_D3);
#if defined(USB_INTERRUPT)
USBDeviceTasks();
#endif
}
また、どのくらいの時間を占有しているのかも調べてみる。
メインの無限ループの先頭に、LED4を反転させる処理を入れる。
int main(int argc, char** argv) {
SYSTEM_Initialize(SYSTEM_STATE_USB_START);
int i;
int j;
USBDeviceInit();
USBDeviceAttach();
while(1)
{
LED_Toggle(LED_D4);
結果、ただ繋いでいる場合は、割り込みは1m秒毎に起こっており、20μ秒の間、一般の処理が中断しているようである。
さて、別の環境での動作確認が出来たので、今度は違うCPUで同じことが出来るか試験する。
動作確認をするのは、端子が沢山ついていて遊びやすいPIC18F4550である。
新しいプロジェクトをPIC18F4550で作り出す。
上記のプロジェクトと同様に28のファイルをセッセとコピーする。
変更箇所がいくつかあり、以下のようにする。
1、バッファーのアドレスの変更。
fixed_address_memory.hというファイルの中で、バッファーのアドレスを指定している場所がある。
PIC18F14K50では、USBのバッファーとして使用するのが0x200〜0x2FFとなっており、サンプルを見ると0x260と0x2A0を使用している。
PIC18F4550のマニュアルを見ると、USBのバッファーとして使用するのが0x400〜0x4FFとなっており、0x460と0x4A0に変更する。
本当にこの変更で良いのか、よく解らないのだが、変えないとマズい感じはするのである。
//#define HID_CUSTOM_OUT_DATA_BUFFER_ADDRESS 0x260
#define HID_CUSTOM_OUT_DATA_BUFFER_ADDRESS 0x460
//#define HID_CUSTOM_IN_DATA_BUFFER_ADDRESS 0x2A0
#define HID_CUSTOM_IN_DATA_BUFFER_ADDRESS 0x4A0
2、A/Dコンバーターの指定の変更
PIC18F14K50とPIC18F4550では、A/Dコンバーターで使用出来るピンの配置が異なるので、修正をしなければならない。
取り敢えずメンドクサイので、adc.cの中でエラーになった箇所はどんどんコメントにしていく。
後でじっくり直しましょう。
leds.cの中で、LEDを繋げるピンを定義しており、ポートとラッチのCを使っているのを、Dに変更する。
PIC18F4550では、ポートのCの一部がUSBのポートと重なるのである。
3、コンフィグの変更
CPUの動作で一番重要なコンフィグをsystem.cの中で定義しているので変更する。
これは、以前PIC18F4550の実験をしたプログラムからコピーしてくれば良い。
あと、イニシャライズの場所で、ボタンとA/Dコンバーターの初期設定のルーチンを呼んでいるのでコメントにしておく。
修正はだいたいこんなものである。
プログラムを書き込んで実行してみると、見事に動いたのであった。
めでたしめでたし・・・・・・
HOME