Програмування мікроконтролерів atmega. Як написати код для AVR, програмування мікроконтролерів Atmel AVR на Сі

Для мікроконтролерів AVR існують різні мови програмування, але, мабуть, найбільш підходящими є асемблер і Сі, оскільки в цих мовах найкраще реалізовані всі необхідні можливості управління апаратними засобами мікроконтролерів.

Асемблер – це низькорівнева мова програмування, що використовує безпосередній набір інструкцій мікроконтролера. Створення програми цією мовою вимагає хорошого знання системи команд програмованого чіпа та достатнього часу на розробку програми. Асемблер програє Сі в швидкості і зручності розробки програм, але має помітні переваги в розмірі кінцевого коду, що виконується, а відповідно, і швидкості його виконання.

Сі дозволяє створювати програми з набагато більшим комфортом, надаючи розробнику всі переваги високого рівня мови.
Слід зазначити, що архітектура і система команд AVR створювалася з участю розробників компілятора мови Сі й у ній враховані особливості цієї мови. Компіляція вихідних текстів, написаних Сі, здійснюється швидко і дає компактний, ефективний код.

Основні переваги Сі перед асемблером: висока швидкість розробки програм; універсальність, яка потребує досконалого вивчення архітектури мікроконтролера; краща документованість та читаність алгоритму; наявність бібліотек функцій; підтримка обчислень з плаваючою точкою.

У мові Сі гармонійно поєднуються можливості програмування низького рівня з властивостями високого рівня мови. Можливість низькорівневого програмування дозволяє легко оперувати безпосередньо апаратними засобами, а властивості мови високого рівня дозволяють створювати програмний код, що легко читається і модифікується. Крім того, практично всі компілятори Сі мають можливість використовувати асемблерні вставки для написання критичних за часом виконання та займаних ресурсів ділянок програми.

Одним словом, Сі - найзручніша мова як для початківців знайомитися з мікроконтролерами AVR, так і для серйозних розробників.

Щоб перетворити вихідний текст програми на файл прошивки мікроконтролера, застосовують компілятори.

Фірма Atmel постачає потужний компілятор асемблера, який входить у середовище розробки Atmel Studio, що працює під Windows. Поряд із компілятором, середовище розробки містить відладчик та емулятор.
Atmel Studio абсолютно безкоштовна і доступна на сайті Atmel.

В даний час представлено багато компіляторів Сі для AVR. Найпотужнішим з них вважається компілятор фірми IAR Systems зі Стокгольма. Саме її співробітники в середині 90-х брали участь у розробці системи команд AVR. IAR C Compiler має широкі можливості по оптимізації коду і поставляється у складі інтегрованого середовища розробки IAR Embedded Workbench (EWB), що включає також компілятор асемблера, лінкер, менеджер проектів і бібліотек, а також налагоджувач. Ціна повної версії пакету складає 2820 EUR. На сайті компанії можна безкоштовно скачати оцінну версію на 30 днів або безстрокову з обмеженням розміру коду в 4 Кбайти.

Американською фірмою Image Craft з каліфорнійського Пало-Альто випускається компілятор мови Сі, який здобув досить широку популярність. JumpStart C for AVR має прийнятну оптимізацію коду та не надто високу ціну (від $50 до $499 залежно від версії). Демо-версія JumpStart C для AVR повністю функціональна протягом 45 днів.

Не меншу популярність завоював румунський Code Vision AVR C Compiler, ціна повної версії компілятора відносно невисока і становить 150 EUR. Компілятор поставляється разом з інтегрованим середовищем розробки, в яке, крім стандартних можливостей, включено досить цікаву функцію - CodeWizardAVR Automatic Program Generator. Наявність у середовищі розробки послідовного терміналу дозволяє проводити налагодження програм з використанням послідовного порту мікроконтролера. У розробників можна завантажити безкоштовну оцінну версію з обмеженням розміру коду в 4 Кбайта та відключеним збереженням згенерованого вихідного коду на Сі.

Компанія MikroElektronika, розташована в сербському місті Белграді, випускає цілу родину компіляторів для AVR-мікроконтролерів. Компілятор для мови Сі під назвою mikroC PRO for AVR коштує $249. Є також mikroBasic та mikroPascal за ту ж ціну. На сайті розробників є демоверсії з обмеженням розміру коду 4096 bytes. Плюсом цього сімейства компіляторів є єдина платформа та єдина ідеологія, що може забезпечувати легкий перехід не лише між мовами, а й між мікроконтролерами (є версії компіляторів для PIC, STM32, 8051…).

Воістину культовою стало інтегроване середовище розробки. Вона включає потужні компілятори Сі та асемблера, програматор AVRDUDE, відладчик, симулятор та безліч інших допоміжних програм та утиліт. WinAVR чудово інтегрується із середовищем розробки AVR Studio від Atmel. Асемблер ідентичний за вхідним кодом асемблеру AVR Studio. Компілятори Сі та асемблера мають можливість створення налагоджувальних файлів у форматі COFF, що дозволяє застосовувати не тільки вбудовані засоби, але й використовувати потужний симулятор AVR Studio. Ще одним важливим плюсом є те, що WinAVR поширюється безкоштовно без обмежень (виробники підтримують GNU General Public License).

Як резюме варто сказати, що WinAVR є ідеальним вибором для тих, хто починає освоювати мікроконтролери AVR. Саме це середовище розробки і розглядається як основна в даному курсі.

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

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

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

Побітові операції

Найчастіше при програмуванні мікроконтролерів AVR ми користувалися, оскільки вона має велику наочність порівняно з і добре зрозуміла для програмістів МК-початківців. Наприклад, нам потрібно встановити лише 3-й біт порту D. Для цього, як ми вже знаємо, можна скористатися наступним двійковим кодом:

PORTD = 0b00001000;

Однак цією командою ми встановлюємо 3-й розряд в одиницю, а решту (0, 1, 2, 4, 5, 6 і 7-й) ми скидаємо в нуль. А тепер давайте уявимо ситуацію, що 6-й та 7-й розряди задіяні як входи АЦП і в цей час на відповідні висновки МК надходить сигнал від будь-якого пристрою, а ми, що застосовується вище командою, обнулюємо ці сигнали. Внаслідок чого мікроконтролер їх не бачить і вважає, що сигнали не надходили. Тому замість такої команди нам слід застосувати іншу, яка встановила б лише 3-й біт в одиницю, при цьому не впливаючи на інші біти. Для цього зазвичай застосовується наступна побітова операція:

PORTD |= (1<<3);

Синтаксис її докладно розберемо далі. А зараз ще один приклад. Допустимо нам потрібно перевірити стан 3-го розряду регістра PIND, тим самим перевіряючи стан кнопки. Якщо цей розряд скинутий у нуль, ми знаємо, що кнопка натиснута і далі виконується код команди, що відповідає стану натиснутої кнопки. Раніше ми скористалися б наступним записом:

if (PIND == 0b00000000)

(який-небудь код)

Однак за допомогою неї ми перевіряємо не окремий, - третій, а відразу всі біти регістра PIND. Тому навіть якщо кнопка натиснутий і потрібний розряд скинутий, але в цей час на будь-який інший висновок порту D надійде сигнал, то відповідний побут встановиться в одиницю і умова в круглих дужках буде хибною. В результаті код, який знаходиться у фігурних дужках, не виконуватиметься навіть при натиснутій кнопці. Тому для перевірки стану окремого 3-го біта регістра PIND слід застосовувати побітову операцію:

if (~PIND & (1<<3))

(який-небудь код)

Для роботи з окремими бітами мікроконтролера в арсеналі мови програмування C є за допомогою яких можна змінювати або перевіряти стан одного або декількох окремих біт відразу.

Встановлення окремого біта

Для встановлення окремого біта, наприклад порту D, застосовується побітова операція АБО. Саме її ми застосовували на початку статті.

PORTD = 0b00011100; // початкове значення

PORTD = PORTD | (1<<0); применяем побитовую ИЛИ

PORTD |= (1<<0); // сокращенная форма записи

PORTD == 0b00011101; // результат

Ця команда виконує встановлення нульового розряду, а решта залишає без змін.

Наприклад встановимо ще 6-й розряд порту D.

PORTD = 0b00011100; // Початковий стан порту

PORTD |= (1<<6); //

PORTD == 0b01011100; // результат

Щоб записати одиницю відразу в кілька окремих біт, наприклад нульовий, шостий та сьомий порти Bзастосовується наступний запис.

PORTB = 0b00011100; // початкове значення

PORTB |= (1<<0) | (1<<6) | (1<<7); //

PORTB == 0b1011101; // результат

Скидання (обнулення) окремих бітів

Для скидання окремого біта застосовуються відразу три раніше розглянуті команди: .

Давайте скинемо 3-й розряд регістру PORTC і залишимо без змін інші.

PORTC = 0b00011100;

PORTC &= ~(1<<3);

PORTC == 0b00010100;

Виконаємо подібні дії для 2-го та 4-го розрядів:

PORTC = 0b00111110;

PORTC &= ~((1<<2) | (1<<4));

PORTC == 0b00101010;

Перемикання біта

Окрім встановлення та скидання також застосовується корисна команда, яка перемикає окремий біт на протилежний стан: одиницю в нуль і навпаки. Дана логічна операція знаходить широке застосування при побудові різних світлових ефектів, наприклад, як новорічна гірлянда. Розглянемо на прикладі PORTA

PORTA = 0b00011111;

PORTA ^= (1<<2);

PORTA == 0b00011011;

Змінимо стан нульового, другого та шостого бітів:

PORTA = 0b00011111;

PORTA ^= (1<<0) | (1<<2) | (1<<6);

PORTA == 0b01011010;

Перевірка стану окремого біта. Нагадаю, що перевірка (на відміну від запису) порту введення-виведення здійснюється за допомогою читання даних з регістру PIN.

Найчастіше перевірка виконується однією з двох операторів циклу: if і while. Із цими операторами ми вже знайомі раніше.

Перевірка розряду на наявність логічного нуля (скидання) з if

if (0==(PIND & (1<<3)))

Якщо третій розряд порту D скинутий, виконується Код1. Інакше виконується Код2.

Аналогічні дії виконуються при такій формі запису:

if (~PIND & (1<<3))

Перевірка розряду на наявність логічної одиниці (установки) з if

if (0 != (PIND & (1<<3)))

if (PIND & (1<<3))

Наведені вище два цикли працюю аналогічно, але можуть завдяки гнучкості мови програмування C мати різну форму запису. Операція! = Позначає не однаково. Якщо третій розряд порту вводу-виводу PD встановлено (одиниця), то виконується Код1, якщо немає - Код2.

Очікування скидання бита з while

while (PIND & (1<<5))

Код1 буде виконуватися доки 5-й розряд регістра PIND встановлено. При скиданні його почне виконуватися Код2.

Очікування установки біта з while

Тут синтаксис мови дозволяє записати код двома найбільш поширеними способами. На практиці застосовуються обидва типи запису.

Всім привіт. Як і обіцяв, із сьогоднішнього дня починаємо вивчати програмування AVR мікроконтролерів (на прикладі Atmega8). Тим же читачам, яким цікаве програмування плати ардуїно, не хвилюйтеся, статті за цим напрямком триватимуть 🙂 .

Можна поставити логічне питання, чому з інших мікроконтролерів (далі — МК) як піддослідний обраний саме МК AVR. На це є кілька причин:

  • МК AVRповсюдно доступні;
  • У них досить низька ціна;
  • В інтернеті можна знайти багато безкоштовних програм, що допоможуть під час роботи з даними МК.
  • Крім цього, існує безліч написаних статей та форумів, на яких можна поставити запитання за даними МК AVR.

Як говорив раніше, як піддослідний використовуватимемо МК Atmega8. Чому саме його?

Даний мікроконтролер може похвалитися наявністю 3 портів вводу/виводу. Крім цього, він досить дешевий.

Під портами розуміють шини даних, які можуть працювати у двох протилежних напрямках (тобто на висновок і на введення).

У Atmega8 3 порти. Порт B складається з 8 ніжок-висновків (нумерація 0,1,2,3,4,5,6,7). Порт С складається з 7 ніжок-висновків (нумерація 0,1,2,3,4,5,6). Порт D складається з 8 ніжок-висновків (нумерація 0,1,2,3,4,5,6,7).

Запитувати мікроконтролер можна від 3,3 та 5 В. При напрузі живлення 5 В максимальна частота тактування становить 16 МГц, а при напрузі живлення 3,3 В – максимальна частота тактування 8 МГц. Поки не морочимось щодо частот тактування.

Живлення подається на 7 ніжку-виведення, а «земля» підводиться до 8 ніжки.

Завантажується безкоштовно. Завантажили, встановили, запустили 🙂

Перше, з чого слід розпочати знайомство з Atmel Studio – це створення проекту.

Вибираємо File->new->project.

Відкриється вікно вибору. Вибираємо папку «Browse», в якій зберігатимемо написані проекти. Теку для проектів створив заздалегідь.

Привласнюємо ім'я проекту, у моєму випадку lesson_avr_1

Зверніть увагу на галочку create directory for solution. Якщо позначка стоїть, то в тій папці, яку ми вибрали для збереження проектів, буде створено окрему папку під поточний проект.

На цьому все – проект створено.

Займемося налаштуванням створеного нами проекту. Натискаємо Projest -> lesson_avr_1 properties або (alt+F7)

Переходимо на вкладку Tool. Вибираємо – симулятор. Вчинені нами дії уможливлять налагодження написаного коду. Зберігаємо зміни. Можна зберегти зміни в одному (поточному) файлі або у всіх файлах проекту відразу. Закриваємо налаштування.

Кисельов Роман, Травень 2007 Статтю оновлено 26 Травня 2014

Отже, що таке мікроконтролер (далі МК)? Це, умовно кажучи, невеликий комп'ютер, розміщений в одній інтегральній мікросхемі. У нього є процесор (арифметично-логічний пристрій, або АЛУ), flash-пам'ять, EEPROM-пам'ять, безліч регістрів, порти введення-виводу, а також додаткові «навороти», такі як таймери, лічильники, компаратори, USART і т.п. .Мікроконтролер після подачі живлення завантажується і починає виконувати програму, записану в його flash-пам'яті. При цьому він може через порти вводу/виводу керувати різноманітними зовнішніми пристроями.

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

AVR – це 8-бітні мікроконтролери, тобто їх АЛУ може за один такт виконувати найпростіші операції лише з 8-ми бітними числами. Тепер настав час поговорити про те, який МК ми будемо використовувати. Я працюю з МК ATMega16. Він дуже поширений і придбати його можна практично в будь-якому магазині радіодеталей десь за 100 руб. Якщо ви його не знайдете – тоді можна купити будь-який інший МК серії MEGA, але в цьому випадку доведеться шукати до нього документацію, тому що одні й ті самі «ніжки» різних МК можуть виконувати різні функції, і, підключивши, здавалося б, правильно всі висновки, ви, можливо, отримаєте робочий пристрій, а, можливо, лише хмара смердючого диму. При покупці ATMega16 перевірте, щоб він був у великому 40-ніжному DIP-корпусі, а також купіть панельку, в яку його можна буде вставити. Для роботи з ним будуть потрібні також додаткові пристрої: світлодіоди, кнопки, роз'єми тощо.

ATMega16 має дуже велику кількість найрізноманітніших функцій. Ось деякі його характеристики:

  • Максимальна тактова частота – 16 МГц (8 МГц для ATMega16L)
  • Більшість команд виконуються за один такт
  • 32 8-бітових робочих регістру
  • 4 повноцінні 8-бітові порти вводу/виводу
  • два 8-бітні таймери/лічильники і один 16-бітний
  • 10-розрядний аналогово-цифровий перетворювач (АЦП)
  • внутрішній тактовий генератор на 1 МГц
  • аналоговий компаратор
  • інтерфейси SPI, I2C, TWI, RS-232, JTAG
  • внутрішньосхемне програмування та самопрограмування
  • модуль широтно-імпульсної модуляції (ШІМ)

Повні характеристики цього пристрою, а також інструкції щодо їх застосування можна знайти в довіднику (Datasheet) до цього МК. Щоправда, він англійською мовою. Якщо ви знаєте англійську, то обов'язково завантажте цей Datasheet, у ньому багато корисного.

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

Що для цього знадобиться?

По-перше, знадобиться сама плата. Я купив уже готову в магазині радіодеталей за 115 руб. Потім припаяв до неї всі потрібні деталі. Вийшла неймовірно зручна річ, на якій можна за лічені хвилини зібрати якусь електричну схему шляхом перетикання шлейфів та встановлення мікросхем та індикаторів.

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

Пояснимо, які ніжки нас зараз цікавлять.

  • VCC - сюди подається харчування (4,5 - 5,5 В) від стабілізованого джерела
  • GND – земля
  • RESET – скидання (при низькому рівні напруги)
  • XTAL1, XTAL2 – сюди підключається кварцовий резонатор
  • PA, PB, PC, PD – порти вводу/виводу (A, B, C та D відповідно).

Як джерело живлення можна використовувати все, що видає 7-11 В постійного струму. Для стабільної роботи МК потрібне стабілізоване харчування. Як стабілізатор можна використовувати мікросхеми серії 7805. Це лінійні інтегральні стабілізатори, на вхід яких подають 7-11 постійного нестабілізованого струму, а на виході отримують 5 стабілізованого. Перед 7805 і після нього потрібно поставити конденсатори, що фільтрують (електролітичні для фільтрації перешкод низьких частот і керамічні для високих). Якщо не вдається знайти стабілізатор, то можна як джерело живлення використовувати батарейку на 4,5 В. Від неї МК потрібно живити безпосередньо.

Нижче наведу схему підключення МК:

Давайте тепер розберемося, що тут навіщо.

BQ1 – це кварцовий резонатор, який задає робочу частоту МК. Можна поставити будь-який до 16 МГц, але оскільки ми плануємо працювати в майбутньому і з COM-портом, то рекомендую використовувати резонатори на наступні частоти: 14,7456 МГц, 11,0592 МГц, 7,3725 МГц, 3,6864 МГц або 1 ,8432 МГц (пізніше стане зрозуміло, чому). Я використав 11,0592 МГц. Зрозуміло, що чим більша частота, тим вища і швидкість роботи пристрою.

R1 – підтягуючий резистор, який підтримує напругу 5 на вході RESET. Низький рівень напруги цьому вході означає скидання. Після скидання МК завантажується (10-15 мс) і починає виконувати програму заново. Оскільки це високоомний вхід, то не можна залишати його «болтаючим у повітрі» - невелике наведення на ньому призведе до непередбачуваного скидання МК. Саме для цього і потрібний R1. Для надійності також рекомендую встановити конденсатор С6 (не більше 20 мкФ).

SB1 – кнопка скидання.

Кварцовий резонатор і конденсатор C3, що фільтрує, повинні розташовуватися якомога ближче до МК (не далі 5-7 см), тому що інакше можуть виникати наведення в проводах, що призводять до збоїв в роботі МК.

Синім прямокутником на схемі обведений власне програматор. Його зручно виконати у вигляді дроту, один кінець якого встромляється в LPT порт, а інший - в якийсь роз'єм поруч із МК. Провід не повинен бути надмірно довгим. Якщо виникнуть проблеми з цим кабелем (зазвичай не виникають, але всяке буває) доведеться спаяти адаптер Altera ByteBlaster. Про те, як це зробити, написано в описі програматора AVReal.

Тепер, коли розібралися із залізом, настав час перейти до програмного забезпечення.

Для програмування AVR є кілька середовищ розробки. По-перше, це AVR Studio – офіційна система програмування Atmel. Вона дозволяє писати на асемблері та налагоджувати програми, написані на асемблері, С та С++. IAR – це комерційна система програмування на C, С++ та асемблері. WinAVR – компілятор із відкритими вихідними джерелами. AtmanAVR – система програмування для AVR з інтерфейсом, майже «один на один» таким же, як у Visual C++ 6. AtmanAVR також дозволяє налагоджувати програми та містить безліч допоміжних функцій, що полегшують написання коду. Ця система програмування є комерційною, але, відповідно до ліцензії, її можна протягом місяця використовувати «нахаляву».

Я пропоную розпочати роботу з IAR як із найбільш «прозорим» середовищем розробки. У IAR проект цілком створюється «ручками», відповідно, зробивши кілька проектів, ви вже чітко знатимете, що означає кожен рядок коду і що буде, якщо його змінити. При роботі ж з AtmanAVR доведеться або користуватися заздалегідь створеним шаблоном, який дуже громіздкий і важкий для розуміння для людини, яка не має досвіду, або мати безліч проблем із заголовними файлами при складанні проекту «з нуля». Розібравшись із IAR, ми згодом розглянемо інші компілятори.

Отже, спочатку роздобудьте IAR. Він дуже поширений і його перебування не має бути проблемою. Завантаживши десь IAR 3.20, встановлюємо компілятор / робоче середовище і запускаємо його. Після цього можна розпочинати роботу.

Запустивши IAR, вибираємо file/new/workspace, вибираємо шлях до нашого проекту та створюємо для нього папку та даємо ім'я, наприклад, «Prog1». Тепер створюємо проект: Project / Create new project…Назвемо його також - "Prog1". Клацаємо правою кнопкою миші на заголовку проекту у дереві проектів та вибираємо «Options»

Тут налаштовуватимемо компілятор під конкретний МК. По-перше, потрібно вибрати на вкладці Target тип процесора ATMega16, на вкладці Library Configuration встановити галочку Enable bit definitions in I/O-include files (щоб можна було використовувати в коді програми імена бітів різних регістрів МК), там вибрати тип бібліотеки С /ЄС++. У категорії ICCAVR потрібно на вкладці Language встановити галочку Enable multibyte support, а на вкладці Optimization вимкнути оптимізацію (інакше вона зіпсує нашу першу програму).

Далі вибираємо категорію XLINK. Тут потрібно визначити формат відкомпілюваного файлу. Оскільки зараз ми задаємо опції для режиму налагодження (Debug), про що написано в заголовку, то на виході потрібно отримати файл налагодження. Пізніше ми його відкриємо у AVR Studio. Для цього потрібно вибрати розширення .cof, а тип файлу – ubrof 7.

Тепер натискаємо ОК, після чого змінюємо Debug на Release.

Знову заходимо в Options, де всі параметри, окрім XLINK, виставляємо самі. У XLINK змінюємо розширення на .hex, а формат файлу на intel-standart.

От і все. Тепер можна розпочинати написання першої програми. Створюємо новий Source/text і набираємо в ньому наступний код:

#include"iom16.h" short unsigned int i; void main ( void) (DDRB = 255; PORTB = 0; while(1) { if(PORTB == 255) PORTB = 0; else PORTB++; for(i=0; i

Файл iom16.h знаходиться в папці (C:\Program Files)\IAR Systems\Embedded Workbench 3.2\avr\inc. Якщо ви використовуєте інший МК, наприклад, ATMega64, вибирайте файл «iom64.h». У цих заголовних файлах зберігається інформація про МК: імена регістрів, бітів у регістрах, визначені імена переривань. Кожна окрема "ніжка" порту A, B, C або D може працювати або як вхід, або як вихід. Це визначається регістрами Data Direction Register (DDR). 1 робить "ніжку" виходом, 0 - входом. Отже, виставивши, наприклад, DDRA = 13, ми робимо виходами «ніжки» PB0, PB2, PB3, інші – входи, т.к. 13 у двійковому коді буде 00001101.

PORTB – це регістр, у якому визначається стан «ніжок» порту. Записавши туди 0, ми виставляємо усім виходах напруга 0 У. Далі йде нескінченний цикл. При програмуванні МК завжди роблять нескінченний цикл, в якому МК виконує будь-яку дію, доки його не скинуть або поки не відбудеться переривання. У цьому циклі пишуть як би «фоновий код», який МК виконує в останню чергу. Це може бути, наприклад, виведення інформації на екран. У нашому випадку збільшується вміст регістру PORTB до того часу, поки він заповниться. Після цього все починається спочатку. Нарешті, цикл на десять тисяч тактів. Він необхідний формування видимої затримки у перемиканні стану порту.



Тепер зберігаємо цей файл у папці з проектом як Prog1.c, копіюємо в папку з проектом файл iom16.h, вибираємо Project/Add Files і додаємо "iom16.h" та "Prog1.c". Вибираємо Release, натискаємо F7, програма компілюється та має з'явитися повідомлення:


Total number of errors: 0
Total number of warnings: 0

Наведу фотографію свого програматора:

Завантажуємо програматор AVReal. Копіюємо його (AVReal32.exe) до папки Release/exe, де має лежати файл Prog1.hex. Подаємо харчування на МК, підключаємо кабель-програматор. Відкриваємо Far Manager (у ньому найзручніше прошивати МК), заходимо в цю папку, натискаємо Ctrl+O. Оскільки в нас абсолютно новий МК, то набиваємо

avreal32.exe +MEGA16 -o11.0592MHZ -p1 -fblev=0,jtagen=1,cksel=F,sut=1 –w

Не забудьте правильно вказати частоту, якщо використовуєте 11059200 Гц! При цьому МК прошиваються т.зв. fuses – регістри, які керують його роботою (використання внутрішнього генератора, Jtag тощо). Після цього він готовий до прийому першої програми. Програматору як параметри передають використовуваний LPT-порт, частоту, ім'я файлу та інші (всі вони перераховані в описі до AVReal). Набираємо:

Avreal32.exe +Mega16 -o11.0592MHz -p1 -e -w -az -% Prog1.hex

У разі правильного підключення програматор повідомить про успішне програмування. Немає гарантії, що це вийде з першого разу (у разі першого виклику програми). У мене самого буває програмується з другого разу. Можливо, LPT-порт є глючним або виникають наведення в кабелі. У разі виникнення проблем ретельно перевірте свій кабель. За своїм досвідом знаю, що 60% несправностей пов'язані з відсутністю контакту в потрібному місці, 20% - з наявністю в непотрібному і ще 15% - з помилковою пайкою не до того. Якщо нічого не вийде, читайте опис до програматора, спробуйте зібрати Byte Blaster.

Припустимо, у вас все працює. Якщо тепер підключити до порту В МК вісім світлодіодів (робіть це у вимкненому стані МК, і бажано послідовно зі світлодіодами включити резистори в 300-400 Ом) і подати живлення, то станеться маленьке диво – по них побіжить хвиля!

© Кисельов Роман
Травень 2007

Завдання: Розробимо програму керування одним світлодіодом. При натисканні на кнопку світлодіод світиться, при відпусканні гасне.

Для початку розробимо важливу схему пристрою. Для підключення до мікроконтролера будь-яких зовнішніх пристроїв використовуються порти вводу-виводу. Кожен із портів здатний працювати як на вхід так і на вихід. Підключимо світлодіод до одного з портів, а кнопку до іншого. Для цього досвіду ми будемо використовувати контролер Atmega8. Ця мікросхема містить 3 порти вводу-виводу, має 2 восьмирозрядні і 1 шістнадцятирозрядний таймер/лічильник. Також на борту є 3-х канальний ШІМ, 6-ти канальний 10-ти бітний аналого-цифровий перетворювач та багато іншого. На мою думку, мікроконтролер чудово підходить для вивчення основ програмування.

Для підключення світлодіода ми використовуватимемо лінію PB0, а для зчитування інформації з кнопки скористаємося лінією PD0. Схема наведено на рис.1.

Заняття №2. Перемикання світлодіода

Заняття №3. Блимання світлодіодом

Заняття №4. Вогні, що біжать

Заняття №5. Вогні, що біжать, з використанням таймера

Заняття №6. Вогні, що біжать. Використання переривань за таймером

Заняття №7. Оператори керування бітами

Заняття №8. Реалізація ШІМ

Цифрові пристрої, наприклад, мікроконтролер може працювати з двома рівнями сигналу, тобто. нуль і одиниця або вимкнено та увімкнено. Таким чином, ви можете легко використовувати його для контролю стану навантаження, наприклад, увімкнути або вимкнути світлодіод. Також ви можете використовувати його для керування будь-яким електричним приладом, використовуючи відповідні драйвери (транзистор, симістор, реле і т.д.). Але іноді потрібно більше, ніж просто "включити" і "вимкнути" пристрій. Тому, якщо ви хочете контролювати яскравість світлодіода (або лампи) або швидкості двигуна постійного струму, цифрові сигнали просто не можу цього зробити. Ця ситуація дуже часто зустрічається в цифровій техніці та називається Широтно-імпульсною модуляцією (PWM).

Поділитися