Attiny85 hkratno programiranje ali buča z večbarvnimi očmi: 7 korakov
Attiny85 hkratno programiranje ali buča z večbarvnimi očmi: 7 korakov
Anonim

Avtor jumbleviewJumbleview.infoSledite Več avtorja:

Krik
Krik
Krik
Krik
Zamenjava NiCd baterije z zunanjim napajanjem
Zamenjava NiCd baterije z zunanjim napajanjem
Zamenjava NiCd baterije z zunanjim napajanjem
Zamenjava NiCd baterije z zunanjim napajanjem
Ročaj za digitalni fotoaparat
Ročaj za digitalni fotoaparat
Ročaj za digitalni fotoaparat
Ročaj za digitalni fotoaparat

O: Delam kot programski inženir v enem od podjetij Bay Area (Kalifornija). Kadar koli imam čas, rada programiram mikro krmilnike, izdelam mehanske igrače in naredim nekaj projektov za izboljšanje doma. Več o jumbleview »

Ta projekt prikazuje, kako z čipom Attiny85 nadzirati dve 10 mm tribarvni skupni anodni LED (večbarvne oči Pumpkin Halloween Glitter). Cilj projekta je vpeljati bralca v umetnost sočasnega programiranja in uporabo knjižnice protovodov Adam Dunkels. Ta projekt predvideva, da bralec pozna 8-bitne krmilnike AVR, lahko napiše nekaj C-programa in ima nekaj izkušenj s studiem Atmel.

Koda projekta, objavljena na GitHub:

Zaloge

Pred programiranjem je treba še zgraditi vezje. Tu so komponente:

  • Krmilnik Attiny85 (kateri koli dobavitelj elektronike).
  • Dve tri barvni 10 mm LED s skupno anodo. Adafruit LED diode
  • Upori 100 Ohm, 120 Ohm, 150 Ohm 0,125 ali 0,250 Wt (kateri koli dobavitelj elektronike).
  • Glava s šestimi pini za vmesnik ponudnika internetnih storitev AVR. Lahko je narejeno iz te glave Adafruit
  • Nekaj plošče za kruh ali natisnjene deske. To sem uporabil
  • Vmesnik AVR ISP MKII in Atmel Studio 6.1 (naj bi delovala tudi kasnejša različica).

1. korak: Zaokrožite

Circut
Circut

Oblikovanje uporablja pet čipov:

  • Dva zatiča, ki se uporabljata za krmiljenje anod: vsaka LED anoda je pritrjena na namenski zatič.
  • Trije zatiči (prek uporov) pritrjeni na katode LED (enaka barvna katoda vsakega vodila, pritrjena na isti pin)

Človek bi se vprašal: zakaj ne bi uporabili vseh šest vhodnih/izhodnih zatičev čipa, tako da bodo LED anode priključene neposredno na +5 v, vsaka katoda pa bo imela svoj namenski pin? Tako bo programiranje preprosto. Žal, obstaja težava: pin PB5 (RESET) je šibek zatič, ki lahko zagotovi le ~ 2 mA toka, medtem ko je treba imeti ~ 20 mA.

Seveda lahko za ta šibki pin zgradimo tranzistorski ojačevalnik, vendar sam raje rešim težavo s kodo.

2. korak: časovni diagram

Časovni diagram
Časovni diagram

Časovni diagram nam pomaga razumeti, kaj moramo programirati.

Zgornji dve vrstici na diagramu prikazujeta spremembo napetosti na LED anodah. Napetost na zatičih, priključenih na LED anode, niha s frekvenco ~ 250 Hz. To napetostno nihanje za levo LED je nasprotno od nihanja desne LED. Ko je napetost na anodi visoka, lahko ustrezna LED sveti. Ko je nizka, ustrezna LED sveti. To pomeni, da je lahko vsaka LED v intervalu 2 milisekund svetla, v naslednjih 2 milisekundah pa temna. Ker ima človeško oko nekaj vztrajnosti, opazovalec utripanje 250 Hz ne opazi. Spodnje tri vrstice na diagramu prikazujejo spremembo napetosti na zatičih, priključenih na katode LED. Poglejmo prvi stolpec diagrama. Prikazuje primer, ko je leva LED rdeča, desna pa zelena. Tukaj RDEČA katoda ostane nizka, medtem ko je leva anoda visoka, ZELENA katoda ostane nizka, medtem ko je desna anoda visoka, modra katoda pa ves čas nizka. Drugi stolpci na diagramu prikazujejo kombinacije katodne in anodne napetosti za različne barve.

Kot lahko vidimo, obstaja soodvisnost od stanja zatičev. Brez določenega okvira tega ne bi bilo enostavno rešiti. In tu pride v poštev knjižnica protothread.

3. korak: programiranje. Makri in definicije

Programiranje. Makri in definicije
Programiranje. Makri in definicije

Primer v korakih programiranja predstavlja nekoliko poenostavljeno različico. Program se skrajša, neka simbolična definicija pa se nadomesti z eksplicitnimi konstantami.

Začnimo od začetka. Program vključuje datoteke, ki prihajajo z Atmel Studio, in glavo knjižnice proto -niti. Nato sta dva makra za upravljanje ravni nožic in nekaj definicij za dajanje logičnih imen pin signalom. Zaenkrat nič posebnega.

4. korak: programiranje. Glavna zanka

Programiranje. Glavna zanka
Programiranje. Glavna zanka

Nato poglejmo na koncu, kaj vsebuje glavni postopek.

Glavna funkcija po nekaj inicializacije ostane v zanki za vedno. V tej zanki naredi naslednje korake:

  • Prikliče rutino prototipa za levo LED. Spremeni napetost nekaterih zatičev.
  • Naredite dve milisekundi zamude. Napetost napetosti se ne spremeni.
  • Pokliče proto nit za desno LED. Spremeni nekaj napetosti pin.
  • Naredite 2 MS zamude. Napetost napetosti se ne spremeni.

5. korak: Programiranje. Pomožne funkcije

Programiranje. Pomožne funkcije
Programiranje. Pomožne funkcije

Preden začnemo razpravljati o prototemah, si moramo ogledati nekaj pomožnih funkcij. Najprej so funkcije za nastavitev posebne barve. So neposredni. Takih funkcij je toliko, kot je število podprtih barv (sedem) in še ena funkcija za nastavitev temne LED (NoColor).

Obstaja še ena funkcija, ki jo bo rutina protothread neposredno poklicala. Njegovo ime je DoAndCountdown ().

Tehnično gledano uporaba take funkcije ni obvezna, vendar se mi je zdelo primerno. Ima tri argumente:

  • Kazalec na funkcijo za nastavitev barve LED (na primer RedColor ali GreenColor itd.)
  • Začetna vrednost povratnega števca: število, kolikokrat je treba to funkcijo priklicati na določeni stopnji prototoka.
  • Kazalec na števec za vzvratno vožnjo. Predvideva se, da je ob spremembi barve ta obratni števec 0, zato bo najprej koda ponovitve temu števcu dodelila začetno vrednost. Po vsaki ponovitvi se števec zmanjša.

Funkcija DoAndCountdown () vrne vrednost povratnega števca.

6. korak: programiranje. Rutine proto -niti

Programiranje. Rutine proto -niti
Programiranje. Rutine proto -niti

In tukaj je jedro okvira: rutina prototokov. Zaradi poenostavitve je primer omejen le na tri korake: za spremembo barve v RDEČO, ZELENO in MODRO.

Funkcija se prikliče z dvema argumentoma:

  • Kazalec na strukturo prototipa. To strukturo je inicializiral main pred zagonom glavne zanke.
  • Kazalec na števec za vzvratno vožnjo. Pred začetkom glavne zanke je bil glavni nastavljen na 0.

Funkcija nastavi napetosti za aktiviranje leve LED in nato zažene segment proto -niti. Ta segment je med makroma PT_BEGIN in PT_END. V notranjosti je nekaj kode, ki v našem primeru ponavlja le makre PT_WAIT_UNTIL. Ta makro se izvede na naslednji način:

  • Poklic funkcije DoAndCountdown. To nastavi napetost na LED katodah, da oddajajo določeno barvo.
  • Vrnjeni rezultat v primerjavi z 0. Če je pogoj "false", se funkcija prototoka takoj vrne in prepusti nadzor glavni zanki.
  • Ko se naslednjič pokliče proto -nit, znova izvede kodo pred PT_BEGIN, nato pa skoči neposredno znotraj makrov PT_WAIT_UNTIL, iz katerih se je nazadnje vrnil.
  • Takšna dejanja se ponavljajo, dokler rezultat DoAndCountdown ni 0. V tem primeru ni vračila, program ostane v prototonu in izvede naslednjo vrstico kode. V našem primeru je naslednji PT_WAIT_UNTIL, na splošno pa je lahko skoraj vsaka koda C.
  • Pri začetni izvedbi drugega PT_WAIT_UNTIL obratnega števca je 0, zato ga postopek DoAndCountdown () nastavi na začetno vrednost. Drugi makri se bodo znova izvajali 250 -krat, dokler števec obratov ne doseže 0.
  • Stanje struct pt se ponastavi, takoj ko nadzor doseže makre PT_END. Ko naslednjič prikličete funkcijo protothread, se segment protothread začne izvajati vrstico kode takoj za PT_BEGIN.

Za desno LED je podobna rutina prototipa. V našem primeru samo uveljavlja drugačen vrstni red barv, če pa lahko naredimo popolnoma drugače: med levo in desno LED rutino ni tesnega povezovanja.

7. korak: Notranjost

Notranjost
Notranjost

Celoten program vsebuje manj kot 200 vrstic kode (s komentarji in praznimi vrsticami) in zavzema manj kot 20% pomnilnika kod Attiny85. Po potrebi lahko tukaj uporabimo še več rutin prototokov in jim dodelimo veliko bolj zapleteno logiko.

Knjižnica prototokov je najpreprostejša oblika sočasnega računalniškega programiranja. Sočasno programiranje je pristop, ki omogoča razdelitev programa na logične dele: včasih se imenujejo soprogrami, včasih niti, včasih naloge. Načelo je, da lahko vsaka taka naloga deli isto moč procesorja, hkrati pa ohrani kodo bolj ali manj linearno in neodvisno od drugih delov. Naloge z logičnega vidika se lahko izvajajo hkrati.

Za napredne sisteme nadzor nad takšnimi nalogami izvaja z jedrom operacijskega sistema ali z jezikom, ki ga je prevajalnik vdelal v izvedljivo datoteko. V primeru prototipov pa ga programer upravlja ročno z uporabo knjižnice makrov prototipov v rutinah opravil in prikliče takšne rutine (običajno izven glavne zanke).

Verjetno želite vedeti, kako protothread dejansko deluje? Kje se skriva čarovnija? Proto -niti se zanašajo na posebno funkcijo jezika C: dejstvo, da je stavek stikala C stikalo lahko vdelan v if ali kakšen drug blok (na primer while ali for). Podrobnosti najdete na spletnem mestu Adam Dunkels

Notranjost elektronike tega projekta je zelo preprosta. Zgornja fotografija vam daje nekaj namigov. Prepričan sem, da lahko naredite bolje.