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, Novembar
Anonim

Autor jumbleviewJumbleview.infoSledi Još autora:

The Scream
The Scream
The Scream
The Scream
Zamena NiCd baterije spoljnim izvorom napajanja
Zamena NiCd baterije spoljnim izvorom napajanja
Zamena NiCd baterije spoljnim izvorom napajanja
Zamena NiCd baterije spoljnim izvorom napajanja
Ručka za digitalnu kameru
Ručka za digitalnu kameru
Ručka za digitalnu kameru
Ručka za digitalnu kameru

O: Radim kao softverski inženjer u jednoj od kompanija 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 jumbleview -u »

Ovaj projekt pokazuje kako kontrolirati dvije 10-milimetarske trobojne zajedničke anodne LED diode (raznobojne oči Pumpkin Halloween Glitter) sa Attiny85 čipom. Cilj projekta je upoznati čitatelja s umjetnošću paralelnog programiranja i upotrebom biblioteke proto -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:

Supplies

Prije programiranja još je potrebno izgraditi kolo. Evo komponenti:

  • 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 hljeb ili štampana tabla sa šablonom. Koristio sam ovaj
  • AVR ISP MKII interfejs i Atmel Studio 6.1 (Kasnija verzija bi takođe trebala raditi).

Korak 1: Zaokružite

Circut
Circut

Dizajn koristi pet čipova:

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

Neko bi se upitao: zašto ne biste koristili svih šest ulazno/izlaznih pinova čipa pa će LED anode biti spojene direktno 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 napraviti tranzistorsko pojačalo za ovaj slabi pin, ali ja kad god je to moguće preferiram rješavanje problema putem koda.

Korak 2: Vremenski dijagram

Vremenski dijagram
Vremenski dijagram

Vremenski dijagram pomaže nam da razumijemo šta moramo programirati.

Gornja dva reda na dijagramu prikazuju 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 tokom intervala od 2 milisekunde, a biti tamna tokom 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 LED katode. 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.

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

Korak 4: Programiranje. Main Loop

Programiranje. Main Loop
Programiranje. Main Loop

Pogledajmo onda na kraju da vidimo šta sadrži glavna procedura.

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

  • Poziva rutinu prototipa za lijevu LED diodu. Mijenja napon nekih pinova.
  • Odgodite dvije milisekunde. Nema promjene napona pina.
  • Poziva proto thread 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 jasni. 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, upotreba takve funkcije nije obavezna, ali smatram da je to zgodno. Ima tri argumenta:

  • Pokazivač na funkciju za postavljanje LED boje (poput RedColor ili GreenColor itd.)
  • Početna vrijednost obrnutog brojača: koliko se puta ova funkcija mora pozvati u određenoj fazi prototipa.
  • Pokazivač na brojač unazad. Pretpostavlja se da kada dođe do promjene boje taj obrnuti brojač je 0, pa će prvo kôd iteracije 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 prototoka

Programiranje. Rutine prototoka
Programiranje. Rutine prototoka

A ovdje je jezgro 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č unazad. 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 se nalazi između makronaredbi PT_BEGIN i PT_END. Unutra se nalazi kôd koji u našem slučaju ponavlja samo makroe 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 prototoka se odmah vraća i prepušta kontrolu glavnoj petlji.
  • Kada se protothread pozove sljedeći put, ponovo izvršava kôd prije PT_BEGIN, a zatim preskače direktno unutar PT_WAIT_UNTIL makroa iz kojih se zadnji put vratio.
  • Takve se radnje ponavljaju dok rezultat DoAndCountdown ne bude 0. U tom slučaju nema povratka, program ostaje u prototoku i izvršava sljedeći red 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 procedura DoAndCountdown () postavila na početnu vrijednost. Drugi makroi će se ponovo izvoditi 250 puta dok brojač unazad ne dosegne 0.
  • Stanje struct pt se resetira čim kontrola dosegne PT_END makroe. Kada se funkcija protothread pozove sljedeći put, segment protothread počinje s izvršavanjem retka koda odmah nakon PT_BEGIN.

Postoji slična rutina prototipa za desnu LED diodu. U našem primjeru samo primjenjuje 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 redova koda (s komentarima i praznim redovima) i zauzima manje od 20% memorije koda Attiny85. Ako je potrebno, ovdje je moguće upotrijebiti još nekoliko proto -nit rutina i dodijeliti im mnogo složeniju logiku.

Biblioteka Protothreads je najjednostavniji oblik istovremenog programiranja na računaru. Paralelno programiranje je pristup koji omogućuje podjelu programa na logičke dijelove: ponekad se zovu suprogrami, ponekad nit, ponekad zadaci. Princip je da svaki takav zadatak može dijeliti istu snagu procesora, a da kod ostane manje -više linearan i neovisan o drugim dijelovima. Zadaci sa logičke tačke gledišta mogu se izvršavati istovremeno.

Za napredne sisteme kontrole takvih zadataka obavljaju se jezgrom operativnog sistema ili runtimeom jezika ugrađenim u izvršnu datoteku pomoću kompajlera. Ali u slučaju protothreads aplikacijski programer upravlja njime ručno koristeći biblioteku makronaredbi protothreads u rutinama zadataka i pozivajući takve rutine (obično izvan glavne petlje).

Vjerovatno želite znati kako protothread zapravo funkcionira? Gde se magija krije? Proto -niti se oslanjaju na posebnu značajku jezika C: činjenicu da se izraz C switch case može ugraditi u if ili neki drugi blok (poput while ili for). Detalje 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čuje se: