Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ? функция delay() без использования таймеров
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
alm_
Необходимо отмерить задержки в миллисекундах с с точностью до 5%. Очевидно, что при использовании С для различных компиляторов может быть различен. Вывод: необходимо использовать inline-функций на Asm. Но вот вопрос одинаковое ли количество тактов выполняются одни и те же команды для различных семейств (Tini,Classic,Mega) ?
Rst7
Цитата(alm_ @ Feb 8 2006, 14:28) *
Необходимо отмерить задержки в миллисекундах с с точностью до 5%. Очевидно, что при использовании С для различных компиляторов может быть различен. Вывод: необходимо использовать inline-функций на Asm. Но вот вопрос одинаковое ли количество тактов выполняются одни и те же команды для различных семейств (Tini,Classic,Mega) ?


__delay_cycles(сколько тактов) в IAR'е решат ваши проблемы wink.gif
IgorKossak
Цитата(Rst7 @ Feb 8 2006, 14:32) *
__delay_cycles(сколько тактов) в IAR'е решат ваши проблемы wink.gif

Но если важна точность, то придётся запрещать прерывания.
Rst7, одни и те же команды для всех семейств выполняются за одинаковое число тактов.
Возможны варианты только для очень специфических команд (сейчас не вспомню каких). Но в Вашей задаче они явно не будут использоваться.
beer_warrior
Поправочка, далеко не в специфичных, а во всех ветвлениях.
1 такт если прдолжаем, 2 если прыгаем.
Обусловлено сбросом конвейера команд.
IgorKossak
Цитата(beer_warrior @ Feb 8 2006, 14:47) *
Поправочка, далеко не в специфичных, а во всех ветвлениях.
1 такт если прдолжаем, 2 если прыгаем.
Обусловлено сбросом конвейера команд.

Речь была о другом.
Цитата
одинаковое ли количество тактов выполняются одни и те же команды для различных семейств (Tini,Classic,Mega) ?
Rst7
Цитата(IgorKossak @ Feb 8 2006, 14:41) *
Rst7, одни и те же команды для всех семейств выполняются за одинаковое число тактов.
Возможны варианты только для очень специфических команд (сейчас не вспомню каких). Но в Вашей задаче они явно не будут использоваться.


Я знаю wink.gif Задача не моя wink.gif Просто я предложил человеку, как возложить на компилятор вопрос подсчета.
alm_
спасибо за ответ
но у меня идет одновременная работа с WinAVR и IAR и хотелось бы чего-нибудь универсального
beer_warrior
Функции на асме, не обязательно инлайн.
Расходы на call/ret известны, количество тактов - одинаково.
Если подходить совсем глобально, вставить препроцессорный макрос высчитывающий количество проходов цикла в зависимости от частоты.
Запретить прерывание внутри.
Но это более пригодно для микросекундных задержек.
Для миллисекундных я например использую 2-й таймер с автоперезагрузкой с циклом в 100мкс, а от него веду софтварные таймеры, в которые вставлены хэндлеры функций. Точность получается весьма пристойная для самых критичных задач.
VslavX
Если есть аппаратный декрементируемый/инкрементируемый счетчик с фиксированным периодом переполнения (а обычно в AVR один-два таймера настраиваются на генерацию какой-то фиксированной частоты), то можно воспользоваться алгоритмом функции delay(), которая применялась в DOS. В аттаче исходник из BC3.1 и фрагмент из моей программы реализующий тот же алгоритм для AVR (MEGA128).
defunct
Цитата
(IgorKossak @ Feb 8 2006, 14:41)

Возможны варианты только для очень специфических команд (сейчас не вспомню каких). Но в Вашей задаче они явно не будут использоваться.

Видимо имелись в виду RCALL, CALL, ICALL, EICALL, RET, RETI, а также неявная команда перехода на обработчик прерывания. Время выполения которых зависит от разрядности PC.
IgorKossak
Цитата(defunct @ Feb 8 2006, 22:58) *
Цитата
(IgorKossak @ Feb 8 2006, 14:41)

Возможны варианты только для очень специфических команд (сейчас не вспомню каких). Но в Вашей задаче они явно не будут использоваться.

Видимо имелись в виду RCALL, CALL, ICALL, EICALL, RET, RETI, а также неявная команда перехода на обработчик прерывания. Время выполения которых зависит от разрядности PC.

Ради интереса взял даташиты на mega128 и tiny13.
Очень беглое сравнение наборов инструкций показывает, что для ВСЕХ инструкций (имеющихся у обоих МК) времена исполнения совпадают.
defunct
Цитата(IgorKossak @ Feb 9 2006, 09:26) *
Цитата(defunct @ Feb 8 2006, 22:58) *

Видимо имелись в виду RCALL, CALL, ICALL, EICALL, RET, RETI, а также неявная команда перехода на обработчик прерывания. Время выполения которых зависит от разрядности PC.

Ради интереса взял даташиты на mega128 и tiny13.
Очень беглое сравнение наборов инструкций показывает, что для ВСЕХ инструкций (имеющихся у обоих МК) времена исполнения совпадают.

Не могу сказать оригинального имени документа, поскольку он у меня сохранен под удобным для поиска именем (в оглавлении документа написано "AVR Instruction Set" rev. 0856D-AVR-08/02). В нем можно найти различия во времени выполнения приведенных выше команд, для МК с PC - 16bit и меньше и для MK с PC - 22bit.
IgorKossak
Цитата(defunct @ Feb 9 2006, 09:48) *
... MK с PC - 22bit.

Я это тоже видел, но к счастью таких нет среди тех, которые фигурировали в вопросе у автора темы.
defunct
Цитата(IgorKossak @ Feb 9 2006, 11:31) *
Я это тоже видел, но к счастью таких нет среди тех, которые фигурировали в вопросе у автора темы.

Отчего же так? В вопросе фигурирували чуть ли не все существующие МК с AVR ядром. Как минимум в одном из указанных в вопросе семейств(mega) есть предствитель 22bit PC (ATMega2560/1).
Согласен с Вами в том, что автору вопроса пока не доведется работать с МК с 22bit PC, и что можно считать, что все одноименные команды AVR tiny/classic/mega выполняются за одинаковое число тактов.

Может говоря о специфических командах имелись в виду "специфические МК" с широким PC? smile.gif

ps: не ставлю целью Вам докучать, просто самому стало интересно, и если действительно есть такие специфические команды, то неплохо бы их знать..
Halfback
Цитата(Rst7 @ Feb 8 2006, 15:32) *
__delay_cycles(сколько тактов) в IAR'е решат ваши проблемы wink.gif

а в CAVR что решит проблемы?
использовал ф-цию delay_ms(10) дык вместо формирования меандра с Ти=10мс почему то Ти=2,5мс, т.е. приблизительно в 4 раза быстрее. Кварц. генератор = 2Мгц, МЦУ = Мега88.
ЧТо посоветуете? Писать новую функцию, запихивать в нее nop-ы путём подбора с осциллографом? Задача выдавать импульсы с погрешностью хотя бы 1мс - и с delay_ms такой облом. При помощи счетчиков не хотелось бы заморачиваться.
cebotor
Цитата(Halfback @ Jan 17 2009, 23:03) *
а в CAVR что решит проблемы?
использовал ф-цию delay_ms(10) дык вместо формирования меандра с Ти=10мс почему то Ти=2,5мс, т.е. приблизительно в 4 раза быстрее. Кварц. генератор = 2Мгц, МЦУ = Мега88.
ЧТо посоветуете? Писать новую функцию, запихивать в нее nop-ы путём подбора с осциллографом? Задача выдавать импульсы с погрешностью хотя бы 1мс - и с delay_ms такой облом. При помощи счетчиков не хотелось бы заморачиваться.

если delay_ms - это функция компилятора - то скорее всего вы декларируете ему не ту тактовую.
делать задержки в _милисекундах_ без прерываний - это когда "очень хочется странного", ели счетчик это вы про прерывания - то мороки минут на несколько . заставьте таймер щелкать с частотой 2 килогерца внутри декрементируйте счетчик и вуаля - погрешность 1 милисекунда.
Halfback
Цитата(cebotor @ Jan 18 2009, 00:13) *
если delay_ms - это функция компилятора - то скорее всего вы декларируете ему не ту тактовую.

декларирую точно ТУ тактовую - сделал даже отдельный проект для проверки. Остаётся только "крошить батон" на CAVR.
plombir
Цитата(Halfback @ Jan 17 2009, 23:03) *
...
Кварц. генератор = 2Мгц, МЦУ = Мега88.
...

Хитрый у Вас кварц.
А биты генератора, случаем, не на внутренние 8Mhz настроены?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.