;**** Программа плавного изменения цвета 3хцветного светодиода********************************
;****			тактовая частота проуессора 1.6мгц				**********
; 					завершён  19.05.07


.include "tn13def.inc"
.list

.def  red = r1	; Счетчик прерываний
.def  green = r2
.def  blue = r3
.def  co4=r16
.def  co3=r17	; Общий регистр отсчёта времени
.def  tmph = r19	; Рабочий регистр главной программы
.def  ct1 = r20	; Рабочий регистр главной программы
.def  ct2 = r21	; Рабочий регистр главной программы
.def  co1   = r24		; Общий регистр таймера
.def  co2 = r25	; Буфер для временного хранения содержимого SREG


.equ  time1=20   ;задержка смены цвета 1
.equ  time2=20   ;задержка смены цвета 2
.equ  Time =5


 



.cseg

rjmp  Initial	; После сброса – к главной программе
reti
reti
rjmp timer	; Прерывание по переполнению T/C0 


;ooooooooooooooooMAINoooooooooooooooooooo
main:
nop
rjmp main
;--------------- ШИМ ---- END ----------------



;------------------------ TIMER 0 BEGIN -----------------
timer:
;push tmph
;push vrm2
;in vrm2,sreg
;push vrm2

inc co1
cpi co1,255
brlo m0
ldi co1,32
m0:


mov tmph, red
cp tmph,co1
brlo m1
sbi portb,0
rjmp m2
m1:
cbi portb,0
m2:


mov tmph, green
cp tmph,co1
brlo m11
sbi portb,1
rjmp m21
m11:
cbi portb,1
m21:

mov tmph, blue
cp tmph,co1
brlo m12
sbi portb,2
rjmp m22
m12:
cbi portb,2
m22:

inc ct1
cpi ct1,time1
brlo ctm1
inc ct2
clr ct1
ctm1:
cpi ct2,time2
brlo ctm02
clr ct2

rjmp ctm03
ctm02:
rjmp ctm2
ctm03:

;***************** ROTATE COLOR *****************



cpi co2,198
brlo cl1
clr co2
cl1:


cpi co2,32-1
brlo col_10
rjmp col_11
col_10:
mov tmph,green
subi tmph,-4
mov green,tmph

mov tmph,red
subi tmph,4
mov red,tmph
col_11:


cpi co2,65-1
brlo col_20
rjmp col_21
col_20:
cpi co2,32+1
brlo col_21
mov tmph,red   ; red min
subi tmph,4
mov red,tmph

mov tmph,green   ;green max
subi tmph,-4
mov green,tmph
col_21:

cpi co2,98-1
brlo col_30
rjmp col_31
col_30:
cpi co2,65+1
brlo col_31
mov tmph,blue
subi tmph,-4
mov blue,tmph
mov tmph,green
subi tmph,4
mov green,tmph
col_31:


cpi co2,131-1
brlo col_40
rjmp col_41
col_40:
cpi co2,98+1
brlo col_41
mov tmph,green   ; green min
subi tmph,4
mov green,tmph

mov tmph,blue   ; blue max
subi tmph,-4
mov blue,tmph
col_41:

cpi co2,164-1
brlo col_50
rjmp col_51
col_50:
cpi co2,131+1
brlo col_51
mov tmph,red
subi tmph,-4
mov red,tmph

mov tmph,blue
subi tmph,4
mov blue,tmph
col_51:

cpi co2,197-1
brlo col_60
rjmp col_61
col_60:
cpi co2,164+1
brlo col_61
mov tmph,blue  ; blue min
subi tmph,4
mov blue,tmph


mov tmph,red   ;red max
subi tmph,-4
mov red,tmph
col_61:






inc co2

;***************** ROTATE COLOR ******* END *****
ctm2:


ldi   tmph,$ff-Time	; Передаем начальное значение для 
out   TCNT0,tmph	; таймера 0

reti
;------------------------- TIMER 0 END -------------------




Initial:
clr tmph
mov green,tmph
mov blue,tmph
clr co1
clr co2
clr co3
clr co4

ldi tmph,255
mov red,tmph



;ldi   tmph,RamEnd
;out   spl,tmph	    ; Инициализация стека
ldi   tmph,0b11111111	
out   DDRB,tmph	    ; Все разряды порта В - выход
ldi   tmph,0b00000111   ; Включаем светодиоды 0..3
out   PortB,tmph	
ldi   tmph,$02	    ; С помощью разряда TOIE0 разрешаем
;out   TIMSK,tmph	; прерывание по переполнению T/C0
;ldi   tmph,$ff-Time	; Передаем начальное значение для 
out   TCNT0,tmph	; таймера 0



ldi   tmph,0b10001010	    ; С помощью разряда TOIE0 разрешаем
out   TIMSK0,tmph	; прерывание по переполнению T/C0, T/C1


ldi   tmph,$ff-Time	; Передаем начальное значение для 
out   TCNT0,tmph	; таймера 0

ldi	  tmph,0b00111111
out   MCUCR,tmph		;внешние прерывания по переднему фронту
ldi   tmph,0b11000000
out   GIMSK,tmph		;разрешаем внешние прерывания
ldi   tmph,0b00000010	    ; Устанавливаем коэффициент деления 
out   TCCR0A,tmph	; и тем самым запускаем T/C0

sei	                ; Общее разрешение прерываний
ldi   tmph,0b00000111   ; Включаем светодиоды 0..3
out   PortB,tmph	

rjmp  main
