Програмиране MK от нулата. AVR програмиране

Някога не съм казвал, че проучването на МК трябва да започне с асемблера. Това беше посветено цял курс на сайта (въпреки че не е много последователен, но постепенно го разчитах на адекватен тип). Да, е трудно, резултатът няма да бъде на първия ден, но ще се научите да разбирате какво се случва във вашия контролер. Ще знаете как работи, а не на маймуната копирате източниците на други хора и се опитват да разберете защо изведнъж спря да работи. В допълнение, Si е много по-лесно да се изпреварват от средата на улицата, която ще излезе с вилици в най-неподходящия момент.

За съжаление всеки иска резултатът веднага. Затова реших да отида, на друга страна - да направя обучение на SI, но с шоуто на бельото му. Един добър програмист-вграждане винаги държи парчето си желязо за буря, без да й дава стъпка към стъпка без разрешение. Така ще бъде в началото на кода, тогава какво е родено от компилатора и как наистина работи всъщност :)

От друга страна, SI силна страна Това е код за преносимост. Ако, разбира се, пишете всичко правилно. Разделяне на професионалните алгоритми и техните реализации на желязо в различни части на проекта. След това, за да прехвърлите алгоритъма на друг MK, е достатъчно да се пренапише само интерфейсният слой, където всички жалби на жлезата са написани и оставят целия работен код, както е. И, разбира се, четливост. Източникът на източника на крила е по-лесно да се разбере на пръв поглед (въпреки че .. аз, например, не се грижа за това, което да флиртувате е най-малко SI, поне afm :)), но отново, ако пишете всичко правилно. С тези моменти ще обърна внимание и на внимание.

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

Първа програма за C за AVR

Избор на компилатор и монтаж на околната среда
За AVR има много различни C компилатори:
Първо от всичко IAR AVR C. - почти уникално признат като най-добрия компилатор за AVR, защото Самият контролер е създаден от близкия кооператор на Atmel и специалисти от IAR. Но за всичко, което трябва да платите. И този компилатор не е достатъчен от това, което е скъп търговски софтуер, той също притежава такива настройки за закуска, които просто вземат и компират в нея, трябва да се бърза. Наистина нямах приятелство с него, проектът беше пиян на странни грешки на етапа на свързване (по-късно разбрах, че това е крива на пукнатината).

Вторият идва Winavr gcc. - Мощен оптимизиращ компилатор. Пълен се отваря, кръстосана платформа, като цяло, всички радости на живота. Той също се интегрира перфектно в AVR Studio, което ви позволява да отстранявате отстраняване на грешки точно там, че адът е удобно. Като цяло го избрах.

Също така има CodeVision AVR C.- Много популярен компилатор. Той стана популярен във връзка с неговата простота. Работна програма Можете да получите в нея след няколко минути - майсторът на началния код е силно популяризирано, печат на инициализацията на всички видове уши. Честно казано, съжалявам с подозрение към него - по някакъв начин трябваше да разглобям прог, написан от този компилатор, някакъв вид, но не и кодът. Ужасно количество ненужни телевизионни и операции, което се излива в леки кодове и бавна скорост. Въпреки това, може би имаше грешка в ДНК написал оригиналния фърмуер. Плюс това иска пари. Не много като IAR, но забележим. И в Демозим не дава повече от 2KB код.
Разбира се, има, но ако откраднеш, така един милион, в смисъл на IAR :)

Има и CRAFT AVR C и Микрос от микроелектроника. Нито да използвате друга употреба, но тук SWG. Много оран МикромаскалСтопилката е ужасно удобна програма за програмиране и библиотека. Мисля, че микрокът няма да бъде по-лош, но и платен.

Както казах, аз избирам Winavr. По три причини: безплатно, тя е интегрирана в AVR Studio и е написано просто разбивка на готовия код за всички поводи.

Така че свалете се да инсталирате Winavr C и Avr Studio. След това студиото е поставено първо, отгоре, Winavr се преобръща и се прилепва към студиото под формата на плъгин. Силно препоръчвам да инсталирате Winavr накрая, нещо като c: winavr, като по този начин избягвате купчини проблеми с начините.

Създаване на проект
Така че, студиото е доставено, Si е закрепено, време е да опитате нещо да програмирате. Да започнем с прост, най-прост. Стартирайте студиото, изберете там нов проект, като компилатор AVR GCC и въведете името на проекта.

Отваря полето на работното място с празен * .c файл.

Сега той не предотвратява конфигурирането на показването на пътеки в разделите Studio. За това наклонената на:
Меню Инструменти - Опции - Общи - FileTabs и изберете "Само име на файл" в падащия списък. В противен случай ще бъде невъзможно да се работи - в раздела ще има пълен път на файла и няма да има повече от два раздела на екрана.

Настройка на проекта
Като цяло, създаването на приготвянето на всички зависимости ще бъдат описани. И това вероятно е правилно. Но аз израснах на напълно интегриран IDE като uvision. или AVR Studio. Този подход е дълбоко чужд. Затова ще направя по свой собствен начин, всички студиа.

Купчина в бутона със зъбно колело.


Това са настройките на вашия проект или по-скоро настройката на автоматичното поколение на файла. На първата страница просто трябва да въведете честотата, на която ще работи mk. Това зависи от предпазителите на битовете, така че ние вярваме, че честотата е 8000000gz.
Също така обърнете внимание на оптимизационния низ. Сега има - е оптимизиране по размер. Докато сте оставили, след това можете да се опитате да играете с този параметър. -O0 изобщо е подвижна оптимизация.

Следващата стъпка е да конфигурирате пътища. Първото нещо, което трябва да добавите директорията на вашия проект, има - ще поставите библиотека от трета страна там. Списъкът ще се появи ". \\ T

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


Това е всичко. Джим навсякъде добре и отидете при източника.

Формулиране на проблема
Празният лист е толкова махнал да въплъщава някаква сложна идея, тъй като баналната мигаща на диода не вмъква. Нека веднага да вземем бик за рога и да приложим връзка с компютъра - това е първото нещо, което правя.

Тя ще работи така:
При пристигането на COM порта, устройството (код 0x31) ще запали диодида и когато пристигането на нула (код 0x30) е погасено. Освен това всичко ще бъде направено при прекъсвания и фоновата задача ще мига друг диод. Просто и със значение.

Съберете схемата
Трябва да свържем USB-USART конверторния модул с микроконтролера USART преобразуватели. За да направите това, вземете джъмпер от две окабеляване и поставете кръста в щифтовете на кръста. Това означава, че RX контролерът се свързва с TX конвертора и TX конвертора с RX контролера.

Оказва се, че в резултат на това това е такава схема:


Свързване на други заключения, хранене, освобождаване, е стандартно

Пишем код

Незабавно направете резервация, че няма да се задълбочавам конкретно в описанието на самия език на SI. За това има просто огромно количество материал, вариращ от класиката "SI програмиране на език" от K & R и завършва с различни техники.

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

Наистина няма цялата глава, но мисля, че не е дълго.

Малко вероятно е да опиша по-добре, така че от курса на обучение, вместо подробна експозиция на сините тънкости, просто ще дам директни връзки към определени страници на тази техника.

Добавете библиотеки.
На първо място, добавяме необходимите библиотеки и заглавия с дефиниции. В края на краищата, SI е универсален език и той трябва да обясни, че работим с AVR, така че влезте в изходния ред:

1 #Include.

#Include.

Този файл е в папката Winavr. Той съдържа описание на всички регистри и пристанища на контролера. И има всички хитрост, по отношение на определен контролер, който се предава от компилатора чрез язвителност Файл в параметъра MCU. И на базата на тази променлива във вашия проект, заглавния файл с описание на адресите на всички портове и регистри е на този контролер. В това как! Без него също е възможно, но тогава няма да можете да използвате символичните имена на регистрите като SREG или UDR и трябва да запомните адреса на всеки като "0xc1", и това е глава.

Самия един и същ екип #Include.<имя файла> Позволява ви да добавите към проекта съдържанието на всеки текстов файл, например, файл, описващ функциите или част от друг код. И така, че директивата да намери този файл, посочихме начини към нашия проект (Winavr Directory вече е изписан там).

Главна функция.
Програмата в езика на SI се състои от функции. Те могат да бъдат вградени и да бъдат донесени един от друг по всякакъв ред и по различни начини. Всяка функция има три необходими параметъра:

  • Наръчна стойност, например, sIN (x) Връща стойността на X sinus. Както в математиката, накратко.
  • Предавани параметри, същият X.
  • Функция на тялото.

Всички предавани и върнати стойности трябва да бъдат всеки тип, в зависимост от данните.

Всяка програма за C трябва да съдържа функция основно. Като точка на влизане в основната програма, в противен случай не е nifiga не si :). Според присъствието на главен източник на някой друг от един милион файлове, може да се разбере, че това е ръководителят на програмата, където всичко започва. Така че нека попитаме:

1 2 3 4 5 Int main (void) (връщане 0;)

int main (void) (връщане 0;)

Всичко, първата най-проста програма е написана, няма значение, че тя не прави нищо, просто започнахме.

Ще анализираме това, което направихме.
int. Този тип данни, които основната функция се връща.

Разбира се, в микроконтролер основно. Не мога да върна нищо по принцип и на теория трябва да бъде void main (void)Но GCC първоначално е изострян на компютъра и там програмата може да върне стойността на операционната система при завършване. Следователно gcc void main (void) Кълнене на предупреждение.

Това не е грешка, тя ще работи, но аз не обичам препис.

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

Това са { } Фигурите са софтуерни блокове, в този случай функцията на тялото основно.Ще има код.

връщане. - Това е връщащата стойност, която основната функция ще даде при завършване, тъй като ние сме INT, т.е. броя, който трябва да върнем номера. Въпреки че все още няма смисъл, защото На микроконтролера от главното, ние с изключение на нищото. Връщам нула. За нефиг. И компилаторът обикновено е интелигентен и кодът не генерира кода.
Въпреки че, ако се извращавате, тогава от основно. Можете да отидете на MC - например, да попаднете в секцията Bootloader и я изпълнете, но вече има бране на фърмуера на ниско ниво, за да коригира преходните адреси. По-долу ще видите и разберете как да го направите. За какво? Това е друг въпрос, в 99.999% от случаите, това не е необходимо :)

Направени по-далеч. Добавете променлива, не е особено необходима за нас и не е необходимо да се въвеждат променливи, но ние се учим. Ако променливите се добавят в тялото на функцията - тогава те са локални и съществуват само в тази функция. Когато напуснете функцията, тези променливи се отстраняват и паметта за RAM се дава на по-важни нужди. .

1 2 3 4 5 6 Int main (void) (неподписан char i; връщане 0;)

int main (void) (неподписан char i; връщане 0;)

неподписан. Толкова неизбежно. Факт е, че в двоичното представителство имаме старши бит за знака, което означава в един байт (char) числото + 127 / -128, но ако знакът се отхвърля, вече е от 0 до 255. Обикновено знакът е Не е необходимо. Така че неподписан..
i. - Това е само името на променливата. Няма повече.

Сега трябва да инициализирате портове и UART.. Разбира се, можете да вземете и свържете библиотеката и да се обадите на някакъв вид UARTINIT (9600); Но тогава няма да знаете какво се е случило в действителност.

Ние правим това:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Int main (void) (неподписан char i; #define xtal 8000000l #define baudrate 9600L #Define Bauddivider (xtal / (16 * baudrate) -1) #Define hi (x) (x) (x) \u003e\u003e 8) #define lo (x) ((x) & 0xff) ubrrl \u003d lo (bauddiver); Ubrrh \u003d hi (bauddiver); Ucsra \u003d 0; UCSRB \u003d 1.<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

int main (void) (неподписан char i; #define xtal 8000000l #define baudrate 9600L #define bauddiver (xtal / (16 * baudrate) -1) #define hi (x) (x) \u003e\u003e 8) #define lo ()) \\ t x) (x) & 0xff) ubrrl \u003d lo (buddivider); ubrrh \u003d hi (bauddivider); ucsra \u003d 0; ucsrb \u003d 1<

Страшен? Всъщност реалният код тук е само пет последици. Всичко, това #Define. Това е препроцесор на макроезика. Почти същите върхове, както в асемблера, но синтаксисът е малко по-различен.

Те ще улеснят рутинните ви операции за изчисляване на необходимите коефициенти. В първия ред казваме това вместо това Xtal. Можете спокойно да замените 80,000,000 и Л.- Спецификация на типа, дълъг мол е честота на процесора. Същото baudrate. - честота на данните от UART.

bauddivider. Вече по-сложно, изразът, изчислен по формулата от две предишни, ще бъде заместен.
Добре и Lo. и Здравей От този резултат ще отнеме по-младите и старши байтове, защото В един байт очевидно може да не се побере. В Здравей ICSE Shift се извършва (входният параметър на макроса) осем пъти вдясно, в резултат на това, само най-старият байт ще остане. А Б. Lo. В резултат на това правим партида и с номер 00FF, само най-младият байт ще остане.

Така че всичко това е направено като #Define. Можете спокойно да изхвърлите и желаните числа да се броят на калкулатора и веднага да ги въведете в UBBRL \u003d линиите .... и UBBRH \u003d ... ..

Мога. Но! Направите това Тя е категорично невъзможна!

Тя също ще работи за работа, но ще имате така наречените магически числа - Стойностите, взети неразбираемо от мястото, където не е ясно защо и ако дарявате такъв проект след няколко години, тогава е трудно да се разбере, че ще бъде проклето. Да, и сега, искате да промените скоростта или да промените честотата на кварца и всичко ще трябва да преизчислите, и така променяте няколко Циферок в кода и всичко сами. Като цяло, ако не искате да се наслаждавате на Bydlokoder, след това направете кода, така че да е лесно да се чете, той е разбираем и лесно променен.

Тогава всичко е просто:
Всички тези "UBRRL и CO" са регистри на конфигурацията на предавателя, с която ще общуваме със света. И сега сме назначили необходимите стойности, като конфигурираме желаната скорост и десния режим.

Изглед на запис 1< Означава следното: вземете 1 и го поставете на място Rxen. В мухата. Rxen. Това е четвъртият от регистъра UCSRB., така че 1< образува двоичен номер 00010000, TXEN. - това е 3-ти бит и 1< Dast 00001000. Single "| Счупено е ИЛИSO 00010000 | 00001000 \u003d 00011000. Останалите необходими битове за конфигуриране се показват по същия начин и се добавят към общата група. В резултат на това номерът на сглобяването е написан в UCSRB. Детайлите са написани в DAASHET на MC в раздела USART. Така че не се разсейвайте от технически подробности.

Готов е, че е време да видим какво се е случило. Пипове за компилация и пускане на емулация (Ctrl + F7).

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

Факт е, че първоначално всъщност тя стоеше на ред ubrrl \u003d lo (bauddiver); В края на краищата, фактът, че имаме, не е кодекс, но просто предварителни изчисления, тогава симулаторът закрепи малко. Но сега осъзна, първата инструкция е завършена и ако се изкачите в дърво I / O, В секцията USART и спечелете там на UBBRL байт, ще видите, че вече има вече! 0x33.

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

Откриване
Сега нулирайте симулацията в нула. Кликнете върху там Нулиране (Shift + F5). Отворете списъка с разглобяване, сега ще видите какво се случва в ректакала. Изглед -\u003e Разпределение. И не yyaaaa !!! Асемблер !!! Uzhos !!! Но ти трябва. Така че по-късно, когато нещо се обърка, не се осмеляваше в кода и не попиташе проблемите на Ламер на форумите и веднага се изкачи в загубата и наблюдаваше къде имате щанд. Там няма нищо ужасно.

Първо, това ще бъде върхът на серията:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +00000000: 940C002A JMP 0x0000002A скок 00000002: 940C0034 JMP 0x00000034 скок 00000004: 940C0034 JMP 0x00000034 скок 00000006: 940C0034 JMP 0x00000034 скок 00000008: 940C0034 JMP 0x00000034 скок + 0000000A: 940C0034 JMP 0x00000034 скок + 0000000C: 940C0034 JMP 0x00000034 скок + 0000000E: 940C0034 JMP 0x00000034 скок 00000010: 940C0034 JMP 0x00000034 скок 00000012: 940C0034 JMP 0x00000034 скок 00000014: 940C0034 JMP 0x00000034 скок 00000016: 940C0034 JMP 0x00000034 скок 00000018: 940C0034 JMP 0x00000034 скок + 0000001a: 940C0034 JMP 0x00000034 скок + 0000001C : 940C0034 JMP 0x00000034 скок + 0000001E: 940C0034 JMP 0x00000034 скок 00000020: 940C0034 JMP 0x00000034 скок 00000022: 940C0034 JMP 0x00000034 скок 00000024: 940C0034 JMP 0x00000034 скок 00000026: 940C0034 JMP 0x00000034 скок 00000028: 940C0034 JMP 0x00000034 скок

00000000: 940C002A JMP 0x0000002A скок 00000002: 940C0034 JMP 0x00000034 скок 00000004: 940C0034 JMP 0x00000034 скок 00000006: 940C0034 JMP 0x00000034 скок 00000008: 940C0034 JMP 0x00000034 скок + 0000000A: 940C0034 JMP 0x00000034 скок + 0000000C: 940C0034 JMP 0x00000034 скок + 0000000E : 940C0034 JMP 0x00000034 скок 00000010: 940C0034 JMP 0x00000034 скок 00000012: 940C0034 JMP 0x00000034 скок 00000014: 940C0034 JMP 0x00000034 скок 00000016: 940C0034 JMP 0x00000034 скок 00000018: 940C0034 JMP 0x00000034 скок + 0000001a: 940C0034 JMP 0x00000034 скок + 0000001C: 940C0034 JMP 0x00000034 скок + 0000001E: 940C0034 JMP 0x00000034 скок 00000020: 940C0034 JMP 0x00000034 скок 00000022: 940C0034 JMP 0x00000034 скок 00000024: 940C0034 JMP 0x00000034 скок 00000026: 940C0034 JMP 0x00000034 скок 00000028: 940C0034 JMP 0x00000034 скок

Това е таблицата на прекъсващите вектори. Ще се върнем към него, докато просто виждаме и помним, че е така. Първата колона е флаш адрес на светкавицата, в който командата лежи, вторият команден код на третия минмоничен екип, същата инструкция за асемблер, третия операнд на екипа. Е, автоматичен коментар.
Така че, ако погледнете, тогава има солидни преходи. И команден код на JMP е четири байта, той съдържа адреса на прехода, записан от назад - по-младия байт за по-младия адрес и кода на преходната команда 940C

0000002B: BE1F OUT 0x3F, R1 до I / O Местоположение

Записване на тази нула до 0x3F адрес Ако видите графата I / O View, тогава ще видите, че адресът на 0x3f е адресът на регистъра на регистъра на регистъра на SREG. Тези. Рестартираме SREG да стартира програмата при нулеви условия.

1 2 3 4 + 0000002C: E5CF LDI R28.0x5F натоварване Незабавно + 0000002D: E0D4 LDI R29.0x04 Товар Незабавно + 0000002E: BFDE OUT 0x3E, R29 до I / O Местоположение + 0000002F: BFCD OUT 0x3D, R28 до I / O Местоположение

0000002C: E5CF LDI R28.0x5F Зареждане Незабавно + 0000002D: E0D4 LDI R29.0x04 Товар Незабавно + 0000002E: BFDE OUT 0x3E, R29 до I / O Местоположение + 0000002F: BFCD OUT 0x3D, R28 до I / O Местоположение

Това е зареждането на указателя на стека. Регистрите директно в I / O не могат, само чрез междинния регистър. Ето защо, първите LDI в междинното съединение, а след това оттам в I / O. Аз също ще ви разкажа повече за стека. Междувременно е известно, че това е такава динамична зона на паметта, висяща в края на RAM и поддържа адреси и междинни променливи. Сега посочихме къде ще имаме стак.

00000032: 940C0041 JMP 0x00000041 скок

Направо към края на програмата Saaaeaeeee и там имаме забрана на прекъсванията и сама по себе си:

1 2 +00000041: 94F8 CLI Global прекъсване Деактивиране +00000042: cfff rjmp pc-0x0000 относителен скок

00000041: 94F8 CLI Global прекъсване Деактивиране +00000042: cfff rjmp pc-0x0000 относителен скок

Това е в случай на непредвидени обстоятелства, като например извеждане от основната функция. От такава линия, контролерът може да се покаже или с хардуерно нулиране, или това е вероятно, да се освободи от пазителното куче - Watchdog. Е, или, както казах по-горе, коригирайте тези места в шестнадесетичен редактор и маршрутизиране, където имаме душа. Също така обърнете внимание на факта, че има два вида JMP и RJMP преходи, първият преход към адреса. Отнема четири байта и може да направи директен преход в зоната на паметта. Вторият вид преход - RJMP - роднина. Неговият екип взема два байта, но преходът го прави от текущата позиция (адреси) с 1024 стъпки напред или назад. И в параметрите му се посочва компенсацията от текущата точка. Използвани по-често, защото Отнема два пъти по-малко място в флъш и дългите фактори рядко са необходими.

1 +000034: 940C0000 JMP 0x00000000 скок

00000034: 940C0000 JMP 0x00000000 скок

И това е скок в самото начало на кода. Рестартирайте един вид. Можете да проверите, всички вектори скачат тук. От този изход - ако ви позволи да разрешите прекъсвания (те са забранени по подразбиране) и ще бъдете прекъснати, но няма водач, тогава ще има RESET RESET - програмата ще хвърли програмата в самото начало.

Главна функция. Всичко е подобно, дори не можете да опишете. Изглеждат само до регистрите, които вече са изчислили номера. Превъзходна компилатор таксита !!! Така че няма "магически" номера!

1 2 3 4 5 6 7 8 9 10 11 12 <

00000036: E383 LDI R24.0x33 Натоварване Незабавно +000037: B989 OUT 0x09, R24 OUT до I / O Местоположение 15: Ubrrh \u003d Hi (Bauddivider); +000038: BC10 OUT 0x20, R1 до I / O Местоположение 16: UCSRA \u003d 0; +000039: B81B OUT 0x0B, R1 до I / O Местоположение 17: UCSRB \u003d 1<

И тук е JAMP:

1 2 3 + 0000003E: E080 LDI R24.0x00 натоварване Незабавно + 0000003F: E090 LDI R25.0x00 Товар Незабавно +00000040: 9508 RET Възвръщаемост на подпрограмата

0000003E: E080 LDI R24.0x00 натоварване Незабавно + 0000003F: E090 LDI R25.0x00 Товар Незабавно +00000040: 9508 RET Възвръщаемост на подпрограмата

Отдава се защо този компилатор добавя такъв Topmaster? И това не е нищо друго освен връщане 0, тогава сме идентифицирали като int main (void). Така че спечелих повече от четири байта, не разбирам какво :) и ако правите невалиден главен (празен), той ще бъде само ret, но Варинг ще бъде. Това, което казват, ние не връщаме нищо към основната функция. Като цяло, направете го като вас :)

Сложен? Изглежда не. Прескачам стъпка по стъпка в режим disassembler и pokery, тъй като процесорът изпълнява индивидуални инструкции, което се случва с регистрите. Как да се движите по команди и окончателно натрупване.

Продължаването следва след няколко дни ...

Offtop:
Alexei78. Банда за фиксиране на Firefox, улесняваща навигацията в моя сайт и форум.
Дискусия и изтегляне

За програмиране на AVR микроконтролери, има много инструменти за развитие, но най-популярните, несъмнено трябва да се признае пакет AVR Studio. . Има редица причини за такава популярност - това е безплатен пакет, разработен от компанията Atmel. , Той съчетава текстов редактор, асемблер и симулатор. Пакетът AVR Studio се използва и във връзка с фиксиращия хардуер. В предложения статия примерите разглеждат техниките за работа с пакет, който ще помогне на начинаещите програмисти да разберат взаимодействието на отделните компоненти на AVR Studio.

В следващата част на статията ще бъдат описани за отстраняване на грешки в средата на AVR Studio на програми, написани в SI.

Пакетът AVR Studio има солидна история на развитието, която се отразява в броя на съществуващите версии. В края на 2003 г. е освободен версия 4.08, която има редица полезни допълнения, а в началото на 2004 г. е освободен актуализация (услуга 1), добавяйки подкрепа за AVR-контролерите на третото поколение на ATMEGA48 семейство. Производството на чипове на това семейство е насрочено за втората половина на 2004 година.

Пакетът и сервизният пакет може да бъде изтеглен от www.atmel.com или да получи компактдиск с това разпространение от руския дистрибутор на Atmel.

Работата на пакета AVR Studio е удобно разгледана по всяка конкретна програма. Като мнение, ние ще обмислим създаването на проект за най-простата програма, която ще бъде на свой ред към леки два светодиода. За определеност, вземете микросисьор Atmega128. и свържете двата светодиода в заключенията 31 и 32 (това са бита 6 и 7 от пристанищния двор atmega128). AVR контролери Имате мощни изходни каскади, типичният ток на всеки изход е 20 mA, максималният изходен ток е 40 mA, и това се отнася както за течването, така и към течния ток. В нашия пример светодиодите са свързани към анодите към заключенията на контролера, а катодите през утичащите резистори са свързани към земята. Това означава, че светодиодът се запалва от подаването "1" към съответния изход на портове. Схематичната диаграма е показана на фигурата. Диаграмата показва и двата бутона, които ще се използват в една от програмите.

Тук е целесъобразно да се направи малка разлика при избора на тип чип за най-простия пример. Наистина, на пръв поглед, може да изглежда странно, защо се нуждаете от такъв мощен кристал в 64-пинов случай, където има достатъчно 8-пинов чип ATTINY12. ? Въпреки това, в този подход има логика. Известно е, че в сърцето на почти всеки AVR контролер е същата ядро. Чрез и големи, контролерите се различават в паметта, броя на I / O портовете и набор от периферни модули. Характеристики на всеки специфичен контролер - обвързващо логическо име / изходни регистри на физически адреси, адреси на прекъсвания вектори, идентифициране на пристанищни битове и др. Описва във файлове с разширение.Инко, които са включени в пакета AVR Studio. Следователно, използвайки специфичен тип кристал, можете да отстраните вниманието на програмата за нея и за всеки по-малък кристал. Освен това, ако използвате най-старши кристал като отстраняване на грешки, днес е atmega128, можете да отстраним програма за почти всеки AVR контролер, просто трябва да използвате хардуерни ресурси, които липсват от целевия микроконтролер. Така например можете да дебгулирате програмата, която трябва да се извърши на atmega128 ATTINY13. . В този случай изходният код ще остане на практика същото, само името на свързания файл с 128def.inc на tn13def.inc ще се промени. Този подход също има своите предимства. Например, "Extra" I / O портове могат да се използват за свързване. LCD индикатор които можете да оттеглите информация за отстраняване на грешки. Или използвайте интрахемамулатора, който се свързва с JTAG порта на чипа Atmega128 (Attiny13 контролерът няма този порт). По този начин е възможно да се използва една дебюлаторна платка, на която е инсталиран "старши" AVR контролер, за отстраняване на грешки всички новоразработени системи, естествено въз основа на AVR микроконтролери. Един от тези дъски се нарича като мегам. Това беше използвано за създаване на примери за програми, дадени в статията. Това е универсален контролер за един борд въз основа на чипа Atmega128, който съдържа външни овен, два портона RS-232. , порт за свързване на LCD индикатор, интрахементов програмист и емулатор В jtag лед . Съветът има и място за разделяне на серия Flash-Rom AT45. В корпусите Tsop32 / 40/48 и двуканален серия DAC AD5302 / AD5312 / AD5322 . Сега, след като обясните причините за използването на AVR чудовище да се запали чифт свазоди, можете да отидете по-далеч.

Когато програмирането в средата на AVR Studio трябва да извършите стандартна последователност от действия:

  • компилация
  • Създаването на проекта започва с избора на проекта ново меню на проекта. В прозореца "Създаване на нов проект" се отваря, трябва да посочите името на проекта (в нашия случай - образец1) и името на файла за инициализация. След натискане на бутона "NEXT", се отварят платформа за отстраняване на грешки и устройството, където е избрана платформата за отстраняване на грешки (симулатор или емулатор) и вида на микроконтролера.

    Можете да изберете един от предлаганите вътрешномаменни емулатори, отбелязваме, че всеки емулатор има свой собствен списък с поддържани микроцирници. За примерния пример ние избираме като Debug платформа AVR симулатор и чип Atmega128. След натискане на бутона "Finish", нашият изход се появява на работните прозорци на AVR Studio Package, докато е празен. Следва десния прозорец, за да постави изходния текст на програмата. Това може да се направи по два начина или да наберете целия текст директно в прозореца на редактора или да изтеглите съществуващ файл. По-долу е пълният текст на най-простата програма с коментари.

    Шпакловка Пример "LED контрол"; написано за As-Megam Debug Board; Честотата на генератора на параметъра е 7.37 MHz; Светодиодите са свързани с PD6 и PD7 заключения и чрез резистори - на общ проводник. Шпакловка Свързване на atmega128 верига I / O детайли файл "m128def.inc"; Началото на началната програма:; Първа работа - инициализация на стека; Ако това не е направено, тогава извикайте подпрограма или прекъсване; няма да върне контрола назад; Указателят в края на стека е поставен на последния адрес на вътрешния RAM - Ramend LDI R16, LOW (RAMEND) OV, R16 LDI R16, висок (Ramend) OUT SPH, R16; За да се контролират светодиодите, свързани с заключенията на PD6 и PD7; Необходимо е да се декларират тези заключения. Шпакловка За да направите това, напишете "1" към съответните битове на DDRD регистъра (DatAdrection) LDI R16, (1<<6) | (1<<7) out DDRD,r16 ; основной цикл программы loop: ldi r16,(1<<6) ; светится один светодиод out PORTD,r16 rcall delay ; задержка ldi r16,(1<<7) ; светится второй светодиод out PORTD,r16 rcall delay ; задержка rjmp loop ; повторение цикла; процедура задержки; примерно полсекунды при частоте 7,37 МГц; три пустых вложенных цикла соответственно delay: ldi r16,30 ; 30 delay1: ldi r17,200 ; 200 delay2: ldi r18,200 ; и еще 200 итераций delay3: dec r18 brne delay3 dec r17 brne delay2 dec r16 brne delay1 ret ; возврат в главную программу

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

    Компилацията на проекта се извършва от командата за изграждане или чрез натискане на бутона F7. Процесът на компилация се показва в прозореца "Изход". Този прозорец може да бъде "издърпване" на изходната команда.

    По принцип вече получихме изходен файл във Format.Hex, който вече може да бъде зареден в микроцирците и да наблюдава попечителите на светодиодите. Въпреки това, целта на статията е да се покаже пълният цикъл на работа в средата на AVR Studio, затова отидем в етапа на отстраняване на грешки. Това се прави от екипа за отстраняване на грешки.

    Сега задайте честотата на кварцовата честота 7,3728 MHz в прозореца "Симулаторни опции" за точно измерване на времето за изпълнение на програмата.

    Останалите опции трябва да бъдат оставени непроменени. Сега можете да изпълнявате програма в режим на стъпка по стъпка с помощта на мишката или бутона F11.

    Пакетът AVR Studio съдържа мощни инструменти за преглед и редактиране на състоянието на вътрешните регистри и I / O портове на отстраняването на микроконтролера, както и времето, изпълнението на програмата. Достъпът до тях се извършва чрез прозореца "I / O".

    В действителност, размерът на информацията, предоставена чрез прозореца за гледане на AVR Studio, е толкова голяма, че е необходимо да се използва компютър в конфигурация с две монитори, за да се получи максимален комфорт.

    За да дебгулирате нашия пример, за достъп до пристанищата D бита, трябва да разкриете низ I / O ATMEGA128 и след това портната линия. Сега са видими и трите регистри на този пристанище, Портд, DDRD и Pind. За да видите полетата на стойността, бита и адреса, ще трябва да разширите десницата на прозореца, да изпотите прозореца с изходния текст на програмата.

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

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

    Шпакловка Пример "LED контрол от бутоните"; написано за As-Megam Debug Board; Светодиодите са свързани с PD6 и PD7 заключения и чрез резистори - на общ проводник. Шпакловка Бутони - на PE4 и PE5 .include "m128def.inc"; Започнете основната програма :; Стак инициализация LDI R16, Low (Ramend) OUT SPL, R16 LDI R16, висок (Ramend) OUT SPH, R16; Инициализиране на светодиодните светодиоди R16, (1<<6) | (1<<7) out DDRD,r16 ; инициализация выводов, к которым подключены кнопки (на вход) ; внутренние подтягивающие резисторы подключены; для этого в PORTE нужно установить соответствующие биты в единицы ldi r16,(1<<4) | (1<<5) out PORTE,r16 ; а в DDRE - в нули ldi r16,0 out DDRE,r16 ; бесконечный цикл forever: in r16,PINE ; теперь в r16 находится текущее "состояние" кнопок com r16 ; кнопка "нажимается" нулем, поэтому инвертируем регистр lsl r16 ; переносим биты 4,5 в позиции 6,7 lsl r16 ; и обновляем "показания" светодиодов andi r16,(1<<6) | (1<<7) out PORTD,r16 rjmp forever ; цикл выполняется бесконечно

    По този начин, при примера на най-простите програми са показани някои функции на AVR Studio пакета. Необходимо е да се разбере, че това е само първият познат, който ви позволява бързо да използвате с основните команди на пакета. Междувременно възможностите на разглеждания пакет са много по-широки. Например, тук можете да деббус програми, написани на езици на високо равнище. По-специално, C-Compiler на компанията Imagecraft използва дебъгер AVR Studio "като роден". За да направите това, когато компилирате изходния код, трябва да зададете опцията за изходния файл във формат, съвместим с AVR Studio. В същото време е възможно да се отстранят в изходните кодове.

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

    В менюто Инструменти на главния прозорец AVR Studio трябва да изберете персонализиране;

    В прозореца за персонализиране изберете инструмента за инструменти;

    Щракнете двукратно върху бутона на мишката или натиснете вмъкване на клавиатурата, добавете нова команда към списъка и го наричайте "AS2 програмист";

    Посочете пътя към файла с програмист, като го въведете директно в полето "Команда", или като кликнете върху бутона "..." вдясно от това поле;

    Сега менюто Tools се появява "Programmer AS2".

    AVR Studio 4.08 пакетни средства ви позволяват да свържете помощни програми - плъгини. Първият плъгин за AVR Studio е програма за графична редактор, която опростява процеса на инициализация на LCD индикатора, който може директно да управлява AVR контролера ATMEGA169. Максималният логически размер на LCD индикатора е 100 сегмента, всеки елемент от индикатора е направен в съответствие с бита в специалния регистър на контролера. За да се опрости процедурата за работа за определени бита към всеки сегмент, можете да използвате горепосочената програма.

    Докато посещавате "родината на AVR" - норвежкият офис на Атла, един от авторите на статията говори с Lars Quener, ръководителят на групата на програмата, създал и поддържа пакета AVR Studio. Този човек, класически програмист, с брада, в пуловер и тъкана в сандалите на чорапите, говори за перспективите за развитието на пакета. На следващата версия (4.09), интерфейсът ще бъде активиран за нов интрахемоещ емулатор - JTAGICE MKII (тя се нарича още в JTAGICE2), която през втората половина на годината ще замени в JTAGICE. Този емулатор има две съществени разлики. От една страна, поддържана поддръжка за нов интерфейс за грешки с един проводник за по-младите AVR контролери, debugwire. Този интерфейс е интересен, защото не заема допълнителни заключения от микроконтролера за своята работа, тъй като използва за обмен на изхода на микроконтролера на нулиране! От друга страна (можете да разберете този израз буквално), в jtagice2 емулатор ще се появи, накрая USB интерфейс за комуникация с компютъра.

    Литература

    1. АВР технически обучения технически семинарни материали. Atmel. Норвегия. Стягане 2003.
    2. Николай Королев, Дмитрий Королев AVR-микроконтролери на второто поколение: средата на разработчика. // Компоненти и технологии, 2003 г. № 7
    3. AVR-микроконтролери на второто поколение: нови хардуерни възможности // Компоненти и технологии. 2003. № 4.
    4. Николай Королев, Дмитрий Королев. AVR микроконтролери: големи в малки. // Schemery ", 2001, №5
    5. Николай Королев, Дмитрий Королев. AVR микроконтролери: софтуер // компоненти и технологии, 2000. No. 4.
    6. Николай Королев. AVR: Хардуер за разработчици // Компоненти и технологии, 1999 № 1
    7. Николай Королев. ATMEL RISC-микроконтролери // Chip-News 1998, №2
    8. Николай Королев, Дмитрий Королев AVR: Нови 8-битови RISC-микроконтролери на компанията Atmel // Микропроцесорен преглед, 1998, №1

    По някакъв начин незабавно се изтегли, за да даде съвети за избора на програмна среда за AVR контролери. Просто не хвърляйте в мен маратонки. Аз съм доста малко

    Многобройни програми за микроконтролери много. Медиите за програмиране също не са достатъчни и в сравнение с тях неправилно. Няма по-добри езици за програмиране. Така че трябва да изберете най-подходящия език за вас и програмната среда.

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

    Предишно програмиране. Не пренебрегвайте предишния опит в програмирането. Дори ако беше байийк. Дори ако беше дълго време в училище. Програмиране като велосипед - просто трябва да започнете и бързо да си спомняте всичко, забравено. Започнете с Beyyika - неразредена - по-късно ще бъде по-лесно да изберете нещо по-подходящо за вашите цели.

    Помогнете на околната среда.Пишат ли приятелите си на Паскал? За вас се решава въпрос - пишете на Паскал! Винаги ще помагате на Съвета, библиотеките ще бъдат хвърлени в библиотеките, ще дадат готови проекти. Като цяло, щастливи ще бъдат отведени в тяхната общност. Ако го направите напротив, вземете обратния резултат. Приятели, които виждат, които сте решили да изучават асемблера. Не чакайте помощ.

    Добър AVR програмна книга Това ще помогне много добре. За съжаление, има много малко от тях. Ако в ръцете си получихте книга и мислите, че всичко е много достъпно в него. - Опитайте. Аз не съветвам да науча от електронни книги, като последна инстанция, печат. Много неудобно да се превключва между околната среда и текста на файловия файл. Много по-приятно четене на книгата веднага опитайте, без да се разсейвате чрез превключване, в допълнение, можете да направите знак в полетата, да пишете идеите, които са възникнали.

    Програмиране средно по-прост. Ако има избор от няколко програми на вашето езиково програмиране - не се съмнявайте, изберете този, който е по-лесен. Нека бъде по-малко функционален. Нека компилира страшен надут код. Основното е просто да започнете да работите. След като сте наклонени в проста среда, лесно ще отидете в по-напреднала и "правилна" среда. И не слушайте тези, които казват, че ще загубите повече време - те грешат. Учениците от младши класове не са помолени да четат "война и мир", които им дават книги по-лесни - със снимки.

    Библиотеки. Наличието на библиотеки е противоречиво за изучаване на езика. Разбира се, по-късно те значително ще улеснят живота, но при първото "черни кутии" са неразбираеми и не много помагат на разбирането на езика. От друга страна, това улеснява прочетете програмата и да се даде възможност за новодошъл, а не особено напрегнат, изграждане на сложни програми. Така тяхното присъствие не е особено отегчено. Най-малко в началото.

    Ефективен код. Избор на програмиране на средата за изучаване на програмирането само от това колко ефективно е кодът на компилирането е лоша идея. Вие основно започваме ученето - че десетото нещо е "на изхода". Разбира се, можете по-късно да работите по него.

    Вазид.Всяко устройство на борда на кристала трябва да бъде конфигурирано с портове. Процедурата е доста енергични и се изискват спецификации. Освен това има нюанси, в които новодошлите не е само за да се даде. Следователно, в средата е много желателно за присъствието на вещадки. Изданията са автоматични SPI, I2C, USART и др. Автоматични настройки. Колкото повече устройства се поддържат, толкова по-добре. Излагайте необходимите периферни параметри и самият визар генерира код, който ще осигури посочените параметри. Много опростява живота.


    Общи препоръки Такова - програмиране на началния етап трябва да бъде възможно най-просто (дори ако примитив). Програмиращата среда трябва да бъде лесна за научаване (както се нуждаете, за да започнете, да научите програмирането и да не губите време за бране в настройките). Препоръчително е да се ръководи. Също не пречи на руските ръководство и примери за програми. Желателно е възможността за фърмуера на кристала от средата. След това, когато оставяте основите на програмирането, можете да се движите по-сложни черупки.


    Друга препоръка, накрая, работа с истински кристал. Не се страхувайте да го изгорите. Подобряване на практическия опит. Работа с емулатори (например Proteus), въпреки че ще бъде освободен от поялник, но никога няма да може да даде удовлетворение, че ще получите от спечелената програма, първите чаши от светодиода! Разбиране на това, което сте направили със собствените си ръце, истинската работна верига ще вдъхне доверието и стимулите да продължат напред!

    (Посещава 7 377 пъти, 1 посещения днес)

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

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

    vD2 LED - четене,

    vD3 LED - наличието на диаграма.

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

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




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

    Здравейте, скъпи хабарарити!

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

    Темата за микроконтролерите ме интересува дълго време през 2001 г. Но след това да получите програмист на мястото на пребиваване е проблематично и нямаше покупка в интернет и реч. Трябваше да отложа този случай до най-добрите времена. И така, един ден открих, че най-добрите времена дойдоха, без да напускате къщата, можете да си купите всичко, от което се нуждаете. Реших да опитам. Така че, какво ни е необходим:

    1. програмист
    Има много опции на пазара - от най-евтините програмисти на ISP (In-System) програмисти за няколко долара, до мощни програмисти за дебъгер за няколко стотин. Без по-голям опит по този въпрос, първо реших да опитам един от най-лесните и евтини - usbasp. Купих един път на eBay за $ 12, сега можете да намерите дори за $ 3-4. Всъщност, това е китайската версия на програмиста от Томас Фишл. Какво мога да кажа за него? Само едно - работи. Освен това има доста много AVR контролери на Atmega и Antiny Series. Под 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 + Avrdede Bundle работи перфектно. Инсталиране тривиално. Следвайки инструкциите, можете да инсталирате всичко необходимо за няколко минути. Единствените дени, които трябва да бъдат платени - Avrdude (софтуер за записване на контролера) може да изискват право на супер потребител достъп до програмиста. Изход - преминаване през Sudo (не много добра идея), или регистрирайте специални права на Удев. Синтаксисът може да се различава в различни версии на операционната система, но в моя случай (Linux Mint 15) е направено чрез добавяне на следното правило към файла /etc/udev/rules.d/41-atmega.Rules:

    # USBASP Programmer подсистема \u003d\u003d "USB", ATT (IDVENDOR) \u003d\u003d "16C0", ATT (IDPRODUCT) \u003d\u003d "05DC", група \u003d "Plugdev", режим \u003d "0666"

    След това е естествено рестартирането на услугата.
    Услуги Удев Рестартиране
    Можете да компилирате и мигате без никакви проблеми директно от командния ред (който се съмнявал), но ако има много проекти, по-удобно е да поставите плъгина и да направите всичко директно от околната среда.

    Под Windows ще трябва да доставят драйвера. В останалите няма проблеми. За научен интерес, аз опитах AVR Studio + Extreme Burle Bunder в Windows. Отново всичко работи с гръм и трясък.

    Започваме програмирането

    Програмирането AVR контролери могат да бъдат както на асемблера (AVR асемблер) и на C. Тук мисля, че всеки трябва да направи своя избор, в зависимост от конкретната задача и нейните предпочитания. Лично аз започнах да блъскам асемблер. Когато програмирате на асемблер, архитектурата на устройството става по-ясна и чувството изглежда, че те копаят директно във вътрешността на контролера. Освен това считам, че в особено критични програми знанието за асемблера може да бъде много полезно. След запознаване с AVR асемблер, аз се премествам на SI.

    След запознаване с архитектурата и основните принципи реших да събера нещо полезно и интересно. Дъщеря ми ми помогна, тя правеше шах и една красива вечер заяви, че иска да има таймер за партиди за известно време. BATZ! Тук това е - идеята за първия проект! Възможно е да ги поръчате на същия eBay, но исках да направя своя часовник, с черен ... ъ ... с индикатори и бутони. Не по-рано казано, отколкото направено!

    Като дисплей беше решено да се използва два 7-сегментна диодна индикатора. За да контролирате достатъчно 5 бутона - "Player 1", "Player 2", "Reset", "Настройка" и "Пауза". Е, не забравяйте за звуковата индикация на играта. Изглежда, че това е. Фигурата по-долу показва общата диаграма на свързването на микроконтролера към индикатори и бутони. Тя ще трябва, когато анализира изходния код на програмата:

    Colcessing Flight.

    Да започнем, тъй като трябва да бъде, от входната точка на програмата - основните функции. Всъщност, нищо забележително в нея не е - настройка на портове, инициализация на данни и безкраен бутон на бутоните за преса. Е, SEI () повикването е решаването на обработката на прекъсванията, за тях малко по-късно.

    Int main (void) (init_io (); init_data (); sound_off (); sei (); докато (1) (hands_buttons ();) връщане 0;)
    Помислете за всяка функция поотделно.

    Void init_io () (// набор от изход DDRB \u003d 0xFF; DDRD \u003d 0xFF; // Задаване на вход DDRC \u003d 0B11100000; // pull-up резистори PORTC | \u003d 0B00011111; // Timer прекъсва Тимс \u003d (1<

    Настройването на I / O портовете е много просто - в регистъра на DDRX (където X е буквата, обозначаващ порт) номера, всеки бит означава дали съответният щифт ще бъде входното устройство (съответства на 0) или извеждане (съответства на 0) или изход (съответства на 1) до 1). По този начин, седяна в DDRB и DDRD номер 0xFF, направихме B и d изходни портове. Съответно командата DDRC \u003d 0B1100000; Обръща първите 5 порта на пристанището в входни щифтове, а останалите през уикенда. Team Portc | \u003d 0B00011111; Включва вътрешни резистори за затягане на 5 входа на контролера. Според схемата бутоните са свързани към тези входове, които при натискане се затварят на земята. По този начин, контролерът разбира, че бутонът е натиснат.

    След това следвате настройката на два таймера, таймер0 и таймер1. Използваме първия, който актуализира индикатори, а вторият - за обратното отброяване, след като го постави на задействането на всяка секунда. Подробно описание на всички константи и метода за определяне на таймера към определен интервал може да бъде намерен в документацията за ATMEGA8.

    Обработка прекъсване

    ISR (дисплей (), ако (_buzzer) (_buzzer \u003d\u003d 0) sound_off ();)) isr (timer1_compa_vect) (ако (ActiveTimer \u003d\u003d 1 && timer1\u003e 0) (TIMER1-- ; ако (таймер1 \u003d\u003d 0) process_timoff ();) if (ActiveTimer \u003d\u003d 2 && timer2\u003e 0) (таймер2--; ако (timer2 \u003d\u003d 0) process_timeoff ();))

    Когато таймерът се задейства, контролът се предава на съответния оператор на прекъсване. В нашия случай, това е процесорът на Timer0_OVF_VECT, който причинява процедурата за изход за време към индикатори и Timer1_compa_Vect, който обработва обратното броене.

    Заключение за индикатори

    Void Display () (Display_Number ((таймер1 / 60) / 10, 0B00001000); _Delay_ms (0.25); display_number ((таймер1 / 60)% 10, 0B00000100); 10, 0B00000010); _delay_ms (0.25); display_number ((таймер1% 60)% 10, 0B00000001); _delay_ms (0.25); display_number ((TIMER2 / 60) / 10, 0B10000000); / 60)% 10, 0B01000000); _delay_ms (0.25); display_number ((таймер2% 60) / 10, 0B00100000); _delay_ms (0.25); display_number ((таймер2% 60)% 10, 0B00010000); _delay_ms (0.25); ; portd \u003d 0;) void display_number (int номер, int mask) (portb \u003d number_mask (номер); portdd \u003d маска;)

    Функцията за показване използва метод за динамичен индикатор. Факт е, че всеки отделен индикатор има 9 контакта (7 за контрол на сегменти, 1 за точка и 1 за захранване). За да контролирате 4 цифри, това ще отнеме 36 контакта. Твърде разточителен. Следователно, изходът на заустванията към многоцифрен индикатор е организиран съгласно следния принцип:

    Напрежението се подава алтернативно на всеки от споделените контакти, което ви позволява да маркирате желаната фигура в съответния индикатор, като използвате същите 8 контролни контакта. С достатъчно висока изходна честота изглежда като статична картина. Ето защо всички 8 контакта на захранването на двата индикатора на диаграмата са свързани с 8 порта на порт D, и 16 сегмента за управление на контакт са свързани по двойки и свързани с 8 порта на порт Б. По този начин функцията на дисплея е закъснение от 0.25 MS последователно показва желания номер на всеки от индикаторите. Под края, всички изходи, които захранват напрежението на индикаторите, са изключени (команда portdd \u003d 0;). Ако това не е направено, тогава последната дисплейна цифра ще продължи да записва, докато следващото повикване се нарича функцията на дисплея, която ще доведе до по-светло луминесценция в сравнение с останалите.

    Лечение на преси

    Void Hands_buttons () (hands_button (key_setup); дръжка); дръжка_button (key_pause); дръжка_button (key_player1); дръжка);) \u003d Setup_bit; break; case key_reset: bit \u003d reset_bite; break; case key_pause: bit \u003d pause_bit; beak; case key_player1: bit \u003d player1_bit; break; case key_player2: bit \u003d player2_bit; почивка; по подразбиране: връщане;) if Button_pin, бит)) (ако (_pressed \u003d\u003d 0) (_delay_ms (debounce_tim); ако (bit_is_clear (button_pin, бит)) (_pressed | \u003d ключ; // ключ за действие (key_setup: process_setup (); : process_reset (); beak; case key_pause: process_pause (); break; case key_player1: process_player1 (); break; case key_player2: process_player2 (); почивка;) sound_on (15);))) ;))

    Тази функция на ключовете и процесите натиснете, ако това се случи. Натискането се регистрира чрез проверка на bit_is_clear (button_pin, бит), т.е. Бутонът е натиснат, ако входът, съответстващ на него, е свързан към земята, който ще се случи според схемата, когато натиснете бутона. Забавено забавяне продължителност и повторна проверка е необходима, за да се избегнат множество ненужни отговори, дължащи се на дръжките на контактите. Записването на състоянието на натискане в подходящите променливи битове _pressed се използва за премахване на повторното задействане с дълъг бутон за натискане.
    Натискащите функции са доста тривиални и вярват, че в допълнителни коментари не се нуждаят.

    Пълна текстова програма

    #Define f_cpu 4000000l #include #Include. #Include. #define debounce_time 20 #define button_pin pc0 #define setup_bit pc1 #define reset_bit pc1 #define player_bit pc3 #define player1_bit pc3 #define player2_bit pc4 #define key_setup 0B00000001 #define key_reset 0B00000010 #define key_pause 0B00000100 #define key_player1 0B00001000 #define \\ t ActiveTimer \u003d 0; LOLATILE INT TIMER1 \u003d 0; Летливи Int таймер 2 \u003d 0; летливи Int _buzzer \u003d 0; Volatile int _pressed \u003d 0; // функционални декларации void init_io (); void init_data (); Int number_mask (int num); Void Hands_buttons (); void hands_button (int ключ); Void process_setup (); Void process_ReSet (); void process_pause (); void process_timeoff (); Void process_player1 (); Void process_player2 (); Void дисплей (); void display_number (int mask, int номер); Отпада Sound_on (междинно интервал); Void Sound_off (); // прекъсвания ISR (ДИСПЛЕЙ (); ако (_Buzzer\u003e 0) (_Buzzer--; ако (_buzzer \u003d\u003d 0) Sound_OFF ())) ISR (Timer1_Compa_Vect) (ако (ActiveTimer \u003d\u003d 1 && TIMER1\u003e 0) ( Timer1--; ако (TIMER1 \u003d\u003d 0) process_timeoff ()) ако (ActiveTimer \u003d\u003d 2 && таймер 2\u003e 0) (Timer2--; ако (таймер 2 \u003d\u003d 0) Process_Timeoff ())) Int Главна (свободен) (init_io (); init_data (); sound_off (); SEI (), докато (1) (handle_buttons ()) Връщане 0) void_io () (// набор изход ddrb \u003d 0xff; ddrd \u003d 0xFF; // комплект Входно DDRC \u003d 0B11100000; // гостилница резистори Portc | \u003d 0b00011111; // таймер прекъсвания Timsk \u003d (1< 5940 || Timer2\u003e 5940) (таймер1 \u003d 0; timer2 \u003d 0;)) void mess_reset () (init_data ();) void process_timoff () (init_data (); sound_on (30);) void process_pause () (ActiveTimer \u003d 0;) нищожен process_player1 () (ActiveTimer \u003d 2;) нищожен process_player2 () (активна) _player2 () (ActiveTimer \u003d 1;) нищожен handle_button (инт ключ) (key_setup: бит \u003d setup_bit; прекъсване; дело key_reset: бит \u003d reset_bit; Break; дело Key_Pause: Bit \u003d Pause_bit; Break; дело Key_Player1: Bit \u003d Player1_bit; Break; дело Key_Player2: Bit \u003d Player2_bit; Break; подразбиране: Върни;) ако (bit_is_clear (button_pin, бита)) (ако (_pressed \u003d\u003d 0) ( _delay_ms (Debounce_Time), а ако (bit_is_clear (button_pin, бита)) (_pressed | \u003d ключ; // key_setup: process_setup (); прекъсване; дело Key_reset: Process_reset (); Break; дело Key_Pause: process_pause (); прекъсване; случай key_player1 : process_player1 (); break; case key_player2: process_player2 (); break;) sound_on (15);))) иначе (_pre Ssed & \u003d ~ ключ; )) Void hands_buttons () (handle_button (key_setup); дръжка); дръжка_button (key_pause); дръжка_button (key_player1); дръжка_button (key_player2);) void display () (Display_number ((TIMER1 / 60) / 10, 0B00001000) ; _delay_ms (0.25); display_number ((таймер 1/60)% 10, 0B00000100); _delay_ms (0.25); display_Number ((таймер 1% 60) / 10, 0B00000010); _delay_ms (0.25); display_number (((таймер 1% 60) % 10, 0B00000001); _delay_ms (0.25); display_number ((таймер 2/60) / 10, 0B10000000); _delay_ms (0.25); display_number ((таймер 2/60)% 10, 0B01000000); _delay_ms (0.25); display_number (( таймер 2% 60) / 10, 0b00100000); _delay_ms (0.25); display_number (((таймер 2% 60)% 10, 0b00010000); _delay_ms (0.25); portdd \u003d 0) невалидни display_number (междинно Number_Mask) (PortB \u003d Number_Mask ( Брой); PORTD \u003d маскират) невалидни sound_on (междинно интервал) (_buzzer \u003d интервал; // PUT зумер Pin висока Portc | \u003d 0b00100000) невалидни Sound_off () (// PUT зумер Pin ниска Portc & \u003d ~ 0b00100000)

    Прототипът е монтиран на борда на дъмпинга.