3)Только в ATmega48x.
Все микроконтроллеры фирмы Atmel имеют три 8-битные ячейки, содержимое которых позволяет идентифицировать устройство. В первой ячейке содержится код производителя $00, во второй — код объема FLASH-памяти $01, а в третьей — код устройства $02. Как и конфигурационные ячейки, ячейки идентификатора расположены в отдельном адресном пространстве, доступ к которому возможен только в режиме программирования. Однако в отличие от конфигурационных ячеек ячейки идентификатора, по понятным причинам, доступны только для чтения.
Значение кода устройства у разных моделей может совпадать. Поэтому устройство следует идентифицировать только по совокупности значений ячеек $01 и $02, так как именно эта пара чисел является уникальной для каждого микроконтроллера.
В калибровочные ячейки при изготовлении микроконтроллера заносятся калибровочные константы, предназначенные для подстройки на номинальную частоту внутреннего RС-генератора. Количество этих ячеек зависит от того, на скольких частотах может работать внутренний RC-генератор. В моделях ATmega8515x/8535x и ATmega8x/16x/32x/64x/128x имеется четыре 8-битных ячейки, а в остальных моделях — одна ячейка. Располагаются они в старших байтах адресного пространства ячеек идентификатора.
Загрузка калибровочной константы в регистр OSCCAL осуществляется аппаратно при нахождении микроконтроллера в состоянии сброса. Однако в моделях ATmega8515x/8535x и ATmega8x/16x/32x/64x/128x генератор автоматически калибруется только на частоту 1 МГц. Поэтому при использовании другой частоты RС-генератора его калибровку необходимо осуществлять вручную. Для этого программатор во время программирования должен прочитать содержимое калибровочной ячейки и занести его по какому-либо адресу FLASH-памяти программ. А программа должна после старта считать это значение из памяти программ и занести его в регистр OSCCAL.
В микроконтроллерах семейства Mega используется страничная организация памяти программ. При программировании весь объем FLASH-памяти разбивается на 16-битные страницы, размер которых, а также их количество зависят от объема памяти программ микроконтроллера.
Соответственно, при программировании памяти программ микроконтроллеров семейства Mega данные сначала загружаются в буфер страницы и только затем заносятся непосредственно в память программ. Прошивка всех ячеек страницы при этом осуществляется одновременно.
Аналогичным образом организована и EEPROM-память. Размер 8-битных страниц EEPROM-памяти.
Однако следует отметить, что во многих моделях страничная организация EEPROM-памяти используется только при программировании в параллельном режиме, а программирование по последовательному каналу осуществляется побайтно.
В режиме программирования по последовательному каналу программирование памяти программ и данных осуществляется по последовательному интерфейсу SPI. Как правило, этот режим используется для программирования (перепрограммирования) микроконтроллера непосредственно в устройстве.
Схема включения микросхем в режиме программирования по последовательному каналу приведена на рис. 9.2. На этом же рисунке показано два варианта разводки колодки для подключения программатора, рекомендуемые компанией Atmel.
Рис. 9.2. Включение микроконтроллеров в режиме программирования по последовательному каналу
Как видно из рис. 9.2, для обмена данными между программатором и устройством используются три линии: SCK (тактовый сигнал), MOSI (вход данных) и MISO (выход данных).
Как и в рабочем режиме, при программировании по последовательному каналу микроконтроллеру требуется источник тактового сигнала. В качестве такового может использоваться любой из допустимых для микроконтроллера источников. При этом должно выполняться следующее условие: длительность импульсов как НИЗКОГО, так и ВЫСОКОГО уровня сигнала SCK должна быть больше 2 периодов тактового сигнала микроконтроллера.
Программирование осуществляется путем посылки 4-байтных команд на вывод MOSI микроконтроллера. Результат выполнения команд чтения снимается с вывода MISO микроконтроллера. Передача команд и выдача результатов их выполнения осуществляются от старшего бита к младшему. При этом “защелкивание” входных данных выполняется по нарастающему фронту сигнала SCK, а “защелкивание” выходных данных – по спадающему.
Для перевода микроконтроллера в режим программирования по последовательному каналу необходимо выполнить следующие действия:
-подать на микроконтроллер напряжение питания, при этом на выводах SCK и RESET должно присутствовать напряжение НИЗКОГО уровня. Выждать не менее 20 мс;
-послать на вывод MOSI команду “Разрешение программирования”;
-для контроля прохождения команды при посылке 3-го байта возвращается значение 2-го байта ($53).
-после завершения программирования на вывод RESET можно подать напряжение ВЫСОКОГО уровня для перевода микроконтроллера в рабочий режим либо выключить его.
В последнем случае необходимо выполнить следующую последовательность действий:
-подать на вывод XTAL1 напряжение НИЗКОГО уровня, если тактирование микроконтроллера осуществляется от внешней схемы;
-подать на вывод RESET напряжение ВЫСОКОГО уровня;
-отключить напряжение питания от микроконтроллера.
Программирование памяти программ микроконтроллеров семейства Mega осуществляется постранично. Сначала содержимое страницы побайтно заносится в буфер по командам “Загрузка страницы FLASH-памяти”. В каждой команде передаются младшие биты адреса изменяемой ячейки (положение ячейки внутри страницы) и записываемое значение. Содержимое каждой ячейки должно загружаться в следующей последовательности: сначала младший байт, потом старший.
Фактическое программирование страницы FLASH-памяти осуществляется после загрузки буфера страницы по команде “Запись страницы FLASH-памяти”.
Следует помнить, что дальнейшее программирование памяти можно будет выполнять только после завершения записи страницы. Определить момент окончания записи можно тремя способами. Первый и наиболее простой способ — выдерживать между посылкой команд паузу. Второй способ заключается в контролировании содержимого любой из записываемых ячеек после посылки команды записи, а третий способ — опрос флага готовности RDY c помощью соответствующей команды.
Во всех старых моделях программирование EEPROM-памяти осуществляется обычным способом – побайтно. А в новых моделях появился альтернативный способ записи EEPROM-памяти – постраничный. Содержимое страницы побайтно заносится в буфер по командам “Загрузка страницы EEPROM-памяти”, а затем осуществляется фактическое программирование страницы EEPROM-памяти по команде “Запись страницы EEPROM-памяти”. Значения адресов, передаваемые в этих командах, определяются так же, как и при программировании FLASH-памяти. Для определения момента окончания записи можно использовать любой из описанных выше способов.
В режиме параллельного программирования от программатора к микроконтроллеру передаются одновременно все биты кода команды или байта данных. Этот режим задействует большое число выводов микроконтроллера и требует использования дополнительного источника повышенного напряжения. Поэтому программирование в параллельном режиме осуществляется специализированными программаторами. Основное применение этого режима — “прошивка” микроконтроллеров перед установкой их на плату в условиях массового производства.
Схема включения микросхем в режиме параллельного программирования приведена на рис. 9.3.
Рис. 9.3. Включение микроконтроллеров в режиме параллельного программирования
Таблица 9.7. Обозначение и функции выводов, используемых при программировании в параллельном режиме
Сигнал | Вывод | Вход/Выход | Назначение |
RDY/BSY | PD1 | Выход | Состояние устройства:0 – занято (выполняется предыдущая команда);1 – готово к приему следующей команды. |
ОЕ | PD2 | Вход | Управление режимом работы шины данных РВ7...РВ0: 0 — выход, 1 — вход |
WR | PD3 | Вход | Сигнал записи (активный уровень — лог. 0) |
BS1 | PD4 | Вход | Выбор байта (см. Табл. 14.14) |
ХАО | PD5 | Вход | Определяют действие, выполняемое по положительному импульсу на выводе XTAL1 |
ХА1 | PD6 | Вход | |
PAGEL | PD7 | Вход | Сигнал загрузки страницы памяти |
BS2 | РАО | Вход | Выбор байта (см. Табл. 14.14) |
DATA | РВ7...РВ0 | Вход/Выход | Двунаправленная шина данных |
В общих чертах процесс программирования в этом режиме состоит из многократного выполнения следующих операций:
-загрузка команды;
-загрузка адреса;
-загрузка данных;
-выполнение команды.
Последовательность подачи сигналов на выводы микроконтроллера при выполнении различных базовых операций приведена в табл. 9.8.
Таблица 14.7. Базовые операции программирования в параллельном режиме
№ | Название операции | Действия |
1 | Загрузка команды | 1.Установить выводы ХА1, ХАО в состояние 10.2.Подать на вывод BS1 напряжение лог. 0.3.Выставить на шину DATA код команды.4.Подать на вывод XTAL1 положительный импульс. |
2 | Загрузка адреса | 1.Установить выводы ХА1, ХАО в состояние 00 (загрузка адреса).2.Установить выводы BS2:BS1 в состояние 00 (загрузка младшего байта), 01 (загрузка старшего байта) или 10 (загрузка дополнительного байта).3.Выставить на шину DATA байт адреса.4.Подать на вывод XTAL1 положительный импульс. |
3 | Загрузка данных | 1.Установить выводы ХА1, ХАО в состояние 01 (загрузка данных).2.Подать на вывод BS1 напряжение лог. 0 (загрузка младшего байта) или лог. 1 (загрузка старшего байта).3.Выставить на шину DATA содержимое байта данных.4.Подать на вывод XTAL1 положительный импульс. |
4 | Запись данных в буфер страницы | 1.Подать на вывод BS1 напряжение лог. 1.2.Подать на вывод PAGEL положительный импульс. |
5 | Запись байта конфигурации | 1.Установить выводы BS2:BS1 в состояние 00 (запись младшего байта), 01 (запись старшего байта) или 10 (запись дополнительного байта). 2.Подать на вывод WR отрицательный импульс; при этом на выводеRDY/BSY появляется сигнал НИЗКОГО уровня.3.Ждать появления на выводе RDY/BSY сигнала ВЫСОКОГО уровня. |
Запись страницы | 1.Установить выводы BS2:BS1 в состояние 00.2.Подать на вывод WR отрицательный импульс; при этом на выводе RDY/BSY появляется сигнал НИЗКОГО уровня.3.Ждать появления на выводе RDY/BSY сигнала ВЫСОКОГО уровня. |
Первой операцией при программировании микроконтроллера является его перевод в режим программирования. Для перевода микроконтроллера в режим программирования необходимо выполнить следующие действия: