|
Главная | Правила | Регистрация | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
|
Опции темы | Опции просмотра |
21.03.2013, 17:15 | #1 (permalink) |
Member
Регистрация: 26.12.2011
Сообщений: 39
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Нужна помощь по программированию на Си МК PIC
При написании программы на Си для МК PIC столкнулся с проблемой организации задержек. Стандартный файл в компиляторе HI-TECH Software "delay.h" заточен под 4 МГц, а мне необходимо работать с 20 МГц. Есть ли у кого макрос или собранная функция задержки Или что изменить в стандартом файле для корректной работы МК при организации задержек мкс и мс. Благодарен за помощь в данном вопросе. |
21.03.2013, 17:15 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Лучше сразу прояснить ситуацию прочитав схожие посты Нужна помощь с БП Нужна помощь Нужна помощь ! Нужна помощь Нужна помощь Нужна помощь с БП |
22.03.2013, 10:24 | #5 (permalink) |
Member
Регистрация: 13.05.2011
Сообщений: 401
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 274
|
Извините за агрессию...
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
22.03.2013, 11:02 | #6 (permalink) |
Member
Регистрация: 26.12.2011
Сообщений: 39
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Вы знаете, всё ведь на так просто.
Полазив в папке с компилятором я нашёл только два фала, которые связаны с задержками, и то, один из них просто демонстрационный. #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); |
22.03.2013, 11:04 | #7 (permalink) |
Member
Регистрация: 26.12.2011
Сообщений: 39
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Только незадача, как подогнать их на мою частоту, чтоб можно было использовать полноценно мс и мкс..
Насчёт команды _delay_ms(n) так вот она не компилится, т.к такая комбинация нигде в подгрузочных файлах не встречается... |
22.03.2013, 12:56 | #9 (permalink) | |
Member
Регистрация: 13.05.2011
Сообщений: 401
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 274
|
Цитата:
Код:
#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(); } } |
|
22.03.2013, 17:47 | #10 (permalink) |
Member
Регистрация: 26.12.2011
Сообщений: 39
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
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); |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Опции темы | |
Опции просмотра | |
|
|