Avr mikrokontrollerlarini dasturlash tartibi. Ajam mikrokontroller dasturchilari uchun maslahatlar. Kerakli dasturlar to'plami

Shunday qilib, biz yadroning o'tish va adreslash bo'yicha ishini saralab oldik. E'tiborimizni boshqa sohaga - xotiraga qaratish vaqti keldi.

Uning ikki turi mavjud (EEPROM hisobga olinmaydi, chunki u odatda periferikdir, lekin keyinroq bu haqda batafsilroq):

  • RAM - RAM
  • ROM - ROM, aka flash, aka dastur xotirasi

Bizning arxitekturamiz Garvard bo'lganligi sababli, operativning o'z manzili bor va fleshning o'ziga xos manzili bor. Ma'lumotlar varag'ida siz RAM manzillash strukturasini ko'rishingiz mumkin.

Darhol manzillarga e'tibor bering! RON va periferik registrlar, shuningdek operativ xotira bir xil manzil maydonida joylashgan. Bular. 0000 dan 001F gacha bo'lgan manzillar bizning registrlarimizni egallaydi, so'ngra 005F manziligacha kirish/chiqarish katakchalari - portlar mavjud. Portlar orqali kontroller bortidagi hamma narsa sozlangan. Va shundan keyingina, 0060 manzilidan bizning operativ xotiramiz keladi, biz undan maqsadli foydalanishimiz mumkin.

Bundan tashqari, E'tibor bering, kiritish-chiqarish registrlari ham o'z manzillariga ega - kiritish-chiqarish registrlarining manzil maydoni (00 dan 3F gacha), u rasmning chap tomonida ko'rsatilgan. IO/Register Block Bu adreslash FAQAT OUT va IN ko'rsatmalarida ishlaydi.Bundan qiziqarli xususiyat kelib chiqadi.

Periferik registrlarga ikki xil usulda kirish mumkin:

  • I/U manzil maydonidagi qisqa manzilda IN/OUT buyruqlari orqali
  • RAM manzil maydonidagi to'liq manzilda LOAD/STORE buyruqlar guruhi orqali

Misol. Asinxron qabul qiluvchi UDR ning kirish registrini olaylik, u 0x0C (0x2C) manziliga ega; umumiy manzil maydonidagi manzil qavs ichida ko'rsatilgan.

LDI R18.10; Biz 10 raqamini R18 registriga yukladik. Xuddi shunday OUT UDR,R18 ; Birinchi usulda chiqarilgan, kompilyatorning o'zi; UDR STS 0x2C,R18 o'rniga 0x0C qiymatini almashtiradi; Ular meni ikkinchi yo'l bilan olib ketishdi. Do'kon buyrug'i orqali; To'g'ridan-to'g'ri manzilni kiritish orqali.

Ikkala usul ham bir xil natijalarni beradi. LEKIN! Kirish/chiqish maydonida (OUT/IN) adreslash orqali ishlaydiganlar ikki baytga qisqaroq. Bu tushunarli - ular ixtiyoriy xotira katakchasining ikki baytli manzilini saqlashlari shart emas va kirish-chiqish maydonining qisqa manzili ikki baytli buyruq kodiga mos keladi.

To'g'ri, bu erda yana bir hazil bor. Gap shundaki, har yili AVR dan ko'proq toshlar paydo bo'ladi va ularda go'sht ko'payadi. Va har bir crackling o'zining periferik kiritish-chiqarish registrlariga muhtoj. Va endi biz ATMega88 (Mega8 o'rnini egallagan) allaqachon shu qadar ko'p tashqi qurilmalarga ega degan xulosaga keldikki, uning kiritish-chiqarish registrlari endi 3F manzil maydoni chegarasiga to'g'ri kelmaydi.

Voy, ular yetib kelishdi. Bu erda eski toshlardan yangisiga o'tayotganlar hayratlanarli iboralarni ifodalay boshlaydilar - nima uchun OUT/IN buyruqlari ba'zi bir periferik registrlarda ishlaydi, lekin boshqalarda emas?

Va bu oddiy - etarli chuqurlik yo'q edi.

Ammo yadro bitta, uni endi qayta tiklab bo'lmaydi. Va bu erda ATMEL odamlari ayyorlik qilishdi - ular xotira xaritasi deb ataladigan registrlarni joriy qilishdi. Bular. 3F chegarasiga to'g'ri kelmagan barcha registrlar endi faqat bitta usulda mavjud - Yuklash/Do'kon orqali.

Qanday hazil. Agar siz m88def.inc ni ochsangiz, kiritish/chiqarish registrlarining qaysi biri “to‘g‘ri” va qaysi biri xotira xaritasiga kiritilganligini ko‘rishingiz mumkin.

Shunga o'xshash narsa bo'ladi:

; ***** KIRISH/UCH RO‘YXATISH TA’RIFLARI ******************************************** ******** *; ESLATMA: ; "MEMORY MAPPED" deb belgilangan ta'riflar kengaytirilgan kiritish/chiqarish portlaridir; va IN/OUT ko'rsatmalari bilan foydalanish mumkin emas .equ UDR0 = 0xc6 ; MEMORY MAPPED .equ UBRR0L = 0xc4 ; MEMORY MAPPED .equ UBRR0H = 0xc5 ; MEMORY MAPPED .equ UCSR0C = 0xc2 ; MEMORY MAPPED .equ UCSR0B = 0xc1 ; MEMORY MAPPED .equ UCSR0A = 0xc0 ; MEMORY MAPPED blah blah blah, va yana ko'p narsalar.equ OSCCAL = 0x66 ; MEMORY MAPPED .equ PRR = 0x64 ; MEMORY MAPPED .equ CLKPR = 0x61 ; MEMORY MAPPED .equ WDTCSR = 0x60 ; MEMORY MAPPED .equ SREG = 0x3f ;<------ А тут пошли обычные.equ SPL = 0x3d .equ SPH = 0x3e .equ SPMCSR = 0x37 .equ MCUCR = 0x35 .equ MCUSR = 0x34 .equ SMCR = 0x33 .equ ACSR = 0x30

Bu piroglar.

Va bu sohada siz katta mo'ynali organ uni mahkam yopish maqsadi bilan montaj kodining o'zaro mos modellari tomon uchayotganini tushunasiz. Axir, registrlarni tavsiflovchi har xil so'l ta'riflar va ta'riflarni to'g'rilash boshqa narsa, o'tirish va Zolushka kabi to'g'ri portlarni noto'g'ri portlardan ajratish boshqa narsa.

Biroq, yechim bor. Makrotil! Buyruqlar tizimini yoqtirmaysizmi? Blackjack va fohishalar bilan o'zingizni yarating!
Keling, universal OUT kabi UOUT jamoamizni yarataylik

Xuddi shunday IN buyrug'i uchun.Umuman olganda, bunday makroslar yordamida siz assemblerni juda ko'p diversifikatsiya qilishingiz mumkin, uni kuchli dasturlash tiliga aylantirishingiz mumkin, u har xil C va Paskal tillarini lattadek parchalab tashlay oladi.

Xo'sh, men nima haqida gapiryapman ... RAM haqida.

Shunday qilib, biz manzilni aniqladik. Endi siz foydalanuvchi RAM hujayralari boshlanadigan xotira manzillarini qaerdan qidirishni bilasiz - ma'lumotlar varaqasi, Xotira xaritasi bo'limida. Lekin bilish uchun ma'lumot uchun bor.

Bizning kodimizda esa operativ xotira direktiva bilan boshlanadi. DSEG Shablonimizni eslaysizmi?

"m16def.inc" ni qo'shing; Biz ATMega16 dan foydalanamiz;= Start macro.inc ============================= ; Makroslar shu yerda;= macro.inc tugaydi ================================ ; RAM ================================================= ============ .DSEG ; RAM segmenti; FLASH ================================================== ========== .CSEG ; Kod segmenti; EEPROM ================================================== ======== .ESEG ; EEPROM segmenti

.DSEG dan keyin biz o'zgaruvchilarimizni o'rnatishimiz mumkin. Va bu erda bizda shunchaki hujayralar portlashi bor - istalgan birini egallang. Manzilni kiriting va xursand bo'ling. Lekin nima uchun manzillarni qo'lda hisoblash kerak? Bu erda kompilyator o'ylasin.

Shuning uchun biz yorliqni olib, o'rnatamiz

0x0060 ## ;Oʻzgaruvchilar 0x0061 ## 0x0062 ## 0x0063 ## ;Oʻzgaruvchilar2 0x0064 ## 0x0065 ## ;Oʻzgaruvchilar4 bu yerda boshlanishi mumkin

## har qanday bayt sifatida. Odatiy bo'lib FF. Albatta, o'zgaruvchilarning har qanday yozilishi, dastlabki ishga tushirish, to'lib ketish nazorati va boshqa burjua quvonchlari haqida gapirishning hojati yo'q. Bu Sparta! Aytmoqchimanki, assembler. Hammasi qo'lda.
Agar biz C bilan o'xshashlik qilsak, bu faqat bo'sh ko'rsatkichlar orqali xotira bilan ishlashga o'xshaydi. Sishniklar tushunadi. Ular tushunishadi va dahshatga tushishadi. Chunki bu dunyo shafqatsiz va xoindir. Men indeksni biroz noto'g'ri hisobladim va boshqa ma'lumotlarni yo'qotdim. Va agar u darhol paydo bo'lmasa, siz bu xatoga duch kelasiz.

Shunday qilib, e'tibor, e'tibor va e'tibor yana. Biz barcha xotira operatsiyalarini kuzatish orqali bajaramiz va hech narsa muvaffaqiyatsiz yoki to'lib ketmaydi.

.ORG direktivasi ma'lumotlar segmentida ham ishlaydi.U aynan shunday ishlaydi - u manzillarni, bu holda belgilarni shu yerdan xotira oxirigacha uzatadi. Faqat bitta noziklik - ORG 0000 bizga operativ xotiraning boshlanishini beradi va bu R0 va boshqa registrlar. Va misol sifatida Mega16-dan foydalangan holda nol kilometr RAM ORG 0x0060 ni beradi. Va boshqa kontrollerlarda boshqa qiymat mavjud. Har safar ma'lumotlar varag'ini ko'rib chiqish dangasa, shuning uchun ma'lum bir MK uchun RAMning boshlanishini ko'rsatadigan SRAM_START kabi so'l ta'rifi mavjud.

Shunday qilib, agar biz operativ xotiraning boshlanishini, aytaylik, 100 baytni qandaydir axlat buferi ostida qoldirishni istasak, biz bu hiylani qilamiz.

1 2 3 4 .DSEG .ORG SRAM_START+100 oʻzgaruvchilar: .bayt 3

DSEG .ORG SRAM_START+100 oʻzgaruvchilar: .bayt 3

Bajarildi, biz bufer zonamizni boshidan 100 tagacha tozaladik.

OK, biz manzilni aniqladik. Xotira hujayralari bilan qanday ishlash kerak? Va bu maqsadlar uchun ikkita buyruqlar guruhi mavjud. LOAD va STORE buyruqlarning eng katta guruhidir.

Gap shundaki, operativ xotira yacheykasi bilan unga RONdan bayt yuklash yoki undan baytni RONga tushirishdan boshqa hech narsa qilib bo'lmaydi.

Saqlash (ST**) buyruqlari RAMga yoziladi va Yuklash (LD**) buyruqlari o'qiladi.

O'qish R16…R31 registriga o'tadi va hujayra manzili to'g'ridan-to'g'ri buyruqda ko'rsatiladi. Mana oddiy misol. Uch baytli Variables o'zgaruvchisi mavjud, uni 1 ga oshirish kerak. Ya'ni. Variable++ amalini bajarish

DSEG o'zgaruvchilari: .bayt 3 o'zgaruvchilar2: .bayt 1 .CSEG ; O'zgaruvchi xotirada; avval uni olishingiz kerak. LDS R16, o'zgaruvchilar; R16 LDS R17, Variables+1 da birinchi o'zgaruvchilar baytini o'qing; R17 LDS R18, Variables+2 da ikkinchi o'zgaruvchilar baytini o'qing; Xo'sh, R18 da uchinchi bayt; Endi unga 1 qo'shamiz, chunki AVR doimiy bilan qo'sha olmaydi, faqat; ayirish uchun, buzib ko'rsatish kerak. Biroq, bu hech qanday maxsus muammolarni keltirib chiqarmaydi. SUBI R16,(-1); umuman olganda, SUBI ayirish hisoblanadi, lekin -(- beradi + SBCI R17,(-1) ; Va bu erda uzatish hisobga olinadi. Lekin bu haqda keyinroq. SBCI R18,(-1) ; Assemblerdagi matematika turli hikoya STS oʻzgaruvchilari, R16 ; Hammasini avvalgidek saqlang. STS oʻzgaruvchilari+1,R17 STS oʻzgaruvchilari+2,R18

Yoki boshqa usuldan foydalanishingiz mumkin. Indeks registri orqali bilvosita qayd etish.

DSEG o'zgaruvchilari: .bayt 3 o'zgaruvchilar2: .bayt 1 .CSEG ; LDI YL,low(Variables) LDI YH,High(Variables) o'zgaruvchimiz manzilini oling; O'zgaruvchi xotirada; avval uni olishingiz kerak. LD R16, Y+; R16 LD R17, Y+ da birinchi o'zgaruvchilar baytini o'qing; R17 LD R18, Y+ da ikkinchi o'zgaruvchilar baytini o'qing; Xo'sh, R18 da uchinchi bayt; Endi unga 1 qo'shamiz, chunki AVR doimiy bilan qo'sha olmaydi, faqat; ayirish uchun, buzib ko'rsatish kerak. Biroq, bu hech qanday maxsus muammolarni keltirib chiqarmaydi. SUBI R16,(-1); aslida SUBI ayirish hisoblanadi, lekin -(- beradi + SBCI R17,(-1) ; Va bu erda uzatish hisobga olinadi. Ammo bu haqda keyinroq. SBCI R18,(-1) ; Assemblerdagi matematika boshqa hikoya ST -Y,R18; Biz hamma narsani avvalgidek saqlaymiz. ST -Y,R17; Lekin teskari tartibda ST -Y,R16

Bu erda o'sishdan keyingi va oldingi pasaytirish bilan operatsiyalar allaqachon qo'llaniladi. Birinchisida avval o'qiymiz, so'ng manzilga 1 qo'shamiz, ikkinchisida esa avval manzildan 1 ni ayirib, keyin saqlaymiz.

Xotira yoki jadvallardagi massivlar bo'ylab takrorlash uchun bunday qo'shimcha buyruqlardan foydalanish qulay.
Bundan tashqari, har uch turdagi indekslar (X, Y, Z) uchun bilvosita nisbiy yozish/o'qish LDD/STD va boshqa variantlar mavjud. Umuman olganda, ma'lumotlar varag'ini va buyruqlar tizimini tutun.

Stak
Oh, stack ajoyib narsa. Menga yoqadigan narsa shundaki, stekning buzilishi ishchi dasturni to'liq tartibsizlikka aylantiradi. Chunki stek operatsiyalari ko'proq e'tibor talab qiladi, chunki agar biror joyda stek buzilgan bo'lsa va uni darhol kuzatib bo'lmasa, uni keyinroq ushlaysiz ... Umuman olganda, bu gizmo emas, balki go'zallik.

Nega men seni sevaman? Xo'sh, agar C ahmoqona hunarmandchilik bo'lsa, tez va samarali bo'lsa, unda Assambleya - bu filigra san'ati. Qanday qilib manyaklar Jimni qog'ozdan va faqat qog'ozdan asarlarni o'rab olishadi, garchi siz o'zingizning zavqingiz uchun tayyor prefabrik model va elim sotib olishingiz mumkin bo'lsa-da. Shunday qilib, bu erda ham - jarayonning o'zi juda katta. Shu jumladan disk raskadrovka bilan bog'liq muammolardan :))))

Shunday qilib, stack haqida. Bu nima? Va bu xotira maydoni. Stack printsipi asosida ishlaydi. Bular. Oxirgisini qo'ydi, birinchisini oldi.

Stekda stekning yuqori qismini ko'rsatuvchi ko'rsatgich mavjud. Maxsus registr SP stek ko'rsatkichi uchun javob beradi, aniqrog'i bu SPL va SPH registrlari juftligi. Ammo oz miqdordagi operativ xotiraga ega mikrokontrollerlarda, masalan, Tini2313-da, faqat SPL mavjud.

Tekshirish moslamasi ishga tushirilganda, odatda, ular qiladigan birinchi narsa stekni ishga tushirish, SP da uning pastki qismining manzilini, u o'sadigan joyni yozishdir. Odatda bu RAMning oxiri bo'lib, u boshiga qarab o'sadi.

Bu dasturning eng boshida shunday amalga oshiriladi:

1 2 3 4 5 LDI R16,Past(RAMEND) OUT SPL,R16 LDI R16,Yuqori(RAMEND) OUT SPH,R16

LDI R16,Past(RAMEND) OUT SPL,R16 LDI R16,Yuqori(RAMEND) OUT SPH,R16

Bu erda RAMEND - joriy MKda operativ xotiraning tugashini ko'rsatuvchi so'l ta'rifi.

Hammasi tugadi, stek borishga tayyor. Ma'lumotlar PUSH Rn buyrug'i yordamida stekga suriladi va POP Rn orqali olinadi.
Rn - bu RONning har qanday turi.

CALL, RCALL, ICALL, RET, RETI va uzilishni chaqirish buyruqlari ham stek bilan ishlaydi, lekin keyinroq bu haqda ko'proq ishlaydi.

Keling, uning qanday ishlashini his qilish, qanday va qayerda harakat qilishini tushunish uchun stek bilan o'ynaymiz.

Studiyaga quyidagi kodni kiriting:

CSEG; LDI kod segmenti R16, Past (RAMEND); Stackni ishga tushirish OUT SPL,R16 LDI R16,High(RAMEND) OUT SPH,R16 LDI R17,0 ; Yuklash qiymatlari LDI R18.1 LDI R19.2 LDI R20.3 LDI R21.4 LDI R22.5 LDI R23.6 LDI R24.7 LDI R25.8 LDI R26.9 PUSH R17; Biz qiymatlarni stekga joylashtiramiz PUSH R18 PUSH R19 PUSH R20 PUSH R21 PUSH R22 PUSH R23 PUSH R24 PUSH R25 PUSH R26 POP R0 ; POP R1 POP R2 POP R3 POP R4 POP R5 POP R6 POP R7 POP R8 POP R9 stekidagi pop qiymatlari

Endi studiyani bosqichma-bosqich ishga tushiring va SP qanday o'zgarishini tomosha qiling. Stack Pointer-ni studiyada Programma hisoblagichi bilan bir joyda ko'rish mumkin.

Birinchidan, biz stekni ishga tushiramiz va registrlarni ma'lumotlar bilan yuklaymiz. Natijada quyidagi rasm bo'ladi:

Keyinchalik, POP buyrug'i yordamida biz stekdan ma'lumotlarni olamiz. Esda tutingki, biz uchun ma'lumotlarni stekga qaerga qo'yishimiz va uni qaerga yuklashimiz muhim emas. Asosiysi, o'rnatish tartibi! Biz uni yuqori registrlardan joylashtiramiz va pastki registrlarga olamiz. Bu stek ko'rsatkichini oshiradi.

PUSH R16 PUSH R17 POP R16 POP R17

Masalan, men pastroq RONlarning cheklanishi haqida allaqachon gapirgan edim - ular sizga raqamni to'g'ridan-to'g'ri o'zingizga yozishingizga ruxsat bermaydi. Faqat katta guruh registrlari orqali. Ammo bu noqulay!

Muammo makro yordamida hal qilinadi. Men uni LDIL - LDI past deb nomladim

MACRO LDIL PUSH R17; Yuqori registrlardan birining qiymatini stekga saqlaymiz. LDI R17,@1; Unga bevosita qiymatimiz MOV @0,R17 ni yuklaymiz; Qiymatni past guruh registriga o'tkazamiz. POP R17; Keling, stekdan eng yuqori registrning qiymatini tiklaymiz. .ENDM

Endi siz bizning uy qurilishi buyrug'imizdan osongina foydalanishingiz mumkin.

1 LDIL R0.18

Vaqt o'tishi bilan makrosli fayl bunday uy qurilishi buyruqlarini oladi va ishlash oson va yoqimli bo'ladi.

Stack xatolar
Stack ma'lumotlarga qarab o'sadi va endi tasavvur qiling-a, bizda xotirada Davlat o'zgaruvchisi bor va u manzilda joylashgan, masalan, 0x0450. Stackning yuqori qismiga xavfli darajada yaqin. O'zgaruvchi, masalan, dasturning keyingi mantig'i bog'liq bo'lgan chekli holat mashinasining holatini saqlaydi. Aytaylik, agar 3 ta bo'lsa, biz bitta ishni qilamiz, agar 4 bo'lsa, boshqa narsa, 5 ta bo'lsa, boshqa narsa va hokazo. 255 ta holat. Va ish mantig'iga ko'ra, 3 dan keyin 4re bo'lishi kerak, lekin 10 emas

Va keyin 3 bor edi. Va keyin, bir dahshatli daqiqada, shartlar shu qadar mos keldiki, stack o'sdi va uning tepasi bu o'zgaruvchiga etib bordi va u erda qiymatni kiritdi, aytaylik 20 va keyin tazı orqaga tushib ketdi. Qopqoqni ortda qoldirish stek to'lib ketishining klassik namunasidir. Va shu sababli dasturning mantig'i butunlay qulab tushdi.

Yoki qarama-qarshi misol - stek o'zgaruvchilarga ko'tarildi, ammo o'sha paytda o'zgaruvchilar yangilandi va stek ma'lumotlarining ustiga yozildi. Natijada, stekdan noto'g'ri narsa olib tashlandi (odatda egri qaytish manzillari) va dastur ishdan chiqdi. Aytgancha, bu variant ancha zararsiz, chunki... bu holda jamb darhol ko'rinadi va u qancha vaqt o'tganini Xudo biladi.

Bundan tashqari, bu xato paydo bo'lishi va yo'qolishi mumkin. Dastur qanday ishlashiga va stekni qanchalik chuqur yuklashiga bog'liq. Biroq, bunday bummer C da yozganingizda tez-tez uchraydi, bu erda siz stek bilan qanchalik faol ishlayotganini ko'ra olmaysiz. ASMA da hamma narsa shaffofroq. Va bu erda bu ochiqchasiga egri algoritm tufayli paydo bo'lishi mumkin.

Assemblerlar ko'pincha boshqa stek xatolariga duch kelishadi. Avvalo, unutuvchanlik. Men biror narsa qo'ydim va uni chiqarishni unutibman. Agar muammo pastki dasturda yoki uzilishda bo'lsa, unda qaytish manzili buziladi (bu haqda birozdan keyin), stek yirtilib ketadi va dastur bir zumda ishdan chiqadi. Yoki e'tiborsizlik - men ma'lumotlarni bir tartibda saqladim va boshqa tartibda oldim. Voy, registrlarning mazmuni almashtirildi.

Bunday xatolarga yo'l qo'ymaslik uchun, birinchi navbatda, stekni kuzatish, ikkinchidan, o'zgaruvchilarni xotirada joylashtirishni to'g'ri rejalashtirish kerak. Eng muhim sohalar va o'zgaruvchilarni (masalan, davlat mashinalari yoki dastur mantiqiy bayroqlari) stekning yuqori qismidan uzoqroqda, xotira boshiga yaqinroq tuting.

Ba'zi odamlar stekni olib, uni operativ xotiraning eng oxiriga emas, balki yaqinroq joyga qo'yib, uning orqasida muhim ma'lumotlar uchun cho'ntak qoldirishlari mumkin deb o'ylashadi. Haqiqatan ham yaxshi fikr emas. Gap shundaki, stekni PUSH buyrug'i yordamida ham pastga, ham POP buyruqlari yordamida yuqoriga surish mumkin. Ikkinchisi, bu kamroq sodir bo'lsa ham, chunki ... Bu og'ir algoritmdan ko'ra egri qo'llarning gunohi, lekin bu ham sodir bo'ladi.
Lekin asosiysi, stekning o'zi juda muhim tuzilmadir. Subprogrammalar va funktsiyalarning butun mexanizmi unga tayanadi. Shunday qilib, stekning ishdan chiqishi har qanday holatda favqulodda holat hisoblanadi.

Stack buzilishlari
Mening sevimli mavzuim. =)))))) Stack ko'rsatgichining o'zi PUSH va POP buyruqlari paytida hisoblanganiga qaramay, hech kim bizni SP dan tanlab olishimizga va uning qiymatlaridan yotgan ma'lumotlarning manzilini qo'lda hisoblashga to'sqinlik qilmayapti. to'plam. Yoki stek ma'lumotlarini biz xohlagancha tuzating.
Nima uchun? Xo'sh, agar siz miyangizni charchatsangiz va qutidan tashqarida o'ylashni boshlasangiz, juda ko'p ilovalarni topishingiz mumkin :))))

Bundan tashqari, parametrlar x86 arxitekturasida klassik C va Paskal tillarida stek orqali uzatiladi va mahalliy o'zgaruvchilar ishlaydi. Bular. Funktsiyani chaqirishdan oldin avval barcha o'zgaruvchilar stekga suriladi, so'ngra funktsiya chaqirilgandan so'ng kelajakdagi mahalliy o'zgaruvchilar baytlari stekga suriladi.

Keyin, SP dan mos yozuvlar nuqtasi sifatida foydalanib, biz ushbu o'zgaruvchilarga o'zimiz xohlagancha munosabatda bo'lishimiz mumkin. Va POP buyrug'i bilan stek bo'shatilganda, ular yo'q qilinadi va xotirani bo'shatadi.

AVR-da hamma narsa biroz boshqacha (xotiraning kichik miqdori tufayli, bu erda siz stekga kirish imkoni yo'q, lekin juda ko'p RON mavjud), ammo siz ushbu mexanizmdan foydalanishga harakat qilishingiz mumkin.

To'g'ri, bu allaqachon neyroxirurgiyaga o'xshaydi. Men ozgina xato qildim va bemor o'ldi.

Stack va operativ xotira tufayli siz ikkita yoki uchta registr bilan ularning etishmasligi haqida ko'p e'tibor bermasdan turib olishingiz mumkin.

Flash xotira

EEPROM xotirasi kichik, atigi bir necha bayt va ba'zida uni hisoblash uchun vaqtni behuda sarflamaslik uchun ko'p ma'lumotlarni saqlashingiz kerak, masalan, begonalarga xabar yoki sinuslar jadvali. Siz hech qachon xotirada nima saqlanishi kerakligini oldindan bilmaysiz. Shunday qilib, ma'lumotlar dastur xotirasida, kontroller bortida bo'lgan bir xil kilobayt fleshda saqlanishi mumkin.

Biz buni yozamiz, lekin qanday qilib olishimiz mumkin? Buning uchun birinchi navbatda u erga biror narsa qo'yish kerak.
Shuning uchun, dasturning oxirida, .CSEG segmentida, masalan, ma'lumotlar, yorliq qo'shing va undan keyin, .db operatoridan foydalanib, ma'lumotlaringizni kiriting.

JB operatori har bir konstanta uchun baytdan foydalanishimizni bildiradi. Ikki baytli DW konstantalarini (shuningdek, DD va DQ) belgilovchi operatorlar ham mavjud.

1 ma'lumotlar: .db 12,34,45,23

ma'lumotlar: .db 12,34,45,23

Endi ma'lumotlar yorlig'i massivning birinchi bayti manziliga ishora qiladi, qolgan baytlar ofset bo'yicha joylashgan, shunchaki manzilga bitta qo'shiladi.

Bir nozik jihat shundaki, kompilyator belgi manzilini almashtiradi va uni dastur hisoblagichining o'tish manzili deb hisoblaydi. Va u, esingizda bo'lsa, ikki baytli so'zlarga murojaat qiladi - axir, buyruq uzunligi 2 yoki 4 bayt bo'lishi mumkin.

Va bizning ma'lumotlarimiz bayt-bayt bo'lib, unga kirishda kontroller ham bayt-baytga murojaat qiladi. So'zlardagi manzil baytlardagi manzildan ikki barobar kichikdir va bu manzilni ikkiga ko'paytirishda hisobga olinishi kerak.

Dastur xotirasidan ma'lumotlarni yuklash uchun Load Program Memory guruhi buyrug'idan foydalaning

Masalan, LPM Rn, Z

U Rn registriga Z registr jufti ko'rsatgan katakchadagi raqamni kiritadi. Sizga shuni eslatib o'tamanki, Z ikkita registr, R30 (ZL) va R31 (ZH). Manzilning past bayti R30 ga, yuqori bayti esa R31 ga kiritiladi.

Kodda bu shunday ko'rinadi:

LDI ZL, past (ma'lumotlar*2); Biz manzilning past baytini registr juftligiga kiritamiz Z LDI ZH,high(ma'lumotlar*2) ; Biz manzilning yuqori baytini Z registr juftligiga kiritamiz; ikkiga ko'paytirish manzilning ko'rsatilganligi bilan bog'liq; ikki baytli so'zlarda, lekin bizga baytlarda kerak. ; Shuning uchun biz ikkiga ko'paytiramiz; Manzilni yuklaganingizdan so'ng siz raqamni LPM R16, Z xotirasidan yuklashingiz mumkin; R16 registrida bu buyruqdan keyin 12, raqami bo'ladi; dastur xotirasidan olingan. ; dastur oxirida bir joyda, lekin .CSEG ma'lumotlar segmentida: .db 12,34,45,23

Endi biz mikrokontrollerlarning ba'zi imkoniyatlari va funktsiyalari bilan tanish bo'lganimizdan so'ng, tabiiy ravishda mantiqiy savol tug'iladi: mikrokontrollerlarni dasturlash uchun nima kerak? Qanday dasturlar va qurilmalar kerak va ularni qayerdan olsam bo'ladi?


Mikrokontroller muammolarni echishi va muayyan funktsiyalarni bajarishi uchun uni dasturlash kerak, ya'ni unga dastur yoki dastur kodi yozilishi kerak.

Dasturning tuzilishi va yozish tartibi

Avvalo, biron bir dasturni, aniqrog'i dastur kodini yozishni boshlashdan oldin, mikrokontroller qanday funktsiyalarni bajarishini aniq tushunishingiz kerak. Shuning uchun, avvalo, dasturning yakuniy maqsadini aniqlashingiz kerak. U aniqlangan va to'liq tushunilgandan so'ng, dastur uchun algoritm tuziladi. Algoritm - bu buyruqlarni bajarish ketma-ketligi. Algoritmlardan foydalanish kod yozish jarayonini yanada aniqroq tuzish imkonini beradi va murakkab dasturlarni yozishda ko'pincha ularni ishlab chiqish va tuzatishga sarflangan vaqtni qisqartirishga imkon beradi.

Algoritmni kompilyatsiya qilishdan keyingi qadam to'g'ridan-to'g'ri dastur kodini yozishdir. Mikrokontrollerlar uchun dasturlar tilda yozilgan Si yoki assembler . Faqat Assembly dasturlash tilidan ko'ra ko'proq ko'rsatmalar to'plamidir va past darajadagi tildir.


Biz dasturlarni yuqori darajadagi C tilida yozamiz. Assambleyadagi shunga o'xshash dasturlarga nisbatan C tilidagi dasturlar ancha tez yoziladi. Bundan tashqari, barcha murakkab dasturlar asosan C tilida yozilgan.

Bu erda biz Assambleya va C da dasturlar yozishning afzalliklari va kamchiliklarini solishtirmaymiz. Vaqt o'tishi bilan, MK dasturlash bo'yicha biroz tajribaga ega bo'lgach, siz o'zingiz uchun foydali xulosalar chiqarasiz.

Dastur kodining o'zi har qanday standart matn muharririda yozilishi mumkin, masalan, Notepad. Biroq, amalda ular quyida muhokama qilinadigan qulayroq muharrirlardan foydalanadilar.

Dasturni kompilyatsiya qilish

Biz yozgan C kodi mikrokontroller uchun hali tushunarli emas, chunki MK buyruqlarni faqat ikkilik (yoki o'n oltilik) tizimda tushunadi, bu nollar va birliklar to'plamidir. Shuning uchun C kodini nolga va birlarga aylantirish kerak. Buning uchun maxsus dastur ishlatiladi, chaqiriladi kompilyator, va jarayonning o'zi kodni o'zgartirish kompilyatsiya deb ataladi.

MK proshivkasini miltillash uchun qurilma chaqirildi dasturchi. Dasturchi turiga qarab, uning kirishi MAQOMOTI yoki USB portiga, chiqishi esa mikrokontrollerning ma'lum pinlariga ulanadi.


Dasturchilar va ishlab chiqish kengashlarining keng tanlovi mavjud, ammo biz eng oddiyidan mamnunmiz dasturchi, bu Xitoyda 3 dollardan oshmaydi.


Mikrokontroller yonib-o'chgandan so'ng, dastur disk raskadrovka qilinadi va haqiqiy qurilmada yoki ular aytganidek, apparatda sinovdan o'tkaziladi.

Endi mikrokontrollerlarni dasturlash bosqichlarini umumlashtiramiz.


Oddiy dasturlarni yozishda siz ikkinchi nuqtasiz, ya'ni qog'ozga algoritm tuzmasdan qilishingiz mumkin, uni boshingizda saqlash kifoya.

Shuni ta'kidlash kerakki, dasturni disk raskadrovka va sinovdan o'tkazish MK proshivkasini miltillashdan oldin ham amalga oshiriladi.

Kerakli dasturlar to'plami

MKni dasturlash uchun juda ko'p foydali va qulay dasturlar mavjud. Ular ham pullik, ham bepul. Ular orasida uchta asosiy bor:

1) Atmel studiyasi

2) CodeVisionAVR

3) WinAVR

Bu dasturlarning barchasi tegishli IDEI integratsiyalashgan D rivojlanish E nvironment - integratsiyalashgan rivojlanish muhiti. Siz ularga kod yozishingiz, kompilyatsiya qilishingiz va disk raskadrovka qilishingiz mumkin.

Code Vision AVR-ga e'tibor berishingiz kerak. Ushbu IDE kod yozishni oson va tezroq qiladi. Biroq, dastur pullik.

Dasturlashning dastlabki bosqichida barcha dasturlarni hech qanday soddalashtirmasdan, qo'lda yozish yaxshidir. Bu sizga kerakli ko'nikmalarni tezda egallashga yordam beradi va kelajakda siz o'zingizning ehtiyojlaringizga mos ravishda boshqa birov tomonidan yozilgan kodlarni yaxshi tushunishingiz va tahrirlashingiz mumkin. Shuning uchun men Atmel Studio dan foydalanishni tavsiya qilaman. Birinchidan, u mutlaqo bepul va doimiy ravishda yangilanadi, ikkinchidan, biz dasturlashni o'rganadigan mikrokontrollerlarni ishlab chiqaruvchi kompaniya tomonidan ishlab chiqilgan.

Mikrodastur va dasturlarni tuzatish

Biz mikrokontrollerlarni qo'shimcha dastur yordamida miltillaymiz.

Agar mikrokontroller mavjud bo'lmasa, uning ishlashi dastur yordamida taqlid qilinishi mumkin. Agar sizda mikrokontroller bo'lsa ham, dasturni tuzatish jarayonini sezilarli darajada osonlashtiradi, shuning uchun uni tez-tez qayta o'rnatishingiz shart emas, chunki har qanday mikrokontrollerda chekli miqdordagi qayta yozishlar mavjud, garchi bu raqam juda katta bo'lsa ham.

MKni miltillash va disk raskadrovka qilishda uni non taxtasiga joylashtirish qulay, ammo bu umuman kerak emas. Shuning uchun, ko'proq qulaylik uchun non taxtasi ham foydalidir. Non taxtalarining katta tanlovi mavjud, ammo men sizga iloji boricha ko'proq teshikka ega bo'lishni tavsiya qilaman. Etti segmentli displeylarni ulashni boshlaganimizdan so'ng, siz kattaroq panellarning afzalliklarini qadrlay boshlaysiz.

Biz uchun foydali bo'lgan yana bir muhim element - bu MK uchun texnik hujjatlar tafsilotli ro'yxat. Umuman olganda, siz yuklab olishingiz kerak ATmega8 mikrokontrolleri uchun ma'lumotlar jadvali.

Kiselev Roman, 2007 yil may Maqola 2014 yil 26-mayda yangilangan

Xo'sh, mikrokontroller (keyingi o'rinlarda MK deb yuritiladi) nima? Bu, nisbatan aytganda, bitta integral mikrosxemada joylashgan kichik kompyuter. Unda protsessor (arifmetik mantiq birligi yoki ALU), flesh-xotira, EEPROM xotirasi, ko'plab registrlar, kiritish-chiqarish portlari, shuningdek, taymerlar, hisoblagichlar, komparatorlar, USARTlar va boshqalar kabi qo'shimcha qo'ng'iroq va hushtak mavjud. Quvvat yoqilgandan keyin. , mikrokontroller ishga tushadi va flesh xotirasida saqlangan dasturni bajarishni boshlaydi. Shu bilan birga, u I/U portlari orqali turli xil tashqi qurilmalarni boshqarishi mumkin.

Bu qanday ma'nono bildiradi? Bu shuni anglatadiki, MKda siz ma'lum funktsiyalarni bajaradigan har qanday mantiqiy sxemani amalga oshirishingiz mumkin. Bu shuni anglatadiki, MK mikrosxema bo'lib, uning ichki tarkibini biz o'zimiz yaratamiz. Bu bir nechta mutlaqo bir xil MKlarni sotib olib, ularga mutlaqo boshqa sxemalar va qurilmalarni yig'ish imkonini beradi. Agar siz elektron qurilmaning ishlashiga biron bir o'zgartirish kiritmoqchi bo'lsangiz, siz lehim temiridan foydalanishingiz shart emas, faqat MKni qayta dasturlashingiz kerak bo'ladi. Bunday holda, agar siz AVR dan foydalanayotgan bo'lsangiz, uni qurilmangizdan olib tashlashingiz shart emas, chunki bu MKlar elektron dasturlashni qo'llab-quvvatlaydi. Shunday qilib, mikrokontrollerlar dasturlash va elektronika o'rtasidagi bo'shliqni ko'paytiradilar.

AVR-lar 8-bitli mikrokontrollerlardir, ya'ni ularning ALU bir takt siklida faqat 8-bitli raqamlar bilan oddiy operatsiyalarni bajarishi mumkin. Endi qaysi MK dan foydalanishimiz haqida gapirish vaqti keldi. Men ATMega16 MK bilan ishlayapman. Bu juda keng tarqalgan va deyarli har qanday radio qismlari do'konida taxminan 100 rublga sotib olinishi mumkin. Agar siz uni topa olmasangiz, MEGA seriyasining boshqa MK-larini sotib olishingiz mumkin, ammo bu holda siz buning uchun hujjatlarni izlashingiz kerak bo'ladi, chunki turli xil MKlarning bir xil "oyoqlari" turli funktsiyalarni bajarishi mumkin va, ulangandan so'ng, agar barcha xulosalar to'g'ri bo'lsa, siz ishlaydigan qurilma yoki shunchaki hidli tutun bulutini olishingiz mumkin. ATMega16 ni sotib olayotganda, uning katta 40 pinli DIP to'plamida kelishiga ishonch hosil qiling, shuningdek, uni kiritish mumkin bo'lgan rozetkani sotib oling. U bilan ishlash uchun sizga qo'shimcha qurilmalar kerak bo'ladi: LEDlar, tugmalar, ulagichlar va boshqalar.

ATMega16 juda ko'p turli xil funktsiyalarga ega. Mana uning ba'zi xususiyatlari:

  • Maksimal soat chastotasi - 16 MGts (ATMega16L uchun 8 MGts)
  • Ko'pgina buyruqlar bir soat siklida bajariladi
  • 32 ta 8 bitli ishchi registrlar
  • 4 ta to'liq 8 bitli I/U portlari
  • ikkita 8-bitli taymer/hisoblagich va bitta 16-bit
  • 10-bitli analog-raqamli konvertor (ADC)
  • 1 MGts chastotada ichki soat generatori
  • analog taqqoslagich
  • interfeyslari SPI, I2C, TWI, RS-232, JTAG
  • sxemada dasturlash va o'z-o'zini dasturlash
  • impuls kengligi modulyatsiyasi (PWM) moduli

Ushbu qurilmaning to'liq tavsiflari, shuningdek ulardan foydalanish bo'yicha ko'rsatmalar ushbu MK uchun ma'lumotnomada (ma'lumotlar varaqasi) mavjud. To'g'ri, u ingliz tilida. Agar siz ingliz tilini bilsangiz, ushbu ma'lumotlar jadvalini yuklab olishni unutmang, unda juda ko'p foydali ma'lumotlar mavjud.

Keling, nihoyat biznesga tushamiz. Men mikrokontroller uchun maxsus ishlab chiqish va disk raskadrovka taxtasini yasashni tavsiya qilaman, unda siz mikrokontroller bilan har qanday elektr zanjirini lehimsiz (yoki deyarli usiz) yig'ishingiz mumkin. Bunday doskadan foydalanish MK bilan ishlashni sezilarli darajada osonlashtiradi va uni dasturlashni o'rganish jarayonini tezlashtiradi. Bu shunday ko'rinadi:

Buning uchun sizga nima kerak bo'ladi?

Birinchidan, sizga taxtaning o'zi kerak bo'ladi. Men radio qismlari do'konida 115 rublga tayyor sotib oldim. Keyin unga barcha kerakli qismlarni lehimladim. Natija nihoyatda qulay narsa bo'lib, siz kabellarni ulash va mikrosxema va ko'rsatkichlarni o'rnatish orqali bir necha daqiqada har qanday elektr zanjirini yig'ishingiz mumkin.

O'chirish elementlarini ulash uchun uchlarida ulagichlari bo'lgan kabellardan foydalanish juda qulay. Ushbu ulagichlar MK ning har bir porti yonida joylashgan "oyoqlarga" o'rnatiladi. Mikrokontroller rozetkaga o'rnatilishi va taxtaga lehimlanmagan bo'lishi kerak, aks holda uni tasodifan yoqib yuborsangiz, uni olib tashlash juda qiyin bo'ladi. Quyida ATMEGA16 MK ning pinouti keltirilgan:

Keling, qaysi oyoqlarga qiziqishimizni tushuntirib beraylik.

  • VCC - quvvat bu erda (4,5 - 5,5 V) stabillashtirilgan manbadan ta'minlanadi
  • GND - tuproq
  • RESET - qayta o'rnatish (past kuchlanish darajasida)
  • XTAL1, XTAL2 - bu erda kvarts rezonatori ulangan
  • PA, PB, PC, PD – kirish/chiqish portlari (mos ravishda A, B, C va D).

7-11 V doimiy oqim ishlab chiqaradigan har qanday narsa quvvat manbai sifatida ishlatilishi mumkin. MK ning barqaror ishlashi uchun barqarorlashtirilgan quvvat manbai talab qilinadi. Stabilizator sifatida siz 7805 seriyali mikrosxemalardan foydalanishingiz mumkin.Bu chiziqli integral stabilizatorlar bo'lib, ularning kirish qismi 7-11 V to'g'ridan-to'g'ri barqaror bo'lmagan oqim bilan ta'minlanadi va 5 V barqarorlashtirilgan tok. 7805 dan oldin va keyin siz filtr kondansatkichlarini o'rnatishingiz kerak (past chastotali shovqinlarni filtrlash uchun elektrolitik va yuqori chastotali uchun keramika). Stabilizatorni topa olmasangiz, u holda quvvat manbai sifatida 4,5 V akkumulyatordan foydalanishingiz mumkin.MK to'g'ridan-to'g'ri undan quvvatlanishi kerak.

Quyida MK ulanishining diagrammasi keltirilgan:

Keling, bu erda nima borligini aniqlaylik.

BQ1 - MK ning ish chastotasini o'rnatadigan kvarts rezonatori. Siz 16 MGts gacha bo'lgan istalgan chastotani o'rnatishingiz mumkin, ammo biz kelajakda MAQOMOTI porti bilan ishlashni rejalashtirganimiz uchun men quyidagi chastotalar uchun rezonatorlardan foydalanishni tavsiya qilaman: 14,7456 MGts, 11,0592 MGts, 7,3725 MGts, 3,6864 MGts yoki 1,8432 MGts (keyinchalik). sababi aniq bo'ladi). Men 11,0592 MGts dan foydalandim. Ma'lumki, chastota qanchalik baland bo'lsa, qurilma tezligi shunchalik yuqori bo'ladi.

R1 - RESET kirishida 5 V kuchlanishni ushlab turadigan tortishish qarshiligi. Ushbu kirishdagi past kuchlanish darajasi qayta o'rnatishni ko'rsatadi. Qayta tiklashdan so'ng, MK ishga tushadi (10 - 15 ms) va dasturni yana bajarishni boshlaydi. Bu yuqori empedansli kirish bo'lgani uchun siz uni "havoda osilgan holda" qoldira olmaysiz - undagi kichik pikap MKning kutilmagan tarzda qayta tiklanishiga olib keladi. R1 aynan shu narsa uchun. Ishonchliligi uchun men C6 kondensatorini o'rnatishni tavsiya qilaman (20 mkF dan oshmasligi kerak).

SB1 - qayta o'rnatish tugmasi.

Kvars rezonatori va filtr kondansatörü C3 MK ga iloji boricha yaqinroq (5-7 sm dan oshmasligi kerak) joylashgan bo'lishi kerak, chunki aks holda simlarda shovqin paydo bo'lishi mumkin, bu esa MKning noto'g'ri ishlashiga olib keladi.

Diagrammadagi ko'k to'rtburchak dasturchining o'zini ko'rsatadi. Uni sim shaklida qilish qulay, uning bir uchi LPT portiga, ikkinchisi esa MK yonidagi ma'lum bir ulagichga ulangan. Tel juda uzun bo'lmasligi kerak. Agar ushbu kabel bilan bog'liq muammolar yuzaga kelsa (odatda bunday bo'lmaydi, lekin hamma narsa sodir bo'lishi mumkin), siz Altera ByteBlaster adapterini lehimlashingiz kerak bo'ladi. Buni qanday qilish AVReal dasturchisi tavsifida yozilgan.

Endi biz apparat bilan shug'ullanganimizdan so'ng, dasturiy ta'minotga o'tish vaqti keldi.

AVR dasturlash uchun bir nechta ishlab chiqish muhitlari mavjud. Birinchidan, bu AVR Studio - Atmelning rasmiy dasturlash tizimi. Assembler, C va C++ da yozilgan disk raskadrovka dasturlarini assemblerda yozish imkonini beradi. IAR - bu C, C++ va assembly tillarida tijorat dasturlash tizimi. WinAVR ochiq kodli kompilyatordir. AtmanAVR bu AVR uchun dasturlash tizimi boʻlib, interfeysi deyarli Visual C++ 6 bilan bir xil. AtmanAVR shuningdek, dasturlarni disk raskadrovka qilish imkonini beradi va kod yozishni osonlashtiradigan koʻplab yordamchi funksiyalarni oʻz ichiga oladi. Ushbu dasturlash tizimi tijoratdir, lekin litsenziyaga ko'ra, siz undan bir oy davomida bepul foydalanishingiz mumkin.

Men eng shaffof rivojlanish muhiti sifatida IAR bilan ishlashni boshlashni taklif qilaman. IARda loyiha to'liq qo'lda yaratiladi, shuning uchun siz bir nechta loyihalarni tugatgandan so'ng, har bir kod satri nimani anglatishini va uni o'zgartirsangiz nima bo'lishini aniq bilib olasiz. AtmanAVR bilan ishlashda siz yoki oldindan yaratilgan shablonni ishlatishingiz kerak bo'ladi, bu juda og'ir va tajribasiz odam uchun tushunish qiyin yoki loyihani noldan yig'ishda sarlavha fayllari bilan juda ko'p muammolarga duch kelasiz. IAR bilan shug'ullangandan so'ng, biz boshqa kompilyatorlarni ko'rib chiqamiz.

Shunday qilib, birinchi navbatda, bir oz IAR oling. Bu juda keng tarqalgan va uni topish muammo bo'lmasligi kerak. IAR 3.20 ni biror joydan yuklab olgandan so'ng, kompilyator/ish muhitini o'rnating va uni ishga tushiring. Shundan so'ng siz ishlashni boshlashingiz mumkin.

IAR-ni ishga tushirgandan so'ng, tanlang fayl/yangi/ish maydoni, loyihamizga yo'lni tanlang va unga papka yarating va unga nom bering, masalan, "Prog1". Endi loyiha yaratamiz: Loyiha / Yangi loyiha yaratish… Keling, uni “Prog1” deb ham ataymiz. Loyiha daraxtidagi loyiha sarlavhasini o'ng tugmasini bosing va "Options" ni tanlang.

Bu erda biz kompilyatorni ma'lum bir MK uchun sozlaymiz. Birinchidan, "Maqsad" yorlig'ida ATMega16 protsessor turini tanlashingiz kerak, "Kutubxona konfiguratsiyasi" yorlig'ida "Kirish/chiqarishni o'z ichiga olgan fayllarda bit ta'riflarini yoqish" katagiga belgi qo'ying (shunda dastur kodida turli MK registrlarining bit nomlaridan foydalanishingiz mumkin). ) va u erda C kutubxonasi turini tanlang /EU++. ICCAVR toifasida Til yorlig'ida "Ko'p baytli qo'llab-quvvatlashni yoqish" katagiga belgi qo'yishingiz va "Optimallashtirish" yorlig'ida optimallashtirishni o'chirib qo'yishingiz kerak (aks holda bu bizning birinchi dasturimizni buzadi).

Keyin XLINK toifasini tanlang. Bu erda siz kompilyatsiya qilingan fayl formatini aniqlashingiz kerak. Sarlavhada ta'riflanganidek, biz disk raskadrovka rejimi uchun parametrlarni o'rnatayotganimiz sababli, chiqish sifatida disk raskadrovka faylini olishimiz kerak. Keyinchalik biz uni AVR Studio-da ochamiz. Buning uchun siz kengaytmani tanlashingiz kerak.cof va fayl turi ubrof 7.

Endi OK tugmasini bosing, so'ngra Debug-ni Release-ga o'zgartiring.

XLINK dan tashqari barcha parametrlar bir xil bo'lgan parametrlarga qayta o'ting. XLINK-da kengaytmani .hex ga, fayl formatini esa intel-standart ga o'zgartiring.

Ana xolos. Endi siz birinchi dasturingizni yozishni boshlashingiz mumkin. Yangi Manba/matn yarating va unga quyidagi kodni kiriting:

#o'z ichiga oladi"iom16.h" qisqa imzosiz int i; bekor asosiy( bekor) (DDRB = 255; PORTB = 0; esa(1) { agar(PORTB == 255) PORTB = 0; boshqa PORTB++; uchun(i=0; i

"iom16.h" fayli papkada joylashgan (C: \ Program Files) \ IAR Systems \ Embedded Workbench 3.2 \ avr \ inc. Agar siz boshqa MK dan foydalanayotgan bo'lsangiz, masalan, ATMega64, keyin "iom64.h" faylini tanlang. Ushbu sarlavhali fayllar MK haqidagi ma'lumotlarni saqlaydi: registrlar nomlari, registrlardagi bitlar va uzilishlar nomlari. A, B, C yoki D portlarining har bir alohida pinlari kirish yoki chiqish vazifasini bajarishi mumkin. Bu Data Direction Register (DDR) tomonidan aniqlanadi. 1 oyoqni chiqishga, 0 esa kirishga aylantiradi. Shunday qilib, masalan, DDRA = 13 ni o'rnatib, biz "oyoqlarni" PB0, PB2, PB3 chiqishlarini, qolganlarini - kirishlarni qilamiz, chunki Ikkilik tizimda 13 - 00001101.

PORTB - bu port pinlarining holatini aniqlaydigan registr. U erda 0 ni yozib, biz barcha chiqishlarda kuchlanishni 0 V ga o'rnatdik. Keyin cheksiz pastadir mavjud. MKni dasturlashda ular har doim cheksiz tsiklni hosil qiladilar, unda MK qayta tiklanmaguncha yoki uzilish sodir bo'lguncha ba'zi harakatlarni bajaradi. Ushbu tsiklda ular MK oxirgi narsa sifatida bajaradigan "fon kodi" ni yozadilar. Bu, masalan, displeyda ma'lumotlarni ko'rsatish bo'lishi mumkin. Bizning holatda, PORTB registrining mazmuni to'la bo'lgunga qadar oshiriladi. Shundan so'ng hamma narsa qaytadan boshlanadi. Nihoyat, loop uchun o'n ming tsikl. B portining holatini almashtirishda ko'rinadigan kechikishni shakllantirish uchun kerak.



Endi biz ushbu faylni loyiha papkasida Prog1.c sifatida saqlaymiz, iom16.h faylini loyiha papkasiga nusxalaymiz, Project/Add Files ni tanlaymiz va "iom16.h" va "Prog1.c" ni qo'shamiz. Release-ni tanlang, F7 tugmasini bosing, dastur tuziladi va xabar paydo bo'ladi:


Xatolarning umumiy soni: 0
Ogohlantirishlarning umumiy soni: 0

Mana mening dasturchimning surati:

AVReal dasturchini yuklab oling. Uni (AVReal32.exe) Prog1.hex fayli joylashgan Release/exe papkasiga nusxalang. Biz MK ga quvvat beramiz, dasturlash kabelini ulaymiz. Far menejerini oching (MKni miltillash eng qulay), ushbu papkaga o'ting, Ctrl + O tugmalarini bosing. Bizda butunlay yangi MK borligi sababli, biz narsalar

avreal32.exe +MEGA16 -o11.0592MHZ -p1 -fblev=0,jtagen=1,cksel=F,sut=1 –w

Agar siz 11059200 Gts dan foydalanmasangiz, to'g'ri chastotani kiritishni unutmang! Shu bilan birga, deb atalmish sigortalar - uning ishlashini nazorat qiluvchi registrlar (ichki generatordan foydalanish, Jtag va boshqalar). Shundan so'ng, u birinchi dasturni qabul qilishga tayyor. Dasturchiga parametr sifatida foydalanilgan LPT porti, chastotasi, fayl nomi va boshqalar beriladi (ularning barchasi AVReal tavsifida keltirilgan). Biz qo'ng'iroq qilamiz:

Avreal32.exe +Mega16 -o11.0592MHz -p1 -e -w -az -% Prog1.hex

Agar ulanish to'g'ri bo'lsa, dasturchi muvaffaqiyatli dastur haqida xabar beradi. Bu birinchi marta (dasturni birinchi marta chaqirganingizda) ishlashiga kafolat yo'q. Men o'zim ham ba'zan ikkinchi marta dasturlashaman. Ehtimol, LPT porti noto'g'ri yoki kabelda shovqin bor. Muammo yuzaga kelsa, kabelingizni diqqat bilan tekshiring. O'z tajribamdan bilamanki, nosozliklarning 60 foizi to'g'ri joyda aloqa etishmasligi, 20 foizi keraksiz narsaning mavjudligi va yana 15 foizi noto'g'ri narsani noto'g'ri narsaga noto'g'ri lehimlash bilan bog'liq. Agar barchasi muvaffaqiyatsiz bo'lsa, dasturchining tavsifini o'qing va Byte Blasterni yaratishga harakat qiling.

Keling, hamma narsa siz uchun ishlaydi deb faraz qilaylik. Agar siz hozir sakkizta LEDni MK ning B portiga ulasangiz (buni MK o'chirilgan holda bajaring va LEDlar bilan ketma-ket 300-400 Ohm rezistorlarni kiritish tavsiya etiladi) va quvvat sarflasangiz, kichik mo''jiza ro'y beradi - a " to'lqin" ular orqali o'tadi!

© Kiselev Roman
2007 yil may

2015 yil dekabr

1. Taklif etilayotgan usulning afzalliklari

Mikrokontrollerlar (MCU) asosidagi qurilma sxemalari odatda ikkita birlashtirish qiyin bo'lgan sifatlarning kombinatsiyasi bilan ajralib turadi: maksimal soddalik va yuqori funksionallik. Bundan tashqari, funktsiyani kelajakda sxemaga hech qanday o'zgartirish kiritmasdan o'zgartirish va kengaytirish mumkin - faqat dasturni almashtirish orqali (miltillovchi). Bu xususiyatlar zamonaviy mikrokontrollerlar yaratuvchilari elektron qurilmani ishlab chiquvchiga kerak bo'lishi mumkin bo'lgan hamma narsani - hech bo'lmaganda iloji boricha bitta chipga joylashtirishga harakat qilishlari bilan izohlanadi. Natijada, sxemalar va o'rnatishdan dasturiy ta'minotga e'tibor o'zgardi. MK dan foydalanish bilan endi kontaktlarning zanglashiga olib boradigan qismlari bilan "yuklash" kerakligi kamroq va komponentlar o'rtasida kamroq ulanishlar mavjud. Bu, albatta, tajribali va yangi elektronika muhandislari tomonidan takrorlash uchun sxemani yanada jozibador qiladi. Lekin, odatdagidek, hamma narsa uchun to'lash kerak. Bu ham qiyinchiliklardan xoli emas edi. Agar siz yangi MK sotib olsangiz, uni xizmat ko'rsatadigan qismlardan to'g'ri yig'ilgan sxemaga o'rnating va quvvat sarflang, keyin hech narsa ishlamaydi - qurilma ishlamaydi. Mikrokontrollerga dastur kerak.

Bu bilan ham hamma narsa oddiy ko'rinadi - Internetda siz bepul dasturiy ta'minot bilan ko'plab sxemalarni topishingiz mumkin. Ammo bu erda bitta narsa bor: mikrodastur qandaydir tarzda mikrokontrollerga "yuklangan" bo'lishi kerak. Hech qachon bunday qilmagan odam uchun bunday vazifa ko'pincha muammo va asosiy jirkanch omil bo'lib, ko'pincha ularni MK dan foydalanishning zavqlaridan voz kechishga va "bo'sh" va qattiq mantiqqa asoslangan sxemalarni izlashga majbur qiladi. Ammo hamma narsa birinchi qarashda ko'rinadigan darajada murakkab emas.

Internetdagi nashrlarni tahlil qilgandan so'ng, bu muammo ko'pincha ikkita usuldan birida hal qilinishini ko'rishingiz mumkin: tayyor dasturchi sotib olish yoki uy qurilishi. Shu bilan birga, uy qurilishi dasturchilarining nashr etilgan sxemalari juda tez-tez asossiz darajada murakkab - haqiqatan ham zarur bo'lganidan ancha murakkab. Albatta, agar siz MK-ni har kuni miltillashni rejalashtirmoqchi bo'lsangiz, "salqin" dasturchiga ega bo'lish yaxshiroqdir. Ammo agar bunday protseduraga ehtiyoj kamdan-kam hollarda, vaqti-vaqti bilan paydo bo'lsa, unda siz umuman dasturchisiz qilishingiz mumkin. Yo'q, albatta, biz buni fikrning kuchi bilan qilishni o'rganish haqida gapirmayapmiz. Bu shuni anglatadiki, dasturchi ma'lumotni dasturlash rejimida yozish va o'qishda mikrokontroller bilan qanday o'zaro ta'sir qilishini tushunib, biz mavjud vositalarni yanada kengroq maqsadda bajarishimiz mumkin. Ushbu vositalar dasturchining dasturiy va apparat qismlarini almashtirishi kerak. Uskuna MK mikrosxemasiga jismoniy ulanishni, uning kirishlariga mantiqiy darajalarni qo'llash va uning chiqishlaridan ma'lumotlarni o'qish qobiliyatini ta'minlashi kerak. Dasturiy ta'minot qismi barcha kerakli jarayonlarni boshqaruvchi algoritmning ishlashini ta'minlashi kerak. Shuni ham ta'kidlaymizki, MK-da ma'lumotlarni yozib olish sifati dasturchining qanchalik "salqin" ekanligiga bog'liq emas. "Yaxshiroq yozilgan" yoki "yomonroq" degan narsa yo'q. Faqat ikkita variant mavjud: "ro'yxatdan o'tgan" va "ro'yxatdan o'tmagan". Bu kristall ichidagi yozish jarayoni bevosita MKning o'zi tomonidan boshqarilishi bilan izohlanadi. Siz uni faqat yuqori sifatli quvvat bilan ta'minlashingiz kerak (hech qanday shovqin yoki dalgalanma) va interfeysni to'g'ri tashkil qilish. Agar test o'qish natijalari hech qanday xatoliklarni aniqlamasa, unda hamma narsa tartibda - siz boshqaruvchidan maqsadli maqsadlarda foydalanishingiz mumkin.

MK-ga dasturchisiz dastur yozish uchun bizga USB-RS232TTL port konvertori va shuningdek, kerak. USB-RS232TTL konvertori sizga MAQOMOTI portini yaratish uchun USB portidan foydalanishga imkon beradi, bu "haqiqiy" portdan farq qiladi, chunki uning kirish va chiqishlarida TTL mantiqiy darajalari, ya'ni kuchlanish 0 dan 5 voltgacha ( ko'proq ma'lumotni "" maqolasida o'qishingiz mumkin). Qanday bo'lmasin, bunday konvertor sizning "uyingizda" bo'lishi foydalidir, shuning uchun sizda hali yo'q bo'lsa, uni sotib olishga arziydi. Mantiqiy darajalarga kelsak, bizning holatlarimizda TTL oddiy MAQOMOTI portiga nisbatan hatto afzallik hisoblanadi, chunki bunday portning kirish va chiqishlari 5 V kuchlanishli har qanday mikrokontrollerga, shu jumladan ATtiny va ATmega bilan bevosita ulanishi mumkin. Lekin oddiy MAQOMOTI portidan foydalanishga urinmang - ular -12 dan +12 V (yoki -15...+15V) gacha bo'lgan kuchlanishdan foydalanadilar. Bunday holda, mikrokontrollerga to'g'ridan-to'g'ri ulanish qabul qilinishi mumkin emas!!!

Dasturchi funktsiyalarini amalga oshiradigan Perpetuum M dasturi uchun skript yaratish g'oyasi Internetda MK mikrodasturlari uchun muayyan echimlarni taklif qiluvchi bir qator nashrlarni o'qib chiqqandan keyin paydo bo'ldi. Har bir holatda jiddiy kamchiliklar yoki ortiqcha qiyinchiliklar aniqlandi. Ko'pincha men mikrokontrollerni o'z ichiga olgan dasturchi sxemalariga duch keldim va shu bilan birga, juda jiddiy maslahatlar berildi: "... va bu dasturchi uchun mikrokontrollerni dasturlash uchun bizga kerak bo'ladi ... to'g'ri - boshqa dasturchi!" Keyinchalik, do'stingizga borish, pullik xizmatni qidirish va h.k. taklif qilindi. Ushbu maqsadlar uchun tarmoqda tarqatilgan dasturiy ta'minotning sifati ham ta'sirchan emas edi - ko'plab muammolar funksionallikda ham, foydalanuvchi interfeysining "bulutliligida" ham sezildi. Dasturdan qanday foydalanishni tushunish uchun ko'pincha ko'p vaqt talab etiladi - uni eng oddiy harakatlarni bajarish uchun ham o'rganish kerak. Boshqa dastur uzoq vaqt va g'ayrat bilan biror narsa qila oladi, lekin foydalanuvchi MKga hech narsa yozilmasligini faqat butun dasturiy ta'minot to'liq to'ldirilgandan va keyingi test o'qishdan keyin bilib oladi. Quyidagi muammo ham yuzaga keladi: foydalanuvchi o'zining MK-ni qo'llab-quvvatlanadigan kristallar ro'yxatidan tanlashga harakat qiladi, lekin u ro'yxatda yo'q. Bunday holda, siz dasturdan foydalana olmaysiz - etishmayotgan MKlar ro'yxatiga kiritish, qoida tariqasida, ta'minlanmaydi. Bunga qo'shimcha ravishda, dasturchi ko'p hollarda MK turini o'zi aniqlashi mumkinligini hisobga olsak, ro'yxatdan nazoratchini qo'lda tanlash g'alati ko'rinadi. Bularning barchasi mavjud mahsulotlarga loy tashlash uchun emas, balki ushbu maqolada tasvirlangan Perpetuum M dasturi uchun skript paydo bo'lishining sababini tushuntirish uchun aytilgan. Muammo haqiqatan ham mavjud va bu, birinchi navbatda, mikrokontrollerlar dunyosiga birinchi qadam qo'yish uchun har doim ham ushbu "devor" ni engib o'ta olmaydigan yangi boshlanuvchilarga tegishli. Taklif etilayotgan skript boshqa dasturlarda topilgan kamchiliklarni hisobga oladi. Algoritm ishlashining maksimal "shaffofligi" amalga oshirildi, o'rganishni talab qilmaydigan va chalkashmaslik va "noto'g'ri narsani bosish" uchun hech qanday imkoniyat qoldirmaydigan juda oddiy foydalanuvchi interfeysi. Agar kerakli MK qo'llab-quvvatlanadiganlar orasida bo'lmasa, siz MK ishlab chiqaruvchisi veb-saytidan yuklab olingan hujjatlardan kerakli ma'lumotlarni olib, uning tavsifini o'zingiz qo'shishingiz mumkin. Va, eng muhimi, skript o'rganish va o'zgartirish uchun ochiq. Har kim uni matn muharririda ochishi, o'z xohishiga ko'ra o'rganishi va tahrirlashi, mavjud funktsiyalarni o'z didiga ko'ra o'zgartirishi va etishmayotganlarini qo'shishi mumkin.

Ssenariyning birinchi versiyasi 2015 yil iyun oyida yaratilgan. Bu versiya faqat flesh-xotirani yozish/o‘qish, konfiguratsiya bitlarini o‘rnatish va kontroller turini avtomatik aniqlash funksiyalariga ega Atmel’ning ATtiny va ATmega seriyali mikrokontrollerlarini qo‘llab-quvvatlaydi.EEPROM yozish va o‘qish amalga oshirilmagan.Skript funksiyalarini to‘ldirish rejalashtirilgan edi. : EEPROM yozish va oʻqishni qoʻshing, PIC kontrollerlarini qoʻllab-quvvatlashni amalga oshiring va hokazo. Shu sababdan skript hali nashr etilmagan. Lekin vaqt yoʻqligi sababli rejani amalga oshirish kechiktirildi va eng yaxshisi boʻlmaslik uchun. yaxshilikning dushmani, mavjud versiyani nashr etishga qaror qilindi.Agar allaqachon amalga oshirilgan funksiyalar etarli bo'lmasa, xafa bo'lmang.Bu holda siz o'zingiz xohlagan funktsiyani qo'shishga harakat qilishingiz mumkin.Yashirmayman: Ushbu skriptni yaratish g'oyasi dastlab tarbiyaviy ma'noga ega.Algoritmni tushunib, unga o'zingizning biror narsangizni qo'shsangiz, siz MK ning dasturlash rejimida ishlashini yaxshiroq tushuna olasiz, shunda Kelajakda siz buzuq mashina oldida o'zingizni qizning holatida topa olmaysiz, uning ichki qismiga o'ylab qaraysiz va nima uchun "ishlamasligini" tushunmaysiz.

2. Dasturlash rejimida MK interfeysi

Tekshirgichni dasturlash rejimiga o'tkazish va u bilan ushbu rejimda ishlashning bir necha xil usullari mavjud. ATtiny va ATmega seriyali kontrollerlar uchun eng oson amalga oshirish, ehtimol, SPI. Biz undan foydalanamiz.

Ammo, SPI yaratish uchun zarur bo'lgan signallarni ko'rib chiqishni boshlashdan oldin, biz bir qator zahiralarni qilamiz. Mikrokontrollerda konfiguratsiya bitlari mavjud. Bular o'zgartirish kalitlari kabi narsadir, ular loyiha ehtiyojlariga muvofiq mikrosxemaning ba'zi xususiyatlarini o'zgartirishga imkon beradi. Jismoniy jihatdan, bular dastur yoziladiganlar kabi o'zgarmas xotira hujayralaridir. Farqi shundaki, ularning soni juda oz (ATmega uchun uch baytgacha) va ular hech qanday xotiraning manzil maydoniga kirmaydi. Konfiguratsiya ma'lumotlarini yozish va o'qish MK dasturlash rejimida alohida buyruqlar bilan amalga oshiriladi. Endi shuni ta'kidlash kerakki, ba'zi konfiguratsiya bitlari SPI dan foydalanish qobiliyatiga ta'sir qiladi. Ularning ba'zi qiymatlari bilan SPI dan foydalanish mumkin emasligi aniqlanishi mumkin. Agar siz bunday mikrokontrollerga duch kelsangiz, ushbu maqolada taklif qilingan usul yordam bermaydi. Bunday holda, siz boshqa dasturlash rejimini qo'llab-quvvatlaydigan dasturchidagi konfiguratsiya bitlarining sozlamalarini o'zgartirishingiz yoki boshqa mikrokontrollerdan foydalanishingiz kerak bo'ladi. Ammo bu muammo faqat ishlatilgan MKlarga yoki kimdir allaqachon muvaffaqiyatsiz "o'ynagan"larga tegishli. Gap shundaki, yangi MCUlar SPI-dan foydalanishga to'sqinlik qilmaydigan konfiguratsiya bit sozlamalari bilan birga keladi. Buni Perpetuum M dasturi uchun dasturchi skriptining sinov natijalari tasdiqlaydi, uning davomida to'rt xil MK (ATmega8, ATmega128, ATtiny13, ATtiny44) muvaffaqiyatli yonib ketdi. Ularning hammasi yangi edi. Konfiguratsiya bitlarining dastlabki sozlamalari hujjatlarga mos keldi va SPI dan foydalanishga xalaqit bermadi.

Yuqoridagilarni hisobga olgan holda, siz quyidagi bitlarga e'tibor berishingiz kerak. SPIEN biti SPI-dan foydalanishga aniq ruxsat beradi yoki o'chiradi, shuning uchun bizning holatlarimizda uning qiymati faol bo'lishi kerak. RSTDISBL biti mikrosxemaning chiqishlaridan birini (oldindan belgilangan) "qayta o'rnatish" signalining kirishiga aylantirish yoki uni aylantirmaslik (ushbu bitga yozilgan qiymatga qarab) qodir. Bizning holatda, "qayta tiklash" kiritish kerak (agar u yo'q bo'lsa, MKni SPI orqali dasturlash rejimiga o'tkazish mumkin bo'lmaydi). CKSEL guruhining bitlari ham bor, ular soat signalining manbasini belgilaydi. Ular SPI dan foydalanishga to'sqinlik qilmaydi, lekin ularni ham yodda tutish kerak, chunki agar umuman soat pulslari bo'lmasa yoki ularning chastotasi ma'lum bir SPI tezligi uchun maqbul darajadan past bo'lsa, yaxshi narsa ham bo'lmaydi. Odatda, ichki RC osilatoriga ega bo'lgan yangi MCU'larda CKSEL guruhi bitlari uni ishlatish uchun tuzilgan. Bu bizga juda mos keladi - soatni hisoblash biz tomondan hech qanday qo'shimcha harakatlarsiz ta'minlanadi. Kvarts rezonatorini lehimlash yoki tashqi generatorni ulashning hojati yo'q. Agar ko'rsatilgan bitlar boshqa sozlamani o'z ichiga olgan bo'lsa, siz sozlamaga muvofiq soatni kuzatishingiz kerak bo'ladi. Bunday holda, MCU ga kvarts rezonatori yoki tashqi soat generatorini ulash kerak bo'lishi mumkin. Ammo bu maqolada biz buni qanday qilishni ko'rib chiqmaymiz. Ushbu maqolada keltirilgan dasturlash uchun MKni ulash misollari eng oddiy holat uchun mo'ljallangan.

Guruch. 1. Dasturlash rejimida SPI orqali ma'lumotlar almashinuvi

Endi ATmega128A MK uchun hujjatlardan olingan 1-rasmga murojaat qilaylik. U bir baytni MK ga uzatish va bir vaqtning o'zida MK dan bir baytni olish jarayonini ko'rsatadi. Bu ikkala jarayon, biz ko'rib turganimizdek, dasturchidan mikrokontrollerga SCK kirishida etkazib beriladigan bir xil taktli impulslardan foydalanadi - mikrosxemaning pinlaridan biri, buning uchun SPI dasturlash rejimida bunday rol tayinlangan. Yana ikkita signal liniyasi ma'lumotlarni qabul qilish va uzatishni har bir soat siklida bir bitni ta'minlaydi. MOSI kirishi orqali ma'lumotlar mikrokontrollerga kiradi va o'qilgan ma'lumotlar MISO chiqishidan olinadi. SCK dan MISO va MOSI ga chizilgan ikkita nuqta chiziqqa e'tibor bering. Ular qaysi daqiqada mikrokontroller MOSI kirishida o'rnatilgan ma'lumotlar bitini "yutishini" va qaysi vaqtda o'zi MISO chiqishiga o'z ma'lumotlar bitini o'rnatishini ko'rsatadi. Hammasi juda oddiy. Ammo MKni dasturlash rejimiga kiritish uchun biz hali ham RESET signaliga muhtojmiz. Keling, umumiy GND simi va VCC quvvat manbai haqida ham unutmaylik. Hammasi bo'lib, mikrokontrollerga mikrodasturni SPI orqali yoqish uchun atigi 6 ta simni ulash kerak bo'ladi. Quyida biz buni batafsilroq tahlil qilamiz, ammo hozircha biz SPI orqali dasturlash rejimida MK bilan ma'lumotlar almashinuvi 4 bayt paketlarda amalga oshirilishini qo'shamiz. Har bir paketning birinchi bayti asosan ko'rsatmalarni kodlashga bag'ishlangan. Ikkinchi bayt, birinchisiga qarab, buyruq kodining davomi yoki manzilning bir qismi bo'lishi mumkin yoki ixtiyoriy qiymatga ega bo'lishi mumkin. Uchinchi bayt asosan manzillarni uzatish uchun ishlatiladi, lekin ko'plab ko'rsatmalarda ixtiyoriy qiymatga ega bo'lishi mumkin. To'rtinchi bayt odatda ma'lumotlarni uzatadi yoki ixtiyoriy qiymatga ega. To'rtinchi baytni uzatish bilan bir vaqtda, ba'zi buyruqlar mikrokontrollerdan keladigan ma'lumotlarni oladi. Har bir buyruq uchun tafsilotlarni "SPI seriyali dasturlash bo'yicha ko'rsatmalar to'plami" deb nomlangan jadvaldagi boshqaruvchi hujjatlarida topish mumkin. Hozircha biz shuni ta'kidlaymizki, kontroller bilan butun almashinuv 32 bitli paketlar ketma-ketligidan qurilgan bo'lib, ularning har birida bir baytdan ortiq foydali ma'lumotlar uzatilmaydi. Bu juda maqbul emas, lekin umuman olganda u yaxshi ishlaydi.

3. MKni dasturlash uchun ulash

SPI interfeysini tashkil qilish va uning MISO chiqishidan ma'lumotlarni o'qish uchun mikrokontrollerning kirishlariga barcha kerakli signallar berilishini ta'minlash uchun dasturchi yaratish shart emas. Buni eng keng tarqalgan USB-RS232TTL konvertori yordamida osongina amalga oshirish mumkin.

Internetda siz ko'pincha bunday konvertorlarning pastligi va ular bilan jiddiy hech narsa qilish mumkin emasligi haqida ma'lumot topishingiz mumkin. Ammo ko'pgina konvertor modellariga kelsak, bu fikr noto'g'ri. Ha, sotuvda standart COM portiga (masalan, faqat TXD va RXD) nisbatan barcha kirish va chiqishlarga ega bo'lmagan konvertorlar mavjud bo'lib, ular ajratilmaydigan dizaynga ega (mikrosxema plastmassa bilan to'ldirilgan - bu uning pinlariga etib bo'lmaydi). Ammo bularni sotib olishga arzimaydi. Ba'zi hollarda siz simlarni to'g'ridan-to'g'ri chipga lehimlash orqali etishmayotgan port kirish va chiqishlarini olishingiz mumkin. Bunday "yaxshilangan" konvertorning namunasi 2-rasmda ko'rsatilgan (chip PL-2303 - uning pinlarining maqsadi haqida batafsil ma'lumot "" maqolasida). Bu eng arzon modellardan biri, ammo uy qurilishi dizaynlarida foydalanilganda o'zining afzalliklariga ega. COM porti kabi oxirida standart to'qqiz pinli ulagichga ega bo'lgan to'liq xususiyatli adapter shnurlari ham keng tarqalgan. Ular oddiy MAQOMOTI portidan faqat TTL darajalari va eski dasturiy ta'minot va ba'zi eski qurilmalar bilan mos kelmasligi bilan farq qiladi. Shuni ham ta'kidlash mumkinki, CH34x chipidagi shnurlar PL-2303 konvertorlari bilan solishtirganda turli ekstremal sinovlarda ancha ishonchli va barqaror ekanligini ko'rsatadi. Biroq, normal foydalanish paytida farq sezilmaydi.

USB-RS232TTL konvertorini tanlayotganda, uning drayverining siz foydalanayotgan operatsion tizim versiyasiga mos kelishiga ham e'tibor berishingiz kerak.

Keling, to'rt xil MK modellari: ATtiny13, ATtiny44, ATmega8 va ATmega128 misolida mikrokontroller va USB-RS232TTL konvertorini ulash tamoyilini batafsil ko'rib chiqaylik. 3-rasmda bunday ulanishning umumiy sxemasi ko'rsatilgan. RS232 signallari (RTS, TXD, DTR va CTS) noto'g'ri ishlatilayotganini bilish sizni hayratda qoldirishi mumkin. Ammo bu haqda tashvishlanmang: Perpetuum M dasturi ular bilan bevosita ishlashga qodir - chiqish qiymatlarini o'rnating va kirish holatini o'qing. Qanday bo'lmasin, CH34x va PL-2303 chiplarida keng qo'llaniladigan USB-RS232TTL konvertorlari bu imkoniyatni ta'minlaydi - bu tasdiqlangan. Boshqa mashhur konvertorlarda ham muammolar bo'lmasligi kerak, chunki standart Windows funktsiyalari portga kirish uchun ishlatiladi.

Umumiy diagrammada ko'rsatilgan rezistorlar, qoida tariqasida, o'rnatilmasligi mumkin, ammo ularni o'rnatish hali ham yaxshiroqdir. Ularning maqsadi nima? Konvertorning TTL kirish va chiqishlari hamda mikrokontrollerning besh voltli quvvat manbaidan foydalanib, biz mantiqiy darajalarni muvofiqlashtirish zaruratidan xalos bo'lamiz - hamma narsa allaqachon to'g'ri. Bu ulanishlar to'g'ridan-to'g'ri bo'lishi mumkinligini anglatadi. Lekin tajribalar davomida. , har qanday narsa sodir bo'lishi mumkin.Masalan, bema'nilik qonuniga ko'ra, tornavida tushishi mumkin bo'lmagan joyga tushishi va hech qanday holatda qisqa tutashuv bo'lmasligi kerak bo'lgan narsani qisqa tutashuvi mumkin. "tornavida" bo'lib chiqadi.Rezistorlar bu holda ba'zan oqibatlarni kamaytiradi.Ularning maqsadlaridan biri mumkin bo'lgan chiqish ziddiyatini bartaraf etishdir.Haqiqat shundaki, dasturlash tugallangandan so'ng mikrokontroller normal ishlash rejimiga o'tadi va u mumkin. Shunday bo'ladiki, uning konvertorning chiqishiga ulangan pin (RTS, TXD yoki DTR) ham hozirgina MKda qayd etilgan dasturga ko'ra chiqishga aylanadi.Bu holda ikkita to'g'ridan-to'g'ri ulangan chiqish "jang" qilsa, bu juda yomon bo'ladi. - turli mantiqiy darajalarni o'rnatishga harakat qiling. Bunday "kurashda" kimdir "yutqazishi" mumkin, lekin biz buni xohlamaymiz.

Uch rezistorning qiymatlari 4,3 KOhm darajasida tanlanadi. Bu konvertor chiqishi va mikrokontrollerning kirishi o'rtasidagi ulanishlar uchun amal qiladi. Rezistorlarning aniqligi muhim emas: siz ularning qarshiligini 1 KOhm ga kamaytirishingiz yoki uni 10 KOhm ga oshirishingiz mumkin (lekin ikkinchi holatda, MK ga boradigan yo'lda uzun simlardan foydalanganda shovqin xavfi ortadi). Konverter kirishi (CTS) va mikrokontroller chiqishi (MISO) o'rtasidagi aloqaga kelsak, bu erda 100 Ohm qarshilik ishlatiladi. Bu ishlatiladigan konvertorni kiritishning o'ziga xos xususiyatlari bilan izohlanadi. Sinovlar davomida PL-2303 mikrosxemasida konvertor ishlatilgan bo'lib, uning kirishlari nisbatan past qarshilik bilan (bir necha yuz Ohm tartibida) musbat quvvat manbaiga ulangan. "Pull-upni sindirish" uchun men shunday kichik qarshilikka ega qarshilikni o'rnatishim kerak edi. Biroq, uni umuman o'rnatishingiz shart emas. Konverterda bu har doim kirish bo'ladi. Bu chiqish yo'li bo'la olmaydi, ya'ni voqealarning har qanday rivojlanishida chiqishlar to'qnashuvi bo'lmaydi.

Agar chipda analog-raqamli konvertorni (masalan, ATmega8 yoki ATmega128) quvvatlantirish uchun alohida AVCC piniga ega bo'lsa, u umumiy VCC quvvat piniga ulanishi kerak. Ba'zi IC'larda bir nechta VCC quvvat pinlari yoki bir nechta GND mavjud. Masalan, ATmega128-da 3 ta GND pinlari va 2 ta VCC pinlari mavjud. Doimiy dizaynda bir xil nomdagi pinlarni bir-biriga ulash yaxshiroqdir. Bizning holatda, dasturlash paytida siz har birida bitta VCC va GND pinidan foydalanishingiz mumkin.

Va bu erda ATtiny13 ulanishi qanday ko'rinishga ega. Rasmda SPI orqali dasturlashda ishlatiladigan pin tayinlash ko'rsatilgan. Suratning yonida vaqtinchalik aloqa haqiqatda qanday ko'rinishga ega.


Ba'zilar bu jiddiy emas deb aytishlari mumkin - simlardagi ulanishlar. Lekin siz va men aqlli odamlarmiz. Bizning maqsadimiz mikrokontrollerni dasturlash, unga minimal vaqt va boshqa resurslarni sarflash va kimningdir oldida o'zini ko'rsatish emas. Sifat buzilmaydi. Bu holda "simlar" usuli juda samarali va asosli. Tekshirish moslamasining dasturiy ta'minotini miltillash bir martalik protseduradir, shuning uchun uni rinstones bilan qoplashning ma'nosi yo'q. Kelajakda proshivkani boshqaruvchini sxemadan (tayyor mahsulotda) olib tashlamasdan o'zgartirish nazarda tutilgan bo'lsa, bu qurilmani ishlab chiqarishda o'rnatish vaqtida hisobga olinadi. Odatda bu maqsad uchun konnektor (RESET, SCK, MOSI, MISO, GND) o'rnatiladi va MK plataga o'rnatilgandan keyin ham miltillashi mumkin. Ammo bu ijodiy zavqlar. Biz eng oddiy ishni ko'rib chiqamiz.

Endi ATtiny44 MK ga o'tamiz. Bu erda hamma narsa deyarli bir xil. Chizma va fotosuratga asoslanib, hatto yangi boshlovchi ham ulanishni aniqlashda qiyinchilik tug'dirmaydi. ATtiny44 singari, siz ATtiny24 va ATtiny84 mikrokontrollerlarini ulashingiz mumkin - bu uchtasi uchun pin tayinlari bir xil.


Uni dasturlash uchun kontrollerni vaqtincha ulashning yana bir misoli ATmega8. Bu erda ko'proq pinlar mavjud, ammo printsip bir xil - bir nechta simlar va endi boshqaruvchi unga ma'lumotni "to'ldirishga" tayyor. 13-pindan olingan fotosuratdagi qo'shimcha qora sim dasturlashda ishtirok etmaydi. MK dasturlash rejimidan chiqqandan keyin undan ovozli signalni olib tashlash uchun mo'ljallangan. Buning sababi, "Perpetuum M" skriptini tuzatish paytida musiqa qutisi dasturi MKga yuklab olingan.


Ko'pincha bitta kontroller turli korpuslarda mavjud. Bunday holda, har bir holat uchun pinlarni belgilash boshqacha taqsimlanadi. Agar tekshirgichingizning korpusi rasmda ko'rsatilganiga o'xshamasa, MK ishlab chiqaruvchisi veb-saytidan yuklab olish mumkin bo'lgan texnik hujjatlardagi pinlarning maqsadini tekshiring.

Rasmni to'ldirish uchun MK mikrosxemasini ko'p sonli "oyoqlari" bilan ulashni ko'rib chiqaylik. 15-pindan olingan fotosuratdagi qo'shimcha qora simning maqsadi ATmega8 bilan bir xil.


Siz hamma narsa juda oddiy ekanligiga allaqachon amin bo'lgansiz. Mikrosxemalarning pinlarini (soat miliga teskari aylanadagi belgidan boshlab) qanday hisoblashni biladigan har bir kishi buni aniqlaydi. Va aniqlik haqida unutmang. Mikrosxemalar toza odamlarni yaxshi ko'radilar va beparvo munosabatni kechirmaydilar.

Dasturiy ta'minot qismiga o'tishdan oldin, USB-RS232TTL konvertor drayveri to'g'ri o'rnatilganligiga ishonch hosil qiling (Windows Device Manager-ni tekshiring). Konverterni ulaganingizda paydo bo'ladigan virtual MAQOMOTI portining raqamini eslab qoling yoki yozib oling. Ushbu raqamni quyida o'qishingiz mumkin bo'lgan skript matniga kiritish kerak bo'ladi.

4. Skript - "Perpetuum M" uchun dasturchi

Biz "dasturchi" ning apparat qismini aniqladik. Bu allaqachon kurashning yarmi. Endi dasturiy ta'minot qismi bilan shug'ullanish qoladi. Uning rolini Perpetuum M dasturi skript nazorati ostida bajaradi, u mikrokontroller bilan o'zaro ishlash uchun barcha zarur funktsiyalarni amalga oshiradi.

Skript bilan arxivni perpetuum.exe dasturi joylashgan papkaga ochish kerak. Bunday holda, perpetuum.exe faylini ishga tushirganingizda, ekranda o'rnatilgan skriptlar ro'yxati bilan menyu ko'rsatiladi, ular orasida "AVR MK Programmer" qatori bo'ladi (u yagona bo'lishi mumkin). Bu bizga kerak bo'lgan chiziq.

Skript "MK Programmer AVR.pms" faylida PMS papkasida joylashgan. Ushbu faylni Windows Notepad kabi oddiy matn muharririda ko'rish, o'rganish va kerak bo'lganda tahrirlash mumkin. Skriptni ishlatishdan oldin, ehtimol port sozlamalari bilan bog'liq matnga o'zgartirishlar kiritishingiz kerak bo'ladi. Buning uchun Windows Device Manager-da ishlatiladigan port nomini tekshiring va agar kerak bo'lsa, "PortName="COM4" qatoriga tegishli o'zgartirish kiriting;" - 4 raqami o'rniga boshqa raqam bo'lishi mumkin. Bundan tashqari, boshqa USB-RS232TTL konvertor modelidan foydalanganda siz signalni o'zgartirish sozlamalarini o'zgartirishingiz kerak bo'lishi mumkin ("Yuqori" so'zi bilan boshlanadigan skript satrlari). USB-RS232TTL konvertori orqali signallarning inversiyasini Perpetuum M dasturi uchun ko'rsatmalardagi misollardan biri yordamida tekshirishingiz mumkin (port bilan ishlash funktsiyalari bo'limi).

MK_AVR pastki papkasida qo'llab-quvvatlanadigan kontrollerlar tavsifi bo'lgan fayllar mavjud. Agar sizga kerak bo'lgan kontroller ular orasida bo'lmasa, o'xshashlikka rioya qilgan holda o'zingizga kerak bo'lganini qo'shishingiz mumkin. Namuna sifatida fayllardan birini oling va matn muharriridan foydalanib, mikrokontrolleringiz uchun hujjatlardan kerakli ma'lumotlarni kiriting. Asosiysi, ehtiyot bo'lish, ma'lumotlarni xatosiz kiritish, aks holda MK dasturlashtirilmaydi yoki noto'g'ri dasturlashtiriladi. Asl versiya 6 ta mikrokontrolderni qo'llab-quvvatlaydi: ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATmega8 va ATmega128. Skript ulangan kontrollerni avtomatik tanib olishni amalga oshiradi - uni qo'lda belgilash shart emas. Agar MK dan o'qilgan identifikator mavjud tavsiflar orasida bo'lmasa, boshqaruvchini tanib bo'lmadi degan xabar ko'rsatiladi.

Skript bilan arxivda qo'shimcha ma'lumotlar ham mavjud. AVR controller inc fayllar papkasida juda foydali va keng ko'lamli kontroller ta'rifi fayllari to'plami mavjud. Ushbu fayllar MK uchun o'z dasturlarini yozishda ishlatiladi. Yana to'rtta "MusicBox_..." papkasida ATtiny13, ATtiny44, ATmega8 va ATmega128 uchun alohida MKga yuklab olishga tayyor bo'lgan Assambleya tilidagi dastur va proshivkali fayllar mavjud. Agar siz ushbu maqolada taklif qilinganidek, ushbu MK-lardan birini dasturlash uchun ulagan bo'lsangiz, uni hoziroq miltillashingiz mumkin - siz musiqa qutisini olasiz. Bu haqda quyida batafsilroq.

Skript menyusida "MK AVR Programmer" qatorini tanlaganingizda, skript bajarila boshlaydi. Shu bilan birga, u portni ochadi, MK ga dasturlash rejimiga o'tish buyrug'ini yuboradi, muvaffaqiyatli o'tish to'g'risida MKdan tasdiqlashni oladi, MK identifikatorini so'raydi va mavjud bo'lganlar orasida identifikator bo'yicha ushbu MK tavsifini qidiradi. tavsiflari bo'lgan fayllar. Agar u kerakli tavsifni topmasa, u tegishli xabarni ko'rsatadi. Agar tavsif topilsa, dasturchining asosiy menyusi ochiladi. Uning skrinshotini 8-rasmda ko'rishingiz mumkin. Keyinchalik tushunish qiyin emas - menyu juda oddiy.

Skriptning birinchi versiyasida to'liq huquqli dasturchining ba'zi funktsiyalari amalga oshirilmaydi. Misol uchun, EEPROM-da o'qish va yozishning hech qanday usuli yo'q. Ammo agar siz skriptni matn muharririda ochsangiz, unda asosiy narsa allaqachon amalga oshirilgan bo'lishiga qaramay, uning hajmi juda kichik ekanligini ko'rasiz. Bu shuni ko'rsatadiki, etishmayotgan funktsiyalarni qo'shish unchalik qiyin emas - til juda moslashuvchan, u kichik dasturda boy funksiyalarni amalga oshirish imkonini beradi. Ammo ko'p hollarda hatto mavjud funktsiyalar ham etarli.

Ba'zi funksional cheklovlar to'g'ridan-to'g'ri skript matnida tasvirlangan:
//yozuv faqat nol manzildan amalga oshirildi (kengaytirilgan segment manzili yozuvi e'tiborga olinmaydi, LOAD OFFSET - ham)
//HEX faylidagi yozuvlar tartibi va uzluksizligi tekshirilmagan
// nazorat summasi belgilanmagan
Bu MK uchun proshivka kodi olingan HEX fayli bilan ishlash uchun amal qiladi. Agar bu fayl buzilmagan bo'lsa, nazorat summasini tekshirish hech qanday ta'sir ko'rsatmaydi. Agar u buzilgan bo'lsa, uni skript yordamida aniqlash mumkin bo'lmaydi. Ko'pgina hollarda, qolgan cheklovlar zarar qilmaydi, lekin siz hali ham ularni yodda tutishingiz kerak.

5. Musiqa qutisi - yangi boshlanuvchilar uchun oddiy hunarmandchilik

Agar sizda ushbu mikrokontrollerlardan biri bo'lsa: ATtiny13, ATtiny44, ATmega8 yoki ATmega128, uni osongina musiqa qutisi yoki musiqa kartasiga aylantirishingiz mumkin. Buning uchun MK-ga tegishli proshivkani yozish kifoya - skript bilan bir xil arxivdagi "MusicBox_..." papkalarida joylashgan to'rttadan biri. Mikrodastur kodlari ".hex" kengaytmali fayllarda saqlanadi. Bunday hunarmandchilik uchun ATmega128-dan foydalanish, albatta, ATmega8 kabi "yog'li". Ammo bu sinov yoki tajriba uchun, boshqacha aytganda, ta'lim maqsadlarida foydali bo'lishi mumkin. Assemblerdagi dasturlarning matnlari ham ilova qilingan. Dasturlar noldan yaratilmagan - A.V.Belovning "Havaskor radio amaliyotida AVR mikrokontrollerlari" kitobidan musiqa qutisi dasturi asos qilib olingan. Dastlabki dastur bir qator muhim o'zgarishlarga duch keldi:
1. to‘rtta MKning har biri uchun moslashtirilgan: ATtiny13, ATtiny44, ATmega8 va ATmega128
2. tugmalar olib tashlandi - boshqaruvchiga quvvat va ovoz chiqargichdan boshqa hech narsa ulash shart emas (taronalar cheksiz tsiklda birin-ketin ijro etiladi)
3. musiqiy ritmdagi buzilishlarni bartaraf etish uchun har bir notaning davomiyligi notalar orasidagi pauza davomiyligiga qisqartiriladi.
4. sakkizinchi kuy ulangan, kitob variantida ishlatilmagan
5. sub'ektiv tomondan: algoritmni optimallashtirish va tushunishni osonlashtirish uchun ba'zi "yaxshilanishlar"

Ba'zi ohanglarda yolg'on va hatto qo'pol xatolarni eshitish mumkin, ayniqsa "Tabassum" da - o'rtada. Rington kodlari kitobdan olingan (aniqrog'i asl asm fayli bilan birga kitob muallifining veb-saytidan yuklab olingan) va o'zgartirilmagan. Ko‘rinib turibdiki, kuylarni kodlashda xatolar bor. Ammo bu muammo emas - musiqa bilan "do'stona" bo'lgan har bir kishi buni osongina aniqlashi va hamma narsani tuzatishi mumkin.

ATtiny13-da 16-bitli hisoblagich yo'qligi sababli, eslatmalarni ko'paytirish uchun 8-bitli hisoblagichdan foydalanishga to'g'ri keldi, bu esa notalar aniqligining biroz pasayishiga olib keldi. Ammo bu quloqqa deyarli sezilmaydi.

Konfiguratsiya bitlari haqida. Ularning sozlamalari yangi mikrokontrollerning holatiga mos kelishi kerak. Agar sizning MK ilgari biron bir joyda ishlatilgan bo'lsa, siz uning konfiguratsiya bitlarining holatini tekshirishingiz kerak va agar kerak bo'lsa, ularni yangi mikrokontroller sozlamalariga moslashtirishingiz kerak. Yangi mikrokontrollerning konfiguratsiya bitlarining holatini ushbu MK uchun hujjatlardan bilib olishingiz mumkin ("Sug'urta bitlari" bo'limi). Istisno - ATmega128. Ushbu MCU eski ATmega103 bilan moslik rejimini ta'minlaydigan M103C bitiga ega. M103C bitini faollashtirish ATmega128 imkoniyatlarini sezilarli darajada pasaytiradi va bu bit yangi MKda faoldir. M103C ni nofaol holatga qaytarishingiz kerak. Konfiguratsiya bitlarini boshqarish uchun dasturchi skript menyusining tegishli bo'limidan foydalaning.

Musiqa qutisining diagrammasini berishning ma'nosi yo'q: u faqat mikrokontroller, quvvat manbai va piezo-tovush emitentini o'z ichiga oladi. Quvvat MKni dasturlashda bo'lgani kabi, xuddi shunday tarzda ta'minlanadi. Ovoz emitteri umumiy sim (kontrolörning GND pin) va MK pinlaridan biri orasiga ulanadi, ularning sonini dasturni yig'ish kodi (*.asm) bilan faylda topish mumkin. Izohlarda har bir MK uchun dastur matnining boshida qator mavjud: "ovozli signal XX pinda hosil bo'ladi". Dasturchi skripti tugallangach, mikrokontroller dasturlash rejimidan chiqadi va normal ishlashga o'tadi. Ohanglarni ijro etish darhol boshlanadi. Ovoz emitterini ulab, buni tekshirishingiz mumkin. Kristallni dasturlashda ovoz chiqargichni ulangan holda qoldirishingiz mumkin, agar ovoz SPI da ishlatilmaydigan pindan olingan bo'lsa, aks holda pindagi qo'shimcha sig'im dasturlashga xalaqit berishi mumkin.