ՀԱՅԱՍՏԱՆԻ ՀԱՆՐԱՊԵՏՈՒԹՅԱՆ ԿՐԹՈՒԹՅԱՆ

ԵՎ ԳԻՏՈՒԹՅԱՆ ՆԱԽԱՐԱՐՈՒԹՅՈՒՆ

ՀԱՅԱՍՏԱՆԻ ՊԵՏԱԿԱՆ ՃԱՐՏԱՐԱԳԻՏԱԿԱՆ ՀԱՄԱԼՍԱՐԱՆ

 

                         Ռադիոտեխնիկայի և կապի

                          համակարգերի ֆակուլտետ

                              Կապի համակարգերի ամբիոն

 

ԱՐԱՄՅԱՆ Հ. Լ.

 

ԹՎԱՅԻՆ  ՍԱՐՔԵՐ  ԵՒ  ՄԻԿՐՈՊՐՈՑԵՍՈՐՆԵՐԻ ԿԻՐԱՌՈՒԹՅՈՒՆԸ

ՈՒսումնական ձեռնարկ

ՄԱՍ  2

 

ԵՐԵՎԱՆ

ՃԱՐՏԱՐԱԳԵՏ

  2011

ՀՏԴ   621.31

Հ. Լ. Արամյան: Թվային սարքեր և միկրոպրոցեսորների կիրառու­թյունը: ՈՒսումնական ձեռնարկ: Մաս երկրորդ:

Հայաստանի պետական ճարտարագիտական համալ­սարան: Երևան  2010թ., 170 էջ:

Այս գիրքը «Թվային սարքեր և միկրոպրոցեսորների կիրա­ռությունը» ուսումնական ձեռնարկի երկրորդ մասն է, որը նվիրված է միկրոկոնտրոլերի բուն կիրառությանը կապի տեխնի­կայում: Ձեռնարկի մասn երկրորդում մանրակրկիտ կերպով քննարկ­ված են ՄԿ-ի Z և C հայտանիշների օգնությամբ ցիկլերի ու  ծրագ­րի ճյուղավորումների կազմակերպման, TMR0 թայ­մերի կիրառ­մամբ արտաքին ազդանշանի հաճախության չափ­ման, հաշ­վանց­ման և տեղաշարժի(պտույտի) միջոցով թվա­յին կոդերի միջհամակարգային փոխարկումների ու թվային արտապատ­կերման, ընդհա­տում­ների ռեժիմի, EEPROM հիշո­ղության կի­րառ­­ման և այլ խնդիր­ներ:

Նշված բաժինների վերաբերյալ բերված են բազմաթիվ խնդիրներ, դրանց լուծման ալգորիթմներն ու ծրագրերը, ինչպես նաև MPLAB ինտեգրված միջավայրում ծրագրերի դիտման և կարգաբերման օրինակներ:

Որպես եզրափակում` վերջում բերված է PIC միկրոկոնտրո­լերով կառուցված կոնկրետ սարքի` հաճախաչափի ծրագիրը, որում, ըստ էության, ամփոփված է ամբողջ դասընթացի նյութը:

Նախատեսված է 210400 մասնագիտութjան ուսա­նողների համար:

Նկարները` 4,  գրակ.` 12 անուն:

 

   Գրախոսներ՝                                                                 Ս. Ս. Բերբերյան , Մ. Հ. Զաբունյան

        Խմբագիր`                                                                 Ն.Ա.Խաչատրյան

Համակարգչային ձևավո­րումը`                                Լ. Շ. Արամյանի

 

 

 

ԲՈՎԱՆԴԱԿՈՒԹՅՈՒՆ

 

ԳԼՈՒԽ 1. EEPROM  ՀԻՇՈՂՈՒԹՅԱՆ ԿԻՐԱՌՈՒԹՅՈՒՆԸ

 1.1. Տվյալների գրառումը EEPROM հիշողությունում և ընթերցումն այնտեղից

ԳԼՈՒԽ 2. Z ՀԱՅՏԱՆԻՇԻ ԿԻՐԱՌՈՒԹՅՈՒՆՆԵՐԸ

2.1. Հայտանիշները

2.2. Ցածր հաճախության իմպուլսների ձևավորումը

2.3. Իմպուլսների փնջերի ձևավորումը

2.4. Իմպուլս­ների փնջի ձևավորումը ղեկավարող արտա քին ազդանշանով

ԳԼՈՒԽ. 3. C ՀԱՅՏԱՆԻՇԻ ԿԻՐԱՌՈՒԹՅՈՒՆՆԵՐԸ

3.1. Եռաբայթ թվերի գումարումը

3.2. Թվերի համեմատումը

3.3. Շրջանային տեղաշարժի կիրառությունները

3.4. Թվերի բազմապատկումը

3.5. Երկուական թվի փոխարկումը երկուական-տասականի

ԳԼՈՒԽ 4. ԸՆԴՀԱՏՈՒՄՆԵՐԻ ԿԱԶՄԱԿԵՐՊՈՒՄԸ

4.1. Ընդհատման ռեժիմը

4.2. Միակողմ ռադիոհաղոր­դիչներից երկկողմ ռադիո  հա­ղորդչի կա­ռու­ցումը

4.3. Ընդհատման ծրագրի դիտումն ու կարգաբերումը  MPLAB ինտեգրված միջակայքում

ԳԼՈՒԽ 5. ՀԱՇՎԱՆՑՄԱՆ ԿԻՐԱՌՈՒԹՅՈՒՆՆԵՐԸ

5.1. Հաշվանցում

5.2. Ծրագրի ճյուղավորումը հաշվանցմամբ

5.3. Երկուական-տասական կոդի փոխարկումը «յոթսեգմենտանի» կոդի

5.4. «Յոթսեգմենտանի» կոդի դինամիկական արտապատ­կերումը

ԳԼՈՒԽ 6. TMR0 ԹԱՅՄԵՐԻ ԿԻՐԱՌՈՒԹՅՈՒՆԸ

6.1. Հաճախության չափումը

6.2. Յոթսեգմենտանի կոդի դինամիկական արտապատկերումը  

6.3. Հաճախաչափի ծրագիրը

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

 

 

 

ԳԼՈՒԽ 1. EEPROM ՀԻՇՈՂՈՒԹՅՈՒՆԸ ԵՒ ՆՐԱ ԿԻՐԱՌՈՒՄԸ

1.1. ՏՎՅԱԼՆԵՐԻ ԳՐԱՌՈՒՄԸ EEPROM ՀԻՇՈՂՈՒԹՅՈՒՆՈՒՄ ԵՎ ԸՆԹԵՐՑՈՒՄՆ ԱՅՆՏԵՂԻՑ

Տվյալների EEPROM հիշողությունը(ինչպես նաև ծրագրերի կամ ծրագրային հիշողությունը), էներգանկախ հիշողություն է: Այն ծրագրերի հիշո­ղության հետ ոչ մի առնչություն չունի և կատարում է իր յուրահատուկ գործառույթները:

EEPROM հիշողությունը կարող է կիրառվել հետևյալ դեպքերում.

1. ՄԿ ծրագրավորելիս(«վառելիս» կամ «կարելիս»), երբ որոշ հաստա­տուններ գրառվում են այնտեղ, իսկ ծրագրի կա­տար­ման ժամանակ բազմակի ընթերցվում և օգտագործվում են:

2. ՄԿ ծրագրավորելիս, երբ EEPROM-ում գրառվում են տվյալ­ներ, որոնք ՄԿ օգտագործման ընթացքում կարող են փոփոխվել և վերագրառվել այդտեղ:

3. Ծրագրի կատարման ընթացքում, երբ որոշ տվյալներ գրառ­վում են EEPROM-ում, որոնք պահպանվում են սնումն անջատ­վելուց հետո, այնուհետև`  օգտագործվում ՄԿ միացման ժամա­նակ:

Վերը նշված նախնական տվյալները կարելի է գրառել EEPROM-ում հատուկ ենթածրագրերի օգտագործմամբ, ընդ որում, այս դեպքում կարելի է կազմակերպել սարքի ծածկագ­րային մատչելիություն և նրա աշխատանքի շրջափակում` ոչ ճիշտ ծածկագրի տրման դեպքում:

Կարելի է թվարկել EEPROM տվյալների հիշողության  գործածման բազմաթիվ օրինակներ, սակայն բոլոր դեպքերում դրանք իրականացվում են կամ ծրագրի միայն  աշխատանքային մասի միջոցով, կամ, բացի այդ` EEPROM հիշողության մեջ գրառման դիրեկտիվներով, որոնք նշվում են ծրագրի «գլխարկում»:

           EEPROM տվյալների հիշողության ծավալը մեծ չէ. PIC ՄԿ մեծամասնության, այդ թվում նաև PIC16F84A-ի, EEPROM տվյալների հիշողությունն ունի 64 բայթ ծավալ, այսինքն` 64 բջիջ, որոնցից յուրաքանչյուրում կարելի է գրառել մեկ բայթ(.00-ից մինչև .255 թվերից մեկը):

EEPROM հիշողության յուրաքանչյուր բջիջ ունի իր հաս­ցեն` .00-ից մինչև .63(00h … 3Fh) սահմաններում`, որն  անպայ­­ման հարկ է նշել ինչպես EEPROM-ից տվյալների ընթերց­ման, այնպես էլ այդտեղ տվյալների գրառման ժամանակ: Հատկապես ո՞ր բջջից և ծրագրի իրագործման ընթացքի հատկապես ո՞ր պահին ընթերցել կամ ո՞ր բջջում և ծրագրի իրագործման ընթացքի հատկապես ո՞ր պահին գրա­ռել` որոշում է ծրագրողը:

EEPROM հիշողության բջիջները կարելի է պատկերաց­նել որպես ընդհանուր բնույթի յուրահատուկ ռեգիստրներ, որոնց պարունակությունների նկատմամբ կարելի է կիրառել նույն գործողու­թյունները, ինչ` ընդհանուր բնույթի ռեգիստրների պարունա­կու­­թյունների նկատմամբ(ընթերցում կամ գրառում):

EEPROM հիշողության այս կամ այն  բջջում այս կամ այն թվի գրառումը կատարվում է հնի թարմացմամբ. հատուկ ջնջման ընթացք նախատեսված չէ` տեղի է ունենում սոսկ մի թվի փոխարինում մյուսով: Բոլոր բջիջներում լռելյայն գրառված է FFh(11111111) թիվը:

 Ծրագրի աշխատանքային մասն սկսելուց առաջ, հնարավոր է` հարկ լինի EEPROM հիշողությունում տվյալ­ների նախնական (մինչև ծրագրի աշխա­տան­քային մասի իրագործումը) գրառում կատարել: Տվյալների նախնական գրառումը EEPROM հիշո­ղու­թյան բջիջներում իրականացվում է DE դիրեկ­տիվի օգնությամբ, որը պետք է գտնվի ծրագրի «գլխար­կում»` մինչև org 0 դիրեկտիվը: Մինչ այս դիրեկտիվի օգտագոր­ծումը, անհրաժեշտ է ակտի­վաց­նել EEPROM հիշողությունը միակ եղանակով` org 2100հ դիրեկ­տիվի օգնությամբ:

Ինչպես նշվեց, EEPROM հիշողության բոլոր բջիջներում լռելյայն գրառված է FFh, եթե, իհարկե, DE դիրեկտիվի օգնու­թյամբ դրանցից որոշները «զբաղված» չեն:

EEPROM հիշո­ղությանից տվյալներ ընթերցելիս կամ նրա մեջ տվյալներ գրառելիս(և միայն այդ դեպքերում) օգտագործ­վում են 0 բանկում գտնվող հատուկ բնույթի EEData(տվյալ­ների), EEAdr(հասցե­նե­րի) և 1 բանկում գտնվող EECon1(ընթերց­ման ռեժիմի սահմանման) և EECon2(գրառման ռեժիմի սահմանման) ռեգիստրները:

 Դիտողություն.- EECon2 ռեգիստրն օգտագործվում է EEPROM-ում գրառման գործողության­ պարտադիր հրամանների իրականացման համար: Այն ֆիզիկապես իրակա­նացված չէ և ծրագրի «գլխարկում» գրանցելու հարկ չկա:

Դիտարկենք պարզ, գործածական խնդիր:

Ենթադրենք անհրա­ժեշտ է մինչև ծրագրի աշխատանքային մասի սկիզբը EEPROM հիշողության, օրինակ` 02h հաս­ցեում  գրառել, օրինակ` .100(64h) թիվը ապա` պատճենել այդ բջջի պարու­նակությունը(.100) օրինակ` Reg1 անվանմամբ ընդհանուր բնույ­թի ռեգիստրում, այնուհետև ռեգիստրի պարու­նա­­կությունն ինկրեմենտել և գոր­ծո­­ղու­թյան արդ­յունքը(.101) նախ պահպանել Reg1 ռեգիստրում, ապա` այդտեղից պատճենել EEPROM հիշողության նույն` 02հ հասցեով բջջում:

org 2100h դիրեկտիվին անմիջապես հաջորդող DE դիրեկ­տիվը(օրինակ` DE 0h,1h,64h) գրառում է առաջին թիվը (ձախ եզրայինը) EEPROM հիշողության 00h հասցեով բջջում, երկրորդ թիվը` 01h հասցեով, երրոր­դը` 02h հաս­ցեով և այլն: Տվյալ դեպ­քում 64h թիվը գրառվում է 02հ հաս­ցեով` 3-րդ բջջում: Սկզբնա­պես 3-րդ բջիջն ընտրեցինք միտումնավոր, որպեսզի «զբաղեց­նենք» 00հ և 01հ բջիջները` հարկ եղած (չնախատես­ված) դեպ­քում, օգտվել նրանցից(բջիջն զբաղված է, եթե նրանում գրառ­ված է FFh-ից տարբեր բան): MPLAB-ով EEPROM հիշողու­թյան պարունակությունը դիտելիս «զբաղված» բջիջները ակնհայ­տորեն կնկատվեն, եթե FF-երի տաղտուկ ֆոնի վրա լինեն 00-ներ(կամ պարզապես` FF-ից տարբեր թվեր):

 DE 00h,00h,64h,00h,00h,02h դիրեկտիվով կարելի է պահես­տա­վորել 1-ին, 2-րդ, 4-րդ և 5-րդ բջիջները`«դեռ չծնված» գոր­ծողու­թյունների համար,  3-րդ բջջում գրառելով 64h, 6-րդում` 02h:

Եթե DE  դիրեկտիվին հետևում է տվյալների երկար շարք, օրինակ` DE 0h,0h,64h,01h,01h,02h,03h,15h,78h, ապա հնարա­վոր է, որ այդ թվերի մի մասն ընկնի ծրագրի տեքստի մեկնա­բանությունների տիրույթը, որն անցանկալի է: Այս դեպքում դիրեկտիվը կարելի է տրոհել մի քանի դիրեկտիվների, օրինակ`]

DE դիրեկտիվը կարելի է օգտագործել նաև տառերի, այլևայլ նշանների գրառման համար: Դա նշանակում է,  եթե DE դիրեկ­տիվի աշխատանքային մասը կազմվի  համապատաս­խան ձևով, ապա EEPROM հիշողության բջիջներում կգրառվեն սիմվոլների (տառեր, թվեր, կետադրական նշաններ, հատուկ սիմ­վոլ­ներ և այլն) թվային արժեքները: Այս դեպքում, DE դիրեկտիվի աշխա­տան­քային մաս կարելի է մտցնել ոչ թե թվեր, այլ սիմվոլ­ներ` դրանց խմբերն առնելով չակերտ­ների մեջ:

Դիտելով ծրագրի տեքստը, կտեսնենք, որ վերևից երրորդ DE դիրեկտիվի օգնությամբ, չօգտագործված բջիջներում (սկսած 7-ից) զետեղել ենք մեկնաբանություններ`

DE “Aramyan H.L., Armenya, Erevan, SEUA”:

 Այսպիսով, EEPROM հիշողություն օգտագործող ռացիոնալ կազմված ծրագ­րերի մեծամասնությունում օգտագործված բջիջ­ները, սովորաբար, ամփոփ խմբով տեղադրվում են EEPROM հիշողու­թյան սկզբում` զրոյական հասցեից սկսած, իսկ չօգտա­գործ­ված բջիջներում, լռելյայն, գրառվում է FFh: Այլ բան է, եթե պետք է EEPROM հիշողության մեջ թաքցնել ինչ- որ «գաղտնի» բջիջ կամ բջիջներ: Նման «գաղտնի» բջիջներ կարելի է ցրել EEPROM հիշողության տիրույթով մեկ` կամայականորեն, դրանց միջակայքը «լցնելով» ինչ-որ բանով: Դրա համար օգտագործ­վում են նույն DE դիրեկտիվները, որոնցում տրվում է կամ թվերի պատահաբար ընտրված արժեքներ, կամ պատահաբար ընտըր­ված սիմվոլներ, կամ` թե’ մեկը, թե’ մյուսը: Ավելի լավ է  նախ կար­գաբերել ծրագիրը, փոխարինել ստացված «գաղտնի» հաստատունները սիմվոլներով, այնուհետև այդ սիմվոլները «տեղադ­րել» դրանց ինչ-որ խելամիտ կամ անմիտ հավաքածուի մեջ, որը պետք է նախապես գրառել EEPROM հիշողության բջիջներում` հար և նման վերը նշված մեկնաբանությունների գրառմանը:

MPLAB-ում EEPROM հիշողության տիրույթի պարունա­կության դիտումն ու ստուգումը կարելի է իրականացնել`  ընտրե­լով գլխավոր ցուցակի Window ներդիրի EEPROM Memory տողը: Բացենք EEPROM Window պատուհանը. կտեսնենք EEPROM հիշողության բջիջներն իրենց պարունակություններով: Այստեղ կարելի է որոշել յուրա­քանչյուր բջջի հասցեն: Եթե EEPROM Window պատուհանը բացենք բացված ծրագրի դեպքում, ապա նրա մեջ բոլոր բջիջ­ներում կտեսնենք լռելյայն սահմանված FFh թվերը: Բանն այն է, որ կամ ծրագրի տեքստը ոչ մի անգամ չի ասեմբլերվել կամ ասեմբլերվել է, սակայն EEPROM հիշողո­ւ­թյունը ծրագրում չի գործածվել: Եթե EEPROM հիշողությունն օգտագործվել է DE դիրեկ­տիվի օգնությամբ, ապա ասեմբլերու­մից հետո, EEPROM հիշողության համապա­տաս­խան բջիջնե­րում կտեսնենք գրառված թվերը(16-ական համակար­գով), համապա­տաս­խան սիմվոլները, որոնց արժեք­ները(ասեմբ­լե­րելուց հետո) կարելի է դիտել EEPROM Window պատուհանում: Հիշենք, որ օպերատիվ հիշողության տիրույթի, ծրագրերի հիշողության և EEPROM հիշողության պարունակու­թյուն­ները ցույց տվող պատուհաններում արտացոլվում է վերջին ասեմբլե­րացման արդյունքը:

Ի դեպ, եթե ծրագրի մեկնաբանությունների տիրույթում (կետ/ստորակետներից աջ) են կատարվել փոփոխություններ, ապա ասեմբլերումը պարտադիր չէ, քանի որ այդ փոփոխու­թյուն­ներից .HEX ֆայլը  չի փոփոխվում: Այս դեպքում վերը նշված փոփոխությունները  կարելի է պահպանել միայն .ASM-ֆայլում, այն է` նշել  MPLAB-ի գլխավոր ցուցակի File ներդիրի Save տողը:

EEPROM հիշողությունից տվյալների ընթերցման և նրանում գրառման վերը նկարագրված ծրագիրը բերված է ստորև. հետևենք ծրագրին:

Ծրագրի իրագործումն սկսվում է ստանդարտ Start ԵԾ-ով: Աշխատանքային մասի մեկնարկից հետո,  այն կատարվում է այնքան ժամանակ, քանի դեռ EEPROM հիշողությանը դիմելու անհրաժեշտություն չի ծագում: Այնուհետև ծրագրի աշխատան­քային կետն անցնում է EEPROM հիշողության հետ աշխատան­քի հրամանների խմբի առաջին հրամանին: Տվյալ դեպքում այդ անցումը կատարվում է «բնականորեն»(այն հաջորդում է bcf Status,5 hրաման­ին): Անցումը վերը նշված հրամանների խմբի առաջին հրամանին կարող է տեղի ունենալ ծրագրի ցանկացած «տեղից», եթե դրա համար օգտագործվեն անցումների goto կամ  call հրամանները: Այս դեպքում, EEPROM հիշողությանն առնչվող հրամանների խմբին պետք է շնորհել ենթածրագրի կարգավիճակ կամ առաջին հրամանին դնել նիշ` դրան հղում կատա­րելու համար:

Քննարկենք հրամանների այս խումբը:

Խնդրի պահանջներին համապատասխան` դա պետք է լինի EEPROM հիշողության 3-րդ բջջից թիվը օպերատիվ հիշողու­թյան ռեգիստր տեղափոխելու հրամանների խումբ: Որպես օպերատիվ հիշողության ռեգիստր վերցնենք ընդհանուր բնույթի ռեգիստր(անվանենք Reg1 և շնորհենք 0Ch հասցեն): Այն օգտագործելու ենք տվյալների ժամանակավոր պահպան­ման համար: 

EEPROM հիշողությունից տվյալների ընթերցման(ինչպես նաև` գրառ­ման) հրամանների խումբը հրամանների ստանդարտ հավաքածու է: Ծրագրողից պահանջվում է միայն հրամանների ստանդարտ հավաքածուն զետեղել ծրագրի համապատաս­խան տեղում:

 Ընթերցման համար այդ խմբի առաջին հրամանով(bcf Status,5) անցում է կատարվում 0 բանկ(այնտեղ են գտնվում EEdata և EEadr ռեգիստրները): Հաջորդ հրամանը հաստատունի գրառման ստան­­­դարտ հրաման է(EEPROM հիշողությանը համագոր­ծակցող EEAdr ռեգիստրում գրառվում է 2h հասցեն).

Այստեղ հաստատունը 3-րդ բջջի 2h հասցեն է:

Այսպի­սով, բջիջն ընտրված է, և այժմ պետք է ակտիվացնել (ինիցիալացնել) ընթերցումը, որն իրականացվում է EECon1 ռեգիստ­րով(նրա թիվ 0 բիթի վիճակով): Այդ ռեգիստրը գտնվում է 1 բանկում, ուստի նախ` անցում է կատարվում այդտեղ(bsf  STATUS,5), ապա տրվում ընթերցման թույլտվություն.

Այժմ արդեն կարելի է 2h հասցեի պարունակությունը W-ի միջոցով փոխադրել    Reg1 ռեգիստր` նախապես անցնելով 0 բանկ, քանի որ EEData ռեգիստրը գտնվում է այնտեղ.

 Այս հրամանների կատարու­մից հետո, 64հ(նախապես գրառված) թիվը 02հ հաս­ցեով բջջից պատճենվում է W ռեգիստր, այնուհետև` Reg1 ռեգիստր:

 Ծրագրի աշխատանքի ալգորիթմին համապատասխան պետք է կատարել Reg1 ռեգիստրի ինկրեմենտ.

Incf   Reg1,1:

Այժմ Reg1 ռեգիստրում .101(65h) թիվն է, որն ըստ խնդրի պահանջի, անհրաժեշտ է գրառել EEPROM հիշողության հենց նույն`  3-րդ բջջում:

Գրառման ընթացքն սկսում ենք  ընդհատման գլո­բալ արգել­մամբ` bcf IntCon,7  հրամանով: Ընդհատման գլոբալ արգելումը կարելի է իրականացնել նաև clrf IntCon բայթորոշ հրամանով:

Ընդհատման արգելումն անհրաժեշտ է(բացառությամբ` EEPROM-ում գրառման ընթացքի վերջում նախատեսված արգել­­­ման դեպքի), քանի որ եթե EEPROM-ում գրառման սկզբում թույլատրված լինեն ընդհատումներ, ապա գրառման ավարտից հետո, ծրագրի աշխատանքային կետը կտեղափոխվի ընդհատման ԵԾ: Իսկ եթե ծրագիրը չի պարունակում ընդհատման ԵԾ, նման տեղափոխությունը կհանգեցնի ծրագրի «կախման»:

Ընդհատման գլոբալ արգելման հրամանին հետևում են EEPROM հիշողության բջջի հասցեային ընտրության երկու հրամանները, որոնք ճիշտ նույնն են, ինչ բջջի հասցեային ընտրության հրամաններն ընթերցման ժամանակ.

Հետագա երկու հրամանների կատարումից հետո .101(65h) թիվը, W ռեգիստրով, օպերատիվ հիշողության Reg1 ռեգիստրից արտագրվում է հատուկ նշանակության EEData ռեգիստր:

Այսպիսով, գրառման նախապատրաստումն ավարտվեց: Այժմ պետք է թույլատրել գրառումը:

EEPROM հիշողության մեջ գրառումը թույլատրվում է EECon1 ռեգիստրի թիվ 2 բիթում 1-ի սահմանումով, իսկ այդ ռեգիստրը գտնվում է 1 բանկում, հետևաբար նախ տեղա­փոխ­վենք 1 բանկ(bsf Status,5):

Գրառման թույլատրումից հետո գրառումն իրականացվում է հինգ հրամանների պարտադիր հաջորդականությամբ: Այստեղ մասնակցում է այս­պես կոչված «ֆիզիկապես չիրագործված» EECon2 ռեգիստրը:

Հրամանների այս պարտադիր հաջորդակա­նության իրագոր­ծման հետևանքով(EEPROM հիշողության մեջ գրառման ավար­տից հետո) ընդհատման արգելման բիթը սահմանվում է 1(դրո­շակը պարզ­վում է): Դրոշակն իջեցվում է ծրագրորեն, ինչը և տեսնում ենք ծրագրում(bcf EECon1,4):

Նշենք, որ EECon2 ռեգիստրի համար, առհասարակ, նշանա­կություն չունի, թե ո’ր բանկում է աշխատանքային կետը. չէ՞ որ այն ֆիզիկապես գոյություն չունի:   Այնուհետև, անցնում ենք 0 բանկ(ավելի հավանական է, որ հաջորդ գործողությունները կընթանան այդ բանկում):                           

Դիտողություն.- Վերը դիտարկված է «ընթերցում - թարմա­ցում(մոդիֆիկացիա) - գրառում» գործողությունը` ծրագրի մեկ լրիվ ցիկլի ընթացքում: Դժվար չէ կռահել, թե ինչ տեղի կունենա ծրագրի հետևյալ լրիվ ցիկլերի կատարման ժամանակ. յուրաքանչյուր ցիկլով EEPROM հիշողության 3-րդ բջջում գրառված թվի արժեքը կաճի 1-ով` մինչև .255 թիվը ներառյալ, որից հետո ծրագրի հետևյալ լրիվ ցիկլում տեղի կունենա անցում .255 թվից .00-ին, ապա .01-ին, .02-ին և այլն` մինչև սնման անջատումը:

>>


 


ԳԼՈՒԽ 2. Z ՀԱՅՏԱՆԻՇԻ ԿԻՐԱՌՈՒԹՅՈՒՆՆԵՐԸ

2.1. ՀԱՅՏԱՆԻՇՆԵՐԸ(ԴՐՈՇԱԿՆԵՐԸ)

Ծրագրի իրականացման ժամանակ որոշ պատահույթների հետևանքով(օրինակ` որպես գործողությունների կատարման արդ­­յունք­) հատուկ նշանակության որոշ ռեգիստրների որոշ բիթեր անցնում են 0 կամ 1 վիճակի: Այդ բիթերը կոչվում են հայտանիշներ կամ դրոշակներ: Օրինակ, եթե մի գործո­ղության արդյունքը 0 է, ուրեմն Status ռեգիստրի թիվ 2 բիթը(Z հայտանիշը) սահման­վում է 1(«դրոշակը պարզած է»), իսկ եթե այդ արդյունքը 0 է, սահմանվում է 0(«դրոշակը կախ­ված է»):

Հայտանիշների երկու խումբ կա:

Առաջին խմբի հայտանիշները, լինելով որոշ պատահույթի ադյունք, պատահույթի վերա­նա­լուց հետո ինքնըստինքյան վերա­­նում են և ծրագրի կատար­մանը չեն մասնակցում:

 Երկրորդ խմբի հայտանիշները 0 են սահմանվում միայն ծրագրո­րեն(հարկադրաբար): Եթե որևէ պատահույթի հետևան­քով այս խմբի հայտանիշներից մեկը սահմանվել է 1, ապա այդ վիճակում կմնա այնքան ժամանակ, քանի դեռ ծրագրորեն այն չի զրոյացվել: Օրինակ. IntCon ռեգիստրի INT մուտքով արտա­քին ընդհատ­ման INTF հայ­տա­նիշը արտաքին ընդհատ­ման առկա­յության դեպքում սահմանվում է 1: Եթե այն ծրագրորեն չզրոյացվի, ապա INT մուտքում ազդանշանի վերանալուց հետո 1-ը կպահպանվի` ստեղծելով ընդհատող ազդանշանի առկայու­թյան խաբուսիկ պատրանք:

Ամենագործածական հայտանիշը, թերևս, Status ռեգիստրի թիվ 2 բիթն է(Z հայտանիշը), որը սահմանվում է 1, եթե գործողության արդյունքը 0 է: Այն օգտագործվում է ծրագրի ճյուղավորում­ներում(Incfsz, decfsz, btfsc, btfss հրամաններով)` ըստ որևէ հայտանիշի` ծրագրի շարունա­կու­թյուններից (սցենար­ներից) մեկն ընտրելու կամ ցիկլեր կազմակերպելու նպատակով:

Status ռեգիստրի C հայտանիշը(փոխանցում-պարտք) կա­րող է օգ­տա­­գործվել գումարման (ADDWF, ADDLW), հանման (SUBWF, SUBLW) գործողությունների ժամանակ:

Եթե երկու թվերը գումարելիս գումարը .255 –ից մեծ է, ապա C=1(փոխանցում կա), հակառակ դեպքում` C=0(փոխանցում չկա):

Եթե երկու թվերի տարբերությունն ընկած է [0, 255] միջակայքում, ապա C=1(պարտք չկա), հակառակ դեպքում` C=0(պարտք կա):

Այսպիսով, փոխանցման դեպքում C=1, պարտքի դեպքում C=0(թեև C-ն ունի 0 արժեք, սակայն սա նշանակում է, որ պարտք կա, և այն հավասար է -1-ի, որն ունի – 256 արժեք): Դիտենք երկու օրինակ:

.253 + 5 = 2(ռեգիստրի պարունակությունը) և +1(փոխանցումը) = 2 + .256 = .258:

1 - 3 = 254(ռեգիստրի պարունակությունը) և -1(պարտքը) = .254 - .256= - 2: Նկատենք` ռեգիստրի պարու­նա­կու­թյունը գործողության արդյունքը չէ, արդյունքը պարտքի և այդ պարունակության գումարն է:

Գումարման կամ հանման գործողությունից առաջ պարտադիր չէ C հայտանիշը գումարման դեպքում 0, հանման դեպքում` 1 սահմանել, քանի որ եթե նախորդ գործողու­թյան հե­տևան­քով C=1, և հաջորդ գործողության արդյունքը գերա­զան­ցում է .255-ը, ապա C-ում 1-ը կպահպանվի, եթե չի գերազան­ցում` C-ն կսահմանվի 0: Նույնը վերաբերում է Z և CD հայտա­նիշ­ներին:

Եթե, այդուհանդերձ, ցանկանում ենք C-ն սահմանել, ապա գումարման գործողությունից առաջ պետք է օգտագործել bcf Status,0, իսկ հանման գործողությունից առաջ` bsf Status,0 հրամանները:

CD հայտանիշը Status ռեգիստրի թիվ 1 բիթն է: Այն սահման­վում է 1, եթե երկու ոչ զրոյական թվերի կրտսեր կիսաբայթերի գումարի(կամ տար­բերու­թյան) կրտսեր կիսաբայթը մեծ է .15-ից: Եթե մեկբայթանի գումա­րելիներից մեկը 0 է, իսկ մյուս գումա­րելիի կրտսեր կիսաբայթը` 15-ից նույնիսկ մեծ, CD(ինչպես նաև C) հայտանիշը կլինի 0(դրոշակը կախված է): Օրինակ. .00+.16=.16 դեպքում C և CD(ինչպես նաև` Z) դրոշակներն իջած կլինեն, իսկ .01+.15=.16 դեպքում` պար­զած: Դրանք իջած կլինեն նաև .150(10010110) և .08(00001000) թվերի գումարման դեպ­քում, քանի որ դրանց կրտսեր կիսաբայ­թերի գումարը` .06+.08=.14, փոքր է .15-ից, մինչդեռ .153(10011001) և .08(00001000) թվերի գումարման դեպքում CD-ն կսահմանվի 1, քանի որ դրանց կրտսեր կիսաբայթերի գումարը` .09+.08=.17 մեծ է .15-ից: Հետև­յալ օրինակում` .157(10011101)+.139 (10001011), և’ C և’ CD դրոշակները կպարզվեն(կբարձ­րանան):  C-ն այն պատ­ճառով, որ բայթերի գումարը` .296-ը,  մեծ է .255-ից, իսկ CD-ն այն պատճա­ռով, որ կրտսեր կիսաբայ­թերի գումարը` 1101(.13)+1011(.11)=.24 մեծ է .15-ից:

>>

 

 

2.2. ՑԱԾՐ ՀԱՃԱԽՈՒԹՅԱՆ ԻՄՊՈՒԼՍՆԵՐԻ ՁԵՒԱՎՈՐՈՒՄԸ

Այս ձեռնարկի առաջին մասի 65 էջում բերված օրինակում իմպուլսների տևողություն­ներն ու կրկնման պարբերու­թյունները ձևավորելիս, օգտվեցինք Z հայտանիշի ստուգման միջոցով ցիկլերի կազմակերպումից: Հաճախության տրված արժեքը(2,5 կՀց) թույլ տվեց բավարարվել ընդհանուր բնույթի մեկ ռեգիստրով:   

Այժմ քննարկենք հետևյալ խնդիրը` արդյո՞ք իմ­պուլս­ների կրկնման հաճախության փոփոխու­թյունը կհան­գեցնի ծրագրի կամ նրա ծավալի փոփոխության: Դիտարկենք նույն` PIC16F84A միկրոկոնտրոլերով այդ օրինակում դիտարկվածից անհամեմատ ցածր` 100 Հց կրկն­ման հաճա­խու­­թյամբ իմպուլս­ների ձևավոր­ման ծրագիրը:

Նախ իմպուլսների կրկնման պարբերությունը`

հետևաբար` 0 կամ 1 մակարդակի տևողությունը` T/2= 5 մվ=5000 մկվ:

Արդյո՞ք ընդհանուր բնույթի մեկ ռեգիստրով հնարավոր է այսքան հապաղում ստանալ առանց nop-երի կիրառման(իհարկե կարելի է կիրառել նաև nop-եր, սակայն դրանց քանակը պետք է լինի ողջամիտ սահմաններում):

Պարզենք, թե մեկ ռեգիստրով առավելագույնը որքա’ն հապաղում կարելի է ստանալ` առանց nop-երի կիրառման:

Նախորդ օրինակում, 2,5 կՀց հաճախությամբ իմպուլսներ ձևավորելիս օգտվեցինք հապաղման ժամանակի

բանաձևից(որը պետք է կազմեր 200 մկվ): Նրանում t0-ի փոխա­րեն տեղադրելով մեկ ընդհանուր բնույթի ռեգիստրում գրառե­լի հնարավոր առավելագույն թիվը` 255, կստանանք մեկ ռեգիստ­րով ձևավորելի հապաղման  հնարավոր առավելա­գույն ժամա­նակը`

Դա նշանակում է, որ ընդհանուր բնույթի մեկ ռեգիստրով հնարավոր չէ 5000 մկվ հապաղում ստանալ. անհրաժեշտ է մեկից ավելի ռեգիստր: Վերցնենք մեկից ավելի ռեգիստր: Սակայն, եթե այդ ռեգիստրների պարու­նակությունները դեկրե­մեն­տենք հաջորդաբար(մի ռեգիստ­րի պարունակության 0-ացումից հետո անցնենք երկրորդի, այնուհետև` երրորդի 0-ացմանը և այսպես մինչև վերջինը), ապա անհրաժեշտ կլինի յոթ ռեգիստր: Առավել ռացիոնալ կլինի յուրաքանչյուր հաջորդ ռեգիստրի դեկրեմենտի ցիկլի մեջ ներառել նախորդ ռեգիստրի դեկրեմենտի ցիկլը: Հեշտ է ցույց տալ, որ այս կերպ երկու ընդհանուր բնույթի ռեգիստրով հնարավոր է ստանալ ավելի քան 0,19 վ հապաղում:

Այսպիսով, մեր օրինակում հարկ կլինի օգտվել ընդհանուր բնույթի երկու ռեգիստրից. անվա­նենք դրանք KPL(կրտսեր բայթ) և KPH(ավագ բայթ):

Ինչպես նախորդ օրինակում, ձևավորված իմպուլսների հաջորդականությունն արտածենք B մատույցի 0 ելուստով: Դա նշանակում է, որ պետք է գրանցել այդ մատույցը ղեկավարող PortB ռեգիստրը և ելուստների կարգավիճակը(մուտք, ելք) որոշող TrisB ռեգիստրը: Վերջինս գտնվում է 1 բանկում, ուստի բանկից բանկ անցնելու համար անհրաժեշտ է նաև գրանցել Status ռեգիստրը:

Երկու ռեգիստրով հապաղումն իրականացվում է համաձայն հետևյալ ալգորիթմի. իմպուլսի, օրինակ` 0 մակար­դակի  տևո­ղու­­թյունը ձևավորելու համար, նախ KPL ռեգիստրում գրառվում է որոշ m1, իսկ KPH-ում` m2 թիվ: Այնուհետև, յուրաքանչյուր ռեգիստ­րի համար կամակերպվում է դեկրեմենտի կիրառմամբ հայտնի ցիկլը, ընդ որում, KPL ռեգիստրի պարունակությունը m1 անգամ ինկրեմեն­տելուց հետո, նրանում գրառվում է .255(հնա­րավոր առավելա­գույն թիվը), մեկ անգամ դեկրեմենտվում KPH-ի պարունակությունը և կրկին անցում կատարվում KPL-ի պարու­նակու­թյան  դեկրեմենտի ցիկլին: Այս ընթացքը շարունակ­վում է մինչև KPH-ի պարունակության` 0-ի հավասար­վելը, այնուհետև անցում է կատարվում 1 մակարդակի իմպուլսի տևողության ձևա­վոր­մանը և այսպես շարունակ:

Հաշվի առնելով շարադրվածը` կազմենք ծրագիրը(բերված է ստորև):

Հաշվենք իմպուլսի 0-ական մակարդակի տևողությունը ձևա­վորող հրամանների մեքենայա­կան ցիկլերի գումարային թիվը (տե’ս ծրագիրը).

Լուծելով

հավասարումը 0 m1 255 և 0 m2 255 պայմանների դեպքում, կստանանք m1=129, m2=7 արժեքները, որոնց դեպքում 0 մակարդակի տևողությունը կազմում է ճիշտ 5 մվ:

Հանգունորեն որոշենք իմպուլսի 1 մակարդակի տևողու­թյունը ձևա­վորող հրամանների մեքենայական ցիկլերի թիվը.

Լուծելով

հավասարումը  պայմանների դեպքում, կստանանք m3=124, m4=7 արժեքները, որոնց դեպքում 1 մակար­դակի տևողությունը նույնպես կազմում է ճիշտ 5 մվ:

Ցիկլերի նիշերը նշանակենք` 1 մակարդակինը` Pause1, 0 մակարդակինը`   Pause2:

Ծրագրի իրագործման ընթացքը նույնն է, ինչ նախորդ օրի­նակի ծրագրինը. հատուկ բնույթի ռեգիստրների գրան­ցումից, ընդհանուր բնույթի ռեգիստրների անվանակո­չումից և հասցեա­վորումից հետո անցնում ենք Start ԵԾ, որի առաջին չորս հրամաններով նախ B մատույցի բոլոր ելուստներին շնորհում ենք ելքի կարգավիճակ(կարելի էր միայն RB5 ելուստին շնորհել ելքի, մնացածին` մուտքի կարգավիճակ. այդ դեպքում TrisB-ում պետք է գրառեինք ոչ թե 0, այլ` 00100000=.32), ապա պարբե­րաբար ձևավորում 0 և 1 մակարդակների տևողություն­ները(կիսա­պար­­բերությունները):

>>

 

2.3. ԻՄՊՈՒԼՍՆԵՐԻ ՓՆՋԵՐԻ ՁԵՒԱՎՈՐՈՒՄԸ

Դիցուք անհրաժեշտ է մշակել հետևյալ պահանջները բա­վա­րա­րող մուլտի­վիբրատոր(իմպուլսների գեներատոր):

1. Իմպուլսների կրկնման հաճախու­թյունը` 5 կՀց(հաճա­խու­թյան բարձր կայունությամբ),

2. Փնջերի առկայության(և բացակայության) ժամանակը` 600 մկվ,

3. Փնջի տևողության ընթացքում ՄԿ որևէ ելուստին պետք է առկա լինի տրամաբանական 1, բացակայության ընթացքում` 0:

Առաջին պահանջը կբավարարվի, եթե ընտրենք ստան­դարտ կվարցային XT գեներատոր` հաճախու­թյան(սովո­րաբար` 4 ՄՀց) կվարցային կայունացմամբ և նախորդ խնդիր­ների ալգո­րիթմով ձևավորենք

տևողությամբ ու TԻ=200 մկվ պարբերությամբ իմպուլսներ:

Երկրորդ պահանջը կբավարարվի, եթե ձևավորենք իմպուլս­ների առկայության(փնջի) և բացակայու­թյան` 600 մկվ տևողու­թյամբ ժամանակահատվածներ:

Երրորդ պահանջը հեշտ է բավարարել. իմպուլսների ձևավո­րումն սկսելիս որևէ մատույցի նախապես որոշված ելուստում (օրի­նակ` RB3-ում) կսահմանենք 1 և այն կպահ­պանենք իմպուլս­ների ձևավորման ողջ ընթացքում(իմպուլսների բացա­կա­յության ընթացքում` 0):

Այժմ ձևավորենք ծրագրի կմախքը:

Քանի որ օգտվելու ենք մատույցից(իմպուլսները միկրո­կոնտրո­լերից, օրինակ` RB5 ելուստով, պետք է տրվեն բեռին), ապա անհրաժեշտ է գրանցել PortB, TrisB ռեգիստրները: TrisB ռեգիստրը գտնվում է 1 բանկում, ուստի հարկ է գրանցել նաև Status ռեգիստրը:

Ընդհանուր բնույթի ռեգիստրներ անհրաժեշտ են` կիսապարբերությունների և իմպուլսների առկայության ու բացա­կայության ժամանակամիջոցների ձևավորման համար: Կիսա­պար­բե­րությունների ձևավորման ռեգիստրն անվանենք KP, իմպուլսների առկայության ու բացակայության ժամանակնե­րինը` PUNJ:

Իմպուլսների 1 մակարդակի  կիսապարբերությունը ձևավո­րող ենթածրագրի մուտքի նիշն անվա­նենք Mak1, 0 կիսապար­բերությանը` Mak0, իմպուլսների առկայության ժամանակա­մի­ջոցը ձևավորողինը` ARKA, դրանց բացակայության ժամանա­կամի­ջոցինը` BACAKA:

Որոշենք հապաղման ժամանակները ձևավորող ընդհանուր բնույթի  ռեգիստրներում նախապես գրառվելիք հաստատուն­ները:

1 մակարդակի կիսապարբերության ձևավորման համար KP-ում գրառվելիք n1 հաստա­տունը կորոշենք հետևյալ առնչու­թյունից(տե’ս ծրագիրը. nop-երը չեն հաշվվում).

որտեղից` n1=31,(3): Հասկանալի է` n1=31, ուստի հապաղման ժամանակը կկազմի 99 մկվ: Mak0 ԵԾ ավելացնելով մեկ nop կստանանք ճիշտ 100 մկվ:

0 մակարդակի կիսապարբերության ձևավորման համար KP-ում գրառվելիք n2 hաստատունը կորոշենք հետևյալ առնչու­թյունից.

 

որտեղից` n2=30,(3): Հասկանալի է` n2=30, ուստի հապաղման ժամանակը կկազմի 99 մկվ: Mak0 ԵԾ ավելացնելով մեկ nop կստանանք ճիշտ 100 մկվ:

 Իմպուլսների առկայության ժամանակի ձևավորման ժա­մա­նակը հաշվում ենք RB3-ում 1 սահմանելու պահից մինչև այդ­տեղ 0-ի սահմանման պահը, ուստի այդ ժամանակահատվածը ձևավորելու համար PUNJ ռեգիստրում գրառվելիք n3 hաստա­տունը կորոշենք հետևյալ առնչությունից(տե’ս ծրագիրը).

որտեղից` n3=3:

Իմպուլսների բացակայության ժամանակի ձևավորման համար PUNJ ռեգիստրում գրառվելիք n4 hաստատունը կորոշենք հետևյալ առնչությունից(տե’ս ծրագիրը).

որտեղից` n4=195,(6): Վերցնելով n4=195, իմպուլսների բացակա­յության ժամանակը կստանանք հավասար 598 մկվ: Ծրագրում ավելացնելով երկու nop(տե’ս BACAKA ԵԾ) կստանանք ճիշտ 600 մկվ:

Անցնենք ծրագրի բացատրությանը` հաշվի առնելով նախորդ ծրագրի բացատրու­թյուն­ները և խուսափելով կրկնու­թյուն­ներից:

ՄԿ տիպի գրանցելուց և նրա կազմը(կոնֆիգու­րացիան) ձևավորելուց հետո, գրան­ցում ենք հատուկ բնույթի ռե­գիստրները, ապա անվանակոչում և հասցեավորում ընդհա­նուր բնույթի ռեգիստրները: Այնուհետև, աշխատանքային կետն անցնում է 1 մա­կար­դակի կիսապարբերությունը(100 մկվ) ձևա­վո­րող Mak1 ԵԾ` PORTB մատույցի 3 բիթում սահմանելով 1, որը պահպանվում է փնջի տևողության ողջ ընթացքում: Այնուհետև, աշխատանքային կետն անցնում է 0 մակարդակի տևողության (100 մկվ) ձևավորող Mak0 ԵԾ, ապա իմպուլսների առկայության և բացակայության ժամանակների (600-ական մկվ) ձևավորման  ARKA և BACAKA ԵԾ: ARKA ենթածրագրի առանձնահատկու­թյունն այն է, որ լինելով ցիկլ` ներառում է Mak1 և Mak0 ենթա­ծրագրերի ցիկլերը:

1 և 0 մակարդակները, իմպուլսների առկայության և բացա­կայության ժամանակները ձևավորող բուն ցիկլերը նշավորված են համապատա­սխանաբար` Pause1, Pause2, Pause3 և Pause4 նիշերով:

PIC16F84A միկրոկոնտրոլերով իմպուլսների փնջի ձևա­վորչի էլեկտրական սկզբունքային սխեման բերված է նկ. 1–ում:

 

>>

 

 

2.4. ՂԵԿԱՎԱՐՈՂ ԱԶԴԱՆՇԱՆՈՎ ԻՄՊՈԼՍՆԵՐԻ ՓՆՋԻ ՁԵՎԱՎՈՐՈՒՄԸ

Դիցուք անհրաժեշտ է մշակել սպասող մուլտիվիբրատոր` առաջադրված հետևյալ պահանջներին համապատասխան.

1. Միկրոկոնտրոլերի տրված(օրինակ` RB0) ելուստին թույլատրող ազդանշանի(օրինակ` տրամաբանական 1-ի) յուրա­քանչյուր հայտնման(առկայության) դեպքում միկրոկոնտրոլերի մի այլ` տրված ելուստին(օրինակ` RB5) պետք է ձևավորվի իմպուլսների հաջորդականություն` 100 Հց հաճախությամբ և փնջի 100 մվ տևողությամբ(իմպուլսները տրվում են ձայնային վերար­տադրիչին):

2. Թույլատրող ազդանշանը պետք է սահմանվի ձեռքով` կոճակի սեղմմամբ:

3. Պետք է միջոցներ ձեռնարկել թույլատրող ազդանշանի ձևավորման ժամանակ կոճակի սեղմման պահին միկրոկոնտ­րոլերի աշխա­տան­քի վրա թրթիռների հնարավոր ազդեցությունը բացառելու նպատակով (դրանք կարող են տևել մինչև 0,15 վ):

4. Իմպուլսների ձևավորման(առկայության) ամբողջ ընթաց­քում ՄԿ մի այլ` որոշ ելուստին(օրինակ` RB3) պետք է սահմանված լինի տրամաբանական 1. այդ ելուստին միացվում է լուսադիոդ((իմպուլսների առկայու­թյան ցուցիչ):

Վերլուծենք խնդիրը:

Քանի որ RB0 ելուստին թույլատրող ազդանշանի առկայու­թյան դեպքում պետք է սկսվի(և 100 մվ տևի) 100 Հց հաճախության իմպուլսների ձևավորումը, ապա անհրաժեշտ է ստեղծել այդ ելուստի վիճակի պարբերական ստուգման ենթածրագիր:

Քանի որ ըստ առաջադրանքի թույլատրող ազդանշանը պետք է ձևավորվի կոնտակտային սարքով(կոճակով), որի աշխա­տան­քի ժամանակ որպես կանոն առաջանում են թրթիռ­ներ, որոնք կարող են տևել միչև 150 մկվ, ապա անհրաժեշտ է կազմել ենթածրագիր, որը թույլ կտա 150 մկվ հապաղումով սկսել իմպուլսների ձևավորումը:

Այսպիսով, ամբողջ ծրագիրը պետք է պարունակի թույ­լատրող ազդանշանի առկայության ստուգման(անվանենք Stug), թրթիռների մարման ժամանակը ձևավորող(անվանենք Thrtir),, իմպուլսների 1 մակարդակի կիսապարբերությունը ձևավո­րող (անվանենք Mak1), 0 մակար­դա­կի կիսապար­բերու­­թյունը ձևավո­րող(անվանենք Mak0) և փնջի տևողությունը ձևավորող (ան­վա­նենք Pung) ենթածրագրերը:

Ձևավորվող իմպուլսների տևողությունը`

փնջինը` 100 մվ, թրթիռների մարմանը` 150 մվ, ուստի այդ ժամանակները կարող են ձևավորվել երկուական ռեգիստրներով (ռեգիստ­րային զույգով). կիսապարբերությունների և թրթիռների մարման ընդհանուր բնույթի ռեգիստրային զույգն  անվանենք KPL (կրտսեր բայթ) և KPH(ավագ բայթ), իսկ փնջի տևո­ղու­թյանը` PungL և PungH:

Ռեգիստրային զույգի աշխատանքի սկզբունքը բացատրենք թրթիռների մարման ժամա­նակը ձևավորող ենթածրագրի օրինա­կով: Ռեգիստրային զույգի կրտսեր բայթը(KPL) ցիկլիկ դեկրե­մենտ­վում է ստուգմամբ(decfsz KPL)` մինչև նրա 0-ի հավասար­վելը: Այնուհետև,  նրանում գրառվում է .255, և անցում է կատարվում ավագ բայթի միանգամյա դեկրեմեն­տին: Եթե դեկրեմենտի արդյունքը 0 չէ, անցում է կատարվում կրտսեր` KPL բայթի դեկրեմե­նտին` մինչև նրա զրոյացումը, որից հետո` կրկին ավագ բայթի դեկրեմենտ և այլն: Այս ընթացքը շարունակվում է մինչև ավագ բայթի` 0-ի հավասարվելը, որից հետո անցում է կատարվում հերթական հրամանին: Հանգունորեն ձևավորվում են 1, և 0 մակարդակների կիսապարբերու­թյունները:

 Որոշ առանձնահատկություններ ունի փնջի տևողության ձևավորման ենթածրագիրը: Ի տարբերություն նախորդների, Pung ԵԾ-ի Pause7 և Pause8 ցիկլերի և’ կրտսեր PungL, և’ ավագ PungH բայթի յուրաքանչյուր դեկրեմենտից հետո անցում է կատարվում իմպուլսների լրիվ պարբերության ձևավորմանը:

Համապատասխան ցիկլերի նիշերը նշանակենք` թրթիռ­ների մարմանը` Pause1 և Pause2, 1 մակարդակի կիսա­պար­բե­րու­թյանը` Pause3 և Pause4, 0 կիսա­պար­բերու­թյանը` Pause5 և Pause6, փնջի տևողությանը` Pause7 և Pause8:

Օգտվելով նախորդ ծրագրերից կուտակած փորձից` որո­շենք հապաղման ժամանակների ձևավորման համար անհրա­­ժեշտ(ռեգիստրներում գրվելիք) համապա­տասխան հաստա­տուն­­ները:

Թրթիռների մարման ժամանակի ձևավորման համար KPL-ում գրվելիք թիվը նշանակենք n1, KPH-ում` n2: Հապաղման ժամանակը(տե’ս ծրագիրը)`

կամ`

Լուծելով

հավասարումը` 0 n1 255 և 0 n1 255  պայմանների դեպքում կստանանք` n2=195, n1=204: Այս արժեքների դեպքում թրթիռների մարման ժամանակը կազմում է ճիշտ 150 մվ:

Իմպուլսների փնջի ձևավորման ծրագիրը մեզ ծանոթ է և, ինչպես կիսապարբերությունների, այնպես էլ փնջի տևողության ձևավորման համար անհրաժեշտ հաստատունները, որոնք պետք է գրառվեն, համապատասխանաբար, KPL, KPH  և PunjL, PunjH ռեգիստրային զույգերում, որոշում ենք հանգունորեն. 1 մակարդակի կիսապարբերության համար KPL-ում գրառում ենք .123,  KPH-ում` .7, 0 մակարդակի կիսապարբերու­թյան համար` KPL-ում` .122,  KPH-ում` .7, փնջի տևողության ձևավորման համար` PungԼ-ում` .10, PungH-ում` 1:

Այս ծրագրի համար ՄԿ էլեկտրական սկզբունքային սխեման բերված է նկ. 2–ում. իմպուլսների լսողական գրանցման համար 5 ելուստին միացված է պիեզոտարր, իսկ դրանց առկայության տեսողական գրանցման համար` 3 ելուստին` լուսադիոդ:


>>

 

 

ԳԼՈՒԽ. 3. C ՀԱՅՏԱՆԻՇԻ ԿԻՐԱՌՈՒԹՅՈՒՆՆԵՐԸ

3.1. ԵՌԱԲԱՅԹ ԹՎԵՐԻ ԳՈՒՄԱՐՈՒՄԸ

Առաջին գլխում բերված են սպառիչ տեղեկություններ C հայտանիշի վերաբերյալ, որոնց հիման վրա կարելի է կատարել  բազմաբայթ թվերի գումարում, համեմատում, իսկ ձախ պտույտի կիրառմամբ` նաև կոդերի փոխակերպումներ:

Կազմենք C հայտանիշի կիրառմամբ եռաբայթ թվերի գումարման ծրագիրը:

Գումարելիները կարող են պահպանված լինել EEPROM հիշողությունում, ներածվել PortB-ի RB0,…,RB7 ելուստ­ներով կամ անմիջականորեն բեռնվել ծրագրողի կողմից:

 Ենթադրենք, անհրաժեշտ է գումարել հետևյալ երկու եռա­բայթ թվերը, որոնց գումարը եռաբայթ թիվ է(գու­մար­ման արդ­յուն­քում 25-րդ կարգ չի առաջանում):

Ենթադրենք նաև, որ դրանք բայթ առ բայթ պահվում են EEPROM հիշողության 00h ,…, 02h հասցեով բջիջներում` առաջին գումա­րե­­լին(ավագից` կրտսեր` .114, .127, .235) և  03h,…, 05h հաս­ցեով բջիջներում` երկրորդը(ավագից` կրտսեր`.131, .59, .138):

Այդ թվերը կարող էին լինել օրինակ` ինչ-որ չափումների արդյունք, սակայն քանի որ իրականում այդ չափումները տեղի չեն ունեցել, նախա­պես գումարելիների բայթերը DE դիրեկտիվ­ներով գրառենք նշված բջիջներում, որտեղից  կընթերցենք ու կգրառենք G1H, G1M, G1L և G2H, G2M, G2L ընդհանուր բնույթի ռեգիստրներում: Գումարման արդյունքը պահպան­ենք G2H, G2M, G2L ռեգիստրային եռյակում:

Խնդրի լուծման ալգորիթմը հետևյալն է. նախ գումարվում են G1L և G2L ռեգիստրների պարունակու­թյուն­ները(եռաբայթ գումա­­րելիների կրտսեր բայթերը)` արդյունքը պահպանելով օրինակ` G2L ռեգիստրում(հիշենք, որ վերջնական արդյունքը պետք է պահպանել G2H, G2M, G2L ռեգիստրային եռյակում): Հնարա­վոր է երկու դեպք.

ա) գումարը փոքր է .256-ից: Այդ դեպքում փոխանցում չունենք, և անհրաժեշտ է անցնել միջին բայթերի գումար­մանը:

բ) գումարը մեծ է .256-ից: Այս դեպքում փոխանցում ունենք, ուստի միջին բայթին նախ պետք է գումարել 1(G2M ռեգիս­տրը ինկրեմենտել), իսկ եթե վերջինիս հետևանքով ևս փոխանցում առաջանա, ապա հարկ է ինկրեմենտել նաև G2H ռեգիս­տրը և միայն դրանից հետո գումարել G1M ու G2M ռեգիստրների պարունակու­թյուն­ները:

 Եթե այս գումարման հետևանքով փոխան­ցում առաջանա, ապա դարձյալ G2H ռեգիս­տրը պետք է ինկրեմենտել, նոր միայն անցնել G1H և G2H ռեգիստրների գումարմանը:

Փոխանցման առկայության-բացակայության վերլուծու­թյունն իրա­կա­նացվում է btfss Status,0 հրամանի միջոցով գումար­ման արդյունքի` ըստ C հայտանիշի ստուգմամբ:

Անցնենք ծրագրի կազմմանը(տե’ս ստորև բերված ծրագիրը):

Ծրագրի գլխարկում գրանցված են հատուկ բնույթի,  Status, EEData, EEAdr, EECon1 ռեգիստրները (EEPROM-ում գրառում չենք կատարելու, ուստի IntCon և EECon2 ռեգիստր­ները գրանցելու հարկ չկա), անվանակոչ­ված ու հասցեավոր­ված են ընդհանուր բնույթի G1H, G1M, G1L, G2H, G2M, G2L ռեգիստրները և EEPROM հիշողու­թյունում DE դիրեկտիվներով գրառված են գումարելիների բայթերը:

Այնուհետև, EEPROM հիշողությունից գումարելիներն ընթեր­ցում ենք և գրառում G1H, G1M, G1L, G2H, G2M, G2L ռեգիստր­նե­րում(Nerats ԵԾ): Ապա goto Gumarum1 հրամա­նով անցնում ենք G1L և G2L ռեգիստրների պարունակու­թյուն­ների գումար­մանը, որից հետո btfss Status,C հրամանի միջոցով ստուգում փոխանցման առկայությունն ու կատարում ծրագրի ճյուղավո­րում. մի դեպքում(փոխան­ցումն առկա է) ինկրեմենտում   G2M ռեգիստրը և անցնում Gumarum2 ԵԾ, մյուս դեպքում(փո­խան­ցումը բացակայում է) միանգամից անցնում այդ ԵԾ ու գումարում G1M, G2M ռեգիստրների պարունակությունները: G2M ռեգիստրի ինկրեմենտումից հետո մի անգամ ևս ստուգում ենք գործողության արդյունքը, bcf Status,0 հրամանով կատա­րում C հայտանիշի հարկադրական զրոյացում և փոխանցման առկայության դեպքում ինկրեմենտում G2H-ը: Ապա անցում է կատարվում Gumarum 3 ԵԾ, և գումարվում են G1H, G2H ռեգիստրների պարունակությունները:

Գումարման արդյունքը պահպանվում է G2H(F5), G2M(BB) և G2L(75) ռեգիստրներում:

Եթե եռաբայթ թվերի գումարն ստացվեր քառաբայթ, գու­մար­ման արդյունքում առաջանար 25-րդ կարգ, ապա այդ կար­գը գրանցված կլիներ C-ում(Status ռեգիստրի 0 բիթում):

Ստորև բերվում է C հայտանիշի կիրառմամբ եռաբայթ թվերի գումարումն իրականացնող Gumar ծրագիրը:


>>

 

3.2. ԹՎԵՐԻ ՀԱՄԵՄԱՏՈՒՄԸ (ԿԱՄՊԱՐԱՑԻԱՆ)

C հայտանիշի կիրառմամբ կարելի է կառուցել թվերի համեմատիչ 

Դիտարկենք հետևյալ խնդիրը. եթե EEPROM հիշողության 01h և 02h բջիջներում գրառված երկու թվերից( օրինակ` .150 կամ .85) մեկն ընկած է [100, 200] միջակայքում, ապա իրակա­նացվի Ajo ենթածրագիրը(օրինակ` Ardjunq անվանումով ընդհա­նուր բնույթի ռեգիստրում .111 թվի գրառման գործողությունը), հակառակ դեպքում` Voch ԵԾ(նույնում .222 գրառման   գործո­ղությունը): Խնդրի լուծման ալգորիթմը հետևյալն է. եթե EEPROM հիշողության նշված բջիջներից մեկում գրառված թիվը փոքր չէ 100-ից, ապա նրա և 156-ի գումարը կլրացնի(կգերլցնի) մեկ բայթանոց ռեգիստրը, ուստի կառաջանա փոխանցում` C=1, իսկ եթե այդ թիվը մեծ չէ 200-ից, ապա նրա և 55-ի գումարը չի լրացնի ռեգիստրը` C=0: Այս երկու պայմանների համատեղ իրականա­ցումը կվկայի, որ այդ թիվը պատկանում է նշված միջակայքին և պետք է անցնել Ajo ԵԾ-ի կատար­մանը(Ardjunq ռեգիստրում .111 գրառելուն), իսկ եթե դրանցից գոնե մեկը տեղի չունի, ապա պետք է անցնել Voch ԵԾ կատար­մանը(Ardjunq ռեգիստրում .222 գրառելուն):

Որպեսզի հաճախ չդիմենք EEPROM հիշողությանը(հրա­ման­ների քանակը մեծ է), ստուգվող թվի համար նախատեսենք ընդհանուր բնույթի Reg ռեգիստրը:

Այսպիսով, ծրագիրն իրականացնելու համար անհրաժեշտ է գրանցել հատուկ բնույթի Status, EEAdr, EEData և EECon1 և ընդհանուր բնույթի`  Reg և Ardjunq ռեգիստրները:

Նշված գործառույթն իրականացնող ծրագիրը բերված է ստորև:

 Ծրագրի աշխատանքը MPLAB միջավայրում դիտելու  նպա­տակով, EEPROM հիշողությունում գրառված են երկու թվեր, որոնցից մեկը պատկանում է, մյուսը` չի պատկանում նշված միջակայքին: Նույն նպատակով ծրագրի սկզբում բերված են EEPROM հիշողությունից երկու թվերի ընթերցման հրամանա­խմբերը, որոնցից մեկը MPLAB-ում դիտելիս կետ-ստորա­կետներով կարող է անտեսվել:

Այնուհետև, կուտակիչը բեռնում ենք .156-ով և գումարում Reg-ի պարու­նակությանը: btfss Status,C ստուգիչ հրամանի միջոցով նախ որոշում ենք, թե Reg ռեգիստրից կուտակիչ բերված թիվը փո՞քր է արդյոք 100-ից: Եթե այդպես է` C=0, ապա աշխատան­քային կետն ուղղակի անցնում է  Voch ԵԾ, հակառակ դեպքում(C=1)` Stug2 ԵԾ: Այստեղ ստուգվող թվին այս անգամ գումարում ենք .55 և btfsc Status,0 հրամանով ստուգում` փո՞քր է արդյոք ստուգվող թիվը 200-ից: Եթե արդյունքը մեծ է .256-ից` C=1, ապա աշխատանքային կետը դարձյալ անցնում է Voch ԵԾ, հակառակ դեպքում` C=0, Ajo ԵԾ: Այսպիսով,  միայն թվի` 100-ից մեծ և 200-ից փոքր լինելու դեպքում  աշխատանքային կետը կանցնի Ajo ԵԾ:

 

>>



3.3. ՇՐՋԱՆԱՅԻՆ ՏԵՂԱՇԱՐԺԻ (ՊՏՈՒՅՏԻ) ԿԻՐԱՌՈՒԹՅՈՒՆՆԵՐԸ

Շրջանային տեղաշարժն իրականացնում են RLF(տեղա­շարժ կամ պտույտ ձախ) և RRF(տեղա­շարժ կամ պտույտ աջ)  հրաման­ները:

RLF հրամանով տեղի է ունենում պտույտ ձախ. Status ռեգիստրի C բիթը գրառվում է f ռեգիստրի կրտսեր բիթում, f ռեգիստրի բիթերը մի կարգով տեղաշարժվում ձախ (ավագ բայթը գրառվում է C-ում):

 

>>

 

3.4. ԹՎԵՐԻ ԲԱԶՄԱՊԱՏԿՈՒՄԸ

Պարզվում է, որ եթե C=0(իսկ դրան միշտ կարելի է հասնել bcf Status,0 հրամանով), ապա ձախ պտույտ կատարելը հան­գեց­նում է f ռեգիստրի պարունակությունը 2-ով բազմապատ­կե­լուն: Օրինակ. դիցուք f ռեգիստրի պարունակությունը 00101011=.43 թիվն է: Մեկ ձախ տեղաշարժից կամ պտույտից հետո ռեգիստրի պարունակությունը կլինի 01010110=.86: Կատարելով ևս մեկ ձախ պտույտ` կստանանք 10101100=.172: Այս երկու դեպքում էլ C-ի պարունակությունն անփոփոխ է` 0: Սակայն ևս մեկ ձախ պտույտից հետո f-ի պարունակությունը կդառնա 01011000=.88, իսկ C=1: Այս անգամ, կարծես թե բազմա­պատկում երկուսով չստացվեց, սակայն դա` միայն առաջին հայացքից: Բանն այն է, որ C-ն հարկ է դիտել որպես լրացուցիչ` 9-րդ կարգ. այդ դեպքում կստանաք 101011000 = 256 + 88 = 344, որը դարձյալ մինչև տեղա­շարժը f-ի պարունա­կու­թյան կրկնապա­տիկն է:

 Վերցնենք նախորոք 0-ացված  ընդհանուր բնույթի ևս մեկ ռեգիստր, նրանում գրառենք C-ի արժեքը(ստեղծենք ավագ բայթի ռեգիստր) և C-ն 0-ացնենք: Այժմ հաջորդաբար ձախ տեղա­շար­ժենք նախ կրտսեր, ապա` ավագ ռեգիստրների պարու­նակություն­ները: Երկբայթ ռեգիստրի պարունակությունը կկրկնապատկվի: Ահա այսպես փոխնի­փոխ ձախ պտույտ կատարելով այժմ արդեն երկ­բայթ թիվը կբազմապատկվի երկուսով:

Եթե ավագ բայթի պտույտի հետևանքով C-ի արժեքը դառնում է 1, ապա անհրաժեշտ է վերցնել նոր(ավագագույն) բայթի ռեգիստր և այժմ արդեն հաջորդաբար տեղաշարժել (կատարել ձախ պտույտ) երեք բայթերը:

Իսկ ինչպե՞ս a թիվը բազմապատկել երկուսի աստիճան չհան­դիսա­­ցող թվով, օրինակ` 9-ով: Քանի որ 9=23+1, ապա արտադրյալը`  ուստի այն կստանանք երեք անգամ կատարելով պտույտ ձախ, այնուհետև` արդյունքին մեկ անգամ գումարելով սկզբնական թիվը(իհարկե կարելի էր չորս անգամ պտույտ ձախ և յոթ անգամ` հանում, սակայն դա ռա­ցիո­նալ չէր լինի):

Ստորև բերված է միաբայթ թվի` 10-ով բազմապատկ­ման ծրագիրը:

Նախ` արտադրյալի հնարավոր առավելագույն արժեքը`   է, ուստի անհրաժեշտ է ընդհանուր բնույթի երկու ռեգիստր` մեկն ավագ(RegH), մյուսը` կրտսեր(RegL) բայթի համար:

Նախապես RegH ռեգիստրը 0-ացվում է և ինչ-որ տեղից (օրինակ` EEPROM հիշո­ղությունից, մատույցից կամ ուղղակի` ծրագրորեն) RegL-ում գրառվում 10-ով բազմա­պատկ­վող թիվը, որն այնուհետև փոխանցվում է W ռեգիստր: Քանի որ 10=23+2, ապա հարկ է նախ արտադրիչը բազմապատկել 23-ով, այնու­հետև արդյունքին երկու անգամ գումարել արտադրիչը:

2-ով բազմապատկումն իրականացվում է հրամանների հետև­յալ երկյակների միջոցով.

Առաջին հրամանով RegL ռեգիստրի պարունակությունն է ենթարկվում ձախ պտույտի, երկրորդով` RegH ռեգիստ­րի պարու­­նա­կությունը: Ակնհայտ է, որ RegH-ի ձախ պտույտը չի կարող C հայտանիշում 1 առաջացնել(արտադրյալը չի կարող գերազանցել 2550-ը):

Երեք անգամ հրամանների այս երկյակը կատարելով, տրված թիվը կբազմապատկենք 23=8-ով: Վերջնական արդյունքն ստա­նալու համար հարկ է բազմապատկման արդյունքին երկու անգամ գումարել սկզբնական թիվը(արտադրիչը):

 Քանի որ movf RegL,0 հրամանից հետո W ռեգիստրը չի մասնակցել ծրագրի կատարմանը, ապա նրա պարունակու­թյու­նը սկզբնա­կան թիվն է, ուստի մնում է միայն այն երկու անգամ գումարել բազմա­պատկման արդյունքին` հրամանների հետևյալ եռյակի օգնությամբ.

Առաջին հրամանով RegL ռեգիստրի պարունակությունը (բազմապատկման արդյունքը) գումարվում է W-ի պարունակու­թյանը, երկրորդով ստուգվում C հայտանիշը: Այնուհետև ծրա­գիրը կարող է ընթանալ ըստ երկու շարունակությունների. եթե C-ն 1 է, անցնել հաջորդ հրամանին, եթե C-ն 0 է, հաջորդ հրա­մանն անտեսել և RegL ու W ռեգիստրների պարունա­կու­թյուն­­­ները կրկին գումարել: Ակնհայտ է, որ incf RegH,1 հրամանը C հայտանիշը 1 դարձնել չի կարող: Հրամանների այս եռյակը կատա­րելուց հետո աշխատանքային կետն անցնում է ծրագրի շարունա­կությանը:

 

>>

 

3.5. ԵՐԿՈՒԱԿԱՆ ԹՎԵՐԻ ՓՈԽԱԿԵՐՊՈՒՄԸ ԵՐԿՈՒԱԿԱՆ-ՏԱՍԱԿԱՆԻ

Հաճախ, հատկապես` թվային չափման և արտապատ­կեր­ման բնագավառում, անհրաժեշ­տ է լինում երկուական թիվը փոխակերպել երկուական-տասական թվի:

Լուծենք հետև­յալ հույժ գործածական խնդիրը. դիցուք REGHH, REGH, REGM, REGL ռեգիստրներում գրառված քառաբայթ երկուական թիվը անհրա­ժեշտ է փոխակերպել երկուական-տասական թվի: Ակնհայտ է, որ այդ ռեգիստրներում գրառվելիք թվի առավելագույն արժեքը 11111111 11111111 11111111 11111111=4294967295-ն է, որը կազմում է երկուական տասական 10 կիսաբայթ: Սակայն, նախ բավարարվենք փոխա­կերպ­վող թվի հետևյալ առավելագույն արժեքով

որը կազմում է ութ կիսաբայթ: ՄԿ-ը կես բայթ ծավալով ռեգիստր չունի, ուստի փոխակերպ­ման արդյունքի գրառման համար հարկ է նախատեսել ութ ռեգիստր, որոնցից յուրաքանչյուրում կգրառ­վի մեկ կիսաբայթ(երկուական-տասական թիվ):

Ըստ տեսության, m բայթանի երկուական թիվը  երկուական-տասականի վերածելու համար անհրաժեշտ է.

1. Վերցնել 0 արժեքով m բայթանի ևս մի թիվ, այն տրվածին զուգակցելով կազմել 2m բայթանի թիվ, որի բոլոր կրտսեր(m  թվով) բայթերը 0 են:

 2. Յուրաքան­չյուր բայթ հերթականորեն, սկսած կրտսերից` ենթարկել ձախ տեղաշարժի(պտույտի):

3. Նրանցից յուրաքանչյուրին` սկսած կրտսերից, գումարել 3 և ստուգել արդյունքի թիվ 3 բիթը. եթե այն 1 է, ապա արդյունքը գրառել նույն բայթում, եթե 0 է, արդյունքին գումարել 30h(.48):

4.  Ստուգել վերջին գումարման արդ­յունքի թիվ 7 բիթը. եթե այն 1 է, ապա արդյունքը գրառել այդ բայթում, եթե 0 է, անցնել հաջորդ` առավել ավագ բայթին:

5. Վերջին` ութերորդ բայթի նկատմամբ նույն գործողություն­ները կատարելուց հետո, դարձյալ անցնել բայթերի ձախ պտույտներին և այսպես` 8m անգամ, որոնց արդյունքում ավագ m թվով բայթերի 2m թվով կիսաբայթերը կկազմեն որոնելի երկուական-տասական  թիվը:

Այժմ կազմենք այդ փոխակեր­պումն իրականացնող ծրագիրը (բեր­ված է ստորև):

Ինչպես տեսնում ենք, գլխարկում գրանցված են հատուկ բնույթի Status, FSR և INDF ռեգիստրները, անվանակոչված և հասցեա­վորված են ընդհանուր բնույթի REGL, REGM, REGH, REGHH, REG0, REG1, …, REG7, Hashv և OJ ռեգիստրները, ընդ որում` Hashv-ում գրառվում է փոխակերպվող երկուական թվի բիթերի քանակը` 84=32, իսկ OJ-ը ծառայում է որպես օպերա­տիվ հիշողու­թյան(օժանդակ) ռեգիստր:

Start ԵԾ-ում ինչ-որ տեղից(օրինակ` EEPROM հիշողությու­նից, ստեղնաշարից կամ ծրագրորեն) փոխակերպվելիք երկուա­կան թիվը գրառ­վում է REGL, REGM, REGH, REGHH ռեգիստր­նե­րում, որտեղ REGHH-ը ավագագույն բայթն է(ծրագրում 98765432 =00000101 11100011 00001010 01111000 թիվը նե­րած­վում է EEPROM հիշողությունից. ավագագույն բայթում 00000101=.5, ավագ բայթում` 11100011=.227, միջին  բայթում` 00001010=10, կրտսերում` 01111000=.120): Այնուհետև,  call Pokh2_10 հրամա­նով պայմա­նա­կան ան­ցում է կատար­վում(ըստ սթեքի) Pokh2_10 ԵԾ: Այստեղ կատար­վում են նախապատ­րաստական գործողու­թյուն­­ները. նախ 0-աց­վում է Status ռեգիստրի C բիթը, ապա REG0, REG1, …, REG7 ռեգիստրները և Hashv ռեգիստրում գրառվում է .32: Այնուհետև անցում է կատարվում PTUJT ԵԾ` REGL, REGM, REGH, REGHH, REG0, …, REG3 ութ ռեգիստրների հաջոր­դա­­կան(կրտ­սերից` REGL-ից, ավագ` REG3) ձախ պտույտներին, որոնց հաջոր­դում է Hashv ռեգիստրի դեկրեմենտ` ստուգումով(ըստ Z հայտա­նի­շի): Քանի դեռ Hashv-ի պարունակությունը 0 չէ,  յուրաքանչյուր անգամ ծրագրի աշխա­­­տան­քային կետն անցնում է HASCE ԵԾ, որտեղ հերթակա­նո­րեն նախապատ­րաստ­վում է REG0,…,REG3 ռե­գիստր­ների անուղ­ղա­կի հասցե­ագրումը. movlw  REGi(i - ն հեր­թա­կան ռե­գիստ­րի համարն է) հրամանով W-ն բեռնվում է REGi ռեգիստրի հասցեով, իսկ movwf     FSR,1 հրա­մանով` պատճենվում FSR-ի մեջ: Այս­պի­սով, FSR ռե­գիստ­րին է փոխանցվում REG0…REG3 ռեգիստր­նե­­րից մեկի(սկսած REG0-ից) հաս­ցեն, ապա կատարվում է անուղղակի անցում GUM ԵԾ: Այստեղ այդ ռեգիստրի պարունակությանը գումարվում է 3, արդյունքը փոխանցվում OJ ռեգիստր և ստուգ­վում վերջինիս թիվ 3 բիթն ըստ Z հայտանիշի. եթե այն 0 չէ, ապա գումարման արդյունքը` W ռե­գիստրի պարու­նա­­կու­թյունը, գրառվում է տվյալ ռեգիստ­րում(REGL ,…, REG3), եթե 0 է, վերջինիս պարունա- կությանը գումարվում է .48, արդ­յուն­քը փոխանցվում OJ ռեգիստրին և ստուգվում նրա պարունա­կության, այս անգամ` թիվ 7 բիթն ըստ նույն հայտանիշի. եթե այն 0 չէ, ապա գումարման արդյունքը  գրառվում է տվյալ ռեգիստ­րում, եթե 0 է, retlw 0 հրամանով տեղի է ունենում W-ի 0-ացում և ըստ սթեքի վերադարձ HASCE ԵԾ` հաջորդ ռեգիստրի նախա­պատ­րաստմանն անուղղակի հասցեագրման:

 Սա ծրագրի փոքր շրջանն է, որը կատարվում է ռեգիստր­ներից յուրաքանչյուրի նկատմամբ:

 Բոլոր` REG0,…, REG3, ռեգիստրների նկատմամբ HASCE ԵԾ իրականացնելուց հետո ծրագրի աշխատանքային կետն անպայ­ման անցումով(goto PTUJT) վե­րա­դառնում է PTUJT ենթածրագ­րին: Սա ծրագրի մեծ շրջանն է:

Այնուհետև REGL, REGM, REGH, REGHH, REG0,…,REG3 ռեգիստրների պարունակությունները դարձյալ ձախ պտույտի են ենթարկվում, և այս ամենը կրկնվում է 32 անգամ(քանի դեռ Hashv ռեգիստրի պարունակու­թյունը 0-ի չի հավա­սար­վել):

Այս գործողություննե­րի իրագործումից հետո REG0,…,REG3 ռեգիստրների կիսաբայ­թերը կազմում են որոնելի երկուական-տասական թվի կարգերն ըստ ավագու­թյան: Այժմ անհրաժեշտ է այդ կիսաբայթերից յուրաքանչյուրը զետեղել առան­ձին ռեգիստ­րում: Սակայն, ինչպես նշվեց, ՄԿ կիսաբայթ ռեգիստր չունի, և հարկադրված ենք վերցնել միաբայթ ռեգիստրներ և կրտ­սեր կիսաբայթերում գրառել փոխակերպման արդյունքնե­րը(ավագ կիսաբայ­թերը կպարունակեն միայն 0-ներ):

Փոխակերպման արդյունքը գրառենք REG0…REG7 ռե­գիստրներում, ընդ որում` ավագ կարգը REG7-ում, կրտսերը` REG0-ում:

Երկուական-տասական թվի ավագ կարգը REG3-ի ավագ կիսաբայթն է. այն պետք է գրառել REG7-ի կրտսեր կիսաբայ­թում: Դրա համար svapf REG3,0 հրամանով փոխանա­կում ենք REG3 ռեգիստրի կիսաբայթերը` արդյունքը գրառում W-ում, ապա վերջինիս պարունակությունը բազմա­պատ­կում .15 (00001111)-ով ու փոխադրում REG7 ռեգիստր:

REG3-ի կրտսեր կիսաբայթը պետք է փոխադրել REG6 ռեգիստր: Այս դեպքում արդեն առանց կիսաբայթերի փոխանակ­ման REG3-ի պարունա­կությունը գրառում ենք W-ում, բազմա­պատ­կում այն .15-ով և փոխադրում REG6 ռեգիստր: Նույն գոր­ծո­ղությունները կատա­րե­լով REG2,…,REG0 ռեգիստրների նկատ­­մամբ, REG0 ,…, REG7 ռեգիստրներում կստանանք երկու­ական թիվ-երկուական-տասական թիվ փոխակերպման արդ­յունքը:

Սկզբում նշեցինք, որ չորս ռեգիստրներում գրառելի առավելագույն թվի արժեքը 11111111 11111111 11111111 11111111 = 4294967295-ն է, որը կազմում է երկուական տասական 10 կիսաբայթ, սակայն բավարարվեցինք 00000101 11110101 11100000 11111111=99999999 առավելագույն արժե­քով: Այնուամենայնիվ, ի՞նչ անել, եթե անհրաժեշտ է դրանից մեծ թիվ փոխակերպել: Պարզվում է, որ այդ խնդիրը լուծելու համար նախ անհրաժեշտ է վերցնել ընդհանուր բնույթի ևս երկու ռեգիստր(REG8, REG9), ներառել դրանք Pokh2_10  ենթածրագրում(clrf   REG8, clrf   REG9), ապա REG4-ը ներառել Ptujt ենթածրագ­րում(rlf REG4,1): Ի վերջո KISAB ենթածրագրում ավելացնել

          հրամանախումբը: Պտույտների թիվը մնում է նույնը` 8m =32 (շեշ­տենք` m-ը երկուական թվի բայթերի թիվն է, ոչ թե` ռեգիստ­րային զույգերինը):

ԵՎս մի դեպք. հնարավոր է, որ փոխակերպվող թվի առավե­լա­գույն արժեքը` տասական համակարգով, արտահայտվի ին­նա­նիշ թվով(ռեգիստրների կենտ թիվ): Այս դեպքում անհրաժեշտ է վերցնել ևս միայն մեկ ընդհանուր բնույթի ռեգիստր(REG8), և աjն ներառել, միայն Pokh2_10(clrf   REG8,), և PTUJT(rlf   REG8,1) ենթածրագրերում: Պտույտների թիվը նույնն է` 32:

>>



ԳԼՈՒԽ 4. ԸՆԴՀԱՏՈՒՄՆԵՐԻ ԿԻՐԱՌՈՒԹՅՈՒՆՆԵՐԸ

4.1. ԸՆԴՀԱՏՄԱՆ  ՌԵԺԻՄԸ

Հաճախ անհրաժեշտ է լինում արտաքին ազդակի գործողու­թյան(PIC-ի որևէ ելուստի վիճակի փոփոխության) պահին անցնել որոշ ԵԾ կատարմանը: Դա կարելի է անել(և հաճախ արվում է) ծրագրով` այդ հայտանիշի պարբերական ստուգմամբ, սակայն ծրագիրն առա­վել պարզ է դառնում` օգտվելով այսպես կոչված` ընդհա­տում­ներից կամ ընդհատումների ԵԾ-ից: Վերջինս գործարկ­վում է արտաքին ղեկա­վարման` ընդհատումների աղբյուրի ազդանշա­նով:

Գոյություն ունեն ընդհատումների մի քանի աղբյուրներ` INTCON ռեգիստրի թիվ 7 բիթը(GIE), որը տալիս է ընդհատման համապարփակ թույլատվություն(արգելք),  թիվ 6 բիթը(EEIE), որը թույ­լատ­րում(արգե­լում) է ընդհատումը տվյալների EEPROM հիշո­ղու­թյու­նում ինֆորմացիայի գրառ­ման ավարտին, թիվ 5 բիթը (TOIE), որը թույլատրում(արգելում) է ընդհատումը TMR0 թայմե­րի գերլցման դեպքում, թիվ 4 բիթը(INTE), որը թույլատ­րում (արգելում) է ընդհատումը ՄԿ RB0/INT ելուս­տին և թիվ 3 բիթը (RBIE), որը թույլատրում (արգելում) է ընդհատումը RB4…RB7 ելուստնե­րից մեկին ազդանշանի փո­փոխ­ման դեպ­քում(այդ դեպքում նշված ելուստներին պետք է շնորհ­ված լինի մուտքի կարգավիճակ):

Դիտողություն.- A կամ B մատույցի ոչ մի ելուստ, բացի RB0 ելուստից, որպես արտաքին INT ընդհատման մուտք չի կարող լինել(այլ ընդհատման` կարող է):

  Ընդհատումների կիրառման դեպքում ամբողջ ծրագիրը տրոհվում է հիմնական մարմնի և ընդհատումների ԵԾ-ի: Վերջինս հրամանների խումբ է, որն սկսվում է ընդհատումների թույլտվու­թյամբ և ավարտվում դրանց արգելման ու հիմնական մարմնին վերադարձի հրամանով:

Ընդհատման էությունը հետևյալն է. ենթադրենք ընդհատումն իրականացվելու է ըստ INT(RB0) մուտքի ղեկավարող ազդա­նշա­նի ակտիվ ճակատի(դրական կամ բացասական):

 Նախ` Start ԵԾ-ն պետք է սկսվի բոլոր ընդհատումներն արգելող clrf Intcon հրամանով(դա կարելի է անել նաև Intcon,GIE հրամանով), քանի որ ընդհատում­ները լինելու են հետո: Այնու­հետև, ծրագիրն իրականացվում է մինչև ընդհատման տիրույթի սկիզբը, որտեղ ընդհատման թույլ­տվու­թյուն է տրվում և սկսում ձևավորվել ու ընթանալ ընդհատման ազդանշանի սպասման ժամա­նակը: Ընդհատման տիրույթի վերջում դարձյալ ընդհա­տում­ներն արգելվում են, և ծրագրի աշխատանքային կետն անցնում է հիմնական մարմնի կատարման նոր շրջանին:

 Եթե ընդհատումը բացակայում է, աշխատանքային կետը մնում է նրա հիմնական մարմնի սահմաններում, իսկ երբ այն հայտնվում է, անմիջապես տեղի է ունենում թռիչքաձև անցում ընդհատման ԵԾ` ըստ սթեքի: Դա նշանակում է, որ նախ սթեքում ավտոմատ գրառվում է այն հրա­մանի հասցեն, որը պետք է կատարվեր, եթե ընդհատումը չլիներ:

Այնուհետև, ծրագրորեն պահ­պանվում են W և STATUS ռեգիստրների պարունակությունը` նախա­պես այդ նպա­տակով ստեղծված ընդհանուր նշանակու­թյան Stat_Temp և W_Temp ստանդարտ անվանումներով ռեգիստրնե­րում(կա­­րելի է նաև` այլ անվա­նում): Ընդհատման ազդանշանի վերանա­լուց հետո, գրառված տվյալները վերադարձվում են համապա­տաս­խան ռեգիստրներ, պահված հրամանը` PC ռեգիստր և աշխատան­քա­յին կետը վերադառնում է սթեքում գրառված հրամանը կատարելու:

Չա­փա­զանց կարևոր է, որ ընդհատման ԵԾ-ից վերադառնա­լիս(retfie հրամանից առաջ) զրոյացվի ընդհատման աղբյուրի համա­պատաս­խան հայտանիշը(իջեցվի դրոշակը)` bcf Intcon,1 հրա­մանով:

>>

 

 

4.2. ՄԻԱԿՈՂՄ ՎԵՐԱՀԱՂՈՐԴԻՉՆԵՐԻՑ ԵՐԿԿՈՂՄ ՎԵՐԱՀԱՂՈՐԴՉԻ ԿԱՌՈՒՑՈՒՄԸ

Դիտարկենք ընդհատումների կիրառմամբ մի խնդիր:

Ենթադրենք, ունենք մի վերահաղորդիչ(ռետրանսլյատոր), որը կարող է աշխատել երկու ռեժիմում. ընդունել X հաճա­խու­թյան և վերահաղորդել Y հաճա­խու­թյան ալիքներ, կամ ընդունել Y և հաղորդել X հաճա­խության ալիքներ: Այդ կոմբինացիա­ները(ռեժիմները) կարելի է ընտրել` վերահաղորդչի հաճախու­թյուն­ների ընտրման մուտքին 1 կամ 0 սահմանելով:

 Ընդունիչն ունի ելք, որտեղ հայտնվում է 0, երբ ընդունիչ տրակտում հայտնվում է ռադիոազդա­նշան:

Պահանջվում է կառուցել վերահաղորդիչ, որն իրականացնի «երկկողմ» վերահաղորդում (եթե ընդունիչ տրակտում հայտվում են X հաճախության տատանումներ, դրանց պարունակած ինֆոր­մացիան վերահաղորդի Y հաճախու­թյամբ և, եթե հայտնվում են Y հաճախության տատա­նում­ներ, ապա վերահա­ղորդի X  հաճախու­թյամբ):

ՈՒրվագծենք ծրագրի կառուցվածքը:

1. Անհրաժեշտ է հաճախության համալար­ման մուտքին պարբերաբար 0 կամ 1 մատուցելով` ընդունիչը համալարել X և ու հաղորդիչը Y հաճախություններին` ընտրելով XY կամ` ընդունիչն Y հաճա­խու­թյան և հաղորդիչը` X, ընտրելով YX կոմբի­նացիա­ն: Հաճախու­թյունների կոմբինացիայի ընտրման ազդա­նշա­նը ձևավորենք ընդհանուր բնույթի Trigg ռեգիստրով` ընդունիչ տրակտում ազդա­նշանի առկայության կամ բացակա­յու­թյան յուրաքանչյուր ստու­գումից և վերահաղորդումից հետո` ինկրեմենտելով նրա պարու­նակու­թյունը: Դրա հետևանքով ռեգիստրի թիվ 0 բիթը հաջորդա­բար կընդունի 0 և 1 արժեքներ, որով էլ կընտրենք հաճախու­թյունների կոմբինացիան` այդ բիթի արժեքը պատճենելով PortB մատույցի որևէ(օրինակ` թիվ 2) ելուստին, որը միացած է վերա­հա­ղորդչի հաճախությունների կոմբինացիայի ընտրման մուտքին: Այդ ենթածրա­գիրն անվա­նենք Komb:

 2. Կոմբինացիան ընտրելուց հետո անհրաժեշտ է որոշ ժամանակ սպասել, մինչև ան­ցո­ղիկ պրոցեսները դադարեն(վե­րա­հաղորդչի գեներա­տո­րը կամ սին­թեզատորը, ինչ­պես յուրա­քան­­չյուր ռադիոտեխնիկա­կան սարք, օժտված է իներցիայով, ուստի տատանումների կայացման համար մոտ 100 մվ ժամանակ է պետք: Այս ենթածրագիրն անվանենք Pause1: Այն երկբայթ հաշվիչով ձևավորում է կայացման ժամանակը(կրտսեր բայթի KJL և ավագ բայթի ASJ ռեգիստրային զույգով):

3. Ընդունման և հաղորդման հաճախությունների տվյալ (օրինակ` XY) կոմբինացիայի դեպքում անհրաժեշտ է ձևավորել INT ընդհատման ազդանշանի(RB0 ելուստին` 0) սպասման որոշ ժամանա­կահատ­ված. եթե այդ  ընթացքում ընդհատում տեղի չի ունենում(RB0 ելուստին` 1-ի առկայություն, այն է` ընդունիչում ռադիո­ազդանշանը բա­ցա­կայու­մ է), ապա փոխել հաճախու­թյունների կոմբինա­ցիան(YX) և ամեն ինչ սկսել նորից: Եթե այդ  ընթացքում ընդհա­տում տեղի ունենում է( RB0 ելուստին` 0` ընդունիչում ռադիոազդանշանի առ­կայու­թյուն), անցնել ընդհատման ենթածրագ­րին(INT):

Ընդհատման ազդանշանի սպասման այս ենթածրագիրն անվանենք Pause2, որն իրականացվում է երկբայթ(ավագ բայթի ռեգիստրը` ASJH, կրտսեր բայթինը` ASJL) հաշվիչի օգնու­թյամբ: Այս սպասման ժամանակահատվածը կարող է լինել վայրկյանի տասնորդական մասեր, քանի որ այդ ընթացքում հազիվ թե ինֆորմացիայի էական փոփոխություն լինի:

Ծրագրի աշխատանքային կետը ընդհատման INT ԵԾ մտնելիս նախ W և Status ռեգիստրների պարունակությունները պետք է պահպանվեն: Ի տարբերու­թյուն CALL անուղղակի հաս­ցեա­գրման հրամանի, որի դեպքում անհրաժեշտ տվյալներն ավտո­­մատ պահպանվում են սթեքում, ընդհատման դեպքում, ինչպես նշվեց, այդ նպատակով նախատեսվում են երկու հատուկ ռեգիս­տրներ, սովորաբար` W_Temp և Stat_Temp անվա­նում­ներով:

4. Ընդհատման INT ԵԾ-ում աշխատանքային կետը պետք է մնա այնքան ժամանակ, քանի դեռ ընդունիչի ազդանշանը չի չքացել, այսինքն` անհրաժեշտ է պարբերաբար հարցում կատա­րել ընդունիչի ազդանշանի առկայության մասին(PortB,0 բիթի վիճակի հարցում), որի արդյունքից ելնելով կամ պետք է լքել ընդհատման ԵԾ ու անցնել ընդհատման ծրագրից ելնելու EndInt ԵԾ(եթե ընդունիչի ազդանշանը բացակա է), կամ նորից անցնել հարցման(եթե ընդունիչի ազդանշանն առկա է):

Ընդհատման ԵԾ-ում աշխատանքային կետի հա­պաղ­­ման ենթածրագիրն անվա­նենք Stug, իսկ նրանում ներառված յուրաքանչյուր ցիկլի իրակա­նաց­ման ենթածրագիրը` PAUSE3: Վերջինում հապա­ղումն իրականացվում է երկբայթ(ավագ բայթը` YJH, կրտսեր բայթը` YJL) հաշվիչի օգնությամբ:

Ընդհատման ծրագրի իրականացման ընթացքում ընդունիչի ազդանշանի վերաց­ման դեպ­քում անցում է կատարվում ընդ­հատ­ման ծրագրից ելնելու EndInt ենթածրագրին, որում W, Status ռեգիստրների` պահ­պան­ված արժեքները նախ վերա­դարձ­վում են այդ ռեգիստրներ, ապա անցում է կատարվում ծրագրի` սթեքի գագաթի հրամանի կատարմանը:

Վերլուծենք ծրագիրը(այն բերվում է ստորև):

Նախ սահմանենք կոնֆիգուրացիայի բիթերը. CP-ի պաշտպանության բիթն անջատված է, հերթապահ WDT թայմերը միացած է, կվարցային գեներատորը(օգտագործ­վում է 4 ՄՀց–անոց կվարց) աշխատում է ստանդարտ գեներա­տո­րի(XT) ռեժիմում: Նշված են PIC-ի տիպը, կոնֆիգուրացիայի սահման­ված բիթերը: Գրանցված են հատուկ  բնույթի ռեգիստրները, անվանված և հաս­ցեա­վորված են ընդհանուր նշանա­կու­թյան ռեգիստրները:

Նշված է ծրագրի սկզբին(org 0) և ընդհատումներին(org 4)  անցման կետերը(եթե ծրագ­րում ընդհատում է կիրառվում` միշտ առկա է org 4 դիրեկտիվը):

Ծրագրի իրականացումն սկսվում է Start ԵԾ: Նախա­պատ­րաստական գործողություն­ների, վերահաղորդման ուղղության (հա­ճա­խությունների կոմբինացիայի) ընտրման, ինչ­պես նաև կայացման ժամանակի ձևավորման ընթացքում, ընդհա­տում չպետք է լինի, ուստի նախ արգելվում են բոլոր ընդհատում­ները(clrf IntCon):

Ծրագրում մի քանի անգամ հանդիպող clrwdt հրամանը, ինչպես արդեն նշվել է, 0-ացնում է WDT հերթապահ թայմերը և նպատակ ունի ՄԿ զերծ պահել «կախվելուց»: 

Քանի որ ընդհատումն իրականանում է B մատույցի թիվ 0 ելուստի ազդանշանով, ապա նրան շնորհվում է մուտ­քի, մնա­ցած­­ներին` ելքի կարգավիճակ` TrisB ռեգիստրում 00000001 գրառմամբ: OptionR ռեգիստրում գրառվում է 00000000:  OptionR ռեգիստրի թիվ 6 բիթը սահմանելով  0, ընդհատման ղեկա­վարող ազդանշանի ակտիվ ճակատն ընտրում ենք ետինը (1-ից 0 թռիչքը), իսկ  թիվ 7 բիթը 0 սահմանելով, միաց­նում ենք ձգող դիմադրիչները: Անցնում ենք 1 բանկ:

Այնուհետև, Komb ԵԾ առաջին` btfsc Trigg,0 հրամանով ստու­գում ենք Trigg ռեգիստրի թիվ 0 բիթը: Եթե այն 0 է, ապա անցում է կատարվում Nish1 նիշին և PortB մատույցում գրառ­վում է .251(11111011), այսինքն` RB2 ելքում սահմանվում է 0(ընտր­վում է վերահաղորդման ուղիղ ուղղությունը` XY ­ կոմբի­նացիան), եթե 1 է, անցում է կատար­վում Nish2 նիշին և PortB մատույցում գրառվում է .255`(11111111), այսինքն` RB2 ելքում` 1(ընտրվում է վերահաղորդման հակադիր ուղղությունը` YX կոմ­բի­նացիան):

Հաճախային կոմբինացիան սահմանելուց հետո պետք է իրականացվի 100 մվ տևողության հապաղում(կայացման ժամա­նակը), ուստի KJL և KJH ռեգիստրներում հարկ է գրառել n1 և n2 թվեր, որոնք կորոշենք մեզ ծանոթ եղանակով(տե’ս ծրագիրը).

կամ

Լուծելով հավասարումը   պայման­ների դեպքում, կստանանք. n1=164, n2=98, միայն թե հարկ կլինի  goto Paus1 հրամանից հետո ավելացնել երկու nop (ինչը տես­նում ենք ծրագրում):

Այնուհետև, թույլատրում ենք ընդհատում­ներն ու անցնում Pause2 ենթածրագրին, որն իրականացնում է ընդհատ­ման ազդանշանի սպասման  ժամանակի ձևավորումը: ASJL և ASJH ռեգիստրներից յուրաքանչյուրը բեռնում ենք .255-ով, որի դեպքում ընդհատման ազդանշանի սպասման  ժամա­նակը կկազմի`

Կարելի է բավարարվել այս  արժեքով(այդ ժամանակը պետք է լիներ 100 մկվ` մոտավորապես): Հակառակ դեպքում կարելի է օգտվել մեզ ծանոթ nop-երից:

Ընդհատման բացակայության դեպքում անցնում ենք հաճա­խու­թյունների կոմբինացիայի փոփոխմանը. նախ արգելում ենք բոլոր ընդհատումները, Trigg ռեգիստրի պարունակությունն ինկրեմենտում և անցնում ծրագրի մեկնակետին(Start):

Ընդհատման առկայության դեպքում անցնում ենք INT ԵԾ. նախ W-ի և Status ռեգիստրների պարունակությունները պահ­պան­ում ենք W_Temp և Stat_Temp ռեգիստրներում, ապա ստուգում RB0 ելուստի վիճակը: Եթե այն 0 է(ընդունիչում վերահաղորդվելիք ազդանշանն առկա է), ապա անցնում ենք ընդհատման ժամանակի ձևավորմանը, որը սովորաբար կազմում է 5…10 մվ:

Որոշենք YJL և YJH ռեգիստրներում գրառվելիք թվերը:

Ընդհատման ժամանակը`

Լուծելով հավասարումը   պայմանների դեպքում` կստանանք. n3=193, n4=10: Այս դեպքում ևս երկու nop-ի կարիք կա( goto  Pause3 հրամանից հետո):

YJL և YJH ռեգիստրները բեռնում ենք, համապատասխանա­բար, .193 և .10 թվերով և անցնում Paus3 ԵԾ կատարմանը:

Երբեմն, ծրագրի որոշ ճյուղավորումներից հետո, տեղի է ունենում դրանց միաձուլում: Այս դեպքում, որպես կանոն, տարբեր ճյուղերի մեքենայական ցիկլերի թիվը տարբեր է լինում, ուստի դրանց հավասարեցման նպատակով ճյուղերից մեկում (որում ցիկլերի թիվը փոքր է) անհրաժեշտ է ավելացնել nop-եր: Այս ծրագրում, btfsc Trigg,0 հրամանից հետո տեղի է ունենում ճյուղավորում և տարբեր ուղիներով աշխատանքային կետը հասնում է movlw .98 հրամանին. երբ արդյունքը 0 չէ, կատարում է 4 մեքենայական ցիկլ, հակառակ դեպքում ` 5: Հաճախ(ոչ այս դեպքում) դրանց հավա­սա­րու­­թյունը կարևոր է լինում և համապատասխան ճյուղում ավելացնում են nop-եր: Ծրագրի այդ  ճյուղում ուսումնական նկատառումներով(թեև այս դեպքում դրա կարիքը չկա) ավելացված է մեկ nop:

Ընդհատման INT ԵԾ-ի կատարման ընթացքում ընդու­նիչի ազդանշանի վերանալու դեպքում անցում է կատարվում ընդհատման ծրագրից ելնելու EndInt ԵԾ, որտեղ նախ` 0-ացվում է INT ընդհատման հայտանիշը, այնուհետև վերադարձվում են W և Status ռեգիստրների` սթեքում պահպանված պարունակու­թյուն­­ները, հետոաշխատանքային կետը վերադառնում է ծրագրի այն կետը, որտեղից անցել էր ընդհատումների ԵԾ: Այնուհետև այս ամբողջ պրոցեսը կրկնվում է:

Ծրագրի տեքստում չկան Komb և INT ենթածրագրերին անցնելու հրամաններ. դրանք նախատեսված են հրամանների որոշ խմբեր առանձնացնելու կամ շեշտելու նպատակով(INT-ը` նաև MPLAB-ով ծրագրի աշխատանքին հետևելու նպատակով) և կարող են հանվել:

Անհրաժեշտ է նշել, որ կարելի էր ընդհանուր բնույթի ռեգիստրների թիվը փոքրաց­նել (միևնույն  ռեգիստրը օգտագոր­ծել ծրագրի տարբեր հատվածներում), ուղղակի ուսուցման նպա­տակ­նե­րով կիրառեցինք ընդհանուր եղանակ:

Եվս մի կարևոր հանգամանքի մասին. IntCon ռեգիստրի թիվ 7 բիթը ընդհատումների համապարփակ թույլտվության(արգել­ման) բիթն է, իսկ թիվ 4 բիթը` միայն INT ընդհատմանը, ուստի վերջինս թույլատրելու համար անհրաժեշտ է ոչ միայն 4-րդ, այլև (եթե կուզեք` նախ) IntCon-ի 7-րդ բիթը սահմանել 1: Այ­սինքն` միայն 4-րդ բիթը 0 սահմանելը չի նշանակում, որ ընդհա­տում ընդհանրապես չի լինի, մինչդեռ, միայն bcf IntCon,7 հրամանն արգելում է բոլոր տեսակի ընդհատումները:

Նկ. 3-ում բերված է PIC16F84A-ի սխեման, որի միջոցով միա­կողմ վերահա­ղորդիչներով իրականացվում է երկկողմ վերահաղորդում:

Եթե ընդհատումը տեղի ունենա ոչ ընդհատման սպասման տիրույթում, ապա, ճիշտ է, ընթացիկ կոմբինացիան կանտեսվի, սակայն  քանի որ սինթեզատորի ապալարման ժամանակ ընդու­նիչի ազդանշանը իմպուլսների փունջ է, ուրեմն այն միլիվայր­կյան­ների ընթացքում կընկնի ընդհատման թույլատրման տի­րույթ, և չնչին ուշացումով ազդանշանը կվերահաղորդվի:

Դիտողություն.- Հանձնարարվում է ընդհատման ԵԾ անցնե­լիս նախ պահպանել W և Status (նաև այլ, եթե անհրաժեշտ է) ռեգիս­տր­ների պարունակություն­նե­րը, համապատասխան ռեգիս­տրներում, իսկ ընդհատումից ելնե­լիս` վերականգնել դրանք:

 Տվյալ դեպքում W-ի պարունակության գրառման(ուստի և` վերական­գնման) կարիք չկա, սակայն որոշ ծրագրերում դրա կարիքը կարող է զգացվել: Նույնը կարելի է ասել Status ռեգիստրի մասին. անցում ընդհատման տեղի է ունենում 0 բանկում, իսկ այդ ռեգիստրի մնացած բիթերը չեն օգտագործվում:

>>


 

4.3. ԸՆԴՀԱՏՄԱՆ ԾՐԱԳՐԻ ԴԻՏՈՒՄՆ ՈՒ ԿԱՐԳԱԲԵՐՈՒՄԸ MPLAB ԻՆՏԵԳՐՎԱԾ ՄԻՋԱՎԱՅՐՈՒՄ

Ընդհատման ծրագրի դիտումն ու կարգաբերումն ունի էական առանձնահատկություններ, ուստի հարկ է այն հատուկ ուշադրության արժանացնել:

Ստեղծենք Retr_1 անվանմամբ ֆայլ, շարենք այդ ծրագրի տեքստը և ասեմբլերենք այն:

Դիտողություն.- Org 4 դիրեկտիվը ընդհատման վեկտորի նշանակման դի­րեկ­տիվն է(դա հարկ է ընդունել որպես փաստ), որը պետք է գտնվի ծրագրի գլխարկում` goto Start անպայման անցման հրամանից վար: Միայն այդ դեպքում ընդհատման ԵԾ-ի հրամանը կունենա հրամանների PC հաշվիչի 4-րդ հասցեն: Բացենք ROM պատուհանը և համոզվենք դրանում: ՈՒշադ­րություն դարձրեք. ծրագրի աշխատանքային մասն սկսվում է ընդհատ­ման ԵԾ և ծրագրի հիմնական մարմինն ըն­կած է retfie հրամանից հետո:

Ծրագրի աշխատանքի դիտման կամ կարգաբերման ժամա­նակ, գլխար­կում, goto Start հրամանից անմիջապես  հետո, մտցվում է goto INT հրամանը: Եթե նրանից առաջ կետ-ստորա­կետ դնենք, ապա ծրագիրը մեկնակետ բերելիս կգանք goto Start հրամանին, իսկ կետ-ստորակետը goto START հրամանից առաջ դնելու դեպքում` goto    INT(ընդ­հատ­ման ԵԾ անցնելու) հրամա­նին:

Ինչպես տեսնում ենք, INT ԵԾ-ին անցման հրաման չկա, թեև նրա անվանումը ծրագրում կա(այն կարող է ընկալվել և’ որպես ԵԾ, և’ որպես նիշ), ուստի ՄԿ մեջ ծրագրի գրառու­մից(«վա­ռելուց» կամ «կարելուց») առաջ INT նիշը կարելի է, իսկ goto INT հրա­մանն անհրա­ժեշտ է  հանել:

 

Ծրագրի «հիմնական մարմնի» աշխատանքի դիտումն ու կարգաբերումը

goto INT հրամանից առաջ դնենք կետ-ստորակետ, ծրագիրն ասեմբլերենք և աշխատանքային կետը բերենք սկզբի(Start): Քայլ առ քայլ կատարենք ծրագիրը. կտեսնենք, որ բոլոր ընդհատումներն արգելվում են, RB0 ելուստին շնորհվում է մուտքի, իսկ  RB2-ին` ելքի կարգավի­ճակ, միանում են PortB-ի ձգող դիմադիրչները, և RB0/INT մուտքը համալարվում է ընդ­հատ­ման ըստ ղեկավարող ազդանշանի ետին ճակատի:

Komb ԵԾ առաջին հրամանը btfsc Trigg,0-ն է: Դիտենք RAM պատուհանը. 0Ch հասցեում(Trigg ռեգիստրին շնորհված հասցեն) գրառված է 00հ թիվը, հետևաբար այդ ռեգիստրի թիվ 0 բիթը 0 է, ուստի այդ հրամանի տրամաբանությամբ նրանից հետո կկատարվի .251-ով W-ի, այնուհետև` PortB-ի բեռնումը:

Համա­կարգ­չի ստեղնաշարի F7 կոճակի հաջորդական սեղ­մում­ներով հասնենք goto Nish0 հրամանին` կատարելով անպայման անցում movlw.197 հրամանին: Իրականացնենք KJH և KJL ռեգիստրներում հաստատունների բեռնումը, անցենք Pause1 ԵԾ և աշխատանքային կետը դնենք decfsz KJL,1 հրամանին: Այնուհետև, կարելի էր F7-ի բազմակի սեղմումներով ելնել Pause1 ԵԾ, սակայն նույնը կարելի է կատարել ավելի կարճ` «ավտոմատ» ռեժիմում. կանգառի կետը սահմանենք movlw .255 հրամանը, սեղմենք կանաչ «լուսաֆորը» և սպասենք, միչև աշխատան­քային կետը կանգ առնի movlw .255 հրամանին: Այնուհետև, քայլ առ քայլ կատարենք բոլոր հրամանները մինչև Pause2 ԵԾ-ի առաջին հրամանը` clrwdt, այդ ընթացքում համոզվելով,  որ ASJH, ASJL և IntCon ռեգիստրներում գրառվել են, համապատասխանաբար, .255, .255 և .144 թվերը: Pause 2 ԵԾ-ը նույնպիսին է, ինչ Pause1-ը, ուստի հանգունորեն կանգառի կետը նշելով clirf IntCon հրամանին, անցնենք ավտոմատ ռեժիմի և սպասենք ընթացքի ավարտին: Կատարենք clirf IntCon հրամանը և համոզվենք, որ IntCon ռեգիստրի պարունակությունը փոխվեց .144-ից .00-ի: Մտապահենք Trigg ռեգիստրի պարունա­կությունը(RAM պատուհանի 0Ch հասցեում), կատա­րենք inc Trigg հրամանը. այդ ռեգիստրի պարունա­կու­թյունը պետք է փոփոխվի 1-ով: Կատարենք goto Start հրամանը և անցնենք ծրագրի հիմնական մարմնի նոր շրջանին:

Ծրագրի մեկ ճյուղը(սցենարը) դիտեցինք, դիտենք մյուսը. նախ btfsc Trigg,0 հրամանը փոխարինենք btfss  Trigg,0 հրամանով, ասամբլերենք ծրագիրը և բերենք  մեկնակետի: Ըստ երկրորդ սցենարի պետք է կատարվի անմիջական անցում Nish1 նիշին, ուստի կանգառի կետը նշենք movlw .255 հրամանին:

Գործարկենք ավտոմատը. աշխատանքային կետը կանգ է առնում movlw .255 հրամանին: Կատարենք այն և նրա հաջորդը: Համոզվենք, որ PortB-ում գրառվել է .255 թիվը(բոլոր բիթերը 1 են): Այնուհետև դիտումն իրականացվում է նախորդ սցենարին հանգույն:

Թեև ծրագրի հիմնական մարմնում կա ճյուղավորման ևս չորս հրաման(decfsz), և դրանցից յուրաքանչյուրը ձևա­կա­նորեն ծնում է երկու սցենար, սակայն դրանք երկրոր­դա­կան են. աշխատանքային կետը «շրջանառում է» Pause1 և Pause2 ԵԾ-ում: Այսպիսով, բավական է հետևել միայն հիմնական սցենար­ներին: 

 

Ընդհատման աշխատանքի դիտումը

Ընդհատման ԵԾ մտնելու համար անհրաժեշտ է ծրագրի «գլխարկում», goto Start հրամանից առաջ կետ-ստորակետ դնել,  հանել goto INT հրամանից առաջ դրվածը, ասամբ­լերել ծրագիրը և այն բերել սկզբի(աշխատանքային կետը կանգ կառնի goto INT հրամանին): RAM պատուհանում դիտելով W_Temp և Stat_Temp ռեգիստրների պարունակու­թյուն­ները` փոփոխու­թյուն չենք նկատի, իսկ Status-ում կգրառվի 18h թիվը: Watch և RAM դիտենք պատուհաններում Status-ի պարունակության տեղափո­խումը նախ W ռեգիստր, այնուհետև`  Stat_Temp: btfsc PortB,0 հրամանի կատարումից առաջ նկատենք` PortB ռեգիստրի 0-ական բիթը լռելյայն սահմանված է 0, ուստի  btfsc PortB,0 ճյուղավորման հրամանից հետո, համա­ձայն այդ հրամանի տրամաբանության, անցում է կատարվում  ծրագրի հաջորդ` movlw .193 հրամանին: Դրանում համոզվելուց հետո անցնում ենք KJ H  և KJ L ռեգիստրները, համապատասխանաբար, .10-ով և  .193-ով բեռնելուն: Այնուհե­տև, անցնում ենք Pause3 ԵԾ կատարմանը, որի դիտումը չի տարբերվում  Pause1 կամ Pause2 ԵԾ դիտումից: Այն կարելի է մինչևիսկ չդիտել, այլ «ավտո­մատով» անցնել` կանգառի կետը նշելով Stug ԵԾ առաջին` btfsc PortB,0 հրամանին և կտտացնելով կանաչ «լուսաֆորին»: Ի վերջո աշխատանքային կետը կանգ կառնի btfsc PortB,0 հրամանի վրա, որը կվկայի ընդհատման ԵԾ-ի` այդ սցենարի լրիվ կատարման մասին: Կարելի է մի քանի անգամ սեղմել կանաչ «լուսաֆորը», և յուրաքանչյուր անգամ աշխատանքային կետը կանգ կառնի btfsc PortB,0 հրամանի վրա, ինչը և անհրաժեշտ էր ապացուցել. ազդանշանի առկայության դեպքում աշխատանքային կետը անընդհատ պետք է թափառի Stug ԵԾ:

Այժմ անցնենք մյուս սցենարին. փոխարինենք btfsc PortB,0-ն btfsc PortB,0-ով, ասամբլերենք ծրագիրը, այն բերենք 0-ի: Աշխատանքային կետը կանգ կառնի EndInt ԵԾ առաջին` bcf IntCon,1 հրամանին: Այդտեղ նշենք կանգառի կետը և սեղմենք կանաչ «լուսաֆորը». աշխատանքային կետը կանգ կառնի bcf IntCon,1 հրամանին: Համոզվենք, որ  IntCon ռեգիստրի թիվ 1 բիթը սահմանվել է 0, այնուհետև կատարելով W և Status ռեգիստրների պարունակությունների վերականգնման ստան­դարտ հրամանները, կհասնենք retfie հրամանին: Կատարելով այն` կստանանք զգուշացնող գրություն, որ սթեքը դատարկ է և այնտեղից վերցնելու բան չկա: Այն դատարկ է, որովհետև ընդհատման ծրագիր ենք մտել ոչ հիմնական մարմնից և սթեքում լռելայն սահմանված են 0-ներ: Փակենք գրությունը, դառնանք սկզբի` goto INT: Հիմնական մարմնից ընդհատման ծրագիր մտնելու համար այնտեղ ավելացնենք(հարմար է` clrwdt հրամանից անմիջա­պես հետո) call INT, կետ-ստորակետ ավելացնենք  goto INT-ից առաջ, հանենք goto Start-ից առաջ դրված կետ-ստորակետը և ասամբլերենք ծրագիրը: Ծրագիրը բերենք սկզբի, կանգառի կետը նշենք call INT հրամանին և գործարկենք ավտոմատը: Աշխատանքային կետը կանգ կառնի call INT հրամանին: Բացենք Window ցուցակի Stack պատուհանը, կատարենք call INT հրամանը. աշխատան­քային կետը կմտնի ընդհատման ծրագիր և կանգ կառնի առաջին` movwf W_Temp հրամանին:

Այժմ ROM  պատուհանում դիտենք սթեքի պարունա­կությունը. այդտեղ հայտնվեց 003Bh հասցեով տող(ուր պետք է վերադառնա աշխատանքային կետը ընդհատումների ԵԾ-ից): Բացենք ROM պատուհանը և համոզվենք, որ այդ հասցեով հրամանը(decfsz KJL,1) հաջորդում է այն հրամանին, որտեղից անցել ենք ընդհատման ԵԾ: Կանգառի կետը նշենք retfie հրամանին և գրրծարկենք ավտոմատը: Աշխատանքային կետը կանգ կառնի retfie հրամա­նին: Կատարելով այն` կնկատենք, որ սթեքը «մաքրվել է», իսկ աշխատանքային կետը կանգ է առել decfsz KJL,1 հրամանին:

Այսպիսով, դիտեցինք ծրագրի հիմնական մասը և հետևե­ցինք ծրագրի բոլոր սցենարների աշխա­տանքին:

 

Ծրագրի կարգաբերումը

Ծրագրի կարգաբերման ժամանակ հիմնականում ճշգրտ­վում են ծրագրում գործածված հաստատունների մեծություն­ները, դրանց առնչվող հապաղման ժամանակները և այլն:

Կարգաբերենք կայացման ժամանակի տևողությունը:

btfsc  Trigg,0 հրամանից հետո տեղի է ունենում սցենարների ճյուղա­վորում, իսկ  movlw .98-ից հետո` միաձու­լում: Կանգառի կետը սահմանենք btfsc  Trigg,0 հրամանին, ծրա­գիրը բե­րենք սկզբի և ավտոմատ ռեժիմով հասնենք կանգառի կետը: Այժմ  կանգառ­ի կետը սահմանենք movlw.98 հրամանին: Ծրագիրը բերենք 0-ի, կանչենք վայրկենաչափը, զրոյացնենք այն, սեղմենք կանաչ «լուսաֆորը»: Վայրկենաչափը ցույց կտա 6 մեքենայական ցիկլ: Այժմ btfsc  Trigg,0 հրամանը փոխարինենք btfss Trigg,0-ով, ասամբլերենք ծրագիրը, սահմա­նենք նույն կան­գառի կետերն ու գործարկենք ավտոմատը: Վայրկենաչափը ցույց կտա 5 մեքենայական ցիկլ: Սա նշանակում է, որ երկրորդ սցենարի շղթայում հարկ է ավելացնել մեկ NOP: Հանգունորեն վարվելով մյուս հապաղման ենթածրագրերի հետ` կստանանք հապաղումների հետևյալ ճշգրիտ արժեքները. կայացման ժամանակինը` 10 մվ, ընդհատումների ԵԾ-ում հապաղումը` 100 մվ, ընդհատումների սպասմանը` 196 մվ:

 

Նույն խնդրի լուծումն առանց ընդհատումների կիրառման

Այժմ կազմենք նույն խնդրի ծրագիրը` առանց ընդհատում­ների կիրառման:

Այստեղ, հասկանալի է, ընդհատման ԵԾ չկա, ուստի չկա նաև ընդհատման ծրագրում սպասման և ընդհատման սպասման ժամանա­կի հաշվիչ: KJM և KJL հաշվիչները ձևավորում են տատա­նումների կայացման հապաղման ժամանակը(որն աղմուկ­ներից խուսափելու նպատակով, միշտ անհրաժեշտ է), և հաղորդվող ազդանշանի առկայության դեպքում հաղորդման ժամանակը:

Հետևենք ծրագրին(տե’ս ստորև):

Այս ծրագրի գլխարկի պարունակությունը վերոբերյալից տարբերվում է նրանով, որ անվանված և հասցեավորված են ընդհանուր բնույթի միայն երեք ռեգիստր` Trig, KJH և KJL:

 Ծրագրի իրականացումն սկսվում է Start ԵԾ: Քանի որ RB0-ն գործածվում է որպես մուտք, ուստի արգելվում են բոլոր ընդհատումները(clrf IntCon):

Քանի որ ազդանշանի առկայության(բացակայության) մա­սին տեղեկանում ենք B մատույցի թիվ 0 ելուստի ազդանշանով, ուստի նրան շնորհվում է մուտ­քի, մնա­ցած­­ներին` ելքի կարգա­վիճակ իսկ  OptionR ռեգիստրով միացնում ենք ձգող դիմադրիչ­ները և այսպես` բոլոր նախապատրաստական քայլերը:

Այնուհետև, Komb ԵԾ առաջին` btfsc Trigg,0 հրամանն ստու­գում է Trigg ռեգիստրի թիվ 0 բիթը: Եթե այն 0 է, ապա անցում է կատարվում Nish1 նիշին և PortB մատույցում գրառ­վում է .251(11111011), այսինքն` RB2 ելքում սահմանվում է 0(ընտըր­վում է վերահաղորդման ուղիղ ուղղությունը` XY կոմբինացիան), եթե 1 է, անցում է կատար­վում Nish2 նիշին և PortB մատույցում գրառվում է .255`(11111111), այսինքն` RB2 ելքում` 1(ընտրվում է վերահաղորդման հակադիր ուղղությունը` YX կոմ­բի­նացիան):

Հաճախային կոմբինացիան սահմանելուց հետո իրականաց­վում է 100 մվ տևողությամբ հապաղում(կայացման ժամանակը), այնուհետև անցնում ենք Stug ենթածրագրին, որով ստուգում ենք RB0 ելուստում ազդանշանի առկայությունը. եթե այն առկա է(0 է), անցնում ենք 5 մվ տևողությամբ հապաղման ժամանակի ձևավորմանը, որից հետո դարձյալ Stug ենթածրագ­րին: Եթե RB0-ում 1 է(ազդանշանի բացակայություն), ապա ինկրեմենտում ենք Trig ռեգիստրը, անցնում Start  ԵԾ և ամեն ինչ կրկնվում է:

 

>>


ԳԼՈՒԽ 5. ՀԱՇՎԱՆՑՄԱՆ ԿԻՐԱՌՈՒԹՅՈՒՆՆԵՐԸ

5.1. ՀԱՇՎԱՆՑՈՒՄ

Հաշվանցմանը հպանցիկ ծանոթացել ենք այս ձեռնարկի 1-ին մասում(PCL ռեգիստրի նկարագրման ժամանակ): Հայտնի է, որ ճյուղավորման հրամանները «ծնում են» ծրագրի աշխա­տանքի` մեկից ավելի սցենարներ: Իսկ ի՞նչ անել, եթե ճյուղավո­րում­ների թիվը 2-ից ավել է, մանավանդ` անպայման կամ պայմանական անցում­ների դեպքում: Դրանք կարելի է իրակա­նաց­նել  հաշվանցման օգնությամբ:

Հաշվանցումն իրականացվում է addwf PC,1 հրամանի օգնու­թյամբ, որը նկարագրվում է այսպես. գումարել W և PC (առավել ստույգ կլիներ ասել` PC-ի կրտսեր` PCL)  ռեգիստր­ների պարունա­կությունները` գումարման արդյունքը պահպանե­լով PC ռեգիստ­րում, այն է` հրամանների PC հաշվիչի պա­րու­նակության ընթացիկ արժեքը մեծացնել W ռեգիստրի պարու­նակության չափով: Հաշվանցման կազմակերպման դեպքում addwf PC,W հրամանը կարող է գտնվել ծրագրի տեքստի ցանկացած մասում(ծրագրողի մտահղացմանը համա­պա­­տաս­­խան) և հաշվանցման համար այս հրամանի հաս­ցեն հանդի­սանում է հաշվանքի սկզբնական(զրոյական) կետ:

Ճյուղա­վոր­ման հասնելիս, ծրագրողը կարող է կազմակերպել կամ հաջոր­դական ստու­գումներ, կամ` հաշվանցում: Հատկապես մեծաթիվ ճյուղավորում­ների(սցենար­ների) դեպքում հաշվանց­մամբ ճյուղավորումներն իրականացվում են ավելի փոքր թվով հրամանների օգնությամբ, քան ստուգումներով ծրագիրը:

Հաշվանցման դեպքում մինչ addwf PC,1 հրամանը պետք է սահմանել ճյուղավորումների ընտրության հայտա­նիշը, ըստ որի որոշվում է այդ սցենարներից մեկի ընտրությունը: Դա W ռեգիստրի պարունակությունն է` մի թիվ, որը պարունա­կում է W ռեգիստրը addwf PC,1 հրամանի կատարման պահին: Հենց այս  թիվն է կազմում PC հաշվիչի աճը: Նշենք, որ addwf PC,1 հրամանը հաշվանցման դեպքում ոչ մի դեր չի խաղում և ծրագրի աշխատանքի սցենարների հետագա ընտ­րության վրա չի ազ­դում: Այս կամ այն սցենարի ընտրությունը կախված է միայն այդ հասցեի աճից` addwf PC,1 հրամանի կատարման պահին W-ի  պարունակությունից, որը կարող է լինել 0, 1, 2,….(և ոչ թե` 1, 2, …): Բանն այն է, որ անկախ ամեն ինչից, հաջորդ հրամանին անցնելիս, PC-ն ինկրեմենտվում է, ուստի առաջին սցենարին անցնելու համար W-ն պետք է պարունակի 0:

Եթե սցենարների թիվը m է, ապա պետք է ունենանք m թվերի խումբ` այդ սցենարները ճյուղավորելու համար(թվերի քանակը պետք է հավասար լինի սցենարների թվին):

Այս դեպքում PC հրաման­ների հաշվիչի աճից հետո կիրակա­նաց­վի անպայման անցում այս սցենարներից մեկի առաջին հրամանին(սթեքը չի օգտագործվում): Մեծ մասամբ այդ հրաման­ների մեքենայական ցիկլերի թիվը 2 է(եթե սցենարի իրագործման սկզբի հրամանը անպայման և(կամ) պայմանա­կան անցում է, սակայն կարող է լինել նաև 1(եթե տեղի է ունենում անցում ծրագրի շարու­նա­կությանը):

Հաշվանցման կիրառման դեպքում ավելի ճիշտ է  հրաման­ները զետեղել ամփոփ խմբով` addwf PC,1 հրամա­նից անմիջապես  հետո:

addwf PC,1 հրամանի իրագործումից առաջ, ինչ-որ տեղից պետք է W ռեգիստրում պատճենել 0-ից մինչև m(եթե սցենար­ների թիվը m+1 է) թվերից որևէ մեկը, որի դեպքում addwf PC,1 հրամանի իրագործումից հետո տեղի կունենա ծրագրի աշ­խատան­քային կետի ցատկ այդ հրամանին հաջորդող սցենար­ներից մեկի(հատկապես` նրա, որի համարն այդ շարքում հավասար է W-ում գրառված թվին` գումարած 1) սկզբին, և սկսում է իրագործվել ծրագրի ընտրված սցենարը:

W-ում սցենարն ընտրող թվերը կարող են պատճենվել որևէ ռեգիստրից(որպես, օրինակ, արտաքին սարքավորումներից եկող իմպուլսների հաշվման արդյունք), մատույցից(որպես ստեղնաշարի հարցման արդյունք), ծրագրորեն և այլն:

Նկատենք, որ հաշվանցման դեպքում վերը նշված անպայ­ման անցումը տեղի է ունենում առանց goto հրամանի բացա­հայտ օգտագործման:

Սցենարների սկզբի հրամանները կարող են լինել անպայ­ման(goto), պայմանա­կան(call) անցման հրամաններ, retlw հրաման(W ռեգիստրում 8-կարգանի հաստատունի գրառ­մամբ և ըստ սթեքի` վերադար­ձով), կամ ընթացիկ բիթ/բայթ-կողմնորոշ հրամանով(«ան­ցում ծրագրի շարունակու­թյանը» սցենարի դեպքում):

>>

 

 

5.2. ԾՐԱԳՐԻ ՃՅՈՒՂԱՎՈՐՈՒՄԸ ՀԱՇՎԱՆՑՄԱՄԲ

 Այս օրինակը ցուցադրում է հաշվանցման կիրառմամբ ծրագ­րի` 4 սցենարի ճյուղա­վորման սկզբունքը:

Դիցուք կախված A մատույցի RA0 և RA1 ելուստների վիճակ­ներից(դրանց կազմած երկկարգ կոդից)` W ռեգիստրը պետք է բեռնել 16(1-ին շարունակություն), 32(2-րդ շարունակու­թյուն), 64(3- րդ շարունակություն) և 128(4-րդ շարունակություն) թվերից մեկով:

Ենթադրենք մատույցի հարցման հնարավոր արդյունքներն ու դրանց համապատասխան շարունակությունները հետևյալն են.

00`       1-ին շարունակություն(սցենար),

01`       2-րդ շարունակություն,

10`       3-րդ շարունակություն,

11`       4-րդ շարունակություն:

Ենթադրվում է, որ սկզբնապես RA0 և RA1 մուտքերին առկա են տրամաբանական 1-եր, որի համար ան­հրա­ժեշտ է RA0 և RA1 ելուստներից յուրաքանչյուրի և աղբյուրի +5 Վ բևեռի միջև միացնել մեկական դիմադրիչ(ի տարբերություն B մատույցի, A մատույցում ծրագրորեն` Option ռեգիստրով այդ անել հնարավոր չէ):

Անցնենք ծրագրի կազմմանը:

Հասկանալի է` հարկ է գրանցել հատուկ բնույթի PortA, TrisA, Status, PC և IntCon ռեգիստրները(վերջինի գրանցման անհրաժեշտությունը բխում է A մատույցի երկու ելուստների մուտքի կարգավիճակից, որի դեպքում հարկ է ընդհատումներն արգելել):

Վերը նկարագրված սկզբունքի համաձայն, շարունակու­թյուն­ներին անցնելու հրամանները պետք է ամփոփ զետեղված լինեն անմիջապես addwf  PC,1 հրամանից հետո, ինչը և տեսնում ենք ստորև բերված HA_1 ծրագրում:

Մատույցի վիճակի հարցման ժամանակ W ռեգիստրում գրառվում է 0, 1, 2, 3 թվերից մեկը, որը գումարվում է PC-ի պարունակու­թյանը: այնուհետև այն ավելանում է 1-ով(PC-ի պարունակու­թյունն ինկրեմենտվում է): Oրինակ, եթե մատույցից W ռեգիստր է պատճենվել 2(10) թիվը, ապա հաշվանցման հրամանին(goto Shar… ) անցնելիս, PC-ի աճը կազմած կլինի 3, ուստի աշխատանքային կետը կանցնի 3-րդ սցենարի` Shar3 ԵԾ կատար­մանը(տվյալ դեպքում` W-ի բեռնմանը` 64-ով):

Այս ծրագիրը MPLAB-ով կարգաբերելիս, անհրաժեշտ է movfw  PortA հրամանից առաջ կետ-ստորոկետ դնել և նրանից առաջ կամ հետո ավելացնել movlw  k հրամանը և, k-ին տալով 0, 1, 2, 3 արժեքներ(յուրաքանչյուր փոփոխությունից հետո կատա­րելով ասեմբլերում), դիտել ծրագրի աշխատանքը:

>>

 


5.3. ԵՐԿՈՒԱԿԱՆ-ՏԱՍԱԿԱՆ ԿՈԴԻ ՓՈԽԱՐԿՈՒՄԸ «ՅՈԹՍԵԳՄԵՆՏԱՆԻ» ԿՈԴԻ

Դիտենք  հաշվանցման օգնությամբ երկուական-տասական կոդի փոխարկումը «յոթ­սեգ­մենտանի» կոդի: Փոխա­րկ­ման ենթածրագիրը կառուցվում է դասա­կան սկզբուն­­քով. յուրաքան­չյուր երկուական-տասական թվի համադրվում է մեկ «յոթ­սեգ­մենտանի» թիվ: Վերջինս ներկայացվում է երկուական տեսքով, որտեղ 1-երը համապատասխանում են թվացույցի «վառվող», 0-ները` «մարած» սեգմենտներին:

 Փոխակերպման ենթածրագիրը կոչենք TABLE (հաշվան­ցումը հաճախ կոչվում է աղյուսակային հաշվանցում կամ աղյուսա­կա­յին անցում, քանի որ նման է աղյուսակի):

Հաշվանցման ստանդարտ addwf PC,1 հրամանից հետո անհրաժեշտ է ամփոփ կերպով զետեղել սցենարների իրագործ­ման 10 հրա­մանները:

Մեկնաբանության մեջ նշված տառերը համապատասխա­նում են «վառվող» իսկ կետերը  մարած սեգմենտներին:

Դիցուք ընդհանուր բնույթի ET0 ,…., ET7 ռեգիստրներում պահ­ված է 8 կարգանի երկուական-տասական թիվ, որի կար­գերը, համապատաս­խանա­բար, 8, 5, 6, 7, 3, 4, 2 և 1 թվերը (երկուա­կան-տա­սական տեսքով) պահ­վում են նշված ռեգիստըր­ներում, այն է` 10h հասցեում պահվում է 8-ը, 11h-ում` 5-ը, 12h-ում` 6-ը, 13h-ում` 7-ը, 14h-ում` 3-ը, 15h-ում` 4-ը, 16h-ում` 2-ը  և 17h-ում` 1-ը(փոխակերպվելիք թվերը կարող էին պահված լինել EEPROM հիշողության մեջ):

Մեր խնդիրն է հիշողության այդ հասցեներում պահված երկու­ական-տասական թվերը վերածել «յոթսեգմենտանի» կոդի  և B մատույցով արտածել(օգտվում ենք անուղ­ղակի հաս­ցեա­գրումից, որն այս դեպքերում առավել գործնա­կան է):

Անցնենք ծրագրի կազմմանը:

Նախ` գրանցում ենք հատուկ բնույթի ռեգիստրները, անվա­նա­կոչում և հասցեավորում ընդհանուր  բնույթի ռեգիստրները, նշում ծրագրի սկզբը:

Դիտենք retlw-ով սկսվող 10 հրամանները և ուշադրություն դարձնենք այն հաստատուն արժեքներին, որոնք ներկայաց­ված են երկուական տեսքով: Ստուգելով 7-սեգմենտանի ինդի­կա­տորի սեգմենտների(A, B, C, D, E, F, G, H) պատկերները. նկատում ենք, որ սցե­նար­ների հաջորդական կատար­ման հրամանից հետո W ռեգիստ­­րում կպատճենվեն` 1-ին սցենարի դեպքում` 0-ի, 2-րդի դեպքում` 1-ի, 3-րդի դեպքում` 2-ի և այլն, 10-ներորդի դեպքում` 9-ի «յոթսեգմենտանի» կոդը:

Ծրագրի առաջին` movlw ET0 հրամա­նով ET0 ռեգիստրի 10h հաս­ցեն­(ոչ պա­րունա­կությու­նը) փոխա­դրվում է W ռե­գիստր, որտե­ղից երկրորդ հրամանով այդ հաս­ցեն պատ­ճեն­վում է անուղղակի հասցեագրման FSR ռե­գիստր: Ապա, movfw  Indf անուղ­­ղակի հասցե­ա­գրման հրամա­նով FSR-ի մատ­նա­նշած հաս­ցեի(10h) պարունակու­թյունը` .8-ը, պատ­ճեն­­վում է W ռեգիստր: (Եթե փոխակերպվելիք թվերը պահված լինեին EEPROM հիշողության մեջ, դրանք հայտնի հրամանախմբով հաջորդաբար կընթերցեինք այնտեղից): Հաջորդ` call TABLE հրամա­նով աշխա­տան­քային կետն անցնում է TABLE ենթածրագրին: addwf  PC,1 հրամանով PC ռեգիստրի պարունա­կու­թյունն աճում է W-ի պարունակու­թյան չափով(0): PC-ի պարտադիր ինկրեմեն­տի հետևանքով նրա պարունակության աճը կազմում է 9: Դա նշանակում է, որ կիրագործվի 9-րդ սցենարը և retl հրամանով W-ում կգրառվի աղյուսակի 9-րդ տողի թիվը` b’01111111’, որը «յոթսեգմենտանի համակարգում» 8-ն է, այնուհետև աշխատան­քային կետը կվերադառնա սթեքի գագաթի հասցեով հրամանին` movwf PortB, և փոխակերպված թիվը կարտածվի B մատույցով:

Այսպիսով, W-ում գրառված(փոխակերպված) թվի համարը շարքում հավասար է փոխակերպվելիք երկուական-տասական թվին  գումարած 1:

Հաշվանցման օգնությամբ կարելի է թվերի մի շարքին հա­մա­պատաս­խա­նեցնել մի այլ շարք: Տվյալ դեպքում իրակա­նաց­վում է երկուական- տասական թվերի կոդային փոխակեր­պում` 7-սեգմեն­տանի թվացույցին «համապատասխա­նեց­ված» կոդի:

Թվով տաս retlw հրամանները տեղադրված են ըստ փոխակերպվող թվերի աճի. առաջին հրամանը կատարում է 0-ի, երկրորդը` 1-ի, իսկ վերջինը` 9-ի փոխակերպումը «յոթսեգմե­նտանի»  կոդի:

Այսպիսով, այս կամ այն ճյուղավորման իրագործումից հետո W ռեգիստրում գրառվում է մի քանի թվերից մեկին համապա­տասխան թիվ, որը կարող է արտապատկերել 7-սեգմենտանի թվացույցը: Մնում է միայն W ռեգիստրից այդ թիվը պատճենել մատույցի ռեգիստր(վերջինիս ելուստները պետք է աշխատեն որպես ելքեր), որի ելուստներին միացված են 7-սեգմենտանի թվացույցի սեգմենտները:

Նշենք, որ call TABLE հրա­մանը ծրագրի տեքստում կարող է գտնվել TABLE ԵԾ հրամանների խմբից ինչպես առաջ, այնպես էլ հետո, քանի որ պայմանական(ինչպես նաև` անպայման) անցում կարելի է իրականացնել ծրագրի տեքստի ցանկացած տեղից: Տվյալ դեպքում call TABLE հրամանը գտնվում է մինչև ԵԾ TABLE հրամանների խումբը:

 

>>


5.4. ՅՈԹՍԵԳՄԵՆՏԱՆԻ ԿՈԴԻ ԴԻՆԱՄԻԿԱԿԱՆ ԱՐՏԱՊԱՏԿԵՐՈՒՄԸ

Միկրոկոնտրոլերի(հատկապես` թույլ կարողության) մա­տույց­­ների թվի սահմանափա­կությունը դրդում է հորինել ծրագ­րային այնպիսի միջոցներ, որոնք աչքի են ընկնում մատույց­ների ելուստների խնայողական օգտագործմամբ: Մասնավորապես, թվային արտապատկերման ստատիկ եղանակն ուղղակի կի­րառելի չէ PIC16F84A, PIC16F628A և հանգույն ՄԿ-ներում:

Ի տարբերություն ստատիկ ատապատկերման, որի դեպքում արտապատկերման ժամանակահատվածում թվացույ­ցի բոլոր կարգերը միաժամանակ ակտիվ են(«վառ­վում են»), դինամիկ արտապատ­կեր­ման դեպքում  թվացույցերն ակտիվաց­վում են հաջորդաբար. որևէ  պահի ակտիվ է միայն մեկ թվանշանի թվացույց: Դա նշանակում է, որ միևնույն թվացույ­ցը ակտի­վացվում է որոշ պարբերությամբ կամ հաճախությամբ, ուստի որպեսզի այն դիտողի կողմից չնկատվի(«չթարթի»), անհրաժեշտ է հաշվի առնել աչքի իներցիոն հատկությունը. այն չի նկատում վայրկյանում 24 թարթումից հաճախ ընթացող փոփոխությունները:

Եթե թվացույցի կարգերի թիվը n է, ապա տվյալ թվացույցի ակտիվացումների նվազագույն հաճախությունը պետք է լինի 24n, իսկ առավելագույն պարբերությունը` T=1/(24n) վ, որի ընթացքում պետք է արտապատկերվեն բոլոր n թվացույցերը, այսինքն` յուրաքանչյուր թվացույցի արտապատկերման ժամա­նակը կկազմի t=1/(24n2) վ (այստեղ հաշվի չառանք թվա­ցույ­ցից թվացույց անցման ժամանակը, որը տվյալ դեպքում կազմում է մոտ 20 մկվ):

Դիտարկենք հետևյալ խնդիրը. ութ ռեգիստրներում(նշա­նա­կենք` JSO,…, JS7) գրառված են արտապատկերելիք թվի «յոթ­սեգ­­մենտանի» կոդերը(դրանք կարող են պահված լինել EEPROM հիշողության մեջ, ներածվել մատույցով կամ բեռնվել ծրագրորեն): Պահանջվում է այդ կոդերն  արտա­պատ­կերել յոթսեգ­մենտանի թվացույ­ցերով, վեցերորդ կարգի ստորակետի ակտիվացմամբ(վեցերորդ կարգի թվացույ­ցում ստորա­կետը պետք է «վառվի»):

Վերոբերյալ բանաձևերից` 8-կարգանի թվացույցի ակտիվա­ցում­­ների նվազագույն հաճա­խու­­թյու­նը կկազմի 192 Հց, առավե­լա­գույն պարբերությունը` T =1/192 = 5,2 մվ, իսկ յուրաքան­չյուր թվացույցի արտապատկերման առավելագույն ժամանակը` t = 650 մկվ: Հաշվի առնելով վերը նշված 20 մկվ-ը` մեկ թվացույցի արտապատկերման ժամանակը վերցնենք t = 500 մկվ:

Նախ` թվացույցի ընդհանուր կատոդները(ԸԿ0,…,ԸԿ7)  միաց­­վում են երկուական-տասական - յոթսեգմենտանի վերծա­նիչի ելքերին, իսկ բոլոր թվացույցերի համանուն անոդները` միմյանց(օրինակ` բոլոր a-երը` միմյանց) և միկրո­կոնտ­րոլերի B մատույցի համապատասխան ելուստներին(a-երը` RB0-ին, b-երը` RB1-ին, …, h-երը` RB7-ին)

Խնդրի լուծման ալգո­րիթմը հետևյալն է. ընդհանուր բնույթի մի ռեգիստրում(անվանենք այն TH) հաջորդական ինկրեմենտի միջոցով ձևավորում ենք թվացույցի համարը, որի երեք կրտսեր կարգերը A մատույցով տրվում են վերծանչի մուտքերին(t, u, v, տե’ս նկ. 4), որի շնորհիվ նրա ելքերից մեկն անցնում է 0 վիճակի` «վառելով» այն թվացույցը, որի ընդհանուր կատո­դը միացված է վերծանչի այդ ելքին: Այնուհետև, JSO-ից սկսած` բոլոր ռեգիստրների պարունակությունները հերթակա­նորեն, կարգ առ կարգ գրառում ենք B մատույցում` նախապես ստու­գելով 6-րդ կա՞րգն  է գրառվողը, թե՞ ոչ: Եթե, ո’չ, ապա թիվը գրառվում է անփոփոխ, եթե, այո, «յոթսեգմենտանի» կոդի 8-րդ կարգը(ստորակետը) սահ­ման­ում ենք 1 և նոր միայն գրառում այդ մատույցում:

Այնուհետև սկսում ենք ձևավորել մեկ կարգի արտապատ­կերման ժամանակը, որից հետո ստուգում ենք` բոլոր ութ կարգերն էլ արտապատկերվե՞լ են: Եթե ոչ, անցնում ենք հերթական ռեգիստրից B մատույց յոթսեգմենտանի թվի արտածմանը, եթե այո` անցնում ենք ծրագրի մեկնակետին, և ամբողջ ընթացքը կրկնվում է:

Ռեգիստրների պարունակությունների հերթակա­ն գրառումը B մատույցում, կատարվում ենք անուղղակի հասցեագրմամբ, որին ծանոթացել ենք հաշվանցման թեման ուսումնասիրելիս:

Այժմ ծրագիրը քննարկենք մանրամասն:

Ծրագրի գլխարկում նշված են հատուկ բնույթի` Option, Status, PortA, TrisA, PortB, TrisB, IntCon , FSR, Indf և ընդհանուր բնույթի «յոթսեգմենտանի» կոդերի»` JS0,…,JS7, թվացույցի համարի` THR, արտապատկերման ժամանակի ձևավորման` AJ և օժանդակ(օպերատիվ հիշողության)` OJ ռեգիստրները:

Start ԵԾ-ում սահման­վում է ընդհատումների հա­մա­­պար­փակ արգելում(քանի որ ՄԿ որոշ ելուստներ մուտքի կարգավիճակ պետք է ունենան), անցում է կատարվում 1 բանկ:  

B մատույցի բոլոր և A մատույցի 0,…,3 ելուստ­­ներին շնորհվում է ելքի, մնացածներին` մուտքի կարգա­վի­ճակ, միացվում են B մատույցի ձգող դիմադրիչները: Այնուհետև, 0-ացվում է թվա­ցույցի համարի THR ռեգիստրը: Այստեղ JS0-ի պարունակությունը կուտակչի օգնությամբ պատճենվում է  օժանդակ OJ ռե­գիստ­­ր, և աշխա­տան­­քա­­յին կետն անցնում է ստորակետի ակտիվացման հրամա­նախմբին. W-ն բեռնվում է .05-ով և հանվում THR ռեգիստրի պարունակությունից: Եթե այդ տարբերությունը 0 չէ(արտա­պատկերվող կարգը թիվ 5-ը` չէ), OJ ռե­գիստ­­րից W-ի միջոցով հերթական կարգն անփոփոխ արտածվում է B մատույցով, եթե 0 է, OJ ռե­գիստ­­րի 8-րդ կարգում սահմանվում է 1, այնուհետև արտածվում` նույն մատույցով:

Սրան հաջորդում է  մեկ կարգի արտապատկերման ժամա­նակի ձևավոր­ման  ArtJ ԵԾ. AJ ռեգիստրում գրառվում է .165, դեկրեմենտի և դրա արդյունքի` ըստ 0-ի ստուգման ցիկլի միջո­ցով ձևավորվու­մ է 500 մկվ ժամանակ, որից հետո թվացույցի համարի THR ռեգիստրն ինկրեմենտվում է և ստուգվում, թե արտապատկերվե՞լ է արդյոք 8-րդ կարգը: Եթե, ո’չ, ապա աշխա­տան­քային կետն անցնում է հաջորդ կարգի արտապատկեր­մանը, եթե 8-րդ կարգը արտապատ­կերվել է` անցնում է ծրագրի մեկնակետին` Start ենթածրագրին, և այս ընթացքն անընդհատ կրկնվում է:

          MPLAB միջավայրում ծրագիրը դիտելու և կարգաբերելու նպատակով, JSO,… JS7 ռեգիստրներում նախապես գրառում ենք «յոթսեգմենտանի» թվանշանների 16-ական համարժեքները. համապատասխանաբար` 7Fh(.127), 06h(.6), 6Fh(.111), 63h(.99), 79h(.127), 5Bh(.91), 79h(.127), 6Dh(.109):

>>



ԳԼՈՒԽ 6. TMR0 ԹԱՅՄԵՐԻ ԿԻՐԱՌՈՒԹՅՈՒՆԸ

6.1. TMR0 ԹԱՅՄԵՐԸ

Մինչ այժմ ամենատարբեր խնդիրներ լուծելիս օգտագոր­ծում էինք ՄԿ ներքին տակտային գեներատորը(բացառությամբ` ընդհատումների դեպքի), մինչդեռ հաճախ անհրաժեշտ է լինում առնչվել արտաքին ազդանշանների: PIC-ի օգնությամբ ուսում­նա­սիրենք արտաքին ազդա­նշանի հաճախության չափումը:

Հայտնի է, որ ՄԿ ունի TMR0 կոչվող հաշվիչ, որն ըստ էու­թյան 256 գործակցով բաժանիչ է: Նրա լրանալու(գերլցվելու` .255-ից .00 փոխվելու) դեպքում, IntCon ռեգիստրի թիվ 2 բիթը(TOIF հայտանիշը) սահմանվում է 1: Դա տեղի է ունենում յուրաքանչյուր անգամ RA4/TOCKI մուտքին 256 իմպուլս տրվելու դեպքում:

TMR0-ի օգնությամբ իմպուլսների կրկնման հաճախության հաշվման երկու եղանակ գոյություն ունի` դանդաղ հաշիվ և արագ հաշիվ: 

Դանդաղ հաշվի դեպքում օգտագործում ենք միայն TMR0-ն(առանց նախաբաժանիչի). նրա RA3/TOCKI մուտքին տրված իմպուլսների թիվը որոշելու համար, հաշվում ենք TMR0-ի գեր­լը­ցում­ների թիվը, բազմապատկում 256-ով և գումարում դրա­նում մնացած թիվը: Մի անգամ ևս հիշենք, որ TMRO-ի գերլցման հայտանիշը IntCon ռեգիստրի թիվ 2(TOIF) բիթն է: Այս բիթում 1-ի առկայությունը վկայում է TMRO-ի գերլցման առկա­յու­թյունը (հայ­տա­նիշը զրոյացվում է ծրագրով), 0-ինը`ար­տա­քին ընդհատ­ման բացակայությունը:

Սակայն այս եղանակով կարելի է չափել մինչև 1 ՄՀց հաճախություն(4 ՄՀց հաճախության կվարցային ռեզոնա­տորի կիրառման դեպքում): Հարկ է նշել, որ TOIF բիթը երկրորդ տիպի հայտանիշ է, և այն  0-ացվում է միայն ծրագրորեն(հարկադ­րաբար):

Առավել բարձր հաճախությունների(մինչև PIC-ի վերին հաճա­խային սահմանը` 30 ՄՀց) չափման համար օգտ­վում են արագ հաշվից: Այս դեպքում օգտվում են նաև նախաբաժա­նիչից(վերջինս միացվում է TMR0-ից հետո):

>>

 

6.2. ԱՐՏԱՔԻՆ ԱԶԴԱՆՇԱՆԻ ՀԱՃԱԽՈՒԹՅԱՆ ՀԱՇՎՈՒՄԸ

Որպես արագ հաշվի օրինակ դիտարկենք մինչև 30 ՄՀց հաճախության չափումը PIC16F84A ՄԿ-ով:

Արագ հաշվի դեպքում նախապես OPTION ռեգիստրի թիվ 5 բիթը սահմանում ենք 1(RA3/TOCKI ելուստի արտաքին տակտի ընտրություն), թիվ 4 բիթը` 0(հաշվումը` իմպուլսի առաջին ճակա­տով), թիվ 3 բիթը` 0(նախաբաժանիչը միացնել TMR0-ից, առաջ), թիվ 0, 1 և 2 բիթերը` 1(նախաբաժանիչի բաժան­ման գործակիցը սահմանել առավելագույնը` 256):

Մուտքային 256 իմպուլսի դեպքում TMR0-ի պարունակու­թյունը կաճի 1-ով, իսկ այն կլրանա(կգերլցվի) մուտքային  իմ­պուլ­սի դեպ­քում: Լրացումները հայտաբե­րելու և գրանցելու համար անհրաժեշտ է պարբերա­բար ստուգել  IntCon ռեգիստրի թիվ 2 բիթը և յուրաքանչյուր լրացման դեպքում ինկրեմեն­տել ընդհանուր բնույթի ինչ-որ ռեգիստրի պարունա­կությունը:  Այս ռեգիստրը կպարունակի լրացումների թիվը: IntCon ռեգիստրի թիվ 2  բիթի ստուգումների  պարբերությունը չպետք է գերեզանցի

Այժմ` չափման ժամանակի մասին: Եթե այդ ժամա­նակն ընտրվի 1 վ, ապա արտապատկերման համար անհրաժեշտ կլինի ութ թվացույց` առանց ստորակետի, և չափման բացարձակ անճշտու­թյունը կկազմի 1 Հց(հարաբերականը`  Եթե այդ ժամա­նակն ընտրվի 0,1 վ, ապա բացարձակ անճշտությունը կկազմի 10 Հց, հարաբերականը`  որը լավ արդյունք է: Չափման այս ժամանակի ընթացքում TMR0-ի մուտքին կտրվեն 3 000 000 իմպուլսներ, որոնց ձևավորած երկուական կոդի (00101101 11000110 11000000) գրառման համար անհրաժեշտ կլինի երեք ռեգիստ­ր: TMR0-ի մուտքին 3 000 000 իմպուլսների տրման ընթաց­քում  այն կգերլցվի [3 000 000/65535] = 45 անգամ: Այս թիվը փոքր է 255-ից, ուստի այն կզետեղենք մեկ ռեգիստրում(HatshH): Մնացորդը կազմում է 50925, որը 256-ի բաժանելով կստանանք 198(TMR0-ի պարունակությունը) և մնացորդը` 237(նախաբաժանիչի պարունակությունը): Երկուսն էլ փոքր են 255-ից և կարող են զետեղվել մեկական ռեգիստրներում(ան­վանենք, համապատաս­խանաբար` HatshM և HatshL):

Այսպիսով, HatshH ռեգիստրի պարունակությունը կլինի չափված հաճախության արժեքի ավագ կար­գը: Միջին կարգը TMR0-ի պարունակությունն է(հիշենք, որ նրանից առաջ միացած է 256 գործակցով նախա­բաժանիչը), որը W ռեգիստրի միջոցով կպատճենենք HatshM ռեգիստր: Մնացորդը պահպանվում է նախաբաժա­նիչում, որը, սակայն, օպերատիվ հիշողությունում գրանցված ռեգիստր չէ, ուստի նրանից ինֆորմացիա փոխադ­րել, օրինակ` W ռեգիստր, անհնար է: Այդ պատճառով դիմում ենք հետևյալ միջոցին. հաշվի ավարտից հետո RA3 ելուստին շնորհում ենք ելքի կարգա­վիճակ, այդտեղ ծրագրորեն ձևավորում կարճատև իմպուլսներ, որոնք տրվում են PIC-ի հաշվային RA4/TOCKI մուտքին(նախաբա­ժանիչի), իրականաց­նելով հաշվի լրում: Lրահաշվման ընթաց­քում արտաքին իմպուլս­ները չեն շարունակի հաշվվել, քանի որ RA3-ի(հիշենք, այն արդեն ելք է) փոքր ելքային դիմադրությունը ճնշում է մուտքային իմպուլսները և դրանց մակարդակը դարձնում  PIC-ի զգայնության շեմից ցածր: Մյուս կողմից` RA3-ի ելքում ծրագրորեն ձևավորված կարճատև իմպուլս­ները կհաշվվեն, որովհետև RA3-ը էլեկտրապես միացած է RA4/TOCKI ելուստին: 

Լրահաշիվը(RA3 ելուստին իմպուլսների ձևավորմամբ) շարունակում ենք մինչև նախաբաժանիչի լրանալը` TMR0-ի պարունա­կության փոփոխվելը, միաժամանակ հաշվում դրանց թիվը, գրառում այն HatshL-ում, այնուհետև նրա` բիթ առ բիթ շրջման և ինկրեմենտման միջոցով գտնում լրացումը, ինչը և կլինի որոնելի կրտսեր բայթը:

Անցնենք ծրագրի վերլուծությանը:

Գլխարկում գրանցված են հատուկ բնույթի Tmr0, Option, Status, PortA, TrisA, IntCon և ընդհանուր բնույթի HatshL, HatshM, HatshH, REGL և REGH ռեգիստրները:          

Նախապատրաստական համապատասխան հրաման­ներով 0-ացվում են IntCon, Tmr0, HatshH ռեգիստրները, Status ռե­գիստ­­րի թիվ 5 բիթը և Option ռեգիստրում գրառվում է 00100111(.37) թիվը, որը նշանակում է` .256 գործակցով նախա­բա­ժանիչը միա­ցած է TMR0-ից առաջ, ազդանշանի մուտքը` RA4/TOCKI-ից, TMR0-ի աճը` դրական թռիչքով:

Հաշվի սկիզբը(նիշը` Skizb) սկսվում է TrisA ռեգիստրում 00011000(.24) թվի գրառմամբ: Դա նշանակում է` RA3 և RA4/TOCKI ելուստներին շնորհվում է մուտքի, մնացածներին` ելքի կարգա­վիճակ:

STUG ԵԾ btfss IntCon,2 հրամանով սկսվում է TMR0-ի գերլցման ստուգումը. եթե այն 1 չէ, անցում է կատարվում VOCH ԵԾ, եթե 1 է, հաջորդ հրամանն անտեսվում է, կատարվում վիրտուալ nop, ապա` ինկրեմենտվում HatshH ռեգիստրը: Երկու դեպքում էլ ծրագիրը միաձուլվում է AJO ԵԾ-ում, ճիշտ է` տարբեր մեքենայական ցիկլեր կատարելուց հետո, որոնց հավասարեցման նպատակով էլ VOCH ճյուղում ավելացված է երեք nop:

Հիմնական հաշիվը վերջանում է TrisA ռեգիստ­րում 00010000(.16) թվի գրառմամբ(VERJ ԵԾ), որը նշանակում է` RA4/TOCKI ելուստին շնորհվում է մուտքի, մնա­ցա­ծին(այդ թվում` RA3-ին, որ շատ կարևոր է)` ելքի կարգավիճակ:

Այնուհետև, երկրորդ անգամ է ստուգվում  TMR0-ի գերլցումը. եթե պատասխանը ոչ է, ապա անցում է կատարվում MIJIN ԵԾ, եթե այո է, HatshH-ը ինկրեմենտվում է և նոր միայն անցում կատարվում MIJIN ԵԾ: Այս ԵԾ-ում TMR0-ի պարունա­կությունը  W-ի միջոցով պատճենվում է HatshM-ում(նկատենք` այս պահին W-ի և HatshM-ի պարունակությունները հավասար են):

Սրան հաջորդում է լրահաշվման LRUM ԵԾ, որտեղ նախ` A3 ելուստին ձևավորվում է մեկ կարճատև իմպուլս` հետևյալ հրամաններով.

bsf PortA,3(A3-ում սահմանել 1),

nop(1 մ.ց. տևողությամբ միջակայք),

bcf   PortA,3(A3-ում սահմանել 0),

nop(1 մ.ց. տևողությամբ միջակայք):

Այնուհետև, ինկրեմենտ­վում է HatshL ռեգիստրը, ապա TMR0-ի պարունակությունը փոխանցվում է W, HatshM ռեգիստ­րի պարունակությունից հան­վում է W-ի պարունակությունը և ստուգվում ըստ Z հայտանիշի(նախապես սա զրոյացվում է). եթե տարբերությունը 0 չէ(նախաբա­ժա­նիչը չի գերլցվել` HatshM-ում փոփոխու­թյուն չկա), պետք է դառնալ LRUM ԵԾ, եթե 0 է, նախաբաժանիչը գերլցվել է, ապաորոշել HatshL ռեգիստրի պարունակության լրացումը. comf,F HatshL(HatshL-ի պարու­նա­կու­թյունը բիթ առ բիթ շրջել) և incf HatshL,1(ինկրեմեն­տել HatshL-ի պարունա­կու­թյունը):

Այսպիսով, հաճախության չափման արդյունքը` երկուական տեսքով, կստանանք HatshH, HatshM, HatshL ռեգիստ­րային եռյակում:

Դառնանք չափման ժամանակի(0,1 վ) ձևավորմանը: Չա­փումն սկսվում է Skizb ԵԾ bcf  Status,5 հրամանով և ավարտ­վում VERJ ԵԾ-ի  bsf  Status,5 հրամանով: Չափման ժամանակը ձևավորող REGL և REGH ռեգիստրներում նախապես գրառված թվերը նշանակենք, համապա­տաս­խա­նաբար, m-ով և n-ով: Այդ դեպքում, չափման ժամանակը կորոշվի հետևյալ բանաձևով (տե’ս ծրագիրը).

Պարզեցնելուց հետո կստանանք.                     

Հաշվի առնելով   պայմանները` կստանանք.

 

Դիտողություն.- Եթե m-ի և n-ի` հաշվարկով ստացված արժեք­ները չեն բերում չափման ժամանակի ցանկալի ար­ժեքին(հաշվելիս` որոշ հրաման­ների անտեսման պատճառով), ապա m-ի և n-ի ճշգրիտ արժեքները կարելի է որոշել MPLAB-ում` ծրագրի կարգաբերմամբ:

TMR0-ի գերլցման ստուգումն իրականացվում է 10 մկվ պարբերությամբ(թույլատրելի էր մինչև 0,15 մկվ):

>>


6.3. ՀԱՃԱԽԱՉԱՓԻ ԾՐԱԳԻՐԸ

Այսպիսով, այսպես կոչված կրտսեր ընտանիքի PIC16F84A ՄԿ-ի օրինակով ուսումնասի­րեցինք միկրոկոնտ­րո­լերների կիրա­ռու­թյունը ռադիոէլեկտրոնիկայի տարբեր խնդիր­նե­րը լուծելիս, կազմեցինք տարաբնույթ գործառույթներ իրակա­նաց­նող ծրագ­րեր, դիտեցինք, կար­գա­վորեցինք և կարգաբերե­ցինք դրանք MPLAB ինտեգրված միջավայրում:

Գոյություն ունեն նաև միջին և ավագ ընտանիքների PIC միկրոկոնտ­րոլերներ, որոք ավելի լայն կարողություններով են օժտված և հնարավորություն են ընձեռում լուծել առավել մեծածավալ ու բազմաբնույթ խնդիրներ: Դրանցից որոշներում ներդրված են նմանակաթվային և թվանմանակային փոխակեր­պիչներ, որոնք  հնարավոր են դարձնում նմանակային և թվային սարքերի համակցումը ՄԿ-ի օգնությամբ:

Մի տիպի ՄԿ-ից մյուսին կամ մյուս ընտանիքի ՄԿ-ին անցնելիս բավական է ծանոթանալ դրա հիշողության, ռեգիստր­ների կազմին և հրամանների համակարգին. դրանց կիրառու­թյան հիմնական գաղափարներն արդեն յուրացրել ենք և, ոչ մեծ ջանքեր գործադրելով հաջողությամբ կարող ենք նոր ՄԿ-ներ կիրառել:

Մեր ստեղծած ծրագրային հիմքի վրա` որպես վերջաբան, կազմենք PIC ՄԿ-ով կառուցված հաճախաչափի ծրագիրը:

Ձևակերպենք խնդիրը: Անհրաժեշտ է կառուցել արտաքին իմպուլսների հաճախաչափ հետևյալ պարամետրերով.

- Ազդանշանի տեսքը` իմպուլսային:

- Հաճախության առավելագույն արժեքը` 30 ՄՀց:

- Չափման հարաբերական առավելագույն անճշտությունը` 10-6:

- Արտապատկերման ձևը` յոթսեգմենտանի թվացուցային:

TMRO-ով աշխատելիս կազմեցինք մի ծրագիր, որի շնորհիվ ստանում էինք արտաքին իմպուլսների հաճախության արժեքը` երկուական թվերով, ընդ որում, առավելագույն անճշտու­թյունը կազմում էր  ավելի փոքր, քան խնդրի պահանջ­ն է:

Ձախ պտույտն ուսումնասիրելիս, կազմեցինք երկուական թիվը երկուական-տասականի, իսկ հաշվանցումն ուսումնա­սիրե­լիս` երկուական-տասականը «յոթսեգմենտանի» կոդի փոխա­կերպման ծրագրերը: Ի վերջո, թվերի դինամիկական արտա­պատ­­կերումն ուսում­նա­սիրելիս կազմեցինք յոթսեգմենտանի թվացույցերով «յոթսեգ­մենտանի» կոդի արտապատկերման  ծրագիրը:

Օգտագործելով մեր ձեռք բերած գիտելիքները` կազմենք տրված պարամետրերով հաճախաչափի ծրագիրը:

>>



ԳՐԱԿԱՆՈՒԹՅՈՒՆ 

1. Токхейм Р. Микропроцессоры: курс и упражнения. М. Энергоатомиздат. 1988.

2. Токхейм Р. Основы цифровой электроники. М. Мир. 1988.

3. Дитер Кохц. Измерение, управление и регулирование с помощью PIC микроконтролеров. Пер. с немецкого. Киев. МК Пресс. 2007. 296 стр.

4. Костров Б. В. , Ручкин В. Х. Микропроцессорные системы и микроконтролеры. М. Десс. 2007. 320 стр.

5. D. Givone, Robert P. Roesser. Micro­proces­sors/ Micro­com­puters: An Introduction. Donald. New York. 1987.

6. Карабельников Е.А. Самоучитель по програм-мированию PIC контроллеров. Липецк. 2005. 350 с.

7. Майкл Предко. Справочник по PIC микроконтро-лерам. М. ОДЭКА. 2002. 502 стр.

8. Титце Д., Шенк К., Полупроводниковая схемотехника.    М. Мир. 1983.

9. Хоровиц П., Хилл У., Искусство схемотехники. М:, Мир, 1986.

10. Батоврин В. К., Бессонов А. С., Мошкин В. В. Практикум по электронике и микропроцессорной технике. www.dmkpress.ru. 182 стр.

11.Արամյան Հ. Լ. Թվային սարքեր և միկրոպրոցեսորների կիրա­ռությունը: ՈՒսումնական ձեռնարկ, 2-րդ մաս: 108 էջ: Երևան: Ճարտարա­գետ: 2010:

12. Հաշվողական տեխնիկա և ինֆորմացիոն տեխնոլո­գիա­ներ, դասախոսությունների տեքստ: Հ. Լ. Արամյան, Երևան, ՀՊՃՀ, 96 էջ, 2003:

>>