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

AVR Assembler заавар 6: 3 алхам
AVR Assembler заавар 6: 3 алхам

Видео: AVR Assembler заавар 6: 3 алхам

Видео: AVR Assembler заавар 6: 3 алхам
Видео: LDmicro 2: Создание лестничной схемы (программирование лестничной логики ПЛК микроконтроллера с помощью LDmicro) 2024, Арваннэгдүгээр
Anonim
AVR Assembler заавар 6
AVR Assembler заавар 6

6 -р хичээлд тавтай морилно уу!

Өнөөдрийн гарын авлага нь богино байх бөгөөд бид нэг atmega328p ба нөгөө хоёрын хооронд өгөгдлийг хооронд нь холбох хоёр аргыг ашиглан энгийн мэдээллийг боловсруулах болно. Дараа нь бид 4 -р хичээлээс шоо өнхрүүлгийг, 5 -р хичээлээс регистрийн анализаторыг авч, тэдгээрийг хооронд нь холбож, өнхрүүлгээс шоо өнхрүүлсний үр дүнг анализатор руу дамжуулахын тулд манай аргыг ашиглана. Дараа нь бид 5 -р хичээлийн анализаторт зориулж бүтээсэн LED -ийг ашиглан өнхрүүлгийг хоёртын хувилбараар хэвлэх болно. Үүнийг ажиллуулсны дараа бид дараагийн хичээл дээрээ ерөнхий төслийнхөө дараагийн хэсгийг бүтээх боломжтой болно.

Энэхүү гарын авлагад танд хэрэгтэй болно:

  1. Таны загварчлалын самбар
  2. 4 -р хичээлээс авсан таны шоо роллер
  3. Таны бүртгэлийн анализатор 5 -р хичээлээс
  4. Хоёр холбох утас
  5. Мэдээллийн хүснэгтийн хуулбар (2014 оны шинэчилсэн хувилбар):

    www.atmel.com/images/Atmel-8271-8-bit-AVR-M…

  6. Зааварчилгааны гарын авлагын хуулбар (2014 оны шинэчилсэн найруулга):

    www.atmel.com/images/atmel-0856-avr-instruc…

Энд миний AVR ассемблер хичээлүүдийн бүрэн цуглуулгын линк байна:

Алхам 1: Хэрхэн бид хоёр микроконтроллерийг хоорондоо ярилцах вэ?

Хэрхэн хоёр микроконтроллерийг хооронд нь ярилцах вэ?
Хэрхэн хоёр микроконтроллерийг хооронд нь ярилцах вэ?

Бид эцсийн бүтээгдэхүүнээ жижиг хэсгүүдийн цуглуулгаас бүрдүүлэхийн тулд төслөө өргөжүүлж эхэлж байгаа тул бидэнд ганц Atmega328P -ээс илүү их зүү хэрэгтэй болно. Тиймээс бид төслийн ерөнхий хэсэг бүрийг тусдаа микроконтроллер дээр хийж дараа нь өгөгдлөө хооронд нь хуваалцахыг хүсч байна. Тиймээс шийдвэрлэх ёстой асуудал бол хянагч нар хоорондоо өгөгдөл дамжуулах энгийн аргыг хэрхэн гаргаж ирэх вэ? Эдгээр хянагчдын нэг зүйл бол тэд тус бүр секундэд 16 сая зааврыг гүйцэтгэдэг. Энэ нь маш нарийвчлалтай хийгдсэн тул өгөгдлийг дамжуулахын тулд бид энэ хугацааг ашиглаж болно. Хэрэв бид өгөгдлийг бүрдүүлэхийн тулд миллисекундын хоцролтыг ашигладаг бол CPU нь нэг миллисекундээр 16 000 зааварчилгааг гүйцэтгэж байгаа тул үнэн зөв байх албагүй. Өөрөөр хэлбэл миллисекунд бол CPU -ийн үүрд мөнх юм. Тиймээс шоо өнхрүүлээд үзээрэй. Би шоо өнхрүүлсний үр дүнг анализаторын чип рүү дамжуулахыг хүсч байна. Та гудамжинд зогсож байсан гэж бодъё, би хос шоо өнхрүүлснийхээ үр дүнг танд хэлэхийг хүссэн юм. Миний хийж чадах нэг зүйл бол хэрэв бид хоёулаа цагтай бол би гар чийдэнгээ асааж чаддаг байсан, дараа нь та миний өгөгдлийг хүлээн авахад бэлэн болсны дараа гар чийдэнгээ асаагаад бид хоёулаа цагаа эхлүүлнэ. Дараа нь би гар чийдэнгээ шоо өнхрөхөд яг хэдэн миллисекундийг асааж байгаад унтраадаг. Тиймээс хэрэв би 12 -ыг эргэлдүүлвэл би гэрлээ 12 миллисекундээр асаах болно. Одоо дээр дурдсан асуудал бол та бид хоёрын хувьд 5 миллисекундээс 12 -ийг хооронд нь ялгахад хангалттай нарийн цаг гаргаж өгөх боломжгүй юм. миллисекунд. Гэхдээ энэ талаар юу хэлэх вэ: Бид шоо дээрх тоо бүрийн хувьд нэг жил гэрлээ асаахаар шийдсэн гэж бодъё. Дараа нь хэрэв би 12 -ыг өнхрүүлбэл би чамайг 12 жилийн турш гэрэлтүүлэх болно, та зөв тоог олоход алдаа гаргах магадлал байхгүй гэдэгтэй санал нийлэх байх гэж бодож байна. Та завсарлага аваад бейсбол тоглож болно, тэр ч байтугай 6 сарын турш Вегас хотод craps тоглож болно. Жилийн туршид гэрэл асаж байгаа эсэхийг харахын тулд гудамжинд харвал тоолж барахгүй байх болно. Энэ бол микроконтроллеруудын хувьд бидний хийж буй зүйл юм! CPU -ийн нэг миллисекунд нь нэг жилтэй адил юм. Хэрэв би дохиог 12 миллисекунд асаах юм бол нөгөө микроконтроллер юу ч тасалдуулж, юу ч тохиолдсон хамаагүй 10 эсвэл 11 -ээр төөрөгдүүлэх магадлал бараг байхгүй. Микроконтроллеруудын хувьд миллисекунд бол үүрд мөнх юм. Тиймээс бид үүнийг хийх болно. Нэгдүгээрт, бид хянагч дээрх хоёр портыг харилцаа холбооны порт болгох болно. Би өгөгдөл хүлээн авахад PD6 -ийг ашиглах болно (хэрэв бид үүнийг Rx гэж нэрлэж болно), өгөгдөл дамжуулахдаа PD7 -ийг сонгох болно (хэрэв бид хүсвэл үүнийг Tx гэж нэрлэж болно). Анализаторын чип нь Rx зүүг нь үе үе шалгаж байх бөгөөд хэрэв дохио харвал "харилцаа холбооны дэд програм" руу унах бөгөөд хүлээн авахад бэлэн болсон тухай шоо буланд буцаах дохиог дамжуулна. Тэд хоёулаа цагийг эхлүүлэх бөгөөд шоо роллер нь шоо дээрх нэг миллисекундээр дохио (өөрөөр хэлбэл 5V) дамжуулах болно. Хэрэв өнхрөх нь давхар зургаа буюу 12 байсан бол шоо булны тусламжтайгаар PD7 -ийг 5 миллисекундээр 5В болгож, дараа нь 0V болгож тохируулна. Анализатор нь PD6 зүүгээ миллисекунд тутамд шалгаж, цаг тутамд тоолж, 0V руу буцах үед анализаторын дэлгэц дээр гарч ирэх тоог LED дээр арван хоёртын хоёр тоогоор харуулдаг. Үүнийг хэрэгжүүлж чадах эсэхийг харцгаая.

Алхам 2: Харилцааны дэд програмууд

Бидний хийх ёстой хамгийн эхний зүйл бол хоёр хянагчийг холбох явдал юм. Тиймээс нэг талаас PD6-аас утас аваад нөгөө талаас PD7-тэй холбож, эсрэгээр нь холбоно уу. Дараа нь тэдгээрийг PD7 -г хоёуланд нь OUTPUT, хоёуланд нь PD6 -ийг INPUT болгож тохируулаарай. Эцэст нь бүгдийг нь 0V болгож тохируулна уу. Тодруулбал, микроконтроллер бүрийн кодын Init, эсвэл Reset хэсэгт дараах зүйлийг нэмнэ үү.

sbi DDRD, 7; PD7 -ийг гаралтанд тохируулсан

cbi PortD, 7; PD7 эхлээд 0V cbi DDRD, 6; PD6 -ийг cbi PortD, 6 оруулахаар тохируулсан; PD6 анх 0V clr нийт; шоо дээрх нийт дүн 0

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

Дараа нь анализатортай холбогдох дэд програм бичнэ үү.

харилцах:

cbi PortD, 7 sbi PortD, 7; Бэлэн дохио хүлээхийг илгээх: sbic PinD, 6; PinD уншиж, 0V rjmp хүлээх саатал 8 бол алгасах; синхрончлох саатал (үүнийг туршилтаар олж мэдсэн) илгээх: dec нийт саатал 2; нас баралтын тоолуур тус бүрийн саатал cpi нийт, 0; 0 энд "нийт" тооны саатал илгээгдсэн гэсэн үг breq PC+2 rjmp send cbi PortD, 7; PD7 - 0V clr нийт; шоог нийт 0 ret болгож дахин тохируулах

Анализатор дээр бид харилцааны дэд програмд үндсэн горимоос дуудлага нэмдэг.

clr анализатор; шинэ дугаарт бэлдэх

sbic PinD, 6; PD6 -ийг 5V дохиог шалгана уу. хэрэв 5V нь mov анализатортай холбоо барихаар очвол нийт; анализатор руу гарах гаралт rcall анализатор

дараа нь харилцах дэд програмыг дараах байдлаар бичнэ үү.

харилцах:

clr total; нийт дүнг 0 хойшлуулах 10 болгож дахин тохируулах; үсрэлтээс салах саатал sbi PortD, 7; бэлэн хүлээн авах дохио өгөхийн тулд PB7 -ийг 5V болгож тохируулна уу: хоцролт 2; Дараагийн дугаарыг нийт дүнгээр хүлээнэ үү; нэмэгдэл нийт sbic PinD, 6; Хэрэв PD6 0V руу буцвал бид rjmp хүлээн авах болно; Үгүй бол илүү их мэдээлэл авахын тулд хуулбарлана уу cbi PortD, 7; дууссаны дараа PD7 -ийг дахин тохируулна уу

Та тийшээ яв! Одоо микроконтроллер бүр шоо өнхрүүлсний үр дүнг мэдээлж, дараа нь анализатор дээр харуулахаар тохируулагдсан болно.

Бид бүртгэлийн агуулгыг зөвхөн шоо өнхрүүлэхийн оронд хянагч хооронд шилжүүлэх шаардлагатай үед бид харилцах илүү үр дүнтэй аргыг хэрэгжүүлэх болно. Энэ тохиолдолд бид тэдгээрийг холбосон хоёр утсыг ашигласан хэвээр байх боловч 1, 1 -ийг "дамжуулж эхлэх" гэсэн утгаар ашиглах болно; 0, 1 нь "1" гэсэн утгатай; 1, 0 нь "0" гэсэн утгатай; эцэст нь 0, 0 нь "дамжуулалтын төгсгөл" гэсэн утгатай.

Дасгал 1: Та илүү сайн аргыг хэрэгжүүлж, үүнийг ашиглан шоо өнхрүүлгийг 8 битийн хоёртын тоо болгон шилжүүлэх боломжтой эсэхийг шалгаарай.

Би өөрийн үйл ажиллагааг харуулсан видеог хавсаргах болно.

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

Дүгнэлт
Дүгнэлт

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

Одооноос эхлэн би энд бичихээс илүүтэйгээр код агуулсан файлуудыг хавсаргах болно. Бид хэлэлцэх сонирхолтой хэсгүүдийг бичих болно.

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

Дасгал 2: Шоо өнхрөх үед дамжуулах, анализатор хүлээн авахад бэлэн болсныг харуулахын тулд бэлэн дохиог ашиглахын оронд "Пин солих тасалдал" гэж нэрлэдэг "гадаад тасалдал" ашиглана уу. Atmega328p дээрх тээглүүрүүдийг ийм байдлаар ашиглаж болох тул тэдгээрийн хажууд диаграммд PCINT0 -ийг PCINT23 -аар байрлуулсан байдаг. Та үүнийг таймерын халих тасалдлын нэгэн адил тасалдлын хэлбэрээр хэрэгжүүлж болно. Энэ тохиолдолд тасалдсан "зохицуулагч" нь шоо буланд холбогддог дэд програм болно. Ийм байдлаар та харилцаа холбоог үндсэн програмаас дуудах шаардлагагүй болно: энэ зүү дээр төлөв өөрчлөгдөхөд тасалдал гарах үед энэ нь тэнд очно.

Дасгал 3: Нэг микроконтроллерийн хооронд өгөгдөл дамжуулах, дамжуулах илүү сайн арга бол микроконтроллер дээрх 2 утастай цуваа интерфэйсийг ашиглах явдал юм. Өгөгдлийн хүснэгтийн 22 -р хэсгийг уншиж, үүнийг хэрхэн хэрэгжүүлэхээ олж мэдэх боломжтой эсэхийг үзээрэй.

Цаашид бид хянагч нэмж оруулахдаа эдгээр илүү боловсронгуй техникийг ашиглах болно.

Бидний анализатортой хийсэн бүх зүйл бол шооны нийт дүнг аваад LED ашиглан хоёртын хэлбэрээр хэвлэх явдал юм. Баримт бол одоо манай анализатор шоо өнхрөх гэж юу болохыг "мэддэг" бөгөөд үүнийг зохих ёсоор ашиглах боломжтой юм.

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

Дараагийн удаа хүртэл…

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