topperm.ru – Браузеры. Антивирусы. Безопасность. Windows. Игры

Браузеры. Антивирусы. Безопасность. Windows. Игры

Изучаем ATTINY13, восстанавливаем новогоднюю елочку. Прошиваем AVR вручную Выбор языка программирования и среды разработки для программирования

Минимальный материальный набор для изучения программирования

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

Стартовый набор начинающего микроконтроллерщика

Для начала я бы разделил начинающих микроконтроллерщиков на три условные группы:
— радиолюбители, желающие собирать готовые решения на микроконтроллерах, но не имеющие желания изучать программирование
— желающие освоить программирование и собирать конструкции на микроконтроллерах, но выбравшие наиболее простой путь — Arduino
— желающие полностью разобраться в устройстве и программирование микроконтроллеров и собирать свои собственные конструкции

Для первой группы все очень просто:
— приобрести программатор и научиться с ним работать

Для второй группы остановлюсь немного подробнее.
Arduino ориентирована на начинающих, непрофессиональных пользователей, и состоит из двух частей — программной и аппаратной.
Программная часть состоит из бесплатной программной оболочки для написания программ, их компиляции и программирования устройства.
Язык программирования — стандартный С++ с некоторыми изменениями облегчающими работу с этим языком (хотя есть возможность создавать программы или подключать готовые файлы проектов используя стандартный язык С++). Научиться программировать в Arduino очень просто (поэтому программы на Arduino называются «наброски») — весь процесс программирования сводится в основном к выбору необходимых готовых библиотек для получения конкретного результата.
Аппаратная часть состоит из готовой платы с микроконтроллером с необходимой обвязкой для нормальной работы микроконтроллера и плат расширения (шилды). Кроме того выпускается множество готовых датчиков и исполнительных устройств. Весь процесс сборки конструкции на Arduino напоминает конструктор «Лего» — выбираете необходимые платы расширения и устройства и стыкуете их с основной платой. Для загрузки программы отдельный программатор не требуется.
Arduino вещь конечно хорошая, но предназначена в основном только для тех, кто хочет собирать конструкции на микроконтроллерах, но не хочет загружать свои мозги лишними (по их мнению) знаниями (это сугубо мое мнение).

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

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

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

А теперь к главному:
1. Для практических опытов нам потребуется микроконтроллер (а лучше три):
— наиболее популярные и востребованные микроконтроллеры — ATmega8A-PU и ATtiny2313A-PU, ATtiny13A- PU. Кстати, ATtiny13 очень популярный МК, и не зря его называют «малюткой» — малые возможности — но серьезные разработки.
2. Для записи программы в микроконтроллер необходим программатор:
— идеальное решение, на мой взгляд, — программатор USBASP, от которого мы к тому-же будем получать напряжение 5 Вольт для будущих конструкций.
3. Для визуальной оценки и выводов результатов работы программы необходимы средства отображения информации:
— светодиоды
— семисегментный светодиодный индикатор
— знакосинтезирующий (буквенно-цифровой) LCD дисплей
4. Для изучения процессов общения микроконтроллера с другими устройствами:
— цифровой датчик температуры DS18B20 и часы реального времени DS1307 (очень практичные устройства)
5. Кроме того нам потребуются транзисторы, резисторы, кварцевые резонаторы, конденсаторы, кнопки:
— биполярные транзисторы структуры NPN и PNP
— набор резисторов различного номинала
— кварцы (вот тут я выкинул лишнее) на 32,768 кГц, 8 МГц.
— керамические конденсаторы на 22 pF
— тактовые кнопки
6. Для сборки конструкций на микроконтроллере понадобится макетная плата для монтажа без пайки и набор перемычек к ней:
— макетная плата МВ102 (идеально иметь две такие платы — они стыкуются между собой, что очень пригодится в дальнейшем)
— соединительные перемычки к макетной плате трех типов — гибкие (мама-мама, папа-папа) и жесткие П-образной формы

Получается вот такой набор:

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

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

Выбор языка программирования и среды разработки для программирования

Честно говоря, выбор языка программирования и среды разработки вопрос очень ответственный, навязывать кому-то свои предпочтения и что-то советовать дело довольно-таки трудное.
Давайте попробуем подойти к этому выбору не предвзято, чисто с практической стороны.
1. Существует два основных языка программирования микроконтроллеров — Ассемблер (язык низкого уровня) и Си (язык высокого уровня).
Если мы хотим программировать микроконтроллеры используя полностью все их возможности (а мы это хотим), то необходимо изучать эти два языка.
2. Среда разработки для программирования микроконтроллеров.
Тут выбор большой и очень много мнений. Поэтому можно сказать: «Каждая лягушка хвалит свое болото». Мне, к примеру, очень нравится малораспространенная графическая среда разработки «Algorithm Builder», и «квакать» о ее преимуществах перед другими программами я могу очень долго. Но будем делать выбор, как было сказано выше, не предвзято и практично.
Микроконтроллеры AVR выпускает фирма Atmel, она же предоставляет в наше распоряжение бесплатную среду программирования «Atmel Studio» (бывшая AVR Studio). На ней мы и остановимся.
Интегральная среда разработки (IDE — Integrated development environment) Atmel Studio позволит нам:
— писать программы как на Ассемблере, так и на Си (Почему на Си. Программа «Atmel Studio» позволяет писать программы на трех языках (О чем мы и погорим в первой статье), но есть одно но: программы на Си++ мы рассматривать не будем, по одной причине, и в следующей статье я расскажу об этом
— отладить программу
— перевести программу в машинный код (откомпилировать)
— записать программу в микроконтроллер

Все, выбор мы сделали:


Теперь осталось выполнить два пункта:
1. Обзавестись каким-нибудь стартовым набором (для начала хватит и микроконтроллера ATmega8, нескольких светодиодов, пары кнопок и сопротивлений к ним).
2. Установить (именно установить, а не скачать, и с регистрацией) с официального сайта Atmel (http://www.atmel.com/ru/) программу Atmel Studio.
Программировать микроконтроллеры мы будем с использованием программатора USBASP.
Отдельной статьи по Atmel Studio я писать не буду, будем изучать ее постепенно, по мере надобности и в связке со статьями по устройству и программированию микроконтроллеров.

  • Память для программ (FLASH) — 1Кб
  • ОЗУ — 64 Байт
  • Число входов/выходов — 6
  • Выходов ШИМ — 2
  • Аналоговых входов (АЦП 10бит) — 4
  • Таймер 8 бит — 1
  • Напряжение питания 1.8 — 5.5В
  • Рабочая частота — до 20МГц
  • Потребление в активном режиме 1.8В/ 1МГц — 190мкА
  • Потребление в режиме сна 1.8В/1МГц — 24мкА

Программирование ATtiny13

Для программирования я настроил среду Arduino IDE. Как известно, эта среда разработки может поддерживать дополнительные контроллеры. Например, в этой статье , я рассказывал, как программировать в Arduino IDE «народный WiFi» ESP8266. На сайте arduino.cc есть ветка, посещенная программированию ATTiny13 в среде Ардуино . У меня установлена версия 1.6.5. Скачиваю архив ATTiny core for Arduino . Распаковываю в папку c:\Program Files (x86)\Arduino\hardware\ и в Arduino IDE появляются дополнительные платы

Теперь загрузка программ. Объем памяти микропроцессора всего 1Кб и никакой загрузчик туда не поместится. Поэтому загрузка скетчей производится программатором по ISP. USBAsp, которым я программировал Atmega328 работать с тинькой не захотел. Нужна специальная прошивка программатора, с которой я возиться не захотел. Программировать микроконтроллер можно при помощи любой Ардуины . Для этого собираю такую схему:

В Arduino IDE выбираю «Файл->Образцы->ArduinoISP» и загружаю в Ардуино скетч программатора. Затем выбираю «Инструменты->Программатор->Arduino as ISP». Теперь можно загружать скетчи в тиньку. Следует отметить, что ATTiny13 core for Arduino содержит ограниченный набор функций Ардуино.

На работе у меня есть настольная елочка со световодами

В елочке стояла галогенная лампочка на 12В и моторчик, который крутит цветной круг-цветофильтр, который меняет цвет световодов. За 3 года умерли и лампочка и моторчик.

Вот я и решил восстановить эту елочку кусочком RGB-ленты управляемой ATtiny13. Съема управления лентой получилась такая:

три транзистора и резистора, линейный регулятор напряжения и собственно тинька.

Скетч представляет собой программный трехканальный ШИМ с изменением яркости по разным каналам, в результате которого лента переливается разными цветами

После этого остается только закрепить плату и ленту в корпусе елочки

Белый скотч наклеен для улучшения отражения света внутри корпуса.

Вот и пришло время для первой прошивки. Данная прошивка является тестовой. Она не производит ни каких полезных действий, кроме дрыганья ножками по определенному алгоритму. Этой прошивкой можно проверить работоспособность всего микроконтроллера и портов ввода-вывода в частности.
Чтобы проверить микроконтроллер необходимо загрузить прошивку и посмотреть, что происходит на ножках. «Смотреть» можно или мультиметром, или простым пробником – светодиод последовательно с резистором 300 Ом – 1 кОм. Без резистора проверять не стоит – можно спалить порт ввода-вывода. Уровни сигналов на ножках меняются с «1» через «Z»-состояние в «0» и обратно. «Z» состояние введено в последовательность для контроля работоспособности порта в режиме входа.

Тестовая прошивка для микроконтроллера ATMega48/88/168.
Алгоритм работы прошивки ATMega48/88/168 показан на картинке (микроконтроллер установлен на описанной ранее).

Микроконтроллер работает от внутреннего генератора, поэтому нет необходимости во внешнем кварце. Ножки 9 и 10 (подключение внешнего кварца) не задействованы, на случай если там окажется внешний кварц. Также не задействованы ножки 1 (сброс) и 21(опорное напряжение для АЦП). Проверить работоспособность можно двумя способами (смотри рисунок) — смотреть изменение уровня сигналов относительно земли (GND) или относительно ножки питания (VCC).
- Тестовая прошивка для ATMega48/88/168

Как прошить микроконтроллер >


Тестовая прошивка для микроконтроллера ATTiny2313.
Алгоритм работы прошивки ATTiny2313 показан на картинке (микроконтроллер установлен на описанной ранее).

Микроконтроллер работает от внутреннего генератора, поэтому нет необходимости во внешнем. Ножки 4 и 5 (подключение внешнего кварца) не задействованы на случай если там окажется внешний кварц. Также не задействована ножка 1 (сброс). Проверить работоспособность можно двумя способами — смотреть изменение уровня сигналов относительно земли (GND) и относительно ножки питания (VCC).
- Тестовая прошивка для ATTiny2313

Как прошить микроконтроллер >


Тестовая прошивка для микроконтроллера ATTiny13.
Алгоритм работы прошивки ATTiny13 показан на картинке (микроконтроллер установлен на описанной ранее).

Микроконтроллер работает от внутреннего генератора (внешний большая роскошь для этого микроконтроллера, поэтому даже не рассматриваем). Естественно, не задействована ножка 1 (сброс). Проверяем работоспособность так же, как и у предыдущих микроконтроллеров.
- Еустовая прошивка для ATTiny13

Как прошить микроконтроллер >


Проверка работоспособности «Z»-состояния портов ввода-вывода.


«Z»-состояние это состояние когда ножка сконфигурирована на вход и на ней нет ни какого уровня (она как-бы болтается в воздухе ни к чему не подключена). Для того чтобы проконтролировать наличие такого состояния можно воспользоваться резисторным делителем. При уровне «1» на делителе будет напряжение питания +5v, при уровне «0» — земля 0v, а при «Z»-состоянии порт ввода-вывода перестанет вмешиваться в работу делителя и он поделит напряжение питания и мы получим +2.5v.

ФАЙЛЫ:
- Исходники тестовых прошивок

(Visited 18 359 times, 4 visits today)

  • Программирование микроконтроллеров
    • 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
    Ключ на старт, поехали!


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