Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: подскажите по IAR командам
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Метценгерштейн
-напрмер, как там delay реализована?
вообще есть где- то pdf прочтитать про это, а то только рекламные проспекты попадаются? Какие есть стандартные библиотеки, типа SPI 1-wire?
и в том духе.
BorisRozentsvaig
Цитата(Метценгерштейн @ May 26 2005, 09:07)
-напрмер, как там delay реализована?
вообще есть где- то pdf прочтитать про это, а то только рекламные проспекты попадаются? Какие есть стандартные библиотеки, типа SPI 1-wire?
и в том духе.
*


В help IAR Embedded Workbench есть вся необходимая информация.
Функцию Delay, по крайней мере для ARMов, в явном виде я там не нашел. Но в примерах, включенных в дистрибутив, есть реализация этой функции.
KRS
есть intrinsic функция
__delay_cycles(unsigned long int)

на базе нее можно сделать delay
например так (задержка в милисекундах)

#define Delay(ms) __delay_cycles(CLOCK_FREQ*ms/1000)
IgorKossak
Цитата(KRS @ May 26 2005, 10:37)
...#define Delay(ms) __delay_cycles(CLOCK_FREQ*ms/1000)
*

Насколько я знаю, __delay_cycles требует константного аргумента.
Метценгерштейн
т.е. если кварц у меня 10.240 мГц, хочу задержку 3 милисек, как это будет выглядеть?
andk
To IgorKossak:

Про АРМы не скажу, а в AVR -

- INAVR.H -
__intrinsic void __delay_cycles(unsigned long);

т.е. можно и не константное выражение.
KRS
Цитата(IgorKossak @ Jun 1 2005, 18:34)
Цитата(KRS @ May 26 2005, 10:37)
...#define Delay(ms) __delay_cycles(CLOCK_FREQ*ms/1000)
*

Насколько я знаю, __delay_cycles требует константного аргумента.
*



Так макрос нужен только для удобства если CLOCK_FREQ и ms константы компилер сам все и посчитает
Метценгерштейн
конкретно пример можно для 10.240 мГц и 3 милисек?
AndyBig
Конкретно считаем:
время одного такта в милисекундах: 1 / 10240 = 0,00009765625
количество тактов для задержки на 3 милисекунды: 3 / 0,00009765625 = 30720
Значит выглядеть это будет так: __delay_cycles(30720):
Artur Nikitin
Цитата(Метценгерштейн @ Jun 9 2005, 05:32) *
конкретно пример можно для 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
Цитата(andk @ Jun 8 2005, 09:29) *
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
Пример программы для моргания светодиодами на всех выводах Атмега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
Цитата(archi2000 @ Mar 6 2007, 00:20) *
Пример программы для моргания светодиодами на всех выводах Атмега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).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.