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

Можно ли использовать выводы кварца PB6 и PB7 ATmega328P как обычные?

Обновлено Редакция GAW

На выводах 9 и 10 корпуса ATmega328P в DIP-28 совмещены три функции: вход и выход генератора кварца (XTAL1, XTAL2), выводы часового генератора Timer2 (TOSC1, TOSC2) и обычные линии порта PB6 и PB7. Какая функция работает, решают фьюзы выбора тактирования.

Когда выводы свободны

Раздел 14.3.1 даташита DS40002061B: XTAL1 используется для всех источников такта, кроме калиброванного внутреннего RC-генератора, а вывод, занятый генератором, не может быть портом.

Источник такта (CKSEL)PB6PB7
кристаллический или керамический резонаторXTAL1XTAL2
внешний тактовый сигналXTAL1 (вход такта)обычный вывод
внутренний RC 8 МГцобычный выводобычный вывод
внутренний RC и асинхронный Timer2TOSC1TOSC2

Строка про внешний сигнал — наш вывод из того же раздела: XTAL2 нужен только кварцевому генератору. Новый ATmega328P с завода уже работает от внутреннего RC-генератора, поэтому PB6 и PB7 у него свободны сразу. Фьюзы для своей конфигурации проверит калькулятор фьюзов AVR.

Как управлять

Ядро Arduino для Uno этих выводов не знает, поэтому работают регистрами — как в уроке «Порты и регистры»:

DDRB  |= _BV(DDB6) | _BV(DDB7);   /* PB6, PB7 as outputs */
PORTB |= _BV(PORTB6);             /* PB6 high */

Что учесть

Без кварца частота менее точна: заводская калибровка ±10 % при 3 В и 25 °C. Чего ждать от внутреннего генератора и как его подстроить, разобрано в ответе «Насколько точен внутренний генератор ATmega328P?». Остальные выводы кристалла — в карточке ATmega328P.

Похожие вопросы

Можно ли управлять PB6 и PB7 через digitalWrite?

В стандартной разводке ядра Arduino для Uno этих выводов нет: номера идут от D0 до D19, а PB6 и PB7 ни одному номеру не соответствуют. Управляйте ими регистрами — DDRB, PORTB и PINB, как любым выводом порта B, или используйте ядро, где для платы без кварца эти номера заданы.

Что потеряю без кварца?

Точность частоты. Заводская калибровка внутреннего генератора 8 МГц по таблице 29-9 — ±10 % при 3 В и 25 °C. Для UART на высоких скоростях и для отсчёта времени этого мало, генератор подстраивают регистром OSCCAL или оставляют кварц.

Можно ли вернуть кварц, если выводы уже заняты схемой?

Можно, но при перезаписи фьюзов на кварц кристалл сразу переключится на него. Если на PB6 и PB7 уже нагрузка вместо кварца, генератор не запустится и кристалл перестанет отвечать программатору — придётся подать внешний такт на XTAL1, чтобы вернуть фьюзы.

Источники

  1. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet, DS40002061B, 2020 — 1.1.3 — в зависимости от фьюзов выбора тактирования PB6 и PB7 работают как выводы генератора; 14.3.1 «Alternate Functions of Port B» (с. 91): XTAL1 используется для всех источников, кроме калиброванного внутреннего RC, когда вывод работает в генераторе, он не может быть портом, у такого вывода DDB7, PORTB7 и PINB7 читаются как 0; TOSC1/TOSC2 — только при внутреннем RC и AS2 = 1; табл. 14-4 — переопределение PB7 генератором снимается при INTRC и EXTCK; табл. 29-9 — точность внутреннего RC 8 МГц с заводской калибровкой ±10 % при 3 В и 25 °C
  2. Arduino. ArduinoCore-avr, коммит 11b9130: variants/standard/pins_arduino.h, boards.txt — NUM_DIGITAL_PINS = 20 (D0–D19), выводы 9 и 10 корпуса — PB6 и PB7 — номеров Arduino не имеют; uno.bootloader.low_fuses = 0xFF — внешний кварц

Нашли ошибку?