.include "C:\distrib\avr\avr\avrasm\appnotes\tn2313def.inc"
.def     Temp=R16
.def     Temp1=R17
.def     Temp2=R18
.def     Temp3=R19
.def     Temp4=R20
.cseg
.org 0
rjmp Reset            ;вектора прерываний
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1A
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP
rjmp PC_INT
rjmp Timer1_comp1B
rjmp Timer0_comp1A




;Reset:
;INT_0:
;INT_1:
Timer1_capt1:
;Timer1_comp1A:
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
PC_INT:
;Timer1_comp1B:
;Timer0_comp1A:


          reti
;****************************************************
; ИНИЦИАЛИЗАЦИЯ
;****************************************************
Reset:    ldi Temp,0b00001011      ;
          out DDRB,Temp            ;

          ldi Temp,0b00000000      ;
          out PortB,Temp           

          ldi Temp,0b01010000      ;
          out ddrd,Temp            ;

          ldi Temp,0b00010000      ;
          out portd,Temp           ;настройка портов


          ldi Temp,0b00100000         ;
          out TIMSK,Temp              ;настройка прерываний таймеров, включено прерывание Timer1compB
                  
          ldi Temp,0b000000000           ;
          out TCCR0A,Temp                ;
          
          ldi Temp,0b00000101            ;
          out TCCR0B,Temp                ;частота clk/1024
          
          ldi Temp,0b11111111            ;
          out OCR0A,temp                 ;таймер0

          ldi Temp,0b00000000      ;
          out TCCR1A,Temp          ;

          ldi Temp,0b00000011      ;
          out TCCR1B,Temp          ;частота clk/64

          ldi Temp,0b00000000      ;
          out TCCR1C,Temp          ;

          ldi Temp,0b00000001      ;
          out OCR1AH,Temp          ;
          ldi Temp,0b01000000      ;
          out OCR1AL,Temp          ;

          ldi Temp,0b00000101      ;
          out OCR1BH,Temp          ;
          ldi Temp,0b01101001      ;
          out OCR1BL,Temp          ;таймер1
          
          ldi Temp3,0b00000001          ;хранитель верхней части числа яркости
          ldi Temp2,0b01000000          ;хранитель нижней числа части яркости
          ldi Temp1,0b00000000          ;регистр переключения на увеличение или уменьшения яркости

    
          ldi Temp,0b11000000                ;
          out GIMSK,Temp                     ;включены прерывания int1  и  int0

          ldi Temp,0b00001111                ;
          out MCUCR,Temp                     ;прерывания int1  и  int0 по переднему фронту




          ldi r21,0b00000000          ;зона
          ldi r22,0b00000001          ;флаги       00000  норм фл ош  
          ldi r23,0b00000000          ;счет(х)
	  ldi r24,0b00000000





          
          ldi Temp,RamEnd       
          out SPL,Temp

          sei                   


;****************************************************
; ОСНОВНОЙ ЦИКЛ
;****************************************************


Inf:                       ;

in temp, pind
sbis pind, 0b00000011
rjmp Inf
rcall Delay1               ;
sbrc temp1, 0b000000000
rjmp loop5
cli
inc Temp2
brne endplus               ;

inc Temp3
endplus:

sei

rjmp Inf                   ;


loop5:
cli
dec Temp2
brne endminus              ;
cbi portb, 0b00000001      ;
ldi Temp2,0b11111111       ;
dec Temp3
endminus:		   ;
			   ;
sei 

rjmp Inf                   ;
                           ; изменение яркости

;свободные регистры r21-r25, temp и temp4 - регистры для копирования
   





  
INT_0:


in temp4, TCNT1L          ;
in temp, TCNT1H
cpi temp, 0b00000101      ;
brlo zone1
cpi temp4, 0b01100111
brlo zone2
sbr r21, 0b00000001       ;
rjmp endzone

zone1:
cpi temp, 0b00000001      ;
brlo zone3
sbr r21, 0b00010000
rjmp endzone

zone2:
sbr r21, 0b00000100       ;
rjmp endzone

zone3:
cpi temp4, 0b00000010
brlo zone4
sbr r21, 0b00001000       ;
rjmp endzone

zone4:
sbr r21, 0b00000010       ;

endzone:                  ;определение зоны






sbrs r22,0b00000000           ;
rjmp endint                   ; если ош = 1 то продолжить программу прерывания



sbrc r22,0b00000001               ;
rjmp int01                        ;
sbr r22,0b00000010                ;
rjmp obnul                        ;если фл = 0 то установить фл и перейти к обнулению
int01:

cpi temp, 0b00000001
brlo zone11
rjmp int0102 
zone11:
cpi temp4, 0b00000100
brlo int0101
rjmp int03 


int0101: 		;

sbrs r22, 0b00000111	;
rjmp int03
rjmp int04		;    -------------


int0102:
     
cpi temp, 0b00000101
brsh zone21
rjmp int03
zone21:
cpi temp4, 0b01100101
brsh int04                 ;если не зона0 или 1 то переходим сброс норм и фл
rjmp int03                 ;иначе переходим на на установку норм     
int03:
cbr r22, 0b00000110
cbr r24, 0b00000001
ldi r23, 0b00000000
obnul:
ldi temp, 0
out TCNT1H, temp
out TCNT1L, temp
rjmp endint
int04:
sbr r22, 0b00000100

endint:
cbr r22, 0b10000000
reti
 



Timer1_comp1B:





sbrs r22,0b00000000        ;если ош = 1 то продолжить программу прерывания
rjmp err0                  ;иначе перейти на часть программы, где ош=0
err1:

ldi temp, 0			;
out TCNT1H, temp		;
out TCNT1L, temp		;обнуление

ldi r30, 0b00000000			;
in temp, TIMSK				;
sbr temp, 0b00000001			;
out TIMSK, temp				;
sbi portb, 0b00000000			;индикация ошибки

sbrs r22,0b00000010	;
rjmp nenorm		;если норм=0 то перейти на ненорм (r23=0 и выход)


cbr r22, 0b01100000


cbr r22, 0b01000000
cpi r23, 0b00000011		;
brsh bolsh			;
inc r23				;
cbr r22, 0b00000100
rjmp exitt1b			;
bolsh:				;
cbr r22, 0b00000011		;
ldi r23, 0b00000011
rjmp exitt1b			;если r23>=3 то неош и нефл и вых, иначе просто вых


nenorm:
cpi r21, 0b00000000
brne nilr230
sbrc r22,0b00000110
rjmp nilr

sbr r22, 0b01000000
rjmp exitt1b

nilr:
sbrc r22,0b00000101
rjmp nilr23
sbr r22, 0b00100000
rjmp exitt1b

nilr23:
cbr r22, 0b01100010
nilr230:
ldi r23, 0b00000000
rjmp exitt1b 




err0:


sbrs r21,0b00000100
rjmp t2b1
ldi temp, 0
out TCNT1H, temp
out TCNT1L, temp
rjmp nenorm1

t2b1:
sbrs r21,0b00000011
rjmp t2b2
sbrc r21,0b00000010
rjmp t2b4
sbrc r21,0b00000001				;
rjmp t2b3					;
sbrc r21,0b00000000				;
rjmp t2b3					;


ldi temp, 0b11111111		
out TCNT1H, temp
ldi temp, 0b11111110
out TCNT1L, temp


rjmp norm1
t2b2:
sbrs r21,0b00000010
rjmp t2b3


ldi temp, 0			
out TCNT1H, temp		
ldi temp, 0b00000010		
out TCNT1L, temp


rjmp norm1
t2b3:
cpi r21, 0b00000000
breq t2b4


ldi temp, 0
out TCNT1H, temp
out TCNT1L, temp
rjmp norm1

t2b4:
ldi temp, 0
out TCNT1H, temp
out TCNT1L, temp
rjmp nenorm1


norm1:
ldi temp, 0b00000010
cpi r23, 0b00000100
brsh podacha
add r23, temp
podacha:
sbrs r24, 0b00000000
rjmp exitt1b
in temp, TIMSK
sbr temp, 0b01000000
out TIMSK, temp
ldi temp, 0b01000000
out TIFR, temp

rjmp exitt1b

nenorm1:
cpi r23, 0b00000001
brlo err3
dec r23
rjmp podacha
err3:
sbr r22, 0b00000001
cbr r22, 0b00000110
ldi r23, 0b00000000
ldi r30, 0b00000000
in temp, TIMSK
sbr temp, 0b00000001
out TIMSK, temp
sbi portb, 0b00000000
sbi portb, 0b00000001
cbr r24, 0b00000001
exitt1b:
cbr r21, 0b11111111
sbr r22, 0b10000000
reti














INT_1:
cbi portb, 0b00000001

sbrc temp1, 0b000000000
rjmp izmen
ldi temp1, 0b00000001
sbi portb, 0b00000011
reti
izmen:
cbi portb, 0b00000011
ldi temp1, 0b00000000
reti

Timer1_comp1A:

in temp, TIMSK
cbr temp, 0b01000000
out TIMSK, temp

cbi portd, 0b00000100
sbi portd, 0b00000110
rcall Delay
cbi portd, 0b00000110
sbi portd, 0b00000100

out OCR1AH, Temp3
out OCR1AL, Temp2

reti

Timer0_comp1A:
inc r30
cpi r30, 0b00010000
brlo zloop
ldi r30, 0b00000000
cbi portb, 0b00000000
sbr r24, 0b00000001
in temp, TIMSK
cbr temp, 0b00000001
out TIMSK, temp
zloop:
reti

Delay:
ldi r28, 5
del1:
ldi r29, 200
del2:
dec r29
brne del2
dec r28
brne del1
ret

Delay1:
ldi r27, 50
del3:
ldi r26, 200
del4:
dec r26
brne del4
dec r27
brne del3
ret

