AVRでアセンブラーの練習 2008.06.17(火)〜 LessonA_08。 ストップウォッチ。
著作者名: 中野 良知 作成開始: 2008.06.17(火) 更新 : 2008.08.18(月) △1 セグメント変換テーブル修正。 △2 参) C言語で記述したFloat Bit処理のソースリストを追加。
目次 1. 目的 2. 用途 3. 操作 4. フローチャート 5. キーワード 5.1. BCDカウント 5.2. フラグの利用 5.3. チャタリング処理 5.4. SRAMデータポインター 5.5. Float Bit方式 5.5.1. 出力3ステートで実現 5.5.2. Float Bitの原理 6. 実験結果 7. 実験回路 8. プログラムソースリスト 1. 目的 6桁で0.001secから999.999secまでをカウントし表示するストップウォッチで、 7segLEDのFloat Bit方式によるダイナミック点灯を実験。 2. 用途 「スピードスタックス」の計時装置など。 3. 操作 カウント停止中に[START/STOP]釦をONするとカウンターをクリアし、 続けて[START/STOP]釦をOFFするとカウントを開始します。 カウント中に[START/STOP]釦をONするとカウントを停止し、 計時した表示を保持します。 4. フローチャート (main) ↓ ポートの初期化 ウォッチドック動作禁止 タイマー1オーバーフロー割込み許可 ↓ ├←────────────────┐ ↓ No │ <1msecフラグ=1?>───────┐ │ ↓Yes │ │ 1msecフラグリセット │ │ ↓ │ │ 最大999.999secの10進数の │ │ カウント値を表示バッファー │ │ へコピー │ │ ↓ │ │ 7segLEDのダイナミック点灯 │ │ ↓ │ │ ├←────────────┘ │ ↓ No │ <スイッチオン?> ──────────→┤ ↓Yes 0 │ <カウントONフラグ?> ──────┐ │ ↓1 │ │ カウントONフラグ=0(カウント停止) │ │ ↓ │ │ └────────────────→┤ │ │ ┌──────────────┘ │ ↓ │ ├←────────┐ │ ↓ Yes │ │ <スイッチオン?> ───┘ │ ↓No │ カウンタクリア │ ↓ │ カウントONフラグ=1 │ ↓ │ └─────────────────┘ (タイマー0割込み) ↓ 1msecフラグセット ↓ 0 <カウントONフラグ?> ──────┐ ↓1 │ 最大999.999secの10進数の │ カウンタをインクリメント │ ↓ │ ├←─────────────┘ ↓ (終了) 5. キーワード 5.1. BCDカウント BDCはBinary Corded Decimalの略で、2進化10進数と訳されます。 2進化10進数でカウントアップします。 上位桁 下位桁 ┌──────┐┌──────┐ │ BIN HEX││ BIN HEX│ 00000000 $00 00000000 $00 00000000 $00 00000001 $01 00000000 $00 00000010 $02 .. .. .. .. .. .. 00000000 $00 00001000 $08 00000000 $00 00001001 $09 00000000 $00 00001010 $0A ─┐上位に桁上がりして 00000001 $01 00000000 $00 ←┘この桁は$00にクリアします。 ↑ └─桁上がり 今回は、プログラムの簡略化のため、各桁を8ビット構成にしました。 レジスタを効率よく使用する方法として4ビット毎に桁を区分けする方法があります。 例: 上位 下位 上位 下位 ┌───┐┌───┐ ┌─┬─┐ 00000001 00000001 → 00010001 └────────┘ └───┘ 2バイト 1バイト 5.2. フラグの利用 レジスタの各ビット毎に異なる用途のフラグを割り当てます。 flgレジスタ(R19) ┌──┬──┬──┬──┬──┬──┬──┬──┐ │ b7 │ b6 │ b5 │ b4 │ b3 │ b2 │ b1 │ b0 │ └──┴──┴──┴──┴──┴──┴──┴──┘ bit 名称 用途 ----+-------------+---------------------------------- b0 CNT_ON_FLG カウントONフラグ b1 T1MS_FLG 1msec割込みフラグ 名称の定義例: .equ CNT_ON_FLG = 0 ; スイッチオンフラグ .equ T1MS_FLG = 1 ; 1msec割込みフラグ (注意) 大文字の"<<"は小文字に置き換えてください。 フラグのセット/リセット例: sbr flg,(1<<CNT_ON_FLG); カウントON cbr flg,(1<<CNT_ON_FLG); カウントOFF フラグの判定例: sbrs flg,CNT_ON_FLG ; カウントON? rjmp start_stop60 ; No cbr flg,(1<<CNT_ON_FLG); カウントOFF 5.3. チャタリング処理 スイッチのON/OFFの時に発生するチャタリングでストップウォッチのカウントが 不安定にならないようにチャタリング処理を行います。 スイッチ入力信号 ────┐┌┐┌┐┌┐ ┌┐┌┐┌┐┌───── └┘└┘└┘└────────────┘└┘└┘└┘ │←───→│←──────────→│←───→│ チャタリング チャタリング チャタリング処理後の内部情報 ─────────────┐ ┌───── └──────────────────┘ │←────────────────→│ │←→│ │←→│ 10msec間連続して入力が一定になると内部情報が変化します。 プログラムでは、チャタリング処理をした後の内部情報でスイッチのON/OFFを判定 します。 5.4. SRAMデータポインター ZレジスタをSRAMのポインターとして使用します。 ポインターが指し示すアドレスのSRAMとデータの授受を行います。 Zレジスターの設定 ldi ZL,low(dsp0) ldi ZH,high(dsp0) でSRAMの表示バッファーdsp0にポインターが設定されます。 ├────┤ │ dsp0 │← Zレジスターでポイント ├────┤ │ dsp1 │ ├────┤ │ dsp2 │ ├────┤ │ dsp3 │ ├────┤ │ dsp4 │ ├────┤ │ dsp5 │ ├────┤ │ │ ├────┤ SRAMからデータの読出し例: ldi ZL,low(dsp0) ldi ZH,high(dsp0) ld acc,Z+ accにデータを転送後ポインターはdsp1を示します。 SRAMへデータの書き込み例: ldi ZL,low(dsp0) ldi ZH,high(dsp0) st Z+,acc accのデータを転送後ポインターはdsp1を示します。 5.5. Float Bit方式 7segLEDをダイナミック点灯する方式のひとつです。 原典はこちらです。 http://www.piclist.com/techref/io/led/8x7s8pin.htm 一般的な方式は、セグメント駆動に8ビット、桁の走査に桁数分のビット数の出力 ポートを使用します。 6桁ならば、セグメントに8ビット。桁走査に6ビット。合計で14ビットです。 一方、Float Bit方式では、セグメントの駆動と桁の走査を兼用するため、 兼用出力に8ビットと、Float Bitと言われる特殊なビットに1ビットを使用します。 8桁(9桁も可)までなら合計9ビットで駆動できるため、ピン数の少ないマイコンで 有効な手段です。 5.5.1. 出力3ステートで実現 Float Bit方式を実現するために、ポートを3つの出力状態に制御します。 アノードコモンの7segLEDの場合 状態 内容 ------+---------------------------------------------- 0 セグメントをONするとき 1 各桁を点灯するとき Hi-Z セグメントをOFFするとき 5.5.2. Float Bitの原理 2桁の7segLEDの場合では、 回路図 ┌───────────────────┐ │┌──────┐2桁目 │1桁目 ││ ┌───┴────┐ ┌───┴────┐ ││ │ CA │ │ CA │ ││ │ 7segLED │ │ 7segLED │ ││ │a b c d e f g dt│ │a b c d e f g dt│ ││ └┬┬┬┬┬┬┬┬┘ └┬┬┬┬┬┬┬┬┘ ││ ││││││││ ││││││││ PORT a ──●┼─R─●───────────────────────── │ │││││││ ││││││││ PORT b ───●─R──────────────●──────────── │││││││ │ ││││││ PORT c ─────R───●───────────●─────────── │ │││││ │ │││││ PORT d ─────R────●───────────●────────── │ ││││ │ ││││ PORT e ─────R─────●───────────●───────── │ │││ │ │││ PORT f ─────R──────●───────────●──────── │ ││ │ ││ PORT g ─────R───────●───────────●─────── │ │ │ │ PORT dt─────R────────●───────────●────── │ │ PORT FB─────R──●──────────●───────────── FBはFloat Bitの略です。 1桁目の点灯 1) PORT a=1 で、アノードコモン(CA)に通電します。 2) セグメントaをONする時は、PORT FBを0にします。 3) セグメントaをOFFする時は、PORT FBをHi-Zにします。 4) セグメントbからdotは、ONの時は0、OFFの時はHi-Zにします。 2桁目の点灯 1) PORT b=1 で、アノードコモン(CA)に通電します。 2) セグメントbをONする時は、PORT FBを0にします。 3) セグメントbをOFFする時は、PORT FBを1にします。 4) セグメントaとcからdtは、ONの時は0、OFFの時はHi-Zにします。 3桁目以上の場合も同様にして、セグメントのcからdtを順次PORTc-dtから切り離して PORT FBに接続、さらに各桁のCAを順次PORTc-dtに接続します。 アノードコモン(桁走査)とFBに接続するセグメントの結線 8桁目 7桁目 6桁目 5桁目 4桁目 3桁目 2桁目 1桁目 ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ │┌┴┐│┌┴┐│┌┴┐│┌┴┐│┌┴┐│┌┴┐│┌┴┐│┌┴┐ ││CA│││CA│││CA│││CA│││CA│││CA│││CA│││CA│ ││dt│││g │││f │││e │││d │││c │││b │││a │ │└┬┘│└┬┘│└┬┘│└┬┘│└┬┘│└┬┘│└┬┘│└┬┘ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ PORT a ─┼───────────────────────────●──── │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ PORT b ─────────────────────────●──────── │ │ │ │ │ │ │ │ │ │ │ │ │ │ PORT c ─────────────────────●──────────── │ │ │ │ │ │ │ │ │ │ │ │ │ PORT d ─────────────────●──────────────── │ │ │ │ │ │ │ │ │ │ │ │ PORT e ─────────────●──────────────────── │ │ │ │ │ │ │ │ │ │ │ PORT f ─────────●──────────────────────── │ │ │ │ │ │ │ │ │ │ PORT g ─────●──────────────────────────── │ │ │ │ │ │ │ │ │ PORT dt─●──────────────────────────────── │ │ │ │ │ │ │ │ PORT FB─R─●───●───●───●───●───●───●───●── 他のセグメントの結線は省略。 9桁駆動の場合 回路図 (1から7桁目の回路を省略) ┌───────────────────┐ │┌──────┐9桁目 │8桁目 ││ ┌───┴────┐ ┌───┴────┐ ││ │ CA │ │ CA │ ││ │ 7segLED │ │ 7segLED │ ││ │a b c d e f g dt│ │a b c d e f g dt│ ││ └┬┬┬┬┬┬┬┬┘ └┬┬┬┬┬┬┬┬┘ ││ ││││││││ ││││││││ PORT a ────R─●───────────●───────────── ││ │││││││ │││││││ PORT b ────R──●───────────●──────────── ││ ││││││ ││││││ PORT c ────R───●───────────●─────────── ││ │││││ │││││ PORT d ────R────●───────────●────────── ││ ││││ ││││ PORT e ────R─────●───────────●───────── ││ │││ │││ PORT f ────R──────●───────────●──────── ││ ││ ││ PORT g ────R───────●───────────●─────── ││ │ │ PORT dt─●──R────────●────────────────── │ │ PORT FB──●─R────────────────────●────── 1桁目から8桁目までの点灯では、PORT FBをHi-Zまたは0の状態にしますが、 9桁目の点灯では、PORT FBに1を出力します。 6. 実験結果 上:AVR・PIC兼用ROMライター 中:DRO MAIN基板(流用) 下:DRO LED基板(流用) 7. 実験回路 ATtiny2313 ┌────┐ │ │20 │ VDD├───────────────●─────── +5V │ │ │ │ │ START/STOP │ │ │2 ─┴─ │┴│100u/10V │ PD0├────○ ○──┐ └┬┘ │ │ │ │ │ │10 │ │ │ GND├─────────●─────●─────── 0V │ │ │ │ │ │19 ┌─────── CA1 │ PB7├───●──R470────────┐a │ │18 ┌─────── CA2 │ │ PB6├───●──R470────────┤b │ │17 ┌─────── CA3 │ │ PB5├───●──R470────────┤c a〜dt │ │16 ┌─────── CA4 ┝━━━━━━ │ PB4├───●──R470────────┤d │ │15 ┌─────── CA5 │ │ PB3├───●──R470────────┤e │ │14 ┌─────── CA6 │ │ PB2├───●──R470────────┤f │ │13 │ │ PB1├──────R470────────┤g │ │12 │ │ PB0├──────R470────────┘dt │ │11 │ PD6├──────R470─── FB │ │ └────┘ CA1─────────────────────────────┐ CA2────────────────────────┐ │ CA3───────────────────┐ │ │ CA4──────────────┐ │ │ │ CA5─────────┐ │ │ │ │ CA6────┐ │ │ │ │ │ │CA6 │CA5 │CA4 │CA3 │CA2 │CA1 ┌─┴─┐┌─┴─┐┌─┴─┐┌─┴─┐┌─┴─┐┌─┴─┐ │ 7seg ││ 7seg ││ 7seg ││ 7seg ││ 7seg ││ 7seg │ │ LED ││ LED ││ LED ││ LED ││ LED ││ LED │ └┬┰─┘└┬┰─┘└┬┰─┘└┬┰─┘└┬┰─┘└┬┰─┘ │┃a〜e │┃a〜d │┃a〜c │┃a〜b │┃a │┃b〜g │┃g │┃f〜g │┃e〜g │┃d〜g │┃c〜g │┃dt a〜dt │┃dt │┃dt │┃dt │┃dt │┃dt │┃ ━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┛ │f │e │d │c │b │a FB ───●────●────●────●────●────┘ CAxはコモンアノードでxは桁No。 a〜dtは信号バス。 FBはFloat Bit。 8. プログラムソースリスト LHZ形式で圧縮してあります。 △1 セグメント変換テーブル修正。 LessonA08 △2 参考) C言語によるFloat Bit駆動の実験プログラムです。 7SEG_FLOAT.c

LessonAのTopへ
サイトのTopへ
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。
inserted by FC2 system