Съдържание:

Четене на превключватели с ATtiny2313: 9 стъпки
Четене на превключватели с ATtiny2313: 9 стъпки

Видео: Четене на превключватели с ATtiny2313: 9 стъпки

Видео: Четене на превключватели с ATtiny2313: 9 стъпки
Видео: Обзор Razer Blade 15 Advanced 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 има много входно-изходни щифтове и е добре проектиран за четене на входове от превключватели. Тази инструкция ще покаже как да четете входящите данни и да вземате решения въз основа на тяхното състояние. Тъй като само това би направило доста скучен Instructable, ще обясня прост начин за използване на таймера/брояча на ATtiny2313, за да управлява малък високоговорител като звуков сигнал. Ще има и малко отклонение относно прости техники за отстраняване на грешки.

Стъпка 1: Входното устройство

Входното устройство
Входното устройство
Входното устройство
Входното устройство

Тази инструкция се основава на отличната работа на The Real Elliot и използва описаната от него система за разработка на гето ATtiny2313. Информационният лист ATtiny2313 от Atmel е най -добрата справка за всички функции, но не е непременно лесен за четене. 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: Мигащи светлини за сигнал

Ще използваме тези два превключвателя, за да премигнем светодиод програмируем брой пъти. Светодиодите, които ще използваме, ще бъдат мигащите светлини, които The Real Elliot направи известен. Превключвателите 1 и 2 ще се третират като две двоични цифри, така че комбинацията може да представлява числата 0, 1, 2 и 3. Нашата програма ще прочете двата превключвателя и ще мига светодиода подходящия брой пъти, но само ако превключвателят настройките са променени. Превключвателите се освобождават за 500 милисекунди (не са оптимизирани). Алгоритъмът за извеждане е доста прост. Превключвателите се четат и отчитането се отбелязва. Ако тя е различна от стойността oldBut (последната запазена стойност), тогава програмата се забавя за 500 милисекунди и превключвателите се четат отново. Ако стойността е същата като прочетената по -рано, стойността на oldBut ще бъде актуализирана и светодиодът ще мига колко пъти се подразбира от двоичната стойност на двата превключвателя. Обърнете внимание на инверсията на стойността, тъй като превключвателят, който е "включен", чете LO. Превключвателите ще се сканират непрекъснато за допълнителни промени. Моля, вижте по -ранните инструкции на The Real Elliot, за да научите повече за мигащите светлини. Вижте този https://www.ganssle.com/debouncing.pdf, за да научите повече за премахването на ключове. Ето кода ATtiny2313 за този пример. При работа тази програма ще мига два пъти светодиода на PB4 (физически извод 8), за да покаже, че е инициализиран. След това той ще прочете превключвателите един и два и ще мига един до три пъти в зависимост от настройката на превключвателя, когато те се променят. Когато превключвателите не се променят, светодиодът ще мига бавно. За да стартирате този код, създайте нова директория (наречете я "Basic", ако желаете) и изтеглете следния C код файл и makefile в него. Преименувайте Makefile1.txt само на Makefile. Използвайки WinAVR, компилирайте програмата и я заредете във вашия ATtiny2313.

Стъпка 3: Незначително отклонение при отстраняване на грешки

Ако сте като мен (и всеки друг програмист в света), вероятно сте имали моменти, когато кодът без грешки, който сте въвели внимателно и сте го съставили, не прави това, което очаквате. Може би просто не прави нищо! Та какъв е проблема? Как ще разберете? За щастие има няколко подхода за работа. (Вземете тази книга за отлично третиране на темата за отстраняване на грешки. Http://www.debuggingrules.com/) Бих искал да предложа няколко прости предложения, отнасящи се до темата за отстраняване на грешки в приложения за микроконтролер. Първата стъпка е да надградите Какво знаеш. Ако веднъж сте започнали да работи blinkenlight, използвайте го отново, за да видите къде се намирате в програмата си. Харесва ми LED да мига два пъти, за да сигнализира за стартирането на програмата. Можете да поставите кода, за да направите това първоначално в началото на вашата програма. След като разберете, че с вашия хардуер няма нищо лошо, създайте функция, която да мига. Ето функцията, която използвам./* -------------------------------------------- ------------------------------ ** blinkEm-функция за мигане на LED с помощта на PD4 ** PD4 трябва да бъде конфигуриран като изход. ** ------------------------------------------------ ---------------------*/void blinkEm (uint8_t count) {while (count> 0) {PORTD = _BV (PD4); _ закъснение_ms (1000); PORTD = ~ _BV (PD4); _ закъснение_ms (1000); броя--; }} Вече е възможно да използвате тази функция в различни точки от кода си като сигнал, че кодът е изпълнен дотук. Знаейки, че кодът работи, означава, че можете внимателно да разгледате всеки раздел, който е изпълнен, но не е направил това, което сте очаквали, за да намерите грешки. Промяната на едно нещо наведнъж също е ключова техника за отстраняване на грешки (описана в препратката по -горе). Този класически метод работи заедно с „разделяй и владей“: предприемане на бебешки стъпки за постепенно добавяне на функционалност. Това може да изглежда като бавен подход, но не е толкова бавен, колкото опитите за отстраняване на грешки в голяма част от неработещ код наведнъж.

Стъпка 4: Повече отстраняване на грешки

Има много случаи, когато искаме да проверим част от кода, като пропуснем повечето редове в него, след което ги активираме един по един, докато проверяваме дали всеки от тях работи. Обикновено правим това, като „коментираме“редовете, които искаме да пропуснем. Разширение на тази техника е да изрежете и поставите блок код, да коментирате оригинала (за да не го загубим) и да хакнете копието. C има четири лесни начина за коментиране на редове. Поставянето на „//“пред ред коментира този ред. Заключването на един или повече редове в „/*“и „*/“ще коментира цял раздел. За да работи този метод ефективно, не трябва да има друго "*/" в кодовия блок (освен крайния). Така че ефективната дисциплина е да се използва // за коментари в блокове от код и да се запази конструкцията / * * / за блокове за коментари и за коментиране на части от кода. Поставяне на "#if 0" в началото на блок за коментиране и завършване на раздела с "#endif". Повече селективен контрол е възможен с помощта на "#ifdef (идентификатор)" в началото на блок и "#endif" в края. Ако искате блокът да бъде компилиран, използвайте „#define (identifier)“по -рано в програмата. Обърнете внимание, че кавичките са само за акцент и не трябва да бъдат включени. Комбинирането на тези техники трябва да осигури полезен подход за отстраняване на грешки във вашите програми ATtiny2313. Може да намерите тези инструменти за полезни, докато преминаваме през тази инструкция.

Стъпка 5: Използване на таймер/брояч 0 за звукови сигнали

Използване на таймер/брояч 0 за звукови сигнали
Използване на таймер/брояч 0 за звукови сигнали

ATtiny2313 има два мощни таймера/брояча: един 8-битов и един 16-битов. Те могат да бъдат конфигурирани като честотни генератори, контролери за модулация с променлива ширина на импулса и регистри за сравнение на изхода. Пълната им функционалност е описана на 49 страници в информационния лист. Ще използваме обаче прост случай. Ще се използва само Таймер/Брояч 0 (8-битовият) и той ще се използва просто като честотен генератор. Честотата ще бъде насочена към малък високоговорител, за да се издаде звуков сигнал. Таймер/Брояч 0 е напълно описан на страници 66 до 83 от информационния лист ATtiny2313. Внимателното четене на този материал ще ви даде пълно разбиране за Време/Брояч 0. За щастие, един доста прост режим, Clear Timer on Compare (CTC), е всичко, което е необходимо за генериране на звуковия сигнал, който искаме.

За режима, който ще използваме, работата на таймера/брояча е директна. Когато е избран часовник, броячът започва от нула и увеличава всеки тактов импулс. Когато стойността на брояча достигне стойността в регистъра за сравнение на изхода (TOP), броячът се нулира и броенето започва отново. Изходният бит, свързан с таймера/брояча, се превключва, за да се получи изход с квадратна вълна. Това директно задвижва аудио преобразувател, за да издаде звуков сигнал. Малък TDK аудио преобразувател издава звуков сигнал. Подходящо устройство е Digikey 445-2530-ND, TDK SD1209T3-A1 (използвах ранна версия на това). Това е 3 -волтова версия; 5 -волтовата версия също ще работи, очаквам. Карам това директно от изходния порт на Attiny2313 и изглежда работи добре. Sparkfun има подобно устройство.

Стъпка 6: Конфигуриране на таймер/брояч 0

Режимът CTC може да се използва за превключване на изхода OC0A на пин 2, порт B (физически извод 14). За да активирате изхода на този щифт, DDRB трябва да бъде настроен по подходящ начин. C кодът за това е точно като настройка на изход за мигаща светлина. DDRB = _BV (PB2); // Порт B2 е изход. Следващата стъпка е да подадете тактов сигнал и да заредите изходния регистър за сравнение, за да се получи форма на вълна като честота. Уравнението за получената честота е дадено в информационния лист (страница 72). Условията в уравнението ще бъдат описани по -долу. Ето уравнението: fOC0A = fclk_I/O/2*N*(1+OCR0A) Където fOC0A: = изходна честота fclk_I/O: = тактова честота на източника N: = коефициент на предвиждане на часовника OCR0A: = стойност в регистъра за сравнение на изхода за Таймер/ Брояч 0A. Частота на източника на часовник, fclk_I/O Това е честотата на системния часовник. Стойността по подразбиране е 1MHz. Битовете CS00, CS01 и CS02 на TCCR0B контролират този избор. Тъй като тези битове също избират стойността на N, тя е описана по -нататък. Стойност на предварителен преглед, NN е стойността, използвана за разделяне или предварително мащабиране на системния часовник. Битовете CS00, CS01 и CS02 на TCCR0B контролират този избор. Таблица 41 на страница 81 от информационния лист ATtiny2313 описва комбинациите. Тъй като желаната честота е близо 1 kHz, ще бъдат зададени битове CS00 и CS01 на TCCR0B. Имайте предвид, че настройката на трите бита на 0, като по този начин не се избира източник на часовник, ефективно спира изхода. Това е методът, който ще се използва за стартиране и спиране на звуковия сигнал. TOP Стойност, OCR0AT Тази стойност е ТОП стойността за брояча, който се зарежда в регистъра за сравнение на изхода за таймер/брояч 0A. Когато тази стойност бъде достигната, броячът ще бъде нулиран и броенето ще започне отново, докато се достигне TOP и цикълът се повтори. TOP се променя лесно, така че честотата на звуковия сигнал е лесна за промяна. Тъй като желаната честота е близо 1 kHz, TOP е зададен на 7. (Обърнете внимание, че предусилвателят може да е настроен на 8, а TOP е зададен на 63. Същият резултат - по ваш избор.) Изходна честота, fOC0A Използване на уравнението за изчисляване на резултатите от изходната честота в: fOC0A = 1, 000, 000 /2 * 64 * (1+7) fOC0A = 977Hz Достатъчно близо! Ето кода за зареждане на регистъра за сравнение на изхода и регистъра за управление на брояча на таймера 0B. Моля, вижте действителния програмен код, за да разберете как се използват те. OCR0A = 7; // Времева стойност TCCR0B = _BV (CS01) | _BV (CS00); // Изберете вътрешен часовник & предварително скалиране = 8 TCCR0B = 0; // никой източник на часовник не изключва тона Настройка на режим Време/Брояч Като последен детайл, ние ще посочим желания от нас режим Таймер/Брояч, като зададем подходящи битове в Регистър за управление на таймер/брояч 0A. Режимът CTC се избира чрез задаване на бит WGM01, както е описано в Таблица 40, страница 79 от информационния лист. Тъй като искаме изходът да превключва всеки цикъл, битът COM0A0 също трябва да бъде настроен, както е описано в Таблица 34 на страница 77. Ето кода: TCCR0A = _BV (COM0A0) | _BV (WGM01); // Режим на превключване на CTC

Стъпка 7: Използване на четири превключвателя

Докато внедряваме звуковия сигнал, нека разширим нашия хардуер и софтуер, за да се справим с четири превключвателя. Тъй като изходът на брояч на таймера 0A е на порт B, пин 2, не можем просто да свържем последователно повече превключватели последователно към порт B. Лесно решение би било да използваме порт D, но нека този порт да бъде достъпен за други функции (може би стъпков двигател). Така че нека свържем допълнителните превключватели към PB3 и PB4. Четенето на превключвателите е почти непроменено. Стойността на маската се променя на 0x1B (00011011 двоичен), за да се маскира бит 2 заедно с 5, 6 и 7. Един друг трик се използва за създаване на 4-битово двоично число. Преместете битовете 3 и 4 надясно с един бит и ги комбинирайте с битове 0 и 1 в 4 -битово двоично число. Това е стандартен C синтаксис за преместване и комбиниране на битове, но може да не е добре познат на начинаещия. but1a = (but1 & 0x03) | ((but1 & 0x18) >> 1); // but1 има четене на превключвател При работа програмата ще мига два пъти и ще издава два звукови сигнала, за да сигнализира инициализацията. Всеки път, когато превключвателите се сменят, номерът, който представляват, ще бъде издаден. Когато превключвателите не се променят, светодиодът ще мига. За да стартирате този код, създайте нова директория (наречете го Beep, ако желаете) и изтеглете следния C код файл и makefile в него. Преименувайте Makefile2.txt само на Makefile. Използвайки WinAVR, компилирайте програмата и я заредете във вашия Attiny2313.

Стъпка 8: Използване на Switch/case Construct

Последната стъпка е „просто софтуер“: Както обещахме, ще внедрим конструкцията switch/case. Въпреки че този пример показва само две алтернативни действия, трябва да е много ясно как да използвате тази конструкция, за да изберете една от няколкото алтернативни кодови секции. По време на работа тази програма следи превключвателите и ако има промяна, ще издава звуков сигнал за съответния номер, ако е нечетен; ще мига, ако числото е четно. Той не прави нищо, освен ако ключът не се промени.

За да стартирате този код, създайте нова директория (наречете я Switch, ако искате) и изтеглете следния C код файл и makefile в него. Преименувайте Makefile3.txt само на Makefile. Използвайки WinAVR, компилирайте програмата и я заредете във вашия Attiny2313.

Стъпка 9: Заключение

Заключение
Заключение

Значи това е! Сега знаете как да използвате ключове за контрол на изпълнението на вашата програма, като ги прочетете и изберете действие въз основа на настройката на превключвателя. Освен това знаете как да създадете звуков сигнал и сте научили и някои стратегии за отстраняване на грешки.

Ако искате да проверите разбирането си, опитайте да промените последната програма, за да издадете звуков сигнал с висока височина, ако е четен, бипкайте ниска нота, ако е нечетна, и непрекъснато мигайте светодиода, ако няма промяна в превключвателите. Може да искате да погледнете обратно в раздела за отстраняване на грешки за помощ.

Препоръчано: