Obsah:

Súbežné programovanie Attiny85 alebo tekvica s viacfarebnými očami: 7 krokov
Súbežné programovanie Attiny85 alebo tekvica s viacfarebnými očami: 7 krokov

Video: Súbežné programovanie Attiny85 alebo tekvica s viacfarebnými očami: 7 krokov

Video: Súbežné programovanie Attiny85 alebo tekvica s viacfarebnými očami: 7 krokov
Video: Mikrokontrolér ATtiny programovanie a zobrazovanie na LCD displeji 2024, November
Anonim

Od jumbleviewJumbleview.infoSledovať viac od autora:

Výkrik
Výkrik
Výkrik
Výkrik
Výmena batérie NiCd za externý zdroj napájania
Výmena batérie NiCd za externý zdroj napájania
Výmena batérie NiCd za externý zdroj napájania
Výmena batérie NiCd za externý zdroj napájania
Rukoväť digitálneho fotoaparátu
Rukoväť digitálneho fotoaparátu
Rukoväť digitálneho fotoaparátu
Rukoväť digitálneho fotoaparátu

O: Pracujem ako softvérový inžinier v jednej zo spoločností v Bay Area (Kalifornia). Kedykoľvek mám čas, rád naprogramujem mikrokontroléry, vyrobím mechanické hračky a urobím niekoľko domácich projektov. Viac o jumbleview »

Tento projekt ukazuje, ako pomocou čipu Attiny85 ovládať dve 10 mm trojfarebné LED so spoločnou anódou (viacfarebné oči Pumpkin Halloween Glitter). Cieľom projektu je zoznámiť čitateľa s umením súbežného programovania a s využitím knižnice protivlákn Adam Dunkels. Tento projekt predpokladá, že čitateľ vie o 8-bitových radičoch AVR, dokáže napísať nejaký C-program a má určité skúsenosti so štúdiom Atmel.

Kód projektu zverejnený na GitHub:

Zásoby

Pred programovaním je potrebné ešte zostaviť obvod. Tu sú komponenty:

  • Ovládač Attiny85 (akýkoľvek elektronický dodávateľ).
  • Dve trojfarebné 10mm diódy LED so spoločnou anódou. LED diódy Adafruit
  • Rezistory 100 Ohm, 120 Ohm, 150 Ohm 0,125 alebo 0,250 Wt (akýkoľvek elektronický dodávateľ).
  • Šesťpinová hlavička pre rozhranie AVR ISP. Môžu byť vyrobené z tejto hlavičky Adafruit
  • Nejaká chlebová doska alebo doska s vytlačenými šablónami. Použil som tento
  • Rozhranie AVR ISP MKII a Atmel Studio 6.1 (Mala by fungovať aj novšia verzia).

Krok 1: Obkročmo

Circut
Circut

Dizajn používa päť čipových kolíkov:

  • Dva piny používané na ovládanie anód: každá LED anóda je pripevnená k vyhradenému kolíku.
  • Tri kolíky pripevnené (cez odpory) ku katódam LED (rovnaká farebná katóda pre každú LED pripojenú k rovnakému kolíku)

Jeden by sa opýtal: prečo nevyužiť všetkých šesť vstupných/výstupných pinov čipu, aby boli LED anódy pripojené priamo k +5 v a každá katóda mala svoj vyhradený kolík? Vďaka tomu bude programovanie jednoduché. Bohužiaľ, je tu problém: kolík PB5 (RESET) je slabý kolík, ktorý môže poskytovať iba ~ 2 mA prúdu, zatiaľ čo je potrebné mať ~ 20 mA.

Samozrejme, pre tento slabý kolík je možné postaviť tranzistorový zosilňovač, ale sám, kedykoľvek je to možné, uprednostňuje riešenie problému prostredníctvom kódu.

Krok 2: Časový diagram

Časový diagram
Časový diagram

Časový diagram nám pomáha pochopiť, čo potrebujeme naprogramovať.

Dva horné riadky na diagrame ukazujú zmenu napätia na LED anódach. Napätie na kolíkoch pripojených k LED anódam osciluje s frekvenciou ~ 250 Hz. Toto napätie kmitania pre ľavú LED diódu je opačné k oscilácii pravej LED. Keď je napätie na anóde vysoké, zodpovedajúca LED dióda môže svietiť. Keď je nízka, zodpovedajúca LED dióda je tmavá. To znamená, že každá LED dióda môže byť jasná počas intervalu 2 milisekundy a tmavá počas ďalších 2 milisekúnd. Pretože ľudské oko má určitú zotrvačnosť, 250 Hz blikanie nie je pozorovateľom viditeľné. Spodné tri rady na diagrame ukazujú zmenu napätia na kolíkoch pripojených ku katódam LED. Pozrime sa na prvý stĺpec diagramu. Zobrazuje prípad, keď je ľavá LED dióda červená a pravá LED zelená. Tu ČERVENÉ katódy zostávajú nízke, zatiaľ čo ľavá anóda je vysoká, ZELENÁ katóda zostáva nízka, zatiaľ čo pravá anóda je vysoká, a MODRÁ katóda zostáva stále nízka. Ďalšie stĺpce na diagrame ukazujú kombinácie katódového a anódového napätia pre rôzne farby.

Ako vidíme, existuje závislosť na stave kolíkov. Bez nejakého rámca by nebolo ľahké to vyriešiť. A práve tu prichádza na rad protothreadová knižnica.

Krok 3: Programovanie. Makrá a definície

Programovanie. Makrá a definície
Programovanie. Makrá a definície

Príklad v krokoch programovania predstavuje mierne zjednodušenú verziu. Program je skrátený a niektoré symbolické definície sú nahradené explicitnými konštantami.

Začnime od začiatku. Program obsahuje súbory dodávané s Atmel Studio a tiež hlavičku protreadovej knižnice. Ďalej sú tu dve makrá na manipuláciu s úrovňami pinov a niektoré definície na logické pomenovanie signálov pinov. Zatiaľ nič zvláštne.

Krok 4: Programovanie. Hlavná slučka

Programovanie. Hlavná slučka
Programovanie. Hlavná slučka

Potom sa pozrime na koniec, aby sme zistili, čo obsahuje hlavný postup.

Hlavná funkcia po vykonaní nejakej inicializácie zostane v navždy cyklu. V tejto slučke robí ďalšie kroky:

  • Vyvoláva rutinu v protothreaku pre ľavú diódu LED. Mení napätie niektorých kolíkov.
  • Urobte dve milisekundy oneskorenie. Na kolíkovom napätí nedochádza k žiadnej zmene.
  • Vyvoláva protothread pre správnu LED diódu. Mení určité napätie na kolíku.
  • Urobte 2 MS meškanie. Na kolíkovom napätí nedochádza k žiadnej zmene.

Krok 5: Programovanie. Pomocné funkcie

Programovanie. Pomocné funkcie
Programovanie. Pomocné funkcie

Predtým, ako začneme diskutovať o protothreads, musíme sa pozrieť na niektoré pomocné funkcie. Najprv sú tu funkcie na nastavenie konkrétnej farby. Sú priamočiare. Existuje toľko funkcií, ako je počet podporovaných farieb (sedem) a ešte jedna funkcia na nastavenie tmavej LED diódy (NoColor).

A je tu ešte jedna funkcia, ktorú bude priamo vyvolávať rutina v protothread. Jeho názov je DoAndCountdown ().

Technicky povedané, používanie takejto funkcie nie je povinné, ale považoval som to za pohodlné. Má tri argumenty:

  • Ukazovateľ na nastavenie funkcie LED diódy (napríklad RedColor alebo GreenColor a pod.)
  • Počiatočná hodnota reverzného počítadla: počet, koľkokrát sa musí táto funkcia vyvolať v konkrétnej fáze protothread.
  • Ukazovateľ obrátiť počítadlo. Predpokladá sa, že keď dôjde k zmene farby, reverzný čítač je 0, takže najskôr iteračný kód priradí počiatočnú hodnotu tohto čítača. Po každom iteračnom počítadle sa zníži.

Funkcia DoAndCountdown () vracia hodnotu reverzného počítadla.

Krok 6: Programovanie. Rutiny protothread

Programovanie. Rutiny protothread
Programovanie. Rutiny protothread

A tu je jadro rámca: rutina protothread. Kvôli jednoduchosti sú príklady obmedzené iba na tri kroky: na zmenu farby na ČERVENÚ, ZELENÚ a MODRÚ.

Funkcia sa vyvoláva pomocou dvoch argumentov:

  • Ukazovateľ na štruktúru vlákna. Táto štruktúra bola inicializovaná main pred spustením hlavnej slučky.
  • Ukazovateľ obrátiť počítadlo. Pred spustením hlavnej slučky to bolo hlavným nastavením na 0.

Funkcia nastaví napätie tak, aby bola aktívna ľavá dióda LED, a potom spustí protivláknový segment. Tento segment je medzi makrami PT_BEGIN a PT_END. Vnútri je nejaký kód, ktorý v našom prípade opakuje iba makrá PT_WAIT_UNTIL. Toto makro vykoná nasledujúce:

  • Vyvolanie funkcie DoAndCountdown. To nastavuje napätie na LED katódach tak, aby vyžarovali konkrétnu farbu.
  • Vrátený výsledok v porovnaní s 0. Ak je podmienka „falošná“funkcia protothread, funkcia sa okamžite vráti a poskytne kontrolu hlavnej slučke.
  • Pri nasledujúcom vyvolaní protothread opäť spustí kód pred PT_BEGIN, potom skočí priamo do makier PT_WAIT_UNTIL, z ktorých sa naposledy vrátil.
  • Také akcie sa opakujú, kým výsledok DoAndCountdown nie je 0. V takom prípade neexistuje návrat, program zostane v protothread a vykoná ďalší riadok kódu. V našom prípade je to ďalší PT_WAIT_UNTIL, ale vo všeobecnosti to môže byť takmer akýkoľvek kód C.
  • Pri počiatočnom spustení druhého reverzného počítadla PT_WAIT_UNTIL je 0, takže procedúra DoAndCountdown () ho nastavila na počiatočnú hodnotu. Druhé makrá sa znova vykonajú 250 -krát, kým počítadlo obrátok nedosiahne 0.
  • Stav struct pt sa resetuje, akonáhle ovládací prvok dosiahne makrá PT_END. Keď sa funkcia protothread vyvolá nabudúce, segment protothread začne vykonávať riadok kódu hneď za PT_BEGIN.

Pre správnu LED diódu existuje podobná rutina pre protlačenie vlákna. V našom prípade iba presadzuje rôzne poradie farieb, ale ak to môžeme urobiť úplne inak: neexistuje žiadna tesná väzba medzi ľavou a pravou rutinou LED.

Krok 7: Interné

Interné
Interné

Celý program má menej ako 200 riadkov kódu (s komentármi a prázdnymi riadkami) a zaberá menej ako 20% pamäte kódu Attiny85. V prípade potreby je tu možné použiť niekoľko ďalších protothreadových rutín a priradiť im oveľa komplikovanejšiu logiku.

Knižnica Protothreads je najjednoduchšia forma súbežného počítačového programovania. Súbežné programovanie je prístup, ktorý umožňuje rozdeliť program na logické časti: niekedy sa nazývajú korutíny, niekedy vlákno, niekedy úlohy. Platí zásada, že každá taká úloha môže zdieľať rovnaký výkon procesora, pričom kód zostane viac -menej lineárny a nezávislý na ostatných častiach. Úlohy z logického hľadiska je možné vykonávať súčasne.

V prípade pokročilých systémov je ovládanie týchto úloh vykonávané buď jadrom operačného systému, alebo jazykovým runtime vloženým do spustiteľného kompilátorom. Ale v prípade protothreads programátor to ovláda ručne pomocou knižnice makier protothreads v rutinách úloh a vyvolávaním takýchto rutín (zvyčajne mimo hlavnej slučky).

Pravdepodobne chcete vedieť, ako protothread skutočne funguje? Kde je skrytá mágia? Protothreads sa spoliehajú na špeciálnu funkciu jazyka C: skutočnosť, že príkaz prípadu prepínača C môže byť vložený do bloku if alebo iného bloku (napríklad while alebo for). Podrobnosti nájdete na stránke Adam Dunkels

Interné prvky elektroniky tohto projektu sú veľmi jednoduché. Fotografia vyššie vám dáva určité vodítko. Som si istý, že to môžeš urobiť lepšie.

Odporúča: