2014年6月14日土曜日

スロトレタイマーのプログラム(アセンブリ言語)


スロトレタイマーのアセンブリ言語一覧です。

 .include "m88def.inc"
;各種設定
;汎用レジスタ
.def STACK = R16
.def R_TMR0 = R17
.def R_TEMP1 =R18
.DEF R_TEMP2 =R19
.DEF R_1SEC = R20
.DEF R_M = R21

;PORT定義
.EQU P_BZ = PORTD
.EQU P_7SEG = PORTB

;入出力ビット
.EQU INOUT_PD6 = 6

.EQU seg71 = 0B11111001
.EQU seg72 = 0B11000100
.EQU seg73 = 0B11010000

;割込みベクタ定義
.CSEG
RJMP MAIN

.ORG 0x000E
RJMP ICTC0;タイマ0出力比較レジスタA一致

;割込みルーチン タイマ0
ICTC0:
    IN STACK,SREG ;ステータスレジスタ内容退避

    DEC R_TMR0;ループカウンタ減算
    BRNE ICTC1;0以外の場合、ICTC1へ分岐
    ;R_TMR0=0の時の処理
    LDI R_TMR0, 40;R_TMR0の再設定 40*250us = 10ms

    DEC R_1SEC;1秒カウンタ減算
    BRNE ICTC1;0以外の場合、ICTC1へ分岐
    ;R_1SEC=0の時の処理
    LDI R_1SEC, 100;10ms*100=1s

    DEC R_M ;R_Mカウンタ減算
    BRNE ICTC1;0以外の場合、ICTC1へ分岐 R_M 3->2->1
    ;R_M=0の時の処理
    LDI R_M,3

ICTC1:
    CPI R_M,1
    BRNE ICTC3;0以外の場合ICTC3へ分岐

ICTC2: ;R_M = 1の場合
    CPI R_1SEC, 20
    IN R_TEMP1,SREG
    SBRC R_TEMP1,2 ;SREG Nfalg 2bit目がクリアの場合スキップ
    RJMP ON1

OFF1: ;出力設定OFF
    LDI R_TEMP1, 0B10111111 ;PD6入力設定
    LDI R_TEMP2, 0B01000000 ;PD6プルアップ有り
    OUT DDRD, R_TEMP1
    OUT PORTD, R_TEMP2
    RJMP ICTC4

ON1: ;出力設定ON
    LDI R_TEMP1, 0B11111111 ;PD6入力設定
    LDI R_TEMP2, 0B01000000 ;PD6プルアップ有り
    OUT DDRD, R_TEMP1   
    OUT PORTD, R_TEMP2
    RJMP ICTC4

ICTC3: ;R_=2,3の場合
    CPI R_1SEC,10
    IN R_TEMP1,SREG
    SBRC R_TEMP1,2 ;SREG Nfalg 2bit目がクリアの場合スキップ
    RJMP ON2

OFF2: ;出力設定OFF
    LDI R_TEMP1, 0B10111111 ;PD6入力設定
    LDI R_TEMP2, 0B01000000 ;PD6プルアップ有り
    OUT DDRD, R_TEMP1
    OUT PORTD, R_TEMP2
    RJMP ICTC4

ON2: ;出力設定ON
    LDI R_TEMP1, 0B11111111 ;PD6入力設定
    LDI R_TEMP2, 0B01000000 ;PD6プルアップ有り
    OUT DDRD, R_TEMP1
    OUT PORTD, R_TEMP2
    RJMP ICTC4

ICTC4:

    OUT SREG,STACK ;ステータスレジスタ内容復帰
    RETI

;メインルーチン
MAIN:
    CLI ;全割込み禁止

    ;変数定義
    LDI R_TMR0, 0x28
    LDI R_1SEC, 0x64
    LDI R_M, 3

    ;PORT設定
    LDI R_TEMP1, 0B11111111
    LDI R_TEMP2, 0B00000000
    OUT DDRB, R_TEMP1
    OUT PORTB, R_TEMP2

    LDI R_TEMP1, 0B11111111
    LDI R_TEMP2, 0B00000000
    OUT DDRC, R_TEMP1
    OUT PORTC, R_TEMP2

    LDI R_TEMP1, 0B10111111 ;PD6入力設定
    LDI R_TEMP2, 0B01000000 ;PD6プルアップ有り
    OUT DDRD, R_TEMP1
    OUT PORTD, R_TEMP2

    ;メインクロック設定
    LDI R_TEMP1, 0B10000000 ;
    STS CLKPR, R_TEMP1;分周書き換え許可
    LDI R_TEMP1, 0B00000011;
    STS CLKPR, R_TEMP1;8分周設定 8MHz→1MHzで動作


    ;動作モード設定
    LDI R_TEMP1, 250
    OUT OCR0A, R_TEMP1;OCR0Aに250を設定

    LDI R_TEMP1, 0B01000010
    OUT TCCR0A, R_TEMP1 ;CTCモードを指定

    LDI R_TEMP1,0B000000001
    OUT TCCR0B, R_TEMP1 ;1分周で動作開始

    ;タイマ割込み許可
    LDS R_TEMP1, TIMSK0
    SBR R_TEMP1, (1<<OCIE0A)
    STS TIMSK0, R_TEMP1

    ;全割込み許可
    SEI

MAIN01:
    CPI R_M,3
    BRBC 1,NODO1
    LDI R_TEMP1,seg73
    OUT PORTB,R_TEMP1

NODO1:

    CPI R_M,2
    BRBC 1,NODO2
    LDI R_TEMP1,seg72
    OUT PORTB,R_TEMP1

NODO2:

    CPI R_M,1
    BRBC 1,NODO3
    LDI R_TEMP1,seg71
    OUT PORTB,R_TEMP1

NODO3:

    RJMP MAIN01

0 件のコメント:

コメントを投稿