; ****************************
; Дата:  14.02.2015										ПРОВЕРКА ДРУГОЙ СТРУКТУРЫ
; Для AVR: ATtiny13A
; Тактовая частота: 4.8 МГц
; Выполняемые функции: включение светодиода на 3 минуты, двойное энергосбережение

.device		ATtiny13
.nolist
.include	"C:\Program Files (x86)\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn13def.inc"
.list
; ===========================
; объявления
.def	temp=r16;
.def	srl=r17;
.def	srh=r18;
.def	flag=r19;
; ===========================
.cseg						; выбор сегмента - программный код
						
.org	$000
rjmp nach					; (reset)

.org	$001					
rjmp	Knopka				; появление 0 на PB1

.org    $002
reti

.org	$003				
rjmp	timer				; Timer\counter overflow				
; ===========================
; инициализация стека
Nach:
	ldi		temp, low(ramend); стек
	out		spl,temp
	ldi		temp,0x80		; выкл. комп.
	out 	ACSR,temp		; 
; ===========================
; инициализация портов
	ldi		temp,0b11111111 ; 
	out		DDRB,temp		; 
	ldi		temp,0b00000011	; 
	out		PortB, temp		;
	
	ldi		temp,0b01000000	; разрешение прерывания от INT0
	out		GIMSK, temp		;
	sei
	rjmp 	start
; ===========================
; обработка прерывания
Knopka:
	ldi		temp,0b00000000	; запрещение прерывания от INT0
	out		GIMSK, temp		;

	ldi		temp,0b00000010	; вкл LED
	out		PortB, temp		;				

	ldi		zh,$0C			;для числа 3296: zl=$E0, zh=$0C
	ldi		zl,$E0			;

	ldi		temp,0b00000010 ;
	out		TIMSK0, temp	;разрешение прерыв по переполнению
; очистка счетчика            
	ldi		temp,0b0000011 ;		
	out		TCCR0B,temp		; clk/1024 - tccr0b=xxxx x101
; тут счетчик начал считать
	ldi		srL, $00		; регистры счета циклов
	ldi		srH, $00
	
	ldi		flag,$01		; флаг=1 -> переход в bla
;	sei
	reti		
Timer:
 	clv						; сбрасываем флаг переполнения
	inc		srL
	brvc 	PC+3			;переход, если не было переполнения
	inc		srh
	clr		srl
;проверка на достижение 3296
	sei
	cp		srh, zh; сравниваем
	brlo	bla				; переход, если srh<zl
	cp		srl,zl			;
	brlo	bla				; переход если srl<zl
	
	ldi		temp,0b00000011	; выкл LED
	out		PortB, temp		;


	ldi		temp,0b00000000 ;
	out		TIMSK0, temp	; запрещ прерыв таймера

	ldi		flag,0

	ldi		temp,0b01000000	; разрешение прерывания от INT0
	out		GIMSK, temp		;	
	reti
; ===========================
; Основное тело программы
Start:
	; flag=1? да - к таймеру. нет - спать
	cpi		flag,1
	brsh 	Bla; переход, если  flag=1

	ldi		temp,0b00110000	; разрешение sleep (5 бит), power down (4-3 биты), просыпается от низкого уровня на INT0 (1-0 биты)
	out		MCUCR, temp		;
	sleep
	nop;
	; проверка
	rjmp start
Bla:
	cpi		flag,1
	brlo 	start; переход, если  flag=1
	ldi		temp,0b00100000	; разрешение sleep (5 бит), idle (4-3 биты)
	out		MCUCR, temp		;				; сон для таймера
	sleep;
	rjmp bla
.exit
