ՀԱՅԱՍՏԱՆԻ ՀԱՆՐԱՊԵՏՈՒԹՅԱՆ ԿՐԹՈՒԹՅԱՆ
ԵՎ ԳԻՏՈՒԹՅԱՆ ՆԱԽԱՐԱՐՈՒԹՅՈՒՆ
ՀԱՅԱՍՏԱՆԻ ՊԵՏԱԿԱՆ ՃԱՐՏԱՐԱԳԻՏԱԿԱՆ ՀԱՄԱԼՍԱՐԱՆ
Ռադիոտեխնիկայի և կապի
համակարգերի ֆակուլտետ
Կապի համակարգերի ամբիոն
ԱՐԱՄՅԱՆ Հ. Լ.
ԹՎԱՅԻՆ ՍԱՐՔԵՐ ԵՒ ՄԻԿՐՈՊՐՈՑԵՍՈՐՆԵՐԻ ԿԻՐԱՌՈՒԹՅՈՒՆԸ
ՈՒսումնական ձեռնարկ
ՄԱՍ 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.2. Ցածր հաճախության իմպուլսների ձևավորումը
2.3. Իմպուլսների փնջերի ձևավորումը
2.4. Իմպուլսների փնջի ձևավորումը ղեկավարող արտա քին ազդանշանով
ԳԼՈՒԽ. 3. C ՀԱՅՏԱՆԻՇԻ ԿԻՐԱՌՈՒԹՅՈՒՆՆԵՐԸ
3.3. Շրջանային տեղաշարժի կիրառությունները
3.5. Երկուական թվի փոխարկումը երկուական-տասականի
ԳԼՈՒԽ 4. ԸՆԴՀԱՏՈՒՄՆԵՐԻ ԿԱԶՄԱԿԵՐՊՈՒՄԸ
4.2. Միակողմ ռադիոհաղորդիչներից երկկողմ ռադիո հաղորդչի կառուցումը
4.3. Ընդհատման ծրագրի դիտումն ու կարգաբերումը MPLAB ինտեգրված միջակայքում
ԳԼՈՒԽ 5. ՀԱՇՎԱՆՑՄԱՆ ԿԻՐԱՌՈՒԹՅՈՒՆՆԵՐԸ
5.2. Ծրագրի ճյուղավորումը հաշվանցմամբ
5.3. Երկուական-տասական կոդի փոխարկումը «յոթսեգմենտանի» կոդի
5.4. «Յոթսեգմենտանի» կոդի դինամիկական արտապատկերումը
ԳԼՈՒԽ 6. TMR0 ԹԱՅՄԵՐԻ ԿԻՐԱՌՈՒԹՅՈՒՆԸ
6.2. Յոթսեգմենտանի կոդի դինամիկական արտապատկերումը
ԳԼՈՒԽ 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-ում):
Պարզվում է, որ եթե 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 մկվ):
Այսպիսով, այսպես կոչված կրտսեր ընտանիքի 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. Microprocessors/ Microcomputers: 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: