SVX日記
2004-09-16(Thu) A/D変換できたのである
いままでのアナログメータの進捗に比べれば、素晴らしく早くA/D変換による温度計を動かすことができたというところだろうか。といっても、例のヨワヨワのシリアルバスパワー動作のため、レギュレータを越えた回路電圧が4.5Vになってしまったり、それを半分にして参照電圧にしているもんだから、推奨の最低2.5Vを確保できていなかったりと、かなりいーかげんではあるが。
やはり、これ以上何かやらせようと思うと、シリアルバスパワーでは限界である。実は昨日、外部から9V電池による電力の供給を試してみたのだ。しかし、そのうちうっすらと妙なニオイが漂い始め、もしやとおもってレギュレータに触れたところ、燃え上がるような熱さになっていた。そりゃ驚いて、昨日は作業を中止し、今日はずっとその原因についてひたすらに考えていたのだが、結局わからないまま。しかし、レギュレータが破壊することもなく、今日動かしたらそのまま動く。むー、気持ち悪いことこの上ない。いったいなんなんだ。
とゆーわけで、とりあえず動いたところで、回路とソースを(一部だが)公開する。あくまで開発中ということで未完成な部分もあるが、とりあえず動いている現況のままである。動かすと1秒おきに温度がガシガシとシリアルポートに送りつけられてくる。なお、回路図内の表記のない抵抗はすべて10KΩ、PICは16F648Aと書いてあるが16F819を使っており、右上が温度センサのLM35、その下のトランジスタは現状使っていない。
一昨日、トラ技にA/D変換のサンプルコードが載っていたが、ほとんど見ないで組んだ。というか、せっかくPICのマニュアルのA/D変換の項を翻訳したところだし、こんな楽しい試行錯誤を取り上げられてタマルかっつーの。まぁ、私の母国語はZ80かぶれの変態ニーモニックなので、サンプルコード見てもピンとこないんだけど……。
そうそう話は替わるが、昨日ちょっとこのtdiaryというblogの設定をいじってみた。以前から、どーも横幅がありすぎて、乱雑な文章の読みにくさに拍車をかけていたが、サイドバーを設けて少し縮めてみた。せっかくサイドバーを設けたのでアクセスカウンタ、サイト内検索、日記のタイトルリストを表示するようにした。我ながら意外と長く日記が続いてきて、自分の覚え書きとして見返すことも多くなってきたのでサイト内検索が欲しくなってたんだよね。
でもってこのtdiary、プラグインを入れるだけで「タイトルリスト」や「タイトルバーへの日記タイトルの挿入」なんかができるのはいいんだが、どちらも私にとっては非常に不可解な表示になってしまう。まぁモノが得意のRubyなので、チョチョイとイジったら私の望む動作に変更できたのでいいのだけれど、こーゆー時やっぱりオープンソースはよいですな。
ADCONV ; ADCONV
; # 1. A/D変換モジュールの設定:
; # ・アナログ入力ピン、参照電圧ピン、デジタル入力ピンの組み合わせを設定します。(ADCON1)
bsf STATUS, RP0 ; SET RP0, (STATUS) ; バンク1へ
movlw 00000101b ; LD A, 00000101b ; 0 0 -- 0101 / leftJ 8Tosc - D+DAA
movwf ADCON1 ; LD (ADCON1), A
; # ・A/D変換に用いるチャンネルを選択します。(ADCON0)
; # ・A/D変換に用いるクロックを選択します。(ADCON0)
; # ・A/D変換モジュールをONにします。(ADCON0)
bcf STATUS, RP0 ; RES RP0, (STATUS) ; バンク0へ
movlw 01001001b ; LD A, 01001001b ; 01 001 0 - 1 / 8Tosc AN1 DONE - ON
movwf ADCON0 ; LD (ADCON0), A
; # 2. A/D変換割り込みの設定(必要な場合):
; # ・ADIFビットをクリアします。
; # ・ADIEビット、GIEビットをセットします。
; # 3. サンプリングに必要な時間、待ちます。
ADCONV1 ; ADCONV1
movlw 5 ; LD A, 5 ; 10を指定すると、
call WAITnx3p5us ; CALL WAITnx3p5us ; 2行で 5 x 3 + 5 = 20us 消費
; # 4. 変換の開始:
; # ・GO/DONEビット(ADCON0)をセットします。
bsf ADCON0, GODONE ; SET GODONE, (ADCON0)
; # 5. 以下のどちらかの方法で、A/D変換が完了するのを待ちます:
; # ・GO/DONEビットがクリアされるのをチェックする(割り込みを設定しなかった場合)または、
; # ・A/D変換割り込みが発生するの待つ。
ADCONV2 ; ADCONV2
btfsc ADCON0, GODONE ; BIT GODONE, (ADCON0)
goto ADCONV2 ; JP NZ, ADCONV2
; # 6. A/D結果レジスタ組(ADRESH:ADRESL)を読みます、必要ならADIFビットをクリアします。
movf ADRESH, W ; LD A, (ADRESH)
movwf INDF ; LD (IX), A
call RS232CTRNS ; CALL RS232CTRNS
; # 7. 次の変換に備え、必要ならステップ1か2を実行します。
; # 各ビットごとのA/D変換時間はTADで示されます。
; # 次のサンプリングを開始する前に、最低2TADの待ち時間が必要です。
movlw 10 ; LD A, 10 ; 1秒の場合、10を指定すると、
call WAITnx01sm25us ; CALL WAITnx01sm25us ; 2行で 10 x 100ms - 25us 消費する
goto ADCONV1 ; JP ADCONV1 ; TAD = 2us = 4MHz:8Tosc