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

ATmega128 и ATmega128A

ATmega128 — 8-битный микроконтроллер AVR со 128 КБ флеш-памяти, 4 КБ ОЗУ и 4 КБ EEPROM в 64-выводном корпусе, ATmega128A — его обновлённая версия, совместимая по выводам и прошивке. Ниже — устройство, распиновка, фьюзы и схема включения по даташитам, а также три ловушки, о которые спотыкаются чаще всего: режим ATmega103, включённый с завода JTAG и ISP на выводах PE0 и PE1.

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

ATmega128 пришёл на смену ATmega103 и повторяет его разводку вывод в вывод: указание по применению AVR080 о переводе плат с ATmega103 на ATmega128 Atmel выпустила ещё в 2001 году. Кристалл выпускался в двух вариантах — ATmega128 на 4,5–5,5 В и до 16 МГц и низковольтный ATmega128L на 2,7–5,5 В и до 8 МГц, — а в 2008 году к ним добавился ATmega128A с меньшим потреблением и диапазоном питания 2,7–5,5 В. Эти микроконтроллеры стоят во многих промышленных контроллерах, приборах и учебных стендах, поэтому документация по ним нужна прежде всего при ремонте, доработке и перепрошивке. Числа ниже взяты из даташитов ATmega128 (редакция 2467X, 2011) и ATmega128A (8151J, 2015) и указаний по применению Atmel; где версии различаются, это оговорено.

Коротко

  • Ядро AVR: 133 команды, большинство за один такт, до 16 MIPS при 16 МГц, аппаратное умножение 8 × 8 за 2 такта.
  • Память: 128 КБ флеш-памяти с секцией загрузчика 1–8 КБ, 4 КБ SRAM, 4 КБ EEPROM, внешняя шина памяти XMEM на 64 КБ адресов.
  • Периферия: два 8-битных и два 16-битных таймера, два USART, SPI, TWI (I²C), 8-канальный 10-битный АЦП с дифференциальными входами и усилением 10× и 200×, JTAG с отладкой.
  • Питание: ATmega128 — 4,5–5,5 В до 16 МГц, ATmega128L — 2,7–5,5 В до 8 МГц, ATmega128A — 2,7–5,5 В, 16 МГц при 4,5–5,5 В.
  • С завода: RC-генератор 1 МГц, включены режим совместимости с ATmega103 (M103C) и JTAG; фьюзы Extended = 0xFD, High = 0x99, Low = 0xE1.
  • ISP: MOSI программатора подключают к PE0, MISO — к PE1, SCK — к PB1. Выводы MOSI и MISO порта B для прошивки не используются.

ATmega128 в семействе AVR: от ATmega103 до ATmega2560

ATmega103 выполнял 121 команду без аппаратного умножения, работал до 6 МГц (ATmega103L — до 4 МГц при 2,7–3,6 В), имел 4000 байт SRAM, один UART и флеш-память с ресурсом 1000 циклов записи. ATmega128 сохранил его корпус и назначение выводов: даташит называет новый кристалл стопроцентно совместимым по выводам и пригодным для установки на старые платы. Чтобы на нём без переделки работали и старые программы, предусмотрен режим совместимости, который включает фьюз M103C, — о нём отдельный раздел ниже.

Следующий шаг — ATmega128A, первая редакция даташита которого вышла в августе 2008 года. По функциям и выводам это тот же кристалл, но сделанный по другому техпроцессу; в AVR525 Atmel называет его функционально идентичной прямой заменой ATmega128. Тогда же появились ATmega1281 и ATmega2561 в тех же 64-выводных корпусах — по AVR097 они составляют с ATmega128 совместимое по выводам и функциям подсемейство, — а также 100-выводные ATmega1280 и ATmega2560. Последний стоит в Arduino Mega 2560.

МикроконтроллерФлешSRAMЛинии I/OUSARTТаймеры 8 / 16 битКорпусЧастота, доДанные ISP
ATmega103128 КБ4000 байт32 + 8 выходов + 8 входов1 UART2 / 1TQFP-646 МГцPE0, PE1
ATmega128, ATmega128L128 КБ4 КБ5322 / 2TQFP-64, QFN/MLF-6416 МГц, у 128L — 8 МГцPE0, PE1
ATmega128A128 КБ4 КБ5322 / 2TQFP-64, QFN/MLF-6416 МГцPE0, PE1
ATmega1281128 КБ8 КБ5422 / 4TQFP-64, QFN/MLF-6416 МГцPE0, PE1
ATmega2561256 КБ8 КБ5422 / 4TQFP-64, QFN/MLF-6416 МГцPE0, PE1
ATmega1280128 КБ8 КБ8642 / 4TQFP-100, CBGA-10016 МГцPB2, PB3
ATmega2560256 КБ8 КБ8642 / 4TQFP-100, CBGA-10016 МГцPB2, PB3

EEPROM у всех кристаллов таблицы — 4 КБ. Питание: ATmega103 — 4,0–5,5 В (ATmega103L — 2,7–3,6 В до 4 МГц), ATmega128 — 4,5–5,5 В (ATmega128L — 2,7–5,5 В), ATmega128A, ATmega1281 и ATmega1280 — 2,7–5,5 В, причём 16 МГц допустимы от 4,5 В, ATmega2561 и ATmega2560 — 4,5–5,5 В. У ATmega1281, ATmega2561, ATmega1280 и ATmega2560 есть ещё варианты с буквой V, рассчитанные на питание от 1,8 В на пониженной частоте. Для ремонта важна последняя колонка: 64-выводные кристаллы прошиваются через линии порта E, а 100-выводные ATmega1280 и ATmega2560 — через PB2 и PB3, как большинство AVR. Схему программатора от Arduino Mega на ATmega128 переносить нельзя.

ATmega128 и ATmega128A: отличия и совместимость

Сигнатура у обоих кристаллов одна — 0x1E 0x97 0x02, набор фьюзов и их заводские значения тоже совпадают, поэтому одна и та же прошивка работает на обоих. В avrdude есть оба описания — m128 и m128a. Различаются только электрические параметры. AVR525 перечисляет три изменения: ниже ток в активном режиме и в режиме Idle, выше допустимое напряжение логического нуля на выходе и другие пределы внутренней подтяжки RESET. Позже пределы подтяжки выровнялись: в редакции 2467W даташита ATmega128 максимум сопротивления подтяжки RESET поднят с 60 до 85 кОм, как у ATmega128A.

ПараметрATmega128, ATmega128LATmega128A
Питание и наибольшая частотаATmega128: 4,5–5,5 В, 16 МГц; ATmega128L: 2,7–5,5 В, 8 МГц2,7–5,5 В: 8 МГц при 2,7 В, 16 МГц при 4,5–5,5 В
Активный режим, 4 МГц, 3 В5 мА, не больше 5,5 мА3 мА, не больше 5,5 мА
Активный режим, 8 МГц, 5 В17 мА, не больше 19 мА9,8 мА, не больше 19 мА
Idle, 4 МГц, 3 В2 мА, не больше 2,5 мА1 мА, не больше 2,5 мА
Idle, 8 МГц, 5 В8 мА, не больше 11 мА3,5 мА, не больше 11 мА
Power-down, 3 В, сторожевой таймер включёнменьше 15 мкА, не больше 25 мкАменьше 10 мкА, не больше 25 мкА
Power-down, 3 В, сторожевой таймер выключенменьше 5 мкА, не больше 10 мкАменьше 1 мкА, не больше 10 мкА
VOL при 20 мА и 5 В / 10 мА и 3 В, не больше0,7 / 0,5 В0,9 / 0,6 В
Температурные исполнения−40…+85 °C; −40…+105 °C у вариантов AN и MN−40…+85 °C

Первое значение в строках с токами — типовое, второе — гарантированный максимум. Максимумы у двух версий одинаковые, поэтому источник питания, рассчитанный на ATmega128, подойдёт и для ATmega128A. Внимания требует только VOL: если выход ATmega128 работал на пределе — например, напрямую тянул ток 20 мА через светодиод или вход ТТЛ-логики, — у ATmega128A напряжение нуля может оказаться на 0,2 В выше.

Граница частоты у ATmega128A между 2,7 и 4,5 В на графике безопасной области даташита идёт по прямой от 8 до 16 МГц: при 3,3 В это около 10,7 МГц. На плате с питанием 3,3 В надёжный выбор — кварц 8 МГц, а 16 МГц требуют питания от 4,5 В.

Архитектура ядра ATmega128

ATmega128 построен на классическом ядре AVR с 32 регистрами — в справочнике команд Microchip этот вариант называется AVRe+. Память программ и память данных подключены к ядру разными шинами (гарвардская архитектура), поэтому пока выполняется одна команда, следующая уже выбирается из флеш-памяти. Этот одноступенчатый конвейер и даёт производительность, близкую к 1 MIPS на мегагерц: 16 MIPS при кварце 16 МГц.

Упрощённая блок-схема ядра ATmega128Счётчик команд PC разрядностью 16 бит адресует флеш-память 64K × 16 бит. Команда по отдельной шине попадает в регистр и дешифратор команд, который управляет АЛУ. 32 регистра r0–r31 подают в АЛУ два операнда и принимают результат за один такт; командами LPM и ELPM в регистры читаются константы из флеш-памяти. АЛУ обновляет флаги в SREG. Восьмибитная шина данных соединяет ядро с SRAM 4 КБ, EEPROM 4 КБ, таймерами T0–T3, двумя USART, SPI и TWI, АЦП, портами A–G и блоком прерываний на 35 векторов.Счётчик команд PC16 бит: 64K словФлеш-память128 КБ = 64K × 16 битРегистр команди дешифраторадрескоманда, 16 битРегистры r0–r3132 × 8 бит; X, Y, ZАЛУаппаратное умножениеLPM, ELPMуправление2 операндарезультатSREGфлагиSPстек в SRAMПрерывания35 векторов, INT0–INT7шина данных, 8 битSRAM4 КБEEPROM4 КБТаймерыT0–T3USART2 каналаSPI, TWITWI = I²CАЦП10 бит, 8 вх.ПортыA–G, 53 линии
Упрощённая блок-схема ядра ATmega128: программа и данные идут по разным шинам, регистры подключены к АЛУ напрямую
  • Регистры и АЛУ. 32 регистра r0–r31 по 8 бит соединены с АЛУ напрямую: за один такт оба операнда читаются из регистров, АЛУ выполняет операцию и записывает результат обратно. Пары r27:r26, r29:r28 и r31:r30 — 16-битные указатели X, Y и Z для косвенной адресации; Z ещё и адресует флеш-память в командах LPM, ELPM и SPM.
  • Умножение. Аппаратный умножитель выполняет MUL, MULS, MULSU и дробные FMUL за 2 такта. У ATmega103 умножения не было.
  • Счётчик команд PC — 16 бит, он адресует 64K слов, то есть все 128 КБ флеш-памяти. Поэтому CALL, RCALL и прерывание кладут в стек 2 байта адреса возврата, а JMP и CALL достают до любого адреса. Команд EIJMP и EICALL у ATmega128 нет: они нужны кристаллам с флеш-памятью больше 128 КБ.
  • Стек находится в SRAM и растёт к младшим адресам. Даташит требует настроить указатель SP до первого вызова подпрограммы и до разрешения прерываний, а в таблице регистров его начальное значение — 0, поэтому в программах на ассемблере SP загружают явно. Стартовый код avr-gcc ставит стек на вершину внутренней SRAM, адрес 0x10FF.
  • Прерывания. Реакция на прерывание — не меньше 4 тактов: за это время адрес возврата уходит в стек. Ещё 3 такта занимает JMP в векторе, возврат RETI — 4 такта. Если прерывание будит кристалл из режима сна, к реакции добавляются ещё 4 такта и время запуска генератора.

Полный список команд с флагами и тактами — в статье «Система команд AVR». По приложению A справочника команд из набора AVRe+ у ATmega128 нет только EIJMP и EICALL, а ELPM для чтения верхней половины флеш-памяти есть.

Память ATmega128: флеш, SRAM, EEPROM и внешняя шина

У ATmega128 три адресных пространства: память программ (флеш-память), память данных, куда входят регистры, ввод-вывод и SRAM, и EEPROM, к которой обращаются через регистры ввода-вывода.

Карта памяти ATmega128: память программ и память данныхПамять программ — 64K слов по 16 бит. С адреса 0x0000 лежат 35 векторов прерываний, дальше секция приложения. Секция загрузчика занимает конец флеш-памяти и начинается с адреса слова 0xF000, 0xF800, 0xFC00 или 0xFE00 при BOOTSZ1:0 = 00, 01, 10 или 11 (8, 4, 2 или 1 КБ). Область 0x0000–0xEFFF — секция RWW, 0xF000–0xFFFF — секция NRWW размером 8 КБ. Память данных: 0x0000–0x001F — регистры r0–r31, 0x0020–0x005F — 64 регистра ввода-вывода, 0x0060–0x00FF — 160 регистров расширенного ввода-вывода, 0x0100–0x10FF — 4096 байт SRAM, с 0x1100 до 0xFFFF — внешняя память. В режиме совместимости с ATmega103 расширенного ввода-вывода нет, SRAM 4000 байт занимает адреса 0x0060–0x0FFF, а внешняя память начинается с 0x1000. Масштаб не соблюдён.Память программадреса слов по 16 битВекторы прерываний35 × JMPПрикладная программасекция приложенияСекция загрузчиканачало при BOOTSZ = 00, 8 КБначало при BOOTSZ = 01, 4 КБначало при BOOTSZ = 10, 2 КБначало при BOOTSZ = 11, 1 КБ0x00000x00460xF0000xF8000xFC000xFE000xFFFFRWW0x0000–0xEFFF120 КБNRWW0xF000–0xFFFF8 КБбайтовый адрес = адрес слова × 2:0xF000 → 0x1E000Память данныхадреса байтов32 регистраr0–r3164 регистра I/OIN, OUT, LD, ST160 регистроврасширенного I/O: LD, STSRAM, 4096 байтстек растёт вниз от 0x10FFВнешняя памятьXMEM, до 60 КБ0x00000x00200x00600x01000x11000xFFFFРежим ATmega103 (M103C):SRAM 4000 байт, 0x0060–0x0FFF;XMEM с 0x1000, расширенного I/O нет
Карта памяти ATmega128 (масштаб не соблюдён). Слева — адреса слов флеш-памяти, справа — адреса байтов памяти данных в обычном режиме

Флеш-память и секция загрузчика

Флеш-память на 128 КБ организована как 64K слов по 16 бит и выдерживает не меньше 10 000 циклов записи и стирания. Пишется она страницами по 128 слов (256 байт), всего страниц 512. Память делится на две части: секцию приложения в начале и секцию загрузчика в конце. Размер секции загрузчика задают фьюзы BOOTSZ1:0, а команда SPM, которая пишет во флеш-память, работает только из секции загрузчика.

BOOTSZ1BOOTSZ0Секция загрузчикаНачало, адрес словаНачало, адрес байта
11512 слов (1 КБ)0xFE000x1FC00
101024 слова (2 КБ)0xFC000x1F800
012048 слов (4 КБ)0xF8000x1F000
004096 слов (8 КБ), заводская настройка0xF0000x1E000

Даташит приводит адреса в словах, а компоновщик avr-gcc и файлы HEX считают в байтах — вдвое больше. Секцию загрузчика на 8 КБ при сборке размещают с байтового адреса 0x1E000, например ключом -Wl,--section-start=.text=0x1E000.

Независимо от фьюзов флеш-память разделена ещё и на две фиксированные области. В RWW (Read-While-Write, 0x0000–0xEFFF, 120 КБ) можно стирать и записывать страницы, пока код из NRWW продолжает выполняться. NRWW (0xF000–0xFFFF, 8 КБ) — область, при записи которой процессор останавливается до конца операции. Секция загрузчика всегда лежит в NRWW, поэтому загрузчик может принимать данные по UART, пока пишет страницу приложения. Пока идёт запись в RWW, читать оттуда нельзя — значит, на это время прерывания должны быть запрещены или перенесены в секцию загрузчика битом IVSEL.

Константы выше 64 КБ: ELPM и RAMPZ

Команда LPM берёт адрес байта из 16-битного указателя Z и поэтому видит только первые 64 КБ флеш-памяти. Верхняя половина читается командой ELPM: старший, семнадцатый бит адреса она берёт из бита RAMPZ0 регистра RAMPZ. В avr-libc обычные pgm_read_byte() и pgm_read_word() работают через LPM и ограничены нижними 64 КБ. Документация avr-libc отдельно предупреждает, что с таблицами за этой границей они не работают. Типичный случай — загрузчик на кристалле с флеш-памятью больше 64 КБ: он и сам лежит выше границы. Для таких данных адрес получают макросом pgm_get_far_address(), а читают функциями pgm_read_byte_far() и аналогичными.

Память данных: регистры, ввод-вывод, SRAM

Первые 4352 байта адресного пространства данных в обычном режиме устроены так:

АдресаЧто лежитЧем обращаться
0x0000–0x001Fрегистры r0–r31любой командой с регистрами, а также по адресу через X, Y, Z
0x0020–0x005F64 регистра ввода-выводаIN и OUT по адресам 0x00–0x3F; SBI, CBI, SBIC и SBIS — только 0x00–0x1F
0x0060–0x00FF160 регистров расширенного ввода-выводатолько LD, LDD, LDS, ST, STD и STS
0x0100–0x10FFвнутренняя SRAM, 4096 байтвсе режимы адресации
0x1100–0xFFFFвнешняя память XMEM, если включенакак SRAM, на такт дольше

В расширенном вводе-выводе лежат регистры, которых не было у ATmega103: UBRR0H (0x90), UCSR0C (0x95), регистры USART1, таймера 3, TWI, XMCRA и XMCRB. Компилятор сам выберет для них LDS и STS, а в ассемблере IN и OUT к ним не применить.

У ATmega128 есть и тонкость с битовыми командами: SBI и CBI переписывают весь регистр ввода-вывода. Если в регистре есть флаги, которые сбрасываются записью единицы, команда sbi на соседний бит сбросит и ожидающий флаг вместе с его прерыванием — даташит упоминает это, например, для ADIF в ADCSRA.

EEPROM

EEPROM на 4 КБ выдерживает не меньше 100 000 циклов записи, данные во флеш-памяти и EEPROM хранятся 20 лет при 85 °C и 100 лет при 25 °C. Запись одного байта длится 8448 тактов калиброванного RC-генератора частотой около 1 МГц, то есть около 8,5 мс, независимо от того, от какого источника тактируется ядро. При чтении процессор останавливается на 4 такта, при запуске записи — на 2.

Запись защищена последовательностью: после установки бита EEMWE в регистре EECR бит EEWE нужно записать не позднее чем через 4 такта, иначе запись не начнётся. Поэтому на время этой пары команд прерывания запрещают, а если в программе есть загрузчик, ещё и дожидаются окончания операции SPM. В avr-libc всё это делают функции из avr/eeprom.h. От порчи данных при просадке питания даташит рекомендует держать кристалл в сбросе детектором BOD. Фьюз EESAVE сохраняет содержимое EEPROM при полном стирании кристалла программатором.

Внешняя память XMEM

ATmega128 умеет работать с внешним ОЗУ, флеш-памятью или периферией, отображёнными в пространство данных. Порт A становится мультиплексированной шиной адреса и данных AD0–AD7, порт C — старшим байтом адреса A8–A15, а PG2, PG1 и PG0 — сигналами ALE, RD и WR. Младший байт адреса защёлкивается внешним регистром вроде 74AHC573 по спаду ALE: даташит рассчитан на серию 74AHC, а обычные 74HC не успевают уже на частотах выше 8 МГц при 4 В и 4 МГц при 2,7 В.

Интерфейс включается битом SRE в регистре MCUCR. Внешняя память начинается с адреса 0x1100, так что напрямую доступно 61 184 байта. К первым 4352 байтам микросхемы объёмом меньше 64 КБ обращаются через «зеркало»: у ОЗУ на 32 КБ без линии A15 они видны по адресам 0x8000–0x90FF. Каждое обращение к внешней памяти на такт длиннее, чем к внутренней, а для медленных микросхем добавляют 1–3 такта ожидания битами SRW. Пространство можно разбить на два сектора с разным числом тактов ожидания (биты SRL2:0), отдать ненужные старшие линии адреса порту C (биты XMM2:0 в XMCRB) и включить удержание уровней на шине AD0–AD7 (бит XMBK). Стек во внешней памяти держать невыгодно: вызовы подпрограмм, прерывания и возвраты станут на 3 такта длиннее.

Режим совместимости с ATmega103: фьюз M103C

Самая неожиданная особенность ATmega128: он поставляется в режиме совместимости с ATmega103. Об этом прямо пишут оба даташита — и ATmega128, и ATmega128A, — а AVR080 уточняет, что с завода фьюз M103C запрограммирован. В этом режиме кристалл повторяет ATmega103 по распределению памяти, работе выводов и векторам прерываний, а всё, чего у ATmega103 не было, отключается:

  • нет расширенного пространства ввода-вывода: SRAM — 4000 байт по адресам 0x0060–0x0FFF, внешняя память начинается с 0x1000;
  • остаётся один USART только в асинхронном режиме, без буфера приёма и только с младшими 8 битами UBRR; USART1 нет;
  • нет TWI, таймера 3 и третьего канала сравнения OCR1C таймера 1, а векторы прерываний с адресами 0x0030–0x0044 исчезают;
  • порт C работает только на выход и при сбросе не переходит в высокоимпедансное состояние, порт F — только вход, порт G — только сигналы внешней памяти и вход кварца 32 кГц;
  • не работают загрузчик и команда SPM, нельзя подстроить внутренний RC-генератор, а у шины XMEM нет секторов, освобождения выводов порта C и удержания уровней на шине;
  • сторожевой таймер (если не запрограммирован WDTON) меняет настройки без защитной последовательности, внешние прерывания INT0–INT3 реагируют только на уровень, а в MCUCSR остаются только флаги EXTRF и PORF.

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

Оставлять M103C запрограммированным имеет смысл только для старой прошивки ATmega103, которую нельзя пересобрать. JTAG, кстати, в режиме совместимости продолжает работать: фьюз M103C не отменяет JTAGEN, и для полной совместимости AVR080 советует снять и его.

Тактирование ATmega128: источники, CKOPT и время запуска

Источник тактирования выбирают фьюзы CKSEL3:0, а фьюз CKOPT меняет режим генератора. Фьюз «запрограммирован» — значит, его бит равен 0.

CKSEL3:0Источник
1111–1010внешний кварц или керамический резонатор
1001низкочастотный кварц 32,768 кГц
1000–0101внешняя RC-цепочка: 0,1–12 МГц, частота около 1/(3RC)
0100–0001внутренний калиброванный RC-генератор: 8, 4, 2 или 1 МГц
0000внешний тактовый сигнал на XTAL1

Кварцевый резонатор и CKOPT

С кварцем или резонатором диапазон частот зависит от CKOPT. Незапрограммированный CKOPT (1) — экономичный режим с малым размахом сигнала на XTAL2, частота до 8 МГц, и XTAL2 нельзя использовать для тактирования других микросхем. Запрограммированный CKOPT (0) даёт полный размах от нуля до питания и рабочий диапазон 1–16 МГц, но генератор потребляет больше.

CKOPTCKSEL3:1ЧастотаC1 и C2 для кварца
11010,4–0,9 МГц, только керамический резонатор—
11100,9–3,0 МГц12–22 пФ
11113,0–8,0 МГц12–22 пФ
0101, 110, 1111,0–16,0 МГц12–22 пФ

Отсюда правило: для кварца 16 МГц CKOPT обязательно программируют. Керамические резонаторы работают до 8 МГц при CKOPT = 1 и до 16 МГц при CKOPT = 0, а конденсаторы для них берут из документации резонатора. C1 и C2 по даташиту всегда одинаковые.

Бит CKSEL0 вместе с SUT1:0 задаёт время запуска генератора. Для кварца (CKSEL0 = 1) это 16K тактов после выхода из Power-down и Power-save; после сброса добавляется задержка от сторожевого генератора: 4,1 мс при SUT1:0 = 10 (питание нарастает быстро), 65 мс при SUT1:0 = 11 (медленно) или ничего при SUT1:0 = 01, когда сброс держит детектор BOD. Короткие варианты на 258 и 1K тактов предназначены для керамических резонаторов.

Внутренний RC-генератор

Внутренний генератор даёт 1, 2, 4 или 8 МГц (номинал при 5 В и 25 °C), CKOPT при этом должен быть не запрограммирован. При сбросе в регистр OSCCAL автоматически загружается калибровочный байт для 1 МГц, и тогда отклонение частоты не превышает ±3 % при 5 В и 25 °C; пользовательская калибровка по указаниям по применению Atmel даёт ±1 % при фиксированных напряжении и температуре. Калибровочные байты для 2, 4 и 8 МГц тоже записаны на заводе, в старших байтах строки сигнатуры по адресам 1–3, но загружаются они только вручную: программатор читает их (в avrdude — область calibration), а программа записывает нужный байт в OSCCAL. Без этого на частоте 8 МГц генератор работает с калибровкой для 1 МГц.

Если калибровку меняют программно, частоту не поднимают больше чем на 10 % выше номинала: от того же генератора отсчитываются времена записи EEPROM и флеш-памяти. Errata ATmega128A добавляет ещё одно правило: после повышения частоты больше чем на 2 % регистром OSCCAL или делителем XDIV следующие 8 команд должны быть NOP при запрещённых прерываниях.

Делитель XDIV и часовой кварц

Регистр XDIV делит тактовую частоту ядра и всей периферии на 129 − d, где d — значение битов XDIV6:0, то есть в 2–129 раз. Это способ снизить потребление без смены фьюзов, но с оговоркой: при включённом делителе таймер 0 можно использовать только в асинхронном режиме, иначе прерывания теряются.

Кварц 32,768 кГц для часов реального времени подключают к TOSC1 и TOSC2 (PG4 и PG3) — к ним, а не к XTAL1 и XTAL2. Внешние конденсаторы не нужны: внутренние ёмкостью 36 пФ уже стоят. Тогда таймер 0 считает секунды и в режиме Power-save, когда всё остальное остановлено.

Фьюзы ATmega128: таблица и заводские значения

У ATmega128 три байта фьюзов. Программатор читает запрограммированный фьюз как 0. Фьюзы не стираются при полном стирании кристалла, а после записи бита блокировки LB1 их уже не изменить, поэтому сначала пишут фьюзы, потом биты защиты.

БайтБитФьюзНазначениеС завода
Extended1M103Cрежим совместимости с ATmega1030 — включён
Extended0WDTONсторожевой таймер включён всегда1 — нет
High7OCDENотладка через JTAG1 — выключена
High6JTAGENинтерфейс JTAG на PF4–PF70 — включён
High5SPIENпрограммирование по ISP0 — разрешено
High4CKOPTрежим генератора: полный размах до 16 МГц1 — экономичный режим
High3EESAVEсохранять EEPROM при стирании кристалла1 — не сохранять
High2, 1BOOTSZ1:0размер секции загрузчика00 — 8 КБ
High0BOOTRSTначинать работу с секции загрузчика1 — с адреса 0
Low7BODLEVELпорог BOD: 1 — 2,7 В, 0 — 4,0 В1
Low6BODENдетектор пониженного питания1 — выключен
Low5, 4SUT1:0время запуска10 — максимальное
Low3–0CKSEL3:0источник тактирования0001 — RC-генератор 1 МГц

Итого с завода: Extended = 0xFD, High = 0x99, Low = 0xE1. Значения совпадают в даташитах ATmega128 и ATmega128A и в заголовке avr-libc iom128.h (константы EFUSE_DEFAULT, HFUSE_DEFAULT, LFUSE_DEFAULT). Фьюз SPIEN по ISP изменить нельзя — только через JTAG или параллельным программатором.

Типовые наборы фьюзов

КонфигурацияLowHighExtended
Заводская: RC-генератор 1 МГц, M103C и JTAG включены0xE10x990xFD
Кварц 16 МГц, BOD выключен, JTAG и M103C выключены0xFF0xC90xFF
Кварц 16 МГц, BOD на 4,0 В, JTAG и M103C выключены0x1F0xC90xFF
RC-генератор 8 МГц, JTAG и M103C выключены0xE40xD90xFF

Во всех строках, кроме заводской, секция загрузчика остаётся 8 КБ, а BOOTRST не запрограммирован: программа стартует с адреса 0. В варианте с BOD выбрано время запуска SUT1:0 = 01 — даташит рекомендует его для кварца при включённом детекторе. Для 8 МГц от RC-генератора не забудьте загрузить в OSCCAL калибровочный байт для 8 МГц.

BOD и сторожевой таймер

Детектор пониженного питания (BOD) держит кристалл в сбросе, пока напряжение ниже порога: 2,7 В при BODLEVEL = 1 (по даташиту ATmega128A — от 2,4 до 2,9 В) или 4,0 В при BODLEVEL = 0 (от 3,7 до 4,5 В), гистерезис 100 мВ. Включают его фьюзом BODEN. Для схемы с кварцем 16 МГц и питанием 5 В нужен порог 4,0 В: с порогом 2,7 В кристалл продолжит работать при напряжении, на котором 16 МГц уже не гарантированы.

Сторожевой таймер тактируется своим генератором с частотой около 1 МГц при 5 В и сбрасывает кристалл через 16K–2048K периодов этого генератора: от 14 мс до 1,8 с при 5 В и от 14,8 мс до 1,9 с при 3 В. Фьюзы M103C и WDTON задают уровень защиты от случайного отключения:

M103CWDTONУровеньСторожевой таймер после сбросаКак изменить настройки
не запрограммированне запрограммирован1выключенвыключение и смена периода — через защитную последовательность
не запрограммированзапрограммирован2включён всегдапериод — через защитную последовательность, выключить нельзя
запрограммированне запрограммирован0выключенбез ограничений, как у ATmega103
запрограммированзапрограммирован2включён всегдапериод — через защитную последовательность

Защитная последовательность: одной записью установить WDCE и WDE в регистре WDTCR, затем в течение 4 тактов записать новые WDE и WDP2:0 при сброшенном WDCE.

JTAGEN: почему не работают PF4–PF7

С завода запрограммирован JTAGEN, и выводы PF4–PF7 заняты интерфейсом JTAG: PF4 — TCK, PF5 — TMS, PF6 — TDO, PF7 — TDI. Пока JTAG включён, на TDI, TMS и TCK включены подтягивающие резисторы — даже во время сброса, — а каналы АЦП 4–7 на этих выводах не работают. Типичная картина: программа меряет напряжение на ADC5 или мигает светодиодом на PF6, а вывод не реагирует.

Есть два выхода. Первый — снять фьюз JTAGEN, то есть записать единицу в бит 6 старшего байта: заводское значение 0x99 превращается в 0xD9, а в наборах из таблицы выше JTAG уже выключен. Второй — оставить фьюз и отключать JTAG программой: бит JTD в регистре MCUCSR нужно записать дважды за четыре такта.

#include <avr/io.h>
#include <stdint.h>

/* Release PF4..PF7 from JTAG while the JTAGEN fuse stays programmed.
 * JTD must be written twice within four clock cycles: call it before sei(). */
static void jtag_disable(void)
{
  uint8_t v = MCUCSR | (1 << JTD);
  MCUCSR = v;
  MCUCSR = v;
}

Две записи подряд компилятор превращает в две команды OUT, которые выполняются за два такта. Если JTAG не подключён к другой аппаратуре, даташит советует его отключать в любом случае: иначе выход TDO может давать статический ток. Фьюз OCDEN не оставляют запрограммированным в готовом изделии: при включённой отладке часть тактовой системы работает во всех режимах сна, и потребление растёт.

Распиновка ATmega128: TQFP-64 и QFN/MLF-64

ATmega128 и ATmega128A выпускаются в корпусах TQFP-64 (14 × 14 мм, шаг выводов 0,8 мм) и QFN/MLF-64 (9 × 9 мм) с одинаковой нумерацией выводов. Нижнюю площадку корпуса QFN/MLF припаивают к общему проводу.

Распиновка ATmega128 и ATmega128A в корпусе TQFP-64 и QFN/MLF-64Вид сверху. Выводы 1–16 на левой стороне: PEN, порт E (PE0–PE7) и PB0–PB6. Выводы 17–32 внизу: PB7, PG3, PG4, RESET, VCC, GND, XTAL2, XTAL1 и порт D. Выводы 33–48 справа снизу вверх: PG0, PG1, порт C, PG2 и PA7–PA3. Выводы 49–64 вверху справа налево: PA2–PA0, VCC, GND, порт F от PF7 до PF0, AREF, GND и AVCC. Данные ISP идут через PE0 и PE1, такт — через PB1; интерфейс JTAG занимает PF4–PF7.ISP: PE0, PE1, PB1 и RESETJTAG: PF4–PF7питание и общий проводATmega128ATmega128ATQFP-64, QFN/MLF-64вид сверху1PEN2(RXD0/PDI) PE03(TXD0/PDO) PE14(XCK0/AIN0) PE25(OC3A/AIN1) PE36(OC3B/INT4) PE47(OC3C/INT5) PE58(T3/INT6) PE69(ICP3/INT7) PE710(SS) PB011(SCK) PB112(MOSI) PB213(MISO) PB314(OC0) PB415(OC1A) PB516(OC1B) PB617(OC2/OC1C) PB718(TOSC2) PG319(TOSC1) PG420RESET21VCC22GND23XTAL224XTAL125(SCL/INT0) PD026(SDA/INT1) PD127(RXD1/INT2) PD228(TXD1/INT3) PD329(ICP1) PD430(XCK1) PD531(T1) PD632(T2) PD733PG0 (WR)34PG1 (RD)35PC0 (A8)36PC1 (A9)37PC2 (A10)38PC3 (A11)39PC4 (A12)40PC5 (A13)41PC6 (A14)42PC7 (A15)43PG2 (ALE)44PA7 (AD7)45PA6 (AD6)46PA5 (AD5)47PA4 (AD4)48PA3 (AD3)49PA2 (AD2)50PA1 (AD1)51PA0 (AD0)52VCC53GND54PF7 (ADC7/TDI)55PF6 (ADC6/TDO)56PF5 (ADC5/TMS)57PF4 (ADC4/TCK)58PF3 (ADC3)59PF2 (ADC2)60PF1 (ADC1)61PF0 (ADC0)62AREF63GND64AVCCQFN/MLF: нижнюю площадкуприпаивают к GND
Распиновка ATmega128 и ATmega128A, вид сверху. Цветом выделены линии ISP и JTAG

Из 64 выводов 53 — линии ввода-вывода портов A–F (по 8) и порта G (5). Почти у каждой линии есть альтернативные функции:

ПортВыводыАльтернативные функцииОсобенности
A, PA0–PA751–44AD0–AD7 — шина адреса и данных XMEM—
B, PB0–PB710–17SS, SCK, MOSI, MISO, OC0, OC1A, OC1B, OC2/OC1Cдля ISP из порта B используется только SCK (PB1)
C, PC0–PC735–42A8–A15 — старший байт адреса XMEMв режиме M103C — только выход
D, PD0–PD725–32SCL/INT0, SDA/INT1, RXD1/INT2, TXD1/INT3, ICP1, XCK1, T1, T2TWI и USART1
E, PE0–PE72–9RXD0/PDI, TXD0/PDO, XCK0/AIN0, OC3A/AIN1, OC3B/INT4, OC3C/INT5, T3/INT6, ICP3/INT7PE0 и PE1 — линии данных ISP
F, PF0–PF761–54ADC0–ADC7; на PF4–PF7 — TCK, TMS, TDO, TDIпитается от AVCC; JTAG занимает PF4–PF7
G, PG0–PG433, 34, 43, 18, 19WR, RD, ALE, TOSC2, TOSC15 линий
ВыводНомерНазначение
PEN1вход разрешения программирования по ISP при включении питания; подтянут внутри, в работе не используется
RESET20сброс, активный уровень — низкий
VCC21, 52питание цифровой части
GND22, 53, 63общий провод
XTAL2, XTAL123, 24кварцевый резонатор; XTAL1 — вход внешнего тактового сигнала
AREF62опорное напряжение АЦП
AVCC64питание порта F и АЦП

Выход порта рассчитан на 20 мА при 5 В: напряжение единицы при этом не ниже 4,2 В, нуля — не выше 0,7 В у ATmega128 и 0,9 В у ATmega128A. Абсолютный максимум — 40 мА на вывод. Суммарный ток всех выводов не должен превышать 400 мА, а каждой из четырёх групп — 100 мА: PA0–PA7, PG2, PC3–PC7; PC0–PC2, PG0–PG1, PD0–PD7, XTAL2; PB0–PB7, PG3–PG4, PE0–PE7; PF0–PF7. Неиспользуемые выводы даташит советует не оставлять плавающими, а включать на них внутреннюю подтяжку: прямое соединение с питанием или землёй опасно, если вывод по ошибке станет выходом.

Периферия ATmega128

Таймеры-счётчики 0–3

ТаймерРазрядностьВыводыТактированиеОсобенности
T08 битOC0 (PB4); TOSC1, TOSC2 (PG4, PG3)1, 8, 32, 64, 128, 256, 1024 от системной частоты или кварц 32,768 кГцасинхронный режим для часов, работает в Power-save
T116 битOC1A (PB5), OC1B (PB6), OC1C (PB7), ICP1 (PD4), T1 (PD6)1, 8, 64, 256, 1024 или внешний вход T1три канала сравнения, захват, ШИМ 8, 9, 10 бит или с вершиной в ICR1 или OCR1A
T28 битOC2 (PB7), T2 (PD7)1, 8, 64, 256, 1024 или внешний вход T2ШИМ и счёт внешних импульсов
T316 битOC3A (PE3), OC3B (PE4), OC3C (PE5), ICP3 (PE7), T3 (PE6)как у T1нет в режиме M103C

Каналов ШИМ всего восемь: два 8-битных (OC0 и OC2) и шесть с разрядностью от 2 до 16 бит у таймеров 1 и 3. Но OC2 и OC1C выведены на один и тот же PB7. Когда включены оба, срабатывает модулятор OCM1C2: на вывод идёт их логическое И или ИЛИ в зависимости от бита PORTB7. Так можно, например, промодулировать несущую данными, как в ИК-пультах.

16-битные регистры таймеров (TCNT1, OCR1A, ICR1 и другие) пишут старшим байтом вперёд, а читают младшим вперёд: у каждого 16-битного таймера один временный регистр старшего байта на все его 16-битные регистры. На C компилятор соблюдает порядок сам, но если 16-битный регистр трогают и в прерывании, и в основной программе, доступ в основной программе нужно защитить от прерываний.

USART0 и USART1

Два USART умеют асинхронный и синхронный режимы, кадры с 5–9 битами данных, контроль чётности, 1 или 2 стоповых бита, режим двойной скорости U2X и мультипроцессорный режим с адресными кадрами. Скорость задаёт 12-битный регистр UBRR: у USART0 его старший байт UBRR0H и регистр UCSR0C находятся в расширенном вводе-выводе (0x90 и 0x95), поэтому в режиме M103C их нет. Выводы: RXD0 и TXD0 — PE0 и PE1 (те же, что для ISP), XCK0 — PE2; RXD1 и TXD1 — PD2 и PD3, XCK1 — PD5. Пример настройки — ниже, расчёт UBRR для любой частоты — в калькуляторе скорости UART.

SPI и TWI (I²C)

SPI занимает PB0 (SS), PB1 (SCK), PB2 (MOSI) и PB3 (MISO). Ведущим модуль тактирует шину частотой до fosc/2 — 8 МГц при кварце 16 МГц, ведомым гарантированно работает при SCK не выше fosc/4. Ловушка с выводом SS у ATmega128 та же, что у других AVR: если в режиме ведущего PB0 настроен на вход и на нём появился ноль, модуль сам переходит в режим ведомого. Подробно об этом и о режимах CPOL/CPHA — в статье про SPI.

TWI — аппаратный I²C на PD0 (SCL) и PD1 (SDA): ведущий и ведомый, 7-битные адреса, арбитраж, скорость до 400 кГц и пробуждение по совпадению адреса даже из Power-down. Подключение и подтягивающие резисторы — в статье про I²C.

АЦП и аналоговый компаратор

АЦП последовательного приближения разрядностью 10 бит подключён к порту F через мультиплексор:

  • 8 несимметричных входов ADC0–ADC7, диапазон от 0 до опорного напряжения.
  • Дифференциальные входы. С общим минусом ADC1 — семь каналов (плюс — ADC0 или ADC2–ADC7), с общим минусом ADC2 — ещё пять (ADC0, ADC1, ADC3–ADC5), все с единичным усилением. Пары ADC1–ADC0 и ADC3–ADC2 можно пропустить через усилитель 10× или 200×, а сочетания вроде ADC0–ADC0 нужны, чтобы измерить и вычесть собственное смещение. Результат дифференциального измерения — в дополнительном коде от −512 до +511. Даташит обещает около 8 бит реального разрешения при усилении 1× и 10× и около 7 бит при 200×; полоса усилителя — 4 кГц, после смены дифференциального канала усилителю нужно до 125 мкс на установку.
  • Опорное напряжение: AVCC, внутреннее 2,56 В (от 2,3 до 2,7 В по даташиту ATmega128A) или внешнее на AREF. При внутренних источниках на AREF ставят конденсатор на общий провод; если на AREF подано внешнее напряжение, внутренние источники включать нельзя — они замкнутся на него.
  • Скорость. Для полной точности тактовая частота АЦП должна быть 50–200 кГц. Преобразование длится 13 тактов АЦП (первое после включения — 25), так что при кварце 16 МГц и делителе 128 АЦП тактируется частотой 125 кГц и выдаёт около 9600 отсчётов в секунду.
  • Режимы: одиночный запуск битом ADSC или непрерывный (бит ADFR — у ATmega128 нет других источников автозапуска), а для минимального шума — запуск при входе в режим сна ADC Noise Reduction.

Аналоговый компаратор сравнивает AIN0 (PE2, плюс) и AIN1 (PE3, минус). На плюс можно подать внутреннее опорное напряжение около 1,23 В, а на минус — любой вход ADC0–ADC7 через мультиплексор АЦП: бит ACME в SFIOR при выключенном АЦП.

Внешние прерывания и режимы сна

Восемь внешних прерываний INT0–INT7 срабатывают по фронту, спаду или низкому уровню. INT0–INT3 (PD0–PD3) обнаруживаются асинхронно и будят кристалл из любого режима сна по фронту; у INT4–INT7 (PE4–PE7) для обнаружения фронта нужен работающий тактовый сигнал, поэтому из глубокого сна их будит только уровень. Режим сна выбирают биты SM2:0 в MCUCR — они расположены в непривычном порядке: SM1 и SM0 в битах 4 и 3, SM2 в бите 2.

РежимSM2:0Что работаетЧем разбудить
Idle000всё, кроме ядра и флеш-памятилюбым прерыванием
ADC Noise Reduction001АЦП, внешние прерывания, адрес TWI, асинхронный таймер 0, сторожевой таймерокончанием преобразования, этими прерываниями, сбросом
Power-down010только асинхронная логикаINT0–INT3, уровнем на INT4–INT7, адресом TWI, сбросом, в том числе от сторожевого таймера и BOD
Power-save011то же плюс таймер 0 от кварца 32,768 кГцкак Power-down и таймером 0
Standby110как Power-down, но основной генератор не останавливаетсякак Power-down; запуск за 6 тактов
Extended Standby111как Power-save, генератор работаеткак Power-save; запуск за 6 тактов

Standby и Extended Standby доступны только с внешним кварцем или резонатором. Перед глубоким сном выключают АЦП (ADEN = 0) и компаратор: сами они не отключаются.

Векторы прерываний ATmega128

Таблица векторов занимает адреса 0x0000–0x0044: 35 векторов по два слова, в каждом — команда JMP. Чем меньше адрес, тем выше приоритет. Векторы 25–35 в режиме ATmega103 не существуют. Фьюз BOOTRST переносит в секцию загрузчика вектор сброса, а бит IVSEL в MCUCR — остальные векторы.

№АдресИсточникИмя в avr-libc
10x0000сброс: питание, вывод RESET, BOD, сторожевой таймер, JTAG—
20x0002INT0, вывод PD0INT0_vect
30x0004INT1, вывод PD1INT1_vect
40x0006INT2, вывод PD2INT2_vect
50x0008INT3, вывод PD3INT3_vect
60x000AINT4, вывод PE4INT4_vect
70x000CINT5, вывод PE5INT5_vect
80x000EINT6, вывод PE6INT6_vect
90x0010INT7, вывод PE7INT7_vect
100x0012совпадение таймера 2TIMER2_COMP_vect
110x0014переполнение таймера 2TIMER2_OVF_vect
120x0016захват таймера 1TIMER1_CAPT_vect
130x0018совпадение A таймера 1TIMER1_COMPA_vect
140x001Aсовпадение B таймера 1TIMER1_COMPB_vect
150x001Cпереполнение таймера 1TIMER1_OVF_vect
160x001Eсовпадение таймера 0TIMER0_COMP_vect
170x0020переполнение таймера 0TIMER0_OVF_vect
180x0022SPI: передача завершенаSPI_STC_vect
190x0024USART0: байт принятUSART0_RX_vect
200x0026USART0: регистр данных пустUSART0_UDRE_vect
210x0028USART0: передача завершенаUSART0_TX_vect
220x002AАЦП: преобразование завершеноADC_vect
230x002CEEPROM готоваEE_READY_vect
240x002Eаналоговый компараторANALOG_COMP_vect
250x0030совпадение C таймера 1TIMER1_COMPC_vect
260x0032захват таймера 3TIMER3_CAPT_vect
270x0034совпадение A таймера 3TIMER3_COMPA_vect
280x0036совпадение B таймера 3TIMER3_COMPB_vect
290x0038совпадение C таймера 3TIMER3_COMPC_vect
300x003Aпереполнение таймера 3TIMER3_OVF_vect
310x003CUSART1: байт принятUSART1_RX_vect
320x003EUSART1: регистр данных пустUSART1_UDRE_vect
330x0040USART1: передача завершенаUSART1_TX_vect
340x0042TWITWI_vect
350x0044готовность SPMSPM_READY_vect

Программирование ATmega128: ISP, JTAG и загрузчик

ISP: данные идут через PE0 и PE1, а не через MOSI и MISO

Главная ловушка ATmega128. Программирование по ISP использует модуль SPI, но линии данных у него свои: вход PDI на PE0 (вывод 2) и выход PDO на PE1 (вывод 3). Тактовый сигнал SCK идёт, как обычно, на PB1 (вывод 11), сброс — на RESET (вывод 20). Выводы MOSI (PB2) и MISO (PB3) в программировании не участвуют — даташит подчёркивает это отдельно. Так было уже у ATmega103, так осталось у ATmega128, ATmega128A, ATmega1281 и ATmega2561.

Подключение ISP-программатора к ATmega128: данные через PE0 и PE1Разъём ISP на 6 контактов (в скобках — номера на 10-контактном разъёме): контакт 1 MISO соединён с PE1 (вывод 3, PDO), контакт 2 VTG — с VCC (выводы 21 и 52), контакт 3 SCK — с PB1 (вывод 11), контакт 4 MOSI — с PE0 (вывод 2, PDI), контакт 5 RST — с RESET (вывод 20), контакт 6 GND — с выводами GND 22, 53 и 63. Выводы PB2 (MOSI) и PB3 (MISO) модуля SPI к программатору не подключаются.6 конт.10 конт.MISO193PE1 (TXD0/PDO)VTG2221, 52VCCSCK3711PB1 (SCK)MOSI412PE0 (RXD0/PDI)RST5520RESETGND64, 6, 8, 1022, 53, 63GNDMOSI программатора → PDIMISO программатора ← PDOXP1 — разъём ISPнумерация по AVR042ATmega128ATmega128A12PB2 (MOSI)13PB3 (MISO)MOSI и MISO модуля SPIк программатору не подключают
Подключение ISP-программатора: MOSI программатора — на PE0 (PDI), MISO — на PE1 (PDO), SCK — на PB1. Номера контактов разъёма — по AVR042
Сигнал программатораРазъём 6 конт.Разъём 10 конт.Вывод ATmega128
MOSI41PE0 (PDI), вывод 2
MISO19PE1 (PDO), вывод 3
SCK37PB1, вывод 11
RST55RESET, вывод 20
VTG22VCC, выводы 21 и 52
GND64, 6, 8, 10GND, выводы 22, 53 и 63

Ошибку обычно делают, перенося разводку с ATmega328P или ATmega2560, у которых ISP действительно сидит на MOSI и MISO порта B. Программатор при этом обычно сообщает сигнатуру 0x000000 или 0xFFFFFF. Ещё три правила для разъёма ISP:

  • PE0 и PE1 — это ещё и RXD0 и TXD0. Если к USART0 подключён преобразователь USB–UART или RS-232, его выход держит линию RXD0 и мешает программатору управлять PE0. AVR042 советует защищать линии ISP, к которым подключено что-то ещё, последовательными резисторами — типовое значение 330 Ом — или разрывать их перемычкой на время прошивки.
  • Частота SCK. Высокий и низкий уровни SCK должны длиться больше двух тактов процессора (при тактовой частоте от 12 МГц — больше трёх). У нового кристалла ядро работает от RC-генератора 1 МГц, значит, SCK должен быть ниже 250 кГц. После перехода на кварц 16 МГц предел поднимается примерно до 2,6 МГц.
  • Вход PEN. Вместо сигнала RESET в режим программирования можно войти, удерживая PEN (вывод 1) в нуле при включении питания. Чтобы потом вернуться к обычной работе, питание приходится выключать. На плате PEN оставляют свободным: он подтянут внутри.

Прошивка через avrdude

avrdude знает ATmega128 как m128 и ATmega128A как m128a. Пример для недорогого программатора USBasp: сначала прочитать сигнатуру на медленной частоте, затем записать фьюзы для кварца 16 МГц и программу.

avrdude -c usbasp -p m128 -B 125kHz
avrdude -c usbasp -p m128 -B 125kHz -U lfuse:w:0xff:m -U hfuse:w:0xc9:m -U efuse:w:0xff:m
avrdude -c usbasp -p m128 -U flash:w:firmware.hex:i

Ключ -B задаёт частоту SCK; в avrdude 8 её можно указать в герцах, в старых версиях — периодом в микросекундах (-B 8 — те же 125 кГц). Формат m означает, что значение фьюза записано прямо в командной строке. После перехода на кварц 16 МГц предел частоты SCK поднимается почти до 2,6 МГц, поэтому программу можно записывать быстрее.

JTAG: программирование и отладка

Через JTAG ATmega128 и прошивают, и отлаживают пошагово (On-Chip Debug) — например, отладчиком Atmel-ICE. Для прошивки нужен запрограммированный JTAGEN, для отладки — ещё и OCDEN. По даташиту программирование через JTAG не требует управления выводами RESET и тактирования: хватает четырёх сигналов TAP. Если программа отключает JTAG битом JTD, прошивка через JTAG по-прежнему возможна: нужно удерживать RESET в нуле, и через два такта JTD сбросится. Для пошаговой отладки так нельзя — выводы JTAG должны быть отданы ему целиком.

Контакт разъёмаСигналВывод ATmega128
1TCKPF4, вывод 57
3TDOPF6, вывод 55
5TMSPF5, вывод 56
9TDIPF7, вывод 54
4VTrefVCC
6nSRSTRESET, вывод 20
8nTRSTне подключают: вывода TRST у ATmega128 нет
2, 10GNDобщий провод

Раскладка разъёма — стандартная 10-контактная по AVR042. Выводы JTAG одновременно входы АЦП, и AVR042 предупреждает: конденсатор аналогового фильтра на таком входе мешает программированию, на время работы с JTAG его отключают, а нагрузка линий должна быть резистивной.

Загрузчик и самопрограммирование

Загрузчик — программа в секции загрузчика, которая принимает новую прошивку по UART, SPI или другому интерфейсу и пишет её во флеш-память командой SPM. Чтобы загрузчик запускался после сброса, программируют BOOTRST: вектор сброса переезжает на начало секции загрузчика (байтовый адрес 0x1E000 при BOOTSZ1:0 = 00). Прерывания загрузчику переносят битом IVSEL в MCUCR, причём бит меняют защищённой последовательностью: сначала единица в IVCE, затем за 4 такта новое значение IVSEL.

Защищают секции биты блокировки BLB0x и BLB1x: можно запретить SPM запись в секцию приложения или в саму секцию загрузчика и запретить чтение одной секции из другой. Снять эти биты, как и LB1 и LB2, можно только полным стиранием кристалла. Загрузчик не работает в режиме M103C — это ещё одна причина снимать этот фьюз.

Высоковольтное параллельное программирование

Последнее средство, когда ISP и JTAG недоступны: параллельное программирование с напряжением 11,5–12,5 В на выводе RESET. Им можно исправить любые фьюзы, включая SPIEN и JTAGEN. Нужен параллельный программатор: по AVR080, параллельное программирование ATmega128 поддерживает, например, STK500. Если фьюзы выбрали внешний кварц или RC-цепочку и тактировать кристалл через XTAL1 не получается, даташит предлагает особый порядок входа в режим: подать питание одновременно с 12 В на RESET и первым делом переключить CKSEL3:0 на внешний тактовый сигнал (0000).

Минимальная схема включения ATmega128

Ниже — схема по рекомендациям даташита и AVR042 для питания 5 В и кварца 16 МГц. Без кварца, на внутреннем RC-генераторе, схема ещё проще, но для UART точности RC-генератора обычно не хватает.

Минимальная схема включения ATmega128 с кварцем 16 МГц и разъёмом ISPПитание +5 В подано на выводы VCC 21 и 52, у каждого — конденсатор 100 нФ на общий провод; выводы GND 22, 53 и 63 соединены с общим проводом. AVCC (вывод 64) подключён к +5 В через дроссель L1 10 мкГн, с конденсатором C6 100 нФ на общий провод. На AREF (вывод 62) — конденсатор C5 100 нФ. Между XTAL1 (вывод 24) и XTAL2 (вывод 23) — кварцевый резонатор 16 МГц, от каждого вывода на общий провод — конденсаторы 22 пФ. RESET (вывод 20) подтянут к +5 В резистором R1 10 кОм, с конденсатором C7 100 нФ на общий провод. Разъём ISP на 6 контактов: RST — к RESET, MOSI — к PE0 (вывод 2), MISO — к PE1 (вывод 3), SCK — к PB1 (вывод 11), VTG — к +5 В, GND — к общему проводу. Вывод PEN (1) оставлен свободным: у него внутренняя подтяжка.+5 В21VCC52VCCC1100 нФC2100 нФATmega128ATmega128ATQFP-6422GND53GND63GND1PENсвободен: подтяжка внутриZQ116 МГцC322 пФC422 пФ2324XTAL2XTAL1C5100 нФ62AREFL110 мкГнC6100 нФ64AVCCR110 кОмC7100 нФ20RESET5RST2PE0 (RXD0/PDI)4MOSI3PE1 (TXD0/PDO)1MISO11PB1 (SCK)3SCK+5 В2VTG6GNDXP1 — ISP
Минимальная схема включения ATmega128 или ATmega128A: развязка питания, LC-фильтр AVCC, кварц 16 МГц, цепь сброса и разъём ISP на PE0, PE1 и PB1
  • Развязка питания. Конденсатор 100 нФ — у каждой пары выводов VCC и GND (21–22 и 52–53), с минимальной петлёй до выводов. AVR042 требует отдельный конденсатор на каждую пару выводов питания и ещё один, керамический или танталовый, на входе питания платы.
  • AVCC — через LC-фильтр. Вывод AVCC питает порт F и АЦП, и даташит требует подключать его к VCC даже без АЦП, а напряжения не должны отличаться больше чем на 0,3 В. С АЦП AVCC питают через дроссель 10 мкГн с конденсатором 100 нФ — схема из раздела даташита о снижении шумов АЦП.
  • AREF. При опоре от AVCC или внутреннего источника 2,56 В — конденсатор 100 нФ на общий провод. Внешнее опорное напряжение подают сюда же, но тогда внутренние источники не выбирают.
  • Кварц 16 МГц с конденсаторами 22 пФ — верхняя граница рекомендованного даташитом диапазона 12–22 пФ, — как можно ближе к XTAL1 и XTAL2. Фьюзы: CKSEL3:0 = 1111, CKOPT запрограммирован.
  • RESET подтянут к питанию резистором: AVR042 рекомендует не меньше 4,7 кОм, на схеме — 10 кОм, внутренняя подтяжка 30–85 кОм в шумной обстановке слабовата. Конденсатор 100 нФ на общий провод дополнительно защищает от помех. Высоковольтное программирование требует, чтобы RESET выдерживал 12 В, поэтому внутреннего диода на питание у этого вывода нет; если HV-программирование не нужно, AVR042 советует поставить внешний диод от RESET к VCC.
  • Разъём ISP — на PE0, PE1, PB1 и RESET, как в предыдущем разделе.
  • PEN оставляют свободным, а у корпуса QFN/MLF нижнюю площадку соединяют с общим проводом.

Пример на C: эхо через USART0 на 9600 бит/с

Программа для avr-gcc и avr-libc: ATmega128 или ATmega128A, кварц 16 МГц, фьюзы Low = 0xFF, High = 0xC9, Extended = 0xFF. Всё, что приходит на RXD0 (PE0), отправляется обратно через TXD0 (PE1) в формате 8N1.

Значение регистра скорости при U2X = 0 считается по формуле из даташита:

UBRR=fOSC16⋅BAUD−1=16 000 00016⋅9600−1≈103,2  ⇒  103\text{UBRR} = \frac{f_\text{OSC}}{16 \cdot \text{BAUD}} - 1 = \frac{16\,000\,000}{16 \cdot 9600} - 1 \approx 103{,}2 \;\Rightarrow\; 103

Реальная скорость — 16 000 000 / (16 · 104) = 9615 бит/с, на 0,2 % выше номинала; это значение есть и в таблице даташита. Заголовок util/setbaud.h делает тот же расчёт при компиляции и сам решает, нужен ли U2X: по умолчанию он допускает ошибку до 2 %.

/* ATmega128/ATmega128A, 16 MHz crystal, fuses L=0xFF H=0xC9 E=0xFF.
 * USART0 echo at 9600 baud, 8N1: RXD0 = PE0, TXD0 = PE1. */
#define F_CPU 16000000UL
#define BAUD 9600

#include <avr/io.h>
#include <stdint.h>
#include <util/setbaud.h>

static void usart0_init(void)
{
  UBRR0H = UBRRH_VALUE;                   /* 0 */
  UBRR0L = UBRRL_VALUE;                   /* 103: 9615 baud, +0.2 % */
#if USE_2X
  UCSR0A |= (1 << U2X0);
#else
  UCSR0A &= ~(1 << U2X0);
#endif
  UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); /* 8 data bits, no parity, 1 stop bit */
  UCSR0B = (1 << RXEN0) | (1 << TXEN0);
}

static uint8_t usart0_getc(void)
{
  while (!(UCSR0A & (1 << RXC0))) {}
  return UDR0;
}

static void usart0_putc(uint8_t c)
{
  while (!(UCSR0A & (1 << UDRE0))) {}
  UDR0 = c;
}

int main(void)
{
  usart0_init();
  for (;;) {
    usart0_putc(usart0_getc());
  }
}

Сборка и прошивка:

avr-gcc -mmcu=atmega128 -Os -o echo.elf echo.c
avr-objcopy -O ihex -R .eeprom echo.elf echo.hex
avrdude -c usbasp -p m128 -U flash:w:echo.hex:i

UCSR0C после сброса и так равен 0x06 (8N1), строка с ним оставлена для наглядности. В режиме M103C регистров UBRR0H и UCSR0C нет, и запись в них попадёт в SRAM — ещё одна причина сначала снять этот фьюз. Преобразователь USB–UART подключают крест-накрест: его TXD — к RXD0 (PE0), его RXD — к TXD0 (PE1); для настоящего COM-порта нужен преобразователь уровней, о нём — в статье про RS-232. На время прошивки по ISP преобразователь отключают от PE0 или ставят в эту линию резистор.

Без кварца, на заводских фьюзах, ядро работает от RC-генератора 1 МГц. Тогда для 9600 бит/с даташит даёт UBRR = 6 с ошибкой −7 % — связь не работает — или UBRR = 12 с ошибкой 0,2 % в режиме U2X. Но к этим 0,2 % добавляется погрешность самого генератора до ±3 %, а для кадра 8N1 в режиме U2X даташит рекомендует ошибку приёмника не больше ±1,5 %. Подобрать кварц и UBRR для других скоростей поможет калькулятор скорости UART.

Типичные ошибки и отладка

СимптомВероятная причинаЧто сделать
Программатор не видит кристалл, сигнатура 0x000000 или 0xFFFFFFMOSI и MISO программатора подключены к PB2 и PB3MOSI — на PE0 (вывод 2), MISO — на PE1 (вывод 3)
Кристалл не шьётся, пока подключён USB–UART или RS-232преобразователь держит линию RXD0 = PE0резистор 330 Ом или перемычка в линии RXD0
Новый кристалл отвечает через раз или не отвечаетSCK быстрее 250 кГц при заводском RC-генераторе 1 МГцснизить SCK до 125 кГц и ниже
Программа на новом кристалле зависает, нет USART1, TWI, таймера 3, порт C работает на выход сразу после включениязапрограммирован M103CExtended = 0xFF
PF4–PF7 не переключаются, каналы АЦП 4–7 дают ерундувключён JTAGHigh: JTAGEN = 1 или программно бит JTD
АЦП врёт или порт F не работает совсемAVCC не подключён или питание АЦП без фильтраAVCC — к VCC через LC-фильтр, разница не больше 0,3 В
Кварц 16 МГц не запускается или работает со сбоямиCKOPT не запрограммированHigh = 0xC9 (CKOPT = 0)
После записи фьюзов кристалл перестал отвечатьвыбран кварц, RC-цепочка или внешний генератор, которых нет на платеподать такт на XTAL1, исправить фьюзы; иначе JTAG или высоковольтное программирование
Таблица во флеш-памяти читается мусоромданные лежат выше 64 КБ, а читаются через LPMpgm_get_far_address() и pgm_read_byte_far()
Программа периодически перезапускаетсясторожевой таймер не сбрасывается или запрограммирован WDTONпроверить флаги WDRF и BORF в MCUCSR в начале программы
В режиме сна потребление в разы выше ожидаемогозапрограммирован OCDEN, включены АЦП или компаратор, висят входыOCDEN = 1, ADEN = 0, ACD = 1, подтяжки на свободных выводах

Как оживить кристалл после неверных фьюзов

Чаще всего ISP перестаёт работать из-за фьюзов тактирования: программирование по ISP идёт от системной частоты, и если выбран источник, которого нет, ядро стоит. AVR080 прямо предупреждает, что после такой ошибки вернуться в режим ISP может оказаться невозможно. Порядок действий:

  1. Определите, что было записано. Если выбран кварц (CKSEL3:0 = 1111–1010), впаяйте его с конденсаторами. Если RC-цепочка — поставьте R и C на XTAL1. Подать в этих режимах внешний такт на XTAL1 может не получиться: даташит прямо оговаривает это для параллельного программирования.
  2. Если выбран внешний тактовый сигнал (0000), подайте на XTAL1 меандр с размахом от нуля до напряжения питания — с генератора или вывода другого микроконтроллера, например 1 МГц, — и установите частоту SCK программатора ниже четверти этой частоты. Затем запишите правильные фьюзы.
  3. Если JTAGEN остался запрограммированным, исправьте фьюзы через JTAG: по даташиту для этого не нужно управлять выводами сброса и тактирования.
  4. Если не помогло ничего, остаётся высоковольтное параллельное программирование с 12 В на RESET.

Отключить сам вывод RESET фьюзом у ATmega128 нельзя — такого фьюза, как RSTDISBL у ATmega328P, у него нет, — а SPIEN нельзя изменить по ISP. Поэтому, если работать только через ISP, потерять доступ к кристаллу можно лишь ошибкой в фьюзах тактирования.

Для остальных кристаллов семейства — сравнение серий, программаторы и среды разработки — смотрите раздел об AVR. Регистры, флаги и такты команд разобраны в статье «Система команд AVR», подключение периферии — в статьях про SPI, I²C и RS-232.

Частые вопросы

Чем ATmega128A отличается от ATmega128?

По функциям и выводам ничем: в указании по применению AVR525 Atmel называет ATmega128A прямой заменой ATmega128, сигнатура у обоих 0x1E 0x97 0x02, так что прошивка и значения фьюзов переносятся без изменений. Отличаются электрические параметры. ATmega128A работает от 2,7 до 5,5 В (16 МГц — при 4,5–5,5 В), а ATmega128 рассчитан на 4,5–5,5 В, для 2,7–5,5 В выпускался ATmega128L до 8 МГц. Типовой ток в активном режиме у ATmega128A меньше на 40–42 %: 9,8 мА против 17 мА при 5 В и 8 МГц.

Какие фьюзы у ATmega128 с завода и что поставить для кварца 16 МГц?

С завода Extended = 0xFD, High = 0x99, Low = 0xE1: тактирование от внутреннего RC-генератора 1 МГц, включены режим совместимости с ATmega103 (M103C) и JTAG, секция загрузчика 8 КБ. Для кварца 16 МГц без BOD, с выключенными JTAG и M103C: Low = 0xFF, High = 0xC9, Extended = 0xFF. Обязательно запрограммировать CKOPT (бит 4 старшего байта равен 0): без него генератор рассчитан на кварцы только до 8 МГц.

Почему программатор не видит ATmega128?

Чаще всего из-за подключения: у ATmega128 данные ISP идут не через MOSI и MISO порта B, а через PE0 (вход PDI) и PE1 (выход PDO), SCK остаётся на PB1. Вторая причина — слишком быстрый SCK: новый кристалл работает от RC-генератора 1 МГц, и частота SCK должна быть ниже 250 кГц. Третья — линии PE0 и PE1 заняты преобразователем UART, ведь это ещё и RXD0 и TXD0, или фьюзы выбрали источник тактирования, которого на плате нет.

Что такое режим совместимости с ATmega103 и как его выключить?

В этом режиме ATmega128 ведёт себя как ATmega103: пропадают расширенное пространство ввода-вывода, USART1, TWI, таймер 3 и загрузчик, а SRAM переезжает на адреса 0x0060–0x0FFF. Фьюз M103C запрограммирован с завода и у ATmega128, и у ATmega128A. Программа, собранная avr-gcc для atmega128, в этом режиме работать не будет: стек ставится на 0x10FF, а внутренняя SRAM теперь заканчивается на 0x0FFF. Выключают режим записью расширенного байта фьюзов 0xFF (M103C = 1).

Можно ли заменить ATmega128 на ATmega1281 или ATmega2561?

По выводам — да: в AVR097 Atmel называет ATmega128 и ATmega1281/2561 совместимым подсемейством, и ISP у них тоже идёт через PE0 и PE1. Но прошивку придётся пересобрать и проверить: у новых кристаллов 8 КБ ОЗУ, 57 векторов прерываний вместо 35, другие фьюзы тактирования, таймеры 0 и 2 поменялись ролями, часть битов переехала в другие регистры (MCUCSR стал MCUSR, регистра SFIOR нет), а режима совместимости с ATmega103 нет совсем.

Как освободить выводы PF4–PF7, занятые JTAG?

Снять фьюз JTAGEN (бит 6 старшего байта = 1) — тогда PF4–PF7 становятся обычными линиями порта F и входами АЦП. Если фьюзы трогать нельзя, программа отключает JTAG сама: бит JTD в регистре MCUCSR записывают в единицу дважды за четыре такта. Прошить такой кристалл через JTAG всё равно можно — достаточно удерживать RESET в нуле, и бит JTD сбросится через два такта.

Источники

  1. Atmel. ATmega128/ATmega128L Datasheet (2467X–AVR–06/11) — совместимость с ATmega103, заводская поставка в режиме M103C, фьюзы, DC-характеристики и скорости ATmega128 и ATmega128L, исполнения на 105 °C
  2. Atmel. ATmega128A Datasheet Complete (Atmel-8151J, 09/2015) — распиновка, ядро, карта памяти, XMEM, CKSEL и CKOPT, фьюзы, загрузчик и RWW, векторы прерываний, периферия, ISP-выводы, таблицы UBRR, электрические характеристики, errata
  3. Atmel. AVR525: Migration from ATmega128 to ATmega128A (8166A, 05/2009) — ATmega128A — функционально идентичная прямая замена; токи потребления и VOL
  4. Atmel. AVR080: Replacing ATmega103 by ATmega128 (2501D, 01/2004) — M103C запрограммирован по умолчанию; что недоступно в режиме совместимости; заводские фьюзы, JTAGEN, ISP через PE0 и PE1, параллельное программирование на STK500
  5. Atmel. AVR097: Migration between ATmega128 and ATmega1281/ATmega2561 (2581F, 04/2008) — совместимость по выводам, переименованные регистры, 35 и 57 векторов, таймеры 0 и 2, BOD, сторожевой таймер, XDIV
  6. Atmel. ATmega103(L) Datasheet (0945I–AVR–02/07) — 121 команда, до 6 МГц, 4000 байт SRAM, один UART, линии ввода-вывода, ресурс флеш-памяти
  7. Microchip. ATmega640/V-1280/V-1281/V-2560/V-2561/V Data Sheet (DS40002211A) — сводка конфигураций, корпуса и скорости; выводы ISP: PB2 и PB3 в TQFP-100, PE0 и PE1 в TQFP-64
  8. Atmel. AVR042: AVR Hardware Design Considerations (Atmel-2521R, 09/2016) — развязка питания и AVCC, цепь RESET, разъёмы ISP на 6 и 10 контактов и JTAG, резисторы на общих линиях ISP
  9. Microchip. Atmel-ICE User Guide (DS50002999A) — программирование и отладка 8-битных AVR через JTAG
  10. Microchip. AVR Instruction Set Manual (DS40002198) — приложение A: у ATmega128 и ATmega128A нет только EIJMP и EICALL; LPM, ELPM и RAMPZ, команды умножения
  11. AVR-LibC: util/setbaud.h, avr/pgmspace.h и include/avr/iom128.h — расчёт UBRR при компиляции, pgm_read_byte_far и pgm_get_far_address, имена регистров и векторов, заводские фьюзы и RAMEND в заголовке iom128.h
  12. AVRDUDE 8.0 Manual: Option Descriptions — ключи -p, -B и -U, запись фьюзов в формате m