Перейти к содержанию
    

задержки

Всем привет. Прочитал в книге "применение микроконтроллеров PIC18..." про задержку Delay1TCY, Delay10TCYx ну и т.д. можно ли применять ее в МК PIC16F505 и как правильно записать чтоб задержка была в 10мс?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет. Прочитал в книге "применение микроконтроллеров PIC18..." про задержку Delay1TCY, Delay10TCYx ну и т.д. можно ли применять ее в МК PIC16F505 и как правильно записать чтоб задержка была в 10мс?

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

Более рационально использовать таймер, и заполнить паузу чем либо полезным(если таковое имеется).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По сути эти задержки вставляют некоторое количество 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;    
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если есть варианты более компактные просьба написать.

Дарю! Для изучения и творческой переработки. Мне оно уже почти не нужно. Прощайте, PIC-и.

/*!****************************************************************************
@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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дарю! Для изучения и творческой переработки. Мне оно уже почти не нужно. Прощайте, PIC-и.

Спасибо, буду разбираться и пробовать применить

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, буду разбираться и пробовать применить

Эти задержки применялись в первых версиях компиляторов XC. Теперь вместо них нормальные _delay_ms и _delay_us.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эти задержки применялись в первых версиях компиляторов XC. Теперь вместо них нормальные _delay_ms и _delay_us.

Моё, собственноручно писанное, еще на ассемблере когда-то, а потом переписанное на C, с контролем, чтобы написанное на C не имело больше ассемблерных команд, чем написанное на ассемблере. :rolleyes:

У меня есть три подобных функции, с разным шагом задержки.

Кстати, в реальной жизни не нужно. Все интервалы лучше задавать / отмерять таймерами. А процессор пусть займется чем-нибудь полезным. Хотя бы питание проверит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...