szty's diary

電子工作、プログラミングなど

AVRでLEDを点滅させる

AVR(ATtiny2313)を使ってLチカした。

PB0~PB3のLEDが約0.5s毎に点滅する。

プログラム

.include "tn2313def.inc"

.cseg
.org 0
    rjmp  setup

setup:
    ldi   r16,RAMEND
    out   SPL,r16
    ldi   r16,0b0000_1111
    out   DDRB,r16
loop:
    ldi   r16,0b0000_1111
    out   PORTB,r16
    rcall delay05
    ldi   r16,0
    out   PORTB,r16
    rcall delay05
    rjmp  loop

delay05:
    ldi   r16,5

delay01:
    ldi   r17,100

delay1m:
    ldi   r18,250
delay1m2:
    nop
    dec   r18
    brne  delay1m2

    dec   r17
    brne  delay1m

    dec   r16
    brne  delay01

    ret

レジスタ

DDRx PORTx 動作
0 0 入力(プルアップなし)
0 1 入力(プルアップあり)
1 0 出力(Low)
1 1 出力(High)

疑似命令

  • .include...ライブラリをインクルード

  • .cseg...ここからコードセグメントであると定義

  • .org...プログラムのアドレスを指定

ニモニック

  • rjmp...相対ジャンプ。2clk

  • out...汎用レジスタの値をI/Oレジスタに代入。1clk

  • ldi...1Byteの定数を汎用レジスタ(R16~R31)に代入。1clk

  • rcall...相対サブルーチン呼び出し。3clk

  • nop...なにもしない。1clk

  • dec...汎用レジスタの値を1減少。1clk

  • brne...SREGのZ=0ならば分岐。2clk。Z=1ならば分岐しない。1clk

  • ret ...サブルーチンから復帰。4clk

メモ

ATtiny2313は1MHzで動作させている。

サブルーチンから復帰するためにSPLにRAMENDを保存する。

delay1mは1+(4×250)-1=1000clk、それを100×5回繰り返すことで約500000clkとなり、約0.5sの遅延が作られる。