*** Ответ на письмо из carbonArea (carbonArea).
Привет, Dmitry !
01 Nov 06 , 11:00 Dmitry E. Oboukhov писал к Nickita A Startcev:
DO> а ты уверен что тут именно оптимизатор gcc все портит?
ну, по крайней мере именно он переставляет инструкции и генерирует код, который в разных ветках выполняется разное время.
DO> у тебя получается по каждому каналу две ветки DO> if и else.
Да. либо "счет времени" либо обнуление/пропуск.
DO> глянул я в листинг того что генерится, так вот DO> PORTB &= 0xFF - 1; у него ложится в одну инструкцию DO> cbi 56-0x20,0 а вот декремент с индексацией (в случае если lim байт) в DO> 4 инструкции. то есть когда добежит до 14 канала накопится случайная DO> ошибка в диапазоне 0 - 3*13 == 0 - 39 инструкций. ветки по определению DO> разные, оптимизатор тут не при чем :)
Примерно так, но хочется делать их одинаковыми.
DO> может дело в алгиритме?
А в чем же еще? Раскладка такая: 16 МГц кварц. Хочется примерно 200 градаций на 14 каналов на 1 мс
1 мс = 16 000 операций, примерно 5 операций на градацию*канал.
DO> вон Орлову тут недавно аналогичную ошибку DO> с фронтами поправили (он еще слюнями исходил по этому поводу).
Hе видел. Фидошка как-то странно ходит в последнее время.
DO> суть в следующем: если у нас не получается пройти по всем веткам за DO> одинаковое время, то мы вводим буффер на выдачу сигналов и запись DO> производим в него а не прямо в порт. DO> а вот буффер в порт выпихиваем в начале (идеально) или конце DO> алгоритма. тогда фронты "встанут" привязанно к итерациям цикла.
Лишние операции, лишние плавающие задержки.
DO> хотя я не очень понял твое описание. DO> 50 раз в секунду выдаешь по 1 импульсу ШИМ? lim[i] вначале содержит DO> значение, определяющее скважность i-го канала? так?
50 раз в секунду выдаю 14 каналов шим. Высокий уровень ШИМ должен держаться от 1 мс (крайнелевое положение исполняющего усройства) до 2мс (крайнеправое). Весь диапазон хочется побить на примерно сотню-две градаций.
NAS>> PORTA = 0xFF; NAS>> PORTB = 0x3F; NAS>> for ( uint8_t i = 0; i < MAX_LIMIT; i++ ) DO> я не понял, MAX_LIMIT тут что означает? период ШИМ?
Максимальная длительность единицы; максимальное значение елемента массива lim.
DO> а что бы эти 14 каналов в один цикл не свернуть? ;)
Порты разные, придется в цикле смотреть номер канала и выбирать PORTB иль PORTC
NAS>> Так вот, что лучше, ассемблерная вставка, или отдельный NAS>> ассемблерный файл с отдельной функцией? DO> лучше подумать и написать на С :)
;)
. С уважением, Hикита. ... И физиономия, прошу заметить, глумливая.