Програмирање на микроконтролери во C од нула. CodeVisionAVR. Општи информации за почетници во програмирање на јазикот C. Кој микроконтролер да се избере за работа

Некако веднаш се почувствував принуден да дадам совет за избор на програмска средина за AVR контролери. Само не ми фрлај влечки. Јас сум само малку :)

Постојат многу програмски јазици за микроконтролери. Има и доста програмски средини и не е точно да се споредуваат меѓу себе. Најдобри јазиципрограмирање не постои. Ова значи дека ќе треба да го изберете најсоодветниот јазик и програмска средина за вас.

Ако моментално се соочувате со избор на што да започнете да работите, тогаш еве неколку препораки за вас.

Претходно искуство со програмирање.Не го занемарувајте вашето претходно искуство со програмирање. Дури и да беше ОСНОВНО. Дури и да беше одамна на училиште. Програмирањето е како возење велосипед - штом ќе започнете, брзо се сеќавате на сè што сте заборавиле. Започнете со BASIC - совладајте го - подоцна ќе ви биде полесно да изберете нешто посоодветно за вашите цели.

Помош од околината.Дали твоите пријатели пишуваат на Паскал? Прашањето е решено за вас - пишете во Паскал! Тие секогаш ќе ви помогнат со совети, ќе ви даваат библиотеки и ќе ви дадат готови проекти за проучување. Во принцип, тие ќе бидат среќни да ви посакаат добредојде во нивната заедница. Ако го направите спротивното, ќе добиете спротивен резултат. Пријателите на индустријата на ЗНД ќе ве колваат ако одлучите да студирате Assembler. Не очекувајте помош.

Добра книга на AVR програмирање ќе помогне многу. За жал ги има многу малку. Ако наидете на книга и мислите дека се е објаснето на многу пристапен начин, пробајте ја. Не препорачувам да учите од е-книги; како последно средство, испечатете ги. Многу е незгодно да се префрлате помеѓу околината и текстот на датотеката со книга. Многу е попријатно да читате книга и да ја пробате веднаш, без да ве одвлекува вниманието со префрлање; покрај тоа, можете да правите белешки на маргините и да ги запишете идеите што се појавуваат.

Програмската средина е поедноставна.Ако има неколку програмски опкружувања од кои можете да изберете вашиот јазик, не двоумете се, изберете ја онаа што е поедноставна. Нека биде помалку функционален. Нека компајлира ужасно надуен код. Главната работа е само да започнете со работа. Откако ќе се чувствувате удобно во едноставно опкружување, можете лесно да се префрлите во понапредно и „правилно“ опкружување. И не ги слушајте оние кои велат дека ќе изгубите повеќе време - грешат. Од основците не се бара да читаат „Војна и мир“, им се даваат поедноставни книги - со слики.

Библиотеки.Достапноста на библиотеките е контроверзна за учење јазик. Се разбира, подоцна многу ќе го олеснат животот, но на почетокот библиотеките „Црна кутија“ се неразбирливи и навистина не придонесуваат за разбирање на јазикот. Од друга страна, тие го олеснуваат читањето на програмите и му овозможуваат на почетникот да изгради сложени програми без многу напор. Затоа, не се замарајте премногу за нивното присуство. Барем на почетокот.

Ефикасен код.Изборот на програмска средина за учење програмирање врз основа на тоа колку е ефикасен кодот што го компајлира е лоша идеја. Главната работа е да се чувствувате удобно кога ќе започнете да учите - она ​​што произлегува од тоа е десеттата работа. Се разбира, можете да работите на ова подоцна.

Волшебници.Секој уред на чипот треба да се конфигурира со помош на порти. Постапката е доста мачна и потребни се листови со податоци. Покрај тоа, постојат нијанси кои не се лесни за почетник да ги сфати. Затоа, многу е пожелно да има волшебници во околината. Vyzards се автоматски тјунери за SPI, I2C, USART итн. Колку повеќе уреди се поддржани, толку подобро. Ги поставувате потребните периферни параметри, а самиот волшебник генерира код кој ќе ги обезбеди наведените параметри. Го прави животот многу полесен.


Општи препоракитакво - програмирањето во почетната фаза треба да биде што е можно поедноставно (дури и примитивно). Програмското опкружување треба да биде лесно за учење (бидејќи прво треба да го совладате програмирањето и да не губите време мачејќи се со поставките). По можност русифициран. Руски прирачник и примероци на програми исто така би биле корисни. Пожелна е можноста за трепкање на кристалот од околината. Потоа, додека ги совладате основите на програмирањето, можете да преминете на посложени школки.


Последна препорака: работете со вистински кристал. Не плашете се да го запалите. Стекни практично искуство. Работата со емулатори (на пример Proteus), иако ќе ве ослободи од гужва со рачка за лемење, никогаш нема да може да ви го даде задоволството што ќе го добиете од работната програма и првото трепкање на ЛЕД! Разбирањето дека сте направиле вистински работен дијаграм со свои раце ви дава самодоверба и поттик да продолжите понатаму!

(Посетено 7.377 пати, 1 посета денес)

Здраво, драг Хабражител!

Во оваа статија сакам да зборувам за тоа како еднаш решив да започнам со програмирање на микроконтролери, што беше потребно за ова и што на крајот се случи.

Темата за микроконтролери ме интересираше многу одамна, далечната 2001 година. Но тогаш се покажа дека е проблематично да добијам програмер во моето место на живеење и немаше прашање да го купам преку Интернет. Морав да го одложам ова прашање до подобри времиња. И тогаш, еден убав ден, открив дека дошле подобри времиња без да заминам од дома, можам да купам се што ми треба. Решив да го пробам. Значи она што ни треба:

1. Програмер
Има многу опции на пазарот - од најевтините програмери на интернет провајдерите (програмирање во системот) за неколку долари, до моќни програмери-дебагери за неколку стотици. Немајќи многу искуство во ова прашање, прво решив да пробам еден од наједноставните и најевтините - USBasp. Го купив на eBay едно време за 12 долари, сега можете да го најдете дури и за 3-4 долари. Ова е всушност кинеска верзија на програмерот од Томас Фишл. Што можам да кажам за него? Само една работа - работи. Покрај тоа, поддржува доста AVR контролери од сериите ATmega и ATtiny. Под Linux не бара драјвер.

За да го трепкате фирмверот, треба да ги поврзете излезите на програмерот VCC, GND, RESET, SCK, MOSI, MISO со соодветните излези на микроконтролерот. За едноставност, го составив помошното коло директно на плочата за леб:

Лево на таблата е истиот микроконтролер што ќе го трепкаме.

2. Микроконтролер
Не се замарав многу со изборот на микроконтролер и го зедов ATmega8 од Atmel - 23 I/O пина, два 8-битни тајмери, еден 16-битен, фреквенција до 16 MHz, мала потрошувачка (1-3,6 mA) , евтини (2 долари). Во принцип, за почеток - повеќе од доволно.

Под Linux, комбинацијата avr-gcc + avrdude работи добро за компајлирање и вчитување на фирмверот на контролерот. Инсталацијата е тривијална. Следејќи ги упатствата, можете да го инсталирате целиот потребен софтвер за неколку минути. Единствената нијанса на која треба да обрнете внимание е дека avrdude (софтвер за снимање на контролорот) може да бара супер-кориснички права за пристап до програмерот. Решението е да го извршите преку sudo (не е многу добра идеја), или да регистрирате посебни права на udev. Синтаксата може да се разликува во различни верзии на ОС, но во мојот случај ( Linux Mint 15) работеше додавањето на следново правило во датотеката /etc/udev/rules.d/41-atmega.rules:

# USBasp програмер SUBSYSTEM=="usb", ATTR(idVendor)=="16c0", ATTR(idProduct)=="05dc", GROUP="plugdev", MODE="0666"

По ова, се разбира, треба да ја рестартирате услугата
рестартирање на услугата udev
Можете да компајлирате и да трепкате без проблеми директно од командна линија(кој би се сомневал), но ако има многу проекти, тогаш попогодно е да инсталирате додаток и да направите сè директно од околината Eclipse.

За Windows ќе мора да инсталирате драјвер. Во спротивно нема проблеми. Заради научен интерес, ја пробав комбинацијата AVR Studio + eXtreme Burner на Windows. Повторно, сè функционира одлично.

Ајде да започнеме со програмирање

AVR контролерите може да се програмираат и во асемблерот (AVR асемблерот) и во C. Тука, мислам, секој треба да направи свој избор во зависност од конкретната задача и неговите преференции. Лично, првпат почнав да се занимавам со асемблерот. При програмирање во асемблер, архитектурата на уредот станува појасна и добивате чувство дека навлегувате директно во внатрешноста на контролерот. Дополнително, верувам дека во програмите кои се особено критични по големина и перформанси, познавањето на асемблерот може да биде многу корисно. Откако се запознав со асемблерот AVR, дојдов до C.

Откако се запознав со архитектурата и основните принципи, решив да составам нешто корисно и интересно. Овде ќерка ми ми помогна, игра шах и една убава вечер рече дека сака да има тајмер за темпирани игри. БАМ! Еве ја - идејата за првиот проект! Можеш, се разбира, да ги нарачаш на eBay, но јас сакав да направам свој часовник, со црни... уф... индикатори и копчиња. Не порано, речено!

Беше одлучено да се користат два индикатори за диоди од 7 сегменти како дисплеј. За контрола, доволни беа 5 копчиња - „Плеер 1“, „Плеер 2“, „Ресетирање“, „Поставки“ и „Пауза“. Па, не заборавајте за звучната индикација за крајот на играта. Изгледа дека тоа е тоа. Сликата подолу покажува општ дијаграм за поврзување на микроконтролерот со индикатори и копчиња. Ќе ни треба кога го анализираме изворниот код на програмата:

Дебрифинг

Да почнеме, како што се очекуваше, од влезната точка на програмата - главната функција. Всушност, нема ништо извонредно во тоа - поставување порти, иницијализирање на податоците и бескрајна јамка на притискање на копчињата за обработка. Па, повикување на sei() - овозможување процесирање на прекини, повеќе за нив малку подоцна.

Int main(void) (init_io (); init_data (); sound_off (); sei (); while (1) ( handle_buttons (); ) return 0; )
Ајде да ја разгледаме секоја функција одделно.

Void init_io() ( // постави излез DDRB = 0xFF; DDRD = 0xFF; // постави влез DDRC = 0b11100000; // отпорници за повлекување PORTC |= 0b00011111; // тајмер го прекинува TIMSK = (1<

Поставувањето на I/O портите е многу едноставно - во регистарот DDRx е запишан број (каде x е буквата што ја означува портата), од кој секој бит значи дали соодветниот пин ќе биде влезен уред (одговара на 0) или излезен уред (одговара на 1). Така, со испраќање на бројот 0xFF на DDRB и DDRD, ги направивме излезните порти B и D. Според тоа, командата DDRC = 0b11100000; ги претвора првите 5 пинови од портата C во влезни пинови, а останатите во излезни пинови. PORTC команда |= 0b00011111; вклучува внатрешни отпорници за повлекување на 5 влезови на контролорот. Според дијаграмот, на овие влезови се поврзани копчиња, кои при притискање ги скратуваат до земјата. На овој начин контролорот разбира дека копчето е притиснато.

Следно доаѓа поставувањето на два тајмери, Timer0 и Timer1. Првиот го користиме за ажурирање на индикаторите, а вториот за одбројување на времето, откако претходно го конфигуриравме да пука секоја секунда. Детален опис на сите константи и методот за поставување на тајмерот на одреден интервал може да се најде во документацијата ATmega8.

Ракување со прекини

ISR (TIMER0_OVF_vect) ( дисплеј(); ако (_сирена > 0) ( _сирена--; ако (_сирена == 0) звук_исклучен(); ) ) ISR(TIMER1_COMPA_vect) (ако (Активен тајмер == 1 и и тајмер1 > 0) ( Тајмер 1--; ако (Тајмер1 == 0) process_timeoff(); ) ако (ActiveTimer == 2 && Timer2 > 0) ( Тајмер2--; ако (Тајмер2 == 0) process_timeoff(); ) )

Кога ќе се вклучи тајмерот, контролата се пренесува на соодветниот управувач со прекини. Во нашиот случај, ова е управувачот TIMER0_OVF_vect, кој ја повикува постапката за прикажување на времето на индикаторите и TIMER1_COMPA_vect, кој го обработува одбројувањето.

Излез на индикатори

Невалиден приказ() (приказ_број ((Тајмер1/60)/10, 0b00001000); _одложување_ms(0.25); приказ_број ((Тајмер1/60)% 10, 0b00000100); _одложено_ms (0.25); број_одложено_ms (0.25); број на_приказ (6% 1) , 0b00000010); _одложено_ms(0.25); број на прикажување ((Тајмер1%60)%10, 0b00000001); 60)%10, 0b01000000); _одложување_ms (0,25); приказ_број ((Тајмер2%60)/10, 0b00100000); = 0; ) неважечки приказ_број (int број, int маска) ( PORTB = број_маска (број); PORTD = маска; )

Функцијата за прикажување користи метод на динамично прикажување. Факт е дека секој поединечен индикатор има 9 контакти (7 за контрола на сегментот, 1 за точка и 1 за моќност). За контрола на 4 цифри, потребни се 36 контакти. Премногу расипничко. Затоа, излезот на цифри на индикатор со неколку цифри е организиран според следниот принцип:

Напонот наизменично се испорачува на секој од заедничките контакти, што ви овозможува да го означите саканиот број на соодветниот индикатор користејќи ги истите 8 контролни контакти. При доволно висока излезна фреквенција, на окото изгледа како статична слика. Затоа сите 8 контакти за напојување на двата индикатора на дијаграмот се поврзани со 8 излези на портата D, а 16 контакти за контрола на сегментот се поврзани во парови и поврзани со 8 излези на портата B. Така, функцијата на прикажување со задоцнување од 0,25 ms наизменично го прикажува саканиот број на секој од индикаторите . Конечно, сите излези што напојуваат напон на индикаторите се исклучени (наредба PORTD = 0;). Ако ова не е направено, тогаш последната прикажана цифра ќе продолжи да свети до следниот повик до функцијата за прикажување, што ќе доведе до негов посветол сјај во споредба со останатите.

Ракување со кликови

Празно рачка_копчиња() ( копче_рачка(KEY_SETUP); копче_рачка(KEY_RESET); копче_рачка(KEY_PAUSE); копче_рачка(KEY_PLAYER1); копче_рачка(KEY_PLAYER2); ) копче_рачка (KEY_PLAYER2); ) копче_рачка (КЕЈ_РЕСЕТ); = SETUP_BIT; пауза; случај KEY_RESET: бит = RESET_BIT; пауза; случај KEY_PAUSE: бит = PAUSE_BIT; пауза; случај KEY_PLAYER1: бит = PLAYER1_BIT; пауза; случај KEY_PLAYER2: бит = PLAYER2_BIT; е бришење; стандардно: BUTTON_PIN, бит)) ( ако (_притиснато == 0) ( _delay_ms(DEBOUNCE_TIME); if (bit_is_clear(BUTTON_PIN, bit)) ( _притиснато |= копче; // прекинувач за дејство на копче (клуч) (случај KEY_SETUP: process_setup(); пауза; случај KEY_RESET: process_reset(); break; case KEY_PAUSE: process_pause(); пауза; case KEY_PLAYER1: process_player1(); break; case KEY_PLAYER2: process_player2(); break; ) sound_on(15); ) ) ) друго ( _притиснато &= ~клуч;))

Оваа функција ги анкетира сите 5 копчиња за возврат и го обработува кликнувањето, доколку го има. Кликнувањето се регистрира со проверка на bit_is_clear(BUTTON_PIN, bit) , т.е. копчето се притиска ако соодветниот влез е поврзан со земјата, што ќе се случи, според дијаграмот, кога ќе се притисне копчето. Потребно е доцнење од DEBOUNCE_TIME времетраење и повторена проверка за да се избегнат повеќекратни непотребни операции поради отскокнување на контактот. Зачувувањето на притиснато статус во соодветните битови од променливата _pressed се користи за да се спречи повторено активирање кога копчето ќе се притисне подолго време.
Функциите за обработка на кликовите се прилично тривијални и верувам дека не им се потребни дополнителни коментари.

Целосен текст на програмата

#define F_CPU 4000000UL #include #вклучи #вклучи #define DEBOUNCE_TIME 20 #define BUTTON_PIN PINC #define SETUP_BIT PC0 #define RESET_BIT PC1 #define PAUSE_BIT PC2 #define PLAYER1_BIT PC3 #define PLAYER2_BIT PC4 #define PLAYER2_BIT PC4_SETUP0bET 00000010 # define KEY_PAUSE 0b00000100 #define KEY_PLAYER1 0b00001000 #define KEY_PLAYER2 0b00010000 испарливи инт ActiveTimer = 0; испарливи int Тајмер1 = 0; испарливи int Тајмер2 = 0; испарливи int _buzzer = 0; испарливи int _притиснато = 0; // декларации на функции void init_io(); void init_data(); int број_маска (int num); void handle_buttons(); void handle_button(int key); void process_setup(); void process_reset(); void process_pause(); void process_timeoff(); void process_player1(); void process_player2(); void display(); void display_number (int маска, int број); void sound_on (int интервал); void sound_off(); // го прекинува ISR (TIMER0_OVF_vect) ( дисплеј(); ако (_сирена > 0) ( _сирена--; ако (_сирена == 0) sound_off(); ) ) ISR(TIMER1_COMPA_vect) ( ако (Активен тајмер == 1 и и тајмер1 > 0) ( Timer1--; if (Timer1 == 0) process_timeoff(); ) if (ActiveTimer == 2 && Timer2 > 0) ( Timer2--; if (Timer2 == 0) process_timeoff(); ) ) int main (void) ( init_io (); init_data (); sound_off (); sei (); while (1) ( handle_buttons (); ) return 0; ) void init_io () ( // постави излез DDRB = 0xFF; DDRD = 0xFF ; // поставете го влезот DDRC = 0b11100000; // отпорници за повлекување PORTC |= 0b00011111; // тајмерот го прекинува TIMSK = (1<5940 || Тајмер2 > 5940) ( Тајмер1 = 0; Тајмер 2 = 0; ) ) void process_reset() (init_data(); ) void process_timeoff() (init_data(); sound_on(30); ) void process_pause() ( ActiveTimer = 0; ) void process_player1() ( ActiveTimer = 2; ) void process_player2() ( ActiveTimer = 1; ) void handle_button(int key) ( int bit; прекинувач (клуч) ( case KEY_SETUP: bit = SETUP_BIT; break; case KEY_BIT: bit_RESET ; пауза; случај KEY_PAUSE: бит = PAUSE_BIT; пауза; случај KEY_PLAYER1: бит = PLAYER1_BIT; пауза; буква KEY_PLAYER2: бит = PLAYER2_BIT; пауза; стандардно: враќање; ) ако (бит_е_јасно(BUTTON_PIN, бит = ако (_притиснато)) 0) ( _delay_ms(DEBOUNCE_TIME); if (bit_is_clear(BUTTON_PIN, bit)) ( _притиснато |= копче; // прекинувач за дејство на копче (клуч) (случај KEY_SETUP: process_setup(); break; case KEY_RESET: process_reset(); break; случај KEY_PAUSE: process_pause(); break; case KEY_PLAYER1: process_player1(); break; case KEY_PLAYER2: process_player2(); break; ) sound_on(15); ) ) ) друго ( _притиснато &= ~копче; ) ) void handle_buttons () ( handle_button (KEY_SETUP); handle_button (KEY_RESET); handle_button (KEY_PAUSE); handle_button (KEY_PLAYER1); handle_button(KEY_PLAYER2); ) копче_рачка(KEY_PLAYER2); ) ; _delay_ms(0,25); display_number ((Timer1/60)%10, 0b00000100); _delay_ms(0.25); display_number((Timer1%60)/10, 0b00000010); _delay_ms(number%1(T display_imer 10, 0b00000001); _одложување_ms (0.25); приказ_број ((Тајмер2/60)/10, 0b10000000); %60)/10, 0b00100000); _delay_ms(0.25); display_number ((Timer2%60)%10, 0b00010000); _delay_ms(0.25); PORTD = 0; ) void display_number (int number, int-mask) (број); PORTD = маска; ) неважечки звук_вклучен (интервал) ( _звук = интервал; // стави го звучникот на високо ниво PORTC |= 0b00100000; ) неважечки звук_исклучен() ( // стави ниско игла на звучникот PORTC &= ~0b00100000; )

Прототипот беше склопен на даска за леб.

Лекција 0.

Така, денес отвораме серија лекции за програмирање на микроконтролери од семејството AVR.

Денес ќе се дискутираат следниве прашања:

  1. Што е микроконтролер?
  2. Каде се користат микроконтролерите?

Вовед.

Микроконтролерите се насекаде. Во телефони, машини за перење, „паметни домови“, машински алати во фабрики и во безброј други технички уреди. Нивната широка употреба овозможува да се заменат сложените аналогни кола со покомпресирани дигитални.

Значи, што е микроконтролер?

Микроконтролер (Единица за микро контролер, MCU) - микроколо дизајнирано да контролира електронски уреди.Можете да го замислите како едноставен компјутер способен за интеракција со надворешни уреди.На пример, отворање и затворање на транзистори, примање податоци од температурни сензори, прикажување податоци на LCD екрани итн. Покрај тоа, микроконтролерот може да врши разновидна обработка на влезните податоци, исто како и вашиот персонален компјутер.

Односно, микроконтролерите ни нудат речиси неограничени можности за контролирање на сите уреди, благодарение на присуството на I/0 порти (влезни/излезни порти), како и можноста за нивно програмирање.

Каде се користат микроконтролерите?

  1. Апарати за домаќинство (машини за перење, микробранови печки, итн.).
  2. Мобилна технологија (Роботи, роботски системи, комуникациска опрема итн.).
  3. Индустриска опрема (системи за контрола на машини).
  4. Компјутерска технологија (матични плочи, системи за контрола на периферни уреди).
  5. Опрема за забава (детски играчки, украси).
  6. Транспорт (системи за контрола на моторот на автомобилот, безбедносни системи)

Ова не е комплетна листа на апликации за микроконтролери. Често, многу е профитабилно да се замени сет на контролни чипови со еден микроконтролер, поради поедноставеното производство и намалената потрошувачка на енергија.

Започнување со AVR

AVR- семејство на микроконтролери од Atmel.Имаат доволни перформанси за повеќето аматерски уреди. Тие исто така се широко користени во индустријата.

Постојат различни програмски јазици за AVR микроконтролери, но можеби најпогодни се асемблер и C, бидејќи овие јазици најдобро ги имплементираат сите потребни способности за управување со хардверот на микроконтролерот.

Јазикот за склопување е програмски јазик на ниско ниво кој користи директни инструкциски сет на микроконтролерот. Создавањето програма на овој јазик бара добро познавање на командниот систем на програмибилниот чип и доволно време за развивање на програмата. Јазикот на собранието е инфериорен во однос на C во брзината и леснотијата на развој на програмата, но има забележителни предности во големината на конечниот извршен код и, соодветно, брзината на неговото извршување.

C ви овозможува да креирате програми со многу поголема удобност, давајќи му на развивачот сите придобивки од јазикот на високо ниво.
Треба да се напомене уште еднаш дека архитектурата и командниот систем на AVR се создадени со директно учество на развивачите на компајлерот на јазикот C и ги зема предвид карактеристиките на овој јазик. Составувањето на изворниот код C е брзо и произведува компактен, ефикасен код.

Главните предности на C во однос на асемблерот: голема брзина на развој на програмата; универзалност што не бара темелно проучување на архитектурата на микроконтролерот; подобра документабилност и читливост на алгоритмот; достапност на функционални библиотеки; поддршка за пресметки со подвижна запирка.

Јазикот C хармонично ги комбинира програмските способности на ниско ниво со својствата на јазикот на високо ниво. Способноста за програмирање на ниско ниво ви овозможува лесно да работите директно на хардверот, а својствата на јазикот на високо ниво ви овозможуваат да креирате лесно читлив и модифициран програмски код. Покрај тоа, скоро сите C компајлери имаат можност да користат асемблер инсерти за пишување програмски секции кои се критични во однос на времето на извршување и потрошувачката на ресурси.

Со еден збор, C е најзгодниот јазик и за почетници кои се запознаваат со AVR микроконтролери и за сериозни програмери.

Компајлерите се користат за конвертирање на изворниот код на програмата во датотека на фирмверот на микроконтролерот.

Atmel обезбедува моќен компајлер за склопување кој е вклучен во развојната околина на Atmel Studio што работи на Windows. Заедно со компајлерот, развојната околина содржи дебагер и емулатор.
Atmel Studio е потполно бесплатно и достапно на веб-страницата на Atmel.

Во моментов, има доста C компајлери за AVR. Најмоќен од нив се смета за компајлерот од IAR Systems од Стокхолм. Тоа беа нејзините вработени кои учествуваа во развојот на командниот систем AVR во средината на 90-тите. IAR C компајлерот има широки можности за оптимизација на кодот и доаѓа како дел од интегрираната развојна околина на IAR Embedded Workbench (EWB), која исто така вклучува асемблер компајлер, поврзувач, проект и менаџер на библиотека и дебагер. Цената на целосната верзија на пакетот е 2820 ЕУР. На веб-страницата на компанијата можете да преземете бесплатна верзија за евалуација за 30 дена или неограничена верзија со ограничување на големината на кодот од 4 KB.

Американската компанија Image Craft од Пало Алто, Калифорнија произведува компајлер за јазик C кој се здоби со доста широка популарност. JumpStart C за AVR има прифатлива оптимизација на кодот и не премногу висока цена (од 50 до 499 долари во зависност од верзијата). Демо верзијата на JumpStart C за AVR е целосно функционална 45 дена.

Романскиот компајлер Code Vision AVR C се здоби со не помала популарност, цената на целосната верзија на овој компајлер е релативно ниска и изнесува 150 евра. Компајлерот доаѓа со интегрирано развојно опкружување, кое, покрај стандардните функции, вклучува и прилично интересна карактеристика - CodeWizardAVR Automatic Program Generator. Присуството на сериски терминал во развојната средина ви овозможува да ги дебагирате програмите користејќи ја сериската порта на микроконтролерот. Можете да преземете бесплатна верзија за евалуација од програмерите со ограничување на големината на кодот од 4 KB и оневозможено зачувување на генерираниот изворен код во C.

Компанијата MikroElektronika, лоцирана во српскиот град Белград, произведува цело семејство компајлери за AVR микроконтролери. Компајлер за јазикот C наречен mikroC PRO за AVR чини 249 долари. За истата цена има и mikroBasic и mikroPascal. Постојат демо верзии на веб-страницата на програмерите со ограничување на големината на кодот од 4096 бајти. Предноста на оваа фамилија на компајлери е единствена платформа и единствена идеологија, што може да обезбеди лесна транзиција не само помеѓу јазиците, туку и помеѓу микроконтролерите (постојат верзии на компајлери за PIC, STM32, 8051...).

Интегрираната развојна средина стана навистина иконична. Вклучува моќни компајлери C и асемблер, програмер AVRDUDE, дебагер, симулатор и многу други придружни програми и алатки. WinAVR беспрекорно се интегрира со развојната околина на Atmel AVR Studio. Асемблерот е идентичен во влезниот код со асемблерот AVR Studio. Компајлерите C и асемблер имаат можност да креираат датотеки за дебагирање во формат COFF, што ви овозможува да користите не само вградени алатки, туку и да го користите моќниот симулатор AVR Studio. Друга важна предност е што WinAVR се дистрибуира бесплатно без ограничувања (производителите ја поддржуваат GNU General Public License).

Како резиме, вреди да се каже дека WinAVR е идеален избор за оние кои почнуваат да ги совладаат микроконтролерите AVR. Токму оваа развојна средина се смета за главна во овој курс.

Киселев Роман, мај 2007 г Написот е ажуриран на 26 мај 2014 година

Значи, што е микроконтролер (во натамошниот текст MK)? Ова е, релативно кажано, мал компјутер сместен во едно интегрирано коло. Има процесор (аритметичка логичка единица, или ALU), флеш меморија, EEPROM меморија, многу регистри, I/O порти, како и дополнителни ѕвона и свирки како тајмери, бројачи, компаратори, USART, итн. Откако ќе се вклучи напојувањето , микроконтролерот се подигнува и започнува со извршување на програмата зачувана во неговата флеш меморија. Во исто време, може да контролира широк спектар на надворешни уреди преку I/O порти.

Што значи тоа? Тоа значи дека во МК можете да имплементирате кое било логично коло кое ќе извршува одредени функции. Тоа значи дека МК е микроспој, чија внатрешна содржина, всушност, самите ја создаваме. Ова овозможува, откако купив неколку сосема идентични MK, да соберете сосема различни кола и уреди на нив. Ако сакате да направите какви било промени во работата на електронски уред, нема да треба да користите рачка за лемење, туку само да го репрограмирате MK. Во овој случај, дури и не треба да го отстраните од вашиот уред ако користите AVR, бидејќи овие MK поддржуваат програмирање во колото. Така, микроконтролерите го премостуваат јазот помеѓу програмирањето и електрониката.

AVR се 8-битни микроконтролери, односно нивниот ALU може да врши едноставни операции со само 8-битни броеви во еден такт циклус. Сега е време да разговараме за тоа кое МК ќе го користиме. Работам со ATMega16 MK. Тоа е многу честа појава и може да се купи во речиси секоја продавница за радио делови за околу 100 рубли. Ако не го најдете, тогаш можете да купите кој било друг МК од серијата MEGA, но во овој случај ќе треба да барате документација за него, бидејќи истите „нозе“ на различни МК можат да вршат различни функции, и откако ќе се поврзете, се чини дека ако сите заклучоци се точни, може да добиете работен уред, или можеби само облак од смрдлив чад. Кога купувате ATMega16, проверете дали доаѓа во големо пакување DIP со 40 пинови, а исто така купете му штекер во кој може да се вметне. За да работите со него, ќе ви требаат и дополнителни уреди: LED диоди, копчиња, конектори итн.

ATMega16 има многу голем број на различни функции. Еве некои од неговите карактеристики:

  • Максимална фреквенција на часовник – 16 MHz (8 MHz за ATMega16L)
  • Повеќето команди се извршуваат во еден такт циклус
  • 32 8-битни работни регистри
  • 4 целосни 8-битни I/O порти
  • два 8-битни тајмер/бројачи и еден 16-битен
  • 10-битен аналогно-дигитален конвертор (ADC)
  • внатрешен генератор на такт на 1 MHz
  • аналоген компаратор
  • интерфејси SPI, I2C, TWI, RS-232, JTAG
  • програмирање во коло и самопрограмирање
  • Модул за модулација на ширина на пулсот (PWM).

Целосните карактеристики на овој уред, како и упатството за нивна употреба, може да се најдат во референтната книга (Таточен лист) за овој МК. Точно, тоа е на англиски јазик. Ако знаете англиски, задолжително преземете го овој лист со податоци, тој содржи многу корисни информации.

Ајде конечно да се зафатиме со работа. Препорачувам да направите специјална табла за развој и дебагирање за микроконтролерот, на која можете да составите кое било електрично коло со микроконтролер без рачка за лемење (или речиси без него). Користењето на ваква табла во голема мера ќе ја олесни работата со МК и ќе го забрза процесот на учење на неговото програмирање. Изгледа вака:

Што ќе ви треба за ова?

Прво, ќе ви треба самата табла. Купив готов во продавница за делови за радио за 115 рубли. Потоа му ги залемив сите потребни делови. Резултатот е неверојатно удобна работа, на која можете да составите кое било електрично коло за неколку минути со поврзување на кабли и инсталирање на микроциркули и индикатори.

За поврзување на елементите на колото, многу е погодно да се користат кабли со конектори на краевите. Овие конектори се ставаат на „нозете“ што се штрчат до секоја порта на МК. Микроконтролерот треба да се вгради во штекерот, а не да се залеми на плочата, во спротивно ќе биде многу тешко да го извадите ако случајно го изгорите. Подолу е прегледот на ATMEGA16 MK:

Дозволете ни да објасниме за кои нозе сме заинтересирани сега.

  • VCC - тука се напојува (4,5 - 5,5 V) од стабилизиран извор
  • GND – земјата
  • RESET – ресетирање (при низок напон)
  • XTAL1, XTAL2 – тука е поврзан кварцен резонатор
  • PA, PB, PC, PD – влезно/излезни порти (A, B, C и D, соодветно).

Сè што произведува 7-11 V DC може да се користи како извор на енергија. За стабилна работа на МК потребно е стабилизирано напојување. Како стабилизатор, можете да користите микроциркуми од серијата 7805. Тоа се линеарни интегрирани стабилизатори, чиј влез се напојува со 7-11 V директна нестабилизирана струја, а излезот е 5 V стабилизирана струја. Пред и по 7805, треба да инсталирате кондензатори за филтри (електролитски за филтрирање на нискофреквентни пречки и керамика за висока фреквенција). Ако не можете да најдете стабилизатор, тогаш можете да користите батерија од 4,5 V како извор на енергија. МК мора да се напојува директно од неа.

Подолу е дијаграм на МК врската:

Ајде сега да откриеме што е што овде.

BQ1 е кварцен резонатор кој ја поставува работната фреквенција на МК. Можете да поставите која било до 16 MHz, но бидејќи планираме да работиме во иднина со COM порта, препорачувам да користите резонатори за следните фреквенции: 14,7456 MHz, 11,0592 MHz, 7,3725 MHz, 3,6864 MHz или 1,842 MHz ќе стане јасно зошто). Јас користев 11,0592 MHz. Јасно е дека колку е поголема фреквенцијата, толку е поголема брзината на уредот.

R1 е отпорник за повлекување кој одржува напон од 5 V на влезот RESET. Ниско напонско ниво на овој влез укажува на ресетирање. По ресетирањето, МК се подига (10 - 15 ms) и повторно започнува со извршување на програмата. Бидејќи ова е влез со висока импеданса, не можете да го оставите „да виси во воздух“ - малото подигање на него ќе доведе до неочекувано ресетирање на MK. Токму за ова служи R1. За сигурност, препорачувам и инсталирање на кондензатор C6 (не повеќе од 20 µF).

SB1 - копче за ресетирање.

Кварцниот резонатор и кондензаторот на филтерот C3 треба да се наоѓаат што е можно поблиску до МК (не подалеку од 5-7 см), бидејќи во спротивно може да се појават пречки во жиците, што ќе доведе до дефекти на МК.

Синиот правоаголник на дијаграмот го опишува самиот програмер. Удобно е да се направи во форма на жица, чијшто крај е вклучен во LPT портот, а другиот во одреден конектор до MK. Жицата не треба да биде претерано долга. Ако се појават проблеми со овој кабел (обично не, но сè може да се случи), ќе мора да го залемете адаптерот Altera ByteBlaster. Како да го направите ова е напишано во описот на програмерот AVReal.

Сега кога се занимававме со хардверот, време е да преминеме на софтверот.

Постојат неколку развојни околини за програмирање AVR. Прво, ова е AVR Studio - официјалниот програмски систем од Atmel. Ви овозможува да пишувате во асемблер и програми за дебагирање напишани во асемблирање, C и C++. IAR е комерцијален програмски систем во C, C++ и асемблерски јазик. WinAVR е компајлер со отворен код. AtmanAVR е програмски систем за AVR со интерфејс речиси ист како Visual C++ 6. AtmanAVR исто така ви овозможува да дебагирате програми и содржи многу помошни функции кои го олеснуваат пишувањето код. Овој програмски систем е комерцијален, но, според лиценцата, можете да го користите бесплатно еден месец.

Предлагам да се започне со работа со IAR како најтранспарентна развојна средина. Во IAR, проектот се креира целосно рачно; затоа, откако ќе завршите неколку проекти, веќе јасно ќе знаете што значи секоја линија на код и што ќе се случи ако ја промените. Кога работите со AtmanAVR, или ќе треба да користите претходно креиран шаблон, што е многу тежок и тешко разбирлив за лице без искуство, или да имате многу проблеми со датотеките за заглавија при составување на проектот од нула. Откако се занимававме со IAR, последователно ќе разгледаме други компајлери.

Значи, прво, земете малку IAR. Тоа е многу честа појава и неговото наоѓање не треба да биде проблем. Откако ќе ја преземете IAR 3.20 од некаде, инсталирајте го компајлерот/работното опкружување и стартувајте го. По ова можете да почнете да работите.

Откако ќе го стартувате IAR, изберете датотека/нов/работен простор, изберете ја патеката до нашиот проект и креирајте папка за неа и дајте му име, на пример, „Prog1“. Сега ајде да создадеме проект: Проект / Креирај нов проект…Ајде да го наречеме и „Prog1“. Десен-клик на насловот на проектот во дрвото на проектот и изберете „Опции“

Овде ќе го конфигурираме компајлерот за одредена МК. Прво, треба да го изберете типот на процесорот ATMega16 на табулаторот Target, проверете го полето за избор Овозможи дефиниции на битови во I/O-include датотеки на табулаторот Конфигурација на библиотеката (за да можете да ги користите имињата на битови на различни регистри на MK во програмскиот код ), и изберете го типот C библиотека таму /EU++. Во категоријата ICCAVR, треба да го проверите полето Овозможи поддршка за повеќе бајти на јазичето Јазик и да ја исклучите оптимизацијата на картичката Оптимизација (во спротивно ќе ја уништи нашата прва програма).

Следно, изберете ја категоријата XLINK. Овде треба да го одредите форматот на компајлираната датотека. Бидејќи сега поставуваме опции за режимот за отстранување грешки, како што е опишано во насловот, треба да добиеме датотека за отстранување грешки како излез. Подоцна ќе го отвориме во AVR Studio. За да го направите ова, треба да ја изберете екстензијата.cof, а типот на датотеката е ubrof 7.

Сега кликнете OK, а потоа сменете го Debug во Release.

Повторно одете во Опции, каде што сите параметри освен XLINK се поставени на исти. Во XLINK, сменете ја наставката во .hex, а форматот на датотеката во intel-standart.

Тоа е се. Сега можете да започнете да ја пишувате вашата прва програма. Направете нов извор/текст и внесете го следниот код во него:

#вклучи„iom16.h“ краток непотпишан int i; празнинаглавна( празнина) (DDRB = 255; PORTB = 0; додека(1) { ако(PORTB == 255) PORTB = 0; друго PORTB++; за(i=0; i

Датотеката „iom16.h“ се наоѓа во папката (C:\Program Files)\IAR Systems\Embedded Workbench 3.2\avr\inc. Ако користите друг MK, на пример, ATMega64, тогаш изберете ја датотеката „iom64.h“. Овие датотеки со заглавија складираат информации за МК: имињата на регистрите, битовите во регистрите и имињата на прекините. Секој поединечен пин на портата A, B, C или D може да дејствува или како влез или како излез. Ова го одредува Регистарот за насока на податоци (DDR). 1 ја прави ногата излез, 0 влез. Така, со поставување, на пример, DDRA = 13, ги правиме излезите „нога“ PB0, PB2, PB3, а останатите - влезови, бидејќи 13 во бинарно е 00001101.

PORTB е регистар кој ја одредува состојбата на пиновите на пристаништето. Откако напишавме 0 таму, го поставивме напонот на сите излези на 0 V. Потоа има бескрајна јамка. При програмирање на МК, тие секогаш прават бескрајна јамка во која МК врши некое дејство додека не се ресетира или додека не дојде до прекин. Во овој циклус тие пишуваат, како да е, „позадински код“, кој МК го извршува како последно нешто. Ова може да биде, на пример, прикажување информации на екранот. Во нашиот случај, содржината на регистарот PORTB се зголемува додека не се наполни. После тоа, сè започнува одново. Конечно, десет илјади циклус за јамка. Потребно е за да се формира видливо доцнење при префрлување на состојбата на портата Б.



Сега ја зачувуваме оваа датотека во проектната папка како Prog1.c, ја копираме датотеката iom16.h во проектната папка, избираме Project/Add Files и додаваме „iom16.h“ и „Prog1.c“. Изберете Release, притиснете F7, програмата се компајлира и треба да се појави пораката:


Вкупен број на грешки: 0
Вкупен број на предупредувања: 0

Еве фотографија од мојот програмер:

Преземете го програмерот AVReal. Копирајте го (AVReal32.exe) во папката Release/exe, каде што треба да се наоѓа датотеката Prog1.hex. Напојуваме со МК, го поврзуваме програмскиот кабел. Отворете го Far Manager (најзгодно е да го трепкате MK), одете во оваа папка, притиснете Ctrl+O. Бидејќи имаме сосема нов МК, се работиме

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

Не заборавајте да ја внесете точната фреквенција ако не користите 11059200 Hz! Во исто време, т.н осигурувачи – регистри кои ја контролираат неговата работа (употреба на внатрешен генератор, Jtag итн.). По ова, тој е подготвен да ја прими првата програма. На програмерот му е дадена користената LPT порта, фреквенцијата, името на датотеката и други како параметри (сите се наведени во описот на AVReal). Бираме:

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

Ако врската е точна, програмерот ќе пријави успешно програмирање. Нема гаранција дека ова ќе работи првиот пат (прв пат кога ќе ја повикате програмата). Јас самиот понекогаш се програмирам по втор пат. Можеби LPT-портата е неисправна или има пречки во кабелот. Ако се појават проблеми, внимателно проверете го вашиот кабел. Од мое искуство, знам дека 60% од дефектите се поврзани со недостаток на контакт на вистинското место, 20% со присуство на непотребен, а уште 15% со погрешно лемење на погрешно на погрешно нешто. Ако сè друго не успее, прочитајте го описот на програмерот и обидете се да изградите Byte Blaster.

Да претпоставиме дека сè работи за вас. Ако сега поврзете осум LED диоди во портата Б на МК (направете го ова со исклучен MK и препорачливо е да вклучите отпорници од 300-400 Ohm во серија со LED диодите) и напојувате, ќе се случи мало чудо - „ бран“ ќе помине низ нив!

© Киселев Роман
мај 2007 година


Врв