SeregaT писал(а):...Разве массив не должен быть внутри главного цикла?
Объявление переменной и присвоение ей значения - это разные вещи. Но при объявлении переменной можно заоодно присвоить ей значение.
unsigned char i; // это объявление
т.е. Вы говорите компилятору, что собираетесь использовать переменную размером в один байт, и что он должен воспринимать как беззнаковую.
unsigned char i = 123; // это тоже объявление, но с присвоением значения.
i = 234; // а вот это присвоение значения и ничего больше.
Очевидно, что объявить переменную можно только один раз. Поэтому объявление массива в цикле - это порнография.
Текст Вашей программы это набор инструкций для компилятора. В том числе, компилятору надо сказать, из каких программных модулей будет состоять Ваша программа. В ней должен быть главный программный модуль:
void main(void)
{
...
}
Могут быть программные модули - функции:
void myFunction(void)
{
.....
}
Могут быть обработчики прерываний:
// обработчик прерывания по переполнению таймера
interrupt [4] void timer_overflow(void)
{
.....
}
Объявление переменных можно делать как внутри этих модулей, так и вне их. Если переменную объявить внутри, то она будет "видна" только внутри своего модуля. Такие переменные называются локальными. Если программа по ходу дела зарулит в другой модуль, то она "забудет" локальную переменную из предыдущего модуля.
Если переменная объявлена вне программного модуля, то она будет "видна" из всех модулей. Такие переменные называются глобальными.
А вот присвоение значений переменным можно делать только внутри этих программных модулей. То же самое для операций ввода-вывода.
SeregaT писал(а):...Походу запарка вот с этими строчками:
//PORTD=0x00;
//DDRD=0xFF;
Ну ещё бы. Вы пытаетесь что-то делать - присваивать значения ВНЕ программного модуля. Надо сунуть эти строчки внутрь void main(void) и будет Вам счастье...