Բովանդակություն:

AVR Assembler ձեռնարկ 1: 5 քայլ
AVR Assembler ձեռնարկ 1: 5 քայլ

Video: AVR Assembler ձեռնարկ 1: 5 քայլ

Video: AVR Assembler ձեռնարկ 1: 5 քայլ
Video: Areg's Time - Tarva Eghanakner | Տարվա Եղանակներ 2024, Նոյեմբեր
Anonim
AVR Assembler ձեռնարկ 1
AVR Assembler ձեռնարկ 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 հավաքողը և ավրդուդե: Այնուամենայնիվ, եթե դուք ստանում եք 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 պորտին: Նախ պետք է տեղադրել bootloader- ը 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 ++ ծրագրավորման համար: Եթե դուք հոգնել եք տեսնել, որ հավաքողը թքում է «անտեսելով պրագմայի հրահանգը» բողոքները, պարզապես մտեք ֆայլ և ջնջեք կամ մեկնաբանեք #պրագմայով սկսվող բոլոր տողերը:

Լավ, հիմա, երբ դուք ունեք ձեր միկրոկառավարիչը պատրաստ, ձեր հավաքողը պատրաստ է, և ձեր ծրագրավորողը պատրաստ է, մենք կարող ենք գրել մեր առաջին ծրագիրը:

Նշում. Եթե դուք ATmega328P- ի փոխարեն օգտագործում եք ATtiny85- ը, ապա ձեզ հարկավոր է tn85def.inc կոչվող այլ ներառող ֆայլ: Ես նաև կցեմ այն (նշեմ, որ այն պետք է անվանեի tn85def.inc.txt, որպեսզի Instructables- ը թույլ տա ինձ ներբեռնել այն): Այսպիսով, ես խորհուրդ եմ տալիս այն ձեռք բերել և ինքներդ կազմել ՝ git clone

Քայլ 3: Բարև աշխարհ

Այս առաջին ձեռնարկի նպատակն է կառուցել ստանդարտ առաջին ծրագիրը, որը գրում է ցանկացած նոր լեզու սովորելիս կամ էլեկտրոնիկայի ցանկացած նոր հարթակ ուսումնասիրելիս: "Բարեւ աշխարհ!." Մեր դեպքում մենք պարզապես ցանկանում ենք գրել հավաքման լեզվի ծրագիր, հավաքել այն և վերբեռնել այն մեր միկրոկոնտրոլերի վրա: Րագիրը կհանգեցնի LED- ի միացման: LED- ի «թարթել», ինչպես անում են սովորական Arduino բարև աշխարհի ծրագրի համար, իրականում հավաքների լեզվով շատ ավելի բարդ ծրագիր է, ուստի մենք դա դեռ չենք անի: Մենք պատրաստվում ենք գրել ամենապարզ «մերկ ոսկորների» ծածկագիրը նվազագույն անհարկի բմբուլով:

Նախ միացրեք LED- ը PB5- ից (տե՛ս pinout դիագրամը), որը նաև կոչվում է Digital Out 13 arduino- ում, 220 օհմ ռեզիստորին, այնուհետև GND- ին: Այսինքն

PB5 - LED - R (220 օհմ) - GND

Հիմա ծրագիրը գրելու համար: Բացեք ձեր նախընտրած տեքստային խմբագրիչը և ստեղծեք «hello.asm» անունով ֆայլ

բարև: ոգեշնչում

; միացնում է LED, որը միացված է PB5- ին (թվային ելք 13): ներառել "./m328Pdef.inc" ldi r16, 0b00100000 out DDRB, r16 out PortB, r16 Սկիզբ. rjmp Սկիզբ

Վերը նշվածը ծածկագիրն է: Մենք այն կանցնենք տող առ տող մեկ րոպեում, բայց նախ թույլ տվեք համոզվել, որ կարող ենք այն գործի դնել ձեր սարքի վրա:

Ֆայլը ստեղծելուց հետո տերմինալում այն հավաքում եք հետևյալ կերպ.

ավրա բարև: ոգեշնչում

սա կհավաքի ձեր ծածկագիրը և կստեղծի hello.hex անունով ֆայլ, որը մենք կարող ենք այն վերբեռնել հետևյալ կերպ.

avrdude -p m328p -c stk500v1 -b 57600 -P /dev /ttyUSB0 -U flash: w: hello.hex

եթե դուք օգտագործում եք տախտակի arduino, ապա ստիպված կլինեք սեղմել տախտակի arduino- ի վերակայման կոճակը `վերը նշված հրամանը կատարելուց անմիջապես առաջ: Նկատի ունեցեք, որ հնարավոր է նաև ստիպված լինեք ավելացնել sudo- ն առջևում կամ կատարել այն որպես արմատ: Նաև նկատի ունեցեք, որ որոշ 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 տող առ տող

Այս ներածական ձեռնարկը ավարտելու համար մենք հերթով կանցնենք hello.asm ծրագրի միջոցով `տեսնելու, թե ինչպես է այն աշխատում:

բարև: ոգեշնչում

; միացնում է LED- ը, որը միացված է PB5- ին (թվային ելք 13)

Կիսակետից հետո ամեն ինչ անտեսվում է հավաքողի կողմից, ուստի այս առաջին երկու տողերը պարզապես «մեկնաբանություններ» են, որոնք բացատրում են, թե ինչ է անում ծրագիրը:

. ներառել "./m328Pdef.inc"

Այս տողը հուշում է հավաքողին ներառել ձեր ներբեռնած m328Pdef.inc ֆայլը: Դուք կարող եք տեղադրել այն նմանատիպ ֆայլերի գրացուցակում և այնուհետև փոխել վերը նշված տողը ՝ դրան մատնանշելով այնտեղ:

ldi r16, 0b00100000

ldi- ն նշանակում է «բեռը անմիջականորեն» և հավաքողին ասում է, որ վերցնի աշխատանքային գրանցամատյանը, այս դեպքում ՝ r16, և դրանում բեռնեք երկուական թիվ ՝ այս դեպքում 0b00100000: Առջևի 0b- ն ասում է, որ մեր թիվը երկուական է: Եթե մենք ցանկանայինք, կարող էինք ընտրել մեկ այլ հիմք, ինչպիսին է վեցերորդը: Այդ դեպքում մեր թիվը կլիներ 0x20, որը վեցանկյուն է 0b00100000- ի համար: Կամ մենք կարող էինք օգտագործել 32 -ը, որը նույն հիմքի համար 10 տասնորդական է:

Exորավարժություն 1. Փորձեք վերը նշված տողում համարը փոխել վեցանկյունականի, այնուհետև տասնորդականի և հաստատել, որ այն դեռ գործում է յուրաքանչյուր դեպքում:

Երկուական օգտագործելը ամենապարզն է, չնայած նավահանգիստների և գրանցիչների աշխատանքի եղանակի պատճառով: Մենք ավելի մանրամասն կքննարկենք atmega328p- ի նավահանգիստներն ու գրանցամատյանները ապագա ձեռնարկներում, բայց առայժմ ես պարզապես կասեմ, որ մենք օգտագործում ենք r16- ը որպես մեր «աշխատանքային գրանցամատյան», ինչը նշանակում է, որ մենք պարզապես այն կօգտագործենք որպես պահվող փոփոխական: թվերը ներսում «գրանցամատյանը» 8 բիթանոց հավաքածու է: Նշանակում է 8 կետ, որոնք կարող են լինել 0 կամ 1 («անջատված» կամ «միացված»): Երբ մենք վերբեռնում ենք 0b00100000 երկուական համարը գրանցամատյանում ՝ օգտագործելով վերը նշված տողը, մենք պարզապես այդ թիվը պահում ենք գրանցամատյանում r16:

դուրս DDRB, r16

Այս տողը կոմպիլյատորին ասում է, որ r16 գրանցամատյանի բովանդակությունը պատճենվի DDRB գրանցամատյանում: DDRB- ը նշանակում է «Տվյալների ուղղման գրանցամատյան B» և այն սահմանում է «կապում» PortB- ում: 328p- ի pinout քարտեզի վրա կարող եք տեսնել, որ կան 8 PIN պիտակ ՝ PB0, PB1,…, PB7: Այս կապանքները ներկայացնում են «PortB» - ի «բիթերը», և երբ 00100000 երկուական համարը տեղադրում ենք DDRB գրանցամատյանում, մենք ասում ենք, որ մենք ցանկանում ենք, որ PB0, PB1, PB2, PB3, PB4, PB6 և PB7 համարները տեղադրվեն որպես INPUT կապում Դրանցում 0 -ն է, իսկ PB5- ը դրված է որպես ԵԼՔ փին, քանի որ այդ տեղում մենք դնում ենք 1:

դուրս PortB, r16

Այժմ, երբ մենք ամրագրել ենք կապանքների ուղղությունները, այժմ կարող ենք սահմանել դրանց վրա լարումները: Վերոնշյալ տողը պատճենում է նույն երկուական համարը մեր պահեստային ռեգիստր r16- ից PortB: Սա սահմանում է բոլոր կապումներն 0 վոլտի, բացառությամբ PB5 կապի բարձրության, որը 5 վոլտ է:

Ercորավարժություն 2. Վերցրեք թվային բազմաչափ, միացրեք սև կապարը գետնին (GND), ապա փորձարկեք PB0- ից PB7 կապանքներից յուրաքանչյուրը կարմիր կապարով: Արդյո՞ք յուրաքանչյուր կապում առկա լարումները ճիշտ այնպիսին են, որ համապատասխանում են PortB- ում 0b00100000 դնելուն: Եթե կան, որ չկան, ինչո՞ւ եք կարծում, որ դա այդպես է: (տես կապի քարտեզը)

Սկիզբ:

rjmp Սկիզբ

Ի վերջո, վերևի առաջին տողը «պիտակ» է, որը պիտակավորում է ծածկագրում տեղ: Այս դեպքում այդ տեղը նշելով որպես «Սկսել»: Երկրորդ տողում ասվում է «հարաբերական անցում դեպի սկիզբ պիտակի վրա»: Theուտ արդյունքն այն է, որ համակարգիչը տեղադրվում է անսահմանափակ հանգույցի մեջ, որը պարզապես հեծանիվը հետ է պահում դեպի Սկիզբ: Սա մեզ պետք է, քանի որ մենք չենք կարող այնպես անել, որ ծրագիրը պարզապես ավարտվի կամ ընկնի ժայռից, ծրագիրը պարզապես պետք է շարունակի աշխատել, որպեսզի լույսը լուսավորված մնա:

Ercորավարժություն 3. Հեռացրեք վերը նշված երկու տողերը ձեր ծածկագրից, որպեսզի ծրագիրը ընկնի ժայռից: Ինչ է կատարվում? Դուք պետք է տեսնեք մի բան, որը նման է ավանդական «թարթել» ծրագրին, որն օգտագործվում է Արդուինոյի կողմից որպես իրենց «բարև աշխարհ»: Ձեր կարծիքով, ինչո՞ւ է դա այդպես գործում: (Մտածեք, թե ինչ պետք է տեղի ունենա, երբ ծրագիրը ընկնի ժայռից …)

Քայլ 5: Եզրակացություն

Եթե այսքան հեռու եք հասել, ապա շնորհավորում եմ: Այժմ դուք կարող եք գրել հավաքման ծածկագիր, հավաքել այն և բեռնել այն ձեր միկրոկոնտրոլերի վրա:

Այս ձեռնարկում դուք սովորել եք, թե ինչպես օգտագործել հետևյալ հրամանները.

ldi hregister, թիվը մի թիվ է բեռնում (0-255) վերին կեսի գրանցամատյանում (16-31)

ioregister- ից, գրանցել մի շարք պատճեններ աշխատանքային ռեգիստրից դեպի I/O գրանցամատյան

rjmp պիտակը ցատկում է «պիտակ» պիտակով ծրագրի տող (որը չի կարող 204 հրահանգից ավելի հեռու լինել, այսինքն ՝ հարաբերական թռիչք)

Այժմ, երբ այդ հիմունքները դուրս են եկել ճանապարհից, մենք կարող ենք շարունակել գրել ավելի հետաքրքիր ծածկագիր և ավելի հետաքրքիր սխեմաներ և սարքեր ՝ առանց քննարկելու կազմման և բեռնման մեխանիկան:

Հուսով եմ, որ ձեզ դուր եկավ այս ներածական ձեռնարկը: Հաջորդ ձեռնարկում մենք կավելացնենք սխեմայի մեկ այլ բաղադրիչ (կոճակ) և կընդլայնենք մեր ծածկագիրը ՝ ներառելով մուտքային նավահանգիստներն ու որոշումները:

Խորհուրդ ենք տալիս: