Съдържание:
- Стъпка 1: Изградете тестова дъска
- Стъпка 2: Инсталирайте Assembler и Avrdude
- Стъпка 3: Здравей свят
- Стъпка 4: Hello.asm ред по ред
- Стъпка 5: Заключение
Видео: Урок за асемблер на AVR 1: 5 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:49
Реших да напиша поредица от уроци за това как да пиша програми за асемблер за 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 инструкции - т.е. относителен скок)
Сега, когато тези основи са извън пътя, можем да продължим да пишем по -интересен код и по -интересни схеми и устройства, без да се налага да обсъждаме механиката на компилиране и качване.
Надявам се да ви е харесал този уводен урок. В следващия урок ще добавим друг компонент на веригата (бутон) и ще разширим кода си, за да включим входни портове и решения.
Препоръчано:
Урок за асемблер на AVR 2: 4 стъпки
AVR Assembler Tutorial 2: Този урок е продължение на " AVR Assembler Tutorial 1 " Ако не сте преминали през Урок 1, трябва да спрете сега и първо да направите това. В този урок ще продължим нашето проучване на програмирането на асемблерен език на atmega328p u
Урок за асемблер на AVR 6: 3 стъпки
AVR Assembler Урок 6: Добре дошли в Урок 6! Днешният урок ще бъде кратък, където ще разработим прост метод за комуникация на данни между един atmega328p и друг, използвайки два порта, които ги свързват. След това ще вземем ролката за зарове от Урок 4 и Регистъра
Урок за асемблер на AVR 8: 4 стъпки
AVR Assembler Урок 8: Добре дошли в Урок 8! В този кратък урок ще направим малко отклонение от въвеждането на нови аспекти на програмирането на асемблерен език, за да покажем как да преместваме нашите компоненти за прототипиране в отделен " отпечатан " платка
Урок за асемблер на AVR 7: 12 стъпки
AVR Assembler Tutorial 7: Добре дошли в Tutorial 7! Днес ще покажем първо как да изчистим клавиатурата, а след това ще покажем как да използваме аналоговите входни портове за комуникация с клавиатурата. Ще направим това с прекъсвания и един проводник като вход. Ще свържем клавиатурата, така че
Урок за асемблер на AVR 9: 7 стъпки
AVR Assembler Урок 9: Добре дошли в Урок 9. Днес ще ви покажем как да управлявате както 7-сегментен дисплей, така и 4-цифрен дисплей, използвайки нашия код за сглобяване ATmega328P и AVR. В хода на това ще трябва да вземем отклонения за това как да използваме стека