Код: Выделить всё
.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
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 TIMSK,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 TCCR0,tmph ; и тем самым запускаем T/C0
sei ; Общее разрешение прерываний
ldi tmph,0b00000111 ; Включаем светодиоды 0..3
out PortB,tmph
rjmp main