Метценгерштейн 0 26 мая, 2005 Опубликовано 26 мая, 2005 · Жалоба -напрмер, как там delay реализована? вообще есть где- то pdf прочтитать про это, а то только рекламные проспекты попадаются? Какие есть стандартные библиотеки, типа SPI 1-wire? и в том духе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BorisRozentsvaig 0 26 мая, 2005 Опубликовано 26 мая, 2005 · Жалоба -напрмер, как там delay реализована? вообще есть где- то pdf прочтитать про это, а то только рекламные проспекты попадаются? Какие есть стандартные библиотеки, типа SPI 1-wire? и в том духе. <{POST_SNAPBACK}> В help IAR Embedded Workbench есть вся необходимая информация. Функцию Delay, по крайней мере для ARMов, в явном виде я там не нашел. Но в примерах, включенных в дистрибутив, есть реализация этой функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 26 мая, 2005 Опубликовано 26 мая, 2005 · Жалоба есть intrinsic функция __delay_cycles(unsigned long int) на базе нее можно сделать delay например так (задержка в милисекундах) #define Delay(ms) __delay_cycles(CLOCK_FREQ*ms/1000) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 1 июня, 2005 Опубликовано 1 июня, 2005 · Жалоба ...#define Delay(ms) __delay_cycles(CLOCK_FREQ*ms/1000) <{POST_SNAPBACK}> Насколько я знаю, __delay_cycles требует константного аргумента. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 8 июня, 2005 Опубликовано 8 июня, 2005 · Жалоба т.е. если кварц у меня 10.240 мГц, хочу задержку 3 милисек, как это будет выглядеть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andk 0 8 июня, 2005 Опубликовано 8 июня, 2005 · Жалоба To IgorKossak: Про АРМы не скажу, а в AVR - - INAVR.H - __intrinsic void __delay_cycles(unsigned long); т.е. можно и не константное выражение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 8 июня, 2005 Опубликовано 8 июня, 2005 · Жалоба ...#define Delay(ms) __delay_cycles(CLOCK_FREQ*ms/1000) <{POST_SNAPBACK}> Насколько я знаю, __delay_cycles требует константного аргумента. <{POST_SNAPBACK}> Так макрос нужен только для удобства если CLOCK_FREQ и ms константы компилер сам все и посчитает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 9 июня, 2005 Опубликовано 9 июня, 2005 · Жалоба конкретно пример можно для 10.240 мГц и 3 милисек? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndyBig 5 9 июня, 2005 Опубликовано 9 июня, 2005 · Жалоба Конкретно считаем: время одного такта в милисекундах: 1 / 10240 = 0,00009765625 количество тактов для задержки на 3 милисекунды: 3 / 0,00009765625 = 30720 Значит выглядеть это будет так: __delay_cycles(30720): Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cutter 0 5 марта, 2007 Опубликовано 5 марта, 2007 · Жалоба конкретно пример можно для 10.240 мГц и 3 милисек? Вот что мне подсказал один умный человек (для кварца 4МГц): #include <INTRINSICS.H> #define OSC 4000000L #define MS *OSC/1000 #define MKS *OSC/1000000 вызов: __delay_cycles(10 MS); __delay_cycles(10 MKS); ЗЫ. Очень удобно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 5 марта, 2007 Опубликовано 5 марта, 2007 · Жалоба To IgorKossak: Про АРМы не скажу, а в AVR - - INAVR.H - __intrinsic void __delay_cycles(unsigned long); т.е. можно и не константное выражение. Вот фрагмент программы: void first(unsigned long a) { __delay_cycles(a); second(); } Вот сообщение компилятора: Fatal Error[Ta030]: Argument to __delay_cycles must be a constant expression. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
archi2000 0 5 марта, 2007 Опубликовано 5 марта, 2007 · Жалоба Пример программы для моргания светодиодами на всех выводах Атмега8 Программа компилируется нормально. #include <inavr.h> #include <iom8.h> //********************************************** #define ClkFreq 4000000 // частота кварцевого резонатора или частота на которой работает контроллер. #define _1us (unsigned long int)((ClkFreq / 1000000) / 1.25) // 1.25 погрешность на вызов функции для 1us. #define _1ms (unsigned long int)(ClkFreq / 1000) //********************************************** void delayms(unsigned long ms) { volatile unsigned long dly; dly=ms; while(dly--)__delay_cycles(_1ms); } void delayus(unsigned long us) { volatile unsigned long dlx; dlx=us; while(dlx--)__delay_cycles(_1us); } void main ( void ) { DDRB = 0x07; // порт B настраиваем на выход DDRC = 0x3f; // порт С настраиваем на выход DDRD = 0xff; // порт D настраиваем на выход for(;;) { PORTB = 0x07; // 1 на PB.0 - PB.2 PORTC = 0x3f; // 1 на PC.0 - PC.5 PORTD = 0xff; // 1 на PD.0 - PD.7 delayms(100); PORTB = 0x00; // 0 на PB PORTC = 0x00; // 0 на PC PORTD = 0x00; // 0 на PD delayms(10000); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lega 0 6 марта, 2007 Опубликовано 6 марта, 2007 · Жалоба Пример программы для моргания светодиодами на всех выводах Атмега8 Программа компилируется нормально. #include <inavr.h> #include <iom8.h> //********************************************** #define ClkFreq 4000000 // частота кварцевого резонатора или частота на которой работает контроллер. #define _1us (unsigned long int)((ClkFreq / 1000000) / 1.25) // 1.25 погрешность на вызов функции для 1us. #define _1ms (unsigned long int)(ClkFreq / 1000) //********************************************** void delayms(unsigned long ms) { volatile unsigned long dly; dly=ms; while(dly--)__delay_cycles(_1ms); } void delayus(unsigned long us) { volatile unsigned long dlx; dlx=us; while(dlx--)__delay_cycles(_1us); } void main ( void ) { DDRB = 0x07; // порт B настраиваем на выход DDRC = 0x3f; // порт С настраиваем на выход DDRD = 0xff; // порт D настраиваем на выход for(;;) { PORTB = 0x07; // 1 на PB.0 - PB.2 PORTC = 0x3f; // 1 на PC.0 - PC.5 PORTD = 0xff; // 1 на PD.0 - PD.7 delayms(100); PORTB = 0x00; // 0 на PB PORTC = 0x00; // 0 на PC PORTD = 0x00; // 0 на PD delayms(10000); } } В AVR IAR Compiler Reference Guide есть замечание для функции __delay_cycles(): Note: The specified value must be a constant integer expression and not an expression that is evaluated at runtime. В Вашем случае в качестве аргумента функции __delay_cycles() используются константы _1ms и _1us, значения которых вычисляются при препроцессорной обработке. Иначе Вы бы смогли написать __delay_cycles(a*_1ms) и не создавать дополнительные функции delayms() и delayus(). Кстати, в этой программе, мне кажется, менее затратно по ресурсам записывать __delay_cycles(100*_1ms) вместо delayms(100). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться