PICマイコンでデバッグ初歩

# PICマイコンでデバッグしてみる
[前回の「PICマイコンでシリアル出力」](https://qiita.com/infinite1oop/items/a0725646f01257e6b78e)でも予告したどおり、ようやくデバッグまでたどりつく。とは言っても、基本のみ。でもこれが大事。

## 環境
[初めての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)。

## ソースコード
ボード内にあるボタンが押されると、押された回数（count）だけ、ボード内のLEDの点滅を繰り返すもの。ボタン及びLEDのピンアサインについては、[初めてのPICマイコン](https://qiita.com/infinite1oop/items/b039efa8a6bbe6cf1f92)を参照されたし。また、それぞれのPINのに関するマクロがあったため、今回はそれらを使って、ON/OFFのセットや状態取得を行っている。下記コードを見れば、自明であろう。

```c:main.c
#include "mcc_generated_files/mcc.h"

void main(void)
{
    int count = 0, gauge = 0;
    
    SYSTEM_Initialize();

    IO_RF3_SetHigh(); // off
    while (1)
    {
        while (!IO_RB4_GetValue()) {
            gauge++;
        }
        if (gauge > 1000) { // To avoid button chattering
            count++;
            printf("Pushed Count = %d\r\n", count);
            for (int i = 0;  i < count; i++) {
                IO_RF3_SetLow(); // on
                __delay_ms(200);
                IO_RF3_SetHigh(); // off
                __delay_ms(200);
            }
        }
        gauge = 0;
        __delay_ms(10);
    }
}
```

## デバッグ
MPLAB X IDEでの設定およびデバッグ実行の説明である。

### ブレークポインタ設定
ソースコード上でブレークポインタを設定したいところ（ここでは17行目）の行の数値「17」をクリックする。下記はクリック前。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/7aede3d4-468a-27ff-6e40-50509283f9e2.png", width=70%>
クリック後には、下記のように変わり、ブレークポインタが設定されていることがわかる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/07cc5a57-3f70-7b88-94c9-c87ec3caff12.png", width=90%>

### デバッグ実行
Debugメニューから、「Debug Main Project」を選択して、デバッグ開始。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/543f396d-b915-25d0-833f-640a34ff8ce2.png", width=70%>

#### ブレークポインタで止まる
ボタン（後述Continueなど）を押して、ブレークポインタで止まると、その行が緑色に変わる。また、Teratermを用いて、シリアル出力した結果も表示する。変数「count」はボタンを押した回数。期待どおり。なお、赤枠内の「Variables」をクリックすると、変数の状態（値）を表示する。
![１．５のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/497f8061-abb4-349d-ea98-3e534f15f428.png)
再度動作させるには、Debugメニューの下記赤枠内を選択する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/c58adea0-49fa-f9a4-91d8-cab39c99614e.png", width=70%>
ここでは、ほとんど「Continue」を使った。

#### ブレークポインタで2回止まった後、動作（Continue）中。
再度ボタンを押す。
![２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/ee729b29-55ed-1f1c-3811-b2ce1747e657.png)
動作中、ブレークポインタ設定行は赤となる。

#### ブレークポインタで止まる（3回目）
また、ボタンを押す。3回目である。ここで、変数「count」の値をわざと変更する（赤枠をクリックする）。
![３前のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/80e1858e-e867-2e60-2341-a6e0c1257a92.png)
すると、下記のような編集可能なボックスが表示されるので、ここでは「count」の値を「7」に変更する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/bea7c551-69e7-4ce7-a9e0-e2d439b09a0c.png", width~90%>
OKをクリックすると、
![７に変更２のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/400c4131-81e4-9f9a-545f-4615a61057ac.png)
となる。青枠内の上記数値が「7」になっている。ここで、Debug Menuで「Continue」すると、
![７に変更３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/77776a7a-aeeb-a43c-8373-10a9babe93d3.png)
シリアル出力でも、「count」が「7」に変更されていることがわかる。（結果として、LEDの点滅が7回行われる。）

#### ブレークポインタで止まる（4回目）
再度、ボタンを押す。4回目であるが、さきほど「Count」の値を「7」に変更したので、インクリメントされ、今回は「8」となる。
![８前のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/e3474b95-fd90-efb3-93e2-d5c4c71d69e6.png)

#### ブレークポインタの状態
ブレークポインタが設定されている行で右クリックすると、下記が表示される。
![BPenabled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/0063fb05-bd12-bbd6-d6d5-404e8027d8ff.png)
ブレークポインタの有効化や無効化などが可能である。

## 終わりに
とりあえず、初めてのPIC利用の初期の目的は達成。