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

 
 
> задержки, Delay1TCY
x66
сообщение Jan 30 2014, 18:59
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 7-05-10
Пользователь №: 57 122



Всем привет. Прочитал в книге "применение микроконтроллеров PIC18..." про задержку Delay1TCY, Delay10TCYx ну и т.д. можно ли применять ее в МК PIC16F505 и как правильно записать чтоб задержка была в 10мс?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
volodya
сообщение Jan 31 2014, 06:12
Сообщение #2


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

Группа: Свой
Сообщений: 194
Регистрация: 14-02-07
Из: УКРАИНА
Пользователь №: 25 344



Цитата(x66 @ Jan 30 2014, 20:59) *
Всем привет. Прочитал в книге "применение микроконтроллеров PIC18..." про задержку Delay1TCY, Delay10TCYx ну и т.д. можно ли применять ее в МК PIC16F505 и как правильно записать чтоб задержка была в 10мс?

По сути эти задержки вставляют некоторое количество NOP . То-есть, если устраивает 10 мс "ничего не делание", необходимо посчитать какое количество тактов соответствует задержке при Вашей тактовой частоте.
Более рационально использовать таймер, и заполнить паузу чем либо полезным(если таковое имеется).


--------------------
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть"
"Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард
Go to the top of the page
 
+Quote Post
x66
сообщение Jan 31 2014, 08:33
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 7-05-10
Пользователь №: 57 122



Цитата(volodya @ Jan 31 2014, 10:12) *
По сути эти задержки вставляют некоторое количество NOP . То-есть, если устраивает 10 мс "ничего не делание", необходимо посчитать какое количество тактов соответствует задержке при Вашей тактовой частоте.
Более рационально использовать таймер, и заполнить паузу чем либо полезным(если таковое имеется).


просто имеется такой код (ниже). интересует не лучше ли использовать Delay1KTCYx(10) (по книге если смотреть то дает задержку в 10мс)? Если есть варианты более компактные просьба написать.
Код
#define DELAY_TIME 63
int delay_counter;
void delay_10ms (void)
{
    delay_counter = DELAY_TIME;
    while (delay_counter > 0) delay_counter --;
    
    delay_counter = DELAY_TIME;
    while (delay_counter > 0) delay_counter --;

    delay_counter = DELAY_TIME;
    while (delay_counter > 0) delay_counter --;

    delay_counter = DELAY_TIME;
    while (delay_counter > 0) delay_counter --;

    delay_counter = DELAY_TIME;
    while (delay_counter > 0) delay_counter --;

    delay_counter = DELAY_TIME;
    while (delay_counter > 0) delay_counter --;

    delay_counter = DELAY_TIME;
    while (delay_counter > 0) delay_counter --;

    delay_counter = DELAY_TIME;
    while (delay_counter > 0) delay_counter --;

    delay_counter = DELAY_TIME;
    while (delay_counter > 0) delay_counter --;

    delay_counter = DELAY_TIME;
    while (delay_counter > 0) delay_counter --;
    CLRWDT();//cbroc ctorozevogo taimera
    return;    
}
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 31 2014, 08:56
Сообщение #4


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(x66 @ Jan 31 2014, 11:33) *
Если есть варианты более компактные просьба написать.

Дарю! Для изучения и творческой переработки. Мне оно уже почти не нужно. Прощайте, PIC-и.
CODE
/*!****************************************************************************
@brief Long Delay
@details Длительная точная задержка с шагом 50000 командных циклов
@return
@note Время задержки равно (50000 * k + 7) командных циклов
@verbatim
Постоянная величина + 7 учитывает вызов функции и возврат
Максимальная задержка получается при k = 0 (соответствует 256)
При частоте 4 MHz (Tcy = 1 us) получается 0.05 s * k (max 12.8 s)
Занимает 15 программных слов, использует 3 ячейки в ОЗУ
Задержка определяется по формуле ((4 * 125 + 5) * 99 + 5) * k
Можно использовать другие константы, но данная комбинация проще
Сторожевой таймер сбрасывается через 505 циклов
Минимальный период сторожевого таймера без прескалера равен 10 ms
@endverbatim
*/
void longdelay(uint8_t k)
{
do {
asm("nop");
uint8_t j = 99;
do {
CLRWDT();
uint8_t i = 125;
do {
asm("nop");
} while (--i); // внутренний цикл
} while (--j);
} while (--k);
return;
}
Go to the top of the page
 
+Quote Post
x66
сообщение Jan 31 2014, 09:12
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 7-05-10
Пользователь №: 57 122



Цитата(ViKo @ Jan 31 2014, 12:56) *
Дарю! Для изучения и творческой переработки. Мне оно уже почти не нужно. Прощайте, PIC-и.

Спасибо, буду разбираться и пробовать применить
Go to the top of the page
 
+Quote Post
Bronislav
сообщение Feb 7 2014, 00:16
Сообщение #6


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

Группа: Участник
Сообщений: 118
Регистрация: 23-01-06
Пользователь №: 13 477



Цитата(x66 @ Jan 31 2014, 13:12) *
Спасибо, буду разбираться и пробовать применить

Эти задержки применялись в первых версиях компиляторов XC. Теперь вместо них нормальные _delay_ms и _delay_us.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 7 2014, 06:13
Сообщение #7


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Bronislav @ Feb 7 2014, 03:16) *
Эти задержки применялись в первых версиях компиляторов XC. Теперь вместо них нормальные _delay_ms и _delay_us.

Моё, собственноручно писанное, еще на ассемблере когда-то, а потом переписанное на C, с контролем, чтобы написанное на C не имело больше ассемблерных команд, чем написанное на ассемблере. rolleyes.gif
У меня есть три подобных функции, с разным шагом задержки.
Кстати, в реальной жизни не нужно. Все интервалы лучше задавать / отмерять таймерами. А процессор пусть займется чем-нибудь полезным. Хотя бы питание проверит.
Go to the top of the page
 
+Quote Post

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

 


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


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