;=======================
; Заголовочные файлы

.include "D:\avr\avrasm\appnotes\m8def.inc"

; ======================
; Объявления:

		.def    temp = r16
		.def 	temp1 = r17
		.def 	temp2 = r18

; ======================
; Начало программы

		.cseg							; обозначаем начало программного сегмента
		.org 0							; задаем начальный адрес
		
; ======================
; Прерывания

		rjmp RESET 
		rjmp EXT_INT0 
		rjmp EXT_INT1 
		rjmp TIM2_COMP 
		rjmp TIM2_OVF 
		rjmp TIM1_CAPT 
		rjmp TIM1_COMPA 
		rjmp TIM1_COMPB 
		rjmp TIM1_OVF 
		rjmp TIM0_OVF 
		rjmp SPI_STC 
		rjmp USART_RXC 
		rjmp USART_UDRE 
		rjmp USART_TXC 
		rjmp ADCI 
		rjmp EE_RDY 
		rjmp ANA_COMP 
		rjmp TWSI 
		rjmp SPM_RDY 
		
; ======================
; Обработчики прерываний

;RESET:
EXT_INT0:
EXT_INT1:
TIM2_COMP: 
TIM2_OVF:
TIM1_CAPT: 
TIM1_COMPA: 
;TIM1_COMPB:
TIM1_OVF:
TIM0_OVF:
SPI_STC: 
USART_RXC: 
USART_UDRE: 
USART_TXC: 
ADCI: 
EE_RDY: 
ANA_COMP: 
TWSI: 
SPM_RDY:
		reti

; ======================
; Инициализация

RESET:
		ldi temp, 0b11111111			; настройка портов
		out DDRB, temp
	
		ldi temp, 0b00001000			; разрешенить прерывание компаратора
		out TIMSK, temp
		
		ldi temp, 0b00000010   			; тактовый сигнал = CK/8
        out TCCR1B, temp
		
		ldi temp, 0x3D         			; инициализация компаратора
        out OCR1BH, temp
        ldi temp, 0x09
		out OCR1BL, temp
		
		ldi temp, LOW(RAMEND)		   	    ; установка указателя стека
        out SPL, temp
		
		ldi temp1, 0b00000001			; инициализация индикатора
		
		ldi temp, 0            			; обнуление таймера
        out TCNT1H, temp
        out TCNT1L, temp

        sei               			    ; разрешить прерывания
		
		
; ======================
; Основной цикл

INF: 
		rjmp INF						; бесконечный цикл (жрет такты)

; ======================
; Обработчик прерываний компаратора 
	
TIM1_COMPB:
		ldi temp, 0						; обнуление таймера
        out TCNT1H, temp
        out TCNT1L, temp

SHIFT:
		cpi temp1, 0b10000000 			; сравнить с крайним знач.
        breq INIT             			; если равно - загрузка нач. знач.

        lsl temp1           			; иначе - сдвиг влево
        rjmp OUTPUT			           	; перейти на вывод в порт

INIT:   
		ldi temp1, 0b00000001  			; загрузить нач. значение

OUTPUT: 
		out PortB, temp1      			; вывод в порт

        reti                 			; выход из обработчика


