ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
67267 Топик полностью
AVR (30.08.2006 19:50, просмотров: 6) ответил jaga-jaga на Ответ:
Ну тогда - получите разбор полетов ПИК: 1. Накладные расходы по регистрам - 2*24 байта (счетчики ШИМ + уставки ШИМ) + _refr = 49 байт. 2. Накладные расходы по времени (вход/выход ISR, проверка-инициализация _refr и TMR0 и пр.)- 17 циклов (дальше буду для простоты называть тактами), или 17/24 = +0.71 такта к каждому каналу дают 17+(24*2)= 65 тактов на ISR или 2.71 такта на канал. При 100% загрузке 10-МИПСового ПИКа этой задачкой достижимая частота каждого из 24 каналов 250-ступенчатого ШИМ составит 615 ГЦ, а 256-ступенчатого - 600 ГЦ. АВР: A. Регистровый вариант 256-зубого ШИМ. Безвозвратно тратится 26 регистров из 32, R2..R25 - уставка ШИМ, R1 (tmp) - рабочий, R2 (pwm) - пила ШИМа. Таймер в режиме CTC - Clear On Compare (реинициализация и сброс флага автоматические):
t0isrREG:
	in	stsav,SREG	;Сохраняем статус. STSAV - общий для всех невложенных прерываний
 
	inc	pwm		;Добавляем очередной зуб к пиле ШИМ
 
	cp	r2,pwm		;Перенос=1 при Rx <= PWM		;Те же 2 такта на канал, что и у ПИКа
	rol	tmp		;Вдвигаем перенос в рабочий регистр	;
	cp	r3,pwm		;Перенос=1 при Rx <= PWM
	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		;Вдвигаем перенос в рабочий регистр
 
	out	PORTA,tmp	;Выставляем ноги PWM 1..8
 
	cp	r10,pwm		;Перенос=1 при Rx <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	cp	r11,pwm		;Перенос=1 при Rx <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	cp	r12,pwm		;Перенос=1 при Rx <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	cp	r13,pwm		;Перенос=1 при Rx <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	cp	r14,pwm		;Перенос=1 при Rx <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	cp	r15,pwm		;Перенос=1 при Rx <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	cp	r16,pwm		;Перенос=1 при Rx <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	cp	r17,pwm		;Перенос=1 при Rx <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
 
	out	PORTB,tmp	;Выставляем ноги PWM 9..16
 
	cp	r18,pwm		;Перенос=1 при Rx <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	cp	r19,pwm		;Перенос=1 при Rx <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	cp	r20,pwm		;Перенос=1 при Rx <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	cp	r21,pwm		;Перенос=1 при Rx <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	cp	r22,pwm		;Перенос=1 при Rx <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	cp	r23,pwm		;Перенос=1 при Rx <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	cp	r24,pwm		;Перенос=1 при Rx <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	cp	r25,pwm		;Перенос=1 при Rx <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
 
	out	PORTC,tmp	;Выставляем ноги PWM 17..24
 
	out	SREG,stsav	;Восстанавливаем статус
 
	reti
1A. Накладные расходы по регистрам - 26 байт: 24 уставки PWM, tmp и pwm. 2A. Накладные расходы по времени (вход-выход ISR, инкремент пилы, 4 вывода в порт, сохранение-восстановление статуса) точно такие же, как у ПИКа - 17 тактов, или 17/24 = +0.71 такта к каждому каналу дают 17+(24*2)= 65 тактов на ISR или 2.71 такта на канал. При 100% загрузке 20-МИПСового АВРа этой задачкой достижимая частота каждого из 24 каналов 256-ступенчатого ШИМ составит 1200 ГЦ, то есть ровно вдвое выше, чем у ПИКа, что и не удивительно. B. RAM-вариант 256-зубого ШИМ - до упора оптимизированный вариант mse. Безвозвратно тратится 3 регистра (pwm, tmp, tmp1) из 32. PWM_array[24] - уставки ШИМ, tmp и tmp1 - рабочие, pwm - пила ШИМа. Таймер в режиме CTC - Clear On Compare (реинициализация и сброс флага автоматические):
t0isrRAM:
	in	stsav,SREG	;Сохраняем статус. STSAV - общий для всех невложенных прерываний
 
	inc	pwm		;Добавляем очередной зуб к пиле ШИМ
 
	lds	tmp1,PWM_array+0	;Читаем уставку PWMx		;
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM		;4 такта на канал
	rol	tmp		;Вдвигаем перенос в рабочий регистр	;
	lds	tmp1,PWM_array+1	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+2	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+3	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+4	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+5	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+6	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+7	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
 
	out	PORTA,tmp	;Выставляем ноги PWM 1..8
 
	lds	tmp1,PWM_array+8	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+9	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+10	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+11	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+12	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+13	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+14	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+15	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
 
	out	PORTB,tmp	;Выставляем ноги PWM 9..16
 
	lds	tmp1,PWM_array+16	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+17	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+18	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+19	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+20	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+21	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+22	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
	lds	tmp1,PWM_array+23	;Читаем уставку PWMx
	cp	tmp1,pwm	;Перенос=1 при tmp1 <= PWM
	rol	tmp		;Вдвигаем перенос в рабочий регистр
 
	out	PORTC,tmp	;Выставляем ноги PWM 17..24
 
	out	SREG,stsav	;Восстанавливаем статус
 
	reti
1B. Накладные расходы по регистрам - 3 байта: tmp, tmp1 и pwm. 2B. Накладные расходы по времени (вход-выход ISR, инкремент пилы, 4 вывода в порт, сохранение-восстановление статуса) точно такие же, как у ПИКа - 17 тактов, или 17/24 = +0.71 такта к каждому каналу дают 17+(24*4)= 113 тактов на ISR или 4.71 такта на канал. При 100% загрузке 20-МИПСового АВРа этой задачкой достижимая частота каждого из 24 каналов 256-ступенчатого ШИМ составит 691 ГЦ, то есть все равно выше, чем у ПИКа, что тоже не удивительно. Слив не засчитан :))