Как считать программу с микроконтроллера
Перейти к содержимому

Как считать программу с микроконтроллера

Работа с микроконтроллерами: прошивка программатором и чистый «Си»

В этой статье я расскажу о том, как программировать микроконтроллеры без использования Arduino. Мы будем использовать программатор AvrISP STK500 для программирования контроллера ATtiny84.

Нам понадобится

Подключаем питание

Arduino мы не используем, поэтому обо всем нам придется думать самостоятельно. И первое, с чем необходимо разобраться — питание. Мы будем использовать преобразователь L7805, обладающей следующими характеристиками:

Теперь нам надо узнать схему подключения этого преобразователя. Ее мы найдем на странице 3 даташита.

Помимо самого преобразователя, мы видим еще 2 конденсатора — входной Сi и выходной Сo. Входной конденсатор необходим для того, чтобы сгладить пульсации на входе в случае удаленности L7805 от источника. В нашем случае длина соединительных проводов не будет превышать 15 см, поэтому входного конденсатора у нас не будет. Зато будет выходной, поскольку мы хотим «кормить» наш контроллер стабильным питанием.

Распиновка

Необходимо знать назначение ножек преобразователя. Это описано на 2-й странице даташита.

Схема

С учетом всего вышеописанного, получается схема для организации питания.

Программатор

В качестве программатора мы использовали AvrISP STK500 от Seeed Studio. Для его работы под Windows и Mac OS необходимы драйверы. Их можно скачать с официального сайта. Пользователям Linux устанавливать ничего не нужно — программатор будет сразу готов к работе.

Подключение к контроллеру

Распиновка разъема программатора такова: avr_isp.jpg

Важно! Это распиновка разъема программатора, если смотреть на него сверху (отверстиями от себя). Не перепутайте!

Разъем программатора необходимо подключить к микроконтроллеру. Можно использовать как 10-пиновый разъём, так и 6-пиновый. Без разницы. Соединим проводами соответствующие пины, т.е:

10-пиновый ICSP ATtiny84
Reset 5 4
MOSI 1 7
MISO 9 8
SCK 7 9

Прошивка

Напишем код прошивки на чистом «C», которая заставит светодиод мигать. Использование ШИМ-сигналов и считывание аналоговых сигналов на чистом «C» не так тривиальна, и может являться темой отдельной статьи, поэтому остановимся пока на простейшем примере.

После скетчей Arduino, код малопонятен, правда? Ничего, сейчас я объясню, что да как. В первых двух строчках мы подключаем необходимые библиотеки, чтобы воспользоваться такими штуками, как DDRA , PORTA , _delay_ms .

Что же такое DDRA ? Это регистр микроконтроллера, управляющий направлением работы порта А. Он содержит в себе 8 бит. Если установить какой-то бит в 1, то пин с соответствующим номером станет выходом.

PORTA — тоже регистр, но он содержит в себе данные порта А. Если мы хотим на вывод номер 2 записать логическую единицу, то мы должны поместить 1 в соответсвующий бит регистра.

А _delay_ms — функция задержки. Исходя из этого можно составить таблицу соответствия:

Arduino C
Направление pinMode(led, OUTPUT); DDRA = 1 << 2;
Значение digitalWrite(led, HIGH); PORTA = 1 << 2;
Задержка delay(1000); _delay_ms(50);

Однако, самым важным различием кода является то, что в программе на С нет разделений функций setup и loop . За все это отвечает функция int main(void) . И она выполняется всего 1 раз! А мы хотим, чтобы наш светодиод моргал не один раз, а постоянно. Как раз для этого и используется бесконечный цикл while (1==1) .

Поэтому легко сделать вывод, что этот цикл и есть аналог функции loop() в Arduino. А то, что до него — аналог функции setup() .

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

Mac OS X

Первым делом необходимо скачать и установить CrossPack for AVR Development. Это даст нам все необходимые инструменты. CrossPack состоит из двух частей.

Первая нам нужна для написания кода и создания файла прошивки, а вторая — для заливки прошивки в контроллер.

Проект создается в три шага.

В результате будет создано следующее дерево файлов.

На данном этапе нас интересует содержимое файла Makefile . В нем содержится информация о том, что вообще мы используем: какой контроллер, программатор. Это все описывается в строках с 20 по 24:

Пройдемся по строкам:

Это автосгенерированный make-файл, поэтому нам необходимо вручную его подправить. Править будем строку DEVICE у нас же микроконтроллер attiny84 и строку FUSES . А вот с ней все сложнее. Fuse-биты, или просто «фьюзы» — два (иногда три) особых байта, в которых содержится фундаментальая конфигурация работы контроллера. Очень важно правильно их задать.

Внимание! Задание неверных fuse-битов может привезти к тому, что микроконтроллер перестанет работать и вернуть его к нормальной жизни может быть либо очень сложно либо невозможно! Воспользеумся сайтом AVR Fuse Calcuator.

Сначала из выпадающего списка выберем нужный нам контроллер (ATtiny84).

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

Видим, как поменялись сгенерированные значения.

Внесем изменения в Makefile.

Прошивка

Она происходит в 2 этапа.

Сначала необходимо перейти в папку firmware и выполнить команду make . Если ошибок нет, то результат выполнения команды будет таким:

Эта команда сделает из нашего исходника main.c файл, пригодный для заливки в контроллер — main.hex .

Второй этап — как раз заливка прошивки. Делается это с помощью команды make flash . Ее нормальный вывод выглядит следующим образом:

Все, прошивка контроллера завершена.

Windows

Здесь все проще.

Первым делом необходимо скачать и уствновить среду разработки для AVR — Atmel AVR Studio 4. А вторым — Atmel AVR Toolchain.

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

Затем указать имя, расположение и то, что мы хотим использовать С ( GCC ).

Третий шаг — настройка отладчика.

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

В результате общий вид среды разработки выглядит вот так:

Теперь необходимо подключиться к программатору. Делается это с помощью нажатия на кнопку con .

В качестве Platform выбираем STK500 , а в Port — Auto . Затем нажимаем Connect.

Если все правильно, то в открывшемся окне выбираем вкладку Main и нажимаем в ней на кнопку Read Signature .

Строка Reading signature from device .. 0x1E, 0x93, 0x0C .. OK! говорит о том, что все хорошо и сигнатура успешно прочиталась. Сигнатура — это своего рода позывной микроконтроллера, которым он сообщает собственную модель.

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

Теперь нажмем Build → Build . Это заставит программу скомпилироваться. Прошьем контроллер с помощью кнопки Write Flash Memory Using Current Settings — это заставит скомпилированную программу загрузиться в память микроконтроллера.

Заключение

Мы собрали простейшее устройство мигалку, но сделали это на низком уровне. С использованием программатора и «продвинутой» среды разработки, а не Arduino.

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

Как считать микропрограмму с контроллера?

Как считать микропрограмму с этого контролера: фото прилагается.

стоит бит защита, надо бы её как то обойти, есть у кого нибудь информация ? готов заплатить деньги

Изображения

Тип файла: jpg 6.jpg (114.3 Кб, 0 просмотров)

На фото плохо видна макрировка контроллера, видно что NEC. а дальше не понятно

Если это и можно сделать (я сам лично очень сомневаюсь), то за не малые деньги. Не так уж все просто.

Ну, вот, опять дилетантские псевдоэкономические рассуждения.

Да оборудования для читки защищённых МК никакого особо и не надо. Ну, программатор достаточно навороченый, и всё. А вот принцип защиты и последовательность действий — секрет фирмы (у каждой фирмы — свой). Где софт, где — последовательность кодов, где — ещё что. Вот за знание оного баблосы и берут. Не знаете принципов — нефиг глупости писать! Значит, вопрос не к вам, а к профи. Другое дело, что напрямую рассказать вам всё это на открытом форуме — не только глупо, но и наказуемо.

Ищите на забугорных хакерских сайтах. Найдёте — и мне, плз, ссылочку в личку, для общего развития.

Arduino без Arduino: работаем с микроконтроллерами напрямую

Если вспомнить историю создания Arduino ( www.drive2.ru/b/2520138/ ), то Arduino стало популярно благодаря трем вещам, составляющим ее основу: Среды программирования Arduino IDE ( на самом деле это среда языка Processing), Языка программирования Wiring (На самом деле такого языка не существует — то что мы видим это самый обычный С, дополненный большим числом библиотек) и Плат Arduino.
Я уже писал ранее, что без каждой из этих трех составляющих можно обойтись и приводил пример того, как можно обойтись без знания С — www.drive2.ru/b/2729013/. Как отказаться от Arduino IDE написано здесь — www.visualmicro.com/page/…what_is_visual_micro.html, а сегодня я хотел бы написать о том, как отказаться от "плат Arduino".
Итак, что же собой представляет плата, получившая такой коммерческий успех?

Как можно увидеть на плате находятся микроконтроллер AtMega 168 или 328, микросхема питания — DA1, контроллер виртуального com порта — DD1 и кварц 16 МГц — Q1. В общем то на первый взгляд ничего лишнего, но это только на первый: Используемая микросхема питания позволяет питать плату от напряжения от 5 до 12В или кратковременно до 30В, т.е. для авто с его 14,5В не пригодна и нужно делать свой источник питания. Контроллер СОМ порта используется в основном только для заливки программ и не является обязательным (в плате Arduino Pro Micro и ей подобных он отсутствует). Кварц, несомненно, позволяет точно работать с временем, но если погрешность в несколько милисикунд для вас не критична, то можно вспомнить о том, что микроконтроллеры фирмы Atmel, к которым относится и Atmega168/328, содержат внутренний кварц и могут отсчитывать такты сами себе.
Так что же эта плата лишняя? В общем то да. В большинстве случаев без нее действительно можно обойтись и сейчас мы поговорим как.

Поддержка средой программирования
Находим где у вас установлена Arduino и открываем папочку hardware
По умолчанию это здесь — C:\Program Files\Arduino\hardware\arduino\avr
В эту папку мы будем распаковывать архивы с библиотеками, которые будем качать отсюда:
1) Для микроконтроллеров
ATmega8, ATmega8A,
ATmega88, ATmega88A, ATmega88P, ATmega88PA, ATmega88PB
ATmega168, ATmega168A, ATmega168P, ATmega168PA, ATmega168PB
ATmega328, ATmega328P, ATmega328PB
ATmega48, ATmega48A, ATmega48P, ATmega48PA, ATmega48PB

качаем ATmega8 Series (8/48/88/168/328) отсюда — github.com/sleemanj/optib…ob/master/dists/README.md
См. отдельную статью О бедном AtMega замолвите слово
Данные библиотеки позволяют запустить МК на 3 частотах: 1MHz, 8MHz или 16MHz (Для работы требуется внешний кварц 16МГц).
Тут необходимо понимать, что внешний кварц увеличивает быстродействие и стабильность работы (1 миллисекунда выполнения программы всегда будет равняться 1 миллисекунде реального времени), но увеличивает, пусть и ненамного, стоимость конструкции и снижает надежность за счет большего числа деталей. Лично мое мнение, что для большинства конструкций, проектируемых для автомобиля, можно смело обойтись и встроенным кварцем. Для схем зажигания, тахометра можно использовать внешний кварц, подключенный по схеме ниже, но дешевле взять готовую платку типа Arduino Pro Micro.
Достаточно ценное замечание от alexfrance
Был печальный опыт при использовании внутреннего генератора МК тини2313. На морозе при -20 контроллеры зависали, глючили. Установка внешнего кварца помогла. Поскольку внутренний генератор представляет из себя RC цепь, то он очень термозависим

2) Микроконтроллеры Attiny13 (А)
Библиотеки и файлы для поддержки "Тинек" можно скачать по ссылочке выше, а можно взять версию от разработчика — sourceforge.net/projects/ard-core13/files/
Скачанный файл также кладем в папку hardware

3) Для микроконтроллеров
ATtiny84, ATtiny44, ATtiny24,
ATtiny85, ATtiny45, ATtiny25,
ATtiny2313, ATtiny4313

ссылка для скачивания -code.google.com/p/arduino-tiny/
После распаковки заходим в папку tiny и переименовываем файл C:\Program Files\Arduino\hardware\tiny\avr\Prospective Boards.txt в C:\Program Files\Arduino\hardware\tiny\avr\Boards.txt

После всех скачиваний и распаковок получим папку hardware с таким содержимым

А запустив Arduino IDE увидим:

Подключение микроконтроллера
Прошить программы в МК можно 2 различными способами:
1) Классический вариант — прошивка при помощи программатора
Тут все просто: покупаем любой программатор из списка поддерживаемых

и вперед
Наиболее распространенным является USBasp, он производится активно китайцами, его несложно сделать и самому. В Украине могу порекомендовать производителя с таким наборчиком (увы, снят уже с производства, ребята делают только плату адаптора) — fix.org.ua/index.php/%D0%…%D1%80%D0%BE%D0%BC-detail

Прошивать им просто: проставил драйвера, вставил МК в нужный слот, выбрал программатор из списка (СОМ выбирать не нужно), указал микроконтроллер и его частоту и лей программу.
Вторым по популярности является USBtinyISP. В продаже я их не видел, а как его сделать самостоятельно подробно рассказано здесь — robocraft.ru/blog/2948.html
Профессиональные программаторы типа STK500 (Эх была у меня такая плата на предыдущей работе, классная вещь) явно не входят в рамки этой статьи. Поэтому идем дальше.

2) Прошивка при помощи заводской платы Arduino
Следует отметить, что далеко не все платы Arduino подходят для сего действия
Возьмите свою плату и проверьте перед тем как пытаться. Расположение выводов интерфейса SPI должно быть следующим:

Если совпадает, то все ок, если нет, то лучше найти другую плату
Итак, последовательность действий:
а) Готовим плату. Для этого подключаем плату Arduino к компу, выбираем пункт меню Файл->Образцы-> ArduinoISP

и "вгружаем" код на плату. Все мы превратили нашу плату в программатор.
б) Подключаем. Схема подключения простая: нужно подключить выводы интерфейса SPI платы к соответствующим им выводам интерфейса SPI микроконтроллера, а вывод Reset микроконтроллера к 10 пину платы (или 53 для плат на основе mega1280 и 2560). На схеме ниже пример подключения Attiny13 (Attiny85 и Attiny45 аналогично, остальные МК смотрим распиновку) к плате на основе микроконтроллера Atmega 168/328

У меня получилось как то так:

Заливаем загрузчик. А нужно ли?
Итак сначало определимся что такое загрузчик и зачем это нужно.
Установка загрузчика дает возможность напрямую, через последовательный порт прошивать микроконтроллер (только имеющие аппаратный последовательный порт).Например так прошиваются пустые ATMEGA328P, которые потом можно использовать вместо установленной штатно микросхемы на Arduino UNO и устанавливать далее на самодельные платы.
Т.е. на ту же Attiny13 заливать загрузчик просто не имеет смысла — у нее нет аппаратного порта (выводов Тх, Dx), хотя некоторые "умельцы", пишущие обучающие статьи это делают (см UPD ниже). А вот для Atmega8 это можно сделать — она при этом потеряет 1кБайт из 8 своей памяти, но зато залить прошивку уже можно будет не через SPI, а подключив ее к адаптору СОМ порта (как это сделать рассказано здесь — www.drive2.ru/b/2642464/ на примере Arduino Pro Mini, смотрим раздел "Подключаемся").

UPD. Добавка написаная много познее</b>
С прошедшим временем понимаю, что на теме загрузчика стоит остановиться отдельно, заодно рассказать подробно, что такое фьюзы.
Но сейчас вкратце: В каждый микроконтроллер, помимо записи прошивки, необходимо записывать биты конфигурации — так называемые фьюзы и локбиты. С завода они идут записанные среднепотолочно и в реале скорее всего вам не подойдут — от этого и происходит неправильный расчет времени, например.
Но записью загрузчика можно обойти этот момент — как раз при записи загрузчика в микроконтроллере прописываются правильные фьюзы. Поэтому, даже если загрузчик не нужен, его можно прописать, чтобы прописались фьюзы, а потом при записи самой прошивки ("скетча") поставить галочку, что он не нужен и его можно удалить.

Если считаете, что вам это нужно, то устанавливаем микроконтроллер в программатор (подключаем к плате-программатору) и нажимаем "Записать загрузчик"

Прошивка программ
а) Пишем программу. Тут все как обычно, нужно только учесть, что для Attiny поддерживаются не все возможности "языка Arduino", а только
pinMode()
digitalWrite()
digitalRead()
analogRead()
analogReference(INTERNAL) / (EXTERNAL)
shiftOut()
pulseIn()
analogWrite()
millis()
micros()
delay()
delayMicroseconds()

б) Прошиваем.
Если мы используем плату Ардуино, то выбираем в качестве программатора "Arduino as ISP", в разделе "платы" наш микроконтроллер и частоту на которой он будет в дальнейшем работать, в разделе "порт" виртуальный СОМ нашей платы-программатора и нажимаем "вгрузить".
Вариант записи через программатор описан здесь — О бедном AtMega замолвите слово

в) проверяем работоспособность. Тут есть некоторые разногласия что делать с ногой RESET. Кто-то считает, что в процессе работы ее можно оставлять в воздухе, кто-то, что ее нужно подтянуть через резистор 10 кОм к питанию. Работает и так и так, тут больше вопрос религии 🙂

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *