Sisukord:

Attiny85 Samaaegne programmeerimine või kõrvits mitmevärviliste silmadega: 7 sammu
Attiny85 Samaaegne programmeerimine või kõrvits mitmevärviliste silmadega: 7 sammu

Video: Attiny85 Samaaegne programmeerimine või kõrvits mitmevärviliste silmadega: 7 sammu

Video: Attiny85 Samaaegne programmeerimine või kõrvits mitmevärviliste silmadega: 7 sammu
Video: M#1: Outseal PLC Mega seadistamine ATmega128 arendusplaadiga | Outseal Dev. PLC Mega 2024, Juuli
Anonim

Järgige autori lisateavet:

Karje
Karje
Karje
Karje
NiCd aku asendamine välise toiteallikaga
NiCd aku asendamine välise toiteallikaga
NiCd aku asendamine välise toiteallikaga
NiCd aku asendamine välise toiteallikaga
Digikaamera käepide
Digikaamera käepide
Digikaamera käepide
Digikaamera käepide

Teave: Töötan tarkvarainsenerina ühes Bay Area (California) ettevõttes. Kui mul on aega, meeldib mulle programmeerida mikrokontrollereid, ehitada mehaanilisi mänguasju ja teha mõningaid koduparandusprojekte. Lisateave jumbleview kohta »

See projekt näitab, kuidas juhtida kahte 10 mm kolmevärvilist tavalist anood-LED-i (kõrvitsa Halloweeni sära mitmevärvilised silmad) kiibiga Attiny85. Projekti eesmärk on tutvustada lugejale samaaegse programmeerimise kunsti ja Adam Dunkelsi prototeenide kogu kasutamist. See projekt eeldab, et lugeja teab 8-bitiseid AVR-kontrollereid, oskab kirjutada mõnda C-programmi ja omab mõningaid kogemusi Atmeli stuudioga.

GitHubis avaldatud projekti kood:

Tarvikud

Enne programmeerimist tuleb veel vooluring üles ehitada. Siin on komponendid:

  • Attiny85 kontroller (mis tahes elektrooniline tarnija).
  • Kaks kolmevärvilist 10 mm LED -i ühise anoodiga. Adafruit LED -id
  • Takistid 100 oomi, 120 oomi, 150 oomi 0,125 või 0,250 Wt (mis tahes elektrooniline tarnija).
  • Kuue kontaktiga päis AVR ISP liidese jaoks. Seda saab teha sellest Adafruit päisest
  • Mõni leivalaud või trükitud mallitahvel. Ma kasutasin seda
  • AVR ISP MKII liides ja Atmel Studio 6.1 (ka hilisem versioon peaks töötama).

1. samm: katkestus

Ringjoon
Ringjoon

Disain kasutab viit kiip -tihvti:

  • Anoodide juhtimiseks kasutatakse kahte tihvti: iga LED -anood on kinnitatud spetsiaalse tihvti külge.
  • Kolm tihvti (takistite kaudu) LED -i katoodide külge kinnitatud (iga LED -i sama värvi katood on ühendatud sama tihvtiga)

Küsidaks: miks mitte kasutada kiibi kõiki kuut sisse/välja tihvti, nii et LED -anoodid ühendatakse otse +5 V -ga ja igal katoodil on oma tihvt? See muudab programmeerimise lihtsaks. Kahjuks on probleem: tihvt PB5 (RESET) on nõrk tihvt, mis suudab toita vaid ~ 2 mA voolu, samas kui vaja on ~ 20 mA.

Loomulikult saab selle nõrga tihvti jaoks ehitada transistorvõimendi, kuid ise eelistan võimaluse korral probleemi lahendada koodi kaudu.

2. samm: ajastusdiagramm

Ajastusskeem
Ajastusskeem

Ajastusdiagramm aitab meil mõista, mida peame programmeerima.

Diagrammi kaks ülemist rida näitavad pinge muutust LED -anoodidel. LED -anoodidega ühendatud tihvtide pinge võnkub sagedusega ~ 250 Hz. See vasaku LED -i pinge võnkumine on parema LED -i võnkumisele vastupidine. Kui anoodil on kõrge pinge, võib vastav LED olla hele. Kui see on madal, siis vastav LED on tume. See tähendab, et iga LED võib 2 millisekundi jooksul olla hele ja veel 2 millisekundi jooksul tume. Kuna inimsilmal on mõningane inerts, ei ole 250 Hz vilkumine vaatleja poolt märgatav. Diagrammi kolm alumist rida näitavad pinge muutust valgusdioodide katoodidega ühendatud tihvtidel. Vaatame diagrammi esimest veergu. See näitab juhtumit, kui vasakpoolne LED on punane ja parem LED roheline. Siin punased katoodid jäävad madalaks, samal ajal kui vasakpoolne anood on kõrge, roheline katood jääb madalaks, samal ajal kui parempoolne anood on kõrgeks, ja sinine katood jääb kogu aeg madalaks. Teised diagrammi veerud näitavad katoodi ja anoodi pinge kombinatsioone erinevate värvide jaoks.

Nagu näeme, on tihvtide olekust sõltuvus. Ilma teatud raamistikuta poleks seda lihtne lahendada. Ja siin tulebki appi prototeenide raamatukogu.

3. samm: programmeerimine. Makrod ja definitsioonid

Programmeerimine. Makrod ja definitsioonid
Programmeerimine. Makrod ja definitsioonid

Programmeerimisetappide näide kujutab endast veidi lihtsustatud versiooni. Programmi lühendatakse ja mõned sümboolsed määratlused asendatakse selgesõnaliste konstantidega.

Alustame algusest. Programm sisaldab Atmel Studioga kaasasolevaid faile ja ka prototread raamatukogu päist. Järgmisena on kaks makrot tihvtide tasemega manipuleerimiseks ja mõned määratlused, et anda pin -signaalidele loogilised nimed. Siiani pole midagi erilist.

4. samm: programmeerimine. Peamine silmus

Programmeerimine. Peamine silmus
Programmeerimine. Peamine silmus

Siis vaatame lõppu, et näha, mida põhiprotseduur sisaldab.

Funktsioon peamine jääb pärast mõningast lähtestamist igaveseks ahelaks. Selles silmus teeb ta järgmised sammud:

  • Käivitab vasakpoolse LED -i prototeeni rutiini. See muudab mõne tihvti pinget.
  • Viivitage kaks millisekundit. Pistiku pinge ei muutu.
  • Kutsub esile prototniidi õige LED -i jaoks. See muudab mõnda pin pinget.
  • Tehke 2 MS viivitus. Pistiku pinge ei muutu.

Samm: programmeerimine. Abifunktsioonid

Programmeerimine. Abifunktsioonid
Programmeerimine. Abifunktsioonid

Enne prototüüpide arutamist peame vaatama mõningaid abifunktsioone. Esiteks on teatud värvi määramise funktsioonid. Nad on otsekohesed. Selliseid funktsioone on sama palju kui toetatud värvide arv (seitse) ja veel üks funktsioon LED -i tumedaks seadmiseks (NoColor).

Ja on veel üks funktsioon, mida prototeeni rutiin otseselt esile kutsub. Selle nimi on DoAndCountdown ().

Tehniliselt ei ole sellise funktsiooni kasutamine kohustuslik, kuid leidsin, et see on mugav. Sellel on kolm argumenti:

  • Osuti funktsioonide seadistamise LED -värvile (nt RedColor või GreenColor vms)
  • Pöördloenduri algväärtus: arv, mitu korda tuleb seda funktsiooni teatud prototniidi etapis käivitada.
  • Kursor pöördloenduri jaoks. Eeldatakse, et kui värv muutub, on pöördloendur 0, seega määrab iteratsioonikood esialgu sellele loendurile algväärtuse. Pärast iga iteratsiooni loendurit vähendatakse.

Funktsioon DoAndCountdown () tagastab pöördloenduri väärtuse.

6. samm: programmeerimine. Protothread rutiinid

Programmeerimine. Protothread rutiinid
Programmeerimine. Protothread rutiinid

Ja siin on raamistiku tuum: prototeeni rutiin. Lihtsuse huvides piirdub näide ainult kolme sammuga: värvi muutmiseks PUNANEKS, ROHELISEKS ja SINISEKS.

Funktsiooni käivitatakse kahe argumendiga:

  • Osuti prototniidi struktuurile. See struktuur lähtestati peamise poolt enne põhiahela algust.
  • Kursor pöördloendurile. Enne põhiahela algust seati see 0 -ks.

Funktsioon määrab pinged, et muuta vasakpoolne LED aktiivseks ja käivitab seejärel prototniidi segmendi. See segment on makro makro PT_BEGIN ja PT_END vahel. Toas on kood, mis meie puhul kordab ainult makrosid PT_WAIT_UNTIL. Need makrod toimivad järgmiselt.

  • Funktsiooni DoAndCountdown kutsumine. See paneb LED -katoodide pinge eraldama teatud värvi.
  • Tagastatud tulemus võrreldes 0 -ga. Kui tingimus on „vale”, tagastab prototniidi funktsioon kohe ja annab kontrolli põhisilmusesse.
  • Kui prototniiti järgmisel korral käivitatakse, käivitab see uuesti koodi enne PT_BEGIN -i ja hüppab seejärel otse nende PT_WAIT_UNTIL makrosse, kust see eelmisel korral tagasi tuli.
  • Selliseid toiminguid korratakse, kuni DoAndCountdown tulemus on 0. Sellisel juhul tagasipöördumist ei toimu, programm jääb prototniidile ja täidab koodi järgmise rea. Meie puhul on see järgmine PT_WAIT_UNTIL, kuid üldiselt võib see olla peaaegu iga C -kood.
  • Teise PT_WAIT_UNTIL pöördloenduri esialgsel käivitamisel on 0, seega seab protseduur DoAndCountdown () selle algväärtusele. Teisi makrosid täidetakse uuesti 250 korda, kuni pöördloendur jõuab 0 -ni.
  • Struktuuri pt olek lähtestatakse kohe, kui juhtimine jõuab PT_END makrosse. Kui prototniidi funktsioon käivitatakse järgmisel korral, hakkab prototniidi segment käivitama koodi rea kohe pärast PT_BEGIN.

Õige LED -i jaoks on sarnane prototreemi rutiin. Meie näites rakendab see lihtsalt erinevat värvide järjekorda, kuid kui me teeme seda täiesti erinevalt: vasakpoolse ja parema LED -rutiini vahel pole tihedat sidet.

Samm 7: Sisemised

Sisemised
Sisemised

Kogu programm sisaldab vähem kui 200 rida koodi (koos kommentaaride ja tühjade ridadega) ning võtab vähem kui 20% Attiny85 koodimälust. Vajadusel on siin võimalik kasutada veel mitut prototüübi rutiini ja määrata neile palju keerukamat loogikat.

Protothreadsi teek on lihtsaim arvuti samaaegse programmeerimise vorm. Samaaegne programmeerimine on lähenemisviis, mis võimaldab jagada programmi loogilisteks osadeks: mõnikord nimetatakse neid korutiinideks, mõnikord lõimedeks, mõnikord ülesanneteks. Põhimõte seisneb selles, et iga selline ülesanne võib jagada sama protsessori võimsust, hoides samal ajal koodi enam -vähem lineaarsena ja teistest osadest sõltumatuna. Loogilisest seisukohast võib ülesandeid täita samaaegselt.

Täiustatud süsteemide puhul kontrollib selliseid ülesandeid kas operatsioonisüsteemi tuum või keele käitusaeg, mis on manustatud kompilaatori käivitatavasse faili. Kuid prototniitide korral juhib rakenduste programmeerija seda käsitsi, kasutades ülesannete rutiinides protothreadsi makrateeki ja kutsudes sellised rutiinid (tavaliselt põhiahelast välja).

Tõenäoliselt tahate teada, kuidas prototöötlus tegelikult töötab? Kuhu peitub maagia? Prototid toetuvad C -keele erifunktsioonile: asjaolu, et C -lülituse väiketähe avaldis võib olla sisse lülitatud kas või mõnda muusse plokki (nt ajal või jaoks). Üksikasjad, mida leiate Adam Dunkelsi saidilt

Selle projekti elektroonika on väga lihtne. Ülaltoodud foto annab teile vihje. Olen kindel, et saate paremini.

Soovitan: