Мазмуну:

AVR Assembler үйрөткүчү 1: 5 кадамдар
AVR Assembler үйрөткүчү 1: 5 кадамдар

Video: AVR Assembler үйрөткүчү 1: 5 кадамдар

Video: AVR Assembler үйрөткүчү 1: 5 кадамдар
Video: MKS SGEN L V1.0 - A4988 Stepper Drivers 2024, Ноябрь
Anonim
AVR Assembler үйрөткүчү 1
AVR Assembler үйрөткүчү 1

Мен Arduinoдо колдонулган микроконтроллер болгон Atmega328p үчүн ассемблердик программаларды жазуу боюнча бир катар окуу куралдарын жазууну чечтим. Эгерде адамдар кызыгып калса, мен бош убактым бүтмөйүнчө, же башка адамдар аларды окууну токтотмойунча, жумасына бир жолу чыгарууну улантам.

Мен Arch Linuxту иштетип жатам жана нан табакка орнотулган atmega328p-pu менен иштеп жатам. Сиз муну мен сыяктуу эле жасай аласыз же сиз жөн гана компьютериңизге arduino сайып, микроконтроллерде иштей аласыз.

Биз 328p үчүн программаларды ардуино программасындагылар сыяктуу эле жазабыз, бирок ошол эле программалар жана ыкмалар 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 ассемблерин аласыз. жана avrdude. Бирок, эгер сиз github аркылуу акыркы версиясын алсаңыз, анда керектүү файлдардын бардыгын аласыз, башкача айтканда, m328Pdef.inc жана tn85def.inc файлдары бар.

5. avrdude

Менин AVR ассемблер окуу куралдарымдын толук топтомун бул жерден тапса болот:

1 -кадам: Тест тактасын куруу

Тестирлөө комиссиясын куруу
Тестирлөө комиссиясын куруу

Сиз кааласаңыз, ардуинону колдонуп, бул окуу куралдарынын бардыгын жасай аласыз. Бирок, биз ассемблер тилинде коддоо жөнүндө сөз кылып жаткандыктан, биздин философиябыз табигый түрдө бардык перифералдарды алып салуу жана микроконтроллердин өзү менен түздөн -түз аракеттенүү болуп саналат. Демек, муну мындай кылуу кызыктууураак болмок деп ойлобойсузбу?

Ким макул болсо, анда микроконтроллерди ардуинодон сууруп алып, андан кийин бул жердеги көрсөтмөлөрдү аткаруу менен "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 -кадам: Assembler жана Avrdude орнотуңуз

Эми сиз бул үйрөткүчтүн биринчи кадамында берилген шилтемелерден ассемблерди жана avrdude жүктөп, орното аласыз. Балким, эгер сиз буга чейин Arduino менен иштешкен болсоңуз, анда сизде avrdude орнотулган болушу мүмкүн.

Avra орнотулгандан кийин, аны менен кошо "булактар" деп аталган субдиректория бар экенин байкайсыз жана ал каталогдо камтылган файлдардын топтому бар. Бул avra менен программалай ала турган бардык микроконтроллерлер. Сиз бул жерде колдонуп жаткан 328p үчүн файл жок экенин дароо байкайсыз. Мен бирин тиркем. Файл m328Pdef.inc деп аталышы керек жана сиз камтыган каталогдун ичине же сиз каалаган башка жерге коюшуңуз керек. Биз аны ассамблея тили программаларыбызга киргизебиз. Мунун баары, биз алардын он алтылык аттарын колдонбошубуз үчүн, маалымат баракчасынан микроконтроллердин аталыштарындагы реестрлердин ар бирин берет. Жогорудагы файл "прагма көрсөтмөлөрүн" камтыйт, анткени ал C жана C ++ программалоо үчүн иштелип чыккан. Эгерде сиз монтаждоочунун "прагма көрсөтмөсүнө көңүл бурбоо" боюнча түкүрүп жатканын көрүп чарчасаңыз, анда файлга кирип, #pragma менен башталган бардык саптарды өчүрүп же комментарий бериңиз.

Макул, эми сизде микроконтроллер даяр, ассемблер жана программист даяр, биз биринчи программабызды жаза алабыз.

Эскертүү: Эгерде сиз ATmega328P ордуна ATtiny85 колдонуп жатсаңыз, анда сизге tn85def.inc деп аталган башка файл керек. Мен аны дагы тиркейм (эскертүү, мен аны tn85def.inc.txt деп атоого туура келди, аны Instructables мага жүктөөгө уруксат берди.) Бирок, эгерде сиз githubдан avra assembler алган болсоңуз, анда сизде бул файлдардын экөө тең бар. Ошентип, мен аны алып, өзүң түзүүнү сунуштайм: git clone

3 -кадам: Hello World

Бул биринчи үйрөткүчтүн максаты - жаңы тилди үйрөнүүдө же кандайдыр бир жаңы электроника платформасын изилдөөдө жазган стандарттык биринчи программаны түзүү. "Салам дүйнө!." Биздин учурда, биз жөн гана ассемблер тили программасын жазып, аны чогултуп, микроконтроллерибизге жүктөп берүүнү каалайбыз. Программа LEDди күйгүзүүгө себеп болот. Светодиоддун кадимки Arduino салам программасына окшоп "жарк" этип кетиши чындыгында ассамблея тилиндеги бир топ татаал программа, ошондуктан биз азырынча андай кылбайбыз. Биз эң жөнөкөй "жылаңач сөөктөр" кодун минималдуу керексиз түкчөлөр менен жазабыз.

Биринчиден, PB5тен келген LEDди (pinout диаграммасын караңыз) arduino боюнча Digital Out 13 деп аталат, 220 омдук резисторго, андан кийин GNDге. Башкача айтканда

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

Эми программаны жазуу. Сүйүктүү текст редакторуңузду ачыңыз жана "hello.asm" деп аталган файлды түзүңүз.

; hello.asm

; PB5ке туташкан LEDди күйгүзөт (санариптик 13). Inlude "./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 flash: w: hello.hex

Эгерде сиз нан ардуиносун колдонуп жатсаңыз, анда жогорудагы буйрукту аткарар алдында эле ардуинодогу панелдин абалга келтирүү баскычын басууга туура келет. Эске алыңыз, сиз алдыңызга Sudo кошуп же аны root катары аткарышыңыз керек болушу мүмкүн. Ошондой эле, кээ бир arduino'дордо (Arduino UNO сыяктуу) бит ылдамдыгын -b 115200 жана порт -P /dev /ttyACM0го өзгөртүүгө туура келерин эске алыңыз (эгер сиз avrdudeдан жараксыз түзмөктүн кол тамгасы жөнүндө ката алсаңыз, жөн гана кошуңуз - F командасына)

Эгерде баары ойдогудай иштесе, анда сизде светодиод күйөт … "" Салам дүйнө!"

Эгерде сиз ATtiny85 колдонуп жатсаңыз, анда avrdude буйругу мындай болот:

avrdude -p attiny85 -c usbtiny -U flash: w: hello.hex

4-кадам: Hello.asm Line-by-line

Бул киришүү куралын бүтүрүү үчүн, биз hello.asm программасын сап-сап аркылуу карап, анын кантип иштээрин көрөбүз.

; hello.asm

; PB5ке туташкан LEDди күйгүзөт (санариптик 13)

Үтүрлүү үтүрдөн кийинки нерселердин баарын монтаждоочу этибарга албайт, демек, бул биринчи эки сап программанын эмне экенин түшүндүргөн "комментарийлер".

.include "./m328Pdef.inc"

Бул линия ассамблеяга сиз жүктөгөн m328Pdef.inc файлын кошууну айтат. Сиз муну окшош файлдардын каталогуна салып, анан ошол жакты көрсөтүү үчүн жогорудагы сапты өзгөрткүңүз келиши мүмкүн.

ldi r16, 0b00100000

ldi "дароо жүктөө" дегенди билдирет жана монтаждоочуга бул учурда r16 жумушчу регистрин алууну жана ага экилик санды жүктөөнү айтат, бул учурда 0b00100000. Алдыдагы 0b биздин номер экилик деп жазылган. Кааласак, он алты ондук сыяктуу башка базаны тандап алмакпыз. Мындай учурда биздин номерибиз 0x20 болмок, бул 0b00100000 үчүн он алтылык. Же биз ошол эле сан үчүн базалык 10 ондук болгон 32ди колдонмокпуз.

Exercise 1: Жогорудагы сапты он алтылыкка, андан кийин кодуңуздагы ондукка алмаштырып көрүңүз жана ал дагы деле ар бир учурда иштээрин текшериңиз.

Экиликти колдонуу эң жөнөкөй, бирок Порттор менен Регистрлердин иштешине байланыштуу. Биз келечектеги окуу куралдарында atmega328p порттору менен реестрлерин кененирээк талкуулайбыз, бирок азырынча мен r16ды "жумушчу реестрибиз" катары колдонуп жатканыбызды билдиребиз, бул аны биз сактаган өзгөрмө катары колдоно тургандыгыбызды билдирет. сандар. "регистр" - бул 8 биттен турган жыйынды. 0 же 1 ("өчүк" же "күйүк") болушу мүмкүн болгон 8 такты билдирет. 0b00100000 бинардык номерин жогорудагы линияны колдонуп реестрге жүктөгөндө, биз бул санды r16 реестрине сактап койдук.

DDRB чыгып, r16

Бул линия компиляторго r16 регистринин мазмунун DDRB реестрине көчүрүүнү айтат. DDRB "Data Direction Register B" дегенди билдирет жана PortBде "казыктарды" орнотот. 328p үчүн pinout картасында PB0, PB1,…, PB7 деп белгиленген 8 казык бар экенин көрө аласыз. Бул казыктар "PortB" "биттерин" билдирет жана 00100000 экилик санын DDRB реестрине жүктөгөндө, биз PB0, PB1, PB2, PB3, PB4, PB6 жана PB7дин INPUT казыктары катары орнотулушун каалайбыз деп айтып жатабыз. 0 аларда, ал эми PB5 ЧЫККАН пин катары коюлган, анткени биз ал жерге 1 койгонбуз.

PortB чыгып, r16

Эми биз казыктардын багыттарын белгилегенден кийин, аларга чыңалууларды орното алабыз. Жогорудагы сап ошол эле бинардык номерди r16 сактоо реестрибизден PortBге көчүрөт. Бул 5 вольт болгон PB5 пинден башкасынын баарына 0 вольтту орнотот.

Exercise 2: Санарип мультиметрди алып, кара коргошун жерге (GND) туташтырыңыз, андан кийин PB7 аркылуу PB7 аркылуу PB0 ар бир казыкты кызыл коргошун менен текшериңиз. Пинктин ар бириндеги чыңалуу PortBге 0b00100000 коюуга дал келеби? Эгерде андайлар жок болсо, анда эмне үчүн мындай деп ойлойсуз? (пин картасын караңыз)

Баштоо:

rjmp баштоо

Акырында, жогорудагы биринчи сап - бул коддогу такты белгилеген "энбелги". Бул учурда, бул жерди "Старт" деп белгилөө. Экинчи сапта "Старт этикеткасына салыштырмалуу секирүү" деп айтылат. Таза жыйынтык - бул компьютер чексиз циклге жайгаштырылган, ал велосипедди кайра Баштаганга чейин улантат. Бизге бул керек, анткени бизде программанын аягы же жардан кулашы мүмкүн эмес, программа жарык өчпөй калышы үчүн иштей бериши керек.

Exercise 3: Программа жардан кулап кетиши үчүн кодуңуздан жогорудагы эки сапты алып салыңыз. Эмне болот? Сиз Arduino колдонгон кадимки "ирмөө" программасына окшош нерсени көрүшүңүз керек "салам дүйнө!". Сиздин оюңузча, ал эмне үчүн мындай иштейт? (Программа аскадан кулаганда эмне болорун ойлонуп көр …)

5 -кадам: Жыйынтык

Эгерде сиз буга чейин жеткен болсоңуз, анда куттуктайбыз! Эми сиз монтаж кодун жаза аласыз, аны чогулта аласыз жана микроконтроллерге жүктөй аласыз.

Бул үйрөткүчтө сиз төмөнкү буйруктарды колдонууну үйрөндүңүз:

ldi hregister, номер жогорку жарым реестрге (0-255) санын жүктөйт (16-31)

ioregister чыккандан кийин, реестрдин номерин жумушчу реестрден I/O реестрине көчүрүңүз

rjmp энбелгиси "этикеткасы" менен белгиленген программанын сабына өтөт (ал 204 нускамадан ары болушу мүмкүн эмес - б.а. салыштырмалуу секирүү)

Эми бул негиздер жок болгондон кийин, биз компиляциялоонун жана жүктөөнүн механикасын талкуулабай туруп, кызыктуу кодду жана кызыктуу схемаларды жана түзмөктөрдү жазууну уланта алабыз.

Бул киришүү үйрөткүчү сизге жакты деп ишенем. Кийинки сабакта биз дагы бир райондук компонентти (баскычты) кошуп, кодубузду киргизүү портторун жана чечимдерди камтыйт.

Сунушталууда: