реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> подскажите по IAR командам, или как с ним работать?
Метценгерштейн
сообщение May 26 2005, 05:07
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



-напрмер, как там delay реализована?
вообще есть где- то pdf прочтитать про это, а то только рекламные проспекты попадаются? Какие есть стандартные библиотеки, типа SPI 1-wire?
и в том духе.
Go to the top of the page
 
+Quote Post
BorisRozentsvaig
сообщение May 26 2005, 06:17
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 23-03-05
Из: Санкт-Петербург
Пользователь №: 3 617



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


В help IAR Embedded Workbench есть вся необходимая информация.
Функцию Delay, по крайней мере для ARMов, в явном виде я там не нашел. Но в примерах, включенных в дистрибутив, есть реализация этой функции.
Go to the top of the page
 
+Quote Post
KRS
сообщение May 26 2005, 07:37
Сообщение #3


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



есть intrinsic функция
__delay_cycles(unsigned long int)

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

#define Delay(ms) __delay_cycles(CLOCK_FREQ*ms/1000)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jun 1 2005, 15:34
Сообщение #4


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



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

Насколько я знаю, __delay_cycles требует константного аргумента.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jun 8 2005, 09:17
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



т.е. если кварц у меня 10.240 мГц, хочу задержку 3 милисек, как это будет выглядеть?
Go to the top of the page
 
+Quote Post
andk
сообщение Jun 8 2005, 10:29
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 199
Регистрация: 17-12-04
Из: Миасс
Пользователь №: 1 519



To IgorKossak:

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

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

т.е. можно и не константное выражение.
Go to the top of the page
 
+Quote Post
KRS
сообщение Jun 8 2005, 10:49
Сообщение #7


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(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 константы компилер сам все и посчитает
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jun 9 2005, 05:32
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



конкретно пример можно для 10.240 мГц и 3 милисек?
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Jun 9 2005, 12:56
Сообщение #9


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



Конкретно считаем:
время одного такта в милисекундах: 1 / 10240 = 0,00009765625
количество тактов для задержки на 3 милисекунды: 3 / 0,00009765625 = 30720
Значит выглядеть это будет так: __delay_cycles(30720):
Go to the top of the page
 
+Quote Post
Artur Nikitin
сообщение Mar 5 2007, 15:45
Сообщение #10


Участник
*

Группа: Новичок
Сообщений: 30
Регистрация: 28-11-06
Из: Набережные Челны
Пользователь №: 22 856



Цитата(Метценгерштейн @ 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);

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


--------------------
начинающий программист
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 5 2007, 16:02
Сообщение #11


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(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.
Go to the top of the page
 
+Quote Post
archi2000
сообщение Mar 5 2007, 21:20
Сообщение #12


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 30-09-05
Пользователь №: 9 098



Пример программы для моргания светодиодами на всех выводах Атмега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);
  }
}
Go to the top of the page
 
+Quote Post
Lega
сообщение Mar 6 2007, 08:30
Сообщение #13


Участник
*

Группа: Новичок
Сообщений: 15
Регистрация: 29-01-06
Пользователь №: 13 739



Цитата(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).
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01459 секунд с 7
ELECTRONIX ©2004-2016