Цитата(ZLOI @ Apr 30 2008, 15:49)

Знаю. Проблем со "сделать" нет. Не хочется быть умным программистом, который тупым кодом делает гениальные вещи. Хочется делать красиво. Вот Вы мне скажете. Я посмотрю и подумаю: "Ёлки палки, да ведь здесь же надо в таком направлении двигаться, такие книжки читать и т.д.".
Если у вас уже есть таймерное прерывание, то в нем просто инкрементируйте какую-либо беззнаковую переменную на величину тика таймера, выраженную, например, в миллисекундах.
Код
#define TICK_TIMER 10UL // тик таймера 10 мс
volatile unsigned long time;
void interrupt Times(void)
{
time+=TICK_TIMER;
...
}
Переменная
time "тикает" себе в фоне потихоньку.
Когда вам нужно сделать задержку в main-е, то делаете такую конструкцию
Код
void main (void)
{ unsigned long tmpTime1, tmpTime2;
...
_disable_interrupt();
tmpTime1=time;
_enable_interrupt();
do
{ _disable_interrupt();
tmpTime2=time;
_enable_interrupt();
} while ((tmpTime2-tmpTime1)<1000UL); //задержка на 1000мс=1с
...
}
Запрет прерываний перед считыванием переменной
time требуется только, если другим образом нельзя обеспечить атомарность операции ее чтения. Например, когда вы пытаетесь на 8-ми битном MCU оперировать 32-х битными переменными. Все используемые в примере переменные должны быть беззнаковыми. Переменная
time обязательно должна иметь квалификатор
volatile. При исчислении в миллисекундах 32-х разрядной переменной хватает для измерения интервалов времени длительностью свыше 1,5 месяца.
P.S.
Для выполнения каких-либо действий по отметкам времени можно поступать аналогично.
Код
void main (void)
{ unsigned long tmpTime1, tmpTime2;
...
_disable_interrupt();
tmpTime2=time;
_enable_interrupt();
if ((tmpTime2-tmpTime1)>=1000UL) // прошло больше 1000мс?
{ funcDo1sPeriod(); // да, вызываем функцию
_disable_interrupt();
tmpTime1=time; // обновляем значение переменной заданного интервала
_enable_interrupt();
}
...
}
Еще раз обращаю внимание, что переменные должны быть беззнаковыми. В этом случае корректно обрабатывается ситуация переполнения их максимального значения при сравнении этих чисел.