.device ATtiny2313
.nolist
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn2313def.inc"

.def temp  =r16
.def temp1 =r17          ;анализ выбора скорости
.def temp2 =r18          ;регистр вывода на светодиод
.def temp3 =r19          ;для прерываний
.def temp4 =r20          ;для прерываний
.def temp5 =r21          ;задержка
.def temp6 =r22          ;задержка
.def temp7 =r23          ;задержка


.cseg
.org 0

rjmp Reset            ;вектора прерываний
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP



;Reset:
INT_0:
INT_1:
Timer1_capt1:
;Timer1_comp1:
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
          reti





;****************************************************
; ИНИЦИАЛИЗАЦИЯ
;****************************************************
Reset:    
clr temp                        
out DDRD,temp
ldi temp,0b00000100             ;порт 2 вход
out portD,temp

ser temp   
out DDRB,Temp                   ;порты В - все входы

ldi temp1,0b00000000            ;начальное состояние выбора скорости

ldi temp2,0b00000000            ;начальное состояние светодиода
out portb,temp2

          ldi Temp,0b01000000   ;разрешить прерывание компаратора
          out TIMSK,Temp

          ldi Temp,0b00000011   ;тактовый сигнал = CK/64
          out TCCR1B,Temp

          ldi Temp3,0xff         ;инициализация компаратора
          out OCR1AH,Temp3
          ldi Temp4,0xff
          out OCR1AL,Temp4

          ldi Temp,RamEnd       ;установка указателя стека
          out SPL,Temp

          
          ldi Temp,0            ;обнуление таймера
          out TCNT1H,Temp
          out TCNT1L,Temp

          sei                   ;разрешить прерывания


;****************************************************
; ОСНОВНОЙ ЦИКЛ
;****************************************************
knopka:

sbic pinD,2             ;проверяем нажатие кнопки
rjmp knopka             ;если не нажата
inc temp1               ;если нажата

;****************************************************
;Ожидаем отпускания кнопки
;****************************************************

knopka2:
sbic pinD,2             ;проверяем нажатие кнопки
rjmp pc+2               ;если не нажата
rjmp knopka2            ;если нажата

rjmp knopka



;****************************************************
; ОБРАБОТЧИК ПРЕРЫВАНИЯ КОМПАРАТОРА
;****************************************************


Timer1_comp1:

vibor:
cpi temp1,0
breq time

cpi temp1,1
breq speed_in

cpi temp1,2
breq time

cpi temp1,3
breq speed_out

cpi temp1,4
breq clear

clear:
clr temp1
rjmp time


;****************************************************         
; увеличение скорости
;****************************************************
speed_in:



subi temp4,0x01         ;увеличить частоту прерывания
cpi temp4,0x50          ;сравнить частоту прерывания с числом
brne pc+2               ;если не равны 
subi temp4,-0x01        ;если равны
out OCR1AL,Temp4
rjmp time

;****************************************************         
; уменьшение скорости
;****************************************************
speed_out:


subi temp4,-0x01         ;уменьшить частоту прерывания
cpi temp4,0xff           ;сравнить частоту прерывания с числом
brne pc+2               ; если числа не равны 
subi temp4,0x01         ; если равны
out OCR1AL,Temp4

rjmp time



time:

	 
		 
		 ldi Temp,0            ;обнуление таймера
         out TCNT1H,Temp
         out TCNT1L,Temp



cpi temp2,0b00000001     ; сравнение темп с числом

breq sbros               ; если числа равны 

inc temp2                ; если неравны

rjmp output


sbros:

clr temp2


Output:  

out PortB,Temp2       ;вывод в порт


;*****************************************************
;Проверка, отпущена ли кнопка?
;*****************************************************
knopka1:
sbic pinD,2             ;проверяем нажатие кнопки
rjmp pc+2               ;если не нажата
rjmp knopka1            ;если нажата


reti






;*****************************************************
;Не используется
;*****************************************************



zaderzhka:

ldi temp5,0
ldi temp6,0
ldi temp7,1

cikl: 

dec temp5            ; вычитание 1  из числа темп
brne cikl            ; переход, если не 0


dec temp6
brne cikl


dec temp7
brne cikl

ret
