Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Команда delay
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
VAHOO
Всем привет! подскажите пожалуйста чем можно заменить команда
delay в Keil uvision 8.02, например delay (5) 5ms,

заранее спасибо!
gala
Применяю прерывание по таймеру = 1000Гц, которое модиф.
счетчикИ кождые 1, 10, 100 мс
VAHOO
а без использавание таймера это не возможно?
у меня таймер работает для времени
VAHOO
Qala, если не трудно дай кусок программы, заеранее спасибо!
VAHOO
нечего полезново не нашел, неужели ни кто не сталкивался с этим?

sad.gif help.gif
evg123
Единственный рабочий способ это (как предложил gala) с использованием таймера.
Запускаем таймер в 16 битном режиме с перезагрузкой с частотой 1кГц.
В прерывании пишем код

TIMER++; //глобальная переменная (unsigned int), пользовательский таймер

Подпрограммо задержки будет иметь вид

void Delay(unsigned int T) // 1T = 1мс
{
unsigned int TF;

TF=TIMER;
while((TIMER-TF)<T);//сама задержка

}

Применение

Delay(100); // задержка на 100 мс

Все ninja.gif
VAHOO
очень спасибо!
K_AV
Цитата(evg123 @ Jan 25 2007, 12:00) *
Единственный рабочий способ это (как предложил gala) с использованием таймера.
Запускаем таймер в 16 битном режиме с перезагрузкой с частотой 1кГц.
В прерывании пишем код
TIMER++; //глобальная переменная (unsigned int), пользовательский таймер
Подпрограммо задержки будет иметь вид
void Delay(unsigned int T) // 1T = 1мс
{
unsigned int TF;
TF=TIMER;
while((TIMER-TF)<T);//сама задержка
}
Применение
Delay(100); // задержка на 100 мс
Все ninja.gif

Когда за время очередного выполнения продпрограммы DELAY произойдет переполнение переменной TIMER (а это будет случаться примерно раз в минуту), очередная задержка будет выполняться неожиданно долго? Или я чего-то не понял?
Ой, наверное, наоборот - задержка закончится неожиданно досрочно...

----------------------------------
Более позднее исправление:
Перепроверил - все работает нормально. Извиняюсь за невольную провокацию.
Палыч
Цитата(K_AV @ Feb 15 2007, 15:25) *
Когда за время очередного выполнения продпрограммы DELAY произойдет переполнение переменной TIMER (а это будет случаться примерно раз в минуту), очередная задержка будет выполняться неожиданно долго? Или я чего-то не понял?


Да, долго. Бесконечно долго!
Наверно, для исправления этого дефекта, лучше выполнять в прерывании
if(TIMER) --TIMER
а, в Delay
TIMER=T;
while(TIMER);//сама задержка
Кроме того такая функция будет иметь погрещность отсчета времени в единицу задаваемой величины.

Ой! Неправда - закончится функция Delay быстрее, чем надо!
gala
Мне больше нравится вариант в стиле Siemens:

в п/п прерывания:
if( delay_1ms_A>0) delay_1ms_A--; else delay_1ms_A=0;
if( delay_1ms_B>0) delay_1ms_B--; else delay_1ms_B=0;

в основной прогр.:

delay_1ms_A=5; // или 10

while(delay_1ms_A !=0)
{
что-то делаем на фоне ожидания
}
Палыч
Цитата(Палыч @ Feb 15 2007, 16:09) *
Да, долго. Бесконечно долго!
.....
Ой! Неправда - закончится функция Delay быстрее, чем надо!

Был неправ! sad.gif
При unsigned int TIMER и TF при вычислении выражения TIMER-TF произайдет заем единицы из "семнадцатого" разряда и значение выражения будет верным
K_AV
Извиняюсь, перепроверил - действительно, по варианту evg123 все работает нормально.

А то, что предложил gala, мне тоже понравилось. Единственно, я бы его назвал не DELAY, а TIME_LIMIT.
gala
Цитата(K_AV @ Feb 16 2007, 12:56) *
Единственно, я бы его назвал не DELAY, а TIME_LIMIT.


В PLC - обычно называется ТАЙМЕРы

Если есть 1, 10, 100 мс таймеры, то достаточно char
для 0.25, 2.5, 25 с
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.