Ծրագրավորման MK զրոյից: AVR ծրագրավորում

Ես մեկ անգամ եւ ոչ թե երկու անգամ ասում եմ, որ MK- ի ուսումնասիրությունը պետք է սկսվի հավաքագրով: Սա տեղում նվիրված էր տեղում (չնայած այն շատ հետեւողական չէ, բայց աստիճանաբար ես այն սանրեցի համապատասխան տիպի): Այո, դժվար է, արդյունքը չի լինի առաջին օրը, բայց դուք կսովորեք հասկանալ, թե ինչ է կատարվում ձեր վերահսկիչում: Դուք կիմանաք, թե ինչպես է այն աշխատում, եւ ոչ թե կապիկի վրա պատճենեք այլ մարդկանց աղբյուրները եւ փորձեք հասկանալ, թե ինչու է հանկարծակի աշխատել: Բացի այդ, Si- ն շատ ավելի հեշտ է բռնել կեսին, որը դուրս կգա պատառաքաղներով առավել աննկատուն պահի:

Դժբախտաբար, բոլորն անհապաղ ցանկանում են արդյունքը: Հետեւաբար, ես որոշեցի գնալ մյուս ձեռքը `ուսուցողական դարձնել Si- ում, բայց նրա ներքնազգեստի ցուցադրությամբ: Լավ ծրագրավորող-ներկառուցվածը միշտ իր երկաթը պահում է ճաքիկի համար, առանց նրան առանց թույլտվության քայլ տալու: Այնպես որ, դա կլինի այս կոդի սկզբում, ապա այն, ինչ ծնվել է կազմողին եւ ինչպես է իրականում իրականում գործում :)

Մյուս կողմից, SI Ուժեղ կողմը Սա Porteability կոդն է: Եթե, իհարկե, ամեն ինչ ճիշտ գրեք: Ծրագրի տարբեր մասերում առանձնացնելով աշխատանքային ալգորիթմները եւ դրանց երկաթի իրականացումները: Այնուհետեւ ալգորիթմը մեկ այլ MK փոխանցելու համար բավական է վերաշարադրել միայն ինտերֆեյսի շերտը, որտեղ գրված է գեղձի բոլոր դիմումները եւ թողնում են ամբողջ աշխատանքային ծածկագիրը: Եվ, իհարկե, ընթերցանությունը: Sash Source աղբյուրը ավելի հեշտ է հասկանալ առաջին հայացքից (չնայած .. Ես, օրինակ, չեմ հետաքրքրում, թե ինչ պետք է սիրախաղ անեմ, գոնե afm :)), բայց, եթե ամեն ինչ ճիշտ գրես: Այս պահերին ես նույնպես ուշադրություն կդարձնեմ:

Որպես ապարատների իրականացնող սարք, որի վրա բոլոր օրինակների առյուծի մասնաբաժինը կլինի իմը Կարգավիճակի վճար.

Առաջին ծրագիրը C- ի համար AVR- ի համար

Ընտրելով կազմող եւ շրջակա միջավայրի տեղադրում
AVR- ի համար կան շատ տարբեր C- ի կազմողներ.
Առաջին հերթին դա IAR AVR C. - համարյա եզակի ճանաչվել է որպես Լավագույն կազմող AVR- ի համար, քանի որ Վերահսկիչն ինքնին ստեղծվել է at րի սերտ համագործակցողի եւ IAR- ի մասնագետների կողմից: Բայց այն ամենի համար, ինչ դուք պետք է վճարեք: Եվ այս կազմողը բավարար չէ, թե որն է թանկ առեւտրային ծրագրաշարը, այն ունի նաեւ այնպիսի նախաճաշի պարամետրեր, որոնք պարզապես վերցնում եւ կազմում են դրա մեջ, պետք է շտապել: Ես իրոք բարեկամություն չունեի նրա հետ, նախագիծը հարբած էր տարօրինակ սխալների վրա, կապված կապի փուլում (ավելի ուշ պարզվեց, որ դա ճեղքման կոր է):

Երկրորդը գալիս է Winavr GCC. - Հզոր օպտիմիզացնող կազմող: Ամբողջ բացվում է, խաչաձեւ պլատֆորմ, ընդհանուր առմամբ, կյանքի բոլոր ուրախությունները: Նա նաեւ հիանալի ինտեգրվում է AVR Studio- ում, թույլ տալով հենց այնտեղ կարգաբերել, որ դժոխքը հարմար է: Ընդհանրապես, ես ընտրեցի այն:

Նաեւ կա Codevision AVR C.- Շատ տարածված կազմող: Նա հանրաճանաչ դարձավ իր պարզության կապակցությամբ: Աշխատանքային ծրագիր Դուք կարող եք դրանով մի քանի րոպեից մտնել. Մեկնարկային օրենսգրքի վարպետը մեծապես խթանվում է, բոլոր տեսակի ականջների նախաստորագրման կնիքը: Անկեղծ ասած, ցավում եմ նրան, ինչ-որ կերպ ես ստիպված էի ապամոնտաժել այս կազմողի կողմից գրված պրոգը, ինչ-որ նշանակություն ստացավ: Անտեղի հեռուստատեսության եւ գործողությունների սարսափելի քանակություն, որը թափվել է թեթեւ կոդերի եւ դանդաղ արագության մեջ: Այնուամենայնիվ, թերեւս ԴՆԹ-ում սխալ է գրել բնօրինակ որոնվածը: Գումարած նա փող է ուզում: Ոչ այնքան նման է IAR- ի, բայց նկատելի: Եվ Դեմոժիմում տալիս է ոչ ավելի, քան 2KB կոդ:
Crack իհարկե ճաքը կա, բայց եթե գողանում եք, այնպես որ, միլիոն, ի նշան րի :)

Կա նաեւ Image Craft AVR C մի քանազոր Միկրո Միկրոէլեկտրոնիկայից: Ոչ այլ օգտագործման այլ օգտագործման համար, բայց այստեղ SWG. Շատ հերկել ՄիկրոկասկալMELT- ը ահավոր հարմար ծրագրավորման միջավայր եւ գրադարան է: Կարծում եմ, որ միկրոկը ավելի վատ չի լինի, այլեւ վճարվում է:

Ինչպես ասացի, ես ընտրում եմ Winavr. Երեք պատճառով. Ազատ, այն ինտեգրված է AVR ստուդիայի մեջ, եւ այն գրված է պարզապես պատրաստի ծածկագրի խզումը բոլոր առիթների համար:

Այսպիսով, ներբեռնեք ինքներդ ձեզ `Winavr C եւ AVR ստուդիա տեղադրելու համար: Այնուհետեւ ստուդիան առաջին հերթին դրվում է, ապա, վերեւից, Winavr- ը գլորում է եւ կպչում ստուդիային, plugin- ի տեսքով: Ես խստորեն խորհուրդ եմ տալիս կարճ ճանապարհով տեղադրել winavr, նման բան C: \\ Winavr դրանով իսկ դրանով իսկ խուսափում եք խնդիրների կույտերի հետ:

Նախագիծ ստեղծելը
Այսպիսով, ստուդիան առաքվում է, SI- ն ամրացված է, ժամանակն է փորձել ինչ-որ բան ծրագրի: Սկսենք պարզ, ամենապարզից: Գործարկել ստուդիան, ընտրեք այնտեղ Նոր նախագիծ, Որպես բաղադրիչ AVR GCC եւ մուտքագրեք ծրագրի անվանումը:

Բացվում է աշխատանքային դաշտը դատարկ * .C ֆայլով:

Այժմ դա չի խանգարում կարգաբերել ստուդիայի ներդիրների ուղիների ցուցադրումը: Դրա համար թեքվում է.
Գործիքների ընտրացանկ - Ընտրանքներ - Ընդհանուր - Filetabs եւ ընտրեք «FILENAME ՄԻԱՅՆ» `բացվող ցուցակում: Հակառակ դեպքում անհնար կլինի աշխատել. Ներդիրում կլինի ֆայլի ամբողջական ուղի եւ էկրանին երկու ներդիրներ կլինեն:

Ծրագրի կարգավորումը
Ընդհանուր առմամբ, պատրաստման ֆայլի ստեղծումը, որում նկարագրվելու են բոլոր կախվածությունները: Եվ սա, հավանաբար, ճիշտ է: Բայց ես մեծացել եմ լիովին ինտեգրված գաղափարով uvision. կամ AVR ստուդիա: Այս մոտեցումը խորապես խորթ է: Հետեւաբար, ես կանեմ իմ ձեւով, բոլոր ստուդիաները:

Կույտը կույտով հանդերձում:


Սրանք ձեր նախագծի պարամետրերն են, ավելի ճիշտ `կայքի ավտոմատ սերնդի պարամետրը: Առաջին էջում դուք պարզապես անհրաժեշտ է մուտքագրել հաճախականությունը, որի վրա կաշխատի ձեր MK- ն: Դա կախված է բիթերի ապահովիչներից, ուստի մենք հավատում ենք, որ հաճախությունը 8000000 կգ է:
Ուշադրություն դարձրեք նաեւ օպտիմալացման լարին: Այժմ կա - OS- ը չափի օպտիմիզացում է: Թողնելիս, ինչպես կա, ուրեմն կարող եք փորձել խաղալ այս պարամետրով: -O0- ը բոլորովին շարժական օպտիմիզացում է:

Հաջորդ քայլը ուղիները կարգաբերելն է: Առաջին բանը `ձեր նախագծի գրացուցակը ավելացնելու համար, այնտեղ կա երրորդ կողմի գրադարան: The ուցակը կհայտնվի «: \\»

Ստեղծեք ֆայլը, դուք կարող եք դա տեսնել ձեր նախագծի լռելյայն թղթապանակում, պարզապես վազեք ձեր աչքերով, տեսեք, թե ինչ է այնտեղ:


Այս ամենը: Jim իմ ամենուր լավ եւ գնում է աղբյուրի:

Խնդրի ձեւակերպում
Դատարկ թերթիկը այնքան քողարկվում է որոշակի բարդ գաղափար մարմնավորելու համար, քանի որ դիոդի Banal Blinking- ը չի տեղադրում: Եկեք անմիջապես վերցնենք եղջյուրների համար ցուլ եւ կապ ունենանք համակարգչի հետ. Սա առաջին բանն է, որ ես անում եմ:

Դա կաշխատի այսպես.
COM նավահանգստի ժամանման համաձայն, ստորաբաժանումը (0x31 կոդ) կթողնի դիոդիոնը, եւ երբ զրոյի ժամանումը (0x30 կոդ) մարումը մարվում է: Ավելին, ամեն ինչ արվելու է ընդհատումների վրա, իսկ ֆոնային առաջադրանքը կխփի մեկ այլ դիոդ: Պարզապես եւ իմաստով:

Հավաքեք սխեման
Մենք պետք է միացնենք USB-USART փոխարկիչ մոդուլը Microcontroller Usart Converters- ի հետ: Դա անելու համար վերցրեք երկու էլեկտրագծի մի ջրամուխ եւ խաչը դրեք խաչի քորոցների մեջ: Այսինքն, RX վերահսկիչը կապվում է TX փոխարկիչի հետ, իսկ TX փոխարկիչը RX վերահսկիչով:

Արդյունքում պարզվում է, որ սա նման սխեման է.


Միացնելով այլ եզրակացություններ, սնուցում, լիցքաթափում, այն ստանդարտ է

Մենք գրում ենք ծածկագիր

Անմիջապես վերապահում կատարեք, որ ես առանձնապես չեմ խորացնի ինքնին SI լեզվի նկարագրության մեջ: Դրա համար պարզապես կա մի հսկայական քանակությամբ նյութեր, սկսած «SI ծրագրավորման լեզու» դասականներից `K & R- ից եւ ավարտվում են տարբեր տեխնիկայով:

Նման մեթոդ է հայտնաբերվել իմ մեջ մեղրամոմում, ես մի անգամ ուսումնասիրեցի այս լեզուն դրա վրա: Այնտեղ ամեն ինչ հակիրճ է, հասկանալի եւ գործով: Ես աստիճանաբար պատրաստում եմ այն \u200b\u200bեւ վերադասավորվում եմ իմ կայքում:

Իսկապես ոչ բոլոր գլուխը հետաձգված չէ, բայց կարծում եմ, որ երկար ժամանակ չէ:

Քիչ հավանական է, որ ես ավելի լավ նկարագրեմ, այնպես որ դասընթացի դասընթացի փոխարեն, կապույտ նրբությունների մանրամասն ազդեցության փոխարեն, ես պարզապես ուղղակի հղումներ կտամ այս տեխնիկայի որոշակի էջերին:

Ավելացնել գրադարաններ:
Առաջին հերթին մենք ավելացնում ենք անհրաժեշտ գրադարաններ եւ վերնագրեր, սահմանումներով: Ի վերջո, SI- ն ունիվերսալ լեզու է, եւ նա պետք է բացատրի, որ մենք աշխատում ենք AVR- ի հետ, այնպես որ մուտքագրեք աղբյուրի վրա.

1 #Ներառում.

#Ներառում.

Այս ֆայլը թղթապանակում է Winavr. Եվ այն պարունակում է վերահսկիչի բոլոր գրանցամատյանների եւ նավահանգիստների նկարագրությունը: Եվ այնտեղ բոլորը խորամանկ են, հղում կատարելով հատուկ վերահսկիչին, որը փոխանցվում է կազմողի միջոցով Դարձնել Ֆայլը պարամետրում MCU. Եվ ձեր նախագծի այս փոփոխականի հիման վրա վերնագիր ֆայլը `բոլոր նավահանգիստների եւ գրանցամատյանների հասցեների նկարագրությամբ, այս վերահսկիչում է: Ինչպես! Առանց դրա, նույնպես հնարավոր է, բայց այդ դեպքում դուք չեք կարողանա օգտագործել գրանցամատյանների խորհրդանշական անունները SREG կամ UDR- ի նման եւ պետք է հիշել յուրաքանչյուրի հասցեն, ինչպիսին է «0XC1» -ը, եւ սա գլուխ է:

Նույն թիմն ինքնին #Ներառում.<имя файла> Թույլ է տալիս ավելացնել ձեր նախագիծը ցանկացած տեքստային ֆայլի բովանդակությունը, օրինակ, գործառույթները կամ մեկ այլ կոդի նկարագրող ֆայլ: Եվ այսպես, որ հրահանգը կարող էր գտնել այս ֆայլը, մենք նշված ենք մեր նախագծի ուղիները (Winavr Directory- ն արդեն ամրագրված է):

Հիմնական գործառույթ:
SI լեզվով ծրագիրը բաղկացած է գործառույթներից: Դրանք կարող են ներառվել եւ միմյանցից բերել ցանկացած կարգով եւ տարբեր ձեւերով: Յուրաքանչյուր գործառույթ ունի երեք պահանջվող պարամետր.

  • Վերադարձի արժեքը, օրինակ, Մեղք (x) Վերադարձնում է X սինուսի արժեքը: Ինչպես մաթեմատիկայում, կարճ ժամանակահատվածում:
  • Փոխանցված պարամետրեր, նույն x.
  • Մարմնի գործառույթը:

Փոխանցված եւ վերադարձված բոլոր արժեքները պետք է լինեն ցանկացած տիպ, կախված տվյալներից:

C- ի ցանկացած ծրագիր պետք է պարունակի գործառույթ Հիմնական: Որպես հիմնական ծրագրին մուտքի կետ, հակառակ դեպքում դա NIFIGA չէ, որ ոչ si :): Մեկ ուրիշի աղբյուրի առկայության դեպքում մեկ միլիոն ֆայլերից մեկ այլ աղբյուրի ներկայության դեպքում կարելի է հասկանալ, որ սա ծրագրի ղեկավարն է, որտեղ ամեն ինչ սկսվում է: Եկեք հարցնենք.

1 2 3 4 5 Int հիմնական (անվավեր) (վերադարձ 0;)

int հիմնական (անվավեր) (վերադարձ 0;)

Ամեն ինչ, գրված է առաջին ամենապարզ ծրագիրը, կարեւոր չէ, որ նա ոչինչ չի ձեռնարկում, մենք նոր ենք սկսել:

Մենք վերլուծելու ենք այն, ինչ արեցինք:
int. Այս տեսակի տվյալները, որոնք հիմնական գործառույթը վերադառնում է:

Իհարկե, միկրոկոնտրոլերի մեջ Հիմնական: Ես ոչինչ չեմ կարող վերադառնալ սկզբունքորեն եւ տեսականորեն պետք է լինի Անվավեր հիմնական (անվավեր)Բայց GCC- ն ի սկզբանե սրվում է համակարգչում, եւ այնտեղ ծրագիրը կարող է ավարտվելուց հետո վերադարձնել գործավար համակարգի արժեքը: Հետեւաբար GCC- ին Անվավեր հիմնական (անվավեր) երդման նախազգուշացում:

Սա սխալ չէ, այն կաշխատի, բայց ես չեմ սիրում varnings:

Անվավեր: Այս տեսակի տվյալները, որոնք մենք փոխանցում ենք գործառույթին այս դեպքում Հիմնական: Դրսից ոչինչ չի կարող որեւէ բան վերցնել, բանաստեղծը Անվավեր: - խրթխրթան: Խրոցը կիրառվում է, երբ անհրաժեշտ չէ որեւէ բան փոխանցել կամ վերադառնալ:

Սրանք { } Գծապատկերների փակագծերը ծրագրային բլոկ են, այս դեպքում մարմնի գործառույթը Հիմնական:, Կլինի կոդ:

Վերադարձ - Սա վերադարձի արժեքն է, որ հիմնական գործառույթը կտա ավարտից հետո, քանի որ մենք մտնում ենք, այսինքն, այն թիվը, որը մենք պետք է վերադարձնենք այդ թիվը: Չնայած այն դեռ իմաստ չունի, որովհետեւ Microcontroller- ի վրա հիմնականից մենք, բացառությամբ ոչ մի տեղից: Ես վերադարձնում եմ զրո: Ոչ onfig- ի համար: Եվ կազմողը սովորաբար խելացի է, եւ ծածկագիրը չի ստեղծում ծածկագիրը:
Չնայած, եթե այլասերվում ես, հետո Հիմնական: Կարող եք գնալ MC - օրինակ, ընկնել Bootloader հատվածի մեջ եւ կատարել այն, բայց անցումային հասցեները կարգավորելու համար արդեն կա ցածր մակարդակի որոնվածի հավաքում: Ստորեւ կտեսնեք եւ կհասկանաք, թե ինչպես դա անել: Ինչի համար? Սա եւս մեկ հարց է, 99,999% -ում այս Nafig- ը անհրաժեշտ չէ :)

Պատրաստված, հետագայում գնացավ: Ավելացնել փոփոխական, այն մեզ համար հատկապես անհրաժեշտ չէ, եւ անհրաժեշտ չէ փոփոխականներ ներմուծել, բայց մենք սովորում ենք: Եթե \u200b\u200bփոփոխականները ավելացվում են գործառույթի մարմնի մեջ, ապա դրանք տեղական են եւ գոյություն ունեն միայն այս գործառույթում: Գործառույթը թողնելիս այս փոփոխականները հանվում են, եւ RAM- ի հիշողությունը տրվում է ավելի կարեւոր կարիքներին: ,

1 2 3 4 5 6 Int հիմնական (անվավեր) (չստորագրված char i; վերադարձ 0;)

int հիմնական (անվավեր) (չստորագրված char i; վերադարձ 0;)

չիրականացված Այնքան անհասանելի: Փաստն այն է, որ երկուական ներկայացուցչությունում մենք ունենք ավագ բիթ, նշանի համար, որը նշանակում է մեկ բայթ (char) համարը + 127 / -128 համարը անհրաժեշտ չէ. Այնպես, որ չիրականացված.
Ես - Սա պարզապես փոփոխականի անունն է: Այլեւս չկա:

Այժմ անհրաժեշտ է նախաստորագրել նավահանգիստները եւ Uart., Իհարկե, դուք կարող եք վերցնել եւ միացնել գրադարանը եւ զանգահարել մի տեսակ UARTINIT (9600); Բայց հետո դուք չգիտեք, թե իրականում ինչ է տեղի ունեցել:

Մենք դա անում ենք.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Int հիմնական (անվավեր) (անվավեր) (չստորագրված char i; #define xtal 8000000L #define baudrate 9600 լ #Define bauddivider (xtal / (16 * Baudrate) -1) #Define hi (x) (x) \u003e\u003e 8) #Define lo (x) (x) & 0xff) ubrrl \u003d lo (Bauddivider); Ubrrh \u003d բարեւ (Bauddivider); Ucsra \u003d 0; UCSRB \u003d 1:<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

iNT հիմնական (անվավեր) (անվավեր) (չստորագրված char i; #define xtal 8000000L #define baudrate 9600 լ #Define bauddivider (xtal / (x) \u003e\u003e 8) #Define lo ( x) ((x) & 0xff) ubrrl \u003d lo (bauddivider); ubrrh \u003d hi (bauddivider); ucsra \u003d 1; ucsrb \u003d 1; ucsrb \u003d 1; ucsrb \u003d 1; ucsrb \u003d 1; ucsrb \u003d 1; ucsrb \u003d 1; ucsrb \u003d 1; ucsrb \u003d 1<

Վախկոտ? Փաստորեն, իրական օրենսգիրքը այստեղ ընդամենը հինգ վերջին տող է: Ամեն ինչ, դա #Define Սա մակրո լեզվի նախնական է: Գրեթե նույն գագաթները, ինչպես նաեւ հավաքման մեջ, բայց շարահյուսությունը փոքր-ինչ այլ է:

Դրանք կնպաստեն ձեր առօրյային գործողությունները `անհրաժեշտ գործակիցները հաշվարկելու համար: Առաջին տողում մենք ասում ենք, որ փոխարենը Xtal Դուք կարող եք ապահով կերպով փոխարինել 80,000,000, իսկ Լ.- ՏԵՍԱԿԸ ՏԵՍԱԿՈՒՄ, LONG MALL- ը պրոցեսորի ժամացույցի հաճախականություն է: Նույն baudrate. - տվյալների հաճախականությունը UART- ի կողմից:

bauddivider. Արդեն ավելի բարդ է, փոխարենը փոխարինվելու է նախորդների երկու բանաձեւով հաշվարկված արտահայտությունը:
Լավ եւ Սեվեռ մի քանազոր ՈՂՋՈՒ՜ՅՆ Այս արդյունքից կվերցնի երիտասարդ եւ ավագ բայթերը, քանի որ Մի բայթով այն հստակ կարող է տեղավորվել: Մեջ ՈՂՋՈՒ՜ՅՆ ICSE SHIFT- ը կատարվում է (մակրոյի մուտքային պարամետրը) աջից ութ անգամ, արդյունքում, միայն ամենահին բայթը կմնա: Բ. Սեվեռ Մենք պատրաստում ենք խմբաքանակ եւ 00ff- ով, արդյունքում, միայն ամենաերիտասարդ բայթը կմնա:

Այսպիսով, ամեն ինչ արվում է որպես #Define Դուք կարող եք ապահով նետել, եւ ցանկալի համարները հաշվում են հաշվիչի վրա եւ անմիջապես մուտքագրեք դրանք UBBRL \u003d Գծեր ... եւ ubbrh \u003d ... ..

Կարող է Բայց Դա արեք Դա կտրականապես անհնար է!

Այն նաեւ կաշխատի աշխատելու համար, բայց դուք կունենաք այսպես կոչված magic համարներ - Այն արժեքները, որոնք անհայտ են ընդունելիորեն, որտեղից պարզ չէ, թե ինչու եւ եթե նման նախագիծ եք նվիրում մի քանի տարի հետո, ապա դժվար է հասկանալ, որ դա անիծված կլինի: Այո, եւ այժմ, դուք ցանկանում եք փոխել արագությունը կամ փոխել քվարցի հաճախականությունը, եւ ամեն ինչ պետք է վերահաշվարկի, եւ այդպես փոխեց մի քանի tsiferok եւ ամեն ինչ: Ընդհանրապես, եթե չցանկանայիք վայելել Bydlokoder- ը, ապա կատարեք ծածկագիրը, որպեսզի հեշտ լինի կարդալ, այն հասկանալի է եւ հեշտությամբ ձեւափոխված:

Հետո ամեն ինչ պարզ է.
Այս բոլոր «UBRRL եւ CO» - ը հաղորդիչի կազմաձեւման գրանցամատյաններն են, որոնց հետ մենք շփվելու ենք աշխարհի հետ: Եվ հիմա մենք նշանակել ենք անհրաժեշտ արժեքները `կազմաձեւելով ցանկալի արագությունը եւ ճիշտ ռեժիմը:

Ձայնագրման դիտում 1< Նշանակում է հետեւյալը. Վերցրեք 1-ը եւ տեղադրեք այն տեղում Rxen. Ճանճում: Rxen. Սա գրանցամատյանում 4-րդ բիթն է UCSRB., այնպես, որ 1< կազմում է երկուական թիվ 00010000, Txen. - սա 3-րդ բիթ է, եւ 1< DST 00001000. Միայնակ "|" Դա կոտրված է ԿԱՄԱյսպիսով 00010000 | 00001000 \u003d 00011000. Մնացած անհրաժեշտ կազմաձեւման բիթերը ցուցադրվում են նույն ձեւով եւ ավելացվում են ընդհանուր փունջ: Արդյունքում, Վեհաժողովի համարը գրված է UCSRB- ում: Մանրամասները գրված են MC- ի տվյալների բազայում `USART բաժնում: Այսպիսով, մի շեղվեք տեխնիկական մանրամասներից:

Պատրաստ է, ժամանակն է տեսնել, թե ինչ է պատահել: PIPS էմուլյացիայի հավաքման եւ գործարկման մասին (Ctrl + F7):

Կարգաբերում
Բոլոր տեսակի առաջընթացի բարերը վազեցին, ստուդիան փոխվեց, եւ հիմնական գործառույթի մոտակայքում հայտնվեց դեղին սլաքը: Սա այն դեպքում, երբ պրոցեսորը ներկայումս գործում է, եւ սիմուլյացիան դադարեցման վրա:

Փաստն այն է, որ ի սկզբանե, փաստորեն, այն կանգնած էր ubrrl- ի վրա ubrrl \u003d lo (bauddivider); Ի վերջո, այն փաստը, որ մենք սահմանում ենք այն, դա կոդ չէ, այլ պարզապես նախնական հաշվարկներ, ապա սիմուլյատորը մի փոքր ամրացվեց: Բայց հիմա նա հասկացավ, որ առաջին ցուցումը ավարտված է, եւ եթե ծառ եք բարձրանում I / O դիտում, USART բաժնում եւ այնտեղ հաղթել UBBRL բայթով, կտեսնեք, որ արդեն կա արդեն այնտեղ: 0x33:

Մեկ այլ քայլ կատարեք: Նայելով, թե ինչպես են փոփոխվում մեկ այլ ռեգիստրի բովանդակությունը: Ուստի ապահովագրեք բոլորին, ուշադրություն դարձրեք այն փաստին, որ բոլոր նշված բիթերը ցուցադրվում են այնպես, ինչպես ես ասացի, եւ այն դրվում է ամբողջ բայթով: Հաջորդ վերադարձը չի գործում, ծրագիրը ավարտվեց:

Բացում
Այժմ վերագործարկեք սիմուլյացիան զրոյի մեջ: Կտտացրեք այնտեղ Վերականգնել (Shift + F5), Բաց ապամոնտաժված ցուցակագրում, հիմա կտեսնեք, թե իրականում ինչ է տեղի ունենում վերահսկիչում: Դիտում -\u003e Ապամոնտաժում, Եվ ոչ Yyaaaa !!! Assembler !!! Ուժոս !!! Բայց դուք պետք է. Այնպես որ, ավելի ուշ, երբ ինչ-որ բան սխալ է գնում, չէին համարձակվում կոդով եւ չի հարցրել ֆորումներում Լամերի խնդիրները եւ անհապաղ բարձրացել է այն կորուստը եւ հետեւել, թե որտեղ եք ընկել: Այնտեղ սարսափելի բան չկա:

Նախ, դա կլինի շարքի վերեւում.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +00000000: 940C002A Ջինիշյան հիշատակի 0x0000002A Անցնել +00000002: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000004: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000006: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000008: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել + 0000000A: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել + 0000000C: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել + 0000000E: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000010: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000012: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000014: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000016: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000018: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել + 0000001A: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել + 0000001C : 940C0034 JMP 0x00000034 Անցնել + 0000001E: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000020: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000022: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000024: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000026: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000028: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել

00000000: 940C002A Ջինիշյան հիշատակի 0x0000002A Անցնել +00000002: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000004: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000006: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000008: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել + 0000000A: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել + 0000000C: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել + 0000000E : 940C0034 JMP 0x00000034 Անցնել +00000010: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000012: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000014: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000016: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000018: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել + 0000001A: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել + 0000001C: 940C0034 JMP 0x00000034 Անցնել + 0000001E: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000020: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000022: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000024: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000026: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել +00000028: 940C0034 Ջինիշյան հիշատակի 0x00000034 Անցնել

Սա ընդհատվող վեկտորների աղյուսակն է: Մենք կվերադառնանք դրան, մինչդեռ պարզապես տեսեք եւ հիշեք, որ այդպես է: Առաջին սյունակը Flash- ի Flash հասցեն է, որում հրամանը ստում է, Mnemonic- ի երրորդ թիմի երկրորդ հրամանատարակը, նույն հավաքականի հրահանգը, թիմի երրորդ օպերան: Դե, ավտոմատ մեկնաբանություն:
Այսպիսով, եթե նայեք, ապա կան ամուր անցումներ: Եվ JMP հրամանի ծածկագիրը չորս բայթ է, այն պարունակում է հետամնացության կողմից արձանագրված անցումային հասցեն. Երիտասարդ բայթը երիտասարդ հասցեի եւ անցումային հրամանի օրենսգրքի համար 940C

0000002B. BE1F OUT 0x3F, R1- ից I / O Տեղադրում

Այս զրոյական 0x3f հասցեի ձայնագրում, եթե տեսնում եք I / O դիտում սյունը, ապա կտեսնեք, որ 0x3F հասցեն SREG - Flag Reg Renget Renderler- ի հասցեն է: Նրանք: Մենք վերականգնում ենք SREG- ը `ծրագիրը զրոյական պայմաններում գործելու համար:

1 2 3 4 + 0000002C. E5CF LDI R28.0x5F բեռի անհապաղ + 0000002D: E0D4 LDI R29.0x04 բեռը անհապաղ + 0000002E: B29 Out to I / O Տեղադրում + 0000002F:

0000002C. E5CF LDI R28.0x5F բեռը անհապաղ + 0000002D: E0D4 LDI R29.0x04 բեռը անհապաղ + 0000002E: B29 Out to I / O Տեղադրում + 0000002F: B28 Out I / O Տեղադրում

Սա բողոքի ցուցիչի բեռնումն է: Ուղղակի առաքում I / O գրանցամատյաններում չի կարող, միայն միջանկյալ գրանցամատյանով: Հետեւաբար, առաջին LDI- ն միջանկյալում, իսկ հետո այնտեղից, I / O- ում: Ես ձեզ ավելի շատ կճանաչեմ պարկի մասին: Միեւնույն ժամանակ, հայտնի է, որ սա այնպիսի դինամիկ հիշողության տարածք է, որը կախված է RAM- ի վերջում եւ պահպանում է հասցեները եւ միջանկյալ փոփոխականները: Այժմ մենք մատնանշեցինք, թե որտեղ ենք ունենալու կեռ:

00000032: 940c0041 JMP 0x00000041 Անցնել

Անցնել Saaaeeee ծրագրի ավարտին, եւ այնտեղ մենք ունենք ընդհատումների արգելք եւ ամուր տեղավորվում ինքնուրույն:

1 2 +00000041: 94F8 CLI Գլոբալ ընդհատման անջատումը +00000042. CFFF RJMP PC-0x0000 հարաբերական ցատկ

00000041: 94F8 CLI Global ընդհատման անջատման +00000042. CFFF RJMP PC-0x0000 հարաբերական ցատկ

Սա անկանխատեսելի հանգամանքների դեպքում է, ինչպիսիք են ելքը հիմնական գործառույթից: Նման հանգույցից վերահսկիչը կարող է ցուցադրվել կամ ապարատային վերակայմամբ, կամ, հավանաբար, պահոցից դուրս գալը `պահակախցիկ: Դե, կամ, ինչպես ես վերը ասացի, շտկեք այս տեղերը Hex- ի խմբագրիչի եւ երթուղղման մեջ, որտեղ մենք հոգի ունենք: Ուշադրություն դարձրեք նաեւ այն փաստին, որ կան երկու տեսակի JMP եւ RJMP անցումներում Առաջինը ուղիղ անցում է հասցեի: Այն տեւում է չորս բայթ եւ կարող է ուղղակիորեն անցնել հիշողության տարածքում: Անցումային երկրորդ տեսակը - RJMP - հարազատ: Նրա թիմը տեւում է երկու բայթ, բայց անցումն այն կատարում է ընթացիկ դիրքից (հասցեներից), 1024 քայլով առաջ կամ հետընթաց: Եվ իր պարամետրերում նշված է օֆսեթը ներկայիս կետից: Օգտագործվում է ավելի հաճախ, որովհետեւ Բլուշում երկու անգամ ավելի քիչ տեղ է պահանջվում, եւ երկարատեւ գործոնները հազվադեպ են անհրաժեշտ:

1 +000034: 940c0000 JMP 0x00000000 Անցնել

00000034: 940c0000 JMP 0x00000000 Անցնել

Եվ սա ցատկում է օրենսգրքի հենց սկզբում: Վերագործարկեք մի տեսակ: Կարող եք ստուգել, \u200b\u200bբոլոր վեկտորները ցատկում են այստեղ: Այս ելքից - Եթե թույլ եք տալիս թույլ տալ ընդհատումներ (դրանք լռելյայն արգելվում են) եւ ձեզ ընդհատվելու են, որ ծրագիրը կլինի ծրագրի վերաբեռնումը:

Հիմնական գործառույթ: Ամեն ինչ նման է, դուք նույնիսկ չեք կարող նկարագրել: Նայելով պարզապես գրանցամատյաններին արդեն հաշվարկել է թիվը: PREPROCORITEM COMMILER TAXIS !!! Այնպես որ, ոչ «կախարդական» համարներ:

1 2 3 4 5 6 7 8 9 10 11 12 <

00000036: E383 LDI R24.0x33 բեռը անհապաղ +000037: B989 Out 0x09, R24 Out to I / O Տեղադրում 15: UBRRH \u003d HI (Bauddivider); +000038: BC10 Out 0x20, R1 Out to I / O Տեղադրում 16: UCSRA \u003d 0; +000039: B81B Out 0x0B, R1 Out to I / O Տեղ 17: UCSRB \u003d 1<

Եվ ահա JAMM- ը.

1 2 3 + 0000003E: E080 LDI R24.0x00 բեռը անհապաղ + 0000003F: E090 LDI R25.0x00 բեռը անհապաղ +00000040: 9508 Ret Subroutine Return

0000003E: E080 LDI R24.0x00 բեռի անհապաղ + 0000003F: E090 LDI R25.0x00 բեռը անհապաղ +00000040: 9508 Ret Subroutine Return

Հարցին, թե ինչու է այս բաղադրիչը ավելացնում այդպիսի Topmaster- ը: Եվ սա ոչ այլ ինչ է, քան 0-ը, ապա մենք նույնականացնենք որպես հիմնական հիմնական (անվավեր): Այսպիսով, չորս բայթ չհասկացա, թե ինչն է անում, բայց եթե անվավեր հիմնական (անվավեր) Փենսագրությունը կլինի: Ինչ ասում են, որ մենք ոչինչ չենք վերադարձնում հիմնական գործառույթին: Ընդհանրապես, դա արեք ձեզ նման :)

Բարդ? Թվում է, թե ոչ: Ես բաց թողնում եմ քայլ առ քայլ կատարումը ապամոնտաժման ռեժիմում եւ pokery- ը, քանի որ պրոցեսորը կատարում է անհատական \u200b\u200bցուցումներ, որոնք տեղի են ունենում գրանցամատյանների հետ: Ինչպես տեղափոխվել հրամաններ եւ վերջնական օղակ:

Շարունակությունը հաջորդում է մի քանի օրից ...

Հիասքանչ
Alexei78: Gang a Fixing plugger firefox- ի դյուրացման նավարկություն իմ կայքում եւ ֆորումում:
Քննարկում եւ ներբեռնում

Ծրագրավորման համար AVR Microcontrollers, կան զարգացման շատ գործիքներ, սակայն ամենատարածվածը, անկասկած, պետք է ճանաչվի փաթեթ AVR ստուդիա: , Նման ժողովրդականության համար կան մի շարք պատճառներ. Սա անվճար փաթեթ է, որը մշակվել է ընկերության կողմից Մթերք , Այն համատեղում է տեքստի խմբագիրը, հավաքիչը եւ սիմուլյատորը: AVR Studio փաթեթը օգտագործվում է նաեւ ապարատի ամրագրման հետ միասին: Առաջարկվող հոդվածում օրինակները հաշվի են առնում տեխնիկայի փաթեթը աշխատելու համար, ինչը կօգնի սկսնակ ծրագրավորողներին հասկանալ AVR ստուդիայի անհատական \u200b\u200bբաղադրիչների փոխգործակցությունը:

Հոդվածի հաջորդ մասում նկարագրվելու է SI- ում գրված ծրագրերի AVR ստուդիայի միջավայրում կարգաբերելու մասին:

AVR Studio փաթեթն ունի զարգացման ամուր պատմություն, որն արտացոլվում է առկա վարկածների քանակով: 2003 թվականի վերջին թողարկվել է 4.08 տարբերակը, որն ունի մի շարք օգտակար լրացումներ, եւ 2004 թվականի սկզբին թողարկվել է թարմացում (Service Pack 1) ընտանիք: Այս ընտանիքի չիպերի արտադրությունը նշանակված է 2004 թվականի երկրորդ կեսին:

Փաթեթի բաշխումը եւ սպասարկման փաթեթը կարելի է ներբեռնել www.atmel.com կայքից կամ ստանալ CD այս բաշխմամբ մթնոլորտի ռուս դիստրիբյուտոր:

AVR Studio փաթեթի աշխատանքը հարմարավետորեն վերանայվում է ցանկացած հատուկ ծրագրի վրա: Որպես կարծիք, մենք կքննարկենք ամենապարզ ծրագրի համար նախագիծ ստեղծել, որն իր հերթին կլինի երկու LED- ների: Միանշանակ, վերցրեք միկրոկրիկ ATMEGA128: 31 եւ 32-րդ եզրակացություններում երկու LED- ները միացրեք (Սրանք նավահանգիստների 6 եւ 7-ի բիթերը 6 եւ 7-ն են): AVR կարգավորիչներ Ունեն հզոր ելքային կասկադներ, յուրաքանչյուր արտադրանքի բնորոշ հոսանքը 20 մա է, առավելագույն ելքային հոսանքը 40 մա է, եւ դա վերաբերում է ինչպես հոսող, այնպես էլ հոսող հոսանքի: Մեր օրինակում LED- ները կապված են անոդների հետ `վերահսկիչի եզրակացություններին, իսկ մորթուց դիմադրիչների միջոցով կաթոդերը միացված են գետնին: Սա նշանակում է, որ LED- ն բոցավառվում է «1» կերակրման համապատասխան պորտային արտադրանքին: Սխեմատիկ դիագրամը ցուցադրվում է գործիչում: Դիագրամը նաեւ ցույց է տալիս երկու կոճակները, որոնք պետք է օգտագործվեն ծրագրերից մեկում:

Այստեղ տեղին է փոքր շեղվեր պատրաստել `ամենապարզ օրինակով չիպի տեսակ ընտրելու մասին: Իրոք, առաջին հայացքից կարող է տարօրինակ թվալ, թե ինչու պետք է այդպիսի հզոր բյուրեղը 64-PIN- ի դեպքում, որտեղ կա բավարար 8-PIN չիպ Attiny12: ? Այնուամենայնիվ, այս մոտեցման մեջ կա տրամաբանություն: Հայտնի է, որ գրեթե ցանկացած AVR վերահսկիչի հիմքում ընկած է նույն միջուկը: Ընդհանրապես, կարգավորիչները տարբերվում են հիշողությամբ, I / O նավահանգիստների քանակը եւ ծայրամասային մոդուլների մի շարք: Յուրաքանչյուր հատուկ վերահսկիչի առանձնահատկություններ - պարտադիր տրամաբանական անուն / ելքային գրանցամատյաններ ֆիզիկական հասցեներին, ընդհատվող վեկտորների հասցեները, նույնականացնելով պորտային բիթերը եւ այլն: Նկարագրվում է Extension.inc- ով ֆայլերում, որոնք ներառված են AVR Studio փաթեթում: Հետեւաբար, բյուրեղի որոշակի տիպի օգտագործմամբ, կարող եք կարգաբերել ծրագիրը, ինչպես ինքն իրեն, եւ ցանկացած ավելի երիտասարդ բյուրեղի համար: Ավելին, եթե դուք օգտագործում եք առավել ավագ բյուրեղը, որպես կարգաբերում, այսօր այն մթնոլորտ է, դուք կարող եք կարգաբերել ծրագիր գրեթե ցանկացած AVR վերահսկիչի համար, պարզապես անհրաժեշտ է օգտագործել ապարատային միջոցներ, որոնք բացակայում են թիրախային միկրոկրոլլերից: Այսպիսով, օրինակ, դուք կարող եք կարգաբերել այն ծրագիրը, որը պետք է իրականացվի ATMEGA128- ում Attiny13: , Այս դեպքում աղբյուրի ծածկագիրը կմնա գործնականում նույնը, միայն 128DEF.inc- ով միացված ֆայլի անվանումը կփոխվի TN13DEF.inc- ում: Այս մոտեցումը ունի նաեւ իր առավելությունները: Օրինակ, «Լրացուցիչ» I / O նավահանգիստները կարող են օգտագործվել միանալու համար: LCD ցուցիչ որը կարող եք հետ վերցնել կարգաբերման տեղեկատվությունը: Կամ, օգտագործեք Intrahemum emulator, որը միանում է Atmega128 chip- ի JTAG նավահանգիստին (Attiny13 վերահսկիչը չունի այս նավահանգիստը): Այսպիսով, հնարավոր է օգտագործել մեկ կարգաբերման տախտակ, որի վրա տեղադրված է «ավագ» AVR վերահսկիչ, կարգաբերելու նոր մշակված ցանկացած համակարգ, բնականաբար, հիմնված AVR միկրոկոնտրոլների վրա: Այս տախտակներից մեկը կոչվում է որպես մեգամ: Դա այն էր, որ օգտագործվել է հոդվածում տրված ծրագրերի օրինակներ ստեղծելու համար: Սա ունիվերսալ մեկ տախտակի վերահսկիչ է, որը հիմնված է ATMEGA128 չիպի վրա, որը պարունակում է արտաքին RAM, երկու նավահանգիստ RS-232. , LCD ցուցանիշը միացնելու համար, Intrahemnoe ծրագրավորող եւ emulator JTAG ICE- ում , Խորհուրդը նաեւ տեղ ունի Flash-Rom շարքի չիպը բաժանելու համար At45 Տանիքում tsop32 / 40/48 եւ երկկողմանի շարքի DAC AD5302 / AD5312 / AD5322 , Այժմ, AVR հրեշի օգտագործման պատճառները բացատրելուց հետո զույգ Swatodiodes- ը բոցավառելու համար կարող եք ավելի առաջ գնալ:

AVR ստուդիայի միջավայրում ծրագրավորելիս անհրաժեշտ է կատարել գործողությունների ստանդարտ հաջորդականություն.

  • կազմող
  • Ծրագրի ստեղծումը սկսվում է Ծրագրի ընտրությունից \\ Նոր Ծրագրի ընտրացանկ: «Ստեղծեք նոր նախագիծ» պատուհանում, որը բացում է, դուք պետք է նշեք ծրագրի անվանումը, (մեր դեպքում `Sample1) եւ նախնական ֆայլի անվանումը: «Հաջորդ» կոճակը սեղմելուց հետո ընտրված կարգաբերման պլատֆորմը եւ սարքի պատուհանը բացվում են, որտեղ ընտրվում է կարգաբերման պլատֆորմը (սիմուլյատոր կամ էմուլյատոր):

    Դուք կարող եք ընտրել առաջարկվող ներխուժող էմուլյատորներից մեկը, մենք նշում ենք, որ յուրաքանչյուր emulator- ն ունի իր սեփական ցուցակը, որն ապահովված է: Քննարկվող օրինակի համար մենք ընտրում ենք որպես կարգաբերման պլատֆորմ AVR սիմուլյատոր եւ մթնոլորտային 128 չիպ: «Ավարտել» կոճակը սեղմելուց հետո մեր արտադրանքը հայտնվում է AVR Studio փաթեթի աշխատանքային պատուհանները, մինչդեռ դատարկ է: Այն հետեւում է ճիշտ պատուհանից `ծրագրի աղբյուրի տեքստը տեղադրելու համար: Դա կարելի է անել երկու եղանակով կամ հավաքել ամբողջ տեքստը ուղղակիորեն խմբագրի պատուհանում կամ ներբեռնել գոյություն ունեցող ֆայլ: Ստորեւ ներկայացված է ամենապարզ ծրագրի ամբողջական տեքստը `մեկնաբանություններով:

    ; Օրինակ «LED հսկողություն»; Գրված է AS-Megam Debug Board- ի համար. Պարամետրերի գեներատորի հաճախականությունը 7.37 ՄՀց է. LED- ները միացված են PD6 եւ PD7 եզրակացություններին եւ դիմադրիչների միջոցով `ընդհանուր մետաղալարով: ; Միացնելով ATMEGA128 Circuit I / O մանրամասները File "M128DEF.INC"; Սկիզբ ծրագրի սկիզբը. Առաջին գործողություն - կեռի սկզբնավորում; Եթե \u200b\u200bդա չի արվել, ապա կանչեք ենթախույզ կամ ընդհատեք. չի վերադարձնի վերահսկողությունը. Կոշիկի վերջում ցուցիչը դրված է ներքին RAM- ի վերջին հասցեին - Ramend LDI R16, Low (Ramend) Out Spl, R16 LDI R16, High (Ramend) SPH, R16; PD6- ի եւ PD7 եզրակացությունների հետ կապված LED- ները վերահսկելու համար. Անհրաժեշտ է հայտարարագրել այս եզրակացությունների արդյունքը: ; Դա անելու համար «1» գրեք DDRD գրանցամատյան (DATACIRECTEN) համապատասխան բիտերին (DATACIRECENCE) LDI R16, (1)<<6) | (1<<7) out DDRD,r16 ; основной цикл программы loop: ldi r16,(1<<6) ; светится один светодиод out PORTD,r16 rcall delay ; задержка ldi r16,(1<<7) ; светится второй светодиод out PORTD,r16 rcall delay ; задержка rjmp loop ; повторение цикла; процедура задержки; примерно полсекунды при частоте 7,37 МГц; три пустых вложенных цикла соответственно delay: ldi r16,30 ; 30 delay1: ldi r17,200 ; 200 delay2: ldi r18,200 ; и еще 200 итераций delay3: dec r18 brne delay3 dec r17 brne delay2 dec r16 brne delay1 ret ; возврат в главную программу

    Նախագիծը կարող է բաղկացած լինել մի քանի ֆայլերից, մինչդեռ մեկ ֆայլ նշանակվում է հիմնականը: Բոլոր գործողությունները հարմար են արտադրելու մկնիկի համատեքստի կոճակը: Աղբյուրի ֆայլը միացնելուց հետո պատուհանները ունեն հետեւյալ ձեւը:

    Ծրագրի կազմումը կատարվում է \\ project \\ Կառուցելու հրամանով կամ սեղմելով F7 կոճակը: Կազմման գործընթացը ցուցադրվում է «Արդյունք» պատուհանում: Այս պատուհանը կարող է լինել «քաշում» \\ դիտման հրամանը:

    Սկզբունքորեն, մենք արդեն ստացել ենք ելքային ֆայլ ձեւաչափով: Hex- ը, որն արդեն կարող է բեռնվել միկրոկրիկիտի մեջ եւ պահպանել LED- ների հոգաբարձուները: Այնուամենայնիվ, հոդվածի նպատակը AVR ստուդիայի միջավայրում աշխատանքի ամբողջական ցիկլը ցույց տալն է, ուստի մենք գնում ենք կարգաբերման փուլ: Դա արվում է \\ Debug \\ Start Debugging Team- ի կողմից:

    Այժմ «Սիմուլյատորի ընտրանքներ» պատուհանում սահմանել քվարց հաճախության հաճախականությունը `« սիմուլյատորի ընտրանքներ »պատուհանում, որպեսզի ճշգրիտ չափեք ծրագրի կատարման ժամանակը:

    Մնացած ընտրանքները պետք է մնան անփոփոխ: Այժմ դուք կարող եք կատարել ծրագիր քայլ առ քայլ ռեժիմով `օգտագործելով մկնիկը կամ F11 կոճակը:

    AVR Studio փաթեթը պարունակում է հզոր գործիքներ, ներքին գրանցամատյանների վիճակը դիտելու եւ խմբագրելու համար `Debugged MicroconTroller- ի, ինչպես նաեւ ժամանակի, ծրագրի կատարման ժամանակ: Նրանց հասանելիությունն իրականացվում է «I / O» պատուհանի միջոցով:

    Փաստորեն, AVR Studio փաթեթի միջոցով Windows- ի դիտման միջոցով մատչելի տեղեկատվության քանակը այնքան մեծ է, որ անհրաժեշտ է համակարգիչ օգտագործել երկու մոնիտորի կազմաձեւով `առավելագույն հարմարավետություն ստանալու համար:

    Մեր օրինակը կարգաբերելու համար, նավահանգիստների բիթերը մուտք գործելու համար հարկավոր է բացահայտել I / O ATMEGA128 տողը, ապա պորտուգարան: Այժմ տեսանելի են այս նավահանգստի, պորտի, DDRD- ի եւ Pind- ի բոլոր երեք գրանցամատյանները: Արժեքի, բիթերի եւ հասցեի դաշտերը տեսնելու համար դուք պետք է ընդլայնեք պատուհանի ճիշտ սահմանը, ծրագրի աղբյուրի տեքստով քրտնելով պատուհանը:

    Այժմ, անցնելով ծրագիրը քայլ առ քայլ ռեժիմով, կարող եք տեսնել այս գրանցամատյանների ներկայիս պետությունների փոփոխությունը Bits ոլորտում: Հնարավոր է արագ փոխել նավահանգստի գրանցամատյանների ցանկացած բիթի վիճակը, եւ դա կարելի է անել կամ արժեքային դաշտում նոր կոդ գրելով, կամ ուղղակիորեն սեղմելով գրանցամատյանի ցանկալի բիթը:

    Անկախ վարժությունների համար առաջարկվում է հետեւյալ ծրագիրը, որը տարբերվում է նախորդից, որ LED- ների բոցավառումը վերահսկվում է երկու կոճակով:

    ; Օրինակ «LED հսկողություն կոճակներից»; Գրված է AS-Megam Debug Board- ի համար. LED- ները միացված են PD6 եւ PD7 եզրակացություններին եւ դիմադրիչների միջոցով `ընդհանուր մետաղալարով: ; Կոճակներ - PE4 եւ PE5- ում: «M128DEF.INC»; Սկիզբ Հիմնական ծրագիրը. Stack սկզբնականացում LDI R16, ցածր (Ramend) Out Spl, R16 LDI R16, բարձր (Ramend) Out SPH, R16; LED LED- ների սկզբնավորում R16, (1<<6) | (1<<7) out DDRD,r16 ; инициализация выводов, к которым подключены кнопки (на вход) ; внутренние подтягивающие резисторы подключены; для этого в PORTE нужно установить соответствующие биты в единицы ldi r16,(1<<4) | (1<<5) out PORTE,r16 ; а в DDRE - в нули ldi r16,0 out DDRE,r16 ; бесконечный цикл forever: in r16,PINE ; теперь в r16 находится текущее "состояние" кнопок com r16 ; кнопка "нажимается" нулем, поэтому инвертируем регистр lsl r16 ; переносим биты 4,5 в позиции 6,7 lsl r16 ; и обновляем "показания" светодиодов andi r16,(1<<6) | (1<<7) out PORTD,r16 rjmp forever ; цикл выполняется бесконечно

    Այսպիսով, ամենապարզ ծրագրերի օրինակով ցուցադրվում են AVR ստուդիայի փաթեթի որոշ առանձնահատկություններ: Անհրաժեշտ է հասկանալ, որ սա միայն առաջին ծանոթությունն է, որը թույլ է տալիս արագորեն օգտվել հիմնական փաթեթի հրամաններով: Մինչդեռ հաշվի առնելով փաթեթի հնարավորությունները շատ ավելի լայն են: Օրինակ, այստեղ կարող եք կարգաբերել բարձր մակարդակի լեզուներով գրված ծրագրեր: Մասնավորապես, ImageRaff ընկերության C- կազմողը օգտագործում է AVR ստուդիայի կարգաբերիչը «որպես բնիկ»: Դա անելու համար, աղբյուրի կոդը կազմելիս անհրաժեշտ է սահմանել ելքային ֆայլերի ստեղծման տարբերակը AVR ստուդիայի հետ համատեղելի ձեւաչափով: Միեւնույն ժամանակ, հնարավոր է կարգաբերել աղբյուրի կոդերում:

    AVR Studio փաթեթի բազմաթիվ բնութագրերից մեկը արտաքին ծրագրերը միացնելու ունակությունն է: Օրինակ, ապահովելու համար, որ AS2 տեսչական ծրագրավորողը անհրաժեշտ է մի քանի պարզ գործողություններ կատարելու համար:

    Հիմնական պատուհանի AVR ստուդիայի գործիքների ընտրացանկում դուք պետք է ընտրեք հարմարեցված;

    Անհատականացման պատուհանում ընտրեք գործիքների կետը.

    Կրկնակի սեղմելով մկնիկի կոճակը կամ սեղմելով ստեղնաշարի վրա տեղադրեք, ցուցակի նոր հրաման ավելացնել եւ այն անվանել «AS2 ծրագրավորող»;

    Նշեք ծրագրավորողի գործադիր ֆայլի ուղին `այն ուղղակիորեն մուտքագրելով« Հրաման »մուտքային դաշտում կամ կտտացնելով« ... »կոճակը այս ոլորտի աջ կողմում.

    Այժմ գործիքների ցանկը հայտնվում է «Ծրագրավորող AS2»:

    AVR Studio 4.08 փաթեթը թույլ է տալիս ձեզ միացնել օժանդակ ծրագրեր `plugins: AVR Studio- ի առաջին plugin- ը գրաֆիկական խմբագրիչի ծրագիր է, որը պարզեցնում է LCD ցուցանիշի սկզբնավորման գործընթացը, որը կարող է ուղղակիորեն ղեկավարել AVR վերահսկիչ ATMEGA169- ը: LCD ցուցիչի առավելագույն տրամաբանության չափը 100 հատված է, ցուցանիշի յուրաքանչյուր տարրը կատարվում է վերահսկիչի հատուկ ռեգիստրում: Յուրաքանչյուր հատվածի համար որոշակի բիտերի սովորական պարտադիր կարգը պարզեցնելու համար կարող եք օգտագործել վերը նշված ծրագիրը:

    Այցելելիս «AVR- ի հայրենիք» - «Մթնոլորտի» նորվեգացի գրասենյակը, հոդվածի հեղինակներից մեկը, զրուցել է Լարսի quener- ի հետ, ծրագրավորող խմբի ղեկավար, որը ստեղծեց եւ աջակցում է AVR Studio փաթեթին: Այս մարդը, դասական ծրագրավորող, մորուքով, սվիտերով եւ գուլպաներ սանդալներ հյուսված, խոսեց փաթեթի զարգացման հեռանկարների մասին: Հաջորդ տարբերակի վրա (4.09) ինտերֆեյսը հնարավորություն կտա նոր ներխուժել էմուլյատորի համար `JTAGICE MKII (այն կոչվում է նաեւ JTAGICE2), որը տարվա երկրորդ կեսին կփոխարինի jtagice- ում: Այս emulator- ն ունի երկու էական տարբերություն: Մի կողմից, աջակցել աջակցությանը `փոքր մետաղալարերի կարգաբերման ինտերֆեյսի համար` ավելի երիտասարդ AVR վերահսկիչների, Debugwire- ի համար: Այս ինտերֆեյսը հետաքրքիր է, քանի որ այն իր աշխատանքի համար չի գրում միկրոկոնտրոլերի լրացուցիչ եզրակացություններ, քանի որ այն օգտագործում է վերափոխման միկրոկոնտրոլերի ելքը: Մյուս կողմից (դուք կարող եք հասկանալ այս արտահայտությունը բառացիորեն), At Jtagice2- ում Emulator- ը կհայտնվի, վերջապես, USB ինտերֆեյսը համակարգչի հետ շփվելու համար:

    Գրականություն

    1. AVR տեխնիկական ուսուցում Տեխնիկական սեմինարի նյութեր: Մթնոլորտ: Նորվեգիա. Deceptber 2003:
    2. Նիկոլայ Կորոլեւ, Դմիտրի Կորոլեւի ավիոկրատական \u200b\u200bերկրորդ սերնդի. Մշակողի միջավայրը: // Բաղադրիչներ եւ տեխնոլոգիաներ, 2003 թ. 7
    3. Երկրորդ սերնդի AVR-Microcontrollers. Նոր ապարատային հնարավորություններ // Բաղադրիչներ եւ տեխնոլոգիաներ: 2003 թ. Թիվ 4.
    4. Նիկոլայ Կորոլեւ, Դմիտրի Կորոլեւ: AVR Microcontrollers. Մեծ է փոքր: // սխեման ", 2001, №5
    5. Նիկոլայ Կորոլեւ, Դմիտրի Կորոլեւ: AVR Microcontrollers. Ծրագրաշարեր // Բաղադրիչներ եւ տեխնոլոգիաներ, 2000. Թիվ 4.
    6. Նիկոլայ Կորոլեւ: AVR. Հեղինակային սարքավորումներ // Բաղադրիչներ եւ տեխնոլոգիաներ, 1999 թ. 1
    7. Նիկոլայ Կորոլեւ: Atmel Risc-Microcontrollers // Chip-News 1998, №2
    8. Նիկոլայ Կորոլեւ, Դմիտրի Կորոլեւ ԱՎՌ. Ընկերության նոր 8-բիթանոց առասպելկոնտոններ Atmel // Microprocessor Review, 1998, №1

    Ինչ-որ կերպ անմիջապես քաշեց խորհուրդներ տալու AVR վերահսկիչների ծրագրավորման միջավայրի ընտրության վերաբերյալ: Պարզապես մի նետեք սպորտային կոշիկներ: Ես մի փոքր մի փոքր եմ

    Լեզուներ Ծրագրավորում Microcontrollers շատ բան: Ծրագրավորման լրատվամիջոցները նույնպես բավարար չեն եւ դրանք սխալ են համեմատվում: Ծրագրավորման ավելի լավ լեզուներ չկան: Այսպիսով, դուք պետք է ընտրեք ամենահարմար լեզուն ձեզ համար եւ ծրագրավորման միջավայրի համար:

    Եթե \u200b\u200bայս պահին եք, կանգնեք ընտրության առջեւ, թե ինչ սկսել աշխատել, ահա մի քանի առաջարկություններ:

    Նախկին ծրագրավորման փորձ: Մի անտեսեք ծրագրավորման նախկին փորձը: Նույնիսկ եթե դա Բայիս էր: Նույնիսկ եթե դա երկար ժամանակ էր դպրոցում: Ծրագրավորում, ինչպես հեծանիվ վարելը, դուք պարզապես պետք է սկսեք եւ արագ հիշեք, որ մոռացված ամեն ինչ: Սկսեք բեյնիկայից `աննկատելի, ավելի ուշ ավելի հեշտ կլինի ընտրել ձեր նպատակների համար ավելի հարմար բան:

    Օգնեք շրջակա միջավայրին:Ձեր ընկերները գրում են pascal- ում: Քեզ համար հարցը լուծված է. Գրեք pascal- ում: Դուք միշտ կօգնեք Խորհրդի հարցում, գրադարանները նետվելու են գրադարաններ, կտան պատրաստի նախագծեր: Ընդհանուր առմամբ, երջանիկ կվերցվեն իրենց համայնք: Եթե \u200b\u200bընդհակառակը անում եք, հակառակ արդյունքը ստացեք: Ընկերներ Sishers զվարճացնում եք ձեզ, ովքեր որոշել են ուսումնասիրել հավաքիչը: Մի սպասեք օգնության:

    Լավ AVR ծրագրավորման գիրք Դա շատ լավ կօգնի: Դժբախտաբար, դրանցից շատ քիչ են: Եթե \u200b\u200bձեր ձեռքերում գիրք ունեք, եւ կարծում եք, որ դրանում ամեն ինչ շատ մատչելի է: - Փորձեք: Ես չեմ խորհուրդ տալիս էլեկտրոնային գրքերով սովորել, որպես վերջին միջոց, տպագիր: Շատ անհարմար է ֆայլի ֆայլի շրջակա միջավայրի եւ տեքստի միջեւ անցնելու համար: Գիրքը շատ ավելի հաճելի ընթերցումն անմիջապես փորձեք առանց շեղվելու, բացի այդ, կարող եք ցուցանիշ դնել դաշտերում, գրեք առաջացած գաղափարները:

    Ծրագրավորման միջին ավելի պարզ: Եթե \u200b\u200bկա ձեր լեզվական ծրագրավորման մի քանի ծրագրերի ընտրություն, մի կասկածեք, ընտրեք այն, ինչը ավելի հեշտ է: Թող դա պակաս գործառույթ լինի: Թող այն կազմի վախկոտ ուռճացված կոդ: Հիմնական բանը պարզապես սկսելն է: Պարզ միջավայրում նիհար լինելուց հետո հեշտությամբ կանցնեք ավելի առաջադեմ եւ «ճիշտ» միջավայր: Եվ մի լսեք նրանց, ովքեր ասում են, որ ավելի շատ ժամանակ կկորցնեք, դրանք սխալ են: Կրտսեր դասերի աշակերտներին չի պահանջվում կարդալ «պատերազմ եւ խաղաղություն», որոնք նրանց ավելի հեշտ են տալիս գրքեր `նկարներով:

    Գրադարաններ: Գրադարանների առկայությունը վիճահարույց է լեզուն սովորելու համար: Իհարկե, ավելի ուշ նրանք մեծապես հեշտացնում են կյանքը, բայց սկզբում «սեւ արկղերը» անհասկանալի են եւ ոչ շատ օգնում են լեզվի ընկալմանը: Մյուս կողմից, դա ավելի հեշտ է դարձնում ծրագիրը կարդալ եւ թույլ տալ նորեկ, ոչ թե առանձնապես լարված, կառուցել բարդ ծրագրեր: Այնպես որ, նրանց ներկայությունը առանձնապես ձանձրանում է: Գոնե սկզբում:

    Արդյունավետ կոդ: Ծրագրավորման միջավայրի ընտրությունը `ծրագրավորումը ուսումնասիրելու համար միայն այն բանի միջոցով, թե որքանով է արդյունավետ գաղափարը` կազմը վատ գաղափար: Հիմնականում դուք հարմարավետորեն սկսում եք սովորել, որ տասներորդը «ելքի ժամանակ» է: Իհարկե, հետագայում կարող եք աշխատել դրա վրա:

    Վիզարդ:Crystal- ի տախտակի վրա ցանկացած սարք պետք է կազմաձեւվի նավահանգիստների միջոցով: Ընթացակարգը բավականին վառ է, եւ պահանջվում են տվյալների շտեմարան: Բացի այդ, կան նրբություններ, որոնցում նորեկը ոչ միայն տալիս է: Հետեւաբար, միջինում այն \u200b\u200bշատ ցանկալի է վիզարդսի ներկայության համար: Ազատություններն ավտոմատ SPI են, I2C, USART եւ այլն: Ավտոմատ ճշգրտումներ: Որքան ավելի շատ սարքեր են աջակցվում, այնքան լավ: Բացահայտեք անհրաժեշտ ծայրամասային պարամետրերը, եւ վիզարկն ինքնին ստեղծում է կոդ, որը կտրամադրի նշված պարամետրերը: Շատ պարզեցնում է կյանքը:


    Ընդհանուր առաջարկություններ Նախնական փուլում այդպիսի ծրագրավորում պետք է լինի հնարավորինս պարզ (նույնիսկ եթե պարզունակ): Ծրագրավորման միջավայրը պետք է հեշտ լինի սովորել (ինչպես անհրաժեշտ է, սկսեք, սովորեք ծրագրավորում եւ ժամանակ վատնել պարամետրերը ընտրելու համար): Խորհուրդ է տրվում Ռուսաստանին: Նաեւ չի կանխում ռուսական ձեռնարկը եւ ծրագրերի օրինակները: Միջնորդությունից բյուրեղի որոնվածի հնարավորությունը ցանկալի է: Հաջորդը, ծրագրավորման հիմունքները թողնելիս կարող եք շարժվել ավելի բարդ կճեպներով:


    Վերջապես, մեկ այլ առաջարկություն, աշխատեք իսկական բյուրեղի հետ: Մի վախեցեք այրել այն: Բարելավել գործնական փորձը: Աշխատելով էմուլյատորների հետ (օրինակ, Proteus), չնայած այն կազատի զոդող երկաթից, բայց երբեք չի կարողանա տալ գոհունակությունը, որը կստանաք վաստակած ծրագրից, առաջին գորգերը, առաջին գորգերը: Հասկանալով, թե ինչ եք արել ձեր սեփական ձեռքերով, իրական աշխատանքային միացումն անվստահություն եւ խթան կհանգստանա:

    (Այցելել է 7 377 անգամ, 1 այց այսօր)

    Ծրագրավորողի հայեցակարգը LPT պորտում ներկայացված է գործիչում: Որպես անվադողեր նախկին օգտագործեք 74ac 244 կամ 74HC244 չիպ (K1564AP5), 74LS244 (K5555AP5) կամ 74ALS244 (K1533AP5):

    VD1 LED- ն ցույց է տալիս միկրոկոնտոլերի ձայնագրման ռեժիմ,

    vD2 LED - Ընթերցանություն,

    vD3 LED - դիագրամի առկայություն:

    Սխեման աշխատելու համար պահանջվող լարման տեւում է ISP միակցիչից, այսինքն: ծրագրավորվող սարքից: Այս սխեման վերամշակված STK200 / 300 ծրագրավորող է (հեշտ գործի համար ավելացված LED- ներ), ուստի այն համատեղելի է STK200 / 300 սխեմայով աշխատող բոլոր PC ծրագրավորողի ծրագրերի հետ: Այս ծրագրավորողի հետ աշխատելու համար օգտագործեք ծրագիր CVavr.

    Ծրագրավորողը կարող է իրականացվել տպագիր տպատախտակի վրա եւ տեղադրել այն LPT միակցիչ տանիքում, ինչպես ցույց է տրված նկարներում.




    Ծրագրավորողի հետ աշխատելու համար հարմար է օգտագործել նավահանգստի LPT Extensionnel- ը, որը հեշտ է ինքներդ ձեզ (օրինակ, տպիչի համար Cableronix մալուխից), հիմնականը «չզղջալով» Երկիր (միակցիչի 18-25 ոտքեր) կամ գնեք: Ծրագրավորողի եւ ծրագրավորվող միկրոկտրոնի միջեւ մալուխը չպետք է գերազանցի 20-30 սմ:

    Բարեւ, հարգելի Հավրարացիներ:

    Այս հոդվածում ես ուզում եմ պատմել այն մասին, թե ինչպես մի օր որոշեցի սկսել ծրագրավորել Microcontrollers, որն անհրաժեշտ էր դրա համար, եւ վերջում պարզվեց:

    Microcontrollers- ի թեման հետաքրքրում է ինձ երկար ժամանակ, 2001 թ. Ես ստիպված էի հետաձգել այս գործը մինչեւ լավագույն ժամանակները: Եվ այսպես, մի \u200b\u200bօր ես հայտնաբերեցի, որ լավագույն ժամանակները եկել են առանց տան լքելու, կարող եք գնել այն ամենը, ինչ ինձ անհրաժեշտ է: Ես որոշեցի փորձել: Այսպիսով, ինչ մեզ պետք է.

    1. Ծրագրավորող
    Շուկայում կան բազմաթիվ տարբերակներ `ամենաէժան ISP- ի (ներման ծրագրավորման) ծրագրավորողներից մի քանի դոլարով, մի քանի հարյուրի համար հզոր կարգաբերիչ ծրագրավորողներին: Առանց ավելի մեծ փորձի այս հարցում, նախ որոշեցի փորձել ամենադյուրին եւ ամենաէճնտնտեսությունից մեկը `Usbasp- ը: Ես միանգամից գնեցի eBay- ում 12 դոլարով, այժմ կարող եք գտնել նույնիսկ 3-4 դոլարով: Փաստորեն, սա ծրագրավորողի չինական տարբերակն է Թոմաս Ֆիշլից: Ինչ կարող եմ ասել նրա մասին: Միայն մեկ բան. Այն աշխատում է: Բացի այդ, մթնոլորտային եւ մթնոլորտային շարքի բավականին շատ վերահսկիչներ կան: Linux- ի տակ վարորդ չի պահանջում:

    Firmware- ի համար անհրաժեշտ է միացնել VCC, GND, RESET, SCK, MOSI, MISO ծրագրավորող արդյունքների համապատասխան միկրոկոնտրոլերների արդյունքների հետ: Պարզության համար ես հավաքեցի օժանդակ սխեման հենց տղամարդու վրա.

    Մնացել է տախտակի վրա `նույն միկրոկրոկոնտրոլը, որը մենք պատրաստվում ենք թռչել:

    2. Microcontroller
    Միկրոկոնտրոլերի ընտրությամբ ես առանձնապես չեմ անհանգստացրել եւ մթնոլորտից տեւել մթնոլորտից `23 I / O սոճու, երկու 8-բիթանոց ժամանակաչափեր, մեկ 16-բիթանոց, հաճախականությամբ, փոքր սպառումը (1-3.6 մ.) , էժան ($ 2): Ընդհանրապես, սկզբի համար `ավելին, քան բավարար:

    Linux- ի տակ `վերահսկիչի վրա որոնվածը կազմելու եւ ներբեռնելու համար, AVR-GCC + Avrdede Bundle- ն հիանալի աշխատում է: Տեղադրում աննշան: Հրահանգներին հետեւելը կարող եք տեղադրել այն ամենը, ինչ ձեզ հարկավոր է մի քանի րոպե հետո: Միակ նեոնները, որոնք պետք է վճարվեն - AVRDUDE (վերահսկիչի վրա ձայնագրման համար ծրագրակազմ) կարող է պահանջել գերծանրքաշային օգտագործողի իրավունք, ծրագրավորողին մուտք գործելու համար: Ելք - Գործեք Sudo- ի միջոցով (ոչ այնքան լավ գաղափար) կամ գրանցեք UDEV- ի հատուկ իրավունքներ: Սինտաքսը կարող է տարբեր լինել ՕՀ-ի տարբեր վարկածներով, բայց իմ դեպքում (Linux Mint 15) կատարվել է հետեւյալ կանոնը `ավելացնելով հետեւյալ կանոնը //41-Admega.rules ֆայլ:

    # USBASP ծրագրավորողի ենթաբազմություն \u003d\u003d «USB», Atte (Idvendor) \u003d\u003d «16C0», Att (idproduct) \u003d\u003d "05DC", Mage \u003d "0666"

    Դրանից հետո, բնականաբար, անհրաժեշտ է ծառայության վերագործարկում:
    Ծառայության UDEV վերագործարկումը:
    Դուք կարող եք կազմել եւ փայլել առանց որեւէ խնդիրների ուղղակիորեն հրամանի տողից (ով է կասկածելու), բայց եթե կան բազմաթիվ նախագծեր, ավելի հարմար է plugin- ը դնել եւ ամեն ինչ անել ուղղակիորեն խավարման միջավայրից:

    Windows- ի տակ ստիպված կլինեն փոխանցել վարորդին: Մնացած խնդիրներ չկան: Գիտական \u200b\u200bհետաքրքրության համար ես Windows- ում փորձեցի AVR Studio + Extreme Burner Bundle- ը: Կրկին ամեն ինչ աշխատում է խոպոպով:

    Մենք սկսում ենք ծրագրավորում

    Ծրագրավորող AVR վերահսկիչները կարող են լինել ինչպես EOMSBLER (AVR ASSEMBER) եւ C- ում: Այստեղ, ես կարծում եմ, որ բոլորը պետք է ինքնուրույն ընտրեն իր ընտրությունը, կախված հատուկ առաջադրանքից եւ դրա նախասիրություններից: Անձամբ ես առաջին անգամ սկսեցի հավաքում հավաքելը: Հավաքիչով ծրագրավորելիս սարքի ճարտարապետությունը ավելի պարզ է դառնում, եւ զգացմունքները հայտնվում են, որ դրանք փորում են ուղղակիորեն վերահսկիչի ներսում: Բացի այդ, ես հավատում եմ, որ մասնավորապես կրիտիկական ծրագրերում հավաքիչի իմացությունը կարող է շատ օգտակար լինել: AVR ASSEMBER- ին ծանոթանալուց հետո ես տեղափոխվում եմ Si- ում:

    Archit արտարապետությանը եւ հիմնական սկզբունքներին ծանոթանալուց հետո ես որոշեցի հավաքել օգտակար եւ հետաքրքիր բան: Աղջիկս օգնեց ինձ, նա շախմատ էր եւ մեկ գեղեցիկ երեկո հայտարարեց, որ ցանկանում է որոշ ժամանակ տրամադրել ժմչփ ժամացույց: Բոց Ահա դա `առաջին նախագծի գաղափարը: Հնարավոր էր պատվիրել դրանք նույն eBay- ում, բայց ես ուզում էի պատրաստել ձեր սեփական ժամացույցը, սեւով ... հա ... ic ուցանիշներով եւ կոճակներով: Ոչ շուտ, քան արվել է:

    Որպես ցուցադրություն, որոշվեց օգտագործել երկու 7-սեգմենտի դիոդի ցուցիչ: Վերահսկելու համար դա բավարար էր 5 կոճակ, «Խաղացող 1», «Խաղացող 2», «Վերականգնել», «պարամետր» եւ «Դադար»: Դե, մի մոռացեք խաղի ձայնային նշման մասին: Կարծես թե դա է: Ստորեւ բերված ցուցանիշը ցույց է տալիս միկրոկոնտրոլերը միկրոկոնտրոլերը ցուցիչների եւ կոճակների միացնելու ընդհանուր դիագրամին: Նրան պետք կլինի ծրագրի աղբյուրի կոդը վերլուծելիս.

    Colcessing չվերթ

    Սկսենք, ինչպես պետք է լինի, ծրագրի մուտքի կետից `հիմնական գործառույթները: Փաստորեն, դրանում ուշագրավ ոչինչ չկա `նավահանգիստներ, տվյալների նախաստորագրման եւ սեղմիչ կոճակների անսահման կոճակի տեղադրումը: Դե, SEI () զանգը ընդհատման վերամշակման որոշումն է, նրանց մասին մի փոքր ավելի ուշ:

    Int հիմնական (անվավեր) (նախաձեռնություն (); սկզբնական_դատա (); sound_off (); SEI (); իսկ (1);
    Յուրաքանչյուր գործառույթ համարեք առանձին:

    Void und_io () (// սահմանել ելքային DDRB \u003d 0xff; DDRD \u003d 0xff; // սահմանել մուտքային DDRC \u003d 0B00011111;<

    I / O նավահանգիստների կարգավորումը շատ պարզ է `DDRX- ի գրանցամատյանում (որտեղ X- ը նամակն է, նշելով նավահանգիստը) համարը, որի համար նախատեսված է համապատասխանող սարքը (համապատասխանում է 0-ին) մինչեւ 1): Այսպիսով, Seasushal- ը DDRB- ում եւ DDRD Number 0xFF- ում մենք պատրաստեցինք B եւ D ելքային նավահանգիստներ: Ըստ այդմ, DDRC \u003d 0B11100000 հրամանը; Port C- ի առաջին 5 նավահանգիստները վերածում են մուտքային կապի մեջ, իսկ մնացած հանգստյան օրերին: Team Portc | \u003d 0B00011111; Ներառում է ներքին խստացման դիմադրիչներ վերահսկիչի 5 մուտքի վրա: Ըստ սխեմայի, կոճակները միացված են այս ներմուծություններին, որոնք սեղմված են, դրանք փակվում են երկրի վրա: Այսպիսով, վերահսկիչը հասկանում է, որ կոճակը սեղմված է:

    Հաջորդը, դուք հետեւում եք երկու ժմչփերի, ժմչփի եւ ժամանակաչափերի պարամետրին: Մենք օգտագործում ենք առաջինը `թարմացնելու ցուցանիշները, իսկ երկրորդը` ժամանակի հաշվարկման համար, այն ամեն վայրկյան ձգձգմանը դնելուց հետո: Բոլոր հաստատունների եւ որոշակի ընդմիջման ժամանակաչափի մեթոդի մանրամասն նկարագրությունը կարելի է գտնել մթնոլորտային 8-ի փաստաթղթերում:

    Վերամշակում ընդհատումը

    ISR (ցուցադրում (); եթե ; Եթե (timer1 \u003d\u003d 0) process_timeoff ();) եթե (ակտիվիստական \u200b\u200b\u003d\u003d 2 && timer2\u003e 0) (ժամանակաչափ 2) process_timeoff ();

    Երբ ժմչփը հարուցվում է, վերահսկողությունը փոխանցվում է համապատասխան ընդհատման բեռնաթափմանը: Մեր դեպքում, սա timer0_ovf_vect պրոցեսորն է, որն առաջացնում է ցուցիչների ժամանակի ելքային ընթացակարգը եւ Timer1_compa_vect- ը, որը մշակում է հաշմանդամությունը:

    Եզրակացություն ցուցանիշներին

    Անվավեր ցուցադրում () (display_number ((timer1 / 60) / 10, 0B00001000); _delay_ms (0.25); display_number ((0.25) umber ((0.25) / 10, 0B00000010); _delay_ms (0.25); display_number ((ժամանակաչափ 60)% 10, 0B00000001); _delay_ms; display_number (0.25); display_number (0.25); display_number ((timer2) / 60)% 10, 0B01000000); _delay_ms (0.25); display_number ((ժամանակաչափ 60) / 10, 0B00100000); _ display_0)% 10, 0.25); _Delay_ms (0.25) ; portd \u003d 0;) անվավեր display_number (int համար, int դիմակ) (Portb \u003d number_mask (համարը); portdd \u003d դիմակ;)

    Display ուցադրման առանձնահատկությունն օգտագործում է ցուցման դինամիկ մեթոդ: Փաստն այն է, որ յուրաքանչյուր անհատական \u200b\u200bցուցանիշ ունի 9 կոնտակտ (7 հատվածների վերահսկման համար `1-ին կետի եւ 1-ի էլեկտրամատակարարման համար): 4 թվանշան վերահսկելու համար այն կտեւի 36 կոնտակտ: Չափազանց վատնում: Հետեւաբար, արտանետումների արդյունքը բազմանիշ թվանշանային ցուցիչով կազմակերպվում է հետեւյալ սկզբունքի համաձայն.

    Վալտաժը այլընտրանքային է համարվում ընդհանուր կոնտակտներից յուրաքանչյուրին, ինչը թույլ է տալիս կարեւորել ցանկալի ցուցանիշը համապատասխան ցուցանիշով `օգտագործելով նույն 8 կառավարման կոնտակտները: Արդյունքի բավարար հաճախականությամբ, այն կարծես ստատիկ պատկեր է: Այդ իսկ պատճառով դիագրամի երկու ցուցանիշների բոլոր 8 մատակարարման կապերը միացված են 8 նավահանգիստների պորտ D- ի, իսկ 16 կոնտակտային կառավարման հատվածները միացված են զույգերով եւ այսպիսով, ցուցադրման գործառույթը `0.25-ի հետ MS- ի այլընտրանքը ցուցադրում է ցանկալի համարը ցուցիչներից յուրաքանչյուրին: Վերջի տակ անջատված են բոլոր ելքերը, որոնք կերակրում են լարումով լարումը (հրամանի պորտը \u003d 0;): Եթե \u200b\u200bդա չի արվել, ապա վերջին ցուցադրման թվանշանը կշարունակի այրվել մինչեւ հաջորդ զանգը կոչվում է ցուցադրման գործառույթ, որը կհանգեցնի իր ավելի պայծառ լուսավորության համեմատ:

    Մամլիչների բուժում

    Void Handle_Buttons () (Hebled_Button (Key_Setup); BELLE_BUTTON (KEY_RESET); HELLE_BUTTON (KEY_PLAYER2); Անջատիչ (բանալին) \u003d Setup_bit; ընդմիջում; case key_reset. Bit \u003d reset_bit; ընդմիջում; Button_pin, bit)) (եթե (_pressed \u003d\u003d 0) (_delay_ms (degoution_time); եթե (bit_is_plear (button_pin, bit) (bey_setup: . process_reset (); ընդմիջում; case key_papause: process_pause (); ընդմիջում; case_player2 ())) այլ (_pressed & \u003d ~ բանալին) ;))

    Այս հատկությունն իր հերթին հարցում է բոլոր 5 կոճակները եւ գործընթացները, եթե այդպիսին պատահեց: Սեղմումը գրանցվում է Checking Bit_IS_Clear (Button_Pin, Bit), I.E: Կոճակը սեղմվում է, եթե դրան համապատասխանող ներդրումը միացված է գետնին, որը տեղի է ունենալու ըստ սխեմայի, երբ սեղմում եք կոճակը: Հետաձգված հետաձգումը Duration_time- ը եւ վերամշակումը անհրաժեշտ է բազմաթիվ ավելորդ պատասխաններից խուսափելու համար շփումների ցնցումների պատճառով: Համապատասխան փոփոխական բիտերում մամուլի կարգավիճակը խնայելը օգտագործվում է երկար սեղմման կոճակով վերափոխելու վերափոխման համար:
    Սեղմման գործառույթները բավականին աննշան են եւ կարծում են, որ լրացուցիչ մեկնաբանություններում պետք չեն:

    Ամբողջ տեքստային ծրագիր

    #Define f_cpu 4000000L #include #Ներառում. #Ներառում. #define devoute_time 20 #Define buttor_pin pinc #define setup_bit pc0 #define reset_bit pc2 #define player1_bit pc3 #Define Player_bit pc4 #define key_peset 0B0000000010 Ակտիվացրեք համակարգը \u003d 0; Անկայուն int timer1 \u003d 0; Անկայուն int timer2 \u003d 0; Անկայուն int _buzzer \u003d 0; Անկայուն INT _պրեսիկ \u003d 0; // գործառույթի հայտարարագրեր անվավեր նախաձեռնություն (); Անվավեր INTIT_DATA (); Int number_mask (int num); void բռնակ_բուտթոններ (); void handle_button (int բանալին); Անվավեր process_setup (); Void process_reset (); անվավեր պրոցես_ դադար (); Անվավեր process_timeoff (); Void process_player1 (); Void process_player2 (); անվավեր ցուցադրում (); անվավեր display_number (int դիմակ, int համար); Void sound_on (int ընդմիջում); անվավեր Sound_off (); // Interrupts ISR (ցուցադրում (); եթե Timer1--; եթե (timer1 \u003d\u003d 0) process_timeoff (); եթե (ակտիվիստական \u200b\u200b\u003d\u003d 2 && timer2\u003e 0) process_timeoff ()) (նախաձիվ_); sound_off (); sei (); մինչդեռ (1) (// սահմանված ելքային DDRB \u003d 0x) Մուտքագրեք DDRC \u003d 0B11100000; // Քաղեցման դիմադրիչների Portc | \u003d 0B00011111; // Timer Internupts Timsk \u003d (1< 5940 || Timer2\u003e 5940) (Timer1 \u003d 0; timer2 \u003d 0;)) անվավեր պրոցեսոր () (նախաձեռնել_դատ) () (ակտիվաչափ \u003d 0;)) Void Process_Player1 () (ակտիվաչափ \u003d 2;) Void Process_Player2 () (ակտիվ) _Player2 (actiled \u003d setup_bit; break; Գործ Key_pause: bit \u003d pause_bit; ընդմիջում; Case key_player1: break; case sey_player; break; _delay_ms (Devoution_time); եթե (bit_is_clear (Button_pin, bit) (_pressed | \u003d բանալին; // beat_reset: process_pause; case_pause_ case_player1 process_player1 (); ընդմիջում; case key_player2. process_player2 (); ընդմիջում;)) այլ (_pre)) այլ (_pre SSED & \u003d բանալին; )) Void Handle_Buttons () (BELLE_BUTUT); BELLE_BUTTON (KEY_RESET); BELLE_BUTTON (LEAT_NPUMER); ; _delay_ms (0.25); display_number ((timer1 / 60)% 10, 0B00000100); _delay_ms (0.25); display_number ((0.25) umbernn;;); _ Display_number ( 10, 0B00000001); _delay_ms (0.25); display_number ((ժամանակաչափ 20) / 10, 0B10000000); _delay_ms (0.25); display_number ((0.25); display_number ((0.25); Ժամաչափ 20% 60) / 10, 0B00100000); _delay_ms (0.25); display_number (((ժամանակաչափ 60)%% 10, 0,0, 0,0, 0.25); portd display_mask (portb \u003d number_mask) ( Համարը); portd \u003d դիմակ;) void sound_on (int internal) (_buzzer \u003d ընդմիջում; // տեղադրել Buzzer Pin High Portc & \u003d ~ 0B00100000;)

    Նախատիպը հավաքվել է աղբահանության տախտակի վրա: