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

 
 
> Как сделать задержку?, AT91rm9200 AS-9200
Daermon
сообщение Nov 21 2007, 10:40
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 36
Регистрация: 26-10-07
Пользователь №: 31 739



При работе с АЦП нужны небольшие интервалы? Например 40нс держать RD, или CS... и т.п.
Хочу сделать метод
inline void Wait(unsigned int ns)
{
тут поставить ожидание с пустыми циклами...только не могу точно задать интервал, так как не уверен
за сколько выполнится та или иная операция.



}
Вот параметры кварцев

#define PLLAR 0x2026BF04 //* 179,712000 MHz for PCK
#define PLLBR 0x10483F0E //* 48,054857 MHz (divider by 2 for USB)
#define MCKR 0x00000202 //* PCK/3 = MCK Master Clock = 59,904000MHz with PLLA selected
#define SLOWCLOCK 32768 //* In Hz
#define MAIN_OSC_CLK 18432000 //* In Hz

Есть какие нибудь др способы, точно задать маленькие интервалы задержки? Таймеры с прерываниями не предлагать.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sergeeff
сообщение Nov 21 2007, 19:30
Сообщение #2


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Думается:
1. Задержки в 40 ns программно не удастся получить никогда.
2. А что АЦП не сидит на нормальной шине с RD, WR и CS?
Go to the top of the page
 
+Quote Post
Daermon
сообщение Nov 22 2007, 06:37
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 36
Регистрация: 26-10-07
Пользователь №: 31 739



Цитата(sergeeff @ Nov 21 2007, 23:30) *
Думается:
1. Задержки в 40 ns программно не удастся получить никогда.
2. А что АЦП не сидит на нормальной шине с RD, WR и CS?


Посчитал...запустил вот такой код. (по прерыванию Таймера в 100 микросек инкриментирую
counter +=100)
//*******************************************************************
counter = 0;
Wait(200000000);
sprintf (msg,"\n\r200000000 tacts per %d microseconds\n\r",counter);
Print.PrintString(msg);
while(1) {}

//*******************************************************************
inline void Wait(unsigned int mcs)
{
int cycles = mcs; // 200 MIPS - 200 операций в микросекунду

for(int l=0; l<cycles;l++);
};

получил след результаты:
около 7 секунд - без оптимизации
5,5 секунд с оптимизацией Low
А вот максимальная оптимизация вообще 0 дает...!! почему интересно?



Получается могу задать интервал в 30ns при вызове Wait(1);

Хотя не уверен в верности данного подсчета. Так как таймер влияет на измерения. причем в зависимости от времени срабатывания получаются разные результаты ...

АЦП как раз сидит на шине , а для того чтобы управлять RD, CONVST, A0 сигналами необходимы небольшие задерки...
например держать 125ns A0 для выбора АЦП0 или АЦП1 на микрухе,
30ns для того чтобы держать RD для выбора ChA0 ChB0 .. и т.п.
или 15ns держать CONVST (старт преобразования)

p.s проект IAR4.41a

Сообщение отредактировал Daermon - Nov 22 2007, 06:43
Go to the top of the page
 
+Quote Post
Alex03
сообщение Nov 22 2007, 08:44
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(Daermon @ Nov 22 2007, 11:37) *
for(int l=0; l<cycles;l++);
А вот максимальная оптимизация вообще 0 дает...!! почему интересно?

volatile int i - поможет.

Если длительность можно и больше, а это видимо так, то ИМХО зря не рассматриваете вариант использования (опроса) уже имеющегося таймера. т.е. например есть таймер с инкрементом каждые M нс и пересчётом N тогда примерно так:
Код
wait(uint n)
{
    uint x = get_cur_timer_val();
    n /= M;
    
    while((get_cur_timer_val() - x + N) % N < n)
    {
    }
}


Мог ошибиться, да и упростить можно.
Впрочем для Ваших времён может это и лишнее. smile.gif
Go to the top of the page
 
+Quote Post



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

 


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


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