Բովանդակություն:

Attiny85 միաժամանակյա ծրագրավորում կամ բազմագույն աչքերով դդում ՝ 7 քայլ
Attiny85 միաժամանակյա ծրագրավորում կամ բազմագույն աչքերով դդում ՝ 7 քայլ

Video: Attiny85 միաժամանակյա ծրագրավորում կամ բազմագույն աչքերով դդում ՝ 7 քայլ

Video: Attiny85 միաժամանակյա ծրագրավորում կամ բազմագույն աչքերով դդում ՝ 7 քայլ
Video: Знакомство с Digispark ATtiny85. "Arduino для чайников" 2024, Նոյեմբեր
Anonim

Հետևեք հեղինակի ավելին ՝

Theիչ
Theիչ
Theիչ
Theիչ
NiCd մարտկոցի փոխարինում արտաքին սնուցման աղբյուրով
NiCd մարտկոցի փոխարինում արտաքին սնուցման աղբյուրով
NiCd մարտկոցի փոխարինում արտաքին սնուցման աղբյուրով
NiCd մարտկոցի փոխարինում արտաքին սնուցման աղբյուրով
Թվային ֆոտոխցիկի բռնիչ
Թվային ֆոտոխցիկի բռնիչ
Թվային ֆոտոխցիկի բռնիչ
Թվային ֆոտոխցիկի բռնիչ

Ես աշխատում եմ որպես ծրագրային ապահովման ինժեներ Bay Area (California) ընկերություններից մեկում: Երբ ես ժամանակ եմ ունենում, ես սիրում եմ ծրագրավորել միկրոհսկիչներ, կառուցել մեխանիկական խաղալիքներ և կատարել տան բարելավման որոշ նախագծեր: Ավելին jumbleview- ի մասին »

Այս նախագիծը ցույց է տալիս, թե ինչպես կարելի է վերահսկել երկու 10 մմ տրամագծով երեք գունավոր ընդհանուր անոդային LED (դդումի Հելոուինի շողերի բազմագույն աչքեր) Attiny85 չիպով: Նախագծի նպատակն է ընթերցողին ծանոթացնել միաժամանակ ծրագրավորման արվեստին և Ադամ Դունկելսի նախածրագրերի գրադարանին: Այս նախագիծը ենթադրում է, որ ընթերցողը գիտի AVR 8-բիթանոց կարգավորիչների մասին, կարող է գրել C- ծրագիր և որոշակի փորձ ունի Atmel ստուդիայի հետ:

Նախագծի կոդը հրապարակված GitHub- ում ՝

Պարագաներ

Programրագրավորումից առաջ դեռ պետք է կառուցել շրջանը: Ահա բաղադրիչները.

  • Attiny85 վերահսկիչ (ցանկացած էլեկտրոնային մատակարար):
  • Երկու երեք գունավոր 10 մմ LED ՝ ընդհանուր անոդով: Adafruit LED- ները
  • Ռեզիստորներ 100 Օմ, 120 Օմ, 150 Օմ 0.125 կամ 0.250 Վտ (ցանկացած էլեկտրոնային մատակարար):
  • Վեց կապ վերնագիր AVR ISP ինտերֆեյսի համար: Կարող է պատրաստվել այս Adafruit վերնագրից
  • Որոշ հացի տախտակ կամ տպագիր կաղապարային տախտակ: Ես օգտագործեցի այս մեկը ՝
  • AVR ISP MKII ինտերֆեյս և Atmel Studio 6.1 (Հետագա տարբերակը նույնպես պետք է աշխատի):

Քայլ 1: Շրջան

Շրջ
Շրջ

Դիզայնը օգտագործում է հինգ չիպային կապում.

  • Երկու կապում, որոնք օգտագործվում են անոդները վերահսկելու համար. Յուրաքանչյուր LED անոդ կցված է նվիրված քորոցին:
  • Երեք կապում ամրացված (ռեզիստորների միջոցով) LED լուսադիոդների կաթոդներին (յուրաքանչյուր լուսադիոդի նույն գույնի կաթոդը կցված է նույն քորոցին)

Ինչի՞ց չօգտագործեք չիպի բոլոր վեց ներածական/դուրս կապերը, որպեսզի LED անոդներն ուղղակիորեն միացվեն +5 վ -ին և յուրաքանչյուր կաթոդ ունենա իր նվիրված քորոցը: Դա կդարձնի ծրագրավորումը պարզ: Ավաղ, խնդիրը կա. PB5 (RESET) կապը թույլ քորոց է, որը կարող է ապահովել հոսանքի ընդամենը m 2 մԱ, մինչդեռ անհրաժեշտ է ունենալ ~ 20 մԱ:

Իհարկե, կարելի է տրանզիստորային ուժեղացուցիչ կառուցել այս թույլ քորոցի համար, բայց ես ինքս, հնարավորության դեպքում, նախընտրում եմ խնդիրը լուծել կոդի միջոցով:

Քայլ 2: ingամանակի դիագրամ

Timամկետների դիագրամ
Timամկետների դիագրամ

Timամանակի դիագրամը օգնում է մեզ հասկանալ, թե ինչ է մեզ անհրաժեշտ ծրագրավորելու համար:

Գծապատկերում վերևի երկու տողերը ցույց են տալիս LED անոդների լարման փոփոխությունը: LED անոդներին միացված կապում լարումը տատանվում է frequency 250 Հց հաճախականությամբ: Ձախ LED- ի այս լարման տատանումը հակառակ LED- ի տատանումն է: Երբ անոդի լարումը բարձր է, համապատասխան LED- ը կարող է պայծառ լինել: Երբ այն ցածր է, համապատասխան LED- ը մութ է: Դա նշանակում է, որ յուրաքանչյուր LED կարող է պայծառ լինել 2 միլիվայրկյան ընդմիջման ընթացքում և մութ է ևս 2 միլիվայրկյանի ընթացքում: Քանի որ մարդու աչքն ունի որոշակի իներցիա, դիտորդի կողմից նկատելի չէ 250 Հց թարթելը: Ստորև բերված դիագրամում երեք տող ցույց է տալիս LED- ների կաթոդներին միացված կապում լարման փոփոխությունը: Եկեք նայենք գծապատկերների առաջին սյունակին: Այն ցույց է տալիս այն դեպքը, երբ ձախ LED- ը կարմիր է, իսկ աջը ՝ կանաչ: Այստեղ ԿԱՐՄԻՐ կաթոդները ցածր են մնում, իսկ ձախը ՝ անոդը, Կանաչը ՝ ցածր, իսկ աջը ՝ բարձր, իսկ ԿԱՊՈ կաթոդը մշտապես ցածր է մնում: Դիագրամի այլ սյուներ ցույց են տալիս կաթոդի և անոդի լարման տարբեր գույների համակցություններ:

Ինչպես տեսնում ենք, կապերի վիճակից փոխկախվածություն կա: Առանց որևէ շրջանակի դա հեշտ չէր լինի լուծել: Եվ հենց այստեղ է, որ հարմար է protothread գրադարանը:

Քայլ 3: Programրագրավորում: Մակրո և սահմանումներ

Ծրագրավորում. Մակրո և սահմանումներ
Ծրագրավորում. Մակրո և սահմանումներ

Exampleրագրավորման քայլերի օրինակը ներկայացնում է մի փոքր պարզեցված տարբերակ: Programրագիրը կրճատվում է, և որոշ խորհրդանշական սահմանումներ փոխարինվում են հստակ հաստատուններով:

Եկեք սկսենք սկզբից: Programրագիրը ներառում է Atmel Studio- ի հետ եկող ֆայլեր, ինչպես նաև գրադարանի նախածրագրի վերնագիր: Հաջորդը կան երկու մակրո ՝ քորոցների մակարդակները շահարկելու համար և որոշ սահմանումներ ՝ ազդանշաններին տրամաբանական անուններ տալու համար: Առայժմ ոչ մի հատուկ բան:

Քայլ 4: Programրագրավորում: Հիմնական հանգույց

Ծրագրավորում. Հիմնական հանգույց
Ծրագրավորում. Հիմնական հանգույց

Այնուհետև եկեք վերջում նայենք ՝ տեսնելու, թե ինչ է պարունակում հիմնական ընթացակարգը:

Հիմնական ֆունկցիան որոշ նախաստորագրումներ կատարելուց հետո մնում է ընդմիշտ օղակում: Այդ հանգույցում այն կատարում է հետևյալ քայլերը.

  • Հրավիրում է ձախ լուսադիոդի նախատիպի ռեժիմ: Այն փոխում է որոշ կապում լարումը:
  • Երկու միլիվայրկյան ուշացում կատարեք: Պին լարման փոփոխություն չկա:
  • Հրավիրում է նախածանց ՝ ճիշտ LED- ի համար: Այն փոխում է որոշ կապի լարումը:
  • Կատարեք 2 MS հետաձգում: Պին լարման փոփոխություն չկա:

Քայլ 5: mingրագրավորում: Օժանդակ գործառույթներ

Ծրագրավորում. Օժանդակ գործառույթներ
Ծրագրավորում. Օժանդակ գործառույթներ

Նախքան նախածանցերի քննարկումը սկսելը, մենք պետք է նայենք որոշ օգնական գործառույթների: Նախ կան որոշակի գույն սահմանելու գործառույթներ: Նրանք ուղիղ են: Կան այնքան գործառույթներ, ինչպիսիք են աջակցվող գույների քանակը (յոթ) և ևս մեկ գործառույթ ՝ LED մուգ (NoColor) սահմանելու համար:

Եվ կա ևս մեկ գործառույթ, որն ուղղակիորեն կկիրառվի նախատիպերի ռեժիմով: Նրա անունն է DoAndCountdown ():

Տեխնիկապես նման գործառույթի օգտագործումը պարտադիր չէ, բայց ես հարմար գտա: Այն ունի երեք փաստարկ.

  • LEDուցանիշ ՝ LED գույնը կարգավորելու գործառույթի համար (օրինակ ՝ RedColor կամ GreenColor կամ այլն)
  • Հակադարձ հաշվիչի սկզբնական արժեքը. Քանի անգամ է, որ այս գործառույթը պետք է գործարկվի նախատիպերի որոշակի փուլում:
  • Հակադարձ հաշվիչի ցուցիչ: Ենթադրվում է, որ գույնի փոփոխության դեպքում հակառակ հաշվիչը 0 է, ուստի սկզբում կրկնության ծածկագիրը այդ հաշվիչին կհատկացնի սկզբնական արժեքը: Յուրաքանչյուր կրկնության հաշվիչից հետո նվազում է:

Function DoAndCountdown () վերադարձնում է հակառակ հաշվիչի արժեքը:

Քայլ 6: ingրագրավորում: Protothread ռեժիմներ

Ծրագրավորում. Protothread ռեժիմներ
Ծրագրավորում. Protothread ռեժիմներ

Եվ ահա շրջանակային միջուկը ՝ նախածրագրի ռեժիմը: Պարզության համար օրինակը սահմանափակվում է միայն երեք քայլով ՝ գույնը փոխելու համար ՝ Կարմիր, Կանաչ և ԿԱՊՈ:

Ֆունկցիան կանչվում է երկու փաստարկով.

  • Protուցանիշ դեպի նախաթելային կառուցվածք: Այդ կառույցը նախաստորագրվել է հիմնականով ՝ նախքան հիմնական օղակի սկսվելը:
  • Հակադարձ հաշվիչի ցուցիչ: Մինչև հիմնական օղակը սկսելը, այն սահմանվել էր 0 -ի միջոցով:

Ֆունկցիան լարումներ է սահմանում `ձախ LED- ն ակտիվ դարձնելու համար, այնուհետև սկսում է նախաթելերի հատվածը: Այս հատվածը գտնվում է PT_BEGIN և PT_END մակրոների միջև: Ներսում կա մի կոդ, որը մեր դեպքում կրկնում է միայն մակրոները PT_WAIT_UNTIL: Այս մակրոները կատարում են հետևյալը.

  • DoAndCountdown գործառույթի կանչում: Դա լարվածություն է ստեղծում LED կաթոդների վրա ՝ որոշակի գույն արձակելու համար:
  • Վերադարձված արդյունքը `համեմատած 0. -ի հետ:
  • Երբ հաջորդ անգամ կանչվում է նախաթելիկ, այն նորից կատարում է ծածկագիրը PT_BEGIN- ից առաջ, այնուհետև անմիջապես ցատկում է PT_WAIT_UNTIL մակրոների ներսում, որոնցից այն վերադարձել է նախորդ անգամ:
  • Նման գործողությունները կրկնվում են մինչև DoAndCountdown- ի արդյունքը 0: Մեր դեպքում դա հաջորդ PT_WAIT_UNTIL- ն է, բայց ընդհանուր առմամբ դա կարող է լինել գրեթե ցանկացած C կոդ:
  • Երկրորդ PT_WAIT_UNTIL հակադարձ հաշվիչի սկզբնական կատարման ժամանակ 0 -ն է, ուստի DoAndCountdown () ընթացակարգը այն սահմանեց սկզբնական արժեքի: Երկրորդ մակրոները կրկին կկատարվեն 250 անգամ, մինչև հակադարձ հաշվիչը չհասնի 0 -ի:
  • Struct pt- ի վիճակը վերակայվում է հենց որ հսկողությունը հասնի PT_END մակրոներին: Երբ հաջորդ անգամ protothread ֆունկցիան կանչվի, երբ protothread հատվածը սկսի կատարել ծածկագրի տողը PT_BEGIN- ից անմիջապես հետո:

Similarիշտ LED- ի համար գոյություն ունի նմանատիպ նախատիպային ռեժիմ: Մեր օրինակում այն պարզապես կիրառում է գույների տարբեր կարգ, բայց եթե դա կարող ենք անել բոլորովին այլ կերպ. Ձախ և աջ լուսադիոդային ռեժիմի միջև ամուր զուգավորում չկա:

Քայլ 7: Ներքին գործեր

Ներքին
Ներքին

Ամբողջ ծրագիրը 200 գծից պակաս կոդ է (մեկնաբանություններով և դատարկ տողերով) և զբաղեցնում է Attiny85 կոդի հիշողության 20% -ից պակաս: Անհրաժեշտության դեպքում այստեղ հնարավոր է օգտագործել ևս մի քանի նախածրագրային ռեժիմներ և դրանց տալ շատ ավելի բարդ տրամաբանություն:

Protothreads գրադարանը համակարգչային զուգահեռ ծրագրավորման ամենապարզ ձևն է: Concուգահեռ ծրագրավորումը մոտեցում է, որը թույլ է տալիս ծրագիրը բաժանել տրամաբանական մասերի. Երբեմն դրանք կոչվում են կորոուտիններ, երբեմն թելեր, երբեմն առաջադրանքներ: Սկզբունքն այն է, որ յուրաքանչյուր այդպիսի խնդիր կարող է կիսել նույն պրոցեսորային հզորությունը ՝ միաժամանակ պահելով ծածկագիրը քիչ թե շատ գծային և անկախ այլ մասերից: Տրամաբանական տեսանկյունից առաջադրանքները կարող են կատարվել միաժամանակ:

Advancedարգացած համակարգերի համար նման առաջադրանքների վերահսկումը կատարվում է կամ օպերացիոն համակարգի միջուկի միջոցով, կամ կոմպիլյատորի կողմից գործարկվող մեջ ներառված լեզվի գործարկման ժամանակ: Բայց protothreads- ի դեպքում ծրագրավորողը վերահսկում է այն ձեռքով ՝ օգտագործելով protothreads մակրո գրադարանը առաջադրանքների ռեժիմում և նման ռեժիմներ հրավիրելով (սովորաբար հիմնական օղակից դուրս):

Դուք հավանաբար ուզու՞մ եք իմանալ, թե իրականում ինչպես է աշխատում նախաթելիկը: Որտե՞ղ է թաքնված կախարդանքը: Protothreads- ը հենվում է C լեզվի հատուկ առանձնահատկության վրա. Այն փաստը, որ C switch- ի գործի հայտարարությունը կարող է ներդրված լինել if կամ որևէ այլ բլոկի մեջ (օրինակ ՝ while կամ for): Մանրամասներ, որոնք կարող եք գտնել Ադամ Դունկելսի կայքում

Այս նախագծի էլեկտրոնիկայի ներքին սարքերը շատ պարզ են: Վերևի լուսանկարը ձեզ հուշում է: Վստահ եմ, որ կարող ես ավելի լավ անել:

Խորհուրդ ենք տալիս: