• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Нужна помощь по программированию на Си МК PIC

  • Автор темы Автор темы Larik
  • Дата начала Дата начала

Larik

Новые
Регистрация
26 Дек 2011
Сообщения
39
Реакции
0
Баллы
0
Нужна помощь по программированию на Си МК PIC

Здравствуйте.
При написании программы на Си для МК PIC столкнулся с проблемой организации задержек.
Стандартный файл в компиляторе HI-TECH Software "delay.h" заточен под 4 МГц, а мне необходимо работать с 20 МГц.
Есть ли у кого макрос или собранная функция задержки
Или что изменить в стандартом файле для корректной работы МК при организации задержек мкс и мс.

Благодарен за помощь в данном вопросе.
 
Такие статьи я читал, но я говорил о том, что задержку необходимо организовать на 20Мгц частоты.
 
ПЛОХО ЧИТАЛ!!!
Носом ткнуть НАДО!!!
 

Вложения

  • Ashampoo_Snap_2013.03.22_07h21m32s_001_.webp
    Ashampoo_Snap_2013.03.22_07h21m32s_001_.webp
    12.6 KB · Просмотры: 349
Извините за агрессию...
 
Вы знаете, всё ведь на так просто.
Полазив в папке с компилятором я нашёл только два фала, которые связаны с задержками, и то, один из них просто демонстрационный.

#include <htc.h> // Required to interface with delay routines

#ifndef _XTAL_FREQ
// Unless already defined assume 4MHz system frequency
// This definition is required to calibrate __delay_us() and __delay_ms()
#define _XTAL_FREQ 20000000
#endif

/** demonstration of various built-in delay mechanisms */
void main(void){
while(1){
NOP();
_delay(1000); // delay for 1000 instruction cycles
CLRWDT();
__delay_us(400); // delay for 400 microseconds
CLRWDT();
__delay_ms(2); // delay for 2 milliseconds
CLRWDT();
}
}




и файл с расширением ___.h

/*
* Delay functions for HI-TECH C on the PIC
*
* Functions available:
* DelayUs(x) Delay specified number of microseconds
* DelayMs(x) Delay specified number of milliseconds
*
* Note that there are range limits: x must not exceed 255 - for xtal
* frequencies > 12MHz the range for DelayUs is even smaller.
* To use DelayUs it is only necessary to include this file; to use
* DelayMs you must include delay.c in your project.
*
*/

/* Set the crystal frequency in the CPP predefined symbols list in
HPDPIC, or on the PICC commmand line, e.g.
picc -DXTAL_FREQ=4MHZ

or
picc -DXTAL_FREQ=100KHZ

Note that this is the crystal frequency, the CPU clock is
divided by 4.

* MAKE SURE this code is compiled with full optimization!!!

*/

#ifndef XTAL_FREQ
#define XTAL_FREQ 4MHZ /* Crystal frequency in MHz */
#endif

#define MHZ *1000L /* number of kHz in a MHz */
#define KHZ *1 /* number of kHz in a kHz */

#if XTAL_FREQ >= 12MHZ

#define DelayUs(x) { unsigned char _dcnt; \
_dcnt = (x)*((XTAL_FREQ)/(12MHZ)); \
while(--_dcnt != 0) \
continue; }
#else

#define DelayUs(x) { unsigned char _dcnt; \
_dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \
while(--_dcnt != 0) \
continue; }
#endif

extern void DelayMs(unsigned char);
 
Только незадача, как подогнать их на мою частоту, чтоб можно было использовать полноценно мс и мкс..

Насчёт команды _delay_ms(n) так вот она не компилится, т.к такая комбинация нигде в подгрузочных файлах не встречается...
 
Какая у вас версия компилатора? И выложите сюда ваш "delay.h".
 
Насчёт команды _delay_ms(n) так вот она не компилится, т.к такая комбинация нигде в подгрузочных файлах не встречается...
А первый пример компилится?
Код:
#include <htc.h> // Required to interface with delay routines

#ifndef _XTAL_FREQ
// Unless already defined assume 4MHz system frequency
// This definition is required to calibrate __delay_us() and __delay_ms()
#define _XTAL_FREQ 20000000
#endif

/** demonstration of various built-in delay mechanisms */
void main(void){
while(1){
NOP();
_delay(1000); // delay for 1000 instruction cycles
CLRWDT();
__delay_us(400); // delay for 400 microseconds
CLRWDT();
__delay_ms(2); // delay for 2 milliseconds
CLRWDT();
}
}
 
HI-TECH Software 9.7
Единственный файл именуемый delay.h в компиляторе выглядит так вот:

/*
* Delay functions for HI-TECH C on the PIC
*
* Functions available:
* DelayUs(x) Delay specified number of microseconds
* DelayMs(x) Delay specified number of milliseconds
*
* Note that there are range limits: x must not exceed 255 - for xtal
* frequencies > 12MHz the range for DelayUs is even smaller.
* To use DelayUs it is only necessary to include this file; to use
* DelayMs you must include delay.c in your project.
*
*/

/* Set the crystal frequency in the CPP predefined symbols list in
HPDPIC, or on the PICC commmand line, e.g.
picc -DXTAL_FREQ=4MHZ

or
picc -DXTAL_FREQ=100KHZ

Note that this is the crystal frequency, the CPU clock is
divided by 4.

* MAKE SURE this code is compiled with full optimization!!!

*/

#ifndef XTAL_FREQ
#define XTAL_FREQ 4MHZ /* Crystal frequency in MHz */
#endif

#define MHZ *1000L /* number of kHz in a MHz */
#define KHZ *1 /* number of kHz in a kHz */

#if XTAL_FREQ >= 12MHZ

#define DelayUs(x) { unsigned char _dcnt; \
_dcnt = (x)*((XTAL_FREQ)/(12MHZ)); \
while(--_dcnt != 0) \
continue; }
#else

#define DelayUs(x) { unsigned char _dcnt; \
_dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \
while(--_dcnt != 0) \
continue; }
#endif

extern void DelayMs(unsigned char);
 
Совсем не понятно, что не так?
В начале все написано:
/*
* Delay functions for HI-TECH C on the PIC
*
* Functions available:
* DelayUs(x) Delay specified number of microseconds
* DelayMs(x) Delay specified number of milliseconds
*
* Note that there are range limits: x must not exceed 255 - for xtal
* frequencies > 12MHz the range for DelayUs is even smaller.
* To use DelayUs it is only necessary to include this file; to use
* DelayMs you must include delay.c in your project.
*
*/

/* Set the crystal frequency in the CPP predefined symbols list in
HPDPIC, or on the PICC commmand line, e.g.
picc -DXTAL_FREQ=4MHZ

or
picc -DXTAL_FREQ=100KHZ

Note that this is the crystal frequency, the CPU clock is
divided by 4.

* MAKE SURE this code is compiled with full optimization!!!

*/
 
Методом учёного тыка решил пройти диапазон мс от 5 до 500, оказалось, что максимальный аргумент функции 35 мс, далее нужно циклить..
а так всё работает и очень даже корректно.
Огромное спасибо за помощь.
 
А насчёт "в начале всё понятно".
В теле функции описание только по микросекундам, которое я уверенно использовал, но нужны были мс да и эксперименты с выбором частоты не были очень успешными.
Идеальный вариант это то, это вы мне сбросили ранее..
Просто необходим учесть ограничения аргумента.
 
Дак вот же написано, прямо в теле функции: * DelayMs(x) Delay specified number of milliseconds
Ну а вобщем не за что.
Удачи!
 
написано, но компилятор ругается, а при мкс он мило улыбается..
но это уже не важно, теперь заюзаю задержки типа __delay_m(или u)s(n)..
Спасибо что откликнулись на крик о помощи.
Ваши советы и информация привели меня к нужному решению проблемы.
Ещё раз спасибо.:tehnari_ru_288:
 
Назад
Сверху