Biz avr kontrollerlarini o'rganamiz. Atmega8 mikrokontrollerlari. Yangi boshlanuvchilar uchun Atmega8 dasturlash. Ko'rsatkichlarga chiqish

Mikrokontrollerlar (bundan buyon matnda MK deb yuritiladi) bizning hayotimizga qat'iy kirib bordi, Internetda siz MKda bajariladigan juda ko'p qiziqarli sxemalarni topishingiz mumkin. MKda yig'ib bo'lmaydigan narsalar: turli ko'rsatkichlar, voltmetrlar, maishiy texnika (himoya asboblari, kommutatsiya asboblari, termometrlar ...), metall detektorlar, turli o'yinchoqlar, robotlar va boshqalar. Ro'yxat juda uzoq vaqt talab qilishi mumkin. Men 5-6 yil oldin mikrokontrollerdagi birinchi sxemani radiojurnalda ko'rdim va deyarli darhol sahifani aylantirdim va o'zimga "men uni hali ham yig'a olmayman" deb o'yladim. Haqiqatan ham, o'sha paytda MKlar men uchun juda murakkab va noto'g'ri tushunilgan qurilma edi, men ular qanday ishlashini, ularni qanday o'chirishni va noto'g'ri dasturiy ta'minot bo'lsa, ular bilan nima qilish kerakligini bilmasdim. Ammo taxminan bir yil oldin men birinchi sxemani MKda yig'dim, bu 7 segment ko'rsatkichlari va ATmega8 mikrokontrolleriga asoslangan raqamli voltmetr sxemasi edi. Shunday bo'ldiki, men tasodifan mikrokontroller sotib oldim, men radio komponentlar bo'limida turganimda, oldimdagi yigit MK sotib olayotgan edi, men ham uni sotib olishga va biror narsa yig'ishga qaror qildim. Maqolalarimda men sizga bu haqda aytib beraman AVR mikrokontrollerlari , Men sizga ular bilan ishlashni o'rgataman, proshivka uchun dasturlarni ko'rib chiqamiz, oddiy va ishonchli dasturchi qilamiz, proshivka jarayonini ko'rib chiqamiz va eng muhimi, paydo bo'lishi mumkin bo'lmagan muammolarni ko'rib chiqamiz. faqat yangi boshlanuvchilar uchun.

AVR oilasining ba'zi mikrokontrolörlarining asosiy parametrlari:

Mikrokontroller

Flash xotira

RAM xotirasi

EEPROM xotirasi

I/U portlari

U kuchi

AVR mega mikrokontrollerning qo'shimcha parametrlari:

Ishlash harorati: -55…+125*S
Saqlash harorati: -65…+150*S
GND ga nisbatan RESET pinidagi kuchlanish: maksimal 13V
Maksimal ta'minot kuchlanishi: 6.0V
Maksimal I/U liniyasi oqimi: 40mA
Maksimal quvvat manbai oqimi VCC va GND: 200mA

ATmega 8X modeli pinouts

ATmega48x, 88x, 168x modellari uchun pinouts

ATmega8515x modellari uchun pin tartibi

ATmega8535x modellari uchun pin tartibi

ATmega16, 32x modellari uchun pin tartibi

ATtiny2313 modellari uchun pin tartibi

Maqolaning oxirida ba'zi mikrokontrollerlar uchun ma'lumotlar jadvallari bilan arxiv ilova qilingan.

MK AVR o'rnatish FUSE bitlari

Esda tutingki, dasturlashtirilgan sug'urta 0, dasturlashtirilmagan sug'urta 1. Noto'g'ri dasturlashtirilgan sug'urta mikrokontrollerni bloklashi mumkin; Qaysi sug'urtani dasturlash kerakligiga ishonchingiz komil bo'lmasa, birinchi marta MKni sigortalarsiz yondirish yaxshiroqdir.

Radio havaskorlari orasida eng mashhur mikrokontrollerlar ATmega8, undan keyin ATmega48, 16, 32, ATtiny2313 va boshqalar. Mikrokontrollerlar TQFP va DIP paketlarida sotiladi, men yangi boshlanuvchilarga DIP-da sotib olishni tavsiya qilaman. Agar siz TQFPni sotib olsangiz, ularni chaqnash yanada muammoli bo'ladi, chunki siz taxtani sotib olishingiz yoki lehimlashingiz kerak bo'ladi ularning oyoqlari bir-biriga juda yaqin joylashgan. Sizga mikrokontrollerlarni DIP paketlarida maxsus rozetkalarga o'rnatishingizni maslahat beraman, bu qulay va amaliy, agar siz uni qayta yoqishni istasangiz yoki uni boshqa dizayn uchun ishlatmoqchi bo'lsangiz, MKni echishingiz shart emas.

Deyarli barcha zamonaviy MKlar provayderni o'z ichiga dasturlash imkoniyatiga ega, ya'ni. Agar sizning mikrokontrolleringiz plataga lehimlangan bo'lsa, u holda proshivkani o'zgartirish uchun biz uni platadan lehimlashimiz shart emas.

Dasturlash uchun 6 ta pin ishlatiladi:
RESET- MK-ga kiring
VCC- Plus quvvat manbai, 3-5V, MK ga bog'liq
GND- Umumiy sim, minus quvvat.
MOSI- MK kiritish (MKdagi axborot signali)
MISO- MK chiqishi (MK dan ma'lumot signali)
SCK- MK kiritish (MKda soat signali)

Ba'zan ular XTAL 1 va XTAL2 pinlaridan foydalanadilar, agar MK ATmega 64 va 128-da tashqi osilator tomonidan quvvatlansa, MOSI va MISO pinlari o'rniga; PE0 piniga, MISO esa PE1 piniga ulangan. Mikrokontrollerni dasturchiga ulashda ulanish simlari imkon qadar qisqa bo'lishi kerak va dasturchidan LPT portiga o'tadigan kabel ham juda uzun bo'lmasligi kerak.

Mikrokontrollerning markirovkasi raqamlar bilan g'alati harflarni o'z ichiga olishi mumkin, masalan, Atmega 8L 16PU, 8 16AU, 8A PU va boshqalar. L harfi MKning L harfisiz MK dan pastroq kuchlanishda ishlashini anglatadi, odatda 2,7V. Defis yoki bo'sh joydan keyingi raqamlar 16PU yoki 8AU MKda joylashgan generatorning ichki chastotasini ko'rsatadi. Sigortalar tashqi kvartsdan ishlashga o'rnatilgan bo'lsa, kvarts ma'lumotlar varag'iga ko'ra maksimaldan oshmaydigan chastotaga o'rnatilishi kerak, bu ATmega48/88/168 uchun 20 MGts va boshqa atmegalar uchun 16 MGts.

Negadir men darhol AVR kontrollerlari uchun dasturlash muhitini tanlash bo'yicha maslahat berishga majbur bo'ldim. Faqat menga shippak tashlamang. Men bir oz :)

Mikrokontrollerlar uchun ko'plab dasturlash tillari mavjud. Bundan tashqari, bir nechta dasturlash muhitlari mavjud va ularni bir-biri bilan solishtirish noto'g'ri. Eng yaxshi tillar dasturlash mavjud emas. Bu sizga eng mos til va dasturlash muhitini tanlashingiz kerakligini anglatadi.

Agar siz hozirda nima ustida ishlashni boshlashni tanlashga duch kelsangiz, bu erda siz uchun ba'zi tavsiyalar mavjud.

Oldingi dasturlash tajribasi. Oldingi dasturlash tajribangizni e'tiborsiz qoldirmang. Agar u BASIC bo'lsa ham. Maktabda uzoq vaqt oldin bo'lsa ham. Dasturlash velosiped haydashga o'xshaydi - bir marta boshlaganingizdan so'ng, siz unutgan hamma narsani tezda eslaysiz. BASIC-dan boshlang - uni o'zlashtiring - keyinroq maqsadlaringizga mosroq narsani tanlash osonroq bo'ladi.

Atrof-muhitdan yordam. Do'stlaringiz Paskalda yozishadimi? Muammo siz uchun hal qilindi - Paskalda yozing! Ular sizga har doim maslahat bilan yordam berishadi, kutubxonalar berishadi va o'qish uchun tayyor loyihalarni berishadi. Umuman olganda, ular sizni o'z jamoalarida kutib olishdan xursand bo'lishadi. Agar siz teskarisini qilsangiz, teskari natijaga erishasiz. Agar siz Assembler dasturini o'rganishga qaror qilsangiz, MDH sanoatining do'stlari sizni tanlaydi. Yordam kutmang.

AVR dasturlash bo'yicha yaxshi kitob ko'p yordam beradi. Afsuski, ularning soni juda oz. Agar siz kitobga duch kelsangiz va hamma narsa juda qulay tarzda tushuntirilgan deb o'ylasangiz, uni sinab ko'ring. Men o'qishni tavsiya etmayman elektron kitoblar, oxirgi chora sifatida uni chop eting. Atrof muhit va kitob faylining matni o'rtasida almashish juda noqulay. Kitobni o'qish va uni almashtirish orqali chalg'itmasdan darhol sinab ko'rish yanada yoqimliroq, qo'shimcha ravishda siz chekkalarga eslatma qo'yishingiz va paydo bo'lgan g'oyalarni yozishingiz mumkin;

Dasturlash muhiti oddiyroq. Agar tilingiz uchun tanlash uchun bir nechta dasturlash muhitlari mavjud bo'lsa, ikkilanmang, eng oddiyini tanlang. U kamroq funktsional bo'lsin. Unga dahshatli shishgan kodni tuzishiga ruxsat bering. Asosiysi, endigina ishni boshlash. Oddiy muhitda qulay bo'lganingizdan so'ng, yanada rivojlangan va "to'g'ri" muhitga osongina o'tishingiz mumkin. Va ko'proq vaqtni behuda sarflaysiz, deganlarga quloq solmang - ular noto'g'ri. Boshlang'ich sinf o'quvchilaridan "Urush va tinchlik" ni o'qish so'ralmaydi, ularga oddiyroq kitoblar beriladi - rasmlar.

Kutubxonalar. Til o'rganish uchun kutubxonalarning mavjudligi munozarali. Albatta, keyinchalik ular hayotni ancha osonlashtiradi, lekin dastlab "Qora quti" kutubxonalari tushunarsiz va tilni tushunishga yordam bermaydi. Boshqa tomondan, ular dasturni o'qishni osonlashtiradi va yangi boshlanuvchilarga ko'p harakat qilmasdan qurishga imkon beradi. murakkab dasturlar. Shuning uchun, ularning mavjudligi haqida juda ko'p bezovta qilmang. Hech bo'lmaganda birinchi navbatda.

Samarali kod. Dasturlashni o'rganish uchun dasturlash muhitini faqat u kompilyatsiya qilgan kod qanchalik samarali ekanligiga qarab tanlash yomon fikrdir. Asosiysi, o'qishni boshlashda siz o'zingizni qulay his qilasiz - undan chiqadigan narsa o'ninchi narsadir. Albatta, bu bilan keyinroq ishlashingiz mumkin.

Sehrgarlar. Chip bortidagi har qanday qurilma portlar yordamida sozlanishi kerak. Jarayon juda zerikarli va ma'lumotlar jadvallari talab qilinadi. Bundan tashqari, yangi boshlanuvchilar uchun tushunish oson bo'lmagan nuanslar mavjud. Shuning uchun, atrof-muhitda sehrgarlar bo'lishi juda ma'qul. Vyzards - bu SPI, I2C, USART va boshqalar uchun avtomatik tyunerlar. Qanchalik ko'p qurilmalar qo'llab-quvvatlansa, shuncha yaxshi bo'ladi. Siz kerakli periferik parametrlarni o'rnatasiz va sehrgarning o'zi ta'minlaydigan kodni yaratadi berilgan parametrlar. Hayotni ancha osonlashtiradi.


Umumiy tavsiyalar bunday - dastlabki bosqichda dasturlash imkon qadar sodda bo'lishi kerak (hatto ibtidoiy). Dasturlash muhitini o'rganish oson bo'lishi kerak (chunki siz birinchi navbatda dasturlashni o'rganishingiz va sozlamalar bilan vaqtni behuda o'tkazmasligingiz kerak). Yaxshisi ruslashtirilgan. Ruscha qo'llanma va namunaviy dasturlar ham foydali bo'ladi. Atrof-muhitdan kristallni porlash qobiliyati maqsadga muvofiqdir. Keyin, dasturlash asoslarini o'zlashtirganingizdan so'ng, siz murakkabroq qobiqlarga o'tishingiz mumkin.


Oxirgi tavsiya: haqiqiy kristall bilan ishlash. Uni yoqishdan qo'rqmang. Amaliy tajribaga ega bo'ling. Emulyatorlar bilan ishlash (masalan, Proteus), garchi u sizni lehim temir bilan bezovtalanishdan xalos qilsa ham, hech qachon ish dasturidan va LEDning birinchi miltillashidan oladigan mamnuniyatni bera olmaydi! O'z qo'llaringiz bilan haqiqiy narsa qilganingizni tushunish ish diagrammasi ishonch va oldinga siljish uchun rag'bat uyg'otadi!

(7,554 marta tashrif buyurilgan, bugun 2 tashrif)

AVR mikrokontrollerlari uchun turli xil dasturlash tillari mavjud, ammo, ehtimol, eng moslari assembler va C, chunki bu tillar mikrokontroller apparatlarini boshqarish uchun barcha kerakli imkoniyatlarni eng yaxshi tarzda amalga oshiradi.

Assembly tili - mikrokontrollerning to'g'ridan-to'g'ri ko'rsatmalar to'plamidan foydalanadigan past darajadagi dasturlash tili. Ushbu tilda dastur yaratish uchun dasturlashtiriladigan chipning buyruqlar tizimini yaxshi bilish va dasturni ishlab chiqish uchun etarli vaqt talab etiladi. Assambleya tili dasturni ishlab chiqish tezligi va qulayligi bo'yicha C tilidan pastroq, ammo yakuniy bajariladigan kod hajmi va shunga mos ravishda uni bajarish tezligi bo'yicha sezilarli afzalliklarga ega.

C dasturchiga tilning barcha afzalliklarini ta'minlab, yanada qulayroq dasturlarni yaratishga imkon beradi yuqori daraja.
Yana bir bor ta'kidlash kerakki, AVR arxitekturasi va buyruqlar tizimi C tili kompilyatorini ishlab chiquvchilarning bevosita ishtirokida yaratilgan va bu tilning xususiyatlarini hisobga oladi. C manba kodini kompilyatsiya qilish tez va ixcham, samarali kod ishlab chiqaradi.

C ning assemblerga nisbatan asosiy afzalliklari: dastur ishlab chiqishning yuqori tezligi; mikrokontroller arxitekturasini chuqur o'rganishni talab qilmaydigan universallik; algoritmning yaxshi hujjatlashtirilishi va o'qilishi; funksiyalar kutubxonalarining mavjudligi; suzuvchi nuqta hisoblarini qo'llab-quvvatlash.

Si tili past darajadagi dasturlash imkoniyatlarini yuqori darajali til xususiyatlari bilan uyg'unlashtiradi. Past darajadagi dasturlash imkoniyati sizga to'g'ridan-to'g'ri apparatda osongina ishlash imkonini beradi va yuqori darajadagi tilning xususiyatlari osongina o'qiladigan va o'zgartirilishi mumkin bo'lgan tilni yaratishga imkon beradi. dastur kodi. Bundan tashqari, deyarli barcha C kompilyatorlari bajarilish vaqti va resurslarni sarflash nuqtai nazaridan muhim bo'lgan dastur bo'limlarini yozish uchun assembler qo'shimchalaridan foydalanish imkoniyatiga ega.

Bir so'z bilan aytganda, C ham yangi boshlanuvchilar uchun AVR mikrokontrollerlari va jiddiy ishlab chiquvchilar bilan tanishish uchun eng qulay tildir.

Kompilyatorlar dasturning dastlabki kodini mikrokontroller proshivka fayliga aylantirish uchun ishlatiladi.

Atmel Windows-da ishlaydigan Atmel Studio ishlab chiqish muhitiga kiritilgan kuchli montaj kompilyatorini taqdim etadi. Kompilyator bilan bir qatorda, ishlab chiqish muhiti tuzatuvchi va emulyatorni o'z ichiga oladi.
Atmel Studio butunlay bepul va Atmel veb-saytida mavjud.

Hozirgi vaqtda AVR uchun juda ko'p C kompilyatorlari mavjud. Ulardan eng kuchlisi Stokgolmdan kelgan IAR Systems kompilyatori hisoblanadi. Aynan uning xodimlari 90-yillarning o'rtalarida AVR qo'mondonlik tizimini ishlab chiqishda ishtirok etganlar. IAR C Compiler keng ko'lamli kod optimallashtirish imkoniyatlariga ega va IAR Embedded Workbench (EWB) integratsiyalashgan ishlab chiqish muhitining bir qismi bo'lib, u shuningdek assembler kompilyatori, bog'lovchi, loyiha va kutubxona menejeri va tuzatuvchini o'z ichiga oladi. Narxi to'liq versiya Paket narxi 2820 evro. Kompaniya veb-saytida siz 30 kunlik bepul baholash versiyasini yoki kod hajmi chegarasi 4 KB bo'lgan cheksiz versiyani yuklab olishingiz mumkin.

Palo Alto shahridan (Kaliforniya) Amerikaning Image Craft kompaniyasi C tili kompilyatorini ishlab chiqaradi, u juda mashhur bo'lgan. AVR uchun JumpStart C o'rtacha kod optimallashtirishga ega va unchalik emas yuqori narx(versiyaga qarab 50 dan 499 dollargacha). AVR uchun JumpStart C ning demo versiyasi 45 kun davomida to'liq ishlaydi.

Ruminiya Code Vision AVR C kompilyatori unchalik mashhur emas, bu kompilyatorning to'liq versiyasining narxi nisbatan past va 150 evroni tashkil qiladi. Kompilyator integratsiyalashgan rivojlanish muhitiga ega bo'lib, u standart funktsiyalardan tashqari, etarli darajada o'z ichiga oladi qiziqarli xususiyat- CodeWizardAVR avtomatik dastur generatori. Rivojlanish muhitida ketma-ket terminalning mavjudligi dasturlarni disk raskadrovka qilish imkonini beradi ketma-ket port mikrokontroller. Siz ishlab chiquvchilardan 4 KB kod o'lchamiga ega va yaratilgan manba kodini C-da saqlashni o'chirib qo'ygan bepul baholash versiyasini yuklab olishingiz mumkin.

Serbiyaning Belgrad shahrida joylashgan MikroElektronika kompaniyasi AVR mikrokontrollerlari uchun kompilyatorlarning butun oilasini ishlab chiqaradi. AVR uchun mikroC PRO deb nomlangan C tili uchun kompilyator 249 dollar turadi. Xuddi shu narxda mikroBasic va mikroPascal ham bor. Ishlab chiquvchilar veb-saytida kod hajmi chegarasi 4096 bayt bo'lgan demo versiyalari mavjud. Ushbu kompilyatorlar oilasining afzalligi yagona platforma va yagona mafkura bo‘lib, u nafaqat tillar, balki mikrokontrollerlar o‘rtasida ham oson o‘tishni ta’minlaydi (PIC, STM32, 8051... uchun kompilyator versiyalari mavjud).

Integratsiyalashgan rivojlanish muhiti haqiqatan ham timsolga aylandi. U kuchli C va assembler kompilyatorlarini, AVRDUDE dasturchisini, tuzatuvchini, simulyatorni va boshqa ko'plab yordamchi dasturlar va yordamchi dasturlarni o'z ichiga oladi. WinAVR Atmel's AVR Studio ishlab chiqish muhiti bilan muammosiz birlashadi. Assembler kirish kodida AVR Studio assembler bilan bir xil. C va assembler kompilyatorlari COFF formatida disk raskadrovka fayllarini yaratish imkoniyatiga ega, bu sizga nafaqat o'rnatilgan vositalardan, balki kuchli AVR Studio simulyatoridan ham foydalanish imkonini beradi. Yana bir muhim afzallik shundaki, WinAVR hech qanday cheklovlarsiz bepul tarqatiladi (ishlab chiqaruvchilar GNU General Public License-ni qo'llab-quvvatlaydi).

Xulosa sifatida shuni aytish kerakki, WinAVR AVR mikrokontrollerlarini o'zlashtirishni boshlaganlar uchun ideal tanlovdir. Aynan shu rivojlanish muhiti ushbu kursda asosiy hisoblanadi.

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. Bir nechta mutlaqo bir xil MKlarni sotib olib, to'liq yig'ishga nima imkon beradi turli sxemalar va qurilmalar. Ishga biron bir o'zgartirish kiritmoqchi bo'lsangiz elektron qurilma, keyin siz lehimli temirdan foydalanishingiz shart emas, faqat MKni qayta dasturlash kifoya qiladi. Bunday holda, agar siz AVR dan foydalanayotgan bo'lsangiz, uni qurilmangizdan olib tashlashning hojati yo'q, 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 har qanday MK-ni sotib olishingiz mumkin, ammo bu holda siz buning uchun hujjatlarni izlashingiz kerak bo'ladi, chunki turli MKlarning bir xil "oyoqlari" ishlashi mumkin. turli funktsiyalar, va barcha terminallarni aftidan to'g'ri ulaganingizdan so'ng, 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 ham kerak bo'ladi qo'shimcha qurilmalar: LEDlar, tugmalar, ulagichlar va boshqalar.

ATMega16 juda ko'p narsaga ega katta raqam turli xil funktsiyalar. 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
  • modul impuls kengligi modulyatsiyasi(PWM)

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 bor Ingliz. Agar siz ingliz tilini bilsangiz, ushbu ma'lumotlar jadvalini yuklab olishni unutmang, unda juda ko'p foydali ma'lumotlar mavjud.

Keling, nihoyat biznesga tushaylik. Men mikrokontroller uchun maxsus ishlab chiqish va disk raskadrovka taxtasini yasashni maslahat beraman, uning ustiga istalganini yig'ishingiz mumkin elektr diagrammasi mikrokontroller bilan. 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. Natijada, kabellarni ulash va mikrosxemalar va ko'rsatkichlarni o'rnatish orqali bir necha daqiqada har qanday elektr zanjirini yig'ishingiz mumkin bo'lgan juda qulay narsa.

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).

Quvvat manbai sifatida 7-11 V DC ishlab chiqaradigan har qanday narsa ishlatilishi mumkin. MK ning barqaror ishlashi uchun barqarorlashtirilgan quvvat manbai talab qilinadi. Stabilizator sifatida siz 7805 seriyali mikrosxemalardan foydalanishingiz mumkin, bular chiziqli o'rnatilgan stabilizatorlar bo'lib, ularning kirish qismi 7-11 V to'g'ridan-to'g'ri barqaror bo'lmagan oqim bilan ta'minlanadi va chiqishi 5 V stabillashtirilgan oqimdir. 7805 dan oldin va keyin siz filtr kondansatkichlarini o'rnatishingiz kerak (parazitlarni filtrlash uchun elektrolitik past chastotalar va baland bo'ylilar uchun keramika). Agar siz stabilizatorni topa olmasangiz, u holda siz 4,5 V batareyani quvvat manbai sifatida ishlatishingiz mumkin.

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 kondansatkichini 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 ular 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.

uchun AVR dasturlash Bir nechta rivojlanish 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 Visual C++ 6 interfeysi bilan deyarli bir xil interfeysga ega AVR uchun dasturlash tizimi. 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. IAR-da loyiha butunlay 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 Debugni 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'rnatamiz. Keyin cheksiz pastadir mavjud. MKni dasturlashda ular har doim cheksiz tsiklni hosil qiladilar, unda MK qayta tiklanmaguncha yoki uzilish sodir bo'lgunga qadar 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. Ochilish Uzoq menejer(MK-ni miltillash eng qulay), ushbu papkaga o'ting, Ctrl + O tugmalarini bosing. Bizda butunlay yangi MK borligi sababli, biz to'ldiramiz

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

Bo'lgan holatda to'g'ri ulanish Dasturchi muvaffaqiyatli dasturlashni ko'rsatadi. 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

Salom, aziz Xabrajitel!

Ushbu maqolada men mikrokontrollerlarni dasturlashni qanday boshlashga qaror qilganim, buning uchun nima kerakligi va nima sodir bo'lganligi haqida gapirmoqchiman.

Mikrokontrollerlar mavzusi meni uzoq vaqt oldin, 2001 yilda qiziqtirgan edi. Ammo keyin mening yashash joyimda dasturchi olish muammoli bo'lib chiqdi va uni Internet orqali sotib olish haqida gap yo'q edi. Men bu masalani yaxshiroq vaqtlargacha qoldirishga majbur bo'ldim. Va keyin bir kuni men buni bilib oldim yaxshiroq vaqtlar uydan chiqmasdan keldi, men kerak bo'lgan hamma narsani sotib olardim. Men sinab ko'rishga qaror qildim. Shunday qilib, bizga nima kerak:

1. Dasturchi
Bozorda ko'plab variantlar mavjud - bir necha dollarga arzon ISP (tizim ichidagi dasturlash) dasturchilaridan tortib, bir necha yuz dollarlik kuchli dasturchi-debugerlargacha. Bu borada ko'p tajribaga ega bo'lmaganim uchun, birinchi navbatda men eng oddiy va eng arzonlaridan birini - USBasp-ni sinab ko'rishga qaror qildim. Men uni bir vaqtning o'zida eBay'da 12 dollarga sotib oldim, endi uni hatto 3-4 dollarga ham topishingiz mumkin. Bu aslida Tomas Fischl dasturchisining xitoycha versiyasidir. U haqida nima deyishim mumkin? Faqat bitta narsa - u ishlaydi. Bundan tashqari, u ATmega va ATtiny seriyalarining juda ko'p AVR kontrollerlarini qo'llab-quvvatlaydi. Linux ostida haydovchi kerak emas.

Mikrodasturni o'chirish uchun siz VCC, GND, RESET, SCK, MOSI, MISO dasturchi chiqishlarini mikrokontrollerning mos keladigan chiqishlari bilan ulashingiz kerak. Oddiylik uchun men yordamchi sxemani to'g'ridan-to'g'ri non taxtasiga yig'dim:

Doskaning chap tomonida biz miltillovchi bir xil mikrokontroller mavjud.

2. Mikrokontroller
Men mikrokontrollerni tanlashda juda ko'p bezovta qilmadim va Atmel'dan ATmega8 ni oldim - 23 kiritish / chiqish pinlari, ikkita 8-bitli taymer, bitta 16-bit, chastotasi 16 MGts gacha, kam iste'mol (1-3,6 mA) , arzon (2 dollar). Umuman olganda, boshlang'ich uchun - etarli.

Linuxda avr-gcc + avrdude birikmasi proshivkani kompilyatsiya qilish va kontrollerga yuklash uchun yaxshi ishlaydi. O'rnatish ahamiyatsiz. Ko'rsatmalarga rioya qilib, bir necha daqiqada barcha kerakli dasturlarni o'rnatishingiz mumkin. Siz e'tibor berishingiz kerak bo'lgan yagona nuance - avrdude (kontrollerga yozib olish uchun dasturiy ta'minot) dasturchiga kirish uchun super foydalanuvchi huquqlarini talab qilishi mumkin. Yechim uni sudo orqali ishga tushirish (juda yaxshi fikr emas) yoki maxsus udev huquqlarini ro'yxatdan o'tkazishdir. Sintaksisga qarab farq qilishi mumkin turli versiyalar OS, lekin mening holimda ( Linux Mint 15) /etc/udev/rules.d/41-atmega.rules fayliga quyidagi qoidani qo'shish ishladi:

# USBasp dasturchisi SUBSYSTEM=="usb", ATTR(idVendor)=="16c0", ATTR(idProduct)=="05dc", GROUP="plugdev", MODE="0666"

Shundan so'ng, albatta, xizmatni qayta ishga tushirishingiz kerak
udev xizmatini qayta ishga tushiring
Siz to'g'ridan-to'g'ri dan kompilyatsiya qilishingiz va muammosiz flesh qilishingiz mumkin buyruq qatori(kim bunga shubha qiladi), lekin agar ko'p loyihalar bo'lsa, plaginni o'rnatish va hamma narsani to'g'ridan-to'g'ri Eclipse muhitidan qilish qulayroqdir.

Windows uchun siz drayverni o'rnatishingiz kerak bo'ladi. Aks holda, hech qanday muammo bo'lmaydi. Ilmiy qiziqish uchun men Windows-da AVR Studio + eXtreme Burner kombinatsiyasini sinab ko'rdim. Shunga qaramay, hamma narsa ajoyib ishlaydi.

Keling, dasturlashni boshlaylik

AVR kontrollerlari assemblerda (AVR assembler) ham, C da dasturlashtirilishi mumkin. Bu erda, menimcha, har kim o'ziga xos vazifaga va o'z afzalliklariga qarab o'z tanlovini qilishi kerak. Shaxsan men dastlab assembler bilan ishlay boshladim. Assemblerda dasturlashda qurilma arxitekturasi aniqroq bo'ladi va siz to'g'ridan-to'g'ri kontrollerning ichki qismiga kirib borayotganingizni his qilasiz. Bundan tashqari, men o'ylaymanki, hajmi va ishlashi jihatidan juda muhim bo'lgan dasturlarda assemblerni bilish juda foydali bo'lishi mumkin. AVR assembler bilan tanishib bo'lgach, men C ga emaklab bordim.

Arxitektura va asosiy tamoyillar bilan tanishib, men foydali va qiziqarli narsalarni to'plashga qaror qildim. Bu erda qizim menga yordam berdi, u shaxmat o'ynaydi va bir kuni kechqurun u vaqtli o'yinlar uchun soat taymerini olishni xohlashini aytdi. BAM! Mana - birinchi loyiha g'oyasi! Albatta, siz ularni eBay-da buyurtma qilishingiz mumkin edi, lekin men o'zim qora soatlar yasamoqchi edim ... ko'rsatkichlar va tugmalar. Aytilgan gap otilgan o'q!

Displey sifatida ikkita 7-segmentli diodli ko'rsatkichlardan foydalanishga qaror qilindi. Boshqarish uchun 5 ta tugma etarli edi - "1-o'yinchi", "2-o'yinchi", "Qayta o'rnatish", "Sozlamalar" va "To'xtatib turish". Xo'sh, o'yin tugashining ovozli belgisi haqida unutmang. Bu shunday tuyuladi. Quyidagi rasmda ko'rsatilgan umumiy sxema mikrokontrollerni indikatorlar va tugmalarga ulash. Dasturning dastlabki kodini tahlil qilishda bizga kerak bo'ladi:

Debrifing

Keling, kutilganidek, dasturning kirish nuqtasidan boshlaylik - asosiy funktsiya. Aslida, buning hech qanday diqqatga sazovor joyi yo'q - portlarni sozlash, ma'lumotlarni ishga tushirish va ishlov berish tugmachalarini bosishning cheksiz tsikli. Sei() ga qo'ng'iroq qilish - uzilishlarni qayta ishlashni yoqish, ular haqida birozdan keyin.

Int main(void) (init_io(); init_data(); sound_off(); sei(); while(1) ( handle_buttons(); ) 0 qaytaradi; )
Keling, har bir funktsiyani alohida ko'rib chiqaylik.

Void init_io() ( // chiqish DDRB = 0xFF; DDRD = 0xFF; // kirish DDRC = 0b11100000; // tortishish rezistorlari PORTC |= 0b00011111; // taymer TIMSKni uzadi = (1)<

Kirish/chiqarish portlarini sozlash juda oddiy - raqam DDRx registriga yoziladi (bu erda x - portni bildiruvchi harf), har bir bit mos keladigan pin kirish qurilmasi (0 ga to'g'ri keladi) yoki kirish qurilmasi bo'lishini bildiradi. chiqish qurilmasi (1 ga to'g'ri keladi). Shunday qilib, 0xFF raqamini DDRB va DDRD ga yuborish orqali biz B va D chiqish portlarini yaratdik. Shunga ko'ra, DDRC buyrug'i = 0b11100000; C portining dastlabki 5 pinini kirish pinlariga, qolganlarini esa chiqish pinlariga aylantiradi. PORTC buyrug'i |= 0b00011111; 5 nazoratchi kirishidagi ichki tortishish rezistorlarini o'z ichiga oladi. Diagrammaga ko'ra, tugmalar bu kirishlarga ulangan, ular bosilganda ularni erga qisqartiradi. Shunday qilib, boshqaruvchi tugma bosilganligini tushunadi.

Keyin ikkita taymer, Timer0 va Timer1 konfiguratsiyasi keladi. Biz birinchisidan ko'rsatkichlarni yangilash uchun, ikkinchisidan esa vaqtni hisoblash uchun foydalanamiz, avval uni har soniyada yoqish uchun sozlaganmiz. Barcha konstantalarning batafsil tavsifi va taymerni ma'lum bir intervalgacha o'rnatish usulini ATmega8 hujjatlarida topish mumkin.

Ishlov berishni to'xtatish

ISR (TIMER0_OVF_vect) ( displey(); agar (_buzzer > 0) ( _buzzer--; agar (_buzzer == 0) ovoz o'chirilgan(); ) ) ISR (TIMER1_COMPA_vect) ( agar (ActiveTimer == 1 && Timer1 > 0) ( Timer1--; if (Timer1 == 0) process_timeoff( ) if (ActiveTimer == 2 && Timer2 > 0) ( Timer2--; if (Timer2 == 0) process_timeoff(); ) )

Taymer ishga tushganda, boshqaruv tegishli uzilish ishlovchisiga o'tkaziladi. Bizning holatda, bu indikatorlarda vaqtni ko'rsatish protsedurasini chaqiradigan TIMER0_OVF_vect ishlov beruvchisi va ortga hisoblashni qayta ishlaydigan TIMER1_COMPA_vect.

Ko'rsatkichlarga chiqish

Bekor displey() (displey_raqami((Taymer1/60)/10, 0b00001000); _kechikish_ms(0,25); displey_raqami((Taymer1/60)%10, 0b00000100); _kechikish_ms(0,25); displey_raqam(6)(T1) , 0b000010); 60)%10, 0b0100000); display_number((Timer2%60)/10, 0b0010 (raqam) PORTD = niqob;

Displey funktsiyasi dinamik ko'rsatish usulidan foydalanadi. Haqiqat shundaki, har bir alohida ko'rsatkich 9 ta kontaktga ega (segmentni boshqarish uchun 7 ta, nuqta uchun 1 va quvvat uchun 1). 4 ta raqamni boshqarish uchun 36 ta kontakt kerak bo'ladi. Juda isrofgar. Shuning uchun, bir nechta raqamga ega bo'lgan ko'rsatkichga raqamlarni chiqarish quyidagi printsip bo'yicha tashkil etiladi:

Umumiy kontaktlarning har biriga kuchlanish navbatma-navbat beriladi, bu sizga bir xil 8 nazorat kontaktlari yordamida mos keladigan indikatorda kerakli raqamni ajratib ko'rsatish imkonini beradi. Etarlicha yuqori chiqish chastotasida u ko'zga statik rasmga o'xshaydi. Shuning uchun diagrammadagi ikkala ko'rsatkichning barcha 8 ta quvvat kontaktlari D portining 8 ta chiqishiga ulangan va 16 segmentni boshqaradigan kontaktlar juft bo'lib ulangan va B portining 8 ta chiqishiga ulangan. Shunday qilib, displeyning kechikishi bilan funksiyasi. 0,25 ms navbatma-navbat ko'rsatkichlarning har birida kerakli raqamni ko'rsatadi. Nihoyat, indikatorlarga kuchlanish beradigan barcha chiqishlar o'chiriladi (portD = 0; buyrug'i). Agar bu bajarilmasa, oxirgi ko'rsatilgan raqam displey funktsiyasiga keyingi qo'ng'iroqqa qadar yonishda davom etadi, bu esa qolganlarga nisbatan yorqinroq porlashiga olib keladi.

Kliklarni boshqarish

Void handle_buttons() ( tutqich_tugmasi(KEY_SETUP); tutqich_tugmasi(KEY_RESET); tutqich_tugmasi(KEY_PAUSE); tutqich_tugmasi(KEY_PLAYER1); tutqich_tugmasi(KEY_PLAYER2); ) bekor tutqich_tugmasi(int kaliti) ( int bit; switch (kalit) (kalit biti: KEYS__) = SETUP_BIT break; case KEY_BIT break; / kalit harakat kaliti (kalit) (KEY_SETUP: jarayon_o'rnatish(); tanaffus; KEY_RESET(); tanaffus; KEY_pause(); tanaffus; KEY_PLAYER2: tanaffus; ovozli (15); &= ~tugmacha; ) )

Bu funksiya barcha 5 tugmani navbatma-navbat so‘raydi va agar mavjud bo‘lsa, bosishni qayta ishlaydi. Bosish bit_is_clear (BUTTON_PIN, bit) ni tekshirish orqali ro'yxatga olinadi, ya'ni. agar mos keladigan kirish erga ulangan bo'lsa, tugma bosiladi, bu tugma bosilganda, diagrammaga ko'ra sodir bo'ladi. Kontaktning qaytishi tufayli bir nechta keraksiz operatsiyalarni oldini olish uchun DEBOUNCE_TIME muddatga kechikish va takroriy tekshirish kerak. Bosilgan holatni _pressed o'zgaruvchining mos keladigan bitlarida saqlash tugma uzoq vaqt davomida bosilganda takroriy tetiklashning oldini olish uchun ishlatiladi.
Kliklarni qayta ishlash funktsiyalari juda ahamiyatsiz va men ularga qo'shimcha sharhlar kerak emas deb o'ylayman.

Dasturning to'liq matni

#F_CPU 4000000UL ni aniqlang #include #o'z ichiga oladi #o'z ichiga oladi #DEBOUNCE_TIME 20 ni aniqlang #BUTTON_PIN PINCni aniqlang #SETUP_BIT PC0 ni aniqlang #PAUSE_BIT PC2 ni aniqlang #PLAYER1_BIT PC3 ni aniqlang #PLAYER2_BIT PC4 ni aniqlang #KEYSETUP00-ni aniqlang b00000010 #KEY_PAUSE ni aniqlang 0b00000100 #KEY_PLAYER1ni aniqlang 0b00001000 #KEY_PLAYER2 ni aniqlang 0b00010000 uchuvchan int ActiveTimer = 0; volatile int Timer1 = 0; volatile int Timer2 = 0; uchuvchi int _buzzer = 0; volatile int _pressed = 0; // funksiya deklaratsiyasi bekor init_io(); void init_data(); int raqam_mask (int raqam); void handle_buttons(); void handle_button (int kaliti); void process_setup(); void process_reset(); void process_pause(); void process_timeoff(); void process_player1(); void process_player2(); bekor displey(); void display_number(int maskasi, int raqami); void sound_on (int interval); void sound_off(); // ISRni to'xtatadi (TIMER0_OVF_vect) ( displey(); agar (_buzzer > 0) ( _buzzer--; agar (_buzzer == 0) sound_off(); ) ) ISR(TIMER1_COMPA_vect) ( agar (ActiveTimer == 1 && Timer1 >) 0) ( Timer1--; if (Timer1 == 0) process_timeoff(); ) if (ActiveTimer == 2 && Timer2 > 0) ( Timer2--; if (Timer2 == 0) process_timeoff(); ) ) int main (void) ( init_io(); init_data(); sound_off(); sei(); while(1) ( handle_buttons(); ) return 0; ) void init_io() ( // chiqish DDRB = 0xFF; DDRD = 0xFF o‘rnatildi. ; // kirishni o'rnating DDRC = 0b11100000;<5940 || Timer2 > 5940) ( Timer1 = 0; Timer2 = 0; ) ) void process_reset() ( init_data(); ) void process_timeoff() ( init_data(); sound_on(30); ) void process_pause() ( ActiveTimer = 0; ) void process_player1() ( ActiveTimer = 2; ) void process_player2() ( ActiveTimer = 1; ) void handle_button(int key) ( int bit; switch (kalit) ( case KEY_SETUP: bit = SETUP_BIT; break; case KEY_RESET: bit = RESET_BIT) ; bo'sh joy KEY_PLAYER1: break; (kalit) (KEY_SETUP: process_setup(); break; case KEY_RESET: process_reset(); break; case KEY_PAUSE(); break; case KEY_PLAYER1(); break; case KEY_PLAYER2(); sound_on(15) ) other ( _bosilgan & & = ~ kalit;

) ) void handle_buttons() ( tutqich_tugmasi(KEY_SETUP); tutqich_tugmasi(KEY_RESET); tutqich_tugmasi(KEY_PAUSE); tutqich_tugmasi(KEY_PLAYER1); tutqich_tugmasi(KEY_PLAYER2); ) bekor displey() (displey_raqami((Taymer10,600)) _delay_ms(0,25); display_number((Timer1/60)%10, 0b00000010, 0b00000001(,001) ); displey_raqami((Taymer2/60)%10, 0b01000000); 0b00100000; raqam, int maskasi) ( PORTB = raqam_mask (raqam); PORTD = niqob; ) bekor ovoz_on(int interval) ( _buzzer = interval; // baland ovozli signalni qo'yish PORTC |= 0b00100000; ) bekor ovoz_off() ( // signal qo'yish pin past PORTC &= ~0b00100000;



gastroguru 2017