haphysics blog - 幸福の物理ブログ

みんなに物理と工作と幸福をお届けするのだァ~!

【春休み企画第3弾くらい?】二日間でC言語コンパイラの使用経験ゼロの状態からAD変換できるまでを記録した日記

この物語はノンフィクションです

内容

 この記事は、今までPICアセンブラしかやったことのない人間が、二日間でC18コンパイラを利用したC言語でのプログラムに挑戦する様子を描いたしたろうメモである。
 そういえば電子工作の記事は初めてですね。

背景

 私はロボット技術研究会に所属してから初めてマイコンなるものに触れました。そのマイコンとはPICと呼ばれるもので16F628Aでした。
PICマイコン PIC16F628A−I/P: マイコン関連 秋月電子通商 電子部品 ネット通販
 PICマイコンデビューから1年間ほどはこのPICマイコンPICアセンブラと呼ばれる低級言語で操作していました。
f:id:shitaro2012:20140401115817p:plain
 ↑こんな感じです。これは「割り込み」と呼ばれる処理をする部分です。
操作といってももっぱらLEDを点滅させることくらいでした。

動機

 先週、センサーの値をLCD*1に表示させたい、またUSBを使ってPCと通信したいと思い立ったのが始まりです。そのために従来使っていたアセンブラを辞め、C言語で書くことを決意しました。

一日目(3/29(土))

初めの一歩!コンフィギュレーションビット

 新しいPICを使い始めるときにやるべきことはコンフィギュレーションビットの設定だろうと思い、色々と調べながら設定しました。
f:id:shitaro2012:20140401123337p:plain
画像での設定における簡単な説明をしますと・・・

  1. FOSC : 使うクロックの設定。外部か内部か、等。
  2. FCMEN : 外部クロックが上手く動いていない場合、内部クロックに切り替えて動作させるか。
  3. IESO : 外部クロックが始動するまでの間、内部クロックをかわりに使うか。
  4. PWRT : 電源を入れた後、電圧が安定するまでマイコンを動作させないようにするか。
  5. BOR : 電源電圧がある値を下回った場合、リセットをかけるか。
  6. WDT : ウォッチドッグタイマのカウンタが最後まで回った場合、リセットをかけるか。
  7. WDTPS : ウォッチドッグタイマのカウント数。
  8. MCLRE : MCLRピンをリセット端子に使うか。
  9. LPT1OSC: Timer1を低消費電力モードで使用するか。
  10. PBADEN : 初期状態でのPORTB<4:0>をアナログ入力にするか。
  11. CCP2MX : CCP2ピンをRC1に割り当てるか、RB3に割り当てるか。
  12. STVREN : スタックオーバーフロー、アンダーフローが発生した場合、リセットをかけるか。
  13. LVP : 低電圧書き込みを許可するか。*2
  14. XINST : 拡張命令を有効にするか。*3
  15. DEBUG : MPLAB IDEデバッグを許可するか。
  16. その他 : コードプロテクトをかけるか。*4

ここまで設定すると「コンフィギュレーションビットの設定が不十分だからこっちで勝手に設定しちゃったよ」警告がでなくなります。

 ここまででLED点滅ができました!コンフィギュレーションビットの設定がPICの最大の山であると勝手に思ってます。

映れ!LCD

 一日目にクリアしておきたい最大の課題はLCDの制御です。LCDとはLiquidCrystalDisplay、すなわち液晶ディスプレイのことです。今回用いるのは電子工作ではおなじみのSC1602ってシロモノです。
LCDキャラクタディスプレイモジュール(16×2行バックライト無): ディスプレイ関連 秋月電子通商 電子部品 ネット通販
このLCDを表示させるには固有の信号と信号間隔をマイコンで制御しなければなりません。データシートや他の色々なサイトを参考にプログラムを書いてみました。

このプログラムは48MHzで動作させることを前提に書いてます。ただ、今回は8MHzの内部クロックでしか動作確認をしていないので48MHzで正常に動作するという保証はできません

 ついにLCDで文字が表示できました!
f:id:shitaro2012:20140401134232j:plain
これでデバッグ作業がやりやすくなりますね!

二日目(3/30(土))

読み取れ!A/D変換

 A/D変換をするにはいくつかのA/D変換のためのレジスタをいじる必要があります。アセンブラで書くと少し煩雑になります。しかし、C18コンパイラではA/D変換を簡単に行うことのできるライブラリが用意されています。このライブラリのドキュメントを読みながらA/D変換をしました。
f:id:shitaro2012:20140401134740p:plain
↑たった一行でA/D変換の設定が完了!?
f:id:shitaro2012:20140401134854p:plain
↑A/D変換を実行し、int型の変数ADdataにA/D変換した値を代入するプログラム。たった3行で書けちゃう!

 わずか数行でA/D変換プログラムが書けるとは・・・さすがです。A/D変換した結果を一日目で制御したLCDに表示させました。
f:id:shitaro2012:20140401135145j:plain
↑やった!電圧計ができたぞ!

この後

 磁気センサで磁場を測定する装置を組む予定です。現在誠意製作中のコイルと合わせて実験する予定です。

└(՞ةڼ◔)」<"Hello!Happy!"

*1:液晶のことです。

*2:なのかなあ。LVPの設定に関する問題をよく見かけます。

*3:拡張命令ってなんだろう?

*4:プロテクトをかけると一切の書き込み、読み込みができない。