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

AVR Assembler заавар 2: 4 алхам
AVR Assembler заавар 2: 4 алхам

Видео: AVR Assembler заавар 2: 4 алхам

Видео: AVR Assembler заавар 2: 4 алхам
Видео: РАЗДАЕТ WIFI СЛЕДИТ ЗА ЧЕЛОВЕКОМ 4G камера видеонаблюдения 2024, Долдугаар сарын
Anonim
AVR Assembler заавар 2
AVR Assembler заавар 2

Энэхүү заавар нь "AVR Assembler Tutorial 1" -ийн үргэлжлэл юм

Хэрэв та 1 -р хичээлийг үзээгүй бол одоо зогсоод үүнийг хийх хэрэгтэй.

Энэхүү гарын авлагад бид Arduino -д ашигласан atmega328p -ийн ассемблер хэлний програмчлалын судалгааг үргэлжлүүлэх болно.

Танд хэрэгтэй болно:

  1. 1 -р зааварт заасан талхтай самбар Arduino эсвэл энгийн Arduino
  2. LED
  3. 220 Ом эсэргүүцэл
  4. түлхэх товчлуур
  5. талхны самбар дээр хэлхээ хийх утас холбох
  6. Зааварчилгааны гарын авлага: www.atmel.com/images/atmel-0856-avr-instruction-s…
  7. Мэдээллийн хуудас: www.atmel.com/images/Atmel-8271-8-bit-AVR-Microco…

Миний хичээлүүдийн бүрэн цуглуулгыг эндээс авах боломжтой:

Алхам 1: Цахилгаан хэлхээг бий болгох

Цахилгаан хэлхээг бий болгох
Цахилгаан хэлхээг бий болгох

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

Үүнийг хэрхэн холбохыг энд харуулав.

PB0 (дижитал зүү 8) - LED - R (220 ом) - 5V

PD0 (дижитал зүү 0) - товчлуур - GND

Та LED -ээ PB0 -ийн оронд GND -тэй холбож зөв чиглүүлж байгаа эсэхийг шалгаж болно. Хэрэв юу ч болоогүй бол чиглэлийг өөрчилж, гэрэл асах ёстой. Дараа нь үүнийг PB0 руу дахин холбоод үргэлжлүүлнэ үү. Зураг дээр миний талхны самбар arduino хэрхэн холбогдсоныг харуулав.

Алхам 2: Чуулганы кодыг бичих

Чуулганы кодыг бичих
Чуулганы кодыг бичих

Дараах кодыг pushbutton.asm нэртэй текст файлд бичээд 1 -р хичээл дээр бичсэн шиг avra ашиглан хөрвүүлээрэй.

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

;************************************

; бичсэн: 1o_o7; огноо: 2014 оны 10 -р сарын 23; **********************************

.нолист

.include "m328Pdef.inc".list.def temp = r16; r16 ажлын бүртгэлийг temp rjmp Init гэж тодорхойлох; эхний мөрийг гүйцэтгэсэн

Үүн дотор:

сэрүүн температур; бүх битүүдийг 1 -р температурт тохируулна уу. DDRB гарах, температур; Өгөгдлийн чиглэл I/O дээр жаахан 1 гэж тохируулах; DDRB болох PortB -д бүртгүүлэх нь үүнийг тохируулдаг; pin гэж гаралт, 0 нь энэ зүүг оролт болгон тохируулах болно; Тиймээс энд бүх PortB тээглүүрүүд нь гаралтууд (1 болгож тохируулсан) ldi temp, 0b11111110; temp бүртгэлд "шууд" дугаарыг ачаалах; Хэрэв энэ нь зүгээр л ld байсан бол хоёр дахь аргумент; санах ойн байршил байх ёстой, харин DDRD, temp; mv temp DDRD, үр дүн нь PD0 бол оролт; бусад нь clr temp гаралт; temp дахь бүх битүүдийг 0 -ийн PortB, temp гэж тохируулсан; PortB дахь бүх битүүдийг (өөрөөр хэлбэл зүү) 0V ldi temp, 0b00000001 болгож тохируулах; PortD, temp -ийг түр зогсоохын тулд шууд дугаарыг ачаалах; PortD руу температурыг шилжүүлэх. PD0 нь татах эсэргүүцэлтэй; (өөрөөр хэлбэл 5V -д тохируулсан), учир нь энэ нь битэд 1 байна; бусад нь 0 -ээс хойш 0V байна.

Үндсэн:

температур, PinD; PinD нь PortD төлөвийг эзэмшдэг тул үүнийг temp руу хуулах; хэрэв товчлуур PD0 -т холбогдсон бол энэ нь байх болно; 0 товчлуурыг дарахад 1, өөрөөр хэлбэл; PD0 нь татах эсэргүүцэлтэй бөгөөд ихэвчлэн PortB, 5V -ийн температурт байдаг; дээрх 0 ба 1 -ийн уншилтыг PortB руу илгээдэг; энэ нь LED нь PB0,; PD0 нь LOW байхад PB0 -ийг LOW болгож эргүүлнэ; LED дээр (LED -ийн нөгөө тал нь; 5V -д холбогдсон бөгөөд энэ нь PB0 -ийг 0V болгож тохируулна; гүйдэл урсах болно) rjmp Үндсэн; Main -ийн эхлэл рүү буцдаг

Энэ удаад бид кодондоо өөр олон тайлбар оруулаад зогсохгүй үүнийг хэн бичсэн, хэзээ бичсэн тухай зарим мэдээллийг өгдөг толгой хэсэгтэй болохыг анхаарна уу. Кодын үлдсэн хэсгийг мөн хэсгүүдэд хуваасан болно.

Дээрх кодыг хөрвүүлсний дараа та үүнийг микроконтроллер дээр ачаалж, ажиллаж байгааг харах ёстой. LED товчлуурыг дарж байх үед асах ёстой бөгөөд дараа нь салгахад дахин унтрах ёстой. Би зураг дээр ямар харагдаж байгааг харууллаа.

Алхам 3: Кодын мөр мөрийн дүн шинжилгээ

Зорилго нь өөрөө ойлгомжтой учраас би зөвхөн тайлбар гэсэн мөрүүдийг алгасах болно.

.нолист

. "m328Pdef.inc".list -ийг оруулна уу

Эдгээр гурван мөрөнд бидний програмчилж буй ATmega328P -ийн Бүртгэл ба Бит тодорхойлолтыг агуулсан файл багтсан болно.. Nolist тушаал нь уг файлыг угсрахдаа үйлдвэрлэх pushbutton.lst файлд оруулахгүй байхыг ассемблейчдад хэлдэг. Энэ нь жагсаалтын сонголтыг унтраадаг. Файлыг оруулсны дараа.list командын тусламжтайгаар жагсаалтын сонголтыг дахин идэвхжүүлнэ. Үүнийг хийх болсон шалтгаан нь m328Pdef.inc файл нь нэлээд урт бөгөөд бид үүнийг жагсаалтын файлаас харах шаардлагагүй юм. Манай ассемблер, avra нь жагсаалтын файлыг автоматаар үүсгэдэггүй бөгөөд хэрэв хүсвэл бид дараах тушаалыг ашиглан угсрах болно.

avra -l товчлуур.лст товчлуур.asm

Хэрэв та үүнийг хийвэл энэ нь pushbutton.lst нэртэй файл үүсгэх бөгөөд хэрэв та энэ файлыг шалгавал програмынхаа кодыг нэмэлт мэдээлэлтэй хамт харуулах болно. Хэрэв та нэмэлт мэдээллийг харвал мөрүүд нь C: -ээр эхэлж, дараа нь кодыг санах ойд байрлуулсан зургаан өнцөгт харьцангуй хаягийг харах болно. Үндсэндээ энэ нь эхний тушаалаар 000000 -аас эхэлж, дараагийн тушаал бүрээр тэндээс нэмэгддэг. Санах ой дахь харьцангуй байршлын дараах хоёр дахь багана нь командын аргументийн зургаан өнцөгт код, дараа нь командын зургаан өнцөгт код юм. Бид жагсаалтын файлуудын талаар цаашдын хичээл дээр цаашид хэлэлцэх болно.

.def температур = r16; ажлын бүртгэл r16 -ийг температур гэж тодорхойлно

Энэ мөрөнд "temp" хувьсагчийг r16 "ажлын бүртгэл" -тэй тэнцүү гэж тодорхойлохын тулд ".def" ассемблерын удирдамжийг ашигладаг. Бид r16 регистрийг янз бүрийн портууд болон регистрүүд рүү хуулахыг хүссэн тоог хадгалдаг бүртгэл болгон ашиглах болно (үүнийг шууд бичих боломжгүй).

Дасгал 1: Хоёртын дугаарыг шууд порт руу эсвэл DDRB гэх мэт тусгай бүртгэл рүү хуулж, кодыг угсрах үед юу болохыг хараарай.

Бүртгэл нь байт (8 бит) мэдээллийг агуулдаг. Үндсэндээ энэ нь ихэвчлэн SR-Latches-ийн цуглуулга бөгөөд тус бүр нь "бит" бөгөөд 1 эсвэл 0-ийг агуулдаг. Бид үүнийг дараа нь энэ цувралд хэлэлцэх (эсвэл бүр бүтээх!) Болно. Та "ажлын бүртгэл" гэж юу вэ, яагаад бид r16 -ийг сонгосон юм бол гэж гайхаж байж магадгүй юм. Бид үүнийг чипийн дотоод хэсгүүдийн намаг руу шумбахдаа дараагийн хичээл дээр ярилцах болно. Одоогоор би код бичих, физик тоног төхөөрөмж програмчлах гэх мэт зүйлийг хэрхэн хийхийг ойлгохыг хүсч байна. Дараа нь танд микроконтроллерийн санах ой, бүртгэлийн шинж чанарыг ойлгоход хялбар болгох туршлагаас авсан лавлагааны хүрээ байх болно. Ихэнх танилцах сурах бичиг, хэлэлцүүлэг үүнийг эсрэгээр хийдэг гэдгийг би ойлгож байна, гэхдээ гарын авлагыг уншихаасаа өмнө дэлхийн өнцөг булан бүрт хүрэхийн тулд видео тоглоом тоглох нь эхлээд гарын авлагыг уншихаас хамаагүй хялбар гэдгийг би олж мэдсэн.

rjmp Init; эхний мөрийг гүйцэтгэсэн

Энэ мөр нь "Init" гэсэн шошготой "харьцангуй үсрэлт" бөгөөд дараагийн тушаал нь аль хэдийн Init -д орсон байгаа тул энд ашиглах шаардлагагүй, гэхдээ бид үүнийг ирээдүйд ашиглахаар оруулсан болно.

Үүн дотор:

сэрүүн температур; бүх битүүдийг 1 -р температурт тохируулна уу.

Init шошгоны дараа бид "set register" командыг ажиллуулдаг. Энэ нь бүртгэлийн "temp" (таны санаж байгаа r16) 8 битийг бүгдийг нь 1 болгож тохируулна. Тиймээс temp одоо 0b11111111 -ийг агуулдаг.

DDRB гарах, температур; Data Direction I/O бүртгэл дээр жаахан 1 гэж тохируулах

; DDRB болох PortB -ийн хувьд энэ зүүг гаралт болгон тохируулдаг; 0 нь энэ зүүг оролт болгон тохируулах болно; Тиймээс энд бүх PortB тээглүүрүүд нь гаралтууд (1 болгож тохируулсан)

DDRB регистр (PortB -ийн өгөгдлийн чиглэлийн бүртгэл) нь PortB дээрх аль зүүг (өөрөөр хэлбэл PB0 -ээс PB7 хүртэл) оролт, аль нь гаралт гэж тодорхойлсон болохыг хэлдэг. Бид PB0 зүүгээ LED -тэй холбож, үлдсэнийг нь юу ч холбоогүй тул бид бүх битүүдийг 1 болгож тохируулна.

ldi temp, 0b11111110; temp бүртгэлд "шууд" дугаарыг ачаална уу

; Хэрэв энэ нь зүгээр л ld байсан бол хоёр дахь аргумент байх болно; санах ойн байршил байх ёстой

Энэ мөр нь 0b11111110 хоёртын дугаарыг temp регистрт ачаална.

DDRD гарах, температур; mv temp DDRD, үр дүн нь PD0 нь оролт ба

; үлдсэн хэсэг нь гаралт юм

Одоо бид PortD -ийн өгөгдлийн чиглэлийн бүртгэлийг temp -аас тохируулж өгдөг, учир нь temp нь 0b11111110 -ийг агуулж байгаа тул PD0 -ийг оролтын зүү болгон зааж өгөх болно (хамгийн баруун талд 0 байна), үлдсэн хэсгийг нь гаралт гэж тодорхойлсон болно Эдгээр газруудад 1 байна.

clr температур; Температур дахь бүх битүүдийг 0 -ээр тохируулна

PortB, температур; PortB дахь бүх битүүдийг (өөрөөр хэлбэл зүү) 0V болгож тохируулна уу

Эхлээд бид бүртгэлийн температурыг "цэвэрлэдэг" бөгөөд энэ нь бүх битүүдийг тэг болгож тохируулна гэсэн үг юм. Дараа нь бид үүнийг бүх зүү дээр 0V -ийг тохируулдаг PortB бүртгэлд хуулна. PortB бит дээр тэг байна гэдэг нь процессор нь энэ зүүг 0В -т байлгана гэсэн үг юм.

Дасгал 2: Мультиметр ашиглан PortB дээрх бүх зүү үнэндээ тэг эсэхийг шалгаарай. PB1 -тэй ямар нэг сонин зүйл болж байна уу? Яагаад ийм байж болох талаар ямар нэгэн санаа байна уу? (доорх дасгал 4 -тэй адил кодоо дагана уу.) Дасгал 3: Дээрх хоёр мөрийг кодоосоо хас. Програм зөв ажилласан хэвээр байна уу? Яагаад?

ldi temp, 0b00000001; температур руу шууд дугаарыг ачаална уу

PortD, температур; PortD руу температурыг шилжүүлэх. PD0 нь 5V байна (татах эсэргүүцэлтэй); Энэ нь 1 -тэй тул үлдсэн хэсэг нь 0V байна. Дасгал 4: Дээрх хоёр мөрийг кодоосоо хас. Хөтөлбөр зөв ажиллаж байна уу? Яагаад? (Энэ нь дээрх 3 -р дасгалаас ялгаатай. Таслах диаграмыг үзнэ үү. PD0 -ийн хувьд DDRD -ийн анхдагч тохиргоо юу вэ? (Мэдээллийн хүснэгтийн 90 -р хуудсыг үзнэ үү)

Эхлээд бид температурт 0b00000001 дугаарыг "нэн даруй ачаална". Ачаалах тоог агуулсан санах ойн байршилд заагч биш харин температур руу шууд дээш тоог ачаалж байгаа тул "шууд" хэсэг байдаг. Энэ тохиолдолд бид "ldi" гэхээсээ илүү "ld" -г ашиглах болно. Дараа нь бид энэ дугаарыг PortD руу илгээдэг бөгөөд энэ нь PD0 -ийг 5V, үлдсэнийг нь 0V болгож тохируулдаг.

Одоо бид тээглүүрийг оролт эсвэл гаралт болгон тохируулж, анхны төлөвийг нь 0V эсвэл 5V (LOW эсвэл HIGH) болгож тохируулсан тул одоо "давталт" програмаа орууллаа.

Үндсэн: температурт, PinD; PinD нь PortD төлөвийг эзэмшдэг тул үүнийг temp руу хуулж аваарай

; хэрэв товчлуур PD0 -тэй холбогдсон бол энэ нь байх болно; а товчлуур дарахад 0, өөрөөр бол 1; PD0 нь 5 В хүртэл хүчдэлтэй эсэргүүцэх чадвартай

PinD бүртгэл нь PortD тээглүүрүүдийн одоогийн байдлыг агуулдаг. Жишээлбэл, хэрэв та 5V утсыг PD3 -д холбосон бол дараагийн цагийн мөчлөгт (микроконтроллер нь 16 МГц -ийн цагийн дохиог залгасан тул секундэд 16 сая удаа тохиолддог) PinD3 бит (PD3 -ийн одоогийн төлөвөөс) 0 -ийн оронд 1 болно. Тиймээс энэ мөрөнд бид зүүгүүдийн одоогийн төлөвийг temp болгон хуулж авдаг.

PortB гарах, температур; дээрх 0 болон 1 -ийн уншуулгыг PortB руу илгээдэг

; энэ нь бид LED -ийг PB0 -тэй холбохыг хүсч байгаа гэсэн үг юм; PD0 нь LOW байх үед энэ нь PB0 -ийг LOW болгож эргүүлэх болно; LED дээр (LED -ийн нөгөө тал холбогдсон; 5V -тэй бөгөөд энэ нь PB0 -ийг 0V болгож гүйдэл урсах болно)

Одоо бид PinD дээрх тээглүүрийн төлөвийг PortB гаралт руу илгээдэг. Энэ нь товчлуур дарагдаагүй л бол PD0 1 -ийг PortD0 руу илгээнэ гэсэн үг. Энэ тохиолдолд товчлуур нь газардуулгатай холбогдсон тул 0V байх бөгөөд энэ нь 0 -ийг PortB0 руу илгээнэ. Хэрэв та хэлхээний диаграмыг харвал PB0 дээрх 0V нь нөгөө тал нь 5 В -т байгаа тул LED гэрэлтэх болно гэсэн үг юм. Хэрэв бид товчлуурыг дарахгүй бол 1 -ийг PB0 руу илгээдэг бол энэ нь PB0 дээр 5V, мөн LED -ийн нөгөө талд 5V байна гэсэн үг бөгөөд ингэснээр боломжит ялгаа байхгүй, гүйдэл гүйхгүй болно. LED нь гэрэлтэхгүй (энэ тохиолдолд диод нь LED бөгөөд гүйдэл нь хамаагүй, зөвхөн нэг чиглэлд урсдаг).

rjmp Үндсэн; Эхлэх рүү буцах гогцоо

Энэхүү харьцангуй үсрэлт нь биднийг Main: шошго руу буцааж оруулаад PinD -г дахин шалгана гэх мэт. 16 сая дахь секунд тутамд товчлуур дарагдсан эсэхийг шалгаж, PB0 -ийг тохируулж өгдөг.

Дасгал 5: Таны кодыг өөрчил, ингэснээр таны LED PB0 -ийн оронд PB3 -тэй холбогдож, ажиллаж байгааг нь хараарай. Дасгал 6: LED -ээ 5V -ийн оронд GND -д залгаж кодоо тохируулаарай.

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

Энэхүү гарын авлагад бид ATmega328p -ийн угсрах хэлийг нарийвчлан судалж, LED товчлуурыг хэрхэн удирдах талаар сурсан болно. Ялангуяа бид дараах тушаалуудыг сурсан.

ser register нь бүртгэлийн бүх битүүдийг 1 болгож тохируулдаг

clr register нь бүртгэлийн бүх битүүдийг 0 болгож тохируулдаг

бүртгэлд, i/o бүртгэл нь оролтын бүртгэлээс дугаарыг ажлын бүртгэл рүү хуулна

Дараагийн хичээлд бид ATmega328p -ийн бүтэц, төрөл бүрийн бүртгэл, үйл ажиллагаа, нөөцийг судлах болно.

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

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