Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Впихнуть невпихуемое
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
sigmaN
Необходимо с точностью до +/-20мкс организовать задержку в диапазоне от 330 до аж 4440мкс.
При этом(по всем известным причинам) контроллер изначально был взят без учета этого мега полезного функционала(Tiny13) и теперь немного нехватает флэша )
Перед какими-то трудоёмкими делами вроде переписываением всей прошивки на асме, хотелось бы поинтересоваться есть ли у кого на примете компактный способ организации такой задержки?
Всего сейчас доступно 224 байта. Ну под задержку все выделить не получится, нужно же на логику что-то оставить.. В общем чем меньше тем лучше. Как обычно )
Щас копну delay.h и главный цикл задержки оттуда попробую достать, но пока суть да дело, решил подключить коллективный разум в лице участников этого форума...
P.S. естественно ищется что-то эффективнее конструкции вида
Код
void Delay_us(int n) {
  while (n--) {
   _delay_us(1);
}
}


Кажется помощь коллективного разума не потребуется, но вдруг кому пригодится.
В общем на каждую итерацию 4 цикла не считая загрузку рабочих регистров там пару циклов единоразово в самом начале.
Ну а уж как вы будете пересчитывать колв-во итераций в микросекунды это дело другое wink.gif
Благо в моём случае можно посчитать всё заранее и подставлять в функцию по мере надобности.
Код
static void delay_loop_2(uint16_t __count)
{
    __asm__ volatile (
    "1: sbiw %0,1" "\n\t"
    "brne 1b"
    : "=w" (__count)
    : "0" (__count)
    );
}


Нет, что-то я тормознул. Если флэш в дефиците то посчитать заранее - плохая идея. Надо считаь на ходу...
Xenia
Цитата(sigmaN @ Nov 9 2014, 23:00) *
Перед какими-то трудоёмкими делами вроде переписываением всей прошивки на асме, хотелось бы поинтересоваться есть ли у кого на примете компактный способ организации такой задержки?


Зачем же переписывать на асме ВСЮ прошивку, когда можно написать на нем ТОЛЬКО подпрограмму задержки?

Впрочем, такая задержка все равно выглядела бы как цикл, проблема лишь в его калибровке, т.е. переводе времени в число оборотов цикла.
sigmaN
Ну переписывать всё, потому что много чего туда не влазит и по хорошему надо бы наверно именно всё )
Учитывая нужную точность за калибровкой дело не встало... В общем delay_loop_2() вопрос решил полностью. Чё-то поторопился я немного с постом на форум...
kovigor
Цитата(sigmaN @ Nov 10 2014, 00:58) *
Ну переписывать всё, потому что много чего туда не влазит и по хорошему надо бы наверно именно всё )

Я такое по прерыванию от таймера делаю. Прерывание от таймера возникает, например, раз в 100 мкС. В обработчике увеличиваем счетчик на единичку. И все. В фоновой программе, там, где нужна задержка, перед тем, как она нужна, сбрасываем этот счетчик в ноль и в цикле ждем, когда он дорастет до нужной величины ...
sigmaN
Да, было-бы прекрасно, но единственный таймер тиньки занят измерением периода поступающих на вход прибора импульсов... А вот сделать задержку программно оказалось вполне приемлемо, что и было сделано.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.