Програмиране на avr микроконтролери на C. Програмиране на AVR микроконтролери в C. И така, какво е микроконтролер

Реших да напиша кратка уводна статия за тези, които за първи път се занимават с програмиране на микроконтролери и никога преди не са били запознати с езика C. Няма да навлизаме в подробности, ще говорим за всичко малко, за да добием обща представа за работата с CodeVisionAVR.

| Повече ▼ подробна информацияможете да видите на английски в Ръководството за потребителя на CodeVision, а също така препоръчвам сайта http://somecode.ru с видео уроци по C за микроконтролери и книгата „Как да програмираме на C“ от Deitel, това е единствената добра книга с което аз самият започнах.

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

Самият фърмуер има разширение .hex и представлява набор от инструкции, под формата на единици и нули, които са разбираеми за микроконтролера. Откъде мога да взема фърмуера? Можете да го изтеглите от уебсайтове за електроника или да го напишете сами. Можете да го напишете в специални програми, наречени среда за разработка. Най-известните ми са AVR Studio, IAR, CodeVision, WinAVR... Невъзможно е да се каже коя от тези среди е по-добра или по-лоша, всеки сам. Можем да кажем, че тези програми се различават основно по удобство, програмен език и цена. В рамките на този сайт се взема предвид само CodeVision.

Подредихме средата, сега нека да разгледаме процеса на писане на фърмуер. В CodeVision първо трябва да създадете проект. Може да бъде създаден с помощта на съветника за код или празен. Във всеки случай трябва да изберете вида на използвания микроконтролер и да посочите неговата честота. Когато използвате съветника, ще бъдете помолени да изберете първоначални настройки и да генерирате изходен код с настройките. След това ще се появи прозорец, в който можете да редактирате този код. Въпреки че можете да напишете своя изходен код в Notepad и след това да го прикачите към проекта в настройките.

Файлът с изходен код е набор от команди на език за програмиране, задачата на CodeVision е да преведе тези команди в двоичен код, вашата задача е да напишете този изходен код. CodeVision разбира езика C, файловете с изходен код имат разширение „.c“. Но CodeVision има някои конструкции, които не се използват в C, поради което много програмисти не го харесват и използваният език се нарича C-подобен. Това обаче не пречи да пишете сериозни проекти. Много примери, генератор на код и голям набор от библиотеки дават голямо предимство на CodeVision. Единственият минус е, че е платен, въпреки че има безплатни версиис ограничение на кода.

Изходният код трябва да съдържа заглавка с вида на използвания микроконтролер и основната функция. Например се използва ATtiny13

#включи void main(void) ( ) ;

#включи void main(void) ();

Преди основната функция можете да свържете необходимите библиотеки, да декларирате глобални променливи, константи и настройки. Библиотеката е отделен файл, обикновено с разширение „.h“, който вече съдържа предварително написан код. В някои проекти може да се нуждаем от този код, но в други не се нуждаем от него. Например в един проект използваме LCD дисплеи, а в друг не. Можете да свържете библиотеката за работа с LCD дисплей “alcd.h” така:

#включи #включи void main(void) ( ) ;

#включи #включи 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 unsigned long int от 0 до 4294967295 float от ±1.1 7 5e- 38 до ±3.402e38

Вътре в основната функция основната програма вече работи. След като изпълни функцията, програмата ще спре, така че те правят безкраен цикъл 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 - иначе

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

Има и оператор за сравнение “==”, който не трябва да се бърка с “=” assign. Обратната операция не е равна на "!=", да речем

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 е натиснат( ако (i== 0 ) //ако i==0 разреши PB0( PORTB.0= 1 ; ) ако (i== 5 ) // ако i==5 разреши PB1( PORTB.1= 1 ; ) ) … ако (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) //if i==0 включете PB0 ( PORTB.0=1; ) if( i==5) // if 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(); след това ще скочи във функцията и ще изпълни кода вътре. Съгласете се, кодът е по-компактен и по-ясен, т.е. функциите помагат да се замени един и същ код, само един ред. Моля, обърнете внимание, че функцията е декларирана извън основния код, т.е. преди основната функция. Можете да кажете защо имам нужда от това, но докато изучавате уроците, често ще срещнете функции, например изчистване на LCD екрана lcd_clear() - функцията не приема никакви параметри и не връща нищо, но изчиства екран. Понякога тази функция се използва почти на всеки друг ред, така че икономиите на код са очевидни.

Изглежда много по-интересно да се използва функция, когато тя приема стойности, например има променлива c и има функция сума, която приема две стойности от тип int. Когато основната програма изпълни тази функция, аргументите вече ще бъдат в скоби, така че "a" ще стане равно на две, а "b" ще стане равно на 1. Функцията ще бъде изпълнена и "c" ще стане равно на 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 дисплея lcd_gotoxy(0,0); който, между другото, също приема аргументи - x и y координати.

Друг вариант за използване на функция, когато тя върне стойност, сега тя вече няма да бъде празна, нека подобрим предишния пример на функция за събиране на две числа:

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, но имайте предвид, че присвояваме на променливата „c“ стойността на функция, която вече не е void, но връща сумата от две числа от тип int. По този начин не сме обвързани с конкретна променлива „c“, което добавя гъвкавост при използването на функциите. Прост пример за такава функция е четене на ADC данни, функцията връща измерената стойност result=read_adc();. Да приключим с функциите.

Сега да преминем към масивите. Масивът е свързани променливи. Например, имате синусова таблица с няколко точки, няма да създавате променливи int sinus1=0; int sinus2=1; и т.н. За това се използва масив. Например, можете да създадете масив от три елемента като този:
int sinus=(0,1,5);
Общият брой на елементите на масива е посочен в квадратни скоби. Можете да присвоите стойността на третия елемент на променливата "c" по следния начин:
с=синус;
Моля, обърнете внимание, че номерирането на елементите на масива започва от нула, т.е. "c" ще стане равно на пет. Този масив няма синусов елемент!!!
Можете да присвоите стойност на отделен елемент по следния начин:
синус=10;

Може би вече сте забелязали, че CodeVision няма низови променливи. Тези. не можете да създадете променлив низ hello=”hello”; За да направите това, ще трябва да създадете масив от отделни знаци.

lcd_putchar(здравей); lcd_putchar(здравей); lcd_putchar(здравей);

и т.н.
Оказва се доста тромаво, тук на помощ идват циклите.
Например цикъл while

докато (PINB.0!=0) ( )

Докато не бъде натиснат бутона, не правете нищо - стартирайте празен цикъл.

Друг вариант е for цикълът

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

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

Значението е абсолютно същото като това на while, добавят се само първоначалното условие i=0 и условието, което се изпълнява всеки цикъл i++. Кодът вътре в цикъла е максимално опростен.

След като напишете вашата програма, изходният код се компилира и ако няма грешки, ще получите желания фърмуер в папката на проекта. Сега можете да флашнете микроконтролера и да се насладите на работата на устройството.

Не трябва веднага да се опитвате да използвате цикли, масиви и функции във вашия фърмуер. Вашата основна задача е да накарате фърмуера да работи, така че го направете така, както ви е по-лесно и не обръщайте внимание на размера на кода. Ще дойде време, когато искате не само да напишете работещ код, но и да го напишете красиво и компактно. Тогава ще бъде възможно да се потопите в дебрите на езика C. За тези, които искат да овладеят всичко, отново препоръчвам книгата „Как да програмираме на C“, има много примери и задачи. Инсталирайте Visual Studio, създайте конзолно приложение win32 и практикувайте там до насита.

Урок 0.

И така, днес откриваме серия от уроци за програмиране на микроконтролери от семейството AVR.

Днес ще бъдат обсъдени следните въпроси:

  1. Какво е микроконтролер?
  2. Къде се използват микроконтролери?

Въведение.

Микроконтролерите са навсякъде. В телефони, перални машини, „умни домове“, машинни инструменти във фабрики, а също и в безброй други технически устройства. Широкото им използване прави възможно замяната на сложни аналогови схеми с по-компресирани цифрови.

И така, какво е микроконтролер?

Микроконтролер (Микроконтролер, MCU) - микросхема, предназначена за управление на електронни устройства. Можете да си го представите като прост компютър, способен да взаимодейства с външни устройства. Например отваряне и затваряне на транзистори, получаване на данни от температурни сензори, показване на данни на LCD екрани и т.н. В допълнение, микроконтролерът може да извършва различни обработки на входни данни, точно като вашия персонален компютър.

Тоест микроконтролерите ни предлагат почти неограничени възможности за управление на всякакви устройства, благодарение на наличието на I/0 портове (входно/изходни портове), както и възможността за тяхното програмиране.

Къде се използват микроконтролери?

  1. Домакински уреди (Перални, микровълнови печки и др.).
  2. Мобилни технологии (Роботи, роботизирани системи, комуникационно оборудване и др.).
  3. Индустриално оборудване (системи за управление на машини).
  4. Компютърни технологии (Дънни платки, системи за управление на периферни устройства).
  5. Развлекателно оборудване (Детски играчки, декорации).
  6. Транспорт (системи за управление на автомобилни двигатели, системи за сигурност)

Това не е пълен списък с приложения за микроконтролери. Често е много изгодно да се замени набор от контролни чипове с един микроконтролер, поради опростеното производство и намалената консумация на енергия.

Първи стъпки с AVR

AVR- семейство микроконтролери от Atmel.Те имат достатъчна производителност за повечето любителски устройства. Те също така се използват широко в индустрията.

Схематичната диаграма на програмиста на LPT порт е показана на фигурата. Като драйвер на автобуса използвайте микросхемата 74AC 244 или 74HC244 (K1564AP5), 74LS244 (K555AP5) или 74ALS244 (K1533AP5).

LED VD1 показва режима на запис на микроконтролера,

LED VD2 - четене,

LED VD3 - наличие на захранване на веригата.

Веригата поема напрежението, необходимо за захранване от ISP конектора, т.е. от програмируемото устройство. Тази схема е преработена програмна схема STK200/300 (добавени светодиоди за по-лесна работа), така че е съвместима с всички компютърни програмни програми, които работят с веригата STK200/300. За да работите с този програмист, използвайте програмата CVAVR

Програматорът може да бъде направен на печатна платка и поставен в корпуса на LPT конектора, както е показано на фигурите:




За да работите с програмиста, е удобно да използвате разширение на LPT порт, което е лесно да направите сами (например от кабел Centronix за принтер), основното е да не щадите проводниците за земята (18- 25 конекторни крака) или купете. Кабелът между програматора и програмируемия чип не трябва да надвишава 20-30 cm.

Побитовите операции се основават на логическите операции, които разгледахме по-рано. Те играят ключова роля при програмирането на AVR и други видове микроконтролери. Почти никоя програма не може без използването на битови операции. Преди това съзнателно ги избягвахме, за да улесним процеса на изучаване на програмирането на MK.

Във всички предишни статии програмирахме само I/O портове и не използвахме допълнителни вградени компоненти, например таймери, аналогово-цифрови преобразуватели, прекъсвания и други вътрешни устройства, без които MK губи цялата си мощност.

Преди да преминете към овладяването на вградените устройства на MK, трябва да научите как да контролирате или проверявате отделни битове на регистрите на AVR MK. Преди това извършвахме проверка или задавахме цифрите на целия регистър наведнъж. Нека да разберем каква е разликата и след това да продължим.

Побитови операции

Най-често, когато програмирахме AVR микроконтролери, ние го използвахме, тъй като е по-визуален в сравнение с и е добре разбран за начинаещи MK програмисти. Например, трябва да зададем само 3-тия бит на порт D. За да направим това, както вече знаем, можем да използваме следния двоичен код:

PORTD = 0b00001000;

С тази команда обаче задаваме 3-та цифра на единица и нулираме всички останали (0, 1, 2, 4, 5, 6 и 7-ма) на нула. Сега нека си представим ситуация, при която 6-ти и 7-ми бит се използват като ADC входове и в този момент сигнал от някакво устройство се получава на съответните MK пинове и ние използваме горната команда, за да нулираме тези сигнали. В резултат на това микроконтролерът не ги вижда и смята, че сигналите не са пристигнали. Следователно, вместо такава команда, трябва да използваме друга, която да зададе само 3-тия бит на единица, без да засяга останалите битове. За да направите това, обикновено се използва следната побитова операция:

PORTD |= (1<<3);

По-долу ще обсъдим неговия синтаксис подробно. А сега още един пример. Да кажем, че трябва да проверим състоянието на 3-тата цифра на PIND регистъра, като по този начин проверим състоянието на бутона. Ако този бит се нулира, тогава знаем, че бутонът е натиснат и след това се изпълнява кодът на командата, който съответства на състоянието на натиснатия бутон. Преди това щяхме да използваме следната нотация:

ако (PIND == 0b00000000)

(всеки код)

С негова помощ обаче проверяваме не само 3-тия бит, а всички битове на PIND регистъра наведнъж. Следователно, дори ако бутонът е натиснат и желаният бит се нулира, но в този момент се получи сигнал на някой друг щифт на порт D, съответната стойност ще бъде зададена на единица и условието в скобите ще бъде невярно. В резултат на това кодът във фигурните скоби няма да бъде изпълнен дори когато бутонът е натиснат. Следователно, за да проверите състоянието на отделен 3-ти бит от регистъра PIND, трябва да се използва побитова операция:

ако (~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; // резултат

За запис на един до няколко отделни бита наведнъж, например нулевия, шестия и седмия порт бПрилага се следната нотация.

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;

Проверка на състоянието на отделен бит. Нека ви напомня, че проверката (за разлика от писането) на I/O порт се извършва чрез четене на данни от PIN регистъра.

Най-често тестването се извършва чрез един от двата оператора за цикъл: if и while. Вече сме запознати с тези оператори по-рано.

Проверка на бита за наличие на логическа нула (нулиране) с ако

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

Ако третият бит на порт D е изчистен, тогава се изпълнява Code1. В противен случай се изпълнява Code2.

Подобни действия се извършват с тази форма на запис:

ако (~PIND & (1<<3))

Проверка на бита за наличие на логическа единица (настройка) с ако

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

ако (PIND & (1<<3))

Горните два цикъла работят по подобен начин, но могат, поради гъвкавостта на езика за програмиране C, да имат различна форма на нотация. Операторът != означава не е равно. Ако третият бит на PD I/O порта е зададен (един), тогава се изпълнява Code1; ако не, се изпълнява Code2.

Изчакване на бит за нулиране докато

докато (PIND & (1<<5))

Code1 ще се изпълнява, докато 5-ият бит на регистъра PIND е зададен. Когато го нулирате, Code2 ще започне да се изпълнява.

Изчаква се задаване на бит докато

Тук синтаксисът на C ви позволява да пишете код по два от най-често срещаните начини. На практика се използват и двата вида запис.

Микроконтролерите (наричани по-долу MK) твърдо влязоха в живота ни, в Интернет можете да намерите много интересни схеми, които се изпълняват на MK. Какво не можете да монтирате на MK: различни индикатори, волтметри, домакински уреди (защитни устройства, превключващи устройства, термометри ...), метални детектори, различни играчки, роботи и др. Списъкът може да отнеме много време. Видях първата схема на микроконтролер преди 5-6 години в радио списание и почти веднага обърнах страницата, мислейки си „Все още няма да мога да го сглобя“. Всъщност по това време МК бяха много сложно и неразбрано устройство за мен; нямах представа как работят, как да ги флашвам и какво да правя с тях в случай на неправилен фърмуер. Но преди около година за първи път сглобих първата си схема на MK; това беше верига с цифров волтметър, базирана на 7 сегментни индикатора и микроконтролер ATmega8. Случи се така, че купих микроконтролер случайно, когато стоях в отдела за радиокомпоненти, човекът пред мен купуваше MK и аз също реших да го купя и да се опитам да събера нещо. В моите статии ще ви разкажа за AVR микроконтролери, ще ви науча как да работите с тях, ще разгледаме програми за фърмуер, ще направим прост и надежден програмист, ще разгледаме процеса на фърмуера и, най-важното, проблемите, които могат да възникнат не само за начинаещи.

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

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

Флаш памет

RAM памет

EEPROM памет

I/O портове

U мощност

Допълнителни параметри на мега микроконтролера AVR:

Работна температура: -55…+125*С
Температура на съхранение: -65…+150*С
Напрежение на щифта RESET спрямо GND: максимум 13V
Максимално захранващо напрежение: 6.0V
Максимален I/O линеен ток: 40mA
Максимален захранващ ток VCC и GND: 200mA

Изводи на модела ATmega 8X

Pinouts за модели ATmega48x, 88x, 168x

Оформление на щифта за модели ATmega8515x

Оформление на щифта за модели ATmega8535x

Оформление на щифта за ATmega16, 32x модели

Оформление на щифта за модели ATtiny2313

В края на статията е приложен архив с таблици с данни за някои микроконтролери.

MK AVR инсталация FUSE битове

Не забравяйте, че програмиран предпазител е 0, а непрограмиран е 1. Трябва да внимавате, когато настройвате предпазители, неправилно програмиран предпазител може да блокира микроконтролера. Ако не сте сигурни кой предпазител трябва да програмирате, по-добре е да мигате MK без предпазители за първи път.

Най-популярните микроконтролери сред радиолюбителите са ATmega8, следвани от ATmega48, 16, 32, ATtiny2313 и др. Микроконтролерите се продават в пакети TQFP и DIP; за начинаещи препоръчвам да купуват в DIP. Ако купите TQFP, ще бъде по-проблематично да ги флашнете; ще трябва да закупите или запоите платката, защото краката им са разположени много близо един до друг. Съветвам ви да инсталирате микроконтролери в DIP пакети на специални гнезда, това е удобно и практично, не е нужно да разпоявате MK, ако искате да го презаредите или да го използвате за друг дизайн.

Почти всички съвременни MK имат възможност за вътрешносхемно програмиране на ISP, т.е. Ако вашият микроконтролер е запоен към платката, тогава за да сменим фърмуера, няма да се налага да го разпояваме от платката.

За програмиране се използват 6 пина:
НУЛИРАНЕ- Вход MK
VCC- Плюс захранване, 3-5V, зависи от MK
GND- Общ проводник, минус мощност.
MOSI- MK вход (информационен сигнал в MK)
MISO- MK изход (информационен сигнал от MK)
SCK- MK вход (тактов сигнал в MK)

Понякога те също използват щифтове XTAL 1 и XTAL2; кварцът е прикрепен към тези щифтове, ако MK се захранва от външен осцилатор; в ATmega 64 и 128 щифтовете MOSI и MISO не се използват за програмиране на ISP; вместо това щифтовете MOSI са свързан към пин PE0, а MISO към пин PE1. Когато свързвате микроконтролера към програмиста, свързващите проводници трябва да са възможно най-къси, а кабелът, преминаващ от програматора към LPT порта, също не трябва да е твърде дълъг.

Маркировката на микроконтролера може да съдържа странни букви с цифри, например Atmega 8L 16PU, 8 16AU, 8A PU и др. Буквата L означава, че MK работи при по-ниско напрежение от MK без буквата L, обикновено 2,7V. Числата след тирето или интервала 16PU или 8AU показват вътрешната честота на генератора, който е в MK. Ако предпазителите са настроени да работят от външен кварц, кварцът трябва да бъде настроен на честота, която не надвишава максимума според листа с данни, това е 20 MHz за ATmega48/88/168 и 16 MHz за други atmegas.


Връх