Atmega8 dasturlash. AVR mikrokontrolörlarini dasturlash. MK interfeysi dasturlash rejimida

Kompyuterdan mikrokontrollerga o'tkazish uchun bizga USBasp va AVRDUDE dasturi kerak.Bugungi kunda dasturlash uchun mo'ljallangan dasturchilarning keng tanlovi mavjud AVR mikrokontrollerlari. Ular orasida siz ko'plab uy qurilishilarini topishingiz mumkin, ularni dasturchi deb atash qiyin, chunki ular bir nechta rezistorlar yordamida COM portiga bevosita ulangan. Biroq zamonaviy kompyuterlar va noutbuklar endi MAQOMOTI portlari bilan jihozlanmagan, shuning uchun dasturchi tanlashda asosiy mezonlardan biri uni ulash qobiliyatidir. USB port. Eng arzon, eng oddiy va eng keng tarqalgan USBasp dasturchisi. Uni deyarli har qanday radio do'konida sotib olish mumkin hamyonbop narx. Uning narxi Xitoy internet Do'kon $ 1,5 dan $ 3 gacha.

Dasturchi USBasp

Kompyuter USB porti orqali USBasp dasturchisi yordamida mikrokontroller bilan bog'lanadi va ma'lumotlar interfeys orqali uzatiladi. SPI S serial P eriferik I interfeys(seriyali periferik interfeys). MKni dasturchi bilan bog'lash uchun maxsus pinlar ishlatiladi: MOSI, MISO, SCK, RESET, VCC, GND. Garchi SPI faqat uchta MOSI, MISO va SCK pinlaridan foydalanishni nazarda tutadi, lekin biz barcha olti pinni ishlatamiz.

Interfeys orqali ma'lumotlarni almashishda SPI Mikrokontroller bir vaqtning o'zida qabul qilish (MISO pin) yoki ma'lumotlarni uzatish (MOSI pin) mumkin. Ma'lumotni qabul qilish yoki uzatish rejimini o'rnatish SCK piniga ma'lum bir impulsni qo'llash orqali amalga oshiriladi.

Dasturchi ulagichi, qoida tariqasida, 10 pinga ega va mikrokontrollerga 10 simli kabel orqali ulanadi. Biroq, 6 pinli adapterga ega bo'lgan kabellardan foydalanish qulayroqdir, chunki bu holda barcha pinlar ishg'ol qilinadi. O'n pinli ulagich uchun bitta pin bo'sh qoladi va to'rtta pin umumiy simga (GND) ulanadi.

Kompyuter dasturchini aniqlashi uchun siz USBasp drayverini o'rnatishingiz kerak.

ATmega8 mikrokontrolleriga ulangan dasturchining fotosurati quyida ko'rsatilgan.

Ushbu dasturchining yagona kamchiliklari yoki to'g'rirog'i, kichik noqulayligi shundaki, u Atmel Studio tomonidan qo'llab-quvvatlanmaydi (turli xil fokuslarsiz), shuning uchun siz foydalanishingiz kerak. uchinchi tomon dasturi. Eng isbotlangani bu AVRDUDE.

Sozlamalar

Endi biz oxirgi bosqichni bajarishimiz kerak. AVRDUDE dasturini ishga tushiring. Odatiy bo'lib, Dastur yorlig'i ochiladi. Sozlamalar menyusidagi oynaning pastki qismida dasturchi turini tanlang usbasp. Kategoriyada keyingi Mikrokontroller ATmega8 mikrokontrollerimizni tanlang. Quyida kategoriyada Flash ellips belgisini bosing va ochilgan menyuda kengaytmali kompilyatsiya qilingan faylga yo'lni belgilang olti burchakli. Faylga yo'l va faylning o'zi biz ilgari ko'rsatganimiz bilan bir xil bo'ladi.

Dasturchi operatsion tizim tomonidan aniqlanganligiga (dasturchi drayveri to'g'ri o'rnatilgan) va mikrokontrollerga to'g'ri ulanganligiga ishonch hosil qilish uchun tugmani bosing. O'qish. Hech qanday xato bo'lmasa, yozuv bilan oyna paydo bo'ladi " Jeneratorni kalibrlash kataklari o'qildi!" Va o'n oltilik raqam yuqori oynada ko'rsatiladi. Har bir MK o'z raqamiga ega.

Yozib olishdan oldin yangi dastur Mikrokontroller xotirasini tozalash tavsiya etiladi. Bu tugmani bosish orqali amalga oshirilishi mumkin Hamma narsani o'chiring. Natijada, kristallning toza ekanligini ko'rsatadigan oyna paydo bo'ladi.

Endi kategoriyadagi Dastur tugmasini bosing Flash. Dastur MKda muvaffaqiyatli qayd etilganda, quyidagi yozuv bilan oyna paydo bo'ladi.

Yozilgan yoki ular aytganidek, proshivka dasturining natijasi bu bizning mikrokontrollerimizning PC0 piniga ulangan yonib turgan LED.

Xayrli kun. Davom etaylik. Biz "atmel studio" da yozgan dasturni disk raskadrovka qilish jarayoni bilan tanishganimizdan so'ng va "proteus" da bitta LEDli sxemani deyarli yig'dik, sxemani apparatda yig'ish va mikrokontrollerni miltillash vaqti keldi.

Prototipni dasturlash uchun ( atmega 8) biz USBASP dasturchisidan foydalanamiz. Bu shunday ko'rinadi:

Kabel ulagichga ulanadi, unga o'tish moslamalari ulanadi, bu esa o'z navbatida mikrokontroller o'rnatilgan non panelining rozetkalariga ulanadi:

Birinchi pin konnektorda o'q bilan belgilangan.


Dasturchini aniqlaganimizdan keyin. Keling, sxemani apparatda yig'ishga o'taylik. Mikrokontrollerni non paneliga o'rnatamiz. Eslatib o'taman, birinchi oyoq MKda kichik doira bilan belgilangan.

Vazifa dasturchi pinlarini "tosh" pinlariga ulashdir.

Biz jumperlarni 10 pinli ulagichga ulaymiz. Biz quyidagi MOSI, RST, SCK, MISO, VTG (VCC), GND pinlaridan foydalanamiz.

Umid qilamanki, siz allaqachon atmega8 ma'lumotlar jadvalini yuklab oldingiz. Agar yo'q bo'lsa, uni yuklab olishingiz mumkin. Biz mikrokontroller pinlarining pinoutiga qaraymiz.

Biz jumperlarni quyidagi pinlarga ulaymiz:

  • MK ning 7-piniga VCC;
  • MK ning 19-piniga SCK;
  • MK ning 18-piniga MISO;
  • MK ning 17-piniga MOSI;
  • GND (dasturchi pin 10) MK ning 8-piniga;
  • MK ning 1 piniga RST;

Keyinchalik muvaffaqiyatli ishlashi uchun operatsion tizim shaytan mashinasini (dasturchini) birinchi marta ishga tushirganda, qurilma ishlashi uchun zarur bo'lgan drayverlarni o'rnatishni taklif qiladi.

Ekspeditor bilan ishlashda hech qanday muammo bo'lmasligi kerak. Yuklab oling. Yuklab olingan arxivni ochadigan papka yarating. Keyin Uskunani o'rnatish ustasida biz ochilgan drayveri bo'lgan papkaga yo'lni belgilaymiz.

Agar siz Windows 7 yoki undan keyingi versiyada ishlayotgan bo'lsangiz, ba'zi kichik qiyinchiliklarga duch kelishingiz mumkin. Dasturchi uchun drayverlar ancha eski, shuning uchun ularda yo'q raqamli imzo. Bunday drayverni o'rnatishga harakat qilganingizda, operatsion tizim shunga o'xshash narsani ko'rsatadi *

“Haydovchilarning raqamli imzosi talab qilinadi ushbu qurilmadan. Da oxirgi o'zgarish uskunalar yoki dasturiy ta'minot noto'g'ri imzolangan yoki shikastlangan fayl yoki zararli dastur noma'lum kelib chiqishi. (52-kod).

Vaziyatni to'g'irlash uchun siz haydovchining raqamli imzosini tekshirishni o'chirib qo'yishingiz kerak. Men uni qanday o'chirishni tasvirlamayman (har kimning o'z operatsion tizimi bor), ularni Internetda topish mumkin.

Imzoni tekshirishni o'chirib qo'yganingizdan so'ng, Uskunani o'rnatish ustasida arxivdan chiqarilgan drayverga ega jildga yo'lni belgilang.

Umid qilamanki, hamma narsa siz uchun muvaffaqiyatli bo'ldi va dasturchi ishlashga tayyor.

Keling, sxemani LED bilan yig'ishga o'taylik.

Mikrokontroller proshivkasini o'chirish uchun biz "avrdudeprog" dasturidan foydalanamiz. U umumiy arxivda.

Mikrokontrollerlar ro'yxatidan atmega8 ni tanlang. MK ni tanlagandan so'ng, sug'urta va Qulf bitlari sukut bo'yicha o'rnatilganligi haqida xabar beruvchi oyna paydo bo'ladi.

Keyin Sigortalar yorlig'ini oching. Oddiy so'zlar bilan aytganda Sigortalar MK konfiguratsiya sozlamalari bo'lib, ular bilan o'ynamaslik yaxshiroqdir. Agar siz men bilan bir xil boshqaruvchini sotib olgan bo'lsangiz va sizda tashqi kvarts rezonatori bo'lmasa (siz ichki osilatordan foydalanasiz) soat chastotasi), rasmda ko'rsatilgandek bir xil katakchalarni belgilang. "Teskari" elementning yonida tasdiq belgisi bo'lishi kerak.

Konfiguratsiya qilingan sozlamalar Atmega8A-ga ichki osilatordan (8 MGts soat chastotasi) soatiga qarab o'z ishini bajarish uchun "buyruq" beradi. Sozlamalar kuchga kirishi uchun siz "Dasturlash" tugmasini bosishingiz kerak. Lekin bosishdan oldin hamma narsa to'g'ri o'rnatilganligini ikki marta tekshiring.

"Dastur" sahifasiga qaytish.

Biz dasturga qaysi mikrokontrollerni yondirishimizni aytganimizdan so'ng, biz oxirgi darsda yozgan dasturiy ta'minot faylini tanlaymiz. U HEX kengaytmasiga ega. "Debug" papkasida joylashgan

"Tosh"ni miltillashdan oldin "Hammasini o'chirish" tugmasini bosing. Bu sizni tushunarsiz xatolardan himoya qiladi (agar tosh allaqachon tikilgan bo'lsa-chi):

Ishimiz natijasidan zavqlanamiz :) Davomi bor...

Men MKni o'rganishni assemblerdan boshlash kerakligini bir yoki ikki marta aytganman. Veb-saytdagi butun kurs bunga bag'ishlangan edi (garchi bu juda izchil bo'lmasa-da, lekin asta-sekin men uni mos keladigan ko'rinishga aylantiraman). Ha, bu qiyin, natija birinchi kunida bo'lmaydi, lekin siz boshqaruvchida nima sodir bo'layotganini tushunishni o'rganasiz. Siz uning qanday ishlashini bilib olasiz va boshqa odamlarning manbalarini maymun kabi ko'chirmaysiz va nima uchun u to'satdan ishlamay qolganini tushunishga harakat qilasiz. Bunga qo'shimcha ravishda, C uchun eng mos bo'lmagan paytda pitchfork bilan chiqadigan redneck kodini yaratish ancha oson.

Afsuski, hamma darhol natijalarni xohlaydi. Shuning uchun men boshqa yo'l bilan borishga qaror qildim - C bo'yicha darslik qilish, lekin uning ichki kiyimini ko'rsatish bilan. Yaxshi o'rnatuvchi dasturchi har doim o'z apparat qismini murvatdan mahkam ushlab, ruxsatisiz bir qadam ham tashlashiga yo'l qo'ymaydi. Shunday qilib, avval C kodi bo'ladi, keyin kompilyator nima ishlab chiqargan va barchasi qanday ishlaydi :)

Boshqa tomondan, Xi kuchli nuqta Bu kodni ko'chirish qobiliyati. Agar, albatta, siz hamma narsani to'g'ri yozsangiz. Loyihaning turli qismlariga ish algoritmlari va ularning apparat tadbiqlarini ajratish. Keyin, algoritmni boshqa mikrokontrollerga o'tkazish uchun faqat apparatga barcha qo'ng'iroqlar yoziladigan interfeys qatlamini qayta yozish va barcha ishchi kodni avvalgidek qoldirish kifoya qiladi. Va, albatta, o'qish qobiliyati. C manba kodini bir qarashda tushunish osonroq (garchi... masalan, men nimaga ishora qilishim muhim emas - u C yoki ASM :)), lekin yana, agar hamma narsa to'g'ri yozilgan bo'lsa. Men ham ushbu fikrlarga e'tibor qarataman.

Barcha misollarning sherning ulushi o'rnatiladigan sinov qismi sifatida meniki bo'ladi. rivojlanish kengashi.

AVR uchun birinchi C dasturi

Kompilyatorni tanlash va muhitni sozlash
AVR uchun turli xil C kompilyatorlari mavjud:
Avvalo bu IAR AVR C- deyarli aniq AVR uchun eng yaxshi kompilyator sifatida tan olingan, chunki nazoratchining o'zi Atmel va IAR mutaxassislari o'rtasida yaqin hamkorlikda yaratilgan. Lekin siz hamma narsa uchun to'lashingiz kerak. Va bu kompilyator nafaqat qimmat tijoriy dasturiy ta'minot, balki juda ko'p sozlamalarga egaki, uni oddiygina kompilyatsiya qilish uchun juda ko'p kuch talab etiladi. Men u bilan haqiqatan ham do'stlikni rivojlantirmadim; loyiha ulanish bosqichidagi g'alati xatolar tufayli chirigan edi (keyinchalik bu egri yoriq ekanligini bildim).

Ikkinchi keladi WinAVR GCC- kuchli optimallashtiruvchi kompilyator. To'liq ochiq manba, kross-platforma, umuman olganda, hayotning barcha quvonchlari. Bundan tashqari, u mukammal birlashadi AVR Studio u yerda disk raskadrovka qilish imkonini beradi, bu juda qulay. Umuman olganda, men uni tanladim.

Shuningdek bor CodeVision AVR C juda mashhur kompilyator hisoblanadi. U oddiyligi tufayli mashhur bo'ldi. Ish dasturi Siz uni bir necha daqiqada olishingiz mumkin - boshlang'ich kodi ustasi bunda katta yordam beradi, uartlarning barcha turlarini ishga tushirish uchun standartlarni muhrlaydi. Rostini aytsam, men bunga shubha bilan qarayman - bir marta men ushbu kompilyator tomonidan yozilgan dasturni demontaj qilishim kerak edi, bu kod emas, balki qandaydir tartibsizlik bo'lib chiqdi. Keraksiz harakatlar va operatsiyalarning dahshatli miqdori katta miqdordagi kod va sekin ishlashga olib keldi. Biroq, ehtimol, asl mikrodasturni yozgan odamning DNKsida xatolik yuz bergan. Bundan tashqari, u pulni xohlaydi. IAR kabi ko'p emas, lekin sezilarli. Demo rejimida esa 2kb dan ortiq bo'lmagan kod yozish imkonini beradi.
Albatta, yoriq bor, lekin agar siz o'g'irlamoqchi bo'lsangiz, bu IAR ma'nosida million :)

Hali bor Image Craft AVR C Va MicroC mikroelektronikadan. Men ikkalasini ham ishlatishim shart emas edi, lekin S.W.G. juda maqtovli MicroPascal, deydi ular, juda qulay dasturlash muhiti va kutubxonalar. Menimcha, MicroC bundan ham yomoni bo'lmaydi, lekin u ham to'lanadi.

Aytganimdek, men tanladim WinAVR uchta sababga ko'ra: bu bepul, u AVR Studio bilan birlashadi va u uchun yozilgan. tayyor kod barcha holatlar uchun.

Shunday qilib, WinAVR o'rnatishni AVR Studio bilan yuklab oling. Keyinchalik, avval studiya o'rnatiladi, keyin WinAVR tepaga o'raladi va plagin shaklida studiyaga biriktiriladi. Men WinAVR-ni C:\WinAVR kabi qisqa yo'lda o'rnatishni qat'iy tavsiya qilaman, bu bilan siz yo'llar bilan bog'liq ko'plab muammolardan qochasiz.

Loyiha yaratish
Shunday qilib, studiya o'rnatildi, C vidalandi, biror narsani dasturlashga harakat qilish vaqti keldi. Keling, oddiy, eng oddiyidan boshlaylik. Studiyani ishga tushiring, u erda tanlang yangi loyiha, AVR GCC kompilyatori sifatida va loyiha nomini kiriting.

Ish maydoni bo'sh *.c fayli bilan ochiladi.

Endi studiya xatcho'plarida yo'llarni ko'rsatishni sozlash zarar qilmaydi. Buning uchun quyidagi manzilga o'ting:
Menyu asboblari - Variantlar - Umumiy - FileTabs va ochiladigan ro'yxatdan "Faqat fayl nomi" ni tanlang. Aks holda, ishlash imkonsiz bo'ladi - yorliq faylning to'liq yo'lini o'z ichiga oladi va ekranda ikki yoki uchta yorliqdan ko'p bo'lmaydi.

Loyihani sozlash
Umuman olganda, barcha bog'liqliklar tasvirlangan make faylini yaratish klassik hisoblanadi. Va bu, ehtimol, to'g'ri. Lekin men uchun to'liq integratsiyalangan IDElar bilan o'sgan uVision yoki AVR Studio bu yondashuv juda begona. Shuning uchun men buni o'z yo'limda qilaman, hamma narsa studiya vositalaridan foydalangan holda.

Tugmani tishli quti bilan tiqing.


Bu sizning loyihangiz uchun sozlamalar, aniqrog'i make faylini avtomatik yaratish sozlamalari. Birinchi sahifada siz faqat MK ishlaydigan chastotani kiritishingiz kerak. Bu sug'urta bitlariga bog'liq, shuning uchun bizning chastotamiz 8000000Hz deb taxmin qilamiz.
Shuningdek, optimallashtirish liniyasiga e'tibor bering. Endi -Os bor - bu o'lchamni optimallashtirish. Hozircha shunday qoldiring, keyin siz ushbu parametr bilan o'ynashga harakat qilishingiz mumkin. -O0 umuman optimallashtirish emas.

Keyingi qadam yo'llarni sozlashdir. Avvalo, u erda loyiha katalogingizni qo'shing - u erda siz uchinchi tomon kutubxonalarini qo'shasiz. Ro'yxatda ".\" yo'li paydo bo'ladi.

Make fayli yaratildi, siz uni loyihangizdagi standart papkada ko'rishingiz mumkin, shunchaki ko'rib chiqing va u erda nima borligini ko'ring.


Hozircha hammasi shu. Hamma joyda OK tugmasini bosing va manbaga o'ting.

Muammoni shakllantirish
Bo'sh qog'oz qandaydir ayyor g'oyani amalga oshirishni vasvasaga soladi, chunki diodning oddiy miltillashi endi ishlamaydi. Keling, zudlik bilan buqani shoxlaridan olib, kompyuter bilan aloqani amalga oshiramiz - bu men qiladigan birinchi narsa.

Bu shunday ishlaydi:
MAQOMOTI portiga bitta (kod 0x31) kelganda, biz diodni yoqamiz va nol kelganda (kod 0x30) o'chadi. Bundan tashqari, hamma narsa uzilishlarda amalga oshiriladi va fon vazifasi boshqa diyotning miltillashi bo'ladi. Oddiy va mazmunli.

Sxemani yig'ish
Biz USB-USART konvertor modulini mikrokontrollerning USART pinlariga ulashimiz kerak. Buni amalga oshirish uchun ikkita simdan o'tish moslamasini oling va uni ko'ndalang pinlarga qo'ying. Ya'ni, boshqaruvchining Rx ni konvertorning Tx ga, Tx ni esa boshqaruvchining Rx ga ulaymiz.

Oxir-oqibat, bu diagramma:


Qolgan pinlarni, quvvatni yoki qayta o'rnatishni ulashni o'ylamayman, bu standart.

Kod yozish

Men C tilining o'zi tavsifiga alohida e'tibor bermasligim uchun darhol rezervlashimga ijozat bering. Buning uchun klassik "C dasturlash tili" dan K&R dan turli xil qo'llanmalargacha bo'lgan juda katta miqdordagi materiallar mavjud.

Men o'z qo'limda shunday usullardan birini topdim; Men bir marta bu tilni o'rganish uchun foydalanganman. U erda hamma narsa qisqa, aniq va aniq. Men uni asta-sekin birlashtiraman va veb-saytimga tortaman.

To'g'ri, hali hamma bo'limlar o'tkazilmagan, lekin menimcha, bu uzoq davom etmaydi.

Buni yaxshiroq tasvirlashim dargumon, shuning uchun o'quv kursi, nozikliklarni batafsil tushuntirish o'rniga, men ushbu qo'llanmaning alohida sahifalariga to'g'ridan-to'g'ri havolalar beraman.

Kutubxonalarni qo'shish.
Avvalo, biz kerakli kutubxonalar va ta'riflar bilan sarlavhalarni qo'shamiz. Axir, C universal tildir va biz unga AVR bilan maxsus ishlayotganimizni tushuntirishimiz kerak, shuning uchun manba kodidagi qatorni yozing:

1 #o'z ichiga oladi

#o'z ichiga oladi

Ushbu fayl papkada joylashgan WinAVR va unda boshqaruvchining barcha registrlari va portlarining tavsifi mavjud. Bundan tashqari, u erda hamma narsa ayyor, kompilyator orqali uzatiladigan ma'lum bir kontrollerga bog'langan. qilish parametrdagi fayl MCU va ushbu o'zgaruvchiga asoslanib, loyihangizga ushbu kontroller uchun barcha portlar va registrlar manzillari tavsifi bilan sarlavha fayli ulanadi. Voy-buy! Busiz, bu ham mumkin, lekin keyin siz SREG yoki UDR kabi ramziy registr nomlaridan foydalana olmaysiz va har birining manzilini eslab qolishingiz kerak bo'ladi "0xC1" kabi, bu bosh og'rig'i bo'ladi.

Jamoaning o'zi #o'z ichiga oladi<имя файла> loyihangizga har qanday turdagi tarkibni qo'shish imkonini beradi matn fayli, masalan, funktsiyalar tavsifi yoki boshqa kodning bir qismi bo'lgan fayl. Va direktiv ushbu faylni topishi uchun biz loyihamizga yo'lni belgilab oldik (WinAVR katalogi sukut bo'yicha u erda allaqachon ro'yxatdan o'tgan).

Asosiy funktsiya.
C dasturi butunlay funksiyalardan iborat. Ularni har qanday tartibda joylashtirish va bir-biridan chaqirish mumkin turli yo'llar bilan. Har bir funktsiya uchta talab qilinadigan parametrga ega:

  • Qaytish qiymati, masalan. gunoh(x) x ning sinus qiymatini qaytaradi. Qisqasi, matematikada bo'lgani kabi.
  • O'tkazilgan parametrlar bir xil X.
  • Funktsiya tanasi.

O'tkazilgan va qaytarilgan barcha qiymatlar ma'lumotlarga qarab qandaydir turdagi bo'lishi kerak.

Har qanday C dasturi funksiyani o'z ichiga olishi kerak asosiy asosiy dasturga kirish nuqtasi sifatida, aks holda u umuman C emas :). Birovning manba kodida millionlab fayllardan main mavjudligi bilan siz bu dasturning asosiy qismi ekanligini tushunishingiz mumkin, bu erda hamma narsa boshlanadi. Shunday qilib, so'raylik:

1 2 3 4 5 int main(void) (qaytish 0; )

int main(void) (qaytish 0; )

Hammasi shu eng oddiy dastur yozilgan, u hech narsa qilmasligi muhim emas, biz endi boshladik.

Keling, nima qilganimizni aniqlaymiz.
int Bu asosiy funktsiya qaytaradigan ma'lumotlar turi.

Albatta, mikrokontrollerda asosiy printsipial jihatdan hech narsani qaytarib bo'lmaydi va nazariy jihatdan bo'lishi kerak asosiy bekor (bo'sh), lekin GCC dastlab kompyuter uchun mo'ljallangan va u erda dastur qiymatni qaytarishi mumkin operatsion tizim tugagandan so'ng. Shuning uchun GCC yoqilgan asosiy bekor (bo'sh) Ogohlantirish bilan qasam ichadi.

Bu xato emas, u ishlaydi, lekin men ogohlantirishlarni yoqtirmayman.

bekor bu biz funksiyaga uzatadigan ma'lumotlar turi, bu holda asosiy tashqaridan ham hech narsani qabul qila olmaydi, shuning uchun bekor- qo'g'irchoq. Hech narsa uzatish yoki qaytarish kerak bo'lmaganda stub ishlatiladi.

Mana ular { } jingalak qavslar dastur bloki, bu holda funksiya tanasi asosiy, kod u erda joylashgan bo'ladi.

qaytish- bu asosiy funktsiya tugallangandan so'ng qaytariladigan qaytariladigan qiymat, chunki bizda int, ya'ni raqam bor, u holda biz raqamni qaytarishimiz kerak. Garchi bu hali ham mantiqiy bo'lmasa ham, chunki ... mikrokontrollerda biz faqat asosiydan hech qaerga keta olmaymiz. Men nullni qaytaraman. Chunki bu muhim emas. Ammo kompilyator odatda aqlli va bu holat uchun kod yaratmaydi.
Garchi, agar buzuq bo'lsa, keyin dan asosiy Siz MK-ga borishingiz mumkin - masalan, yuklash bo'limiga tushib, uni ishga tushiring, ammo bu o'tish manzillarini to'g'rilash uchun proshivka bilan past darajadagi ishlov berishni talab qiladi. Quyida siz o'zingiz ko'rasiz va buni qanday qilishni tushunasiz. Nima uchun? Bu boshqa savol, 99,999% hollarda bu kerak emas :)

Biz buni qildik va davom etdik. Keling, o'zgaruvchini qo'shamiz, bizga u haqiqatan ham kerak emas va usiz o'zgaruvchilarni kiritishning ma'nosi yo'q, lekin biz o'rganyapmiz. Agar o'zgaruvchilar funktsiya tanasiga qo'shilsa, ular mahalliy bo'lib, faqat shu funktsiyada mavjud. Funktsiyadan chiqqaningizda, bu o'zgaruvchilar o'chiriladi va RAM xotirasi muhimroq ehtiyojlar uchun ajratiladi. .

1 2 3 4 5 6 int main(void) (imzosiz char i; qaytish 0; )

int main(void) (imzosiz char i; qaytish 0; )

imzosiz imzosiz degan ma'noni anglatadi. Gap shundaki, ikkilik ko'rinishda eng muhim bit belgiga ajratilgan, ya'ni +127/-128 soni bir baytga (char) to'g'ri keladi, ammo agar belgi tashlansa, u 0 dan to'g'ri keladi. 255. Odatda belgi kerak emas. Shunday qilib imzosiz.
i faqat oʻzgaruvchan nomi. Boshqa emas; boshqa ... bo'lmaydi; Endi yo'q.

Endi biz portlarni ishga tushirishimiz kerak va UART. Albatta, siz kutubxonani olib, ulashingiz va qandaydir UartInit (9600) ga qo'ng'iroq qilishingiz mumkin; lekin keyin aslida nima bo'lganini bilmay qolasiz.

Biz buni qilamiz:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int main(void ) ( unsigned char i; #define XTAL 8000000L #define boudrate 9600L #boddividerni aniqlang (XTAL/(16*baudrate)-1)#define HI(x) ((x)>>8) #define LO(x) ((x)& 0xFF) UBRRL = LO(bauddivider) ; UBRRH = HI(bauddivider) ; UCSRA = 0; UCSRB = 1<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

int main(void) ( unsigned char i; #define XTAL 8000000L #define boudrate 9600L #define bouddivider (XTAL/(16*baudrate)-1) #define HI(x) ((x)>>8) #define LO( x) ((x)& 0xFF) UBRRL = LO(bo'luvchi); UBRRH = HI(bo'luvchi); UCSRA = 0; UCSRB = 1<

Qo'rqinchlimi? Aslida, haqiqiy kodning faqat beshta oxirgi satri mavjud. Hamma narsa, bu #aniqlash Bu protsessorli so'l tildir. Assambleyadagi kabi deyarli bir xil narsalar, ammo sintaksis biroz boshqacha.

Ular kerakli koeffitsientlarni hisoblash bo'yicha muntazam operatsiyalaringizni osonlashtiradi. Birinchi qatorda biz buni o'rniga aytamiz XTAL 8000000 ni xavfsiz almashtirishingiz mumkin va L- turni ko'rsatish, long deyish protsessorning taktli chastotasi. Xuddi shu baudrate— UART orqali ma'lumotlarni uzatish chastotasi.

bauddivider allaqachon murakkabroq, uning o'rniga oldingi ikkita formuladan foydalangan holda hisoblangan ifoda almashtiriladi.
Xo'sh va L.O. Va Salom past va yuqori baytlar bu natijadan olinadi, chunki Bu bir baytga sig'masligi aniq. IN Salom X (makros kiritish parametri) sakkiz marta o'ngga siljiydi, natijada faqat eng muhim bayt qoladi. Va ichida L.O. biz 00FF raqami bilan bitli VA qilamiz, natijada faqat past bayt qoladi.

Shunday qilib, qilingan hamma narsa xuddi shunday #aniqlash siz uni xavfsiz tashlab yuborishingiz va kalkulyatorda kerakli raqamlarni hisoblashingiz va ularni darhol UBBRL = ... qatorlariga kiritishingiz mumkin. va UBBRH = …..

mumkin. Lekin! Buni qiling MUTLAK MUMKIN EMAS!

Bu shunday yoki boshqa tarzda ishlaydi, lekin sizda shunday bo'ladi sehrli raqamlar- hech qayerdan va noma'lum sabablarga ko'ra olingan qadriyatlar va agar siz bir necha yil ichida bunday loyihani ochsangiz, bu qadriyatlar nima ekanligini tushunish juda qiyin bo'ladi. Hozir ham, agar siz tezlikni o'zgartirmoqchi bo'lsangiz yoki kvarts chastotasini o'zgartirmoqchi bo'lsangiz, hamma narsani qayta hisoblashingiz kerak bo'ladi, lekin siz koddagi bir nechta raqamni o'zgartirdingiz va tamom. Umuman olganda, agar siz kodlovchi sifatida brend bo'lishni xohlamasangiz, kodingizni o'qish, tushunarli va o'zgartirish oson bo'lishi uchun yarating.

Keyin hamma narsa oddiy:
Bularning barchasi "UBRRL va Co" UART uzatgichining konfiguratsiya registrlari bo'lib, ular yordamida biz dunyo bilan bog'lanamiz. Va endi biz ularga kerakli qiymatlarni tayinladik, ularni kerakli tezlik va rejimga o'rnatdik.

Yozib olish turi 1< Quyidagi ma'noni anglatadi: 1-ni oling va uni joyiga qo'ying RXEN baytda. RXEN bu registrning 4-biti UCSRB, shunday qilib 1< 00010000 ikkilik sonini hosil qiladi, TXEN- bu 3-bit va 1< 00001000 beradi. Yagona "|" bu bitli YOKI, shuning uchun 00010000 | 00001000 = 00011000. Xuddi shu tarzda, qolgan kerakli konfiguratsiya bitlari o'rnatiladi va umumiy yig'inga qo'shiladi. Natijada, yig'ilgan raqam UCSRBda qayd etiladi. Batafsil ma'lumotlar USART bo'limidagi MK ma'lumotlar jadvalida tasvirlangan. Shunday ekan, keling, texnik tafsilotlar bilan chalg'ib qolmaylik.

Bajarildi, nima bo'lganini ko'rish vaqti keldi. Kompilyatsiyani bosing va emulyatsiyani boshlang (Ctrl + F7).

Nosozliklarni tuzatish
Har qanday progress barlari o'tib ketdi, studiya o'zgardi va asosiy funktsiyaga kirish yonida sariq o'q paydo bo'ldi. Bu protsessor hozirda ishlayotgan va simulyatsiya to'xtatilgan joy.

Gap shundaki, dastlab, aslida u UBRRL = LO(boddivider) liniyasida edi; Axir, bizda aniqlangan narsa kod emas, balki oddiygina dastlabki hisob-kitoblardir, shuning uchun simulyator biroz zerikarli. Ammo endi u tushundi, birinchi ko'rsatma bajarildi va agar siz daraxtga chiqsangiz I/U ko'rinishi, USART bo'limiga o'ting va u erda UBBRL baytiga qarang, qiymat allaqachon mavjud ekanligini ko'rasiz! 0x33.

Uni bir qadam oldinga olib boring. Boshqa registrning mazmuni qanday o'zgarishini ko'ring. Shunday qilib, ularning barchasini ko'rib chiqing, barcha ko'rsatilgan bitlar men aytganimdek o'rnatilganligiga e'tibor bering va ular bir vaqtning o'zida butun bayt uchun o'rnatiladi. Bu Return-dan boshqa uzoqqa bormaydi - dastur tugadi.

Ochilish
Endi simulyatsiyani nolga qaytaring. U yerga bosing Qayta tiklash (Shift+F5). Demontaj qilingan ro'yxatni oching, endi siz boshqaruvchida nima sodir bo'layotganini ko'rasiz. Ko'rish -> Disassembler. Va YYAAAAAAA emas!!! Assembler!!! DAXSHAT!!! KERAK. Shunday qilib, keyinchalik, biror narsa noto'g'ri bo'lganda, siz kodda ahmoq bo'lmaysiz va forumlarda oqsoqlangan savollarni bermaysiz, balki darhol ichakka kiring va qayerda qolib ketganingizni ko'ring. U erda qo'rqinchli narsa yo'q.

Avvaliga seriyadan toplar bo'ladi:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +00000000: 940C002A JMP 0x0000002A O'tish +00000002: 940C0034 JMP 0x00000034 O'tish +00000004: 940C0034 JMP 0x040000 J030000000 0x00000034 O'tish +00000008: 940C0034 JMP 0x00000034 O'tish +0000000A: 940C0034 JMP 0x00000034 O'tish +0000000C: 9400000C: 9400000C: 940MP0000 O'tish 0x00000034 O'tish +00000016: 940C0034 JMP 0x00000034 O'tish +00000018: 940C0034 JMP 0x00000034 O'tish +0000001A: 9400001A: 9400000003400000C : 940C0034 JMP 0x00000034 O'tish +0000001E: 940C0034 JMP 0x00000034 O'tish +00000020: 940C0034 JMP 0x00000034 O'tish +0000000 J04000 34 O'tish +00000024: 940C0034 JMP 0x00000034 O'tish +00000026: 940C0034 JMP 0x00000034 O'tish +00000028: 940C0034 JMP004

O‘tish 0x00000034 O'tish +00000008: 940C0034 JMP 0x00000034 O'tish +0000000A: 940C0034 JMP 0x00000034 O'tish +0000000C: 9400000C: 94000000034JMP00000 : 940C0034 JMP 0x00000034 O'tish +00000010: 940C0034 JMP 0x00000034 O'tish +00000012: 940C0034 JMP 0x00000030 O'tish +00000030 J040000 J04000 O‘tish : 940C0034 JMP 0x00000034 O'tish +0000001E: 940C0034 JMP 0x00000034 O'tish +00000020: 940C0034 JMP 0x00000034 O'tish +0000000 J04000 34 O'tish +00000024: 940C0034 JMP 0x00000034 O'tish +00000026: 940C0034 JMP 0x00000034 O'tish +00000028: 940C0034 JMP004

Bu uzilish vektor jadvali. Biz unga keyinroq qaytamiz, ammo hozircha uning mavjudligini ko'rib chiqing va eslang. Birinchi ustunda buyruq joylashgan flesh katak manzili, ikkinchisi buyruq kodi, uchinchisi buyruq mnemonikasi, bir xil montaj ko'rsatmasi, uchinchisi buyruq operandlari. Xo'sh, avtomatik izoh.
Shunday qilib, agar qarasangiz, doimiy o'tishlar mavjud. Va JMP buyruq kodi to'rt baytdan iborat bo'lib, u orqaga yozilgan o'tish manzilini o'z ichiga oladi - past manzildagi past bayt va o'tish buyrug'i kodi 940C

0000002B: BE1F OUT 0x3F, R1 chiqish kirish/chiqarish joyiga

Ushbu nolni 0x3F manzilida yozib olish.I/U ko'rish ustuniga qarasangiz, 0x3F manzili SREG registrining manzili - kontrollerning bayroq registri ekanligini ko'rasiz. Bular. dasturni nol sharoitda ishga tushirish uchun SREG ni qayta o'rnatamiz.

1 2 3 4 +0000002C: E5CF LDI R28,0x5F Darhol yuklang +0000002D: E0D4 LDI R29,0x04 Darhol yuklang +0000002E: BFDE OUT 0x3E, R29 Kirish-chiqarish joyiga chiqish +0000000, I/U joyiga chiqish +0000000, O2FD uchun chiqish: B02D

0000002C: E5CF LDI R28,0x5F Darhol yuklang +0000002D: E0D4 LDI R29,0x04 Darhol yuklang +0000002E: BFDE OUT 0x3E, R29 Kirish/chiqish joyiga chiqish +0000000, I/U joyiga chiqish +0000000, O2FD uchun chiqish: B02F

Bu stek ko'rsatkichini yuklamoqda. Siz kiritish-chiqarish registrlariga bevosita yuklay olmaysiz, faqat oraliq registr orqali. Shuning uchun, birinchi LDI oraliq, keyin esa u erdan OUT I/O ga. Men sizga keyinroq stack haqida ko'proq aytib beraman. Hozircha, bu RAM oxirida osilgan va manzillar va oraliq o'zgaruvchilarni saqlaydigan dinamik xotira maydoni ekanligini biling. Endi biz stekimiz qayerdan boshlanishini ko'rsatdik.

00000032: 940C0041 JMP 0x00000041 Oʻtish

Dasturning oxiriga o'ting va bizda uzilishlar va o'z-o'zidan mahkam bog'lanish taqiqlangan:

1 2 +00000041: 94F8 CLI Global uzilishni o'chirish +00000042: CFFF RJMP PC-0x0000 Nisbiy o'tish

00000041: 94F8 CLI Global uzilishni o'chirish +00000042: CFFF RJMP PC-0x0000 Nisbiy o'tish

Bu kutilmagan vaziyatlarda, masalan, asosiy funktsiyadan chiqishda. Tekshirgichni bunday halqadan apparatni qayta o'rnatish yoki, ehtimol, qo'riqchi tomonidan qayta o'rnatish orqali chiqarish mumkin. Xo'sh, yoki, yuqorida aytganimdek, buni olti burchakli muharrirda tuzating va yuragimiz xohlagan joyga yuguring. Shuni ham yodda tutingki, o'tishning ikki turi mavjud: JMP va RJMP; birinchisi, manzilga to'g'ridan-to'g'ri o'tish. U to'rt baytni egallaydi va to'g'ridan-to'g'ri butun xotira maydoni bo'ylab o'tishi mumkin. O'tishning ikkinchi turi RJMP - nisbiy. Uning buyrug'i ikki baytni oladi, lekin u joriy pozitsiyadan (manzil) 1024 qadam oldinga yoki orqaga siljiydi. Va uning parametrlari joriy nuqtadan ofsetni ko'rsatadi. U tez-tez ishlatiladi, chunki bir yuvishda bo'sh joyning yarmini egallaydi va uzoq o'tishlar kamdan-kam hollarda kerak bo'ladi.

1 +00000034: 940C0000 JMP 0x00000000 O'tish

00000034: 940C0000 JMP 0x00000000 Oʻtish

Va bu kodning eng boshiga sakrash. Qayta ishga tushirish. Bu erda barcha vektorlarning sakrashini tekshirishingiz mumkin. Bundan xulosa shuki, agar siz hozir uzilishlarni yoqsangiz (ular sukut bo'yicha o'chirilgan) va sizning uzilish sodir bo'lsa, lekin ishlov beruvchi yo'q bo'lsa, dasturiy ta'minot qayta o'rnatiladi - dastur eng boshidan qaytariladi.

Asosiy funktsiya. Hammasi o'xshash, hatto tasvirlashning hojati yo'q. Registrlarga kiritilgan allaqachon hisoblangan raqamga qarang. Kompilyatorning dastlabki protsessori qoyil qoldi!!! Shunday qilib, "sehrli" raqamlar yo'q!

1 2 3 4 5 6 7 8 9 10 11 12 <

00000036: E383 LDI R24,0x33 Darhol yuklang +00000037: B989 OUT 0x09,R24 Kirish/chiqarish joyiga chiqish 15: UBRRH = HI(bauddivider); +00000038: BC10 OUT 0x20,R1 16-chi kirish/chiqarish joyiga chiqish: UCSRA = 0; +00000039: B81B OUT 0x0B, R1 I/U manziliga chiqish 17: UCSRB = 1<

Va bu xato:

1 2 3 +0000003E: E080 LDI R24.0x00 Darhol yuklash +0000003F: E090 LDI R25.0x00 Darhol yuklash +00000040: 9508 RET Pastki dasturni qaytarish

0000003E: E080 LDI R24.0x00 Darhol yuklash +0000003F: E090 LDI R25.0x00 Darhol yuklash +00000040: 9508 RET Pastki dasturni qaytarish

Savol shundaki, nega kompilyator bunday tepalarni qo'shadi? Va bu Return 0 dan boshqa narsa emas, biz funktsiyani int main(void) deb belgilab oldik va shuning uchun biz yana to'rt baytni bekorga sarfladik :) Va agar siz void main(void) qilsangiz, faqat RET qoladi, lekin ogohlantirish paydo bo'ladi. , bizning asosiy funksiyamiz hech narsani qaytarmaydi. Umuman olganda, xohlaganingizcha qiling :)

Qiyinmi? Ko'rinishidan, yo'q. Disassembler rejimida bosqichma-bosqich bajarish tugmasini bosing va protsessor individual ko'rsatmalarni qanday bajarishini, registrlar bilan nima sodir bo'lishini ko'ring. Buyruqlar bo'ylab harakatlanish va yakuniy tsikl qanday sodir bo'ladi?

Bir necha kundan keyin davom etadi...

Offtop:
Aleksey78 Men Firefox uchun plaginni yaratdim, bu mening saytim va forumimga o'tishni osonlashtiradi.
Munozara va yuklab olish,

Vazifa: Keling, bitta LEDni boshqarish dasturini ishlab chiqaylik. Tugma bosilganda, LED yonadi va qo'yib yuborilganda u o'chadi.

Birinchidan, qurilmaning sxematik diagrammasini ishlab chiqamiz. I/U portlari har qanday tashqi qurilmalarni mikrokontrollerga ulash uchun ishlatiladi. Portlarning har biri ham kirish, ham chiqish sifatida ishlashga qodir. Keling, LEDni portlardan biriga, tugmani esa boshqasiga ulaymiz. Ushbu tajriba uchun biz boshqaruvchidan foydalanamiz Atmega8. Ushbu chip 3 ta kiritish/chiqarish portiga ega, 2 ta sakkiz bitli va 1 ta o'n olti bitli taymer/taymerga ega. Shuningdek, bortda 3-kanalli PWM, 6-kanalli 10-bitli analog-raqamli konvertor va boshqalar mavjud. Menimcha, mikrokontroller dasturlash asoslarini o'rganish uchun juda yaxshi.

LEDni ulash uchun biz PB0 chizig'idan foydalanamiz va tugmadan ma'lumotni o'qish uchun biz PD0 chizig'idan foydalanamiz. Diagramma 1-rasmda ko'rsatilgan.

Guruch. 1

R2 rezistori orqali PD0 kirishiga qo'shimcha besleme kuchlanishi beriladi, bu mantiqiy bitta signalga mos keladi. Tugma yopilganda, kuchlanish nolga tushadi, bu mantiqiy nolga to'g'ri keladi. Kelajakda R2 sxemadan chiqarib tashlanishi mumkin, uni ichki yuk qarshiligi bilan almashtirib, dasturga kerakli sozlamalarni kiritadi. LED oqim cheklovchi R3 rezistori orqali PB0 portining chiqishiga ulangan. LEDni yoqish uchun siz PB0 liniyasiga mantiqiy bitta signalni qo'llashingiz kerak. Biz 4 MGts chastotada ichki asosiy soat generatoridan foydalanamiz, chunki qurilma chastota barqarorligi uchun yuqori talablarga ega emas.

Endi dasturni yozamiz. Men dasturlarni yozish uchun dasturlash muhitidan foydalanaman AVR Studio Va WinAvr. AVR Studio-ni oching, xush kelibsiz oynasi ochiladi, "Yangi loyiha yaratish" tugmasini bosing, so'ngra loyiha turini tanlang - AVR GCC, loyiha nomini yozing, masalan, "cod1", "Loyiha papkasini yaratish" va "Yaratish" ni tekshiring. ishga tushirish fayli" katakchalarini belgilang, "Keyingi" tugmasini bosing, chap oynada "AVR Simulator" ni tanlang va o'ng oynada "Atmega8" mikrokontroller turini tanlang, "Finish" tugmasini bosing, muharrir va loyiha toifasi daraxti ochiladi - dastlabki sozlamalar tugallandi.

Birinchidan, tashqi fayllarni biriktirish uchun operator yordamida Atmega8 uchun standart tavsif matnini qo'shamiz: #o'z ichiga oladi

direktiv sintaksisi #o'z ichiga oladi

#o'z ichiga oladi<имя_файла.h>
# "fayl nomi.h" ni kiriting

Burchakli qavslar< и >kompilyatorga kiritilgan fayllarni birinchi navbatda "include" nomli standart WinAvr papkasida izlash kerakligini ko'rsating. Ikki qo'shtirnoq " va " kompilyatorga loyiha saqlanadigan katalogda qidirishni boshlashni aytadi.

Mikrokontrollerning har bir turi o'z sarlavha fayliga ega. ATMega8 uchun bu fayl iom8.h, ATtiny2313 uchun - iotn2313.h deb ataladi. Har bir dasturning boshida biz foydalanayotgan mikrokontrollerning sarlavha faylini kiritishimiz kerak. Ammo io.h nomli umumiy sarlavha fayli ham mavjud. Preprotsessor ushbu faylni qayta ishlaydi va loyiha sozlamalariga qarab, bizning dasturimizga kerakli sarlavha faylini o'z ichiga oladi.

Biz uchun dasturning birinchi qatori quyidagicha ko'rinadi:

#o'z ichiga oladi

Har qanday C dasturi bitta asosiy funktsiyani o'z ichiga olishi kerak. U asosiy deb nomlanadi. Dasturning bajarilishi har doim asosiy funktsiyani bajarishdan boshlanadi. Funktsiya sarlavhaga ega - int main(void) va tanasi - jingalak qavslar () bilan ajratilgan.

int asosiy (yaroqsiz)
{
funktsiya tanasi
}

Biz kodimizni funksiya tanasiga qo'shamiz. Qaytish turi funksiya nomidan oldin ko'rsatilgan. Agar funktsiya qiymatni qaytarmasa, kalit ishlatiladi bekor.

int- bu 2 baytlik butun son, qiymatlar diapazoni - 32768 dan 32767 gacha

Funksiya nomidan keyin funksiya chaqirilganda unga uzatiladigan parametrlar qavs ichida ko'rsatilgan (). Agar funktsiyada hech qanday parametr bo'lmasa, kalit so'z ishlatiladi bekor. Funktsiya asosiy buyruqlar to'plamini, tizim sozlamalarini va asosiy dastur tsiklini o'z ichiga oladi.

Keyin biz portni sozlaymiz D kiraverishda. Portning ishlash rejimi registrning mazmuni bilan belgilanadi DDRD(ma'lumot uzatish yo'nalishi reestri). Biz ushbu registrga "0x00" raqamini (0b0000000 - ikkilik shaklda) yozamiz; tugmachadan tashqari bu portga hech narsa ulanmagan, shuning uchun biz butun D portini kirish sifatida sozlaymiz. Siz registrning har bir bitiga (0-kirish, 1-chiqish) 0 yoki 1 raqamlarini yozish orqali portni bit-bit sozlashingiz mumkin, masalan, DDRD = 0x81 (0b10000001) - D portining birinchi va oxirgi qatorlari quyidagicha ishlaydi. chiqish, qolganlari kirish sifatida. Ichki yuk qarshiligi ham ulanishi kerak. PORTx registri port kiritish rejimida bo'lganda ichki rezistorlar yoqilgan yoki o'chirilganligini nazorat qiladi. Keling, u erda birliklarni yozamiz.

Portni sozlash B chiqishga. Portning ishlash rejimi registrning mazmuni bilan belgilanadi DDRB. Portga LEDdan boshqa hech narsa yo'q B ulanmagan, shuning uchun butun portni chiqish sifatida sozlash mumkin. Bu registrga yozish orqali amalga oshiriladi DDRB"0xFF" raqamlari. LEDni birinchi marta yoqqaningizda yonib ketishining oldini olish uchun portga yozing B mantiqiy nollar. Bu ro'yxatga olish orqali amalga oshiriladi PORTB= 0x00;

Qiymatlarni belgilash uchun "=" belgisi qo'llaniladi va "teng" belgisi bilan adashtirmaslik uchun belgilash operatori deb ataladi.

Port konfiguratsiyasi quyidagicha ko'rinadi:

DDRD = 0x00;
PORTD = 0xFF;
DDRB = 0xFF;
PORTB = 0x00;

Biz dasturning asosiy tsiklini yozamiz. esa(ingliz tilidan "while") - bu buyruq shart bajarilmaguncha, ya'ni qavs ichidagi ifoda to'g'ri bo'lgunga qadar tsiklning tanasini ko'p marta takrorlab, tsiklni tashkil qiladi. C tilida ifoda nolga teng bo'lmasa to'g'ri, bo'lsa noto'g'ri deb hisoblanadi.

Buyruq shunday ko'rinadi:

while (shart)
{
halqa tanasi
}

Bizning holatda, asosiy tsikl faqat bitta buyruqdan iborat bo'ladi. Bu buyruq registrni tayinlaydi PORTB registr qiymati teskari bo'lishi kerak PORTD.

PORTB = ~PIND; // D portidagi qiymatni oling, uni o'zgartiring va PORTB ga belgilang (PORTB ga yozing)

// C ifodalari o'ngdan chapga o'qiladi

PIND ma'lumotlarni kiritish registri. Tekshirish moslamasining tashqi chiqishidan ma'lumotni o'qish uchun siz avval portning kerakli bitini kirish rejimiga o'tkazishingiz kerak. Ya'ni, registrning tegishli bitiga yozing DDRx nol. Shundan keyingina ushbu pinga tashqi qurilmadan raqamli signal berilishi mumkin. Keyinchalik, mikrokontroller baytni registrdan o'qiydi PINx. Tegishli bitning tarkibi portning tashqi pinidagi signalga mos keladi. Bizning dasturimiz tayyor va quyidagicha ko'rinadi:

#o'z ichiga oladi int main (void) ( DDRD = 0x00; // port D - kirish PORTD = 0xFF; // yuk qarshiligini ulang DDRB = 0xFF; // B porti - chiqish PORTB = 0x00; // chiqishni 0 ga o'rnating while(1) ) ( PORTB = ~PIND; //~ bitli inversiya belgisi ))

Sharhlar C tilida keng qo'llaniladi. Yozishning ikki yo'li mavjud.

/*Izoh*/
//Izoh

Bunday holda, kompilyator izohda yozilgan narsalarga e'tibor bermaydi.

Agar siz xuddi shu dasturdan foydalansangiz va 2-rasmda ko'rsatilganidek, 8 tugma va 8 LEDni mikrokontrollerga ulasangiz, u holda portning har bir biti aniq bo'ladi. D uning port bitiga mos keladi B. SB1 tugmachasini bosish bilan HL1 yonadi, SB2 tugmachasini bosish bilan HL2 yonadi va hokazo.

2-rasm

Maqolada A.V.Belov kitobidan olingan materiallar ishlatilgan. "AVR qurilmalarini ishlab chiquvchilar uchun qo'llanma"

Atmega8 mikrokontrollerlari o'z oilasining eng mashhur vakillaridir. Ko'p jihatdan, ular, bir tomondan, ishlashning soddaligi va tushunarli tuzilishga, boshqa tomondan, juda keng funksionallikka qarzdor. Ushbu maqola yangi boshlanuvchilar uchun Atmega8 dasturlashni qamrab oladi.

umumiy ma'lumot

Mikrokontrollerlar hamma joyda mavjud. Ularni muzlatgichlar, kir yuvish mashinalari, telefonlar, zavod mashinalari va boshqa ko'plab texnik qurilmalarda topish mumkin. Mikrokontrollerlar oddiydan o'ta murakkabgacha. Ikkinchisi sezilarli darajada ko'proq xususiyatlar va funksionallikni taklif qiladi. Ammo murakkab texnologiyani darhol tushuna olmaysiz. Dastlab, siz oddiy narsani o'zlashtirishingiz kerak. Va Atmega8 namuna sifatida olinadi. Uning malakali arxitekturasi va qulay interfeysi tufayli dasturlash qiyin emas. Bundan tashqari, u ko'pchilikda foydalanish uchun etarli ko'rsatkichga ega, bundan tashqari ular sanoatda ham qo'llaniladi. Atmega8 holatida dasturlash AVR (C/Assembler) kabi tillarni bilishni talab qiladi. Qayerdan boshlash kerak? Ushbu texnologiyani o'zlashtirish uchta usulda mumkin. Va har kim Atmega8 bilan ishlashni qaerdan boshlashni o'zi tanlaydi:

  1. Arduino orqali dasturlash.
  2. Tayyor qurilmani sotib olish.
  3. Mikrokontrollerni o'z-o'zidan yig'ish.

Biz birinchi va uchinchi fikrlarni ko'rib chiqamiz.

Arduino

Bu turli xil qurilmalarni tezda yaratish uchun mos bo'lgan shaklda yaratilgan qulay platforma. Kengashda mikrokontrollerning o'zi, uning jabduqlari va dasturchisi ko'rinishida kerak bo'lgan hamma narsa mavjud. Ushbu yo'ldan borish orqali odam quyidagi imtiyozlarga ega bo'ladi:

  1. Past chegara talablari. Texnik qurilmalarni ishlab chiqish uchun maxsus ko'nikmalarga ega bo'lishingiz shart emas.
  2. Qo'shimcha tayyorgarliksiz ulanish uchun elementlarning keng doirasi mavjud bo'ladi.
  3. Rivojlanishning tez boshlanishi. Arduino bilan siz to'g'ridan-to'g'ri qurilmalar yaratishga o'tishingiz mumkin.
  4. Ko'p sonli o'quv materiallari va turli dizaynlarni amalga oshirish misollarining mavjudligi.

Ammo ma'lum kamchiliklar ham mavjud. Shunday qilib, Arduino dasturlash Atmega8 mikrokontroller dunyosiga chuqurroq kirib borishga va ko'plab foydali jihatlarni tushunishga imkon bermaydi. Bundan tashqari, siz AVR (C/Assembler) tomonidan qo'llaniladigan tillardan farq qiladigan dasturlash tilini o'rganishingiz kerak bo'ladi. Va yana bir narsa: Arduino juda tor modellarga ega. Shuning uchun, ertami-kechmi platalarda ishlatilmaydigan mikrokontrollerdan foydalanish kerak bo'ladi. Ammo umuman olganda, bu Atmega8 bilan ishlash uchun yaxshi variant. Arduino orqali dasturlash sizga elektronika olamida ishonchli boshlash imkonini beradi. Va inson muvaffaqiyatsizliklar va muammolar tufayli taslim bo'lishi dargumon.

O'z-o'zini yig'ish

Do'stona dizayn tufayli siz ularni o'zingiz qilishingiz mumkin. Axir, bu arzon, arzon va oddiy komponentlarni talab qiladi. Bu sizga Atmega8 mikrokontrollerining dizaynini sinchkovlik bilan o'rganish imkonini beradi, uni yig'ishdan keyin dasturlash osonroq ko'rinadi. Bundan tashqari, agar kerak bo'lsa, muayyan vazifa uchun boshqa komponentlarni mustaqil ravishda tanlashingiz mumkin. To'g'ri, bu erda ma'lum bir kamchilik bor - murakkablik. Kerakli bilim va ko'nikmalarga ega bo'lmaganda mikrokontrollerni mustaqil ravishda yig'ish oson emas. Biz ushbu variantni ko'rib chiqamiz.

Yig'ish uchun nima kerak?

Avval siz Atmega8-ning o'zini olishingiz kerak. Bilasizmi, usiz mikrokontrollerni dasturlash mumkin emas. Bu bir necha yuz rublga tushadi - munosib funksionallikni ta'minlash bilan birga. Atmega8 qanday dasturlashtiriladi degan savol ham bor. USBAsp o'zini juda yaxshi isbotlagan juda yaxshi qurilma. Ammo siz boshqa dasturchidan foydalanishingiz mumkin. Yoki uni o'zingiz yig'ing. Ammo bu holda, agar noto'g'ri yaratilgan bo'lsa, u mikrokontrollerni ishlamaydigan plastmassa va temir parchasiga aylantirish xavfi mavjud. Bundan tashqari, non doskasi va jumpers ham zarar qilmaydi. Ular shart emas, lekin asab va vaqtni tejaydi. Va nihoyat, sizga 5V quvvat manbai kerak.

Misol yordamida yangi boshlanuvchilar uchun Atmega8 dasturlash

Keling, umuman olganda, qurilma qanday yaratilganligini ko'rib chiqaylik. Aytaylik, bizda mikrokontroller, LED, rezistor, dasturchi, ulash simlari va quvvat manbai mavjud. Birinchi qadam mikrodasturni yozishdir. Bu maxsus formatdagi yakuniy fayl sifatida taqdim etilgan mikrokontroller uchun buyruqlar to'plami sifatida tushuniladi. Barcha elementlarning ulanishini, shuningdek, ular bilan o'zaro ta'sirini ko'rsatish kerak. Shundan so'ng siz sxemani yig'ishni boshlashingiz mumkin. VCC pinini quvvatlantirish kerak. Qurilmalar va elementlar bilan ishlash uchun mo'ljallangan har qanday boshqasiga birinchi navbatda rezistor, keyin esa LED ulanadi. Bunday holda, birinchisining kuchi ikkinchisining quvvat talablariga bog'liq. Siz quyidagi formuladan foydalanishingiz mumkin: R=(Up-Ups)/Is. Bu erda p - quvvat va s - LED. Tasavvur qilaylik, bizda 2V iste'mol qiladigan va 10 mA ta'minot oqimini talab qiladigan LED bor, uni matematik operatsiyalar uchun qulayroq shaklga aylantiring va 0,01A oling. Keyin formula quyidagicha ko'rinadi: R=(5V-2V)/0,01A=3V/0,01A=300 Ohm. Ammo amalda ko'pincha ideal elementni tanlash mumkin emas. Shuning uchun eng mos keladigani olinadi. Ammo siz matematik tarzda olingan qiymatdan yuqori qarshilikka ega qarshilikdan foydalanishingiz kerak. Ushbu yondashuv tufayli biz uning xizmat muddatini uzaytiramiz.

Keyingisi nima?

Shunday qilib, bizda kichik diagramma bor. Endi dasturchini mikrokontrollerga ulash va uning xotirasiga yaratilgan proshivkani yozish qoladi. Bu erda bitta nuqta bor! Sxemani qurishda uni shunday yaratish kerakki, mikrokontroller lehimsiz porlashi mumkin. Bu vaqtni, nervlarni tejaydi va elementlarning ishlash muddatini uzaytiradi. Shu jumladan Atmega8. Ta'kidlash joizki, sxema ichidagi dasturlash bilim va ko'nikmalarni talab qiladi. Ammo bu sizga yanada ilg'or dizaynlarni yaratishga imkon beradi. Axir, ko'pincha lehimlash paytida elementlar shikastlangan bo'ladi. Shundan so'ng, diagramma tayyor bo'ladi. Voltaj qo'llanilishi mumkin.

Muhim nuqtalar

Yangi boshlanuvchilarga Atmega8 dasturlash haqida foydali maslahatlar bermoqchiman. O'rnatilgan o'zgaruvchilar va funktsiyalarni o'zgartirmang! Qurilmani boshqa har qanday shovqinlarni to'sib qo'yadigan "abadiy halqalar" yo'qligini tekshirgandan so'ng va yaxshi transmitterdan foydalangandan so'ng yaratilgan dastur bilan yondirish tavsiya etiladi. Agar siz ushbu maqsadlar uchun uy qurilishi mahsulotidan foydalansangiz, mikrokontrollerning ishdan chiqishiga aqlan tayyor bo'lishingiz kerak. Dasturchi yordamida qurilmani miltillaganingizda, VCC, GND, SCK, MOSI, RESET, MISO mos keladigan chiqishlarini ulashingiz kerak. Va xavfsizlik choralarini buzmang! Agar texnik xususiyatlar elektr ta'minoti 5V bo'lishi kerakligini nazarda tutsa, unda siz aynan shu kuchlanishga rioya qilishingiz kerak. Hatto 6V elementlardan foydalanish ham mikrokontrollerning ishlashiga salbiy ta'sir ko'rsatishi va uning ishlash muddatini qisqartirishi mumkin. Albatta, 5V batareyalar ma'lum farqlarga ega, ammo, qoida tariqasida, hamma narsa oqilona chegaralar ichida. Masalan, maksimal kuchlanish 5,3V da saqlanadi.

O'qitish va malaka oshirish

Yaxshiyamki, Atmega8 juda mashhur mikrokontrollerdir. Shuning uchun hamfikrlarni yoki oddiygina bilimli va malakali odamlarni topish qiyin bo'lmaydi. Agar siz g'ildirakni qayta ixtiro qilishni xohlamasangiz, lekin faqat ma'lum bir muammoni hal qilmoqchi bo'lsangiz, unda siz keng dunyo bo'ylab Internetda kerakli sxemani izlashingiz mumkin. Aytgancha, bir oz ishora: robototexnika rus tilida so'zlashuvchi segmentda juda mashhur bo'lsa-da, agar javob bo'lmasa, uni ingliz tilida so'zlashuvchi segmentda izlash kerak - unda ko'proq ma'lumotlarning kattaligi tartibi mavjud. Mavjud tavsiyalarning sifati haqida ma'lum shubhalar mavjud bo'lsa, siz Atmega8ni muhokama qiladigan kitoblarni izlashingiz mumkin. Yaxshiyamki, ishlab chiqaruvchi kompaniya o'z ishlanmalarining mashhurligini hisobga oladi va ularni maxsus adabiyotlar bilan ta'minlaydi, bu erda tajribali odamlar nima va qanday qilib aytishadi, shuningdek, qurilma qanday ishlashiga misollar keltiradilar.

O'zingizning biror narsangizni yaratishni boshlash qiyinmi?

500-2000 rubl va bir nechta bepul oqshomlarga ega bo'lish kifoya. Bu vaqt Atmega8 arxitekturasi bilan tanishish uchun etarli. Bir oz mashqdan so'ng, siz aniq vazifalarni bajaradigan o'z loyihalaringizni osongina yaratishingiz mumkin. Masalan, robot qo'l. Barmoqlar va qo'llarning asosiy motor funktsiyalarini etkazish uchun faqat Atmega8 etarli bo'lishi kerak. Albatta, bu juda qiyin vazifa, ammo bu juda mumkin. Kelajakda o'nlab mikrokontrollerlarni talab qiladigan murakkab narsalarni yaratish mumkin bo'ladi. Ammo buning hammasi oldinda, undan oldin siz oddiy narsa bo'yicha yaxshi amaliyot maktabini olishingiz kerak.