Përmbajtje:

Programim i njëkohshëm Attiny85 ose kungull me sy shumëngjyrësh: 7 hapa
Programim i njëkohshëm Attiny85 ose kungull me sy shumëngjyrësh: 7 hapa

Video: Programim i njëkohshëm Attiny85 ose kungull me sy shumëngjyrësh: 7 hapa

Video: Programim i njëkohshëm Attiny85 ose kungull me sy shumëngjyrësh: 7 hapa
Video: How to Drive a Power Led With Arduino, ESP32 or ATtiny85 - CN5711 2024, Dhjetor
Anonim

Nga jumbleviewJumbleview.info Ndiqni më shumë nga autori:

Ulërima
Ulërima
Ulërima
Ulërima
Zëvendësimi i baterisë NiCd me furnizim me energji të jashtme
Zëvendësimi i baterisë NiCd me furnizim me energji të jashtme
Zëvendësimi i baterisë NiCd me furnizim me energji të jashtme
Zëvendësimi i baterisë NiCd me furnizim me energji të jashtme
Doreza e aparatit dixhital
Doreza e aparatit dixhital
Doreza e aparatit dixhital
Doreza e aparatit dixhital

Rreth: Unë punoj si inxhinier softuerësh në një nga kompanitë Bay Area (California). Sa herë që kam kohë më pëlqen të programoj mikro kontrollues, të ndërtoj lodra mekanike dhe të bëj disa projekte për përmirësimin e shtëpisë. Më shumë rreth jumbleview »

Ky projekt tregon se si të kontrolloni dy LED me anode të zakonshme me tre ngjyra 10 mm (sy shumëngjyrësh të Pumpkin Halloween Glitter) me çipin Attiny85. Qëllimi i projektit është futja e lexuesit në artin e programimit të njëkohshëm dhe në përdorimin e bibliotekës së prototreads Adam Dunkels. Ky projekt supozon se lexuesi di për kontrolluesit AVR 8-bit, mund të shkruajë ndonjë program C dhe ka një përvojë me studion Atmel.

Kodi i projektit i publikuar në GitHub:

Furnizimet

Para se të programoni, ende duhet të ndërtoni qarkun. Këtu janë përbërësit:

  • Kontrolluesi Attiny85 (çdo furnizues elektronik).
  • Dy LED me tre ngjyra 10 mm me anodë të zakonshme. LEDs Adafruit
  • Rezistentët 100 Ohm, 120 Ohm, 150 Ohm 0.125 ose 0.250 Wt (çdo furnizues elektronik).
  • Koka me gjashtë kunja për ndërfaqen AVR ISP. Mund të bëhet nga kjo titull Adafruit
  • Disa tabelë buke ose tabelë shablloni të shtypur. Kam përdorur këtë
  • Ndërfaqja AVR ISP MKII dhe Atmel Studio 6.1 (Versioni i mëvonshëm gjithashtu duhet të funksionojë).

Hapi 1: Rrethi

Qarku
Qarku

Dizajni përdor pesë kunja çipi:

  • Dy kunja të përdorura për të kontrolluar anodat: secila anodë LED e bashkangjitur në kunjin e dedikuar.
  • Tre kunja të ngjitura (përmes rezistencave) në katodat LED (e njëjta katodë me ngjyrë të secilës led të bashkangjitur në të njëjtën kunj)

Dikush do të pyeste: pse të mos përdorni të gjashtë kunjat e hyrjes/daljes së çipit kështu që anodat LED do të lidhen drejtpërdrejt me +5 v dhe secila katodë do të ketë pinin e saj të dedikuar? Kjo do ta bëjë programimin të drejtpërdrejtë. Mjerisht, ekziston problemi: kunja PB5 (RESET) është një kunj i dobët i aftë të sigurojë vetëm ~ 2 mA të rrymës, ndërsa ka nevojë të ketë ~ 20 mA.

Sigurisht që mund të ndërtohet një përforcues transistor për këtë kunj të dobët, por unë vetë kur është e mundur preferoj ta zgjidh problemin përmes kodit.

Hapi 2: Diagrami i kohës

Diagrami i kohës
Diagrami i kohës

Diagrami i kohës na ndihmon të kuptojmë se çfarë kemi nevojë për të programuar.

Dy rreshtat e parë në diagram tregojnë ndryshimin e tensionit në anodat LED. Tensioni në kunjat e lidhur me anodat LED luhatet me frekuencë ~ 250 Hz. Ky lëkundje e tensionit për LED -in e majtë është e kundërta e lëkundjes së LED -it të djathtë. Kur tensioni në anodë është i lartë LED përkatës mund të jetë i ndritshëm. Kur është i ulët LED përkatës është i errët. Kjo do të thotë që çdo LED mund të jetë e ndritshme gjatë intervalit 2 milisekonda dhe është e errët gjatë 2 milisekondave të tjera. Për shkak se syri i njeriut ka një inerci, pulsimi 250 Hz nuk vërehet nga vëzhguesi. Tre rreshtat e poshtëm në diagram tregojnë ndryshimin e tensionit në kunjat e lidhur me katodat LED. Le të shikojmë kolonën e parë të diagramit. Ajo tregon rastin kur LED i majtë është me ngjyrë të kuqe dhe LED i djathtë me ngjyrë jeshile. Këtu katodat RED qëndrojnë të ulëta ndërsa anoda e majtë është e lartë, katoda GREEN qëndron e ulët ndërsa anoda e djathtë është e lartë, dhe katoda BLUE qëndron e ulët gjatë gjithë kohës. Kolonat e tjera në diagram tregojnë kombinime të tensionit të katodës dhe anodës për ngjyra të ndryshme.

Siç mund ta shohim, ekziston një ndërvarësi nga gjendja e kunjave. Pa ndonjë kuadër nuk do të ishte e lehtë të zgjidhej. Dhe kjo është ajo ku biblioteka protothread vjen në ndihmë.

Hapi 3: Programimi. Makro dhe përkufizime

Programimi. Makro dhe përkufizime
Programimi. Makro dhe përkufizime

Shembulli në hapat e programimit paraqet një version pak të thjeshtuar. Programi është shkurtuar dhe një përkufizim simbolik zëvendësohet me konstante eksplicite.

Le të fillojmë nga e para. Programi përfshin skedarë që vijnë me Atmel Studio si dhe titull të bibliotekës protothread. Tjetra ka dy makro për të manipuluar nivelet e kunjave dhe disa përkufizime për t'i dhënë emra logjikë sinjaleve pin. Deri tani asgjë e veçantë.

Hapi 4: Programimi. Rrethi kryesor

Programimi. Rrethi kryesor
Programimi. Rrethi kryesor

Pastaj le të shikojmë në fund për të parë se çfarë përmban procedura kryesore.

Funksioni kryesor pas kryerjes së një fillimi qëndron në lak përgjithmonë. Në atë lak bën hapat e mëposhtëm:

  • Thërret rutinën protothread për LED të majtë. Ndryshon tensionin e disa kunjave.
  • Bëni dy milisekonda vonesë. Nuk ka ndryshim në tensionin e kunjit.
  • Thërret protothread për LED të duhur. Ndryshon disa tensione pin.
  • Bëni 2 MS vonesë. Nuk ka ndryshim në tensionin e kunjit.

Hapi 5: Programimi. Funksionet ndihmëse

Programimi. Funksionet ndihmëse
Programimi. Funksionet ndihmëse

Para se të fillojmë të diskutojmë prototreads ne duhet të shikojmë në disa funksione ndihmëse. Së pari ka funksione për të vendosur një ngjyrë të veçantë. Ato janë të drejtpërdrejta. Ka po aq funksione sa numri i ngjyrave të mbështetura (shtatë) dhe një funksion më shumë për të vendosur LED të errët (NoColor).

Dhe ka një funksion më shumë i cili do të thirret drejtpërdrejt nga rutina protothread. Emri i tij është DoAndCountdown ().

Përdorimi teknikisht i një funksioni të tillë nuk është i detyrueshëm, por e pashë të përshtatshëm. Ai ka tre argumente:

  • Treguesi për funksionimin e cilësimit të ngjyrës LED (si RedColor ose GreenColor ose etj.)
  • Vlera fillestare e numëruesit të kundërt: numri i sa herë ky funksion duhet të thirret në një fazë të veçantë prototread.
  • Treguesi për numëruesin e kundërt. Supozohet se kur ka ndryshim në ngjyrën, numëruesi i kundërt është 0, kështu që në fillim kodi i përsëritjes do t'i caktojë atij numëruesi vlerën fillestare. Pas çdo numëruesi të përsëritjes zvogëlohet.

Funksioni DoAndCountdown () kthen vlerën e numëruesit të kundërt.

Hapi 6: Programimi. Rutinat Protothread

Programimi. Rutinat Protothread
Programimi. Rutinat Protothread

Dhe këtu është thelbi i kornizës: rutina e prototreadit. Për hir të thjeshtësisë, shembulli kufizohet vetëm në tre hapa: për ndryshimin e ngjyrës në KUQ, në GREEN dhe në BLUE.

Funksioni thirret me dy argumente:

  • Treguesi për strukturën protothread. Ajo strukturë u inicializua nga main para se të fillonte laku kryesor.
  • Treguesi për numëruesin e kundërt. Ajo ishte vendosur në 0 nga kryesore para se të fillonte laku kryesor.

Funksioni vendos tensione për ta bërë LED -in e majtë aktiv dhe më pas fillon segmentin e prototreadit. Ky segment është midis makrove PT_BEGIN dhe PT_END. Brenda ka një kod i cili në rastin tonë përsërit vetëm makro PT_WAIT_UNTIL. Këto makro funksionojnë më poshtë:

  • Thirrja e funksionit DoAndCountdown. Kjo vendos tensionin në katodat LED për të lëshuar ngjyrë të veçantë.
  • Rezultati i kthyer në krahasim me 0. Nëse gjendja është 'false' funksioni i prototreadit menjëherë kthehet dhe jep kontroll në lakin kryesor.
  • Kur protothread thirret herën tjetër ai përsëri ekzekuton kodin para PT_BEGIN, pastaj hidhet direkt brenda makrove PT_WAIT_UNTIL nga të cilat u kthye herën e fundit.
  • Veprime të tilla përsëriten derisa rezultati i DoAndCountdown të jetë 0. Në atë rast nuk ka kthim, programi qëndron në protothread dhe ekzekuton rreshtin tjetër të kodit. Në rastin tonë është PT_WAIT_UNTIL tjetër, por në përgjithësi mund të jetë pothuajse çdo kod C.
  • Në ekzekutimin fillestar të numëruesit të dytë të kundërt PT_WAIT_UNTIL është 0, kështu që procedura DoAndCountdown () e vendos atë në vlerën fillestare. Makrot e dyta përsëri do të ekzekutohen 250 herë derisa numëruesi i kundërt arrin 0.
  • Gjendja e strukturës pt rivendoset sapo kontrolli të arrijë në makro PT_END. Kur thirret funksioni protothread herën tjetër segmenti protothread fillon të ekzekutojë vijën e kodit menjëherë pas PT_BEGIN.

Ekziston një rutinë e ngjashme prototread për LED -in e duhur. Në shembullin tonë ai thjesht zbaton renditje të ndryshme të ngjyrave, por nëse mund ta bëjmë atë krejtësisht ndryshe: nuk ka bashkim të ngushtë midis rutinës LED të majtë dhe të djathtë.

Hapi 7: Brendshme

Të brendshme
Të brendshme

I gjithë programi është më pak se 200 rreshta kod (me komente dhe rreshta bosh) dhe merr më pak se 20% të kujtesës së kodit Attiny85. Nëse është e nevojshme, është e mundur të përdoren këtu edhe disa rutina të tjera të prototreadit dhe t'u caktohet atyre logjikë shumë më e ndërlikuar.

Biblioteka Protothreads është forma më e thjeshtë e programimit të njëkohshëm kompjuterik. Programimi i njëkohshëm është një qasje që lejon ndarjen e programit në pjesë logjike: ndonjëherë ato quhen koroutina, herë fije, ndonjëherë detyra. Parimi është që secila detyrë e tillë mund të ndajë të njëjtën fuqi procesori duke e mbajtur kodin pak a shumë linear dhe të pavarur nga pjesët e tjera. Detyrat nga pikëpamja logjike mund të ekzekutohen njëkohësisht.

Për sistemet e avancuara kontrollet e detyrave të tilla kryhen ose nga kerneli i sistemit operativ ose nga koha e ekzekutimit të gjuhës e përfshirë në ekzekutues nga përpiluesi. Por në rast të protothreads, programuesi i aplikacionit e kontrollon atë me dorë duke përdorur bibliotekën e makro protothreads në rutinat e detyrave dhe duke thirrur rutina të tilla (zakonisht jashtë lakut kryesor).

Ju ndoshta dëshironi të dini se si funksionon protothread në të vërtetë? Ku fshihet magjia? Protothreads mbështeten në veçori të veçanta të gjuhës C: fakti që deklarata e rastit C switch mund të ngulitet në if ose ndonjë bllok tjetër (si while ose for). Detajet që mund të gjeni në faqen e Adam Dunkels

Pjesët e brendshme elektronike të këtij projekti janë shumë të thjeshta. Fotografia e mësipërme ju jep një ide. Jam i sigurt që mund të bësh më mirë.

Recommended: