Мазмұны:

ATtiny2313: 9 қадамдары бар оқу қосқыштары
ATtiny2313: 9 қадамдары бар оқу қосқыштары

Бейне: ATtiny2313: 9 қадамдары бар оқу қосқыштары

Бейне: ATtiny2313: 9 қадамдары бар оқу қосқыштары
Бейне: Using Digispark Attiny85 Mini Arduino boards: Lesson 108 2024, Шілде
Anonim
ATtiny2313 көмегімен оқу қосқыштары
ATtiny2313 көмегімен оқу қосқыштары

ATtiny2313 және ұқсас AVR құрылғыларының шығысымен айналысатын бірнеше нұсқаулықтар болды. Мысалы, https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- AVR-микропроцессорлы қозғалтқыш/. The Real Elliot -тің соңғы қозғалтқышты басқаруды көрсететін соңғы жұмысымен жұмыс жасай отырып, мен сол бағдарламада кодтың балама бөлімдерін іске қосу өте пайдалы болатынын білдім, сондықтан олардың әрқайсысына ATtiny2313 бағдарламасын қайта бағдарламалаудың қажеті болмады. Мен кодтың сәл өзгеруін көргім келді (мысалы, жартылай адымдау немесе қадамды керісінше іске қосу). Балама вариацияларды таңдауға мүмкіндік беру үшін switch/case операторының көмегімен кодты жазу оңай болғанымен, жағдайды таңдаудың қандай да бір әдісі қажет. Бұл істі басқару үшін қандай да бір кіріс құрылғысын оқу керек дегенді білдіреді. Бақытымызға орай, ATtiny2313 көптеген енгізу-шығару түйреуіштеріне ие және коммутаторлардан кірістерді оқуға арналған. Бұл нұсқаулық кірістерді қалай оқу керектігін және олардың күйіне қарай шешім қабылдауды көрсетеді. Тек бұл өте скучно нұсқаулық болатындықтан, мен шағын динамикті дыбыс сигналын беру үшін ATtiny2313 таймерін/есептегіш мүмкіндігін пайдаланудың қарапайым әдісін түсіндіремін. Сонымен қатар, отладтаудың қарапайым әдістеріне аздап шегіну болады.

1 -қадам: енгізу құрылғысы

Енгізу құрылғысы
Енгізу құрылғысы
Енгізу құрылғысы
Енгізу құрылғысы

Бұл нұсқаулық Real Elliot -тың керемет жұмысына негізделген және ол сипаттайтын ATtiny2313 Ghetto дамыту жүйесін қолданады. ATmel ATtiny2313 мәліметтер парағы барлық функцияларға арналған соңғы анықтама болып табылады, бірақ оны оқу оңай емес. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Сілтемеде барлық AVR деректер парақтары бар, 2313 -ті табыңыз.) Суретте енгізу қосқыштарының қарапайым жиынтығы көрсетілген. Бұл жай ғана қосуға/өшіруге арналған төрт қосқыштан тұратын пакет; бір полюсті, бір лақтырғыш қосқыштар (SPST) ретінде де белгілі. Әдетте, әр қосқыштың бір байланысы немесе полюсі жерге қосылады, ал екіншісі ток шектеу резисторы арқылы жоғары тартылады (10К немесе одан жоғары). Полюске резистормен микроконтроллердің кірісі қосылған. Егер қосқыш ашық болса, микроконтроллер кірісті HI ретінде оқиды. Егер коммутатор жабық болса, микроконтроллер LO кірісін оқиды. ATtiny2313 кіріс ретінде конфигурацияланған кезде енгізу-шығару түйреуіштерінде бағдарламаланатын тартылатын резисторларды қамтамасыз ету арқылы заттарды жеңілдетеді. Бұл коммутаторлардың бір полюсін жерге (LO), ал екінші полюсті процессордың кірісіне қосуға болатынын білдіреді. Бірінші мысалда тек екі қосқыш көрсетілген. Коммутаторлар келесі кодпен оқылады және конфигурацияланады. Коммутаторларды кіріс ретінде конфигурациялаңыз: (код қажет емес; бұл әдепкі.) Тартылатын резисторларды қосыңыз: PORTB = _BV (PB0) | _BV (PB1); Кірістерді оқыңыз: but1 = ~ PINB & 0x03; Дұрыс мәнді алу үшін инверсия мен маскировканы қолдануға назар аударыңыз.

2 -қадам: сигналға арналған шамдар

Біз осы екі қосқышты светодиодты бірнеше рет жыпылықтау үшін қолданамыз. Біз қолданатын светодиодтар Real Elliot әйгілі еткен жарық шамдары болады. 1 және 2 -қосқыштар екі екілік цифр ретінде қарастырылады, сондықтан комбинация 0, 1, 2 және 3 сандарын көрсете алады. Біздің бағдарлама екі қосқышты оқиды және светодиодты тиісті рет жыпылықтайды, бірақ тек коммутатор болса. параметрлер өзгерді. Коммутаторлар 500 миллисекундқа шығарылады (оңтайландырылмаған). Шығу алгоритмі өте қарапайым. Коммутаторлар оқылады және оқылуы жазылады. Егер ол oldBut мәнінен (соңғы сақталған мән) өзгеше болса, онда бағдарлама 500 миллисекундқа кешіктіріледі және коммутаторлар қайтадан оқылады. Егер мән бұрын оқылғанмен бірдей болса, oldBut мәні жаңартылады және жарық диодты қосқыштың екілік мәніне байланысты қанша рет жыпылықтайды. Мәннің инверсиясына назар аударыңыз, себебі «қосулы» қосқыш LO оқиды. Қосқыштар одан әрі өзгерістер үшін үздіксіз сканерленеді. Жарқыл шамдары туралы көбірек білу үшін Real Elliot нұсқауының алдыңғы нұсқауларын қараңыз. Қосқыштарды ажырату туралы көбірек білу үшін мына https://www.ganssle.com/debouncing.pdf сілтемесін қараңыз. Мына мысал үшін ATtiny2313 коды. Жұмыс кезінде бұл бағдарлама PB4 (физикалық түйреуіш 8) жарықдиодты екі рет жыпылықтап, инициализацияланғанын көрсетеді. Содан кейін ол бір және екі қосқыштарды оқиды және ауыстырылған кезде қосқыштың параметріне байланысты бір -үш рет жыпылықтайды. Қосқыштар өзгермеген кезде, жарық диоды баяу жыпылықтайды, бұл кодты іске қосу үшін жаңа каталог жасаңыз (қаласаңыз, оны «Негізгі» деп атаңыз) және келесі C код файлын жүктеңіз. Makefile1.txt атауын Makefile деп өзгертіңіз. WinAVR көмегімен бағдарламаны құрастырыңыз және оны ATtiny2313 -ке жүктеңіз.

3 -қадам: Отладка бойынша кішігірім шегініс

Егер сіз мен сияқты (және әлемдегі барлық басқа бағдарламашыларға ұқсайтын болсаңыз), сіз мұқият енгізген және құрастырған «қатесіз» код сіз ойлағандай істемейтін кездерді бастан өткерген шығарсыз. Мүмкін, бұл ештеңе жасамайды! Сонымен, мәселе неде? Қалай білмекшісің? Бақытымызға орай, заттарды іске қосудың бірнеше әдісі бар. (Бұл кітапты отладтау тақырыбын жақсы емдеу үшін алыңыз. Http://www.debuggingrules.com/) Микроконтроллер қосымшаларын күйге келтіру тақырыбына қатысты бірнеше қарапайым ұсыныстар бергім келеді. сен не білесің. Егер сізде бір рет жұмыс істеуге шам жанып тұрса, бағдарламада қайда екеніңізді көру үшін оны қайтадан пайдаланыңыз. Мен бағдарламаның басталуын білдіру үшін жарықдиодты екі рет жыпылықтағанды ұнатамын. Сіз бұл кодты бастапқыда бағдарламаның басында енгізе аласыз. Жабдықта ештеңе жоқ екенін білсеңіз, жыпылықтау функциясын жасаңыз. Міне мен қолданатын функция./*------------------------------------------ ------------------------------ ** blinkEm-PD4 ** PD4 көмегімен LED жыпылықтау функциясы шығыс ретінде конфигурациялануы керек. ** ------------------------------------------------ ---------------------*/void blinkEm (uint8_t count) {while (count> 0) {PORTD = _BV (PD4); _кешіктіру (1000); PORTD = ~ _BV (PD4); _кешіктіру (1000); санау-; }} Енді бұл функцияны кодтың әр түрлі нүктелерінде код осы уақытқа дейін орындалғанын білдіретін сигнал ретінде пайдалануға болады. Код жұмыс істеп тұрғанын білу қателерді табу үшін іске қосылған, бірақ сіз күткен нәрсені орындамаған әрбір бөлімді мұқият тексеруге болатынын білдіреді. Бір уақытта бір нәрсені өзгерту - отладтаудың негізгі әдісі (жоғарыдағы сілтемеде сипатталған). Бұл классикалық әдіс «бөлу және жеңу» қатар жұмыс істейді: функционалдылықты кезең -кезеңмен қосу үшін нәресте қадамдарын жасау. Бұл баяу көзқарас сияқты көрінуі мүмкін, бірақ бұл жұмыс істемейтін кодтың үлкен бөлігін бірден жөндеуге тырысу сияқты баяу емес.

4 -қадам: Қосымша жөндеу

Біз кодтың бір бөлігін ондағы жолдардың көп бөлігін өткізіп жіберіп, олардың әрқайсысының жұмыс істеуін тексере отырып, бірте -бірте қосу арқылы тексергіміз келетін кездер болады. Әдетте біз мұны өткізгіміз келетін жолдарды «түсініктеме беру» арқылы жасаймыз. Бұл техниканың кеңеюі - код блогын қиып алып қою, түпнұсқаны түсіндіру (сондықтан оны жоғалтпау үшін) және көшірмені бұзып алу. Сызықтарға түсініктеме берудің төрт қарапайым әдісі бар. Жолдың алдына «//» белгісін қою сол жолды түсіндіреді. Бір немесе бірнеше жолды «/*» және «*/» әріптерімен жабу бүкіл бөлімді түсіндіреді. Бұл әдіс тиімді жұмыс істеуі үшін код блогында басқа «*/» болмауы керек (соңғысынан басқа). Тиімді пән - бұл код блоктарындағы түсініктемелер үшін // пайдалану және түсініктеме блоктары мен код бөлімдеріне түсініктеме беру үшін / * * / конструкциясын сақтау. Блоктың басына «#if 0» қойып, түсініктеме беру. және бөлімді «#endif» -пен аяқтау. Блоктың басындағы «#ifdef (идентификатор)» және соңында «#endif” көмегімен қосымша таңдауға болады. Егер сіз блоктың құрастырылуын қаласаңыз, бағдарламаның басында «#define (идентификатор)» пайдаланыңыз. Назар аударыңыз, тырнақшалар тек екпінге арналған және оларды қосуға болмайды. Бұл әдістерді біріктіру ATtiny2313 бағдарламаларын күйге келтірудің пайдалы әдісін қамтамасыз етеді. Біз осы Нұсқаулықты өту барысында бұл құралдарды пайдалы деп санай аласыз.

5 -қадам: Дыбыстық сигналдар үшін таймер/есептегішті 0 пайдалану

Таймер/Санағыш 0 дыбыстық сигналдар үшін қолданылады
Таймер/Санағыш 0 дыбыстық сигналдар үшін қолданылады

ATtiny2313-те таймер/есептегіштің екі қуатты ресурсы бар: біреуі 8 биттік және біреуі 16 биттік. Олар жиілікті генераторлар, айнымалы импульстік енді модуляторлар және шығыс салыстыру регистрлері ретінде конфигурациялануы мүмкін. Олардың толық функционалдығы мәліметтер парағының 49 бетінде сипатталған. Дегенмен, біз қарапайым жағдайды қолданамыз. Тек таймер/есептегіш 0 (8-биттік) пайдаланылады және ол жиілік генераторы ретінде қолданылады. Дыбыстық сигнал беру үшін жиілік шағын динамикке бағытталады. Таймер/Counter 0 ATtiny2313 мәліметтер парағының 66-83 беттерінде толық сипатталған. Бұл материалды мұқият оқу сізге уақыт/есептегіш 0 туралы толық түсінік береді. Бақытымызға орай, салыстырудың қарапайым таймері (CTC), біз қалаған дыбыстық сигналды шығару үшін қажет.

Біз қолданатын режим үшін Таймер/Есептегіш жұмысы тікелей жүреді. Сағат сигналы таңдалған кезде, санауыш нөлден басталады және әр сағат импульсін арттырады. Есептегіш мәні Шығуды салыстыру реестріндегі (TOP) мәнге жеткенде, санауыш нөлге оралады және санау қайтадан басталады. Таймермен/есептегішпен байланысты шығыс биті квадраттық толқындық шығыс үшін ауысады. Бұл дыбыстық түрлендіргішті дыбыстық сигнал шығаруға тікелей итермелейді. Кішкентай TDK аудио түрлендіргіші дыбысты шығарады. Қолайлы қондырғы-Digikey 445-2530-ND, TDK SD1209T3-A1 (мен оның алғашқы нұсқасын қолдандым). Бұл 3 вольтты нұсқа; 5 вольтты нұсқа да мен күткендей жұмыс істейді. Мен мұны Attiny2313 шығыс портынан тікелей шығарамын және ол жақсы жұмыс істейтін сияқты. Sparkfun -да ұқсас құрылғы бар.

6 -қадам: Таймерді/есептегішті конфигурациялау 0

CTC режимі OC0A шығысын 2 -ші түйінге, В портына (физикалық түйреуіш 14) ауыстыру үшін қолданыла алады. Бұл түйреуішке шығуды қосу үшін DDRB тиісті түрде орнатылуы керек. Бұл үшін C коды - бұл жыпылықтайтын жарықтандыруды шығару сияқты. DDRB = _BV (PB2); // В2 порт - бұл шығыс. Келесі қадам - жиілік ретінде толқын түрін шығару үшін сағат сигналын беру және шығыс салыстыру регистрін жүктеу. Алынған жиіліктің теңдеуі деректер парағында берілген (72 -бет). Теңдеудегі терминдер төменде сипатталады. Мұнда теңдеу: fOC0A = fclk_I/O/2*N*(1+OCR0A) Мұндағы fOC0A: = шығыс жиілігі fclk_I/O: = сағат көзінің жиілігі N: = OCR0A сағатқа дейінгі есептік коэффициенті: = Таймер үшін шығыс салыстыру регистріндегі мән/ Санауыш 0А. Сағат көзі жиілігі, fclk_I/OБұл жүйелік сағаттың жиілігі. Әдепкі мән - 1 МГц. TCCR0B CS00, CS01 және CS02 биттері бұл таңдауды басқарады. Бұл биттер N мәнін таңдайтындықтан, ол келесіде сипатталады. Алдын ала есептеу мәні, NN - бұл жүйелік сағатты бөлу немесе алдын ала есептеу үшін қолданылатын мән. TCCR0B CS00, CS01 және CS02 биттері бұл таңдауды басқарады. ATtiny2313 деректер парағының 81 -бетіндегі 41 -кесте комбинацияларды сипаттайды. 1 кГц -ге жақын жиілік қажет болғандықтан, TCCR0B -нің CS00 және CS01 биттері орнатылады. Есіңізде болсын, барлық үш битті 0 -ге орнату, осылайша сағат көзін таңдамау шығуды тиімді тоқтатады. Бұл - дыбыстық сигналды қосу және тоқтату үшін қолданылатын әдіс. TOP мәні, OCR0AБұл мән таймер/есептегіш 0А үшін шығыс салыстыру тізіліміне жүктелген санауыштың жоғарғы мәні болып табылады. Бұл мәнге жеткенде, санауыш нөлге ысырылады және TOP жеткенше және цикл қайталанғанша санау қайтадан басталады. TOP оңай өзгертіледі, сондықтан дыбыстық сигналдың жиілігін өзгерту оңай. 1 кГц -ге жақын жиілік қажет болғандықтан, ТОП 7 -ге орнатылады (Ескертпе, алдын ала есептегішті 8 -ге, ал ТОПты 63 -ке қоюға болар еді. Сол нәтиже - сіздің таңдауыңыз.) Шығу жиілігі, fOC0А Шығу жиілігінің нәтижелерін есептеу үшін теңдеуді қолданып. in: fOC0A = 1, 000, 000 /2 * 64 * (1+7) fOC0A = 977ГцЖабық! Міне шығыс салыстыру регистрі мен таймерді есептегішті бақылау регистрі 0B жүктеу коды. Олардың қалай қолданылатынын түсіну үшін бағдарламаның нақты кодын қараңыз. OCR0A = 7; // Уақыт мәні TCCR0B = _BV (CS01) | _BV (CS00); // Ішкі сағатты таңдау & prescale = 8 TCCR0B = 0; // ешқандай сағат көзі дыбысты өшірмейді Уақытты/есептегіш режимін орнату Соңғы мәлімет ретінде біз Таймер/Есептегішті басқару регистрі 0А сәйкес биттерді орнату арқылы қалаған Таймер/Санау режимін көрсетеміз. CTC режимі деректер парағының 40 -кестесінде 79 -бетте сипатталғандай WGM01 битін орнату арқылы таңдалады. Біз шығыс әр циклды ауыстырғанын қалайтындықтан, COM0A0 битін 34 -беттегі 77 -бетте сипатталғандай орнату қажет. Міне код: TCCR0A = _BV (COM0A0) | _BV (WGM01); // CTC ауысу режимі

7 -қадам: Төрт қосқышты пайдалану

Дыбыстық сигналды енгізе отырып, біз төрт қосқышты басқаратын аппараттық және бағдарламалық қамтамасыз етуді кеңейтейік. Есептегіш 0А таймерінің шығысы В портында, 2 -істікте болғандықтан, біз В портына біртіндеп қосқыштарды қосуға болмайды, D портын пайдалану оңай шешім болар еді, бірақ бұл портты басқа функциялар үшін қол жетімді күйде сақтайық. қадамдық қозғалтқыш). Қосымша қосқыштарды PB3 және PB4 -ке қосамыз. Коммутаторларды оқу негізінен өзгермейді. Маска мәні 0x1B (00011011 екілік) мәніне 5, 6 және 7 биттермен бірге 2-битке маскаға өзгертілді, 4-биттік екілік санды құру үшін тағы бір амал қолданылады. 3 -ші және 4 -ші биттерді бір оңға жылжытыңыз және оларды 0 және 1 биттермен 4 биттік екілік санға біріктіріңіз. Бұл биттерді жылжытуға және біріктіруге арналған стандартты C синтаксисі, бірақ жаңадан бастаушыларға жақсы таныс болмауы мүмкін. but1a = (but1 & 0x03) | ((бірақ1 & 0x18) >> 1); // but1 -де коммутатордың оқылуы бар Жұмыс кезінде бағдарлама инициализация сигналын беру үшін екі рет жыпылықтайды және екі рет сигнал береді. Коммутаторлар өзгерген кезде олардың нөмірі дыбыстық сигнал береді. Қосқыштар өзгермеген кезде жарық диоды жыпылықтайды. Бұл кодты іске қосу үшін жаңа каталог жасаңыз (егер қаласаңыз, оны Дыбыс деп атаңыз) және келесі C код файлын жүктеңіз. Makefile2.txt атауын Makefile деп өзгертіңіз. WinAVR көмегімен бағдарламаны құрастырып, оны Attiny2313 -ке жүктеңіз.

8 -қадам: Switch/case конструкциясын пайдалану

Соңғы қадам - «жай ғана бағдарламалық қамтамасыз ету»: Уәде етілгендей, біз коммутатор/корпус конструкциясын енгіземіз. Бұл мысал тек екі балама әрекетті көрсетсе де, бұл конструкцияны бірнеше балама код бөлімдерінің біреуін таңдау үшін қалай қолдану керектігі түсінікті болуы керек. Жұмыс кезінде бұл бағдарлама коммутаторларды бақылайды және егер өзгеріс болса, егер ол тақ болса, ол тиісті санды сигнал береді; егер сан жұп болса, ол жыпылықтайды. Коммутатор өзгермейінше ештеңе істемейді.

Бұл кодты іске қосу үшін жаңа каталог жасаңыз (қаласаңыз, оны Switch деп атаңыз) және келесі C код файлын жүктеңіз және оған файл жасаңыз. Makefile3.txt атауын Makefile деп өзгертіңіз. WinAVR көмегімен бағдарламаны құрастырып, оны Attiny2313 -ке жүктеңіз.

9 -қадам: Қорытынды

Қорытынды
Қорытынды

Міне, осымен! Енді сіз бағдарламаның орындалуын басқару үшін коммутаторларды қалай оқуға болатынын білесіз және коммутатордың параметрлеріне негізделген әрекетті таңдайсыз. Сіз сондай -ақ дыбыстық сигналды қалай жасау керектігін білесіз және отладтаудың кейбір стратегиясын үйрендіңіз.

Егер сіз өзіңіздің түсінігіңізді тексергіңіз келсе, соңғы бағдарламаны жоғары деңгейдегі дыбыстық сигналға өзгертуге тырысыңыз, егер тақ болса, төмен дыбысты шығарыңыз, ал егер қосқыштарда өзгеріс болмаса, жарық диодты үздіксіз жыпылықтаңыз. көмек алу үшін отладка бөліміне оралыңыз.

Ұсынылған: