Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Снова о таймере 2 в ATmega324P
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
ivainc1789
Несколько месяцев назад я поставил Заказчику 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 заставляя синхронно тактироваться таймер от системного клока - все работает нормально...
Больше всего меня беспокоит тот факт, что устройство проработало довольно длительное время и отказало как-то ВДРУГ... Может кто что посоветует...
ILYAUL
А если проверить после инит ASSR , он (проц) случайно Exclk не выставил в 1
dimka76
для m644p такой код инициализации
Код
void Init_RTC(void)
{
    ASSR     = 0x20;    //0b00100000;    // Timer2: 1Hz async operation (OC2A)
    OCR2A     = 128-1;
    TCCR2A     = 0x02;    //0b00000010;
    TCCR2B     = 0x06;    //0b00000110;
        TIMSK2     = 0x02;        //0b00000010;    // Enable TC2.oc interrupt
}



ivainc1789
Цитата(ILYAUL @ Jul 20 2010, 12:02) *
А если проверить после инит ASSR , он (проц) случайно Exclk не выставил в 1

Вроде нет, иначе JTAG сразу бы показал. Я там все проверил, тем более в такой конфигурации устройство проработало долго. Сейчас слегка увеличил емкости кварца (до 27pF) и все заработало, хотя генерировать осциллятор начал через 1сек после подачи питания. Только... через 15 мин работы опять затык - ну не генерит и все. Шаманство вокруг кварца, его замены, замены кондеров и т. п. не помогают совершенно.
С горя начал смотреть осциллограммы на выводах меги. И тут обнаружились довольно странные вещи: уровень постоянного смещения на выводе OSC_IN может меняться по необъяснимым причинам от 0.3 до 4V. Обычно "меняется" он после перетыка питания. А вот на выводе OSC_OUT всегда примерно смещение 0.1V. Насколько я понимаю, для генерации необходимо "одинаковое" смещение на выводах....
Сколько работал в свое время с DS1307 - никогда не было проблем, а тут нате...
Код
для m644p такой код инициализации
ну то же самое, тока в профиль... Если вдруг перестанет работать, пишите ))))...
dimka76
Кондеры от часового кварца совсем уберите.
ivainc1789
Номиналы кондеров подбирал всякие, но не помогло. На грани отчаяния пошел мыть плату, использовал Fairy и хоз мыло. Сразу заработало. Платы изготовлены кустарным способом, были покрыты лаком Plastik 70. Возможно дело и в нем, хотя сложно проверить. В тестовый период все пять устройств работали хорошо, кондеры установлены не были изначально, не могу представить что могло повлиять на отказ одного устройства да еще и через два месяца...
Сегодня вечером уберу кондеры в отказавщем устройстве, посмотрим, если что, придется еще мыть, другого выхода не вижу...
ILYAUL
Цитата(ivainc1789 @ Jul 22 2010, 09:03) *
другого выхода не вижу...


Вернуться к DS1307 biggrin.gif
ivainc1789
Ну вот, все ОК. Убрал кондеры, вернулся к исходной схеме тока с помытой платой ))). Все нормально работает. А вот надолго ли, большой вопрос... А у вас плата кустарная или заказывали? Сдается мне, что в подобных схемах наличие маски играет (в долговременном плане) важную роль. Я сейчас вспомнил аналогичную ситуацию с Attiny461: пока плату не выдраил, невозможно было откалибровать ADC, работающий с дифф сигналом - сэмплы скакали как бешеные, тоже долго "вникал"...
WHALE
pcb в студию
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.