Несколько месяцев назад я поставил Заказчику 5 устройств с батарейным питанием, построенных на ATmega324P. На таймере 2, работающем асинхронно реализованы часы. Сегодня вернули одно устройство с диагнозом - не работает. Разбор полетов показал, что по необъяснимым причинам таймер 2 перестал генерить. Т.е. два месяца устройство (и конкретно часы) работало нормально, но в один прекрасный день перестало. Функционально в программе необходимо было сделать, что если часы не работают, то это фатальный отказ.
Итак, я начал пытаться "оживлять" таймер 2. Пломбы на устройстве повреждены не были, вмешательство извне исключаю полностью. Осмотр платы в области часового кварца ничего не показал - чистая плата, какой и была изначально. Подумал, что программно имеем некую "хитрожопую" ошибку. После многочасовых экспериментов с софтом, решил вообще написать простейшую тестовую программу:
Код
__C_task void main(void){
SETUP(LED1,OUT1);SETUP(LED2,OUT1);// светодиоды включить
Delay(1000*ms);
SETUP(LED1,OUT0);SETUP(LED2,OUT0);// светодиоды отключить
// таймер2
ASSR = BIN(00100000);
TCCR2A = BIN(00000000);
TCCR2B = BIN(00000000);
TCNT2 = 0;
OCR2A = 32; // индикатор секунды
OCR2B = 4; // индикатор 125ms
TIMSK2 = BIN(00000001);
TIFR2 = BIN(00000111);
//while(ASSR & 0x1F);// ожидать окончания инициализации
// главный цикл
__enable_interrupt();
TCCR2B |= 0x01; // старт таймера2, предделитель 1024 (0x07)
SETPORT(LED1); // включить светодиод
while(1);
}
// тест работы таймера
#pragma vector = TIMER2_OVF_vect
__interrupt void TIMER2_OVF(void) {
TGLPORT(LED2);// переключить светодиод
}
Тут есть несколько "лишних" строчек, но непринципиально. Суть, думаю, ясна. Включение первого светодиода свидетельствует о том, что таймер инициализирован и запущен главный цикл. Переключения второго светодиода говорят о том, что таймер 2 работает.
Макросы работы с портами не привожу, т. к. они тривиальны.
Касание выводов кварца приводит к хаотичному зажигаю/погасанию светодиода2. Но и только.
Попытался заменить ATmega324P - результат тот же - не работает. Пробовал все кварцы (часовые) что были под рукой с разной емкостью - без результатно. Если сбросить при отладке через JTAG бит AS2 заставляя синхронно тактироваться таймер от системного клока - все работает нормально...
Больше всего меня беспокоит тот факт, что устройство проработало довольно длительное время и отказало как-то ВДРУГ... Может кто что посоветует...