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

 
 
> подскажите по 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
 
Start new topic
Ответов
archi2000
сообщение Mar 5 2007, 21:20
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 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
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 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 Текстовая версия Сейчас: 25th July 2025 - 19:44
Рейтинг@Mail.ru


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