/*
* ATTiny10_test.asm
*
* Created: 2012/02/19 
* Author: jn3xby
*/

.INCLUDE "D:\My ProgramFiles\SoftWare\AVR Studio5\avrassembler\include\tn10DEF.INC"

	;LDI R16,$1D
	;OUT NVMCMD,R16



/*　割り込みベクタ*/

.ORG 0
	RJMP RESET ;リセット
.ORG 1
	RJMP POWINT
.ORG $000a
	RJMP ADCUP ;A/D変換終了



/*　プログラムスタート*/

RESET:
	LDI R16,high(RAMEND) ;スタックポインタの設定
	OUT SPH,R16
	LDI R16,LOW(RAMEND)
	OUT SPL,R16

	SEI					;割り込み許可

/*　電源on時初期設定*/

INIT:
;--- PORTB ---
	LDI R16,0B00000001 ;DDRB=&b00001001
	OUT DDRB,R16
	LDI R16,0B00000110 ;PORTB=&b00001110
	OUT PORTB,R16
	LDI r16,0B00000110 ;1 プルアップ
	OUT PUEB,r16

;--- レジスタ割付 ---
;　R21:長短点メモリーフラグ
;　R22,R23,R24：スリープカウンタ
;　R20：DOT/Spaceの長さカウンタ
;　R19：SPEED（ADの値）


;--- ANALOG COMPARATER ---
	LDI R16,$80			;アナログコンパレータオフ
	OUT ACSR,R16

	LDI R19,50			;（仮）スピード

MAIN_LOOP:

	CPI R21,0B00000010	;短点メモリー動作判定
	BREQ DOT
	
	CPI R21,0B00000001	;長点メモリー動作判定		
	BREQ DASH


	IN R16,PINB			;KeyIn DOT 判定
	ANDI R16,0B00000100
	BREQ DOT

	IN R16,PINB			;KeyIn DASH 判定
	ANDI R16,0B00000010
	BREQ DASH

;--- ADルーチン ---

	LDI R16,3			;AD ポート設定
	OUT ADMUX,R16
	LDI R16,$E0
	OUT ADCSRA,R16

	RCALL WAIT1MS		;スリープカウンタカウントルーチン

	INC R22		;最小桁
        CPI R22,$FF
        BRNE MAIN_LOOP
        LDI R22,0
    INC R23		;第2桁
        CPI R23,$FF
        BRNE MAIN_LOOP
        LDI R23,0
	INC R24		;第3桁　256*256*10*1mS=10分
        CPI R24,$0A
        BRNE MAIN_LOOP
	LDI R24,0

	
	LDI R16,0B00000000 ;DDRB=&b00000000
	OUT DDRB,R16
	LDI R16,0B00000000 ;PORTB=&b0000000
	OUT PORTB,R16
	LDI R16,0B00000000 ;PUEB=&B00000000
	OUT PUEB,R16
	LDI R16,0B00000010 ;割り込み条件設定
	OUT EICRA,R16
	LDI R16,0B00000001 ;INT0許可
	OUT EIMSK,R16
	
	LDI R16,0B00000101	;
	OUT SMCR,R16

	SLEEP
        
	RJMP RESET


;--- DOT ROUTINE ---
DOT:
	LDI R22,0		;スリープカウンタクリア
    LDI R23,0
    LDI R24,0

	LDI R21,0		;短点メモリークリア
	MOV	R20,R19		;スピード設定
  
	LDI R16,0B00000001		;KeyOn
	OUT PORTB,R16

DOT_LOOP:

	RCALL WAIT1MS

	;IN   R16,PINB	;KeyCheck
    ;ANDI R16,0B00000010    ;DASH?
    ;BRNE DOT_LOOP1 
	;LDI  R21,0B00000001    ;DASH MEM

DOT_LOOP1:
	DEC R20
	CPI R20,0
	BRNE DOT_LOOP

	LDI R16,0	;KeyOff
    OUT PORTB,R16

	MOV R20,R19

DOTSPACE_LOOP:
	RCALL WAIT1MS

	IN   R16,PINB		   ;KeyCheck
    ANDI R16,0B00000010    ;DASH?
    BRNE DOT_LOOP2
	LDI  R21,0B00000001    ;DASH MEM

DOT_LOOP2:
	DEC R20
	CPI R20,0
	BRNE DOTSPACE_LOOP

	LDI R20,0

	RJMP MAIN_LOOP


 

;--- DASH ROUTINE ---
DASH:
	LDI R22,0			;スリープカウンタクリア
    LDI R23,0
    LDI R24,0

	LDI R21,0			;長点メモリークリア
	MOV R20,R19			;スピード設定
  
  DASH_LOOP:
	LDI R16,0B00000001	;KeyOn
	OUT PORTB,R16

	RCALL WAIT1MS
	RCALL WAIT1MS
    RCALL WAIT1MS

	;IN   R16,PINB	;KeyCheck
    ;ANDI R16,0B00000100    ;DOT?
    ;BRNE DASH_LOOP1 
    ;LDI  R21,0B00000010    ;DOT MEM

DASH_LOOP1:
	DEC R20
	CPI R20,0
	BRNE DASH_LOOP

	LDI R16,0	;KeyOff
    OUT PORTB,R16

	MOV R20,R19

DASHSPACE_LOOP:
	
	RCALL WAIT1MS

	IN   R16,PINB		   ;KeyCheck
    ANDI R16,0B00000100    ;DOT?
    BRNE DASH_LOOP2 
    LDI  R21,0B00000010    ;DOT MEM

DASH_LOOP2:
	
	DEC R20
	CPI R20,0
	BRNE DASHSPACE_LOOP

	RJMP MAIN_LOOP

;--- Wait1mS ---	

WAIT1MS:

	LDI	R16,250

WAIT1MS_LOOP:
	; NOP
	DEC R16
	CPI R16,0
	BRNE WAIT1MS_LOOP

	IN R19,ADCL			;AD スピード設定の取り込み

	RET

POWINT:
	
	LDI R16,0B00000000 ;INT0不許可
	OUT EIMSK,R16
	LDI R16,0B00000100
    OUT SMCR,R16

	RJMP RESET

ADCUP:

	reti	

     	








