x66 0 30 января, 2014 Опубликовано 30 января, 2014 · Жалоба Всем привет. Прочитал в книге "применение микроконтроллеров PIC18..." про задержку Delay1TCY, Delay10TCYx ну и т.д. можно ли применять ее в МК PIC16F505 и как правильно записать чтоб задержка была в 10мс? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
volodya_t 0 31 января, 2014 Опубликовано 31 января, 2014 · Жалоба Всем привет. Прочитал в книге "применение микроконтроллеров PIC18..." про задержку Delay1TCY, Delay10TCYx ну и т.д. можно ли применять ее в МК PIC16F505 и как правильно записать чтоб задержка была в 10мс? По сути эти задержки вставляют некоторое количество NOP . То-есть, если устраивает 10 мс "ничего не делание", необходимо посчитать какое количество тактов соответствует задержке при Вашей тактовой частоте. Более рационально использовать таймер, и заполнить паузу чем либо полезным(если таковое имеется). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x66 0 31 января, 2014 Опубликовано 31 января, 2014 · Жалоба По сути эти задержки вставляют некоторое количество 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 31 января, 2014 Опубликовано 31 января, 2014 · Жалоба Если есть варианты более компактные просьба написать. Дарю! Для изучения и творческой переработки. Мне оно уже почти не нужно. Прощайте, 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x66 0 31 января, 2014 Опубликовано 31 января, 2014 · Жалоба Дарю! Для изучения и творческой переработки. Мне оно уже почти не нужно. Прощайте, PIC-и. Спасибо, буду разбираться и пробовать применить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PicUni 0 7 февраля, 2014 Опубликовано 7 февраля, 2014 · Жалоба Спасибо, буду разбираться и пробовать применить Эти задержки применялись в первых версиях компиляторов XC. Теперь вместо них нормальные _delay_ms и _delay_us. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 7 февраля, 2014 Опубликовано 7 февраля, 2014 · Жалоба Эти задержки применялись в первых версиях компиляторов XC. Теперь вместо них нормальные _delay_ms и _delay_us. Моё, собственноручно писанное, еще на ассемблере когда-то, а потом переписанное на C, с контролем, чтобы написанное на C не имело больше ассемблерных команд, чем написанное на ассемблере. :rolleyes: У меня есть три подобных функции, с разным шагом задержки. Кстати, в реальной жизни не нужно. Все интервалы лучше задавать / отмерять таймерами. А процессор пусть займется чем-нибудь полезным. Хотя бы питание проверит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться