PICマイコンでシリアル出力

# PICマイコンでのシリアル出力をPCへ
PICマイコンでデバッグをするにあたり、PCへシリアル出力するのに苦労した記録。

## 環境
[初めてのPICマイコン](https://qiita.com/infinite1oop/items/b039efa8a6bbe6cf1f92)で用いた[PIC18F57Q43 Curiosity Nanoボード](https://akizukidenshi.com/catalog/g/gM-15358/)およびソフトウェア開発環境[MPLAB X IDE](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwjG75vXnuX2AhWDNaYKHVeQBZMQFnoECAYQAQ&url=https%3A%2F%2Fwww.microchip.com%2Fen-us%2Ftools-resources%2Fdevelop%2Fmplab-x-ide&usg=AOvVaw16VOMpKemT58qhK4RMwgMa)。

## ソースコード
シリアル経由でPCにprintf()の出力を行う単純なもの。
```
#include "mcc_generated_files/mcc.h"

void main(void)
{
  int count = 0; // Add

    SYSTEM_Initialize();

    while (1)
    {
        // Add your application code
        printf("count=%d\r\n", count++);
        __delay_ms(2000);
    }
}
```
なお、[記事「ＰＩＣのＤｅｌａｙの使い方について」](http://zattouka.net/GarageHouse/micon/MPLAB/Delay/Delay.htm)によると、__delay_ms()の引数に、変数を指定できないらしい。

## MPLAB X IDE
### UART
シリアルを使うためには、MCC(MPLAB code configurator)のDevice Resourcesにて、UART1を選択する。選択前は下記。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/1e6c002f-9ee6-5cf6-050a-4ead5e0d44e7.png", width=60%>
選択後は下記となる。
![UART1選択後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/09a866f6-34e5-ddce-9383-255ff74ab19c.png)
ここで、「Redirect STDIO to UART」にチェックを付ける必要がある。
![UART1設定のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/e08fc5d0-c0b0-e50a-82fe-521d24fb1594.png)

### ピンアサイン
UART1を選択した初期状態では、Pin Modeにおいて、下記のようにRX（本ボードへの受信）しかアサインされていない。（このあたりは不親切なような感覚あり。）
![BeforePinAssignment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f414f92a-1534-956f-e524-80ed92a184df.png)
[本ボードのデータシート](https://akizukidenshi.com/download/ds/microchip/DM164150_user_guide.pdf)のよると、
![ConnectionToPC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/c8874e4c-8793-0a53-a33a-a4e6e54ab1e2.png)
PCと接続するには、DebuggerのCDCを用いる必要がある。今回の場合、PCへの出力となるので、「CDC RX（UART TX）」にピンアサインが必要。同じくデータシートによると、
![CDC-TXRX.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/5941cb00-5bad-c3c1-6a77-3c2603c252a8.png)
「CDC RX」は「RF0」にアサインされているので、その設定を行う（"Port F"の'0'の鍵マークをクリック）。結果として、下記のようになる。
![AfterPinAssignmentのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/ebab63a4-6e21-ea28-a221-1560549703da.png)

### クロックの調整（for __delay_ms()）
上記のままBuildして動作させたところ、シリアル出力されるようにはなったが、設定したシリアル速度9600bpsでは正しく表示されず、PC側のターミナルソフトウェアで、4倍か4分の1の速度を設定すると、表示されていた。デフォルトでは下記のようなクロック設定であったが、
![最初のClock指定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/158c9ff1-602c-4f64-5b6a-409a009be5cb.png)
これを、下記のように、Oscillator SelectにHFINTOSCを選択すると、PC側の9600bps設定にて正しく表示された。
![正しいクロックのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/7d1cb789-a93d-8343-fad0-ad184eaaf50c.png)
理由は調べておらず、、、であるが、HFINTOSCについては、[「はじめてのPIC-2」](http://machoto2.g2.xrea.com/page/P16F18325/P18325_K15.htm)などに説明がある。

## 結果
Teratermでの表示。
![Teraterm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/9cbf414c-2fa2-61c6-8d1d-0d0b51374c16.png)

## おまけ
MPLAB X IDEにて複数プロジェクトがあるときに、Buildなどの対象となるメインプロジェクトを選択するには、「Production」→「Set Main Project」→「対象とするプロジェクト」をクリックする。
![SetMainProject.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f97318f0-4954-f2b2-abe5-40ecf1c2b457.png)

## 終わりに
次こそ、デバッガを試す。