AVRでアセンブラーの練習 2007.09.01(土)〜 LessonA02。 LEDを1秒ごとに点滅。
著作者名: 中野 良知 作成開始: 2007.09.01(土) 更新 : 2007.09.02(日)
目次 1. 目的 2. フローチャート 3. プログラムソースコード 4. キーワード 4.1. マクロプログラム 4.2. ソフト遅延 5. 動作確認 6. 実験回路 1. 目的 ポートBのビット0に接続したLEDを点滅させます。 2. フローチャート (main) ↓ ポートの初期化 アナログ比較器の電源OFF ウォッチドック動作禁止 ↓ ├────────────┐ ↓ │ ポートBのビット0に1を出力 │ ↓ │ 1秒遅延 │ ↓ │ ポートBのビット0に0を出力 │ ↓ │ 1秒遅延 │ ↓ │ └────────────┘ 3. プログラムソースコード シフト記号"<<"は半角記号に変更してください。 ;============================================================= ; タイトル : LessonA02 ; 著者 : 中野 良知 ; 作成開始 : 2007.09.01(土) 作成開始 ; 最新修正 : 2007.09.01(土) ; 動作クロック : CLOCK=1MHz。内蔵RC発振器を使用 ;============================================================= ; インクルード .include "tn2313def.inc" ; ;============================================================= ; 汎用レジスターに名前を定義(変数定義) .def acc = R16 ; アキュムレーター ;============================================================= ; マクロ定義 .macro DLY100M ldi acc,@0 mov r2,acc dly10: ldi acc,130 mov r1,acc dly20: clr r0 dly30: dec r0 brne dly30 dec r1 brne dly20 dec r2 brne dly10 .endmacro ;============================================================= ; プログラム ;============================================================= .cseg ; CODE SEGMENT .org 0 ; ROMアドレス=0 start: // PORTB 初期化 ldi acc,$00 ; 出力データ out PORTB,acc ; PORTBの全ビットをLowに設定 ldi acc,$FF ; PORTB全ビット出力 out DDRB,acc ; PORTB入出力方向設定 // アナログ比較器初期化 sbi ACSR,ACD ; アナログ比較器電源オフ // ウォッチドッグ(WD)禁止 wdr ; WDタイマリセット in acc,MCUSR ; MCUSR値を取得 andi acc,~(1<<WDRF) ; WDRF=0 out MCUSR,acc ; WD RESETフラグ(WDRF)解除 in acc,WDTCSR ; 現WDTCSR値を取得 ori acc,(1<<WDCE)|(1<<WDE) ; WDCE=WDE=1を設定 out WDTCSR,acc ; WDCEとWDEに書き込み ldi acc,$00 ; WDCE=WDE=0を設定 out WDTCSR,acc ; WD禁止 led_on_off: sbi PORTB,0 ; PORTBのbit0に1を出力 DLY100M 10 ; 100msec*10=1sec cbi PORTB,0 ; PORTBのbit0に0を出力 DLY100M 10 ; 100msec*10=1sec rjmp led_on_off ; ループ ;============================================================= ; END ;============================================================= 4. キーワード 4.1. マクロプログラム マクロプログラム(マクロ)を使用するとソースコードが見やすくなります。 その他に引数を利用することで処理内容を変えることも出来ます。 アセンブラーは、マクロのラベルが記述されている箇所にマクロの定義内容を展開す る為、ROMの使用量が増えます。 ROMの節約にはサブルーチンを使用した方が有利で すが、rcallとret命令がクロック数を多く消費するため、実行速度を重視する処理で はマクロが有利です。 .macro MACRONAME ... ... .endmacro MACRONAME部分にマクロ名を記述します。 ... にプログラムを記述します。 引数は複数個使用できます MACRO1 $32,$AA ; 2つの数値を引数にします。 MACRO2 R17 ; 汎用レジスターを引数にします。 引数の並び順に @0、@1、@2、.... でマクロプログラムに記述します。 .macro MACRO3 ldi R16,@0 ldi R17,@1 and R16,R17 mov @2,R16 .endmacro で MACRO3 $32,$AA,R1 は ldi R16,$32 ldi R17,$AA and R16,R17 mov R1,R16 のように展開します。 4.2. ソフト遅延 マクロ DLY100M を使用して1秒の遅延を設定します。 遅延カウントのクロック数 .macro DLY100M クロック数 ldi acc,@0 1 mov r2,acc 1 dly10: ldi acc,130 1 mov r1,acc 1 dly20: clr r0 1 dly30: dec r0 1 brne dly30 1/2 dec r1 1 brne dly20 1/2 dec r2 1 brne dly10 1/2 .endmacro (((1+2)*256+1+2+1)*131+1+2+1+1+1)*@0=((768+4)*130+6)*@0=100366*@0 usec したがって DLY100M 10 では、100366usec*10=約1secの遅延が得られます。 5. 動作確認 0.98sec 0.98sec │←──→│←──→│ ┌────┐ ┌────┐ RB0 ──┘ └────┘ └─── 偏差 = -2% 6. 実験回路 ATtiny2313 ┌────┐20 │ VCC├────●────────●────●──── +5V │ │ │ │0.1u │ │ │ R10K ┴ /50V │┴│100u/16V │ │1 │ 0.1u/50V ┬ └┬┘ │ -RESET├────●───┤├───●────┘ │ │ │ │ │ LED │ │ │12 ┌─┬┐ │ │ RB0├──┤>│├─R220──● │ │ └─┴┘ │ │ │10 │ │ GND├─────────────●───────── 0V(GND) │ │ └────┘ 0.1u/50VのコンデンサーはVCCとGNDの近くに接続します。
LessonAのTopへ
サイトTopへ
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。
inserted by FC2 system