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

 
 
> Как сделать времевую задержку в AVR без таймера
Student2
сообщение Aug 9 2009, 10:42
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



Хочу сделать переменную задержку без използование таймера с резолюцию 1 или 2 цикла.

То что сделал выглядить так:

CODE
#pragma inline=forced
#pragma optimize=s 9 /* this switches the maximum speed optimization for this function only */
void delay(uint8_t delatTime) /* delay routine */
/*------------------------------------------------------ */
{
if(delatTime> TIME_0) /* we do delay on base on the dwell time */
{ /* no branch - 2 clock cycles to this point */
if(delatTime> TIME_1)
{ /* no branch - 4 clock cycles to this point */
if(delatTime> TIME_2)
{ /* no branch - 6 clock cycles to this point */
if(delatTime> TIME_3)
{ /* no branch - 8 clock cycles to this point */
if(delatTime> TIME_4)
{ /* no branch - 10 clock cycles to this point */
if(delatTime> TIME_5)
{ /* no branch - 12 clock cycles to this point */
if(delatTime> TIME_6)
{ /* no branch - 14 clock cycles to this point */
if(delatTime> TIME_7)
{ /* no branch - 16 clock cycles to this point */
if(delatTime> TIME_8)
{ /* no branch - 18 clock cycles to this point */
if(delatTime> TIME_9)
{ /* no branch - 20 clock cycles to this point */
if(delatTime> TIME_10)
{ /* no branch - 22 clock cycles to this point */
__delay_cycles(2);
}
}
}
}
}
}
}
}
}
}
}
}


Я думаю что задержка с резолюции из одного цикла можно сделать с lookup table но не могу понять как ее построить в IAR.

Буду благодарен если поделитесь как Вы делаете задержки без използование таймера.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Student2
сообщение Aug 10 2009, 08:06
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



Я увидел что IAR for TI имеет ключевое слово __even_in_range которое может использоваться в сочетание с switch() для создание очень эффективные lookup JUMP таблицы.

Вопрос - как можно создать такую JUMP lookup таблицу в IAR AVR?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 10 2009, 11:05
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Student2 @ Aug 10 2009, 11:06) *
Вопрос - как можно создать такую JUMP lookup таблицу в IAR AVR?
Этот вопрос, наверное, перекликается с Вашим вопросом http://electronix.ru/forum/index.php?showtopic=66032

Вы хотите с помощью этой таблицы формировать задержки? Если -так, то, наверное, необходимо написать на ассемблере, что-то типа этого:
Код
my_delay:
        ldi   r30, low (Label/2)
        ldi   r31, high (Label/2)
        add   r30, r16
        adc   r31, r17
        ijmp
Label:
        nop
        nop
........................
        nop
        nop
        ret
Go to the top of the page
 
+Quote Post
Student2
сообщение Aug 10 2009, 11:20
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



Цитата(Палыч @ Aug 10 2009, 14:05) *
Этот вопрос, наверное, перекликается с Вашим вопросом http://electronix.ru/forum/index.php?showtopic=66032


Спасибо за идею. Вопрос об "Как сделать времевую задержку в AVR без таймера" конечно имеет много общего с новый пост, но акцент сейчас к табличное описание lookup таблицу. В общем таблицу можно использовать для множество других приложений и конечно одно из них - задержка).

Что будеть если директно увеличить PC как делает __even_in_range ? Увидел что в AVR документации нет описание где находиться PC (program copunter) регистер.

Сообщение отредактировал Student2 - Aug 10 2009, 11:43
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Student2   Как сделать времевую задержку в AVR без таймера   Aug 9 2009, 10:42
- - izerg   Цитата(Student2 @ Aug 9 2009, 13:42) Я ду...   Aug 9 2009, 12:45
|- - Student2   Цитата(izerg @ Aug 9 2009, 15:45) __delay...   Aug 9 2009, 13:02
|- - izerg   Приведите пример кода, в котором хотите использова...   Aug 10 2009, 10:03
|- - Student2   Цитата(izerg @ Aug 10 2009, 13:03) Привед...   Aug 10 2009, 11:29
|- - MrYuran   Цитата(Student2 @ Aug 10 2009, 15:29) Хоч...   Aug 10 2009, 11:41
|- - Student2   Цитата(MrYuran @ Aug 10 2009, 14:41) сфор...   Aug 10 2009, 11:52
- - MrYuran   Кодvoid Pause(unsigned int volatile mks) {...   Aug 10 2009, 10:17
- - Goodefine   Можно как то так: Код#define TICK 2 ... void delay...   Aug 10 2009, 10:17
- - Rst7   Ну если уж очень хочется извратиться, то можно так...   Aug 10 2009, 11:47
|- - Student2   Спасибо Rst7 - код выглядит хорошо и буду пользова...   Aug 10 2009, 12:00
- - Rst7   ЦитатаМне хотелось как нибудь не трогать ассемблер...   Aug 10 2009, 12:00
- - Rst7   Можно чуть убрать оверхед, используя такой бубен: ...   Aug 10 2009, 12:09
- - Student2   Цитатаname='Rst7' Воистину это еще лучше...   Aug 10 2009, 12:17


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 07:17
Рейтинг@Mail.ru


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