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
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿