Андрей Смирнов
Время чтения: ~14 мин.
Просмотров: 7

Прошивка AVR микроконтроллеров с «нуля»

  • Tutorial

f2d21d7b24beb91f997e89a576e64c1f.pngКартинка для привлечения внимания — xkcd Представьте себе, что вы попали на необитаемый остров. И вам жизненно необходимо запрограммировать микроконтроллер. Зачем, спросите вы? Ну, допустим, чтобы починить аварийный радиомаяк, без которого шансы на спасение резко падают. Радуясь, что еще не забыли курс ассемблера, вы кое-как написали программу палочкой на песке. Среди уцелевших вещей каким-то чудом оказалась распечатка документации на контроллер (хорошо, что вы еще не успели пустить её на растопку!), и программу удалось перевести в машинные коды. Осталась самая ерунда — прошить её в контроллер. Но в радиусе 500 километров нет ни одного программатора, не говоря уже о компьютерах. У вас только источник питания (батарея из картошки кокосов) и пара кусков провода. Как же прошить МК фактически голыми руками? В качестве подопытного будет выступать МК ATtiny13 фирмы Atmel. Описанная методика работает практически с любым контроллером семейства AVR, разве что коды команд могут незначительно отличаться. Самым распространенным и удобным интерфейсом для прошивки AVR является SPI (Serial Peripheral Interface). Для подключения по SPI нужно всего четыре провода, не считая земли:

  • SCK — тактовый сигнал, синхронизирует все операции обмена данными;
  • MOSI (Master Out Slave In) — линия данных от ведущего устройства к ведомому;
  • MISO (Master In Slave Out) — линия данных, наоборот, от ведомого устройства к ведущему;
  • RESET — для разрешения прошивки по SPI нужно подать логический «0» на этот вывод.

Таким образом, нам необходимо сформировать три сигнала и (необязательно) прочитать один. Вот так выглядит простейшая схема для этого:ec105b01158875c5ef0eb32ca909cf67.pngРис. 1. Простейшая схема подключения по SPI. Для своего же удобства можно добавить индикацию входных сигналов. Схема усложняется, но не чрезмерно:c03b408750978a60e85748d7570ba209.pngРис. 2. Схема с индикацией сигналов.

Защита от дребезга

К сожалению, просто используя кнопки для формированя сигналов SPI, хорошего результата мы не добьёмся. Причина этого — в неприятном явлении, которое называется дребезг контактов. При замыкании механические контакты соударяются, отскакивают друг от друга, и вместо одного импульса получается несколько. Для подавления дребезга придется собрать простую схему из пары логических элементов:Рис. 3. RS-триггер для подавления дребезга. Это RS-триггер, который переключается в состояние «1» в момент замыкания нижнего контакта переключателя и игнорирует остальные импульсы дребезга. Сброс триггера обратно в «0» происходит при замыкании верхнего контакта, то есть при отпускании кнопки. «Ишь, разбежался!» — скажет читатель, — «Я же на необитаемом острове сижу. Где я тут возьму триггеры?» Хорошо, можно избавиться от дребезга и без электронных схем. Нужно только заменить «сухой» контакт на мокрый жидкостный. Выключателем будут служить два электрода, опускаемые в проводящую жидкость. Сигналы MOSI и RESET не требуют подавления дребезга, в отличие от SCK: здесь значение имеет только уровень сигнала в момент выборки, а не его фронты.Рис. 4. Временная диаграмма работы SPI. SPI является синхронным интерфейсом: все операции синхронизированы фронтами тактового сигнала (SCK), который вырабатывается ведущим устройством. Максимальная скорость передачи ограничена величиной 1/4 тактовой частоты контроллера. На минимальную же скорость нет никаких ограничений: без тактового сигнала обмен данными «замораживается», и интерфейс может оставаться в статическом состоянии сколь угодно долго. Передача по SPI осуществляется в полнодуплексном режиме, по одному биту за такт в каждую сторону. По возрастающему фронту сигнала SCK ведомое устройство считывает очередной бит с линии MOSI, а по спадающему — выдает следующий бит на линию MISO. Все внимание на рисунок 4. Все общение программатора с МК состоит из отправки 32-битных команд и приема ответов контроллера. Полный перечень команд есть в datasheet’е, а здесь перечислим, какие операции необходимо выполнить для прошивки МК:

  1. Перевод контроллера в режим программирования;
  2. (опционально) Чтение идентификатора устройства;
  3. Стирание;
  4. Запись во flash;
  5. (опционально) Проверка записанного;

Рассмотрим каждый шаг подробно.

Включение режима программирования

Режим программирования включается подачей «0» на ногу RESET. Но есть некоторые тонкости. Atmel рекомендует сначала выставить на выводах RESET и SCK низкий уровень, а только потом подавать на контроллер питание. Если такой возможности нет, нужно после включения питания подать «0» на SCK, а затем положительный импульс на RESET:Рис. 5. Перевод МК в режим программирования. Но и это еще не все. Далее нужно передать команду на собственно включение режима программирования: 10101100 01010011 xxxxxxxx xxxxxxxxРис. 6. Команда «Program Enable». Биты, обозначенные как x, могут быть любыми. Во время передачи третьего байта контроллер должен переслать обратно второй байт (01010011). Если это произошло, значит, все хорошо, команда принята, контроллер ждет дальнейших инструкций. Если ответ отличается, нужно перезагрузить МК и попробовать все сначала.

Проверка идентификатора

Рис. 7. Команда «Read Signature Byte». Прежде чем что-либо писать в память МК, нужно убедиться, что перед нами именно та модель, которая нужна. Каждая модель контроллера имеет свой трехбайтный идентификатор (Signature). Прочитать его можно командами вида00110000 000xxxxx xxxxxxbb xxxxxxxx Вместо bb (третий байт команды) следует подставить 00 для первого байта идентификатора, 01 — для второго и 10 — для третьего. Соответствующий байт идентификатора будет передан контроллером при отправке 4-го байта команды. Для ATtiny13 значение идентификатора равно 00011110 10010000 00000111 (0x1E 90 07).

Очистка контроллера

Рис. 8. Команда «Chip Erase». Следующим шагом будет очистка памяти МК, которая осуществляется посылкой команды «Chip Erase»10101100 100xxxxx xxxxxxxx xxxxxxxx Этой командой выполняется стирание содержимого Flash и EEPROM (все ячейки будут содержать FF), а также снятие lock-битов, если они установлены.

Запись во flash-память

Память программ (Flash) в ATtiny13 состоит из 512 двухбайтных слов (1К байт). Адрес слова имеет разрядность 9 бит. Flash-память разделена на страницы, каждая страница имеет размер 16 слов (всего получается 32 страницы). Запись во flash осуществляется в два этапа. Сначала необходимо загрузить данные в буфер страницы, для этого используется команда «Load Program Memory Page»01000000 000xxxxx xxxxbbbb iiiiiiii — для загрузки младшего байта слова, и 01001000 000xxxxx xxxxbbbb iiiiiiii — для загрузки старшего. 4 младших бита 3-го байта команды bbbb — адрес слова на странице, iiiiiiii — загружаемый байт. Сначала всегда должен загружаться младший байт слова, а затем — старший байт того же слова.Рис. 9. Команда «Load Program Memory Page». После того, как буфер страницы загружен, нужно выполнить команду «Write Program Memory Page» 01001100 0000000a bbbbxxxx xxxxxxxx для записи страницы непосредственно в память контроллера. Младший бит второго байта и старшие 4 бита третьего a:bbbb — пятибитный номер страницы для записи.Рис. 10. Команда «Write Program Memory Page». Все это выглядит довольно запутанно, но ничего сложного нет. Адрес любого байта памяти программ состоит из 10 бит: ppppp:bbbb:w, где ppppp — номер страницы (используется в команде «Write Program Memory Page»);bbbb — адрес слова на странице (в команде «Load Program Memory Page»);w — бит, определяющий старший или младший байт в слове (зашифрован в первом байте команды «Load Program Memory Page»).

Чтение flash

Рис. 11. Команда «Read Program Memory». После записи прошивки в МК неплохо бы проверить записанное, так как никакой проверки целостности данных не выполнялось. Единственный способ проверки состоит в том, чтобы прочитать весь объем flash-памяти и сравнить с оригиналом. Читать память программ легче, чем писать в нее. Забудьте про страничную организацию, чтение выполняется побайтно. Команда «Read Program Memory» выглядит так:00100000 0000000a bbbbbbbb xxxxxxxx — для чтения младшего байта слова, и 00101000 0000000a bbbbbbbb xxxxxxxx — для старшего. Младший бит второго байта и весь третий байт a:bbbbbbbb — адрес слова в памяти. Прочитанный байт возвращается во время передачи 4-го байта команды.

Завершение программирования

Пожалуй, самая простая операция. Чтобы завершить программирование и перевести МК в рабочий режим, достаточно подать на RESET логический уровень «1». Контроллер запустится и будет работать по новой программе. Настало время воспользоваться полученными знаниями на практике. Жертва эксперимента — ATtiny13 — воткнут в макетную плату, рядом собран формирователь сигналов, всё готово:Рис. 12. Экспериментальная схема. Шить будем программу вида «проще некуда»:

ldi R24,  0x02 out DDRB, R24 out PORTB,R24 L1: rjmp  L1

Всё, что она делает — это выдает единицу на ногу PB1 и уходит в бесконечный цикл. В машинных кодах она занимает всего четыре слова:

E082 BB87 BB88 CFFF

Для прошивки её в контроллер необходимо набрать следующие команды:

1010 1100  0101 0011  0000 0000  0000 0000 // program enable  1010 1100  1000 0000  0000 0000  0000 0000 // chip erase  0100 0000  0000 0000  0000 0000  1000 0010 // load addr.0000  low byte 82 0100 1000  0000 0000  0000 0000  1110 0000 // load addr.0000 high byte E0  0100 0000  0000 0000  0000 0001  1000 0111 // load addr.0001  low byte 87 0100 1000  0000 0000  0000 0001  1011 1011 // load addr.0001 high byte BB  0100 0000  0000 0000  0000 0010  1000 1000 // load addr.0010  low byte 88 0100 1000  0000 0000  0000 0010  1011 1011 // load addr.0010 high byte BB  0100 0000  0000 0000  0000 0011  1111 1111 // load addr.0011  low byte FF 0100 1000  0000 0000  0000 0011  1100 1111 // load addr.0011 high byte CF  0100 1100  0000 0000  0000 0000  0000 0000 // write page

Ключ на старт, поехали! Всего 425 нажатий, и МК оживает. Теперь вас точно найдут и спасут с этого проклятого острова.

Прошиваем микроконтроллер AVR.

   Смотрите также:

     -Как написать код для AVR, программирование микроконтроллеров Atmel AVR на Си

     —Эмуляция AVR в Proteus, микроконтроллеры в Proteus

     —Простой ШИМ на ATTiny13.Регулируем всё

     —Работа с дисплеем HD44780 на AVR.Запись своих символов

Как и чем прошить avr микроконтроллер.

1)Прежде всего для прошивки микроконтроллеров Atmel AVR необходим программатор, например для прошивки через USB-порт такой  — USB ASP Программатор микроконтроллеров ATmega AVR

Купить можно здесь

— </p>

Купить usbasp программатор

2)Теперь нужно установить драйвера для вышеприведенного программатора

Для этого устанавливаем программу eXtreme Burner — AVR,  в процессе установки она автоматически установит правильные драйвера

Скачать можно здесь eXtremeBurnerAV_LampCORE_ru

3) Дальше требуется соединить микроконтроллер с программатором , быстрее и проще это сделать с Беспаечная макетная плата MB102и с проводами-радугой с типом наконечников Male to Male или если программатор без шлейфа с  наконечниками Female to Male

Соединять в соответствии с картинкой , приведенной ниже(Это для микроконтроллеров ATMEGA8, у других мк смотрите соответствующую им распиновку!):

Если беспаечной платы и проводов-радуги нет — то можно напрямую припаяться к выводам разъема программатора  и к ножкам микроконтроллера для прошивки.

Обратите внимание, что контакт 22 — GND находится напротив по другую сторону мс контакта 7 — VCC, исходя из этого не нужно отсчитывать ножки микросхемы, а просто соединить контакт напротив по другую сторону микросхемы соответственно.

Соединение без макетной платы и с помощью обычных проводов

Смотрим распиновку разъема программатора:

Паяем к микроконтроллеру в соответствии с распиновкой.

Удобнее паять таким паяльником — Паяльник GJ 907.

Или можно просто запихать в разъем шлейфа обычные провода, но при таком соединении возможен плохой контакт или его отсутствие.

Запускаем eXtreme Burner AVR , во вкладке Chip выбираем свой микроконтроллер(у нас ATmega8):

(Если при запуске у вас выдается сообщение — «не удается продолжить выполнение кода поскольку система не обнаружила libusb0.dll» то необходимо скачать  и установить эти драйвера

usbasp-win-driver-x86-x64-v3.0.7_LampCORE_ru

вручную, запустив файл InstallDriver.exe )

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

(Если выдается ошибка Power On Failed

 Cannot Communicate with Target Chip! значит , что какая или какие-либо ножки микроконтроллера не контактируют с программатором, логично проверить наличие контактов и исправить их отсутствие)

Flash — это прошивка

EEPROM — энергонезависимая память

Fuse Bits and Lock Bits — это настройка фьюзов, защиты, параметров микроконтроллера(например работать микроконтроллеру от внутренней частоты или от внешнего кварцевого резонатора, откуда брать опорное напряжение для АЦП и т.д.)

Если драйвера установлены, подсоединено всё правильно то имеем такой результат:

Мы считывали еще не прошитый микроконтроллер ATMEGA8, поэтому у нас будут считаны только нули(FFFF):

Попробуем прошить микроконтроллер

Прошивка микроконтроллера представляется в виде формата .HEX

Имеется прошивка HelloLED

Она мигает светодиодом на любом выводе D  микроконтроллера ATmega, так как в прошивке задана установка всех портов D как выход.

Запускаем eXtreme Burner

Нажимаем Open и в файлах выбираем прошивку в формате HEX

Дальше должно быть так:

Для запуска прошивки выбираем вкладку Write(Запись) и нажимаем Flash, должен пойти процесс прошивки

Прошивка успешно завершилась:

Теперь считаем её

Жмем Read — Flash, получаем:

Как видно нули заменились другими цифрами и видно оставшееся пустое мето в памяти для прошивки.

Теперь отсоединим микроконтроллер от программатора и проверим работу прошивки на практике.

Собираем все по такой схеме:

Собрали, всё должно работать(светодиод мигает 2 раза в секунду):

Если светодиод не горит или наоборот горит постоянно — проверьте надежность контактов.

Внимание! Не вешайте напрямую нагрузку на ножки микросхемы с потреблением больше 25 мА!

Не подавайте на микросхему больше 5.5 Вольт.

Цикл перезаписи прошивки не бесконечен — есть определенный ресурс.Не стоит микроконтроллер использовать  и перезаписывать как USB-флешку.

ОЦЕНИТЕ ДАННУЮ ПУБЛИКАЦИЮ:

Мы сожалеем, что эта публикация Вас не устроила.

<label> Напишите, пожалуйста, что Вам конкретно не понравилось, как можно улучшить статью?(оценка будет засчитана только при наличии отзыва) </label>

Спасибо за ваш отзыв!

Сохранить в:

Доброго времени суток. Продолжим. После того, как мы ознакомились с процессом отладки написанной нами программы в «atmel studio» и виртуально собрали схему с одним светодиодом в «proteus», пришло время собрать схему в «железе» и прошить микроконтроллер.

Для программирования опытного экземпляра (atmega 8) будем использовать программатор USBASP. Он выглядит следующим образом:

К разъему будет подключатся шлейф, в который подключаются джамперы, что в свою очередь будут подключены к гнездам макетной платы, на которой установлен микроконтроллер:

Первый вывод отмечен на разъеме стрелочкой.

После того, как разобрались с программатором. Переходим к сбору схемы в «железе». Монтируем микроконтроллер на макетную плату. Напоминаю — первая ножка отмечена на МК маленьким кружком.

Задача состоит в том, чтобы соединить выводы программатора с выводами «камня».

Подключаем джамперы в 10 контактный разъем. Задействуем следующие выводы MOSI, RST, SCK, MISO, VTG (VCC), GND.

Надеюсь вы уже скачали datasheet на atmega8. Если нет, его можно скачать здесь. Смотрим на распиновку выводов микроконтроллера.

Соединяем джамперы со следующими выводами:

  • VCC к 7 выводу МК;
  • SCK к 19 выводу МК;
  • MISO к 18 выводу МК;
  • MOSI к 17 выводу МК;
  • GND (10 вывод программатора) к 8 выводу МК;
  • RST к 1 выводу МК;

Для дальнейшем успешной работы, операционная система при первом запуске шайтан-машины (программатора) предложить установить необходимые для работы устройства драйвера.

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

Если вы работаете в windows 7 или выше, могут возникнуть небольшие трудности. Драйвера для программатора достаточно старые, поэтому у них нет цифровой подписи. При попытке установить такой драйвер операционка выдаст, что-то на подобии этого *

«Не удается проверить цифровую подпись драйверов, необходимых для данного устройства. При последнем изменении оборудования или программного обеспечения могла быть произведена установка неправильно подписанного или поврежденного файла либо вредоносной программы неизвестного происхождения. (Код 52)».

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

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

Надеюсь у вас всё получилось и программатор готов к работе.

Переходим к сбору схемы со светодиодом.

Для прошивки микроконтроллера будем использовать программу «avrdudeprog». Она лежит в общем архиве.

Выбираем atmega8 из списка микроконтроллеров. После того, как выбрали МК появиться окошко, которое известит о том, что фьюзы и Lock биты установлены по умолчанию.

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

Затем открываем вкладку фьюзы (Fuses). Простыми словами Fuses — это конфигурационные настройки МК, с которыми лучше не играть. Для случая, когда вы приобрели такой же контроллер, как я и у вас нет внешнего кварцевого резонатора (вы используете внутренний генератор тактовой частоты), выставляете точно такие галочки, как представлены на картинке. Обязательно возле пункта «инверсные» должна стоять галочка.

Выставленные настройки «командуют» Atmega8A выполнять свою работу при условии тактирования от внутреннего генератора (частота тактирования 8 МГц). Для того, чтобы настройки вступили в силу нужно нажать кнопку «Программирование». Но перед нажатием еще два раза проверьте все ли выставили должным образом.

Возвращаемся на страницу «Program».

После того, как мы уже сообщили программе, какой именно микроконтроллер будем шить, выбираем файл прошивку, которую написали в прошлом уроке. Она имеет расширение HEX. Находится в папке «Debug»

Перед тем, как прошивать «камушек» нажимаем на кнопку «Стереть все».  Это обезопасит вас от непонятных ошибок (вдруг камень уже шили):

Нажимаем «Программирование».  Если все прошло успешно программа выдаст

Архив с драйверами

Datasheet на atmega8

Картотека программирования

Наслаждаемся результатом своей работы 🙂 Продолжение следует…

>Купить в подарок или заказать уникальную вещь<

<blink>ПОДЕЛИТЕСЬ С ДРУЗЬЯМИ! </blink>

  • Как сделать «висячие сады» своими руками— 15.04.2020
  • Как сделать слайм без буры своими руками— 14.04.2020
  • Как сделать детский стенд для альпинизма своими руками— 13.04.2020
  • Балконный мини пруд своими руками— 07.04.2020
  • Самодельная сигнализация на холодильник своими руками— 03.04.2020
  • Велосипедная подставка своими руками— 01.04.2020
  • Садовый светильник своими руками— 30.03.2020
  • Мини сауна на приусадебном участке своими руками— 28.03.2020
  • Кукольный домик своими руками— 24.03.2020
  • Светильник «Инопланетное похищение» своими руками— 23.03.2020
  • Аварийный запас продуктов длительного хранения— 22.03.2020
  • Как сделать велосипедный прицеп без сварки своими руками— 22.03.2020
  • Водонепроницаемый розжиг для костра своими руками— 21.03.2020
  • Детская стиральная машина своими руками— 20.03.2020
  • Настольная игра «Вышибала» своими руками— 18.03.2020

Программирование …Как установить Bl…Люстра из стекла …Термогенератор св…Как сделать костю…Светодиодная люст…Используемые источники:

  • https://habr.com/post/152052/
  • https://lampcore.ru/справочник/как-прошить-микроконтроллер-atmega-avr/
  • http://mozgochiny.ru/electronics-2/programmirovanie-avr-urok-3-proshivaem-mikrokontroller/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации