[an error occurred while processing this directive]
|
Процедура прерывания таймера, реализующая 8-канальный 256-зубый ШИМ. Безвозвратно тратится 10 регистров из 32 (R1 (tmp) - рабочий, R2 (pwm) - пила ШИМа, R3..R10 - уставки ШИМ). Таймер в режиме CTC - Clear On Compare (реинициализация и сброс флага автоматические). Занимает 30 тактов вместе со входом/возвратом, максимальная частота ШИМ - 2.6 КГЦ при 20-МГЦ кварце. Если выбрать частоту ШИМ порядка 500 ГЦ (порядка 8 мкс на 1 ступеньку), то останется свободно 80% процессорного времени, а если сделать меньше ступенек - то гораздо больше:
t0isrREG:
in stsav,SREG ;Сохраняем статус. STSAV - общий для всех невложенных прерываний
inc pwm ;Добавляем очередной зуб к пиле ШИМ
cp r3,pwm ;Перенос=1 при Rx <= PWM ;Те же 2 такта на канал, что и у ПИКа
rol tmp ;Вдвигаем перенос в рабочий регистр ;
cp r4,pwm ;Перенос=1 при Rx <= PWM
rol tmp ;Вдвигаем перенос в рабочий регистр
cp r5,pwm ;Перенос=1 при Rx <= PWM
rol tmp ;Вдвигаем перенос в рабочий регистр
cp r6,pwm ;Перенос=1 при Rx <= PWM
rol tmp ;Вдвигаем перенос в рабочий регистр
cp r7,pwm ;Перенос=1 при Rx <= PWM
rol tmp ;Вдвигаем перенос в рабочий регистр
cp r8,pwm ;Перенос=1 при Rx <= PWM
rol tmp ;Вдвигаем перенос в рабочий регистр
cp r9,pwm ;Перенос=1 при Rx <= PWM
rol tmp ;Вдвигаем перенос в рабочий регистр
cp r10,pwm ;Перенос=1 при Rx <= PWM
rol tmp ;Вдвигаем перенос в рабочий регистр
out PORTA,tmp ;Выставляем ноги PWM 1..8
out SREG,stsav ;Восстанавливаем статус
reti