PICマイコンを別の環境で動かしてみる。
2019/08/11


さて、PICマイコンを使ってパソコンとUSBでHIDで繋げることは出来たのだが、しょせんメーカーのサンプルのままなので、このままではよろしくない。
当然のようにプログラムを大幅に変更したり、場合によってはCPUさえ変更したくなるのである。

問題は、メーカーの作ったサンプルではなく、自分で作った環境でちゃんと動くものがコンパイル出来るのか?ということなのである。

ということで、まずは単純に別の場所に同じプログラムを移動して、コンパイルを行って動くことを確認することを行う。



test_pgm085
Microchip社のサンプルをMPLABで開くと、左のように沢山のヘッダーファイルやらCのプログラムファイルが入っているのが見える。

test_pgm086
ところがである、そのサンプルのフォルダーをエクスプローラーで覗いても、一部のヘッダーとソースしかなく、他の沢山のものが無いのである。

他のヘッダーファイルやらソースファイルは何処にあるのであろうか?
解らないのである。

いったいどうなっているのであろうか?



どうも、私のボケ気味の頭では理解不能の状況で、困ってしまったのだった。
そこでしかたなく、「頭が使えない人は体を使うべし」ということで、MPLABの画面から、ヘッダーとソースを直接コピーすることにした。

test_pgm087
全部で28ファイルをセッセとコピーしてテキストにする。

さて、これらの情報で全てなのであろうか?
この28ファイルさえあれば、別の場所でもちゃんと動くコードが作れるのであろうか?

test_pgm088
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);
test_pgm089 test_pgm090
結果、ただ繋いでいる場合は、割り込みは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コンバーターの初期設定のルーチンを呼んでいるのでコメントにしておく。

修正はだいたいこんなものである。

test_pgm082
プログラムを書き込んで実行してみると、見事に動いたのであった。

めでたしめでたし・・・・・・



HOME