Прошиваємо AVR вручну. Основи програмування мікроконтролерів AVR Музична скринька - простий виріб для початківців

Ось і настав час для першої прошивки. Ця прошивка є тестовою. Вона не робить жодних корисних дій, крім дрожання ніжками за певним алгоритмом. Цією прошивкою можна перевірити працездатність всього мікроконтролера та портів введення-виводу зокрема.
Щоб перевірити мікроконтролер необхідно завантажити прошивку та подивитися, що відбувається на ніжках. "Дивитись" можна або мультиметром, або простим пробником - світлодіод послідовно з резистором 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)

  • Пам'ять для програм (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. Знімання керування стрічкою вийшло таке:

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

Скетч є програмним триканальним ШИМ із зміною яскравості по різних каналах, в результаті якого стрічка переливається різними кольорами.

Після цього залишається лише закріпити плату та стрічку в корпусі ялинки

Білий скотч наклеєний для покращення відбиття світла всередині корпусу.

Грудень 2015 р.

1. Переваги запропонованого способу

Схеми пристроїв на мікроконтролерах (МК) зазвичай відрізняються поєднанням двох важкосумісних якостей: максимальною простотою та високою функціональністю. До того ж функціональність може надалі змінюватись і розширюватися без внесення будь-яких змін до схеми – шляхом лише заміни програми (перепрошивкою). Ці особливості пояснюються тим, що творці сучасних МК постаралися розмістити на одному кристалі все, що може знадобитися розробнику електронного пристрою - принаймні настільки, наскільки це можливо. В результаті відбулося зміщення акценту зі схемотехнічного та монтажного на програмний. З використанням МК тепер менше доводиться "навантажувати" схему деталями, між компонентами стає менше сполук. Це, звичайно, робить схему більш привабливою для її повторення як досвідченими, так і електронниками-початківцями. Але, як завжди, за все доводиться платити. Тут також не обійшлося без своїх складнощів. Якщо купити новий МК, встановити його в правильно зібрану зі справних деталей схему та подати живлення, то нічого не вийде – пристрій не працюватиме. Мікроконтролеру потрібна програма.

Здавалося б із цим теж все просто – в інтернеті можна зустріти безліч схем з безкоштовними прошивками. Але тут з'являється одна проблема: прошивку потрібно якось "залити" в мікроконтролер. Для того, хто ніколи цим раніше не займався, таке завдання часто стає проблемою і головним фактором, що відштовхує, нерідко змушує відмовитися від принад використання МК і пошукати схеми на "розсипуху" і жорсткій логіці. Адже все не так вже й складно, як може здатися на перший погляд.

Проаналізувавши публікації в інтернеті, можна помітити, що ця проблема вирішується найчастіше одним із двох шляхів: покупкою готового програматора або виготовленням саморобного. При цьому схеми саморобних програматорів, що публікуються, дуже часто невиправдано складні - набагато складніше, ніж це дійсно необхідно. Звичайно, якщо передбачається щодня прошивати МК, краще мати "крутий" програматор. Але якщо потреба в такій процедурі виникає нечасто, час від часу, то можна взагалі обійтися без програматора. Ні, звичайно, не йдеться про те, щоб навчитися робити це силою думки. Мається на увазі, що розуміючи, як відбувається взаємодія програматора з мікроконтролером при записі та зчитуванні інформації в режимі його програмування, ми можемо обійтися підручними засобами ширшого призначення. Ці кошти мають замінити як програмну, і апаратну частини програматора. Апаратна частина повинна забезпечити фізичне з'єднання з мікросхемою МК, можливість подавати логічні рівні на його входи та зчитувати дані з його виходів. Програмна частина має забезпечити роботу алгоритму, керуючого усіма необхідними процесами. Зазначимо також, що якість запису інформації в МК не залежить від того, наскільки "крутий" у вас є програматор. Такого поняття, як "краще записалося" чи "гірше" не існує. Є лише два варіанти: "записалося" та "не записалося". Це тим, що безпосередньо процесом запису всередині кристала керує сам МК. Потрібно лише забезпечити йому якісне харчування (відсутність перешкод та пульсацій) та правильно організувати інтерфейс. Якщо за результатами контрольного зчитування помилок не виявлено, то все в порядку можна використовувати контролер за призначенням.

Для того, щоб, не маючи програматора, записати в МК програму, нам знадобиться перетворювач порту USB-RS232TTL і , а також . Конвертер USB-RS232TTL дозволяє за допомогою порту USB створити COM-порт, який відрізняється від "справжнього" лише тим, що на його входах та виходах використовуються логічні рівні TTL, тобто напруга в інтервалі від 0 до 5 вольт (докладніше можна почитати у статті " "). Такий конвертер у будь-якому випадку корисно мати в "господарстві", тому якщо у вас його ще немає, неодмінно варто придбати. Що стосується логічних рівнів, то в нашому випадку TTL - це навіть перевага перед звичайним COM-портом, тому що входи та виходи такого порту можна безпосередньо підключати до будь-якого мікроконтролера, що живиться від напруги 5 В, у тому числі ATtiny та ATmega. Але не намагайтеся використовувати стандартний COM-порт - там використовуються напруги в інтервалі від -12 до +12 В (або -15 ... +15В). Безпосереднє з'єднання з мікроконтролером у цьому випадку неприпустимо!

Ідея створення скрипта для програми "Перпетуум М", що реалізує функції програматора, виникла після ознайомлення з рядом публікацій в інтернеті, які пропонують ті чи інші рішення щодо прошивки МК. У кожному випадку виявлялися серйозні недоліки чи надмірні складності. Часто траплялися схеми програматорів, що містять у собі мікроконтролер і при цьому цілком серйозно давалися поради на кшталт: "... а щоб запрограмувати мікроконтролер для цього програматора нам знадобиться... правильно - інший програматор!". Далі пропонувалося сходити до друга, пошукати платну послугу тощо. Якість програмного забезпечення, що розповсюджується в мережі для цих цілей, також не вразило - помічено безліч проблем як з функціональністю, так і з "каламутністю" інтерфейсу користувача. Найчастіше потрібно витратити, щоб зрозуміти, як використовувати програму - її необхідно вивчати навіть задля здійснення найпростіших дій. Інша програма може довго і старанно щось робити, але про те, що нічого в МК не записується, користувач дізнається тільки після завершення всієї прошивки та наступного контрольного зчитування. Зустрічається і така проблема: користувач намагається вибрати зі списку кристалів, що підтримуються, свій МК, а його в списку немає. У цьому випадку скористатися програмою не вдасться - внесення до списку відсутніх МК, як правило, не передбачено. Крім того, ручний вибір контролера зі списку виглядає дивно, якщо врахувати, що програматор у багатьох випадках може сам визначити тип МК. Все це сказано не для того, щоб облити брудом існуючі продукти, а для того, щоб пояснити причину появи скрипту до програми "Перпетуум М", що описується у цій статті. Проблема дійсно існує, і вона стосується насамперед новачків, яким не завжди вдається подолати цю "стіну", щоб зробити свій перший крок у світ мікроконтролерів. У запропонованому скрипті враховано недоліки, виявлені інших програмах. Реалізовано максимальну "прозорість" роботи алгоритму, гранично простий інтерфейс користувача, що не вимагає вивчення і не залишає шансу заплутатися і "не туди натиснути". За відсутності потрібного МК серед підтримуваних можна самостійно додати його опис, взявши потрібні дані з документації, завантаженої з сайту розробника МК. І, найголовніше – скрипт відкритий для вивчення та модифікації. Кожен бажаючий може, відкривши в текстовому редакторі, вивчати і правити його на власний розсуд, змінюючи на свій смак існуючі функції та додаючи недостатні.

Першу версію скрипту було створено у червні 2015 року. У цій версії реалізована тільки підтримка Atmel'івських МК серій ATtiny та ATmega з функціями запису/читання флеш-пам'яті, з налаштуванням конфігураційних біт, з автоматичним визначенням типу контролера. Запис та читання EEPROM не реалізовані. Були плани доповнити функціональність скрипту читання EEPROM, реалізувати підтримку PIC-контролерів і т. д. З цієї причини скрипт досі не був опублікований, але через брак часу здійснення задуманого затяглося, і щоб краще не ставало ворогом хорошого, вирішено опублікувати наявну версію. реалізованих функцій виявиться недостатньо, прошу не засмучуватися.У цьому випадку ви можете спробувати самостійно додати потрібну функцію.Не стану приховувати: ідея створення даного скрипту спочатку несе в собі ще й освітній зміст. зможете глибше зрозуміти роботу МК в режимі програмування, щоб у майбутньому не опинитися в становищі дівчини перед сло автомоблем, що задумувався, задумливо розглядає його нутрощі і не розуміє, чому "не їде".

2. Інтерфейс МК як програмування

Існує декілька різних способівперевести контролер у режим програмування та працювати з ним у цьому режимі. Найпростішим у реалізації для контролерів серій ATtiny та ATmega є, мабуть, SPI. Ним і скористаємося.

Але, як розпочати розгляду сигналів, необхідні формування SPI, зробимо ряд застережень. Мікроконтролер має конфігураційні біти. Це щось на кшталт тумблерів, перемикання яких дозволяє змінювати деякі властивості мікросхеми відповідно до потреб проекту. Фізично це осередки енергонезалежної пам'яті, на зразок тих, у які записується програма. Різниця в тому, що їх дуже мало (до трьох байт для ATmega), і вони не входять до адресного простору будь-якої пам'яті. Запис та читання конфігураційних даних виконується окремими командами режиму програмування МК. Зараз важливо відзначити, що деякі конфігураційні біти впливають на можливість використання SPI. За певних значень може виявитися, що SPI не можна використовувати. Якщо вам трапиться такий мікроконтролер, то метод, який пропонується в даній статті, не допоможе. У цьому випадку доведеться або змінити налаштування конфігураційних біт програматорі, який підтримує інший режим програмування, або використовувати інший мікроконтролер. Але ця проблема стосується лише тих, хто був у вживанні МК, або тих, з якими вже хтось невдало "погрався". Справа в тому, що нові МК поставляються з налаштуваннями конфігураційних біт, що не перешкоджають використанню SPI. Це підтверджується і результатами випробувань скрипта-програматора для програми "Перпетуум М", під час яких були успішно прошиті чотири різні МК (ATmega8, ATmega128, ATtiny13, ATtiny44). Усі вони були нові. Початкова настройка конфігураційних біт відповідала документації та не заважала використанню SPI.

Зважаючи на сказане вище, слід звертати увагу на такі біти. Біт SPIEN у явному вигляді дозволяє або забороняє використання SPI, отже, у нашому випадку його значення має бути вирішальним. Біт RSTDISBL здатний перетворити один із висновків мікросхеми (заздалегідь зумовлений) у вхід сигналу "скидання", або не перетворити (залежно від записаного в цей біт значення). У нашому випадку вхід "скидання" необхідний (за його відсутності не вдасться перевести МК в режим програмування через SPI). Існують ще біти групи CKSEL, що задають джерело тактового сигналу. Вони не перешкоджають використанню SPI, але їх теж необхідно мати на увазі, тому що при повній відсутності тактових імпульсів, або при їх частоті нижче за допустиму для заданої швидкості SPI, також нічого хорошого не вийде. Зазвичай у нових МК, мають внутрішній RC-генератор, біти групи CKSEL налаштовані його використання. Нас це цілком влаштовує - тактування забезпечене без додаткових зусиль з нашого боку. Ні кварцовий резонатор припаювати, ні зовнішній генератор не потрібно підключати. Якщо ж зазначені біти містять інше налаштування, доведеться подбати про тактування відповідно до налаштування. У цьому випадку може знадобитися підключення до МК кварцового резонатора або тактового зовнішнього генератора. Але в рамках цієї статті ми не розглядатимемо, як це робиться. Приклади підключення МК для програмування, що містяться в цій статті, розраховані на найпростіший випадок.

Мал. 1. Обмін даними по SPI у режимі програмування

Тепер звернемося до малюнка 1, взятому з документації МК ATmega128A. На ньому показаний процес передачі одного байта МК і одночасного прийому одного байта з МК. Обидва ці процесу, як бачимо, використовують одні й самі тактові імпульси, які від програматора в мікроконтролер з його вхід SCK - одне із висновків мікросхеми, котрій у режимі програмування по SPI відведена така роль. Ще дві сигнальні лінії забезпечують прийом та передачу даних по одному біту за такт. Через вхід MOSI дані надходять у мікроконтролер, а з виходу MISO знімаються дані, що зчитуються. Зверніть увагу на дві пунктирні лінії, проведені від SCK до MISO та MOSI. Вони показують, коли мікроконтролер "ковтає" виставлений на вході MOSI біт даних, і коли сам виставляє на вихід MISO свій біт даних. Все досить просто. Але щоб ввести МК в режим програмування, нам ще знадобиться сигнал RESET. Не забудемо також про загальний провід GND та живлення VCC. Загалом виходить, що до мікроконтролера для його прошивки SPI потрібно підключити всього 6 проводків. Нижче розберемо це докладніше, а поки додамо, що обмін даними з МК в режимі програмування SPI виконується пакетами по 4 байти. Перший байт кожного пакета переважно повністю відводиться під кодування команди. Другий байт залежно від першого може бути продовженням коду команди або частиною адреси, а може мати довільне значення. Третій байт використовується переважно передачі адрес, але у багатьох командах може мати довільне значення. Четвертий байт зазвичай передає дані або має довільне значення. Поруч із передачею четвертого байта у деяких командах приймаються дані, які з МК. Подробиці кожної команди можна знайти в документації на контролер у таблиці під назвою "SPI Serial Programming Instruction Set". Поки зазначимо лише, весь обмін з контролером побудований з послідовності 32-бітних пакетів, у кожному з яких передається трохи більше одного байта корисної інформації. Це не дуже оптимально, але загалом працює непогано.

3. Підключення МК для програмування

Щоб забезпечити подачу на входи мікроконтролера всіх необхідних сигналів для організації інтерфейсу SPI та читання даних з виходу MISO, не обов'язково створювати програматор. Це легко здійснити за допомогою звичайного конвертера USB-RS232TTL.

В інтернеті часто можна зустріти інформацію про те, що такі конвертери є неповноцінними, що з ними нічого серйозного зробити не можна. Але щодо більшості моделей конвертерів така думка є помилковою. Так, існують у продажу конвертери, у яких доступні не всі входи та виходи в порівнянні зі стандартним COM-портом (наприклад, тільки TXD і RXD), що мають при цьому нерозбірну конструкцію (мікросхема залита пластмасою - неможливо дістатися її висновків). Але такі й купувати не варто. У деяких випадках отримати відсутні входи та виходи порту можна, підпаявши проводки безпосередньо до мікросхеми. Приклад такого "удосконаленого" конвертера показано на малюнку 2 (мікросхема PL-2303 - докладніше про призначення її висновків у статті ""). Це одна з найдешевших моделей, але має свої переваги при використанні в саморобних конструкціях. Широко поширені і повнофункціональні шнури-перехідники зі стандартним дев'ятиконтактним роз'ємом на кінці, як у COM-порту. Від звичайного COM-порту вони відрізняються лише рівнями TTL та несумісністю із застарілим програмним забезпеченням та деяким старим обладнанням. Можна ще відзначити, що шнури на мікросхемі CH34x на різних екстремальних тестах показують себе набагато надійнішими та стабільнішими порівняно з перетворювачами на PL-2303. Втім, при звичайному використанні різниця не помітна.

При виборі конвертера USB-RS232TTL слід також звертати увагу на сумісність його драйвера з версією операційної системи, що використовується.

Розглянемо докладніше принцип з'єднання мікроконтролера та конвертера USB-RS232TTL на прикладі чотирьох різних моделей МК: ATtiny13, ATtiny44, ATmega8 та ATmega128. На малюнку 3 показано загальну схему такого з'єднання. Вас може здивувати, що сигнали RS232 (RTS, TXD, DTR та CTS) використовуються не за призначенням. Але не варто турбуватися про це: програма "Перпетуум М" здатна працювати з ними безпосередньо - встановлювати значення на виходах і читати стани входу. У всякому разі, широко поширені конвертери USB-RS232TTL на мікросхемах CH34x і PL-2303 таку можливість забезпечують - це перевірено. З іншими популярними конвертерами проблем не повинно бути, оскільки для доступу до порту використовуються стандартні функції Windows.

Резистори, показані на загальній схемі, в принципі можна не встановлювати, але краще встановити. Яке їхнє призначення? Використовуючи ТТЛ"івські входи і виходи конвертера і п'ятивольтне харчування мікроконтролера, ми тим самим позбавляємось необхідності узгодження логічних рівнів - все і так цілком коректно. Значить, з'єднання можуть бути безпосередніми. Але під час експериментів буває всяке. Саме в те місце, куди вона ніяк не могла б впасти, і замкнути те, що в жодному разі не можна замикати.В ролі "викрутки", звичайно, може виявитися все, що завгодно. одне їх призначення полягає в усуненні можливого конфлікту виходів, що після закінчення програмування мікроконтролер переходить у звичайний режим роботи, і може так вийти, що його висновок, з'єднаний з виходом конвертера (RTS, TXD або DTR) теж стає виходом, згідно щойно записаної в МК програмі, у цьому випадку буде дуже погано, якщо два напряму з'єднані виходи "боротимуться" - намагатимуться встановити різні логічні рівні. У такій "боротьбі" хтось може і "програти", а нам цього не треба.

Номінали трьох резисторів обрані лише на рівні 4,3 КОм. Це стосується з'єднань вихід конвертера - вхід мікроконтролера. Точність резисторів ролі не грає: можна зменшити їх опір до 1 КОм або збільшити до 10 КОм (але в другому випадку збільшується ризик перешкод при використанні довгих проводів на шляху до МК). Що ж до з'єднання вхід конвертера (CTS) - вихід мікроконтролера (MISO), то тут застосований резистор опором 100 Ом. Це пояснюється особливостями входу використаного конвертера. Під час випробувань був використаний конвертер на мікросхемі PL-2303, входи якої, судячи з усього, підтягнуті до плюсу живлення відносно низьким опором (близько кількох сотень Ом). Щоб "перебити підтяжку", довелося поставити резистор з таким маленьким опором. Втім, його можна взагалі не ставити. На конвертері завжди вхід. Виходом він стати не може, а отже, конфлікту виходів не буде за будь-якого розвитку подій.

Якщо мікросхема має окремий висновок AVCC для живлення аналогово-цифрового перетворювача (наприклад, ATmega8 або ATmega128), слід з'єднати його з виведенням загального живлення VCC. Деякі мікросхеми мають більше одного живлення VCC або більше одного GND. Наприклад, ATmega128 має 3 висновки GND та 2 висновки VCC. У постійній конструкції однойменні висновки краще поєднати між собою. У нашому випадку на час програмування можна задіяти по одному висновку VCC і GND.

А ось як виглядає підключення ATtiny13. На малюнку показано призначення висновків, що використовуються під час програмування через SPI. Поруч на фото – як тимчасове підключення виглядає насправді.


Хтось може сказати, що це несерйозно – з'єднання на проводках. Але ж ми з вами люди розсудливі. Наша мета полягає в тому, щоб запрограмувати мікроконтролер, витративши на це мінімум часу та інших ресурсів, а не в тому, щоби перед кимось покрасуватися. Якість при цьому не страждає. Метод "на проводках" у разі цілком ефективний і виправданий. Прошивка контролера - процедура разова, тому немає сенсу обвішувати її "стразиками". Якщо ж передбачається змінювати прошивку надалі, не виймаючи контролер із схеми (у готовому виробі), це враховується в монтажі під час виготовлення пристрою. Зазвичай для цього встановлюється роз'єм (RESET, SCK, MOSI, MISO, GND), а МК може бути прошитий навіть після установки на плату. Але це вже творчі вишукування. Ми ж розглядаємо найпростіший випадок.

Тепер перейдемо до МК ATtiny44. Тут усе приблизно так само. По малюнку і фото навіть новачкові не важко розібратися з підключенням. Подібно до ATtiny44 можна підключати МК ATtiny24 і ATtiny84 - призначення висновків у цієї трійці збігається.


Ще один приклад тимчасового підключення контролера для його програмування – ATmega8. Тут висновків побільше, але принцип той самий - кілька проводків, і ось уже контролер готовий до "заливання" інформації. Зайвий чорний провід на фото, що йде від виводу 13, програмування участі не бере. Він призначений для зняття звукового сигналу після виходу МК з режиму програмування. Це пов'язано з тим, що під час налагодження скрипту для "Перпетуум М" у МК закачувалась програма музичної скриньки.


Часто один контролер випускається у різних корпусах. При цьому призначення висновків кожного корпусу розподілено по-своєму. Якщо корпус вашого контролера не схожий на той, що зображений на малюнку, уточніть призначення висновків з технічної документації, яку можна завантажити з сайту розробника МК.

Для повноти картини подивимося підключення мікросхеми МК із великою кількістю "ніжок". Призначення зайвого чорного дроту на фото, що йде від виведення 15, таке саме, як у випадку з ATmega8.


Ймовірно, ви вже переконалися, що все досить просто. Хто вміє рахувати висновки у мікросхем (від мітки по колу проти годинникової стрілки), той розбереться. І не забувайте про акуратність. Мікросхеми люблять акуратних і не прощають недбалого себе ставлення.

Перш ніж переходити до програмної частини, переконайтеся, що драйвер конвертера USB-RS232TTL коректно встановлений (перевірте диспетчер пристроїв Windows). Запам'ятайте або запишіть номер віртуального COM-порту, який з'являється під час підключення конвертера. Цей номер потрібно буде вписати до тексту скрипта, про який читайте нижче.

4. Скрипт – програматор для "Перпетуум М"

З апаратною частиною "програматора" розібралися. Це вже півсправи. Тепер залишилося розібратися із програмною частиною. Її роль виконуватиме програма "Перпетуум М" під управлінням скрипта, в якому реалізовані всі необхідні функції взаємодії з мікроконтролером.

Архів зі скриптом слід розпакувати в ту саму папку, де знаходиться програма perpetuum.exe. У цьому випадку при запуску файлу perpetuum.exe на екран буде виводитись меню зі списком встановлених скриптів, серед яких буде рядок "Программатор МК AVR" (вона може бути єдиною). Саме цей рядок нам і знадобиться.

Скрипт знаходиться у папці PMS у файлі "Программатор МК AVR.pms". Цей файл можна переглядати, вивчати та редагувати за необхідності у звичайному текстовому редакторі на кшталт "Блокнота" Windows. Перед використанням скрипта потрібно буде внести зміни в текст, пов'язані з налаштуванням порту. Для цього уточніть у диспетчері пристроїв Windows ім'я порту, що використовується, і, при необхідності, внесіть відповідну поправку в рядок "Ім'яПорта="COM4";" - замість цифри 4 може бути інша цифра. Також при використанні іншої моделі конвертера USB-RS232TTL може знадобитися зміна настройок інвертування сигналів (рядки скрипта, що починаються зі слова "Високий"). Перевірити інвертування сигналів конвертером USB-RS232TTL можна за допомогою одного з прикладів, що міститься в інструкції до програми Перпетуум М (розділ функцій для роботи з портом).

У вкладеній папці MK_AVR знаходяться файли з описами підтримуваних контролерів. Якщо потрібного контролера не виявиться серед них, ви можете додати потрібний самостійно, діючи за аналогією. Візьміть за зразок один із файлів, і за допомогою текстового редактора введіть необхідні дані, взявши їх з документації на мікроконтролер. Головне - будьте уважні, вводьте дані без помилок, інакше МК не запрограмується або запрограмується неправильно. У вихідній версії підтримуються 6 мікроконтролерів: ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATmega8 та ATmega128. У скрипті реалізовано автоматичне розпізнавання підключеного контролера – вручну вказувати не потрібно. За відсутності ліченого з МК ідентифікатора серед наявних описів видається повідомлення, що розпізнати контролер не вдалося.

В архіві зі скриптом міститься також додаткова інформація. У папці "inc-файли контролерів AVR" знаходиться дуже корисна та велика колекція файлів описів контролерів. Ці файли використовують при написанні власних програм для МК. Ще чотири папки "MusicBox_..." містять файли з програмою на Асемблері та готовою до закачування в МК прошивкою окремо для ATtiny13, ATtiny44, ATmega8 та ATmega128. Якщо ви вже підключили один з цих МК для програмування, як це запропоновано в даній статті, то можете зараз його прошити - вийде музична скринька. Про це нижче.

При виборі меню скриптів рядки " Програматор МК AVR " , скрипт починає виконуватися. При цьому він відкриває порт, посилає в МК команду переходу в режим програмування, приймає підтвердження від МК про успішний перехід, запитує ідентифікатор МК і шукає опис даного МК з його ідентифікатору серед наявних файлів з описами. Якщо не знаходить відповідного опису, видає відповідне повідомлення. Якщо опис знайдено, далі відкривається головне меню програматора. Його скріншот можна бачити на малюнку 8. Далі розібратися не складно - меню дуже просте.

У першій версії скрипту деякі функції повноцінного програматора не реалізовані. Наприклад, немає можливості читати та писати в EEPROM. Але якщо ви відкриєте скрипт у текстовому редакторі, то побачите, що він має дуже невеликий розмір, при тому, що основне в ньому вже реалізовано. Це говорить про те, що додати відсутні функції не так вже й складно - мова дуже гнучкий, він дозволяє в невеликій програмі реалізувати багату функціональність. Але для більшості випадків вистачить навіть функцій.

Деякі обмеження функціональності описані у тексті скрипта:
//реалізований запис тільки з нульової адреси (Extended Segment Address Record ігнорується, LOAD OFFSET - теж)
//порядок і безперервність слідування записів у HEX-файлі не перевіряється
//контрольна сума не перевіряється
Це стосується роботи з файлом HEX, з якого береться код прошивки для МК. Якщо файл не спотворений, перевірка контрольної суми ні на що не вплине. Якщо спотворений – засобами скрипту це виявити не вдасться. Інші обмеження здебільшого не завадять, але мати на увазі їх таки потрібно.

5. Музична скринька - простий виріб для початківців

Якщо у вас є один з цих мікроконтролерів: ATtiny13, ATtiny44, ATmega8 або ATmega128, ви можете легко перетворити його на музичну скриньку або музичну листівку. Для цього достатньо записати в МК відповідну прошивку - одну з чотирьох, які розміщені в папках "MusicBox_..." в одному архіві зі скриптом. Коди прошивок зберігаються у файлах з розширенням ".hex". Використовувати ATmega128 для такого виробу, звичайно, "жирновато", як і ATmega8. Але це може бути корисно для тестування чи експериментів, інакше кажучи – у навчальних цілях. Тексти програм на асемблері також додаються. Програми створювалися не з нуля - за основу було взято програму музичної скриньки з книги А.В.Бєлова "Мікроконтролери AVR у радіоаматорській практиці". Вихідна програма зазнала ряду суттєвих змін:
1. адаптована для кожного з чотирьох МК: ATtiny13, ATtiny44, ATmega8 та ATmega128
2. ліквідовані кнопки - до контролера взагалі нічого не потрібно підключати, крім живлення та звуковипромінювача (мелодії відтворюються одна за одною в нескінченному циклі)
3. тривалість кожної ноти зменшена тривалість паузи між нотами усунення порушення музичного ритму
4. підключена восьма мелодія, незадіяна у книжковій версії
5. із суб'єктивного: деякі "улучшайзинги" для оптимізації та легшого сприйняття алгоритму

У деяких мелодіях чується фальш і навіть грубі помилки, особливо в "Посмішці" - у середині. Коди мелодій взяті з книги (а точніше - завантажені з сайту автора книги разом із вихідним asm-файлом) і не зазнавали змін. Зважаючи на все, в кодуванні мелодій є помилки. Але це не проблема - хто "дружить" з музикою, легко у всьому розбереться і виправить.

В ATtiny13 через відсутність 16-бітного лічильника для відтворення нот довелося використовувати 8-бітний, що призвело до деякого зниження точності звучання нот. Але на слух це мало помітно.

Щодо конфігураційних біт. Їх налаштування має відповідати стану нового мікроконтролера. Якщо ваш МК раніше десь використовувався, потрібно перевірити стан його конфігураційних біт, і, при необхідності, привести їх у відповідність до налаштувань нового мікроконтролера. Дізнатися стан конфігураційних біт нового мікроконтролера можна з документації цей МК (розділ "Fuse Bits"). Виняток становить ATmega128. Цей МК має біт M103C, який включає режим сумісності з більш старим ATmega103. Активізація біта M103C сильно урізує можливості ATmega128, причому у нового МК цей біт активний. Потрібно скинути M103C у неактивний стан. Для маніпуляцій із конфігураційними бітами використовуйте відповідний розділ меню скрипта-програматора.

Схему музичної скриньки наводити немає сенсу: у ній тільки мікроконтролер, харчування та п'єзвуковипромінювач. Харчування подається так само, як ми це зробили при програмуванні МК. Звуковипромінювач підключається між загальним проводом (висновок GND контролера) та одним із висновків МК, номер якого можна подивитися у файлі з асемблерним кодом програми (*.asm). На початку тексту програми кожному за МК у коментарях є рядок: " звуковий сигнал формується виведенні ХХ " . При завершенні роботи скрипта-програматора мікроконтролер виходить з режиму програмування і переходить у звичайний режим роботи. Відразу починається відтворення мелодій. Підключивши звуковипромінювач, це можна перевірити. Залишати звуковипромінювач підключеним під час програмування кристала можна тільки в тому випадку, якщо звук знімається з виводу, що не задіяного в SPI, інакше додаткова ємність на виводі може перешкодити програмуванню.

  • Програмування мікроконтролерів
    • 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- адреса слова на сторінці, iiiiiiiii- Завантажуваний байт. Спочатку завжди повинен завантажуватися молодший байт слова, а потім старший байт того ж слова.

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