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

 
 
> Как сделать времевую задержку в 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
Ответов
izerg
сообщение Aug 9 2009, 12:45
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 531
Регистрация: 1-02-05
Из: Украина, Киев
Пользователь №: 2 342



Цитата(Student2 @ Aug 9 2009, 13:42) *
Я думаю что задержка с резолюции из одного цикла можно сделать с lookup table но не могу понять как ее построить в IAR.



__delay_cycles(unsigned long int);
Makes the compiler generate code that takes the given amount of cycles to perform, that is it inserts a time delay that lasts the specified number of cycles.

Note: The specified value must be a constant integer expression and not an expression that is evaluated at runtime.

Цитата из справочника IAR.
Чем не устраивает delay_cycles?
Go to the top of the page
 
+Quote Post
Student2
сообщение Aug 9 2009, 13:02
Сообщение #3


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

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



Цитата(izerg @ Aug 9 2009, 15:45) *
__delay_cycles(unsigned long int);
Цитата из справочника IAR.
Чем не устраивает delay_cycles?


Меня устраивает если задержка работатет на переменная (var). К сожалению если поставить переменная в __delay_cycles() и компилатор начинает глючить:
Код
Fatal Error[Ta030]: Argument to __delay_cycles must be a constant expression.
Go to the top of the page
 
+Quote Post
izerg
сообщение Aug 10 2009, 10:03
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 531
Регистрация: 1-02-05
Из: Украина, Киев
Пользователь №: 2 342



Приведите пример кода, в котором хотите использовать такую задержку.
Go to the top of the page
 
+Quote Post
Student2
сообщение Aug 10 2009, 11:29
Сообщение #5


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

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



Цитата(izerg @ Aug 10 2009, 13:03) *
Приведите пример кода, в котором хотите использовать такую задержку.


Хочу установить pinState в 1 для 1, 2.... 7 cycles и потом возвратить в высокоимпедансное состояние

goto($ + delay); /* pseudocode, normally will yield error */
pinState = 1; /* force the pin to 1 */
pinState = 1; /* force the pin to 1 */
pinState = 1; /* force the pin to 1 */
pinState = 1; /* force the pin to 1 */
pinState = 1; /* force the pin to 1 */
pinState = 1; /* force the pin to 1 */
pinState = 1; /* force the pin to 1 */
pinStateTRIS = 0; /* float the pin */



Цитата(Goodefine @ Aug 10 2009, 13:17) *
Код
#define TICK 2
...
void delay_variable(uint8 tick)
{
     for(uint8 i=tick;i;i--) __delay_cycles(TICK);
}
...
delay_variable(x);


Резолюция кода есть 2 или больше системных циклов. То что надо - резолюция из одного системного цикла. Описание кода в начале темы есть резолюция из 2 цикла.

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

Сообщений в этой теме
- Student2   Как сделать времевую задержку в AVR без таймера   Aug 9 2009, 10:42
|- - MrYuran   Цитата(Student2 @ Aug 10 2009, 15:29) Хоч...   Aug 10 2009, 11:41
|- - Student2   Цитата(MrYuran @ Aug 10 2009, 14:41) сфор...   Aug 10 2009, 11:52
- - Student2   Я увидел что IAR for TI имеет ключевое слово __ev...   Aug 10 2009, 08:06
|- - Палыч   Цитата(Student2 @ Aug 10 2009, 11:06) Воп...   Aug 10 2009, 11:05
|- - Student2   Цитата(Палыч @ Aug 10 2009, 14:05) Этот в...   Aug 10 2009, 11:20
- - 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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