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

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


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

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



Ну если уж очень хочется извратиться, то можно так
CODE
#define ONE_NOP(NAME,NEXT_NAME)\
static void delay_##NEXT_NAME(char cool.gif;\
static void delay_##NAME(char cool.gif\
{\
__no_operation();\
delay_##NEXT_NAME(cool.gif;\
}\

ONE_NOP(4,3)
ONE_NOP(3,2)
ONE_NOP(2,1)
ONE_NOP(1,0)

#pragma optimize=no_inline
static void delay_0(char cool.gif
{
PORTB=b;
}

void delay_x(char b, char c)
{
char __flash *p=(char __flash *)delay_4;
p+=c;
((void(*)(char))p)(cool.gif;
}


с вот таким результатом
CODE
\ In segment CODE, align 2, keep-with-next
11 ONE_NOP(4,3)
\ delay_4:
\ 00000000 0000 NOP
\ 00000002 0000 NOP
\ 00000004 0000 NOP
\ 00000006 0000 NOP
\ 00000008 REQUIRE delay_0
\ 00000008 ; // Fall through to label delay_0
12 ONE_NOP(3,2)
13 ONE_NOP(2,1)
14 ONE_NOP(1,0)
15
16 #pragma optimize=no_inline

\ In segment CODE, align 2, keep-with-next
17 static void delay_0(char cool.gif
\ delay_0:
18 {
19 PORTB=b;
\ 00000000 B905 OUT 0x05, R16
20 }
\ 00000002 9508 RET
\ 00000004 REQUIRE _A_PORTB
21

\ In segment CODE, align 2, keep-with-next
22 void delay_x(char b, char c)
\ delay_x:
23 {
24 char __flash *p=(char __flash *)delay_4;
25 p+=c;
26 ((void(*)(char))p)(cool.gif;
\ 00000000 .... LDI R30, LOW(delay_4/2)
\ 00000002 .... LDI R31, (delay_4/2) >> 8
\ 00000004 E030 LDI R19, 0
\ 00000006 0FE1 ADD R30, R17
\ 00000008 1FF3 ADC R31, R19
\ 0000000A 9409 IJMP
27 }


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


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

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



Спасибо Rst7 - код выглядит хорошо и буду пользоваться. Есть только одна проблема - начальное опоздание (время) для подготовки регистров. Если нужная задержка 2 цикла а начальное опоздание 6-8 циклов то будет добавочные 4-6 циклов. Но идея воистину хорошая!

Я думаю что это и есть путь к _even_in_range для AVR!

Сообщение отредактировал Student2 - Aug 10 2009, 12:05
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
- - 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, 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 Текстовая версия Сейчас: 20th July 2025 - 12:06
Рейтинг@Mail.ru


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