Mundarija:

ATtiny2313: 9 qadamli o'qish kalitlari
ATtiny2313: 9 qadamli o'qish kalitlari

Video: ATtiny2313: 9 qadamli o'qish kalitlari

Video: ATtiny2313: 9 qadamli o'qish kalitlari
Video: Использование плат Digispark Attiny85 Mini Arduino: Урок 108 2024, Iyul
Anonim
ATtiny2313 bilan o'qish kalitlari
ATtiny2313 bilan o'qish kalitlari

ATtiny2313 va shunga o'xshash AVR qurilmalarining chiqishlari bilan shug'ullanadigan bir nechta ko'rsatma mavjud. Masalan, https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- AVR-mikroprotsessorli dvigatel/. Real Elliot -dan so'nggi dvigatelni boshqarishni ko'rsatib, bir xil dasturda kodning boshqa bo'limlarini ishga tushirish juda foydali bo'lardi, shuning uchun men har bir ATtiny2313 dasturini qayta dasturlashim shart emasligini aniqladim. Men kodning ozgina o'zgarishini sinab ko'rmoqchi edim (masalan, yarim qadam yoki teskari yo'nalishda yurish). Muqobil variantlarni tanlashga ruxsat berish uchun switch/case iborasi yordamida kod yozish oson bo'lsa -da, ishni tanlashning qandaydir usuli kerak. Bu shuni anglatadiki, ishni nazorat qilish uchun qandaydir kirish moslamasini o'qish kerak. Yaxshiyamki, ATtiny2313 ko'plab kirish-chiqish pinlariga ega va kalitlardan kirishni o'qish uchun yaxshi mo'ljallangan. Bu ko'rsatma kirishni o'qish va ularning holatiga qarab qaror qabul qilishni ko'rsatadi. Faqat bu juda zerikarli ko'rsatmalarni yaratadi, shuning uchun men ATtiny2313 ning taymer/hisoblagich qobiliyatidan foydalanib, kichkina karnayni ovozli signal sifatida ishlatishning oddiy usulini tushuntiraman. Bundan tashqari, disk raskadrovka qilishning oddiy texnikasi bo'yicha kichik burilish bo'ladi.

1 -qadam: Kirish qurilmasi

Kirish qurilmasi
Kirish qurilmasi
Kirish qurilmasi
Kirish qurilmasi

Bu ko'rsatma Real Elliotning zo'r ishiga asoslanadi va u tasvirlagan ATtiny2313 Getto ishlab chiqish tizimidan foydalanadi. Atmel ATtiny2313 ma'lumot varaqasi barcha funktsiyalar uchun yakuniy ma'lumotdir, lekin o'qish oson emas. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Havolada barcha AVR ma'lumotlar varaqlari bor, 2313 -ni toping.) Rasmda oddiy kirish kalitlari to'plami ko'rsatilgan. Bu shunchaki to'rtta yoqish/o'chirish tugmachalari to'plami; bitta qutbli, bitta otish kalitlari (SPST) sifatida ham tanilgan. Odatda, har bir kalitning bitta ulanishi yoki qutbasi erga ulanadi, ikkinchisi esa oqim cheklovli rezistor orqali yuqori tortiladi (10K yoki shunga o'xshash). Qutbga rezistor bilan mikrokontroller kirishi ulangan. Agar kalit ochiq bo'lsa, mikrokontroller kirishni HI sifatida o'qiydi. Agar kalit yopiq bo'lsa, mikrokontroller LO kirishini o'qiydi. ATtiny2313, kirishlar sifatida konfiguratsiya qilinganida, kirish-chiqish pimlarida dasturlashtiriladigan tortishish rezistorlari bilan ta'minlab, ishlarni soddalashtiradi. Bu shuni anglatadiki, kalitlar bitta qutbni erga (LO), ikkinchisini esa protsessor kirishiga ulangan bo'lishi mumkin. Birinchi misol faqat ikkita kalitni ko'rsatadi. Kommutatorlar quyidagi kod bilan o'qiladi va konfiguratsiya qilinadi. Kommutatorlarni kirish sifatida sozlang: (kod talab qilinmaydi; bu sukut bo'yicha.) Rezistorlarni torting: PORTB = _BV (PB0) | _BV (PB1); Kirishni o'qing: but1 = ~ PINB & 0x03; To'g'ri qiymatni olish uchun inversiya va niqobdan foydalanishga e'tibor bering.

2 -qadam: signal uchun miltillovchi chiroqlar

Biz bu ikki kalitni LEDni dasturlashtiriladigan marta yonib o'chirish uchun ishlatamiz. Biz foydalanadigan svetodiodlar "Real Elliot" mashhur qilgan chiroqlardir. 1 va 2 -kalitlar ikkita ikkilik raqam sifatida ko'rib chiqiladi, shuning uchun kombinatsiya 0, 1, 2 va 3 raqamlarini ko'rsatishi mumkin. Bizning dasturimiz ikkita kalitni o'qiydi va LEDni kerakli sonda miltillatadi. sozlamalar o'zgardi. Kalitlar 500 millisekundga chiqariladi (optimallashtirilmagan). Chiqib ketish algoritmi juda oddiy. Kalitlar o'qiladi va o'qish qayd etiladi. Agar u oldBut qiymatidan (oxirgi saqlangan qiymat) farq qilsa, dastur 500 millisekundga kechiktiriladi va kalitlar qayta o'qiladi. Agar qiymat avval o'qilgan bilan bir xil bo'lsa, oldBut qiymati yangilanadi va svetodiod ikkita kalitning ikkilik qiymati bilan necha marta yonadi. Qiymatning teskarisiga e'tibor bering, chunki "yoqilgan" kalit LO ni o'qiydi. Keyingi o'zgarishlar uchun kalitlar doimiy ravishda skanerdan o'tkaziladi. Yorug'lik chiroqlari haqida ko'proq ma'lumot olish uchun Real Elliot -ning oldingi ko'rsatmalariga qarang. Kalitlarni o'chirish haqida ko'proq ma'lumot olish uchun https://www.ganssle.com/debouncing.pdf ga qarang. Bu misol uchun ATtiny2313 kodi. Ishlayotganda, bu dastur PB4 (jismoniy pin 8) diodini ikki marta miltillatadi va uni ishga tushirilishini ko'rsatadi. Keyin u bir va ikki kalitlarni o'qiydi va ular o'zgartirilganda, kalit sozlamalariga qarab, birdan uch marta miltillaydi. Qachonki kalitlar o'zgarmasa, LED sekin yonadi, bu kodni ishga tushirish uchun yangi katalog yarating (agar xohlasangiz, uni "Asosiy" deb nomlang) va quyidagi C kodli faylni yuklang. Makefile1.txt nomini Makefile deb o'zgartiring. WinAVR -dan foydalanib, dasturni kompilyatsiya qiling va uni ATtiny2313 -ga yuklang.

3 -qadam: Nosozliklarni tuzatish bo'yicha kichik burilish

Agar siz menga o'xshagan bo'lsangiz (va dunyodagi har bir boshqa dasturchi), ehtimol siz ehtiyotkorlik bilan kiritgan va tuzgan "xatosiz" kod siz kutgan narsani qilmagan paytlarni boshdan kechirgansiz. Ehtimol, bu hech narsa qilmaydi! Xo'sh, muammo nimada? Buni qanday bilib olasiz? Yaxshiyamki, narsalarni ishga solishning bir qancha yondashuvlari mavjud. (Nosozliklarni tuzatish mavzusini mukammal davolash uchun ushbu kitobni oling. Http://www.debuggingrules.com/) Men mikrokontroller dasturlarini tuzatish mavzusiga oid bir nechta oddiy takliflarni taklif qilmoqchiman. nima bilasiz. Agar siz bir marta ishlash uchun yonib -o'chib turgan bo'lsangiz, dasturdan qayerda ekanligingizni ko'rish uchun uni qayta ishlating. Men dasturning boshlanishini bildirish uchun LED ikki marta yonib turishini yoqtiraman. Buni amalga oshirish uchun kodni dasturingiz boshida kiritishingiz mumkin. Sizning qurilmangizda hech qanday muammo yo'qligini bilganingizdan so'ng, miltillash funktsiyasini yarating. Mana men foydalanadigan funksiya./*------------------------------------------ ------------------------------ ** blinkEm-PD4 ** PD4 yordamida LEDni o'chirish funktsiyasi chiqish sifatida sozlanishi kerak. ** ------------------------------------------------ ---------------------*/void blinkEm (uint8_t count) {while (count> 0) {PORTD = _BV (PD4); _delay_ms (1000); PORTD = ~ _BV (PD4); _delay_ms (1000); hisoblash-; }} Endi bu funktsiyani kodning turli nuqtalarida, kod shu paytgacha bajarilganligini bildiruvchi signal sifatida ishlatish mumkin. Kod ishlayotganligini bilish, xatolarni topish uchun siz bajargan, lekin kutganingizni qilmagan har bir bo'limni sinchiklab tekshirishingiz mumkin. Bir vaqtning o'zida bitta narsani o'zgartirish - bu disk raskadrovka qilishning asosiy usuli (yuqoridagi havolada tasvirlangan). Bu klassik usul "bo'linish va zabt etish" bilan bir qatorda ishlaydi: asta -sekin funktsiyalarni qo'shish uchun chaqaloq choralarini ko'rish. Bu sekin yondashuv bo'lib tuyulishi mumkin, lekin u ishlamayotgan kodning katta qismini birdaniga disk raskadrovka qilish kabi sekin emas.

4 -qadam: Ko'proq disk raskadrovka

Ko'p hollarda, biz kodning bir qismini tekshirishni, undagi qatorlarning ko'pini o'tkazib yubormoqchi bo'lamiz, so'ngra har birining ishlashini tekshirib, ularni birma -bir ishga solamiz. Odatda biz buni o'tkazib yubormoqchi bo'lgan satrlarni "izohlash" orqali qilamiz. Ushbu texnikaning kengaytmasi - bu kod blokini kesish va joylashtirish, asl nusxasini sharhlash (shuning uchun biz uni yo'qotmaymiz) va nusxasini buzib tashlash. C. chiziqlarni izohlashning to'rtta oson usuli bor. Qator oldiga "//" qo'yilsa, bu chiziq izohlanadi. "/*" Va "*/" belgilariga bir yoki bir nechta satr qo'shilsa, butun bo'lim sharhlanadi. Bu usulning samarali ishlashi uchun kod blokida boshqa "*/" belgisi bo'lmasligi kerak (oxiridan tashqari). Shunday qilib, samarali intizom - bu kod bloklari ichidagi izohlar uchun //dan foydalanish va sharhlar bloklari va kod bo'limlarini sharhlash uchun / * * / konstruktsiyasini bron qilish. Blok boshida "#if 0" ni qo'yish va bo'limni "#endif" bilan tugatish. Ko'proq tanlashni blokning boshida "#ifdef (identifikator)" va oxirida "#endif" yordamida amalga oshirish mumkin. Agar siz blokni kompilyatsiya qilishni xohlasangiz, dasturning boshida "#define (identifikator)" dan foydalaning. E'tibor bering, tirnoq belgilari faqat ta'kidlash uchun mo'ljallangan va kiritilmaydi, bu usullarni birlashtirish ATtiny2313 dasturlarini disk raskadrovka qilishda foydali yondashuvni ta'minlashi kerak. Ushbu ko'rsatmalarni ko'rib chiqayotganimizda, siz ushbu vositalarni foydali deb topishingiz mumkin.

5 -qadam: Bip signallari uchun taymer/hisoblagich 0 dan foydalanish

Ovozli signal uchun taymer/hisoblagich 0 dan foydalanish
Ovozli signal uchun taymer/hisoblagich 0 dan foydalanish

ATtiny2313 ikkita kuchli taymer/hisoblagich manbasiga ega: bittasi 8 bitli va 16 bitli. Bular chastota generatorlari, o'zgarmaydigan puls kengligi modulyatsiyasi regulyatorlari va chiqish taqqoslash registrlari sifatida tuzilishi mumkin. Ularning to'liq funksionalligi ma'lumotlar sahifasining 49 sahifasida tasvirlangan. Biroq, biz oddiy holatdan foydalanamiz. Faqat taymer/hisoblagich 0 (8 bitli) ishlatiladi va u faqat chastota generatori sifatida ishlatiladi. Bip signalini chiqarish uchun chastota kichik karnayga yo'naltiriladi. Taymer/Hisoblagich 0 ATtiny2313 ma'lumot varag'ining 66-83 -betlarida to'liq tasvirlangan. Bu materialni yaqindan o'qish sizga vaqt/hisoblagich 0 haqida to'liq tushuncha beradi. Yaxshiyamki, taqqoslashda aniq taymer (CTC) - biz xohlagan ovozli signalni ishlab chiqarish uchun etarli.

Biz foydalanadigan rejim uchun taymer/hisoblagich to'g'ridan-to'g'ri ishlaydi. Agar soat signali tanlansa, hisoblagich noldan boshlanadi va har bir soat pulsini oshiradi. Hisoblagich qiymati Chiqish taqqoslash reestridagi (TOP) qiymatga yetganda, hisoblagich nolga qaytariladi va hisoblash yana boshlanadi. Taymer/hisoblagich bilan bog'langan chiqish biti kvadrat to'lqinli chiqish uchun almashtiriladi. Bu to'g'ridan -to'g'ri ovoz o'tkazgichni ovozli signal chiqarishga undaydi. Kichik TDK ovoz o'tkazgichi signal beradi. Mos keladigan birlik-bu Digikey 445-2530-ND, TDK SD1209T3-A1 (men buning dastlabki versiyasini ishlatganman). Bu 3 voltli versiya; 5 voltli versiya ham men kutganidek ishlaydi. Men buni Attiny2313 chiqish portidan to'g'ridan -to'g'ri haydab chiqaraman va u yaxshi ishlaydi. Sparkfun shunga o'xshash qurilmaga ega.

6 -qadam: Taymer/hisoblagichni sozlash 0

CTC rejimi OC0A chiqishini 2 -pin, B portiga (jismoniy pin 14) almashtirish uchun ishlatilishi mumkin. Ushbu pinni chiqarishni yoqish uchun DDRB mos ravishda sozlanishi kerak. Buning uchun C kodi, milt -milt yorug'lik uchun chiqishni o'rnatishga o'xshaydi. DDRB = _BV (PB2); // Port B2 - bu chiqish. Keyingi qadam - soat signalini berish va chastota sifatida to'lqin shaklini ishlab chiqarish uchun chiqish taqqoslash registrini yuklash. Olingan chastotaning tenglamasi ma'lumotlar jadvalida keltirilgan (72 -bet). Tenglama shartlari quyida tavsiflanadi. Bu erda tenglama: fOC0A = fclk_I/O/2*N*(1+OCR0A) Bu erda fOC0A: = chiqish chastotasi fclk_I/O: = soat manba chastotasi N: = soatni oldindan hisoblash omili OCR0A: = Taymer uchun chiqish taqqoslash registri qiymati/ Hisoblagich 0A. Soat manba chastotasi, fclk_I/O Bu tizim soatining chastotasi. Standart qiymat - 1 MGts. TCCR0B ning CS00, CS01 va CS02 bitlari bu tanlovni boshqaradi. Bu bitlar ham N qiymatini tanlaganligi uchun, u keyingi ta'riflanadi. Narsalashtirish qiymati, NN - bu tizim soatini bo'linish yoki oldindan o'lchash uchun ishlatiladigan qiymat. TCCR0B ning CS00, CS01 va CS02 bitlari bu tanlovni boshqaradi. ATtiny2313 ma'lumot varag'i 81 -betidagi 41 -jadval kombinatsiyalarni tavsiflaydi. Chastotani 1 kHz ga yaqin bo'lganligi sababli, TCCR0B ning CS00 va CS01 bitlari o'rnatiladi. E'tibor bering, barcha uch bitni 0 ga o'rnatish, shuning uchun soat manbasini tanlamaslik, chiqishni samarali to'xtatadi. Bu ovozli signalni ishga tushirish va to'xtatish uchun ishlatiladi. TOP qiymati, OCR0Bu qiymat taymer/hisoblagich 0A uchun chiqishni taqqoslash reestriga yuklangan hisoblagich uchun eng yuqori qiymatdir. Bu qiymatga yetganda, hisoblagich nolga qaytariladi va TOPga yetguncha va tsikl takrorlanmaguncha hisoblash yana boshlanadi. TOP osongina o'zgartiriladi, shuning uchun signal signalining chastotasini o'zgartirish oson. Chastotani 1 kHz ga yaqin bo'lgani uchun, TOP 7 ga o'rnatiladi. (E'tibor bering, oldindan hisoblagich 8 ga, TOP 63 ga o'rnatilishi mumkin edi. Xuddi shu natija - sizning tanlovingiz.) Chiqish chastotasi, fOC0A Chiqish chastotasi natijalarini hisoblash uchun tenglamadan foydalanib. ichida: fOC0A = 1, 000, 000 /2 * 64 * (1+7) fOC0A = 977 Gts Yoping! Chiqish taqqoslash reestri va taymer hisoblagichini boshqarish registrini 0B yuklash kodi. Iltimos, qanday ishlatilishini tushunish uchun dasturning haqiqiy kodini ko'ring. OCR0A = 7; // Vaqt qiymati TCCR0B = _BV (CS01) | _BV (CS00); // Ichki soatni tanlang & prescale = 8 TCCR0B = 0; // soat manbai ohangni o'chirmaydi Vaqt/hisoblagich rejimini o'rnatish Oxirgi tafsilot sifatida biz taymer/taymerni nazorat qilish registri 0A da kerakli bitlarni o'rnatib, xohlagan taymer/hisoblagich rejimini belgilaymiz. CTC rejimi ma'lumotlar jadvalining 40 -jadvali, 79 -betda tasvirlangan WGM01 bitini sozlash orqali tanlanadi. Chiqish har bir tsiklga o'tishini xohlaganimiz uchun, COM0A0 biti ham 77 -sahifada 34 -jadvalda tasvirlanganidek o'rnatilishi kerak. Bu erda kod: TCCR0A = _BV (COM0A0) | _BV (WGM01); // CTC o'tish rejimi

7 -qadam: To'rt kalitni ishlatish

Biz ovozli signalni ishga tushirganimizda, keling, to'rtta kalitni boshqarish uchun qo'shimcha qurilmalar va dasturiy ta'minotni kengaytiraylik. Taymer hisoblagichi 0A chiqishi B portida, 2 -pinda bo'lgani uchun, biz B portiga ketma -ket ko'proq kalitlarni ulay olmaymiz. D portidan foydalanish oson echim bo'lar edi, lekin keling, bu portni boshqa funktsiyalar uchun ham saqlaylik. qadam dvigateli). Keling, qo'shimcha kalitlarni PB3 va PB4 ga ulaylik. Kalitlarni o'qish asosan o'zgarmaydi. Niqob qiymati 0x1B (00011011 ikkilik) ga o'zgartirilib, 2-bitni 5, 6 va 7 bilan birga maskalash uchun 4 bitli ikkilik raqamni yaratish uchun yana bir hiyla ishlatiladi. 3 va 4 -bitlarni bir o'ngga siljiting va ularni 0 va 1 -bitlar bilan 4 bitli ikkilik raqamga birlashtiring. Bu bitlarni almashtirish va birlashtirish uchun standart C sintaksisi, lekin yangi boshlovchiga yaxshi ma'lum bo'lmasligi mumkin. but1a = (but1 va 0x03) | ((lekin1 va 0x18) >> 1); // but1 o'qish tugmachasiga ega, Ishlayotganda, dastur ikki marta miltillaydi va ishga tushirish signalini berish uchun ikki marta signal beradi. Qachonki, kalitlar o'zgartirilsa, ular ko'rsatadigan raqam signal beradi. Qachonki kalitlar o'zgarmasa, LED yonadi, bu kodni ishga tushirish uchun yangi katalog yarating (agar xohlasangiz, uni ovozli signal deb chaqiring) va quyidagi C kodli faylni yuklab oling va unga fayl qo'ying. Makefile2.txt nomini Makefile deb o'zgartiring. WinAVR -dan foydalanib, dasturni kompilyatsiya qiling va uni Attiny2313 -ga yuklang.

8 -qadam: Switch/case konstruktsiyasidan foydalanish

Oxirgi qadam "faqat dasturiy ta'minot": va'da qilinganidek, biz switch/case konstruktsiyasini amalga oshiramiz. Bu misol faqat ikkita muqobil harakatni ko'rsatsa -da, bir nechta muqobil kod bo'limlaridan birini tanlash uchun ushbu tuzilmadan qanday foydalanish kerakligi aniq bo'lishi kerak. Amalda, bu dastur kalitlarni kuzatadi va agar o'zgarish bo'lsa, u g'alati bo'lsa, tegishli raqamga signal beradi; agar raqam teng bo'lsa, u miltillaydi. Agar kalit o'zgarmasa, u hech narsa qilmaydi.

Ushbu kodni ishga tushirish uchun yangi katalog yarating (agar xohlasangiz, uni Switch deb nomlang) va quyidagi C kodli faylni yuklab oling va unga fayl qo'ying. Makefile3.txt nomini Makefile deb o'zgartiring. WinAVR -dan foydalanib, dasturni kompilyatsiya qiling va uni Attiny2313 -ga yuklang.

9 -qadam: Xulosa

Xulosa
Xulosa

Demak, hammasi shu! Endi siz dasturni bajarilishini nazorat qilish uchun kalitlardan qanday foydalanishni bilasiz, ularni o'qish va almashtirish sozlamalari asosida harakatni tanlash. Siz, shuningdek, qanday qilib signal ohangini yaratishni bilasiz va disk raskadrovka strategiyasini o'rgangansiz.

Agar siz o'z tushunchangizni sinab ko'rishni xohlasangiz, oxirgi dasturni baland ovozda signal berish uchun o'zgartirishga harakat qiling, agar g'alati bo'lsa, past ovozli signal bering va kalitlarda hech qanday o'zgarish bo'lmasa, doimiy ravishda LEDni yonib turing. yordam uchun disk raskadrovka bo'limiga qaytib.

Tavsiya: