Порядок программирования микроконтроллеров avr. Самопрограммирование микроконтроллеров AVR. Что нужно чтобы начать изучение микроконтроллеров

Характеристики:

  • Код примера применения AVR109 помещается в загрузочном блоке любого AVR микроконтроллера
  • Чтение и запись EEPROM и Flash памяти
  • Использует протокол AVRProg
  • Чтение и запись битов защиты

Введение

В данном примере применения описывается как настроить AVR микроконтроллеры для самопрограммирования при помощи команд сохранения памяти программы (SPM). AVR микроконтроллеры могут связываться через UART с персональными компьютерами, на которых запущена программа программирования AVRprog. Она позволяет программировать микроконтроллеры с Flash и EEPROM памятью без помощи внешнего аппаратного программатора.

Программа загрузчика находится в загрузочной области Flash памяти. Эта программа устанавливает связь с ведущим персональным компьютером и облегчает программирование Flash и EEPROM памяти микроконтроллера. Однажды запрограммированные различные уровни защиты могут быть индивидуально применены для программирования загрузочной памяти и Flash памяти прикладной программы. Таким образом, AVR микроконтроллеры имеют уникальную возможность обеспечения различной степени защиты областей встроенной памяти.

Обсуждение SPM

Ниже приведены различные рассуждения, позволяющие лучше понять способность самопрограммирования AVR микроконтроллеров.

Организация памяти

Flash память AVR микроконтроллеров разделена на две области: секция прикладной программы и секция программы загрузчика. Область прикладной программы содержит код основной прикладной программы, а область загрузчика содержит код программы, позволяющей осуществлять самопрограммирование микроконтроллера. SPM команды могут выполняться только из области загрузчика. (Замечание: тем не менее, область загрузчика может использоваться в качестве обычной памяти прикладной программы).

Flash память разделена на страницы, каждая из которых содержит 32, 64 или 128 слов. Назначение и использование страниц будет объяснено позже. Вся память (и память прикладной программы и память загрузчика) разделена на страницы. Например, микроконтроллер с 8 килобайтами Flash памяти и размером страницы 32 слова (64 байта) будет иметь 128 страниц. Организация памяти показана на рисунке 1.

Рисунок 1. Организация памяти

Размер области памяти загрузчика может быть установлен при помощи двух специальных конфигурационных бит BOOTSZx. Они позволяют выбрать один из четырех возможных размеров области памяти загрузчика. Установить биты BOOTSZx можно при помощи последовательного или параллельного программатора. Более подробно это рассмотрено в технических описаниях AVR микроконтроллеров.

Если загрузчик реализован, то он может быть вызван путем выполнения команд Call или Jump из прикладной программы или путем установки бита специального конфигурационного бита BOOTRST. Если бит BOOTRST установлен, то после каждого сброса микроконтроллер вместо перехода к выполнению программы, начинающейся с нулевого адреса памяти прикладной программы, выполняет программу загрузки, находящуюся в области загрузчика. Изменен бит BOOTRST может быть при помощи параллельного или последовательного программатора.

Возможность "чтения при записи"

В дополнение к выбираемому делению памяти на прикладную и загрузочную, встроенная Flash память также разделена на два раздела с фиксированными размерами. Первый раздел - "читаемый при записи" (RWW) раздел. Второй - "не читаемый при записи" (NRWW) раздел. Размер NRWW раздела всегда равняется размеру наибольшей возможной области памяти загрузчика. Поэтому раздел загрузчика занимает весь NRWW раздел или только его часть. Деление памяти на RWW и NRWW разделы показано на рисунке 2.


Рисунок 2. Деление памяти на RWW и NRWW разделы

Отличие между этими разделами состоит в том, что NRWW секция доступна при обновлении RWW секции. К RWW секции невозможно обратиться при обновлении. Когда NRWW секция обновляется (например, обновляя непосредственно код загрузчика), вычислительное ядро останавливается. Другими словами, невозможно осуществлять чтение при записи NRWW секции, но возможно читать при записи RWW секции. Более подробно это рассмотрено в технических описаниях на микроконтроллеры.

Эти функциональные возможности позволяют продолжить выполнение прикладной программы при обновлении RWW секции. Обратите внимание, что код этой программы должен содержаться в NRWW секции (не обязательно в разделе загрузчика). Более подробно это рассмотрено ниже в разделе описания прерываний.

Микроконтроллеры ATmega163 и ATmega323 не имеют NRWW и RWW секций - у них имеются только деление на память загрузчика и память прикладной программы. Любое обновление Flash памяти этих микроконтроллеров приводит к остановке их вычислительного ядра.

Использование SPM команды

Все действия по самопрограммированию выполняются при помощи SPM команды. Выбор режима осуществляется при помощи регистра SPMCR. Структура этого регистра показана на рисунке 3.

Рисунок 3. Регистр SPMCR

При использовании SPM функции бит SPMEN должен быть установлен не ранее, чем за четыре цикла до выполнения команды SPM. Это необходимо для предотвращения несанкционированного обновления Flash памяти. Прикладная программа должна гарантировать отсутствие вызова подпрограмм обработки прерывания между установкой бита SPMEN и выполнением SPM команды. Другие, выделенные цветом на рисунке, четыре бита осуществляют выбор режима SPM. По окончании режима бит SPMEN автоматически сбрасывается вместе с функциональным битом. SPM функции описаны ниже.

Стирание страницы

Вся Flash память обновляется страницами. Перед записью новых данных страница должна быть стерта.

Для выбора страницы, подлежащей стиранию, используется Z регистр. Он предназначен для указания номера стираемой страницы. Младшие биты, выбирающие слово на странице, игнорируются. Например, в микроконтроллере, имеющем размер страницы 32 слова (64 байта), игнорируются шесть младших бит Z регистра.

Для того чтобы стереть страницу необходимо установить биты PGERS и SPMEN в регистре SPMCR и выполнить команду SPM.

Перед записью новых данных в страницу необходимо сначала стереть буфер страниц. Буфер страниц - это доступный только для записи отдельный буфер, не относящийся к ОЗУ, который содержит одну временную страницу. Страницы в него должны заноситься последовательно. Перезапись буфера страниц во FLash память происходит за одну операцию.

Для выбора слова, которое будет записано в буфер, используется Z регистр. МЗБ Z регистра игнорируются так как запись всех слов происходит за одну операцию. Таким образом невозможно выбрать только один байт. При записи буфера страниц игнорируются старшие биты Z регистра. Структура Z регистра для микроконтроллера с 32 словными (64 байтовыми) страницами показана на рисунке 4. Микроконтроллеры, имеющие большие размеры страницы для выбора слов используют больше бит.


Рисунок 4. Запись в буфер страниц

Чтобы записать слово в буфер страниц необходимо загрузить его в регистры R1:R0. Для записи необходимо только записать правильное слово и установить бит SPMEN в регистре SPMCR. В течение четырех циклов после этого должна быть выполнена SPM команда.

Запись страницы

Данные после того, как они были загружены в буфер страниц, должны быть записаны во Flash память. Для выполнения этого необходимо, как это было описано выше в пункте описания алгоритма стирании страницы, установить Z регистр. Затем устанавливаются биты PGERS и SPMEN в регистре SPMCR, а потом в течение четырех циклов необходимо запустить SPM команду. Содержимое регистров R1:R0 при этом игнорируется. Использование Z регистра для микроконтроллера с 32 словными (64 байтными) страницами показано на рисунке 5.


Рисунок 5. Запись страницы во Flash память

Для определения готовности микропроцессора к следующему обновлению необходимо опрашивать бит SPMEN. Процедура обновления может быть прервана управляющим прерыванием. Более подробно это рассмотрено ниже в разделе описания прерываний.

RWW секция флагов занятости

При записи и стирании страниц RWW секции аппаратно устанавливается флаг RWWSB, указывая на то, что секция недоступна. Флаг RWWSB должен быть сброшен программно по окончании SPM режима. Это выполняется установкой битов RWWSRE и SPMEN в регистре SPMCR и последующим запуском SPM команды. Также этот флаг может быть сброшен путем запуска загрузки буфера страниц. Флаг RWWSB может использоваться другими частями прикладной программы для контроля доступности RWW секции. Более подробно это рассмотрено в технических описаниях на микроконтроллеры.

Обратите внимание, что содержимое Z регистра и регистров R1:R0 игнорируется при использовании RWWSRE функции.

Также следует заметить, что, если после выполнения операции записи или считывания RWW секция стала доступна без переактивизации, то все адреса в RRW секции считываются как 0xFFFF. Так будет и после считывания Flash памяти при помощи LPM и после выполнения вызова или перехода в RWW секцию. Переход в RWW секцию без предварительной ее переактивизации приведет к тому, что выполнится команда, находящаяся по адресу 0xFFFF, а все предшествующие ей команды, которые должны были быть выполнены, будут пропущены.

Биты блокировки загрузки

Секции прикладной программы и программы-загрузчика могут быть защищены на различных уровнях. Для обоих разделов имеется четыре уровня защиты. Краткое описание этих режимов приведено в таблице 1.

Таблица 1. Режимы блокировки загрузки

Обратите внимание, что все эти биты могут изменяться только при помощи последовательного или параллельного программатора. Например, для микроконтроллера, прикладная программа которого будет обновляться, необходимо установить режим 1 для секции прикладной программы и режим 4 для секции загрузчика. Это препятствует доступу к программе загрузчика из прикладной программы и обеспечивает загрузчику возможность доступа к секции прикладной программы. После обновления загрузчик установит третий режим для прикладной программы, что заблокирует дальнейший доступ к ней.

Для программирования битов блокировки загрузки необходимо загрузить соответствующие данные в регистр R0, установить биты BLBSET и SPMEN в регистре SPMCR и в течение четырех циклов выполнить команду SPM. Содержимое Z регистра при этом игнорируется.

Использование LPM команды вместо SPM команды позволит считать биты.

Прерывание

При записи RWW секции возможно использование прерывания, но подпрограмма обработки прерывания не должна выбирать другую RWW секцию. Другими словами, подпрограммы обработки прерывания, включая векторы прерываний, которые будут выполняться при обновлении RWW секции, должны размещаться в NRWW секции.

Для выбора двух различных таблиц векторов прерывания прикладная программа должна использовать бит IVSEL регистра GICR. При обновлении RWW секции должна использоваться одна секция прикладной программы и одна секция программы-загрузчика. Это позволяет прикладной программе продолжать критические процессы типа отслеживание политики безопасности при самопрограммировании. Более подробно это рассматривается в технических описаниях на микроконтроллеры в разделе описания прерываний и IVSEL флага.

Если второй вектор прерываний не используется, то при обновлении RWW секции прерывания должны быть отключены.

SPM прерывание

У всех микроконтроллеров, поддерживающих режим самопрограммирования, за исключением микроконтроллеров ATmega163 и ATmega323, при помощи прерываний возможно контролировать процесс обновления Flash памяти. Установка бита SPMIE в регистре SPMCR позволит формировать SPM прерывание. Оно может использоваться для отслеживания окончания режима SPM.

Конфликты EEPROM памяти

Обратите внимание, что все операции записи EEPROM должны быть окончены перед выполнением SPM команды и наоборот. Запись/стирание Flash и EEPROM памяти не может происходить одновременно.

Типовые процедуры обновления

На рисунке 6 показаны две стандартные процедуры обновления. Левая блок - схема на этом рисунке описывает алгоритм "считывания-модификации-записи" небольших частей Flash памяти, например, констант, содержащихся во Flash памяти. Правая блок-схема описывает алгоритм записи страницы, использующийся для записи страницы без предварительного считывания ее содержимого, например, запись данных, поступивших от UART.


Рисунок 6. Блок-схемы стандартных процедур обновления

Пример программы-загрузчика

Пример программы- загрузчика, приведенный в данном примере применения, в качестве пользовательского интерфейса использует программу AVRprog, доступную на сайте www.atmel.com. Эта программа-загрузчик позволяет считывать или обновлять Flash и EEPROM память выбранного микроконтроллера. Также она позволяет считывать и обновлять биты Lock и Fuse.

Протокол

Протокол, использованный в примере программы-загрузчика, предназначен для работы с программатором AVRprog, хотя программа-загрузчик и не поддерживает всего набора команд. Перечень поддерживаемых команд приведен в таблице 2. Все команды начинаются с одной буквы. После выполнения команды программатор возвращает значение 13d (возврат каретки) или требуемые данные. Неизвестным командам возвращается значение «?».

Таблица 2. Команды AVRProg

Команда Запись ведущим Считывание ведущим
ID Данные Данные
Вход в режим программирования «P» 13d
Автоматическое увеличение адреса «a» dd
Установка адреса «A» ah al 13d
Запись младшего байта в память программы «c» dd 13d
Запись старшего байта в память программы «C» dd 13d
Окончание записи страницы «m» 13d
Считывание битов Lock «r» dd
Считывание памяти программы «R» dd (dd)
Считывание памяти данных «d» dd
Запись памяти данных «D» dd 13d
Стирание кристалла «e» 13d
Запись битов Lock «l» dd 13d
Запись битов Fuse «f» dd 13d
Считывание битов Fuse «F» dd
Считывание старших битов Fuse «N» dd
Выход из режима программирования «L» 13d
Выбор типа микроконтроллера «T» dd 13d
Считывание байтов подписи «s» 3*dd
Возвращение кода поддерживаемого микроконтроллера «t» n* dd 00d
Возвращение идентификатора программы «S» s
Возвращение версии программы «V» dd dd
Возвращение версии аппаратных средств «v» dd dd
Возвращение типа программатора «p» dd
Включение светодиода «x» dd 13d
Выключение светодиода «y» dd 13d

При выполнении AVRprog.exe отыскивает на любом доступном СОМ порту любой поддерживаемый программатор. Для связи используется 19.2 кбит/с интерфейс формата 8N1 (8 информационных разрядов, нет проверки на четность и один стоповый бит). Поэтому UART приемника также должен быть настроен на работу с этой скоростью и в этом режиме.

При работе с микроконтроллером ATmega161, последовательность действий при определении программатора следующая:

AVRprog:4 "ESC": очистка буферов UART. AVRprog:"S" - запрос идентификатора программы MegaAVR:"AVRB161" (загрузчик). AVRprog принимает любую строку, состоящую из семи символов и начинающуюся с букв "AVR". AVRprog:"a" -запрос на автоматическое увеличение адреса megaAVR:"y" - Да AVRprog:"t" - запрос о поддерживаемых микроконтроллерах megaAVR: "60" для mega161 и "00" для указания конца списка AVRprog:"T "и" 60" - указание программатору, что выбран микроконтроллер ATmega161 AVRprog:"y "+dd "y" +dd "y" + dd "x" +dd - активизация светодиодов

Последовательность команд при программировании:

AVRprog:3 "ESC": очистка буферов UART. AVRprog:"T "и" 60" - указание программатору, что выбран микроконтроллер ATmega161 AVRprog:"P" - разрешение программирования AVRprog:"e" - стирание области прикладной программы AVRprog:"P" - разрешение программирования AVRprog:"A" - установка адреса 0x0000 AVRprog:"A" - установка начального адреса программирования AVRprog:"c" - передача младшего байта данных AVRprog:"C" - передача старшего байта данных

При заполнении временного буфера:

AVRprog:"A" - установка адреса страницы AVRprog:"m" - запись страницы После этого продолжается программирование: AVRprog:"c" - передача младшего байта данных AVRprog:"C" - передача старшего байта данных

После того, как все байты переданы, выполняются следующие команды:

AVRprog:"A" - установка адреса последней страницы AVRprog:"m" - запись последней страницы AVRprog:"L" - выход из режима программирования

Последовательность команд при проверке данных:

AVRprog:"P" - разрешение программирования AVRprog:"A" - установка адреса AVRprog:"R" - чтение памяти программы ATmega161: двухбайтные данные.

AVRprog продолжает посылать «R» до тех пор, пока не будут считаны все данные, после чего посылается «L» для выхода из режима программирования.

Описание программы

Основная программа запускается для контроля выполнения программирования или если должна быть выполнена программа их секции прикладной программы. В данном применении это определяется значением PIND. Если на определенном пользователем выводе порта D при сбросе присутствует низкий логический сигнал, то программа войдет в режим программирования (вывод определяется в исходном тексте main.c). Если на этом выводе был высокий уровень, то программа начнет выполняться с адреса 0000$ (как при обычном сбросе).

В режиме программирования управляющая программа получает команды от AVRprog через UART. Каждая команда активизирует выполнение соответствующей задачи. Эта программа не использует команды управления работой светодиода, но они реализованы для того, чтобы избежать потери синхронизации программатором AVRprog. Любая команда, которая не распознается программой, приводит к возврату программатору AVRprog символа "?".

Программа main.c устанавливает связь с ведущим персональным компьютером и выполняет полученные команды. На рисунке 7 наказана блок-схема алгоритма работы этой программы.


Рисунок 7. Блок-схема алгоритма работы основной программы

Обратите внимание, что выход из этой программы возможен только через сброс микроконтроллера.

Программа UART (serial.c) всего-навсего осуществляет опрос подпрограммы UART. Как было сказано ранее, причина необходимости периодического опроса этой подпрограммы состоит в том, что при некоторых настройках битов блокировки загрузки в программе загрузчика прерывания не разрешены.

Все подпрограммы, использующие SPM, написаны на ассемблере. Это сделано для того, чтобы избежать конфликтов в коде. SPM команды требуют помещать данные в Z регистр (r31:r30) и в пару регистров r1:r0. Это можно реализовать и на С, но на ассемблере проще реализовать контроль, а также позволяет снизить перегруженность С кода.

Вызов процедуры Assembly

В зависимости от того, какие параметры переданы при вызове процедуры Assembly, она выполняет одну из двух функций:

пусто write_page (беззнакое целочисленное значение адреса, беззнаковое строковое значение функции); Первый передаваемый параметр - это адрес страницы, которую необходимо записать. Второй параметр определяет функцию, должна выполниться. Если передать значение 0x05, то произойдет запись указанной страницы, а если 0x03, то стирание ее. беззнаковое целочисленное значение read_program_memory (беззнаковое целочисленное значение адреса, беззнаковое строковое значение функции);

В этой подпрограмме первый параметр - это адрес страницы, которую необходимо считать. Второй параметр указывает функцию, которая будет выполнена. Если передать значение функции 0x00, то подпрограмма вернет данные, находящиеся по указанному адресу. Если в качестве второго параметра передать значение 0x09, а в качестве адреса 0x0000, 0x0001 или 0x0003, то подпрограмма вернет значения битов Fuse, Lock Bit или Fuse High. В этом случае, основная программа игнорирует 8 старших значащих битов возвращенного целого числа.

Ниже приведен листинг подпрограммы Assemly.

NAME assembly(16) RSEG CODE(0) RSEG UDATA0(0) PUBLIC fill_temp_buffer PUBLIC write_page PUBLIC write_lock_bits PUBLIC read_program_memory EXTERN ?CL0T_1_40_L08 RSEG CODE #include "iom161.h" write_page: MOV R31,R17 MOV R30,R16 ; передача адреса в z регистр (R31=ZH R30=ZL) OUT SPMCR,R20 ; установка параметра, соттвтетствующего вызову второй функции SPM ; выполнить запись страницы RET fill_temp_buffer: MOV R31,R21 MOV R30,R20 ; передача адреса в z регистр (R31=ZH R30=ZL) MOV R1,R17 MOV R0,R16 ; передача данных в регистры 0 и 1 LDI R18,0x01 OUT SPMCR,R16 SPM ; Запись в память программы RET read_program_memory: MOV R31,R17 ; R31=ZH R30=ZL MOV R30,R16 ; передача адреса в z регистр SBRC R20,0 ; считать биты защиты? (второй аргумент = 0x09) OUT SPMEN,R20; если "Да", то установить второй аргумент в регистре SPMEN LPM ; считывание МЗБ MOV R16,R0 INC R30 LPM MOV R17,R0 ;считывание СЗБ (игнорируется при чтении бита защиты) RET write_lock_bits: MOV R0,R16 LDI R17,0x09 OUT SPMCR,R17 SPM ; запись битов защиты RET END

Специальные замечания

  1. В микроконтроллерах ATmega161 и ATmega163 секция программы-загрузчика располагается в памяти начиная с адреса $3C00 по адрес $3FFF, поэтому файл компоновщика должен изменить программу таким образом, чтобы она расположилась в этой области. Для этого необходимо заменить значение строки "Program address space" на следующее значение:
    // Program address space (internal Flash memory) -Z(CODE)INTVEC,RCODE,CDATA0,CDATA1,CCSTR,SWITCH, FLASH,CODE=3C00-3FFF В результате этого код будет расположен в загрузочном блоке. Кроме того, для задания адреса вектора сброса $1E00 Fuse бит BOOTRST должен быть установлен.
  2. Подпрограмма загрузчика должна иметь возможность определения режима, в котором должен работать микроконтроллер после сброса (режим программирования или режим выполнения прикладной программы).
    Это реализуется путем проверки состояния определенного вывода при сбросе. Если все выводы находятся в высоком состоянии, то программа-загрузчик осуществляет переход к выполнению основной программы. Реализовано это может быть на С при помощи следующей последовательности команд: пусто (*funcptr) (пусто) = 0x0000; // установка указателя функции funcptr (); // переход по указанному адресу
  3. Если на определенном пользователем выводе при сбросе присутствует низкий уровень, то осуществляется вход в режим программирования. Из режима программирования выйти невозможно. Чтобы вернуться в нормальный режим на этом выводе должен быть установлен высокий уровень и осуществлен сброс микроконтроллера.
  4. При определенном состоянии битов защиты загрузки при выполнении команд из Flash памяти загрузочной секции могут быть недоступны прерывания. По этой причине, программа UART, реализованная в описанной демонстрационной программе, использует периодический опрос вместо подпрограммы обслуживания прерываний.
  5. Для указания адреса страницы/адреса временного буфера при выполнении SPM команды используется Z регистр. Также этот регистр используется как указатель данных С компилятором IAR. Это вызывает конфликты. Поэтому все подпрограммы, имеющие дело с SPM, написаны на ассемблере.
  6. Для увеличения непосредственного контроля требуется усложнять процедуры, написанные на С. Это еще одна причина написания подпрограмм, выполняющих SPM, на ассемблере.
  7. Размер программы равняется 504 байтам, поэтому она может быть расположена только в микроконтроллерах, имеющих размер загрузочного сектора 512 байт или больше.

Чтобы уменьшить размер кода, необходимо произвести оптимизацию в соответствии с приведенными ниже рекомендациями:

  • Использовать конструкцию if, then, else вместо команды case.
  • Использовать конструкцию For (;;) {} вместо while (1) {}.
  • В файле CSTARTUP.S90 все неиспользованные ссылки были удалены. Это относится к ссылкам " __ low_level_init", команде "#if #endif" и модулю C _EXIT .
  • Все переменные должны иметь наименьший возможный размер.
  • По возможности использовать беззнаковые переменные.

Более подробно ознакомиться с повышением эффективности кода, написанного на С можно в примере применения "AVR035: Efficient C Coding for AVR".

Принципиальная схема программатора на LPT порт показана на рисунке. В качестве шинного формирователя используйте микросхему 74AC 244 или 74HC244 (К1564АП5), 74LS244 (К555АП5) либо 74ALS244 (К1533АП5).

Светодиод VD1 индицирует режим записи микроконтроллера,

светодиод VD2 - чтения,

светодиод VD3 - наличие питания схемы.

Напряжение, необходимое для питания схема берёт с разъёма ISP, т.е. от программируемого устройства. Эта схема является переработанной схемой программатора STK200/300 (добавлены светодиоды для удобства работы), поэтому она совместима со всеми программами программаторов на PC, работающих со схемой STK200/300. Для работы с этим программатором используйтепрограмму CVAVR

Программатор можно выполнить на печатной плате и поместить её в корпус разъёма LPT, как показано на рисунках:




Для работы с программатором удобно использовать удлинитель LPT порта, который несложно изготовить самому (к примеру, из кабеля Centronix для принтера), главное "не жалеть" проводников для земли (18-25 ноги разъёма) или купить. Кабель между программатором и программируемой микросхемой не должен превышать 20-30 см.

AVR - это название популярного семейства микроконтроллеров, которое выпускает компания Atmel . Кроме АВР под этим брендом выпускаются и других архитектур, например, ARM и i8051.

Какими бывают AVR микроконтроллеры?

Существует три вида микроконтроллеров:

Самым популярным уже более десятка лет является именно 8-битное семейство микроконтроллеров. Многие радиолюбители начинали изучать микроконтроллеры с него. Почти все они познавали мир программируемых контроллеров делая свои простые поделки, вроде светодиодных мигалок, термометров, часов, а также простой автоматики, типа управления освещением и нагревательными приборами.

Микроконтроллеры AVR 8-bit в свою очередь делятся на два популярных семейства:

    Attiny - из названия видно, что младшее (tiny - юный, молодой, младший), в основном имеют от 8 пинов и более. Объём их памяти и функционал обычно скромнее, чем в следующем;

    Atmega - более продвинутые микроконтроллеры, имеют большее количество памяти, выводов и различных функциональных узлов;

Самым мощным подсемейством микроконтроллеров является xMega - эти микроконтроллеры выпускаются в корпусах с огромным количеством пинов, от 44 до 100. Столько необходимо для проектов с большим количеством датчиков и исполнительных механизмов. Кроме того, увеличенный объем памяти и скорость работы позволяют получить высокое быстродействие.

Расшифровка: Пин (англ. pin - иголка, булавка) - это вывод микроконтроллера или как говорят в народе - ножка. Отсюда же слово «распиновка» - т.е. информация о назначении каждой из ножек.

Для чего нужны и на что способны микроконтроллеры?

Микроконтроллеры применяются почти везде! Практически каждое устройство в 21 веке работает на микроконтроллере: измерительные приборы, инструменты, бытовая техника, часы, игрушки, музыкальные шкатулки и открытки, а также многое другое; одно лишь перечисление займет несколько страниц текста.

Разработчик может использовать аналоговый сигнал подовая его на вход микроконтроллера и манипулировать с данными о его значении. Эту работу выполняет аналогово-цифровой преобразователь (АЦП). Данная функция позволяет общаться пользователю с микроконтроллером, а также воспринимать различные параметры окружающего мира с помощью датчиков.

В распространенных AVR-микроконтроллерах, например, Atmega328 , который на 2017 году является сердцем многих плат Arduino , но о них позже. Используется 8 канальный АЦП , с разрядностью 10 бит . Это значит вы сможете считать значение с 8 аналоговых датчиков. А к цифровым выводам подключаются цифровые датчики, что может быть очевидным. Однако цифровой сигнал может являться только 1 (единицей) или 0 (нулем), в то время как аналоговый может принимать бесконечное множество значений.

Пояснение:

Разрядность - это величина, которая характеризует качество, точность и чувствительность аналогового входа. Звучит не совсем понятно. Немного практики: 10 битный АЦП, записать аналоговую информацию с порта в 10 битах памяти, иначе говоря плавно изменяющийся цифровой сигнал микроконтроллером распознается как числовое значение от 0 до 1024.

12 битный АЦП видит тот же сигнал, но с более высокой точностью - в виде от 0 до 4096, а это значит, что измеренные значения входного сигнала будут в 4 раза точнее. Чтобы понять откуда взялись 1024 и 4096, просто возведите 2 в степени равную разрядности АЦП (2 в степени 10, для 10 разрядного и т.д.)

Чтобы управлять мощностью нагрузки к вашему распоряжению есть ШИМ-каналы, их можно задействовать, например, для регулировки яркости, температуры, или оборотов двигателя. В том же 328 контроллере их 6.

В общем структура AVR микроконтроллера изображена на схеме:

Все узлы подписаны, но всё же некоторые названия могут быть не столь очевидными. Давайте рассмотрим их обозначения.

    АЛУ - арифметико-логическое устройство. Нужно для выполнения вычислении.

    Регистры общего назначения (РОН) - регистры которые могут принимать данные и хранить их в то время пока микроконтроллер подключен к питанию, после перезагрузки стираются. Служат как временные ячейки для операций с данными.

    Прерывания - что-то вроде события которое возникает по внутренним или внешним воздействиям на микроконтроллер - переполнение таймера, внешнее прерывание с пина МК и т.д.

    JTAG - интерфейс для внутрисхемного программирования без снятия микроконтроллера с платы.

    Flash, ОЗУ, EEPROM - виды памяти - программ, временных рабочих данных, долгосрочного хранения независимая от подачи питания к микроконтроллеру соответственно порядку в названиях.

    Таймеры и счетчики - важнейшие узлы в микроконтроллере, в некоторых моделях их количество может быть до десятка. Нужны для того, чтобы отчитывать количество тактов, соответственно временные отрезки, а счетчики увеличивают свое значение по какому-либо из событий. Их работа и её режим зависят от программы, однако выполняются эти действия аппаратно, т.е. параллельно основному тексту программы, могут вызвать прерывание (по переполнению таймера, как вариант) на любом этапе выполнения кода, на любой его строке.

    A/D (Analog/Digital) - АЦП, его назначение мы уже описали ранее.

    WatchDogTime (Сторожевой таймер) - независимый от микроконтроллера и даже его тактового генератора RC-генератор, который отсчитывает определенный промежуток времени и формирует сигнал сброса МК, если тот работал, и пробуждения - если тот был в режиме сна (энергосбережния). Его работу можно запретить, установив бит WDTE в 0.

Выходы микроконтроллера довольно слабые, имеется в виду то, что ток через них обычно до 20-40 миллиампер, чего хватит для розжига светодиода и LED-индикаторов. Для более мощной нагрузки - необходимы усилители тока или напряжения, например, те же транзисторы.

Что нужно чтобы начать изучение микроконтроллеров?

Для начала нужно приобрести сам микроконтроллер. В роли первого микроконтроллера может быть любой Attiny2313, Attiny85, Atmega328 и другие. Лучше выбирать ту модель, которая описана в уроках, по которым вы будете заниматься.

Следующее что Вам нужно - программатор . Он нужен для загрузки прошивки в память МК, самым дешевым и популярным считается USBASP .

Немногим дороже, но не менее распространенный программатор AVRISP MKII , который можно сделать своими руками - из обычной платы Arduino

Другой вариант - прошивать их через USB-UART переходник, который обычно делается на одном из преобразователей: FT232RL, CH340, PL2303 и CP2102.

В некоторых случаях для такого преобразователя используют микроконтроллеры AVR с аппаратной поддержкой USB, таких моделей не слишком много. Вот некоторые:

Одно лишь «но» - в память микроконтроллера предварительно нужно загрузить UART бутлоадер. Разумеется, для этого все равно нужен программатор для AVR-микроконтроллеров.

Интересно: Bootloader - это обычная программа для микроконтроллера, только с необычной задачей - после его запуска (подключения к питания) он ожидает какое-то время, что в него могут загрузить прошивку. Преимуществом такого метода - можно прошить любым USB-UART переходником, а они очень дешевы. Недостаток - долго загружается прошивка.

Для работы UART (RS-232) интерфейса в микроконтроллерах AVR выделен целый регистр UDR (UART data register) . UCSRA (настройки битов приемопередатчика RX, TX), UCSRB и UCSRС - набор регистров отвечающие за настройки интерфейса в целом.

В чем можно писать программы?

Кроме программатора для написания и загрузки программы нужно IDE - среда для разработки. Можно конечно же писать код в блокноте, пропускать через компиляторы и т.д. Зачем это нужно, когда есть отличные готовые варианты. Пожалуй, один из наиболее сильных - это IAR, однако он платный.

Официальным IDE от Atmel является AVR Studio, которая на 6 версии была переименована в Atmel studio. Она поддерживает все микроконтроллеры AVR (8, 32, xMega), автоматически определяет команды и помогает ввести, подсвечивает правильный синтаксис и многое другое. С её же помощью можно прошивать МК.

Наиболее распространённым является - C AVR, поэтому найдите самоучитель по нему, есть масса русскоязычных вариантов, а один из них - Хартов В.Я. «Микроконтроллеры AVR. Практикум для начинающих».

Смотрите также подробные обучающие видеокурсы по программированию микроконтроллеров для начинающих Максима Селиванова: .

Самый простой способ изучить AVR

Купите или сделайте своими руками . Проект ардуино разработан специально для учебных целей. Он насчитывает десятки плат различных формами и количеством контактов. Самое главное в ардуино - это то что вы покупаете не просто микроконтроллера, а полноценную отладочную плату, распаянную на качественной текстолитовой печатной плате, покрытой маской и смонтированными SMD компонентами.

Самые распространенные - это Arduino Nano и Arduino UNO, они по сути своей идентичны, разве что «Нано» меньше примерно в 3 раза чем «Уно».

Несколько фактов:

    Ардуино может программироваться стандартным языком - «C AVR»;

    своим собственным - wiring;

    стандартная среда для разработки - Arduino IDE;

    для соединения с компьютером достаточно лишь подключить USB шнур к гнезду micro-USB на плате ардуино нано, установить драйвера (скорее всего это произойдет автоматически, кроме случаев, когда преобразователь на CH340, у меня на Win 8.1 драйвера не стали, пришлось скачивать, но это не заняло много времени.) после чего можно заливать ваши «скетчи»;

    «Скетчи» - это название программ для ардуино.

Выводы

Микроконтроллеры станут отличным подспорьем в вашей радиолюбительской практике, что позволит вам открыть для себя мир цифровой электроники, конструировать свои измерительные приборы и средства бытовой автоматики.  

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

32 регистра общего назначения (РОН). Atmel была первой компанией, далеко
отошедшей от классической модели вычислительного ядра, в которой выполне-
ние команд предусматривает обмен данными между АЛУ и запоминающими
ячейками в общей памяти. Введение РОН в таком количестве (напомним, что в
архитектуре х 86 всего четыре таких регистра, а в x 51 понятие РОН, как таковое,
отсутствует) в ряде случаев позволяет вообще отказаться от расположения гло-
бальных и локальных переменных в ОЗУ и от использования стека, операции с
которым усложняют и загромождают программу. В результате структура ас-
семблерной программы приближается к программам на языках высокого уровня.
Правда, это привело к некоторому усложнению системы команд, номенклатура
которых для AVR больше, чем в других RISC-семействах (хотя значительная
часть инструкций - псевдонимы).

Flash-память программ (10 000 циклов стирание/запись) с возможностью
внутрисистемного перепрограммирования и загрузки через последовательный
канал прямо в готовой схеме. О преимуществах такого подхода, ныне ставшего
общепринятым, подробно рассказано во введении .

Отдельная область энергонезависимой памяти (EEPROM, 100 000 циклов
стирание/запись) для хранения данных, с возможностью записи программным
путем, или внешней загрузки через SPI-интерфейс.

Встроенные устройства для обработки аналоговых сигналов : аналоговый
компаратор и многоканальный 10-разрядный АЦП.

Сторожевой таймер , позволяющий осуществлять автоматическую перезагрузку
контроллера через определенные промежутки времени (например, для выхода из
"спящего" режима).

Последовательные интерфейсы SPI , TWI (I

C ) и UART (USART ), позволяю-

щие осуществлять обмен данными с большинством стандартных датчиков и
других внешних устройств (в том числе таких, как персональные компьютеры)
аппаратными средствами.

Таймеры-счетчики с предустановкой и возможностью выбора источника счет-
ных импульсов: как правило, один-два 8-разрядных и как минимум один
16-разрядный, в том числе могущие работать в режиме многоканальной 8-, 9-,
10-, 16-битовой широтно-импульсной модуляции (PWM).

Возможность работы при тактовой частоте от 0 Гц до 16–20 МГц.

Диапазон напряжений питания от 2,7 до 5,5 В (в некоторых случаях от 1,8 или
до 6,0 В).

Многочисленные режимы энергосбережения , отличающиеся числом узлов,
остающихся подключенными. Выход из "спящих" режимов по сторожевому
таймеру или по внешним прерываниям.

Встроенный монитор питания - детектор падения напряжения (Brown-out
Detection).

Здесь перечислены далеко не все особенности, характерные для различных моделей
AVR. С некоторыми другими мы познакомимся в дальнейшем, а также на практике
рассмотрим перечисленные подробнее. Но сначала дадим общую характеристику
различных семейств AVR с точки зрения их преимущественного назначения.

Семейства AVR

В 2002 г. фирма Atmel начала выпуск новых подсемейств 8-разрядных МК на базе
AVR-ядра. С тех пор все МК этого семейства делятся на три группы (подсемейст-
ва): Classic, Tiny и Mega. МК семейства Classic (AT90Sxxxx ) уже не выпускаются;
дольше всего в производстве "задержалась" очень удачная (простая, компактная и
быстродействующая модель) AT90S2313, но и она была в 2005 г. заменена на
ATtiny2313. Все "классические" AVR с первыми цифрами 2 и 8 в наименовании
модели (что означает объем памяти программ в килобайтах) имеют аналоги в се-
мействах Tiny и Mega. Для Mega при программировании возможна установка спе-
циального бита совместимости, который позволяет без каких-либо изменений ис-
пользовать программы, созданные для семейства Classic. Поэтому ряд примеров в
данной книге в целях упрощения изложения приводится в версии для семейства
Classic.
Примеры различных типов корпусов, в которых выпускаются микросхемы AVR,
приведены на рис. 1.1. Более подробную информацию на эту тему можно найти в
приложении 1 (табл. П1.2), а также в технической документации на устройства.
Отметим, что для радиолюбительских нужд и макетирования удобнее всего микро-
схемы в PDIP-корпусах, но не все модели МК в таких корпусах производятся.
Все семейства могут иметь две модификации: буква "L" в обозначении говорит
о расширенном диапазоне питания 2,7–5,5 В, отсутствие такой буквы означает диа-
пазон питания 4,5–5,5 В. При выборе конкретного типа микросхемы нужно быть
внимательным, т. к. L-версии одновременно также и менее быстродействующие, у
большинства из них максимальная тактовая частота ограничена значением 8 МГц.
Для "обычных" версий максимальная частота составляет 16 или 20 МГц. Хотя, как
правило, при запуске L-микросхем с напряжением питания 5 В на частотах до 10–
12 МГц неприятностей ожидать не следует (аналогично версии без буквы L вполне
могут работать при напряжении питания около 3 В, разумеется, не на экстремаль-
ных значениях частот), тем не менее при проектировании высоконадежных уст-
ройств следует учитывать это требование.
Микросхемы Tiny имеют Flash-ПЗУ программ объемом 1–8 кбайт и размещаются в
основном в корпусах с 8–20 выводами (кроме ATtiny28), т. е. они в целом предна-
значены для более простых и дешевых устройств. Это не значит, что их возможно-
сти во всех случаях более ограниченны, чем у семейства Mega. Так, например,
ATtiny26 при цене менее 2 долларов содержит таймер с высокоскоростным ШИМ-
режимом (в других моделях такого нет), а также 11-канальный АЦП с возмож-
ностью работы в дифференциальном режиме, с регулируемым входным усилителем

Часть I. Общие принципы устройства и функционирования Atmel AVR

и встроенным источником опорного напряжения, что характерно для старших мо-
делей. Микросхема ATtiny2313, как уже говорилось, представляет собой улучшен-
ную версию одного из наиболее универсальных и удобных "классических" AVR
AT90S2313.

Рис. 1.1. Примеры различных типов корпусов для МК AVR

Подсемейство Mega оснащено Flash-ПЗУ программ объемом 8–256 кбайт и корпу-
сами с 28–100 выводами. В целом МК этой группы более "навороченные", чем
Tiny, имеют более разветвленную систему встроенных устройств с более развитой
функциональностью.
Таблицы с основными характеристиками некоторых моделей Tiny и Mega из числа
самых ходовых приведены в приложении 1 . Там же даны некоторые общие техни-
ческие характеристики семейства AVR. Более подробные сведения можно почерп-
нуть из и фирменной технической документации, которая доступна на сайте
Atmel для каждой модели.
Кроме этих трех семейств, на базе AVR-ядра выпускаются специализированные
микросхемы для работы с USB-интерфейсом (AT90USBxxxx ), промышленным ин-
терфейсом CAN (AT90CANххх ), для управления ЖК-дисплеями (ATmega329 и др.),
с беспроводным интерфейсом IEEE 802.15.4 (ZigBee) для предприятий торговли и
некоторые другие. В последнее время некоторые микроконтроллеры серий Tiny и
Mega стали выпускаться в версиях со сверхмалым потреблением (технология
picoPower с напряжением питания от 1,8 В, в конце наименования МК этой серии
добавлена буква "P") и высокотемпературных для использования в автомобильной
промышленности (версии Automotive). Появилось семейство XMega с напряжением
питания 1,8–3,6 В, повышенным быстродействием (тактовая частота до 32 МГц),

Глава 1. Обзор микроконтроллеров Atmel AVR

12-разрядным 16-канальным АЦП и 2–4 каналами ЦАП (до сих пор в структуре
AVR они отсутствовали), несколькими каналами UART и других последовательных
портов (причем с возможностью работы в автономном режиме, при остановленном
ядре), встроенной поддержкой криптографии, усовершенствованным режимом
picoPower и другими "наворотами". Существует также отдельное семейство 32-раз-
рядных МК AVR32, предназначенное для высокоскоростных приложений, таких
как обработка видеопотока или распознавание образов в реальном времени.

Особенности
практического использования МК AVR

При использовании AVR возникает ряд вопросов практического характера, игно-
рирование которых может иногда привести к неработоспособности или сбоям уст-
ройства (а в некоторых случаях - даже к невозможности его запрограммировать).
Например, одна из таких проблем - возможность потери содержимого EEPROM
при выключении питания. Эту и подобные проблемы мы подробно рассмотрим в
соответствующих главах. Здесь же остановимся на некоторых общих вопросах
включения МК AVR.

О потреблении

МК AVR потребляют в среднем 5–15 мА (без учета потребления внешних уст-
ройств через выводы МК). Потребляемый ток зависит не только от степени "наво-
роченности" модели, но и от тактовой частоты и напряжения питания. На рис. 1.2
приведена типовая диаграмма зависимости тока потребления от напряжения пита-
ния и тактовой частоты для младших моделей семейства Mega.
Из рис. 1.2, в частности, следует, что значительно уменьшить потребление можно,
снижая тактовую частоту в тех случаях, когда время выполнения программы не-
критично. Это позволяет упростить программу, отказавшись от режимов энерго-
сбережения: например, при установке "часового" кварца 32 768 Гц в качестве так-
тирующего потребление МК может составить порядка 200–300 мкА.

З

АМЕТКИ НА ПОЛЯХ

Величину тока потребления 1–2 мА и менее можно условно считать приемлемой для
батарейных устройств, которые рассчитаны на долговременный режим непрерывной
работы. Элементы типоразмера АА (типа alcaline, т. е. щелочные) имеют емкость по-
рядка 2000 мА ч, т. е. устройство с указанным потреблением от этих элементов про-
работает не менее 1000 ч (реально даже несколько больше) или более 40 суток. Вре-
мя работы от батарей типоразмера D с энергоемкостью порядка 15–18 000 мА ч со-
ставит около года, чего для большинства практических применений достаточно.
Выбирать для питания подобных устройств (особенно, включающихся периодически
на короткое время) следует именно щелочные элементы, т. к. они обладают большой
емкостью, не текут при переразряде и, главное, имеют значительно больший срок
хранения (порядка 7 лет) по сравнению с другими типами элементов.

Но внимательное рассмотрение вопроса показывает, что именно этим - упроще-
нием программы - в подавляющем большинстве случаев преимущества более

Часть I. Общие принципы устройства и функционирования Atmel AVR

низкой тактовой частоты и ограничиваются. Графики на рис. 1.2 линейны, отсюда
следует, что пропорционально снижению тактовой частоты растет время выполне-
ния команд. Таким образом, процедура, выполнение которой при тактовой частоте
4 МГц займет 100 мкс, при тактовой частоте 32 768 Гц будет длиться более 12 мс.
Легко подсчитать, что в том и другом случае количество энергии, потребленной на
выполнение этой процедуры, будет одинаковым.

Рис. 1.2. Диаграмма зависимости тока потребления от напряжения питания

и тактовой частоты для младших моделей семейства Mega

Поэтому можно сделать следующий общий вывод: если вы не желаете вникать в
тонкости режимов энергосбережения и не реализуете их в программе, то для обще-
го снижения потребления нужно выбирать тактовую частоту как можно ниже (на
практике обычно достаточно ограничиться величиной 1 МГц, т. к. дальнейшее
снижение, скорее всего, не даст эффекта из-за дополнительного потребления внеш-
ними цепями, неизбежно присутствующими во всех схемах). Если же у вас преду-
смотрен один из режимов "глубокого" энергосбережения (см. главу 4 ), то тактовая
частота с точки зрения суммарного потребления практически не имеет значения.
Другое дело - выбор напряжения питания, которое желательно сделать как можно
меньше, если это позволяют внешние устройства. Зависимость тока потребления от
напряжения питания, как легко уяснить из графиков на рис. 1.2, нелинейная: с уве-
личением напряжения ток потребления быстро возрастает. Поэтому снижать на-
пряжение питания даже с учетом ограничения на тактовую частоту для большинст-
ва моделей AVR (не более 8 МГц при питании 2,7 В) все равно выгодно. Например,
устройство с питанием 3 В при тактовой частоте 8 МГц, согласно рис. 1.2, будет
потреблять около 3 мА или, в пересчете на единицы мощности, 9 мВт; на процеду-

Глава 1. Обзор микроконтроллеров Atmel AVR

ру длительностью 100 мкс уйдет энергия 0,9 мкДж. При частоте 16 МГц та же про-
цедура займет 50 мкс, но потребление при необходимом напряжении питания 5 В
составит около 14 мА, т. е. 70 мВт; итого на выполнение процедуры уйдет энергия
3,5 мкДж, почти в 4 раза больше.
Для всех внешних цифровых устройств, за редчайшим исключением, можно по-
добрать современный аналог, предназначенный для работы при напряжениях 2,7–
3,0 В (и даже ниже, если модель контроллера это позволяет), так что с этой стороны
ограничений нет; то, что большинство примеров в этой книге ориентировано на
напряжение питания 5 В, есть лишь дань традиции. К тому же примеры эти, как
правило, подразумевают питание от сети, где потребление не имеет большого зна-
чения. Лимитировать снижение напряжения питания могут светодиодные индика-
торы (из-за того, что прямое падение напряжения на светодиодах само по себе со-
ставляет порядка 2 В, а для больших индикаторов даже 5 В для управления недос-
таточно), но в таких устройствах потребление контроллера уже не играет большой
роли: четыре семисегментные цифры сами по себе будут потреблять ток порядка
100 мА и более. Другой случай представляют аналоговые схемы, где повышение
напряжения питания выгодно с точки зрения увеличения отношения "сигнал-шум".
Заметим, что выводы AVR могут в долговременном режиме отдавать значительный
ток (до 20-40 мА), однако не следует забывать об общем суммарном ограничении
на потребление по выводу питания (см. табл. П1.3). Следует также отметить, что
при подаче аналоговых напряжений на входы АЦП входной цифровой КМОП-
элемент (вход соответствующего порта) не отключается, и при значении данного
напряжения вблизи порога срабатывания элемента это может приводить к возрас-
танию потребления за счет протекания сквозного тока через выходные каскады
КМОП (в том числе иногда и при нахождении микросхемы в "спящем" режиме,
см. главу 14 ). Этого недостатка лишены микросхемы с технологией picoPower.

Некоторые особенности применения AVR в схемах

У большинства выводов МК имеется встроенный подключаемый "подтягивающий"
(т. е. подсоединенный к шине питания) резистор, что, казалось бы, решает одну из
обычных схемотехнических проблем, когда наличие такого резистора требуется
для подключения двухвыводных кнопок или выходов с "открытым коллектором".
Однако в критичных случаях необходим внешний резистор сопротивлением 2–
5 кОм (в критичных для потребления случаях до 10–30 кОм).
"Подтягивающий" резистор следует устанавливать не только на выводе /RESET
(о чем пойдет речь в главе 2 ), но и в том случае, когда выводы SCK, MOSI и MISO
соответствующих портов используются для программирования и подключены к
программирующему разъему ISP (см. главу 5 ), а также по выводам внешних преры-
ваний, если они задействованы. Если эти выводы не "подтягивать" к напряжению
питания дополнительными резисторами (хотя это и не оговорено в технической
документации), то не исключены ложные срабатывания внешних прерываний, пе-
резапуск системы, а при очень мощных помехах - даже порча программы в памя-
ти программ. С другой стороны, когда выводы программирования служат и в каче-

Часть I. Общие принципы устройства и функционирования Atmel AVR

стве обычных портов, сконфигурированных на выход, а в устройстве применяются
режимы энергосбережения, наличие "подтягивающих" резисторов может привести
к лишнему потреблению тока (при установке вывода в логический ноль через рези-
стор потечет ток от источника питания на вход МК). Если реализован один из ре-
жимов энергосбережения, то нужно тщательно проанализировать схему, чтобы ис-
ключить ситуации, при которых через эти резисторы протекает ток.
Также всегда следует устанавливать внешние резисторы при работе выводов МК на
общую шину, как в интерфейсе I

C (или просто при подсоединении входа МК к

выходу другого устройства с открытым коллектором, например, мониторов пита-
ния, описанных в главе 3 ), при подключении к двухвыводным кнопкам (особенно
при наличии внешнего прерывания, см. главы 4 и 5 ). Сопротивление встроенного
резистора (на самом деле представляющего собой, разумеется, полевой транзистор)
в таких случаях слишком велико для того, чтобы электромагнитные помехи ("на-
водки") на нем эффективно "садились".
Микросхемы AVR, как и всякая КМОП-логика, благодаря высокому порогу сраба-
тывания эффективно защищены от помех по шине "земли". Однако они ведут себя
гораздо хуже при помехах по шине питания. Поэтому не забывайте о развязываю-
щих конденсаторах, которые нужно устанавливать непосредственно у выводов пи-
тания (керамические 0,1–0,5 мкФ), а также про качество сетевых выпрямителей и
стабилизаторов.

Г Л АВ А

Общее устройство,
организация памяти,
тактирование, сброс

Общая структура внутреннего устройства МК AVR приведена на рис. 2.1. На этой
схеме показаны все основные компоненты AVR (за исключением модуля JTAG);
в отдельных моделях некоторые составляющие могут отсутствовать или различать-
ся по характеристикам, неизменным остается только общее 8-разрядное процессор-
ное ядро (GPU, General Processing Unit). Кратко опишем наиболее важные компо-
ненты, большинство из которых мы подробно будем рассматривать в дальнейшем.
Начнем с памяти. В структуре AVR имеются три разновидности памяти: flash-
память программ, ОЗУ (SRAM) для временных данных и энергонезависимая па-
мять (EEPROM) для долговременного хранения констант и данных. Рассмотрим их
по отдельности.

Память программ

Объем встроенной flash-памяти программ в AVR-контроллерах составляет от
1 кбайта у ATtiny11 до 256 кбайт у ATmega2560. Первое число в наименовании мо-
дели соответствует величине этой памяти из ряда: 1, 2, 4, 8, 16, 32, 64, 128 и
256 кбайт. Память программ, как и любая другая flash-память, имеет страничную
организацию (размер страницы, в зависимости от модели, составляет от 64 до
256 байт). Страница может программироваться только целиком. Число циклов пе-
репрограммирования достигает 10 тыс.
С точки зрения программиста память программ можно считать построенной из от-
дельных ячеек - слов по два байта каждое. Устройство памяти программ (и только
этой памяти) по двухбайтовым словам - очень важный момент, который нужно
твердо усвоить. Такая организация обусловлена тем, что любая команда в AVR
имеет длину ровно два байта. Исключение составляют команды

и некото-

рые другие (например,

), которые оперируют с 16-разрядными и более длинны-

ми адресами, длина этих команд равна четырем байтам и они применяются лишь
в моделях с памятью программ объемом свыше 8 кбайт (подробнее см. главу 5 ). Во
всех остальных случаях счетчик команд сдвигается при выполнении очередной

Часть I. Общие принципы устройства и функционирования Atmel AVR

команды на два байта (одно слово), поэтому необходимую емкость памяти легко
подсчитать, зная число используемых команд. Абсолютные адреса в памяти про-
грамм (указываемые, например, в таблицах векторов прерываний в техническом
описании МК) также отсчитываются в словах.

Рис. 2.1. Общая структурная схема микроконтроллеров AVR

З

АМЕТКИ НА ПОЛЯХ

Приведем пример интересного случая адресации, который представляет
команда для чтения констант из памяти LPM (а также ELPM в МК с памятью программ
128

кбайт и более). Эта команда подразумевает чтение по байтовому адресу, указан-

ному в двух старших РОН (образующих т. н. регистр Z, см. далее). Однако чтобы не
нарушать "чистоту" концепции организации памяти программ по словам, разработчики
запутали этот простой вопрос, указав в описании, что при вызове команды LPM стар-
шие 15 разрядов регистра Z адресуют слово в памяти, а младший разряд выбирает
младший или старший байт (при равенстве разряда 0 или 1 соответственно) этого

слова. Легко, однако, заметить, что байтовая и пословная организации памяти при та-
ком подходе эквивалентны.

Последний адрес существующего объема памяти программ для конкретной модели
обозначается константой

По умолчанию все контроллеры AVR всегда

начинают выполнение программы с адреса $0000. Если в программе нет прерыва-
ний, то с этого адреса может начинаться прикладная программа. В противном слу-

чае по данному адресу располагается т. н. таблица векторов прерываний , подроб-
нее о которой мы будем говорить в главах 4 и 5 . Здесь укажем лишь, что первым в
этой таблице (по тому же адресу $0000) всегда размещается вектор сброса

который указывает на процедуру, выполняющуюся при сбросе МК (в том числе и
при включении питания).

П

РИМЕЧАНИЕ

В ассемблере AVR можно обозначать шестнадцатеричные числа в "паскалевском"
стиле, предваряя их знаком $, при этом стиль языка С (0x00) тоже действителен, а вот
"интеловский" способ (00h) не работает. Подробнее об обозначениях чисел различных
систем счисления в AVR-ассемблере см. главу 5 .

В последних адресах памяти программ контроллеров семейства Mega может распо-
лагаться т. н. загрузчик - специальная программа, которая управляет загрузкой и
выгрузкой прикладных программ из основного объема памяти. В этом случае по-
ложение вектора сброса и всей таблицы векторов прерываний (т. е. фактически на-
чального адреса, с которого начинается выполнение программы) может быть изме-
нено установкой специальных конфигурационных ячеек (см. главу 5 ).

Память данных (ОЗУ, SRAM)

В отличие от памяти программ, адресное пространство памяти данных адресуется
побайтно (а не пословно). Адресация полностью линейная, без какого-то деления
на страницы, сегменты или банки, как это принято в некоторых других системах.
Младшие МК семейства Tiny (включая Tiny1х и Tiny28) памяти данных, как тако-
вой, не имеют, ограничиваясь лишь регистровым файлом (РОН) и регистрами вво-
да-вывода (РВВ). В других моделях объем встроенной SRAM колеблется от
128 байт в представителях семейства Tiny (например, у ATtiny2313) до 4–8 кбайт
у старших моделей Mega.
Адресное пространство статической памяти данных (SRAM) условно делится на
несколько областей, показанных на рис. 2.2. Темной заливкой выделена часть, от-
носящаяся к собственно встроенной SRAM, до нее по порядку адресов расположе-
но адресное пространство регистров (первые 32 байта занимает РОН, еще 64 -
РВВ). Для старших моделей Mega со сложной структурой (например, ATmega128)
64-х регистров ввода-вывода может оказаться недостаточно, поэтому в них для до-
полнительных РВВ выделяется отдельное адресное пространство (от $60 до макси-
мально возможного в байтовой адресации значения $FF, итого таких регистров мо-
жет быть всего 160).

З

АМЕТКИ НА ПОЛЯХ

В архитектуре МК AVR понятие "ввода-вывода" употребляется в двух смыслах: во-

первых, имеются "порты ввода-вывода" (I/O ports), которые мы рассмотрим в главе 3 .
Во-вторых, "регистрами ввода-вывода" (РВВ) в структуре AVR называются регистры,
которые обеспечивают доступ к дополнительным компонентам, внешним по отноше-

нию к GPU, за исключением ОЗУ (в том числе и к портам ввода-вывода). Такое под-
разделение приближает структуру МК AVR к привычной конфигурации персонального
компьютера, где доступ к любым внешним по отношению к центральному процессору
компонентам, кроме памяти, осуществляется через порты ввода-вывода.

Часть I. Общие принципы устройства и функционирования Atmel AVR

Для некоторых моделей Mega (ATmega8515, ATmega162, ATmega128, ATmega2560
и др.) предусмотрена возможность подключения внешней памяти объемом до
64 кбайт, которая может быть любой статической
разновидностью (SRAM, Flash или EEPROM) с па-
раллельным интерфейсом.
Отметим, что адреса РОН и РВВ не отнимают про-
странство у ОЗУ данных (за исключением подклю-
чаемой внешней памяти у старших моделей Mega,
максимальный адрес которой ограничен значением
$FFFF): так, если в конкретной модели МК имеется
512 байт SRAM, а пространство регистров занимает
первые 96 байт (до адреса $60), то адреса SRAM
займут адресное пространство от $0060 до $025F
(т. е. от 96-й до 607-й ячейки включительно). Конец
встроенной памяти данных обозначается константой

Рис. 2.2. Адресное пространство

статической памяти данных (SRAM)

микроконтроллеров AVR

Операции чтения/записи в память одинаково работают с любыми адресами из дос-
тупного пространства, и при работе с SRAM нужно быть внимательным: вместо
записи в память вы легко можете "попасть" в какой-нибудь регистр. Например,
команда загрузки значения регистра

в регистр

) равносильна

записи в SRAM по нулевому адресу (

). Адрес в памяти для РОН сов-

падает с его номером. В то же время для непосредственной записи в РВВ по его
адресу в памяти к номеру регистра следует прибавить $20: так, регистр флагов

который для большинства моделей располагается в конце таблицы РВВ по адресу
$3F, в памяти имеет адрес $5F. Устанавливать РОН и РВВ прямой адресацией па-
мяти неудобно: такая запись всегда отнимает два такта вместо одного, характерно-
го для большинства других команд, хотя иногда это позволяет обойти ограничения
на манипуляции с некоторыми РВВ. Но если имеется готовая программа, работаю-
щая с SRAM, то при замене моделей процессоров на более старшие нужно быть
внимательным из-за того, что в них младшие адреса SRAM могут перекрываться
дополнительными РВВ.

Глава 2. Общее устройство, организация памяти, тактирование, сброс

Энергонезависимая память данных (EEPROM)

Все модели МК AVR (кроме снятого с производства ATtiny11) имеют встроенную
EEPROM для хранения констант и данных при отключении питания.
В разных моделях объем ее варьируется от 64 байт (ATtiny1х) до 4 кбайт (старшие
модели Mega). Конец EEPROM обозначается константой

(это обозначе-

ние введено только для более поздних моделей AVR, потому при использовании
этой константы иногда ее придется определять самому). Число циклов перепро-
граммирования EEPROM может достигать 100 тыс.
Напомним, что EEPROM отличается от Flash возможностью выборочного про-
граммирования побайтно (в принципе даже побитно, но этот способ недоступен
пользователю). Однако в старших моделях семейства EEPROM, как и flash-память
программ, имеет страничную организацию, правда, страницы эти невелики - до
4 байт каждая. На практике, как при программировании EEPROM по последова-
тельному каналу (т. е. через SPI-интерфейс программирования), так и при записи и
чтении EEPROM из программы, эта особенность не имеет значения, и доступ осу-
ществляется побайтно.
Чтение из EEPROM осуществляется в течение одного машинного цикла (правда, на
практике оно растягивается на четыре цикла, но программисту следить за этим спе-
циально не требуется). А вот запись в EEPROM протекает значительно медленнее,
и к тому же с точно не определенной скоростью: цикл записи одного байта может
занимать от 2 до ~ 4 мс и более. Процесс записи регулируется встроенным RC -
генератором, частота которого нестабильна (при более низком напряжении питания
можно ожидать, что время записи будет больше). За такое время при обычных так-
товых частотах МК успевает выполнить несколько тысяч команд, потому програм-
мирование процедуры записи требует аккуратности: например, нужно следить,
чтобы в момент записи не "вклинилось" прерывание (подробнее об этом см. гла-
вы 4
и 9 ).
Главная же сложность при работе с EEPROM - возможность повреждения ее со-
держимого при недостаточно быстром снижении напряжения питания в момент
выключения. Обусловлено это тем, что при уменьшении напряжения питания до
некоторого порога (ниже порога стабильной работы, но недостаточного для полно-
го выключения) из-за колебаний напряжения МК начинает выполнять произволь-
ные команды, в том числе может осуществить процедуру записи в EEPROM. Если
учесть, что типовая команда МК AVR выполняется за десятые доли микросекунды,
то ясно, что никакой реальный источник питания не может обеспечить снижение
напряжения до нуля за нужное время. По опыту автора при питании от обычного
стабилизатора типа LM7805 с рекомендованными значениями емкости конденсато-
ров на входе и на выходе содержимое EEPROM будет неизбежно испорчено при-
мерно в половине случаев.
Этой проблемы не должно существовать, если константы записывают в EEPROM
при программировании МК, а процедура записи в программе отсутствует (о том,
как сформировать файл с данными для EEPROM, см. раздел "Директивы и функ-
ции" главы 5
). Большая сохранность данных в таких случаях подтверждается и эм-

Часть I. Общие принципы устройства и функционирования Atmel AVR

пирическими наблюдениями, и тем, что разрешение записи в EEPROM - процеду-
ра двухступенчатая (см. главу 9 ). Во всех же остальных случаях (а их, очевидно,
абсолютное большинство - в EEPROM чаще всего хранят пользовательские уста-
новки и текущую конфигурацию при выключении питания) приходится принимать
специальные меры. Наиболее кардинальной и универсальной из них является уста-
новка внешнего монитора питания, удерживающего МК в состоянии сброса при
уменьшении напряжения питания ниже пороговой величины. Той же цели служит
встроенный детектор падения напряжения (Brown-out Detection, BOD), имеющийся
практически во всех моделях Tiny и Mega, но техническая документация не исклю-
чает при этом для надежности дублирования его и внешним монитором питания.
Подробнее о схеме BOD и режимах сброса МК см. далее в этой главе , а о програм-
мировании EEPROM и мерах предосторожности при ее использовании см. главу 9 .

Способы тактирования

Канонический способ тактирования МК - подключение кварцевого резонатора к
соответствующим выводам (рис. 2.3, а ). Емкость конденсаторов С1 и С2 в типовом
случае должна составлять 15–22 пФ (может быть увеличена до 33–47 пФ с одно-
временным повышением потребления). В большинстве моделей Tiny и Mega име-
ется специальный конфигурационный бит

Который позволяет регулировать

потребление. При установке этого бита в 1 (незапрограммированное состояние)
размах колебаний генератора уменьшается, однако при этом сужается возможный
диапазон частот и общая помехоустойчивость, поэтому задействовать этот режим
не рекомендуется. Может быть также выбран низкочастотный кварцевый резонатор
(например, "часовой" 32 768 Гц), при этом конденсаторы С1 и С2 могут отсутство-
вать, т. к. при установке

в значение 0 подключаются имеющиеся в составе

МК внутренние конденсаторы емкостью 36 пФ.
Кварцевый резонатор можно заменить керамическим. Автору этих строк удавалось
запускать МК на нестандартных частотах, используя вместо кварца в том же под-
ключении миниатюрную индуктивность (при ее значении 4,7 мкГн и емкостях кон-
денсаторов 91 пФ частота получается около 10 МГц), что заодно позволяет немного
уменьшить габариты схемы.
Естественно, тактировать МК можно и от внешнего генератора (рис. 2.3, б ). Осо-
бенно это удобно, когда требуется либо синхронизировать МК с внешними компо-
нентами, либо получить очень точную частоту тактирования, выбрав соответст-
вующий генератор (например, серии SG-8002 фирмы Epson).
Наоборот, когда точность не требуется, можно подключить внешнюю RC -цепочку
(рис. 2.3, в ). В этой схеме емкость С1 должна быть не менее 22 пФ, а резистор R1
выбирается из диапазона 3,3–100 кОм. Частота при этом определяется по формуле
F = 2/3 RC . С1 можно не устанавливать вообще, если записать лог. 0 в конфигура-
ционную ячейку

Подключив тем самым внутренний конденсатор 36 пФ.

Наконец, можно вообще отказаться от внешних компонентов и обойтись встроен-
ным RC -генератором, который способен работать на четырех приблизительных

Глава 2. Общее устройство, организация памяти, тактирование, сброс

значениях частот (1, 2, 4 и 8 МГц). В ряде моделей предусмотрена возможность
подстройки частоты этого генератора (подробнее см. или техническое описание
конкретных моделей). Эту возможность наиболее целесообразно использовать в
младших моделях Tiny, выпускающихся в 8-контактном корпусе - тогда выводы,
предназначенные для подключения резонатора или внешнего генератора, можно
задействовать для других целей, как обычные порты ввода-вывода.

Рис. 2.3. Способы тактирования МК AVR с использованием: а - кварцевого резонатора;

б - внешнего генератора; в - RC -цепочки

Семейство Classic встроенного RC -генератора не имеет, а специальных конфигура-

ционных ячеек у этих МК значительно меньше, и в общем случае на них можно не

обращать внимания. Для других семейств это не так. По умолчанию МК семейств

Tiny и Mega установлены в состояние для работы со встроенным генератором на
частоте 1 МГц (

0001), поэтому для других режимов нужно соответствую-

щим образом установить конфигурационные ячейки

(см. табл. 2.1). При этом

следует учитывать, что состояние ячеек

0000 (зеркальное по отношению к

наиболее часто употребляемому значению для кварцевого резонатора 1111) пере-

водит МК в режим тактирования от внешнего генератора, и при этом его нельзя

даже запрограммировать без подачи внешней частоты. О рекомендуемых установ-

ках конфигурационных ячеек и об особенностях их программирования см. также

главу 5 .

Таблица 2.1. Установка конфигурационных ячеек CKSEL

в зависимости от режимов тактирования

CKSEL3...0

Источник тактирования

Частота

Внешняя частота

Встроенный RC -генератор

Встроенный RC -генератор

Встроенный RC -генератор

Встроенный RC -генератор

Внешняя RC -цепочка

Часть I. Общие принципы устройства и функционирования Atmel AVR

Таблица 2.1 (окончание)

CKSEL3...0

Источник тактирования

Частота

Внешняя RC -цепочка

0,9... 3,0 МГц

Внешняя RC -цепочка

3,0... 8,0 МГц

Внешняя RC -цепочка

8,0... 12 МГц

Низкочастотный резонатор

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

0,4... 0,9 МГц

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

0,9... 3,0 МГц

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

3,0... 8,0 МГц

1ххх (CKPOT=0)

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

Сброс

Сбросом (RESET) называется установка начального режима работы МК. При этом
все РВВ устанавливаются в состояние по умолчанию - как правило, это нули во
всех разрядах, за небольшим исключением (а вот РОН могут принимать произ-
вольные значения, поэтому при необходимости начинать с какой-то определенной
величины переменные следует устанавливать в начале программы принудительно).
Программа после сброса начинает выполняться с начального адреса (по умолчанию
это адрес $0000).
Сброс всегда происходит при включении питания. Кроме этого, источниками сбро-
са могут быть следующие события: аппаратный сброс, т. е. подача низкого уровня
напряжения на вход RESET (правильнее его обозначать с инверсией: /RESET, т. к.
активный уровень тут низкий, и мы будем придерживаться этого правила); оконча-
ние отсчета установленного интервала сторожевого таймера; срабатывание схемы
BOD. Значение четырех младших битов регистра состояния

должно сигна-

лизировать о том, от какого источника производился сброс предыдущий раз (уста-
новка в 1 бита 0 - сброс при включении, бита 1 - аппаратный сброс, бита 2 - от
схемы BOD, бита 3 - от сторожевого таймера). На практике, по опыту автора, по
состояниям этого регистра надежно различаются от всех остальных лишь состоя-
ния сброса по таймеру (прочие флаги могут оказаться установленными все одно-
временно). Тем не менее эта информация может быть полезной, например, при ана-
лизе причин перерывов в работе круглосуточно работающих устройств (см. главу 12 ).
В младших МК семейства Tiny (кроме ATtiny28) нет встроенного "подтягивающе-
го" резистора на выводе /RESET, поэтому для надежной работы следует преду-
смотреть подключение внешнего резистора величиной 2–5 кОм от этого вывода к
напряжению питания. Автор также настоятельно рекомендует устанавливать по-
добный резистор для любых моделей AVR, т. к. встроенный резистор имеет боль-
шой номинал (100–500 кОм) и на нем могут наводиться помехи, способные привес-
ти к непредсказуемому сбросу. Также (хотя в технических описаниях такой реко-

Глава 2. Общее устройство, организация памяти, тактирование, сброс

мендации и не содержится) не помешает установка конденсатора 0,1–0,5 мкФ от
вывода /RESET на "землю" - это сглаживает неизбежный дребезг напряжения и
немного затягивает фронт нарастания напряжения на выводе /RESET по сравнению
с увеличением напряжения питания: когда наступит порог срабатывания схемы
сброса, напряжение питания всего МК уже установится.
В моделях Tiny, выпускающихся в 8-контактном корпусе (ATtiny11–ATtiny15), ес-
ли не требуется внешний сброс, вывод /RESET может выполнять функции обычно-
го порта ввода-вывода. С одним только нюансом: при конфигурировании этого
контакта на выход он работает, как вывод с открытым коллектором, а не как обыч-
ный логический элемент (о конфигурации выводов портов см. главу 3 ).
Самый предпочтительный способ организации сброса при включении питания, как
уже говорилось ранее, - установка внешнего монитора питания. Например, при
5-вольтовом питании подойдет популярная микросхема MC34064 с порогом сраба-
тывания 4,6 В и типовым потреблением около 300 мкА или ее более современный
аналог (например, MAX803L с потреблением 12 мкА). Для трехвольтового питания
пригодна схема MAX803R (2,6 В) или подходящая версия DS1816 с соответствую-
щим напряжением. Все перечисленные микросхемы трехвыводные (питание, "зем-
ля", вывод управления сбросом) и имеют выход с открытым коллектором, т. е. пре-
дусматривают установку "подтягивающего" резистора. Типовое время срабатыва-
ния этих микросхем при снижении напряжения - микросекунды, что обеспечивает
сохранность данных в EEPROM. При повышении напряжения они обеспечивают
большую временную задержку (порядка долей секунды), что позволяет надежно
осуществлять сброс МК без дребезга.
Встроенная схема BOD обеспечивает время срабатывания порядка микросекунд с
задержкой на возврат в рабочее состояние после восстановления напряжения, оп-
ределяющейся теми же установками, что и задержка сброса (ячейки

тактовой частоте 4 МГц) и даже максимально возможное ее значение ~68 мс могут
оказаться недостаточными для обхода дребезга, возникающего при снижении на-
пряжения питания автономного источника. Для выбора режима работы BOD слу-
жат три конфигурационные ячейки

имеющие следующие состояния:

111 (установка по умолчанию) - схема BOD выключена;

101 - включает BOD при пороге срабатывания 2,7 В;

100 - соответствует порогу 4,0 В.

Отметим, что с точки зрения надежности работы, чем меньше разница между на-
пряжением питания и порогом срабатывания монитора питания (внешнего или
встроенной схемы BOD, неважно), тем лучше - при небольших скачках питания,
нечувствительных для монитора, тем не менее могут происходить всяческие не-
приятности вроде самопроизвольного возникновения внешнего прерывания. Одна-
ко эту разницу следует учитывать при питании устройства от батарей: например,
для четырех "пальчиковых" щелочных аккумуляторов и мониторе питания, рассчи-
танном на 4,7 В, остаточное напряжение на элементах после срабатывания монито-


Современное радиолюбительство невозможно представить без микроконтроллеров, и это очевидно. В последние десятилетия микроконтроллеры различных производителей стали широко распространены в разных сферах деятельности человека. Нередко их можно встретить в самых неожиданных устройствах и конструкциях. Мы с вами являемся свидетелями компьютеризации и автоматизации окружающих нас процессов. Истина такова, что без знания основ программирования создавать современные конкурентоспособные устройства стало практически невозможно…

Если вы читаете эту статью, вероятно у вас возникло желание понять, как работают микроконтроллеры, и скорее всего появились вопросы:

4. Какую литературу изучать?

Попробуем ответить на эти вопросы.

1. Какой микроконтроллер выбрать для работы?

Большой популярностью у радиолюбителей пользуются 8-битные микроконтроллеры PIC фирмы Microchip Technology и AVR фирмы Atmel, 16-битные MSP430 фирмы TI, а также 32-битные микроконтроллеры, архитектуры ARM .

В промышленности, несколько иначе, первое место с большим отрывом занимает Renesas Electronics на втором Freescale , на третьем Samsung , затем идут Microchip и TI , далее все остальные.
Популярность определяется ценой и доступностью, немалую роль играют наличие технической информации и стоимость программного сопровождения.

Мы будем изучать 8-битные микроконтроллеры AVR, семейства ATMEGA 8 и 16 серии . Выбор определился, опять же доступностью, наличием множества любительских разработок, огромным количеством учебного материала. Наличием разнообразных встроенных компонентов и функциональностью этого семейства.

2. Какую среду разработки использовать для программирования выбранного микроконтроллера?

Для AVR созданы разные интегрированные среды разработки (IDE, Integrated development environment).
IDE – это система программных средств, используемая программистами для разработки программного обеспечения (ПО), в состав которой входят:
текстовый редактор,
компилятор и/или интерпретатор,
средства автоматизации сборки,
отладчик.

Наиболее распространенные из них AVRStudio, ATmelStudio, WINAVR, CodeVision, IAR Embedded Workbench .
Для того, чтобы писать программы, мы воспользуемся бесплатной IDE ATmelStudio версии 6 и выше.
Скачать Atmel Studio можно с официального сайта после регистрации (регистрация абсолютно бесплатная и ни к чему не обязывает!)

ATmelStudio позволяет создавать проекты, и писать программы как в ассемблере, так и на СИ.

Изначально всегда стоит вопрос: какой язык программирования выбрать, чтобы писать эффективные программы?

Отвечу просто: нужно уметь писать как минимум на двух языках ассемблере и СИ. Ассемблер просто необходим, когда нужно написать быстрые и компактные подпрограммы и макросы, различные драйверы устройств. Но, когда требуется создать объемный проект, построенный на сложных алгоритмах, без знания СИ может быть потрачено очень много времени, особенно в процессе отладки, а если возникнет желание перенести на другую платформу, например PIC18, или STM, может стать неразрешимой проблемой.
Кроме этого, сейчас появились аппаратные вычислительные платформы Arduino , работа с которыми требует знаний языка СИ++.
Поэтому будем писать программы как в ассемблере, так и на СИ.

Чтобы наглядно видеть результат своей работы, не используя паяльник или макетную плату достаточно установить программу Proteus .

3. Как прошивать контроллер, и какие дополнительные приборы и акссесуары нужны для удобной работы с ними?

Используем датагорский . Кроме этого, нужно будет приобрести макетные платы, блок питания с выходным напряжением 5 Вольт. Можно в качестве БП с малыми пульсациями использовать , применив стабилитрон на 5 Вольт.
Возможно, со временем мы с Игорем предложим проект для сборки отладочной платы.

4. Какую литературу изучать?

А вот, например:
Практическое программирование AVR на ассемблере. Ревич, 2011
1000 и одна микроконтроллерная схема Вып. 1-2. Рюмик, 2010-2011
10 практических устройств на МК AVR Книга 1-2. Кравченко, 2008-2009
Самоучитель разработчика устройств на МК AVR. Белов, 2008
МК AVR семейств Tiny и Atmega. Ефстифеев, 2008
CodeVisionAVR. Пособие для начинающих. Лебедев, 2008
Микропроцессорное управление устройствами, тиристоры, реле. Белов, 2008
Аналоговые интерфейсы МК. Стюард, Болл, 2007
Создаем устройства на МК AVR. Белов, 2007
МК AVR в радиолюбительской практике. Полный разбор ATTINY2313. Белов, 2007
Сетевой и межсетевой обмен данными с МК. Иди, 2007
МК AVR. практикум для начинающих. Хартов, 2007
Применение AVR Схемы, алгоритмы, программы. Баранов, 2006
Микроконтроллеры AVR. Вводный курс. Мортон, 2006
Измерение, управление и регулирование с помощью AVR. Трамперт, 2006
Программирование на языке С для AVR и PIC МК. Шпак, 2006
Конструирование устройств на МК. Белов, 2005
МK - это же просто, тома 1-3. Фрунзе, 2002-2003
Язык программирования Си, 2-е издание. Керниган, Ритчи, 2009
Программирование микроконтроллеров ATMEL на языке С. Прокопенко, 2012

5. Где в интернете можно задавать вопросы и получать конкретные ответы?

Задавать вопросы вы можете на нашем или любом другом форуме, где так или иначе затронуты темы по микроконтроллерам. Главное на форумах правильно формулировать вопросы, чтобы четко получать ответы. Абстрактные вопросы не приветствуются, и скорее всего вместо ответа вы получите жесткую критику, или ваш вопрос останется без внимания!

Теперь рассмотрим поближе нашего фаворита, микроконтроллер ATMEGA 8

8-разрядный высокопроизводительный AVR микроконтроллер с малым потреблением
Прогрессивная RISC архитектура
130 высокопроизводительных команд, большинство команд выполняется за один тактовый цикл
32 8-разрядных рабочих регистра общего назначения
Полностью статическая работа
Приближающаяся к 16 MIPS (при тактовой частоте 16 МГц) производительность
Встроенный 2-цикловый перемножитель

Энергонезависимая память программ и данных
8 Кбайт внутрисистемно программируемой Flash памяти (In-System Self-Programmable Flash)
Обеспечивает 1000 циклов стирания/записи
Дополнительный сектор загрузочных кодов с независимыми битами блокировки
Обеспечен режим одновременного чтения/записи (Read-While-Write)
512 байт EEPROM
Обеспечивает 100000 циклов стирания/записи
1 Кбайт встроенной SRAM
Программируемая блокировка, обеспечивающая защиту программных средств пользователя

Встроенная периферия
Два 8-разрядных таймера/счетчика с отдельным предварительным делителем, один с режимом сравнения
Один 16-разрядный таймер/счетчик с отдельным предварительным делителем и режимами захвата и сравнения
Счетчик реального времени с отдельным генератором
Три канала PWM
8-канальный аналого-цифровой преобразователь (в корпусах TQFP и MLF)
6 каналов с 10-разрядной точностью
6-канальный аналого-цифровой преобразователь (в корпусе PDIP)
4 канала с 10-разрядной точностью
2 канала с 8-разрядной точностью
Байт-ориентированный 2-проводный последовательный интерфейс
Программируемый последовательный USART
Последовательный интерфейс SPI (ведущий/ведомый)
Программируемый сторожевой таймер с отдельным встроенным генератором
Встроенный аналоговый компаратор

Специальные микроконтроллерные функции
Сброс по подаче питания и программируемый детектор кратковременного снижения напряжения питания
Встроенный калиброванный RC-генератор
Внутренние и внешние источники прерываний
Пять режимов пониженного потребления: Idle, Power-save, Power-down, Standby и снижения шумов ADC

Выводы I/O и корпуса
23 программируемые линии ввода/вывода
28-выводной корпус PDIP, 32-выводной корпус TQFP и 32-выводной корпус MLF

Рабочие напряжения
2,7 - 5,5 В (ATmega8L)
4,5 - 5,5 В (ATmega8)

Рабочая частота
0 - 8 МГц (ATmega8L)
0 - 16 МГц (ATmega8)

отличия ATMEGA16 от 8
16 Кбайт внутрисистемно программируемой Flash памяти (In-System Self-Programmable Flash)

Интерфейс JTAG (совместимый с IEEE 1149.1)
Возможность сканирования периферии, соответствующая стандарту JTAG
Расширенная поддержка встроенной отладки
Программирование через JTAG интерфейс: Flash, EEPROM памяти, перемычек и битов блокировки

Четыре канала PWM / ШИМ

8-канальный 10-разрядный аналого-цифровой преобразователь
8 несимметричных каналов
7 дифференциальных каналов (только в корпусе TQFP)
2 дифференциальных канала с программируемым усилением в 1, 10 или 200 крат (только в корпусе TQFP)

Шесть режимов пониженного потребления: Idle, Power-save, Power-down, Standby, Extended Standby и снижения шумов ADC

32 программируемые линии ввода/вывода

40-выводной корпус PDIP и 44-выводной корпус TQFP

AtmelStudio

Если Вы только начинаете, то нужно скачать и установить программу AtmelStudio с официальной страницы atmel.com
После установки программы AtmelStudio можно приступить к созданию проекта.
Проект – это ваша программа, которую вы будете писать, отлаживать и прошивать, после компиляции, в память микроконтроллера.

Чтобы создать проект, надо открыть программу, появиться такая заставка,

и откроется страница создания проекта

Чтобы создать новый проект, нужно кликнуть по «New Project…»
В этом случае откроется новое окно, где можно выбрать язык программирования, название проекта, его месторасположение, название пакета с файлами проекта и возможность создания каталога для дальнейшего использования в других перекрестных проектах. Чтобы создать проект, где мы будем программировать в ассемблере, нужно выбрать - Assembler , после этого поменяем название проекта, его расположение, и выбираем ОК.

Появится следующее окно

Выбираем “megaAVR, 8-bit” и находим нужный нам микроконтроллер, мы выбрали ATmega8. В правой части заставки появляется список устройств, работающих с этим микроконтроллером, один из которых мы можем подключить. Выбираем ОК.

Появляется страница редактора текста, которая позволяет редактировать и отлаживать программу. Пока страница чистая, указано время и дата создания и название файла проекта, имя пользователя. Есть дополнительные окно устройств ввода-вывода, окно отчетов компиляции программы. Теперь мы


можем программировать в ассемблере.
Аналогично создается проект для программирования на языке СИ.
  • Сергей Савенков

    какой то “куцый” обзор… как будто спешили куда то