Съдържание:

Урок за асемблер на AVR 1: 5 стъпки
Урок за асемблер на AVR 1: 5 стъпки

Видео: Урок за асемблер на AVR 1: 5 стъпки

Видео: Урок за асемблер на AVR 1: 5 стъпки
Видео: Программирование AVR на языке Ассемблер, часть 5 1"Бегущие огни" 2024, Ноември
Anonim
Урок за асемблер на AVR 1
Урок за асемблер на AVR 1

Реших да напиша поредица от уроци за това как да пиша програми за асемблер за Atmega328p, който е микроконтролерът, използван в Arduino. Ако хората продължат да се интересуват, ще продължа да излагам по една седмица или повече, докато не ми свърши свободното време или хората ще спрат да ги четат.

Работя с Arch linux и работя върху atmega328p-pu, настроен на макет. Можете да го направите по същия начин като мен или просто да включите arduino във вашия компютър и да работите по микроконтролера по този начин.

Ще пишем програми за 328p като тази, която е в повечето arduino, но трябва да отбележите, че същите тези програми и техники ще работят и за всеки от микроконтролерите Atmel и по -късно (ако има интерес) ще работим с някои от другите също. Подробностите за микроконтролера могат да бъдат намерени в техническите листове на Atmel и в Ръководството за комплекти инструкции. Прилагам ги към тази инструкция.

Ето какво ще ви трябва:

1. Макет

2. Arduino или просто микроконтролер

3. Компютър, работещ под Linux

4. Асемблерът на avra, използващ git: git clone https://github.com/Ro5bert/avra.git или ако използвате ubuntu или система, базирана на debian, просто напишете „sudo apt install avra“и ще получите както avr асемблера и avrdude. ОБАЧЕ, ако получите най -новата версия с помощта на github, тогава ще получите и всички необходими файлове за включване, с други думи, той вече има файловете m328Pdef.inc и tn85def.inc.

5. avrdude

Пълният комплект от моите уроци за асемблер на AVR може да се намери тук:

Стъпка 1: Изградете тестова дъска

Изградете тестова дъска
Изградете тестова дъска

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

За тези от вас, които са съгласни, можете да извадите микроконтролера от вашия arduino и след това да започнете с конструирането на „Breadboard Arduino“, като следвате инструкциите тук:

На снимката показвам моята настройка, която се състои от две самостоятелни Atmega328p на голяма макет (искам да мога да поддържам предишния урок свързан и зареден на един микроконтролер, докато работя върху следващия). Захранването е настроено така, че най -горната шина е 9V, а всички останали са 5V от регулатора на напрежението. Използвам и пробивна платка FT232R за програмиране на чиповете. Купих ги и сам им сложих буутлоудъри, но ако току -що извадихте един от Arduino, вече е добре.

Обърнете внимание, че ако се опитвате това с ATtiny85, можете просто да получите Sparkfun Tiny Programmer тук: https://www.sparkfun.com/products/11801# и след това просто да го включите в USB порта на вашия компютър. Първо ще трябва да инсталирате буутлоудър на Attiny85 и най -лесният начин е просто да използвате Arduino IDE. Ще трябва обаче да кликнете върху файла и предпочитанията и след това да добавите този URL адрес за нови дъски: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json, който ще ви позволява да инсталирате буутлоудъра (ако вашият ATtiny85 все още не е доставен с такъв.)

Стъпка 2: Инсталирайте Assembler и Avrdude

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

След като инсталирате avra, ще забележите, че има поддиректория, която се предлага с нея, наречена „източници“, а вътре в тази директория има куп файлове за включване. Това са всички микроконтролери, които можете да програмирате с avra. Веднага ще забележите, че няма файл за 328p, който използваме тук. Прикачих една. Файлът трябва да се нарича m328Pdef.inc и трябва да го поставите в директорията include или където и да е друго, което искате. Ще го включим в нашите програми за асемблер. Всичко, което прави, е да даде на всеки от регистрите имена на микроконтролера от информационния лист, така че да не се налага да използваме техните шестнадесетични имена. Горният файл за включване съдържа „директиви на pragma“, тъй като е проектиран за програмиране на C и C ++. Ако ви омръзне да виждате как асемблерът изплюва „игнорирайки директивата за прагма“, просто влезте във файла и изтрийте или коментирайте всички редове, започващи с #pragma

Добре, сега, когато вашият микроконтролер е готов, вашият асемблер е готов и вашият програмист е готов, можем да напишем първата си програма.

Забележка: Ако използвате ATtiny85 вместо ATmega328P, тогава имате нужда от различен файл за включване, наречен tn85def.inc. Аз също ще го прикача (забележете, че трябваше да го нарека tn85def.inc.txt, така че Instructables да ми позволи да го кача.) ОБАЧЕ, ако имате асемблера на avra от github, тогава вече имате и двата файла с него. Затова препоръчвам да го вземете и да го компилирате сами: git clone

Стъпка 3: Здравей свят

Целта на този първи урок е да се изгради стандартната първа програма, която човек пише, когато изучава всеки нов език или изследва всяка нова платформа за електроника. "Здравей свят!." В нашия случай просто искаме да напишем програма за асемблерен език, да я сглобим и да я качим в нашия микроконтролер. Програмата ще доведе до включване на светодиод. Причиняването на светодиода да "мига", както правят за нормалната програма за здравей свят на Arduino, всъщност е много по -сложна програма на асемблерния език и затова все още няма да го направим. Ще напишем най -простия код "голи кости" с минимален ненужен пух.

Първо свържете светодиод от PB5 (вижте схемата за извеждане), който също се нарича Digital Out 13 на arduino, към 220 омов резистор, след това към GND. Т.е.

PB5 - LED - R (220 ома) - GND

Сега да напиша програмата. Отворете любимия си текстов редактор и създайте файл, наречен "hello.asm"

; здравей.асм

; включва светодиод, който е свързан към PB5 (цифров изход 13). включва "./m328Pdef.inc" ldi r16, 0b00100000 изход DDRB, r16 изход PortB, r16 Старт: rjmp Старт

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

След като сте създали файла, след това в терминал го сглобявате, както следва:

avra здравей.асм

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

avrdude -p m328p -c stk500v1 -b 57600 -P /dev /ttyUSB0 -U флаш: w: hello.hex

ако използвате платка arduino, ще трябва да натиснете бутона за нулиране на платката arduino точно преди да изпълните горната команда. Обърнете внимание, че може да се наложи също да добавите sudo отпред или да го изпълните като root. Също така имайте предвид, че на някои arduino (като Arduino UNO) вероятно ще трябва да промените битрейта на -b 115200 и порта -P /dev /ttyACM0 (ако получите грешка от avrdude за невалиден подпис на устройство, просто добавете - F към командата)

Ако всичко е работило както трябва, сега ще светне светодиод ….. "Здравей, свят!"

Ако използвате ATtiny85, тогава командата avrdude ще бъде:

avrdude -p attiny85 -c usbtiny -U флаш: w: hello.hex

Стъпка 4: Hello.asm ред по ред

За да завършим този уводен урок, ще преминем ред по ред на програмата hello.asm, за да видим как работи.

; здравей.асм

; включва светодиод, който е свързан към PB5 (цифров изход 13)

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

.include "./m328Pdef.inc"

Този ред казва на асемблера да включи файла m328Pdef.inc, който сте изтеглили. Може да искате да поставите това в директория с подобни файлове за включване и след това да промените горния ред, за да го посочите там.

ldi r16, 0b00100000

ldi означава "незабавно зареждане" и казва на асемблера да вземе работещ регистър, r16 в този случай, и да зареди в него двоично число, 0b00100000 в този случай. 0b отпред казва, че нашият номер е в двоичен формат. Ако искахме, можехме да изберем друга база, например хексидецимална. В този случай нашето число би било 0x20, което е шестдесетично число за 0b00100000. Или бихме могли да използваме 32, което е 10 десетична база за същото число.

Упражнение 1: Опитайте да промените номера в горния ред на шестнадесетичен, а след това на десетичен във вашия код и проверете дали той все още работи във всеки случай.

Използването на двоичен файл обаче е най -просто поради начина, по който работят портовете и регистрите. Ще обсъдим портовете и регистрите на atmega328p по -подробно в бъдещите уроци, но засега само ще заявя, че използваме r16 като „работен регистър“, което означава, че просто ще го използваме като променлива, която съхраняваме номера в. "Регистър" е набор от 8 бита. Това означава 8 точки, които могат да бъдат 0 или 1 („изключено“или „включено“). Когато зареждаме двоичното число 0b00100000 в регистъра, използвайки горния ред, просто сме записали този номер в регистъра r16.

изход DDRB, r16

Този ред казва на компилатора да копира съдържанието на регистъра r16 в DDRB регистъра. DDRB означава „Регистър за посока на данни B“и настройва „щифтовете“на PortB. На картата за разпределение за 328p можете да видите, че има 8 пина с етикет PB0, PB1,…, PB7. Тези пинове представляват "битовете" на "PortB" и когато зареждаме двоичното число 00100000 в DDRB регистъра, казваме, че искаме PB0, PB1, PB2, PB3, PB4, PB6 и PB7 да бъдат зададени като INPUT пинове, тъй като те имат 0 са в тях, а PB5 е зададен като изходен извод, тъй като поставяме 1 на това място.

изход PortB, r16

Сега, след като сме фиксирали посоките на щифтовете, сега можем да зададем напреженията върху тях. Горният ред копира същия двоичен номер от нашия регистър за съхранение r16 към PortB. Това задава всички щифтове на 0 волта, с изключение на щифт PB5 на HIGH, който е 5 волта.

Упражнение 2: Вземете цифров мултицет, включете черния проводник в земята (GND) и след това тествайте всеки от щифтовете PB0 до PB7 с червения проводник. Напреженията на всеки от щифтовете точно ли съответстват на поставянето на 0b00100000 в PortB? Ако има такива, които не са, защо мислите, че е така? (вижте пин картата)

Старт:

rjmp Старт

И накрая, първият ред по -горе е "етикет", който маркира място в кода. В този случай маркирайте това място като "Старт". Вторият ред казва „относителен скок към етикета Старт“. Крайният резултат е, че компютърът е поставен в безкраен цикъл, който просто продължава да се връща обратно към Старт. Нуждаем се от това, защото не можем просто програмата да приключи или да падне от скала, програмата трябва просто да продължи да работи, за да може светлината да свети.

Упражнение 3: Премахнете горните два реда от кода си, така че програмата да падне от скала. Какво става? Трябва да видите нещо, което прилича на традиционната програма за „мигане“, използвана от Arduino като техен „здравей свят!“. Защо мислите, че действа по този начин? (Помислете какво трябва да се случи, когато програмата падне от скала …)

Стъпка 5: Заключение

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

В този урок сте научили как да използвате следните команди:

ldi hregister, number зарежда число (0-255) в горен полурегистър (16-31)

out ioregister, register копира номер от работещ регистър в I/O регистър

етикетът rjmp прескача до реда на програмата, обозначен с "етикет" (който не може да бъде на повече от 204 инструкции - т.е. относителен скок)

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

Надявам се да ви е харесал този уводен урок. В следващия урок ще добавим друг компонент на веригата (бутон) и ще разширим кода си, за да включим входни портове и решения.

Препоръчано: