Цитата(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).