Цитата(NewMaestro @ Feb 3 2009, 12:53)

Как-то уж очень геморно.
Вы же сами просили вариант без прерываний!
Цитата(NewMaestro @ Feb 3 2009, 12:53)

А если не в майне обнулять, то где? Для того, чтобы ошибки не было нужно только там же, где приращение происходит, т.е. в прерывании.
А
на зачем ее вообще сбрасывать-то? Пущай переменная инкрементируется себе спокойно в прерывании, а вы используйте для отсчета интервалов (вам ведь интервал отмерить нужно?) локальную переменную и беззнаковую разность при проверке. Выглядеть это будет вот так.
CODE
volatile unsigned int msCounter;
void main (void)
{ unsigned int tmp1, tmp2;
(static) uinsigned int period; //static нужен, если эта или аналогичная по назначению переменная
//будет использована в любой другой функции, кроме main
...
do
{ tmp1=msCounter;
tmp2=msCounter;
} while (tmp2!=tmp1); //цикл для считывания msCounter не нужен, если прерывания еще не разрешены
period=tmp2; //делаем первую засечку для отсчета интервала
...
for (;;)
{
...
do
{ tmp1=msCounter;
tmp2=msCounter;
} while (tmp2!=tmp1); //считываем msCounter без запрета прерываний
if ((tmp2-period)>=1000) //событие наступило?
{ period=tmp2; //делаем новую временнУю засечку для отсчета нового интервала
... //обрабатываем событие по данной временнОй засечке
}
...
}
}
Тут главный нюанс состоит в том, что период переполнения msCounter должен быть
не меньше, чем максимальный требуемый вам интервал и переменная должна быть именно беззнаковая. Причем при таком способе, используя всего лишь одну переменную счетчика, можно в программе завести сколько угодно переменных для временнЫх засечек и счетчиков интервалов. При вашем же способе (сброс где-то вне прерывания) пришлось бы инкрементировать в прерывании именно столько счетчиков, сколько вам потребовалось бы временных засечек/интервалов.
Цитата(NewMaestro @ Feb 3 2009, 12:53)

A volatile - это в данном случае и не обязательно как я понимаю. volatile ведь нужно применять для переменных, которые могут быть изменены аппаратно. А тут только софтово, просто в прерывании.
Фигню вы тут написали.

Переменные
аппаратно не модифицируются. Аппаратно только какие-либо регистры периферии МК могут изменятся. Да, в зависимости от архитектуры МК для адресации они
могут быть объявлены как volatile, но квалификтор volatile при этом вовсе не обозначает, что переменная
аппаратно изменяется. Почитайте стандарт C99. Будет больше пользы, если вы сами найдете, "переварите", осознаете и запомните эту информацию.