Mundarija:

AVR Assembler qo'llanmasi 7: 12 qadamlar
AVR Assembler qo'llanmasi 7: 12 qadamlar

Video: AVR Assembler qo'llanmasi 7: 12 qadamlar

Video: AVR Assembler qo'llanmasi 7: 12 qadamlar
Video: MKS SGEN L V1.0 - A4988 Stepper Drivers 2024, Iyul
Anonim
AVR Assembler bo'yicha qo'llanma 7
AVR Assembler bo'yicha qo'llanma 7

7 -darsga xush kelibsiz!

Bugun biz birinchi navbatda klaviaturani qanday tozalashni ko'rsatamiz, keyin esa klaviatura bilan aloqa qilish uchun analog kirish portlaridan qanday foydalanishni ko'rsatamiz, biz buni uzilishlar va bitta simli kirish sifatida qilamiz. Biz klaviaturani sim bilan bog'laymiz, shunda har bir klaviatura analog kirishga yagona kuchlanishni yuboradi, bu bizga qaysi tugma bosilganini kuchlanish bilan ajratish imkonini beradi. Hamma narsa kerakli tarzda sodir bo'layotganini ko'rsatish uchun biz registr analizatoriga bosilgan raqamni chiqaramiz, ATmega328p -da analogdan raqamli konvertorni (ADC) ishlatganda siz bir qator qiyinchiliklarga duch kelishingiz mumkin. yo'lda narsalarni bir necha bosqichda ko'rib chiqing va ulardan qanday qochish kerakligini aniqlang. Bundan tashqari, nima uchun analog -raqamli konvertorni ishlatish mikrokontrollerda kamroq port ishlatsa ham, klaviaturani boshqarishning eng yaxshi usuli emasligini ko'rib chiqamiz.

  1. klaviatura. Siz bittasini sotib olishingiz mumkin yoki siz men qilgan ishni qila olasiz va birini tozalaysiz.
  2. Klaviatura uchun 2 ta ayol sarlavhasi (agar siz uni olib tashlasangiz)
  3. ulash simlari
  4. non taxtasi
  5. 4 1 Kohmli rezistorlar
  6. 1 15 Kohm qarshilik
  7. 1 3.3 Kohm qarshilik
  8. 1 180 ohmli qarshilik
  9. 1680 ohmli qarshilik
  10. raqamli multimetr
  11. 5 -darsdan sizning analizatoringiz

Agar sizda allaqachon klaviatura bo'lsa va uni tozalash shart bo'lmasa, siz birinchi qadamlarni o'tkazib yuborishingiz mumkin.

Bu erda AVR assambleyasi bo'yicha darsliklarimning to'liq to'plamiga havola:

1 -qadam: Klaviatura 1ni o'chiring

Klaviaturani o'chirish 1
Klaviaturani o'chirish 1
Klaviaturani o'chirish 1
Klaviaturani o'chirish 1
Klaviaturani o'chirish 1
Klaviaturani o'chirish 1
Klaviaturani o'chirish 1
Klaviaturani o'chirish 1

Qadim zamonlarda, hatto sizning ota -bobolaringiz ham bolaligida, odamlar bir -birlari bilan muloqot qilish uchun devorga uzun kabellar ulangan, g'alati ko'rinadigan asboblardan foydalanardilar. Ularni "telefonlar" deb atashardi va odatda kimdir sizga qo'ng'iroq qilganda bezovta qiladigan ovoz chiqaradigan arzon plastik buyumlar edi (bugungi "Jastin Biber" ning ohanglari ham bir xil darajada bezovta qilmaydi). Qanday bo'lmasin, bu qurilmalarda klaviaturalar bor edi, ular simlar bilan o'ralgan edi, shuning uchun ularni tozalash oson, va siz ularni qayta sotib olishni xohlagan klaviaturada ikkita qo'shimcha kalit ("qayta terish" va "chirog'i") bor. "o'q tugmachalari", "menyu tugmachalari" yoki boshqa narsalar kabi, biz eski telefondan klaviaturani tozalashdan boshlaymiz. Birinchidan, telefonni oling (men rasmda ko'rsatilgandek GE -ni ishlataman) va simni ochish uchun uni ajratib oling, so'ng pichoqni oling va klaviaturani ushlab turgan plastmassa tugmachalarni echib oling va klaviaturani olib tashlang.

2 -qadam: Klaviatura 2 -ni o'chiring

Klaviatura 2 ni o'chiring
Klaviatura 2 ni o'chiring
Klaviatura 2 ni o'chiring
Klaviatura 2 ni o'chiring
Klaviatura 2 ni o'chiring
Klaviatura 2 ni o'chiring

Endi PVX arra oling va plastmassani kalit teshiklari atrofidan kesib oling, so'ngra ingichka klaviatura qoldirib, chuqurlikni to'g'ri olish uchun chetini kesib oling.

Keyin klaviaturani oxirgi qadamda tepalarini kesib tashlaganingizdan keyin qolgan qoziqlarni ishlating va lehimlantiruvchi dazmol yordamida issiq temirni har bir qoziq teshigiga tiqing, u plastmassani eritib, ustiga yoyib yuboradi. klaviaturaning pastki qismida yangi "tugmalar" paydo bo'ladi, ular klaviaturani avvalgidek ushlab turadi.

Men uchta karnayni tozalashni yoqtiraman. Biroq, bu safar men kalitlarni va boshqa narsalarni tozalashni xohlamayman, chunki bizda boshqa maqsadlar bor. Bundan tashqari, telefon qo'ng'irog'i bo'lgan TA31002 chiziqli IC mavjud. Ma'lumotlar varag'i Internetda osongina topiladi va yuklab olinadi, bu esa pinout va xususiyatlarni beradi. Shuning uchun men uni hozircha taxtaga lehim bilan qoldiraman, keyinroq u bilan o'ynayman. Men uni osiloskopga ulashni va undan qanday ajoyib signallarni olishimni ko'rishni xohlardim. Balki undan eshik qo'ng'irog'ini yasab qo'ygandirsiz. Kim biladi.

Yaxshiyamki, siz telefonni yo'q qilishni va uning qismlarini tozalashni tugatganingizdan so'ng, biz klaviaturani yaratishni tugatamiz.

3 -qadam: Klaviatura 3ni o'chiring

Klaviaturani o'chirish 3
Klaviaturani o'chirish 3
Klaviaturani o'chirish 3
Klaviaturani o'chirish 3
Klaviaturani o'chirish 3
Klaviaturani o'chirish 3

Chiqib ketadigan tayoqchani ishlating va klaviatura ostidagi tasma kabellarini olib tashlang, elektron kartadagi teshiklar aniq ekanligiga ishonch hosil qiling, so'ngra taxtaga ikkita teshikni joylashtiring. Ehtimol, siz 4-pinli sarlavhalar bo'lishi uchun sarlavhalarni kesishingiz kerak bo'ladi.

Sarlavhalar biriktirilganda, siz uni non paneliga ulashingiz, multimetrni olishingiz va multimetrni tasodifiy pimlarga yopishtirib, qarshilikni o'lchash orqali kalitlarni sinab ko'rishingiz mumkin. Bu sizga kalitlarni xaritada ko'rsatishga imkon beradi. Tarmoqqa qarab, kalitlarning chiqishga qanday ulanganini ko'rish qiyin, lekin agar siz multimetrdan foydalansangiz, uni har qanday ikkita pimga ulashingiz mumkin, so'ngra ekranda raqamni ko'rmaguningizcha tugmachalarni bosing.. Bu kalit uchun kalit bo'ladi.

Chiqish pinlari uchun barcha kalitlarni shu tarzda joylashtiring.

4 -qadam: Klaviaturani sim bilan ulang

Klaviaturani sim bilan ulang
Klaviaturani sim bilan ulang
Klaviaturani sim bilan ulang
Klaviaturani sim bilan ulang

Endi ulanish sxemasiga rioya qiling va klaviaturani non paneliga ulang.

Bu qanday ishlaydi, biz 5Vni chap tomonga qo'yamiz va o'ng tomon GNDga o'tadi. Diagrammada o'ngdagi birinchi pin Atmega328p mikrokontrolleridagi analog pinlarimizdan birinchisiga kiradi. Hech qanday tugma bosilmasa, signal 0V bo'ladi, va har bir tugma bosilganda analog portga kirish 0V va 5V oralig'ida bo'ladi, qaysi tugma bosilganiga qarab. Biz qarshilik qiymatlarini tanladik, shunda har bir yo'lda boshqasidan farqli qarshilik bo'lishi mumkin edi. Mikrokontrollerdagi analog port analog signalni oladi va uni 0V dan 5V gacha bo'lgan 1024 xil kanalga ajratadi. Bu shuni anglatadiki, har bir kanalning kengligi 5V/1024 = 0,005 V/kanal = 5 mV/kanalga ega. Shunday qilib, analog port 5 mV dan ortiq farq qilsa, kirish kuchlanishlarini ajrata oladi. Bizning holatlarimizda biz qarshilik qiymatlarini tanladik, shunda har qanday ikkita tugma bosish kuchlanish signalini yuboradi, shuning uchun mikrokontroller qaysi tugma bosilganligini osongina aniqlay oladi. Katta muammo shundaki, butun tizim juda shovqinli, shuning uchun biz har bir tugmani bosish uchun bir qator kuchlanishlarni tanlashimiz kerak bo'ladi, lekin biz bunga birozdan keyin kiramiz.

E'tibor bering, biz 14 tugmachali klaviaturani boshqaruvchiga faqat bitta kirish liniyasi yordamida boshqarishimiz mumkin. Bu analog kirishning foydali jihatlaridan biridir.

Endi biz klaviaturani boshqarishda birinchi urinishimiz - bu tugmachani bosish, uning uzilishi bo'lishi mumkin, uzilishning pastki dasturi analog kirish portini o'qiydi va qaysi tugma bosilganligini aniqlaydi, so'ngra bu raqamni bizning registr analizatorimiz dasturiga chiqaradi, u ekranni ko'rsatadi. 5 -darsda biz o'rnatgan 8 ta LED -dagi ikkilik kalit.

5 -qadam: Klaviaturani analizatoringizga ulang

Klaviaturani analizatoringizga ulang
Klaviaturani analizatoringizga ulang
Klaviaturani analizatoringizga ulang
Klaviaturani analizatoringizga ulang

Rasmlarda biz klaviaturani mikrokontrolderga qanday ulashimiz kerakligi ko'rsatilgan, shuning uchun biz analizator displeyidagi chiqishni ko'rishimiz mumkin. Asosan, biz chiqishni klaviaturadan PortC pin 0 ga o'tkazamiz, u ATmega328P da ADC0 deb ham ataladi.

Biroq, qo'shimcha ikkita narsa bor. Shuningdek, biz tugmani PD2 -ga ulashni rejalashtirmoqdamiz. Ya'ni simni 5V relsdan tugmachaga va tugmachaning boshqa tomonidan PD2 ga olib boring va nihoyat, biz 5V rayimizdan AREF pinini uzib tashlamoqchimiz. Agar xohlasak, 0,1 mikrofaradli ajratuvchi kondansatkichni qo'yishimiz mumkin. Bu keramika kondansatkichi, uning ustiga 104 yozilgan. Birinchi ikkita raqam-bu son va oxirgi raqam-bu 10 ning kuchi, biz uni pikofaradlarda javob olish uchun ko'paytiramiz (pico 10^-12), shuning uchun 104 10 x 10^4 pikofaradni bildiradi, bu xuddi shunday 100 nanofarad (nano 10^-9 degan ma'noni anglatadi), bu 0,1 mikrofarad bilan bir xil (mikro 10^-6). Yaxshiyamki, bularning barchasi AREF pinini barqaror qiladi, chunki biz uni mos yozuvlar pimi sifatida ishlata olamiz.

Shuningdek, biz PD2 va er o'rtasida 1 mohmlik rezistorni xohlaymiz. Biz PD2 ni 0V ga chiqish pimi sifatida o'rnatmoqchimiz va biz bu pinning ijobiy tomonini ishga solamiz. Biz tugmani qo'yganimizda chekka darhol yo'qolishini xohlaymiz, shuning uchun biz "pastga tushirish" rezistorini joylashtiramiz.

Biz tugmachani xohlaganimizning sababi shundaki, biz analog-raqamli konvertorni INT0 pinidagi chipdan o'chirishni xohlaymiz, bu ham PD2. Oxir -oqibat, biz klaviatura bosilishi ADC -ni ishga tushirishni, shuningdek kirishni alohida tugmachasiz o'zgartirilishini ta'minlashini xohlardik, lekin vaqtni belgilash usuli tufayli biz ADC -ni ishga tushirish uchun alohida tugmachadan boshlaymiz. xatolar o'chirildi va hamma narsa to'g'ri ishlayotganiga aminmiz, shunda biz o'qishni xohlagan tugmani bosish bilan bog'liq shovqin va vaqt masalalarini hal qilamiz.

Shunday qilib, hozircha, biz kalitni ushlab turamiz, keyin ADC -ni ishga tushirish uchun tugmani bosamiz, keyin qo'yib yuboramiz va umid qilamizki, biz bosgan tugmachaning ikkilik qiymati analizatorda ko'rinadi.

Keling, buni amalga oshiradigan kod yozaylik.

6 -qadam: Qaysi o'tish tugmachalarini o'rnatishimiz kerak?

Qaysi o'tish tugmachalarini o'rnatishimiz kerak?
Qaysi o'tish tugmachalarini o'rnatishimiz kerak?

Keling, bu kodni qanday boshqarishni o'ylaylik, shunda nazoratchi klaviaturadan kirishni o'qishi va uni bosilgan tugmachaga mos keladigan raqamli qiymatga aylantirishi mumkin. Bu Atmega328p -ga o'rnatilgan. Biz AREF -ni mos yozuvlar kuchlanishi sifatida ishlatamiz va klaviatura chiqishi PortC0 yoki PC0 ga ulanadi. E'tibor bering, bu pin analog-raqamli konvertor 0 uchun ADC0 deb ham ataladi. ATmega328P uchun uzilishlar haqida 12.4-bo'limni, shuningdek, analog-raqamli konvertorning 24-bobini o'qishdan oldin siz uchun yaxshi bo'lardi. Boshlangan yoki hech bo'lmaganda ushbu bo'limlar mos yozuvlar uchun tayyor bo'lishi kerak. Mikrokontrollerni analog kirish signali bilan nima qilishni va bizning dasturimiz bilan qanday ishlashni bilishi uchun sozlash uchun biz avval bir nechta ADC -ni o'rnatishimiz kerak. tegishli registr bitlari. Bular, birinchi navbatda, birinchi kompyuterlarning eski almashtirish kalitlariga tengdir. Siz kalitni yoqasiz yoki o'chirasiz, yoki undan ham orqaga kabellarni bir rozetkadan ikkinchisiga ulab qo'yasiz, shunda yo'lda bu vilkaga etib borayotgan elektronlar bitta eshikni yopiq, ikkinchisini ochiq qilib, labirintdagi boshqa yo'lga tushiradi. sxemasi va shu bilan boshqa mantiqiy vazifani bajaradi. Assambleya tilida kodlashda biz mikrokontrollerning bu funktsiyalariga yaqin kirishimiz mumkin, bu esa, birinchi navbatda, uning jozibador jihatlaridan biridir. Bu ko'proq "qo'llar" va "parda ortida" bo'lgani kabi kamroq. Shunday qilib, bu registrlarni o'rnatishni zerikarli vazifa deb o'ylamang. Bu montaj tilini qiziqarli qiladi! Biz chipning ichki ishi va mantig'i bilan juda shaxsiy munosabatlarga ega bo'lamiz va uni biz xohlagan narsani bajarishga majbur qilmoqdamiz - ko'p va kam emas. Vaqtni behuda sarflamaslik kerak, shuning uchun biz sozlashimiz kerak bo'lgan kalitlarning ro'yxati:

  1. Quvvatni kamaytirish ADC bitini o'chiring, PRRC, bu PRR registrining 0 biti, chunki agar bu bit yoqilgan bo'lsa, ADC o'chadi. Quvvatni qisqartirish reestri - bu kerak bo'lmaganda quvvat ishlatadigan har xil narsalarni o'chirish usuli. Biz ADC -dan foydalanayotganimiz uchun, biz uning bu tarzda o'chirilmaganligiga ishonch hosil qilishni xohlaymiz. (46 -betda PRADC ga qarang)
  2. ADC0 bo'ladigan analog kirish kanalini ADC Multiplexer Selection (ADMUX) registrida MUX3… 0 ni o'chirish orqali tanlang (24-4-bet 249-jadvalga qarang), ular sukut bo'yicha o'chirilgan, shuning uchun buni qilishning hojati yo'q. Biroq, men buni o'z ichiga olaman, chunki agar siz hech qachon ADC0dan boshqa portdan foydalansangiz, bu kalitlarni mos ravishda almashtirishingiz kerak bo'ladi. MUX3, MUX2, MUX1, MUX0 ning har xil kombinatsiyasi sizga analog portlarning har birini kirish sifatida ishlatishga imkon beradi va agar siz bir vaqtning o'zida bir nechta analog signallarni ko'rishni xohlasangiz, ularni darhol o'zgartirishingiz mumkin.
  3. ADMUX registridagi REFS0 va REFS1 bitlarini o'chiring, shunda biz AREFni ichki moslama emas, balki mos yozuvlar kuchlanish sifatida ishlatamiz (248 -betga qarang).
  4. ADMUX -da ADLAR bitini yoqing, natijada natija "chapga o'rnatiladi", biz keyingi bosqichda bu tanlovni muhokama qilamiz.
  5. PC0 ga raqamli kirishni o'chirish uchun ADC0D bitini Raqamli kirishni o'chirish registriga (DIDR0) o'rnating. Biz ushbu portni analog kirish uchun ishlatmoqdamiz, shuning uchun raqamli kirishni o'chirib qo'yishimiz mumkin.
  6. ISC0 va ISC1 -ni tashqi uzilishlarni nazorat qilish registriga A (EICRA) o'rnating, biz kuchlanish signalining ko'tarilgan chekkasida INT0 piniga (PD2) o'tishni xohlayotganimizni ko'rsatish uchun 71 -betga qarang.
  7. Tashqi uzilishlar niqoblari reestrida (EIMSK) INT0 va INT1 bitlarini aniqlang, biz bu pimdagi uzilishlardan foydalanmayapmiz. Agar biz bu pimdagi uzilishlarni yoqadigan bo'lsak, bizga 0x0002 manzilidagi uzilish ishlovchisi kerak bo'ladi, lekin biz uni shunday o'rnatamizki, bu pimdagi signal ADC konvertatsiyasini ishga tushiradi, uning bajarilishi ADC konvertatsiyasining to'liq uzilishi bilan amalga oshiriladi. manzil 0x002A. 72 -betga qarang.
  8. ADCni yoqish uchun ADC boshqaruvida va status registrida A (ADCSRA) ADC Enable (ADEN) bitini (bit 7) o'rnating. 249 -betga qarang.
  9. Biz har safar analog signalni o'qishni xohlaganimizda ADC boshlang'ich konvertatsiya bitini (ADSC) o'rnatish orqali bitta konvertatsiyani boshlashimiz mumkin edi, lekin hozircha kimdir tugmani bosganida biz uni avtomatik o'qishni afzal ko'ramiz, shuning uchun biz ADC -ni yoqamiz. Avtotrigger ADCSRA registrida (ADATE) bitini ishga tushirish avtomatik tarzda amalga oshiriladi.
  10. Shuningdek, biz ADPS2..0 bitni (AD Prescalar bitlarini) 111 ga o'rnatdik, shunda ADC soati protsessor soati 128 ga bo'linadi.
  11. Biz ADC tetiklash manbasini PD2 deb tanlaymiz, uni INT0 (Tashqi uzilish so'rovi 0) deb ham atashadi. Biz buni ADCSRB reestridagi turli bitlarni almashtirish orqali bajaramiz (251-betdagi 24-6-jadvalga qarang). Jadvalda biz ADTS0 o'chirilishini, ADTS1 yoqilganligini va ADTS2 o'chirilishini xohlayotganimizni ko'ramiz, shunda ADC bu pinni ishga tushiradi. E'tibor bering, agar biz analog portni doimiy ravishda namuna olishni xohlasak, xuddi uzluksiz analog signalni o'qiyotganimizda (masalan, ovozni tanlash yoki biror narsa), biz buni erkin ishlash rejimiga o'rnatgan bo'lardik. Biz foydalanadigan usulda PD2 -ni ishga tushirishni o'rnatish PC0 analog portining ADC o'qilishini uzilishiga olib kelmasdan ishga tushiradi.
  12. ADCSRA registrida ADC Interrupt Enable (ADIE) bitini yoqing, shunda analogdan raqamli konvertatsiyaga o'tish tugallansa, biz uzilish ishlovchisini yozamiz va.org 0x002A ga qo'yamiz.
  13. Tanaffuslarni yoqish uchun SREG -da I bitni o'rnating.

1 -mashq: Yuqoridagi sozlamalarning har biri uchun ma'lumotlar sahifasidagi tegishli bo'limlarni o'qiganingizga ishonch hosil qiling, shunda nima bo'layotganini va agar ularni boshqa sozlamalarga o'zgartirsak nima bo'lishini tushunasiz.

7 -qadam: Interrupt Handler -ni yozing

Oxirgi qadamda biz shuni o'rnatdikki, biz PD2 -da aniqlangan ko'tarilgan burchak PC0 -da raqamli konvertatsiyani ishga tushiradi va bu konversiya tugagandan so'ng ADC konvertatsiyasining to'liq uzilishiga olib keladi. Endi biz bu uzilish bilan biror narsa qilmoqchimiz. Agar siz 65-betdagi 12-6-jadvalni o'rgansangiz, mumkin bo'lgan uzilishlar ro'yxatini ko'rasiz. Biz avvalgi darsliklarda RESET 0x0000 manzilida va Taymer/Counter0 Overflow 0x0020 manzilida uzilishini ko'rganmiz. Endi biz 0x002A manzilidagi jadvalda ko'rib turgan ADC uzilishini ko'rib chiqmoqchimiz. Shunday qilib, yig'ilish tilining kodi boshida bizga quyidagi satr kerak bo'ladi:

.org 0x002Arjmp ADC_int

ADC konvertatsiya qilinganida ADC_int deb nomlangan uzilish ishlovchisiga o'tadi. Xo'sh, qanday qilib biz uzilish ishlovchilarini yozishimiz kerak?

ADC = Vin x 1024 / Vref

Keling, klaviaturadagi "qayta terish" tugmachasini bossam nima bo'lishini ko'rib chiqaylik. Bunday holda, PC0 -dagi kuchlanish, masalan, 1,52V ga o'zgaradi va Vref 5Vda bo'lgani uchun bizda:

ADC = (1.52V) x 1024 / 5V = 311.296

va shuning uchun u 311 sifatida namoyon bo'ladi. Agar biz uni kuchlanishga aylantirmoqchi bo'lsak, biz hisobni teskari o'zgartirardik. Bizga buni qilishning hojati yo'q, chunki biz haqiqiy kuchlanishlarni farqlashdan manfaatdormiz. O'tkazish tugagach, natija ADCH va ADCL registrlarida joylashtirilgan 10-bitli raqamda saqlanadi va biz uni "chapga sozlash" ga olib keldik, ya'ni 10-bit ADCHning 7-bitidan boshlanadi va pastga tushadi. ADCL -ning 6 -biti (bu ikkita registrda jami 16 bit bor va biz ulardan atigi 10tasini, ya'ni 1024 kanalni ishlatamiz). Agar biz ADMUX registridagi ADLAR bitini tozalashni xohlasak, natijani "o'ng tomonga sozlash" mumkin edi. Chapga sozlashni tanlaganimizning sababi shundaki, signallarimiz bir -biridan juda uzoqda, chunki kanal raqamining oxirgi ikki raqami mos kelmaydi. biz shunchaki shovqin, shuning uchun biz tugmachalarni bosishni faqat yuqori 8 ta raqamdan ajratib olamiz, boshqacha aytganda, qaysi tugma bosilganligini tushunish uchun biz faqat ADCHga qarashimiz kerak bo'ladi. Ro'yxatdan o'ting, bu raqamni klaviatura qiymatiga aylantiring, so'ngra "9" raqamini bosish LEDning "00001001" ga mos keladigan LEDni yonishini tasdiqlash uchun uni LED -analizatoriga yuboring. biz har xil tugmachalarni bosganimizda, birinchi navbatda, ADCHda nima ko'rinishini ko'rishimiz kerak. Keling, ADCH tarkibini analizator displeyiga yuboradigan oddiy uzilish ishlovchilarini yozaylik, shuning uchun bizga kerak bo'lgan narsa:

ADC_int: lds analizatori, ADCH; ADIF qiymatini bizning analizatorlarimizga yuklash EIFR, 0; u yana qaytishga tayyor bo'lishi uchun tashqi uzilish bayrog'ini tozalang

Hozircha siz 5 -o'quv qo'llanmasidagi kodni bizning analizatorimizdan nusxa ko'chirishingiz va bu uzilish va almashtirish sozlamalarini qo'shishingiz va ishga tushirishingiz kerak. 2 -mashq: Kodni yozing va ishga tushiring. Siz analizator displeyida ADCH ko'rsatilishini ko'rasiz. Bir xil tugmani bir necha marta bosishga harakat qiling. Siz har doim ADCHda bir xil qiymatni olasizmi?

8 -qadam: Tugma bosish qiymatlarini xaritaga solish

Tugma bosish qiymatlarini xaritaga joylashtiring
Tugma bosish qiymatlarini xaritaga joylashtiring

Endi biz ADCHdagi qiymatlarni bosilgan tugmachaga mos keladigan raqamlarga aylantirishimiz kerak. Biz buni har bir tugmani bosish uchun ADCH tarkibini yozib, keyin rasmdagi kabi o'nlik raqamga aylantirish orqali qilamiz. To'xtatib turish tartibida biz har bir tugmani bosish uchun mos keladigan qiymatlarning butun diapazonini ko'rib chiqamiz, shunda ADC o'sha diapazondagi biror narsani ma'lum bir tugmachaga bog'laydi.

3-mashq: Bu xaritani bajaring va keyin ADC uzilish tartibini qayta yozing.

Mana, meniki uchun oldim (sizniki boshqacha bo'lishi mumkin). E'tibor bering, men uni har bir tugmani bosish uchun bir qator qiymatlar bilan o'rnatdim.

ADC_int:; Tashqi uzilishlar ishlovchisi analizatori; yangi raqamlar tugmachalariga tayyorgarlik H, ADCH; ADCH clccpi tugmasi o'qilganda, ADC yangilanadi, 240brlo PC+3; agar ADCH kattaroq bo'lsa, u 1ldi analizatori, 1; shuning uchun analizatorni 1rjmp qaytish bilan yuklang; va clccpi tugmachasini qaytarishH, 230; agar ADCH kattaroq bo'lsa, 2brlo PC+3ldi analizatori, 2rjmp qaytish clccpi tugmasiH, 217brlo PC+3ldi analizatori, 3rjmp qaytish clccpi tugmasiH, 203brlo PC+3ldi analizatori, 4rjmp qaytish clccpi tugmasiH, 187brlo PC+3ldi analizatori, 5rjmp qaytish clccpi tugmasi 155brlo PC+3ldi analizatori, 6rjmp qaytarish clccpi tugmasiH, 127brlo PC+3ldi analizatori, 255; Biz chirog'ni hamma onrjmp qaytarish clccpi tugmasi H, 115brlo PC+3ldi analizatori, 7rjmp qaytarish clccpi tugmasiH, 94brlo PC+3ldi analizatori, 8rjmp qaytish clccpi tugmasi H, 62brlo PC+3ldi analizatori, 9rjmp qaytish clccpi tugmasiH, 37brlo PC+3ldi analizatori, 0b11110000; yulduzcha yuqori yarmi onrjmp qaytish clccpi tugmasiH, 28brlo PC+3ldi analizatori, 0rjmp qaytish clccpi tugmasiH, 17brlo PC+3ldi analizatori, 0b00001111; xash belgisi pastki yarmi onrjmp qaytish clccpi tugmasiH, 5brlo PC+3ldi analizatori, 0b11000011; qayta terish yuqori 2 pastki 2rjmp qaytarish ldi analizatori, 0b11011011; aks holda xato yuz berdi: reti

9 -qadam: 1 -versiya uchun kod va video

Men klaviatura drayverining birinchi versiyasi uchun kodimni biriktirdim. Bunda ADC klaviaturadan kirishni o'qishi uchun siz tugmachani bosib, keyin tugmani bosishingiz kerak. Biz xohlagan narsa tugma emas, aksincha konvertatsiya qilish uchun signal tugmachaning o'zidan keladi. 3 -mashq: Ushbu kodni yig'ing va yuklang va sinab ko'ring. Siz har xil konvertatsiya chegaralarini kalit bosish kuchlanishiga mos keladigan tarzda o'zgartirishingiz kerak bo'lishi mumkin, chunki ular menikidan farq qiladi. Agar siz tugma orqali emas, balki ADC0 uchun ham, tashqi uzilish pimi uchun ham klaviaturadan kirishni ishlatmoqchi bo'lsangiz, nima bo'ladi? mening kodimda Stack Pointerni ishga tushiradigan bo'lim mavjud. O'zgaruvchilarni manipulyatsiya qilayotganimizda, biz istagan narsalarni o'chirib tashlamoqchi bo'lgan turli xil registrlar mavjud va biz ularni keyinroq saqlamoqchi bo'lgan registrlar ham bor. Masalan, SREG - bu uzilishlar davomida saqlanmaydigan registr, shuning uchun biror narsa o'rtasida uzilish bo'lsa, operatsiyalar natijasida o'rnatiladigan va tozalanadigan turli xil bayroqlar o'zgartirilishi mumkin. Agar siz SREG -ni to'xtatuvchi ishlovchining boshida to'plamga bosib tursangiz va keyin uni to'xtatish ishlovchisi oxirida yana o'chirib qo'ysangiz yaxshi bo'ladi. Men uni qanday qilib ishga tushirilganligini ko'rsatish va keyinchalik bizga qanday kerak bo'lishini oldindan bilish uchun kodga joylashtirdim, lekin bizning kodimizda uzilishlar paytida SREG bilan nima sodir bo'lishining ahamiyati yo'qligi uchun men bu to'plamni ishlatmadim. Men ishga tushirish paytida registrlarda turli bitlarni o'rnatish uchun shift operatsiyasidan foydalanganman. Masalan, qatorda:

ldi temp, (1 <> sts EICRA, harorat

Yuqoridagi kodning birinchi satridagi "<<" buyrug'i - bu almashtirish operatsiyasi. Bu asosan 0b00000001 bo'lgan ikkilik raqamni oladi va uni ISC01 sonining miqdori bo'yicha qoldiradi. Bu EICRA registridagi ISC01 nomli bitning joylashuvi. ISC01 bit 1 bo'lgani uchun, 1 raqami chap 1 holatiga o'tkazilib, 0b00000010 bo'ladi. Xuddi shunday, ikkinchi, ISC00, EICRA ning 0 biti, shuning uchun 1 raqamining siljishi chapga nol pozitsiyadir. Agar siz birinchi darslikda yuklagan va shu vaqtdan beri evrr dan foydalanayotgan m328Pdef.inc faylini yana bir bor ko'rib chiqsangiz, bu ".equ" iboralarining uzun ro'yxati ekanligini ko'rasiz. Siz ISC01 ning 1 ga teng ekanligini topasiz. Assambleya har bir misolni 1 bilan almashtiradi, hatto biror narsani yig'ishni boshlashdan oldin. Bu bizga kodni o'qish va yozishda bizga yordam beradigan registr bitlarining nomlari. Endi yuqoridagi ikkita smenali operatsiyalar orasidagi vertikal chiziq mantiqiy "yoki" operatsiya hisoblanadi. Mana bu tenglama:

0b00000010 | 0b00000001 = 0b00000011

va biz yuklayotgan narsamiz ("ldi" yordamida) temp. Odamlar bu usulni qiymatlarni registrga yuklash uchun ishlatganligining sababi shundaki, bu raqamni emas, balki bitning nomini ishlatishga imkon beradi va bu kodni o'qishni ancha osonlashtiradi. Biz "ori" va "andi" ko'rsatmalaridan foydalanamiz. Bu bizga registrdagi boshqa bitlarni o'zgartirmasdan mos ravishda SET va CLEAR bitlarini o'rnatishga imkon beradi. Masalan, men ishlatganimda

harorat, (1

bu "yoki" harorati 0b00000001 bilan, 1 -ni nolga qo'yadi va qolganlarini o'zgarishsiz qoldiradi. Biz yozganimizda ham

andi temp, 0b11111110

bu nolinchi haroratni 0 ga o'zgartiradi va qolganlarini o'zgarishsiz qoldiradi.

4 -mashq: Siz kodni o'tishingiz va har bir satrni tushunganingizga ishonch hosil qilishingiz kerak. Sizga biror narsa qilishning yaxshiroq usullarini topish va yaxshiroq dastur yozish qiziq bo'lishi mumkin. Ishlarni kodlashning yuzta yo'li bor va ishonamanki, siz menikidan ko'ra yaxshiroq yo'l topa olasiz. Siz ham (osmondan saqlasin!) Xato va kamchiliklarni topishingiz mumkin. Bunday holda, men ular haqida eshitishni xohlardim, shunda ular tuzatiladi.

Xo'sh, endi ko'raylik, biz ortiqcha tugmachadan qutulishimiz mumkinmi …

10 -qadam: 2 -versiya kodi

Tugmani yo'q qilishning eng oddiy usuli - uni butunlay olib tashlash, PB2 ga kirishni unutish va ADCni "Erkin ishlash rejimiga" o'tkazish.

Boshqacha aytganda, ADCSRB registrini o'zgartiring, shunda ADTS2, ADTS1 va ADTS0 nolga teng bo'ladi.

Keyin ADCSRA da ADSC bitini 1 ga o'rnating, u birinchi konvertatsiyani boshlaydi.

Endi uni mikrokontroleringizga yuklang va siz tugmani bosganingizda va tugmani bosganingizda ekranda to'g'ri raqam paydo bo'lishini ko'rasiz. Buning sababi, ADC doimiy ravishda ADC0 portidan namuna oladi va qiymatni ko'rsatadi. Agar siz barmog'ingizni tugmachadan uzib qo'ysangiz, "tugmachaning sakrashi" bir nechta tasodifiy qiymatlarni tezlik bilan paydo bo'lishiga olib keladi va keyin 0V kirishga qaytadi. Bizning kodimizda bu 0V 0b11011011 sifatida ko'rinadi (chunki "0" tugmachasi allaqachon 0b00000000 ko'rsatish qiymatidan foydalanadi)

Bu biz istagan yechim emas, lekin ikkita sababga ko'ra. Birinchidan, biz tugmani ushlab turishni xohlamaymiz. Biz uni bir marta bosishni va raqamni ko'rsatishni xohlaymiz (yoki keyingi darsda yangi kodda ishlatilgan). Ikkinchidan, biz doimo ADC0 namunasini olishni xohlamaymiz. Biz bir marta o'qishni, uni o'zgartirishni va keyin yangi tugmani bosish yangi konvertatsiya qilinmaguncha uxlashni xohlaymiz. Bepul ishlash rejimi, agar siz mikrokontrolderdan xohlasangiz, analogli kirishni doimiy o'qib tursangiz yaxshi bo'ladi, masalan, agar siz real vaqtdagi haroratni yoki biror narsani ko'rsatishni xohlasangiz.

Keling, yana bir yechim topaylik …

11 -qadam: tugmachadan qanday qutulish mumkin? 3 -versiya

Tugmachadan qanday qutulish mumkin? 3 -versiya
Tugmachadan qanday qutulish mumkin? 3 -versiya

Davom etishning ko'plab usullari mavjud. Avval tugmani olib tashlash uchun qo'shimcha qurilmalarni qo'shishimiz mumkin edi. Masalan, biz tranzistorni tugmachaning chiqish chizig'iga qo'yishga harakat qilib ko'rishimiz mumkin, shunda u chiqishning kichik oqimini oladi va PD2 uzilish piniga 5V puls yuboradi.

Biroq, bu, hech bo'lmaganda, juda shovqinli bo'lardi va eng yomoni, bu tugmachani to'g'ri o'qish uchun etarli vaqt bermaydi, chunki klaviaturaning kuchlanish chiqishi ADC ko'rsatkichini olishdan oldin barqarorlashishga vaqt topa olmaydi.

Shuning uchun biz dasturiy ta'minot echimini taklif qilmoqchimiz. Biz qilmoqchi bo'lgan narsa - bu PD2 piniga uzilishni qo'shish va unga bitta tugmachani o'qilishini chaqiradigan uzilish ishlovchisini yozish. Boshqacha qilib aytganda, biz ADC -dan avtotrigger uzilishidan qutulamiz va uning ichiga ADC -ni chaqiradigan tashqi uzilishni qo'shamiz. Shunday qilib, ADCni o'qish uchun signal PD2 signali allaqachon paydo bo'lganidan keyin keladi va bu PC0 pinini o'qish va konvertatsiya qilishdan oldin aniq voltajni ushlab turish uchun etarli vaqt berishi mumkin. Bizda ADC tugashining uzilishi bo'lishi kerak, natijada natijani oxirida analizator displeyi chiqadi.

Ma'no bermoq? Xo'sh, buni qilaylik …

Qo'shilgan yangi kodni ko'rib chiqing.

Siz quyidagi o'zgarishlarni ko'rasiz:

  1. INT0 tashqi uzilishini boshqarish uchun.org 0x0002 manziliga rjmp qo'shdik
  2. Biz EIMSK registrini INT0 pinida uzishni xohlayotganimizni ko'rsatish uchun o'zgartirdik
  3. Biz ADCSRA registridagi ADATE pinini avtomatik ishga tushirishni o'chirish uchun o'zgartirdik
  4. Biz ADCSRB sozlamalarini olib tashladik, chunki ular ADATE o'chirilganida ahamiyatsiz
  5. Biz endi tashqi tetik bayroqchasini tiklashimiz shart emas, chunki INT0 uzilish tartibi buni tugatgandan so'ng avtomatik ravishda amalga oshiradi - ilgari bizda uzilishlar tartibi yo'q edi, biz ADCni shu pimdagi signalni o'chirib qo'ydik, shuning uchun biz majbur bo'ldik. bu bayroqni qo'lda tozalang.

Endi uzilishlar ishlovchisida biz ADC -dan bitta konversiyani chaqiramiz.

5 -mashq: Ushbu versiyani ishga tushiring va nima bo'lishini ko'ring.

12 -qadam: Ishchi versiya uchun kod va video

Biz oxirgi versiyada ko'rganimizdek, tugmachani uzib qo'yish juda yaxshi ishlamaydi, chunki uzilish PD2 -ni ulash uchun ko'tarilgan chekkada ishga tushiriladi va keyin uzuvchi ADC konvertatsiyasini chaqiradi. Biroq, keyin ADC kuchlanish ko'rsatkichini barqarorlashmasdan oldin oladi va bema'nilik o'qiydi.

Bizga kerak bo'lgan narsa PD2 uzilishi va PC0 da ADC o'qilishi o'rtasida kechikish kiritish. Biz buni taymer/hisoblagich, hisoblagichni to'ldirish va kechiktirish tartibini qo'shish orqali qilamiz. Yaxshiyamki, biz buni 3 -darslikdan bilamiz! Shunday qilib, biz u erdan tegishli kodni nusxa ko'chiramiz va joylashtiramiz.

Men olingan kodni va uni ko'rsatadigan videoni berdim.

Ko'ryapsizmi, o'qishlar kutilganidek aniq emas. Bu, ehtimol, bir qator manbalarga bog'liq:

  1. biz klaviaturaning kuchlanish chiqishidan PD2 -ni ishga tushirish uchun tegmoqdamiz, bu PC0 -da o'qishga ta'sir qiladi.
  2. biz o'qishni yaxshi o'qish uchun tetikdan keyin qancha vaqtni kechiktirishni bilmaymiz.
  3. ADC konvertatsiyasini tugatish uchun bir necha tsikl kerak, bu biz klaviaturani tezda yoqolmasligimizni anglatadi.
  4. ehtimol klaviaturaning o'zida shovqin bor.
  5. va boshqalar…

Shunday qilib, biz klaviaturani ishga tushirishga muvaffaq bo'ldik va endi biz uni dasturlarda ishlatamiz, keyzorni faqat analizator displeyiga chiqarish o'rniga boshqa usulda ishlatishimiz mumkin, lekin bu juda aniq emas va juda zerikarli. Shuning uchun menimcha, klaviatura simlarini ulashning eng yaxshi usuli - bu klaviaturadan har bir chiqishni boshqa portga yopishtirish va qaysi portlar kuchlanish ko'rayotganini aniqlash. Bu oson, juda tez va juda aniq.

Aslida, klaviaturani biz bu erga o'xshatib boshqarishni xohlashining ikkita sababi bor:

  1. U bizning mikrokontrollerimizdagi 8 ta o'rniga 2 ta pinni ishlatadi.
  2. Harorat ko'rsatkichlari, potentsiometrlarni burish va hokazo kabi standart narsalardan farqli o'laroq, mikrokontroldagi ADCning turli jihatlarini ko'rsatish ajoyib loyihadir. Men bir martalik o'qish va tashqi pinni avtomatik ishga tushirish misolini xohlardim. faqat bepul ishlaydigan CPU-gobbling rejimidan ko'ra.

Yaxshiyamki, bu erda siz uchun oxirgi mashqlar:

6-mashq: Qidiruv jadvalidan foydalanish uchun ADC konvertatsiyasining to'liq to'xtatuvchisini qayta yozing. Ya'ni Shunday qilib, u analog qiymatni jadvalning birinchi elementi bilan sinab ko'radi va agar u kattaroq bo'lsa, u uzilishdan qaytadi, agar bo'lmasa, u jadvaldagi keyingi elementga Z ni oshiradi va yana testga qaytadi. Bu kodni qisqartiradi va uzilish tartibini tozalaydi va uni yanada chiroyli qiladi. (Men keyingi qadamda mumkin bo'lgan echimni beraman) 7 -mashq: Klaviaturani mikrokontrolderning 8 ta piniga ulang va buning uchun oddiy drayverni yozing va qanchalik yaxshi ekanligini bilib oling. Bizning usuldan yaxshiroq ishlashning bir necha usullari haqida o'ylay olasizmi?

Hammasi bu darslik uchun. Men oxirgi versiyani ko'rsatgichlar bilan biriktirdim. Yakuniy maqsadga yaqinlashganda, biz 9 -darsda yana bir bor klaviaturadan foydalanamiz va u bilan etti segmentli displeyni qanday boshqarishni ko'rsatamiz (va telefon klaviaturasidagi qo'shimcha tugmachalardan foydalanadigan qiziqarli narsa quramiz). Buning o'rniga tugmachalarni bosish orqali narsalarni boshqarishga o'ting (chunki bu usul biz yaratayotgan yakuniy mahsulotga yaxshiroq mos keladi) va biz faqat klaviaturani yopamiz.

Keyingi safar ko'rishguncha!

Tavsiya: