Мазмуну:

ATtiny2313 менен окуу которгучтары: 9 кадам
ATtiny2313 менен окуу которгучтары: 9 кадам

Video: ATtiny2313 менен окуу которгучтары: 9 кадам

Video: ATtiny2313 менен окуу которгучтары: 9 кадам
Video: КУРАН АЛИППЕСИ №19 САБАК /ТАНВИН/ МЕНЕН/ ТАШДИД/ ЧОГУ/ КЕЛГЕНДЕ/ 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-микропроцессор менен/. Чыныгы Эллиоттун акыркы моторунда иштөө, ал тепкич моторлорду кантип башкарууну көрсөткөн, мен ошол эле программада коддун альтернативдүү бөлүмдөрүн иштетүү абдан пайдалуу болорун түшүндүм, ошондуктан ATtiny2313 ар бирин кайра программалоонун кереги жок болчу. Мен коддун бир аз өзгөрүүсүн сынап көргүм келди (мисалы, жарым кадам же тескери иштетүү). Башка варианттарды тандоого мүмкүндүк берүү үчүн switch/case операторун колдонуп код жазуу оңой болгону менен, ишти тандоонун кандайдыр бир жолу керек. Бул ишти көзөмөлдөө үчүн кандайдыр бир киргизүү түзмөгүн окуу керек дегенди билдирет. Бактыга жараша, ATtiny2313 көптөгөн I/O казыктарына ээ жана коммутаторлордун кирүүлөрүн окуу үчүн жакшы иштелип чыккан. Бул Нускамада кирүүлөрдү кантип окуп, абалына жараша чечим кабыл алынары көрсөтүлөт. Ушунун өзү эле абдан кызыксыз Нускамалыкка айланып кете тургандыктан, мен кичинекей спикерди бипер катары айдоо үчүн ATtiny2313 таймерин/эсептегич жөндөмүн колдонуунун жөнөкөй жолун түшүндүрөм. Жөнөкөй мүчүлүштүктөрдү оңдоо техникасы боюнча да кичине чегинүү болот.

1 -кадам: киргизүү түзмөгү

Киргизүү түзмөгү
Киргизүү түзмөгү
Киргизүү түзмөгү
Киргизүү түзмөгү

Бул Instructable Реал Эллиоттун эң сонун ишине негизделген жана ал сүрөттөгөн ATtiny2313 Ghetto өнүктүрүү системасын колдонот. ATmel ATtiny2313 маалымат баракчасы бардык функциялар үчүн эң сонун маалымат, бирок аны окуу оңой эмес. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Шилтемеде бардык AVR маалымат баракчалары бар, 2313 -тү табыңыз.) Сүрөттө киргизүү өчүргүчтөрүнүн жөнөкөй топтому көрсөтүлгөн. Бул жөн эле төрт күйгүзүү/өчүрүүчүнүн пакети; жалгыз полюс, жалгыз ыргыткычтар (SPST) деп да аталат. Адатта, ар бир которгучтун бир туташуусу же уюлу жерге байланат, ал эми экинчи туташуу токту чектөөчү резистор (10K же андан жогору) аркылуу жогору тартылат. Микроконтроллердин кириши каршылык менен тирөөчкө туташкан. Эгерде которгуч ачык болсо, микроконтроллер кирүүнү HI катары окуйт. Эгерде которгуч жабык болсо, микроконтроллер LO киришин окуйт. ATtiny2313, алар киргизүү катары конфигурацияланганда, I/O казыктарына программалуу тартылуучу каршылыктарды берүү менен нерселерди жөнөкөйлөтөт. Бул өчүргүчтөрдүн бир гана таяныч жерге (LO) байланганын, ал эми экинчи полюстун процессордун киришине туташтырылганын билдирет. Биринчи мисал эки өчүргүчтү гана көрсөтөт. Коммутаторлор төмөнкү код менен окулат жана конфигурацияланат. Коммутаторлорду кириш катары конфигурациялаңыз: (Эч кандай код талап кылынбайт; бул демейки.) Тартуу каршылыгын күйгүзүңүз: PORTB = _BV (PB0) | _BV (PB1); Кириштерди окуу: but1 = ~ PINB & 0x03; Туура баалуулукту алуу үчүн инверсиянын жана маскировканын колдонулушуна көңүл буруңуз.

2 -кадам: сигнал үчүн Blinkenlights

Биз бул эки өчүргүчтү LEDди программалоочу жолу ирмөө үчүн колдонобуз. Биз колдоно турган светодиоддор Реал Эллиот атактуу кылган жаркыраган жарыктар болот. 1 жана 2 которгучтар эки бинардык цифралар катары каралат, андыктан комбинация 0, 1, 2 жана 3 сандарын чагылдыра алат. Биздин программа эки өчүргүчтү окуйт жана светодиодду тийиштүү санда өчүрөт, бирок которгуч болсо гана орнотуулар өзгөрдү. Коммутаторлор 500 миллисекундка дебюдент (оптималдаштырылган эмес). Чыгуу алгоритми абдан жөнөкөй. Которгучтар окулат жана окулушу белгиленет. Эгерде ал oldButтан айырмаланса (акыркы сакталган маани), анда программа 500 миллисекундга кечиктирилет жана которгучтар кайра окулат. Эгерде маани мурда окулган менен бирдей болсо, oldButтун мааниси жаңыртылат жана LED эки өчүргүчтүн бинардык мааниси менен канча жолу ирмелет. Маанинин инверсиясына көңүл буруңуз, анткени "күйүк" которгуч LO окуйт. Коммутаторлор андан ары өзгөрүүлөр үчүн үзгүлтүксүз сканерленип турат. Жарыктар тууралуу көбүрөөк билүү үчүн Реал Эллиоттун мурунку Инструкцияларына кайрылыңыз. Бул https://www.ganssle.com/debouncing.pdf караңыз, өчүргүчтөрдү четтетүү жөнүндө көбүрөөк билүү үчүн. Бул мисал үчүн ATtiny2313 коду. Иштеп жатканда, бул программа PB4төгү (физикалык пин 8) LEDди эки ирет күйгүзүп, инициализацияланганын көрсөтөт. Андан кийин ал которгучтардын бирин жана экинчисин окуйт жана алмаштырылганда которгучтун жөндөөсүнө жараша бирден үч жолу ирмелет. Которгучтар өзгөрбөгөндө, LED акырын өчүп калат. Бул кодду иштетүү үчүн, жаңы каталогду түзүңүз (эгер кааласаңыз "Негизги" деп атаңыз) жана төмөнкү C кодунун файлын жана ага файлды жүктөп алыңыз. Makefile1.txt атын Makefile деп атоо. WinAVRди колдонуп, программаны түзүңүз жана аны ATtiny2313ке жүктөңүз.

3 -кадам: Мүчүлүштүктөрдү оңдоо боюнча кичине чегинүү

Эгерде сиз мага окшош болсоңуз (жана дүйнөнүн башка программисттери), сиз кылдаттык менен киргизип, түзгөн "катасыз" код сиз күткөндөй кылбаган учурларга туш болгонсуз. Балким, бул жөн эле эч нерсе кылбайт! Анда эмне көйгөй бар? Кантип билип жатасың? Бактыга жараша, нерселерди иштетүү үчүн бир нече ыкмалар бар. (Бул китепти мүчүлүштүктөрдү оңдоо темасын мыкты дарылоо үчүн алыңыз. Http://www.debuggingrules.com/) Мен микроконтроллер тиркемелерин оңдоо темасына тиешелүү бир нече жөнөкөй сунуштарды бергим келет. сен эмнени билесиң. Эгер сиз бир жолу иштөө үчүн жаркыраган жарыкка ээ болсоңуз, анда программаңыздын кайда экенин көрүү үчүн аны кайра колдонуңуз. Мен программанын башталышын билдирүү үчүн LEDдин эки ирет жарк эткенин жакшы көрөм. Бул үчүн программанын башында кодду киргизсеңиз болот. Аппараттык жабдууларыңызда эч нерсе жок экенин билгенден кийин, жарк этүү функциясын түзүңүз. Мына мен колдонгон функция./*------------------------------------------ ------------------------------ ** blinkEm-PD4 ** PD4 колдонуп LEDди күйгүзүү функциясы PD4 чыгыш катары конфигурацияланууга тийиш. ** ------------------------------------------------ ---------------------*/void blinkEm (uint8_t count) {while (count> 0) {PORTD = _BV (PD4); _delay_ms (1000); PORTD = ~ _BV (PD4); _delay_ms (1000); count--; }} Эми бул функцияны кодуңуздун ар кайсы жеринде коддун буга чейин аткарылганын билдирүүчү сигнал катары колдонууга болот. Коддун иштеп жатканын билүү, каталарды табуу үчүн, сиз иштеген, бирок күткөнүңүздү кылбаган ар бир бөлүмдү кылдат текшерип чыгууга болот дегенди билдирет. Бир убакта бир нерсени өзгөртүү - мүчүлүштүктөрдү оңдоонун негизги ыкмасы (жогоруда маалымдалган). Бул классикалык ыкма "бөлүү жана багынтуу" менен бирге иштейт: функционалды кадам сайын кошуу үчүн баланын кадамдарын жасоо. Бул жай мамиле сыяктуу сезилиши мүмкүн, бирок ал иштебей турган коддун чоң бөлүгүн бир убакта оңдоого аракет кылуу сыяктуу жай эмес.

4 -кадам: Дагы мүчүлүштүктөрдү оңдоо

Көптөгөн учурларда, биз коддун бир бөлүгүн текшерип, андагы саптардын көбүн өткөрүп жиберип, ар биринин иштешин текшерип жатканда аларды бирден иштетип койгубуз келет. Адатта, биз муну өткөргүбүз келген саптарды "комментарий берүү" аркылуу жасайбыз. Бул техниканын кеңейтүүсү - коддун блогун кесүү жана чаптоо, түпнускасын комментарийлөө (ошондуктан биз аны жоготпойбуз) жана copy. Cack линияларын комментарийлөөнүн төрт оңой жолу бар. Сызыктын алдына "//" коюу ошол сапты комментарийлейт. "/*" Жана "*/" бир же бир нече сапты камтуу бүтүндөй бир бөлүктү комментарийлейт. Бул методдун эффективдүү иштеши үчүн код блогунда башка "*/" болбошу керек (аяктагандан башка). Натыйжалуу дисциплина - бул коддун блокторундагы комментарийлер үчүн // колдонуу жана / * * / конструкциясын комментарий блоктору үчүн жана коддун бөлүмдөрүн комментарийлөө үчүн калтыруу. Блоктун башында "#if 0" коюу комментарий берүү үчүн. жана бөлүмдү "#endif" менен аяктоо. Көбүрөөк тандалма көзөмөл блоктун башында "#ifdef (идентификатор)" жана аягында "#endif" аркылуу мүмкүн болот. Эгерде сиз блоктун түзүлүшүн кааласаңыз, программанын башында "#define (идентификатор)" колдонуңуз. Эскертүү, цитата белгилери басым үчүн гана жана киргизилбейт. Бул ыкмаларды айкалыштыруу ATtiny2313 программаларыңызды мүчүлүштүктөрдү оңдоо үчүн пайдалуу ыкманы камсыз кылууга тийиш. Бул инструкцияны колдонуп жатып, сиз бул куралдарды пайдалуу деп таба аласыз.

5 -кадам: Таймерди/Счетчикти 0 Бип үчүн колдонуу

Таймерди/Счетчикти 0 Бип үчүн колдонуу
Таймерди/Счетчикти 0 Бип үчүн колдонуу

ATtiny2313 эки күчтүү таймер/эсептегич ресурстарга ээ: бир 8-бит жана бир 16-бит. Булар жыштык генераторлору, өзгөрмөлүү импульстун модуляция контроллери жана өндүрүштүн салыштыруу реестри катары конфигурацияланышы мүмкүн. Булардын толук иштеши маалымат баракчасынын 49 барагында сүрөттөлгөн. Бирок, биз жөнөкөй ишти колдонобуз. Бир гана Таймер/Counter 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 режими Pin 2, Port B (OC0A) чыгуусун которуу үчүн колдонулушу мүмкүн (физикалык пин 14). Бул пинге чыгууну иштетүү үчүн, DDRB тиешелүү түрдө орнотулушу керек. Бул үчүн C коду жаркыраган жарык үчүн чыгарууну орнотууга окшош. DDRB = _BV (PB2); // Порт В2 - бул чыгаруу. Кийинки кадам - жыштык катары толкун формасын чыгаруу үчүн саат сигналын берүү жана чыгууну салыштыруу реестрин жүктөө. Жыйынтыктын теңдемеси маалымат баракчасында берилген (72 -бет). Теңдемедеги терминдер төмөндө сүрөттөлөт. Бул жерде теңдеме бар: fOC0A = fclk_I/O/2*N*(1+OCR0A) Бул жерде fOC0A: = чыгаруу жыштыгы fclk_I/O: = сааттын булагы жыштыгы N: = саатка чейинки баа коэффициенти OCR0A: = Чыгыштын Таймер үчүн салыштыруу реестриндеги мааниси/ Counter 0A. Clock Source Frequency, fclk_I/OБул системалык сааттын жыштыгы. Демейки мааниси 1 МГц. TCCR0Bдин CS00, CS01 жана CS02 биттери бул тандоону көзөмөлдөйт. Бул биттер Nдин маанисин тандап алгандыктан, ал кийинкиде сүрөттөлөт. Алдын ала баалоо, NN - бул системдик саатты бөлүү же алдын ала баалоо үчүн колдонулган мааниси. TCCR0Bдин CS00, CS01 жана CS02 биттери бул тандоону көзөмөлдөйт. ATtiny2313 маалымат барагынын 81 -бетиндеги 41 -таблица айкалыштарды сүрөттөйт. 1кГц жакын жыштык керектүү болгондуктан, TCCR0Bдин CS00 жана CS01 биттери коюлат. Эске алыңыз, үч битти тең 0го коюу, ошондо сааттын булагын тандоо натыйжалуу чыгууну токтотот. Бул бипти баштоо жана токтотуу үчүн колдонула турган метод Бул көрсөткүчкө жеткенде, эсептегич нөлгө кайтарылат жана TOP жеткенге чейин цикл кайра кайталана баштайт. TOP оңой өзгөртүлөт, андыктан сигналдын жыштыгын өзгөртүү оңой. 1кГцге жакын жыштык каалагандыктан, TOP 7ге коюлган. (Эскертүү, алдын ала эсептегичти 8ге, ал эми ТОПту 63кө койсо болмок. Ошол эле жыйынтык - сиздин тандооңуз.) Чыгаруу жыштыгы, fOC0АЧыгуу жыштыгынын жыйынтыктарын эсептөө үчүн теңдемени колдонуу. ичинде: fOC0A = 1, 000, 000 /2 * 64 * (1+7) fOC0A = 977 Гц Жабуу! Бул жерде Output Compare регистрин жана Таймердин Counter Control реестрин жүктөө коду 0B. Сураныч, булардын кантип колдонулганын түшүнүү үчүн программанын чыныгы кодун караңыз. OCR0A = 7; // Убакыт мааниси TCCR0B = _BV (CS01) | _BV (CS00); // Ички саатты тандоо & prescale = 8 TCCR0B = 0; // саат жок CTC режими 40 -таблицада, маалымат баракчасынын 79 -бетинде сүрөттөлгөн WGM01 битин коюу менен тандалат. Биз өндүрүштүн ар бир циклге которулушун каалайбыз, андыктан COM0A0 битти 77 -беттеги 34 -столдо сүрөттөлгөндөй коюу керек. Бул жерде код: TCCR0A = _BV (COM0A0) | _BV (WGM01); // CTC которуу режими

7 -кадам: Төрт которуштурууну колдонуу

Биз үн чыгаргычты ишке киргизип жатканда, келгиле, аппараттык жана программалык камсыздоону төрт өчүргүчтү иштетүү үчүн кеңейтели. Таймер Counter 0Aнын чыгышы П портунда, пин 2де болгондуктан, биз жөн гана П В портуна көбүрөөк өчүргүчтөрдү иле албайбыз. Порт D'ди колдонуу оңой чечим болмок, бирок бул портту башка функциялар үчүн жеткиликтүү кылалы (балким тепкич мотору). Келгиле, PB3 жана PB4 үчүн кошумча өчүргүчтөрдү илип алалы. Масканын мааниси 0x1B (00011011 бинардык) болуп 5, 6 жана 7 менен бирге бит 2ди маска кылуу үчүн өзгөртүлөт, дагы бир трюк 4-бит бинардык санды түзүү үчүн колдонулат. 3 жана 4 биттерин бир аз оңго жылдырыңыз жана 0 жана 1 биттери менен 4 биттик экилик санга бириктириңиз. Бул биттерди которуу жана бириктирүү үчүн стандарттык C синтаксиси, бирок башталгычка жакшы белгилүү болбошу мүмкүн. but1a = (but1 & 0x03) | ((but1 & 0x18) >> 1); // but1 которгуч окууга ээ Иштеп жатканда, программа эки жолу ирмелет жана инициализация сигналын берүү үчүн эки жолу сигнал берет. Качан алмаштыргычтар алмаштырылса, алар билдирген санга сигнал берилет. Которгучтар өзгөрбөгөндө, LED бул кодду иштетүү үчүн, жаңы каталог түзүңүз (эгер кааласаңыз, аны Бип деп атаңыз) жана төмөнкү C код файлын жана ага файлды жүктөп алыңыз. Makefile2.txt атын Makefile деп атоо. WinAVRди колдонуп, программаны түзүңүз жана аны Attiny2313ке жүктөңүз.

8 -кадам: Switch/case Constructту колдонуу

Акыркы кадам "жөн эле программалык камсыздоо": Убада кылынгандай, биз switch/case конструкциясын ишке ашырабыз. Бул мисал эки гана альтернативдүү аракеттерди көрсөтсө да, бул конструкцияны бир нече альтернативдүү коддордун бирин тандоо үчүн кантип колдонуу керектиги абдан ачык болушу керек. Иштеп жатканда, бул программа өчүргүчтөрдү көзөмөлдөйт жана эгерде өзгөрүү болсо, анда ал кызык болсо, тиешелүү санга сигнал берет; эгерде сан жуп болсо, ал көз ирмебейт. Бул которгуч өзгөрмөйүнчө эч нерсе кылбайт.

Бул кодду иштетүү үчүн, жаңы каталог түзүңүз (эгер кааласаңыз, аны Switch деп атаңыз) жана төмөнкү C кодунун файлын жана ага файлды жүктөп алыңыз. Makefile3.txt атын Makefile деп атоо. WinAVRди колдонуп, программаны түзүңүз жана аны Attiny2313ке жүктөңүз.

9 -кадам: Жыйынтык

Жыйынтык
Жыйынтык

Ошентип, бүттү! Эми сиз программаңыздын аткарылышын көзөмөлдөө үчүн коммутаторлорду кантип колдонууну билесиз жана аларды которуу жөндөмүнүн негизинде иш -аракетти тандап аласыз. Сиз ошондой эле бип тонун кантип түзүүнү билесиз жана мүчүлүштүктөрдү оңдоо стратегиясын үйрөндүңүз.

Эгерде сиз өзүңүздүн түшүнүгүңүздү текшергиңиз келсе, анда эң акыркы программаны бийик деңгээлде бип деп өзгөртүүгө аракет кылыңыз, эгер кызык болсо, төмөн нотаны бип жана өчүргүчтөрдө эч кандай өзгөрүү болбосо, LEDди үзгүлтүксүз өчүрүп коюңуз. мүчүлүштүктөрдү оңдоо бөлүмүнө кайра кайрылыңыз.

Сунушталууда: