組込み開発再入門(5) – ITU で Lチカ

ITU (Integrated Timer Unit) を使ってみるテスト。

ITU 内のカウンタ TCNT は 0x0000 から 0xFFFF までカウントできる。
オーバフローするとオーバフローフラグ (TSR) を立てて 0x0000 から再びカウントアップする。
カウントに使うクロックはプリスケーラで最大 1/8 まで分周可能。

ということでオーバフローフラグが立っていたら LED を ON/OFF するようにしてみる。

H8 4080F の場合は動作クロックが 16MHz なので、プリスケーラで 1/8 に分周するとして、
16 / 8 = 2 Mhz = 2 x 10^6 tick / sec

0xFFFF までカウントすると 65535 ticks なので、
(65535) / (2 x 10^6) = 32.767 msec

つまり、約 32 msec 毎に明滅する (すっごい早いよ)

/********************************************************************************/
/* led.s - ITUテスト
/********************************************************************************/
 
        .h8300h                 ;CPUを指定
 
        /* ラベル定義 */
        .equ    P5DDR,  0xFFFC8 ;P5 データディレクションレジスタ
        .equ    P5DR,   0xFFFCA ;P5 データレジスタ
        .equ    TSTR,   0xFFF60 ;タイマスタートレジスタ
        .equ    TCR0,   0xFFF64 ;タイマコントロールレジスタ
        .equ    TSR0,   0xFFF67 ;タイマステートレジスタ
 
        .section    .text
 
        .global     _start
        .type       _start,@function
 
_start:
        mov.l   #0xFFF00, sp    ;使わないけど
 
        /* P5 を出力に設定 */
        mov.b   #0xF3, r0l
        mov.b   r0l, @P5DDR
 
        /* ITU の初期化 */
        mov.b   #0x03, r0l      ;1/8 分周
        mov.b   r0l, @TCR0      ;プリスケーラ設定
        bset.b  #0x00, @TSTR:8  ;ITUカウンタスタート
 
LOOP:
        mov.b   @TSR0,  r0l
        btst.b  #0x02,  r0l     ;オーバフローフラグチェック
        beq     LOOP
 
LED_CHECK:
        bclr.b  #0x02,  @TSR0:8 :オーバフローフラグクリア
 
        /* LED の点灯状態を確認 */
        mov.b   @P5DR,  r0l
        btst.b  #0x00,  r0l
        beq     LED_ON
 
LED_OFF:
        bclr.b  #0x00,  @P5DR:8 ;LED1=OFF
        jmp     @LOOP
 
LED_ON:
        bset.b  #0x00,  @P5DR:8 ;LED1=ON
        jmp     @LOOP
 
        .end

飽きてきたからそろそろ C で書きたいなーとか。。。

スポンサーリンク

フォローする

スポンサーリンク