.include "tn2313def.inc" 

.def	tmp	=	r16
.def	tmp1	=	r17
.def	power	=	r18
.def	Rzr0	=	r19
.def	Rzr1	=	r20
.def	Rzr2	=	r21

;кнопки
.equ	keyplus	=	PD3	; плюс 
.equ	keyminus=	PD4	; минус
.equ	keypower=	PD5	; on off switch
.equ	keytimer=	PD6	; таймер

.equ	powermin=		; 
.equ	powerstart=		; 
.equ	powermax=		; 
.equ	powermin=   		; 
.equ	ms10	  = 0x64	; 

.equ	OutPort	=	PORTB
.equ	OutCntr	=	DDRB
.equ	T1_off	=	0b11111110
.equ	T1_on	=	0b00000100   ;ck256

            .CSEG                
   .org 0 

reset:	rjmp   start	; 00 Reset Handler 

; ***** INTERRUPT VECTORS ************************************************
	.org	INT0addr	;= 0x0001 External Interrupt Request 0
	rjmp	int_0
;.equ	INT1addr	= 0x0002	; External Interrupt Request 1
;.equ	ICP1addr	= 0x0003	; Timer/Counter1 Capture Event
;	.org	OC1Aaddr	;= 0x0004 Timer/Counter1 Compare Match A
;	rjmp	comp1a
;.equ	OC1addr		= 0x0004	; For compatibility
	.org	OVF1addr	;= 0x0005	; Timer/Counter1 Overflow
	rjmp	T1_OVF
;.equ	OVF0addr	= 0x0006	; Timer/Counter0 Overflow
;.equ	URXCaddr	= 0x0007	; USART, Rx Complete
;.equ	URXC0addr	= 0x0007	; For compatibility
;.equ	UDREaddr	= 0x0008	; USART Data Register Empty
;.equ	UDRE0addr	= 0x0008	; For compatibility
;.equ	UTXCaddr	= 0x0009	; USART, Tx Complete
;.equ	UTXC0addr	= 0x0009	; For compatibility
;.equ	ACIaddr		= 0x000a	; Analog Comparator
;.equ	PCIaddr		= 0x000b	; 
;	.org	OC1Baddr	;= 0x000c
;	rjmp	comp1b
;	.org	OC0Aaddr	;= 0x000d
;	rjmp	comp0a
;.equ	OC0Baddr	= 0x000e	; 
;.equ	USI_STARTaddr	= 0x000f	; USI Start Condition
;.equ	USI_OVFaddr	= 0x0010	; USI Overflow
;.equ	ERDYaddr	= 0x0011	; 
;.equ	WDTaddr		= 0x0012	; Watchdog Timer Overflow
;=======================================================================

start:	
        ldi	tmp,low(ramend)      ;stack init SP=0xdf 
        out	spl,tmp

	sbi	ACSR,ACD      ;Analog comparator off 

	ser	tmp
	out	OutCntr,tmp

	clr	tmp
	out	OutPort,tmp

;	clr	tmp
;	out	ddrd,tmp       

;       ldi	tmp,0b01111111       
	ldi	tmp,0b01111011 ;резистор кроме pd2       
	out	portd,tmp       

        ldi	tmp,(1<<ISC01)|(0<<ISC00)	
	out	MCUCR,tmp	      ;INT0 
	ldi	tmp,(1<<INT0)
	out	GIMSK,tmp
; установки для Т1
; тактовая Fo, режим работы - сброс по совпадению

	clr	tmp			; таймер отключен от выводов порта
	out	TCCR1A,tmp
	ldi	tmp,0b00000000		; таймер остановлен
	out	TCCR1B,tmp
;загружаем начальное значение для power
	ldi	tmp,low(power)
	ldi	tmp1,0xFF

	out	TCNT1H,tmp1		; загрузка стартового значения мощности
	out	TCNT1L,tmp

; установка разрешений прерываний от таймеров
	clr	tmp
	ldi	tmp,(1<<TOV1)
	out	TIMSK,tmp

	clt				; обнуляем флаг Т

; основная программа.
	sei

; читаем power из EEPROM             
        idi     tmp  , 0x01 ; 
        out     eear, tmp 
        sbi     eecr ,0 
        in      tmp ,eedr
        cpi     tmp ,0xFF ;это если только прошили и в EEPROM ничего нет 
        breq    exit
;задержка для полной раскрутки мотора 3сек ;2400000 = 249F00
        ldi     Rzr2,0x24
        ldi     Rzr1,0x9F
        ldi     Rzr0,0x00
        rcall   del
        cpi     tmp , powerstart  
        brlo    min 
MAX: 
        cpi     tmp , powermax  
        breq    maexit 
ma01:  
        ldi     Rzr2,0x00
        ldi     Rzr1,0x7D
        ldi     Rzr0,0x00
        rjmp    del ;40мс 007D00
        inc     tmp 
        ldi     power,tmp
        cpi     tmp , power  
        brne    ma01  
maexit:
ret 

MIN: 
        cpi     tmp , powermin 
        breq    mexit 
m01:  
        ldi     Rzr2,0x00
        ldi     Rzr1,0x7D
        ldi     Rzr0,0x00
        rjmp    del ;40мс 007D00
        dec     tmp 
        ldi     power,tmp
        cpi     tmp , power 
        brne    m01 
mexit:
ret

exit:   
        ldi     power,powerstart  

next:
   	nop
	nop
        sbis    PIND,keyplus
        rcall   Plus 
        sbis    PIND,keyminus
        rcall   minus 

rjmp	next

;=======================================================================
; 
;=======================================================================

plus:
        cpi power, powermax
        breq plexit
        inc power 
        ;rcall del ; думаю не надо 
plexit: 
ret


minus:
        cpi power, powermin
        breq mexit
        inc power 
        ;rcall del ; думаю не надо 
mexit:
ret



del:
        subi Rzr0 , 1  
        suci Rzr1 , 0  
        suci Rzr2 , 0  
        brcc del
ret



del1:           
   clr  tmp 
m01: 
   dec  tmp 
   brne  m01
ret


int_0:
	in	tmp,sreg
	push	tmp
	; запускаем Т1
	ldi	tmp,T1_on
	out	TCCR1B,tmp
	pop	tmp
	out	sreg,tmp
	reti

T1_OVF:
        in      tmp,sreg 
        push    tmp
	sbi	OutPort,(1<<OutPin)				
        rcall   del1
	cbi	OutPort,(1<<OutPin)				
	; проверка флага Т 
	brts	t1_001		;если второй цикл переход
	ldi	tmp,low(ms10)					
	ldi	tmp1,0xff					
	out	TCNT1H,tmp1					
	out	TCNT1L,tmp					 
        pop     tmp                                           
        out     sreg,tmp	
	set							
	rjmp	t1_exit
t1_001:
	; отключаем T1
	ldi	tmp,T1_off
	out	TCCR1B,tmp
	; записываем в счетчик Т1 текушего значения power
	ldi	tmp,low(power)
	ldi	tmp1,0xff
	out	TCNT1H,tmp1
	out	TCNT1L,tmp
        pop     tmp 
        out     sreg,tmp	
t1_exit:
reti





