$prog &HFF , &HFF , &HDF , &HFF 'CKDIV8 = 1 , SUT = 11 , CKSEL = 1111 ' ' ********************************************* ' * * ' * 4桁LED 回転計 プログラム * ' * * ' * AVR is using ATtiny861A * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2012. 4.25 * ' ********************************************* ' ' Ver 01.01 初回公開バージョン。 2012. 4.25 ' $regfile = "ATtiny861.DAT" '使用するAVRを設定。 $crystal = 16000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 10 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 Const Renewtime = 500 '表示の更新間隔。(mS) ' ' * ポート名の定義 * ' Led_f1 Alias Portb.0 'LED[C1]のコモン接続ポート。 Led_f2 Alias Portb.1 'LED[C2]のコモン接続ポート。 Led_f3 Alias Portb.2 'LED[C3]のコモン接続ポート。 Led_f4 Alias Portb.3 'LED[C4]のコモン接続ポート。 Led_seg Alias Porta 'LEDのセグメント接続ポート。 Led_segdp Alias Portb.6 'LEDの[D.P.]セグメント接続ポート。 Sw_1 Alias Pinb.0 'スイッチ[1]の接続ポート。 Sw_2 Alias Pinb.3 'スイッチ[2]の接続ポート。 ' ' * 変数の宣言 * ' Dim Ledcounter As Byte 'ダイナミック点灯の桁カウンター。 Dim Ledbuff(4) As Byte 'ダイナミック点灯のセグメントデータ。 Dim Leddpf As Byte '[D.P.]表示フラグ。 Dim Frqdat As Long 'キャプチャー・データを差分計算したカウント値。 Dim Revolution As Single '回転数。 Dim Disptimer As Word '表示間隔のタイマー。 Dim Tim1s As Word '1秒タイマー。 Dim Noinptim As Byte '無信号検出タイマー。 Dim Timeoutf As Byte '無信号タイムアウトフラグ。 Dim Nosignal As Byte '無信号のタイムアウト時間。 Dim Swsensef As Byte '設定モードのスイッチ検出期間フラグ。 ' Dim Propeller As Byte '羽根の枚数。(1〜9) Dim Bright As Byte '輝度値。(0:暗60 〜 9:明240) Dim Measurerange As Byte '測定範囲。(0:0.5RPMから , 1:20RPMから) (0表示になる時間 0:130秒 , 1:3秒) Dim Dpmode As Byte '小数点の表示モード。(1〜999rpmの表示 0:小数点無し , 1:小数点有り) ' Dim Capmode As Byte 'キャプチャー割り込みの動作モード。 Dim Capendf As Byte 'キャプチャー計測完了フラグ。 Dim Capdat1 As Word 'キャプチャー・レジスター値 バッファー1。 Dim Capovf1 As Word 'オーバーフロー・カウント値 バッファー1。 Dim Capdat2 As Word 'キャプチャー・レジスター値 バッファー2。 Dim Capovf2 As Word 'オーバーフロー・カウント値 バッファー2。 Dim Capovfc As Word 'オーバーフロー・カウンター。 ' Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Temp2 As Byte '汎用テンポラリ変数 Byte型 No.2 Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 Dim Tempw2 As Word '汎用テンポラリ変数 Word型 No.2 Dim Tempw3 As Word '汎用テンポラリ変数 Word型 No.3 Dim Templ1 As Long '汎用テンポラリ変数 Long型 No.3 Dim Temps1 As Single '汎用テンポラリ変数 Single型 No.1 Dim Tempseg1 As Byte 'セグメントデータ保管用 (1桁) Dim Tempseg2 As Byte 'セグメントデータ保管用 (10桁) Dim Tempseg3 As Byte 'セグメントデータ保管用 (100桁) Dim Tempseg4 As Byte 'セグメントデータ保管用 (1000桁) ' Dim Dummy As Eram Long 'EEPROM 4バイトのダミーエリア。 Dim Eeppropeller As Eram Byte 'EEPROM 羽根の枚数。(1〜9) Dim Eepbright As Eram Byte 'EEPROM 輝度値。(0:暗60 〜 9:明240) Dim Eepmeasurerange As Eram Byte 'EEPROM 測定範囲。(0:0.5RPMから , 1:20RPMから) (0表示になる時間 0:130秒 , 1:3秒) Dim Eepdpmode As Eram Byte 'EEPROM 小数点の表示モード。(1〜999rpmの表示 0:小数点無し , 1:小数点有り) ' ' * Timerの設定 * ' Tccr0a = &B1110_0000 'Timer0 = 16bitキャプチャー動作 , ノイズキャンセラー , 立ち下がりエッジ Tccr0b = &B0000_0001 'Prescale = 1 (16,000,000Hz [62.5nS]) On Capture0 Tintcap Nosave 'キャプチャー割り込みルーチンのラベルを設定。 Tifr = &B0000_0001 'Timer0 キャプチャー・フラグ[ICF0]をリセットする。 Enable Capture0 'キャプチャー割り込みを許可。 On Timer0 Tintovf Nosave 'オーバーフロー割り込みルーチンのラベルを設定。 Enable Timer0 'オーバーフロー割り込みを許可。 ' Tccr1d = &B0000_0000 'Config Timer1 = Timer (標準動作) Tccr1b = &B0000_0111 'Prescale = 64 (16,000,000Hz / 64 = 250,000Hz) Tccr1a = &B0000_0010 '[OC1RA]のPWM動作。 Tccr1c = &B0000_0000 Ocr1c = 250 - 1 'スキャン周波数。(250,000Hz ÷ 250カウント = 1,000Hz [1mS]) ' ' * EEPROMの確認 * ' If Eepbright > 9 Then 'If EEPROMが初期値か? Then Eeppropeller = 1 '羽根の枚数。(1〜9) Eepbright = 9 '輝度値。(0:暗60 〜 9:明240) Eepmeasurerange = 1 '測定範囲。(0:0.5RPMから , 1:20RPMから) (0表示になる時間 0:130秒 , 1:3秒) Eepdpmode = 0 '小数点の表示モード。(1〜999rpmの表示 0:小数点無し , 1:小数点有り) End If Propeller = Eeppropeller Bright = Eepbright Gosub Brightset '輝度値を計算してTimerに設定する。 Measurerange = Eepmeasurerange Dpmode = Eepdpmode ' ' * ポートの初期設定 * ' Set Prr.prusi '電力削減 USI回路の停止。 ' Config Aci = Off 'アナログ比較器の電源を切る。(BASCOMのバグ有り) Set Acsra.acd 'アナログ比較器の電源を切る。 ' Config Led_seg = &B1110_1111 'LEDのセグメント接続ポートを出力に設定する。 Config Portb = &B0100_0110 'LEDの[D.P.]とLED[C2],LED[C3]のコモン接続ポートを出力に設定する。 ' Portb = &B0000_1001 '[PB0],[PB3]をプルアップする。 Waitms 50 'プルアップの安定時間タイマー。 If Sw_1 = 0 Then Goto Funcset 'If 機能設定モードか? Then If Sw_2 = 0 Then Goto Xtalcal 'If 水晶の較正モードか? Then ' Portb = &B0000_0000 'プルアップを解除する。 Config Portb = &B0100_1111 'LED[C1],LED[C4]のコモン接続ポートを出力に設定する。 ' If Measurerange = 0 Then 'If 測定範囲が0.5RPMからか?Then Nosignal = 130 '無信号の検出時間。(秒) Else Nosignal = 3 '無信号の検出時間。(秒) End If Timeoutf = 1 '無信号状態にする。 Enable Interrupts 'すべての割り込みを許可。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: ' ' * キャプチャーデータの計測 * ' If Capendf <> 0 Then 'If キャプチャー計測が完了したか? Then Gosub Capsubt 'キャプチャー・バッファーの値を差分計算する。=> (Frqdat) Capendf = 0 Tim1s = 0 '無信号検出タイマーをリセットする。 Noinptim = 0 Timeoutf = 0 End If ' ' * LEDのダイナミック点灯 * ' If Tifr.tov1 = 1 Then 'If 1mS経過したか? Then Tifr = &B0000_0100 'Timer1 オーバーフローフラグ[TOV1]をリセットする。 ' Select Case Ledcounter Case 0 : Led_seg = Ledbuff(1) 'セグメントデータをセットする。 If Leddpf.3 = 1 Then 'If [D.P]が点灯か? Then Set Led_segdp End If Set Led_f1 'LEDの[C1]接続ポートをONにする。 Ledcounter = 1 Case 1 : Led_seg = Ledbuff(2) 'セグメントデータをセットする。 If Leddpf.2 = 1 Then 'If [D.P]が点灯か? Then Set Led_segdp End If Set Led_f2 'LEDの[C2]接続ポートをONにする。 Ledcounter = 2 Case 2 : Led_seg = Ledbuff(3) 'セグメントデータをセットする。 If Leddpf.1 = 1 Then 'If [D.P]が点灯か? Then Set Led_segdp End If Set Led_f3 'LEDの[C3]接続ポートをONにする。 Ledcounter = 3 Case Else : Led_seg = Ledbuff(4) 'セグメントデータをセットする。 If Leddpf.0 = 1 Then 'If [D.P]が点灯か? Then Set Led_segdp End If Set Led_f4 'LEDの[C4]接続ポートをONにする。 Ledcounter = 0 End Select ' ' * 無信号の検出 * ' Tim1s = Tim1s + 1 '無信号検出タイマーのカウント。 If Tim1s >= 1000 Then 'If 1秒経過したか? Then Tim1s = 0 Noinptim = Noinptim + 1 If Noinptim >= Nosignal Then 'If 無信号検出時間を経過したか? Then Timeoutf = 1 End If End If ' ' * 回転数の表示 * ' Disptimer = Disptimer + 1 '表示間隔タイマーを更新する。 If Disptimer >= Renewtime Then 'If 表示の更新時間か? Then Disptimer = 0 ' If Timeoutf <> 0 Then 'If 無信号検出か? Then Ledbuff(1) = &B0000_0000 'ブランク表示。 Ledbuff(2) = &B0000_0000 'ブランク表示。 Ledbuff(3) = &B0000_0000 'ブランク表示。 Ledbuff(4) = &B0110_1111 '[0]を表示する。 Leddpf = &B0000_0000 '[D.P.]を消灯する。 Else ' ' * 回転数を計算する * ' Revolution = 960000000 / Frqdat '回転数を求める。 Revolution = Revolution / Propeller '羽根の枚数を計算する。 Temps1 = Revolution * 10 '小数点以下1桁を桁上げする。 Templ1 = Round(temps1) '小数点以下を四捨五入する。 ' Select Case Templ1 Case Is < 10 : '[0.5〜0.9] Gosub Longseg 'Word値を4桁のセグメント値に変換する。 Ledbuff(3) = &B0110_1111 '[0]を表示する。 Leddpf = &B0000_0010 '[C3]桁に[D.P.]を点灯する。 ' Case Is < 10000 : '[1.0〜999.9] If Dpmode = 0 Then 'If 小数点表示無しか? Then Gosub Divide10 '小数点以下をカットする。 Leddpf = &B0000_0000 '[D.P.]を消灯する。 Else Leddpf = &B0000_0010 '[C3]桁に[D.P.]を点灯する。 End If Gosub Longseg 'Word値を4桁のセグメント値に変換する。 ' Case Is < 100000 : '[1000〜9999] Gosub Divide10 '小数点以下をカットする。 Gosub Longseg 'Word値を4桁のセグメント値に変換する。 Leddpf = &B0000_0000 '[D.P.]を消灯する。 ' Case Is < 1000000 : '[10,000〜99,999] Templ1 = Templ1 / 100 '1桁以下をカットする。 Gosub Longseg 'Word値を4桁のセグメント値に変換する。 Leddpf = &B0000_0100 '[C2]桁に[D.P.]を点灯する。 ' Case Else : '[100,000]以上。 Ledbuff(1) = &B0110_1111 '[OVER]を表示する。 Ledbuff(2) = &B0110_1110 Ledbuff(3) = &B1110_1001 Ledbuff(4) = &B1010_0000 Leddpf = &B0000_0000 '[D.P.]を消灯する。 End Select End If End If End If ' ' * LEDの消灯 (輝度調整) * ' If Tifr.ocf1a = 1 Then 'If 消灯時間か? Then Tifr = &B0100_0000 'Timer1 比較一致フラグ[OCF1A]をリセットする。 ' Led_seg = &B0000_0000 'LEDのセグメントを全てOFFにする。 Portb = &B0000_0000 'LEDのコモンを全てOFFにする。 End If Goto Main ' ' -------------------------- ' * 1/10割り算サブルーチン * ' -------------------------- ' Divide10: Templ1 = Templ1 / 10 '小数点以下をカットする。 Return ' ' --------------------------------------------------- ' * Word値を4桁のセグメント値に変換するサブルーチン * (Tempw1 -> Ledbuff(1) , Ledbuff(2) , Ledbuff(3) , Ledbuff(4)) ' --------------------------------------------------- ' Longseg: 'ロング変数用。 Tempw1 = Templ1 Wordseg: Tempw2 = Tempw1 / 100 '100の位を抽出する。 Tempw3 = Tempw2 * 100 '10と1の位を抽出する。 Tempw3 = Tempw1 - Tempw3 ' Temp1 = Tempw2 '100の位を変換する。 Gosub Binseg 'バイナリ値を2桁のセグメントコードに変換する。 Ledbuff(1) = Tempseg2 Ledbuff(2) = Tempseg1 Temp1 = Tempw3 '10と1の位を変換する。 Gosub Binseg 'バイナリ値を2桁のセグメントコードに変換する。 Ledbuff(3) = Tempseg2 Ledbuff(4) = Tempseg1 ' If Ledbuff(1) = &B0110_1111 Then 'If 4桁目が[0]か? Then Ledbuff(1) = &B0000_0000 'ブランク表示。 If Ledbuff(2) = &B0110_1111 Then 'If 3桁目が[0]か? Then Ledbuff(2) = &B0000_0000 'ブランク表示。 If Ledbuff(3) = &B0110_1111 Then 'If 2桁目が[0]か? Then Ledbuff(3) = &B0000_0000 'ブランク表示。 End If End If End If Return ' ' --------------------------------------- (Temp1 = バイナリ・データ) ' * バイナリ値を2桁のセグメントコードに * (Tempseg1 = 下位のセグメントコード) ' * 変換するサブルーチン * (Tempaeg2 = 上位のセグメントコード) ' --------------------------------------- ' Binseg: Tempseg2 = Makebcd(temp1) 'バイナリ値をBCD(Binary coded decimal)値に変換。 Tempseg1 = Tempseg2 And &H0F '下位のBCDコードを取得。 Tempseg1 = Lookup(tempseg1 , Segtab) '数値をセグメントコードへ変換する。 ' Tempseg2 = Tempseg2 And &HF0 '上位のBCDコードを取得。 Shift Tempseg2 , Right , 4 '下位へ移動する。 Tempseg2 = Lookup(tempseg2 , Segtab) '数値をセグメントコードへ変換する。 Return ' ' ----------------------------------------------- ' * 輝度値を計算してTimerに設定するサブルーチン * ' ----------------------------------------------- ' Brightset: Temp2 = Bright + 1 '輝度値を計算する。 Temp2 = Temp2 * 20 Temp2 = Temp2 + 40 Ocr1a = Temp2 '輝度のパルス幅 (暗60〜明240) 1カウントは4μS。 Return ' ' ****************** ' * 機能設定モード * ' ****************** ' Funcset: Led_seg = &B1100_1100 '[S]を表示する。 Set Led_segdp '[D.P]を点灯させる。 Bitwait Sw_1 , Set '[SW1]が離されるまで待つ。 Waitms 30 'チャタリングの待ち時間。 ' Temp1 = 0 Gosub Valdisp '設定値を表示する。 ' ' Funcsetlp: ' ' * LEDのダイナミック点灯 * ' If Tifr.tov1 = 1 Then 'If 1mS経過したか? Then Tifr = &B0000_0100 'Timer1 オーバーフローフラグ[TOV1]をリセットする。 ' Select Case Ledcounter Case 0 : Portb = &B0000_0000 'プルアップを解除する。 Config Portb = &B0100_1111 'LED[C1],LED[C4]のコモン接続ポートを出力に設定する。 Led_seg = Ledbuff(2) 'セグメントデータをセットする。 Set Led_segdp '[D.P]を点灯させる。 Set Led_f2 'LEDの[C2]接続ポートをONにする。 Swsensef = 0 Ledcounter = 1 Case 1 : Led_seg = Ledbuff(3) 'セグメントデータをセットする。 Reset Led_segdp '[D.P]を消灯させる。 Set Led_f3 'LEDの[C3]接続ポートをONにする。 Ledcounter = 2 Case 2 : Led_seg = &B0000_0000 'ブランク表示。 Portb = &B0000_1001 'プルアップの設定。 Config Portb = &B0100_0110 'LED[C1],LED[C4]のコモン接続ポートを入力に設定する。 Ledcounter = 3 Case 3 : Swsensef = 1 Ledcounter = 0 End Select End If ' ' * LEDの消灯 (輝度調整) * ' If Tifr.ocf1a = 1 Then 'If 消灯時間か? Then Tifr = &B0100_0000 'Timer1 比較一致フラグ[OCF1A]をリセットする。 ' Led_seg = &B0000_0000 'LEDのセグメントを全てOFFにする。 Reset Led_segdp Reset Led_f2 'LEDの[C2]接続ポートをOFFにする。 Reset Led_f3 'LEDの[C3]接続ポートをOFFにする。 End If ' ' * スイッチの検出 * ' If Swsensef <> 0 Then 'If スイッチの検出期間か? Then Debounce Sw_1 , 0 , Itemsel , Sub 'If [SW1]が押されたか? Then Debounce Sw_2 , 0 , Valuesel , Sub 'If [SW2]が押されたか? Then End If Goto Funcsetlp ' ' * [SW1] 項目選択 * ' Itemsel: Temp1 = Temp1 + 1 If Temp1 > 3 Then 'If 設定項目の上限か? Then Temp1 = 0 End If Gosub Valdisp '設定値を表示する。 Return ' ' * [SW2] 設定値変更 * ' Valuesel: Select Case Temp1 Case 0 : '[P]羽根の枚数。 Propeller = Propeller + 1 If Propeller > 9 Then 'If 設定値の上限か? Then Propeller = 1 End If Eeppropeller = Propeller ' Case 1 : '[b]輝度。 Bright = Bright + 1 If Bright > 9 Then 'If 設定値の上限か? Then Bright = 0 End If Eepbright = Bright Case 2 : '[r]測定範囲。 If Measurerange = 0 Then Measurerange = 1 Else Measurerange = 0 End If Eepmeasurerange = Measurerange Case 3 : '[d]小数点モード。 If Dpmode = 0 Then Dpmode = 1 Else Dpmode = 0 End If Eepdpmode = Dpmode End Select Gosub Valdisp '設定値を表示する。 Return ' ' * 設定値を表示するサブルーチン * ' Valdisp: Select Case Temp1 Case 0 : '[P]羽根の枚数。 Ledbuff(2) = &B1110_0011 Temp2 = Propeller Case 1 : '[b]輝度。 Gosub Brightset '輝度値を計算してTimerに設定する。 Ledbuff(2) = &B1110_1100 Temp2 = Bright Case 2 : '[r]測定範囲。 Ledbuff(2) = &B1010_0000 Temp2 = Measurerange Case 3 : '[d]小数点モード。 Ledbuff(2) = &B1010_1110 Temp2 = Dpmode End Select Ledbuff(3) = Lookup(temp2 , Segtab) '数値をセグメントコードへ変換する。 Return ' ' ******************** ' * 水晶の較正モード * [PB1 OC1A] ISPの1ピンに、1MHzを出力する ' ******************** ' Xtalcal: Portb = &B0100_0000 'プルアップを解除する。[D.P.]を点灯させる。 Config Portb = &B0100_1111 'LEDのコモン接続ポートを出力に設定する。 Led_seg = &B0110_1001 '[C]を表示する。 ' Tccr1d = &B0000_0000 'Config Timer1 = Timer (標準動作) Tccr1b = &B0000_0001 'Prescale = 1 Tccr1a = &B0100_0000 '[OC1A] = Toggle Tccr1c = &B0100_0000 Ocr1a = 0 Ocr1c = 8 - 1 '較正出力(16,000,000Hz / 8カウント * 2(トグル) = 1,000,000Hz) End ' ' ********************************************************** ' * キャプチャー・バッファーの値を差分計算するサブルーチン * 差分カウント値 => Frqdat(ロング型) ' ********************************************************** ' Capsubt: $asm LDS R24,{Capendf} 'キャプチャー・バッファーの使用状況を調べる。 SBRC R24,0 'バッファー1が測定終了データか? Then RJMP Capsubt1 ; LDS R16,{capdat1} '32bit引き算(バッファー2)−(バッファー1)。 LDS R17,{capdat1+1} LDS R18,{capovf1} LDS R19,{capovf1+1} LDS R20,{capdat2} LDS R21,{capdat2+1} LDS R22,{capovf2} LDS R23,{capovf2+1} RJMP Capsubt2 ; Capsubt1: LDS R16,{capdat2} '32bit引き算(バッファー1)−(バッファー2)。 LDS R17,{capdat2+1} LDS R18,{capovf2} LDS R19,{capovf2+1} LDS R20,{capdat1} LDS R21,{capdat1+1} LDS R22,{capovf1} LDS R23,{capovf1+1} ; Capsubt2: Sub R20 , R16 '32bit引き算。 SBC R21,R17 SBC R22,R18 SBC R23,R19 STS {Frqdat},R20 '計算結果をロング型変数に格納。 STS {Frqdat+1},R21 STS {Frqdat+2},R22 STS {Frqdat+3},R23 $end Asm Return ' ' ******************************************** ' * Timer0 キャプチャー 割り込み処理ルーチン * ' ******************************************** ' $notransform On 'R23またはR0を使用する命令に自動修正させない。 ' Tintcap: $asm PUSH R1 IN R1,SREG 'ステータス・レジスタを待避。 PUSH R22 PUSH R23 'R23は、拡張I/Oレジスタへのアクセスに使用する。 PUSH R24 PUSH R25 ; LDS R22,{Capendf} 'メインルーチンの処理状態をチェック。 CPI R22,0 BREQ Tintcap1 'If メインルーチンでキャプチャー・データの処理が終了しているか? Else JMP Tintcap8 ; Tintcap1: IN R24,OCR0A 'キャプチャー・レジスターの下位バイトを取得。 IN R23,OCR0B 'キャプチャー・レジスターの上位バイトを取得。 ; LDS R22,{Capmode} 'キャプチャー割り込みのモードを調べる。 SBRC R22,0 'If データ・バッファー2 へ書き込み? Then RJMP Tintcap2 ; ; '---<データ・バッファー1 書き込み処理>--- STS {Capdat1},R24 'データ・バッファー1へ保存。 STS {Capdat1+1},R23 ; LDS R24,{Capovfc} 'オーバーフロー・カウント値を取得。 LDS R25,{Capovfc+1} CPI R23,0 BRNE Tintcap3 'If キャプチャー・データの上位バイトが00? Else ; IN R23,TIFR SBRS R23,TOV0 'オーバーフローが発生しているか? Else RJMP Tintcap3 ; ADIW R24,1 'オーバーフロー・カウント値を+1 ; Tintcap3: STS {Capovf1},R24 'データ・バッファー1へ保存。 STS {Capovf1+1},R25 ORI R22,&H01 'モードをデータ・バッファー2 書き込みに変更。 RJMP Tintcap5 ; ; Tintcap2: '---<データ・バッファー2 書き込み処理>--- STS {Capdat2},R24 'データ・バッファー2へ保存。 STS {Capdat2+1},R23 ; LDS R24,{Capovfc} 'オーバーフロー・カウント値を取得。 LDS R25,{Capovfc+1} CPI R23,0 BRNE Tintcap4 'If キャプチャー・データの上位バイトが00? Else ; IN R23,TIFR SBRS R23,TOV0 'オーバーフローが発生しているか? Else RJMP Tintcap4 ; ADIW R24,1 'オーバーフロー・カウント値を+1 ; Tintcap4: STS {Capovf2},R24 'データ・バッファー2へ保存。 STS {Capovf2+1},R25 ANDI R22,&HF0 'モードをデータ・バッファー1 書き込みに変更。 ; ; Tintcap5: CPI R22,&H10 BRCC Tintcap6 'If 1と2の両バッファーにデータの準備が完了か? Then ORI R22,&H10 'キャプチャー・モードを2つめのデータ待ちにセット。 RJMP Tintcap7 ; Tintcap6: STS {Capendf},R22 'キャプチャー計測完了フラグをセット。 Tintcap7: STS {Capmode},R22 'キャプチャー・モードを更新。 ; POP R25 POP R24 POP R23 POP R22 Out Sreg , R1 'ステータス・レジスタを復帰 POP R1 $end Asm Return ' ' $asm Tintcap8: 'メインルーチンでキャプチャー・データの処理が終わっていない。 LDI R22,0 'キャプチャー・モードを初期化する。 RJMP Tintcap7 $end Asm ' ' ********************************************** ' * Timer0 オーバーフロー 割り込み処理ルーチン * ' ********************************************** ' Tintovf: $asm PUSH R1 IN R1,SREG 'ステータス・レジスタを待避。 PUSH R24 PUSH R25 ; LDS R24,{Capovfc} 'オーバーフロー・カウント値を+1。 LDS R25,{Capovfc+1} ADIW R24,1 STS {Capovfc},R24 STS {Capovfc+1},R25 ; POP R25 POP R24 Out Sreg , R1 'ステータス・レジスタを復帰 POP R1 $end Asm Return ' $notransform Off ' ' End ' ' ***************************************** ' * LEDのセグメントコードへの変換テーブル * ' ***************************************** ' Segtab: Data &B0110_1111 '0 Data &B0000_0110 '1 Data &B1010_1011 '2 Data &B1000_1111 '3 Data &B1100_0110 '4 Data &B1100_1101 '5 Data &B1110_1101 '6 Data &B0000_0111 '7 Data &B1110_1111 '8 Data &B1100_1111 '9