052-Как запустить неработающий часовой кварц (32768 Гц).

Автор: | 09.09.2010

Титл
Казалось-бы, банальное дело, запустить часовой кварц. Какие могут быть проблемы? Есть микроконтроллер и две его ножки, которые специально предназначены для подключения кварца. Есть часовой кварц. Припаять кварц – дело двух секунд. Еще минута нужна для того, чтобы добавить пару строк инициализации таймера в программу. Вот вроде и все. НО, после того как я три дня запускал этот долбанный часовой кварц, я понял, что вопрос не так прост, как я думал.

А предыстория была такой. Друг попросил меня сделать ему простые часики, без наворотов, на 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, and 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();

2.2 Пределитель таймера 2.
Для того, чтобы прерывания по переполнению таймера2 происходили раз в секунду, значение пределителя должно быть 128. (128пределитель*256переполнение=32768частота кварца).

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

     /* Точка выхода с прерывания по переполнению таймера2 */
 
     /* Записываем любое значения в OCR2A. */
  OCR2A = 0;
 
     /* Дожидаемся пока обнулится OCR2AUB.  */
  while(ASSR & (1<<OCR2AUB));
 
     /* Дальше можем спокойно засыпать */

3 Разное.
3.1 Не используйте дешевые китайские кварцы (в особенности выпаянные со старых сломанных копеечных часов). Даже если они и заработают, точность у них будет никакая.

3.2 Ну и напоследок, имейте под рукой несколько разных кварцев, возможно, Ваш кварц не запускается по причине того, что он спален. Попробуйте его заменить.

Вот, вроде, и все грабли, по которым я потоптался, пока запускал часовой кварц. Или еще что-то добавить?


(Visited 14 361 times, 1 visits today)

052-Как запустить неработающий часовой кварц (32768 Гц).: 31 комментарий

  1. Слава

    Поделюсь своим опытом.
    ATMega48PA и часовой кварц 32768. Отладочная плата Pinboard II (не реклама).
    Стоит только прошить фьюзы на Low Frequency Crystal Oscillator (CKSEL3…0=0101, SUT1…0=10), как сразу же после этого не удаётся соединиться программатором с контроллером, т.е. на низкой частоте нет связи.
    Как я это решал? Доктором привожу контроллер к заводским настройкам, перетыкаю контроллер в отладочную плату, прошиваю прошивку, и последним действием прошиваю нужные мне фьюзы для 32768.
    Для перепрошивки контроллер опять необходимо пихать в доктора. Та же ситуация при внутренней генерации от 128кГц.
    Есть выход проще? Что я делаю не так?
    Шью через SinaProg, выбираю разные скорости — бесполезно.

  2. Ден

    Спасибо за статью, получилось загнать ATmega8 в спячку. Вопрос: а на чем должен тактироваться камушек в рабочем режиме! Настроил на внутренний 1 МГц, это правильно?

  3. werewolftm

    тоже долго не мог запустить кварц. Подсмотрел случайно на часы реального времени DS1307 на плате на одном из ног кварца был установлен резистор на землю 1мом. Запустились все кварцы с пол тика)))

  4. Mihail_Nik

    Запустил свой кварц!!! Помог пункт 1.4 Не ожидал что флюс с грязькой может так влиять. Перед этим пробовал все пункты. Но только спиртом протер, заработало без проблем, и без всяких кондеров.

  5. GetChiper Автор записи

    Если никакими способами не получается программировать от внешних тактовых сигналов, то фьюзы можно будет изменить только высоковольтным программатором.

  6. kuz-basss

    Скажите, какой есть способ перешить фьюзы, (случайно) запрограммированные на низкочастотный кварц? В программе не было предусмотрено его присутствие! пытался подать на xtal1 1МГц (затем 1кГц) с внешнего МК — это могло повлиять на его работу?
    МК — atmega 48 pu!

  7. softus

    Кварц не так дорого стоит чтобы его ремонтировать, по-этому лучше купить чем паять.

  8. GetChiper Автор записи

    У вас есть программа для USB HID? очень нужно заранее спасибо .

    Вот здесь http://www.obdev.at/products/vusb/index.html много информации и устройств.

    Atabek :

    Вот такая проблема говорить что «Programmer Evaluation version file size limit exceeded«

    Вы пользуетесь пробной версией программы (или программатора) у которой установлено ограничение на величину прошивки.

  9. Atabek

    Вот такая проблема говорить что «Programmer Evaluation version file size limit exceeded
    «

  10. Atabek

    У меня код для USB HID устройство а поэтому такой большой .hex code.
    У вас есть программа для USB HID? очень нужно заранее спасибо .

  11. GetChiper Автор записи

    В мегу8 не влазит 6кБ HEX?
    Странно, хексы обычно больше реально занимаемого места в МК (раза в два).
    Остальные МК шьются нормально?

  12. Atabek

    Спасибо. ещё один вопрос у меня программатор ChipBlaster clone
    Atmega8 память 8kb а у меня 6кб hex file . он не прошивает . говорит file размер большой. что делать ?

  13. GetChiper Автор записи

    Фьзы тут не причем, микроконтроллер для работы с часовым кварцем настраивается в программе — листинг в статье.

  14. Atabek

    Здравствуйте , у меня индикатор общий анод. Все сделал нормально и Fuse , часового кварц поставил правильно . не работает . может у вас есть готовый проект на микроконтроллер Atmega8 и Fuse если можно. заранее спасибо.

  15. iamstreetstyle

    С питанием проблема :O мк задуман на питание от 3,3(LP2985)НО к вводам мк подключен через резисторы 330ом 7мисегментник с обшим плюсовым(катодом или анодом хз планировал с общим минусом но нетот сегментник взял) подключеным к + 5 через дидод (питание от усб а именно от программатора авр910(PROTTOSS) который подключен к мк). Но до этого работало все стабильно при включении питания кварц пускался.фильтра по питанию на плате с мк нет.От 910го ~10см шлейфа до мк и ровно столькоже от мк до 7сегментника.

  16. GetChiper Автор записи

    По питанию ничего не менялось? Может конденсаторы добавить?
    Программа не менялась?

  17. iamstreetstyle

    Никак немогу запустить кварц хотя до этого 2 недели все работало прекрасно, все по «феншую» короткие дорожки, 2 кондера 22пф 1206,кварц припаян к минусу. Просто перестал запускатся и все тут, пробовал заменить тоже самое Ж(((((((((( главное если чемнибуть металическим коснутся одной из ног то вроде тикает но стоит убрать тутже перестает или посли 1000 касаний чудом запускается . ВАЩЕ ЖООООООООООООООООО
    Кстати все начилось после того как наулице похолодало хз(давление изменилость, температура в комнате упала на пару градусов,помех больше стало,активность солнца нета ?????????) главное работало до этого без нареканий.

  18. Viatka61

    Все понятно.Спасибо.

  19. GetChiper Автор записи

    Кварц с конденсаторами и есть вся необходимая для работы обвязка.

  20. Viatka61

    ?…А как же его проверить без осциллографа?Выходит,никак?
    У меня еще вопрос возник(извини за назойливость).Будет ли генерация на МК без обвязки,т.е.подключить кварц с конденсаторами и подать питание?

  21. GetChiper Автор записи

    Да, но это еще не значит, что он рабочий.

  22. Viatka61

    Я писал уже,что проверял мультиметром.На одной ноге показывает 0.7в,на другой 2.4в.Так и должно быть?

  23. GetChiper Автор записи

    Осциллографом. Вольтметром (должно присутствовать половинное питание).
    Косвенно — работает ли программирование, программа…
    В AVR микроконтроллерах есть ножка, которую при помощи установки фьюзов можно сделать выходом частоты задающего генератора — на ней уж точно можно, не боясь посадить сигнал, смотреть осциллографом.

  24. Viatka61

    Да,МК программируется и читается.PIC16F876A.Дело не в конкретном МК,а вообще как проверить задающий генератор.

  25. GetChiper Автор записи

    А микроконтроллер программируется? Что за микроконтроллер?

  26. Viatka61

    Евгений,я действительно спрашивал о проверке кварца задающего генератора МК.Есть устройство на МК и ЖК индикаторе(WH1602)На индикаторе горят верхние сегменты и ничего не показывает.Как проверить, работает задающий генератор МК или нет?

  27. GetChiper Автор записи

    Если речь идет о кварце для задающего генератора микроконтроллера, то тут все просто — микроконтроллер просто не будет программироваться при нерабочем кварце.
    А вот с часовым кварцем намного сложнее. Он очень чувствительный и при замере мультиметрами/осциллографами запросто можно его остановить. Как простой вариант решения этой проблемы можно посоветовать впаять этот кварц в заведомо рабочую схему (например, те-же дешевые китайские часы — часы тикают, значит кварц работает). Или набросать небольшую программку которая — бы дрыгала ногой микроконтроллера по прерываниям от часового кварца.

  28. Viatka61

    Евгений,здравствуйте!Вы написали,как запустить кварц,а как проверить работает он или нет не написали.я недавно начал заниматься МК,поэтому много чего не знаю.Напишите пожалуйста,как Вы проверяете работу кварцевого генератора у микроконтроллера.На сайтах пишут,что осциллограф будет садить напряжение с генератора и он перестанет работать.На другом сайте нашел,что можно вобще подсоединить светодиод с резистором к ген.если будет светиться,значит ген работает.Я пробовал мультиметром мерять на кварце.На одной ноге показывает 0.7в,на другой 2.4в

  29. GetChiper Автор записи

    Про китайский кварц — это я из личного опыта. Делал часы с цифровой коррекцией. Так вот я не мог коррекцией точно скорректировать уход времени — он плавал. Хотя, это наверно, на какой кварц нарвешся.
    Про кварцы «советского типа» ничего не скажу — никогда не пользовался.

  30. notfreeuser

    интересно, но с китайским кварцом от дешевых часов таймер запустился сразу (и точность кстати очень даже неплохая), а вот покупной кварц «советского типа» запускатся никак не хочет, правда не пробовал с внешними конденсаторами.

Добавить комментарий