1 ' ********************** 2 ' ADC_Controller 3 13A-ADC-2012xKai.bas 4 ' Ni-MH Chargeas 5 ' By JA8FGA 6 ' 2012/02/13 16:40 7 '*********************** 8 9 $regfile = "ATtiny13a.dat" 10 $crystal = 1200000 11 12 '*********************** 13 14 Config Int0 = Low Level ' Low Level割り込み 15 Config Adc = Single , Prescaler = Auto  'A/D変換モードセット 16 Config PORTE = Input 17 Config PORTB.3 = Input 18 Config PORTB.0 = Output 19 Config PORTB.2 = Output 20 Config PORTB.4 = Output 21 22 '*********************** 23 24 Dim A As Word ' 符号なし16Bit 整数型に設定。 25 Dim A2 As Word '      〃 26 27 Dim B As Byte ' 以下のB2と共にタイムオーバー設定   28 Dim B2 As Byte   29 Dim Cnt1 As Byte ' 経過時間の基本時間データ変数。 30 Dim Cnt As Byte ' 以下のCnt2と共に30分の時間を 31 Dim Cnt2 As Byte ' 作る為の時間保持変数 32 Dim Pbf As Byte ' 押しボタンの時間設定数。 33 Dim Pbf2 As Byte ' 2回目の割込み遅延数値 34 35 Dim Intf1 As Bit ' 割込後の諸動作用フラグ。 36 Dim Intf2 As Bit '      〃 37 Dim C1 As Bit ' 充電完了フラグ。 38 Dim Startf As Bit ' 充電開始フラグ。 39 40 '********************** 41 42 On Int0 Int0_int 43 Enable Interrupts 44 Enable Int0 45 Cnt1 = 230 ' 時間設定基本共用データ 46 Cnt = Cnt1    〃     データセット 47 Cnt2 = 8 ' 繰り返し数 セット (30分) 48 B = Cnt1 ' 時間設定基本データ セット 49 B2 = 50 ' 繰り返し数 セット (3時間分) 50 C1 = 1 ' 停止フラグ "0"で無限ループへ入る 51 A2 = 10             ' MAX値、保持変数にダミー数を(不要かも) 52 Pbf = 3 ' 約3秒間のボタン押し確保データ。 53 Pbf2 = 3 54 55 Reset Intf ' 割り込み1st実行フラグ。 56 Reset Intf2 ' 割り込み2nd実行フラグ。 57 Reset A2 ' ADC MAX データ取り込み変数リセット。 58 Set PORTB.0 ' 充電スタート信号 ON 59 Set PORTB.2 ' 充電表示 LED ON 60 61 '********************** 62 63 Do 64 If Intf1 = 1 Then ' 割り込みフラグが立ったら 65 If Startf <> 1 Then 66 Set Startf ' 充電開始フラグ、セット。 67 Set PORTB.0 ' 充電開始。 68 Set PORTB.2 ' 強制充電中 LED 点灯。 69 Reset Intf1 ' 1割り込みフラグ、リセット。 70 Disable Interrupts ' 割り込みを禁止する。 71 Else 72 Reset PORTB.2 ' 強制充電中 LED 消灯。 73 Cnt2 = 0 ' 30分経過終了。 74 Set Intf2 ' 割り込みモード終了フラグ、セット。 75 Reset Intf1 ' 1割り込みフラグ、リセット。 76 Disable Interrupts ' 割り込みを禁止する。 77 End If 78 End If 79 80 If Intf2 = 0 Then ' 此処から2回目の割り込み可の処理 81 If Pbf2 <> 0 Then ' 割り込み遅延データチェック。 82 Decr Pbf2 ' (データ)-1 83 Else 84 Enable Interrupts 'Int0 ' (データ)=0 なので割り込み許可。 85 End If 86 End If 87 88 If Intf2 = 1 Then ' 以下、割込完全禁止後の諸動作。 89 If PINB.1 = 0 Then ' 押しボタンが押されていたら以下を 90 If Pbf <> 0 Then ' 3秒以下なら次を実行、 91 Decr Pbf ' 押しボタンの(データ)-1する。 92 End If 93 End If 94 95 If PINB.1 = 1 Then ' 押しボタンが押されてないをチェック。 96 Pdf = 3 ' 押されていなければ 3 を入れる。 97 End If 98 If Pbf = 0 Then ' 押しボタンを3秒以上押されてたら以下で 99 B2 = 0 '強制停止実行許可フラグ"0"にす 100 End If 101 End If 102 103  '****** 終了ごの無限ループ ****** 104 Lp: 105 '1 106 If C1 = 0 Then ' 充電完了フラグ、チェック。 107 Goto Lp ' 充電完了なら、無限ループへ突入。 108 '1 109 End If 110 111 '*** 30分の時間経過処理 *** 112 '2 113 If Cnt = 0 Then ' 時間設定基本データが "0"なら 114 '2-1 115 If Cnt2 <> 0 Then ' 繰り返し回数が "0" でなければ以下を 116 Decr Cnt2 ' 繰り返し回数を -1 して 117 Cnt = Cnt1 ' 時間設定基本データをセットする。 118 '2-1 119 End If 120 '2 121 Else 122 Decr Cnt ' 時間設定基本データ ( -1) 123 '2 ' 以上の動作を繰り返し実行してCnt2が 124 End If ' "0"で約30分の時間経過を確認する。 125 126 *** タイムオーバー3時間 チェック*** 127 '4 128 If B = 0 Then ' 時間設定基本データ が"0" なら 129 '4-1 130 If B2 <> 0 Then ' 繰り返し回数が "0" でなければ以下を 131 Decr B2 ' 繰り返し回数を -1 して 132 B = Cnt1 ' 時間設定基本データをセットする。 133 '4-1 134 End If 135 '4 136 Else 137 Decr B ' 時間設定基本データ ( -1) 138 '4 ' 以上の動作を繰り返し実行してB2が 139 End If ' "0"で3時間以上経過済みを確認する。 140 '*** ADC Input *** 141 Start Adc ' A/D 変換スタート。 142 A = Getadc(3) ' 変換データを A にストアする。 143 144 '*** ADC-OverIN & サイクルタイム調整 *** 145 Waitms 100 ' 此処で1秒間の実行サイクルに調整する 146 If A > 850 Then ' ADC入力が4.25V 以上ならOveradcへ 147 Goto Overadc 148 End If 149 150 '********************** 151 '5 152 If Startf = 1 Then 153 '5-1 154 If A2 <= A Then ' 此処から139行が電圧上昇信号。 155 A2 = A '          ↓ 156 Set PORTB.4 '          ↓ 157 Waitms 120 '          ↓ 158 Reset PORTB.4 '          ↓ 159 Waitms 720 '          ↓ 160 '5-1 161 Else 162 163 Set PORTB.4 ' 此処から電圧降下信号。 164 Waitms 720 '          ↓ 165 Reset PORTB.4 '          ↓ 166 Waitms 120 '          ↓ 167 '5-1 168 End If 169 '5 170 Else 171 Cnt = Cnt1            ' 充電未開始なので時間変数を初期値に 172 Cnt2 = 8 '           〃 173 B = Cnt1 '           〃 174 B2 = 50 '           〃 175 '5 176 End If 177 178 *** 充電30分以上は以下の処理実行 ****** 179 '6 180 If Cnt2 = 0 Then ' 30分以上の時間が経過済みなら 181 Reset PORTB.2 ' 強制充電中の LED を消灯して 182 A = A + 4 ' A/D 変換データに +4 をする 183 '6-1 184 If A2 => A Then ' MAX 値が同じか大きい値なら以下を 185 Reset PORTB.0 ' 充電停止 186 Reset C1 ' 充電停止フラグをセットする。 187 '6-1 188 End If 189 '6 190 Else ' MAX 値がちいさければ以下を 191 A2 = A ' MAX 値を更新する。 192 '6 ' A+4 はおおよそA+20mV になる 193 End If ' 5mVステップなので(5mV)*4=20mV 194 195 *** タイムオーバーチェック *** 196 '7 197 If B2 = 0 Then ' B2が "0"なら 198 Reset PORTB.0 ' 充電停止 199 Set PORTB.4 ' 充電表示LED を点灯状態にして 200 Reset C1 ' 無限ループへ突入させる。 201 '7 202 End If 203 204 Loop 205 206 '*** ADC入力オーバー *** 207 Overadc: 208  Reset PORTB.0 ' 充電停止 209 Reset PORTB.4 ' 充電中表示 OFF 210 Ovl: 211 Set PORTB.2 ' 此処から強制充電表示を点滅 212 Waitms 120 '          ↓ 213 Reset PORTB.2 '          ↓ 214 Waitms 720 '          ↓ 215 Waitms 160 '          ↓ 216 Goto Ovl 217 218 '**** Interrupts **** 219 220 Int0_int: 221 Set Intf1 ' 割り込みフラグ、セット 222 Return 223 224 End