Перейти к содержанию
    

подскажите по IAR командам

-напрмер, как там delay реализована?

вообще есть где- то pdf прочтитать про это, а то только рекламные проспекты попадаются? Какие есть стандартные библиотеки, типа SPI 1-wire?

и в том духе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

-напрмер, как там delay реализована?

вообще есть где- то pdf прочтитать про это, а то только рекламные проспекты попадаются? Какие есть стандартные библиотеки, типа SPI 1-wire?

и в том духе.

 

В help IAR Embedded Workbench есть вся необходимая информация.

Функцию Delay, по крайней мере для ARMов, в явном виде я там не нашел. Но в примерах, включенных в дистрибутив, есть реализация этой функции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

есть intrinsic функция

__delay_cycles(unsigned long int)

 

на базе нее можно сделать delay

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

 

#define Delay(ms) __delay_cycles(CLOCK_FREQ*ms/1000)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...#define Delay(ms) __delay_cycles(CLOCK_FREQ*ms/1000)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

т.е. если кварц у меня 10.240 мГц, хочу задержку 3 милисек, как это будет выглядеть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

To IgorKossak:

 

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

 

- INAVR.H -

__intrinsic void __delay_cycles(unsigned long);

 

т.е. можно и не константное выражение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...#define Delay(ms) __delay_cycles(CLOCK_FREQ*ms/1000)

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

 

Так макрос нужен только для удобства если CLOCK_FREQ и ms константы компилер сам все и посчитает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конкретно считаем:

время одного такта в милисекундах: 1 / 10240 = 0,00009765625

количество тактов для задержки на 3 милисекунды: 3 / 0,00009765625 = 30720

Значит выглядеть это будет так: __delay_cycles(30720):

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

конкретно пример можно для 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);

 

ЗЫ. Очень удобно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пример программы для моргания светодиодами на всех выводах Атмега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);
  }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пример программы для моргания светодиодами на всех выводах Атмега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).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...