Конструктор регистров собирает значение 8-битного регистра AVR из полей, как их описывает даташит: отдельные биты включаются галочками, многобитные поля (делитель таймера, режим, скорость) выбираются из списка с названиями режимов. Результат — значение в шестнадцатеричном и двоичном виде, строка на C для avr-gcc и две строки на ассемблере Microchip.
Сейчас доступны девять микроконтроллеров — ATmega328P, ATmega2560, ATmega8, ATmega16A, ATmega32A, ATmega32U4, ATtiny85, ATtiny13A и ATtiny2313A — со всеми блоками периферии, у которых есть 8-битные управляющие регистры. Подробные описания регистров с таблицами битов — на страницах регистров каждого микроконтроллера, например регистры ATmega328P.
Как пользоваться
- Выберите микроконтроллер и блок: таймер, АЦП, USART, порты, прерывания.
- Выберите регистр — начальное значение равно значению после сброса.
- Включите биты и выберите режимы многобитных полей.
- Скопируйте строку на C или ассемблерный код.
Какой код получается
C (avr-gcc). Значение записывается через имена битов из заголовка avr/io.h: TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10);. Это то же, что TCCR1B = 0x0B;, но читается без даташита. Нулевое значение — TCCR1B = 0;.
Ассемблер Microchip. Значение загружается в рабочий регистр и записывается в регистр периферии:
ldi r16, 0x0B
sts TCCR1B, r16
Регистры в пространстве ввода-вывода записываются командой out — она короче и быстрее, а регистры с адресами в расширенном пространстве — только командами записи в память, как sts. Имена регистров берутся из файла определений устройства (m328Pdef.inc для ATmega328P).
Ограничения
- Конструктор присваивает регистру значение целиком. Чтобы изменить отдельные биты, не трогая остальные, в программе используют
|=и&= ~. - Порядок записи регистров важен для некоторых блоков: например, временные последовательности сторожевого таймера и смена тактирования требуют записи в определённом порядке за ограниченное число тактов — это описано на страницах регистров.
- 16-битные регистры (счётчики, регистры сравнения) в конструкторе не собираются — у них нет битовых полей.
Частые вопросы
Как получить значение регистра TCCR1B для делителя 64?
Выберите ATmega328P, блок «Таймер-счётчик 1» и регистр TCCR1B, а в поле CS12:0 — значение 011. Конструктор покажет 0x03 и строку TCCR1B = (1 << CS11) | (1 << CS10);. Если нужен ещё и режим CTC с OCR1A, добавьте WGM12 — значение станет 0x0B.
Почему код на ассемблере то с OUT, то с STS?
Регистры с адресами в пространстве ввода-вывода (до 0x5F в адресах памяти) доступны командой OUT, а регистры с большими адресами — только командами работы с памятью, например STS. Конструктор выбирает команду по адресу регистра; в обоих случаях значение сначала загружается в r16 командой LDI.
Откуда взяты регистры и описания битов?
Из файлов описания устройств Microchip (ATDF из паков ATmega_DFP и ATtiny_DFP, лицензия Apache-2.0), сверенных с даташитами и заголовочными файлами компилятора. Расхождения — например, сдвинутые биты TWAM в заголовке ATmega328P — исправлены по даташиту; список поправок есть на страницах регистров.
Почему строка на C иногда записана числом, а не именами битов?
Если в значении включены биты без имени или имена битов в заголовке компилятора неверны, конструктор пишет число в шестнадцатеричном виде: так код гарантированно соответствует выбранным битам.
Источники
- Microchip. ATmega Series Device Support (ATmega_DFP) и ATtiny Series Device Support (ATtiny_DFP), файлы описания устройств atdf — регистры, поля, значения полей, адреса, значения после сброса; лицензия Apache-2.0
- Microchip. Даташиты ATmega328P (DS40002061B), ATmega2560, ATmega8, ATmega16A, ATmega32A, ATmega32U4, ATtiny85, ATtiny13A, ATtiny2313A — сводки регистров и описания битов, по которым сверены данные пака
- Заголовочные файлы avr/io*.h из паков Microchip — имена битов, которые использует строка на C
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/register-constructor/" title="Конструктор значений регистров AVR" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/register-constructor/">Конструктор значений регистров AVR</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено .
Нашли ошибку в расчёте?