Sadržaj:

Attiny85 paralelno programiranje ili bundeva s raznobojnim očima: 7 koraka
Attiny85 paralelno programiranje ili bundeva s raznobojnim očima: 7 koraka

Video: Attiny85 paralelno programiranje ili bundeva s raznobojnim očima: 7 koraka

Video: Attiny85 paralelno programiranje ili bundeva s raznobojnim očima: 7 koraka
Video: Eksperimentalna pločica (breadboard) - osnovno 2024, Srpanj
Anonim

Napisao jumbleviewJumbleview.infoSlijedi Više od autora:

Vrisak
Vrisak
Vrisak
Vrisak
Zamjena NiCd baterije vanjskim izvorom napajanja
Zamjena NiCd baterije vanjskim izvorom napajanja
Zamjena NiCd baterije vanjskim izvorom napajanja
Zamjena NiCd baterije vanjskim izvorom napajanja
Ručka za digitalni fotoaparat
Ručka za digitalni fotoaparat
Ručka za digitalni fotoaparat
Ručka za digitalni fotoaparat

O: Radim kao softverski inženjer u jednoj od tvrtki Bay Area (Kalifornija). Kad god imam vremena, volim programirati mikrokontrolere, graditi mehaničke igračke i raditi neke projekte poboljšanja doma. Više o jumbleviewu »

Ovaj projekt pokazuje kako kontrolirati dvije 10 mm trobojne zajedničke anodne LED diode (raznobojne oči Pumpkin Halloween Glitter) s čipom Attiny85. Cilj projekta je upoznati čitatelja s umjetnošću paralelnog programiranja i upotrebom biblioteke prototičnih niti Adama Dunkelsa. Ovaj projekt pretpostavlja da čitatelj zna o AVR 8-bitnim kontrolerima, može napisati neki C-program i ima određeno iskustvo s Atmel studijem.

Kod projekta objavljen na GitHub -u:

Pribor

Prije programiranja još je potrebno izgraditi krug. Ovdje su komponente:

  • Attiny85 kontroler (bilo koji dobavljač elektronike).
  • Dvije trobojne LED diode od 10 mm sa zajedničkom anodom. Adafruit LED diode
  • Otpornici 100 Ohm, 120 Ohm, 150 Ohm 0,125 ili 0,250 Wt (bilo koji dobavljač elektronike).
  • Zaglavlje sa šest pinova za AVR ISP sučelje. Može se napraviti iz ovog Adafruit zaglavlja
  • Neka ploča za kruh ili ploča s tiskanim predloškom. Koristio sam ovaj
  • AVR ISP MKII sučelje i Atmel Studio 6.1 (trebala bi raditi i kasnija verzija).

Korak 1: Zaokružite

Circut
Circut

Dizajn koristi pet čipova:

  • Dva pina za upravljanje anodama: svaka LED anoda pričvršćena na namjenski pin.
  • Tri pina pričvršćena (kroz otpornike) na katode LED dioda (katoda iste boje za svaku LED lampicu pričvršćena na isti pin)

Netko bi se zapitao: zašto ne koristiti svih šest ulazno/izlaznih pinova čipa pa će LED anode biti spojene izravno na +5 v, a svaka katoda će imati svoj namjenski pin? To će programiranje učiniti jednostavnim. Nažalost, postoji problem: pin PB5 (RESET) je slab pin koji može dati samo ~ 2 mA struje, dok je potrebno imati ~ 20 mA.

Naravno da se može izgraditi tranzistorsko pojačalo za ovaj slabi pin, ali ja kad god je to moguće radije rješavam problem putem koda.

Korak 2: Vremenski dijagram

Vremenski dijagram
Vremenski dijagram

Vremenski dijagram pomaže nam razumjeti što moramo programirati.

Gornja dva reda na dijagramu pokazuju promjenu napona na LED anodama. Napon na pinovima spojenim na LED anode oscilira frekvencijom ~ 250 Hz. Ova oscilacija napona za lijevu LED suprotnu je od oscilacije desne LED. Kada je napon na anodi visok, odgovarajuća LED dioda može svijetliti. Kada je niska, odgovarajuća LED dioda je tamna. To znači da svaka LED dioda može svijetliti tijekom intervala od 2 milisekunde, a biti tamna tijekom još 2 milisekunde. Budući da ljudsko oko ima neku inerciju, promatrač ne primjećuje treptanje od 250 Hz. Donja tri reda na dijagramu pokazuju promjenu napona na pinovima spojenim na katode LED dioda. Pogledajmo prvi stupac dijagrama. Prikazuje slučaj kada je lijeva LED dioda u crvenoj boji, a desna u zelenoj boji. Ovdje CRVENA katoda ostaje niska dok je lijeva anoda visoka, ZELENA katoda ostaje niska dok je desna anoda visoka, a PLAVA katoda ostaje niska cijelo vrijeme. Ostali stupci na dijagramu prikazuju kombinacije katodnog i anodnog napona za različite boje.

Kao što vidimo postoji međuovisnost o stanju pinova. Bez nekog okvira to ne bi bilo lako riješiti. I tu biblioteka protothread dobro dođe.

Korak 3: Programiranje. Makroi i definicije

Programiranje. Makroi i definicije
Programiranje. Makroi i definicije

Primjeri u programskim koracima predstavljaju neznatno pojednostavljenu verziju. Program se skraćuje, a neka simbolična definicija zamjenjuje eksplicitnim konstantama.

Krenimo od početka. Program uključuje datoteke koje dolaze s Atmel Studiom, kao i zaglavlje biblioteke prototipa. Zatim postoje dva makronaredbe za upravljanje razinama pinova i neke definicije za davanje logičkih naziva pin signalima. Do sada ništa posebno.

Korak 4: Programiranje. Glavna petlja

Programiranje. Glavna petlja
Programiranje. Glavna petlja

Pogledajmo onda na kraju da vidimo što glavni postupak sadrži.

Glavna funkcija nakon neke inicijalizacije ostaje zauvijek u petlji. U toj petlji čini sljedeće korake:

  • Poziva rutinu prototipa za lijevu LED. Mijenja napon nekih pinova.
  • Odgodite dvije milisekunde. Nema promjene napona pina.
  • Poziva proto -nit za desnu LED. Mijenja neki pin napon.
  • Odgodite 2 MS. Nema promjene napona pina.

Korak 5: Programiranje. Pomoćne funkcije

Programiranje. Pomoćne funkcije
Programiranje. Pomoćne funkcije

Prije nego počnemo raspravljati o proto -nitima, moramo pogledati neke pomoćne funkcije. Prvo postoje funkcije za postavljanje određene boje. Oni su izravni. Postoji toliko funkcija kao što je broj podržanih boja (sedam) i još jedna funkcija za postavljanje LED tame (NoColor).

Postoji još jedna funkcija koju će protothread rutina izravno pozvati. Njegovo ime je DoAndCountdown ().

Tehnički govoreći, uporaba takve funkcije nije obavezna, ali smatram da je to prikladno. Ima tri argumenta:

  • Pokazivač na funkciju za postavljanje LED boje (poput RedColor ili GreenColor itd.)
  • Početna vrijednost obrnutog brojača: broj koliko se puta ova funkcija mora pozvati u određenoj fazi prototipa.
  • Pokazivač na brojač unatrag. Pretpostavlja se da je, kad dođe do promjene boje, obrnuti brojač 0, pa će u početku iteracijski kod dodijeliti tom brojaču početnu vrijednost. Nakon svake iteracije brojač se smanjuje.

Funkcija DoAndCountdown () vraća vrijednost obrnutog brojača.

Korak 6: Programiranje. Rutine prototipa

Programiranje. Rutine prototoka
Programiranje. Rutine prototoka

Ovdje je i jezgra okvira: rutina prototipa. Radi jednostavnosti, primjer je ograničen samo na tri koraka: za promjenu boje u CRVENU, U ZELENU i U PLAVU.

Funkcija se poziva s dva argumenta:

  • Pokazivač na strukturu prototipa. Tu je strukturu inicijaliziralo main prije početka glavne petlje.
  • Pokazivač na brojač unatrag. Glavno ga je postavilo na 0 prije početka glavne petlje.

Funkcija postavlja napone za aktiviranje lijeve LED diode, a zatim pokreće segment prototipa. Ovaj segment je između makronaredbi PT_BEGIN i PT_END. Unutra se nalazi kôd koji u našem slučaju ponavlja samo makronaredbe PT_WAIT_UNTIL. Ovi makroi izvode sljedeće:

  • Pozivanje funkcije DoAndCountdown. To postavlja napon na LED katodama da emitiraju određenu boju.
  • Vraćeni rezultat u usporedbi s 0. Ako je uvjet 'false', funkcija prototipa se odmah vraća i prepušta kontrolu glavnoj petlji.
  • Prilikom sljedećeg dozivanja prototoka, ponovno izvodi kôd prije PT_BEGIN, a zatim preskače izravno unutar makronaredbi PT_WAIT_UNTIL iz koje se zadnji put vratio.
  • Takve se radnje ponavljaju dok rezultat DoAndCountdown ne bude 0. U tom slučaju nema povratka, program ostaje u prototonu i izvršava sljedeći redak koda. U našem slučaju to je sljedeći PT_WAIT_UNTIL, ali općenito govoreći to bi mogao biti gotovo bilo koji C kod.
  • Pri početnom izvođenju drugog PT_WAIT_UNTIL obrnuti brojač je 0, pa ga je postupak DoAndCountdown () postavio na početnu vrijednost. Drugi će se makroi ponovno izvesti 250 puta dok brojač unatraga ne dosegne 0.
  • Stanje struct pt resetira se čim kontrola dosegne PT_END makronaredbe. Kada se sljedeći put pozove funkcija proto -niti, segment proto -niti počinje izvršavati redak koda odmah nakon PT_BEGIN.

Postoji slična rutina prototipa za desnu LED. U našem primjeru samo provodi drugačiji redoslijed boja, ali ako to možemo učiniti potpuno drugačije: ne postoji čvrsto spajanje između lijeve i desne LED rutine.

Korak 7: Interni

Interni
Interni

Cijeli program ima manje od 200 redaka koda (s komentarima i praznim redovima) i zauzima manje od 20% memorije koda Attiny85. Ako je potrebno, moguće je ovdje upotrijebiti još nekoliko rutina prototipa i dodijeliti im mnogo složeniju logiku.

Knjižnica prototipova je najjednostavniji oblik računalnog paralelnog programiranja. Istodobno programiranje pristup je koji omogućuje podjelu programa na logičke dijelove: ponekad se nazivaju suprogramima, ponekad nitima, ponekad zadacima. Princip je da svaki takav zadatak može dijeliti istu procesorsku snagu, a da kod ostane manje -više linearan i neovisan o drugim dijelovima. Zadaci s logičkog gledišta mogu se izvršavati istovremeno.

Za napredne sustave kontrole takvih zadataka obavljaju se jezgrom operacijskog sustava ili runtimeom jezika ugrađenim u izvršnu datoteku pomoću prevoditelja. No, u slučaju protothreads aplikacijski programer upravlja njime ručno pomoću knjižnice makronaredbi protothreads u rutinama zadataka i pozivanjem takvih rutina (obično izvan glavne petlje).

Vjerojatno želite znati kako protothread zapravo radi? Gdje se skriva čarolija? Proto -niti se oslanjaju na posebnu značajku jezika C: činjenicu da se izraz C switch case može umetnuti u if ili neki drugi blok (poput while ili for). Pojedinosti možete pronaći na web stranici Adama Dunkelsa

Unutarnji dio elektronike ovog projekta vrlo je jednostavan. Gornja fotografija daje vam neki trag. Siguran sam da možete bolje.

Preporučeni: