Цитата(konstatinopol @ Jan 31 2009, 18:01)

Анатолий нащёт того чтобы обьявить cntr в SIGNAL(SIG_OVERFLOW0) точно я незнаю, но мы всегда её обьвляли до main(). Возможно и грамотнее но мы задаём ей значение в main() равное 28.
Ваш пример:
CODE
short cntr = 0;
int main()
{
...
cntr = 28;
...
}
SIGNAL(SIG_OVERFLOW0){
if(!(cntr--))
{
TCNT0=244;
cntr=28;
if(a==0)
lampochki();
}
}
Чем это плохо:
1. Объявление, инициализация и использование разнесены далеко по тексту
программы. Это ухудшает сопровождение программы. В С нет необходимости
инициализировать нулем глобальные переменные, по стандарту это сделает
компилятор. То есть можно просто написать "short cntr;" и в cntr будет 0 перед
входом в main.
Также Вы можете инициализировать глобальные переменные при объявлении любым
значением:
CODE
short cntr = 28;
SIGNAL(SIG_OVERFLOW0){
if(!(cntr--))
{
TCNT0=244;
cntr=28;
if(a==0)
lampochki();
}
}
2. Представьте что ваш проект будет увеличиваться и вам потребуется второй
таймер пишем:
CODE
short cntr;
... много текста ....
short cntr; // добавляем
int main()
{
...
cntr = 28;
... много текста ....
cntr = 144; // добавляем
...
}
SIGNAL(SIG_OVERFLOW0){
if(!(cntr--))
{
TCNT0=244;
cntr=28;
if(a==0)
lampochki();
}
}
SIGNAL(SIG_OVERFLOW1){
if(!(cntr--))
{
TCNT0=244;
cntr=144;
if(a==0)
lampochki();
}
}
Но это неправильно, cntr будет изменяться сразу из двух обработчиков
прерываний, и придется переименовывать cntr в cntr_for_timer0 и добавлять
cntr_for_timer1. Для экономии своего времени на отладке проекта и
придумывании/написании имен переменых проще объявить cntr локальными
статическими переменными:
CODE
SIGNAL(SIG_OVERFLOW0){
static short cntr = 28;
if(!(cntr--))
{
TCNT0=244;
cntr=28;
if(a==0)
lampochki();
}
}
SIGNAL(SIG_OVERFLOW1){
static short cntr = 244;
if(!(cntr--))
{
TCNT0=244;
cntr=144;
if(a==0)
lampochki();
}
}
Здесь объявление, инициализация и использование находятся рядом, что
упрощает понимание и изменение кода. Этот код более безопасный, локальные
перемене cntr видны только внутри своих обработчиков SIGNAL(SIG_OVERFLOW0)
и SIGNAL(SIG_OVERFLOW1) и не могут быть изменены из других частей программы.
PS: Что означает static и чем локальная статическая переменная отличается от не статической прочтите в любой книге по языку С.
Анатолий.
Цитата(rvk @ Jan 31 2009, 18:44)

Про задержку верно, только вместо 10000 поставить 100, этого должно с запасом хватить.
Время исполнения:
for(i = 0; i < 10000; i++);
или:
for(i = 0; i < 100; i++);
и даже:
for(i = 0; i < 10; i++);
На любом опримизирующем компиляторе одиноково и равно нулю.
Анатолий.