Mündəricat:

ATtiny2313: 9 Addımlı Oxu Açarları
ATtiny2313: 9 Addımlı Oxu Açarları

Video: ATtiny2313: 9 Addımlı Oxu Açarları

Video: ATtiny2313: 9 Addımlı Oxu Açarları
Video: Прохождение The Last of Us part 2 (Одни из нас 2) # 6 От канализации до больницы один шаг 2024, Noyabr
Anonim
ATtiny2313 ilə oxu açarları
ATtiny2313 ilə oxu açarları

ATtiny2313 və oxşar AVR cihazlarının çıxışları ilə məşğul olan bir neçə Təlimat var. Məsələn, https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- AVR-mikroprosessorlu motor/. The Real Elliot -dan, step motorlarının necə idarə olunacağını göstərən sonuncu üzərində işləyərkən, eyni proqramda kodun alternativ bölmələrini işlədə biləcəyimin həqiqətən faydalı olacağını gördüm, buna görə də hər birini ATtiny2313 proqramlaşdırmaq məcburiyyətində qalmadım. Kiçik bir kod dəyişikliyini sınamaq istədiyim vaxt (məsələn, yarım addım və ya stepperi tərsinə işlətmək kimi). Alternativ dəyişikliklərin seçilməsinə icazə vermək üçün bir keçid/hal ifadəsi istifadə edərək kod yazmaq asan olsa da, işi seçməyin bir yolu lazımdır. Bu, işi idarə etmək üçün bir növ giriş cihazının oxunması lazım olduğunu bildirir. Xoşbəxtlikdən, ATtiny2313-də çoxlu I/O pinləri var və açarlardan girişləri oxumaq üçün yaxşı hazırlanmışdır. Bu Təlimat girişləri necə oxumağı və vəziyyətinə görə qərar verməyi göstərəcək. Təkcə olduqca darıxdırıcı bir Təlimat verilə biləcəyi üçün, kiçik bir dinamikin səs siqnalı kimi işləməsi üçün ATtiny2313 -ün taymer/sayğac qabiliyyətindən istifadə etməyin sadə bir yolunu izah edəcəyəm. Sadə ayıklama texnikasında da kiçik bir geriləmə olacaq.

Addım 1: Giriş Cihazı

Giriş Cihazı
Giriş Cihazı
Giriş Cihazı
Giriş Cihazı

Bu Təlimat Real Elliot -un əla işinə əsaslanır və təsvir etdiyi ATtiny2313 Getto inkişaf sistemindən istifadə edir. Atmel -dən ATtiny2313 məlumat vərəqi bütün funksiyalar üçün ən yaxşı istinaddır, lakin oxumaq asan deyil. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Linkdə bütün AVR məlumat vərəqləri var, 2313 -ü tapın.) Şəkildə sadə giriş açarları dəsti göstərilir. Bu sadəcə dörd açma/söndürmə açarlarından ibarət bir paketdir; tək qutu, tək atma açarları (SPST) olaraq da bilinir. Tipik olaraq, hər bir açarın bir bağlantısı və ya dirəyi yerə bağlanır, digər əlaqə isə cərəyan məhdudlaşdıran bir rezistor (10K və ya daha çox) vasitəsilə yüksək çəkilir. Dirəklə dirəyə bir mikro nəzarətçi girişi bağlanır. Açar açıqdırsa, mikro nəzarətçi girişi HI olaraq oxuyacaq. Açar bağlanarsa, mikro nəzarətçi LO girişini oxuyacaq. Ətraflı məlumat üçün sxemə baxın. ATtiny2313, giriş olaraq konfiqurasiya edildikdə I/O pinlərində proqramlaşdırıla bilən çəkmə müqavimətçiləri təmin etməklə işləri asanlaşdırır. Bu o deməkdir ki, açarların sadəcə bir dirəyi yerə (LO), digər qütbü isə prosessor girişinə qoşula bilər. Birinci nümunə yalnız iki açarı göstərir. Açarlar aşağıdakı kodla oxunur və konfiqurasiya edilir. Açarları giriş kimi konfiqurasiya edin: (Kod tələb olunmur; bu standartdır.) Dartma dirənişlərini yandırın: PORTB = _BV (PB0) | _BV (PB1); Girişləri oxuyun: but1 = ~ PINB & 0x03; Doğru dəyəri əldə etmək üçün inversiya və maskalanma istifadəsinə diqqət yetirin.

Addım 2: Siqnal üçün yanıb -sönən işıqlar

Bir LED -i proqramlaşdırıla bilən bir neçə dəfə yanıb -sönmək üçün bu iki açarı istifadə edəcəyik. İstifadə edəcəyimiz LED -lər, Real Elliot -un məşhur etdiyi işıqlar olacaq. 1 və 2 -ci açarlara iki ikili rəqəm kimi baxılacaq, buna görə birləşmə 0, 1, 2 və 3 rəqəmlərini təmsil edə bilər. Proqramımız iki açarı oxuyacaq və LED -i lazımi sayda yanıb -sönəcək, ancaq keçid olduqda parametrləri dəyişdi. Keçidlər 500 millisaniyə üçün debüt edilir (optimallaşdırılmamışdır). Çıxarma alqoritmi olduqca sadədir. Açarlar oxunur və oxunuş qeyd olunur. OldBut dəyərindən (son saxlanan dəyər) fərqli olarsa, proqram 500 millisaniyə gecikir və açarlar yenidən oxunur. Dəyər əvvəl oxunduğu ilə eynidirsə, oldBut dəyəri yenilənəcək və LED iki açarın ikili dəyərinin nəzərdə tutduğu dəfə yanıb -sönəcək. "Açıq" olan bir keçid LO oxuduğundan dəyərin tərsinə diqqət yetirin. Açarlar əlavə dəyişikliklər üçün davamlı olaraq taranacaq. Link işıqları haqqında daha çox məlumat əldə etmək üçün Real Elliot -un əvvəlki təlimatlarına müraciət edin. Açarları açmaq haqqında daha çox məlumat əldə etmək üçün https://www.ganssle.com/debouncing.pdf -ə baxın. Burada bu nümunə üçün ATtiny2313 kodu var. İşlədikdə, bu proqram PB4 -dəki (fiziki pin 8) LED -in iki dəfə yanıb -sönəcəyini göstərir və bunun işə salındığını göstərir. Daha sonra bir və iki açarları oxuyacaq və dəyişdirildikdə keçid parametrindən asılı olaraq bir -üç dəfə yanıb -sönəcək. Açarlar dəyişməyəndə, LED yavaş -yavaş yanıb -sönəcək. Bu kodu işə salmaq üçün yeni bir kataloq yaradın (isterseniz "Əsas" adlandırın) və aşağıdakı C kod faylını yükləyin və daxil edin. Makefile1.txt -in adını sadəcə Makefile olaraq dəyişdirin. WinAVR istifadə edərək proqramı tərtib edin və ATtiny2313 -ə yükləyin.

Addım 3: Hata Ayıklamada Kiçik Bir Çıxış

Mənə bənzəyirsinizsə (və dünyanın hər bir proqramçısı), ehtimal ki, diqqətlə yazdığınız və tərtib etdiyiniz "səhvsiz" kodun gözlədiyinizi etmədiyi vaxtları yaşamısınız. Bəlkə də heç bir şey etməyəcək! Bəs problem nədir? Necə öyrənəcəksən? Xoşbəxtlikdən, hər şeyi işə salmaq üçün bir neçə yanaşma var. (Hata ayıklama mövzusunu mükəmməl bir şəkildə müalicə etmək üçün bu kitabı əldə edin. Http://www.debuggingrules.com/) Mikrodenetleyici tətbiqlərinin ayıklanması mövzusuna aid bir neçə sadə təklif vermək istərdim. Birinci addım üzərində qurmaqdır. nə bilirsən. Bir dəfə işləmək üçün yanıb -sönən işıq əldə etmisinizsə, proqramınızda harada olduğunuzu görmək üçün yenidən istifadə edin. Proqramın başladığını bildirmək üçün LED -in iki dəfə yanıb -sönməsini sevirəm. Bunu etmək üçün kodu əvvəlcə proqramınızın əvvəlinə daxil edə bilərsiniz. Avadanlıqlarınızda heç bir problem olmadığını bildikdən sonra yanıb -sönən funksiyanı yaradın. İşdə istifadə etdiyim funksiya./*------------------------------------------ ------------------------------ ** blinkEm-PD4 istifadə edərək LED-in yanıb sönmə funksiyası ** PD4 çıxış olaraq konfiqurasiya edilməlidir. ** ------------------------------------------------ ---------------------*/void blinkEm (uint8_t count) {while (count> 0) {PORTD = _BV (PD4); _delay_ms (1000); PORTD = ~ _BV (PD4); _delay_ms (1000); saymaq; }} İndi bu funksiyanı kodunuzun müxtəlif nöqtələrində kodun bu günə qədər yerinə yetirdiyini göstərən bir siqnal olaraq istifadə etmək mümkündür. Kodun işlədiyini bilmək, səhvləri tapmaq üçün çalışdığınız, lakin gözlədiyinizi etmədiyiniz hər bir bölməni diqqətlə araşdıra biləcəyiniz deməkdir. Bir anda bir şeyi dəyişdirmək, ayıklama üçün də əsas bir üsuldur (yuxarıdakı istinadda təsvir edilmişdir). Bu klassik üsul "böl və qalib et" ilə birlikdə işləyir: funksionallığı tədricən əlavə etmək üçün körpə addımları atmaq. Bu yavaş bir yanaşma kimi görünə bilər, amma işləməyən kodun böyük bir hissəsini bir anda ayırmağa çalışmaq qədər yavaş deyil.

Addım 4: Daha çox Hata Ayıklama

Çox vaxt kodun bir hissəsindəki sətirlərin çoxunu atlayaraq yoxlamaq istədiyimiz zaman, hər birinin işlədiyini yoxlayarkən onları bir -bir işə salırıq. Tipik olaraq, bunu keçmək istədiyimiz sətirləri "şərh edərək" edirik. Bu texnikanın bir uzantısı, bir kod blokunu kəsib yapışdırmaq, orijinalını şərh etməkdir (buna görə də itirmirik) və surətini sındırmaq. C. Satırları şərh etmək üçün dörd asan yol var. Bir sətrin qarşısında "//" işarəsi qoyulduqda bu sətir şərh olunur. "/*" Və "*/" işarələrinə bir və ya daha çox sətir əlavə etməklə bütün bölmə şərh olunacaq. Bu metodun səmərəli işləməsi üçün kod blokunda (bitəndən başqa) başqa "*/" işarəsi olmamalıdır. Beləliklə, təsirli bir intizam, kod blokları daxilində şərhlər üçün // istifadə etmək və şərh blokları və kod bölmələrini şərh etmək üçün / * * / quruluşunu ayırd etməkdir. və bölməni "#endif" ilə bitirmək. Bir blokun əvvəlində "#ifdef (identifikator)" və sonunda "#endif" istifadə edərək daha çox seçmə nəzarəti mümkündür. Blokun tərtib edilməsini istəyirsinizsə, proqramın əvvəlində "#define (identifier)" istifadə edin. Qeyd edək ki, sitat işarələri yalnız vurğu üçündür və daxil edilməməlidir. Bu üsulları birləşdirmək ATtiny2313 proqramlarınızı düzəltmək üçün faydalı bir yanaşma təmin etməlidir. Bu Təlimat kitabına davam edərkən bu vasitələri faydalı hesab edə bilərsiniz.

Addım 5: Bip səsləri üçün Taymer/Sayıcı 0 -dan istifadə edin

Bip səsləri üçün Taymer/Sayıcı 0 -dan istifadə
Bip səsləri üçün Taymer/Sayıcı 0 -dan istifadə

ATtiny2313 iki güclü taymer/sayğac mənbəyinə malikdir: biri 8 bit, biri də 16 bit. Bunlar tezlik generatorları, dəyişkən nəbz genişliyi modulyasiya nəzarətçiləri və çıxış müqayisə qeydləri kimi konfiqurasiya edilə bilər. Bunların tam funksionallığı məlumat vərəqinin 49 səhifəsində təsvir edilmişdir. Ancaq sadə bir vəziyyətdən istifadə edəcəyik. Yalnız Timer/Counter 0 (8 bitlik) istifadə ediləcək və sadəcə bir tezlik generatoru olaraq istifadə ediləcək. Bip səsi çıxarmaq üçün tezlik kiçik bir dinamikə yönəldiləcək. Taymer/Sayıcı 0 ATtiny2313 məlumat vərəqinin 66-83 -cü səhifələrində tam təsvir edilmişdir. Bu materialın yaxından oxunması, Time/Counter 0 haqqında tam bir anlayış təmin edəcək. Xoşbəxtlikdən, kifayət qədər sadə bir rejim, Clear Timer of Compare (CTC), istədiyimiz bip tonunu yaratmaq üçün lazım olan hər şeydir.

İstifadə edəcəyimiz rejim üçün Taymer/Sayğacın işləməsi düzdür. Bir saat siqnalı seçildikdə sayğac sıfırdan başlayır və hər saat nəbzini artırır. Sayaç dəyəri Çıxış Müqayisəsi (TOP) dəyərinə çatdıqda sayğac sıfıra sıfırlanır və sayma yenidən başlayır. Taymer/Sayıcı ilə əlaqəli çıxış biti bir kvadrat dalğa çıxışı yaratmaq üçün dəyişdirilir. Bu birbaşa bir səs çeviricisini səs siqnalı çıxarmağa məcbur edir. Kiçik bir TDK Audio Dönüştürücü səs siqnalı verir. Uyğun bir cihaz Digikey 445-2530-ND, TDK SD1209T3-A1 (bunun erkən versiyasını istifadə etdim). Bu 3 voltluq bir versiyadır; 5 voltlu versiya da gözlədiyim kimi işləyəcək. Bunu birbaşa Attiny2313 -ün çıxış limanından çıxarıram və yaxşı işləyir. Sparkfun -un oxşar cihazı var.

Addım 6: Taymer/Sayıcı 0 -ı konfiqurasiya edin

CTC rejimi, Pin 2, Port B (OC0A) çıxışını dəyişdirmək üçün istifadə edilə bilər (fiziki pin 14). Bu pin üzərində çıxışı təmin etmək üçün DDRB uyğun şəkildə qurulmalıdır. Bunun üçün C kodu, yanıb -sönən işıq üçün bir çıxış qurmaq kimidir. DDRB = _BV (PB2); // Port B2 bir çıxışdır. Növbəti addım bir saat siqnalı vermək və bir dalğa forması istehsal etmək üçün çıxış müqayisə qeydini yükləməkdir. Yaranan tezlik tənliyi məlumat vərəqində verilir (səhifə 72). Tənlikdəki şərtlər aşağıda təsvir ediləcəkdir. Burada tənlik var: fOC0A = fclk_I/O/2*N*(1+OCR0A) Burada fOC0A: = çıxış tezliyi fclk_I/O: = saat mənbəyinin tezliyi N: = saatın qiymət ölçüsü faktoru OCR0A: = Taymer üçün çıxış müqayisə qeydindəki dəyər/ Counter 0A. Saat Mənbə Tezliyi, fclk_I/OBu sistem saatının tezliyidir. Varsayılan dəyər 1 MHz -dir. TCCR0B -nin CS00, CS01 və CS02 bitləri bu seçimi idarə edir. Bu bitlər də N -nin dəyərini seçdiyindən, sonrakı təsvir edilir. Öncədən Qiymətləndirici, NN sistem saatını bölmək və ya əvvəlcədən ölçmək üçün istifadə olunan dəyərdir. TCCR0B -nin CS00, CS01 və CS02 bitləri bu seçimi idarə edir. ATtiny2313 məlumat vərəqinin 81 -ci səhifəsindəki Cədvəl 41 birləşmələri təsvir edir. 1kHz -ə yaxın bir tezlik istənildiyindən, TCCR0B -nin CS00 və CS01 bitləri təyin olunacaq. Diqqət yetirin ki, hər üç biti 0 -a təyin etməklə, belə ki, heç bir saat mənbəyi seçməmək, çıxışı effektiv şəkildə dayandırır. Bu, bip səsini başlatmaq və dayandırmaq üçün istifadə ediləcək üsuldur. TOP Dəyəri, OCR0 Bu dəyərə çatdıqda sayğac sıfıra sıfırlanacaq və TOP -a çatana və dövr təkrarlanana qədər sayma yenidən başlayacaq. TOP asanlıqla dəyişdirilə bilər, buna görə səs siqnalının tezliyini dəyişdirmək asandır. 1kHz -ə yaxın bir tezlik istənildiyindən, TOP 7 olaraq təyin olunur (Öncədən hesablayıcı 8, TOP isə 63 ola bilərdi. Eyni nəticə - sizin seçiminizdir.) Çıxış Tezliyi, fOC0AÇıxış tezliyi nəticələrini hesablamaq üçün tənlikdən istifadə edin. in: fOC0A = 1, 000, 000 /2 * 64 * (1+7) fOC0A = 977Hz Kifayət qədər yaxındır! Çıxış Müqayisəsi Qeydini və Taymer Sayğacına Nəzarət Reyestrini 0B yükləmək üçün kod budur. Zəhmət olmasa bunların necə istifadə edildiyini anlamaq üçün həqiqi proqram koduna baxın. OCR0A = 7; // Zaman Dəyəri TCCR0B = _BV (CS01) | _BV (CS00); // Daxili saatı seçin & prescale = 8 TCCR0B = 0; // heç bir saat mənbəyi tonu söndürmür Zaman/Sayaç rejiminin qurulması Son bir detal olaraq, Timer/Counter Control Register 0A -da müvafiq bitlər qoyaraq istədiyimiz Taymer/Sayğac rejimini təyin edəcəyik. CTC rejimi, məlumat cədvəlinin Cədvəl 40, səhifə 79 -da təsvir edildiyi kimi WGM01 bitini təyin etməklə seçilir. Çıxışın hər dövrə keçməsini istədiyimiz üçün, COM0A0 bitinin də Cədvəl 34 -də, səhifə 77 -də təsvir edildiyi kimi qurulması lazımdır. İşdə kod: TCCR0A = _BV (COM0A0) | _BV (WGM01); // CTC keçid rejimi

Addım 7: Dörd keçiddən istifadə edin

Səs siqnalı tətbiq edərkən, donanımımızı və proqram təminatımızı dörd açarı idarə etmək üçün genişləndirək. Taymer Sayğacı 0A -nın çıxışı B Portu, pin 2 -də olduğu üçün daha çox açarı ardıcıl olaraq Port B -yə bağlaya bilmərik. Port D -dən istifadə etmək asan bir həll ola bilər, amma gəlin bu limanı digər funksiyalar üçün əlçatan saxlayaq. pilləli motor). Əlavə açarları PB3 və PB4 -ə bağlayaq. Açarların oxunması əsasən dəyişməzdir. 5, 6 və 7 ilə birlikdə bit 2-ni maskalamaq üçün maska dəyəri 0x1B (00011011 ikili) olaraq dəyişdirilir və 4 bitlik ikili ədəd yaratmaq üçün başqa bir hiylə istifadə olunur. 3 -cü və 4 -cü bitləri bir az sağa sürüşdürün və 0 və 1 -ci bitləri 4 bitlik ikili nömrəyə birləşdirin. Bu, bitləri dəyişdirmək və birləşdirmək üçün standart C sintaksisidir, lakin təcrübəsizlər üçün yaxşı məlum olmaya bilər. but1a = (but1 & 0x03) | ((lakin1 və 0x18) >> 1); // but1 -də keçid oxunuşu varİşlədikdə, proqram iki dəfə yanıb -sönəcək və başlanğıc siqnalını vermək üçün iki dəfə səs siqnalı verəcək. Açarlar hər dəfə dəyişdirildikdə, təmsil etdikləri nömrə səslənəcək. Açarları dəyişməyəndə, LED yanıb -sönəcək, bu kodu işə salmaq üçün yeni bir kataloq yaradın (isterseniz ona bip deyin) və aşağıdakı C kod faylını yükləyin və daxil edin. Makefile2.txt adını yalnız Makefile olaraq dəyişdirin. WinAVR istifadə edərək proqramı tərtib edin və Attiny2313 -ə yükləyin.

Addım 8: Switch/case Construct istifadə edin

Son addım "sadəcə proqramdır": Söz verdiyimiz kimi, keçid/qutu quruluşunu tətbiq edəcəyik. Bu nümunədə yalnız iki alternativ hərəkət göstərilsə də, bir neçə alternativ kod bölməsindən birini seçmək üçün bu quruluşun necə istifadə ediləcəyi çox aydın olmalıdır. İşlədikdə, bu proqram açarları izləyir və bir dəyişiklik olarsa, qəribə olduqda müvafiq nömrəni səsləndirəcək; sayı bərabər olsa yanıb -sönəcək. Bir keçid dəyişməyincə heç bir şey etməz.

Bu kodu işə salmaq üçün yeni bir kataloq yaradın (isterseniz buna Switch deyin) və aşağıdakı C kod faylını yükləyin və daxilində fayl yaradın. Makefile3.txt -in adını sadəcə Makefile olaraq dəyişdirin. WinAVR istifadə edərək proqramı tərtib edin və Attiny2313 -ə yükləyin.

Addım 9: Nəticə

Nəticə
Nəticə

Deməli budur! İndi açarların oxunması və keçid parametrlərinə əsaslanaraq bir hərəkət seçərək proqramınızın icrasına nəzarət etmək üçün necə istifadə edəcəyinizi bilirsiniz. Bir bip səsi necə yaratmağı da bilirsiniz və bəzi ayıklama strategiyasını da öyrənmisiniz.

Anladığınızı sınamaq istəyirsinizsə, sonuncu proqramı hətta yüksək bir səs səviyyəsində səsləndirmək üçün dəyişdirin, tək olsanız aşağı bir səs siqnalı verin və açarlarda heç bir dəyişiklik yoxdursa LED -i davamlı olaraq yanıb -sönün. kömək üçün ayıklama bölməsinə qayıdın.

Tövsiyə: