Перейти к содержанию

Попытка настроить Asynchronous Clock


WetCrow

Рекомендуемые сообщения

Добрый день!

Пытаюсь настроить на Atmega8 Asynchronous Clock. Цель -- сделать часы.

По задумке, мк работает на частоте 1МГц (фьюзы не трогаю, оставляю заводские значения), к пинам TOSC1/TOSK2 подключается кварц на 32.768 кГц, а Timer2 настраивается таким образом, что генерирует прерывания один раз в секунду.

Вот, что я делаю:

ASSR |= 1 << AS2;
TCCR2 = 0b00000101;
TIMSK |= 1 << TOIE2;
sei();

Screenshot_proteus_clock.png.bc1aa75f2e2423f28b80f8bc43553185.png

Нужно ли подключать кварц с конденсаторами, или без -- не понял. В даташите информации не нашёл. Пробовал и так, и эдак -- разницы не заметил.

Что получилось:

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

В чём я ошибаюсь, чего не учитываю?

К сообщению прикладываю файл прошивки и протеуса.

Примечания:

  • в Протеусе сделал имитацию дисплея на светодиодах, так как встроенный вариант не работал корректно. Для того, чтоб цифры мигали медленнее, можно раскомментировать строку "#define DEBUG_BLINKING" -- иначе в протеусе не рассмотреть, что получается.
  • Пишу на C++ под avr-g++, впрочем, никаких фишек языка не использую.

clock.cpp clock_build_with_LEDs.pdsprj

Изменено пользователем WetCrow
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Перечитал ещё раз даташит, и вот что там написано:

Цитата

1. Disable the Timer/Counter2 interrupts by clearing OCIE2 and TOIE2
2. Select clock source by setting AS2 as appropriate
3. Write new values to TCNT2, OCR2, and TCCR2
4. To switch to asynchronous operation: Wait for TCN2UB, OCR2UB, and TCR2UB
5. Clear the Timer/Counter2 Interrupt Flags
6. Enable interrupts, if needed

Решил делать всё чётко "по бумажке":

TIMSK &= ~((1 << OCIE2) | (1 << TOIE2)); // 1. Disable the Timer/Counter2 interrupts by clearing OCIE2 and TOIE2

ASSR |= 1 << AS2; // 2. Select clock source by setting AS2 as appropriate

// 3. Write new values to TCNT2, OCR2, and TCCR2
TCNT2 = 0;
OCR2 = 0xFF;
TCCR2 = 0b000000101; // set timer prescaler

while (ASSR & 0b111) {}// 4. To switch to asynchronous operation: Wait for TCN2UB, OCR2UB, and TCR2UB

TIFR &= 0b00111111; // 5. Clear the Timer/Counter2 Interrupt Flags

TIMSK |= 1 << TOIE2; // 6. Enable interrupts, if needed

Результат:

  1. Контроллер засыпает на долгое время -- видимо, на инструкции while.
  2. После этого прерывания возникают, но через неравные большие промежутки времени, порядка 30 секунд и более.

Замена МК и кварца ничего не изменила.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Попробуйте убрать таймер 0 вообще, а в прерывании от таймера 2 мигато светодиодом.

On 5/3/2020 at 4:54 AM, WetCrow said:

Нужно ли подключать кварц с конденсаторами, или без -- не понял.

В даташите в разделе  System Clock and Clock Options написано если CKOPT запрограммирован внешние конденсаторы не нужны. Вам нужно по 36 пФ поставить есле не меняете фьюзы.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Сейчас нет таких конденсаторов. Если я хочу использовать встроенные, какие ещё фьюзы, помимо CKOPT, нужно менять?

В даташите указано:

Цитата

To use a 32.768kHz watch crystal as the clock source for the device, the Low-frequency Crystal Oscillator must be selected by setting the CKSEL Fuses to “1001”.

Значит ли это, что я должен установить CKSEL в указанное значение, или это только для случая, когда нужно весь контроллер тактировать от этого таймера?

Ссылка на комментарий
Поделиться на другие сайты

В даташите, в разделе Errata, есть такой пункт:

Цитата

4. CKOPT Does not Enable Internal Capacitors on XTALn/TOSCn Pins when 32KHz
Oscillator is Used to Clock the Asynchronous Timer/Counter2

<...>
Problem Fix / Workaround
Use external capacitors in the range of 20pF - 36pF on XTAL1/TOSC1 and XTAL2/TOSC2.

Поставил конденсаторы на 22 пФ.

@snn_krs , упростил программу, как вы предлагали.

Пока всё безрезультатно: по-прежнему мигает раз в несколько секунд не периодично. Воспроизвести раннее поведение, с миганием в 1.5 раза чаще положенного, не удалось.

В протеусе по-прежнему всё работает идеально, как с кварцем, так и вовсе без него.

К этому сообщению прикладываю код. Схема элементарна -- помимо кварца с конденсаторами на 22 пФ, соединяющими его ноги с землёй, ещё есть светодиод с резистором на PB1.

P.S.: если вдруг это имеет значение, у меня, скорее всего, Atmega8-PU. (По крайней мере, это утверждает сайт магазина, где брал).

test_async_timer.cpp

Изменено пользователем WetCrow
добавил информации
Ссылка на комментарий
Поделиться на другие сайты

@snn_krs , увы, не помогло.

Кстати: если закомментировать строку ASSR |= 1 << AS2; (которая, собственно, включает асинхронный режим), таймер работает (разумеется, с другой частотой).

Нашёл похожую тему:

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

После прочтения у меня возникло два вопроса:

1. Как определить, правильный ли у меня кварц?
Выглядит он как цилиндр белого металла, диаметром 3 мм и высотой 8 мм, без каких-бы то ни было опознавательных знаков. Покупал в мелком интернет-магазинчике, нацеленном на ардуинщиков и электронщиков.

Скрытый текст

quartz.thumb.jpg.9b690d397d1b57da256b331a06149a8c.jpg

2. В той теме есть идея проверить, возникают ли колебания на кварце с помощью осциллографа. Увы, его у меня нет, но я подключил его в протеусе. Быть может, "я просто не умею его готовить", но с параметрами по-умолчанию он показывает гладкую кривую на обоих выходах. Должно быть иначе?

Изменено пользователем WetCrow
Ссылка на комментарий
Поделиться на другие сайты

03.05.2020 в 04:54, WetCrow сказал:

В Протеусе всё вроде работает правильно, однако, даже если отсоединить кварц, это ни на что не влияет.

 протез симулировать работу кварца не умеет. от слова совсем.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...