Цитата(xemul @ Jun 8 2011, 17:21)

signed ?
Да. Уж не помню из каких соображений. Девайс работает с компом, считает unix time, а оно знаковое, потому сделал так же. Но до 2038 года это не принципиально

Цитата(xemul @ Jun 8 2011, 17:21)

Беда.
Почему? Насчет "длительных интервалов" я несколько утрировал - это десятки, максимум сотни микросекунд, прерывания запрещаются на время действий с многобайтовыми volatile переменными (к примеру, с тем же временем), так что прерывание пропущено не будет, просто отработает с некоторой задержкой.
Цитата(xemul @ Jun 8 2011, 17:21)

если инкремент от внешнего кварца TMR1 придётся на незавершённую запись в TMR1 (н-р, от "TMR1H |= 0x80;"), то он будет пропущен.
Насколько я понял, в еррате сказано, что инкремент будет пропущен, если запись в TMR1 произвести как бы во время низкого уровня тактового сигнала, - то есть, если первый фронт тактового сигнала после события записи - положительный. Чтобы этого не происходило, они и рекомендуют дождаться инкремента, (он идет по положительному фронту), и немедленно делать запись в таймер. По моим подсчетам, на это есть примерно 15 мкс или чуть меньше. При системной тактовой 4 МГц на установку бита в TMR1H уйдет микросекунда, ну плюс еще парочка на "детектирование момента", то есть, по идее времени достаточно, чтобы первый фронт после записи был отрицательным, так? Зачем остальные телодвижения? Единственное мое предположение - для медленного системного такта (если, к примеру используется LP генератор?)
Цитата(xemul @ Jun 8 2011, 17:21)

А если наоборот, то не сможет корректно выполниться "TMR1H |= 0x80;".
При тактировании таймера от системного клока такого гарантированно не случится.
Немного не понял, что значит "наоборот"?
Цитата(xemul @ Jun 8 2011, 17:21)

Если Вы не укладываете контроллер в спячку, то проще сделать T1SYNC = 0. Тогда, скорее всего, будет достаточно Вашего исходного кода.
Спячка как раз-таки используется, причем 99.9% времени, так что синхронный режим не катит...