Агуулгын хүснэгт:

AVR Assembler заавар 1: 5 алхам
AVR Assembler заавар 1: 5 алхам

Видео: AVR Assembler заавар 1: 5 алхам

Видео: AVR Assembler заавар 1: 5 алхам
Видео: Камера видеонаблюдения XMEYE ICSEE БЕСПРОВОДНАЯ!!! 2024, Долдугаар сарын
Anonim
AVR ассемблерийн заавар 1
AVR ассемблерийн заавар 1

Би Arduino -д ашиглагддаг микроконтроллер болох Atmega328p -ийн ассемблер хэлний програмуудыг хэрхэн бичих талаар хэд хэдэн заавар бичихээр шийдлээ. Хэрэв хүмүүс сонирхож байвал би чөлөөт цаг дуусах хүртэл, эсвэл хүмүүс уншихаа болих хүртэл долоо хоногт нэг удаа үргэлжлүүлэн гаргадаг.

Би Arch linux ажиллуулж байгаа бөгөөд талхны тавцан дээр суурилуулсан atmega328p-pu дээр ажиллаж байна. Та үүнийг надтай адилхан хийж болно, эсвэл компьютер дээрээ arduino залгаж, микроконтроллер дээр ийм байдлаар ажиллах боломжтой.

Бид 328p -д зориулж ихэнх ардуино програмтай адил програм бичих болно, гэхдээ ижил програм, техникүүд нь Atmel микроконтроллеруудын аль нэгэнд ажиллах болно, дараа нь (хэрэв сонирхол байгаа бол) бид зарим програмуудтай ажиллах болно гэдгийг анхаарах хэрэгтэй. бусад нь бас. Микроконтроллерийн талаархи дэлгэрэнгүй мэдээллийг Atmel мэдээллийн хуудас, зааварчилгааны гарын авлагаас авах боломжтой. Би тэднийг энэ зааварчилгаанд хавсаргаж байна.

Энд танд хэрэгтэй зүйл байна:

1. Талхны самбар

2. Arduino, эсвэл зүгээр л микроконтроллер

3. Linux үйлдлийн системтэй компьютер

4. git: git clone ашиглан avra ассемблер хийх https://github.com/Ro5bert/avra.git эсвэл хэрэв та ubuntu эсвэл debian дээр суурилсан системийг ашиглаж байгаа бол "sudo apt install avra" гэж бичээд аврагчийг хоёуланг нь авах болно. болон 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 дээр bootloader суулгах хэрэгтэй бөгөөд хамгийн хялбар арга бол 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 гэж нэрлэх ёстой байсан тул зааварчилгаа нь үүнийг байршуулах боломжтой болно.) Гэсэн хэдий ч хэрэв та github -аас avra ассемблер авсан бол танд эдгээр файлуудын аль аль нь байгаа болно. Тиймээс би үүнийг олж аваад өөрөө эмхэтгэхийг зөвлөж байна: git clone

Алхам 3: Сайн байна уу Дэлхий

Энэхүү анхны гарын авлагын зорилго нь шинэ хэл сурах эсвэл электроникийн шинэ платформыг судлахдаа бичсэн анхны стандарт програмыг бий болгох явдал юм. "Сайн уу ертөнц!" Манай тохиолдолд бид угсрах хэлний програм бичиж, угсарч, микроконтроллер дээрээ байршуулахыг л хүсч байна. Хөтөлбөр нь LED асаах болно. Энгийн Arduino hello world програмын нэгэн адил LED -ийг "анивчих" шалтгаан нь угсрах хэл дээрх илүү төвөгтэй програм тул бид одоохондоо үүнийг хийхгүй. Бид хамгийн энгийн "нүцгэн яс" кодыг хамгийн бага шаардлагагүй хөвсгөрөөр бичих гэж байна.

Эхлээд arduino дээр Digital Out 13 гэж нэрлэдэг PB5 LED -ийг (холболтын диаграмыг үзнэ үү) 220 ом эсэргүүцэл, дараа нь GND руу холбоно уу. Өөрөөр хэлбэл

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

Одоо програм бичих. Дуртай текст засварлагчаа нээгээд "hello.asm" нэртэй файл үүсгээрэй.

; Сайн уу.asm

; PB5 (дижитал гаралт 13) -д холбогдсон LED -ийг асаана. "./m328Pdef.inc" ldi r16, DDRB -ээс 0b00100000, r16 -аас PortB, r16 эхлэх: rjmp эхлэх

Дээрх код байна. Бид үүнийг нэг минутын дотор дараалан давах болно, гэхдээ эхлээд үүнийг таны төхөөрөмж дээр ажиллуулах боломжтой эсэхийг шалгаарай.

Та файлыг үүсгэсний дараа терминал дээр дараах байдлаар угсарна.

avra hello.asm

Энэ нь таны кодыг угсарч, hello.hex нэртэй файл үүсгэх бөгөөд бид үүнийг дараах байдлаар байршуулж болно.

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

Хэрэв та arduino -ийн самбарыг ашиглаж байгаа бол дээрх тушаалыг гүйцэтгэхийн өмнөхөн талхны самбар дээрх arduino -г дахин тохируулах товчийг дарах хэрэгтэй болно. Та урд талд нь sudo нэмэх эсвэл root болгон ажиллуулах шаардлагатай болж магадгүйг анхаарна уу. Зарим arduino (Arduino UNO гэх мэт) дээр та битийн хурдыг -b 115200 болгож, -P /dev /ttyACM0 портыг өөрчлөх шаардлагатай болж магадгүйг анхаарна уу (хэрэв та буруу гарын үсгийн талаар avrdude -аас алдаа авбал a нэмэх хэрэгтэй. F тушаал руу)

Хэрэв бүх зүйл зохих ёсоороо хийгдсэн бол одоо LED гэрэл асах болно … "Сайн уу, Дэлхий!"

Хэрэв та ATtiny85 ашиглаж байгаа бол avrdude тушаал дараах байдалтай байна.

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

Алхам 4: Hello.asm

Энэхүү танилцуулгын хичээлийг дуусгахын тулд бид hello.asm програмыг хэрхэн яаж ажилладгийг харах болно.

; Сайн уу.asm

; PB5 (дижитал гаралт 13) -д холбогдсон LED асдаг

Цэг таслалаас хойшхи бүх зүйлийг ассемблер үл тоомсорлодог тул эдгээр эхний хоёр мөр нь програмын юу хийж байгааг тайлбарласан "сэтгэгдэл" юм.

.include "./m328Pdef.inc"

Энэ мөр нь ассемблерт татаж авсан m328Pdef.inc файлыг оруулахыг хэлдэг. Та үүнийг ижил төстэй файлуудын лавлахад оруулж, дараа нь дээрх мөрийг тэнд зааж өгөхийг хүсч болно.

ldi r16, 0b00100000

ldi нь "нэн даруй ачаалах" гэсэн утгатай бөгөөд ассемблерт энэ тохиолдолд r16 гэсэн ажлын регистрийг авч, 0b00100000 гэсэн хоёртын дугаарыг оруулахыг хэлдэг. Урд 0b дээр манай тоо хоёртын тоонд бичигдсэн байна. Хэрэв бид хүсвэл арван зургаан цэг гэх мэт өөр баазыг сонгож болох байсан. Энэ тохиолдолд манай дугаар 0x20 байх байсан бөгөөд энэ нь 0b00100000 -ийн арван зургаан оронтой тоо байх болно. Эсвэл бид ижил тооны 10 аравтын бутархай 32 -ийг ашиглаж болох байсан.

Дасгал 1: Дээрх мөр дэх дугаарыг арван зургаат, дараа нь аравтын бутархай болгон өөрчилж, тухайн тохиолдол бүрт ажиллаж байгаа эсэхийг шалгаарай.

Порт ба бүртгэлийн үйл ажиллагааны ачаар хоёртын файлыг ашиглах нь хамгийн хялбар байдаг. Бид цаашид atmega328p -ийн портууд болон бүртгэлүүдийг нарийвчлан авч үзэх болно, гэхдээ одоогоор бид r16 -ийг "ажлын бүртгэл" болгон ашиглаж байгаа бөгөөд үүнийг бид хадгалдаг хувьсагч болгон ашиглах болно гэсэн үг юм. "in register" гэдэг нь 8 битийн багц юм. 0 эсвэл 1 ("унтраасан" эсвэл "ассан") байж болох 8 цэг гэсэн үг. Дээрх мөрийг ашиглан 0b00100000 хоёртын дугаарыг регистрт ачаалах үед бид энэ дугаарыг r16 регистрт хадгалсан болно.

DDRB -ээс гарсан, r16

Энэ мөр нь хөрвүүлэгчид r16 регистрийн агуулгыг DDRB регистрт хуулбарлахыг хэлдэг. DDRB нь "Data Direction Register B" гэсэн товчлол бөгөөд PortB дээрх "зүү" -ийг тохируулдаг. 328p -ийн зүү газрын зураг дээр PB0, PB1,…, PB7 гэсэн 8 шонгууд байгааг харж болно. Эдгээр тээглүүрүүд нь "PortB" -ийн "битүүдийг" илэрхийлдэг бөгөөд бид 00100000 хоёртын дугаарыг DDRB регистрт ачаалахдаа PB0, PB1, PB2, PB3, PB4, PB6, PB7 -ийг INPUT тээглүүрээр оруулахыг хүсч байна гэж хэлж байна. Тэдгээрт 0 -ийг оруулсан бөгөөд PB5 нь 1 -ийг байрлуулснаас хойш OUTPUT зүү болж тохируулагдсан болно.

PortB, r16 -ээс гарна

Одоо бид тээглүүрийн чиглэлийг тогтоосны дараа тэдгээрийн хүчдэлийг тохируулж болно. Дээрх мөр нь манай r16 хадгалах бүртгэлээс ижил хоёртын дугаарыг PortB руу хуулж авдаг. Энэ нь PB5 зүүгээс бусад бүх винтийг 0 вольт болгож 5 вольтоор HIGH болгож тохируулна.

Дасгал 2: Тоон мултиметрийг аваад хар тугалгыг газардуулаад (GND) залгаж, дараа нь PB0 -ээс PB7 хүртэлх зүү тус бүрийг улаан туяагаар шалгана. Зүү тус бүрийн хүчдэл PortB дээр 0b00100000 оруулахтай яг таарч байна уу? Хэрэв тийм зүйл байхгүй бол яагаад тэгж бодож байна вэ? (зүү газрын зургийг үзнэ үү)

Эхлэх:

rjmp Эхлэх

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

Дасгал 3: Дээрх хоёр мөрийг кодоосоо салгаад програм хадан дээрээс унах болно. Юу болсон бэ? Та Arduino -гийн "сайн уу ертөнц!" Болгон ашигладаг уламжлалт "анивчих" програмтай төстэй зүйлийг харах ёстой. Та яагаад ийм үйлдэл хийдэг гэж бодож байна вэ? (Хөтөлбөр хадан дээрээс унахад юу тохиолдох ёстой талаар бодож үзээрэй.)

Алхам 5: Дүгнэлт

Хэрэв та ийм амжилтанд хүрсэн бол танд баяр хүргэе! Та одоо угсрах кодыг бичиж, угсарч, микроконтроллер дээрээ ачаалах боломжтой боллоо.

Энэхүү гарын авлагад та дараах тушаалуудыг хэрхэн ашиглах талаар сурсан болно.

ldi hregister, тоо нь дээд хагас бүртгэлд тоо (0-255) ачаална (16-31)

ioregister out, register нь ажлын бүртгэлээс оруулсан оролтын бүртгэлийн дугаарыг хуулна

rjmp шошго нь "шошго" гэсэн шошготой програмын мөр рүү үсэрдэг (энэ нь 204 заавраас хол байж болохгүй - харьцангуй үсрэлт)

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

Энэхүү танилцуулах хичээл танд таалагдсан гэж найдаж байна. Дараагийн гарын авлагад бид хэлхээний өөр нэг бүрэлдэхүүн хэсгийг (товчлуур) нэмж оролтын портууд болон шийдвэрүүдийг оруулахын тулд кодоо өргөжүүлэх болно.

Зөвлөмж болгож буй: