INHOUDSOPGAWE:
2025 Outeur: John Day | [email protected]. Laas verander: 2025-01-13 06:56
Deur jumbleviewJumbleview.info Volg meer deur die skrywer:
Ongeveer: Ek werk as sagteware -ingenieur in een van Bay Area (Kalifornië) -ondernemings. Elke keer as ek tyd het, hou ek daarvan om mikrobeheerders te programmeer, meganiese speelgoed te bou en projekte vir huisverbetering te maak. Meer oor jumbleview »
Hierdie projek wys hoe u twee 10mm drie-kleur gewone anode LED's (veelkleurige oë van Pumpkin Halloween Glitter) met Attiny85-chip kan beheer. Die doel van die projek is om lesers bekend te stel in die kuns van gelyktydige programmering en die gebruik van die Adam Dunkels prototreads -biblioteek. Hierdie projek veronderstel dat die leser weet van AVR 8-bis-beheerders, 'n C-program kan skryf en 'n bietjie ervaring het met Atmel studio.
Projekkode gepubliseer op GitHub:
Voorrade
Voordat u programmeer, moet u nog die kring bou. Hier is komponente:
- Attiny85 -beheerder (enige elektroniese verskaffer).
- Twee drie -kleur 10mm LED's met gewone anode. Adafruit LED's
- Weerstande 100 Ohm, 120 Ohm, 150 Ohm 0.125 of 0.250 Wt (enige elektroniese verskaffer).
- Ses -pin -kop vir AVR ISP -koppelvlak. Kan gemaak word uit hierdie Adafruit -kop
- Sommige broodbord of gedrukte sjabloonbord. Ek het hierdie https://www.adafruit.com/product/589 gebruik
- AVR ISP MKII -koppelvlak en Atmel Studio 6.1 (Die latere weergawe behoort ook te werk).
Stap 1: Sny
Die ontwerp gebruik vyf chippenne:
- Twee penne wat gebruik word om anodes te beheer: elke LED -anode wat aan die spesiale pen vasgemaak is.
- Drie penne vasgemaak (deur weerstande) aan LED's katodes (dieselfde kleur katode van elke led wat aan dieselfde pen geheg is)
'N Mens sou vra: waarom nie al die ses in/uit -penne van die chip gebruik nie, sodat LED -anodes direk aan +5 v gekoppel word en elke katode sy eie pen het? Dit sal programmering eenvoudig maak. Helaas, daar is die probleem: pen PB5 (RESET) is 'n swak pen wat net ~ 2 mA van die stroom kan lewer, terwyl ~ 20 mA nodig is.
Natuurlik kan 'n mens 'n transistorversterker vir hierdie swak pen bou, maar ek verkies self, indien moontlik, om die probleem deur die kode op te los.
Stap 2: Tydsdiagram
Tyddiagram help ons om te verstaan wat ons moet programmeer.
Die boonste twee rye op die diagram toon spanningverandering op LED -anodes. Spanning op penne wat aan LED -anodes gekoppel is, ossilleer met frekwensie ~ 250 Hz. Hierdie spanning ossillasie vir die linker LED is 'n teenoorgestelde van die ossillasie van die regter LED. As die spanning op die anode hoog is, kan die ooreenstemmende LED helder wees. As dit laag is, is die ooreenstemmende LED donker. Dit beteken dat elke LED gedurende die tydperk van 2 millisekondes helder kan wees en gedurende nog twee millisekondes donker is. Omdat die menslike traagheid 'n mate van traagheid het, word die waarneming van 250 Hz nie geknip nie. Onder drie rye op die diagram toon spanningverandering op penne wat aan LED's katodes gekoppel is. Kom ons kyk na die eerste diagramkolom. Dit toon die geval wanneer die linker LED in rooi kleur is en die regter LED in groen kleur. Hier bly ROOI katodes laag terwyl linker anode hoog is, GROEN katode bly laag terwyl regter anode hoog is, en BLOU katode bly heeltyd laag. Ander kolomme op die diagram toon kombinasies van katode en anodespanning vir verskillende kleure.
Soos ons kan sien, is daar 'n onderlinge afhanklikheid van die penne. Sonder 'n raamwerk sou dit nie maklik wees om op te los nie. En dit is waar protothread -biblioteek handig te pas kom.
Stap 3: Programmering. Makros en definisies
Voorbeeld in programmeringsstappe verteenwoordig 'n effens vereenvoudigde weergawe. Die program word verkort en 'n simboliese definisie word vervang met eksplisiete konstantes.
Laat ons van die begin af begin. Die program bevat lêers wat by Atmel Studio kom, sowel as 'n prototread -biblioteekopskrif. Vervolgens is daar twee makros om penvlakke te manipuleer en 'n paar definisies om logiese name aan penne te gee. Tot dusver niks besonders nie.
Stap 4: Programmering. Hooflus
Laat ons dan aan die einde kyk wat die hoofprosedure bevat.
Die belangrikste funksie na 'n paar inisialisering bly vir ewig. In die lus maak dit die volgende stappe:
- Roep prototread -roetine op vir die linker LED. Dit verander 'n paar penne se spanning.
- Vertraag twee millisekondes. Daar is geen verandering in penspanning nie.
- Roep prototread op vir die regte LED. Dit verander 'n paar pen spanning.
- Vertraag 2 MS. Daar is geen verandering in penspanning nie.
Stap 5: Programmering. Hulpfunksies
Voordat ons begin om prototrekke te bespreek, moet ons na 'n paar helperfunksies kyk. Eerstens is daar funksies om 'n spesifieke kleur in te stel. Hulle is eenvoudig. Daar is soveel funksies soos die aantal ondersteunde kleure (sewe) en nog 'n funksie om die LED donker te maak (NoColor).
En daar is nog 'n funksie wat direk deur prototread -roetine aangewend sal word. Die naam is DoAndCountdown ().
Tegnies gesproke is die gebruik van so 'n funksie nie verpligtend nie, maar ek vind dit gerieflik. Dit het drie argumente:
- Aanwyser na funksie -instelling van LED -kleur (soos RedColor of GreenColor of ens.)
- Aanvanklike waarde van die omgekeerde teller: die aantal keer dat hierdie funksie in 'n spesifieke prototread -stadium opgeroep moet word.
- Wyser na omgekeerde toonbank. Daar word aangeneem dat as daar 'n verandering in die kleur is, die omgekeerde teller 0 is, dus sal die herhalingskode eers aan die teller se aanvanklike waarde toeken. Na elke iterasie -toonbank word verminder.
Funksie DoAndCountdown () gee die waarde van die omgekeerde teller terug.
Stap 6: Programmering. Protothread -roetines
En hier is die raamwerkkern: prototread -roetine. Ter wille van eenvoud beperk die voorbeeld slegs tot drie stappe: vir kleurverandering na ROOI, na GROEN en na BLOU.
Die funksie word opgeroep met twee argumente:
- Wyser na prototreadstruktuur. Die struktuur is deur die hoof geïnitialiseer voordat die hooflus begin het.
- Wyser na omgekeerde toonbank. Dit was ingestel op 0 deur die hoof voordat die hooflus begin het.
Funksieset spanning om die linker LED aktief te maak en begin dan met 'n prototreadsegment. Hierdie segment is tussen makros PT_BEGIN en PT_END. Binne is daar 'n kode wat in ons geval slegs makros PT_WAIT_UNTIL herhaal. Hierdie makros voer die volgende uit:
- Aanroep van funksie DoAndCountdown. Dit stel spanning op LED -katodes om 'n spesifieke kleur uit te gee.
- Resultaat teruggekeer in vergelyking met 0. As die toestand 'onwaar' is, loop die prototread -funksie onmiddellik terug en gee dit beheer aan die hooflus.
- As die volgende keer prototread ingeroep word, voer dit weer kode uit voor PT_BEGIN, en spring dan direk binne -in die PT_WAIT_UNTIL -makros waaruit dit laas teruggekeer het.
- Sulke aksies word herhaal totdat die resultaat van DoAndCountdown 0 is. In hierdie geval is daar geen terugkeer nie, die program bly in prototread en voer die volgende reël van die kode uit. In ons geval is dit die volgende PT_WAIT_UNTIL, maar in die algemeen kan dit byna enige C -kode wees.
- By die aanvanklike uitvoering van die tweede PT_WAIT_UNTIL omgekeerde teller is 0, dus stel prosedure DoAndCountdown () dit op die aanvanklike waarde in. Tweede makro's word weer 250 keer uitgevoer totdat die omkeerteller 0 bereik.
- Toestand van struct pt word herstel sodra die beheer PT_END -makros bereik. As die prototreadfunksie die volgende keer opgeroep word, begin die prototreadsegment die reël van die kode onmiddellik na PT_BEGIN.
Daar is 'n soortgelyke protode -roetine vir die regte LED. In ons voorbeeld pas dit net verskillende kleure toe, maar as ons dit heeltemal anders kan doen: daar is geen noue koppeling tussen die linker- en regter -LED -roetine nie.
Stap 7: intern
Die hele program is minder as 200 reëls kode (met opmerkings en leë reëls) en neem minder as 20% van die Attiny85 -kodegeheue. As dit nodig is, is dit moontlik om nog 'n paar prototread -roetines hier te gebruik en aan hulle baie meer ingewikkelde logika toe te ken.
Protothreads -biblioteek is die eenvoudigste vorm van gelyktydige programmering van rekenaars. Gelyktydige programmering is 'n benadering wat die program in logiese dele kan verdeel: soms word dit coroutines genoem, soms thread, soms take. Die beginsel is dat elke so 'n taak dieselfde verwerkerkrag kan deel terwyl die kode min of meer lineêr en onafhanklik van ander dele gehou word. Take vanuit logiese oogpunt kan gelyktydig uitgevoer word.
Vir gevorderde stelsels kan sulke take uitgevoer word, óf deur die bedryfstelselkern, óf deur die tydsduur van die taal wat in die uitvoerbare program deur die samesteller ingebed is. Maar in die geval van protothreads beheer die programmeerder dit met die hand deur prototreads -makrosbiblioteek te gebruik in taakroetines en om sulke roetines op te roep (gewoonlik buite die hooflus).
U wil waarskynlik weet hoe prototread eintlik werk? Waar is die magie weggesteek? Protothreads maak staat op 'n spesiale funksie in die C -taal: die feit dat 'n C -omskakeling in 'n geval in 'n ander blok (soos terwyl of vir) ingebed kan word. Besonderhede wat u op Adam Dunkels se webwerf kan vind, Elektroniese ingang van hierdie projek is baie eenvoudig. Die foto hierbo gee u 'n idee. Ek is seker jy kan beter doen.