PIC16F88 による シリアル接続型PIC-ADC

はてブ数 2007/10/08デバイス

PIC16F88を用いたシリアル接続型のAD変換プログラムと回路図です。PCに接続出来ますので、そのままPCでデータ処理が行えます。(写真は動作確認時のもの)

pic_adc.jpg

仕様

AD変換回数1000sps(1msに1回)
AD変換解像度10bit
AD変換誤差1bit
シリアル通信速度RS-232C 38400bps
シリアル通信オプションパリティなし、フロー制御なし
電源電圧3.3~5V程度

PIC16F88用ですが、USARTとADコンバータの乗っているPICならば簡単に移植できます。きちんとレベルコンバータIC(MAX232C)を通してますので、いわゆるUSBシリアルでも動作します。

変換レートの1000spsは内部タイマで割り込みをかけているので、(クロックと同じ程度)正確な間隔で計測されます。外部に8MHz水晶発振器などをつければ、正確に1kHzの間隔でサンプリングできます。

回路図とファームウェア

pic_adc.gif

シンプルな回路構成です。電源は3.3~5Vで動作すると思います。もっと違う電圧でも動くでしょう。簡便のためPICの内部発振を使っていますが、より正確な計測が必要な場合は外部に水晶をつけてください。

PICの電源に大容量低インピーダンスコンデンサをつけていますが、たまたま手元にあっただけでここまで大きい必要はありません。100uF程度で十分でしょう。AD変換の精度のことを考えると、低インピーダンス品は使いたいところですが。

使い方

RS-232C経由でコマンドを送信することで制御を行います。コマンドは文字 1byte です。

送信文字機能
Rデバイスをリセットします。AD変換を停止させます。
SAD変換を開始します。
VPICファームウェアのバージョン情報を表示します。

AD変換中に送られるデータは2byteで1つのデータとなっています。並びはビッグエンディアンです。例えば、受信データ配列をchar buf[size]、電源電圧を5Vとすれば、次のようにAD変換電圧を取得できます。

for(int i=0; i<size; i+=2) {
    float volt = ((buf[i]<<8) + buf[i+1])*5/(float)1024;
         :
         :(データ処理)
}

ライセンス

修正BSDライセンスとします。質問とか相談とか、開発とかありましたらコメント欄にどうぞ。

PICを少し便利に使うアセンブラマクロ

はてブ数 2007/10/02デバイス

PICを初めてさわってみたんですが、アセンブラが癖ありますね。x86(やZ80)に慣れた人間には少々使いにくいのでマクロ集を作ってみました。あまり大がかりにならず、適当な規模にしてあります。

PICマクロ集

マクロ集

利用は用途を問わず自由にどうぞ。

マクロW保存機能
bank0bank0に切り替え
bank1bank1に切り替え
bank2bank2に切り替え
bank3bank3に切り替え
mov reg,reg2×reg ← reg2
movi reg,imm×reg ← imm
and reg,reg2×reg ← reg and reg2
andi reg,imm×reg ← reg and imm
test reg,reg2×w ← reg and reg2
testi reg,imm×w ← reg and imm
or reg,reg2×reg ← reg or reg2
ori reg,imm×reg ← reg or imm
xor reg,reg2×reg ← reg xor reg2
xori reg,imm×reg ← reg xor imm
add reg,reg2×reg ← reg + reg2
addi reg,imm×reg ← reg + imm
sub reg,reg2×reg ← reg - reg2
subi reg,imm×reg ← reg - imm
cmp reg,reg2×w ← reg - reg2
cmpi reg,imm×w ← reg - imm
xor reg,reg2×reg ← reg xor reg2
xori reg,imm×reg ← reg xor imm
jz labelif (zero) goto label
jnz labelif (non zero) goto label
ja labelif (a>b) goto label
jae labelif (a>=b) goto label
jb labelif (a<b) goto label
jbe labelif (a<=b) goto label
  • reg … レジスタファイル
  • imm … 即値
  • label … ラベル

注意

  • mov と movi、and と andi のように第2オペランドをレジスタ/即値で書き分けますが、互いに書き間違えてもアセンブルは通過してしまうのでご注意ください。
  • マクロは1命令ではないので、btfsc などで「次の1命令を飛ばす」を併用する場合は特にご注意ください。

条件分岐(jxx)の使用例

cmpi MEM0, h'20'  ; W = MEMO - 20h
ja   LABEL        ; if (MEMO > 20h) goto LABEL

メモ