Код: Выделить всё
.def temp=R16 - под всякую фигню
.def ncur=R18 - номер текущей задачи
.def kf=R19 - коэффициент ШИС
.def sch=R20 - "счетчик задач"
.cseg
//Здесь таблица прерываний
Reset:
ldi temp,255
out DDRD,temp
ldi temp,0b00000101 //clk:128
out TCCR2,temp
ldi temp,0b11000000
out TIMSK,temp
ldi temp,0
out TCNT2,temp
ldi kf,1
out OCR2,kf
//тут иниц. стека
ldi sch,0
ldi ncur,0
rcall Load
ldi ncur,1
rcall Load
rcall CurTask
sei
Loop: rjmp Loop
TIM2_Comp:
rcall Load
rcall CurTask
reti
TIM2_OVF:
rcall Load
rcall CurTask
rcall Load
subi sch,3
rcall CurTask
reti
//Идет перечисление задач
Redon: SBI PortD,7 //0
ret
Greenon: SBI PortD,6 //1
ret
Blueon: SBI PortD,5 //2
ret
Redoff: CBI PortD,7 //3
ret
Greenoff: CBI PortD,6 //4
ret
Blueoff: CBI PortD,5 //5
ret
KU: //6 (kf - коэффициент Up - растет)
inc kf
out OCR2,kf
cpi kf,254
breq SbrosU
ret
SbrosU:
rcall CurTask
rcall Load
subi sch,-3
ret
KD: //7 (см. 6)
dec kf
out OCR2,kf
cpi kf,1
breq SbrosD
ret
SbrosD:
rcall CurTask
rcall Load
subi sch,-3
ret
Table: .dw RedOn,Greenon,BlueOn,Redoff,Greenoff,blueoff,KU,KD//0,1,2,3,4,5,6,7,8 - таблица "операций"
Tasks: .db 4,1,6,1,3,0,7,3,5,2,6,2,4,1,7,4,3,0,6,0,5,2,7,5 //задачи в порядке выполнения
Load:
cli
lsl ncur
ldi ZL,low(Table*2)
ldi ZH,high(Table*2)
ldi r17,0
ldi r16,0
add ZL,ncur
adc ZH,r17
lpm r16,Z+
lpm r17,Z
movw ZH:ZL,r17:r16
sei
icall
ret
CurTask:
cli
ldi ZL,low(Tasks*2)
ldi ZH,high(Tasks*2)
ldi r17,0
add ZL,sch
adc ZH,r17
lpm
mov ncur,R0
inc sch
sei
ret
Вопрос такой:
1)Когда счетчик дозодит до конца массива, то что он загружает? Просто процедуры цикличного переливания нет, а программа возвращается к началу. Почему?
2)Вроде ШИМ везде одинаков. Но, например, переход от голубого к синему, а затем к фиолетовому - заметно падение яркости. При переходе, например, от красного к желтому и затем зеленого - такого заметного перехода нет. Это особенность человеческого зрения?
3)Как можно ещё оптимизировать программу?
Заранее благодарю за помощь!


