計測機能付き抵抗パーツケース

ブレッドボードで実験した後の抵抗をパーツケースに戻すのはとても大変です。テスターで抵抗値を計測して戻すか、カラーコードを読まなければなりません。分類しておかないと再度使用するときに必要な抵抗値の物を探し出すのが大変です。そこで計測機能付きのパーツケースを作ることにしました。安物のデジタルテスターをパーツケースに内蔵してしまうのが最も簡単ですが、この方法だと計測値を読むという行為と、抵抗をパーツケースの仕切りのどの位置に入れるのかを探すという余計な行為が必要になります。


2008-08-24

20個程度なら分類しない方が楽です。ただし100個以上になると、この中から必要な抵抗を探し出すのが面倒なのです。

PICT7629.jpg

ブレッドボード用のパーツケース。

PICT7628.jpg

より分けるのが面倒なので、この右隅にかまわず放り込んでいる。

ブレッドボードで実験を終了した後は、このパーツケースに抵抗値毎に分類して戻したいのですが、テスターで計測するか、カラーコードを読まないといけないのです。10kΩなどよく使う抵抗値のカラーコードは記憶しているのでカラーコードを読む時間はごく短時間ですが、10kΩがこのパーツケースのどの位置にあるのかまでは記憶していないので、貼ってあるラベルを読まなければなりません。

PICT7627.jpg

抵抗用のパーツケース。抵抗値毎に分類してある。2段になっていて使用頻度の高い抵抗値の物が上段にある。

そこで考えたのがこれ。抵抗値を計測して、抵抗を入れる場所の区画が光ってくれるとラベルを読んだり計測値を読んだりする必要がありません。

PICT7634.jpg

抵抗を入れる場所のLEDが光ってくれると便利

抵抗値の計測など、分圧した電圧をPICのA/Dコンバーターで計測すれば簡単だと思っていたが、計測する抵抗値の範囲が広く(10Ω~1MΩに対応させたい)簡単にいかないことがわかって色々実験してみました。1つの測定レンジでは対応できないのでレンジ切り替えが必要になります。もちろん手動でレンジ切り替えする方式は面倒すぎるので自動切り替えにします。

PICT7626.jpg

オペアンプを使用した差動増幅回路(インスツルメンテーションアンプ)とレンジ切り替えの実験。

PICT7623.jpg

レンジ切り替えはPICのI/Oポートが3ステートなので、これを利用することにした。ポートを入力にすればハイインピーダンスになるが、このときポートから電流が漏れると計測誤差になる。漏れ電流は±1μAしかないので十分実用になりそう。

2008-08-25

●一番左の部分にあるコネクタ群が抵抗を測定する端子です。こんなに必要ありませんが緩くなったりしたときのためにたくさん付けておきます。
●倍率の違うアンプを3種用意して、アンプの出力をA/Dコンバーターで計測します。
 レンジによっては出力が振り切れますが、「振り切れ」はソフトで判断して計測値に採用しません。
 回路はインスツルメンテーションアンプという差動アンプです。
 非反転増幅回路のシンプルな方法も考えましたが、非反転増幅回路では 0.01V × 100倍 = 1V にはなってくれません。
 この回路は差動増幅回路にしましたが、オートゼロオペアンプとかいうものもあるらしいので(Microchip社 MCP6V01等)
 回路をシンプルにするなら、オートゼロを採用する方が正しいかもしれない。(そのうち購入して実験してみよう)
●一番インチキ臭いのは、測定端子の上下に並んでいる2組、計6個の抵抗に電源電圧を与える部分です。
 GNDはPICのポートのLOW、+5VはPICのポートのHIGHです。
 実際はGNDは0Vではなく0.0?V程度です、5Vも4.75V程度ですが、再現性さえ良ければ正しく計測できるので
 一番簡単そうなこの方法にしました。
●電源は電池4本の予定。DC-DCコンバーターで電池2本(=3V)を昇圧する方法も考えましたが
 2段重ねのパーツケースの下段全てを回路のスペースとして使用する予定なので、無理に1枚の基板に全てを
 納める必要もなく、後でどうにでもなるので、とりあえず電池4本の手抜き設計にします。

teikoukeisch011.GIF
回路図 拡大版
ファイル ファイルタイプ 添付ファイルの解説
teikoukeisch01.GIF GIF 上の回路図は、つぶれて見えない部分があるので大きい物を添付しました

2008-09-08

基板を作成。サイズは100×75。ジャンパー線は3本に収めることが出来た。LED回路部分は基板に出来るサイズではないので、空中配線することになる。

PICT7836.jpg

有効期限はたっぷり残っていたのだが、何だかあまりきれいに現像できなかった。この大きさの写真だとわかりませんが...

PICはどんどん値段が下がっています。今回使っているPIC16F877Aは贅沢品で、ほぼ同機能のPIC16F887は秋月電子で¥250しかしません。ソケットを使うのがもったいないので直接半田付けしてしまうことにしました。その方が背も低くなりケースに入れるのが楽になります。

PICT7848.jpg

出来るだけ背を低くする

PICT7850.jpg

PICもオペアンプもソケット無し

2008-09-11

ホーザンのパーツケースを加工して作ります。仕切りは全部で72あります。よく使う1kΩ台、10kΩ台にそれぞれ24区画(E24系列)、100Ω台に12区画(E24系列をE12系列に丸める)、100kΩ台は6区画(E6系列)、残りの1Ω、10Ω、1MΩは、殆ど使用しないので6区画に同居させる。

PICT7663.jpg

ホーザンのパーツケースに入れることにする。むかしの物より上蓋が開けやすくなったが、仕切りがとてもはめ込みにくい。

PICT7664.jpg

ついでにリングスターのパーツケースも購入。シンプルな構造だが非常に使いやすい。こんな大きな仕切りの物はホームセンターでは売っていないがモノタローで購入できる

2008-09-14

オペアンプの回路は3つとも同じ。1つ間違えていれば3つとも間違えてしまう。下からは見えないので不細工だけど良しとしよう。

PICT7923.jpg

LEDを除いて配線完了

PICT7924.jpg

修正入りまくり

2008-09-15

ホーザンのパーツケースは無加工で使用することにした。アクリル板に穴を開けてLEDを並べパーツケースの下に仕込む。基板はアクリル板にぶら下げる。

PICT7925.jpg

LEDのレイアウトを決める

2008-09-20

精度は必要有りませんが、フライス盤で穴開け。テーブルが小さいので2回に分ける必要があります。

PICT7944.jpg

アクリル板。サイズがちょっと合わないが

PICT7947.jpg

穴開け

LEDの配線は耐熱被覆銅線では手間がかかりすぎるので、半田の熱で被覆が溶けるポリウレタン銅線を使用します。大体5秒程度加熱すると被覆が溶けます。

PICT7948.jpg

基板の取り付け位置確認

PICT7951.jpg

LEDの配線用電線

2008-09-21

LEDの田植え完了です。

PICT7953.jpg

LED配線完了

PICT7959.jpg

たくさん入れると判りにくいが、よく使う抵抗値のものしか満杯にはならないし、よく使う物はこんな物使わなくてもカラーコードを覚えているので問題はあまりない

タックシールの大きいやつにレーザープリンターでラベルを印刷して。カッターで切り離します。根性の71枚です。

PICT7962.jpg

ラベル作り

PICT7963.jpg

取り出すときのことを考えるとラベルが必要なのです。

PIC16F877にはありませんでしたがPIC16F877AにはADCON1レジスターにADCS2があります。A/Dコンバーターのクロックを定義する物ですがmikroBASICの定義ファイルにありません。たぶんバグでしょう。ソースファイルに symbol ADCS2 = 6 を追加してこれに対処します。

PICT7966.jpg

ADCS2の定義がないなー

2008-09-22

完成しました。電流が少ししか流れていない回路の電圧をオペアンプで100倍するのは無理があるようで動作が安定しませんでした。高抵抗の測定は2倍のレンジしか使用していません。低抵抗を計測するときはPICの出力インピーダンスが意外に大きいため電圧降下が大きくなります。PICの出力ポートのインピーダンスは40Ω程度あるようです。出力端子には40Ωの抵抗が繋がっていると考えると大体実測値と理論値が合います。
電源は当初電池にする予定でしたが使用頻度は年に20回以下と判断し電源アダプターに変更しました。その方が電源電圧の変動(電池の消耗)を気にしないですみます。

PICT7975.jpg

LED点灯の様子

PICT7976.jpg

測定端子。人間工学的には端子が横に並んでいる方が使いやすかった。ちょっと失敗。縦に抵抗をセットするのは意外に使いにくい。

PICT7978.jpg

カラーコードを読まないで良くなるので整理が大分楽になりました。特に紫と茶色は区別がしにくいのですがこれを使えば悩む必要もありません。

使っているところ
ファイル ファイルタイプ 添付ファイルの解説
teikoukei.wmv MOVIE 分類して楽しむの図。ガキの頃は遊んだ後の片付けなんかしなかったんだけどね~

部品表

パーツリスト
部品番号 型式 購入先 数量 単価 価格 備考
プリント基板 サンハヤト 40K 千石電商 1 480 480
IC1 PIC16F877A 秋月電子 1 400 400
IC2,IC3,IC4オペアンプ LMC660CN 秋月電子 3 200 600
X1 セラロック4MHz 秋月電子 1 40 40
R1 10kΩ 1/6W 秋月電子 1 1 1
C1,C3-C5 積層セラミック 0.1uF 秋月電子 4 5 20
R2-R7 330Ω 1/6W 秋月電子 6 1 6
R8,R32 300Ω 1/6W 秋月電子 2 1 2
R9,R33 33kΩ 1/6W 秋月電子 2 1 2
R10,R34 680kΩ 1/6W 秋月電子 2 1 2
R11-R15,R17-R19,R24-R31 10kΩ 1/6W 秋月電子 16 1 16
R16,R31 100kΩ 1/6W 秋月電子 2 1 2
R20 18kΩ 1/6W 秋月電子 1 1 1
R21 1.8kΩ 1/6W 秋月電子 1 1 1
R22 2kΩ 1/6W 秋月電子 1 1 1
R35 560Ω 1/6W 秋月電子 1 1 1
C3-C5 18kΩ 1/6W 秋月電子 1 1 1
C6-C8 10μF 16V 千石電商 3 16 48
C2 100μF 10V 千石電商 1 20 20
LED1 3mm緑 秋月電子 1 5 5
LED2~ 5mm赤 秋月電子 1 400 400 100個入り
アクリル板 3mm 300×200mm 千石電商 1 290 290
DCジャック MJ-14 千石電商 1 74 74
AC-DCアダプター 5V 2A 秋月電子 1 550 550
パーツケース ホーザン MonoTaro 1 2975 2975
ネジ いろいろ 廣杉計器 1 100 100
合計 6038
回路図+基板パターン+プログラムソース+HEXファイル
この回路は、高精度抵抗やトリマを使用せずにソフトでその誤差を吸収しています。実測しながらソフトを書きました。同じ部品を使用しても同じソフトが使えません。そのためプログラムソースや回路図はご参考です。
ファイル ファイルタイプ 添付ファイルの解説
TEIKOUKEI_eagle.zip EAGLE EAGLE回路図&基板パターン
teikoukei.GIF GIF 最終形回路図
TEIKOUKEI_mikrobasic.zip OTHER プログラムソース
teikoukei_excel.zip OTHER ご参考。抵抗値と表示するLEDの対応テーブルはEXCELで生成

内部の状態

PICT7981.jpg

電源部と内部の状態

PICT7983.jpg

電源部

PICT7985.jpg

アクリル板は10mm小さいので角ブロックとネジで動かないようにしている。角ブロックは廣杉計器で購入した市販品。

2008-09-23

プログラムの解説
0001  '------------------------------------------------------ 2008-09-22 -------------
0002 ' TEIKOU PARTS CASE
0003 '-------------------------------------------------------------------------------
0004 program TEIKOUKEI
0005
0006 symbol RANGE1_VCC_TRIS = TRISC
0007 symbol RANGE1_VCC_PORT = PORTC
0008 symbol RANGE1_VCC_BIT = 0
0009
0010 symbol RANGE1_VSS_TRIS = TRISE
0011 symbol RANGE1_VSS_PORT = PORTE
0012 symbol RANGE1_VSS_BIT = 2
0013
0014 symbol RANGE2_VCC_TRIS = TRISC
0015 symbol RANGE2_VCC_PORT = PORTC
0016 symbol RANGE2_VCC_BIT = 1
0017
0018 symbol RANGE2_VSS_TRIS = TRISE
0019 symbol RANGE2_VSS_PORT = PORTE
0020 symbol RANGE2_VSS_BIT = 1
0021
0022 symbol RANGE3_VCC_TRIS = TRISC
0023 symbol RANGE3_VCC_PORT = PORTC
0024 symbol RANGE3_VCC_BIT = 2
0025
0026 symbol RANGE3_VSS_TRIS = TRISE
0027 symbol RANGE3_VSS_PORT = PORTE
0028 symbol RANGE3_VSS_BIT = 0
0029
0030 symbol RANGE1_AD_TRIS = TRISA
0031 symbol RANGE1_AD_PORT = PORTA
0032 symbol RANGE1_AD_BIT = 0
0033
0034 symbol RANGE2_AD_TRIS = TRISA
0035 symbol RANGE2_AD_PORT = PORTA
0036 symbol RANGE2_AD_BIT = 1
0037
0038 symbol RANGE3_AD_TRIS = TRISA
0039 symbol RANGE3_AD_PORT = PORTA
0040 symbol RANGE3_AD_BIT = 2
0041
0042 symbol PORT_OUTPUT = 0
0043 symbol PORT_INPUT = 1
0044
0045 symbol LED_ROW_1_TRIS = TRISB
0046 symbol LED_ROW_2_TRIS = TRISB
0047 symbol LED_ROW_3_TRIS = TRISB
0048 symbol LED_ROW_4_TRIS = TRISB
0049 symbol LED_ROW_5_TRIS = TRISB
0050 symbol LED_ROW_6_TRIS = TRISB
0051 symbol LED_ROW_1_PORT = PORTB
0052 symbol LED_ROW_2_PORT = PORTB
0053 symbol LED_ROW_3_PORT = PORTB
0054 symbol LED_ROW_4_PORT = PORTB
0055 symbol LED_ROW_5_PORT = PORTB
0056 symbol LED_ROW_6_PORT = PORTB
0057 symbol LED_ROW_1_BIT = 5
0058 symbol LED_ROW_2_BIT = 4
0059 symbol LED_ROW_3_BIT = 3
0060 symbol LED_ROW_4_BIT = 2
0061 symbol LED_ROW_5_BIT = 1
0062 symbol LED_ROW_6_BIT = 0
0063
0064 symbol LED_COL_01_TRIS = TRISD
0065 symbol LED_COL_02_TRIS = TRISD
0066 symbol LED_COL_03_TRIS = TRISD
0067 symbol LED_COL_04_TRIS = TRISD
0068 symbol LED_COL_05_TRIS = TRISC
0069 symbol LED_COL_06_TRIS = TRISC
0070 symbol LED_COL_07_TRIS = TRISC
0071 symbol LED_COL_08_TRIS = TRISC
0072 symbol LED_COL_09_TRIS = TRISD
0073 symbol LED_COL_10_TRIS = TRISD
0074 symbol LED_COL_11_TRIS = TRISD
0075 symbol LED_COL_12_TRIS = TRISD
0076
0077 symbol LED_COL_01_PORT = PORTD
0078 symbol LED_COL_02_PORT = PORTD
0079 symbol LED_COL_03_PORT = PORTD
0080 symbol LED_COL_04_PORT = PORTD
0081 symbol LED_COL_05_PORT = PORTC
0082 symbol LED_COL_06_PORT = PORTC
0083 symbol LED_COL_07_PORT = PORTC
0084 symbol LED_COL_08_PORT = PORTC
0085 symbol LED_COL_09_PORT = PORTD
0086 symbol LED_COL_10_PORT = PORTD
0087 symbol LED_COL_11_PORT = PORTD
0088 symbol LED_COL_12_PORT = PORTD
0089
0090 symbol LED_COL_01_BIT = 7
0091 symbol LED_COL_02_BIT = 6
0092 symbol LED_COL_03_BIT = 5
0093 symbol LED_COL_04_BIT = 4
0094 symbol LED_COL_05_BIT = 7
0095 symbol LED_COL_06_BIT = 6
0096 symbol LED_COL_07_BIT = 5
0097 symbol LED_COL_08_BIT = 4
0098 symbol LED_COL_09_BIT = 3
0099 symbol LED_COL_10_BIT = 2
0100 symbol LED_COL_11_BIT = 1
0101 symbol LED_COL_12_BIT = 0
0102
0103 symbol LED_COL_OFF = 0
0104 symbol LED_COL_ON = 1
0105
0106 symbol LED_ROW_OFF = 1
0107 symbol LED_ROW_ON = 0
0108
0109 symbol MAX_E24RANGE = 145
0110 symbol RANGE_AD_REG = 0
0111 symbol REG_FROM = 1
0112 symbol REG_TO = 2
0113 symbol ROW_COL = 3
0114
0115 '----- PIC16F877A A/D con FSOC ---------------------
0116 symbol ADCS2 = 6
0117
0118
0119 const e24range as word[MAX_E24RANGE][4] = (
0120 (0x0103,092,190,0x0606),
0121 (0x0103,191,208,0x0606),
0122 (0x0103,209,227,0x0606),
0123 (0x0103,228,254,0x0606),
0124 (0x0103,255,281,0x0605),
0125 (0x0103,282,308,0x0605),
0126 (0x0103,309,345,0x0605),
0127 (0x0103,346,381,0x0605),
0128 (0x0103,382,417,0x0604),
0129 (0x0103,418,462,0x0604),
0130 (0x0103,463,517,0x0604),
0131 (0x0103,518,571,0x0604),
0132 (0x0103,572,625,0x0603),
0133 (0x0103,626,679,0x0603),
0134 (0x0103,680,742,0x0603),
0135 (0x0103,743,814,0x0603),
0136 (0x0103,815,886,0x0602),
0137 (0x0102,090,097,0x0602),
0138 (0x0102,098,107,0x0602),
0139 (0x0102,108,118,0x0602),
0140 (0x0102,119,130,0x0602),
0141 (0x0102,131,143,0x0602),
0142 (0x0102,144,157,0x0602),
0143 (0x0102,158,173,0x0602),
0144 (0x0102,174,191,0x0606),
0145 (0x0102,192,209,0x0606),
0146 (0x0102,210,226,0x0606),
0147 (0x0102,227,253,0x0606),
0148 (0x0102,254,280,0x0605),
0149 (0x0102,281,306,0x0605),
0150 (0x0102,307,341,0x0605),
0151 (0x0102,342,376,0x0605),
0152 (0x0102,377,411,0x0604),
0153 (0x0102,412,454,0x0604),
0154 (0x0102,455,506,0x0604),
0155 (0x0102,507,556,0x0604),
0156 (0x0102,557,607,0x0603),
0157 (0x0102,608,657,0x0603),
0158 (0x0102,658,715,0x0603),
0159 (0x0101,125,135,0x0603),
0160 (0x0101,136,147,0x0602),
0161 (0x0101,148,159,0x0602),
0162 (0x0101,160,174,0x0602),
0163 (0x0101,175,190,0x0602),
0164 (0x0101,191,208,0x0602),
0165 (0x0101,209,226,0x0602),
0166 (0x0101,227,246,0x0602),
0167 (0x0101,247,269,0x0602),
0168 (0x0101,270,292,0x030C),
0169 (0x0101,293,316,0x030C),
0170 (0x0101,317,339,0x030B),
0171 (0x0101,340,373,0x030B),
0172 (0x0101,374,406,0x030A),
0173 (0x0101,407,437,0x030A),
0174 (0x0101,438,477,0x0309),
0175 (0x0101,478,515,0x0309),
0176 (0x0101,516,552,0x0308),
0177 (0x0101,553,595,0x0308),
0178 (0x0101,596,644,0x0307),
0179 (0x0101,645,690,0x0307),
0180 (0x0101,691,734,0x0306),
0181 (0x0101,735,775,0x0306),
0182 (0x0101,776,820,0x0305),
0183 (0x0101,821,868,0x0305),
0184 (0x0101,869,912,0x0304),
0185 (0x0202,093,101,0x0304),
0186 (0x0202,102,111,0x0303),
0187 (0x0202,112,122,0x0303),
0188 (0x0202,123,135,0x0302),
0189 (0x0202,136,148,0x0302),
0190 (0x0202,149,163,0x0301),
0191 (0x0202,164,179,0x0301),
0192 (0x0202,180,197,0x040C),
0193 (0x0202,198,216,0x040B),
0194 (0x0202,217,234,0x040A),
0195 (0x0202,235,262,0x0409),
0196 (0x0202,263,289,0x0408),
0197 (0x0202,290,316,0x0407),
0198 (0x0202,317,353,0x0406),
0199 (0x0202,354,389,0x0405),
0200 (0x0202,390,425,0x0404),
0201 (0x0202,426,469,0x0403),
0202 (0x0202,470,522,0x0402),
0203 (0x0202,523,575,0x0401),
0204 (0x0202,576,627,0x050C),
0205 (0x0202,628,678,0x050B),
0206 (0x0202,679,738,0x050A),
0207 (0x0202,739,805,0x0509),
0208 (0x0202,806,872,0x0508),
0209 (0x0201,152,164,0x0507),
0210 (0x0201,165,180,0x0506),
0211 (0x0201,181,196,0x0505),
0212 (0x0201,197,214,0x0504),
0213 (0x0201,215,233,0x0503),
0214 (0x0201,234,254,0x0502),
0215 (0x0201,255,277,0x0501),
0216 (0x0201,278,301,0x020C),
0217 (0x0201,302,325,0x020B),
0218 (0x0201,326,349,0x020A),
0219 (0x0201,350,383,0x0209),
0220 (0x0201,384,417,0x0208),
0221 (0x0201,418,449,0x0207),
0222 (0x0201,450,490,0x0206),
0223 (0x0201,491,529,0x0205),
0224 (0x0201,530,566,0x0204),
0225 (0x0201,567,610,0x0203),
0226 (0x0201,611,660,0x0202),
0227 (0x0201,661,706,0x0201),
0228 (0x0201,707,750,0x010C),
0229 (0x0201,751,792,0x010B),
0230 (0x0201,793,837,0x010A),
0231 (0x0201,838,885,0x0109),
0232 (0x0201,886,930,0x0108),
0233 (0x0301,077,083,0x0107),
0234 (0x0301,084,091,0x0106),
0235 (0x0301,092,100,0x0105),
0236 (0x0301,101,109,0x0104),
0237 (0x0301,110,120,0x0103),
0238 (0x0301,121,131,0x0102),
0239 (0x0301,132,144,0x0101),
0240 (0x0301,145,157,0x060C),
0241 (0x0301,158,171,0x060C),
0242 (0x0301,172,185,0x060C),
0243 (0x0301,186,205,0x060C),
0244 (0x0301,206,225,0x060B),
0245 (0x0301,226,244,0x060B),
0246 (0x0301,245,269,0x060B),
0247 (0x0301,270,294,0x060B),
0248 (0x0301,295,318,0x060A),
0249 (0x0301,319,347,0x060A),
0250 (0x0301,348,381,0x060A),
0251 (0x0301,382,413,0x060A),
0252 (0x0301,414,445,0x0609),
0253 (0x0301,446,475,0x0609),
0254 (0x0301,476,509,0x0609),
0255 (0x0301,510,546,0x0609),
0256 (0x0301,547,581,0x0608),
0257 (0x0301,582,619,0x0608),
0258 (0x0301,620,663,0x0608),
0259 (0x0301,664,709,0x0608),
0260 (0x0301,710,755,0x0607),
0261 (0x0301,756,801,0x0607),
0262 (0x0301,802,851,0x0607),
0263 (0x0301,852,902,0x0607),
0264 (0x0301,903,952,0x0606))
0265
0266
0267
0268
0269 '===============================================================================
0270 ' range kirikae
0271 '===============================================================================
0272 sub procedure resistance_range_change( dim range as byte )
0273 RANGE1_VCC_TRIS.RANGE1_VCC_BIT = PORT_INPUT
0274 RANGE1_VSS_TRIS.RANGE1_VSS_BIT = PORT_INPUT
0275 RANGE2_VCC_TRIS.RANGE2_VCC_BIT = PORT_INPUT
0276 RANGE2_VSS_TRIS.RANGE2_VSS_BIT = PORT_INPUT
0277 RANGE3_VCC_TRIS.RANGE3_VCC_BIT = PORT_INPUT
0278 RANGE3_VSS_TRIS.RANGE3_VSS_BIT = PORT_INPUT
0279
0280 select case range
0281 case 1
0282 RANGE1_VCC_TRIS.RANGE1_VCC_BIT = PORT_OUTPUT
0283 RANGE1_VSS_TRIS.RANGE1_VSS_BIT = PORT_OUTPUT
0284 RANGE1_VCC_PORT.RANGE1_VCC_BIT = 0
0285 RANGE1_VSS_PORT.RANGE1_VSS_BIT = 1
0286 case 2
0287 RANGE2_VCC_TRIS.RANGE2_VCC_BIT = PORT_OUTPUT
0288 RANGE2_VSS_TRIS.RANGE2_VSS_BIT = PORT_OUTPUT
0289 RANGE2_VCC_PORT.RANGE2_VCC_BIT = 0
0290 RANGE2_VSS_PORT.RANGE2_VSS_BIT = 1
0291 case 3
0292 RANGE3_VCC_TRIS.RANGE3_VCC_BIT = PORT_OUTPUT
0293 RANGE3_VSS_TRIS.RANGE3_VSS_BIT = PORT_OUTPUT
0294 RANGE3_VCC_PORT.RANGE3_VCC_BIT = 0
0295 RANGE3_VSS_PORT.RANGE3_VSS_BIT = 1
0296 end select
0297 end sub
0298
0299 '===============================================================================
0300 ' LED_init
0301 '===============================================================================
0302 sub procedure led_port_init
0303 LED_ROW_1_TRIS.LED_ROW_1_BIT = PORT_OUTPUT
0304 LED_ROW_2_TRIS.LED_ROW_2_BIT = PORT_OUTPUT
0305 LED_ROW_3_TRIS.LED_ROW_3_BIT = PORT_OUTPUT
0306 LED_ROW_4_TRIS.LED_ROW_4_BIT = PORT_OUTPUT
0307 LED_ROW_5_TRIS.LED_ROW_5_BIT = PORT_OUTPUT
0308 LED_ROW_6_TRIS.LED_ROW_6_BIT = PORT_OUTPUT
0309
0310 LED_COL_01_TRIS.LED_COL_01_BIT = PORT_OUTPUT
0311 LED_COL_02_TRIS.LED_COL_02_BIT = PORT_OUTPUT
0312 LED_COL_03_TRIS.LED_COL_03_BIT = PORT_OUTPUT
0313 LED_COL_04_TRIS.LED_COL_04_BIT = PORT_OUTPUT
0314 LED_COL_05_TRIS.LED_COL_05_BIT = PORT_OUTPUT
0315 LED_COL_06_TRIS.LED_COL_06_BIT = PORT_OUTPUT
0316 LED_COL_07_TRIS.LED_COL_07_BIT = PORT_OUTPUT
0317 LED_COL_08_TRIS.LED_COL_08_BIT = PORT_OUTPUT
0318 LED_COL_09_TRIS.LED_COL_09_BIT = PORT_OUTPUT
0319 LED_COL_10_TRIS.LED_COL_10_BIT = PORT_OUTPUT
0320 LED_COL_11_TRIS.LED_COL_11_BIT = PORT_OUTPUT
0321 LED_COL_12_TRIS.LED_COL_12_BIT = PORT_OUTPUT
0322 end sub
0323
0324 '===============================================================================
0325 ' LED_off
0326 '===============================================================================
0327 sub procedure led_off
0328 LED_ROW_1_PORT.LED_ROW_1_BIT = LED_ROW_OFF
0329 LED_ROW_2_PORT.LED_ROW_2_BIT = LED_ROW_OFF
0330 LED_ROW_3_PORT.LED_ROW_3_BIT = LED_ROW_OFF
0331 LED_ROW_4_PORT.LED_ROW_4_BIT = LED_ROW_OFF
0332 LED_ROW_5_PORT.LED_ROW_5_BIT = LED_ROW_OFF
0333 LED_ROW_6_PORT.LED_ROW_6_BIT = LED_ROW_OFF
0334
0335 LED_COL_01_PORT.LED_COL_01_BIT = LED_COL_OFF
0336 LED_COL_02_PORT.LED_COL_02_BIT = LED_COL_OFF
0337 LED_COL_03_PORT.LED_COL_03_BIT = LED_COL_OFF
0338 LED_COL_04_PORT.LED_COL_04_BIT = LED_COL_OFF
0339 LED_COL_05_PORT.LED_COL_05_BIT = LED_COL_OFF
0340 LED_COL_06_PORT.LED_COL_06_BIT = LED_COL_OFF
0341 LED_COL_07_PORT.LED_COL_07_BIT = LED_COL_OFF
0342 LED_COL_08_PORT.LED_COL_08_BIT = LED_COL_OFF
0343 LED_COL_09_PORT.LED_COL_09_BIT = LED_COL_OFF
0344 LED_COL_10_PORT.LED_COL_10_BIT = LED_COL_OFF
0345 LED_COL_11_PORT.LED_COL_11_BIT = LED_COL_OFF
0346 LED_COL_12_PORT.LED_COL_12_BIT = LED_COL_OFF
0347 end sub
0348
0349
0350 '===============================================================================
0351 ' LED_on
0352 '===============================================================================
0353 sub procedure led_on( dim row as byte, dim col as byte )
0354 select case row
0355 case 1 LED_ROW_1_PORT.LED_ROW_1_BIT = LED_ROW_ON
0356 case 2 LED_ROW_2_PORT.LED_ROW_2_BIT = LED_ROW_ON
0357 case 3 LED_ROW_3_PORT.LED_ROW_3_BIT = LED_ROW_ON
0358 case 4 LED_ROW_4_PORT.LED_ROW_4_BIT = LED_ROW_ON
0359 case 5 LED_ROW_5_PORT.LED_ROW_5_BIT = LED_ROW_ON
0360 case 6 LED_ROW_6_PORT.LED_ROW_6_BIT = LED_ROW_ON
0361 end select
0362 select case col
0363 case 1 LED_COL_01_PORT.LED_COL_01_BIT = LED_COL_ON
0364 case 2 LED_COL_02_PORT.LED_COL_02_BIT = LED_COL_ON
0365 case 3 LED_COL_03_PORT.LED_COL_03_BIT = LED_COL_ON
0366 case 4 LED_COL_04_PORT.LED_COL_04_BIT = LED_COL_ON
0367 case 5 LED_COL_05_PORT.LED_COL_05_BIT = LED_COL_ON
0368 case 6 LED_COL_06_PORT.LED_COL_06_BIT = LED_COL_ON
0369 case 7 LED_COL_07_PORT.LED_COL_07_BIT = LED_COL_ON
0370 case 8 LED_COL_08_PORT.LED_COL_08_BIT = LED_COL_ON
0371 case 9 LED_COL_09_PORT.LED_COL_09_BIT = LED_COL_ON
0372 case 10 LED_COL_10_PORT.LED_COL_10_BIT = LED_COL_ON
0373 case 11 LED_COL_11_PORT.LED_COL_11_BIT = LED_COL_ON
0374 case 12 LED_COL_12_PORT.LED_COL_12_BIT = LED_COL_ON
0375 end select
0376 end sub
0377
0378 '===============================================================================
0379 ' get_adcon
0380 '===============================================================================
0381 sub function get_adcon( dim range as byte ) as word
0382 dim temp_word as word
0383
0384 select case range
0385 case 1
0386 ADCON0.CHS2 = 0 ' A/D chanel select select AN0
0387 ADCON0.CHS1 = 0 ' A/D chanel select select AN0
0388 ADCON0.CHS0 = 0 ' A/D chanel select select AN0
0389 case 2
0390 ADCON0.CHS2 = 0 ' A/D chanel select select AN1
0391 ADCON0.CHS1 = 0 ' A/D chanel select select AN1
0392 ADCON0.CHS0 = 1 ' A/D chanel select select AN1
0393 case 3
0394 ADCON0.CHS2 = 0 ' A/D chanel select select AN2
0395 ADCON0.CHS1 = 1 ' A/D chanel select select AN2
0396 ADCON0.CHS0 = 0 ' A/D chanel select select AN2
0397 end select
0398
0399 Delay_ms(100)
0400 ADCON0.GO = 1
0401 while ADCON0.GO = 1
0402 wend
0403
0404 temp_word = ADRESH
0405 temp_word = temp_word << 8
0406 temp_word = temp_word or ADRESL
0407
0408 result = temp_word
0409 end sub
0410
0411 '===============================================================================
0412 ' indicate
0413 '===============================================================================
0414 sub function indicate(
0415 dim resistance_range as byte,
0416 dim adcon_range as byte,
0417 dim ad_value as word ) as boolean
0418
0419 dim e24_index as byte
0420
0421 dim reg_range as byte
0422 dim adc_range as byte
0423 dim temp_word as word
0424 dim row as byte
0425 dim col as byte
0426 dim reg_from_v as word
0427 dim reg_to_v as word
0428
0429 for e24_index = 0 to MAX_E24RANGE - 1
0430
0431 temp_word = e24range[e24_index][RANGE_AD_REG]
0432 adc_range = temp_word
0433 reg_range = temp_word >> 8
0434
0435 temp_word = e24range[e24_index][ROW_COL]
0436 col = temp_word
0437 row = temp_word >> 8
0438
0439 reg_from_v = e24range[e24_index][REG_FROM]
0440 reg_to_v = e24range[e24_index][REG_TO]
0441 if (reg_range = resistance_range) and (adcon_range = adc_range) then
0442 if ( reg_from_v <= ad_value ) and ( ad_value <= reg_to_v ) then
0443 led_off
0444 led_on( row, col )
0445 result = True
0446 return
0447 end if
0448 end if
0449 next e24_index
0450
0451 result = False
0452 end sub
0453
0454
0455 '===============================================================================
0456 ' A/D conveter initialize
0457 '===============================================================================
0458 sub procedure ad_init
0459 ADCON0.ADCS1 = 1 ' A/D Clock FSOC/64
0460 ADCON0.ADCS0 = 0 ' A/D Clock FSOC/64
0461 ADCON1.ADCS2 = 1 ' A/D Clock FSOC/64
0462 ADCON0.CHS2 = 0 ' A/D chanel select select AN0
0463 ADCON0.CHS1 = 0 ' A/D chanel select select AN0
0464 ADCON0.CHS0 = 0 ' A/D chanel select select AN0
0465 ADCON0.ADON = 1 ' A/D converter ON
0466
0467 ADCON1.ADFM = 1 ' A/D Result Format : Right justified
0468
0469 ADCON1.PCFG3 = 0 ' PORTE = Digital PORTA = Analog
0470 ADCON1.PCFG2 = 0 ' PORTE = Digital PORTA = Analog
0471 ADCON1.PCFG1 = 1 ' PORTE = Digital PORTA = Analog
0472 ADCON1.PCFG0 = 0 ' PORTE = Digital PORTA = Analog
0473
0474 RANGE1_AD_TRIS.RANGE1_AD_BIT = PORT_INPUT
0475 RANGE2_AD_TRIS.RANGE2_AD_BIT = PORT_INPUT
0476 RANGE3_AD_TRIS.RANGE3_AD_BIT = PORT_INPUT
0477 end sub
0478
0479 '*******************************************************************************
0480 ' teikoukei Program main
0481 '*******************************************************************************
0482 main:
0483 dim resistance_range as byte
0484 dim adcon_range as byte
0485 dim ad_value as word
0486
0487 '---- disable port B pull-up -------------
0488 OPTION_REG.NOT_RBPU = 1
0489
0490 ad_init
0491
0492 led_port_init
0493 led_off
0494
0495 while(TRUE)
0496 for resistance_range = 1 to 3
0497 resistance_range_change(resistance_range)
0498 for adcon_range = 1 to 3
0499 ad_value = get_adcon(adcon_range)
0500 indicate( resistance_range, adcon_range, ad_value )
0501 next adcon_range
0502 next resistance_range
0503 wend
0504 end.
0505
行番号
解説
6-113
ポートの定義
116
mikroBASICの定義ファイルのADCON1.ADCS2定義抜けの対応
119-264
これが、このプログラムの心臓部と言っていい。1ワード目で示される測定レンジの時、A/Dコンバーターの計測値が2~3ワード目の値の範囲であれば4ワード目で示されるLEDを点灯する...というシンプルなロジック。この部分はEXCELで生成した。  1ワード目:抵抗レンジ1バイト+A/Dコンバーターレンジ1バイト を16進で持っている  2ワード目:A/Dコンバータで計測した値の範囲(下限)  3ワード目:A/Dコンバータで計測した値の範囲(上限)  4ワード目:点灯させるLEDの行番号(1バイト)+列番号(1バイト)
272-297
抵抗レンジの切り替え
302-322
LEDのポートを出力に設定
327-347
LEDの全消灯
353-376
引数で指定されたLEDを1つ点灯させる
381-409
A/D変換
399
電圧が安定するまで待っているがこの100msはテキトー もっと短くて良いはず
414-452
119行目から始まる計測テーブルと測定値を比べて該当するLEDを点灯させる
458-476
A/Dコンバーターの初期化
482-493
プログラムメインの初期化部。初期化サブルーチンを呼び出しているだけ。
495-503
抵抗レンジ3×A/Dコンバーターレンジ3を切り替えながら計測する。実際使用されていないレンジもあり、無駄なことをやっているが119行目からのテーブルをどのように変更してもこの部分に変更が及ばないように無駄な処理はそのままにしてある。399行目の待ち時間が長いので1ループするのに900msかかる。