реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> ? функция delay() без использования таймеров
alm_
сообщение Feb 8 2006, 12:28
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 25
Регистрация: 2-02-06
Пользователь №: 13 904



Необходимо отмерить задержки в миллисекундах с с точностью до 5%. Очевидно, что при использовании С для различных компиляторов может быть различен. Вывод: необходимо использовать inline-функций на Asm. Но вот вопрос одинаковое ли количество тактов выполняются одни и те же команды для различных семейств (Tini,Classic,Mega) ?
Go to the top of the page
 
+Quote Post
Rst7
сообщение Feb 8 2006, 12:32
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



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


__delay_cycles(сколько тактов) в IAR'е решат ваши проблемы wink.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 8 2006, 12:41
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



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

Но если важна точность, то придётся запрещать прерывания.
Rst7, одни и те же команды для всех семейств выполняются за одинаковое число тактов.
Возможны варианты только для очень специфических команд (сейчас не вспомню каких). Но в Вашей задаче они явно не будут использоваться.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Feb 8 2006, 12:47
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Поправочка, далеко не в специфичных, а во всех ветвлениях.
1 такт если прдолжаем, 2 если прыгаем.
Обусловлено сбросом конвейера команд.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 8 2006, 13:00
Сообщение #5


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



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

Речь была о другом.
Цитата
одинаковое ли количество тактов выполняются одни и те же команды для различных семейств (Tini,Classic,Mega) ?
Go to the top of the page
 
+Quote Post
Rst7
сообщение Feb 8 2006, 13:13
Сообщение #6


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



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


Я знаю wink.gif Задача не моя wink.gif Просто я предложил человеку, как возложить на компилятор вопрос подсчета.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
alm_
сообщение Feb 8 2006, 13:23
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 25
Регистрация: 2-02-06
Пользователь №: 13 904



спасибо за ответ
но у меня идет одновременная работа с WinAVR и IAR и хотелось бы чего-нибудь универсального
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Feb 8 2006, 13:47
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Функции на асме, не обязательно инлайн.
Расходы на call/ret известны, количество тактов - одинаково.
Если подходить совсем глобально, вставить препроцессорный макрос высчитывающий количество проходов цикла в зависимости от частоты.
Запретить прерывание внутри.
Но это более пригодно для микросекундных задержек.
Для миллисекундных я например использую 2-й таймер с автоперезагрузкой с циклом в 100мкс, а от него веду софтварные таймеры, в которые вставлены хэндлеры функций. Точность получается весьма пристойная для самых критичных задач.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
VslavX
сообщение Feb 8 2006, 14:26
Сообщение #9


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Если есть аппаратный декрементируемый/инкрементируемый счетчик с фиксированным периодом переполнения (а обычно в AVR один-два таймера настраиваются на генерацию какой-то фиксированной частоты), то можно воспользоваться алгоритмом функции delay(), которая применялась в DOS. В аттаче исходник из BC3.1 и фрагмент из моей программы реализующий тот же алгоритм для AVR (MEGA128).
Прикрепленные файлы
Прикрепленный файл  delay.rar ( 2.29 килобайт ) Кол-во скачиваний: 85
 
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 8 2006, 20:58
Сообщение #10


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
(IgorKossak @ Feb 8 2006, 14:41)

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

Видимо имелись в виду RCALL, CALL, ICALL, EICALL, RET, RETI, а также неявная команда перехода на обработчик прерывания. Время выполения которых зависит от разрядности PC.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 9 2006, 07:26
Сообщение #11


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(defunct @ Feb 8 2006, 22:58) *
Цитата
(IgorKossak @ Feb 8 2006, 14:41)

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

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

Ради интереса взял даташиты на mega128 и tiny13.
Очень беглое сравнение наборов инструкций показывает, что для ВСЕХ инструкций (имеющихся у обоих МК) времена исполнения совпадают.
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 9 2006, 07:48
Сообщение #12


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(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.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 9 2006, 09:31
Сообщение #13


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(defunct @ Feb 9 2006, 09:48) *
... MK с PC - 22bit.

Я это тоже видел, но к счастью таких нет среди тех, которые фигурировали в вопросе у автора темы.
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 9 2006, 10:47
Сообщение #14


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



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

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

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

ps: не ставлю целью Вам докучать, просто самому стало интересно, и если действительно есть такие специфические команды, то неплохо бы их знать..
Go to the top of the page
 
+Quote Post
Halfback
сообщение Jan 17 2009, 20:03
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 28-05-05
Пользователь №: 5 512



Цитата(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 такой облом. При помощи счетчиков не хотелось бы заморачиваться.

Сообщение отредактировал Halfback - Jan 17 2009, 20:05
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01499 секунд с 7
ELECTRONIX ©2004-2016