.include "c:\avr\avrasm\appnotes\tn2313def.inc"

	.def	temp	=r16
	.def	temp1	=r17
	.def	temp2	=r18
	.def	temp3	=r19
	.def	temp4	=r20
	.def	Per	=r21
	.def	tim	=r22
	.def	wei	=r23
	
	.CSEG
	.org 0	
		rjmp	Reset			; Прерывание Reset 		
		rjmp	INT_0			; Внешнее прерывание Int0	
		RETI				; Внешнее прерывание Int1
		RETI				; Таймер/счётчик 1 захват
		RETI				; Таймер/счётчик 1, совпадение, канал A
		RETI				; Таймер/счётчик 1, прерывание по переполнению
		RETI				; Таймер/счётчик 0, прерывание по переполнению
		RETI				; Прерывание UART приём завершён
		RETI				; Прерывание UART регистр данных пуст
		RETI				; Прерывание UART передача завершена
		RETI				; Прерывние по компаратору
		RETI				; Прерыание по изменению на любом контакте
		RETI				; Таймер/счётчик 1, совпадение, канал B
		reti				; Таймер/счётчик 0, совпадение, канал A
		RETI				; Таймер/счётчик 0, совпадение, канал B

Reset:						;тело программы
          		ldi Temp,RamEnd		;инициализация стека
          		out SPL,Temp

		ldi per,0b00000000
;***********************************************
; Настройка портов
;***********************************************

		ldi Temp,0b11111111		;Порт B На вывод
          	  out DDRB,Temp
		  out PORTB,Temp

		ldi Temp,0b00000000		;Порт D на ввод
		  out DDRD,Temp
		  out PORTD,Temp

;***********************************************
; Настройка прерывания INT_0
;***********************************************       

					
					
		ldi Temp,0b00000011		; в MCUCR надо выставить 2 младших бита, триггер срабатывания прерывания
						; 00 - низкий уровень, 01 - зарезервировано, 10 - по спаду, 11 - по фронту
		  out MCUCR,Temp		;установка триггера

		ldi Temp,0b01000000	
		  out GIMSK,Temp		;разрешение прерывания int0

;***********************************************
; Настройка таймера
;***********************************************       


		ldi Temp,0b00000010   		;тактовый сигнал = CK/8
        	   out TCCR0B,Temp

       		ldi Temp,0xFF         		;инициализация компаратора таймера 0 канала А
      		  out OCR0A,Temp 

		ldi Temp,0b00000001  		;разрешить прерывание компаратора   
		  out TIMSK,Temp

          	sei                		;разрешить прерывания	


;***********************************************
; Основная программа
;***********************************************

		
op2:		rjmp op2


;***********************************************
; Обработка прерывания INT_0
;***********************************************


INT_0:		
		sbrs per,0			;сравнение 7 разряда константы per т.е. 0b00000000
		   rjmp m1			;если первый разряд сброшен (0), перейти по мете m1
		   rjmp m2			;если первый разряд установлен (1), перейти по метке m2


m1:		cbi portb,6
		sbi portb,5
		ldi Temp,0b00000010		;прерывание по спаду
		  out MCUCR,Temp	

     		ldi Temp,0           	       	;обнуление таймера
         	out TCNT0,Temp
		

		ldi per,0b00000001

		reti

m2:		cbi portb,5
		sbi PORTB,6	
		ldi per,0b00000000

		ldi Temp,0b00000011		;прерывание по фронту
		  out MCUCR,Temp


		in   tim,TCNT0			;копируем значение 0 таймера в регистр tim

     		ldi Temp,0            	       	;обнуление таймера
         	out TCNT0,Temp

		   cpi tim,0b10100001		;Сравниваем регистр tim со значением 161 (00111101)
		      brlo m3			;Если tim < 61 идем по метке m3
		      rjmp m4			;иначе переход на m4

m3:		ldi temp,255
		out portb,temp

		sleep		

		reti

m4:		cpi tim,0b10110101		;Сравниваем регистр tim со значением 121 (00111101)
		   brlo m5			;Если tim < 121 идем по метке m5
		   rjmp m6			;иначе переход на m6

m5:		Cbi PORTB,0			;отключаем  1 светодиод
		Sbi PORTB,1			;включаем  2 светодиод
		sbi PORTB,2			;отключаем  3 светодиод
		sbi PORTB,3			;отключаем  4 светодиод
		sbi PORTB,4			;отключаем  5 светодиод
sei
		reti

m6:		cpi tim,0b11001001		;Сравниваем регистр tim со значением 181 (10110101)
		   brlo m7			;Если tim < 181 идем по метке m7
		   rjmp m8			;иначе переход на m8

m7:		sbi PORTB,0			;отключаем  1 светодиод
		Cbi PORTB,1			;отключаем  2 светодиод
		Sbi PORTB,2			;включаем 3 светодиод
		sbi PORTB,3			;отключаем  4 светодиод
		sbi PORTB,4			;отключаем  5 светодиод
sei
		reti

m8:		cpi tim,0b11011000		;Сравниваем регистр tim со значением 241 (10110101)
		   brlo m9			;Если tim < 241 идем по метке m9
		   rjmp m0			;иначе переход на m0

m9:		sbi PORTB,0			;отключаем  1 светодиод
		sbi PORTB,1			;отключаем  2 светодиод
		Cbi PORTB,2			;отключаем  3 светодиод
		Sbi PORTB,3			;включаем 4 светодиод
		sbi PORTB,4			;отключаем  5 светодиод
sei
		reti

m0:		sbi PORTB,0			;отключаем  1 светодиод
		sbi PORTB,1			;отключаем  2 светодиод
		sbi PORTB,2			;отключаем  3 светодиод
		cbi PORTB,3			;отключаем  4 светодиод
		sbi PORTB,4			;включаем 5 светодиод

		reti

		