Цитата(Sergio66 @ Jun 21 2005, 17:40)
Я два дня назад создал тему HELP MEGA8. Спасибо всем, кто откликнулся. Однако, проблема оказалась совсем не в подключении кристалла, в совершенно в другом месте! Проблема оказалась в IAR 4.10B/W32 (4.10.2.5).
Вот такой код на С:
#include <iom8.h>
int main( void )
{
long unsigned int i;
DDRB|= (1<<1);
while(1)
{
PORTB^=(1<<1);
i=0xffff;
while (i--);
}
}
все догадались, что должно произойти. Диод на PB1 должен моргать.
Однако, камень запускается раз на 4 - 5 включений питания. (Все подтянуто, все сглажено).
Этот код (в цикле который) порождает:
Код
while(1)
{
PORTB^=(1<<1);
??main_0:
E002 LDI R16, 2
B318 IN R17, 0x18
2710 EOR R17, R16
BB18 OUT 0x18, R17
i=0xffff;
while (i--);
CFFB RJMP ??main_0
}
Т.е. реально задержки, как видно, никаой нет. Просто компилятор посмотрел тут, что ничего содержательного в цикле while (i--); не делается, поэтому решил, что этот цикл надо заоптимизировать, с чем он успешно справился.

А вот если объявить i как volatile, то тогда он (компилятор) уже не будет иметь права делать какие-либо оптимизации на ее счет и получится реальный цикл:
Код
int main( void )
{
volatile unsigned int i;
DDRB|= (1<<1);
while(1)
{
PORTB^=(1<<1);
i=0xffff;
while (i--);
}
}
РЕЗУЛЬТАТ:
while(1)
{
PORTB^=(1<<1);
??main_0:
E002 LDI R16, 2
B318 IN R17, 0x18
2710 EOR R17, R16
BB18 OUT 0x18, R17
i=0xffff;
EF0F LDI R16, 255
8308 ST Y, R16
8309 STD Y+1, R16
while (i--);
??main_1:
8108 LD R16, Y
8119 LDD R17, Y+1
01C8 MOVW R25:R24, R17:R16
9701 SBIW R25:R24, 1
8388 ST Y, R24
8399 STD Y+1, R25
2B01 OR R16, R17
F7C1 BRNE ??main_1
CFF0 RJMP ??main_0
}
Как видно, цикл тут получился не в две инструкции. Т.е. если цель была сформировать задержку, то тут придется конкретно подбирать количество циклов. Сие не есть гуд и для оной цели у IAR'а есть специальная функция __delay_cycles(unsigned long), которая заставляет компилятор корректно сгенерировать задержку из указанного количества циклов.
Кстати, что за тип такой странный - long unsigned int i;?
И еще не понял, почему то запускалось, то нет. Не вижу связи с кодом. По логике оно просто должно было маслать в цикле без задержки, т.е. на ноге должны были быть переключения с периодом цикла инверсии состояния пина. Что-то там еще есть, что не попало в наше поле зрения.
«Отыщи всему начало, и ты многое поймёшь» К. Прутков