(3-nashr). Atmel AVR mikrokontrollerlarini montaj tilida amaliy dasturlash

Men bir marta Internetda qiziqarli videoni ko'rdim, u mikrokontroller va 8x8 LED matritsasida amalga oshirilgan ilon o'yinini namoyish etdi, keyin meni qiziqtirgan yana bir nechta shunga o'xshash videolarni topdim. Ular orasida Tetris o'yini "kuchli" mikrokontrollerda yig'ilgan video ham bor edi. Ko'rganimdan so'ng, men PIC16F688 mikrokontrolleri va 8x16 piksel o'lchamdagi o'yin maydonini aks ettiruvchi ikkita LED matritsasi yordamida ikkala o'yinni birlashtirgan qurilmaning o'z versiyasini ishlab chiqishga qaror qildim.

Qurilma diagrammasi quyida ko'rsatilgan. DD2, DD3, DD4 siljish registrlari yordamida dinamik rejimda H1, H2 matritsalariga axborot chiqariladi. DD2, DD3 mikrosxemalarning chiqishlari matritsalarning anodlariga ulangan. Ikkala matritsaning katodlari VT1-VT8 tranzistorlarining kollektorlariga ulangan, ular uchun boshqaruv signallari DD4 mikrosxemasi tomonidan ishlab chiqariladi. Mikrokontroller DD4 registriga ma'lumotlarni yuklaydi, u to'lib ketganda, 9-pin ma'lumotlari DD3 registrining kirishiga o'tkaziladi, so'ngra xuddi shu tarzda ma'lumotlar DD2 registriga uzatiladi. R1-R16 rezistorlari matritsali LEDlar orqali oqimni cheklaydi. R17-R23 rezistorlari VT1-VT8 tranzistorlarining asosiy oqimini o'rnatadi. Mikrokontroller ichki osilatordan 8 MGts chastotada ishlaydi. Tasvirni yangilash tezligi 100 Gts.


Quvvat yoqilgandan so'ng, o'yin maydonida "Ilon" o'yin ekrani ko'rsatiladi. Maydonning yuqori qismida 1 raqami ko'rsatiladi, pastki qismida esa o'yinning bir qismi tasviri mavjud. SB5 “Start/Pause” tugmasini bosganingizda, siz o‘yin menyusiga o‘tasiz, uning yuqori qismida o‘yin darajasi 1 dan 9 gacha raqamlar ko‘rinishida ko‘rsatiladi. O‘yin darajasi SB1 “Yuqoriga” tomonidan o‘rnatiladi. tugmachasini bosgandan so'ng daraja raqami ketma-ket birlik bo'yicha ortadi. 9 raqamidan keyin yana 1 raqami ko'rsatiladi.Ilonning boshlang'ich uzunligi o'yinning belgilangan darajasiga bog'liq, shuning uchun 1-daraja uchun uzunlik 3 ball, 9-daraja uchun 11 ball. Menyuning pastki qismida ilonning harakat tezligi haqidagi ma'lumotlar ko'rsatiladi. 1 raqami minimal tezlikka, 9 raqami esa maksimalga mos keladi. Tezlik qiymati o'yin darajasini belgilashga o'xshash SB4 "Pastga" tugmasi bilan o'rnatiladi. Menyuda maydonning perimetri atrofidagi LEDlarning porlashi maydonning perimetri atrofida chegaralar mavjudligi bilan o'yin rejimi tanlanganligini anglatadi. Ushbu rejimda, ilon o'yin maydonini tark etganda, yo'qotish sodir bo'ladi. Agar menyuda maydonning perimetri atrofidagi LEDlar o'chirilgan bo'lsa, u holda chegarasiz rejim tanlanadi. Bunday holda, o'yin maydonini tark etayotganda, ilonning boshi maydonning qarama-qarshi tomonida paydo bo'ladi. Kerakli o'yin rejimini o'rnatish uchun SB2 "O'ng" va SB3 "Chap" tugmalaridan foydalaning. O'yin menyusiga birinchi marta kirganingizda, uzunlik va tezlik qiymatlari bittaga o'rnatiladi va chegaralar bilan rejim tanlanadi.

O'yin menyusidagi "Boshlash/To'xtatib turish" tugmasini bosgandan so'ng o'yin maydonida asosiy holatidagi ilon va tasodifiy bo'sh nuqta ko'rsatiladi. "Yuqoriga", "Chapga", "O'ngga" tugmalaridan birini bosish ilonning mos keladigan yo'nalishda harakatlanishiga olib keladi. Harakat boshlangandan so'ng, ilonni boshqarish uchun "Pastga" tugmasi ham mavjud bo'ladi. Yorqin nuqtaga urilganda, ilonning uzunligi ortadi. 14 ball to'plaganingizdan so'ng, siz o'yinning keyingi bosqichiga o'tasiz. 9-darajadan keyin birinchi darajaga o'tish sodir bo'ladi. Agar ilon o'z tanasiga urilsa yoki chegara rejimida o'yin maydonidan tashqariga chiqsa, yo'qotish sodir bo'ladi. 3 ta mag'lubiyatdan so'ng siz o'yin menyusiga qaytasiz, u erda joriy o'yin darajasi va tezligi ko'rsatiladi. Ilon harakatlana boshlagandan so'ng, siz "Start/Pause" tugmachalarini bosib o'yinni to'xtatib, davom ettirishingiz mumkin.

O'yin menyusidan chiqish uchun siz "Boshlash/To'xtatib turish" tugmasini 1 soniya bosib turishingiz kerak, shundan so'ng o'yin maydonida o'yin ekrani paydo bo'ladi. O'yinlar o'rtasida almashish "Yuqoriga", "Pastga", "Chapga", "O'ngga" tugmalaridan birini bosish orqali amalga oshiriladi. Shu bilan birga, tegishli o'yinning ekrani ko'rsatiladi.

Tetris o'yin ekran pardasining yuqori qismida 2 raqami ko'rsatilgan, pastki qismida o'yin parchasi tasviri mavjud. “Start/Pause” tugmasini bosib o‘yin menyusiga o‘ting. O'yinchi tomonidan to'plangan ballar soni menyuning yuqori qismida ko'rsatiladi. Har bir o'chirilgan qator uchun ballar beriladi. Nuqta hisoblagichi 99 gacha sanaydi, keyin nolga qaytadi va yana boshlanadi. Har bir yangi o'yin boshida hisoblagich ham nolga qaytariladi. Menyuning pastki qismida mos ravishda "Yuqoriga" va "Pastga" tugmalari yordamida o'rnatiladigan raqamlarning harakat tezligi haqida ma'lumot ko'rsatiladi. Menyudan "Start/Pause" tugmasini bosgandan so'ng, o'yin boshlanadi, maydonning yuqori qismida tasodifiy raqamlar paydo bo'ladi, ularni "Chap" va "O'ng" tugmalari bilan tegishli yo'nalishda siljitish mumkin. Yuqoriga tugmasi har bosilganda shaklni soat yo'nalishi bo'yicha 90 daraja aylantiradi. Pastga tugmani bosib ushlab turish orqali siz figuraning harakatini tezlashtirishingiz mumkin. "Start/Pause" tugmasi o'yinni to'xtatib turish va davom ettirish imkonini beradi. O'yin yangi raqam o'yin maydoniga sig'may qolganda tugaydi, shundan so'ng u o'yinchi to'plagan ballar sonini ko'rishingiz mumkin bo'lgan menyuga o'tadi. Menyudan chiqish "Snake" o'yinidagi kabi amalga oshiriladi.

Agar 4 daqiqa ichida hech qanday tugma bosilmasa, qurilma kam quvvat rejimiga o'tadi, mikrokontroller LED massivlarini o'chiradi va uyqu rejimiga o'tadi. Qurilma "Start" tugmasini bosgandan so'ng "uyg'onadi" va avvalgi holatiga qaytadi.

Qurilma rezistorlardan foydalanadi - sirtni o'rnatish uchun o'lcham 1206. C2, C3 kondansatkichlari seramika o'lchami 1206. LED matritsalari H1, H2 TOM-1088BG-B yashil rangda, LED diametri 3 mm va o'lchamlari 8x8 piksel. Tugmalar standart sensorli.

Quvvat manbai 3,7-5V kuchlanishli stabillashtirilgan quvvat manbai bo'lib, siz galvanik hujayralar yoki batareyalardan ham foydalanishingiz mumkin, masalan, ketma-ket ulangan 3 ta 1,5V AA yoki AAA batareyalari, masalan, men 3 ta AA batareyasidan foydalanaman. Besleme zo'riqishida 3,3V ga tushirilganda qurilma ishlayveradi, LED matritsalarining yorqinligi pasayadi.

KIRISH Mikrokontrollerlar, ularning kelib chiqishi va qo'llanilishi
Mikrokontrollerlar haqida ma'lumot
Yunoncha uslubdagi elektronika
Nima uchun AVR?
Keyin nima?

I QISM. ATMEL AVR NI LOYIHALASH VA FOYDALANISHNING UMUMIY PRINSİPLARI.

1-bob. Atmel AVR mikrokontrollerlarining umumiy ko'rinishi

AVR oilalari
AVR MK dan amaliy foydalanish xususiyatlari

2-bob. Umumiy tuzilma, xotirani tashkil qilish, soatlash, qayta o'rnatish

Dastur xotirasi
Ma'lumotlar xotirasi (RAM, SRAM)
O'zgaruvchan ma'lumotlar xotirasi (EEPROM)
Soat usullari
Qayta o'rnatish
Qo'shimcha tashqi ma'lumotlar xotirasini ulash xususiyatlari

3-bob: Periferik qurilmalarga kirish

I/U portlari
Taymer-hisoblagichlar
Analogdan raqamliga o'tkazgich
Seriya portlar
UART
SPI interfeysi
TWI interfeysi (12C)
USI universal seriyali interfeysi

4-bob. Uzilishlar va quvvatni tejash rejimlari

Xalaqit beradi
Uzilishlar turlari
Quvvatni tejash rejimlari
MK AVR iste'moli
AYR MK iste'moli va energiyani tejash rejimlari

II QISM. ATMEL AVR MIKRONAZORLASHTIRISHLARINI DASTURLASH

5-bob. AVR oilasining MCU-larini dasturlashning umumiy tamoyillari

Assambleya yoki C?
AVR dasturlash usullari va vositalari
Kod muharriri
AVR Studio haqida
Assemblerni tartibga solish
Dasturchilar
Hex fayllar haqida
AVR assembler buyruqlari, ko'rsatmalari va yozuvlari
Raqamlar va ifodalar
Direktivlar va funktsiyalar
AVR dasturining umumiy tuzilishi
Ishlov berishni uzish
QAYTA O'RNATISH
Eng oddiy dastur
Kechikish
Hisoblagich dasturi
Interruptlardan foydalanish
Taymer kechikishi
Uzilishlar yordamida hisoblagich dasturi
Konfiguratsiya bitlari haqida

6-bob. AVR buyruqlar tizimi

Boshqaruvni uzatish bo'yicha ko'rsatmalar va SREG registri
Tekshirish-o'tkazib yuborish buyruqlari
Mantiqiy operatsiya buyruqlari
Shift ko'rsatmalari va bit operatsiyalari
Arifmetik ko'rsatmalar
Ma'lumotlarni uzatish buyruqlari
Tizimni boshqarish buyruqlari
Assemblerda standart protseduralarni bajarish
Stack, mahalliy va global o'zgaruvchilar haqida

7-bob. Arifmetik amallar

Standart arifmetik amallar
Ko'p xonali sonlarni ko'paytirish
Ko'p xonali sonlarning bo'linishi
Kasr sonlar bilan amallar
Tasodifiy raqamlar generatori
BCD formatidagi raqamlar bilan operatsiyalar
MKdagi manfiy raqamlar

8-bob. Taymerlarni dasturlash

8 va 16 bitli taymerlar
Berilgan chastota qiymatini shakllantirish
Ortga hisoblash
Vaqtni aniq tuzatish
Chastota o'lchagich va davr o'lchagich
Chastotani o'lchagich
Periodometr
Dinamik displeyni boshqarish
LED ko'rsatkichlari va ularning ulanishi
Dinamik displeyni dasturlash
PWM rejimida taymerlar

9-bob. EEPROM-dan foydalanish

EEPROM-dagi ma'lumotlarning xavfsizligi haqida yana bir bor
EEPROM-ni yozing va o'qing
EEPROMda konstantalarni saqlash

10-bob. Analog komparator va ADC

Analog-raqamli operatsiyalar va ularning xatolari
Analog komparator bilan ishlash
ADC ni komparatorga integratsiya qilish
Ishlash printsipi va hisoblash formulalari
ADC dasturini integratsiyalash
O'rnatilgan ADC
ADC foydalanish misoli
Dastur

11-bob: SPI dasturlash

SPI orqali asosiy operatsiyalar
Uskuna varianti
Dasturiy ta'minot opsiyasi
Doimiy xotira turlari haqida
SPI orqali flesh xotirani yozish va o'qish
SPI orqali 45DB011B xotirasi bilan almashish dasturi
Fleshli kartalarni yozish va o'qish
MMS kartalarini ulash
Buyruqlarni topshirish va MMCni ishga tushirish
MMS yozish va o'qish

12-bob. TWI (12C) interfeysi va undan amaliy foydalanish

Asosiy 12C protokoli
12C protokolining dasturiy emulyatsiyasi
Ma'lumotlarni tashqi doimiy xotiraga yozish
AT24 xotirasi bilan almashish rejimlari
Dastur
12C interfeysli soat
Ma'lumotlarni yozib olish
Ma'lumotlarni o'qish

13-bob. UART/USART dasturlash

UARTni ishga tushirish
Ma'lumotlarni uzatish va qabul qilish
UART yordamida DS1307 soatini sozlash misoli
Aloqa buzilishidan himoya qilish usullari
Paritet tekshiruvi
To'g'ri almashinuvni qanday tashkil qilish kerak
Qo'shimcha USART xususiyatlari
RS-232 va RS-485 interfeyslarini amalga oshirish
RS-232 uchun darajali konvertorlar
RS-485

14-bob. Quvvatni tejash rejimlari va Watchdog taymer

Energiyani tejash rejimini dasturlash
Batareya bilan ishlaydigan qurilmaga misol
Dasturni yakunlash
Kuzatuv taymeridan foydalanish

ILOVALAR

1-ilova. Atmel AVR mikrokontrollerlarining asosiy parametrlari

2-ilova. Atmel AVR buyruqlari
Arifmetik va mantiqiy ko'rsatmalar
Bit bilan ishlash bo'yicha ko'rsatmalar
Taqqoslash buyruqlari
O'tkazish buyruqlarini boshqarish
Shartsiz o'tish va subprogramma chaqiruv buyruqlari
Tekshirish-o'tkazib yuborish ko'rsatmalari va shartli filial ko'rsatmalari
Ma'lumotlarni uzatish buyruqlari
Tizimni boshqarish buyruqlari

3-ilova. Dastur matnlari
SPI interfeysi orqali 45DB011B flesh-xotirasi bilan ma'lumotlarni almashish uchun demo dasturi
12C interfeysi orqali protseduralarni almashish

4-ilova. Shaxsiy kompyuter bilan ma'lumotlar almashinuvi va UART orqali dasturlarni tuzatish
Delphida COM port bilan ishlash
COM porti va Windows API
Tayyor komponentlar orqali COM bilan ishlash
DOS va Windows-da RTS liniyasini o'rnatish
COM2000 dasturi
Terminal dasturi yordamida dasturlarni disk raskadrovka qilish

5-ilova. Umumiy qisqartmalar va atamalar lug'ati
Rus tilidagi atamalarning ingliz tiliga tarjimasiga muvofiqligi
Ingliz tilidagi atamalarning rus tiliga tarjimasiga muvofiqligi

Adabiyot
Mavzu indeksi

Hammaga xayrli kech! Men "assembler" deb nomlangan shinam dunyodan translyatsiya qilaman. Mavzu AVR mikrokontrollerlariga tegishli ekanligini darhol aniqlab beraman - va bu post assemblerdan boshqa har qanday vazifa uchun foydalanmoqchi bo'lganlar uchun foydali bo'ladimi yoki yo'qligini hali bilmayman. Gap shundaki, bir necha kun oldin men assemblerni noldan o'rganishni boshladim - bitta qurilma yasashim kerak - va men unda hamma narsani o'zim qilishga qaror qildim. Shunday qilib, bir kuni men buni tushunib etdim Assemblerni o'rganish mutlaqo foydasiz! Assambleya tilini faqat tushunish mumkin! Ya'ni, assembler tilida dasturlashmoqchi bo'lganlarning barchasiga mikrokontroller JISMONIY qanday ishlashini batafsil o'rganishingizni va keyin buyruqlarning nozik tomonlarini o'rganishingizni qat'iy tavsiya qilaman.
Shunday qilib, men sizga boshidan aytib beradigan kichik maqolalar seriyasini boshlayman qanday aniq Assembler tilini dasturlashda ba'zi narsalarni tushundim - menimcha, ASM nima ekanligini umuman tushunmaydiganlar uchun men bu masalada juda yaxshi bo'lganlarning tilidan shunday "tarjimon" bo'laman.

Darhol aytamanki, men DIHALT tashabbusi bilan bu mavzuga ozmi-koʻpmi kirganman - shuning uchun bu maqolalar super-duper assembly-mikrokontroller tilidan ko'pchilik uchun tushunarli tilga tarjimaning bir turi bo'ladi. Umid qilamanki, o'yin davom etar ekan, gurular meni tuzatadilar va agar men birdan noto'g'ri tushuntirsam, ular meni tuzatadilar.
Shunday qilib, bir necha kun oldin assembler haqida qilgan birinchi xulosalar meni hayratda qoldirdi - va men soat 23:00 dan ertalabki 5 gacha DI HALT maqolalarini o'qib o'tirdim - shundan so'ng mamnun va xursand bo'lib uxladim. mikrokontrollerlar uchun assembler tilini dasturlash.
Buni qanday qilib soddaroq tushuntirish mumkin? Menimcha, biz mohiyatdan boshlashimiz kerak.
***
Dastlab, biz texnik tafsilotlarga kirmaymiz (ular haqida keyingi maqolada gaplashamiz) - shunchaki 3 ta belgi borligini tasavvur qiling:
1. Mikrokontroller - Bu rus tiliga kelgan ingliz Stiv. U ingliz tilini mukammal biladi, lekin rus tilini umuman tushunmaydi - bitta so'z ham yo'q. Faqat ingliz tili. U bahsda mag‘lub bo‘ldi va rus undan so‘ragan ishni so‘roqsiz bajarishga va’da berdi.
2. Yig'uvchi - Bu onasi ingliz va otasi rus bo'lgan tarjimon Vasya. U ingliz va rus tillarini mukammal biladi.
3. Biz - Bu rus, unga ingliz kelgan. Xo'sh, ya'ni biz bizmiz =) Shu bilan birga, biz rus tilini mukammal bilamiz va (!!!) ozgina ingliz tilini - ozgina, lug'at bilan.
***
Bu vaziyatni tasavvur qiling - bir ingliz sizning xonangizdagi stulda o'tiradi. Va siz kompyuteringizda o'tirib, ushbu xabarni o'qiyapsiz, birdan derazangiz to'satdan ochildi! Bu omadsizlik! Shamol esmoqda, parda yelkanga aylandi... Yopsa yaxshi bo‘lardi! Ammo stuldan turish, oyoqlaringizni tizim blokidan olish, ularni shippaklarga solib qo'yish, kofe (pivo) ni qo'yish va elementlarga qarshi kurashish juda dangasa. Va keyin siz to'satdan xonada garovini yo'qotgan ingliz borligini va uni ta'qib qilish vaqti kelganini tushunasiz! Va siz unga shunday shirinlik bilan aytasiz: “Do'stim! Iltimos, derazani yoping, keyin yana stulga o'tiring! va u o'tiradi, sizga hayron bo'lib qaraydi va hech narsa qilmaydi! Siz, albatta, karam sho'rvasini urishingiz mumkin - lekin keyin u sizni hali ham tushunmaydi! Keyin siz tarjimon do'stingiz Vasiliyni chaqirasiz - u kelib, inglizning yoniga stulga o'tiradi. Va siz aytasiz - Tarjima: "Stiv, borib derazani yoping va keyin stulga o'tir!" Tarjimon ingliz tiliga tarjima qiladi - ingliz tushunadi va borib derazani yopadi, keyin kelib stulga o'tiradi.
Shu nuqtada, siz ushbu "Biz-Assembler-Controller" zanjirida assemblerning rolini tushunishingiz kerak.
Ya'ni, assembler nima ekanligini hamma qanday tushunadi? Keyin o'qing.
***

Shunday qilib, keling, bu vaziyatni tasavvur qilaylik. Siz Vasyaga aytasiz: "Quloq soling, qisqasi, men uyda kalkulyatorni unutib qo'ydim, 56983 ni 2 ga bo'ling va Stivga mushtlaringiz bilan juda ko'p push-up qilishni ayting" va Vasya kalkulyatorda hisoblaydi va Stivga ingliz tilida "Mushtlaringiz bilan 28491 marta push-up qiling" deb ataladi "DIREKTIVA"- boshqacha qilib aytganda, direktiv Vasya uchun vazifa bo'lib, uning natijasi Stivning harakatidir.

Yana bir holat bor - siz Vasyaga "Stivga 28491 marta push-up qilishni ayting" deysiz va Vasya so'zlaringizni ingliz tiliga tarjima qiladi. U deyiladi OPERATOR

Hammasi oddiy - direktiv bor va operator mavjud. Operator sizning to'g'ridan-to'g'ri Stivga nima qilish kerakligi haqida ko'rsatma beradi - bu erda Vasya sizning so'rovingizni faqat ingliz tiliga tarjima qiladi. Ko'rsatma Vasyaning o'zi uchun vazifadir - va Vasya avval siz unga aytganingizni qiladi, keyin esa natijaga qarab u Stivga nimadir aytadi.

Endi biz inglizni muntazam ravishda qiynoqqa solamiz! Lekin birinchi navbatda tarjimonimiz Vasyani yaxshiroq bilishimiz kerak. Siz quyidagilarni bilishingiz kerak - Vasya har doim sizga so'zsiz bo'ysunadi - unga aytilgan narsani qiladi. Vasya kalkulyatorida o'nlik kasrlar yo'q - agar siz misolni push-up bilan ko'rib chiqsangiz, u holda 56983 \ 2 = 28491,5 - lekin o'nli nuqta kesilgandan keyin Vasya hamma narsa - va u faqat butun sonni ko'radi - va bu muhim emas. 28491.000001 bo'ladimi yoki 28491.9999999 bo'ladimi - Vasya uchun bu bitta katta ish har ikkala holatda ham 28491 bo'ladi. Hech narsa yumaloq emas. Vasya haqida muhimroq ma'lumot. Vasya shafqatsiz - u Stivning yigirma sakkiz ming marta push-up qilayotganiga ahamiyat bermaydi. Ular unga Vasya tarjima qilganini aytishdi. Va u nafaqat tarjima qildi, balki meni siz so‘raganingizni qilishga majbur qildi. Shunday qilib, agar Stiv yigirma uch ming besh yuz o'n uchinchi surishda vafot etsa, bu butunlay sizning aybingiz bo'ladi.

Aslida, hozircha hammasi shu. Keyingi postda biz chuqurroq qazamiz - hozircha buni tushunish kifoya. Shunchaki vaziyatni tasavvur qiling va nima ekanligini, kim qanday rol o'ynashini va direktiv operatordan qanday farq qilishini tushuning.
Va keyin biz hamma narsani o'z nomi bilan chaqirishga harakat qilamiz va assembler kattalar kabi mikrokontroller bilan qanday ishlashini taxminiy baholaymiz.

Sizga maqola yoqdimi? Do'stlaringizga ulashing: