Мазмұны:

AVR Assembler оқулығы 1: 5 қадамдар
AVR Assembler оқулығы 1: 5 қадамдар

Бейне: AVR Assembler оқулығы 1: 5 қадамдар

Бейне: AVR Assembler оқулығы 1: 5 қадамдар
Бейне: MKS SGEN L V1.0 - A4988 Stepper Drivers 2024, Шілде
Anonim
AVR құрастырушы оқулығы 1
AVR құрастырушы оқулығы 1

Мен Arduino -да қолданылатын микроконтроллер болып табылатын Atmega328p үшін ассемблерлік бағдарламаларды жазу бойынша бірнеше оқулықтар жазуды шештім. Егер адамдар қызығушылық танытса, мен бос уақытым таусылғанша немесе басқа адамдар оларды оқуды тоқтатқанша аптасына бір рет шығаруды жалғастырамын.

Мен Arch linux-пен жұмыс жасаймын және мен нан тақтасында орнатылған atmega328p-pu жұмыс жасаймын. Сіз мұны мен сияқты жасай аласыз немесе компьютерге ардуиноны қосып, микроконтроллерде осылай жұмыс жасай аласыз.

Біз 328p -ге арналған бағдарламаларды көптеген arduino -дағыдай жазатын боламыз, бірақ сіз дәл сол бағдарламалар мен әдістер Atmel микроконтроллерлерінің кез келгенінде жұмыс істейтінін ескеруіңіз керек, ал кейінірек (егер қызығушылық болса) біз олардың кейбірімен жұмыс жасаймыз. басқалары да. Микроконтроллер туралы мәліметтерді Atmel мәліметтер парақтарынан және нұсқаулықтар жиынтығынан табуға болады. Мен оларды осы нұсқаулыққа қосамын.

Міне сізге қажет болады:

1. Нан тақтасы

2. Arduino немесе жай микроконтроллер

3. Linux жұмыс істейтін компьютер

4. git: git clone көмегімен avra assembler, https://github.com/Ro5bert/avra.git немесе егер сіз ubuntu немесе debian негізіндегі жүйені қолдансаңыз, «sudo apt install avra» деп теріңіз, сонда сіз avr ассемблерін аласыз. және авруде. Әйтсе де, егер сіз github көмегімен соңғы нұсқаны алсаңыз, онда сіз барлық қажетті файлдарды аласыз, басқаша айтқанда, m328Pdef.inc және tn85def.inc файлдары бар.

5. avrdude

AVR ассемблерінің толық оқулықтарын мына жерден табуға болады:

1 -қадам: Тестілеу тақтасын жасаңыз

Тестілеу тақтасын құру
Тестілеу тақтасын құру

Сіз өзіңіздің arduino -ны қолдана аласыз және қаласаңыз, осы оқулықтарда бәрін жасай аласыз. Алайда, біз ассемблер тілінде кодтау туралы айтып отырғандықтан, біздің философиямыз барлық перифериалдарды алып тастау және микроконтроллердің өзімен тікелей әрекеттесу болып табылады. Ендеше, мұны осылай жасау қызықты болар еді деп ойламайсыз ба?

Сізбен келісетіндер үшін сіз микроконтроллерді arduino -дан шығарып, мына нұсқауларды орындап, «Breadboard Arduino» құрастырудан бастай аласыз:

Суретте мен үлкен нан тақтасындағы екі дербес Atmega328p тұратын қондырғыны көрсетемін (мен келесі оқулықтың сымды және келесі микроконтроллерге жүктелгенін сақтағым келеді). Менде қуат көзі жоғары вольт 9В, ал қалғандары кернеу реттегішінен 5В болатын етіп орнатылған. Мен чиптерді бағдарламалау үшін 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 -қадам: Ассемблер мен Аврдуданы орнатыңыз

Енді сіз осы оқу құралының бірінші қадамында берілген сілтемелерден ассемблер мен avrdude жүктеп, орната аласыз. Егер сіз Arduino -мен жұмыс жасаған болсаңыз, онда сізде avrdude орнатылған болуы мүмкін.

Avra орнатқаннан кейін сіз онымен бірге «көздер» деп аталатын ішкі каталог бар екенін байқайсыз және бұл каталогта көптеген файлдар бар. Бұл avra көмегімен бағдарламалауға болатын барлық микроконтроллерлер. Сіз мұнда 328p үшін файл жоқ екенін бірден байқайсыз. Мен біреуін тіркедім. Файл m328Pdef.inc деп аталуы керек және сіз оны каталогтың ішіне немесе сізге ұнайтын басқа жерге қоюыңыз керек. Біз оны ассамблея тілінің бағдарламаларына қосамыз. Мұның бәрі - бұл микроконтроллер атауларындағы регистрлердің әрқайсысына мәліметтер парағынан олардың он алтылық атауын қолданудың қажеті болмайтындай етіп беру. Жоғарыда келтірілген файлда «прагма нұсқаулары» бар, себебі ол C және C ++ бағдарламалауға арналған. Егер сіз ассемблердің «прагма директивасын елемеу» туралы шағымдарын көруден шаршасаңыз, файлға кіріп, #pragma -дан басталатын барлық жолдарды жойыңыз немесе оларға түсініктеме беріңіз.

Жақсы, енді сізде микроконтроллер дайын, ассемблер дайын және сіздің бағдарламашы дайын, біз бірінші бағдарламаны жаза аламыз.

Ескерту: Егер сіз ATmega328P орнына ATtiny85 қолдансаңыз, сізге tn85def.inc деп аталатын басқа файл қажет. Мен оны қоса беремін (нұсқаулық маған жүктеуге мүмкіндік беретін етіп оны tn85def.inc.txt деп атауға тура келетінін ескеріңіз.) ӘГЕР, егер сізде github -дан авра құрастырушы болса, онда сізде бұл файлдардың екеуі де бар. Сондықтан мен оны алуды және оны өзіңіз құрастыруды ұсынамын: git clone

3 -қадам: Сәлем әлемі

Бұл бірінші оқулықтың мақсаты - кез келген жаңа тілді үйрену немесе кез келген жаңа электроника платформасын зерттеу кезінде жазатын стандартты бірінші бағдарламаны құру. «Сәлем Әлем!.» Біздің жағдайда біз ассемблер тілінде бағдарлама жазып, оны жинап, микроконтроллерге жүктегіміз келеді. Бағдарлама светодиоды қосады. Жарықдиодты Arduino қалыпты әлем бағдарламасындағылар сияқты «жыпылықтауы» - бұл ассемблер тілінде әлдеқайда күрделі бағдарлама, сондықтан біз мұны әлі жасамаймыз. Біз ең қарапайым «жалаңаш сүйектер» кодын қажетсіз қыл -қыбырсыз жазамыз.

Алдымен arduino -да Digital Out 13 деп аталатын PB5 светодиоды (түйісу диаграммасын қараңыз) 220 Ом резисторға, содан кейін GND -ге қосыңыз. Яғни

PB5 - жарық диоды - R (220 ом) - GND

Енді бағдарламаны жазу. Сүйікті мәтіндік редакторды ашып, «hello.asm» деп аталатын файл жасаңыз.

; сәлем.asm

; PB5 (сандық шығыс 13) жалғанған светодиодты қосады. «./m328Pdef.inc» ldi r16, 0b00100000 DDRB, r16 PortB, r16 Бастауды қосыңыз: rjmp Бастау

Жоғарыда көрсетілген код. Біз оны бір минут ішінде кезекпен өтеміз, бірақ алдымен оны сіздің құрылғыңызда жұмыс істей алатындығымызға көз жеткізіңіз.

Файлды жасағаннан кейін оны терминалда келесідей жинайсыз:

avra hello.asm

бұл сіздің кодты жинайды және оны келесідей жүктей алатын hello.hex деп аталатын файлды жасайды:

avrdude -p m328p -c stk500v1 -b 57600 -P /dev /ttyUSB0 -U жарқыл: w: hello.hex

Егер сіз ардуино тақтасын қолдансаңыз, жоғарыдағы пәрменді орындамас бұрын, нан тақтасындағы ардуинодағы қалпына келтіру түймесін басуға тура келеді. Есіңізде болсын, сізге алдынан судо қосу немесе оны түбір ретінде орындау қажет болуы мүмкін. Сондай -ақ, кейбір 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 бағдарламасын кезекпен өтіп, оның қалай жұмыс істейтінін білеміз.

; сәлем.asm

; PB5 -ке қосылған жарықдиодты қосады (сандық шығыс 13)

Нүктелі үтірден кейінгі барлық нәрсені ассемблер елемейді, сондықтан бұл алғашқы екі жол бағдарламаның не істейтінін түсіндіретін «түсініктемелер» болып табылады.

.include «./m328Pdef.inc»

Бұл жол құрастырушыға сіз жүктеген m328Pdef.inc файлын қосуды айтады. Сіз мұны ұқсас файлдар каталогына қойғыңыз келуі мүмкін, содан кейін оны көрсету үшін жоғарыдағы жолды өзгертіңіз.

ldi r16, 0b00100000

ldi «бірден жүктеу» дегенді білдіреді және құрастырушыға бұл жағдайда r16 жұмыс регистрін алуды және оған екілік санды жүктеуді айтады, бұл жағдайда 0b00100000. Алдыңғы 0b саны біздің сан екілік екенін айтады. Егер біз қаласақ, он алтылық сияқты басқа базаны таңдай алар едік. Бұл жағдайда біздің нөмір 0x20 болар еді, ол ондық шама 0b00100000. Немесе біз сол сан үшін ондық ондық болып табылатын 32 -ді қолданар едік.

1 -жаттығу: Жоғарыдағы жолдағы нөмірді он алтылыққа, содан кейін кодыңыздың ондығына ауыстыруға тырысыңыз және оның әр жағдайда жұмыс істейтінін тексеріңіз.

Порттар мен регистрлердің жұмысына байланысты екілік файлды қолдану қарапайым. Біз болашақ оқулықтарда atmega328p порттары мен регистрлерін толығырақ талқылайтын боламыз, бірақ әзірге мен r16 -ды «жұмыс регистрі» ретінде қолданатынымызды айтамыз, яғни біз оны сақтайтын айнымалы ретінде қолданамыз. сандар. «регистр» - бұл 8 биттен тұратын жиын. Бұл 0 немесе 1 болуы мүмкін 8 нүктені білдіреді («өшірулі» немесе «қосулы»). 0b00100000 екілік нөмірін реестрге жоғарыдағы жолды жүктегенде, біз бұл нөмірді r16 регистрінде сақтадық.

DDRB, r16

Бұл жол компиляторға r16 регистрінің мазмұнын DDRB регистріне көшіруді айтады. DDRB «Деректерді бағыттау регистрі В» дегенді білдіреді және ол PortB -те «түйреуіштерді» орнатады. 328p нүктелік картасында PB0, PB1,…, PB7 деп белгіленген 8 түйреуіш бар екенін көруге болады. Бұл түйреуіштер «PortB» -нің «биттерін» білдіреді және 00100000 екілік нөмірін DDRB регистріне жүктегенде, біз PB0, PB1, PB2, PB3, PB4, PB6 және PB7 -ді INPUT түйреуіштері ретінде орнатқымыз келетінін айтамыз. Оларда 0 бар, ал PB5 OUTPUT түйреуіші ретінде орнатылады, өйткені біз бұл жерге 1 қойдық.

PortB, r16

Біз түйреуіштердің бағыттарын анықтадық, енді оларға кернеуді орнатуға болады. Жоғарыдағы жол r16 сақтау реестрінен сол екілік нөмірді PortB -ке көшіреді. Бұл барлық түйреуіштерді 5 вольтты құрайтын PB5 түйреуішінен басқа 0 вольтке орнатады.

2 -жаттығу: Сандық мультиметрді алыңыз, қара сымды жерге қосыңыз (GND), содан кейін PB0 мен PB7 аралығындағы әрбір түйреуішті қызыл сыммен тексеріңіз. Әрбір түйреуіштің кернеуі PortB -ке 0b00100000 енгізуге сәйкес келеді ме? Егер олар жоқ болса, неге олай деп ойлайсыз? (пин картасын қараңыз)

Бастау:

rjmp Бастау

Ақырында, жоғарыдағы бірінші жол - бұл кодтағы орынды белгілейтін «затбелгі». Бұл жағдайда бұл орынды «Бастау» деп белгілеңіз. Екінші жолда «Бастау белгісіне салыстырмалы түрде өту» делінген. Таза нәтиже - бұл компьютер шексіз циклге орналастырылған, ол қайтадан велосипедті Бастауға қайтарады. Бізге бұл қажет, себебі бізде бағдарламаның аяқталуы немесе құздан құлауы мүмкін емес, жарық жанып тұруы үшін бағдарлама жұмысын жалғастыруы керек.

3 -жаттығу: Бағдарлама жардан құлап кетуі үшін кодтан жоғарыдағы екі жолды алып тастаңыз. Не болады? Сіз Arduino «сәлем әлемі» ретінде қолданатын дәстүрлі «жыпылықтау» бағдарламасына ұқсас нәрсені көруіңіз керек. Неліктен бұлай әрекет етеді деп ойлайсыз? (Бағдарлама қардан құлаған кезде не болатынын ойлаңыз …)

5 -қадам: Қорытынды

Егер сіз осы уақытқа дейін жеткен болсаңыз, құттықтаймын! Сіз енді құрастыру кодын жаза аласыз, жинай аласыз және оны микроконтроллерге жүктей аласыз.

Бұл оқулықта сіз келесі пәрмендерді қолдануды үйрендіңіз:

ldi hregister, сан (0-255) санды жоғарғы жарты регистрге жүктейді (16-31)

тіркеуден шығыңыз, тіркеу нөмірін жұмыс регистрінен енгізу -шығару регистріне көшіреді

rjmp жапсырмасы «затбелгі» арқылы белгіленген бағдарламаның жолына өтеді (ол 204 нұсқаулардан аспауы керек - яғни салыстырмалы секіру)

Енді бұл негіздер жоқ болғандықтан, біз құрастыру мен жүктеу механикасын талқыламай -ақ, қызықты кодты және одан да қызықты схемалар мен құрылғыларды жазуды жалғастыра аламыз.

Сізге бұл кіріспе оқулық ұнады деп сенемін. Келесі оқулықта біз басқа схемалық компонентті (түйме) қосамыз және енгізу порттары мен шешімдерді қосу үшін кодты кеңейтеміз.

Ұсынылған: