臨時休校のおかげでPIC学習が捗ってます。 今日はPIC16F18877のADCのテストをしました。
他で調べた方法と少し違ったのでそれも書こうと思います。
やること
- アナログの値を読み取ってそれをシリアル通信でパソコンに送る
やり方
すでにEUSARTの設定をしている前提です。
まず、MCCを開いたらDevice Resourcesの中のADCCの項目を開きます。2つ項目が出てくるのですが、その中のPIC10 / PIC12 / ....と書いてある方を選びます。
するとADCCというタブが開かれると思います。
基本的にデフォルトのままで大丈夫だと思いますが、僕が一つハマったところがあります。Clockのところはデフォルトでは確か「FOSC/2」になっていたかと思うのですが、そのままだと画面下の方の「Notifications [MCC]」に
と表示されてしまいました。
最初はこれに気づかなかったのですが、実行してみた時にうまくいかなかったので、見直してみるとそんな警告が出ていました。特に通知のようなものもなかったので気づきませんでした。
その警告を見て、1TADという項目に書かれているnsを1.0以下にしなければならないようだったので、ADD ClockをFOSC/32にしたところ、うまくいきました。これが何を意味するのかは今のところわかりません。
次にどのピンを使うか設定します。
Pin Managerのタブを開くとModuleの列にADCCがあると思います。そのADCCの行の中のFunctionの列にANxと書いてあるので、使いたいピンの列のANxの行をクリックして鍵を閉じます。
設定をしたらGenerateを押してコードを生成します。
次にmain.cのmain関数の部分を以下のようにします。
void main(void) { // initialize the device SYSTEM_Initialize(); // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits // Use the following macros to: // Enable the Global Interrupts // INTERRUPT_GlobalInterruptEnable(); // Enable the Peripheral Interrupts // INTERRUPT_PeripheralInterruptEnable(); // Disable the Global Interrupts //INTERRUPT_GlobalInterruptDisable(); // Disable the Peripheral Interrupts //INTERRUPT_PeripheralInterruptDisable(); adc_result_t value = 3; while (1) { // Add your application code value = ADCC_GetSingleConversion(inputValue); printf("%d\n\r", value); __delay_ms(1000); } }
inputValueは自分で設定したCustom Nameです。Pin Moduleタブから設定できます。 1秒おきに読み取った値をシリアル通信で出力しています。
以上で設定とプログラムは終わりです。これを書き込むことでシリアル通信で送られてくるはずですが、一つ注意点があります。これは僕の環境だけなのかわかりませんが、USB-UARTの変換器をパソコンに挿したままだと書き込みがうまくいきません。一度USB-UARTの変換器を外してから出ないとうまく書き込めません。
あとは普通に書き込めば大丈夫だと思います。
最後に
少しだけ引っかかりましたが、それ以外は割とすんなりできました。MCC、やっぱり便利ですね。
雑な説明となってしまいましたが、最後まで読んでくださりありがとうございました。もし記事に間違いや改善点を見つけた方がいらっしゃいましたら、コメント等で教えてくださると幸いです。