ATmega128 и ATmega128A
ATmega128 — 8-битный микроконтроллер AVR со 128 КБ флеш-памяти, 4 КБ ОЗУ и 4 КБ EEPROM в 64-выводном корпусе, ATmega128A — его обновлённая версия, совместимая по выводам и прошивке. Ниже — устройство, распиновка, фьюзы и схема включения по даташитам, а также три ловушки, о которые спотыкаются чаще всего: режим ATmega103, включённый с завода JTAG и ISP на выводах PE0 и PE1.
Обновлено Редакция GAW
Содержание
- ATmega128 в семействе AVR: от ATmega103 до ATmega2560
- ATmega128 и ATmega128A: отличия и совместимость
- Архитектура ядра ATmega128
- Память ATmega128: флеш, SRAM, EEPROM и внешняя шина
- Режим совместимости с ATmega103: фьюз M103C
- Тактирование ATmega128: источники, CKOPT и время запуска
- Фьюзы ATmega128: таблица и заводские значения
- Распиновка ATmega128: TQFP-64 и QFN/MLF-64
- Периферия ATmega128
- Векторы прерываний ATmega128
- Программирование ATmega128: ISP, JTAG и загрузчик
- Минимальная схема включения ATmega128
- Пример на C: эхо через USART0 на 9600 бит/с
- Типичные ошибки и отладка
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/O | USART | Таймеры 8 / 16 бит | Корпус | Частота, до | Данные ISP |
|---|---|---|---|---|---|---|---|---|
| ATmega103 | 128 КБ | 4000 байт | 32 + 8 выходов + 8 входов | 1 UART | 2 / 1 | TQFP-64 | 6 МГц | PE0, PE1 |
| ATmega128, ATmega128L | 128 КБ | 4 КБ | 53 | 2 | 2 / 2 | TQFP-64, QFN/MLF-64 | 16 МГц, у 128L — 8 МГц | PE0, PE1 |
| ATmega128A | 128 КБ | 4 КБ | 53 | 2 | 2 / 2 | TQFP-64, QFN/MLF-64 | 16 МГц | PE0, PE1 |
| ATmega1281 | 128 КБ | 8 КБ | 54 | 2 | 2 / 4 | TQFP-64, QFN/MLF-64 | 16 МГц | PE0, PE1 |
| ATmega2561 | 256 КБ | 8 КБ | 54 | 2 | 2 / 4 | TQFP-64, QFN/MLF-64 | 16 МГц | PE0, PE1 |
| ATmega1280 | 128 КБ | 8 КБ | 86 | 4 | 2 / 4 | TQFP-100, CBGA-100 | 16 МГц | PB2, PB3 |
| ATmega2560 | 256 КБ | 8 КБ | 86 | 4 | 2 / 4 | TQFP-100, CBGA-100 | 16 МГц | 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, ATmega128L | ATmega128A |
|---|---|---|
| Питание и наибольшая частота | 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 МГц.
- Регистры и АЛУ. 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, к которой обращаются через регистры ввода-вывода.
Флеш-память и секция загрузчика
Флеш-память на 128 КБ организована как 64K слов по 16 бит и выдерживает не меньше 10 000 циклов записи и стирания. Пишется она страницами по 128 слов (256 байт), всего страниц 512. Память делится на две части: секцию приложения в начале и секцию загрузчика в конце. Размер секции загрузчика задают фьюзы BOOTSZ1:0, а команда SPM, которая пишет во флеш-память, работает только из секции загрузчика.
| BOOTSZ1 | BOOTSZ0 | Секция загрузчика | Начало, адрес слова | Начало, адрес байта |
|---|---|---|---|---|
| 1 | 1 | 512 слов (1 КБ) | 0xFE00 | 0x1FC00 |
| 1 | 0 | 1024 слова (2 КБ) | 0xFC00 | 0x1F800 |
| 0 | 1 | 2048 слов (4 КБ) | 0xF800 | 0x1F000 |
| 0 | 0 | 4096 слов (8 КБ), заводская настройка | 0xF000 | 0x1E000 |
Даташит приводит адреса в словах, а компоновщик 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–0x005F | 64 регистра ввода-вывода | IN и OUT по адресам 0x00–0x3F; SBI, CBI, SBIC и SBIS — только 0x00–0x1F |
| 0x0060–0x00FF | 160 регистров расширенного ввода-вывода | только 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 МГц, но генератор потребляет больше.
| CKOPT | CKSEL3:1 | Частота | C1 и C2 для кварца |
|---|---|---|---|
| 1 | 101 | 0,4–0,9 МГц, только керамический резонатор | — |
| 1 | 110 | 0,9–3,0 МГц | 12–22 пФ |
| 1 | 111 | 3,0–8,0 МГц | 12–22 пФ |
| 0 | 101, 110, 111 | 1,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 их уже не изменить, поэтому сначала пишут фьюзы, потом биты защиты.
| Байт | Бит | Фьюз | Назначение | С завода |
|---|---|---|---|---|
| Extended | 1 | M103C | режим совместимости с ATmega103 | 0 — включён |
| Extended | 0 | WDTON | сторожевой таймер включён всегда | 1 — нет |
| High | 7 | OCDEN | отладка через JTAG | 1 — выключена |
| High | 6 | JTAGEN | интерфейс JTAG на PF4–PF7 | 0 — включён |
| High | 5 | SPIEN | программирование по ISP | 0 — разрешено |
| High | 4 | CKOPT | режим генератора: полный размах до 16 МГц | 1 — экономичный режим |
| High | 3 | EESAVE | сохранять EEPROM при стирании кристалла | 1 — не сохранять |
| High | 2, 1 | BOOTSZ1:0 | размер секции загрузчика | 00 — 8 КБ |
| High | 0 | BOOTRST | начинать работу с секции загрузчика | 1 — с адреса 0 |
| Low | 7 | BODLEVEL | порог BOD: 1 — 2,7 В, 0 — 4,0 В | 1 |
| Low | 6 | BODEN | детектор пониженного питания | 1 — выключен |
| Low | 5, 4 | SUT1:0 | время запуска | 10 — максимальное |
| Low | 3–0 | CKSEL3: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 или параллельным программатором.
Типовые наборы фьюзов
| Конфигурация | Low | High | Extended |
|---|---|---|---|
| Заводская: RC-генератор 1 МГц, M103C и JTAG включены | 0xE1 | 0x99 | 0xFD |
| Кварц 16 МГц, BOD выключен, JTAG и M103C выключены | 0xFF | 0xC9 | 0xFF |
| Кварц 16 МГц, BOD на 4,0 В, JTAG и M103C выключены | 0x1F | 0xC9 | 0xFF |
| RC-генератор 8 МГц, JTAG и M103C выключены | 0xE4 | 0xD9 | 0xFF |
Во всех строках, кроме заводской, секция загрузчика остаётся 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 задают уровень защиты от случайного отключения:
| M103C | WDTON | Уровень | Сторожевой таймер после сброса | Как изменить настройки |
|---|---|---|---|---|
| не запрограммирован | не запрограммирован | 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 припаивают к общему проводу.
Из 64 выводов 53 — линии ввода-вывода портов A–F (по 8) и порта G (5). Почти у каждой линии есть альтернативные функции:
| Порт | Выводы | Альтернативные функции | Особенности |
|---|---|---|---|
| A, PA0–PA7 | 51–44 | AD0–AD7 — шина адреса и данных XMEM | — |
| B, PB0–PB7 | 10–17 | SS, SCK, MOSI, MISO, OC0, OC1A, OC1B, OC2/OC1C | для ISP из порта B используется только SCK (PB1) |
| C, PC0–PC7 | 35–42 | A8–A15 — старший байт адреса XMEM | в режиме M103C — только выход |
| D, PD0–PD7 | 25–32 | SCL/INT0, SDA/INT1, RXD1/INT2, TXD1/INT3, ICP1, XCK1, T1, T2 | TWI и USART1 |
| E, PE0–PE7 | 2–9 | RXD0/PDI, TXD0/PDO, XCK0/AIN0, OC3A/AIN1, OC3B/INT4, OC3C/INT5, T3/INT6, ICP3/INT7 | PE0 и PE1 — линии данных ISP |
| F, PF0–PF7 | 61–54 | ADC0–ADC7; на PF4–PF7 — TCK, TMS, TDO, TDI | питается от AVCC; JTAG занимает PF4–PF7 |
| G, PG0–PG4 | 33, 34, 43, 18, 19 | WR, RD, ALE, TOSC2, TOSC1 | 5 линий |
| Вывод | Номер | Назначение |
|---|---|---|
| PEN | 1 | вход разрешения программирования по ISP при включении питания; подтянут внутри, в работе не используется |
| RESET | 20 | сброс, активный уровень — низкий |
| VCC | 21, 52 | питание цифровой части |
| GND | 22, 53, 63 | общий провод |
| XTAL2, XTAL1 | 23, 24 | кварцевый резонатор; XTAL1 — вход внешнего тактового сигнала |
| AREF | 62 | опорное напряжение АЦП |
| AVCC | 64 | питание порта 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
| Таймер | Разрядность | Выводы | Тактирование | Особенности |
|---|---|---|---|---|
| T0 | 8 бит | OC0 (PB4); TOSC1, TOSC2 (PG4, PG3) | 1, 8, 32, 64, 128, 256, 1024 от системной частоты или кварц 32,768 кГц | асинхронный режим для часов, работает в Power-save |
| T1 | 16 бит | OC1A (PB5), OC1B (PB6), OC1C (PB7), ICP1 (PD4), T1 (PD6) | 1, 8, 64, 256, 1024 или внешний вход T1 | три канала сравнения, захват, ШИМ 8, 9, 10 бит или с вершиной в ICR1 или OCR1A |
| T2 | 8 бит | OC2 (PB7), T2 (PD7) | 1, 8, 64, 256, 1024 или внешний вход T2 | ШИМ и счёт внешних импульсов |
| T3 | 16 бит | 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 | Что работает | Чем разбудить |
|---|---|---|---|
| Idle | 000 | всё, кроме ядра и флеш-памяти | любым прерыванием |
| ADC Noise Reduction | 001 | АЦП, внешние прерывания, адрес TWI, асинхронный таймер 0, сторожевой таймер | окончанием преобразования, этими прерываниями, сбросом |
| Power-down | 010 | только асинхронная логика | INT0–INT3, уровнем на INT4–INT7, адресом TWI, сбросом, в том числе от сторожевого таймера и BOD |
| Power-save | 011 | то же плюс таймер 0 от кварца 32,768 кГц | как Power-down и таймером 0 |
| Standby | 110 | как Power-down, но основной генератор не останавливается | как Power-down; запуск за 6 тактов |
| Extended Standby | 111 | как Power-save, генератор работает | как Power-save; запуск за 6 тактов |
Standby и Extended Standby доступны только с внешним кварцем или резонатором. Перед глубоким сном выключают АЦП (ADEN = 0) и компаратор: сами они не отключаются.
Векторы прерываний ATmega128
Таблица векторов занимает адреса 0x0000–0x0044: 35 векторов по два слова, в каждом — команда JMP. Чем меньше адрес, тем выше приоритет. Векторы 25–35 в режиме ATmega103 не существуют. Фьюз BOOTRST переносит в секцию загрузчика вектор сброса, а бит IVSEL в MCUCR — остальные векторы.
| № | Адрес | Источник | Имя в avr-libc |
|---|---|---|---|
| 1 | 0x0000 | сброс: питание, вывод RESET, BOD, сторожевой таймер, JTAG | — |
| 2 | 0x0002 | INT0, вывод PD0 | INT0_vect |
| 3 | 0x0004 | INT1, вывод PD1 | INT1_vect |
| 4 | 0x0006 | INT2, вывод PD2 | INT2_vect |
| 5 | 0x0008 | INT3, вывод PD3 | INT3_vect |
| 6 | 0x000A | INT4, вывод PE4 | INT4_vect |
| 7 | 0x000C | INT5, вывод PE5 | INT5_vect |
| 8 | 0x000E | INT6, вывод PE6 | INT6_vect |
| 9 | 0x0010 | INT7, вывод PE7 | INT7_vect |
| 10 | 0x0012 | совпадение таймера 2 | TIMER2_COMP_vect |
| 11 | 0x0014 | переполнение таймера 2 | TIMER2_OVF_vect |
| 12 | 0x0016 | захват таймера 1 | TIMER1_CAPT_vect |
| 13 | 0x0018 | совпадение A таймера 1 | TIMER1_COMPA_vect |
| 14 | 0x001A | совпадение B таймера 1 | TIMER1_COMPB_vect |
| 15 | 0x001C | переполнение таймера 1 | TIMER1_OVF_vect |
| 16 | 0x001E | совпадение таймера 0 | TIMER0_COMP_vect |
| 17 | 0x0020 | переполнение таймера 0 | TIMER0_OVF_vect |
| 18 | 0x0022 | SPI: передача завершена | SPI_STC_vect |
| 19 | 0x0024 | USART0: байт принят | USART0_RX_vect |
| 20 | 0x0026 | USART0: регистр данных пуст | USART0_UDRE_vect |
| 21 | 0x0028 | USART0: передача завершена | USART0_TX_vect |
| 22 | 0x002A | АЦП: преобразование завершено | ADC_vect |
| 23 | 0x002C | EEPROM готова | EE_READY_vect |
| 24 | 0x002E | аналоговый компаратор | ANALOG_COMP_vect |
| 25 | 0x0030 | совпадение C таймера 1 | TIMER1_COMPC_vect |
| 26 | 0x0032 | захват таймера 3 | TIMER3_CAPT_vect |
| 27 | 0x0034 | совпадение A таймера 3 | TIMER3_COMPA_vect |
| 28 | 0x0036 | совпадение B таймера 3 | TIMER3_COMPB_vect |
| 29 | 0x0038 | совпадение C таймера 3 | TIMER3_COMPC_vect |
| 30 | 0x003A | переполнение таймера 3 | TIMER3_OVF_vect |
| 31 | 0x003C | USART1: байт принят | USART1_RX_vect |
| 32 | 0x003E | USART1: регистр данных пуст | USART1_UDRE_vect |
| 33 | 0x0040 | USART1: передача завершена | USART1_TX_vect |
| 34 | 0x0042 | TWI | TWI_vect |
| 35 | 0x0044 | готовность SPM | SPM_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.
| Сигнал программатора | Разъём 6 конт. | Разъём 10 конт. | Вывод ATmega128 |
|---|---|---|---|
| MOSI | 4 | 1 | PE0 (PDI), вывод 2 |
| MISO | 1 | 9 | PE1 (PDO), вывод 3 |
| SCK | 3 | 7 | PB1, вывод 11 |
| RST | 5 | 5 | RESET, вывод 20 |
| VTG | 2 | 2 | VCC, выводы 21 и 52 |
| GND | 6 | 4, 6, 8, 10 | GND, выводы 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 |
|---|---|---|
| 1 | TCK | PF4, вывод 57 |
| 3 | TDO | PF6, вывод 55 |
| 5 | TMS | PF5, вывод 56 |
| 9 | TDI | PF7, вывод 54 |
| 4 | VTref | VCC |
| 6 | nSRST | RESET, вывод 20 |
| 8 | nTRST | не подключают: вывода TRST у ATmega128 нет |
| 2, 10 | GND | общий провод |
Раскладка разъёма — стандартная 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-генератора обычно не хватает.
- Развязка питания. Конденсатор 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 считается по формуле из даташита:
Реальная скорость — 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 или 0xFFFFFF | MOSI и MISO программатора подключены к PB2 и PB3 | MOSI — на PE0 (вывод 2), MISO — на PE1 (вывод 3) |
| Кристалл не шьётся, пока подключён USB–UART или RS-232 | преобразователь держит линию RXD0 = PE0 | резистор 330 Ом или перемычка в линии RXD0 |
| Новый кристалл отвечает через раз или не отвечает | SCK быстрее 250 кГц при заводском RC-генераторе 1 МГц | снизить SCK до 125 кГц и ниже |
| Программа на новом кристалле зависает, нет USART1, TWI, таймера 3, порт C работает на выход сразу после включения | запрограммирован M103C | Extended = 0xFF |
| PF4–PF7 не переключаются, каналы АЦП 4–7 дают ерунду | включён JTAG | High: JTAGEN = 1 или программно бит JTD |
| АЦП врёт или порт F не работает совсем | AVCC не подключён или питание АЦП без фильтра | AVCC — к VCC через LC-фильтр, разница не больше 0,3 В |
| Кварц 16 МГц не запускается или работает со сбоями | CKOPT не запрограммирован | High = 0xC9 (CKOPT = 0) |
| После записи фьюзов кристалл перестал отвечать | выбран кварц, RC-цепочка или внешний генератор, которых нет на плате | подать такт на XTAL1, исправить фьюзы; иначе JTAG или высоковольтное программирование |
| Таблица во флеш-памяти читается мусором | данные лежат выше 64 КБ, а читаются через LPM | pgm_get_far_address() и pgm_read_byte_far() |
| Программа периодически перезапускается | сторожевой таймер не сбрасывается или запрограммирован WDTON | проверить флаги WDRF и BORF в MCUCSR в начале программы |
| В режиме сна потребление в разы выше ожидаемого | запрограммирован OCDEN, включены АЦП или компаратор, висят входы | OCDEN = 1, ADEN = 0, ACD = 1, подтяжки на свободных выводах |
Как оживить кристалл после неверных фьюзов
Чаще всего ISP перестаёт работать из-за фьюзов тактирования: программирование по ISP идёт от системной частоты, и если выбран источник, которого нет, ядро стоит. AVR080 прямо предупреждает, что после такой ошибки вернуться в режим ISP может оказаться невозможно. Порядок действий:
- Определите, что было записано. Если выбран кварц (CKSEL3:0 = 1111–1010), впаяйте его с конденсаторами. Если RC-цепочка — поставьте R и C на XTAL1. Подать в этих режимах внешний такт на XTAL1 может не получиться: даташит прямо оговаривает это для параллельного программирования.
- Если выбран внешний тактовый сигнал (0000), подайте на XTAL1 меандр с размахом от нуля до напряжения питания — с генератора или вывода другого микроконтроллера, например 1 МГц, — и установите частоту SCK программатора ниже четверти этой частоты. Затем запишите правильные фьюзы.
- Если JTAGEN остался запрограммированным, исправьте фьюзы через JTAG: по даташиту для этого не нужно управлять выводами сброса и тактирования.
- Если не помогло ничего, остаётся высоковольтное параллельное программирование с 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 сбросится через два такта.
Источники
- Atmel. ATmega128/ATmega128L Datasheet (2467X–AVR–06/11) — совместимость с ATmega103, заводская поставка в режиме M103C, фьюзы, DC-характеристики и скорости ATmega128 и ATmega128L, исполнения на 105 °C
- Atmel. ATmega128A Datasheet Complete (Atmel-8151J, 09/2015) — распиновка, ядро, карта памяти, XMEM, CKSEL и CKOPT, фьюзы, загрузчик и RWW, векторы прерываний, периферия, ISP-выводы, таблицы UBRR, электрические характеристики, errata
- Atmel. AVR525: Migration from ATmega128 to ATmega128A (8166A, 05/2009) — ATmega128A — функционально идентичная прямая замена; токи потребления и VOL
- Atmel. AVR080: Replacing ATmega103 by ATmega128 (2501D, 01/2004) — M103C запрограммирован по умолчанию; что недоступно в режиме совместимости; заводские фьюзы, JTAGEN, ISP через PE0 и PE1, параллельное программирование на STK500
- Atmel. AVR097: Migration between ATmega128 and ATmega1281/ATmega2561 (2581F, 04/2008) — совместимость по выводам, переименованные регистры, 35 и 57 векторов, таймеры 0 и 2, BOD, сторожевой таймер, XDIV
- Atmel. ATmega103(L) Datasheet (0945I–AVR–02/07) — 121 команда, до 6 МГц, 4000 байт SRAM, один UART, линии ввода-вывода, ресурс флеш-памяти
- Microchip. ATmega640/V-1280/V-1281/V-2560/V-2561/V Data Sheet (DS40002211A) — сводка конфигураций, корпуса и скорости; выводы ISP: PB2 и PB3 в TQFP-100, PE0 и PE1 в TQFP-64
- Atmel. AVR042: AVR Hardware Design Considerations (Atmel-2521R, 09/2016) — развязка питания и AVCC, цепь RESET, разъёмы ISP на 6 и 10 контактов и JTAG, резисторы на общих линиях ISP
- Microchip. Atmel-ICE User Guide (DS50002999A) — программирование и отладка 8-битных AVR через JTAG
- Microchip. AVR Instruction Set Manual (DS40002198) — приложение A: у ATmega128 и ATmega128A нет только EIJMP и EICALL; LPM, ELPM и RAMPZ, команды умножения
- AVR-LibC: util/setbaud.h, avr/pgmspace.h и include/avr/iom128.h — расчёт UBRR при компиляции, pgm_read_byte_far и pgm_get_far_address, имена регистров и векторов, заводские фьюзы и RAMEND в заголовке iom128.h
- AVRDUDE 8.0 Manual: Option Descriptions — ключи -p, -B и -U, запись фьюзов в формате m
Смотрите также
- AVRATmega, ATtiny, AVR Dx/Ex: семейства, прошивка, инструменты
- Система команд AVRВсе инструкции с флагами и тактами, адресация, примеры кода
- SPISCLK, MOSI, MISO, CS, режимы 0–3, daisy chain, частота, SPI в AVR
- I²CSDA и SCL, START/STOP, ACK, адреса, скорости, расчёт подтяжек
- RS-232Уровни, распиновка DB9, нуль-модем, MAX3232, UART и AVR
- МикроконтроллерыAVR, ARM Cortex-M, ESP32, PIC, MSP430: архитектура и выбор