AVR. Навчальний курс

Іноді корисно мати в системі годинник, що відраховує час у секундах, та ще з високою точністю. Часто для цих цілей застосовують спеціальні мікросехми RTC (Real Time Clock) на кшталт . Ось тільки це додатковий корпус, та й стоїть вона часом як сам МК, хоча можна обійтися без неї. Тим більше, що багато МК мають вбудований блок RTC. В AVR його правда немає, але там є асинхронний таймер, який є напівфабрикатом для виготовлення годинників.

Насамперед нам потрібен годинний кварц на 32768Герц.

Чому кварц саме 32768Гц і чому його звуть вартовим? Та все дуже просто – 32768 є ступенем двійки. Два в п'ятнадцятому ступені. Тому п'ятнадцяти розрядний лічильник, що цокає із частотою 32768 Гц, буде переповнюватися раз на секунду. Це дає можливість будувати годинник на звичайній логічній розсипусі без будь-яких проблем. А в мікроконтролері AVR організувати годинник із секундами можна майже без використання мозку, на рефлексах периферії.

Асинхронний режим таймера
Пам'ятаєте, як працюють таймери? Тактова частота з основного тактового генератора (RC зовнішня чи внутрішня, зовнішній кварц чи зовнішній генератор) надходить на предделители, і з виходу предделителей вже клацає значеннями регістра TCNT. Або сигнал на вхід йде з лічильного входу Тn і також клацає регістром TCNT

Для цього на висновки TOSC2 та TOSC1 вішається кварцовий резонатор. Низькочастотний, зазвичай, це годинний кварц на 32768Гц. Він змонтований праворуч від контролера і підключається перемичками. Причому тактова частота процесора має бути вищою як мінімум у чотири рази. У нас тактова від внутрішнього генератора 8МГц, так що нас ця умова взагалі не ширяє:)

І не потрібно вираховувати кількість тактів основного кварцу, а якщо його немає, то морочитися на плаваючу частоту вбудованого RC генератора. Часовий кварц має набагато компактніші розміри ніж звичайний кварц, та й коштує дешевше.


Також важливим є той факт, що асинхронний таймер може цокати сам по собі, від годинникового кварцу, адже тактова частота процесора йому не потрібна, а це означає тактування ядра контролера (найжорсткіше, що у нього є) можна відключити, загнавши процесор у сплячку, суттєво знизивши споживання енергії та прокидаючись лише після переповнення таймера (1-2 рази на секунду), щоб записати нові показання часу.

Конфігурування
Для включення треба лише встановити біт AS2 регістру ASSR — і все, таймер працює в асинхронному режимі. Але є тут одна фіча, яка мені коштувала багато голівняків свого часу. Справа в тому, що при роботі від свого кварцу всі внутрішні регістри таймера починають синхронізуватися за своїм кварцом. А він повільний і основна програма може змінювати вже введене значення набагато швидше, ніж воно обробиться таймером.

Тобто, наприклад, передустановив ти значення TCNT2, таймер на своїй 32кгц молотарці його ще навіть прожувати не встиг, а твій алгоритм уже пробіг і знову туди щось записав - в результаті в TCNT2 напевно потрапить сміття. Щоб цього не сталося, запис буферизується. Тобто. це ти думаєш, що записав дані в TCNT2, але насправді вони потрапляють у тимчасовий регістр і в рахунковий попадуть лише через три такти повільного генератора.

Також буферизується регістри порівняння OCR2 та регістр конфігурації TCCR2

Як дізнатися дані вже внеслися до таймера або висять у проміжних осередках? Так дуже просто - по прапорах у регістрі ASSR. Це біти TCN2UB, OCR2UB та TCR2UB – кожен відповідає за свій регістр. Коли ми, наприклад, записуємо значення в TCNT2, то TCNUB стає 1, а як тільки наше число з проміжного регістру таки перейшло в реальний рахунковий регістр TCNT2 і почало вже цокати, цей прапор автоматично скидається.

Таким чином, в асинхронному режимі, при записі в регістри TCNT2, OCR2 і TCCR2 спочатку потрібно перевіряти прапори TCN2UB, OCR2UB і TCR2UB і запис проводити тільки якщо вони дорівнюють нулю. Інакше результат може бути непередбачуваним.

Так, ще один важливий момент – при перемиканнях між синхронним та асинхронним режимом значення в рахунковому регістрі TCNT може побитися. Так що для надійності перемикаємося так:

  • Забороняємо переривання від цього таймера
  • Перемикаємось у потрібний режим (синхронний або асинхронний)
  • Наново налаштовуємо таймер як нам потрібно. Тобто. виставляємо попереднє встановлення TCNT2 якщо треба, заново налаштовуємо TCCR2
  • Якщо переключаємося в асинхронний режим, то чекаємо поки всі прапори TCN2UB, OCR2UB і TCR2UB будуть скинуті. Тобто. налаштування застосовувалися та готові до роботи.
  • Скидаємо прапори переривань таймера/лічильника. Т.к. при всіх цих пертурбаціях вони можуть випадково встановити
  • Дозволяємо переривання від цього таймера

Недотримання цієї послідовності веде до непередбачуваних глюків, які важко виявляти.

Спальні режими та асинхронний таймер
Т.к. асинхронний таймер часто використовується в різних режимах, що зберігають, то тут виникає одна особливість, що розкладає ціле поле з граблів.

Суть у тому, що таймер, що працює від повільного кварцу, не встигає за головним процесором, а в тому дофіга залежностей від периферії – ті ж переривання, наприклад. І коли відсоток спить, то ці залежності не можуть реалізуватися, в результаті виникають глюки на кшталт непрацюючих переривань або пошкоджених значень у регістрах. Так що логіка роботи з асинхронним таймером і режимом сну повинна бути побудована таким чином, щоб між пробудженням і свалюванням в сплячку асинхронний таймер встиг відпрацювати кілька своїх тактів і виконав всі свої справи.

Приклади:
Контролер використовує режим енергозбереження та відключення ядра, а прокидається по перериванням від асинхронного таймера. Тут треба враховувати той факт, що якщо ми змінюватимемо значення регістрів TCNT2, OCR2 і TCCR2, то догляд у сплячку потрібно робити ТІЛЬКИ після того, як прапори TCN2UB, OCR2UB і TCR2UB впадуть. Інакше вийде така лажа — асинхронний таймер ще не встиг забрати дані з проміжних регістрів (він же повільний, у сотні разів повільніший за ядро), а ядро ​​вже відрубалося. І добре б нова конфігурація не застосувалася, це нісенітниця.

Найгірше те, що на час модифікацій регістрів TCNT або OCR блокується робота блоку порівняння, а значить, якщо ядро ​​засне раніше, то блок порівняння так і не запуститься — нікому його включити буде. І в нас пропаде переривання порівняно. Що незряче тим, що подію ми прошляпимо і будемо їх втрачати до наступного пробудження зі сплячки.
А якщо контролер буде перериванням порівняно? То він засне остаточно. Опаньки!
От і лови такий глюк потім.

Так що перед відходом у режими енергозбереження треба обов'язково дати асинхронному таймеру прожувати введені значення (якщо вони були введені) та дочекатися обнулення прапорів.

Ще один прикол з асинхронним режимом та енергозбереженням полягає в тому, що підсистема переривань при виході зі сплячки стартує за 1 такт повільного генератора. Тож навіть якщо ми нічого не міняли, то назад у сплячку звалюватися не можна – не прокинемося, т.к. переривання не встигнуть запуститися.

Отже вихід із сплячки та засинання по перериванню асинхронного таймера має бути в такому вигляді:

  • Прокинулися
  • Щось зробили потрібне
  • Заснули

І тривалість операції між прокинулися і заснули НЕ ПОВИННА БУТИ МЕНШЕ ніж один тик асинхронного таймера. Інакше анабіоз буде вічним. Можеш delay поставити, а можеш зробити як даташит радить:

  • Прокинулися
  • Щось зробили потрібне
  • Заради приколу записали щось у будь-який з регістрів, що буфферизуються. Наприклад, у TCNT було 1, а ми ще раз 1 записали. Нічого не змінилося, але відбувся запис, піднявся прапор TCN2UB, який протримається гарантовано три такти повільного генератора.
  • Зачекали, поки прапор впаде
  • Заснули.

Також не рекомендується при виході зі сплячки відразу читати значення TCNT - можна вважати лажу. Краще почекати один тик асинхронного таймера. Або зробити прикол із записом у регістр та очікуванням поки прапор спаде, як було написано вище.

Ну і останній, але важливий момент - після подачі харчування, або виходу з глибокої сплячки, з відключенням не тільки ядра, а взагалі всієї периферії, користуватися повільним генератором настійно рекомендується не раніше ніж через 1 секунду(Не мілісекунду, а ціла секунда!). Інакше генератор може бути нестабільним і в регістрах буде ще каша і сміття.

І, на завершення статті, невеликий приклад. Запуск асинхронного таймера Atmega16 (Як полігон використовується плата )

Проект типовий, на базі диспетчера, одна лише відмінність - диспечтер перекинутий на таймер0, щоб звільнити таймер2.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 int main (void) (InitAll (); // Ініціалізуємо периферію InitRTOS(); // Ініціалізуємо ядро RunRTOS() ; // Старт ядра. UDR = "R"; // Маркер старту, для налагодження SetTimerTask(InitASS_Timer, 1000);// Оскільки таймер в асинхронному режимі // запускається повільно, робимо // Витримку запуску ініціалізації таймера. while (1 ) // Головний цикл диспетчера(wdt_reset(); // Скидання собачого таймера TaskManager() ;

// Виклик диспетчера

Сама процедура ініціалізації таймера в асинхронному режимі зроблена у вигляді кінцевого автомата. При першому запуску вона зводить біт асинхронного режиму і робить приготування, потім запускає сама себе знову ж таки, через диспетчер, щоб дати можливість ще чомусь або проскочити в черзі, не блокуючи систему на очікування.

При наступних входах перевіряються прапорні біти готовності регістрів таймера. Якщо вони всі по нулях, то ми про всяк випадок занулюємо прапори переривання таймера, щоб не було глюків і помилкових спрацьовувань, а потім дозволяємо потрібне переривання. І виходимо.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 void InitASS_Timer(void ) ( if (ASSR & (1<< AS2) ) //Якщо це другий вхід( if (ASSR & (1<< TCN2UB | 1 << OCR2UB | TCR2UB) ) // перевіряємо чи є хоч один біт прапорний(SetTask(InitASS_Timer); // Якщо є, то відправляємо на повторний цикл очікування) else // Якщо все чисто, то можна запускати переривання(TIFR |= 1<< OCF2 | 1 << TOV2; // Скидаємо прапори переривань, про всяк випадок. TIMSK | = 1<< TOIE2; // Дозволяємо переривання з переповнення return;<< OCIE2 | 1 << TOIE2) ; ) ) TIMSK &= ~(1// Забороняємо переривання таймера 2<< AS2; ASSR = 1// Включаємо асинхронний режим<< CS20; TCNT2 = 0; TCCR2 = 5// Предділник на 128 на 32768 дасть 256 тиків на секунду // Що дасть 1 переривання по переповненню за секунду. }

SetTask(InitASS_Timer);<

// Проганяємо через диспетчер, щоб зайти знову.

void InitASS_Timer(void) ( if(ASSR & (1

ISR(TIMER2_OVF_vect) // Переривання з переповнення таймера 2 ( UDR = i; i++; )
Можна було зробити змінні годинники:хвилини:секунди і клацати цими змінними з усією їх логікою переповнення годин/хвилин, але мені було ліньки. І все зрозуміло.

У цьому маленькому есе з фотографіями, я покажу широкому загалу, як лікувати «болячку» цифрового електронного годинника, що досить часто зустрічається, - неточний хід. Годинник може відставати або поспішати і найчастіше на невеликі похибки ходу ми не звертаємо уваги, але коли годинник відстає на 5 (п'ять) хвилин на добу, це починає дратувати.

Чи готові? Поїхали!



Інтро

Цей годинник я купив для того, щоб поностальгувати за старими радянськими часами, коли і сонце було зеленіше і трава яскравіша… чи навпаки?.. неважливо! Головне, що радості не вийшло – годинник гидко відставав. Більш ніж на 5 хвилин на добу. Потрібно лікувати, подумав я.:

Обов'язково
+ паяльник. бажано не сильно потужний, 25-40 Вт цілком достатньо. 60 вже буде забагато.
+ кварцовий резонатор на заміну. продається або в Китаї або в будь-якому радіомагазині. коштує недорого, називається "годинний кварц".
+ тонка хрестова (phillips) викрутка або тонка плоска викрутка. хрестова краще.

Бажано
+ пінцет з гострими губками - забирати шурупчики (дада, корпус пластиковий, рама теж пластикова. скрізь шурупи)
+ хороше освітлення та стаціонарне збільшувальне скло або окуляри ювеліра/годинника, щоб добре бачити Червону Шапочку годинник.

Розбираємо годинник

Розкручуємо чотири шурупи, що тримають задню кришку. Акуратно знімаємо кришку, знімаємо п'єзоелектричний резонатор (піщалку). Пальцями пищалку не лапаємо, тримаємо за бічні грані та за металеву основу.


Зазначаємо, що захисної прокладки в годиннику немає, отже всередину годинника потраплятиме вода і піт. Розуміємо, що китайці заради дешевизни заощаджують взагалі на всьому, значить і скло швидше за все сидить на двосторонньому скотчі та кнопки без гумових сальників. Значить, годинник треба буде знімати у негоду та під час фізичної роботи.

Виймаємо годинник із корпусу.


Корпус, задню кришку, шурупчики задньої кришки та пищалку прибираємо убік.

Викручуємо чотири шурупи – три тримають літієву батарейку 2016, один тримає лапку-пружину для подачі сигналу на пищалку.


Забираємо це все убік. Розглядаємо платню. Більше шурупчиків не видно, це добре.

Акуратно пінцетом знімаємо плату із пластикової обойми.


Усередині обойми ми бачимо струмопровідну гумку, яка передає сигнал на РКІ та власне сам РК індикатор.
Гумку пальцями не чіпаємо, бо нефіг. Потрапить смітник або бруд, відвалиться якийсь сегмент на індикаторі і знову розбирати… нафіг треба…
У синій термоусадці - котушка, яка дає звук. Торкати її теж не треба. пошкодити простіше простого, проводки там тонші за волосся.
А ось металевий циліндр на ніжках і є наш кварцовий резонатор, який треба міняти.

Для заміни кварцу я вирішив використати донорський кварц зі старої материнської плати, яка здохла років десять тому і я її потихеньку розтягую на дрібну комплектуху.


Кварц тут трохи більшого розміру, ніж у годиннику.
Ось для порівняння вже випаяний кварц із материнки та годинна плата.


Прикладаємо кварц до плати. Підходить. вкладаємо кварц в обойму, теж підходить! Чудово! Змінюємо!

Для заміни просто випаюємо один кварц і впаюємо інший.
Полярності немає, жодних особливостей немає. Процедура проста і вимагає особливої ​​кваліфікації.


Вуаль! кварц замінено. Вирівнюємо корпус кварцу, щоб він був трохи нижчим від плати і не торкався батарейки.

Зворотне складання

Збираємо механізм у зворотній послідовності – плату ставимо на обойму, там є напрямні штирі. На платню ставимо батарейку, мінусом вниз.


Надягаємо зверху на батарейку контактний блок. У цьому годиннику він одночасно і батарейку тримає і є контактною групою для кнопок. Прикручуємо трьома шурупами. Потім окремий контакт на пищалку. Теж прикручуємо.

Перевертаємо блок і дивимося - годинник повинен запуститися. Якщо цього не сталося, значить чи перевернута батарейка чи не впаяний кварц, чи він неробочий, чи статикою вбило плату:)
Ну а якщо все запрацювало, акуратно ставимо плату в корпус годинника, центруємо її так, щоб цифри були паралельно краю, потім встановлюємо пищалку назад, прикручуємо кришку.

Ну от і все!
Ми перемогли велику проблему)))

За добу годинник не пішов ні вперед ні назад, іде рівно і точно. Понаблюдаю ще й потім відпишуся щодо точності.

Треба сказати, що процедура заміни кварцу однакова для всіх кварцових годинників - цифрових, стрілочних. Але, треба пам'ятати, більшість китайських кварцових годинників зібрані на пластикових заклепках, які розплавлені «грибочками», тобто. Власне, розібравши годинник, зібрати їх дуже проблемно.
Ну і розмір кварцу також має значення - якби кварц з душі не підійшов би за розміром, то довелося б шукати інший, меншого розміру.

За рамками цієї «мурзилки» залишилася плівка, яку китайці не зняли з РКІ, коли ставили його в обойму. Я цю плівку прибрав і контрастність екрану трохи збільшилася. Плівку майже не видно, але на моїй годині вона була.

UPD .
За минулі чотири доби, з моменту заміни кварцу, годинник втік уперед на дві секунди. 15 секунд на місяць.
Для копійчаного годинника та безкоштовного кварцу, вважаю результат задовільним. Особисто мене він цілком задовольняє)))
Можна, звичайно, пошукати на барахолках кварцовий годинник за копійки, надірвати звідти купу кварців і експериментувати з точністю… але це залишимо перфекціоністам і упораним фрикам)))

У коментарях наведена рецептура більш тонкого підстроювання точності, шляхом впаювання мініатюрних керамічних конденсаторів. Як альтернатива заміні кварцу - цілком життєздатно та здорово. Головне щоб було місце, куди ці конденсатори розмістити. Ну і наявність цих ...

І взагалі, друзі, головне не огляд, головне коментарі)))
Дякую всім, за цінні ідеї та різні дискусії)))

Планую купити +16 Додати в обране Огляд сподобався +91 +166

Здавалося б, банальна справа, запустити годинниковий кварц. Які можуть бути проблеми? Є мікроконтролер та дві його ніжки, які спеціально призначені для підключення кварцу. Є вартовий кварц. Припаяти кварц – справа двох секунд. Ще хвилина потрібна для того, щоб додати кілька рядків ініціалізації таймера до програми. Ось начебто і все. АЛЕ, після того як я три дні запускав цей довбаний годинниковий кварц, я зрозумів, що питання не таке просте, як я думав.

А передісторія була такою.Друг попросив мене зробити йому простий годинник, без наворотів, на 7-сегментних індикаторах. Пльова справа. Мікроконтролер був узятий ATmega48 (уміє працювати з годинниковим кварцом), швиденько написана програма, витрачено друк. Після складання годинника та налагодження програми (динамічна індикація, кнопки тощо) дійшла черга до годинникового кварцу. До цих годин я вже пару разів застосовував годинниковий кварц у своїх проектах і нічого не віщувало біди:), але трапилося непередбачене - годинниковий кварц навідріз відмовився запускатися. Взагалі!
У спробах розібратися, що заважає заробити моєму годинниковому кварцу я насамперед звернувся до даташита на мікроконтролер (ATmega48). Інформації щодо асинхронного режиму та підключення таймера там виявилося дуже мало. Далі я почав шукати вирішення проблеми на форумах. Ось тут була різноманітність рішень і порад аж до ритуальних танців із бубнами, що теж не надто мені допомогло. Довелося шляхом спроб і помилок (не плутати з «методом тику»!) самому розбиратися, що до чого. В результаті героїчних потуг, наступу на які можна граблі і вбитих трьох днів, народився практичний досвід підключення годинникового кварцу, з яким я тут і поділюся.

Отже, які граблі на нас чекають при запуску годинникового кварцу?

1 Схемотехніка.
1.1 Конденсатори.
У датасіті на мікроконтролер досить широке згадується те, що до вартового кварцу повинні бути підключені конденсатори, а про їхню ємність взагалі дізнатися важко. Часовий кварц, швидше за все, запрацює і без конденсаторів, але краще їх поставити, це покращить стабільність частоти і допоможе кварцю швидше запускатися.
Місткість конденсаторів повинна бути в межах 12-22 пФ.

1.2 Розведення доріжок під кварц.
Тут даташит та апноти дають нам чіткі вказівки. Доріжки від ніжок мікроконтролера до кварцу мають бути мінімальної довжини, земляна доріжка для конденсаторів повинна бути окремою, тобто через неї не повинні протікати сторонні струми (особливо це стосується сильноточних та високочастотних ланцюгів).

1.3 Корпус вартового кварцу.
Залізний корпус годинникового кварцу обов'язково припаяєте до землі (до якої припаяні конденсатори). Незаземлений корпус працюватиме як антена, вносячи спотворення в роботу кварцу, що погіршує точність ходу Вашого годинника.

1.4 Бруд на платі.
Вартовий кварц досить ніжна штука і опору в пару мегаом між ніжками цілком вистачить для його зупинки. Як показала практика, рідкий флюс, якщо його погано змити, дає достатній опір, щоб кварц не працював. Після паяння ретельно вимийте плату. Дуже часто у флюсах міститься кислота, що дає провідність між ніжками. Для нейтралізації кислоти промийте плату слабким розчином соди (харчової) та ретельно відмийте чистою водою.

2 Програмування.
2.1 Ініціалізація асинхронного таймера.

Для того, щоб таймер працював від годинникового кварцу, його (таймер) необхідно перевести в асинхронний режим. Для переведення таймера (майже у всіх мікроконтролерів це таймер 2) у цей режим потрібно записати 1 в біт AS2. Але не все так просто, потрібно дотриматись певного алгоритму запуску. За датаситом процедура включення асинхронного режиму для таймера 2 наступна:
1. Заборонити переривання від таймера/лічильника 2 - OCIE2x, TOIE2;
2. Переключити його на асинхронний режим 1 -> AS2;
3. Записати нові значення в регістри TCNT2, OCR2x та TCCR2x;
4. Дочекатися скидання прапорів TCN2UB, OCR2xUB та TCR2xUB;
5. Скинути прапори переривань таймера/лічильника 2;
6. Дозволити переривання (якщо потрібно).

Обов'язково дотримуйтесь такої послідовності. Ось список правильної ініціалізації асинхронного режиму таймера2.

/* забороняємо переривання */ cli(); /* 1. Забороняємо переривання Timer/Counter2 обнуляючи OCIE2х та TOIE2. */ TIMSK2 &= ~((1<< OCIE2A) | (1 << OCIE2B) | (1 << TOIE2) ) ; /* 2. Переводимо Timer/Counter2 в асинхронний режим, встановлюючи AS2. */ ASSR = (1<< AS2) ; /* Даємо трохи часу для стабілізації роботи генератора (можна опустити). */ _delay_ms(1000); /* 3. Записуємо нові значення TCNT2, OCR2x та TCCR2B. */ TCNT2 = 0; /* встановлюємо розподільник = 128 32.768 kHz / 128 / 256 = переповнення раз на секунду. */ TCCR2B |= (1<< CS22) | (1 << CS20) ; /* 4. Щоб бути впевненим, що годинник заробив чекаємо поки обнуляться біти: TCN2UB, OCR2AUB, OCR2BUB, TCR2AUB і TCR2BUB. */ while (ASSR & 0x1F); /* 5. Обнулюємо прапори переривань Timer/Counter2. */ TIFR2 |= ((1<< OCF2A) | (1 << OCF2B) | (1 << TOV2) ) ; /* 6. Дозволяємо переривання з переповнення таймера 2 */ TIMSK2 | = (1<< TOIE2) ; /* дозволяємо переривання */ sei();

/* забороняємо переривання */ cli();<

/* 1. Забороняємо переривання Timer/Counter2 обнуляючи OCIE2х та TOIE2. */ TIMSK2 &= ~((1
2.2 Графік таймера 2.

Для того, щоб переривання по переповненню таймера2 відбувалися раз на секунду, значення визначника повинно бути 128.
2.3 Робота годинника в режимі сну PowerSave.

Дуже привабливо в паузах між секундними перериваннями переводити мікроконтролер в режим сну, в цьому випадку струм мікроконтролера впаде до 6-7мкА. Для такого випадку є режим зниженого споживання PowerSave, у ньому таймер2 продовжує працювати від годинникового кварцу і пробуджує мікроконтролер перериванням. Алгоритм такого режиму роботи простий, після виходу з режиму сну за перериванням від таймера в процедурі обробки переривання «тикаємо» годинами, виходимо з переривання і знову даємо команду заснути (SLEEP). Ось тут є важливий нюанс. Знову дивимося даташит на мікроконтролер у розділі режимів зниженого споживання та роботи асинхронного режиму. Для того щоб таймер після пробудження почав нормально функціонувати і був здатний вивести мікроконтролер зі сну, при наступному перериванні потрібно до команди засинання почекати певний час. Для того, щоб переконатися в тому, що генератор працює нормально, потрібно зробити запис у будь-який регістр таймера, з тих, які не порушать роботу годинника (наприклад у OCR2x) і дочекатися скидання прапорів готовності даного регістру (OCR2xUB). Після того, як прапор скинувся, можна сміливо переводити мікроконтролер у режим сну.<

/* Точка виходу з переривання по переповненню таймера2 */ /* Записуємо будь-яке значення OCR2A. */ OCR2A = 0;
/* Чекаємо поки обнуляться OCR2AUB. */ while(ASSR & (1 3 Різне.

3.1 Не використовуйте дешеві китайські кварці(Особливо випаяні зі старих зламаних копійчаних годин). Навіть якщо вони й запрацюють, точність у них не буде.

3.2 Ну і насамкінець


, майте під рукою кілька різних кварців, можливо, Ваш кварц не запускається через те, що він спалений. Спробуйте замінити його.