;******************************************************************************************
;  ＡＶＲサンプル (ATTiny2313用)
;   Project      :
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H20.05.05
;   History      :
;******************************************************************************************
;  (1)Description 
;      R16:Temporary Ragister
;      R17:Temporary Ragister
;      R20:Temporary Ragister
;      R21:LED Position
;******************************************************************************************
.include "tn2313def.inc"

;  PI_TCNT1 : タイマー１の時間設定(16Bit)   9766
;   ※ OSC; 8MHz用   0xFFFF - ( 8,000,000[Hz] / 1024 ) =>  57722(0xE17A)
;   ※ OSC;10MHz用   0xFFFF - (10,000,000[Hz] / 1024 ) =>  57769(0xD9D9)
;.equ   PI_TCNT1H = 0xE1
;.equ   PI_TCNT1L = 0x7A
.equ    PI_TCNT1H = 0xD9
.equ    PI_TCNT1L = 0xD9


        RJMP    RESET       ;各種ﾘｾｯﾄ
        RJMP    EXT_INT0    ;外部割り込み要求0
        RJMP    EXT_INT1    ;外部割り込み要求1
        RJMP    TIM1_CAPT   ;ﾀｲﾏ/ｶｳﾝﾀ1 捕獲(ｷｬﾌﾟﾁｬ)発生
        RJMP    TIM1_COMPA  ;ﾀｲﾏ/ｶｳﾝﾀ1 比較A一致
        RJMP    TIM1_OVF    ;ﾀｲﾏ/ｶｳﾝﾀ1 ｵｰﾊﾞｰﾌﾛｰ
        RJMP    TIM0_OVF    ;ﾀｲﾏ/ｶｳﾝﾀ0 ｵｰﾊﾞｰﾌﾛｰ
        RJMP    USART_RXC   ;USART 受信完了
        RJMP    USART_UDRE  ;USART 送信ﾊﾞｯﾌｧ空き
        RJMP    USART_TX    ;USART 送信完了
        RJMP    ANA_COMP    ;ｱﾅﾛｸﾞ比較器出力遷移
        RJMP    PCINT       ;ﾋﾟﾝ変化割り込み要求
        RJMP    TIM1_COMPB  ;ﾀｲﾏ/ｶｳﾝﾀ1 比較B一致
        RJMP    TIM0_COMPA  ;ﾀｲﾏ/ｶｳﾝﾀ0 比較A一致
        RJMP    TIM0_COMPB  ;ﾀｲﾏ/ｶｳﾝﾀ0 比較B一致
        RJMP    USI_STRT    ;USI 開始条件検出
        RJMP    USI_OVF     ;USI ｶｳﾝﾀ ｵｰﾊﾞｰﾌﾛｰ
        RJMP    EE_RDY      ;EEPROM操作可
        RJMP    WDT_OVF     ;ｳｫｯﾁﾄﾞｯｸﾞ計時完了

P_START:
; *******************************
;   0.初期化
; *******************************
;  (1)スタックのアドレス設定
        LDI     R16,LOW(RAMEND) ; スタックのアドレス設定(デフォルト値を設定する)
        OUT     SPL,R16         ; スタックのアドレス設定(デフォルト値を設定する)

;  (2)ポートの設定
        LDI     R16,0xFF        ; PORTB(0-7)を全て出力にする
        OUT     DDRB,R16        ; PORTB(0-7)を全て出力にする
        LDI     R16,0x00        ; PORTD(0-6)を全て入力にする
        OUT     DDRD,R16        ; PORTD(0-6)を全て入力にする

;  (3)ルーレットの初期値を設定
        LDI     R16,0x01        ; PORTBを初期化
        OUT     PORTB,R16       ; PORTBを初期化
        LDI     R21,0x01        ;

;  (4)割り込み設定
        RCALL   Int_intrp       ;

; *******************************
;   1.メインプログラム(何もしない)
; *******************************
MAIN:
;
        RJMP     MAIN


;******************************************************************************************
;   Function Name : Int_intrp 
;   Title         : タイマー１の割り込みの初期化
;   Input         :
;   Output        :
;   Description   : 
;           Timer0:8bit, Timer1:16bitのタイマー
;******************************************************************************************
Int_intrp:
; **********************************************************
;   1.TCCR1B(Timer/Counter0 Control Register B)の設定
;       ICNC1          : Input Capture1 Noise Cancel
;       ICES1          : Input Capture1 Edge Select
;       WGM13          : Waveform Generation Mode bit 3 and 2
;       WGM12          : Waveform Generation Mode bit 3 and 2
;       CS12,CS11,CS10 : Clock Select1, bit 2,1 and 0
;                          ※ 001;分周無し ～ 101;1024分周
; **********************************************************
;    TCCR1B=(0<<ICNC1)|(0<<ICES1)|(0<<WGM13)|(0<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10) ;
        LDI     R16,(0<<ICNC1)|(0<<ICES1)|(0<<WGM13)|(0<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10) ;
        OUT     TCCR1B,R16			;


; **********************************************************
;   2.TIMSK(Timer/Counter Interrupt Mask Register)の設定 
;        TOIE1   : Timer/Counter1 Overflow Interrupt Enabl
;        OCIE1A  : Timer/Counter1 Output Compare A Match Interrupt Enable
;        OCIE1B  : Timer/Counter1 Output Compare B Match Interrupt Enable
;        ICIE1   : Timer/Counter1 Input Capture Interrupt Enabe
;        OCIE0B  : Timer/Counter Output Compare Match B Interrupt Enable
;        TOIE0   : Timer/Counter Overflow Interrupt Enable
;        OCIE0A  : Timer/Counter Output Compare Match A Interrupt Enable
; ********************************************************** 
;   TIMSK=(1<<TOIE1)|(0<<OCIE1A)|(0<<OCIE1B)|(0<<ICIE1)|(0<<OCIE0B)|(0<<TOIE0)|(0<<OCIE0A);
        LDI     R16,(1<<TOIE1)|(0<<OCIE1A)|(0<<OCIE1B)|(0<<ICIE1)|(0<<OCIE0B)|(0<<TOIE0)|(0<<OCIE0A);
        OUT     TIMSK,R16


; **********************************************************
;   3.TCNT1(Timer/Counter 0)の設定
; ********************************************************** 
;    TCNT1=PI_TCNT1 ; 
        LDI     R17,PI_TCNT1H
        LDI     R16,PI_TCNT1L
;
        OUT     TCNT1H,R17
        OUT     TCNT1L,R16

; **********************************************************
;   4.割り込み開始
; ********************************************************** 
        SEI                     ;

        RET                     ;

;******************************************************************************************
;   Function Name : INT_T
;   Title         : タイマー割り込み関数
;   Input         : 
;   Output        : 
;******************************************************************************************
INT_T:

; *************************
;  0.レジスタ退避
; *************************
        IN      R20,SREG           ;現全割り込み許可ﾌﾗｸﾞ(I)を保存
        CLI                        ;割り込み禁止 
        PUSH    R16
        PUSH    R17

; *************************
;  1.タイマー値の設定
; *************************
        LDI     R17,PI_TCNT1H
        LDI     R16,PI_TCNT1L
;
        OUT     TCNT1H,R17
        OUT     TCNT1L,R16

; *************************
;  2.ルーレットをまわす
; *************************
        OUT     PORTB,R21       ; PORTBに代入
        SBRC    R21,7           ;
        RJMP    MVLD1           ;
        LSL     R21             ; 表示をシフト
        RJMP    MVLD1_E
MVLD1:
        LDI     R21,0x01        ; PORTB変数を1に初期化
MVLD1_E:


; *************************
;  3.レジスタを戻す
; *************************
        POP     R17
        POP     R16
        SEI                     ; 割り込み再開
        OUT     SREG,R20        ; 全割り込み許可ﾌﾗｸﾞを復帰

        RETI


;******************************************************************************************
;   Function Name : 
;   Title         : 割り込み関数の定義
;   Input         : 
;   Output        : 
;******************************************************************************************
RESET:          ;各種ﾘｾｯﾄ
        RJMP     P_START
EXT_INT0:       ;外部割り込み要求0
EXT_INT1:       ;外部割り込み要求1
TIM1_CAPT:      ;ﾀｲﾏ/ｶｳﾝﾀ1 捕獲(ｷｬﾌﾟﾁｬ)発生
TIM1_COMPA:     ;ﾀｲﾏ/ｶｳﾝﾀ1 比較A一致
TIM1_OVF:       ;ﾀｲﾏ/ｶｳﾝﾀ1 ｵｰﾊﾞｰﾌﾛｰ
       RJMP      INT_T
TIM0_OVF:       ;ﾀｲﾏ/ｶｳﾝﾀ0 ｵｰﾊﾞｰﾌﾛｰ
USART_RXC:      ;USART 受信完了
USART_UDRE:     ;USART 送信ﾊﾞｯﾌｧ空き
USART_TX:       ;USART 送信完了
ANA_COMP:       ;ｱﾅﾛｸﾞ比較器出力遷移
PCINT:          ;ﾋﾟﾝ変化割り込み要求
TIM1_COMPB:     ;ﾀｲﾏ/ｶｳﾝﾀ1 比較B一致
TIM0_COMPA:     ;ﾀｲﾏ/ｶｳﾝﾀ0 比較A一致
TIM0_COMPB:     ;ﾀｲﾏ/ｶｳﾝﾀ0 比較B一致
USI_STRT:       ;USI 開始条件検出
USI_OVF:        ;USI ｶｳﾝﾀ ｵｰﾊﾞｰﾌﾛｰ
EE_RDY:         ;EEPROM操作可
WDT_OVF:        ;ｳｫｯﾁﾄﾞｯｸﾞ計時完了
        RETI

