Съдържание:

Attiny85 Едновременно програмиране или тиква с многоцветни очи: 7 стъпки
Attiny85 Едновременно програмиране или тиква с многоцветни очи: 7 стъпки

Видео: Attiny85 Едновременно програмиране или тиква с многоцветни очи: 7 стъпки

Видео: Attiny85 Едновременно програмиране или тиква с многоцветни очи: 7 стъпки
Видео: ATtiny13 и ATtiny85. Обзор и программирование с помощью Arduino 2024, Ноември
Anonim

От jumbleviewJumbleview.info Следвайте още от автора:

Писъкът
Писъкът
Писъкът
Писъкът
Подмяна на NiCd батерия с външно захранване
Подмяна на NiCd батерия с външно захранване
Подмяна на NiCd батерия с външно захранване
Подмяна на NiCd батерия с външно захранване
Дръжка за цифров фотоапарат
Дръжка за цифров фотоапарат
Дръжка за цифров фотоапарат
Дръжка за цифров фотоапарат

За: Работя като софтуерен инженер в една от компаниите на Bay Area (Калифорния). Винаги, когато имам време, обичам да програмирам микроконтролери, да изграждам механични играчки и да правя някои проекти за подобряване на дома. Повече за jumbleview »

Този проект показва как да управлявате два 10-милиметрови трицветни обикновени анодни светодиода (многоцветни очи на Pumpkin Halloween Glitter) с чип Attiny85. Целта на проекта е да запознае читателя с изкуството на едновременното програмиране и с използването на библиотеката с протополи на Адам Дънкелс. Този проект предполага, че читателят знае за 8-битовите AVR контролери, може да напише C-програма и има известен опит със студио Atmel.

Кодът на проекта, публикуван на GitHub:

Консумативи

Преди програмирането човек все още трябва да изгради веригата. Ето компоненти:

  • Контролер Attiny85 (всеки електронен доставчик).
  • Два трицветни 10 мм светодиода с общ анод. Adafruit светодиоди
  • Резистори 100 Ohm, 120 Ohm, 150 Ohm 0.125 или 0.250 Wt (всеки електронен доставчик).
  • Шест пинов заглавие за AVR ISP интерфейс. Може да се направи от тази заглавка Adafruit
  • Някаква дъска за хляб или печатна дъска за шаблони. Използвах този
  • Интерфейс на AVR ISP MKII и Atmel Studio 6.1 (По -късната версия също трябва да работи).

Стъпка 1: Изрежете

Circut
Circut

Дизайнът използва пет чипа:

  • Два пина, използвани за управление на аноди: всеки LED анод, прикрепен към специалния щифт.
  • Три щифта, прикрепени (чрез резистори) към светодиодите катоди (катодът от същия цвят на всеки светодиод, прикрепен към същия щифт)

Човек би попитал: защо да не използваме всичките шест входни/изходни щифта на чипа, така че LED анодите да бъдат свързани директно към +5 v и всеки катод да има свой специален щифт? Това ще направи програмирането лесно. Уви, има проблем: щифт PB5 (RESET) е слаб щифт, способен да осигури само ~ 2 mA от тока, докато е необходимо да има ~ 20 mA.

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

Стъпка 2: Диаграма на времето

График на времето
График на времето

Времевата диаграма ни помага да разберем какво трябва да програмираме.

Горните два реда на диаграмата показват промяна на напрежението на LED анодите. Напрежението на щифтовете, свързани към LED анодите, се колебае с честота ~ 250 Hz. Това трептене на напрежението за левия светодиод е противоположно на трептенето на десния светодиод. Когато напрежението на анода е високо, съответният светодиод може да свети. Когато е ниско, съответният светодиод е тъмен. Това означава, че всеки светодиод може да е ярък през интервал от 2 милисекунди и да е тъмен през следващите 2 милисекунди. Тъй като човешкото око има известна инерция, мигането от 250 Hz не се забелязва от наблюдателя. Долните три реда на диаграмата показват промяна на напрежението на щифтовете, свързани към катодите на светодиодите. Нека разгледаме първата колона с диаграма. Той показва случая, когато левият светодиод е в червен цвят, а десният в зелен цвят. Тук червените катоди остават ниски, докато левият анод е висок, зеленият катод остава нисък, докато десният анод е висок, а синият катод остава нисък през цялото време. Други колони на диаграмата показват комбинации от катодно и анодно напрежение за различни цветове.

Както виждаме, има взаимозависимост от състоянието на щифтовете. Без някаква рамка не би било лесно да се разреши. И това е мястото, където библиотеката protothread е полезна.

Стъпка 3: Програмиране. Макроси и дефиниции

Програмиране. Макроси и дефиниции
Програмиране. Макроси и дефиниции

Примерите в стъпките за програмиране представляват леко опростена версия. Програмата се съкращава и някои символични дефиниции се заменят с явни константи.

Нека започнем отначало. Програмата включва файлове, идващи с Atmel Studio, както и заглавка на библиотека с прототипи. След това има два макроса за манипулиране на нивата на пинове и някои дефиниции за даване на логически имена на сигналите за закрепване. Засега нищо особено.

Стъпка 4: Програмиране. Основен цикъл

Програмиране. Основен цикъл
Програмиране. Основен цикъл

Тогава нека погледнем в края, за да видим какво съдържа основната процедура.

Функцията main след извършване на инициализация остава завинаги в цикъла. В този цикъл той прави следните стъпки:

  • Извиква прототипен режим за левия светодиод. Променя напрежението на някои изводи.
  • Направете закъснение от две милисекунди. Няма промяна в напрежението на щифта.
  • Извиква проторез за десния светодиод. Той променя напрежението на някои изводи.
  • Направете 2 MS забавяне. Няма промяна в напрежението на щифта.

Стъпка 5: Програмиране. Спомагателни функции

Програмиране. Спомагателни функции
Програмиране. Спомагателни функции

Преди да започнем да обсъждаме протопотоци, трябва да разгледаме някои помощни функции. Първо има функции за задаване на определен цвят. Те са ясни. Има толкова функции като брой поддържани цветове (седем) и още една функция за настройка на LED тъмно (NoColor).

Има и още една функция, която директно ще бъде извикана от рутинната програма за потоци. Името му е DoAndCountdown ().

Технически погледнато използването на такава функция не е задължително, но ми се стори удобно. Той има три аргумента:

  • Показалец за настройка на цвета на светодиода (като RedColor или GreenColor или т.н.)
  • Начална стойност на обратния брояч: броят колко пъти тази функция трябва да бъде извикана на конкретен етап на поточна нишка.
  • Указател към обратен брояч. Предполага се, че когато има промяна в цвета, този обратен брояч е 0, така че първо итерационният код ще присвои на този брояч начална стойност. След всяка итерация броячът се намалява.

Функция DoAndCountdown () връща стойността на обратния брояч.

Стъпка 6: Програмиране. Процедури за протопоток

Програмиране. Процедури за протопоток
Програмиране. Процедури за протопоток

И тук е рамковото ядро: прототип на поточна нишка. За по -голяма простота примерът се ограничава само до три стъпки: за промяна на цвета на ЧЕРВЕН, НА ЗЕЛЕН и НА СИН.

Функцията се извиква с два аргумента:

  • Указател към структура на протопоток. Тази структура е инициализирана от main преди началото на главния цикъл.
  • Указател към обратен брояч. Той беше зададен на 0 от main преди стартирането на основния цикъл.

Функция задава напрежения, за да направи левия светодиод активен и след това стартира сегмента на протонита. Този сегмент е между макроси PT_BEGIN и PT_END. Вътре има някакъв код, който в нашия случай повтаря само макроси PT_WAIT_UNTIL. Тези макроси изпълняват следното:

  • Извикване на функция DoAndCountdown. Това задава напрежение върху LED катодите да излъчват определен цвят.
  • Върнат резултат в сравнение с 0. Ако условието е „невярно“, функцията протопоток веднага се връща и дава контрол на главния цикъл.
  • Когато следващия път се извика protothread, той отново изпълнява код преди PT_BEGIN, след което прескача директно в макросите PT_WAIT_UNTIL, от които се върна последния път.
  • Подобни действия се повтарят, докато резултатът от DoAndCountdown е 0. В този случай няма връщане, програмата остава в протопоток и изпълнява следващия ред на кода. В нашия случай това е следващият PT_WAIT_UNTIL, но като цяло може да бъде почти всеки C код.
  • При първоначалното изпълнение на втория PT_WAIT_UNTIL обратният брояч е 0, така че процедурата DoAndCountdown () го зададе на първоначалната стойност. Вторите макроси отново ще се изпълняват 250 пъти, докато броячът на обръщане достигне 0.
  • Състоянието на struct pt се нулира веднага щом контролът достигне PT_END макроси. Когато функцията protothread бъде извикана следващия път, когато сегментът protothread започне, изпълнете реда на кода веднага след PT_BEGIN.

Съществува подобна рутина с протони за десния светодиод. В нашия пример той просто налага различен ред на цветовете, но ако можем да го направим напълно различно: няма плътно свързване между лявата и дясната LED рутина.

Стъпка 7: Вътрешни

Вътрешни
Вътрешни

Цялата програма е с по -малко от 200 реда код (с коментари и празни редове) и заема по -малко от 20% от кодовата памет на Attiny85. Ако е необходимо, тук е възможно да се използват още няколко подпрограми за протопоток и да им се присвои много по -сложна логика.

Библиотеката Protothreads е най -простата форма на компютърно паралелно програмиране. Едновременното програмиране е подход, който позволява разделянето на програмата на логически части: понякога те се наричат съпрограми, понякога нишки, понякога задачи. Принципът е, че всяка такава задача може да споделя една и съща процесорна мощност, като запазва кода повече или по -малко линеен и независим от други части. Задачи от логическа гледна точка могат да се изпълняват едновременно.

За усъвършенствани системи контролът на такива задачи се извършва или от ядрото на операционната система, или от езика по време на изпълнение, вграден в изпълним файл от компилатор. Но в случай на protothreads, програмистът го контролира ръчно, като използва библиотека с макроси на protothreads в подпрограмите за задачи и извиква такива подпрограми (обикновено извън основния цикъл).

Вероятно искате да знаете как всъщност работи protothread? Къде се крие магията? Протоните разчитат на специална функция на езика C: фактът, че операторът C на случай на превключване може да бъде вграден в if или друг блок (като while или for). Подробности можете да намерите на сайта на Adam Dunkels

Електрониката на този проект е много проста. Снимката по -горе ви дава известна представа. Сигурен съм, че можете да се справите по -добре.

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