2008-08-24
20個程度なら分類しない方が楽です。ただし100個以上になると、この中から必要な抵抗を探し出すのが面倒なのです。
ブレッドボード用のパーツケース。
より分けるのが面倒なので、この右隅にかまわず放り込んでいる。
ブレッドボードで実験を終了した後は、このパーツケースに抵抗値毎に分類して戻したいのですが、テスターで計測するか、カラーコードを読まないといけないのです。10kΩなどよく使う抵抗値のカラーコードは記憶しているのでカラーコードを読む時間はごく短時間ですが、10kΩがこのパーツケースのどの位置にあるのかまでは記憶していないので、貼ってあるラベルを読まなければなりません。
抵抗用のパーツケース。抵抗値毎に分類してある。2段になっていて使用頻度の高い抵抗値の物が上段にある。
そこで考えたのがこれ。抵抗値を計測して、抵抗を入れる場所の区画が光ってくれるとラベルを読んだり計測値を読んだりする必要がありません。
抵抗を入れる場所のLEDが光ってくれると便利
抵抗値の計測など、分圧した電圧をPICのA/Dコンバーターで計測すれば簡単だと思っていたが、計測する抵抗値の範囲が広く(10Ω~1MΩに対応させたい)簡単にいかないことがわかって色々実験してみました。1つの測定レンジでは対応できないのでレンジ切り替えが必要になります。もちろん手動でレンジ切り替えする方式は面倒すぎるので自動切り替えにします。
オペアンプを使用した差動増幅回路(インスツルメンテーションアンプ)とレンジ切り替えの実験。
レンジ切り替えは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本の手抜き設計にします。
2008-09-08
基板を作成。サイズは100×75。ジャンパー線は3本に収めることが出来た。LED回路部分は基板に出来るサイズではないので、空中配線することになる。
有効期限はたっぷり残っていたのだが、何だかあまりきれいに現像できなかった。この大きさの写真だとわかりませんが...
PICはどんどん値段が下がっています。今回使っているPIC16F877Aは贅沢品で、ほぼ同機能のPIC16F887は秋月電子で¥250しかしません。ソケットを使うのがもったいないので直接半田付けしてしまうことにしました。その方が背も低くなりケースに入れるのが楽になります。
出来るだけ背を低くする
PICもオペアンプもソケット無し
2008-09-11
ホーザンのパーツケースを加工して作ります。仕切りは全部で72あります。よく使う1kΩ台、10kΩ台にそれぞれ24区画(E24系列)、100Ω台に12区画(E24系列をE12系列に丸める)、100kΩ台は6区画(E6系列)、残りの1Ω、10Ω、1MΩは、殆ど使用しないので6区画に同居させる。
ホーザンのパーツケースに入れることにする。むかしの物より上蓋が開けやすくなったが、仕切りがとてもはめ込みにくい。
ついでにリングスターのパーツケースも購入。シンプルな構造だが非常に使いやすい。こんな大きな仕切りの物はホームセンターでは売っていないがモノタローで購入できる
2008-09-14
オペアンプの回路は3つとも同じ。1つ間違えていれば3つとも間違えてしまう。下からは見えないので不細工だけど良しとしよう。
LEDを除いて配線完了
修正入りまくり
2008-09-15
ホーザンのパーツケースは無加工で使用することにした。アクリル板に穴を開けてLEDを並べパーツケースの下に仕込む。基板はアクリル板にぶら下げる。
LEDのレイアウトを決める
2008-09-20
精度は必要有りませんが、フライス盤で穴開け。テーブルが小さいので2回に分ける必要があります。
アクリル板。サイズがちょっと合わないが
穴開け
LEDの配線は耐熱被覆銅線では手間がかかりすぎるので、半田の熱で被覆が溶けるポリウレタン銅線を使用します。大体5秒程度加熱すると被覆が溶けます。
基板の取り付け位置確認
LEDの配線用電線
2008-09-21
LEDの田植え完了です。
LED配線完了
たくさん入れると判りにくいが、よく使う抵抗値のものしか満杯にはならないし、よく使う物はこんな物使わなくてもカラーコードを覚えているので問題はあまりない
タックシールの大きいやつにレーザープリンターでラベルを印刷して。カッターで切り離します。根性の71枚です。
ラベル作り
取り出すときのことを考えるとラベルが必要なのです。
PIC16F877にはありませんでしたがPIC16F877AにはADCON1レジスターにADCS2があります。A/Dコンバーターのクロックを定義する物ですがmikroBASICの定義ファイルにありません。たぶんバグでしょう。ソースファイルに symbol ADCS2 = 6 を追加してこれに対処します。
ADCS2の定義がないなー
2008-09-22
完成しました。電流が少ししか流れていない回路の電圧をオペアンプで100倍するのは無理があるようで動作が安定しませんでした。高抵抗の測定は2倍のレンジしか使用していません。低抵抗を計測するときはPICの出力インピーダンスが意外に大きいため電圧降下が大きくなります。PICの出力ポートのインピーダンスは40Ω程度あるようです。出力端子には40Ωの抵抗が繋がっていると考えると大体実測値と理論値が合います。
電源は当初電池にする予定でしたが使用頻度は年に20回以下と判断し電源アダプターに変更しました。その方が電源電圧の変動(電池の消耗)を気にしないですみます。
LED点灯の様子
測定端子。人間工学的には端子が横に並んでいる方が使いやすかった。ちょっと失敗。縦に抵抗をセットするのは意外に使いにくい。
カラーコードを読まないで良くなるので整理が大分楽になりました。特に紫と茶色は区別がしにくいのですがこれを使えば悩む必要もありません。
部品表
パーツリスト | ||||||
部品番号 | 型式 | 購入先 | 数量 | 単価 | 価格 | 備考 |
プリント基板 | サンハヤト 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 |
内部の状態
電源部と内部の状態
電源部
アクリル板は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