Програмування мікроконтролерів avr на сі. Програмування мікроконтролерів AVR на C. Так що ж таке, мікроконтролер

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

Більше детальну інформаціюможна подивитися англійською мовою в CodeVision User Manual, а також рекомендую сайт http://somecode.ru з відеоуроками з Сі для мікроконтролерів та книгу «Як програмувати на С» автор Дейтель, це єдина придатна книга, з якої я сам починав.

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

Сама прошивка має розширення.hex і є набором інструкцій, у вигляді одиниць і нулів, який зрозумілий мікроконтролеру. Звідки взяти прошивку? Її можна завантажити з сайтів з електроніки, або написати самому. Написати її можна у спеціальних програмах, які називаються середовищем розробки. З найбільш відомих мені AVR Studio, IAR, CodeVision, WinAVR… Не можна сказати, що якесь із цих середовищ краще чи гірше, кожному своє. Можна сказати, що ці програми переважно зручністю, мовою програмування і ціною. В межах даного сайту розглядається лише CodeVision.

Із середовищем розібралися, тепер розберемося з процесом написання прошивки. У CodeVision спочатку потрібно створити проект. Його можна створити за допомогою майстра коду або порожнього. У будь-якому випадку, потрібно вибрати тип мікроконтролера, що використовується, і вказати його частоту. При використанні майстра вам буде запропоновано вибрати початкові налаштування і згенерувати вихідний код з налаштуваннями. Далі з'явиться вікно, де можна редагувати цей код. Хоча ви можете написати свій вихідний код, у блокноті і потім причепити його до проекту у налаштуваннях.

Файл з вихідним кодом є набором команд мовою програмування, завдання CodeVision перевести ці команди в двійковий код, ваше завдання написати цей вихідний код. CodeVision розуміє мову Сі, файли з вихідним кодом мають розширення ".c". Але у CodeVision є деякі конструкції, які не використовуються в Сі, за це його багато програмістів не люблять, а мову, що використовується, називають Сі подібною. Однак це не заважає писати серйозні проекти. Безліч прикладів, генератор коду, великий набір бібліотек дає великий плюс CodeVision. Єдиний мінус, що він платний, хоча є безкоштовні версіїз обмеженням коду.

Вихідний код повинен містити заголовок з типом мікроконтролера і функцію main. Наприклад, використовується ATtiny13

#include void main (void) ();

#include void main(void) ( );

До функції main можна підключити необхідні бібліотеки, оголосити глобальні змінні, константи, налаштування. Бібліотека це окремий файл, зазвичай з розширенням ".h", в якому вже є заздалегідь написаний код. В одних проектах цей код може бути нам потрібний, а в інших не потрібний. Наприклад, в одному проекті ми використовуємо жк дислей, а в іншому не використовуємо. Підключити бібліотеку для роботи з дисплеєм «alcd.h», можна так:

#include #include void main (void) ();

#include #include void main(void) ( );

Змінні це ділянки пам'яті, які можна помістити деякі значення. Наприклад, склали два числа, результат потрібно десь зберегти, щоб використовувати надалі. Спочатку потрібно оголосити змінну, тобто. виділити під неї пам'ять, наприклад:
int i=0;
тобто. ми оголосили змінну i і помістили до неї значення 0, int – тип змінної, чи простіше кажучи, означає розмір виділеної пам'яті. Кожен тип змінних може зберігати лише певний діапазон значень. Наприклад, int можна записати числа від -32768 до 32767. Якщо потрібно використовувати числа з дробовиною означає, змінну потрібно оголошувати як float, для символів використовують тип char.

bit, _Bit 0 або 1 char від -128 до 127 unsigned char від 0 до 255 int від -32768 до 32767 unsigned int від 0 до 65535 long int від -2147483648 до 2147483647 un ±1.175e- 38 до ±3.402e38

Всередині функції main вже виконується основна програма. Після виконання функції програма зупиниться, тому роблять нескінченний цикл while, який крутить ту саму програму постійно.

void main (void) (while (1) (););

void main(void) ( while (1) ( ); );

У будь-якій частині вихідного коду можна написати коментар, на роботу програми він впливати ніяк не буде, але допомагатиме зробити позначки до написаного коду. Закоментувати рядок можна двома слешами //після цього компілятор ігноруватиме весь рядок, або кілька рядків /**/, наприклад:

/*Основні математичні операції:*/ int i = 0; //оголошуємо змінну i і присвоюємо їй значення 0//Складання: i = 2 + 2; //Віднімання: i = 2 - 2; //після виконання цього виразу змінна i дорівнюватиме 0// Множення: i = 2 * 2; //після виконання цього виразу змінна i дорівнюватиме 4//Поділ: i = 2/2; //після виконання даного виразу змінна i дорівнюватиме 1

/*Основні математичні операції:*/ int i=0; //оголошуємо змінну i і присвоюємо їй значення 0 //Складання: i = 2+2; //після виконання даного виразу змінна i дорівнюватиме 4 //Віднімання: i = 2-2; //після виконання цього виразу змінна i дорівнюватиме 0 //Множення: i = 2*2; //після виконання цього виразу змінна i дорівнюватиме 4 //Поділ: i = 2/2; //після виконання даного виразу змінна i дорівнюватиме 1

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

if(i>3) //якщо i більше 3, то присвоїти i значення 0 ( i=0; ) /*якщо i менше 3, то перейти до коду наступного після тіла умови, тобто. після дужок ()*/

Також if можна використовувати спільно з else – інакше

if(i<3) //если i меньше 3, то присвоить i значение 0 { i=0; } else { i=5; //иначе, т.е. если i больше 3, присвоить значение 5 }

Також є операція порівняння "==" її не можна плутати з "=" присвоїти. Зворотна операція не дорівнює «!=», допустимо

if(i==3)//якщо i дорівнює 3, присвоїти i значення 0 ( i=0; ) if(i!=5) //якщо i не дорівнює 5, присвоїти i значення 0 ( i=0; )

Перейдемо до складніших речей – функцій. Припустимо, у вас є шматок коду, який повторюється кілька разів. Причому цей код є досить великим у розмірах. Писати його щоразу незручно. Наприклад, у програмі, яким чином змінюється змінна i, при натисканні на кнопку 0 і 3 порту D виконується однаковий код, який в залежності від величини змінної i включає ніжки порту B.

void main(void ) ( if (PIND.0== 0 ) //перевіряємо натиснута кнопка на PD0( if (i== 0 ) //якщо i==0 включити PB0(PORTB.0=1;) if (i==5) // якщо i==5 увімкнути PB1(PORTB.1=1;)) … if (PIND.3==0) // виконуємо те саме, під час перевірки кнопки PD3( if ( i = = 0 ) ( PORTB.0 = 1 ; ) if ( i = = 5 ) ( PORTB.1 = 1 ; ) ) )

void main(void) ( if(PIND.0==0) //перевіряємо натиснута кнопка на PD0 ( if(i==0) //якщо i==0 включити PB0 ( PORTB.0=1; ) if( i==5) // якщо i==5 включити PB1 ( PORTB.1=1; ) ) … if(PIND.3==0)// виконуємо те саме, під час перевірки кнопки PD3 ( if(i==0) ) ( PORTB.0=1; ) if(i==5) ( PORTB.1=1; ) ) )

Загалом, код не дуже великий, але він міг би бути ще й більше у багато разів, тому набагато зручніше було б створити свою функцію.
Наприклад:

void i_check() ( if (i== 0 ) ( PORTB.0= 1 ; ) if (i== 5 ) ( PORTB.1= 1 ; ) )

void i_check() ( if(i==0) ( PORTB.0=1; ) if(i==5) ( PORTB.1=1; ) )

void означає, що функція нічого не повертає, про це трохи нижче i_check() – це назва нашої функції, можете назвати як завгодно, я назвав саме так – перевірка i. Тепер ми можемо переписати наш код:

void i_check() ( if(i==0) ( PORTB.0=1; ) if(i==5) ( PORTB.1=1; ) ) void main(void) ( if(PIND.0==0) ) //проверяем чи натиснута кнопка на PD0 ( i_check(); ) … if(PIND.3==0) ( i_check(); ) )

Коли код буде доходити до рядка i_check(); він перестрибне всередину функції і виконає код всередині. Погодьтеся, код компактніший і наочніший, тобто. функції допомагають замінити однаковий код, лише одну строчку. Зверніть увагу, що функція оголошується поза основним кодом, тобто. до функції main. Можна сказати, навіщо мені це треба, але вивчаючи уроки вам часто траплятимуться функції, наприклад очищення РК екрану lcd_clear() — функція не приймає жодних параметрів і нічого не повертає, проте очищає екран. Іноді ця функція використовується майже через рядок, отже економія коду очевидна.

Набагато цікавіше виглядає застосування функції, коли вона набуває значень, наприклад, є змінна c і ​​є функція sum, яка приймає два значення типу int. Коли основна програма виконуватиме цю функцію, то в дужках вже вказані аргументи, таким чином «a» дорівнюватиме двом, а «b» дорівнюватиме 1. Функція виконається і «с» дорівнюватиме 3.

int c = 0; void sum (int a, int b) (c = a + b;) void main (void) (sum (2, 1);)

int c=0; void sum(int a, int b) ( c=a+b; ) void main(void) ( sum(2,1); )

Одна з подібних функцій, що часто зустрічаються, це переклад курсора у жк дисплея lcd_gotoxy(0,0); яка, до речі, теж приймає аргументи - координати по х і у.

Ще один варіант використання функції, коли вона повертає значення, тепер вона вже не буде void, удосконалимо попередній приклад функції додавання двох чисел:

int c = 0; int sum(int a, int b) ( return a+ b; ) void main(void ) ( з = sum(2 , 1 ) ; )

int c=0; int sum(int a, int b) ( return a+b; ) void main(void) ( з=sum(2,1); )

Результат буде такий же як і минулого разу c=3, проте зверніть увагу, що ми змінній «с» присвоюємо значення функції, яка вже не void, а повертає суму двох чисел типу int. Таким чином, ми не прив'язуємося до конкретної змінної «с», що додає гнучкості у використанні функцій. Простий приклад подібної функції - читання даних АЦП, функція повертає виміряне значення result = read_adc (); На цьому закінчимо з функціями.

Тепер перейдемо до масивів. Масив це пов'язані змінні. Наприклад, у вас є таблиця синуса з кількома точками, не будете створювати змінні int sinus1=0; int sinus2 = 1; і т.д. для цього використовують масив. Наприклад, створити масив із трьох елементів можна так:
int sinus = (0,1,5);
у квадратних дужках зазначається загальна кількість елементів масиву. Присвоїти змінній «з» значення третього елемента можна таким чином:
з = sinus;
Зверніть увагу, що нумерація елементів масиву починається з нуля, тобто. «с» дорівнюватиме п'яти. У даного масиву елемента sinus не існує!
Окремому елементу можна надати значення так:
sinus=10;

Можливо, ви вже встигли помітити, що у CodeVision немає рядкових змінних. Тобто. не можна створити змінну string hello = "привіт"; для цього доведеться створювати масив із окремих символів.

lcd_putchar(hello); lcd_putchar(hello); lcd_putchar(hello);

і т.д.
Виходить досить громіздко, тут на допомогу приходять цикли.
Наприклад цикл while

while(PINB.0!=0) ( )

Поки кнопка не натиснута нічого не робити – ганяти порожній цикл.

Ще один варіант цикл for

int i; for (i = 0; i< 6 ; i++ ) { lcd_putchar(hello[ i] ) ; }

int i; for(i=0;i<6;i++) { lcd_putchar(hello[i]); }

Сенс такий самий, як і в while тільки додано початкова умова i=0 і умова, що виконується кожен цикл i++. Код усередині циклу максимально спрощений.

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

Не варто відразу намагатися використовувати цикли, масиви та функції у своїх прошивках. Ваше головне завдання змусити прошивку працювати, тому робіть так, як вам простіше не звертайте увагу на розмір коду. Прийде час, коли захочеться не просто писати робочий код, а написати його красиво і компактно. Тоді можна буде заглибитись у нетрі мови Сі. Бажаючим опанувати всім і відразу ще раз рекомендую книгу «Як програмувати на Сі», там багато прикладів та завдань. Ставте Visual Studio, створюйте консольну програму win32 і там досхочу тренуйтеся.

Урок 0

Сьогодні ми відкриваємо цикл уроків програмування мікроконтролерів сімейства AVR.

Сьогодні будуть розглянуті такі питання:

  1. Що таке мікроконтролер?
  2. Де застосовуються мікроконтролери?

Вступ.

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

То що таке, мікроконтролер?

Мікроконтролер (Micro Controller Unit, MCU) - мікросхема, призначена для управління електронними пристроями. Можна уявити його у вигляді найпростішого комп'ютера, здатного взаємодіяти із зовнішніми пристроями. Наприклад, відкривати та закривати транзистори, отримувати дані з датчиків температури, виводити дані на lcd екрани тощо. Крім того, мікроконтролер може проводити різну обробку вхідних даних, як і Ваш персональний комп'ютер.

Тобто, мікроконтролери відкривають нам практично безмежні можливості управління будь-якими пристроями, завдяки наявності портів I/0 (портів введення (input) / виводу (output)), а також можливості їх програмування.

Де використовуються мікроконтролери?

  1. Побутова техніка (Пральні машини, мікрохвильові печі і т.д.).
  2. Мобільна техніка (Роботи, робототехнічні системи, засоби зв'язку та ін.).
  3. Промислове обладнання (Системи керування верстатами).
  4. Обчислювальна техніка (Материнські плати, системи управління периферійними пристроями).
  5. Розважальна техніка (Дитячі іграшки, прикраси).
  6. Транспорт(Системи керування двигуном автомобіля, системи безпеки)

Це далеко не повний перелік сфер застосування мікроконтролерів. Часто дуже вигідно замінити набір керуючих мікросхем одним мікроконтролером, зважаючи на спрощення виробництва, зниження енергоспоживання.

Початок знайомства з AVR

AVR- Сімейство мікроконтролерів фірми Atmel. Мають достатню продуктивність для більшості аматорських пристроїв. Також знаходять широке застосування у промисловості.

Принципова схема програматора на порт LPT показана на малюнку. Як шинний формувач використовуйте мікросхему 74AC 244 або 74HC244 (К1564АП5), 74LS244 (К555АП5) або 74ALS244 (К1533АП5).

Світлодіод VD1 індикує режим запису мікроконтролера,

світлодіод VD2 - читання,

світлодіод VD3 – наявність живлення схеми.

Напруга, необхідне харчування схема бере з роз'єму ISP, тобто. від програмованого пристрою. Ця схема є переробленою схемою програматора STK200/300 (додані світлодіоди для зручності роботи), тому вона сумісна з усіма програмами програматорів на PC, що працюють зі схемою STK200/300. Для роботи з цим програматором використовуйте програму CVAVR

Програматор можна виконати на друкованій платі і помістити їх у корпус роз'єму LPT, як показано на рисунках:




Для роботи з програматором зручно використовувати подовжувач LPT порту, який нескладно виготовити самому (наприклад, з кабелю Centronix для принтера), головне не шкодувати провідників для землі (18-25 ноги роз'єму) або купити. Кабель між програматором та програмованою мікросхемою не повинен перевищувати 20-30 см.

Побітові операції ґрунтуються на логічних операціях, які ми вже розглянули раніше. Вони відіграють ключову роль у програмуванні мікроконтролерів 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

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

Мікроконтролери (далі МК) міцно увійшли до нашого життя, на просторах інтернету можна зустріти дуже багато цікавих схем, які виконані на МК. Чого тільки не можна зібрати на МК: різні індикатори, вольтметри, прилади для дому (пристрої захисту, комутації, термометри…), металошукачі, різні іграшки, роботи тощо. можна перераховувати дуже довго. Першу схему на мікроконтролері я побачив років 5-6 тому у журналі радіо, і практично відразу ж перегорнув сторінку, подумавши про себе "все одно не зможу зібрати". Дійсно, в той час МК для мене були чимось дуже складним і незрозумілим пристроєм, я не уявляв, як вони працюють, як їх прошивати, і що робити з ними у разі неправильної прошивки. Але близько року тому, я вперше зібрав свою першу схему на МК, це була схема цифрового вольтметра на 7 сегментних індикаторах і мікроконтролері ATmega8. Так вийшло, що мікроконтролер я купив випадково, коли стояв у відділі радіодеталей, хлопець переді мною купував МК, і я теж вирішив купити, і спробувати зібрати щось. У своїх статтях я розповім вам про мікроконтролери AVR, навчу вас працювати з ними, розглянемо програми для прошивки, виготовимо простий та надійний програматор, розглянемо процес прошивки та найголовніше проблеми, які можуть виникнути і не тільки у новачків.

Основні параметри деяких мікроконтролерів сімейства AVR:

Мікроконтролер

Пам'ять FLASH

Пам'ять ОЗУ

Пам'ять EEPROM

Порти введення/виводу

U харчування

Додаткові параметри МК AVR mega:

Робоча температура: -55 ... +125 * С
Температура зберігання: -65 ... +150 * С
Напруга на виводі RESET щодо GND: max 13В
Максимальна напруга живлення: 6.0В
Максимальний струм лінії введення/виводу: 40мА
Максимальний струм по лінії живлення VCC та GND: 200мА

Розміщення висновків моделей ATmega 8X

Розміщення висновків моделей ATmega48x, 88x, 168x

Розміщення висновків у моделей ATmega8515x

Розміщення висновків у моделей ATmega8535x

Розміщення висновків у моделей ATmega16, 32x

Розміщення висновків у моделей ATtiny2313

Наприкінці статті прикріплено архів з датташитами на деякі мікроконтролери.

Настановні FUSE біти MK AVR

Запам'ятайте, запрограмований фьюз – це 0, не запрограмований – 1. Обережно варто ставитись до виставлення ф'юзів, помилково запрограмований ф'юз може заблокувати мікроконтролер. Якщо ви не впевнені, який саме фьюз потрібно запрограмувати, краще на перший раз прошийте МК без фьюзів.

Найпопулярнішими мікроконтролерами у радіоаматорів є ATmega8, потім йдуть ATmega48, 16, 32, ATtiny2313 та інші. Мікроконтролери продаються в TQFP корпусах та DIP, новачкам рекомендую купувати у DIP. Якщо купите TQFP, буде проблематичніше їх прошити, доведеться купити або паяти плату т.к. у них ніжки розташовуються дуже близько одна від одної. Раджу мікроконтролери в DIP корпусах, ставити на спеціальні панельки, це зручно і практично, не доведеться випоювати МК якщо закортить перепрошити, або використовувати його для іншої конструкції.

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

Для програмування використовується 6 висновків:
RESET- Вхід МК
VCC- Плюс харчування, 3-5В, залежить від МК
GND- Загальний провід, мінус харчування.
MOSI- Вхід МК (інформаційний сигнал у МК)
MISO- Вихід МК (інформаційний сигнал із МК)
SCK- Вхід МК (тактовий сигнал МК)

Іноді ще використовують виводи XTAL 1 і XTAL2, на ці висновки чіпляється кварц, якщо МК буде працювати від зовнішнього генератора, ATmega 64 і 128 виводу MOSI і MISO не застосовуються для ISP програмування, замість них виведення MOSI підключають до ніжки PE0, a MISO до PE1. При з'єднанні мікроконтролера з програматором, що з'єднують дроти повинні бути якомога коротшими, а кабель, що йде від програматора на порт LPT, так само не повинен бути занадто довгим.

У маркуванні мікроконтролера можуть бути незрозумілі літери з цифрами, наприклад Atmega 8L 16PU, 8 16AU, 8A PU та ін. Літера L означає, що МК працює від нижчої напруги, ніж МК без літери L, зазвичай це 2.7В. Цифри після дефісу або пробілу 16PU або 8AU говорять про внутрішню частоту генератора, який є в МК. Якщо фьюзи виставлені на роботу від зовнішнього кварцу, кварц повинен бути встановлений на частоту, що не перевищує максимальну за даташит, це 20МГц для ATmega48/88/168, і 16МГц для інших атмег.


Top