PICkit2のロジアナをMacで使えるようにしてみた

手頃なロジックアナライザーがないかと長い事いろいろ物色していたのですが、たまたまPICkit2のロジアナのオープンソースがあることを知り、Macでも使えるようにしてみました。

USB接続のロジアナには二種類あって、一つはトリガーなどの設定を送ってモジュールが処理をして、引っかかったデータを拾いだすタイプと、もう一つは生のデータをUSBにそのまま投げてきて、ホスト側でトリガーなどの処理をするタイプになります。PICkit2のロジアナは前者になります。

[pk2-la](https://sourceforge.net/projects/pk2-la/)というオープンソースでpythonで作られていました。処理を見てみるとUSBのInterrupt転送を何カ所かおこなっているだけで、それほど複雑ではありません。

自作の計測器モニターアプリの[さるのこしかけ](http://hp.vector.co.jp/authors/VA009278/monkey/)に同じように処理をlibusbベースで実装してみました。

同じように処理をおこなっているのですが、うまく動きません。いろいろ調べてみると、libusb_claim_interfaceに失敗しています。USB Probeで見てみるとPICkit2にはHIDのエントリーがあり、これをMac OS Xのドライバが握っているので失敗するようです。（よくよく調べてみるとpk2cmdのMac版のオープンソースもHIDでコーディングしてありました。）

しかたがないので、HIDなコードに書き換えてみました。いつものようにKLabさんのブログにあったコードを流用させてもらいました。

処理の流れは設定をつんでスタートして、ポーリングしているとトリガーに引っかかると、トリガーの位置が返ってきます。128バイトのデータを4回拾いだして、トリガーの位置などの処理をおこなうといった感じです。

トリガーを設定して、実行してデータを拾いだすところまでは一日でできました。ところが拾いだしたデータの先頭の位置がなかなかわかりませんでした。

いろいろ調べてみるとMicrochipのオリジナルのWindows版アプリのcsなコードはオープンソースになっていて、見てみましたが今ひとつわかりません。しかたながいので、いろいろ試行錯誤して、やっとどうにかデータの構造を処理できるようになりました。

最大サンプリングが1MHzとはいえ、8BitCPUにはかなり厳しいので、おそらくキャプチャしたそのままのデータを送ってくるので、大変分かりにくい仕様になっている気がします。

pk2-laはパケットキャプチャで仕様を解析したようですが、Microchipからは仕様書(PICkit2SourceGuidePCv2-61FWv2-32.pdf)が公開されています。しかしデーターフォーマットなどについて全く書かれていないので、あまり役に立ちません。

# 使い方

基本的にオリジナルのWindowsアプリと同じような設定になります。

![スクリーンショット（2017-07-29 13.20.06）.png](https://qiita-image-store.s3.amazonaws.com/0/104066/1132fa16-4e32-45ea-e0a3-7f558ee65205.png)


Channel毎のトリガーとカウント、トリガーからのキャプチャ位置およびサンプリング周波数になります。サンプリングポイント数は1024で最大1MHzでのサンプリングになります。

Arduinoで以下のようなプログラムを実行してこれをキャプチャしてみます。

```c
#define PWM_PIN  3

int onoff;
char ch;
void setup()
{
  Serial.begin(9600) ;
  int i = (int) 1 * 51;
  analogWrite( PWM_PIN, i ); 
  pinMode(2, OUTPUT);
  onoff = 1;
  ch = 'a';
}

void loop()
{

  Serial.print(ch);
  ++ch;
  if(ch > 'z')
    ch = 'a';
  if(onoff)
    digitalWrite(2, LOW);
  else
    digitalWrite(2, HIGH);
  onoff = !onoff;
  delay(3) ;
}
```

シリアル(D1)がCh1、デジタルアウト(D2)がCh2、PWM(D3)がCh3に接続します。

これでChannel3をRising Edge/25KHzでキャプチャしてみます。

![スクリーンショット（2017-07-31 7.00.17）.png](https://qiita-image-store.s3.amazonaws.com/0/104066/65b75f6a-6c2a-fa36-b9b0-6874a35a6937.png)

大きい目盛りが1msなのでCh2のデジタルアウトが3ms単位で反転しているのが確認できます。

Ch1のシリアル送信のスタートビットとCh2のデジタルアウトの反転はほぼ同じタイミングになっています。これはシリアル通信のバッファにデータを書き込んですぐに次の処理に移るためです。

Ch1にEdgeのトリガーをかけると、必ずスタートビットにかかるわけではなく、バイトの途中にもかかります。これを避けるためにはこの信号であればCh2にEdgeのトリガーをかけると良いです。

このように信号が見えると何をやってるか理解しやすいです。

複数トリガーを設定するとorで処理されるようです。

トリガーとキャプチャされる位置は以下のようになります。

![LA_Window.png](https://qiita-image-store.s3.amazonaws.com/0/104066/49720bce-84da-7843-fcad-0c7c8da92447.png)


キャプチャを初めてトリガーがかかるまえに止めたい時はPICkit2の赤いボタンを押します。

PICkit2のCh1,2はプルダウンされているのでI2Cのキャプチャはできないようです。

WindowsでスクリプティングモードにしたPICKit3は使えるかもしれませんが、通常のPICKit3では使えません。

赤外線リモコンの出力をキャプチャしてみました。受光素子を直接接続したらだめだったので74LS04をかまして接続しています。

![20170731-065553.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/e49ce955-9031-cd3e-023f-d0f4b5417982.jpeg)

![20170731-065628.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/fff94c2c-e0f8-1101-e1ab-d6bfdcda8120.jpeg)


SONYのアナログテレビリモコンの1(0x010:12Bit)の受信結果です。結構ノイズを拾うみたいで、上の画像は何度かやって奇麗な波形です。

[Apple Desktop Bus](http://qiita.com/yamori813/items/64e92e78d89398d517eb)をキャプチャしてみた。

![20170731-071333.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/4885e7ce-0c94-a97d-ed5e-973fb28bd1a8.jpeg)

![20170731-071412.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/ff8a178e-f8ab-db5d-0ac7-d054c5297806.jpeg)

I2Sもキャプチャしてみたけど1MHzだとちょっときつい。

![20170731-072044.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/3ee35c9f-1774-a686-e1d7-7dc55ce588cc.jpeg)

PICkit2は製品ではなく、自作のクローンで確認しました。当初このクローンのCh3(AUX)回路はFlashの書き込みに必要ないので、実装していなかったのですが、せっかくなので実装して使えるようにしました。

さるのこしかけは雪豹で開発しています。

結構興味ある人いるようなので、ビルド済みのアプリケーション用意してみました。雪豹でしか確認してないので、最近のMacでは動かないかもしれませんが、興味のある人はお試しください。

https://sourceforge.net/projects/ubsa-osx/files/Monkey/

余談ですが、30年近く前にLUNAの開発をおこなってた頃にHPのロジアナを同僚が使っていました。ユーザインターフェースがすごく良かったのが記憶に残っています。

いろいろ試していたら、PICkit2クローンのLEDが1秒おきに点滅するようになって使えなくなってしまいました。USBでは見えていて、OSをダウンロードしたところ元に戻りました。

```
bash-3.2$ ./pk2cmd -?V

Executable Version:    1.20.00
Device File Version:   1.55.00
OS Firmware Version:   118.90.90


Operation Succeeded
bash-3.2$ ./pk2cmd -DPK2V023200.hex 
Downloading OS...
Verifying new OS...
Resetting PICkit 2...
OS Update Successful.

Operation Succeeded
bash-3.2$ ./pk2cmd -?V

Executable Version:    1.20.00
Device File Version:   1.55.00
OS Firmware Version:   2.32.00


Operation Succeeded
```