Прошивка мк. Процесс прошивки мини-пк

  • Tutorial

Картинка для привлечения внимания - 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» на этот вывод.
Таким образом, нам необходимо сформировать три сигнала и (необязательно) прочитать один. Вот так выглядит простейшая схема для этого:


Рис. 1. Простейшая схема подключения по SPI.

Для своего же удобства можно добавить индикацию входных сигналов. Схема усложняется, но не чрезмерно:


Рис. 2. Схема с индикацией сигналов.

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

К сожалению, просто используя кнопки для формированя сигналов SPI, хорошего результата мы не добьёмся. Причина этого - в неприятном явлении, которое называется дребезг контактов . При замыкании механические контакты соударяются, отскакивают друг от друга, и вместо одного импульса получается несколько. Для подавления дребезга придется собрать простую схему из пары логических элементов:


Рис. 3. RS-триггер для подавления дребезга.

Это RS-триггер, который переключается в состояние «1» в момент замыкания нижнего контакта переключателя и игнорирует остальные импульсы дребезга. Сброс триггера обратно в «0» происходит при замыкании верхнего контакта, то есть при отпускании кнопки.

«Ишь, разбежался!» - скажет читатель, - «Я же на необитаемом острове сижу. Где я тут возьму триггеры?» Хорошо, можно избавиться от дребезга и без электронных схем. Нужно только заменить «сухой» контакт на мокрый жидкостный. Выключателем будут служить два электрода, опускаемые в проводящую жидкость.

Сигналы MOSI и RESET не требуют подавления дребезга, в отличие от SCK: здесь значение имеет только уровень сигнала в момент выборки, а не его фронты.

Как работает SPI



Рис. 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. Перевод МК в режим программирования.


Рис. 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
Ключ на старт, поехали!

Как прошить микроконтроллер AVR? Именно этим мы и займемся в этой статье.

Что такое “прошить” и “прошивка”?

Давайте первым делом определимся, что означает слово “прошить” ? Думаю, вы часто слышали такие словосочетания, как “прошить телефон”, “слетела прошивка”, “кривая прошивка” и тд. А что такое “прошивка” ?

Прошивка – это грубо говоря, операционная система для маленьких устройств, таких как мобильный телефон, MP3-плеер, цифровой фотоаппарат и тд. То есть это небольшая программка, которая управляет этим устройством. Также часто можно услышать и такое:” У меня “глючит” сотовый телефон, его надо срочно “перепрошить “.

В данном случае это означает, что надо заново установить операционную систему на мобильный телефон. Значит, “прошить МК” означает закачать во внутрь него программу, которая бы управляла этим МК, а МК уже управлял бы каким-нибудь устройством. То есть по идее, МК – это посредник между программой и каким-либо устройством, которым надо управлять;-)


Оборудование для прошивки МК

Итак, что нам потребуется, чтобы прошить МК?

  1. Cам микроконтроллер.
  2. Компьютер, с заранее установленным программным обеспечением (ПО).
  3. Программатор.
  4. Несколько джамперов.
  5. Макетная плата . Я бы порекомендовал сразу купить набор для начинающего AVRщика. Этот набор питается от USB.
  6. Прямые руки, растущие из нужного места.

Мы с вами договорились использовать МК Atiny2313 в корпусе DIP-20:

Подготовка МК к прошивке

В прошлых статьях мы с вами рассматривали программатор Громова . Главный его минус в том, что нам требуется COM-порт, который с трудом можно сейчас найти в компьютере, а разъем USB зато есть на каждом компьютере. Поэтому, было принято решение о покупке самого дешевого USB программатора для AVR МК. Называется такой программатор и выглядит он примерно вот так


Если хорошенько порыться на Али , то можно найти очень сладкую цену на такой программатор. Например, . Может быть найдете даже дешевле. Если будете брать у другого продавца, то внимательно смотрите, чтобы его надписи и радиоэлементы располагались именно так, как у меня на фото . В среднем его цена на момент написания статьи около 120 рублей. Такой программатор в корпусе обойдется чуток подороже.

Вот его вид сзади:


Его рабочий разъем выглядит примерно вот так:


С программатором также в придачу идет шлейф


который одним концом цепляется к рабочему разъему программатора:


Другой конец шлейфа мы будем цеплять к МК.


Если внимательно присмотреться, то можно узнать, какой вывод в разъеме является первым. Стрелка укажет на первый вывод разъема:


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


Итак, наша задача – соединить выводы МК с выводами программатора.

Для этого в разъем шлейфа втыкаем провода в гнезда MOSI, RST, SCK, MISO, VTG (VCC), GND. GND я взял 10 гнездо, можно и другое, где написано GND. Итого 6 проводков-джамперов:


VTG (он же VCC) цепляем к 20 ножке МК

SCK(UCSK) цепляем на 19 ножку МК

MISO цепляем к 18 ножке МК

MOSI на 17 ножку

GND на 10 ножку

RST на первую ножку

Должно получиться как-то вот так:


После первого включения программатора в разъем USB ПК, Диспетчер устройств нам выдаст новое устройство:

Не пугаемся, качаем вот архивчик, распаковываем его и указываем путь на него при установке “дров”. Когда “дровишки” на программатор установятся, то мы увидим что-то типа этого:

Все ОК, программатор готов к бою.

В этом же архиве находим папку “avrdudeprog”, открываем ее, находим там исполняемый файл AVRDUDEPROG и запускаем. Это и есть программная оболочка для прошивки МК с помощью нашего программатора.

Она выглядит вот так. Не забываем выбрать наш МК в списке.

Для того, чтобы прошить МК, нам надо выбрать файл с расширением HEX. Итак, вот мой файлик. Первым делом я нажимаю кнопочку “Стереть все” . А вдруг кто-то уже использовал МК и там залита уже какая-нибудь программа? Поэтому, перед прошивкой стираем память МК. Если “стирка” прошла удачно, то программка выдаст нам примерно такое сообщение:

Прошиваем МК AVR

Нажимаем на кнопку выбора файла:

А теперь выбираем наш файл “Lesson 1.hex” . Это и есть наша программа.

А теперь жмем кнопочку “Программирование”

После того, как все прошло удачно, высветится что-то типа этого:

Но это еще не все! Как вы помните, в прошлой статье мы выставили частоту 8 Мегагерц. Чтобы не было неразберихи, нам эту частоту теперь надо поделить на 8. Для этого существует фьюз, который делит тактовую частоту именно на 8. Ставим маркер на “прямые фьюзы”, потом ставим галочку на CKDIV.

После того, как сделали эти два шага, нажимаем на кнопку “Программирование”:

Проверяем МК в железе

Теперь собираем нашу схемку, о которой говорилось еще в прошлой статье:


и наслаждаемся результатом:

Итак, если программа установлена, приступим к изучению её возможностей.

Устанавливаем микроконтроллер в панель программации, подключаем программатор к компьютеру и запускаем "PICkit 2 Programmer".

При запуске программа производит опрос программатора и автоматически определяет тип программируемого микроконтроллера по идентификационным битам (так называемому device ID). Внимание! Микросхемы семейства Baseline, а также микросхемы EEPROM и KeeLOG не имеют device ID. Чтобы программа смогла работать с этими микросхемами, нужно выбрать конкретное изделие через меню "Device Family".

Если вместо такой дружелюбной картинки покажется вот такая...

То нужно проверить корректно ли подключен usb-кабель, и через меню "Tools" - "Check Communication" произвести переподключение устройства.

Открытие файла с прошивкой.

Чтобы записать программу МК в его память, необходимо выбрать в меню пункт "File" - "Import Hex".

Затем выбрать в открывшемся окне нужный файл прошивки.

После этого в окне памяти программ (Program Memory) и данных (EEPROM Data) отобразится содержимое.hex файла.

Запись программы в МК.

Теперь можно программировать МК. Для этого жмём кнопку "Write". Процесс записи занимает 3 - 5 секунд.

Об успешном выполнении процедуры записи уведомит надпись "Programming Successful".

Для большей уверенности можно провести процедуру проверки. При нажатии на кнопку "Verify" программа сравнивает данные hex-файла и данные, записанные в МК. Если верификация прошла успешно, то в окне сообщений появится надпись "Verification Successful".

Внимание! Если вы прошиваете микроконтроллеры PIC12F675, PIC12F629 и аналогичные с внутренним тактовым генератором, то при верификации может выскакивать ошибка. Дело в том, что PICkit2 Programmer (версии 6.21) сохраняет калибровочную константу, а затем записывает её в последнюю ячейку памяти МК. Понятно, что исходный файл прошивки и записанные данные в памяти будут отличаться. О калибровочной константе будет рассказано далее.

Быстрые кнопки.

Кнопка "Auto Import Hex + Write Device" понравиться тем, кто хочет "загонять прошивку" в МК нажатием одной кнопки. Один щелчок и программа предложит выбрать файл прошивки, а затем незамедлительно запишет её в МК.

Кнопка "Read Device + Export Hex File" выполняет обратную функцию - производит считывание данных с МК и предлагает сохранить файл прошивки в.hex файл.

Изменение битов конфигурации.

Биты конфигурации задают основные параметры работы МК. Это и тип генератора (кварц, RC-цепь), включение/отключение так называемого "сторожевого таймера", установка защиты от считывания памяти программ и некоторые другие. Как правило, при написании алгоритма работы МК (программы) прописываются значения, которые нужно записать в биты конфигурации. При "прошивке" программная оболочка берёт данные о конфигурации из самого файла прошивки и принудительно указывать эти данные не требуется.

Но, нам, как начинающим не будет лишним знать, как можно просмотреть или изменить конкретные биты конфигурации. Для этого щёлкаем по надписи "Configuration". Откроется окно редактирования битов конфигурации.

Если нужно поменять 0 на 1, то меняем - жмём "Save". Естественно, менять надо осознанно. Повторяю, при использовании готового файла прошивки менять ничего не надо, программа сделает всё автоматически.

Выбор модели микроконтроллера.

Микроконтроллеры бывают разные. Поэтому при программировании МК бывает необходимость указать конкретную модель микроконтроллера. При выборе пункта меню "Device Family" выпадает список семейств микроконтроллеров. Есть среди этого списка и микросхемы памяти EEPROM.

В отличие от микроконтроллеров, микросхемы памяти EEPROM не определяются автоматически по команде "Tools" - "Check Communication". Поэтому при считывании/записи микросхем EEPROM в программе необходимо указать маркировку микросхемы.

В меню выбираем пункт "Device Family" - "EEPROMS" - "24LC".

Калибровочная константа.

Как известно, для работы микроконтроллера требуется тактовый генератор. Элементом, который задаёт частоту работы этого генератора, может быть внешний кварцевый резонатор , RC - цепь. Но среди микроконтроллеров PIC есть такие, которые содержат необходимые задающие цепи внутри самой микросхемы. К таким МК относятся, например PIC12F629, PIC12F675.

На заводе в память таких микроконтроллеров записывается специальная константа, которая задаёт параметры встроенного генератора на 4 МГц. Эта калибровочная константа вида 34хх записывается в последнюю ячейку памяти программ по адресу 0x3FF.

При программировании микроконтроллера эту константу легко стереть . И хоть PICkit2 Programmer версии 2.61 автоматически сохраняет эту константу и затем записывает её при программации, не лишним будет записать значение константы OSCCAL.

При необходимости константу легко указать вручную. Для этого в меню выбираем пункт "Tools" - "OSCCAL" - "Set Manually".

В поле "OSCCAL value" указываем ранее записанное значение константы. Жмём кнопку "Set" (установить).

Теперь, когда вы знакомы с основными возможностями PICkit2 Programmer, можно смело начать сборку какого-нибудь устройства на микроконтроллере, например,

Микроконтроллеры для начинающих. Видеоурок. Записываем программу в микроконтроллер (прошиваем чип)

________________________________________________________________________________________________________

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


Содержание

Если видеозапись не идёт, установите flash-плеер и проверьте звуковую карту, либо скачайте материал (36 МБ). Если вместо видео - зелёный экран, переустановите flash-плеер (просто скачайте последнюю версию ). Если видео "дёргается", поставьте его на паузу и дайте немного подгрузиться. Плеер для просмотра flash-видео на домашней машине . Разверните видео на весь экран. Если напишут "Видео не найдено", "Video not found" - перезапустите видео ещё раз.

Редактор СodeVisionAVR - официальный сайт

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

2) После отдыха еще раз внимательно проверьте:
Питание - не ниже 4.5 вольт , желательно взять от USB того компьютера, к которому подключён программатор (для исключения возможных выравнивающих токов). Проверьте напряжение тестером;
Не слишком ли длинные провода от компьютера к программатору. На длинные провода наводятся помехи и увеличивается вероятность сбоя передачи данных;
Может кабель внутри оборван? Прозвоните тестером все жилы.
Не перепутали ли провода MOSI , MISO , SCK , RESET, GND , в нужное ли место воткнули?
Правильно ли настроили программатор в Setting >> Programmer ;
Project >> Configure >> C Compiler ;
Правильно ли указали тип кристалла в Tools >> Chip Programmer ;

Фьюзы не трогали? Если трогали, придётся ставить внешний кварц.
Почистили чип перед прошивкой? Tools >> Chip Programmer >> Program >> Erase Chip ;
Иногда помогает полная очистка чипа Tools >> Chip Programmer большая к
нопка Reset Chip (равносильна подаче импульса на вывод RESET);
Поставьте в самом низу окна Tools >> Chip Programmer три галочки Check Signature , Check Erasure , Verify ;
Либо наоборот - снимите эти галочки. Попробуйте и так, и так.
Если уж ничего не поможет, тогда закажите новый чип . Вытащенный откуда-то чип может оказаться и горелый, и настроенный на внешний генератор, и с выжженными пинами и тому подобное.
Да и в магазинах их иногда бракованные подсосывают, т.к. хранят чёрт знает где. Иногда бывает проще купить новый чип, чем думать, что произошло со старым (но не выбрасывайте, когда наберётесь опыта - восстановите).
Если найдёте старый компьютер - попробуйт
е сделать LPT-программатор (вдруг USB-программатор бракованный подсунули?). Проще LPT-программатора ничего нет; я его делал на десятке компьютеров - он всегда начинал работать сразу и никогда не было сбоев.
Не забывайте перед монтажом заземлять руки о батарею, о водопроводный кран или о массивную стальную конструкцию (забор, стеллаж для книг), или купите антистатический браслет или коврик (статическое электричество с рук может повредить хлюпкие микросхемы).
Наконец, самый извращенский способ - попробуйте взять другой компьютер . Бывает, что материнские платы глючат, порты на них выгорают, проводочки от контактов отходят и т п.

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