Dastur misollari bilan yangi boshlanuvchilar uchun Assembly tilini dasturlash. PIC12F629 da "noto'g'ri" dastur bilan svetofor Assemblerga ikkita raqam qo'shish

Salom!
Men PLCda texnologik uskunalarni boshqarish uchun dastur qanday yozilishini ko'rsatmoqchiman.
Ko'pincha men Schneider Electric tomonidan ishlab chiqarilgan PLC bilan ishladim. Ushbu vazifa uchun men tanlagan Quantum - bu ishlab chiqaruvchining eng kuchli va qimmat PLC. U minglab signallar bilan jihozlarni boshqarishi mumkin; tabiiyki, hech kim uni real hayotda svetofor uchun ishlatmaydi.

Men hech qachon svetoforlarni avtomatlashtirish bilan shug'ullanmaganman, shuning uchun algoritmni o'zim ishlab chiqdim. Mana:
1. Tartibga solinadigan piyodalar o'tish uchun svetofor. Bular. avtomobillar uchun svetofor, piyodalar uchun svetofor va piyodalar uchun tugmachani bosish orqali piyoda yo'lni kesib o'tish istagi haqida xabar beradi.
2. Dastur boshlangandan so'ng avtomobillar uchun yashil, piyodalar uchun qizil chiroq yonadi.
3. Piyoda tugmani bosgandan so'ng, avtomobillar uchun yashil, keyin sariq, keyin qizil yonadi. Shundan so'ng, piyodalar uchun yashil chiroq yonadi, belgilangan vaqtdan keyin u miltillay boshlaydi, piyodalar uchun qizil chiroq yonadi, keyin sariq va avtomobillar uchun qizil, keyin yashil rang yonadi.
4. Piyodalar svetoforida yashil chiroq yonganidan keyin belgilangan vaqt ichida piyoda tomonidan tugmani bosish o‘tish algoritmini boshlamaydi. Bunday holda, o'tish algoritmi faqat belgilangan vaqt o'tgandan keyin boshlanadi.
PLC dasturlash Unity dasturlash muhitida IEC 61131-3 standarti tillarida amalga oshiriladi. Ushbu standart 5 ta tilni o'z ichiga oladi. Masalan, men funktsiya bloklari tilini tanladim - FBD.
Mana Unity'dagi loyiha brauzeri:

PLC ni sozlash:


PLC o'rnatish paneli, quvvat manbai (1), boshqaruvchi (2), 24V DC ning 32 signallari uchun raqamli kirish moduli (4), 24V DC ning 32 signallari uchun raqamli kirish modulidan iborat (5). Haqiqiy loyihada bitta kontrollerga turli tarmoqlar orqali ulangan o'nlab o'rnatish panellari va yuzlab kiritish / chiqish modullari bo'lishi mumkin.
O'zgaruvchilar muharririda kerakli turdagi o'zgaruvchilar yaratamiz:


Kirish / chiqish modullarining kanallari bilan bog'langan o'zgaruvchilar signalning qaysi raf, modul va kanalga bog'langanligini ko'rsatadigan manzilga ega.
Dastur boshqaruvchi skanerlashning har bir siklida tartibda bajariladigan bo'limlardan iborat.
Soddalashtirilgan tekshirgichni skanerlash sikli quyidagicha ko'rinadi:
1. Kirish modulidan kirish signallarini manzilli o'zgaruvchilarga o'qish.
2. Bo'limlarning bajarilishi.
3. Chiqish modullarining chiqish signallariga manzilli o'zgaruvchilardan qiymatlarni yozish.
4. 1-bandga o'ting.
0,5 soniyali impuls generatori bilan Soat bo'limini yarating. TP bloki, kirish signali 0 dan 1 gacha o'zgarganda, ma'lum bir davomiylik impulsini chiqaradi.


Bu erda va pastda bo'limlarning skrinshotlari tahrirlash rejimida emas, balki animatsiya rejimida ko'rsatiladi. Yuklangan dastur bilan PLC ga ulanganda ular joriy vaqtda o'zgaruvchilarning qiymatlarini ko'rsatadi (raqamli o'zgaruvchilar uchun raqamlar, mantiqiy uchun yashil (1) - qizil (0)).
Asosiy bo'lim asosiy mantiqni boshqaradi.
SR bloki S1 = 1 bo'lganda chiqishni 1 ga o'rnatadi va R = 1 bo'lganda chiqishni 0 ga qaytaradi.
R_TRIG bloki kirish 0 dan 1 ga o'tganda (etakchi chekka detektori) 1 skanerlash sikli uchun chiqishni 1 ga o'rnatadi.
F_TRIG bloki kirish 1 dan 0 ga o'tganda 1 skanerlash sikli uchun chiqishni 1 ga o'rnatadi (orqa tomon detektori).
Tugma kanaliga bog'langan inButton o'zgaruvchisi bo'limda inButtonForTest bilan almashtirildi, shunda siz uning qiymatini boshqaruvchi simulyatorda haqiqiy uskunasiz o'zgartirishingiz mumkin.


Chiqishlar bo'limi svetoforlarni boshqarish uchun chiqish signallarini ishlab chiqaradi.


Loyihani kontroller simulyatoriga yuklang:


Har qanday o'zgaruvchining ma'nosini animatsiya jadvalida ko'rish mumkin:


Ammo disk raskadrovka qulayligi uchun siz oddiy grafikali operator ekranini yaratishingiz mumkin, uning animatsiyasi o'zgaruvchilar bilan bog'langan:

Yo'lni kesib o'tishga urinish:

Men svetofor kabi oddiy ob'ektni boshqarish uchun 30 blok kerak bo'lishini kutmagan edim.
Keyingi maqolada men bir vaqtning o'zida IEC 61131-3 standartining barcha tillaridan foydalangan holda ushbu dasturni qanday yozishni ko'rsataman.

UPD. Standart nomidagi xato tuzatildi.

O'g'lim maktab uchun qog'ozdan svetoforning qo'g'irchog'ini yopishtirib o'tirganida, "Nega mikrokontrollerda unga svetoforning ishlaydigan modelini yig'ib qo'ymaslik kerak?" degan fikr keldi. Internetda ular uchun eng oddiy svetofor printsipini amalga oshiradigan ko'plab sxemalar va dasturlar mavjud. Ammo ular o'yinchoq uchun juda murakkab (DC-DC konvertori, siljish registrlari va boshqalar) yoki faqat assemblerdagi eng oddiy dasturning namunasi sifatida taqdim etiladi. Men ba'zi qo'shimcha funktsiyalarga ega to'liq o'yinchoq svetofor uchun sxematik va montaj tili dasturini taqdim qilmoqchiman. Bundan tashqari, u yangi boshlanuvchilar uchun muhim bo'lgan eng oddiy sxema bo'yicha "tinga" mikrokontrollerda yig'iladi. Umid qilamizki, bu oddiy sxema PIC dasturlashni o'rganishni boshlagan ko'pchilik uchun PIC-ga asoslangan birinchi haqiqiy dizaynga aylanadi. Oddiy, ammo shu bilan birga dasturlashning asosiy texnikasi va atributlarini o'z ichiga olgan dastur uni tushunish va tajriba qilishni osonlashtiradi.

Mikrokontrolderlarni dasturlash bilan shug'ullanadigan har bir kishi uzilishlar ishlov beruvchilarini yozishning asosiy tamoyillarini biladi: imkon qadar qisqa bajarish vaqti va qisqa kod, hech qanday tsikllar va boshqa pastki dasturlar ishlov beruvchisidan qo'ng'iroqlar va boshqalar. Bunday holda, uzilishlarga faqat darajadagi o'zgarishlarda ruxsat beriladi (biz boshqa uzilishlarni o'tkazib yubora olmaymiz, chunki ular mavjud emas) va men dasturni va uni idrok etishni soddalashtirish uchun ushbu tamoyillardan chetga chiqish mumkin deb hisobladim. Bu erda uzilish ishlovchisida tsikllar va boshqa kichik dasturga qo'ng'iroq va (oh dahshat!) Hatto UYKU rejimiga o'tish ham mavjud. Shuning uchun, sarlavhada dastur "noto'g'ri" deb ataladi. Bunday holda, uzilishni ishlov beruvchi oddiy pastki dastur sifatida ishlatiladi, ammo boshqa hollarda yuqoridagi printsiplar, albatta, o'z kuchini saqlab qoladi.

Qurilmaning qisqacha tavsifi:

Qurilma ko'cha svetoforining modeli bo'lib, uning ishlashini ishonchli simulyatsiya qilish (ranglarni almashtirish, yashil rangni miltillash) va qo'shimcha funktsiyalarga ega: tugmani bosish orqali almashish chastotasini o'zgartirish, sariq rejimni miltillash, qo'lda va avtomatik rejimda uyqu rejimiga o'tish. rejimlar, keyin tugmani bosish orqali yoqing. Ushbu qurilma bolalar o'yinchog'i, shuningdek, maktabgacha ta'lim muassasalarida bolalarga yo'llarda o'zini tutishga o'rgatishda ko'rgazmali vosita sifatida ishlatilishi mumkin.

Shunday qilib, keling, sxemaning tavsifi va ko'rib chiqilishiga o'tamiz.

Sxema arzon PIC12F629 mikrokontrollerida yig'ilgan. Chiqish sifatida dasturlashtirilgan GP0-GP2, GP4, GP5 (oyoqlar 7, b, 5, 3, 2) chiqishlari to'g'ridan-to'g'ri LEDlarni boshqarish uchun ishlatiladi. Har bir yo'nalishdagi LEDlar oqim sarfini minimallashtirish uchun ketma-ket birlashtirilgan. R3-R8 rezistorlari LED oqimlarini cheklaydi. Turli xil rangdagi LEDlarning chiqishida kuchli farq bo'lsa, siz tegishli rezistorlarni tanlashingiz kerak bo'ladi. Men uchun, masalan, ikkita sariq guruh parallel ravishda ulangan va bitta rezistorga ulangan va qolganlari bilan bir xil qiymat va boshqalarga qaraganda bir oz yorqinroq porlaydi (orqaga qaytish kattaroq).

Ushbu sxemada LEDlar qo'shimcha elementdan mikrokontrollerdan 1,5 V ko'proq quvvatlanadi (bu holda, chiqish o'chirilgan bo'lsa, oqim mikrosxemaning chiqishiga o'tmaydi, chunki ochish uchun ancha yuqori kuchlanish talab qilinadi. ikkita LEDning o'tishlari (kamida 2,5 B) Va hatto ikkala LED teshilgan bo'lsa ham (bu dargumon), ichki himoya diodi orqali elektr ta'minotining plyus qismiga o'tadigan oqim taxminan 7,5 mA ni tashkil qiladi, bu ko'rsatkichdan ancha past. Eksperimental ravishda akkumulyator zaryadsizlanganda LEDlar orqali oqimning pasayishiga qaramay, ularning yorug'ligi batareya kuchlanishining barcha diapazonida maqbul darajada saqlanib qolishi eksperimental ravishda aniqlandi, bu esa undan voz kechishga imkon berdi quvvat tugmasi (uyqu rejimida joriy iste'mol - 1-3 m kA).

Qurilmaning ish rejimlarini boshqarish tugmasi konfiguratsiya bitlarida raqamli kirish sifatida e'lon qilingan GP3 piniga (4-pin) ulangan. Tugma bosilganda, uzilish paydo bo'ladi, uning ishlov beruvchisida quyidagilar sodir bo'ladi. Uzoq vaqt davomida (4 soniyadan ortiq) bosilganda, qurilma uyqu rejimiga o'tadi. Qisqaroq bosish bilan svetoforning tezligini rasmga muvofiq joriy tezlikni ko'rsatgan holda aylana bo'ylab ketma-ket almashtirish mavjud.

Oxirgi rejimda (qizil LEDlar yoqilgan), sariq miltillovchi signal faollashadi. Tugmachani uzoq vaqt bosib (barcha LEDlarning o'chirilishi bilan tasdiqlangan) biz rejimni yangisiga o'zgartirish bilan normal ishlashga o'tamiz, agar tugma 6 soniyadan ko'proq bosilmasa, ish rejimi saqlanib qoladi. tugmani bosishdan oldingi kabi.

Kutish rejimida AA hujayralarining zaryadi kamida bir yil davom etadi, shuning uchun qurilmada quvvat tugmasi yo'q. Qurilma 0,5 - 1 soatdan keyin ham (ranglarni almashtirish tezligiga qarab) tugmaga ta'sir qilmasdan uyqu rejimiga o'tadi. SLEEP rejimidan istalgan tugmani bosish orqali chiqariladi. Quvvat mikrokontrollerga pinlar 1 va 8 orqali beriladi. Pimlarni tejash va dizaynni soddalashtirish uchun tashqi elementlarsiz ichki generator rejimi yoqilgan.

Ilovada keltirilgan dastur uchun kichik tushuntirishlar.

Tugmachalarni bosish jarayoni quyi dasturlarda amalga oshiriladi: wait_butt __- 6 soniya davomida bosish va ro'yxatdan o'tishni kutish. bosmasdan, push_butt __- bosish davomiyligini qayd etish, wait_nobutt __- bosilmagan tugmani kutish. Svetofor holati o'zgarganda (sariq va miltillovchi yashil), chiqish portining qiymatlari tact__ pastki dasturidagi jadvaldan o'qiladi (past yoki baland nibbles). Xuddi shunday, tugma bosilganda holat ko'rsatkichi ind__ pastki dasturdan. Ishlash vaqti tugagandan so'ng uyqu rejimiga o'tish uchun uzilish bayrog'ini dasturiy ta'minotni sozlash orqali uzilishlarni qayta ishlash tartibiga majburiy o'tish amalga oshiriladi. CONST_MIN, CONST_REG, CONST_SL konstantalarini o'zgartirish orqali siz yashil miltillash davrini, batareya ulanganda boshlang'ich rejimni, SLEEP rejimiga o'tishgacha ta'sirsiz ishlash vaqtini o'zgartirishingiz mumkin.

Bosilgan elektron plata bir tomonlama folga bilan qoplangan shisha tolali shishadan tayyorlangan va o'lchamlari 22x87 mm. Eng tashqi LEDlar turli yo'nalishlarda taxtaga parallel ravishda o'rnatiladi. O'rtalari qismlarni o'rnatish tomonidan, ikkinchisi esa yo'llarning yonidan o'rnatiladi, bu esa simlarni taxtaning teshiklariga o'tkazib, ularni qismlarning yonidan bir tomchi lehim bilan mahkamlaydi, va yo'llarning yonidan mos keladigan yo'llarga lehimlash orqali.

Barcha rezistorlar 0,125 Vt. LEDlar har qanday mahalliy yoki import qilinadigan, tercihen taxminan 2 volt bo'lgan 10 mA oqimdagi to'g'ridan-to'g'ri kuchlanish pasayishi bilan bir xil turdagi olinishi mumkin. Tugma - har qanday tuzatishsiz. Mikrokontroller blokga o'rnatilgan.

Mikrodastur yuklanganda konfiguratsiya so'zi avtomatik ravishda xotiraga kiritiladi ("birdie" faqat "PWRT" elementiga o'rnatiladi, qolgan elementlar "tozalanadi", "intOSC GP4" "ossilator" da o'rnatiladi. ustun). Birinchidan, mikrodasturni toza mikrosxemadan o'qish va dastur xotirasi oxirida 03FF manzilidagi so'zning qiymatini yozish kerak, bu ma'lum bir mikrosxemaning ichki generatorining chastotasini sozlash uchun talab qilinadi. HEX faylini dasturga yuklagandan so'ng, bu qiymat 03FF da qo'lda kiritilishi kerak. Ushbu qurilmada chastotaning og'ishi muhim emas, lekin siz hali ham ushbu protsedura ushbu mikrosxema uchun zarurligini bilishingiz kerak. Oxirgi chora sifatida, agar zavod qiymati yo'qolsa, siz hech narsa qila olmaysiz - dastur bu holatda to'g'ri ishlash uchun choralar ko'rdi.

Qurilma mos plastik qutiga joylashtirilgan. Tegishli teshiklar qutidagi va qopqoqdagi LEDlar uchun qilingan. Mening versiyamda svetoforning o'zi va tugma va batareyali taglik diametri 20 mm bo'lgan plastik suv trubkasi orqali ulangan.

Ilovada quyidagilar mavjud: model, LAY formatidagi bosilgan elektron plata, MPASM assembler dasturi, HEX proshivka fayli.

Radioelementlar ro'yxati

Belgilanish turi Denominatsiya Miqdori EslatmaDo'konMening daftarim
IC1 MK PIC 8-bit

PIC12F629

1 DIP Bloknotga
R1 Rezistor

3 kŌ

1 0,125 Vt Bloknotga
R2 Rezistor

100 ohm

1 0,125 Vt Bloknotga
R3-R8 Rezistor

200 Ohm

6 0,125 Vt Bloknotga
HL1, HL2, HL9, HL10 Yorug'lik chiqaradigan diod

AL307A

4 QIZIL Bloknotga
HL3, HL4, HL11, HL12 Yorug'lik chiqaradigan diod

Ishning maqsadi. Laboratoriya ishining maqsadi CVAVR kompilyatori va VMLAB simulyatori yordamida AVR mikrokontrolleri uchun C ilovalarini disk raskadrovka qilishdir.

Ish dasturi

1. Katalogga o'rnating C: \ CVAVR kompilyatorning bepul versiyasi CodeVisionAVR. C: \ CVAVR katalogida papka yarating z1(1-topshiriq) birinchi loyihaning fayllari uchun.

Kompilyatorni ishga tushiring. Loyiha faylini yaratish uchun quyidagi tugmani bosing: Fayl -> yangi -> loyiha -> OK -> Yo'q- loyiha uchun yaratilgan papkaga o'ting z1 va "fayl nomi" maydoniga kiriting: z1 - "saqlash" tugmasini bosing - loyihani sozlash oynasi ochiladi.

"Tuzuvchi bilan" yorlig'iga o'ting

MK (Chip) ATmega16 ni tanlang

MK (Clock) 4,0 MGts soat chastotasini o'rnating

ni bosing OK.

Sizning oldingizda ochiq matn fayli paydo bo'ladi Loyiha eslatmalari - z1.prj loyiha bo'yicha fikr va mulohazalaringizni yozishingiz mumkin.

Endi biz C da manba matnni yozish uchun asosiy matn faylini yaratishimiz kerak - uning kengaytmasi C

Bosing: Fayl -> Yangi -> Manba -> OK

fayl paydo bo'ldi nomsiz.c- bosing: Fayl - Boshqacha saqlash- "fayl nomi" maydoniga kiriting: z1.c va bosing Saqlash.

Yaratilgan z1.c faylini loyiha fayllari ro'yxatiga qo'shishingiz kerak - loyiha konfiguratsiyasi menyusini oching: Loyiha -> Sozlang.

Ochilgan muloqot oynasida siz "Fayllar" yorlig'ini tanlashingiz va " Qo'shish". Yangi muloqot oynasida faylni tanlang" z1.c"va" tugmasini bosing Ochiq". Fayl endi loyihaga kiritilgan.

Bosing: OK

Fayl oynasini kattalashtirish (kengaytirish) - z1.c

Endi hamma narsa haqiqiy dasturlash uchun tayyor, ya'ni. dastur matnini C tilida yaratishga. Quyidagi jadvalda quyidagi texnik vazifani amalga oshiradigan 1-topshiriq dasturining matni mavjud: ATmega16 mikrokontrolleri asosida qurilmani ishlab chiqing, u 8 bitli raqamni ikkilik ko'rinishda yonib turgan LEDlar bilan, 0 dan boshlab va doimiy o'sish 1. Qurilma 4 dan 5,5 voltgacha bo'lgan doimiy stabillashtirilgan kuchlanish bilan quvvatlanadi. MC chastotasi 4 MGts bo'lgan kvarts rezonatoridan ishlaydi. Port pinlaridan jami 8 ta LED ulangan A MK ning quvvat manbaiga oqim cheklovchi rezistorlar orqali. LEDni almashtirish 65 ms pauza bilan amalga oshirilishi kerak.

#o'z ichiga oladi / * Ushbu qator o'rniga MK registrlari tavsifini o'z ichiga olgan mega16.h faylining matnini qo'ying * /

#define PA_OUT DDRA = 0xFF/ * Dastur matnining hamma joyini almashtiring

DDRA da PA_OUT = 0xFF * /

// ++++ MKni ishga tushirish funksiyasi ++++ bekor boshlash (void) ( PA_OUT; // butun PORTAdan chiqish TCCR0 = 0x05;/ * XTAL1 oyog'idagi har 1024 tebranishda bitta sanab, taymerni hisoblashni yoqish * / }

Charboshiga=0;

// ++++ Asosiy funksiya ++++ asosiy bekor (bo'sh) ( ishga tushirish ();/ * MKni ishga tushirish funksiyasini chaqiring - ya'ni. vazifaga muvofiq bizga kerak bo'lgan MK qurilmalarining sozlamalari * /

//Cheksiz tsikl esa (1) (// Har doim qiling

PORTA = ~ (boshiga++);

while (! (TIFR & 0x01));// timer0 overflow bayrog'i o'rnatilishini kuting TIFR = 0x01;// timer0 overflow bayrog'ini tozalang }; // sikl tugallandi

} // asosiy () uchun qavs

Dasturni dastur manba oynasiga yozing (sharhlarsiz). O'zgarishlarni saqlash: fayl -> SaqlashHammasi.

Dasturni kompilyatsiya qilish uchun " Qilishtheloyiha".

Loyihamiz papkasini ko'ring - z1. Kompilyatsiya natijasida u erda ko'plab yangi fayllar paydo bo'ldi. Biz uchun asosiylari:

z1.hex - MK ga "yuklash" uchun proshivka fayli;

z1 __.s - simulyatorlar uchun z1.c fayl nusxasi;

z1.cof - z1 __.c va z1.hex fayllari mazmunini bog'lovchi ma'lumot. Ushbu ma'lumot VMLABda simulyatsiya qilishda dasturning harakatini bevosita C kodi orqali kuzatish imkonini beradi. Belgilangan fayllar VMLAB simulyatorida qo'llaniladi. Haqiqiy MK uchun faqat proshivka fayli talab qilinadi.

Quyidagi to'rtta fayl C matniga havola bilan standart AVR assemblerida yozilgan dasturimizni o'z ichiga oladi: z1.asm, z1.lst, z1.vec, z1.inc. Qolgan fayllar deyarli qiziq emas.

2. VMLAB-ni ishga tushiring va yaratilgan loyihani oching: Loyiha -> Loyihani ochishFayl

1-topshiriq papkasiga o'ting C: \ CVAVR \ z1 \ va VMLAB uchun loyihaning z1_vm.prj fayl nomini kiriting. Bunday fayl mavjud emas degan ibora paydo bo'lgandan so'ng, VMLAB uni yaratishni taklif qiladi, siz bunga rozi bo'lasiz. Ko'rsatilgan oynada quyidagi matn faylini sharhlarsiz jadvalga yozing.

; Loyiha fayli z1_vm.prj 1-topshiriq uchun simulyatsiya uchun.

; Izohlar VMLAB da faqat bitta qatorda yoziladi

; nuqta-verguldan keyin; MK xuddi fayl bilan "tikilgan" - z1.hex. MKni yoqgandan so'ng

; yonayotgan LEDlar 0 dan ikkilik shaklda raqamlarni ko'rsatadi

.MICRO "ATmega16"; simulyatsiya qilingan MC .TOOLCHAIN ​​"GENERIC" .MAQSAD "z1.hex"; MKda nima "tikilgan" .COFF "z1.cof"

.MANBAB "z1 __. C" .POWER VDD = 5 VPP = 0; Elektr ta'minoti +5 volt; VSS - bu GND MK - sxemaning "umumiy" simi; Unga nisbatan kuchlanishlar o'lchanadi .SOAT 4 meg; kvarts chastotasi 4 MGts; Aniqroq aytganda, bu MK ning soat chastotasi

; 1-topshiriq uchun qurilma diagrammasini kiritish; 8 ta LED rezistorlar orqali katodlar orqali ulanadi

: nominal 560 Ohm dan MK oyoqlariga 33 dan 40 gacha

; R1 rezistorini D1_NODE tuguniga va MK ning PA0 piniga ulang; LEDning anodini +5 V pallasiga. Qolgan 7 ta LED

; bir xil tarzda ulanadi

D1 VDD D1_NODE R1 D1_NODE PA0 560 D2 VDD D2_NODE R2 D2_NODE PO1 560 D3 VDD D3_NODE R3 D3_NODE PO2 560 D4 VDD D4_NODE, R4 D4_NODE PA3 560 D5 VDD D5_NODE R5 D5_NODE PA4 560 D6 VDD D6_NODE, R6, D6_NODE PA5 560 D7 VDD D7_NODE R7 D7_NODE PA6 560 D8 VDD D8_NODE R8 D8_NODE PA7 560

; Oyoqlardagi signallar PA0 PA1 PA2; biz virtual osiloskopning oynasida kuzatamiz - "Scope" .PLOT V (PA0) V (PA1) V (PA2); Devrenning sanab o'tilgan tugunlarida kuchlanish grafiklarini chizing

Loyiha menyusidan ishga tushiring Hammasini qayta qurish ...

Ko'rish menyusi orqali ikkita komponentni oching: SCOPE - bu simulyatorning virtual saqlash osiloskopi va Boshqaruv paneli - bizga kerak bo'lgan LEDlarni va hali kerak bo'lmagan boshqa ko'p narsalarni o'z ichiga olgan panel.

Oyna menyusi orqali Kod oynasini oching (odatda u loyihani ochgandan so'ng darhol ochiladi) - bu oynada simulyatsiya qilingan dastur matnini ko'rasiz.

Xabarlar oynasiga e'tibor bering - siz ishlayotganingizda simulyatorning xizmat xabarlari paydo bo'ladi. Xabarlar oynasida u muvaffaqiyatli bo'lganligi va hamma narsa ishga tayyorligi haqida xabar paydo bo'lishi kerak (Muvaffaqiyatli! Hammasi ishga tayyor). Bundan tashqari, asboblar panelidagi yashil svetofor yonadi - bu simulyatsiyani boshlashingiz mumkin bo'lgan tugma.

Yashil svetoforni bosish MC ning RESET piniga quvvat yoqilganda, lekin dastur hali bajarilmaganda "1" qo'llash bilan tengdir.

Biz kuzatadigan signallar uchun Scope oynasida uchta grafik paydo bo'ldi. Vertikal o'lchovni bo'linish uchun 2 voltga va gorizontal o'lchovni 50 ms ga o'rnating.

Kod oynasida C dagi dastur kodining bajariladigan satrlari qarshisida chap tomonda kulrang maydon va yashil kvadratchalar paydo bo'ldi - bunday kvadratni bosish orqali biz dastur uchun to'xtash nuqtasini o'rnatishimiz mumkin.

Barchasini ko'rishingiz uchun uchta oyna va Boshqaruv panelini kompyuter ekraniga joylashtiring.

Simulyatsiya dasturini ishga tushirish uchun "svetofor" tugmasini bosing. Dastur boshlanadi va to'xtaydi - xabarlar oynasida xabar paydo bo'ladi. Yana "svetofor" tugmasini bosing. Simulyator yana to'xtaydi va "MK qo'riqlash taymeridan" qayta o'rnatish borligi haqida xabar beradi - biz simulyatorga undan foydalanmayotganimizni aytmadik. Yana "svetofor" ni bosing - endi dastur biz uni to'xtatmagunimizcha uzluksiz ishlaydi.

Dasturni simulyatsiya qilishga ruxsat bering va siz yuqoridagi oynalarda nima sodir bo'lishini ko'rasiz. Boshqaruv paneli oynasida LEDlardan tashqari nima ko'rsatiladi?

Derazalarni tomosha qiling KO'RMA va Kod va LEDlarning orqasida. Oynada Kod simulyatsiya paytida sariq chiziqlar paydo bo'ladi va o'sadi, bajariladigan dasturning satrlarini ta'kidlaydi. Ushbu diqqatga sazovor joylarning uzunligi dastur ushbu qatorlar kodini bajaradigan vaqtga mutanosibdir.

Mikrokontroller quvvat manbaidan qancha oqim oladi? Qizil "To'xtatish" sakkizburchagini bosib simulyatsiyani to'xtating va PA2 MK oyog'ida puls davrining davomiyligini o'lchang. Hisoblangan qiymatga qanday mos keladi? VMLAB simulyatorining SCOPE oynasida vaqt oralig'ini o'lchash uchun o'lchangan interval chegaralarida vertikal kursorlar 1 va 2 o'rnatilishi kerak va Kursor delta vaqti maydonida ikki kursor orasidagi vaqt qiymati paydo bo'ladi.

Qisqa takroriy intervallarni o'lchashda siz bir vaqtning o'zida bir nechta vaqtni o'lchashingiz mumkin, so'ngra natijani o'lchash kursorlari orasidagi bunday intervallar soniga bo'lishingiz mumkin.

bilan tugmani bosish orqali MK-ni qayta ishga tushiring dumaloq toʻq koʻk oʻq... Siz qandaydir o'chirasiz va keyin MKga quvvatni qayta kiritasiz, lekin MKning RESET oyog'ida "0" yaratasiz - buning natijasida dastur boshlamaydi!

Buyruqning vazifasi nimadan iborat PORTA=~(boshiga++); ?

Hisobotda LEDlarni MK ga ulash diagrammasini taqdim eting.

3. Dasturni o'zgartiring. LEDlarni C portiga o'tkazing. LEDlarni almashtirish orasidagi pauza vaqtini 2 marta qisqartiring.

Dasturning C kodini o'zgartirish uchun CodeVisionAVR kompilyatorini ishga tushirish kifoya (VMLABni o'chirish shart emas!) Va kerakli o'zgarishlarni amalga oshiring, so'ngra loyihani kompilyatsiya qiling. Keyin VMLAB-ga o'ting, bajaring chuqur qayta ishga tushirish undan keyin Qayta-bhammasini uid. Hammasi! O'zgarishlar amalga oshirildi va hamma narsa yana simulyatsiya uchun tayyor. Shunday qilib, kompilyator va simulyator bir vaqtning o'zida bitta loyiha papkasida ishlaydi va aralashmaydi, balki bir-biriga yordam beradi. Hisobotga o'zgartirilgan loyihaning z1.c va z1_vm.prj fayllarini qo'shing.

4. Keyingi loyihada biz belgilar LCD displeyda (suyuq kristall indikator) ma'lumotlarni ko'rsatamiz. Uning mikrokontrollerning A portiga ulanish diagrammasi rasmda ko'rsatilgan. 9.1 (ma'lumot manbai ham ko'rsatilgan, unda siz hal qilinayotgan muammo bilan batafsilroq tanishishingiz mumkin).

Kompilyatorni ishga tushiring CodeVisionAVR, keyin urug 'kodi generatori " CodeWizardAVR" - bosish orqali kulrang jihoz qizil xatoning chap tomonida ... ATmega16 va 4 MGts kristal chastotasini tanlang. LCD yorlig'iga o'ting va PORTA va 16 ta belgini belgilang.

Tugatgandan keyin Fayl ->Yaratish, SaqlashvaChiqish, C: \ CVAVR katalogida papka yarating z2(2-topshiriq) yangi loyiha fayllari uchun. z2 ni uch marta bosib z2.c, z2.prj va z2.cwp fayllarini saqlang. Sehrgar tomonidan yaratilgan dasturning dastlabki kodining fayliga qarang z2. c... LCD displeyni ishga tushirish uchun qanday buyruqlar ishlatiladi? Ushbu vazifada foydalanilmaydigan periferik qurilmalarni ishga tushirishni amalga oshiradigan buyruqlarni dasturdan olib tashlash mumkinmi?

Guruch. 9.1 - LCD displey uchun odatiy ulanish sxemasi

Buyruqdan keyin

LCD_ init(16); // LCD har bir satrda 16 ta belgi

ikkita qator qo'shing:

LCD_ goxy(5,0); // birinchi qatordagi 6-pozitsiyadagi belgilarni ko'rsatish LCD_ putsf(" Salom! "); // qatorlar va belgilarni hisoblash noldan boshlanadi!

Saqlash (Fayl -> Hammasini saqlash) va dasturni kompilyatsiya qilish.

Kompilyatorni yopmasdan, oching VMLAB... Oynada OchiqLoyihaFayl z2_vm fayl nomini kiriting va simulyator uchun loyiha faylini oching z2_ vm. prj... Quyidagi matnni undagi maydonchaga kiriting va ishga tushiring Re- qurmoqhammasi... Yonayotgan svetofor dastur simulyatsiyaga tayyorligini bildiradi. Boshqarish paneli oynasini oching va doimiy simulyatsiyaga erishish uchun svetoforni uch marta bosing. LCD displeyda uzoq kutilgan yozuv darhol paydo bo'lmaydi (LCDni ishga tushirish jarayoni uzoq vaqt talab etadi). Nima uchun svetofor birozdan keyin yonadi?

Yopmasdan VMLAB kompilyatorga qayting CVAVR.Buyruqdan keyin #o'z ichiga oladi buyrug'ini qo'shing

#o'z ichiga oladi // kechikishlarni tashkil qilish funktsiyalari

Buyruqdan keyin LCD_ putsf(" Salom! "); buyruqlarni qo'shing:

kechikish_ Xonim(200);

LCD_ aniq(); // LCD ekranni tozalang

kechikish_ms (200);

lcd_gotoxy (5,1);

lcd_putsf ("TUGASH!");

Izohdan oldin dasturning oxirgi tsiklida // JoysizningkodBu yerga buyrug'ini qo'shing # asm(" wdr") va loyihani qayta kompilyatsiya qiling.

VMLAB sahifasiga qaytish. Chuqur qayta ishga tushiring va yuguring Re- qurmoqhammasi... Endi displeylar panelida ma'lumotlar qanday ko'rsatiladi? Nega svetofor uzluksiz simulyatsiyadan keyin yonmaydi?

5. ADC ning ishlashi bo'yicha tadqiqot o'tkazing. C: \ CVAVR \ z3 jildida dastur asosida 3-topshiriq loyiha fayllarini yaratish uchun kompilyatordan foydalaning. z3. c, uning matni quyida qutida berilgan (7-bo'limda batafsil izohlangan).

Keyin Z3_vm.prj faylini yozish uchun simulyatordan foydalaning.

; fayl Z3_ vm. prj

. MIKRO " ATmega16"

. ASBOBLAR CHINIRASI " UMUMIY"

. MAQSAD " z3. olti burchakli" ; taqlid qilingan proshivka MK

. COFF " z3. kof" ; faylda bog'lanish mavjud

; kontent [.hex] dagi kodga [__. c]

. MANBA " z3__. c" ; [.cof] fayli yo'naltirilgan C manbasi.

; ushbu CodeVision kompilyatsiya qilishda "__" qo'shadi

. IZ; oynada disk raskadrovka ma'lumotlarini ko'rsatish

; SCOPE - pushti (Yordam emulyatoriga qarang)

. SOAT 4 meg; ishlatiladigan kvarts chastotasi

; Siz ko'rsata oladigan MK belgilari

; "ulanish" emulyatori: RESET, AREF, PA0-PA7, PB0-PB7, PC0-PC7, PD0-PD7, ACO, TIM1OVF

; MK ADC dan foydalanish uchun siz AREF piniga mos yozuvlar kuchlanishini qo'llashingiz kerak - biz MK quvvatining 5 voltini etkazib beramiz. Ammo VMLABda

; ikkita tugunni to'g'ridan-to'g'ri ulay olmaysiz. 1 ohm rezistorni oling.

R1 VDDAREF 1 ; rezistor R1 ulangan

; 1 Ohm qarshilik orqali VDD va AREF tugunlari

; mos yozuvlar kuchlanish Vref bizda 5 volt bor -

; ADC kirishiga 5 voltni qo'llashni anglatadi

; Natijani olamiz: 1111111111 (10-bitli ADC)

; ADC input0 (bu PA0 MK pinidir) biz ulanamiz

; harakatlanuvchi kontaktli o'zgaruvchan qarshilik

; ("Boshqarish paneli" oynasidagi 1-slayder) -

; emulyatsiya paytida ADC kirishidagi kuchlanishni o'zgartirish uchun.

V1 PA0 VSS SLIDER_1 (0 5)

; o'zgaruvchan rezistorning uchlarida 0 va 5 volts

; Emulyatorda 8 ta LED mavjud -

; biz ularni B portining pinlariga ulaymiz

D1 VDD PB0

D2 VDD PB1

D3 VDD PB2

D4 VDD PB3

D5 VDD PB4

D6 VDD PB5

D7 VDD PB6

D8 VDD PB7

; Emulator LEDlarni to'g'ridan-to'g'ri ulash imkonini beradi

; elektr ta'minotining ortiqcha qismiga va MCning xulosalariga - aslida kerak

; oqim cheklovchi qarshilik 430-910 Ohm

; Har bir LED bilan ketma-ket!

.PLOT V (PA0); osiloskop ekraniga ("SCOPE" oynasi)

; potansiyometr slayderidagi kuchlanishni ko'rsating

Simulyatsiya uchun loyihani boshlaganingizdan so'ng, potansiyometr slayderining o'rnini o'zgartirib, LED va osiloskopni kuzating. ADC ning eng muhim bitlaridan biriga mos keladigan kuchlanish qanday? Periferik qurilmalar oynasini oching va potansiyometr slayderi S1 o'rnini o'zgartirganda ADC registrlarini kuzating. LED ko'rsatkichlarini va ADCH va ADCL registrlari tarkibini solishtiring.

Dastur xotirasi va assembler tili dasturining mazmunini ko'ring. Dastur nechta katakchani oladi? Analogdan raqamliga o'tkazish jarayoni oxirida uzilish vektori qaysi manzilda joylashgan?

6. Jildda tayyorlangan loyihani simulyatsiya qilish uchun ishga tushiring z4 (4-topshiriq). Loyiha MK ATmega16 da amalga oshirildi.

Oynada KO'RMA(bu virtual osiloskop) siz loyiha faylida ko'rsatilgan MK oyoqlaridagi kuchlanishdagi o'zgarishlarni ko'rishingiz mumkin - vmlab.prj... Yuqori osillogramma oyoqdagi signaldir TXD (PD1) ketma-ket port USART, bu orqali MC RS232 interfeysi orqali shaxsiy kompyuterning MAQOMOTI portiga ma'lumotlarni uzatadi - MC nimani uzatadi, biz virtual terminalda ko'ramiz. TTY panellar BoshqaruvPanel... U erda qiymat ko'rsatiladi PWM (PWM) PD5 pinida hosil qilingan signal. Signalning o'zi oynada ko'rinadi KO'RMA- xabar qilingan raqamli qiymatlarga ko'ra qanday o'zgarishini ko'ring. Oyoq ustida PD4 doimiy davomiylik bilan bir xil chastotali impulslar hosil bo'ladi.

Loyiha faylida vmlab.prj oyog'iga PD5 rezistor va kondansatördan eng oddiy past o'tkazuvchan filtr (LPF) ulangan - u o'zgartiradi PWM signali oynada ko'rish mumkin bo'lgan doimiy kuchlanishga KO'RMA(signal DAC).

Misoldagi ma'lumotlarni uzatish formati 8N1 (bu shaxsiy kompyuter uchun standart format). Ushbu formatda bayt uzatish "start bit" bilan boshlanadi - bu jurnal. USART MK uchun TXD oyog'idagi "0" va shaxsiy kompyuter COM porti uchun +5 ... + 15 V. Keyin uzatilgan baytning barcha 8 biti noldan boshlab TXD oyog'iga chiqariladi. Bitni uzatish paytida qabul qiluvchi ushbu darajani aniqlashi va eslab qolishi kerak. Keyinchalik "to'xtash biti" keladi - bu jurnal. USART MK uchun TXD oyog'idagi "1" va kompyuter COM porti uchun -5 ...- 15 V. MCU va kompyuter o'rtasidagi darajani moslashtirish uchun MAX232 adapteri kiritilgan.

7 ... Quyida matni berilgan dasturning ishini sinab ko'ring. Assemblar tilidan foydalanmasdan ishlaydigan yorug'lik effektini amalga oshiradigan dasturni ishlab chiqing.

#o'z ichiga oladi

#o'z ichiga oladi

asosiy bekor (bo'sh) (

#asm ("ldi r20,1")

#asm ("lsl r20")

#asm ("chiqish 0x18, r20")

#asm ("ldi r20,1")); Boshqaruvsavollar

    AVR port liniyalarining yuk sig'imi qancha?

    AVR uchun C dasturida global uzilishlarni yoqish va o'chirish uchun qanday assembler qo'shimchalaridan foydalanish mumkin?

    Arifmetik amallarni bajarish natijasini yozing: 245/37 va 245% 37.

    AVR uchun C dasturida bir soniya kechikishni qanday buyruqlar bilan tashkil qilishingiz mumkin?

    PORTA = ~ buyrug'iga sharh bering (++ uchun);

    mnogo o'zgaruvchisini e'lon qiling, agar u noldan milliongacha bo'lishi mumkin.

    ADCSRA | = 0x40 buyrug'i natijasini sharhlang;

Ko'pchilik Assembler allaqachon eskirgan va hech qanday joyda ishlatilmaydi, deb o'ylaydi, lekin asosan bu tizim dasturlash bilan professional ravishda shug'ullanmagan yoshlardir. Dasturiy ta'minotni ishlab chiqish, albatta, yaxshi, lekin yuqori darajadagi dasturlash tillaridan farqli o'laroq, Assembler sizga kompyuterning ishlashini chuqur tushunishga, apparat resurslari bilan ishlashni optimallashtirishga, shuningdek, har qanday texnikani dasturlashga o'rgatadi va shu bilan mashinani o'rganish yo'nalishida rivojlanadi. . Ushbu qadimiy PLni tushunish uchun Assembler funksiyasini eng yaxshi tushuntiradigan oddiy dasturlar bilan mashq qilish kerak.

Assembler uchun IDE

Birinchi savol: Assemblerda qanday rivojlanish muhitida dasturlash kerak? Javob aniq - MASM32... Bu ushbu PL uchun ishlatiladigan standart dastur. Siz uni masm32.com rasmiy veb-saytidan arxiv shaklida yuklab olishingiz mumkin, uni ochish va keyin install.exe o'rnatuvchisini ishga tushirish kerak. Shu bilan bir qatorda, siz FASM-dan foydalanishingiz mumkin, ammo uning kodi sezilarli darajada farq qiladi.

Ishni boshlashdan oldin, asosiy narsa PATH tizim o'zgaruvchisiga quyidagi qatorni qo'shishni unutmang:

C: \ masm32 \ bin

"Salom dunyo" montaj dasturi

Bu dasturlashning asosiy dasturi hisoblanib, yangi boshlanuvchilar til bilan tanishganlarida birinchi bo'lib yozadilar. Ehtimol, bu yondashuv mutlaqo to'g'ri emas, lekin u yoki bu tarzda vizual natijani darhol ko'rishga imkon beradi:

386 .model flat, stdcall optsion casemap: hech biri o‘z ichiga olmaydi /masm32/include/windows.inc o‘z ichiga oladi /masm32/include/user32.inc o‘z ichiga oladi /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib / masm32 lib / kernel32.lib .data msg_title db "Title", 0 msg_message db "Salom dunyo", 0 .code start: Invoke MessageBox, 0, addr msg_message, addr msg_title, MB_OK invoke ExitProcess, 0 end start

Birinchidan, MASM32 o'rnatilgan papkada qeditor.exe muharririni ishga tushiring va unga dastur kodini yozing. Shundan so'ng biz uni ".asm" kengaytmali fayl sifatida saqlaymiz va menyuning "Loyiha" → "Hammasini qurish" bandidan foydalanib dasturni quramiz. Agar kodda xatolik bo'lmasa, dastur muvaffaqiyatli kompilyatsiya qilinadi va natijada biz "Salom dunyo" yozuvi bilan Windows oynasini ko'rsatadigan tayyor exe-faylni olamiz.

Assemblerda ikkita raqamni qo'shish

Bunday holda, biz raqamlar yig'indisi nolga teng yoki yo'qligini tekshiramiz. Agar shunday bo'lsa, ekranda tegishli xabar paydo bo'ladi, agar bo'lmasa, boshqa bildirishnoma paydo bo'ladi.

486 .model flat, stdcall optsion casemap: hech biri /masm32/include/windows.inc o‘z ichiga oladi /masm32/include/user32.inc o‘z ichiga oladi /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib / masm32 lib / kernel32.lib ichiga /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: mov eax, 123 mov ebx, -90 add eax, ebx test eax, eax jz zero invoke, Message, MessaBo chr $ ("In eax 0 emas!"), chr $ ("Ma'lumot"), 0 jmp lexit nol: MessageBox-ni chaqirish, 0, chr $ ("In eax 0!"), chr $ ("Ma'lumot"), 0 lexit: ExitProcess-ni chaqirish, 0 yakuniy boshlash

Bu erda biz teglar deb ataladigan va ular yordamida maxsus buyruqlardan foydalanamiz (jz, jmp, test). Keling, batafsil ko'rib chiqaylik:

  • test - baytlar, so'zlar yoki qo'sh so'zlar ko'rinishidagi o'zgaruvchilarni (operandlarni) mantiqiy taqqoslash uchun ishlatiladi. Taqqoslash uchun buyruq mantiqiy ko'paytirishdan foydalanadi va bitlarga qaraydi: agar ular 1 ga teng bo'lsa, natijaning biti 1 ga teng bo'ladi, aks holda - 0. Agar biz 0 ga ega bo'lsak, bayroqlar ZF bilan birga o'rnatiladi ( nol bayroq), bu 1 ga teng bo'ladi, keyin natijalar ZF asosida tahlil qilinadi.
  • jnz - agar ZF bayrog'i hech qanday joyda o'rnatilmagan bo'lsa, ushbu yorliqda sakrash amalga oshiriladi. Ushbu buyruq ko'pincha dasturda ZF natijasiga qandaydir tarzda ta'sir qiladigan taqqoslash operatsiyalari mavjud bo'lsa ishlatiladi. Bularga test va cmp kiradi.
  • jz - agar ZF bayrog'i hali ham o'rnatilgan bo'lsa, yorliq sakrab o'tadi.
  • jmp - ZF bor yoki yo'qligidan qat'iy nazar, teg sakrab o'tadi.

Raqamlarni yig'ish uchun yig'ish dasturi

Ikki o'zgaruvchini qo'shish jarayonini ko'rsatadigan ibtidoiy dastur:

486 .model flat, stdcall optsion casemap: hech biri /masm32/include/windows.inc o‘z ichiga oladi /masm32/include/user32.inc o‘z ichiga oladi /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib / masm32 lib / kernel32.lib ichiga /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data msg_title db "Sarlavha", 0 A DB 1h B DB 2h bufer db 128 dup (?) format db0 " .code start: MOV AL, A ADD AL, B chaqiradi wsprintf, addr bufer, addr format, eax invoke MessageBox, 0, addr bufer, addr msg_title, MB_OK ExitProcessni chaqiradi, 0 end start

Assemblerda yig'indini hisoblash uchun juda ko'p harakatlar amalga oshiriladi, chunki dasturlash tili to'g'ridan-to'g'ri tizim xotirasi bilan ishlaydi. Bu erda biz asosan resurslarni manipulyatsiya qilamiz va mustaqil ravishda o'zgaruvchiga qancha ajratish kerakligini, raqamlarni qanday shaklda qabul qilishni va ularni qaerga qo'yish kerakligini ko'rsatamiz.

Assemblerda buyruq satridan qiymat olish

Dasturlashning eng muhim asosiy bosqichlaridan biri keyingi ishlov berish uchun konsoldan ma'lumotlarni olishdir. Bunday holda, biz ularni buyruq satridan olamiz va ularni Windows oynasida ko'rsatamiz:

486 .model flat, stdcall optsion casemap: hech biri /masm32/include/windows.inc o‘z ichiga oladi /masm32/include/user32.inc o‘z ichiga oladi /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib / masm32 lib / kernel32.lib o'z ichiga /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: GetCommandLine-ga qo'ng'iroq qiling; natija eax push 0 push chr $ ("Buyruqlar qatori") push eax-ga joylashtiriladi; eax push 0 call MessageBox push 0 chaqiruvidan chiqish uchun matnni olamiz ExitProcess end start

Bundan tashqari, alternativ usuldan foydalanishingiz mumkin:

486 .model flat, stdcall optsion casemap: hech biri /masm32/include/windows.inc o‘z ichiga oladi /masm32/include/user32.inc o‘z ichiga oladi /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib / masm32 lib / kernel32.lib ichiga /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: GetCommandLine-ga qo'ng'iroq qiling; natija eax invoke GetCommandLine invoke MessageBox-ga joylashtiriladi, 0, eax, chr $ ("Buyruqlar qatori"), 0 chaqirish ExitProcess, 0 push 0 qo'ng'iroq ExitProcess tugatish boshlanishi

Unda dastur kodini soddalashtiradigan maxsus makros invoke ishlatiladi. Kompilyatsiya vaqtida makro buyruqlar assembler buyruqlariga aylantiriladi. Qanday bo'lmasin, biz stekdan foydalanamiz - ma'lumotlarni saqlashning ibtidoiy usuli, lekin ayni paytda juda qulay. An'anaviy tarzda, stdcall, barcha WinAPI funktsiyalarida o'zgaruvchilar stek orqali faqat teskari tartibda o'tkaziladi va tegishli eax registriga joylashtiriladi.

Assembler halqalari

Foydalanish holati:

Data msg_title db "Title", 0 A DB 1h bufer db 128 dup (?) Format db "% d", 0 .code start: mov AL, A .REPEAT inc AL .UNTIL AL == 7 invoke wsprintf, addr bufer, addr formati, AL chaqiradi MessageBox, 0, addr bufer, addr msg_title, MB_OK ExitProcessni chaqiradi, 0 end start .data msg_title db "Sarlavha", 0 bufer db 128 dup (?) format db "% d", 0 .code start: mov eax, 1 mov edx, 1 .WHILE edx == 1 inc eax .IF eax == 7 .BREAK .ENDIF .ENDW wsprintf, addr bufer, addr formati, eax chaqiruvi MessageBox, 0, addr bufer, addr msg_title. ExitProcess-ni chaqiring, 0

Takrorlash buyrug'i tsiklni yaratish uchun ishlatiladi. Keyin, inc dan foydalanib, o'zgaruvchining qiymati RAMda yoki protsessorning o'zida bo'lishidan qat'i nazar, 1 ga oshiriladi. Tsiklning ishini to'xtatish uchun ".BREAK" direktivasi ishlatiladi. U ham tsiklni to'xtata oladi, ham "pauza" dan keyin o'z harakatini davom ettira oladi. “.CONTINUE” direktivasi yordamida dastur kodining bajarilishini to'xtatishingiz va takror va while holatini tekshirishingiz ham mumkin.

Assemblerdagi massiv elementlari yig'indisi

Bu erda biz "for" tsikli yordamida massivdagi o'zgaruvchilarning qiymatlarini umumlashtiramiz:

486 .model flat, stdcall optsion casemap: hech biri o‘z ichiga olmaydi /masm32/include/windows.inc o‘z ichiga oladi /masm32/include/user32.inc o‘z ichiga oladi /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib / masm32 lib / kernel32.lib o'z ichiga /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data msg_title db "Sarlavha", 0 A DB 1h x dd 0,1,2,3,4,5,6,7, 8,9,10,11 n dd 12 bufer db 128 dup (?) Format db "% d", 0 .code start: mov eax, 0 mov ecx, n mov ebx, 0 L: eax qo‘shish, x ebx qo‘shish, type x dec ecx cmp ecx, 0 jne L chaqirish wsprintf, addr bufer, addr formati, eax invoke MessageBox, 0, addr bufer, addr msg_title, MB_OK ExitProcessni chaqirish, 0 end start

dec buyrug'i, xuddi inc kabi, operand qiymatini bittaga, faqat teskari yo'nalishda -1 ga o'zgartiradi. Ammo cmp o'zgaruvchilarni ayirish usuli bilan taqqoslaydi: ikkinchisidan bitta qiymatni olib tashlaydi va natijaga qarab tegishli bayroqlarni o'rnatadi.

jne buyrug'i o'zgaruvchilarni taqqoslash natijasi asosida yorliqni boshqaradi. Agar salbiy bo'lsa, o'tish sodir bo'ladi va operandlar bir-biriga teng bo'lmasa, o'tish amalga oshirilmaydi.

Assembler o'zgaruvchilarni ifodalashi bilan qiziq, bu esa ular bilan xohlagan narsani qilish imkonini beradi. Ushbu dasturlash tilining barcha nozik tomonlarini tushunadigan mutaxassis haqiqatan ham qimmatli bilimga ega bo'lib, undan foydalanishning ko'plab usullari mavjud. Bitta muammoni turli yo'llar bilan hal qilish mumkin, shuning uchun yo'l tikanli bo'ladi, lekin undan kam emas.

Ko'rishlar soni: 767

O'g'lim maktab uchun qog'ozdan svetoforning qo'g'irchog'ini yopishtirib o'tirganida, "Nega mikrokontrollerda unga svetoforning ishlaydigan modelini yig'ib qo'ymaslik kerak?" degan fikr keldi. Internetda ular uchun eng oddiy svetofor printsipini amalga oshiradigan ko'plab sxemalar va dasturlar mavjud. Ammo ular o'yinchoq uchun juda murakkab (DC-DC konvertori, siljish registrlari va boshqalar) yoki faqat assemblerdagi eng oddiy dasturning namunasi sifatida taqdim etiladi. Men ba'zi qo'shimcha funktsiyalarga ega to'liq o'yinchoq svetofor uchun sxematik va montaj tili dasturini taqdim qilmoqchiman. Bundan tashqari, u yangi boshlanuvchilar uchun muhim bo'lgan eng oddiy sxema bo'yicha "tinga" mikrokontrollerda yig'iladi. Umid qilamizki, bu oddiy sxema PIC dasturlashni o'rganishni boshlagan ko'pchilik uchun PIC-ga asoslangan birinchi haqiqiy dizaynga aylanadi. Oddiy, ammo shu bilan birga dasturlashning asosiy texnikasi va atributlarini o'z ichiga olgan dastur uni tushunish va tajriba qilishni osonlashtiradi.

Mikrokontrolderlarni dasturlash bilan shug'ullanadigan har bir kishi uzilishlar ishlov beruvchilarini yozishning asosiy tamoyillarini biladi: imkon qadar qisqa bajarish vaqti va qisqa kod, hech qanday tsikllar va boshqa pastki dasturlar ishlov beruvchisidan qo'ng'iroqlar va boshqalar. Bunday holda, uzilishlarga faqat darajadagi o'zgarishlarda ruxsat beriladi (biz boshqa uzilishlarni o'tkazib yubora olmaymiz, chunki ular mavjud emas) va men dasturni va uni idrok etishni soddalashtirish uchun ushbu tamoyillardan chetga chiqish mumkin deb hisobladim. Bu erda uzilish ishlovchisida tsikllar va boshqa kichik dasturga qo'ng'iroq va (oh dahshat!) Hatto UYKU rejimiga o'tish ham mavjud. Shuning uchun, sarlavhada dastur "noto'g'ri" deb ataladi. Bunday holda, uzilishni ishlov beruvchi oddiy pastki dastur sifatida ishlatiladi, ammo boshqa hollarda yuqoridagi printsiplar, albatta, o'z kuchini saqlab qoladi.

Qurilmaning qisqacha tavsifi:

Qurilma ko'cha svetoforining modeli bo'lib, uning ishlashini ishonchli simulyatsiya qilish (ranglarni almashtirish, yashil rangni miltillash) va qo'shimcha funktsiyalarga ega: tugmani bosish orqali almashish chastotasini o'zgartirish, sariq rejimni miltillash, qo'lda va avtomatik rejimda uyqu rejimiga o'tish. rejimlar, keyin tugmani bosish orqali yoqing. Ushbu qurilma bolalar o'yinchog'i, shuningdek, maktabgacha ta'lim muassasalarida bolalarga yo'llarda o'zini tutishga o'rgatishda ko'rgazmali vosita sifatida ishlatilishi mumkin.

Shunday qilib, keling, sxemaning tavsifi va ko'rib chiqilishiga o'tamiz:

Sxema arzon mikrokontrollerda yig'ilgan. Chiqish sifatida dasturlashtirilgan GP0-GP2, GP4, GP5 (oyoqlar 7, b, 5, 3, 2) chiqishlari to'g'ridan-to'g'ri LEDlarni boshqarish uchun ishlatiladi. Har bir yo'nalishdagi LEDlar oqim sarfini minimallashtirish uchun ketma-ket birlashtirilgan. R3-R8 rezistorlari LED oqimlarini cheklaydi. Turli xil rangdagi LEDlarning chiqishida kuchli farq bo'lsa, siz tegishli rezistorlarni tanlashingiz kerak bo'ladi. Men uchun, masalan, ikkita sariq guruh parallel ravishda ulangan va bitta rezistorga ulangan va qolganlari bilan bir xil qiymat va boshqalarga qaraganda bir oz yorqinroq porlaydi (orqaga qaytish kattaroq).

Ushbu sxemada LEDlarga qo'shimcha elementdan mikrokontrollerga qaraganda 1,5 V ko'proq quvvat beriladi (bu holda, chiqish o'chirilgan bo'lsa, oqim mikrosxemaning chiqishiga o'tmaydi, chunki ancha yuqori kuchlanish talab qilinadi. ikkita LEDning o'tish joylarini ochish uchun (kamida 2,5 B) Va hatto ikkala LED teshilgan bo'lsa ham (bu ehtimoldan yiroq), ichki himoya diodi orqali elektr ta'minotining plyus qismiga o'tadigan oqim taxminan 7,5 mA bo'ladi, bu juda kam. Eksperimental ravishda akkumulyator zaryadsizlanganda LEDlar orqali oqimning pasayishiga qaramay, ularning yorug'ligi batareya kuchlanishining barcha diapazonida maqbul darajada saqlanib qolishi eksperimental ravishda aniqlangan. quvvat tugmasidan voz kechish (uyqu rejimida joriy iste'mol - 1-3 m kA).

Qurilmaning ish rejimlarini boshqarish tugmasi konfiguratsiya bitlarida raqamli kirish sifatida e'lon qilingan GP3 piniga (4-pin) ulangan. Tugma bosilganda, uzilish paydo bo'ladi, uning ishlov beruvchisida quyidagilar sodir bo'ladi. Uzoq vaqt davomida (4 soniyadan ortiq) bosilganda, qurilma uyqu rejimiga o'tadi. Qisqaroq bosish bilan svetoforning tezligini rasmga muvofiq joriy tezlikni ko'rsatgan holda aylana bo'ylab ketma-ket almashtirish mavjud:

Oxirgi rejimda (qizil LEDlar yoqilgan), sariq miltillovchi signal faollashadi. Tugmachani uzoq vaqt bosib (barcha LEDlarning o'chirilishi bilan tasdiqlangan) biz rejimni yangisiga o'zgartirish bilan normal ishlashga o'tamiz, agar tugma 6 soniyadan ko'proq bosilmasa, ish rejimi saqlanib qoladi. tugmani bosishdan oldingi kabi.

Kutish rejimida AA hujayralarining zaryadi kamida bir yil davom etadi, shuning uchun qurilmada quvvat tugmasi yo'q. Qurilma 0,5 - 1 soatdan keyin ham (ranglarni almashtirish tezligiga qarab) tugmaga ta'sir qilmasdan uyqu rejimiga o'tadi. SLEEP rejimidan istalgan tugmani bosish orqali chiqariladi. Quvvat mikrokontrollerga pinlar 1 va 8 orqali beriladi. Pimlarni tejash va dizaynni soddalashtirish uchun tashqi elementlarsiz ichki generator rejimi yoqilgan.

Ilovada keltirilgan dastur uchun kichik tushuntirishlar:

Tugmachalarni bosish jarayoni quyi dasturlarda amalga oshiriladi: wait_butt __- 6 soniya davomida bosish va ro'yxatdan o'tishni kutish. bosmasdan, push_butt __- bosish davomiyligini qayd etish, wait_nobutt __- bosilmagan tugmani kutish. Svetofor holati o'zgarganda (sariq va miltillovchi yashil), chiqish portining qiymatlari tact__ pastki dasturidagi jadvaldan o'qiladi (past yoki baland nibbles). Xuddi shunday, tugma bosilganda holat ko'rsatkichi ind__ pastki dasturdan. Ishlash vaqti tugagandan so'ng uyqu rejimiga o'tish uchun uzilish bayrog'ini dasturiy ta'minotni sozlash orqali uzilishlarni qayta ishlash tartibiga majburiy o'tish amalga oshiriladi. CONST_MIN, CONST_REG, CONST_SL konstantalarini o'zgartirish orqali siz yashil miltillash davrini, batareya ulanganda boshlang'ich rejimni, SLEEP rejimiga o'tishgacha ta'sirsiz ishlash vaqtini o'zgartirishingiz mumkin.

Bosilgan elektron plata bir tomonlama folga bilan qoplangan shisha tolali shishadan tayyorlangan va o'lchamlari 22x87 mm. Eng tashqi LEDlar turli yo'nalishlarda taxtaga parallel ravishda o'rnatiladi. O'rtalari qismlarni o'rnatish tomonidan, ikkinchisi esa yo'llarning yonidan o'rnatiladi, bu esa simlarni taxtaning teshiklariga o'tkazib, ularni qismlarning yonidan bir tomchi lehim bilan mahkamlaydi, va yo'llarning yonidan mos keladigan yo'llarga lehimlash orqali.

Barcha rezistorlar 0,125 Vt. LEDlar har qanday mahalliy yoki import qilinadigan, tercihen taxminan 2 volt bo'lgan 10 mA oqimdagi to'g'ridan-to'g'ri kuchlanish pasayishi bilan bir xil turdagi olinishi mumkin. Tugma - har qanday tuzatishsiz. Mikrokontroller blokga o'rnatilgan.

Mikrodastur yuklanganda konfiguratsiya so'zi avtomatik ravishda xotiraga kiritiladi (IC-Prog-da "birdie" faqat "PWRT" bandiga o'rnatiladi, qolgan elementlar "tozalanadi", "intOSC GP4" da o'rnatiladi. "Osilator" ustuni). Birinchidan, mikrodasturni toza mikrosxemadan o'qish va dastur xotirasi oxirida 03FF manzilidagi so'zning qiymatini yozish kerak, bu ma'lum bir mikrosxemaning ichki generatorining chastotasini sozlash uchun talab qilinadi. HEX faylini dasturga yuklagandan so'ng, bu qiymat 03FF da qo'lda kiritilishi kerak. Ushbu qurilmada chastotaning og'ishi muhim emas, lekin siz hali ham ushbu protsedura ushbu mikrosxema uchun zarurligini bilishingiz kerak. Oxirgi chora sifatida, agar zavod qiymati yo'qolsa, siz hech narsa qila olmaysiz - dastur bu holatda to'g'ri ishlash uchun choralar ko'rdi.

Qurilma mos plastik qutiga joylashtirilgan. Tegishli teshiklar qutidagi va qopqoqdagi LEDlar uchun qilingan. Mening versiyamda svetoforning o'zi va tugma va batareyali taglik diametri 20 mm bo'lgan plastik suv trubkasi orqali ulangan.

Sizga maqola yoqdimi? Do'stlar bilan baham ko'rish uchun: