ҚАЗАҚСТАН РЕСПУБЛИКАСЫНЫҢ БІЛІМ ЖӘНЕ ҒЫЛЫМ МИНИСТРЛІГІ

ҚАЗАҚСТАН РЕСПУБЛИКАСЫНЫҢ БІЛІМ ЖӘНЕ ҒЫЛЫМ МИНИСТРЛІГІ

“Алматы энергетика және байланыс университеті”

коммерциялық емес акционерлік қоғамы

 

 

О.Т. Шанаев

МИКРОКОНТРОЛЛЕРЛЕР. СИМУЛЯТОРЛАР

Оқу құралы

 

Алматы 2013

ӘОЖ 681.3(075.8)

ББК 32.973.202 Я73

Ш20 Микроконтроллерлер. Симуляторлар;

Оқу құралы / Шанаев О.Т. Алматы: АЭжБУ, 2013. – 107 бет.

 

ISBN 978-601-7327-47-7

 

Оқу құралының бірінші бөлімінде микропроцессорлық жүйелердің құрылым принципі, олардың басты буыны ретінде пайдаланылатын, микропроцессорлардың жалпылама құрылымы, олардың негізіндегі микропроцессорлық жүйенің жалпылама құрылымы мен құрамы және олардың іс-әрекеттерінің ұйымдастырылу тәртібі қарастырылады.

Оқу құралының екінші бөлімінде микропроцессорлық жүйенің жеке микросұлба түрінде шығарылатын түрі микроконтроллерлердің құрылым принциптері мен олардың іс-әрекеттерінің ұйымдастырылу тәртібі, яғни олардың сәйкесті жұмыс бағдарламаларын құру тәсілдері қарастырылады. Қарастыру үлгісі ретінде Microchip компаниясының шығаратын 8-разрядты PIC (Peripheral Interface Controller) жинамының құрамындағы PIC16F84A микроконтроллерлері алынды. Оқу құралының осы бөлімінде келтірілген микроконтроллер жұмысының ұйымдастырылу тәртібін игеру үшін жазылған, бағдарламалардың жұмысын сәйкесті симулятор (PIC Simulator IDE) арқылы тексеру мүмкіндігі жеткілікті мөлшерде қарастырылады.

 

Без. 12, кесте 13, әдеб. көрсеткіші 18 атау.

 

ББК 32.973.202 Я73

 

ПІКІР БЕРУШІЛЕР:

ҚазҰТУ, физ-мат. ғыл. докт., профессор Т. Тусеев

АЭжБУ, физ-мат. ғыл. докт., профессор С.Б. Бимурзаев,

 

Қазақстан Республикасының Білім және ғылым министрлігінің 2012 жылғы баспа жоспары бойынша басылады.

 

ISBN 978-601-7327-47-7

 

© “Алматы энергетика және байланыс университеті” КЕАҚ, 2013 ж.

Кіріспе

Қазіргі заманда әртүрлі өндіріс салалары мен тұрмыс қажетінде пайдаланылатын алуан түрлі техникалық құралымдар жұмысының басқарылуы цифрлық техника негізінде жүзеге асырылатындығы белгілі. Басқару жұмысының белгіленген ретімен (яғни, белгіленген алгоритм бойынша) жүзеге асырылуы үшін басқарылым объектісінің параметрлері нақтылы уақытында өлшеніп және басқарушы құрылымның сәйкесті жағдайы анықталып, алынған мәліметтерге қажетті түрлендірілімдер арқылы өңдеу жүргізіліп, нәтижесінде басқару сигналдары тудырылады да, олардың сәйкесті іс-әрекетімен объектінің жағдайы қажетті бағытқа өзгертіледі. Келтірілген жұмыстардың жүзеге асырылуын, жалпылама түрде микропроцессорлық жүйе (МПЖ) деп аталатын микропроцессор негізіндегі электрондық құрылымдар атқарады. Микропроцессорлық жүйелерде ақпараттың өңделуі және сақталуы цифрлық түрде жүргізілетіндіктен, оларға түсетін аналогты кіріс сигналдары аналогты-цифрлы түрлендіргіштер (АЦТ) арқылы таңдалым кодтарының тізбесіне түрлендіріледі, ал олардан өңдеу нәтижесі ретінде шығарылатын аналогты шығыс сигналдары таңдалым кодтарының тізбесінен цифрлы-аналогты түрлендіргіштер (ЦАТ) арқылы қалыптастырылады.

Дәстүрлі цифрлық жүйелердегі ақпараттың өңделу және сақталу алгоритмдері жүйенің сұлбақұралысымен ғана анықталады, яғни өзге алгоритмге көшу үшін, оны жүйе құрамындағы электрондық буындардың өзара байланыстарын өзгерту арқылы немесе осы буындарды олардың қойылған мәселеге жаралымды түріне ауыстыру арқылы ғана жүзеге асыруға болады немесе жүйенің құрылымын толықтай өзгертуге тура келеді. Әрине, бұндай түрлендірімдердің жүйе жұмысының барысында жүргізілуі мүмкін емес, ол үшін жүйені қайтадан құру керек болады. Осы себептен дәстүрлі цифрлық жүйе көбіне “тастай логикалы” жүйе деп аталады.

Кез келген “тастай логикалы” жүйе – алдын ала белгілі жеке бір мәселені (немесе мазмұны жағынан жуық бірнеше мәселені) шешуге арналған арнайы жүйе. Оның күмәнсіз артықшылықтары бар. Біріншіден, арнайы жүйенің құрамында артық элемент болмайды, оның әрбір элементі міндетті түрде толыққанды жұмыс атқарады. Екіншіден, арнайы жүйеде ақпарат өңдеу алгоритмінің орындалу жылдамдығы оның құрамындағы логикалық элементтердің тезәрекеттілігімен және олардың нақтылы байланыстарымен ғана анықталатындықтан, бұндай құрылымдар аса жоғары тезәрекеттілікті қамтамасыз ете алады.

“Тастай логикалы” жүйенің басты кемістігі – әрбір жаңа мәселені шешу үшін оны қайта құру қажеттігінде. Ал бұл – ұзаққа созылатын және қосымша қаражат талап ететін жұмыс. Бұл кемістіктен құтылу үшін, кез келген мәселеге жеңіл икемделетін жүйе құру керек, яғни оның шешілетін мәселеге байланысты (құрылымды өзгертпестен) жұмыс алгоритмін (жүйенің жұмыс бағдарламасын) ауыстыру мүмкіншілігі болу керек. Бұндай “икемді логикалы” жүйе әмбебап немесе бағдарламалы жүйеге айналады, микропроцессорлық жүйе тап осындай жүйеге жатады.

Әмбебаптылыққа ұмтылу ұтылысқа да әкеледі. Аса күрделі мәселені шешуге (қарапайым мәселелермен салыстырғанда) арналған құрал құрамы күрделірек болады. Сондықтан әмбебап жүйенің құрамы ең күрделі мәселенің шешілу мүмкіндігін қамтамасыз ету керек. Әрине, қарапайым мәселенің шешілуі кезінде бұндай жүйенің бар мүмкіншілігі толыққанды пайдаланылмайды. Сонымен қатар, әмбебаптылық жүйенің (оның құрылымының күрделенуіне байланысты) тезәрекеттілігін де төмендетеді.

Сонымен, келесі қорытындыға келуге болады: “тастай логикалы” жүйелер, аса жоғары тезәрекеттілікті қажет қылатын, өңделу алгоритмдері қарапайым түрдегі, жеке мәселелерге ыңғайлы келеді. Ал әмбебап, бағдарламалы жүйелер, онша тезәрекеттілікті қажет қылмайтын, шешетін мәселелері жиі өзгеріп отыратын және олардың шешілуі күрделі алгоритмдермен  жүзеге асырылатын жағдайларға  ыңғайлы келеді.

Бірақ соңғы кезде шығарылған әмбебап (микропроцессорлық) жүйелердің тезәрекеттілігі аса (бірнеше дәрежеге) көтерілді және бұндай жүйелерге арналған микросұлбалардың шығарылым көлемінің ұлғаюы олардың құнының төмендеуіне әкелді. Оның нәтижесінде “тастай логикалы” жүйелердің қолданылым аймағы тарыла түсті. Бұған қоса, қазіргі заманда ішкі құрылымын бағдарламалы тәсілмен өзгерту арқылы жеке мәселелерді шешуге тез икемделетін бағдарламалы микросұлбалардың шығарылым технологиясы аса қарқынды дамып келе жатыр. Олар “тастай логикалы” жүйелердің тезәрекеттілігі мен бағдарламалы жүйелердің икемділігін біріктіреді [22].

Микропроцессорлық жүйелердің құрылу барысында өзара байланысты және өзара тәуелді екі фактор ескеріледі: қойылған мәселенің іс жүзінде жүзеге асырылуын қамтамасыз етуші жүйенің аппараттық бөлігін құру (hardware) және жүйенің іскерлік бөліктемелерінің өзара әрекеттесуінің бағдарламаларын дайындау (software). Демек, микропроцессорлық жүйе жөнінде толық білім алу үшін, оның аппараттық бөлігін де, бағдарламалық бөлігін де игеру керек.

Оқу құралының бірінші бөлімінде микропроцессорлық жүйенің басты буыны ретінде пайдаланылатын микропроцессорлардың жалпылама құрылымы, олардың негізіндегі микропроцессорлық жүйенің құрылым принциптері мен құрамы және олардың іс-әрекеттерінің ұйымдастырылу тәртібі талқыланады. Микропроцессорлардың негізгі құрылым принциптері мен оның жұмысының ұйымдастырылу тәртібін, яғни сәйкесті бағдарламаларының  құрылу жолдарын, түсіндіру үшін олардың нақтылы бір түрін қарастыру ыңғайлы келеді. Осындай үлгі ретінде заманауи есептеу техникасының бастапқы негізін қалаған, қарапайым микропроцессор Intel 8085 алынып, оның ішкі құрама блоктары мен іс-әрекетін басқарушы бағдарламаларының құрылу жолдары қарастырылады. Өз заманындағы (ол 1976 жылы шығарылған) ғылым мен техниканың жетістіктерінің негізінде құрылған Intel 8085 микропроцессорының құралымы мен оның жұмысының ұйымдастырылымы фон Нейман архитектурасымен құрылған микропроцессорлық жүйелер мен олардың командалар жүйесінде (79 команда) қолданылатын сілтеу тәсілдері жөнінде толық түсінік алуға мүмкіндік береді. Бұл микропроцессорды қарастырудан игерілген білім одан әрі талқыланатын микроконтроллерлердің құрылымы мен жұмыс ұйымдастырылымының ерекшеліктерін түсінуге негіз қалайды.

Микропроцессорлық жүйенің жұмысын ұйымдастырушы бағдарлама-лардың және олардың құрамындағы командалардың жұмысын түсінуге  Intel 8085 микропроцессоры негізіндегі микропроцессорлық жүйенің симуляторын (8085 Simulator IDE) пайдалану толық мүмкіндік береді. Алуан түрлі іскерлік құралымдарымен қамтылған және олардың іс-әрекеттерінің көрнекілігімен көзге түсетін бағдарламалық симулятор оқушылардың құрамы жағынан түр-түрлі жүйе модельдерін құруына және олардың жұмысын зерттеуіне кең мүмкіндік береді, демек олардың оқу материалын толық игеруіне жағдай туғызады.

Оқу құралының екінші бөлімінде микропроцессорлық жүйенің жеке микросұлба түрінде шығарылатын түрі Гарвард архитектурасымен құрылған микроконтроллерлердің құрылым принциптері мен олардың іс-әрекеттерінің ұйымдастырылу тәртібі, яғни олардың сәйкесті жұмыс бағдарламаларын (импульстер тізбесін қалыптастыру, үзіліс арқылы басқару, динамикалы шығарылымдар, EEPROM жадысын пайдалану) құру тәсілдері қарастырылады. Қарастыруға ыңғайлы қолданылым үлгісі ретінде, әртүрлі өндіріс саласында кеңінен қолданылатын, Microchip компаниясының шығаратын 8-разрядты PIC (Peripheral Interface Controller) микроконтроллерлері алынды да, оның нақтылы үлгісі ретінде PIC микроконтроллерлерінің орта деңгейлі жинамының құрамындағы қарапайым саналатын PIC16F84A микроконтроллерінің құрамындағы әртүрлі перифериялық құралымдармен жұмыс ұйымдастырылу бағыттары қарастырылады да, студенттердің одан күрделірек келетін микроконтроллерлерді өздігінен игеруіне негіз қаланады.

Оқу құралының осы бөлімінде келтірілген микроконтроллер жұмысының ұйымдастырылу тәртібін игеру үшін жазылған, бағдарламалардың жұмысын сәйкесті симулятор (PIC Simulator IDE) арқылы тексеру мүмкіндігі жеткілікті мөлшерде қарастырылған.

Оқу құралы автордың өндіріс және педагогика саласындағы көпжылдық тәжірибесінің негізінде жазылды. Мазмұны жағынан оқу құралы бакалаврлық оқу жүйесінде  5В070400 – Есептеу техникасы және бағдарламалық камтама мамандығына дайындау барысында оқытылатын “Микропроцессорлық жүйелер” пәнінің бағдарламасына сәйкес келеді. Айтылған мамандықпен қатар оқу құралын (сәйкесті қысқарту немесе толықтыру арқылы) өзге мамандықтарға жоспарланған осы сияқты пәндерді оқыту барысында пайдалануға болады.

1 Микропроцессорлар және микропроцессорлық жүйелер

1.1            Микропроцессорлық жүйелердің құрылым принциптері

Микропроцессорлық жүйенің негізін қалаушы және оның жұмысын жүзеге асырушы басты бөлігі – микропроцессор (МП). Микропроцессор жүйеде ақпараттың өңделуін және оның жан-жақты жіберілімін бағдарлама арқылы басқарады. Қойылған мәселенің орындалу тәртібі сәйкесті бағдарламаға, яғни алынған микропроцессорға тән (яғни оның командалар жүйесіне кіретін) командалар тізбесінің орындалуы арқылы жүзеге асырылады.

Микропроцессорлық жүйенің құрамына микропроцессормен қатар жады құрылымдары және ақпаратты енгізу/шығару құрылғылары (сыртқы құрылғылар) кіреді. Микропроцессорлық жүйенің құрамында бірге қолдануға жарамды (яғни архитектурасы мен электрлік параметрлері бойынша сәйкестірілген) микросұлбалар жинағы микропроцессорлық жинам деп аталады.

Микропроцессорлық жүйелердің (МПЖ) құрылым негізіне үш принцип алынған, олар – модульдік, магистральдық және микробағдарламалы басқару принциптері.

Модульдік принцип жүйенің қызметі жағынан толықтай бітірілген, жеке блоктар негізінде құрылатындығын сипаттайды. Әрбір модульдің, оны іске қосатын, рұқсат кірісі болады.  Ондағы сигнал деңгейі модульдің үшінші (жоғары кедергілі) жағдайын, яғни оның жүйе желісіне қосылу/қосылмауын басқарады.

Магистральдық принцип МПЖ-нің қызмет блоктарының ортақ жүйелік магистральға (жүйе желісіне) жалғанатындығын және олардың өзара ақпарат алмасуының осы магистраль арқылы жүзеге асырылатындығын сипаттайды.

Микробағдарламалы басқару принципі жүйе бағдарламасын құруға пайдаланылатын командалардың әрбіреуінің қарапайым операциялар – микрокомандалар (ақпарат жіберілімі, арифметикалық операциялар, ығыстырымдар және т.б.) арқылы жүзеге асырылу мүмкіндіктерін сипаттайды.

Жүйелік магистральға негізгі үш ақпараттық желі кіреді, олар – адрес желісі АВ (Address Bus), дерек желісі DB (Data Bus) және басқарым желісі СВ (Control Bus).

Дерек желісі – жүйе модульдерінің арасында дерек алмастыратын негізгі желі. Дерек желісі, оның деректерді екі бағытта да жіберуін қамтамасыз етуі керек болғандықтан, ол әрқашан екібағытты болады.

Адрес желісі – жадыға (немесе сыртқы құрылғыларға) байланысымды қамтамасыз етуші желі.

Магистральдың байланыс жолдарының толық санын кеміту үшін көбіне адрес желісі мен дерек желісін кезектестіру тәсілі қолданылады, яғни байланыс жолдары арқылы әртүрлі уақыт мезетінде адрес пен дерек кезектеп жіберіледі (цикл басында – адрес, цикл аяғында – деректер).

Басқару желісінің жолдарындағы сигналдар кезекті цикл түрін анықтайды және оның әртүрлі бөліктеріне немесе оның жеке жұмыс кезеңдеріне сәйкесті уақыт мезеттерін бекітеді. Онымен қатар, басқару сигналдары процессор (немесе магистральдың өзге қожасының, бастаушының, master) жұмысын жадының немесе енгізу/шығару құрылғыларының (орындаушы құрылғының, slave) жұмысымен келістіреді.

Негізгі басқару сигналдары – алмастыру стробтары, яғни жазу (шығару) стробы мен оқу (енгізу) стробы болып табылады. Бұл сигналдарды процессор қалыптастырады, олар деректердің желі арқылы сәйкесті бағытта жіберілу мезеттерін анықтайды.

Процессордың деректерді жазу және оқу операцияларын орындауы бағдарламалы-басқарылымды алмасу, үзіліс және жадыға тура шығу режимдерінде жүзеге асырылуы мүмкін, олардың ішіндегі ең бастысы – біріншісі.

1.2            Intel 8085 микропроцессоры

1.2.1     Микропроцессор құрылымы.

Микропроцессор (МП) – қазіргі заманның күрделі цифрлық құрылғыларының (мысалы, компьютердің немесе басқару жүйесінің негізін қалаушы микроконтроллердің) құрамына кіретін, ақпарат өңдеуші басты блок.

Микропроцессорлардың негізгі құрылым принциптері мен жұмыс тәртібін түсіну үшін олардың нақтылы бір түрін қарастыру ыңғайлы. Осындай үлгі ретінде қарапайым Intel 8085 микропроцессоры алынды. Өзінің қартамыстығына қарамай, бұл микропроцессор осы күнге дейін өз маңыздылығын жоймай, әлі де өндірісте шығарылады (демек пайдаланылады). Әрине, оның қолданылым аймағы – компьютерлер емес, оларда қазіргі заманда одан қуаттырақ және өнімділеу микропроцессорлар қолданылады. Intel 8085 сияқты микропроцессорлар, негізінде, олардың мүмкіншілігі жететін басқару жүйелерінде пайдаланылады.

Intel 8085 микропроцессорының құрылымы 1.1-суретте көрсетілген. Микропроцессордың құрама блоктарының арасындағы ақпарат алмастырылуы оның ішкі сегізразрядты дерек желісі арқылы жүзеге асырылады.

Микропроцессордың құрама блоктарын қарастырайық.

AC (Accumulator) – операцияға қатысты операндтардың біреуін немесе операция нәтижесін сақтауға арналған регистр-аккумулятор.

TR (Temporary Register) – операцияға қатысты операндтардың екіншісін уақытша сақтауға арналған регистр.

1.1 сурет

ALU (Arithmetic-Logic Unit) – кірістеріне берілген екі сөзге (операндтарға) жүргізілетін операциялардың орындалуын жүзеге асыратын арифметикалық-логикалық құрылғы. Операцияға қатысты операндтардың біреуі аккумуляторда (AC), ал екіншісі уақытша регистрде (TR) сақталады; операция нәтижесі де аккумуляторға түседі. ALU тікелей сөздерді (операндтарды) қосу, алу, ығыстыру, салыстыру операцияларын және логикалық операцияларды (инверсия, конъюнкция, дизъюнкция, екілік қосу) ғана орындайды. Олардан күрделірек операциялар (көбейту, бөлу және т.б.) қосалқы бағдарламалар арқылы орындалады. ALU құрамында екілік сандарды екілік-ондық кодқа айналдыру сұлбасы (DA, Decimal Adjust) болады.

RF (Register Flags) – орындалған арифметикалық және логикалық операциялардың орындалу нәтижелерінің белгі биттерін көрсететін, ту регистрі. Intel 8085 микропроцессорында бес түрлі белгі пайдаланылады: Z (Zero) – нөлдік белгісі, С (Carry) – тасымал белгісі, AC (Auxiliary Carry) – қосалқы тасымал белгісі, S (Sign) – терістік белгісі, P (Parity) – жұптық белгісі. Нөлдік белгі операция нәтижесінің нөл болғандығын, тасымал белгісі ең үлкен разрядтан  шығарылатын тасымалды (яғни жетінші разрядтан; разряд нөмірінің нөлден басталатынын еске түсіріңіз), қосалқы тасымал белгісі үшінші разрядтан шығарылатын (яғни сегізразрядты сөздің тетрадаларының арасындағы) тасымалды (ол екілік-ондық кодтарға операциялар жүргізуге қажет), терістік белгісі нәтиже таңбасын, жұптық белгісі нәтижедегі бірлік санының жұптығын сипаттайды. Бұл белгілер ақпараттың өңделу процесін басқару үшін пайдаланылады.

В, С, D, E, H, L – сегізразрядты жалпы қызмет регистрлері (ЖҚР), олар мультиплексор/демультиплексор (MUX/DMUX) арқылы ішкі дерек желісіне байланысқан. Олардың әрбіреуін жеке түрінде де,   В-С, D-E, H-L түрінде қос-қостап (олар В, D, Н жұптары деп аталады), 16-разрядты регистр ретінде де пайдалануға болады. H-L жұбы, әдетте, регистрлік жанама сілтеуге қажетті адресті сақтауға пайдаланылады.

W және Z – уақытша регистрлер, олар жадыдан команданың шығарылуы кезінде деректерді уақытша сақтауға арналған.

SP (Stack Pointer) – 16-разрядты стек көрсеткіші. Стек – сөз жинағын сілтеусіз сақтауға ыңғайланған жады құрылымы. Стектің негізгі қызметі – үзіліс бағдарламалары мен қосалқы бағдарламалардың жұмысын қамтамасыз ету. Стек ретінде қызмет жадысының нақтылы аймағы бөлінеді де, оның ең жоғарғы ұяшығының адресі стек көрсеткішінде (SP) стек түбі ретінде белгіленеді. Стекпен жұмыс істеуші командалар – Push (сөз енгізу) және Pop (сөз суыру). Бұл командалардың орындалуы кезінде SP мәні кеміп немесе өсіп отырады. Жадының байтты ұйымдастырылымында және стекке регистр жұбындағы дерек енгізілу кезінде үлкен байт SP-1 адресі бойынша, ал кіші байт SP-2 адресі бойынша сақталады да, SP мәні екіге кемиді. Оқу кезінде стектің жоғарғы екі ұяшығындағы дерек сәйкесті регистрлерге орналастырылады да, SP мәні екіге ұлғаяды. Демек стек көрсеткішінде соңғы жазылған ұяшықтың адресі (стек төбесі) тұрады. Сонымен, стек жұмысы LIFO (Last In – First Out) тәртібімен жүргізіледі, яғни стекке соңғы енгізілген сөз бірінші шығарылады.

IP (Instruction Pointer) –  16-разрядты команда санауышы. Онда келесі орындалатын команданың адресі тұрады. Бастапқы қойылым кезінде ол нөл мәнін қабылдайды, демек бастапқы қойылым бағдарламасының бірінші командасы нөлінші ұяшықта болады. Команда ұзындығы 1...3 байт болады. Жадыдан кезекті байт шығарылғаннан кейін IP мәні ұлғайтылады, команда бірбайтты болса, онда келесі команданың адресі, ал өзгеше жағдайда кезекті команданың келесі байтының адресі шығады. Команданың екінші және үшінші байттары W және Z регистрлеріне түседі.

INC/DEC (Increment/Decrement) сұлбасы ол арқылы жіберілген сөздерді бірге ұлғайтып немесе кемітіп отырады.

IR (Instruction Register) – команда регистрі. Ол жадыдан орындалатын команданың бірінші байтын, яғни команда кодын қабылдайды.

DC – команда дешифраторы. Ол команда регистріндегі (IR) команда кодына сәйкесті операцияның машина циклдерін жүзеге асыруға қажетті сигналдар тудырады.

Synchronising and Control блогы, команда дешифраторы мен машина циклдерінің шифраторының жағдайы негізінде, ахуал сигналдары мен микропроцессорлық жүйені сыртқы құрылғылармен байланыстыратын сыртқы желіні басқару сигналдарын тудырады.

МП мен жады немесе сыртқы құрылғы (СҚ) арасындағы ақпарат алмасуы кезінде жадының сәйкесті ұяшығының немесе СҚ командасының құрамындағы немесе регистр жұптарының біреуіндегі адресі адрес буферіне (AB) жіберіледі. Үш жағдайлы адрес буфері жады адресінің үлкен разрядтарын адрес желісінің A15-8 жолдарына жібереді.

Үш жағдайлы адрес/дерек буфері (A/DB) уақыт бойынша кезектесіп, адрестің кіші байтын немесе дерек байтын жібереді.

 Микропроцессордың әртүрлі ішкі регистрлерінің арасында дерек байттарының жіберілімі сегізразрядты ішкі дерек желісі арқылы, ал олардың МПЖ-нің басқа модульдерімен байланысы кезектелімді адрес/дерек желісі арқылы жүзеге асырылады.

Interrupt Control және Sequential I/O Control – үзілісті басқару және тізбекті енгізілім/шығарылымды басқару блоктары.

МП командаларының қалыпты жүргізілімінде олар жадыдан жазылым бағытымен HLT командасына жеткенше бір-бірден шығарылып орындалады. Жеке команданың шығарылуы мен орындалуы команда циклін (КЦ) құрады. Команда циклі бір немесе бірнеше машина циклінен (МЦ) тұрады. МП мен жады немесе СҚ арасында байт жіберуге арналған әрбір байланыс машина циклін қажет қылады. Өз кезегінде машина циклі бірнеше тактіге бөлінеді және такт саны машина циклінің түріне тәуелді болады.

Intel 8085 микропроцессорының келесі түрдегі машина циклдері бар:

1)     Команда таңдалымы (OF, Opcode Fetch).

2)     Жадыдан оқу (MR, Memory Read).

3)     Жадыға жазу (MW, Memory Write).

4)     Сыртқы құрылғыдан оқу (IOR, Input-Output Read).

5)     Сыртқы құрылғыға жазу (IOW, Input-Output Write).

6)     Үзілісті құптау (INA, Interrupt Acknowledge).

7)     Желіні босату (BI, Bus Idle).

8)     Тоқтатылым (HALT).

Әрбір машина циклінің басында цикл түрін сипаттаушы ахуал сигналдары тудырылады. Олар сыртқы құрылғыға жіберілетін қосалқы басқару сигналдарын қалыптастыруда пайдаланылады.

1.2.2     Микропроцессордың басқару сигналдары.

Микропроцессордың шықпаларындағы сигналдар келесі қызметтер атқарады:

-       A15-8 – жады адресінің үлкен байтын немесе сыртқы құрылғының толық адресін шығаруға арналған үш жағдайлы шығыс жолдары. HOLD, HALT және RESET режимдерінде олардың шықпалары үшінші (жоғары кедергілі) жағдайға ауысады;

-       AD7-0 – машина циклінің бірінші тактісінде жады адресінің кіші байтын немесе сыртқы құрылғының толық адресін шығаруға арналған үш жағдайлы кезектелімді жолдар. Адрес жіберілу тактісінен кейін олар дерек желісі ретінде пайдаланылады;

-       ALE – машина циклінің бірінші тактісінде жіберілген жады адресінің кіші байтын сыртқы адрес регистріне енгізуге рұқсат беру стробы. Адресті регистрге енгізу ALE сигналының артқы ауытқымасымен жүзеге асырылады;

-       ,  – сілтенген жады ұяшығына немесе сыртқы құрылғыға жіберілетін оқу және жазу стробтары. HOLD, HALT және RESET режимдерінде олардың шықпалары үшінші (жоғары кедергілі) жағдайға ауысады;

-       READY – жадының немесе сыртқы құрылғының МП-мен ақпарат алмасуға дайын екендігін көрсететін кіріс сигналы. Жадының немесе сыртқы құрылғының дайын еместігінде, МП күту жағдайына кіреді де, бұл жағдай бірлік деңгейдегі READY сигналы түскенше созылады;

-       S1, S0 –  МП-дың сыртқы құрылғыға жіберетін ахуал сигналдары. Олар машина циклінің басында қалыптасып, кезекті цикл біткенше сақталады;

-       IO/М – жадыны немесе сыртқы құрылғыны таңдау сигналы. Оның жоғарғы деңгейінде сыртқы құрылғыға, ал төменгі деңгейінде жадыға байланыс жүзеге асырылады.

S1, S0 сигналдарымен бірге IO/М сигналы машина циклінің түрін анықтайды. Ахуал сигналдары мен ,  және  сигналдарының әртүрлі машина цикліне байланысты мәндері 1.1-кестеде келтірілген.

1.1 к е с т е

МЦ түрі

Ахуал сигналдары

Басқару сигналдары

IO/M

S1

S0

OF

0

1

1

0

1

1

MR

0

1

0

0

1

1

MW

0

0

1

1

0

1

IOR

1

1

0

0

1

1

IOW

1

0

1

1

0

1

INA

1

1

1

1

1

0

BI

ҮЖ

x

x

1

1

1

HALT

ҮЖ

0

0

ҮЖ

ҮЖ

1

Келтірілген кестеде ҮЖ арқылы үшінші жағдай белгіленген.

 

-       x1, x2 – МП-дың ішкі синхроимпульстер генераторының жұмысын қамтамасыз етуші кварцты резонатордың немесе одан басқа жиілік тиянақтаушы тізбектердің қосылатын шықпалары. МП-дың ішкі сұлбаларының жұмысын сәйкестіруші синхроимпульстер (CLK) шығару үшін генератор импульстері санау триггеріне жіберіледі де, ол қарсы фазалы екі импульстер тізбесін (F1 және F2) қалыптастырады. Олардың жиілігі (яғни микропроцессордың жұмыс жиілігі) генератор жиілігінен 2 есе төмен болады. ALE сигналы F1 тізбесінен бірінші тактіде бөліп алынған біреуі ретінде қалытастырылады;

-        () – МП-ды бастапқы жағдайына қайтару кірісі. Бұл сигнал қорек көзі қосылған кезде өздігінен қалыптасады, оның кез келген уақытта оператордың командасы арқылы да түсуі мүмкін. Оның әрекетімен IP және IR регистрлері, үзіліс рұқсаты мен желі ұсталымының құпталым триггерлері және т.б. тазартылады;

-       CLK – микропроцессорлық жүйеге жіберілетін синхроимпульстер шығысы. Бұл импульстердің фазасы F2 импульстерінің фазасындай, ал жиілігі микропроцессордың x1 және x2 шықпаларындағы жиіліктен екі есе кем болады;

-       RESET – жүйенің сыртқы модульдерін тазарту сигналы, ол тактілік CLK импульстеріне байланыстырылған және оның фазасы  сигналынан өзгеше болады;

-       INTR (Interrupt Request) – векторлық үзіліс сұранысының кірісі. Бағдарлама арқылы үзіліске рұқсат берілген жағдайда, бұл сигнал  стробын тудырады. Бұл сұранысқа сәйкес шақырылатын қосалқы бағдарламаның адресін сыртқы құрылғы жібереді. Тазартылым кезінде сұраныс сигналы қабылданбайды (үзіліске тыйым салынған);

-        (Interrupt Acknowledge) – кезекті команда циклі біткеннен кейін жіберілетін векторлық үзілісті құптау стробы. Ол үзіліс векторын оқу үшін пайдаланылады;

-       RST 5,5; RST 6,5; RST 7,5 – RSTn (n = 5,5; 6,5; 7,5) түріндегі радиалды үзіліс сұраныстарының кірістері. Бұл сұраныстарға сәйкесті қызмет атқаратын қосалқы бағдарламалардың бастапқы адресі – 8n. Кіріс мәртебелері бекітілген, ең жоғарғы мәртебе RST 7,5 кірісінде. Бұл сұраныс тобының мәртебесі INTR сұранысының мәртебесінен жоғары болады. Бұл сұраныстардың әрбіреуіне және бір-біріне тәуелсіз тыйым салуға болады;

-       TRAP – мәртебесі ең жоғарғы дәрежедегі, тыйым салынбайтын үзіліс сұранысының кірісі;

-       SID, SOD (Serial Input Data, Serial Output Data) – деректерді тізбекті жіберу кірісі мен шығысы. RIM командасымен кіріс биті аккумулятордың жоғарғы разрядына енгізіледі, SIM командасымен шығыс биті осы разрядтан шығарылады;

-       HOLD – желіні иелену сұранысы. Оны сыртқы құрылғы қалыптастырады;

-       HLDA (Hold Acknowledge) – желінің иеленілуін құптау сигналы. Ол HOLD сигналына жауап ретінде кезекті машина циклінің аяғында қалыптастырылады да, МП-дың жүйе желісінен ажыратылғандығын құптайды. Бұл кезде желілер мен басқарушы , , IO/M және ALE сигналдарының жолдары үшінші жағдайға ауыстырылады.

1.2.3     Микропроцессор жұмысының ұйымдастырылуы.

Команда циклі КЦ команда таңдалымынан басталады (Opcode Fetch, OF). Бірінші машина циклі Ml әрқашан OF, онда МП команданың бірінші байтын қабылдайды. Одан кейін, команданың бірбайтты, екібайтты немесе үшбайтты болуына байланысты бір немесе екі MR (Memory Read) түрлі машина циклінің болуы мүмкін.

Команданың бірінші байтында (b1) операция коды, сілтеу тәсілі жөніндегі мәліметтер, ал егер команда бірбайтты болса, онда операндтың адресі де болады. Бұндағы адрес қысқа адресті “регистр-регистр” түріндегі операцияларға ғана байланысты болады. Жалпы қызметтік 8 регистрді сілтеуге үшразрядты, ал регистр жұптарын сілтеуге екіразрядты адрес жеткілікті (1.2 кестені қараңыз). Екібайтты команданың екінші байтында (b2) операцияға қатысты бірбайтты операнд немесе сыртқы құрылғының адресі болады. Үшбайтты команданың екінші байтында (b2) операцияға қатысты екібайтты операндтың немесе жады ұяшығының адресінің үлкен байты болады. Үшбайтты команданың үшінші байтында (b3) операцияға қатысты екібайтты операндтың немесе жады ұяшығының адресінің кіші байты болады.

1.2 к е с т е

Регистрлер

Регистр жұптары

B

C

D

E

H

L

M

A

B

D

H

SP

000

001

010

011

100

101

110

111

00

01

10

11

 

Команданың таңдалып, айқындалғанынан кейін, оны орындауға қосымша машина циклдерінің қажет болуы мүмкін. Командада небәрі бірден беске дейін машина циклі болуы мүмкін.

Машина циклі, төменде қарастырылатын қалыпты әрекеттер жүргізілетін тактілерден тұрады. Әртүрлі машина цикліндегі такт саны – 3…6, бірақ олардың көпшілігі үш тактіден тұрады.

Команда циклінде 4...18 такт болуы мүмкін.

Әртүрлі машина циклін жүзеге асырушы сигналдарды команданың бірінші байтындағы ақпарат негізінде МП тудырады.

Айтылғанды мысал арқылы суреттелік. Аккумулятордағы деректі жады ұяшығына тура сілтеумен (яғни адрестің командада көрсетілуі арқылы) жіберуші STA D3D2 (Store Accumulator Direct) командасының орындалуын қарастыралық. Команда – үшбайтты, оның МП-ға жіберілуі үшін үш машина циклі керек, оның біріншісінде b1 байты команда регистріне (IR) жіберіліп, келесілерінде b2 және b3 байттары уақытша регистрлерге (W және Z) жіберіледі. Бүкіл команда қабылданғаннан кейін МП аккумулятордағы дерек байтын, адресі МП-ға түскен, жады ұяшығына жіберу жұмысын жүзеге асырады. Сонымен, команда циклі OF-MR-MR-MW тәртібімен жүргізілетін төрт машина циклінен құрылады.

Әрбір машина циклі тактілік импульстердің аттас ауытқымаларының аралығымен анықталатын тактілерге (жағдайларға) бөлінеді.

Машина циклінің тактілерінде орындалатын қалыпты әрекеттер:

T1 – жадының (немесе СҚ-ның) адресі AD7-0 және A15-8 желілеріне қойылып, AD7-0 биттерін бекітуге ALE сигналы тудырылады. IO/M, S1 және S0 жолдарында цикл түрін анықтаушы ақпарат қойылады. HALT туы тексеріледі.

Т2 – Ready және Hold кірістері тексеріледі. Егер осы машина циклі команда таңдалымының бір бөлігі болса, онда бағдарлама санауышы бірге ұлғайтылады. BI (Bus Idle, желіні босату) циклінен басқа машина циклдерінде басқару стробтарының (,  немесе ) біреуі бірлік жағдайынан жандандырылған нөлдік жағдайына ауысады.

TW (Wait) – жадының немесе СҚ-ның дерек алмасуға дайын еместігінде (READY жолында төменгі деңгейлі кернеу тұрғанда) туады. Адрес, дерек және басқару жолдарының жағдайы такт аяғындағы қалпында қалады. READY сигналы әрбір күту тактісінде тексеріледі.

Т3 – команда немесе  дерек байты микропроцессорға немесе одан жіберіледі. Жандандырылған басқару стробының деңгейі бірлік деңгейіне өзгертіледі.

Т4 – команда регистріндегі код айқындалады.

Т5,6 – кейбір командалардың бітірілуіне қажет кезінде пайдаланылады.

Жүйе желілері пайдаланылмайды.

Машина циклінде әрқашан Т1....Т3 тактілері болады, кейде такт саны одан көбірек болуы мүмкін, бірақ оқу мен жазуға үш такт ғана қажет.

1.2.4     Микропроцессордың үзіліс жүйесі.

Микропроцессорлық жүйенің жұмысы кезінде оның ішінде немесе сыртында кезексіз әрекет қажет қылатын уақиғалар тууы мүмкін. Бұндай әрекет негізгі бағдарламаны үзіп (уақытша тоқтатып), үзіліс сұранысының жұмысын орындауға ауысу арқылы жүзеге асырылады. Жүйе ішіндегі сұраныстар оның жұмыс ахауынан, разряд торының асып кетуінде, нөлге бөлу кезінде және сыртқы құрылғылардың қызмет талабынан туады. Сыртқы сұраныстардың басқарылым объектілерінің қауіптілік жағдайында, қорек көздерінің ахаулығында және т.б. жағдайларда да түсуі мүмкін.

Баяу істейтін сыртқы құрылғылардың сұраныстары бойынша үзілістер, микропроцессор уақытын олардың ақпарат алмасуға дайын кезінде ғана алуына мүмкіндік беріп, бұндай ұйымдастырылым нәтижесінде жалпы жүйенің жұмыс тиімділігі көтеріледі. Сыртқы құрылғыға микропроцессор қажет болғанда, ол үзіліс сұранысының триггерін бірлік жағдайға қояды да, бұл үзіліс сигналын микропроцессордың қабылдап, сәйкесті өңдегенінше ол осы жағдайында қалады. Қабылданған үзіліс сұранысына жауап ретінде микропроцессорлық жүйеде кезекті команданың орындалуы бітіріледі, микропроцессор жағдайы еске сақталады, үзіліс қызметінің қосалқы бағдарламасы орындалады, сосын жүйенің басқарылуы негізгі бағдарламаның сәйкесті командасына қайтарылады.

Үзіліс сұранысына түсуіне байланысты (оған рұқсат бар кезінде) келесі әрекеттер жүзеге асырылады: команда көрсеткішінің (IP) жағдайы стекке жіберіледі, ал оның өзіне орындалатын қосалқы бағдарламаның адресі енгізіледі де, үзіліс сұранысына қажетті жұмыс орындалады.

Intel 8085 микропроцессорының бес үзіліс кірісі болады, олар –  TRAP; RST 5,5; RST 6,5; RST 7,5; INTR. Үзіліс жүйесінің ұйымдастырылымында сұраныстарды жасырым мәселелері шешіліп, олардың мәртебелік деңгейлері анықталады.

Жасырым дегеніміз – сәйкесті кірістің әрекетіне тыйым салу. Үзіліс сұраныстарының кірістерінің жасырылымды немесе жасырылмайтын (яғни әрқашан қабылдайтын жағдайында) болуы мүмкін.

TRAP кірісі – жасырылмайтын кіріс және оның мәртебесі ең жоғарғы деңгейде болады. Оған бағдарлама командалары арқылы тыйым салынбайды. Бұл кіріске микропроцессорлық жүйедегі, кезексіз әрекет қажет қылатын, маңызды уақиғалардың (мысалы, қорек көзінің ақауының) хабарлау сигналдары беріледі. TRAP үзілісіне сайланысты қызметтің қосалқы бағдарламасының бастапқы адресі жадының бекітілген, адресі 24Н ұяшықта орналастырылған.

RSTn (n = 5,5; 6,5; 7,5) кірістерінің белгілемесі Restart сөзінен алынған. Бұл кірістердің үзілістері – жасырылмалы, яғни оларға EI (Enable Interrupt) және DI (Disable Interrupt) командалары арқылы рұқсат беруге немесе тыйым салуға болады (олардың бәріне қатарынан). Микропроцессордың бастапқы тазартылымы бұл сұраныстардың барлығына да тыйым салады, оларға бұдан әрі рұқсат беру үшін EI командасын беру керек. RSTn сұраныстарына жеке тыйым салу мүмкіндігі де бар, ол арнайы SIM (Set Interrupt Mask) командасымен аккумулятордың А0...А2 биттерінің алдын ала енгізілген мәндеріне сәйкесті қойылады. RSTn кірістерінің мәртебелері RST 7,5; RST 6,5; RST 5,5 тәртібінде бекітілген. RSTn үзілістерінің қызметінің қосалқы бағдарламаларының бастапқы адрестері n мәнімен анықталады, сәйкесті бағдарламаның жұмысы бағдарлама санауышына 8n мәнін (002СН, 0034Н немесе ООЗСН) енгізуден басталады. Өзгеше айтқанда, бұл кірістердің үзіліс векторлары өздігінен анықталады, яғни оларды сыртқы құрылғыдан жіберудің қажеті болмайды.

RST 7,5 кірісі – динамикалық кіріс, ол сигналдың тура ауытқуына әрекет етеді, яғни сұраныс сигналы динамикалы кірісті триггерге енгізіледі де, оның алып тасталғанында, бұл үзіліс сұранысының қызметі орындалғанша немесе SIM немесе RESET командаларына дейін онда сақталады. RST 6,5 және RST 5,5 кірістері – статикалық кірістер, олар сигнал деңгейіне әрекет етеді, демек сұраныс сигналы жойылысымен, алып тасталынады.

INTR (Interrupt) кірісіне түсетін сұраныстың үзіліс векторы МП-ға сырттан жіберілу керек. Бұл кіріске көптеген жағдайда үзілістер контроллері қосылады, ол бірнеше сыртқы құрылғылардың сұраныстарын қабылдап, олардың мәртебелік жасырым мәселелерін шешіп, МП-ға жіберілетін жалғыз INTR сигналы мен сұранысқа сәйкесті үзіліс векторын қалыптастырады. Бұл жағдайда да RSTn командасы орындалады, бірақ n мәні үзіліс көзіне тәуелді болады. Үзілістерге рұқсат бар кезінде INTR сұранысының түсуіне жауап ретінде, микропроцессор  сигналымен үзіліс берілгендігін хабарлайды. Бұл сигнал буферлік күшейткіштердің шығыстық рұқсат кірістеріне түседі.

Үзіліс жұмысы өңделуі кезінде, EI командасы орындалғанша, TRAP үзілісінен басқа үзілістерге тыйым салынады. Жасырылмайтын TRAP үзілісі өзге үзілістерді жібергізбейді, бірақ бұрынғы түскен сұраныстың рұқсаттық жағдайын сақтайды.

1.2.5     Микропроцессордың тізбекті енгізу/шығару жүйесі.

Микропроцессордың тізбекті деректерді жіберуге арналған екі кірісі бар: SOD және SID (Serial Output Data және Serial Input Data).

SOD шықпасы SIM командасымен басқарылады, ал SID шықпасындағы сигнал RIM командасымен оқылады. Бұл командалар бұрын RSTn үзілістерінің жасырылымын қою және тазарту командалары ретінде таныстырылғанды, олар тізбекті енгізу/шығаруды басқаруға да пайдаланылады.

SIM командасының орындалуынан бұрын аккумуляторда, биттері 1.3-кестедегі мағынада түсінілетін, сөз қалыптастырылады:

1.3 к е с т е

7

6

5

4

3

2

1

0

SOD

SOE

x

R7,5

MSE

M7,5

M6,5

M5,5

 

Мұндағы SOD – деректердің тізбекті шығысы, SOE (Serial Input Enable) – бірлік мәнінде тізбекті SOD деректерін микропроцессордың сәйкесті шығысына жіберетін сигнал, 5-бит пайдаланылмайды, R 7,5 сәйкесті RST 7,5 кірісін тазартады (осы кірістегі сигналдың динамикалы басқарылымды триггерге қабылданатындығын еске түсіреміз), MSE (Mask Set Enable) – 2...0 биттерінің әрекетін жандандырушы сигнал, М 7,5...М 5,5 биттерінің бірлік мәні оларға сәйкесті RST 7,5...RST 5,5 сұраныстарын жасырады, яғни оларға тыйым салады.

Мысалы, SOD = 1, RST 6,5 кірісіне рұқсат берілуі, RST 7,5 триггерінің тазартылуы және RST 7,5 мен RST 5,5 кірістерінің жасырылуы екі командамен жүзеге асырылады:

 

MVI А, b2            ; аккумулятор биттерін қою

SIM                      ; жасырым биттерін және SOD битін өзгерту

 

MVI А, b2 командасы аккумуляторға b2 байтын жібереді, яғни аккумуляторға тіке сілтеу арқылы дерек жіберу операциясын (A) ← (b2) орындайды. Келтірілген жағдайға сәйкесті b2 байтының түрі: 11x11101.

Тізбекті деректерді SID шықпасы арқылы енгізу үшін RIM командасы пайдаланылады. RIM командасының орындалғанынан кейін аккумуляторда биттерінің мағынасы 1.4-кестеде келтірілген сөз қалыптасады:

1.4 к е с т е

7

6

5

4

3

2

1

0

SID

I7,5

I6,5

I5,5

IE

M7,5

M6,5

M5,5

 

Бұндағы SID – тізбекті енгізілетін деректер; I 7,5; I 6,5; I 5,5 – RST7.5; RST6.5 және RST5.5 шықпаларындағы логикалық деңгейлер, IE – үзіліске рұқсат сигналы, М 7,5...М 5,5 – маскалардың логикалық деңгейлері.

I 7,5... I 5,5 биттері сәйкесті логикалық деңгейлерді RIM командасының кезінде қалыптастырады. IE биті EI және DI командаларының қайсысы соңғы орындалғандығын көрсетеді, оған бұл кезде үзіліс режимінің болуы да (оның IE триггерін тазартып, басқа үзілістерге тыйым салатындығына байланысты) әсер етеді. М 7.5...М 5,5 биттері үзіліс маскаларының кезекті жағдайларын суреттейді.

1.2.6     Микропроцессордың командалар жүйесі.

Intel 8085 микропроцессорының командалар жүйесі 1.5-кестеде келтірілген. Кестенің бірінші бағанасында командалардың мнемокодтары (шартты жазылымы) берілген. Онда регистрлер – r, регистр жұптары – rp, жанама сілтеумен  байланысатын жады ұяшығы – М, команданың үшінші және екінші байттары – b3b2, сыртқы құрылғының адресі – port арқылы берілген.

Екінші бағанадағы команданың бірінші байтының (b1) кодтары операндтардың адресінің көрсетілуі қажет жағдайда, сегізразрядты екілік сан түрінде, өзге жағдайларда оналтылық сан түрінде берілген. Регистрлердің жалпылама адрестерінің разрядтары дерек көзі үшін S (Data Source) символдарымен, деректің жеткізілетін жері D (Data Destination) символдарымен, регистр жұптары P (Pair) символдарымен бейнеленген. Бұл символдардың орнына командағы қатысты регистрлер мен регистр жұптарының 1.2-кестеде келтірілген адресін қою арқылы нақтылы команданың коды алынады. Шартты ауыстыру командаларының кодындағы шарттардың коды C (Condition) символдарымен белгіленген, олардың түрлері мен белгілемелері 1.6-кестеде келтірілген.

RST командасының кодындағы nnn әріптерімен белгіленген үш разрядтың мәнін үзіліс жүйесі қояды немесе оны бағдарлаушы көрсетеді.

Салыстыру операцияларында операндтарға алу операциясы жүргізіліп, оның нәтижесіне байланысты Z және S белгілері қойылады (бірақ нәтиже ешқайда сақталмайды).

Үшінші бағанада сәйкесті команданың орындалуынан кейін қойылатын тулар жөніндегі мәліметтер келтірілген: “–” символы – ешқандай ту көтетілмейді, “+” символы – тулардың барлығы да көтеріледі, “+” – тасымал туынан басқа тулардың барлығы көтеріледі, “С” – тасымал туы ғана көтеріледі. Бұл тулар (S – терістік, Z – нөлдік, AC – ондық тасымал, P – жұптық, С – тасымал) ту регистрінде қалыптастырылады:

7

6

5

4

3

2

1

0

S

Z

0

AC

0

P

1

C

 

 

Келесі үш бағанада команда байттарының саны мен оның орындалу уақытына сәйкесті такт саны мен цикл саны келтірілген.

Соңғы бағанада командаларға түсініктеме келтірілген.

1.5 к е с т е

Мнемокод

Код

Тулар

Байт саны

Такт саны

Цикл саны

Түсініктеме

 

1

2

3

4

5

6

7

 

Жіберім командалары

 

MOV r1, r2

01DDDSSS

1

4

1

r1 ← (r2)

 

MOV M, r

01110SSS

1

7

2

[(HL)] ← (r)

 

MOV r, M

01DDD110

1

7

2

(r) ← [(HL)]

 

MVI r, b2

00 DDD110

2

7

2

r1 ← b2

 

MVI M, b2

36

2

10

3

[(HL)] ← b2

 

LXI rpb3b2

00PP0001

3

10

3

rp ← b3b2

 

LDA b3b2

3A

3

13

4

A ← b3b2

 

STA b3b2

32

3

13

4

b3b2 ← (A)

LHLD b3b2

2A

3

16

5

HL ← b3b2

SHLD b3b2

22

3

16

5

b3b2 ← (HL)

LDAX rp

00PP0010

1

7

2

A ← [(rp)]

STAX rp

00PP1010

1

7

2

[(rp)] ← (A)

XCHG

EB

1

4

1

(HL) ↔ (rp)

Арифметикалық және логикалық операциялардың командалары

ADD r

10000SSS

+

1

4

1

A ← (A) + (r)

ADD M

86

+

1

7

2

A ← (A) + [(HL)]

ADI b2

C6

+

2

7

2

A ← (A) + b2

ADC r

10001SSS

+

1

4

1

A ← (A) + (r) + (TC)

ADC M

8E

+

1

7

2

A ← (A) + [(HL)] + (TC)

ACI b2

CE

+

2

7

2

A ← (A) + b2 + (TC)

SUB r

10010SSS

+

1

4

1

A ← (A) – (r)

SUB M

96

+

1

7

2

A ← (A) – [(HL)]

SUI b2

D6

+

1

7

2

A ← (A) – b2

SBB r

10011SSS

+

1

4

1

A ← (A) – (r) – (TC)

SBB M

9E

+

1

7

2

A ← (A) – [(HL)] – (TC)

SBI b2

DE

+

2

7

2

A ← (A) – b2 – (TC)

INR r

00DDD100

(+)

1

4

1

r ← (r) + 1

INR M

34

(+)

1

10

3

[(HL)] ← [(HL)] + 1

DCR r

00DDD101

(+)

1

4

1

r ← (r) – 1

DCR M

35

(+)

1

10

3

[(HL)] ← [(HL)] – 1

INX rp

00PP0011

1

6

1

rp ← (rp) + 1

1.5 кестенің жалғасы

1

2

3

4

5

6

7

DCX rp

00PP1011

1

6

1

rp ← (rp) – 1

DAD rp

00PP1001

1

10

3

[(HL)] ← [(HL)] + (rp)

DAA

27

+

1

4

1

A ← (A)2-10

ANA r

10100SSS

+

1

4

1

A ← (A) ۸ (r)

ANA M

A6

+

1

4

1

A ← (A) ۸ [(HL)]

ANI b2

E6

+

2

7

2

A ← (A) ۸ b2

XRA r

10101SSS

+

1

4

1

A ← (A)  (r)

XRA M

AE

+

1

7

2

A ← (A)  [(HL)]

XRI b2

EE

+

2

7

2

A ← (A)  b2

ORA r

10110SSS

+

1

7

2

A ← (A) ۷ (r)

ORA M

B6

+

1

7

2

A ← (A) ۷ [(HL)]

ORI b2

F6

+

2

7

2

A ← (A) ۷ b2

CMP r

10111SSS

+

1

4

1

 (A) – (r)

CMP M

BE

+

1

4

1

 (A) – [(HL)]

CPI b2

FE

+

2

7

2

 (A) – b2

CMA

2F

1

4

1

 A ←  

STC

37

C

1

4

1

 TC ← 1

CMC

3F

C

1

4

1

 TC

RLC

07

C

1

4

1

 A7-1 ← (A6-0), A0 ← (TC), TC←A7

RRC

0F

C

1

4

1

 A6-0 ← (A7-1), A7 ← (TC), TC←A0

RAL

17

C

1

4

1

 A7-1 ← (A6-0), A0 ← (A7), TC←A7

RAR

1F

C

1

4

1

 A6-0 ← (A7-1), A7 ← (A0), TC←A0

Басқару командалары

JMP b3b2

C3

3

10

3

PC ← b3b2

Jcond b3b2

11CCCC01

3

10

3

Cond = 1: PC ← b3b2

CALL b3b2

CD

3

18

5

SP ← (PC), PC ← b3b2

Ccond b3b2

11CCC100

3

2/5

9/18

Cond = 1:

SP ← (PC), PC ← b3b2

RET

C9

3

10

3

PC ← [(SP)]

Rcond

11CCC100

3

17/11

5/3

Cond = 1: PC ← [(SP)]

RST n

111nnn111

1

11

3

PC ← 8n

SPHL

E9

1

6

1

SP ← (HL)

Арнайы командалар

PUSH rp

11PP0101

1

11

3

SP ← (SP) – 2;

 [(SP)];[(SP) + 1]← (rp)

 

1.5 кестенің соңы

1

2

3

4

5

6

7

PUSH PSW

F5

1

11

3

SP ← (SP) – 2;

[(SP)],[(SP) + 1]←(A),(F)

POP rp

11PP0001

1

10

3

rp ← [(SP)],[(SP) + 1],

SP ← (SP) + 2

POP PSW

F1

1

10

3

F,A ← [(SP)],[(SP) + 1];

SP ← (SP) + 2

XTHL

E3

1

18

5

(HL) ↔ [(SP)],[(SP) + 1]

PCHL

F9

1

5

1

PC ← (HL)

IN port

DB

2

10

3

A ← (port)

OUT port

D3

2

10

3

port ← (A)

EI

FB

1

4

1

Үзіліске рұқсат

ВI

F3

1

4

1

Үзіліске тыйым салу

HLT

76

1

7

2

Тоқтатылым

NOP

00

1

4

1

Операция жоқ

RIM

20

1

4

1

Үзіліс маскасын оқу

SIM

30

1

4

1

Үзіліс маскасын жазу

 

1.6 к е с т е

ССС

Мнемокод (cond)

Шарттар

000

NZ

Нолге тең болмау

001

Z

Нолге тең болу

010

NC

Тасымалдың тумауы

011

C

Тасымалдың тууы

100

PO

Тақтық

101

PE

Жұптық

110

P

Плюс

111

M

Минус

1.2.7     Микропроцессорда қолданылатын сілтеу тәсілдері.

Бағдарламадағы нақтылы командаға сәйкесті операцияның орындалуы үшін, онда команданың түрін анықтаушы кодымен қатар, операцияға қатысты операндтардың қайдан алынатындығы және орындалған операцияның нәтижесінің қайда орналастырылатындығы көрсетілуі керек.

Intel 8085 микропроцессорында сілтеу адрестерін қалыптастыру төрт түрлі тәсілмен жүзеге асырылады, олар – тура сілтеу, регистрлік сілтеу, жанама сілтеу және тіке сілтеу тәсілдері.

Тура сілтеу тәсілінде адрес коды орындалушы команданың құрамында болады. Бұл тәсіл – ыңғайлы тәсіл, бірақ үлкен көлемді жадының адрес разрядтарының саны да үлкен болатындықтан, ол команданы ұзартады. Мысалы, 216 ұяшықтан тұратын жадыға сілтеу 16-разрядты адреспен жүзеге асырылады. Сондықтан бұндай командалар үшбайтты болады. Сыртқы құрылғыларға сілтеу сегізразрядты адрес арқылы жүзеге асырылады да, бұндай командалар екібайтты болады.

Регистрлік сілтеу тәсілінде операнд микропроцессордың ішкі регистрлерінің біреуінде болады. Intel 8085 микропроцессорының ішкі регистрлерінің саны сегізден аспайтындықтан, оларға сілтеуге үшразрядты адрес жеткілікті болады, сондықтан бұндай командалар бірбайтты болады.

Жанама сілтеу тәсілінде командада орындалатын операцияға қатысты операндтың адресі тұрған регистр көрсетіледі. Бұндай командалар да регистрлік сілтемді командалар сияқты ықшамды келеді, бірақ олардың орындалуы үшін бұл регистрге (жанама сілтеу регистріне) қажетті адрес алдын ала енгізілуі керек. Жанама сілтеу регистрі ретінде Intel 8085 микропроцессорында HL жұбы пайдаланылады. Жанама сілтеу тәсілі тізбе түрінде берілген деректерді өңдеуге аса ыңғайлы келеді, бұл кезде адрес бір рет қойылады да, кезекті адрес оның алдыңғы мәнін бірге өзгерту арқылы алынады.

Тіке сілтеу тәсілінде операцияға қатысты операнд тікелей команда құрамында беріледі. Бұндай командалар екібайтты (сыртқы құрылғымен байланысқа) немесе үшбайтты (жадымен байланысқа) болады.

Суреттелген сілтеу тәсілдерінен күрделірек келетін сілтеу тәсілдері де (индексті сілтеу, қатынасты сілтеу және т.б.) бар, бірақ олар Intel 8085 микропроцессоры сияқты қарапайым микропроцессорларда пайдаланылмайды.

Әртүрлі сілтеу тәсілдерін пайдалану бағдарламалардың көлемі мен олардың орындалу уақытын қысқартуға мүмкіндік береді.

Нақтылы тәсілмен сілтеуші адрес микропроцессорлық жүйенің адрестік желісі арқылы жіберіліп, микропроцессор байланысатын жады ұяшығын немесе сыртқы құрылғыны таңдайтын іс жүзіндегі адрес коды қалыптастырылады. 

Жады мен сыртқы құрылғылардың адрестік кеңістігінің пайдаланылу тәртібіне байланысты “ортақ желілі” және “жеке желілі” деп аталатын, екі түрлі тағұлұм ажыратылады.

Бірінші “ортақ желілі” тағұлұм шегінде жады мен сыртқы құрылғыларды сілтеуге ортақ адрестік кеңістіктің жеке бөліктері бөлінеді. Бұл жағдайда жадыға немесе сыртқы құрылғыға байланыс бірдей командалармен және бір желі арқылы жүзеге асырылады, ал бұл бағдарламаның қарапайым болуына жол ашады. Бірақ адрестік кеңістіктің бір бөлігінің сыртқы құрылғыларға пайдаланылуына байланысты жадыға бөлінген адрес кеңістігінің мөлшері кемиді.

“Жеке желілі” тағұлұмда жады мен сыртқы құрылғылардың әрбіреуінің  меншікті жеке адрестік кеңістіктері болады. Бұл кезде қай объектімен байланыс болып жатқандығын анықтаушы басқару сигналдары керек болады. Мысалы, IO/М сигналымен жады немесе сыртқы құрылғының сілтенуі көрсетіледі. Бұл жағдайда жады бүкіл адрестік кеңістікті пайдалана алады. Сыртқы құрылғымен дерек алмастыруға IN port және OUT port командалары ғана пайдаланылады да, оған микропроцессордың көптеген ыңғайлы командаларын пайдалануға мүмкіндік болмайды.

Микропроцессордың байланысатын адрестік кеңістігінің мөлшері адрес желісінің разрядының санына тәуелді. Мысалы, Intel 8085 микропроцессорының 16-разрядты адрес желісі арқылы 216 = 64К көлеміндегі объектілермен (жады ұяшықтарымен) байланысуға болады.

Адрестік кеңістіктің микропроцессор байланысатын қызмет жадысының, тұрақты жадының және сыртқы құрылғылардың блоктарына таратылып бөлінуін жүйені жобалаушы, нақтылы пайдаланылған микропроцессордың ерекшеліктерін ескере отырып, тағайындайды.

1.3            Микропроцессорлық жүйе жұмысын бағдарлау

Микропроцессорлық жүйенің жұмысы шешілетін мәселеге байланысты құрылған, командалар тізбесі түріндегі бағдарламаның басқаруымен жүзеге асырылады. Бұндай бағдарламалар, әдетте, командалардың мнемокодтары арқылы суреттелетін, ассемблер тілінде жазылады. Мнемокодтарды машина тіліне (екілік кодтарға) аударушы (translation) арнайы бағдарлама Ассемблер деп аталады. Машина тіліндегі бағдарлама микропроцессорлық жүйенің жадылық модулінде сақталады да, оның құрамындағы команда кодтары нақтылы тәртіппен таңдалып (оқылып), ол команда кодтарында берілген мәліметтер (операция коды, сілтеу тәсілі, деректер) негізінде орындалады.

Ассемблер тіліндегі бағдарлама нақтылы тәртіппен келесі түрде жазылады:

{Белгі}

Мнемокод

{Операнд(тар)}

; {Түсініктеме}

Көрнекі жақшаларда болуы да, болмауы да мүмкін элементтер келтірілген. Белгі, мнемокод және операндтар бос орын арқылы ажыратылады.

Белгі – команданың символды адресі. Белгілер ауыстыру арқылы бағытталатын командаларға ғана қойылады. Ауыстыру командалары мен қосалқы бағдарламаларды шақыру командаларында белгі аталымы операнд ретінде пайдаланылады.

Мнемокод – команданың ассемблер тіліндегі жазылымы. Мнемокод ретінде команда қызметінің ағылшын тіліндегі мағынасының қысқартылымы пайдаланылады: ADD (ADDition), SUB (SUBtraction), XCHG (eXCHanGe).

Операндтар үтір арқылы бөлінеді. Екі операнд берілген жағдайда оның біріншісі ақпарат қабылдаушысы, ал екіншісі ақпарат көзі болады.

Түсініктеме командалардың қызметін суреттеуге ғана пайдаланылады, ол машина тіліне аударылмайды және әрқашан үтір-нүктеден басталады.

Бұдан әрі Intel 8085 микропроцессорының командалар жүйесіндегі әртүрлі командалардың пайдаланылу жолдарын суреттеуге арналған бірнеше бағдарламалық құрылымдар қарастырылады. Бұл бағдарламаларды Intel 8085 микропроцессорының негізіндегі микропроцессорлық жүйенің симуляторы (8085 Simulator IDE) арқылы орындап, олардың жұмысын тексеру бағдарлама құрамындағы командалардың жұмысын түсінуге  толық мүмкіндік береді.

1.3.1     Дерек жіберілімдері.

Intel 8085 микропроцессорының командалар жүйесіндегі әртүрлі сілтемелі дерек жіберу командаларының іс-әрекетімен танысуға арналған келесі Transfers (Жіберілімдер) аталымды бағдарламаны қарастыралық.

 

;Transfers

;=========================================

         ;Single Writing

         mvi A,0FH           ;Direct Loading

         sta 00D0H            ;Direct Writing

         nop

;---------------------------------------------------------------------

         ;Serial Writing-1

         mvi C,07h             ;Data Counter

         lxi D,00D0h          ;Initial Address

         mvi A,00h            ;Cleaning

T0     adi 13h                 ;Expansion Step

         inx D                    ;Address Increment

         stax D                   ;Indirect Writing

         dcr C                    ;Monitoring of the Data Counter

         jnz T0                   ;Continue

         xchg                     ;Exchange

         nop

;---------------------------------------------------------------------

         ;Serial Writing-2

         mvi C,08h             ;Data Counter

T1     adi 09h                 ;Expansion Step

         inx H                    ;Address Increment

         mov M,A              ;Indirect Writing

         dcr C                    ;Monitoring of the Data Counter

         jnz T1                   ;Continue

         nop

;---------------------------------------------------------------------

         ;Data Access and Writing

         lxi D,00EFh          ;Initial Address

         mvi C,08h             ;Data Counter

T2     mov A,M              ;Indirect Loading

         stax D                   ;Indirect Writing

         dcx H                            ;Address Decrement

         dcx D                            ;Address Decrement

         dcr C                    ;Monitoring of the Data Counter

         jnz T2                   ;Continue

         nop

;---------------------------------------------------------------------

         ;Data Access, Conversion and Writing

         mvi C,07h             ;Data Counter

T3     mov A,M              ;Indirect Loading

         rlc;                       Left Shift

         xchg                     ;Exchange

         mov M,A              ;Indirect Writing

         dcx H                            ;Address Decrement

         dcx D                            ;Address Decrement

         xchg                     ;Exchange

         dcr C                    ;Monitoring of the Data Counter

         jnz T3                   ;Continue

         nop

;---------------------------------------------------------------------

         ;Single Access and Writing

         lda 00D0h             ;Direct Loading

         sta 00E0h              ;Direct Writing

;---------------------------------------------------------------------

         hlt                         ;Ending

 

Бірнеше блок түрінде құрылған бұл бағдарламада процессор мен жады арасындағы дерек жіберілімдері жүзеге асырылады. Бірінші блокта (Single Writing-1) жадыға тура сілтемелі команда (sta 00D0h) арқылы жеке жіберілім жүзеге асырылады. Екінші блокта (Serial Writing-1) жадыға жанама сілтемелі команда (stax D) арқылы дерек массивінің (арифметикалық прогрессияның мүшелері түріндегі) жіберілімі жүзеге асырылады. Дерек массивінің жіберілімінің ыңғайлырақ тәсілі (mov M,A) келесі блокта (Single Writing-2) келтірілген.

Келесі үш блокта (Data Access, Data Access and Conversion, Single Writing) деректердің жадының бір аймағынан екінші аймағына алғы пайдаланылған командаларға ұқсас командалармен жіберілуі (тек кері тәртіппен) жүзеге асырылады.

Әртүрлі жіберілім операцияларының орындалуы кезінде симулятордың негізгі терезесіндегі микропроцессордың сәйкесті регистрлері мен жады ұяшықтарындағы (Memory Editor) өзгерістерді бақылай отырып, бағдарлама командаларының орындалу барысын түсінуге симулятор толық мүмкіндік береді. Бағдарламаның жоғарыда сипатталған әрбір блогын жеке тексеру үшін, Breakpoints Manager терезесін ашып, онда әрбір блок соңына (nop командалары орналастырылған жолдарға) тоқтатылым нүктелерін қою керек (1.2 суретті қараңыз).

1.2 сурет

1.3.2     Бірбайтты арифметика.

Келесі Single-Byte Arithmetic (Бірбайтты арифметика) бағдарламасы бірбайтты арифметикалық командалардың (add, sub) іс-әрекетімен танысуға, айналымды бағдарламалық құрылымдардың ұйымдастырылу принциптерін түсінуге және перифериялық құрылғылармен жұмыстардың ұйымдастырылу принциптерін үйренуге арналған.

 

         ;Single-Byte Arithmetic

;=========================================

         ;Data Array (arithmetical progression)

         lxi H,00E0h           ;Initial Address

         mvi C,0Ah            ;Data Quantity

         mvi A,00h             ;Cleaning

         mov M,C              ;Writing in the Memory

SD     inx H                    ;Address Increment

         adi 15h                 ;Increment Step of the Linear Series

         mov M,A              ;Writing in the Memory

         dcr C                    ;Monitoring of the Data Counter

         jnz SD                  ;Continue

         nop

;---------------------------------------------------------------------

         ;Cumulative Summation

         ;Sum=((2a1+(n-1)d)/2)n

         ;a1-first operand, n-quantity, d-step,

         lxi H,00E0h           ;Initial Address

         mvi A,00h             ;Cleaning

         mov B,A               ;Cleaning

         mov C,M              ;Installation of the Data Counter

C1     inx H                    ;Address Increment

         add M                  ;Addition

         jnc C2                  ;Carry Monitoring

         inr B                     ;Carry Accumulation

C2     dcr C                    ;Monitoring of the Data Counter

         jnz C1                   ;Continue

         nop

;---------------------------------------------------------------------

         ;Retention of Result

         inx H

         mov M,A              ;Low Byte

         inx H

         mov M,B              ;High Byte

         nop

;---------------------------------------------------------------------

         ;Series Subtraction

         lxi H,00E0h           ;Initial Address

         mov C,M              ;Installation of the Data Counter

S1     inx H                    ;Address Increment

         sub M                            ;Subtraction

         jnc S2                            ;Borrow Monitoring

         dcr B                    ;Borrow Subtraction

S2     dcr C                    ;Monitoring of the Data Counter

         jnz S1                            ;Continue

         nop

;=========================================

         ;Alternative of the Single-Byte Summation

;=========================================

         ;Data

         in 01h                   ;First Operand

         mov E,A

         in 01h                   ;Data Quantity

         mov C,A

         in 02h                   ;Step

         mov D,A

         lxi H,0000h

         nop

;---------------------------------------------------------------------

         ;Cumulative Summation-A

A1     mov A,E

         add D

         mov E,A

         mov A,L

         add E

         jnc A2

         inr H

A2     mov L,A

         dcr C

         jnz A1

         mov A,L

         out 03H

         mov A,H

         out 04H

;---------------------------------------------------------------------

         hlt                         ;Ending

 

Бұл бағдарламаның құрамындағы Data Array блогы жадыға арифметикалық прогрессия мүшелері түріндегі деректердің жазылуын жүзеге асырады (прогрессияның берілген параметрлерін (n = 0Ah – мүшелер санын, a1 = 00h – бірінші мүшенің мәнін, d = 15h – прогрессия қадамын) жұмыстың орындалу барысында өзгертуге болады); Cumulative Summation блогы бағдарламаның алдыңғы блогында жадыға жазылған арифметикалық прогрессия мүшелерінің қосындысын анықтайды; Retention of Result блогы алынған қосынды нәтижесін жадыда сақтайды; Series Subtraction блогы алдында алынған қосындыдан арифметикалық прогрессия мүшелерінің мәндерін тізбелеп алады; екі қосалқы блок түрінде (Data и Cumulative Summation-A) құрылған Alternative of the Single-Byte Summation блогында арифметикалық прогрессия мүшелерінің қосындысын анықтаудың перифериялық құрылғыларды (1.3 -суретті қараңыз) пайдалану арқылы (in, out командалары) анықталатын өзгеше түрі жүзеге асырылады.

1.3 сурет

1.3.3     Екібайтты арифметика.

Келесі Double-Byte Arithmetic (Екібайтты арифметика) бағдарламасы екібайтты сандарға арифметикалық операциялар жүргізуге арналған регистрлік сілтемді (add, adc, sub, sbb) және тіке сілтемді (adi, aci, sui, sbi) командалардың іс-әрекетімен танысуға арналған.

 

         ;Double-Byte Arithmetic

;=========================================

         ;Data Array (arithmetical progression)

         lxi H,00E0h           ;initial address

         mvi C,0Ah            ;data quantity

         mov M,C

         mvi A,00h             ;low byte

         mvi B,12h             ;high byte

DD    adi 15h                 ;step of the low byte=15H

         inr B                     ;step of the high byte=01H

         inx H

         mov M,A              ;saving of the low byte

         inx H

         mov M,B              ;saving of the high byte

         dcr C                    ;monitoring of the data counter

         jnz DD                  ;continue

         nop

;---------------------------------------------------------------------

         ;Cumulative Summation

         ;SUM=((2a1+(n-1)d)/2)n

         ;a1-first operand,n-quantity,d-step

         lxi H,00E0h           ;initial address

         lxi D,0000h           ;temporary repository for the result

         mov B,M              ;installation of the data counter

         mov C,B               ;doublet of the data counter

CS     mov A,E

         inx H

         add M                  ;low byte

         mov E,A

         mov A,D

         inx H

         adc M                            ;high byte

         mov D,A

         dcr B                    ;monitoring of the data counter

         jnz CS                  ;continue

         nop

;---------------------------------------------------------------------

         ;Addition with Direct Addressing

         mov A,E

         adi 3Dh                 ;low byte

         mov E,A

         mov A,D

         aci 5Ah                 ;high byte

         mov D,A

         nop

;---------------------------------------------------------------------

         ;Retention of the Result

         inx H

         mov M,E              ;low byte

         inx H

         mov M,D              ;high byte

         nop

;---------------------------------------------------------------------

         ;Series Subtraction

         lxi H,00E0h

S0     mov A,E

         inx H

         sub M                            ;low byte

         mov E,A

         mov A,D

         inx H

         sbb M                            ;high byte

         mov D,A

         dcr C                    ;monitoring of the data counter

         jnz S0                            ;continue

         nop

;---------------------------------------------------------------------

         ;Subtraction with Direct Addressing

         mov A,E

         sui 3Dh                 ;low byte

         mov E,A

         mov A,D

         inx H

         sbi 5Ah                 ;high byte

         mov D,A

         nop

;---------------------------------------------------------------------

         ;Alternative of the Double-Byte Summation

         lda 00E0h

         mov C,A              ;data counter

         lxi SP,00E1h         ;initial address

         lxi H,0000h           ;Double-Byte Accumulator

AS     pop D                            ;Pulling

         dad D                            ;Double-Byte Summation

         dcr C                    ;monitoring of the data counter

         jnz AS                  ;continue

         lxi B,5A3Dh

         dad B

;---------------------------------------------------------------------

         hlt

Бұл бағдарламаның құрамындағы Data Array блогы жадыға арифметикалық прогрессия мүшелері түріндегі деректердің жазылуын жүзеге асырады (прогрессияның берілген параметрлерін (n = 0Ah – мүшелер санын, a1 = 1200h – бірінші мүшенің мәнін, d = 0115h – прогрессия қадамын) жұмыстың орындалу барысында өзгертуге болады). Қалыптастырылған прогрессия мүшесі жадының екі ұяшығында сақталады (алдымен – кіші байты, сосын – үлкен байты); Cumulative Summation блогы бағдарламаның алдыңғы блогында жадыға жазылған арифметикалық прогрессия мүшелерінің қосындысын анықтайды; Addition with Direct Addressing блогы қосу операциясын тікелей сілтенімді командалар арқылы жүзеге асырады; Retention of Result блогы алынған қосынды нәтижесін жадыда сақтайды; Series Subtraction блогы алдында алынған қосындыдан арифметикалық прогрессия мүшелерінің мәндерін тізбелеп алады; Subtraction with Direct Addressing блогы алу операциясын тікелей сілтенімді командалар арқылы жүзеге асырады; Alternative of the Double-Byte Summation блогы арифметикалық прогрессия мүшелерінің қосындысының екібайтты қосу командасы dad арқылы анықталатын өзге жолын жүзеге асырады.

1.3.4     Көбейту бағдарламасы.

Intel 8085 микропроцессорында көбейту командасы жоқ, сондықтан көбейту операциясын орындау үшін сәйкесті бағдарлама құру керек болады. Келесі бағдарлама екібайтты dad командасы арқылы ұйымдастырылатын, көбейту операциясын орындауға арналған Multiplication (Көбейту) бағдарламасының жұмысымен танысуға мүмкіндік береді.

Бірбайтты екілік сандарды көбейту алгоритмі келесі тәртіппен жүзеге асырылады:  сегізразрядты сандардың көбейтілу нәтижесі 16-разрядты сан болатындықтан және жеке қосылымдардың да  16-разрядты сандарға жүргізілетіндігіне байланысты, 16-разрядты аккумулятор ретінде HL регистрлік жұбы алынып, ол операция басында тазартылады; DE регистрлік жұбының E регистріне бірінші сан (көбейтілгіш), ал оның D регистріне нөл енгізіліп, көбейтілгіш қосуға ыңғайлы 16-разрядты санға айналдырылады; екінші сан (көбейткіш) оның разрядтарын ығыстырып шығару үшін аккумуляторға (сөзімізді шатыстырмас үшін, оны бұдан әрі A регистрі деп атаймыз) енгізіледі; ығыстыру операциясының санын бақылап отыру үшін, көбейткіштің разряд саны микропроцессордың бір регистріне (мысалы, С регистріне) енгізіледі; әрбір жеке көбейту алдында осы мезетке дейін HL жұбындағы жиналған нәтиже (өзіне өзін қосу арқылы) солға ығыстырылады; ығыстыру арқылы А регистрінен шығарылған көбейткіштің кезекті разрядының мәні нөл болғанда, жеке көбейту осымен бітеді (яғни, алдыңғы ығыстырыммен); А регистрінен шығарылған көбейткіштің кезекті разрядының мәні бір болғанда, HL жұбына DE жұбы қосылады; әрбір жеке көбейтілімнен кейін санауыш құрамы бірге кемітіледі де, оның нөлге тең болған кезінде көбейту бағдарламасы өз жұмысын тоқтатады. Сонымен, ығыстыру операциясы сегіз рет жүргізіледі, ал қосу операциясының саны көбейткіштің құрамындағы бірліктердің санымен анықталады.

 

         ;Multiplication

;=========================================

         ;Data

         in 01h

         mov E,A

         mvi D,00h

         in 02h

         lxi H,0000h

         mvi C,08h

;---------------------------------------------------------------------

         ;Implementation

M1    dad H

         rlc

         jnc M2

         dad D

M2    dcr C

         jnz M1

         mov A,L

         out 03h

         mov A,H

         out 04h

;---------------------------------------------------------------------

         hlt

 

Деректерді алгоритмге сәйкесті көбейтуге дайындау бағдарламаның Data бөлігінде жүргізіледі де,  көбейту процесінің өзі оның Implementation бөлігінде жүзеге асырылады.

1.3.5     Стекпен жұмыс ұйымдастырылуы.

Микропроцессорлық жүйе жұмысының негізгі бағдарламасының құрамында, әдетте, одан шақырылатын және нақтылы мәселелерді шешуге арналған, бірнеше қосалқы бағдарлама болады.

Қосалқы бағдарламалармен жұмыс ұйымдастырылуы кезінде шақырылған бағдарламаның орындалып біткенінен кейін негізгі бағдарламаға қайту мүмкіндігін қамтамасыз ету керек. Ол үшін жадының жеке бір аймағы стекке бөлінеді де, оның түбі стек көрсеткіші SP ретінде белгіленеді. Қосалқы бағдарламаның шақырылуы кезінде, оның орындалып біткенінен кейін қайтып келетін негізгі бағдарламаның келесі командасының адресі стекте сақталады. Әрбір қосалқы бағдарлама, негізгі бағдарламаға қайтуды қамтамасыз ететін ret командасымен аяқталу керек.

Қажетті жағдайда регистрлердегі (дәлірек айтқанда, регистрлік жұптардағы) деректерді де стекте push командасымен сақтап, сосын оларды стектен pop командасымен оқуға болады.

Төменде қосалқы бағдарламалармен және стекпен жұмыс ұйымдастырылу тәртібін қарастыру мақсатында y = a1*a2 + a3*a4 +  өрнегі бойынша Stack (Стек) аталымды есептеу бағдарламасы келтірілген.

 

         ;Stack...Sum=a1*a2+a3*a4+sum(ai,n,d)

;=========================================

         ;Preset

lxi SP,0FFh

         mvi B,0A0h

nop

;---------------------------------------------------------------------

         ;Mul1=a1*a2

         in 01h                   ;first multiplier

         mov E,A

         in 02h                   ;second multiplier

         call Mul

         push H

         call Per

         nop

;---------------------------------------------------------------------

         ;Mul2=a3*a4

         in 01h                   ;first multiplier

         mov E,A

         in 02h                   ;second multiplier

         call Mul

         push H

         call Per

         nop

;---------------------------------------------------------------------

         ;Sum(ai,n,d)

         in 01h                   ;quantity - n

         mov C,A

         in 02h                   ;step - d

         mov D,A

         in 01h                   ;initial operand - a1

         mov D,A

         lxi H,0000h

         call Sum

         call Per

         nop

;---------------------------------------------------------------------

         ;Total Sum

         pop D

         dad D

         pop D

         dad D

         call Per

;---------------------------------------------------------------------

         hlt

;=========================================

Mul    ;Multiplication (subroutine)

         mvi D,00h

         lxi H,0000h

         mvi C,08h

M1    dad H

         rlc

         jnc M2

         dad D

M2    dcr C

         jnz M1

         ret

;=========================================

Sum   ;Cumulative Summation (subroutine)

CS3   mov A,E

         add D

         mov E,A

         mov A,L

         add E

         jnc CS4

         inr H

CS4   mov L,A

         dcr C

         jnz CS3

         ret

;=========================================

Per    ;Displaying on the Periphery

         ;and Writing on the Memory (subroutine)

         mov C,B

         mvi B,00h

         mov A,L

         out 03h

         stax B

         inr C

         mov A,H

         out 04h

         stax B

         inr C

         mov B,C

         ret

Бағдарламаның негізгі бөлігі келесі блоктардан тұрады: Preset – негізгі бағдарламаның басы, онда стек көрсеткішінің мәні SP және нәтижелерді шығару құрылғысында көрсетуге арналған қосалқы бағдарламаның жұмысын ұйымдастыруға қажетті ақпарат қойылады; Mul1 и Mul2 – көбейтуге арналған деректер енгізіледі де, сосын – көбейту бағдарламасы, одан кейін нәтиже көрсету бағдарламасы шақырылады; Sum – қосуға арналған деректер енгізіліп, сосын – қосу бағдарламасы, одан кейін нәтиже көрсету бағдарламасы шақырылады; Total Sum – ақырғы нәтиже, яғни алдыңғы кезеңдерде алынған жеке нәтижелердің қосындысы есептеледі.

Бағдарламада үш қосалқы бағдарлама пайдаланылады: Multiplication – шақырылар алдында енгізілген екі санның көбейтілуін жүзеге асырады; Cumulative Summation – алдын-ала енгізілген деректердің қосындысын есептейді; Displaying on the Periphery – қосалқы бағдарламаларда алынған нәтижелердің сыртқы құрылғыда шығарылуын және олардың жадыда сақталуын жүзеге асырады.

2 PIC микроконтроллерлері

2.1            PIC микроконтроллерлерінің құрылымы

Microchip компаниясының әртүрлі жинам (семейство) түрінде шығаратын, Гарвард архитектурасымен құрылған, 8-разрядты PIC (Peripheral Interface Controller) микроконтроллерлері, олардың тезәрекеттілігіне байланысты әртүрлі қолданылым аймақтарында кеңінен қолданылатын аспаптарға жатады.

PIC микроконтроллерлерінің құрамына енгізілген RISC-процессоры әртүрлі сілтеу тәсілдерін пайдалану арқылы кез келген регистрмен операциялар орындауға және пайдаланушының операция нәтижесін регистр-аккумуляторда немесе операцияға пайдаланылған екінші регистрде сақтауына мүмкіндік береді.

Бұнымен қатар, PIC микроконтроллерлерінің енгізу/шығару порттары, жады ұяшықтары мен таймер сияқты қызмет қорларының барлығы да – іс жүзінде құрылған регистрлер, сондықтан олармен бағдарламалы жұмыс ұйымдастыру біркелкі тәртіппен жүргізіледі.

Бұдан әрі талқылауға, күрделі PIC микроконтроллерлерінің негізі болып саналатын және бастапқы түсіндіруге ыңғайлы елетін, аса кең таралған PIC16F84A микроконтроллерін пайдаланамыз.

PIC микроконтроллерлерінің қызмет жадысының құрамындағы регистрлер атқарар қызметіне қарай екі топқа бөлінеді, олар: жалпы қызмет регистрлері (GRP, General Purpose Registers) және арнайы қызмет регистрлері (SFR, Special Function Registers). Бұл регистрлердің  бәрі де бірбайтты және олар енгізілген деректі қорек көзінің қосылған кезінде ғана сақтайды.

PIC16F84A микроконтроллерінің қызмет жадысының аймағы екі банкке бөлінген. Оның жалпы қызмет регистрлерінің барлығы да  нөлінші банкте орналасқан, ал бірінші банкте олар қайталанады. Бұндай қайталану жалпы қызмет регистрлерімен жұмыс істеу үшін банк ауыстыруды қажет қылмайды. Олардың кез келгенін, сәйкесті аталым қойып, бағдарламаның жұмыс бабында пайдалануға болады.

Арнайы қызмет регистрлерінің (SFR) аталымдары мен адрестері стандартты, яғни ешқашан олар өзгертілмейді (2.1 кестені қараңыз). Бұл регистрлердің құрамын ғана өзгертуге, яғни олардың биттерінің мәндерін түрлендіруге (кейбірін 0 немесе 1 мәндеріне қоюға) болады. Осы түрленділімдерге байланысты микроконтроллердің бағдарлаушының ойына сәйкесті қызмет істеуіне жағдай жасалады.

Кейбір SFR регистрлері екі банкте де орналастырылған (бұндай жағдай, көбіне, шағылыстыру деп аталады), яғни олармен кез келген банкте жұмыс істеуге болады. Жұмыс көбіне нөлінші банктегі SFR регистрлерімен істеледі.

Бірінші банкте орналастырылған  SFR регистрлерімен жұмыс істеу үшін бірінші банкке ауысып, онда олардың құрамына қажетті түрлендірімдер жүргізгеннен кейін нөлінші банкке қайтып келу керек. Екі банкте де орналастырылған (қайталанған) регистрлермен жұмыс істеу үшін банк ауыстырудың, әрине, қажеті жоқ.

2.1 к е с т е – Арнайы қызмет регистрлері

Банк 0

Банк 1

00

INDF

80

INDF

01

TMR0

81

Option_Reg

02

PCL

82

PCL

03

Status

83

Status

04

FSR

84

FSR

05

PortA

85

TrisA

06

PortB

86

TrisB

07

 

87

 

08

EEData

88

EECon1

09

EEAdr

89

EECon2

0A

PCLatch

8A

PCLatch

0B

IntCon

8B

IntCon

 

Кейбір арнайы қызмет регистрлерінде микроконтроллердің бапталуына тікелей әсер етуші биттерінен басқа, баптауға қатысы жоқ биттер де бар.   Олар тулар деп аталады. Өзгеше айтқанда, олар ешқандай өзгеріс тудыратын тікелей әрекет жүргізбейді, бірақ олардың құрамына қарап, орындалған операцияның нәтижесі туралы (мысалы, операция нәтижесінің нөл немесе нөл еместігі) мәлімет алып, сосын бұл мәліметті бағдарламаның бұдан әрі орындалатын бірнеше жұмыс бағытының (сценарийінің) біреуін таңдауға пайдалануға болады.

Бағдарламаларда жиі пайдаланылатын Status регистрінің құрамымен танысалық. Оның жұмыс биттері мен туларының түсініктемелері 2.2-кестеде келтірілген.

Status  регистрінде үш жұмыс биті (5,6,7) орналасқан, біздің қарастыратын PIC16F84A микроконтроллерінде RP0 аталымды, банктерді ауыстыруға арналған, 5-бит қана пайдаланылады. Бағдарламаның орындала бастаған мезетінде микроконтроллерде әрқашан нөлінші банк таңдалады да, RP0 биті нөл мәніне қойылады. Демек банкті ауыстыру үшін RP0 мәнін өзгерту керек болады.

А және В порттарының шықпаларының жұмыс бағытын оларға сәйкесті TrisA және TrisB регистрлері арқылы кез келген тәртіппен қоюға болады. А және В порттарының шықпаларының саны 5 және 8 болуына байланысты TrisA және TrisB регистрлерінің де сонша жұмыс биттері болады. Олардың адрестері – 85h және 86h. Егер бұл регистрлердің кейбір биттері 1-ге қойылса, онда порттың сәйкесті шықпасы “кіріс” жұмысын атқарады, яғни ол осы шықпаға қосылған сыртқы құрылғының шығысынан дерек қабылдайды. Егер TrisA/TrisB биті 0-ге қойылса, онда порттың сәйкесті шықпасының өзі осы шықпаға қосылған сыртқы құрылғыға сигнал көзі болады да, бағдарлама осы сыртқы құрылғыны (мысалы, жарық шығарушы диодты немесе өзге орындаушы құрылғыны) басқара алады.

TrisA және TrisB регистрлері бірінші банкте болғандықтан, олармен жұмыс істеу үшін осы банкке ауысып, онда қажетті бит мәндерін өзгертіп, сосын нөлінші банкке (бұдан әрі жұмыс нөлінші банкте болатын болса) қайтып келу керек.

PortA және PortB регистрлері А және В порттарының ілмектерін басқарады. Ілмек (Latch) – аппаратты түрде жүзеге асырылған жадылық құрылғы, өзгеше айтқанда, статикалы басқарылатын триггер. PortA және PortB регистрлерінің биттері осы триггерлерді басқарады. Бірақ ескерілетін мынадай мәселе бар: порт ілмегінің шығысы сәйкесті порт шықпасына осы шықпаның “шығысқа” жұмыс істегенінде ғана жалғанады, ал осы шықпаның “кіріске” жұмыс істегенінде ілмек шығысы сәйкесті порт шықпасынан ажыратылады.

 

2.2 к е с т е – Status  регистрі

Бит

Аталымы

Түсініктеме

7

IRP

PIC16F84A микроконтроллерінде пайдаланылмайды

6

RP1

PIC16F84A микроконтроллерінде пайдаланылмайды

5

RP0

Банк таңдау биті:

1 – банк 1 (080h – 0FFh)

0 – банк 0 (000h – 07Fh)

4

TO’

Қарауыл таймерінің (WDT) шектен шығу туы:

1 – clrwdt командасының орындалғанында

0 – WDT-ның асып түсуінде

3

PD’

Қорек көзінің қосылым туы:

1 – қорек көзінің қосылу тазартылымында

немесе clrwdt командасының орындалғанынан кейін

0 – sleep командасының орындалғанынан кейін

2

Z

Нөлдік нәтиже туы:

1 – операция нәтижесінің нөл болғаны

0 – операция нәтижесінің нөл болмағаны

1

DC

Байттың кіші тетрадасына байланысты тасымал/қарыз туы:

1 – тасымал/қарыз болуы

0 – тасымал/қарыз болмауы

0

C

Байтқа байланысты тасымал/қарыз туы:

1 – тасымал/қарыз болуы

0 – тасымал/қарыз болмауы

 

В портының шықпаларына аппаратты түрде ішкі тарту резисторларын (pull-up resistor) қосу немесе қоспау мүмкіндігі ескерілген, ал A портының шықпаларында ондай ішкі тарту резисторлары жоқ, сондықтан олардың “кіріске” жұмыс істегеуге бапталғанында, оларға сыртқы тарту резисторларын қосу керек болады.

2.2            PIC микроконтроллерлерінің командалар жүйесі

PIC16F84A микроконтроллерінің командалар жүйесі небәрі 35 командадан тұрады және бұл командалардың барлығы да операция коды (OpCode) мен операнд аймағына бөлінген, 14-битті сөз түрінде көрсетіледі. Бұл командалар жұмыс бағытына қарай төрт түрге бөлінеді, олар: байтпен жұмыс істеу командалары, битпен жұмыс істеу командалары, басқару және константамен жұмыс істеу командалары (call мммен goto командаларынан өзге) call және goto командалары. Микроконтроллер командаларының негізгі пішімдері мен олардың аймақтарының суреттемелері 2.1-суретте келтірілген.

Командалардың барлығы дерлік бір команда циклінде орындалады. Келесі жағдайларда ғана командалардың орындалу ұзақтығы екі команда циклін құрады, олар –  шарттың орындалуына және команда санауышының өзгертілуіне байланысты ауысу.

Байтпен жұмыс істеу командалары

13

 

 

 

 

8

7

6

 

 

 

 

 

0

OpCode

d

f

d = 0 – w;     d = 0 – f;     f – регистр адресі

Битпен жұмыс істеу командалары

13

 

 

10

9

 

7

6

 

 

 

 

 

0

OpCode

b

f

b – бит нөмірі;     f – регистр адресі

Басқару және константамен жұмыс істеу командалары

13

 

 

 

 

8

7

 

 

 

 

 

 

0

OpCode

k

k – константа

call және goto командалары

13

 

11

10

 

 

 

 

 

 

 

 

 

0

OpCode

k

k – константа

2.1 сурет

Команда циклі генератордың төрт периодын алады, мысалы, генератордың жиілігі 4 МГц етіп алынған жағдайда команда циклінің ұзақтығы 1 мкс болады.

PIC16F84A микроконтроллерінің командалар жүйесі мен олардың суреттемесі 2.3-суретте келтірілген.

2.3 к е с т е – PIC16F84A микроконтроллерінің командалар жүйесі

Мнемоника

Команда суреттемесі

Цикл саны

Ахуал биттері

1

2

3

4

addwf f, d

W және f регистрлерін қосу

1

C,DC,Z

andwf f, d

W және f регистрлеріне логикалық ЖӘНЕ

1

Z

clrf f

f регистрін тазарту

1

Z

clrw

W регистрін тазарту

1

Z

comf f, d

f регистрін терістеу

1

Z

decf f, d

f регистрін кеміту (декремент)

1

Z

decfsz f, d

f регистрін кемітіп, 0 болса, команданы аттау

1(2)

 

incf f, d

f регистрін ұлғайту (инкремент)

1

Z

incfsz f, d

f регистрін ұлғайтып, 0 болса, команданы аттау

1(2)

 

iorwf f, d

W және f регистрлеріне логикалық НЕМЕСЕ

1

Z

movf f, d

f регистрін көшіру

1

Z

movwf f

W регистрін f регистріне көшіру

1

 

2.3 кестенің соңы

1

2

3

4

nop

Іссіз команда

1

 

rlf f, d

f регистрін тасымал арқылы солға ығыстыру

1

C

rrf f, d

f регистрін тасымал арқылы оңға ығыстыру

1

C

subwf f, d

W регистрін f регистрінен алу

1

C,DC,Z

swapf f, d

f регистріндегі тетрадалардың орнын ауыстыру

1

 

xorwf f, d

W және f регистрлеріне екілік қосу

1

Z

bcf f, b

f регистріндегі битті тазарту

1

 

bsf f, b

f регистріндегі битті қою

1

 

btfsc f, b

f регистріндегі бит 0 болса, команданы аттау

1(2)

 

btfss f, b

f регистріндегі бит 1 болса, команданы аттау

1(2)

 

ADDLW k

Константа мен W регистрін қосу

1

C,DC,Z

andlw k

Константа мен W регистріне логикалық ЖӘНЕ

1

Z

call k

Қосалқы бағдарламаны шақыру

2

 

clrwdt

Қарауылдық WDT таймерін тазарту

1

/TO, /P

goto k

Адрес бойынша ауысу

2

 

iorlw k

Константа мен W регистріне логикалық НЕМЕСЕ

1

Z

movlw k

Константаны W регистріне енгізу

1

 

retfie

Үзілістен қайту

2

 

retlw k

Константаны W регистріне енгізіп, үзілістен қайту

2

 

return

Қосалқы бағдарламадан қайту

2

 

sleep

Ұйқы режиміне ауысу

1

/TO, /P

sublw k

W регистрін константадан алу

1

C,DC,Z

xorlw k

Константа мен W регистріне екілік қосу

1

Z

2.3            PIC микроконтроллерінің бағдарламалы симуляторы

PIC микроконтроллерлерінің жұмыс бағдарламасын PIC Simulator IDE аталымды бағдарламалы симуляторлық (елестетуші) құрылымда жазып, бұл бағдарламаны оның құрамындағы әртүрлі виртуалды перифериялық құрылғыларды тікелей пайдалану арқылы баптау өте ыңғайлы келеді. Симулятормен жұмыс ұйымдастырылу тәртібін және симулятор құрамындағы әртүрлі перифериялық құрылғыларды пайдалану жолдарын нақтылы бағдарламалармен жұмыс ұйымдастыру кезінде қарастырамыз.

2.3.1     Импульстер тізбесін қалыптастыру.

Компьютерге орналастырылған PIC Simulator IDE бағдарламасының сәйкесті белгілемесі арқылы оны іске қосамыз да, симулятордың ашылған негізгі терезесінде (2.2 суретті қараңыз) Options/Select Microcontroller арқылы микроконтроллер түрін (біздің жағдайда, PIC16F84A) таңдап, Change Clock Frequency арқылы генератордың тактілік жиілігін (мысалы, 4 MHz) қоямыз.

2.2 сурет

Симулятордың негізгі терезесінен Tools/Assembler арқылы Assembler терезесін ашып, онда File/New таңдап, оған жиілігі 5.0 кГц меандр түріндегі импульстер тізбесін қалыптастырушы құрылғының (мультивибратордың) жұмысын іске асырушы келесі бағдарламаны енгіземіз. Бағдарламаны енгізу кезінде белгілер жол басында, ал командалар жол басынан ығыстырым арқылы (мысалы, Tab түймесімен) жазылу керектігін ескеру керек. Бағдарлама енгізіліп болғаннан кейін Multivibrator аталымымен (asm кеңейтпелі файл түрінде) сақтап, сосын Assembler терезесінде Tools/Assemble&Load арқылы бағдарлама жұмысын жүзеге асыратын (hex кеңейтпелі) файл құрамыз.

 

; Multivibrator Meander 5.0 kHz

;========================

; Microcontroller PIC16F84A

; Clock Frequency 4.0 MHz

;========================

Sec             equ             0Ch

;-----------------------------------------

org              0

goto            Start

;-----------------------------------------

Start            bsf              Status,5

movlw         .0

movwf        TrisB

bcf              Status,5

movlw         .32

movwf        Sec

bcf              PortB,0

nop

nop

;-----------------------------------------

Pause_0      decfsz         Sec,F

goto           Pause_0

movlw         .30

movwf        Sec

bsf             PortB,0

nop

nop

;-----------------------------------------

Pause_1      decfsz         Sec,F

goto           Pause_1

goto            Start

;-----------------------------------------

end

Бағдарлама құрамына талдау жүргізіп өтелік. Оның жоғарғы бөлігінде бағдарлама “басы” орналастырылған. Онда жобаның (яғни модельденуші құрылғының) аталымы, қолданылатын микроконтроллер түрі (біздің жағдайда, PIC16F84A) және микроконтроллерге қосылатын тактілік генератордың жиілігі көрсетілген.

Келесі жолда бағдарламада пайдаланылатын жалпы қызмет регистрлерін “іске тіркеу” жүргізіледі, яғни оларға жұмыста байланысуға ыңғайлы (мағынасы жағынан түсінікті) ат қойылады. Қызмет жадысындағы адресі бойынша таңдалған регистрді “іске тіркеу” equ нұсқамасы арқылы жүзеге асырылады. Қарастырылып отырған бағдарламаның жұмысына 0Ch адресі бойынша орналасқан регистр ғана (Sec аталымымен) пайдаланылады. Бұл регистр қалыптастырылушы импульстердің нөлдік және бірлік деңгейлерінің ұзақтығын (біздің жағдайда, 100 мкс) қамтамасыз етуге қажетті кідірісті жүзеге асыруға қатысады.

Одан кейін бағдарламаның бірінші командасының адресін анықтаушы нұсқама (директива) мен бағдарламаның басына бағыттау командасы (әдетте, goto  Start) орналастырылған. Бұл команда бірден org 0 нұсқамасынан кейін орналасқандықтан (goto Start командасы бағдарлама жадысының нөлдік адресі бойынша орналасады), бағдарлама орындалуы осы командадан басталады.

Микроконтроллер түрі, регистрлерге ат қою, бағдарлама басына бағыттау және бағдарламаның соңын белгілеу (бағдарлама әрқашан end нұсқамасымен аяқталу керек) сәйкесті нұсқамалар арқылы енгізіледі (бағдарлама командаларымен шатастырмаңыз).

Күрделірек бағдарламалардың “басы”, әрине, “көлемдірек” болады және ондағы ат қойылған регистрлер мен нұсқамалардың (оның ішінде, өзге түрлі де) саны да көбірек болады.

Қарастырылып отырған бағдарлама мультивибратор қызметін жүзеге асыру керек болатын. Құрылғының сигнал қалыптастыратын шығысы ретінде А немесе В порттарының кез келген шықпасын таңдауға болады, бағдарламада бұл үшін В портының RB0 шықпасы бекітілген. Демек RB0 шықпасын “шығыс” режиміне қою керек.

RB0 шықпасының жұмыс бағытын “шығысқа” немесе “кіріске” қою TRISB регистрімен бекітіледі. Бұл регистр бірінші банкте орналасқандықтан, банктерді ауыстыру керек болады (микроконтроллердің жұмыс басталымында, нөлінші банк қойылады). Бұл үшін Status регистрінің бесінші битін бірге қою керек. Ол bsf Status,5 командасымен жүзеге асырылады. В портының RB1…RB7 шықпаларының жұмыс бағыты бізге бәрібір болғандықтан (олар ешқайда қосылмаған), TrisB регистрінің барлық шықпасын нөлге қоямыз, яғни бұл регистрге 0 жазамыз (В портының барлық шықпасы “шығысқа” жұмыс істейді). Кез келген регистрге константаны тікелей жазуға болмайтындықтан, бұл нөлді TrisB регистріне “жеткізу” аккумулятор (W регистрі) арқылы жүзеге асырылады (бағдарламадағы байттық movlw .0 және movwf  TrisB командалары). Бұны биттік BCF командасымен де жүзеге асыруға болар еді. Бұл жағдайда нөлге в TrisB регистрінің барлық биті емес, тек нөлдік биті ғана қойылады: bcf  TrisB,0 (TrisB регистрінің нөлдік битін тазарту). Порттың бірнеше шықпасының жұмыс бағытын қатар қоюға бірінші вариант ыңғайлырақ келетіндіктен, көбіне осы вариант пайдаланылады.

Сонымен, енді RB0 шықпасы “шығысқа” жұмыс істейді. Бұдан арғы жұмыс нөлінші банкте жүргізілетіндіктен, осы банкке қайтамыз, яғни bcf   Status, 5 командасымен Status регистрінің бесінші битін нөлге қоямыз.

Жоғарыда келтірілген операцияларды дайындық операциялары деп санауға болады. Енді бағдарламаның негізгі жұмысына қарастыралық.

Қалыптастырылатын сигнал түрі “меандр” болғандықтан, импульстердің нөлдік және бірлік деңгейлерінің ұзақтығы бірдей болу керек (біздің жағдайда, 100 мкс). Біздің бағдарламада бұл уақыт 100 мкс етіп алынды.

Бағдарламаның “қарапайым жобасын” құралық. RB0 шықпасын “шығысқа” жұмыс істеуге ауыстырғаннан кейін осы шықпада 100 мкс уақыт ұзақтығында нөлдік деңгей, сосын тап осындай уақытта бірлік деңгей қалыптастырылу керек. Бұдан кейін бағдарлама осындай бағдарламаның жаңа толық цикліне ауысу (goto Start командасымен) жүзеге асырылады да, бұл процесс қайталана береді.

Сонымен, мультивибратордың жұмыс принципіне байланысты әрбір периодта екідеңгейлі сигнал қалыптастыратын толық циклінің ішінде ішкі циклдері болу керек. Бұл ішкі циклдерде бағдарламаның жұмыс нүктесі сәйкесті деңгей ұзақтығы қалыптастырылады, яғни бағдарламаның жұмыс нүктесі осы ұзақтық қалыптастырылғанша сәйкесті қосалқы бағдарламаларында кідіре тұру керек.

Кідіріс қалыптастырушы қосалқы бағдарламасының (бұдан әрі, қысқаша, кідіріс бағдарламасы) алдында жалпы қызмет регистріне (біздің бағдарламада Sec регистріне) кідіріс ұзақтығын анықтаушы нақтылы сан (константа) енгізіледі.

Нөлдік деңгей қалыптастырушы кідіріс бағдарламасында Sec регистріне (жоғарыда суреттелген тәртіппен, яғни аккумулятор арқылы) .32 енгізілген (нүкте – ондық санның белгілемесі). Сосын биттік bcf PortB,0 командасымен RB0 шықпасында нөлдік деңгей қалыптастырылады да, ол бірлік деңгейге ауыстырылғанша өзгермейді.

Бағдарламаның жұмыс нүктесі кідіріс бағдарламасына кіреді де, одан қажетті уақыт ұзақтығы қалыптасқанша сонда қалады (кідіреді). Кідіріс бағдарламасы қарапайым жағдайда decfsz (incfsz) командасынан басталады да, decfsz командасы орындалып, Sec регистріндегі сан нөлге жеткенше бағдарламаның жұмыс нүктесі осы decfsz командасына ауыса береді. Операцияның нөлдік нәтижесінде бағдарламаның жұмыс нүктесі кідіріс бағдарламасынан “бағдарлама одан  әрі орындалады” сценарийі бойынша шығады.

Машина циклінің ұзақтығын ескере отырып, кідіріс уақытын есептеуге болады. Нөлдік деңгей қалыптастыруға арналған константа мәні неге .32 болу керектігін түсіндірелік. Микроконтроллерге қосылған тактілік генератордың жиілігі 4 МГц, демек машина циклінің ұзақтығы – 1мкс. Сонымен, RB0 шықпасында нөлдік деңгей қойылғаннан ол бірлік деңгейге ауыстырылғанша 100 машина циклі (мц) өту керек. Айналымды кідіріс бағдарламасындағы әрбір “айналым” 3 машина циклінде орындалады: decfsz командасы – бір мц, ал goto командасы – екі мц. Сонымен, Sec регистрінің бірге кемуіне 3 мц (3 мкс) кетеді. Sec регистрінің кемітілу нәтижесі  нөлге тең болғанда, goto командасы орындалмайды да, кідіріс бағарламасынан шығу уақыты 2 мц болады. Демек, .32 санына 32х3-1=95 мц (95мкс) сәйкес келеді. Оған екі nop командасының, RB0 шықпасында бірлік деңгей ұзақтығын қамтамасыз етуші константа енгізу командаларының (movlw .30 и movwf Sec) және бірлік деңгей қою командасының (bsf   PortB,0) ұзақтығын (әрбіреуі – 1мц) ескерсек, қажетті 100 мц (100 мкс) шығып тұр.

RB0 шықпасында бірлік деңгей қойылуы (bsf PortB,0), Sec регистріне осы деңгейдің қалыптастырылу ұзақтығын қамтамасыз етуші келесі константа енгізілуі жоғарыдағыдай жүргізіледі. Екінші константа мәнінің (.30) дұрыстығын да алдыңғыдай дәлелдеуге болады.

Бағдарлама әрқашан end нұсқамасымен аяқталады.

Енді енгізілген бағдарламаның симулятор арқылы тексерілу тәртібін қарастыралық. Симулятордың негізгі терезесінен Tools/... арқылы бағдарлама жұмысына қажетті перифериялық құрылғы (біздің жағдайда, Oscilloscope) шығарамыз да, оның бағдарламада бақылауға бекітілген арнасы (мысалы, PortB,0) мен көрсетім аймағын (Settings/Change Display Interval) анықтаймыз (қарастырылып отырылған жағдайға 1000 мкс ыңғайлы болады).

Симулятордың негізгі терезесінен Rate/… арқылы модельдеу жылдамдығын белгілеп (мысалы, Fast), симуляторды іске қосамыз да (Simulation/Start),  бағдарлама жұмысын осциллографта бақылаймыз (2.2 суретті қараңыз).

Қалыптастырылған импульстер тізбесінің уақыттық параметрлерін өлшеу үшін симулятордың негізгі терезесінен тоқтатылым басқарушысын (Tools/Breakpoints Manager) шығарып, онда бағдарламаның тексерім нүктелерін белгілейміз де (2.3 суретті қараңыз), бағдарламаны қайтадан іске қосамыз. Бағдарламаның жұмыс нүктесінің тексерім нүктесіндегі тоқталымы кезінде симулятордың негізгі терезесіндеі секундомерді (Real Time Duration) тазартамыз да, бағдарламаның жұмысын жалғастырамыз (Rate/Fast). Бағдарламаның келесі тексерім нүктесіндегі тоқтатылымында секундомер осы екі аралыққа кеткен уақытты көрсетеді. Осы тәртіппен қалыптасқан импульстер тізбесінің нөлдік және бірлік деңгейлерінің ұзақтығын тексеруге болады.

 

2.3 сурет

2.3.2     Байланыс сигналын қалыптастыру.

Келесі құрылатын байланыс сигналын қалыптастырушы құрылғыға техникалық тапсырма ретінде мынадай талап-тілектер қойылған деп саналық:

1)     Қалыптастырылатын байланыс сигналының жиілігі аса дәл қойылу керек және оның мәні 1450 Гц болу керек.

2)     Байланыс сигналының қалыптастырылуы сәйкесті екі жағдайлы түймемен басқарылу керек.

3)     Сигнал қалыптастырыла бастағаннан кейін, ол ыңғайлы уақыт мөлшерінде жіберілу керек.

4)     Байланыс сигналының жіберілу-жіберілмеуі қолдан басқарылу керек.

Құрылғының алдын-ала қойылған талаптарға сай жұмыс істеу алгоритмін құру жолын ойластыралық. Сигнал жиілігі аса дәл қойылу керек болғандықтан, микроконтроллерге қосылатын тактілік генератор ретінде кварцты генератор аламыз (жиілікке аса дәлдік талабы қойылмаған жағдайда микроконтроллерді RC-генератор қосылған режиміне ауыстыруға болар еді). Сонымен, микроконтроллерге, қалыптастыратын сигнал жиілігі 4 мГц, стандартты (XT аталымды) кварцты генератор қосамыз. Бұл жағдайда, бір машина циклі 1 мкс болады да, алдын-ала жүргізілетін есептеу жұмыстарын жеңілдетеді.

Қалыптастырылатын импульстер тізбесінің толтырылым коэффициентіне (Duty Factor) талап қойылмаған, сондықтан “меандр” түріндегі сигнал қалыптастырылсын деп ұйғарамыз. Сигналдың нөлдік және бірлік деңгейлерінің ұзақтығын бағдарламаның жұмыс нүктесін кідіріс бағдарламасында “айналымға” салу арқылы (Multivibrator бағарламасындағы сияқты) жүзеге асырамыз. 1-тармақтағы талапқа байланысты “бастапқы шамалау” белгіленді деп санауға болады.

2 және 3-тармақ талаптары бір-бірімен ұштасып жатқандықтан, оларды жүзеге асырушы деректерді бірге анықтаған дұрыс. Сигнал жіберу түймесі басылғанда, байланыс сигналының қалыптастырылуы басталып, оның жіберілім уақытын шектеуші механизм іске қосылуының керектігі түсінікті.

Бағдарламаның үздіксіз істеуін қамтамасыз ету керек болғандықтан, құрылғының сигнал жіберіліміне қосылуын күту режимінде бағдарламаның жұмыс нүктесі оның бір бөлігінде “айналымда” (сәйкесті түйме басылғанына дейін) болу керек. Бұндай “айналымдар”, әдетте, бағдарлама басында, тура айтқанда оның Start бөлімінде жүзеге асырылады. Басқару сигналының түсу мезетінде бағдарламаның жұмыс нүктесі “күтіліс айналымынан” “бағдарлама одан  әрі орындалады” сценарийі бойынша шығады.

Одан кейін, әрине, 1450 Гц жиілігіндегі байланыс сигналының бір периодын қалыптастыру басталады. Бұл істің бір периодпен бітпейтіндігінен, яғни оның қайталануының керектігінен, бағдарламаның жұмыс нүктесін тербеліс периодын қалыптастыру “айналымына” түсіру керек. Бағдарламаның жұмыс нүктесінің осы “айналымда” болу уақытын сигнал жіберу түймесінің басылып тұрған уақытына тәуелді ету өндірістік (немесе өзге) себептермен жарамсыз болуы мүмкін. Сондықтан байланыс сигналының жіберілім уақыты нақтылы мөлшерде болғаны дұрыс деп санап, оны 3 сек шамасында болсын деп аламыз. Демек байланыс сигналының қалыптастырылуының 3 сек уақыт мөлшерінде болуын, қалыптасқан импульстер периодын санау арқылы, анықтайтын “есептеуіш” тағайындау керек болады.

Сонымен, бағдарламаның келесі жұмыс тәртібін тағайындауға болады: Күту режимінде (Start бағдарламасында) тұрған құрылғыға жіберу сигналы түскенде, бағдарламаның жұмыс нүктесі “күтіліс айналымынан” шығып, сосын байланыс сигналын “қалыптастыру айналымына” кіру керек. Бұнымен қатар, 3 сек уақыт мөлшерін есептеуші таймер жұмыс істей бастау керек. Оның қалыптастырылған импульстер периодын санау арқылы 3 сек уақыт мөлшерін “есептеген” мезетінде бағдарламаның жұмыс нүктесі “қалыптастыру айналымынан” шығып, одан кейін Start бағдарламасындағы “күтіліс айналымында” басқару сигналының келесі ауытқымасына дейін қалу керек.

4-тармақ талабын жүзеге асыру үшін тағы бір басқару түймесін пайдаланамыз.

Енді микроконтроллер порттарының шықпалары туралы “шешім” қабылдалық:

-       В портының RB0 шықпасын құрылғының жұмыс режимін (күту/жіберу) қою кірісі ретінде пайдаланамыз. Күту режиміне оның бірлік жағдайы, ал жіберу режиміне нөлдік жағдайы сәйкес келсін деп аламыз;

-       RB6 шықпасын байланыс сигналының қалыптастырылуын (және таратылуын) басқару кірісі ретінде тағайындаймыз. Байланыс сигналының қалыптастырылуы осы сигналдың бірлік жағдайында жүзеге асырылатын болсын деп шешеміз;

-       RB2 шықпасын құрылғының байланыс сигналын қалыптастыратын шығысы ретінде тағайындаймыз.

Зерттелуші құрылғының жұмыс бағдарламасы төменде келтірілген:

 

; Dial Tone 1.45 KHz

;========================

; Microcontroller PIC16F84A

; Clock Frequency 4.0 MHz

;========================

Sec             equ             0Ch

SecH           equ             0Dh

SecL           equ             0Eh

;----------------------------------------

                  org              0

                   goto            Start

;========================

Start           clrf              IntCon

                   clrwdt

                   bsf              Status,RP0

                   movlw         .65

                   movwf        TrisB

                   movlw         .143

                   movwf        Option_Reg

                   bcf             Status,RP0

;----------------------------------------

                  movlw         .17

                  movwf        SecH

                  movlw         .255

                  movwf        SecL

;----------------------------------------

Cycle          btfsc           PortB,0

                  goto            Start

;----------------------------------------

                  btfss           PortB,6

                  goto            PRD

;----------------------------------------

                  bcf             PortB,2

                  nop

                  nop

                  movlw         .85

                  movwf        Sec

Pause_1      clrwdt

                  decfsz         Sec,F

                  goto            Pause_1

;----------------------------------------

                  bsf              PortB,2

                  nop

                  nop

                  movlw         .83

                  movwf        Sec

Pause_2      clrwdt

                  decfsz         Sec,F

                  goto            Pause_2

;----------------------------------------

                  decfsz         SecL,F

                  goto            Cycle

                  decfsz         SecH,F

                  goto            Cycle

                  bcf             PortB,2

;----------------------------------------

PRD           clrwdt

                  btfss           PortB,0

                   goto            PRD

                   btfss           PortB,0

                   goto            PRD

                   goto            Start

;========================

                   end

Бағдарламаны Dial Tone аталымымен сақтап, сосын оның дұрыстығын (орфография жағынан ғана) симулятор арқылы тексеруге болады.

Бағдарлама жұмысына пайдаланылатын қызмет регистрлерін анықталық, яғни оларды “іске тіркелік”. Қарастырылып отырған бағдарламада олар Sec, SecH және SecL аталымдарымен “тіркелген”. Олардың бағдарламада қандай қызмет атқаратынын бағдарламаны талқылау барысында түсінеміз.

Бағдарламаның жұмыс бөлігі (Start) дайындық операцияларынан басталады да, жалпы қызмет регистрлеріне таймердің жұмыс уақытын анықтаушы константалар жазумен аяқталады.

Бағдарламаның Start бөлігінің басындағы clrf IntCon командасының мағынасын былай түсіну керек: В портының RB0 шықпасы бағдарламада кіріс ретінде пайдаланылады. Сонымен қатар, RB0 шықпасы сыртқы үзіліс сұранысының (INT) кірісі ретінде де пайдаланылады. Оған қоса, бағдарламада кіріс ретінде пайдаланылатын RB6 шықпасы арқылы RB4...RB7 шықпаларындағы сигнал деңгейінің өзгерісіне байланысты үзіліс ұйымдастырылуы мүмкін. Бағдарламада микроконтроллердің үзіліс ұйымдастырылуына қатысы бар шықпаларының біреуі болса да өзге сигналдардың кірісі ретінде пайдаланылатын болса, онда үзілістерге жалпы тыйым салыну керек. Ол үшін IntCon регистрінің жетінші битін нөлге қою (глобальный запрет прерываний) жеткілікті, бірақ көбіне IntCon регистрі түгелдей тазарта салынады. Қарастырылып отырған бағдарламада үзілістерге байланысты жұмыс пайдаланылмайды, бірақ оларға тыйым салынғаны артық болмайды.

Келесі clrwdt командасы – қарауылдық WDT таймерін (Watchdog Timer) тазарту. Бұл команданың неге қажеттігіне бастапқы түсініктеме берелік (толығырақ кейін қарастырамыз). Дербес RC-генераторынан жұмыс істеуші WDT таймері нақтылы уақыт мөлшеріндегі импульс қалыптастырып, одан кейін тазарту сигналын тудырады да, ол арқылы бағдарлама жұмысын қайта бастайды, яғни оның жұмыс нүктесін Start бөлігінің басына ауыстырады. Микроконтроллерге сыртқы немесе ішкі ақаулардың әрекетінен бағдарламаның жұмыс нүктесі қажетсіз “айналымға” түсіп, бағдарлама жұмысы тоқтап қалуы мүмкін (glitch, глюк). Бұндай жағдайда WDT таймерінің толып кетпеуі үшін оны периодты түрде тазартып отыру керек болады. Сlrwdt командасы тап осы жұмысты атқару үшін қойылған.

Бағдарламаның Start бөлігінде келесі орналастырылған алты командадан тұратын топ дайындық операцияларын орындайды. Бұл операцияларда:

1) TrisB регистрі арқылы RB0 және RB6 шықпалары кіріс ретінде, ал RB2 шықпасы шығыс ретінде жұмыс атқаруы қойылады.

2) Option_Reg регистрі арқылы B портының шықпаларына жүктеме резисторларының (pull-up resistors) қосылу/қосылмауы, алғы бөлгіштің мәнінің қайда қосылатындығы мен оның коэффициенті мәнінің анықталуы, тактілік сигналдарының жандандырушы ауытқымасының біреуінің белгіленуі шешіледі.

 Бұл жұмыстарға қатысты екі регистр де (TrisB және Option_Reg) 1-банкте орналасқан (2.1 кестені қараңыз). Бағдарлама жұмысын 0-банкте бастайды, демек TrisB және Option_Reg регистрлерімен жұмыс істеу үшін bsf Status, RP0 командасы арқылы 1-банкке ауысу керек. Одан кейін, бұл TrisB регистрінің 0 және 6-биттерін бірге (“кіріс” жұмысына), ал қалғанын нөлге (“шығыс” жұмысына) қоямыз. Шындығында 2-бит қана нөлге қойылу керек еді, бірақ RB1,3,4,5,7 шықпалары жұмысқа пайдаланылмайтындықтан (яғни олардың жұмыс бағытының ештеңеге әсер етпейтіндігінен), бәрі бірдей нөлге қойылды. Бұл қойылымға сәйкесті сөзді (0100 0001) енгізуге ыңғайлы ондық санға (.65) айналдырып, оны TrisB регистріне аккумулятор арқылы енгіземіз.

Option_Reg регистріне (2.4 кестесін қараңыз) байланысты жұмысқа ауысалық. Біздің бағдарламаның жұмысына “қажеті жоқ” биттерді қарастырмай-ақ қоямыз. Біздің құрылғының жұмысында сыртқы тактілік сигналдар пайдаланылмайды (сыртқы басқару сигналдары тактілік сигналдарға жатпайды) және үзіліс жұмысы да атқарылмайды, демек OptionR регистінің 4, 5 және 6-биттері кез келген мәнде бола алады, яғни олар құрылғы жұмысына әсер етпейді, сондықтан оларды 0 мәніне қоя саламыз.

2.4 к е с т е – Option_Reg регистрі

Бит

Аталымы

Түсініктеме

7

RBPU’

Жүктеме резисторлары:

1 – ажыратылған

0 – қосылған

6

INTEDG

INT кірісіндегі сигналдың жандандырушы ауытқымасы:

1 – тура ауытқымасы (0/1)

0 – артқы ауытқымасы (1/0)

5

T0CS

TMR0 таймеріне берілетін тактілік сигнал:

1 – RA4/T0CKI шықпасындағы сыртқы сигнал

0 – ішкі CLKOUT сигналы

4

T0SE

TMR0 таймеріндегі сыртқы сигналдың ауытқымасы:

1 – артқы ауытқымасы (1/0)

0 – тура ауытқымасы (0/1)

3

PSA

Бөлгіш:

1 – WDT таймерінің артына қосылған

0 – TMR0 таймерінің алдына қосылған

2-0

PS2

PS1

PS0

Бөлгіштің бөлу коэффициенті:

Мәні

TMR0

WDT

000

1:2

1:1

001

1:4

1:2

010

1:8

1:4

011

1:16

1:8

100

1:32

1:16

101

1:64

1:32

110

1:128

1:64

111

1:256

1:128

Енді құрылғы жұмысына әсері биттерді қарастыралық. Алдымен алғы бөлгішке байланысты мәселені шешелік. Алғы бөлгішті TMR0 таймерінің алдына немесе WDT таймерінің артына қосуға болады. Біздің құрылғыда сыртқы тактілік сигналдар жоқ, демек алғы бөлгішті TMR0 таймерінің алдына қосудың қажеті жоқ, онда оны WDT таймерінің артына қосу/қоспау мәселесін шешу ғана қалды.

Микроконтроллер іске қосылысымен WDT импульсінің аппаратты қалыптасуы басталады, одан әрі WDT таймерін бағдарламалы жолмен қайта-қайта тазалап (қайта қосып) отыру керек болады. Егер WDT таймері бөлгішсіз істейтін болса, онда оны 18 мс аралығынан кем уақытта (яғни өте жиі) тазартып отыруға, демек clrwdt командасын бағдарламада көбірек пайдалануға тура келеді. Ал егер WDT таймерінің артына бөлгіш қосылса, онда қайта қосу интервалы ұзартылады. Ол бөлгіштің бөлу коэффициентіне байланысты еселенеді. Мысалы, WDT таймеріне бөлу коэффициенті максималды мәндегі (128) бөлгіш қосылған болса, онда clrwdt командасын бағдарламада 18х128=2304 мс (2,3 сек) аралығынан артық емес уақытқа есептеп, орналастыруға болады, демек бағдарламадағы clrwdt командасының саны азаяды. “Көп ойланбастан”, бөлу коэффициентін осы мәнге (одан кемірек қоюға болса да) қоя саламыз. Сонымен, WDT таймеріне, бөлу коэффициенті 128 мәніндегі бөлгіш қосамыз: ол үшін Option_Reg регистрінің  4 кіші битін 1 мәніне қоямыз.

Жүктеме резисторларының қосылу/қосылмауын анықтаушы 7-бит туралы мәселені қарастыралық. Егер В портының жүктеме резисторлары бағдарламалы тәсілмен қосылған болса, онда олар В портының “кіріске” жұмыс істеуші шықпаларына ғана қосылады да, “шығысқа” жұмыс істеуші шықпаларынан (аппаратты тәсілмен) ажыратылады, яғни олар соңғы шықпаларға қосылған сыртқы құрылғыларға әсерін ескермей-ақ қоюға болады. Ал олардың В портының “кіріске” жұмыс істеуші шықпаларына қосылуына аса көңіл бөлу керек болады. Егер сыртқы құрылғылардың ақырғы буындарының “өздік” жүктемесі болса (мысалы, коллектор немесе құйыс тізбегінде), онда қосымша жүктемелердің қосылуы олардың тұрақты токтық жұмыс режимін өзгертуі мүмкін. Көптеген жағдайда мәнді өзгеріс бола қоймайды (ішкі жүктеме резисторының номиналы – бірнеше кОм), бірақ кейбір жағдайда “қиындық мәселе” тууы мүмкін. Бұндай “мәселенің” туу мүмкіндігі бар жағдайда, әрине, В портының жүктеме резисторларын қосу керек емес. Ал егер В портының “кіріске” жұмыс істеуші шықпаларына қосылған сыртқы құрылғылардың ақырғы буындары ашық шығысты (ашық коллекторлы немесе ашық құйысты) болса, онда олар сыртқы құрылғылардың ақырғы буындарының жүктемелері ретінде қосылу керек. Айтылған мәселе түйме/ауыстырғыш сияқты сыртқы коммутациялық құрылғыларға да қатысты.

Біздің жағдайда RB0 және RB6 шықпаларына қосылған сыртқы құрылғылардың “өздік” жүктемесі бар деп санап, жүктеме резисторларын қоспай-ақ қоямыз, яғни Option_Reg регистрінің 7-битін 1 мәніне қоямыз. Сонымен, Option_REG регистріне аккумулятор (W) арқылы .143 (1000 1111) константасын енгіземіз (8Fh санын да пайдалануға болады). Енгізілетін сан аккумулятор арқылы енгізіледі. Сонымен В портының жүктеме резисторлары қосылмайтын болғандықтан, бөлу коэффициенті 128 болатын алғы бөлгіш WDT таймеріне қосылған. 1-банктегі жұмыс біткендіктен, bcf Status, RP0 командасы арқылы негізгі (нөлінші) банкке ауысамыз.

Бағдарламаның Start бөлігінің соңында орналастырылған төрт командадан тұратын топ байланыс сигналының жіберілетін уақыт аралығын анықтаушы константалардың сандық мәндерін таймер қызметін атқарушы SecH және SecL регистрлеріне енгізу жұмысын жүзеге асырады. Оларға енгізілетін константалардың сандық мәндері жөніндегі әңгімені кейінге қалдырамыз.

Бағдарламаның негізгі бөлігін (Cycle) талқылауға кіріселік. Бағдарлама алгоритміне байланысты, алдымен, құрылғының сигнал жіберуге қосылған/қосылмағанын, яғни құрылғының жұмыс режимін анықтаушы сигналдың бар/жоқтығы тексерілу керек. Құрылғының бастапқы тиянақтамасында оның сигнал жіберу режиміне RB0 шықпасындағы сигналдың 0 деңгейі, ал күту режиміне 1 деңгейі сәйкестелсін деп шешім қабылдағанбыз. Демек осы шықпаның жағдайын тексеріп, тексерім нәтижесіне байланысты бағдарламаның жұмыс нүктесі оның одан арғы орындалуының екі сценарийінің біреуіне “кету” керек. Режим сигналының жағдайы бағдарламада btfsc PortB,0 командасымен тексеріледі де, оның 0 жағдайында (жіберімге қосылған) бағдарлама жұмысын “одан  әрі орындалады” сценарийі бойынша жалғастырады да, сигналдың 1 жағдайында бағдарламаның жұмыс нүктесі бағдарлама басына ауыстырылады (goto Start).

Келесі операция – байланыс сигналының қалыптастырылуын басқару сигналының бар/жоқтығы, яғни RB6 шықпасындағы басқару сигналының жағдайын тексеру. Түсініктеме тәртібі алдыңғыдай, тек бұл жерде тексерім btfss командасымен жүзеге асырылады. Бағдарламаның жұмыс нүктесінің “айналым” ауыстырылымы – қосалқы PRD бағдарламысына жіберіледі.

Қосалқы PRD бағдарламысына көңіл бөлелік. PRD бағдарламасы байланыс сигналының 3 секундтық жіберілімінен кейін, режим сигналының алып тасталмаған кезінде (RB0 – 0) бағдарламаның жұмыс нүктесі осы қосалқы бағдарлама “айналымында” бола тұрады да, оның алып тасталғанында (RB0 – 1) бағдарламаның жұмыс нүктесі оның жаңа цикліне ауысып (goto Start), қайтадан құрылғының жіберім режиміне ауыстырылуын күтеді.

Байланыс сигналының қалыптастырылуын басқару сигналының бар/жоқтығын тексеру нәтижесінде оның құрылғыға түскендігі, яғни RB6 шықпасындағы сигнал деңгейі 1 болғанда, бағдарламаның келесі бөлігінде, жиілігі 1450 Гц байланыс сигналын қалыптастыру жұмысы жүзеге асырыла бастайды. Алдымен, сигнал периодының нөлдік деңгейдегі бірінші жартысы, сосын бірлік деңгейдегі екінші жартысы (сигнал түрі – “меандр”) қалыптастырылады. Бұл жұмыс RB2 шықпасындағы сигнал деңгейін сәйкесті мәнге өзгертіп, осы деңгейді қажетті уақыт мерзіміне дейін ұстап тұру (кідіріс) арқылы жүзеге асырылады (алдыңғы бағдарламадағыдай).

Қалыптастырылатын байланыс сигналының жарты периодына сәйкесті кідіріс константасының мәнін анықталық. Жиілігі 1450 Гц сигналдың периоды –  1/1450 = 689,6 мкс, ал жарты периоды – 344,8 мкс. Біздің жағдайда (микроконтроллерге қосылған тактілік генератордың жиілігі – 4 МГц) бір машина циклінің ұзақтығы 1 мкс болғандықтан, жарты периодқа сәйкесті уақыт аралығын 345 мкс деп аламыз.

Қарастырылып отырған кідіріс бағдарламасының толық циклі 3 мц (3 мкс), ал соңғы “айналымы” 2 мц (2 мкс). Алдыңғы қарастырылған бағдарламаның сәйкесті құрылымын қолдансақ, онда бір регистр арқылы 256х3-1=767 мкс уақыты аралығындағы кідірісті қамтамасыз етуге болады. Ал біздің жағдайымыздағы жарты период ұзақтығы – 345 мкс, демек бізге бір регистр жеткілікті болады, ол үшін бағдарламада Sec аталымды жалпы қызмет регистрі пайдаланылған.

Әңгіме кідіріс туралы болғандықтан, бұл бағдарламаға clrwdt орналастырыуының қажеттігін ескерсек, онда кідіріс бағдарламасының толық циклі 4 мц (4 мкс) болады да, кідіріске қажетті уақыт мөлшерінің алдыңғы есептелген мәнінен кемірек болатындығы түсінікті. Бұл жағдайда 345 мкс мөлшеріндегі уақыт кідірісін қамтамасыз ету үшін қажетті константа мәні 86 шамасында болатындығын есептеу қиын емес.

Бағдарламада пайдаланылған константаның 85 мәні мен онда үш nop командасының қойылуы (сол сияқты периодтың екінші жартысын анықтаушы бөлігіндегі 83 мәні мен екі nop) бағдарламаның бапталуы кезінде анықталған.

Енді сигнал жіберілімінің 3 секундты интервалын қалыптастыру мәселесіне кіріселік. Оны байланыс сигналының қалыптасқан периодтарын санау арқылы жүзеге асыруға болады.

Байланыс сигналының периоды – 690 мкс. Демек санауыштың санау шегі 3000000:690 = 4347,826 ≈ 4348 санынан кем болмау керек. Стандартты кідіріс бағдарламасын қолдану кезінде (бағдарлама айналымының толық циклі – 3 мц) санауыш ретінде алынған регистрге 4348:3 ≈ 1450 саны жазылу керек. Бір регистрге жазылатын санның максималды мәні – .255, демек екібайтты санауыш қолдану керек болады. Бұндай санауыштың санау шегі –  256х256=65536, демек бұндай санауыш арқылы 3 секундты интервалдан артығырақ та уақыт мерзімін қалыптастыруға болады. Бағдарламада осындай екібайтты санауыш SecH және SecL регистрлерінің негізінде құрылған. Бұл регистрлерге бағдарламада енгізілетін константалардың мәндері (.17 және .255) қажетті 3 секунд шамасындағы уақыт интервалын қалыптастыратын-дығына көз жеткізу (есептеу немесе өлшеу арқылы) қиын емес.

Бұл регистрлермен жұмыс кезіндегі “айналымның” Cycle бағдарламасы арқылы ұйымдастырылуы ыңғайлылық тудырады: құрылғы жіберім режимінен байланыс сигналының қалыптастырылуы кезінде (3 секундтық уақыт интервалының ішінде) шығарылған болса, онда байланыс сигналының қалыптастырылуы осы ауыстырылу мезетінде бірден тоқтатылады.

2.3.3     Үзіліс арқылы жұмыс ұйымдастырылуы.

Келесі құрылатын құрылғы екі арнаны кезектеп (нақтылы уақыт аралығында) тексере отырып, қай арнаның тексерілуі кезінде сыртқы басқару сигналы түскен болса, сол арнаны сигнал жіберіміне қосып, сәйкесті жиілікті сигнал қалыптастыру керек. Бұл құрылғының үзіліс арқылы жүзеге асырылуын қарастырамыз.

Құрылғының жұмыс бағдарламасы атқаратын қызметі ерекше екі бөліктен тұрады. Бағдарламаның әрбір арнаға нақтылы уақыт аралығында үзіліс сигналының түскен/түспегені тексерілетін бөлігін (Start) оның “негізгі” бөлігі және ондағы командалар тобын “тексеріс” бағдарламасы деп, ал оның үзіліске “кеткенінен” кейін орындалатын бөлігін (Int) үзіліс бағдарламасы деп атаймыз. Сонымен, бағдарлама жұмысының басында оның жұмыс нүктесі “тексеріс айналымында” болады да, үзіліс сигналы түскен кезде ол үзіліс бағдарламасына “кетеді” де, одан үзіліс сигналы алынған кезде шығады, яғни “тексеріс” бағдарламасына қайтады.

Үзіліс сигналын жіберетін құрылғының шығыс буыны ашық коллекторлы (немесе ашық құйысты) деп санаймыз. PIC16F84A микроконтроллерінде сыртқы үзіліс сигналын қабылдауға оның RB0/INT шықпасы пайдаланылады. Қарастырылушы микроконтроллерде одан да басқа үзіліс көздері бар (2.5 кестесін қараңыз).

Бағдарламада үзіліске рұқсат берілген “аймақ” болу керек. Идеалды жағдайда бұндай “аймақтың” бағдарламаның бүкіл негізгі бөлігін қамтығаны дұрыс болар еді, бірақ құрастырылып отырған құрылғының жұмыс ерекшелігін ескеру керек болады, мысалы, тексерілуші арналардың ауыстырылуы кезінде (ол іс жүзінде белгілі уақыт интервалында орындалады) үзіліске “қате кету” жағдайына мүмкіндік болдырмау керек. Сондықтан Start бағдарламасы үзілістерге тыйым салушы clrf IntCon командасымен басталып, үзіліске кету кейінге қалдырылады. Бағдарламаның үзіліске рұқсат берілген аймағында бағдарлама үзіліс сигналының түсуін күту режимінде жұмыс істейді. Бұл аймақтың артында, яғни бағдарламаның жұмыс нүктесінің оның негізгі бөлігіне ауыстырылар алдында, үзіліске тыйым салынады.

Егер RB0/INT шықпасындағы сыртқы басқару сигналының жандандырушы ауытқымасы үзіліске рұқсат берілген “аймағында” қалыптасса, онда бағдарламаның жұмыс нүктесі үзіліс бағдарламасының басына “секіреді де”, одан кейін осы бағдарлама орындалады. Үзіліс бағдарламасына ауысу стек арқылы жүргізіледі, яғни стекке келесі команданың адресі жазылады. Үзіліс бағдарламасының жұмысы біткеннен кейін, яғни оның ақырғы командасы retfie орындалғанда, бағдарламаның жұмыс нүктесі осы командаға қайтарылады.

 

2.5 к е с т е – IntCon регистрі

Бит

Аталымы

Түсініктеме

7

GIE

Үзілістерге жалпы рұқсат:

1 – барлық жасырылмаған үзілістерге рұқсат берілген

0 – барлық үзілістерге тыйым салынған

6

EEIE

EEPROM-ға жазылудың бітуіне байланысты үзіліс:

1 – үзіліске рұқсат берілген

0 – үзіліске тыйым салынған

5

T0IE

TMR0 таймерінің асып түсуіне байланысты үзіліс:

1 – үзіліске рұқсат берілген

0 – үзіліске тыйым салынған

4

INTE

RB0/INT кірісі бойынша үзіліс:

1 – үзіліске рұқсат берілген

0 – үзіліске тыйым салынған

3

RBIE

RB4…RB7 шықпаларындағы сигнал деңгейінің өзгерісіне байланысты үзіліс:

1 – үзіліске рұқсат берілген

0 – үзіліске тыйым салынған

2

T0IF

TMR0 таймерінің асып түсуіне байланысты үзіліс туы:

1 – TMR0 таймері асып түскен

0 – TMR0 таймері асқан жоқ

1

INTF

RB0/INT кірісі бойынша үзіліс туы:

1 – RB0/INT кірісі бойынша үзіліс туған

0 – RB0/INT кірісі бойынша үзіліс туған жоқ

0

RBIF

RB4…RB7 шықпаларындағы сигнал деңгейінің өзгерісіне байланысты үзіліс туы:

1 – RB4…RB7 шықпаларындағы сигнал деңгейі өзгерген

0 – RB4…RB7 шықпаларындағы сигнал деңгейі өзгермеген

Тағы бір айта кетілетін мәселе:  үзіліс бағдарламасының құрамында, міндетті түрде, әрекет қылған үзіліс көзінің туын (бұндай үзіліс көздерінің бірнеше болған жағдайда, олардың барлығының да туларын) тазарту командасы болу керек. Біздің бағдарламада RB0/INT кірісі бойынша үзіліс пайдаланылады, сондықтан ту тазарту командасы bcf  IntCon,1 болады. Көптеген жағдайда үзіліс туын (туларын) тазарту командасы (командалары) тікелей retfie командасының алдына орналастырылады. Үзіліс туын тазарту командасының болмаған жағдайында бағдарламаның жұмыс нүктесі негізгі бағдарламаға қайтып келген кезде бұрынғы үзіліс туы үзіліске жаңа сұраныс ретінде түсініледі де, үзіліс бағдарламасының орындалуы қайталана береді (“глюк”).

Status және W регистрлерінің құрамы үзіліс бағдарламасының орындалу кезінде өзгеріп кетуі мүмкін, сондықтан бағдарламаның жұмыс нүктесі негізгі бағдарламаға қайтқан кезде, оның жұмысының үзіліске кетпестен бұрынғы бағытымен жалғастырылуын қамтамасыз ету үшін, үзіліс бағдарламасының басында олардың құрамын осы үшін арнайы құрылған жалпы қызмет регистрлерінде (Stat_Temp және W_Temp) сақтап, үзіліс бағдарламасының соңында Status және W регистрлерін бұрынғы қалпына қайтару керек. Біздің бағдарламада Status және W регистрлерінің құрамын сақтаудың қажеті жоқ, бірақ қалыптасқан тәртіпті бұзбағанымыз дұрыс болады (әдетке айнала берсін).

Сонымен, RB0/INT кірісі бойынша үзіліске байланысты жұмыс былай ұйымдастырылу керек:

-       бағдарлама “басында” үзіліс векторы тағайындалады;

-       үзіліс көзі тағайындалады (IntCon);

-       үзілістің жандандырылу ауытқымасы анықталады (Option_Reg);

-       үзіліске рұқсат беру “аймағы” құрылады;

-       үзіліс бағдарламасының басында Status және W регистрлерінің құрамы сақталады да, оның орындалу соңында олар қалпына келтіріледі;

-       үзіліс бағдарламасынан қайтар алдында оған қатысты үзіліс туы тазартылады;

-       үзіліс бағдарламасының ең соңында retfie командасы орындалады.

Бағдарламаның жұмыс нүктесі үзіліс бағдарламасында басқару сигналының бар кезінде болу керек, сондықтан оның бар/жоқтығын (сәйкесті түйменің немесе ауыстырғыштың жағдайын) тексеріп отыру керек болады. Ол алып тасталғанында бағдарламаның жұмыс нүктесі үзіліс бағдарламасынан бағдарламаның негізгі бөлігіне қайтарылады.

Бағдарламаның негізгі бөлігі, алдыңғы бағдарламалар сияқты, дайындық операцияларынан басталады. Тексерім арналарын ауыстырып отыру үшін “триггер” тәрізді екі жағдайлы құрылым құрып, оның жағдайын анықтау арқылы, сәйкесті арнада үзіліс сұранысының түскен/түспегені тексеріледі. Бұл “триггердің” жағдайы дайындық операцияларынан кейін орналастырылған, Trigger бағдарламасында анықталады да, оның жағдайының ауыстырылуы бағдарлама соңында жүзеге асырылады. Триггер жағдайының тексерілімі мен ауыстырылымының арасын түгелдей үзіліске рұқсат берілу аймағы ретінде қоя салуға болар еді, бірақ “триггер” сияқты іс жүзіндегі құрылғының инерциалды болуын және оның ауыстырылу барысында оған байланысты техникалық ақаулардың түсуін ескеріп, триггер жағдайы тексерілгеннен кейін осы ауыстырым ақаулары жойылғанша күте тұрып, үзіліске рұқсат берілу аймағын одан кейін қалыптастыру керек болады. Ол белгілі уақыт мөлшеріндегі кідіріс тудыру, яғни сәйкесті қорғаныс интервалын құру арқылы жүзеге асырылады.

Басқару сигналының ұсталымының жарамды инерциялығын қамтамасыз ету  үшін үзіліске рұқсат беру “аймағына да” белгілі мөлшердегі уақыт аралығы берілу керек. Демек бұл “аймақта да” белгілі уақыт аралығын қамтамасыз етуші кідіріс бағдарламасы орналастырылады.

Бағдарлама жұмысына пайдаланылатын В портының кірістерін анықталық. Сыртқы үзіліс кірісі ретінде (INT) RB0/INT шықпасы пайдалынылады, демек оны жұмыс бағытын “кіріс” ретінде тиянақтау керек. Микроконтроллер порттарының ешқандай өзге шықпасын сыртқы үзіліс кірісі ретінде (INT) тағайындауға болмайтындығын айта керу керек.

Басқару сигналының RB0/INT шықпасына ашық коллекторлы буын шығысынан түсетіндігінен, В портының жүктеме резисторларын қосу керек. Ашық коллекторлы буынның транзисторы сигналдың берілмеген кезінде жабық болады да, оның шығысында – бірлік деңгей, ал сигналдың берілген кезінде транзистор ашылып, оның шығысында нөлдік деңгей қалыптасады.

Арна ауыстырғышының жағдайын көрсетуге бағдарламада RB2 шықпасы пайдаланылады, сондықтан оны “шығыс” ретінде тиянақтау керек.

Бүл құрылғының жұмыс бағдарламасы төменде келтірілген:

 

; Interruption

;=========================

; Microcontroller PIC16F84A

; Clock Frequency 4.0 MHz

;=========================

Trigg           equ             0Ch

W_Temp    equ             0Dh

Stat_Temp  equ             0Eh

SecH           equ             1Ch

SecL           equ             1Dh

IntH            equ             1Eh

IntL             equ             1Fh

;=========================

                   org             0

                   goto            Start

;=========================

                   org    4

;*****************************

INT             movwf        W_Temp

                   movf           Status,W

                   movwf        Stat_Temp

;------------------------------------------

Cycle          btfsc           PortB,0

                   goto            EndInt

;------------------------------------------

                   btfsc           Trigg,0

                   goto            Int_1

;=========================

Int_0           clrwdt

                   movlw         .238

                   movwf        IntL

                   movlw         .65

                   movwf        IntH

                   bcf             PortB,3

Pause_0      decfsz         IntL,F

                   goto            Pause_0

                   decfsz         IntH,F

                   goto            Pause_0

;------------------------------------------

                   movlw         .235

                   movwf        IntL

                   movlw         .65

                   movwf        IntH

                   bsf              PortB,3

                   nop

                   nop

Pause_1      decfsz         IntL,F

                   goto            Pause_1

                   decfsz         IntH,F

                   goto            Pause_1

                   goto            Cycle

;=========================

Int_1           clrwdt

                   movlw         .118

                   movwf        IntL

                   movlw         .33

                   movwf        IntH

                   bcf             PortB,3

Pause_2      decfsz         IntL,F

                   goto            Pause_2

                   decfsz         IntH,F

                   goto            Pause_2

;------------------------------------------

                   movlw         .115

                   movwf        IntL

                   movlw         .33

                   movwf        IntH

                   bsf              PortB,3

                   nop

Pause_3      decfsz         IntL,F

                   goto            Pause_3

                   decfsz         IntH,F

                   goto            Pause_3

                   goto            Cycle

;=========================

EndInt         bcf             IntCon,1

                   movf           Stat_Temp,W

                   movwf        Status

                   swapf          W_Temp,F

                   swapf          W_Temp,W

                   retfie

;*****************************

Start           clrf             IntCon

                   clrwdt

                   bsf              Status,RP0

                   movlw         .1

                   movwf        TrisB

                   movlw         .0

                   movwf        Option_Reg

                   bcf             Status,RP0

;------------------------------------------

Trigger        btfsc           Trigg,0

                   goto            Mark_1

                   movlw         .253

                   movwf        PortB

                   goto            Mark_0

Mark_1       movlw         .255

                   movwf        PortB

;------------------------------------------

Mark_0       movlw         .197

                   movwf        SecH

                   movlw         .121

                   movwf        SecL

Pause_D     clrwdt

                   decfsz         SecL,F

                   goto            Pause_D

                   incfsz          SecH,F

                   goto            Pause_D

;=========================

                   movlw         .245

                   movwf        SecH

                   movlw         .255

                   movwf        SecL

;------------------------------------------

                   movlw         .144

                   movwf        IntCon

;------------------------------------------

                   bcf             PortB,4

Pause          clrwdt

                   decfsz         SecL,F

                   goto            Pause

                   incfsz          SecH,F

                   goto            Pause

;------------------------------------------

                   bsf              PortB,4

                   clrf              IntCon

                   incf             Trigg,F

                   goto            Start

;=========================

                   end

Үзіліс векторы (org 4) бағдарлама “басында”, бірден goto Start командасынан кейін орналастырылады да, үзіліс жағдайы туысымен, бағдарламаның жұмыс нүктесі 04h адресіндегі командаға “кетеді”. Бұл адрес бойынша үзіліс бағдарламасының бірінші командасы (біздің бағдарламадағыдай) немесе басқа жерде орналастырылған үзіліс бағдарламасына ауыстыру командасы қойылады.

Қарастырылушы бағдарламаға қатысты көптеген мәселе алдыңғы бағдарламаларда түсіндірілгендіктен, біз бағдарламамызды талқылау кезінде ондай мәселелерге тоқтамай-ақ, оның ерекшеліктеріне ғана көңіл бөлеміз.

Бағдарламаның негізгі бөлігіндегі дайындық бағдарламасы үзілістерге тыйым салудан басталады да (clrf IntCon), сосын WDT таймерін тазарту командасы орналастырылған. Одан кейін, алдыңғы бағдарламалардағы сияқты В портының шықпаларының жұмыс бағыты қойылған: RB0/INT – “кіріске”, қалғаны (оның ішінде бізге қажетті RB2 және RB3 шықпалары) –  “шығысқа” (00000001).

В портының жүктеме резисторлары қосылған. Ақиқатын айтқанда, оны RB0/INT шықпасына ғана қосу керек еді, бірақ олардың қосылу/қосылмауы бәріне бірден жүргізілетіндіктен, олардың бәрін де қоса саламыз, яғни Option_Reg регистрінің 7-битіне 0 қоямыз (2.4 кестені қараңыз).

Осы Option_Reg регистрінің 6-битіне 0 мәнін қою арқылы үзіліс сәйкесті сигналдың теріс ауытқымасы арқылы жүзеге асырылатындығын тиянақтаймыз. Option_Reg регистрінің қалған биттерінің бізге қажеті жоқ, сондықтан оларды кез келген мәнге (оның ішінде – 0 мәніне де) қоюға болады, сонымен, ыңғайлылық үшін, Option_Reg регистрін 0 жазу арқылы оның барлық битін 0 мәніне қоямыз.

Бағдарламаның бастапқы түсініктемесіне байланысты тексерілетін арналарды ауыстырып отыруға “триггер” қоюымыз керек. Бұндай екі жағдайлы “триггер” ретінде жалпы қызмет регистрлерінің біреуін тағайындаймыз (Trigg аталымымен). Бұл регистрдің құрамы әр тексерім циклінің басында (немесе соңында) incf       Trigg,F (немесе decf Trigg,F) командасы арқылы бірге өзгертіп отырылса, онда оның нөлінші битінің мәні цикл сайын өзгеріп отырады да, бұл бит триггер жұмысын атқарады.

Trigger бағдарламысын түсіндіре кетелік. Оның бірінші командасы Trigg регистрінің нөлінші битінің жағдайын тексереді (btfsc Trigg,0). Бұл команда бағдарламаның жұмыс нүктесін одан арғы орындалатын екі сценарийінің біреуіне бағыттайды:

-       бірінші сценарий бойынша, PortB регистріне .251 (11111011) константасы жазылады да, оның RB2 шықпасы 0 жағдайына қойылады (бірінші арна);

-       екінші сценарий бойынша, PortB регистріне .255 (11111111) константасы жазылады да, оның RB2 шықпасы 1 жағдайына қойылады (екінші арна).

Екі сценарий жұмысы (RB2 шықпасына 0 немесе 1 қойылуы) жүзеге асырылғаннан кейін, бағдарлама жұмысы алдыңғы орындалған әртүрлі жұмыс сценарийіне байланысты емес, яғни бағдарламаның жұмыс нүктесі екі жағдайда да movlw .197 командасына ауысу керек. Бұндай екі бағытты жұмысты біріктірілуі бағдарламаның жұмыс нүктесін белгілерге (Mark_1 және Mark_0) ауыстыру арқылы жүзеге асырылады.

Бұдан кейінгі командалар тобында санауыш ретінде пайдаланылатын SecH және SecL регистрлеріне қажетті константалар жазып, оларды 0 мәніне дейін кеміту арқылы 60 мс шамасындағы қорғаныс интервалы қалыптастырылады. Бұндай кідіріс интервалын бірбайтты санауыш арқылы да қалыптастыруға болар еді, бірақ құрылғыны әмбебапты ету үшін (оның инерциялығы жоғарырақ құрылғыға да қосылуы мүмкін) оны екібайтты етіп құрылғаны дұрыс болады. Оқыту мақсатында, санауыштың кіші байты – кері, ал үлкен байты тура санауыш түрінде алынды.

Енді сәйкесті арнаны тексеру кезінде басқару сигналының (үзіліс сұранысының) түскен/түспегенін анықтауға арналған 100 мс шамасындағы уақыт интервалы қалыптастырылу керек (бұл интервалды әрі қарай үзіліс интервалы деп, ал осы қалыптастыруға қатысты командалар тобын бағдарламаның үзіліс аймағы деп атаймыз). Үзіліс интервалын да алдыңғы қарастырылған қорғаныс интервалының қалыптастырылу тәртібімен жүзеге асырамыз.

Үзіліс аймағының басында сыртқы үзіліске IntCon регистріне .144 (10010000) константасын жазу арқылы (яғни оның 4 және 7-биттерін 1-ге қойып) рұқсат беріледі (2.5 кестені қараңыз). Үзіліс аймағының соңында үзіліске clrf  IntCon командасымен тыйым салынады да, одан кейін incf Trigg,F командасымен тексерілуші арнаның нөмірі өзгертіледі де, бағдарламаның жұмыс нүктесі бағдарлама басына қайтарылады (goto Start).

Құрылғының жұмыс алгоритміне сәйкесті бағдарламада үзіліс интервалының қалыптастырылуы кезінде басқару сигналы түскен болса (RB0 шықпасындағы сигналдың теріс ауытқымасында), онда бағдарламаның жұмыс нүктесі үзіліс бағдарламасының бірінші командасына стек арқылы ауыстырылып, осы бағдарлама орындала бастайды.

Тексерілуші арналардың ауыстырылуы (RB2 шықпасында көрсетілетін Trigg регистрінің 0-битінің өзгерісі) мен сәйкесті арнаны тексеру кезінде бағдарламаның үзіліске рұқсат берілген “аймағын” (RB4 шықпасының нөлдік жағдайын) осциллогаф арқылы бақылап отыру арқылы бағдарламаның жұмыс нүктесінің үзіліс бағдараламасына сәйкесті арнаны тексеру кезінде “жіберілуін” ұйымдастыру қиын емес (2.4 суретті қараңыз). Қарастырылушы бағдарлама үшін осциллографтың жайылым ұзақтығын (Settings/Change Display Interval) 500000 мкс  аралығына қойып, оның жұмыс режимін (Mode) Fast жағдайына қою бақылау жүргізуге ыңғайлы болады.

2.4 сурет

Бағдарламаның жұмыс нүктесінің үзіліс бағдарламасына ауысуы RB0/INT шықпасындағы сыртқы басқару сигналының жандандырушы ауытқымасы, яғни оның бірлік жағдайынан нөлдік жағдайына  ауысуы арқылы жүзеге асырылады. Бұл сигналдың берілуін симулятор бағдарламасының негізгі терезесінен шығарылатын (Tools/Microcontroller View) сыртқы әрекеттер стимуляторы арқылы жүзеге асыруға болады. Осциллограф арқылы бағдарламаның үзіліске рұқсат берілген “аймағында” (RB4 шықпасында нөлдік деңгей қалыптасуы кезінде) RB0/INT шықпасының жанында орналасқан түймені OFF жағдайына ауыстыру арқылы үзіліс сигналы қалыптастырылады. Бұл кезде, үзілістен кері қайтқан кезде, орындалатын негізгі бағдарламаның келесі командасының адресі стекке (Tools/Hardware Stack Viewer) жазылады да (2.5 суретті қараңыз), онымен қатар бағдарламаның жұмыс нүктесі үзіліс бағдарламасына ауысады.

Енді үзіліс бағдарламасының жұмысын қарастыралық. Оның басында  Status және W регистрлерінің құрамы сәйкесті уақытша регистрлерде сақталады да, одан кейін btfsc PortB,0 командасымен үзіліс сигналының алынған/алынбағандығы тексеріледі. Оның алынған жағдайында бағдарламаның жұмыс нүктесі goto EndInt командасымен бұл бағдарламадан негізгі бағдарламаға қайту жұмысын атқарушы командалар тобына ауыстырылады да (1-сценарий), оның алынбаған жағдайында үзіліс бағдарламаның жұмысы жалғастырылады (2-сценарий).

2.5 сурет

1-сценарий бойынша жұмыс кезінде үзіліс туы тазартылып, сосын Status және W регистрлерінің құрамы үзіліске кетер алдындағы қалпына келтіріледі де, одан кейін бағдарламаның жұмыс нүктесі негізгі бағдарламаға стек арқылы қайтарылады (retfie).

Үзіліс бағдарламасының негізгі жұмысы (2-сценарий) ретінде үзіліс сигналы түскен арнаға сәйкесті жиілікті (10 Гц және 20 Гц) импульстер тізбесін қалыптастыру жүктелді. Бұл бағдарламада алдымен үзіліс сигналы түскен арна нөмірі анықталады да, одан сәйкесті импульстер тізбесі қалыптастырылады.

Сонымен, бағдарламаның жұмыс тәртібімен түгелдей таныстық. Енді онын іс жүзіндегі жұмысын симулятор арқылы тексеріп шығуға болады. Осындай тексерім арқылы бағдарламаның үзіліс аймағына 100 мс ұзақтығындағы уақыт интервалы бөлінгенін, “ұсталған” арнаға сәйкесті үзіліс бағдарламасында 10 немесе 20 Гц жиілігіндегі импульстер тізбегі қалыптастырылатынына көз жеткізуге болады.

2.3.4     Есептелмелі ауыстырылымның ұйымдастырылуы.

Алдыңғы қарастырылған бағдарламаларда пайдаланылған тарамдау командалары бағдарламаның жұмыс нүктесін екі бағытқа ауыстыруға, яғни бағдарламаның одан әрі екі түрлі сценарий бойынша жұмыс атқаруына мүмкіндік береді. Осы сияқты ықшамды тәсілмен бағдарламаның жұмыс нүктесін одан көбірек бағытқа ауыстыруға (мысалы, бағдарламаның 4 сценарий бойынша жұмыс атқаруын ұйымдастыруға) болар ма еді деген сұрақ туады. Әрине, оны бұрын қолданылған тарамдау командаларын бірнеше рет тізбектеп пайдаланып, сәйкесті тексерімдер жүргізу арқылы ұйымдастыруға болады. Бірақ бұндай тарамдалудың жүзеге асырылатын өзге жолы да бар, ол – есептелмелі ауыстырылым (бұл операцияның стандартты аталымы) арқылы жүзеге асырылу жолы. Соңғы жағдайда пайдаланылатын командалар саны бірінші жағдайға қарағанда азырақ болады (тарамдалу бағытының көбірек болған сайын, ұтыс та байқарлықтай болады).

Есептелмелі ауыстырылым addwf PCL,F командасымен жүзеге асырылады. Оның орындалу кезінде W және PCL регистрлерінің құрамы қосылып, нәтиже PCL регистріне (яғни PC аталымды команда санауышының кіші байтына) жазылады. Есептелмелі ауыстырылым үшін addwf PCL,F командасының орындалар алдында PCL құрамындағы адрес бастапқы санау нүктесі ретінде саналады да, одан кейінгі бағдарлама сценарийінің таңдалуы команда санауышының өсіріміне байланысты анықталады. Бұл өсірім W регистрі арқылы жүзеге асырылады. Есептелмелі ауыстырылымның жүзеге асырылу барысы ықшамды болу үшін W регистріне алдын ала жазылатын сандардың мәні 0, 1, 2, 3 болу керек (4 сценарийге бағыттау үшін). Сценарий саны одан көбірек болса, бұл сандар қатарының одан әрі жалғастырылатындығы түсінікті (олардың саны сценарий санына тең болады). Сонымен, W регистріне сәйкесті сан жазылып (яғни оған дейінгі бағдарлама бөлігінің орындалғанында жалпы қызмет регистрлерінің біреуіне жазылған сан көшіріліп), сосын addwf PCL,F командасы орындалғаннан кейін бағдарламаның жұмыс нүктесі, осы санға сәйкесті таңдалған сценарийдің бастама командасына ауысады да, осы команда орындалады.

Тарамдалу нәтижесінде орындалатын сценарийлердің бастама командалары, әдетте, addwf PC,F командасынан кейін бірінен соң бірі қатарластырылып, “ықшамды түрде” орналастырылады. Сценарийлердің бастама командасы ретінде goto немесе retlw командалары пайдаланылады. Goto командасы арқылы ұйымдастырылған есептелмелі ауыстырылым бағдарламаның орындалатын сценарийлерінің таңдалымын сыртқы басқарылымға (мысалы, басқару түймелерінің жағдайына) немесе бағдарламаның жұмыс нәтижесіне (мысалы, сәйкесті есептеу нәтижесіне) байланысты жүзеге асыру қажеттігінде қолданылады. Есептелмелі ауыстырылымның retlw арқылы ұйымдастырылуы кестелі түрде берілген деректер шығаруға немесе код түрлендірілімін кестелі тәсілмен жүзеге асыруға қолданылады.

Келесі бағдарламада есептелмелі ауыстырылымның бірінші тәсілі, яғни оның 4 сценарийге “тарамдалуы” А портының RA0 және RA1 шықпаларының жағдайына байланысты жүзеге асырылады.

 

; Computed Branch-1

;=========================

; Microcontroller PIC16F84A

; Clock Frequency 4.0 MHz

;=========================

Sec             equ             0Ch

Num           equ             0Dh

SecL           equ             0Eh

SecH           equ             0Fh

;=========================

                   org             0

                   goto            Start

; ****************************

Start           bsf              Status,RP0

                   movlw         .3

                   movwf        TrisA

                   movlw         .0

                   movwf        TrisB

                   bcf             Status,RP0

;------------------------------------------

Pulses         movlw         .255

                   movwf        SecL

                   movlw         .3

                   movwf        SecH

Del              decfsz         SecL,F

                   goto            Del

                   decfsz         SecH,F

                   goto            Del

                   movlw         .10

                   movwf        Num

                   movf           PortA,W

;------------------------------------------

                   addwf                  PCL,F

                   goto            F0

                   goto            F1

                   goto            F2

;=========================

F3               movlw         .128

                   movwf        Sec

F3_0           bcf             PortB,3

;------------------------------------------

                   decfsz         Sec,F

                   goto            F3_0

                   movlw         .127

                   movwf        Sec

F3_1           bsf              PortB,3

;------------------------------------------

                   decfsz         Sec,F

                   goto            F3_1

;------------------------------------------

                   clrwdt

                   decfsz         Numr,F

                   goto            F3

                   bcf             PortB,3

                   goto            PULSES

;=========================

F2               movlw         .99

                   movwf        Sec

                   bcf             PortB,2

                   nop

;------------------------------------------

F2_0           decfsz         Sec,F

                   goto            F2_0

                   movlw         .98

                   movwf        Sec

                   bsf              PortB,2

;------------------------------------------

F2_1           decfsz         Sec,F

                   goto            F2_1

;-------------------------------

                   clrwdt

                   decfsz         Num,F

                   goto            F2

                   bcf             PortB,2

                   goto            PULSES

;=========================

F1               movlw         .66

                   movwf        Sec

                   bcf             PortB,1

;------------------------------------------

F1_0           decfsz         Sec,F

                   goto            F1_0

                   movlw         .64

                   movwf        Sec

                   bsf              PortB,1

                   nop

                   nop

;------------------------------------------

F1_1           decfsz         Sec,F

                   goto            F1_1

;------------------------------------------

                   clrwdt

                   decfsz         Num,F

                   goto            F1

                   bcf             PortB,1

                   goto            PULSES

;=========================

F0               movlw         .32

                   movwf        Sec

                   bcf             PortB,0

                   nop

                   nop

;------------------------------------------

F0_0           decfsz         Sec,F

                   goto            F0_0

                   movlw         .31

                   movwf        Sec

                   bsf              PortB,0

                   nop

;------------------------------------------

F0_1           decfsz         Sec,F

                   goto            F0_1

;------------------------------------------

                   clrwdt

                   decfsz         Num,F

                   goto            F0

                   bcf              PortB,0

                   goto            PULSES

; ****************************

                   end

Бұл бағдарламадағы 4 сценарийге есептелмелі ауыстырылымның ұйымдастырылуын қарастыралық. Бағдарламаның дайындық бөлігінде А портының RA0 және RA1 шықпалары ”кіріс” жұмысына тағайындалып, ал қалған шықпалары 0 жағдайына қойылған. Құрылғының RA0 және RA1 шықпаларына қосылған басқару түймелерінің жағдайы movf PortA,W командасымен анықталады. Басқару жұмысына пайдаланылатын А портының 5 шықпалылығынан (PIC16F84A), PortA регистрінің 5, 6 және 7-шықпаларында әрқашан 0 болады деп саналады. Бағдарламалы жолмен бұл регистрдің RA2, RA3 және RA4 шықпаларына алдын ала (есептелмелі ауыстырылымға дейін) 0 қойылғандықтан, онда W регистрінде 0, 1, 2, 3 сандарының біреуі ғана болады. Бұл сандар қатарының 0 мәнінен басталуы, кез келген команданың коды шығарылғанда, команда санауышының құрамы бірге ұлғайтылып, нәтижесінде онда келесі орындалатын команданың адресі тұратындығымен түсіндіріледі.

Сонымен, құрылғының RA0 және RA1 шықпаларына қосылған басқару түймелерінің жағдайымен анықталған сан W регистріне жазылады да, сосын movf PortA,W командасы орындалғаннан кейін бағдарламаның жұмыс нүктесі сәйкесті goto командасымен қажетті қосалқы бағдарламаны (F0, F1, F2) орындауға ауыстырылады (F3 бағдарламасына ауысу, бұрын талай рет қолданылған, “одан әрі орындалу” принципімен жүзеге асырылған).

Бағдарлама жұмысының тәжірибелік тексерілімінде (2.5 суретті қараңыз) оның нақтылы орындалу сценарийінің таңдалуы сыртқы әрекеттер стимуляторындағы (Microcontroller View) сәйкесті түймелер арқылы жүзеге асырылады. Әрбір сценарийге сәйкесті қосалқы бағдарламада нақтылы жиіліктегі импульстер тізбесі қалыптастырылады. Оларды осциллограф арқылы бақылауға болады.

2.5 сурет

Келесі бағдарламада есептелмелі ауыстырылымның екінші тәсілін қолдану арқылы екілік-ондық кодтың 7-сегментті индикатор кодына түрлендірілуі ұйымдастырылған.

 

; Computed Branch-2

;===============================

; Microcontroller PIC16F84A

; Clock Frequency 4.0 MHz

;===============================

Sec             equ             0Ch

Number       equ             0Dh

SecL           equ             0Eh

SecH           equ             0Fh

;===============================

                   org             0

                   goto            Start

;*******************************

Table          addwf                   PCL,F

                   retlw            b'00111111'

                   retlw            b'00000110'

                   retlw            b'01011011'

                   retlw            b'01001111'

                   retlw            b'01100110'

                   retlw            b'01101101'

                   retlw            b'01111101'

                  retlw            b'00000111'

                   retlw            b'01111111'

                   retlw            b'01101111'  

                   retlw            .00

                   retlw            .62

                   retlw            .116

                   retlw            .56

                   retlw            .115

                   retlw           .118

;*******************************

Start           bsf              Status,RP0

                   movlw         .15

                   movwf        TrisA

                   movlw         .0

                   movwf        TrisB

                   bcf             Status,RP0

;----------------------------------------------------

                   movlw         .255

                   movwf        SecL

                   movlw         .255

                   movwf        SecH

Del              clrwdt

                   decfsz         SecL,F

                   goto            Del

                   decfsz         SecH,F

                   goto            Del

                   movf           PortA,W

                   call             Table

                   movwf        PortB

                   goto            Start

;===============================

                   end

Бұл бағдарламада оның 16 сценарийге “тарамдалуы” А портының RA0, RA1, RA2 және RA3 шықпаларына қосылған түймелердің кезекті жағдайына байланысты жүзеге асырылады. Бағдарламаның дайындық бөлігінде бұл шықпалар ”кіріс” жұмысына бағытталып, ал RA4 шықпасына 0 қойылған.

Басқару түймелерінің жағдайы movf PortA,W командасымен анықталады да, сәйкесті сан (0 мен 15 арасындағы) W регистріне жазылып, одан кейін қосалқы Table бағдарламасы шақырылады. Бұл бағдарламаның басындағы addwf  PCL,F командасынан кейін 16 қысқа сценарийге сәйкесті  бағдарламалардың бастама командасы (көріп отырғаныңыздай, ақырғысы да – сол) орналастырылған. Ондағы retlw k командасының орындалуы екі операциядан тұрады: алдымен W регистріне команда құрамындағы константа жазылады да, одан кейін стек арқылы қайтару жүзеге асырылады. Сонымен, кезекті retlw командасы орындалғаннан кейін W регистрінде бағдарламаның алдағы жұмысына қажетті сан (біздің жағдайда түрлендірілім коды) болады.

Бірінші орналасқан 10 retlw командасы арқылы 0 мен 9 арасындағы цифрлардың символдарына сәйкесті 7-сегментті индикатордың секторларын (A,B,C,D,E,F,H) жандандыру коды қалыптастырылады (ыңғайлылық үшін константалар екілік түрінде берілген). 10-сценарий индикатордың толықтай сөндірілген жағдайына сәйкестіріліп, қалған сценарийлерде кейбір латын әріптерінің символдары шығарылады. Сонымен, W регистріне “түскен” санды “шығыс” жұмысына бағытталған B портына жіберу арқылы оған қосылған 7-сегментті индикаторда сәйкесті символ көрсетіледі (2.6суретті қараңыз).

2.6 Сурет

Бағдарлама құрамындағы SecH және SecL регистрлері арқылы жүзеге асырылған кідіріс құрылымдары екілік сандарды енгізу ыңғайлылығын қамтамасыз ету мақсатында орналастырылған.

2.3.5     Динамикалы шығарылым.

Көптеген жағдайда қосалқы Table бағдарламасы сияқты есептелмелі ауыстырылым бағдарламалары айналымды бағдарламалардың өңделім барысында жалпы қызмет регистрлерінде сақталған кезекті деректерді көрсетілімге шығару үшін шақырылады (call  Table). Бұл регистрлерді, сәйкесті нөмір қосылған Led аталымымен белгілейміз. Мысалы, егер өлшенім (немесе есептеу) нәтижесін 4-разрядты ондық сан түрінде көсетілімге шығару керек болса, онда өлшенімнің екілік нәтижесі екілік-ондық түрлендіргіші (ол жөнінде әңгіме кейінірек болады) арқылы “өткізіліп”, түрлендірім нәтижелері Led аталымымен белгіленген (Led0 ... Led3) 4 регистрдің кіші тетрадаларына орналастырылады. Одан кейін, бұл регистрлердің құрамы реттік тәртібімен W регистріне көшіріледі де, сосын олар Table бағдарламасы арқылы 7-сегментті индикатор кодына түрлендіріліп, сосын сәйкесті символ түрінде индикаторда шығарылады.

Алдыңғы қарастырылған бағдарламада бір-ақ индикатор пайдаланылған және оған дерек B порты арқылы шығарылған болатын. Қазіргі қарастырылып отырған жағдайда 4-разрядты дерек шығарылу керек, демек ол үшін 4 индикатор пайдаланылады. Оларға деректерді алдыңғы жолмен шығару үшін (бұл тәсіл статикалы шығарылым тәсілі деп аталады), микроконтроллердің кем дегенде 4 порты болу керек болады. Көптеген микроконтроллердің соншама порты болмайды (мысалы, PIC16F84A микроконтроллерінде 8-шықпалы бір-ақ порт бар). Тіпті, соншама порттың болған жағдайында да, олардың бәрін бірдей дерек шығару жұмысына пайдалану, іс жүзінде, жүзеге асырылуға қиын мәселе (олардың бағдарламаның өзге жұмыстарына да пайдаланылатынын ескеру керек). Сондықтан бірнеше разрядты дерек шығаруға, динамикалы шығарылым деп аталатын тәсіл қолданылады.

Енді осы динамикалы шығарылым тәсілінің жүзеге асырылу жолына жалпы түсініктеме берелік. Бұнда микроконтроллердің бір порты арқылы кезекті разрядқа сәйкесті дерек шығарылғаннан кейін, сол порт арқылы келесі разрядқа сәйкесті дерек шығарылады да, осы тәртіппен  барлық разрядқа сәйкесті дерек шығарылып болғаннан кейін, бұл жұмыс бірінші разрядтан бастап тізбектеп қайталана береді, яғни бірнеше разрядты дерек шығару жұмысы бағдарламаның сәйкесті “айналымды” құрылымы арқылы жүзеге асырылады. Сонымен, кезекті шығарылатын дерек барлық индикатор сегменттеріне қатар (параллель) беріледі де, қажетті индикатор, оның ортақ нүктесіне сәйкесті деңгейдегі (0 немесе 1) басқару сигналын беру арқылы (олардың “ортақ катодты” немесе “ортақ анодты” түрінде құрылуына сәйкесті), жандандырылады. Бұл жағдайда, әрине, сәйкесті индикатордың дерек шығарылу тәртібімен кезектеп жандандырылуы қамтамасыз етілу керек.

Біздің бұдан әрі қарастыратын бағдарламамызда 4-разрядты деректің ортақ катодты 7-сегментті индикаторларға шығарылуының ұйымдастырылуы жүзеге асырылған. Бұл бағдарлама – жеткілікті мөлшерде әмбебап бағдарлама, демек оны өзге бағдарламалардың қажетті жеріне “орналастыруға” болады. Бұл кезде оның разрядтылығын, әрине, бағдарлама талабына сай өзгерту кажеттігі түсінікті (бұндай өзгертілімді “ынтазар” оқырман, аса қиналмай, жүзеге асыра алады деп сенемін).

Қарастырылатын бағдарламада шығарылушы дерек ретінде ондық мәні 0 мен .9999 арасындағы санау нәтижесі пайдаланылады. Бағдарламаның әрбір таңдалымында қалыптасқан 4-байтты екілік сан, алдымен, екілік-ондық түрлендіргішіне жіберіледі де, сосын түрлендірілім нәтижесі динамикалы шығарылым тәсілімен 7-сегментті индикаторларда көсетіледі.

Қарастырылушы бағдарламаның мәтіні төменде келтірілген.

 

; Dynamic Display

;===========================

; Microcontroller PIC16F84A

; Clock Frequency 4.0 MHz

;*****************************

DataL          equ             0Ch

DataH         equ             0Dh

D_H           equ             0Eh

D_L            equ             0Fh

Step            equ             1Bh

Led0           equ             1Ch

Led1           equ             1Dh

Led2           equ             1Eh

Led3           equ             1Fh

Index          equ             10h

Count                   equ             11h

Temp          equ             12h

Mem           equ             13h

TempL        equ             14h

TempH       equ             15h

;*****************************

org             0

                  goto            START

;*****************************

Start          bsf              Status,RP0

                  movlw         .16

                  movwf        TrisA

                  movlw         .00

                  movwf        TrisB

                  bcf             Status,RP0

;===========================

                  clrf             DataL

                  clrf             DataH

;===========================

Data            movf           DataH,W

                  addlw          EСh

                  btfss           Status,C

                  goto            Incr

;===========================

Decr           decf            Step,F        

                  movf           Led3,W

                  sublw          .9

                  btfss           Status,Z

                  goto            Cont

                  movf           Led2,W

                  sublw          .9

                  btfss           Status,Z

                  goto            Cont

;--------------------------------------------

S_7            movlw         .7

                  movwf        Step

;--------------------------------------------

                  movf           Led1,W

                  addlw          F8h

                  btfss           Status,C

                  goto            Cont

                  goto            S_1

;===========================

Incr            incf             Step,F

                  movf           DataH,F

                  btfss           Status,Z

                  goto            Cont

                  movf           DataL,W

                  addlw          F5h

                  btfsc           Status,C

                  goto            Cont

;--------------------------------------------

S_1            movlw         1

                  movwf        Step

;===========================

Cont           clrwdt

                  movfw        Step

                  addwf                  DataL,F

                  btfsc           Status,C

                  incf             DataH,F

                  movf           DataL,W

                  movwf        D_L

                  movf           DataH,W

                  movwf        D_H

                  call             BinDec

                  incfsz          Temp,F

                  goto            Data

                  call             Clr

                  goto            Start

;*****************************

;*****************************

BinDec        bcf             Status,C

                  movlw         .16

                  movwf        Count

                  clrf             Led0

                  clrf             Led1

                  clrf             Led2

                  clrf             Led3

;===========================

Loop8         clrwdt

                  rlf               D_L,F

                  rlf               D_H,F

                  rlf               Led0,F

                  rlf               Led1,F

                  decfsz         Count,F

                  goto            adjDEC

;--------------------------------------------

                  swapf          Led1,W

                  andlw          0Fh

                  movwf        Led3

;--------------------------------------------

                  movfw        Led1

                  andlw          0Fh

                  movwf        Led2

;--------------------------------------------

                  swapf          Led0,W

                  andlw          0Fh

                  movwf        Led1

;--------------------------------------------

                  movfw        Led0

                  andlw          0Fh

                  movwf        Led0

                  goto            Disp

;===========================

adjDEC       movlw         Led0

                  movwf        FSR

                  call             adjBCD

;--------------------------------------------

                  movlw         LED1

                  movwf        FSR

                  call             adjBCD

;--------------------------------------------

                  goto            Loop8

;===========================

adjBCD       movlw         3

                  addwf                  0,W

                  movwf        Mem 

                  btfsc           Mem,3

                  movwf        0

;--------------------------------------------

                  movlw         30h

                  addwf         0,W

                  movwf        Mem

                  btfsc           Mem,7

                  movwf        0

;--------------------------------------------

                  retlw           0

;*****************************

Disp           clrwdt

                  movlw         .3

                  movwf        Index

                  movf           Led3,F

                  btfss           Status,Z

                  goto            IndexS

;--------------------------------------------

                  decf            Index,F

                  movf           Led2,F

                  btfss           Status,Z

                  goto            IndexS

;--------------------------------------------

                  decf            Index,F

                  movf           Led1,F

                  btfss           Status,Z

                  goto            IndexS

;--------------------------------------------

                  decf            Index,F

;===========================

IndexS        clrf             PortA

                  movf           Index,W

                  addwf                  PCL,F

                  goto            Disp0

                  goto            Disp1

                  goto            Disp2

;===========================

Disp3          clrf             PortA

                  movf           Led3,W

                  call             Table

                  movwf        PortB

                  movlw         .8

                  movwf        PortA

;--------------------------------------------

Disp2          clrf             PortA

                  movf           Led2,W

                  call             Table

                  movwf        PortB

                  movlw         .4

                  movwf        PortA

;--------------------------------------------

Disp1          clrf             PortA

                  movf           Led1,W

                  call             Table

                  movwf        PortB

                  movlw         .2

                  movwf        PortA

;--------------------------------------------

Disp0          clrf             PortA

                  movf           Led0,W

                  call             Table

                  movwf        PortB

                  movlw         .1

                  movwf        PortA

;*****************************

Aud            movf           Led3,W

                  sublw          .9

                  btfss           Status,Z

                  return

                  movf           Led2,W

                  sublw          .9

                  btfss           Status,Z

                  return

                  movf           Led1,W

                  sublw          .9

                  btfss           Status,Z

                  return

                  movf           Led0,W

                  sublw          .9

                  btfss           Status,Z

                  return

                  movlw         FFh

                  movwf        Temp

                  return

;*****************************

Clr              movlw         .3

                  movwf        Index

                  movlw         .10

                  movwf        Led0

                  movwf        Led1

                  movwf        Led2

                  movwf        Led3

                  call             IndexS

;--------------------------------------------

                  movlw         .255

                  movwf        Temp

Del_0          decfsz         Temp,F

                  goto            Del_0

;--------------------------------------------

                  movlw         .3

                  movwf        Index

                  movlw         .11

                  movwf        Led0

                  movwf        Led1

                  movwf        Led2

                  movwf        Led3

                  call             IndexS

;--------------------------------------------

                  movlw         .255

                  movwf        Temp

Del_1          decfsz         Temp,F

                  goto            Del_1

;--------------------------------------------

                  return

;*****************************

Table          addwf         PCL,F

;--------------------------------------------

                  retlw           b'00111111'

                  retlw           b'00000110'

                  retlw            b'01011011'

                   retlw            b'01001111'

                   retlw            b'01100110'

                   retlw            b'01101101'

                   retlw            b'01111101'

                   retlw            b'00000111'

                   retlw            b'01111111'

                   retlw            b'01101111'

;--------------------------------------------

                   retlw            b'10001000'

                   retlw            b'00000000'

;*****************************

                   end

Алдымен, бағдарламаның жалпы “құрылымен” танысалық. Бағдарлама басында, яғни оның Data бөлігінде, өзгермелі қадаммен төрт 7-сегментті индикаторға (0 мен 9999 арасындағы) ондық сан түрінде шығаруға арналған екібайтты деректер (0 мен 270Fh арасындағы) қалыптастырылады да, одан кейін BinDec бағдарламасы шақырылып, оның басында таңдалған екілік сан сәйкесті екілік-ондық кодқа түрлендіріледі де, сосын осы кодтың индикаторларға шығарылуы (Disp бағдарламасында) жүзеге асырылады. Бұдан кейін Aud бағдарламасы арқылы келесі сандардың қалыптастырылуын жалғастыру мүмкіндігі, яғни олардың шегіне жеткендігі немесе жетпегендігі тексеріледі. Тексерім нәтижесі негізгі бағдарламаға Temp регистрі арқылы түседі. Оның 0 мәні сандар тізбесінің қалыптастырылуын жалғастыру мүмкіндігіне (және қажеттігіне) сәйкес болады да, бағдарламаның жұмыс нүктесі Data белгісіне ауыстырылып, бағдарламада көрсетілетін жаңа сандардың қалыптасуы жалғастырылады. Temp регистрінде FFh болуы 4-разрядты ең үлкен қалыптастырылғандығына (270Fh – .9999) сәйкес болады да, бұл жағдайда, бағдарламаның бір жұмыс циклінің аяқталғандығын көрнекі түрде суреттеу жұмысын атқаратын Clr бағдарламасы орындалады да, жаңа жұмыс циклі басталады.

Енді екілік сандарды екілік-ондық кодқа түрлендіру жұмысын қарастыралық. Қалыптасқан кезекті екібайтты екілік сан DataH және DataL аталымды жалпы қызмет регистрлерінде болады. 7-сегментті төрт индикатор арқылы 9999 мәніне дейінгі сандар көрсетіледі, 9999 санының екілік баламасы – 10 0111 0000 1111 (16-лық жазылымда – 270Fh). Екілік-ондық сан, оның анықтамасы бойынша, 9 мәнінен аспау керек. Демек ол байттың кіші тетрадасында орналасады да, оның үлкен тетрадасында әрқашан нөл болады (0000хххх). Сонымен, ондық 9999 саны екілік-ондық түрінде көрсетілуі үшін 4 регистр қажет болады, ол үшін бағдарламада Led0...3 регистрлері пайдаланылады.

Сандарды түрлендіру бағдарламасының жұмысын жалпы түрде суреттеп өтелік. Бағдарламаның жұмыс нүктесі түрлендіру бағдарламасына (BinDec) “кіргеннен” кейін, алдын ала тағайындалған Count санауышына 2-байтты D_H/D_L регистрінің (оның құрамында екілік-ондық кодқа түрлендірілетін 2-байтты екілік сан болады) биттерінің толық санына тең константа, яғни .16 саны жазылады. Түрлендірім бағдарламасының ішкі циклінің 16 “айналымының” әрбірінде Count құрамы бірге кемітіліп отырылады да, кемітілу нәтижесі 0 болғанда, бағдарламаның жұмыс нүктесі түрлендіру бағдарламасының ішкі циклінің келесі “айналымына” кетеді. Сонымен, түрлендірім бағдарламасының ішкі циклінің 16 “айналымы” түрлендірім бағдарламасының толық циклін құрады.

Түрлендірім бағдарламасы жұмысының басында Led0...3 регистрлері тазартылады да, одан кейін бұл бағдарламаның ішкі циклінің 16 “айналымының” әрбірінің басында 4-байтты Led1/Led0/D_H/D_L регистрінің құрамы айналымды түрде (Status регистрінің С биті арқылы) солға ығыстырылады. Осындай әрбір ығыстырым топтамасының нәтижесінде (4 rlf командасымен) D_H регистрінің ең үлкен биті Led0 регистрінің кіші битіне ауысады. Сонымен, осындай 16 ығыстырылым арқылы D_H/D_L регистрінің құрамы Led1/Led0 регистріне ауысады (“жүгірме жол” принципімен). Демек кезекті ығыстырым топтамасынан кейін, яғни Count санауышы тазартылғанда, 4-байтты Led0/Led1/Led2/Led3 регистрінің 8 тетрадасында, бастапқы екілік санға сәйкесті екілік-ондық сандар “жатады”. Бұл жердегі жұмыстың “оқу – түрлендіру – жазу” тәртібімен жүргізілетіндігінен, аралық және ақырғы нәтижелерді уақытша сақтау үшін тағы бір жалпы қызмет регистрі (біздің жағдайда – Mem регистрі) пайдаланылады. Кезекті түрлендірілім біткенде, Mem регистрінде “жатқан” сан кезекті Led регистріне көшіріледі. Сонымен, түрлендірім бағдарламасының ішкі циклінің 16 “айналымы” біткеннен кейін, 4-байтты Led0/Led1/Led2/Led3 регистрінің 8 тетрадасында екілік-ондық сандар “жатады”. Енді оларды Led0, Led1, Led2, Led3 регистрлерінің кіші тетрадаларына жіберіп, олардың үлкен тетрадаларына нөлдер жазу ғана қалды.

2.7 Сурет

BinDec бағдарламасының құрамындағы adjDEC бағдарламасы ешқандай түрлендірім жүргізбейді, ол басқару қызметін атқарады, яғни Led0 және Led1 регистрлерінің өңделу тәртібін анықтайды. Айта кететін тағы бір мәселе бар. Кезекті өңделетін Led регистрінің адресі adjDEC бағдарламасынан шақырылатын adjBCD бағдарламасына жанама сілтеу арқылы (яғни FSR және INDF регистрлерімен) жіберіледі де, негізгі түрлендірілім осы adjBCD бағдарламасында жүргізіледі.

Бағдарлама жұмысын симулятор арқылы тексеруге болады (2.7 суретті қараңыз). Тексерім кезінде индикаторларға шығарылатын сандардың таңдалым (дәлірек айтқанда, қалыптастырылу) қадамының (Step) тұрақты болып қалмай, өзгеріп тұратындығы байқалады. Incr немесе Decr бағдарламаларында жүзеге асырылатын бұндай өзгеріс шығарылатын (қалыптастырылатын) сандардың бүкіл кеңістігін (0 мен .9999 арасындағы) тезірек өтіп шығу үшін қойылған. Өзгеріс сипаты разрядтар арасындағы тасымал нәтижесін бақылауға мүмкіндік беретіндей етіп қойылған.

2.3.6     EEPROM жадысымен жұмыс ұйымдастырылуы.

Деректермен ерекше жұмыстар атқаруға арналған EEPROM жадысы бағдарлама жадысы сияқты энергияға тәуелсіз жады. Онда микроконтроллердің алдыңғы жұмысынан алынған және оның келесі қосылымында пайдаланылатын операция нәтижелері немесе константалар сақталады.

EEPROM жадысының көлемі онша үлкен болмайды, мысалы, PIC16F84A микроконтроллерінің EEPROM жадысында – 64 ұяшық, ал олардың кейбір түрлерінде одан көбірек болуы мүмкін. Осы ұяшықтардың әрбіріне бір байт (.00 мен .255 арасындағы) жазып, оны қажетті кезінде оқу арқылы бағдарлама жұмысында пайдалануға болады.

EEPROM жадысымен жұмыс ұйымдастырылуының жалпы принциптерін түсіндіруге арналған тапсырма ретінде нақтылы бір мәселенің жүзеге асырылуын қарастыралық. Мысалы, бағдарлама жұмысының барысында EEPROM жадысының 7-ұяшығынан бастап, бес ұяшықтың құрамын түрлендіру керек болсын. Түрлендірме қарапайымдылығы үшін (және EEPROM жадысындағы өзгерістерді бақылау жеңілдігін қамтамасыз ету мақсатында) бірінші санға (7-ұяшықтағы) – 1, екіншісіне – 2, үшіншісіне – 3 және қалғандарына да с.с. сандар қосу керек деп шештік. Қойылған мәселенің жүзеге асырылым бағдарламасы төменде келтірілген.

 

; EEPROM-1

;==========================

; Microcontroller PIC16F84A

; Clock Frequency 4.0 MHz

;==========================

Reg            equ             0Ch

Count                   equ             0Dh

Add            equ             0Eh

Step            equ             0Fh

Num           equ             1Ch

Del_T         equ             .24

;==========================

                  org             0

                  goto            Start

;==========================

;******************************

Start           movlw         .6

                  movwf        Add

                  clrf             Step

                  clrf             Num

;---------------------------------------------

Cont           incf             Add,F

;==========================

RD_EE       bcf             Status,RP0

                  movfw        Add

                  movwf        EEAdr

                  bsf              Status,RP0

                  bsf              EECon1,0

                  bcf             Status,RP0

                  movf           EEData,W

                  movwf        Reg

;---------------------------------------------

Mod           incf             Step,F

                  movf           Reg,W

                  addwf                  Step,W

;==========================

WR_EE      bcf             Intcon,GIE

                  movfw        Add

                   movwf        EEAdr

;---------------------------------------------

                  movfw        Reg

                  movwf        EEData

                  bsf              Status,RP0

                  bsf              EECon1,2

                  movlw         055h

                  movwf        EECon2

                  movlw         0AAh

                  movwf        EECon2

                  bsf              EECon1,1

                  bcf             EECon1,4

                  bcf             Status,RP0

;==========================

Delay          movlw         Del_T

                  movwf        Count

Del             decfsz         Count,F

                  goto            Del

;==========================

                  incf             Num,F

                  movfw        Num

                  sublw          .5

                   btfss           Status,Z

                   goto            Cont

                   goto            Start

;******************************

                   end

 

EEPROM жадысына оқу/жазу (әсіресе жазу) процестерінің жүргізілуі жеңіл ұйымдастырылады деп айту қиын, оларға көптеген команда пайдалануға тура келеді.

2.6 к е с т е – EECON1 регистрі

Бит

Аталымы

Түсініктеме

4

EEIF

EEPROM-ға жазылымның аяқталуына байланысты үзіліс туы:

1 – дерек жазылымының аяқталғаны

0 – дерек жазылымының аяқталмағаны

3

WRERR

EEPROM-ға жазылым қателігінің туы:

1 – жазылым барысы үзілген

0 – жазылым дұрыс аяқталған

2

WREN

EEPROM-ға жазылым рұқсаты:

1 – жазылымға рұқсат берілуі

0 – жазылымға тыйым салынуы

1

WR

EEPROM-ға жазылым:

1 – жазылым басталымы

0 – жазылым аяқталған

0

RD

EEPROM-нан оқылым:

1 – оқылым басталуы

0 – оқылым аяқталған

 

Бағдарламаның Start және Cont белгілерінің арасында бастапқы қойылымдар, яғни EEPROM жадысының орындалатын жұмыстарға қатысты ұяшықтарының бастама адресі (Add) мен қалыптастырылатын сандардың бастапқы өсірілім қадамы (Step) орындалады. Одан кейін incf Add,F командасымен EEPROM жадысының адресі ұлғайтылады да (яғни түрлендірім жүргізілетін бірінші ұяшық таңдалады), бағдарламаның жұмыс нүктесі EEPROM жадысымен жұмыс атқарушы командалар топтамасына ауысады. Бұл топтаманың басында дайындалған адрес (movfw Add және movwf EEAdr командалары арқылы) EEPROM жадының адрестік регистріне (EEAdr) жіберіледі. Бұл регистр қызмет жадысының 1-банкінде орналастырылған, сондықтан бұл жұмыстың орындалар алдында осы банк таңдалу керек (bcf Status, RP0). Келесі орындалатын оқу жұмысы, 2-банкте орналасқан, EECon1 регистрі арқылы жүзеге асырылатындықтан, алдымен банк ауыстырылады да (bsf Status,RP0), сосын оқу командасын (bsf EECon1,0) беру арқылы (2.6 кестені қараңыз) EEPROM жадысының таңдалған ұяшығындағы дерек оқылады. Сосын, банк қайтадан ауыстырылады да, одан кейін оқылған дерек W регистрі арқылы (movf EEData,W және movwf Reg командаларымен) Reg регистріне уақытша сақтауға жіберіледі.

Бастапқы жағдайда немесе тазартылым нәтижесінде (Clear) EEPROM жадысының барлық ұяшығында FFh саны болатындықтан (2.8 суретті қараңыз), оның кез келген ұяшығының бірінші оқылымында осы сан шығарылатындығын бағдарлама құрылуында ескерілу керек.

2.8 сурет

Бағдарламаның жұмыс алгоритміне сәйкесті жүргізілетін түрлендірілімдер (өсірілімдер) оның Mod аталымды бөлігінде (Step регистрін бірге ұлғайтып, оны Reg регистріне қосу арқылы) жүзеге асырылады.

Енді EEPROM жадысына жазу барысының ұйымдастырылымына кіріселік. Жазу бағдарламасының (WR_EE бөлігі) үзілістерге жалпы тыйым салу командасынан (bcf Intcon,GIE) басталғаны дұрыс болады (оны clrf Intcon командасымен де жүзеге асыруға болады). Үзілістергі тыйым салудың қажеттігі мына себепке байланысты: EEPROM жадысына жазылым жұмысы аяқталған кезде үзіліс туы (Intcon регистрінің 4-биті) көтеріліп, үзіліске рұқсат берілген жағдайда бағдарламаның жұмыс нүктесі сәйкесті үзіліс бағдарламасына ауысар еді, ал біздің жағдайда ондай бағдарлама жоқ. Үзіліске тыйым салу командасынан кейінгі екі команда арқылы EEPROM жадысының жазу жұмысы жүргізілетін ұяшығының адресін қойылады да (оқу барысындағыдай), сосын алдында (бағдарламаның Mod бөлігінде) түрлендірілген (Reg регистріндегі) сан, W регистрі арқылы EEData регистріне көшіріледі де, осымен жазылымға дайындық жұмысы аяқталады.

Бұдан кейінгі жұмыс 1-банктегі регистрлермен атқарылатындықтан, bsf Status, RP0 арқылы банк ауыстырылады да, сосын EEPROM жадысына жазу жұмысын жүргізуге рұқсат беріледі (bsf EECon1,2). Жазу командасының берілер алдында 4 команда тізбесі арқылы “іс жүзінде құрылмаған” EECon2 регистрімен міндетті операциялар орындалады. Бұндай іс жүзінде жоқ регистрмен жүргізілетін “жұмбақ” операциялар EEPROM жадысына кездейсоқ жазылым жүргізілуін болдырмас үшін қойылған болар деп санаймын. Бұл операциялардан кейін жазу командасы беріліп, қажетті жазылым жүзеге асырылғасын, EEPROM-ға жазылымның аяқталуына байланысты үзіліс туы көтеріледі. EEPROM жадысына келесі жазылым жүргізу үшін бұл ту бағдарламалы жолмен тазартылу керек (bcf         EECon1,4).

Бірақ бұл жерде іс жүзіндегі EEPROM жадысына дерек жазылу жұмысына белгілі мөлшердегі уақыт керек болатындығын ескеру керек. Оған қажетті уақыт аралығының қамтамасыз етілуін, нақтылы мөлшердегі кідіріс тудыру арқылы немесе жазылымның аяқталу туының көтерілуін күте тұру арқылы жүзеге асыруға болады. Біздің бағдарламада бірінші тәсіл пайдаланылған, яғни қажетті кідіріс, bcf Status,RP0 командасынан кейін орналастырылған Delay бағдарламасымен жүзеге асырылады. Онда қойылған Del_T константасының мәні тәжірибе жүзінде, яғни бағдарлама жұмысын симулятор арқылы тексеру кезінде анықталды. Таңдалған константа мәнінің жазылым жұмысына жарамды/жарамсыздығына оны өзгерту арқылы көз жетізуге болады.

Бағдарламаның соңғы бөлігінде жүргізілген түрлендірімдер саны тексеріледі де, түрлендірімдердің бітпеген жағдайында бағдарламаның жұмыс нүктесі Cont белгісіне ауыстырылып, EEPROM жадысының келесі ұяшықтарының түрлендірілімі жалғастырылады да, оның біткен жағдайында (түрлендірілім саны 5 болғанда) бағдарламаның жаңа айналымы басталады.

Бағдарлама жұмысы (симуляторда) тоқтатылып, одан кейін ол қайтадан іске қосылғанда, жаңа түрлендірілімдердің EEPROM жадысында бұрынғы сақталған мәндерге байланысты жүргізілетіндігіне көз жетізуге болады.

Енді қарастырылған бағдарлама мен алдыңғы бағдарламаның мүмкіншіліктерін біріктірелік. Dynamic Display бағдарламасының іске жаңа қосылымында қалыптастырылатын (яғни индикаторларға шығарылатын) сандар әрқашан ең төменгі мәндерінен басталатын. Енді осы бағдарламаны өзгерту арқылы жаңа қосылымда қалыптастырылатын сандардың тоқтатылым кезіндегі жеткен мәнінен (және олардың өсірілім қадамының да) жалғастырылуын қамтамасыз етелік. Ол үшін, әрине, бағдарламаның тоқталым мезетінің алдында қалыптастырылған сандар EEPROM жадысында сақталып, олар бағдарламаның келесі қосылымында пайдаланылу керек. Өзгертілген бағдарлама (EEPROM-2) төменде келтірілген.

 

; EEPROM-2

;-----------------------------------------------

; Microcontroller PIC16F84A

; Clock Frequency 4.0 MHz

;*******************************

DataL          equ             0Ch

DataH         equ             0Dh

D_L            equ             0Eh

D_H           equ             0Fh

Step            equ             1Bh

Led0           equ             1Ch

Led1           equ             1Dh

Led2           equ             1Eh

Led3           equ             1Fh

Index          equ             10h

Count                   equ             11h

Temp          equ             12h

Mem           equ             13h

TempL        equ             15h

TempH       equ             16h

Trig            equ             17h

Add            equ             18h

;-----------------------------------------------

Del_T         equ             .30

;*******************************

                  org             0

                  goto            START

;*******************************

Start          bsf              Status,RP0

                  movlw         .16

                  movwf        TrisA

                  movlw         .00

                  movwf        TrisB

                  bcf             Status,RP0

;-----------------------------------------------

                  clrf             DataL

                  clrf             DataH

                  clrf             Step

                  clrf             Trig

                  clrf             Led0

                  clrf             Led1

                  clrf             Led2

                  clrf             Led3

;===========================

                  call             RD_0

                  movfw        Trig

                  btfsc           Status,Z

                  goto            Data

                  call             RD_EE

;===========================

Data            clrwdt

                  movf           DataH,W

                  addlw          ECh

                  btfss           Status,C

                  goto            Incr

;-----------------------------------------------

Decr           decf            Step,F

                  movf           Led3,W

                  sublw          .9

                  btfss           Status,Z

                  goto            Cont

                  movf           Led2,W

                  sublw          .9

                  btfss           Status,Z

                  goto            Cont

;-----------------------------------------------

S_7            movlw         .7

                  movwf        Step

;-----------------------------------------------

                  movf           Led1,W

                  addlw          F8h

                  btfss           Status,C

                  goto            Cont

                  goto            S_1

;-----------------------------------------------

Incr            incf             Step,F

                  movf           DataH,F

                  btfss           Status,Z

                  goto            Cont

                  movf           DataL,W

                  addlw          F5h

                  btfsc           Status,C

                  goto            Cont

;-----------------------------------------------

S_1            movlw         1

                  movwf        Step

;===========================

Cont           clrwdt

                  movfw        Step

                  addwf                  DataL,F

                  btfsc           Status,C

                  incf             DataH,F

                  movf           DataL,W

                  movwf        D_L

                  movf           DataH,W

                  movwf        D_H

                  call             BinDec

                  incfsz          Temp,F

                  goto            Data

                  call             Clr

                  call             Fin

                  goto            Start

;*******************************

;*******************************

BinDec        bcf             Status,C

                  movlw         .16

                  movwf        Count

                  clrf             Led0

                  clrf             Led1

                  clrf             Led2

                  clrf             Led3

;===========================

Loop8         clrwdt

                  rlf               D_L,F

                  rlf               D_H,F

                  rlf               Led0,F

                  rlf               Led1,F

                  decfsz         Count,F

                  goto            adjDEC

;-----------------------------------------------

                  swapf          Led1,W

                  andlw          0Fh

                  movwf        Led3

;-----------------------------------------------

                  movfw        Led1

                  andlw          0Fh

                  movwf        Led2

;-----------------------------------------------

                  swapf          Led0,W

                  andlw          0Fh

                  movwf        Led1

;-----------------------------------------------

                  movfw        Led0

                  andlw          0Fh

                  movwf        Led0

                  goto            Disp

;===========================

adjDEC       movlw         Led0

                  movwf        FSR

                  call             adjBCD

;-----------------------------------------------

                  movlw         LED1

                  movwf        FSR

                  call             adjBCD

;-----------------------------------------------

                  goto            Loop8

;===========================

adjBCD       movlw         3

                  addwf                  0,W

                  movwf        Mem 

                  btfsc           Mem,3

                  movwf        0

;-----------------------------------------------

                  movlw         30h

                  addwf         0,W

                  movwf        Mem

                  btfsc           Mem,7

                  movwf        0

;-----------------------------------------------

                  retlw           0

;*******************************

Disp           clrwdt

                  movlw         .3

                  movwf        Index

                  movf           Led3,F

                  btfss           Status,Z

                  goto            IndexS

;-----------------------------------------------

                  decf            Index,F

                  movf           Led2,F

                  btfss           Status,Z

                  goto            IndexS

;-----------------------------------------------

                  decf            Index,F

                  movf           Led1,F

                  btfss           Status,Z

                  goto            IndexS

;-----------------------------------------------

                  decf            Index,F

;===========================

IndexS        clrf             PortA

                  movf           Index,W

                  addwf                  PCL,F

                  goto            Disp0

                  goto            Disp1

                  goto            Disp2

;===========================

Disp3          clrf             PortA

                  movf           Led3,W

                  call             Table

                  movwf        PortB

                  movlw         .8

                  movwf        PortA

;-----------------------------------------------

Disp2          clrf             PortA

                  movf           Led2,W

                  call             Table

                  movwf        PortB

                  movlw         .4

                  movwf        PortA

;-----------------------------------------------

Disp1          clrf             PortA

                  movf           Led1,W

                  call             Table

                  movwf        PortB

                  movlw         .2

                  movwf        PortA

;-----------------------------------------------

Disp0          clrf             PortA

                  movf           Led0,W

                  call             Table

                  movwf        PortB

                  movlw         .1

                  movwf        PortA

;===========================

                  call             WR_EE

;*******************************

Aud            movf           Led3,W

                  sublw          .9

                  btfss           Status,Z

                  return

                  movf           Led2,W

                  sublw          .9

                  btfss           Status,Z

                  return

                  movf           Led1,W

                  sublw          .9

                  btfss           Status,Z

                  return

                  movf           Led0,W

                  sublw          .9

                  btfss           Status,Z

                  return

                  movlw         FFh

                  movwf        Temp

                  clrf             Trig

                  return

;*******************************

Clr              movlw         .3

                  movwf        Index

                  movlw         .10

                  movwf        Led0

                  movwf        Led1

                  movwf        Led2

                  movwf        Led3

                  call             IndexS

;-----------------------------------------------

                  movlw         .255

                  movwf        Temp

Del_0          decfsz         Temp,F

                  goto            Del_0

;-----------------------------------------------

                  movlw         .3

                  movwf        Index

                  movlw         .11

                  movwf        Led0

                  movwf        Led1

                  movwf        Led2

                  movwf        Led3

                  call             IndexS

;-----------------------------------------------

                  movlw         .255

                  movwf        Temp

Del_1          decfsz         Temp,F

                  goto            Del_1

                  return

;*******************************

Table          addwf         PCL,F

;-----------------------------------------------

                  retlw            b'00111111'

                   retlw            b'00000110'

                   retlw            b'01011011'

                   retlw            b'01001111'

                   retlw            b'01100110'

                   retlw            b'01101101'

                   retlw            b'01111101'

                   retlw            b'00000111'

                   retlw            b'01111111'

                   retlw            b'01101111'

;-----------------------------------------------

                   retlw            b'10001000'

                  retlw           b'00000000'

;*******************************

RD_0          bcf             Status,RP0

                  clrw

                  movfw        Add

                  movwf        EEAdr 

                  bsf              Status,RP0

                  bsf              EECon1,0

                  bcf             Status,RP0

                  movf           EEData,W

                  movwf        Trig

                  incf             Trig,F

                  btfss           Status,Z

                  return

;===========================

                  clrf             Add

                  clrf             Trig

                  bcf             Intcon,GIE

Cont_0        movfw        Add

                  movwf        EEAdr

;-----------------------------------------------

                  clrw

                  movwf        EEData

                  bsf              Status,RP0

                  bsf              EECon1,2

                  movlw         055h

                  movwf        EECon2

                  movlw         0AAh

                  movwf        EECon2

                  bsf              EECon1,1

                  bcf             EECon1,4

                  bcf             Status,RP0

                  call             Delay

                  incf             Add,F

                  movfw        Add

                  sublw          .8

                  btfss           Status,Z

                  goto            Cont_0

                  return

;*******************************

Fin              clrf             Add

                  bcf             Intcon,GIE

Cont_F       movfw        Add

                  movwf        EEAdr

;-----------------------------------------------

                  movlw         FFh

                  movwf        EEData

                  bsf              Status,RP0

                  bsf              EECon1,2

                  movlw         055h

                  movwf        EECon2

                  movlw         0AAh

                  movwf        EECon2

                  bsf              EECon1,1

                  bcf             EECon1,4

                  bcf             Status,RP0

                  call             Delay

                  incf             Add,F

                  movfw        Add

                  sublw          .8

                  btfss           Status,Z

                  goto            Cont_F

                  return

;*******************************

RD_EE       incf             Add,F

                  movfw        Add

                  movwf        EEAdr 

                  bsf              Status,RP0

                  bsf              EECon1,0

                  bcf             Status,RP0

                  movf           EEData,W

                  movwf        Step

;-----------------------------------------------

                  incf             Add,F

                  movfw        Add

                  movwf        EEAdr 

                  bsf              Status,RP0

                  bsf              EECon1,0

                  bcf             Status,RP0

                  movf           EEData,W

                  movwf        DataH

;-----------------------------------------------

                  incf             Add,F

                  movfw        Add

                  movwf        EEAdr 

                  bsf              Status,RP0

                  bsf              EECon1,0

                  bcf             Status,RP0

                  movf           EEData,W

                  movwf        DataL

;-----------------------------------------------

                  incf             Add,F

                  movfw        Add

                  movwf        EEAdr 

                  bsf              Status,RP0

                  bsf              EECon1,0

                  bcf             Status,RP0

                  movf           EEData,W

                  movwf        Led3

;-----------------------------------------------

                  incf             Add,F

                  movfw        Add

                  movwf        EEAdr 

                  bsf              Status,RP0

                  bsf              EECon1,0

                  bcf             Status,RP0

                  movf           EEData,W

                  movwf        Led2

;-----------------------------------------------

                  incf             Add,F

                  movfw        Add

                  movwf        EEAdr 

                  bsf              Status,RP0

                  bsf              EECon1,0

                  bcf             Status,RP0

                  movf           EEData,W

                  movwf        Led1

;-----------------------------------------------

                  return

;*******************************

WR_EE      clrf             Add

                  bcf             Intcon,GIE

                  movfw        Add

                  movwf        EEAdr

;-----------------------------------------------

                  movlw         1

                  movwf        EEData

                  bsf              Status,RP0

                  bsf              EECon1,2

                  call             AA55

                  bsf              EECon1,1

                  call             Wait

                  bcf             EECon1,4

                  bcf             Status,RP0

;===========================

                  incf             Add,F

                  movfw        Add

                  movwf        EEAdr

;-----------------------------------------------

                  movfw        Step

                  movwf        EEData

                  bsf              Status,RP0

                  bsf              EECon1,2

                  call             AA55

                  bsf              EECon1,1

                  call             Wait

                  bcf             EECon1,4

                  bcf             Status,RP0

;===========================

                  incf             Add,F

                  movfw        Add

                  movwf        EEAdr

;-----------------------------------------------

                  movfw        DataH

                  movwf        EEData

                  bsf              Status,RP0

                  bsf              EECon1,2

                  call             AA55

                  bsf              EECon1,1

                  call             Wait

                  bcf             EECon1,4

                  bcf             Status,RP0

;===========================

                  incf             Add,F

                  movfw        Add

                  movwf        EEAdr

;-----------------------------------------------

                  movfw        DataL

                  movwf        EEData

                  bsf              Status,RP0

                  bsf              EECon1,2

                  call             AA55

                  bsf              EECon1,1

                  call             Wait

                  bcf              EECon1,4

                   bcf              Status,RP0

;===========================

                  incf             Add,F

                  movfw        Add

                  movwf        EEAdr

;-----------------------------------------------

                  movfw        Led3

                  movwf        EEData

                  bsf              Status,RP0

                  bsf              EECon1,2

                  call             AA55

                  bsf              EECon1,1

                  call             Wait

                  bcf             EECon1,4

                  bcf             Status,RP0

;===========================

                  incf             Add,F

                  movfw        Add

                  movwf        EEAdr

;-----------------------------------------------

                  movfw        Led2

                  movwf        EEData

                  bsf              Status,RP0

                  bsf              EECon1,2

                  call             AA55

                  bsf              EECon1,1

                  call             Wait

                  bcf             EECon1,4

                  bcf             Status,RP0

;===========================

                  incf             Add,F

                  movfw        Add

                  movwf        EEAdr

;-----------------------------------------------

                  movfw        Led1

                  movwf        EEData

                  bsf              Status,RP0

                  bsf              EECon1,2

                  call             AA55

                  bsf              EECon1,1

                  call             Wait

                  bcf             EECon1,4

                  bcf             Status,RP0

;===========================

                  incf             Add,F

                  movfw        Add

                  movwf        EEAdr

;-----------------------------------------------

                  movfw        Led0

                  movwf        EEData

                  bsf              Status,RP0

                  bsf              EECon1,2

                  call             AA55

                  bsf              EECon1,1

                  call             Wait

                  bcf             EECon1,4

                  bcf             Status,RP0

                  movlw         .1

                  movwf        Trig

;===========================

                  return

;*******************************

Wait           btfss           EECon1,4

                  goto            Wait

;-----------------------------------------------

                   return

;*******************************

AA55          movlw         055h

                  movwf        EECon2

                  movlw         0AAh

                  movwf        EECon2

;-----------------------------------------------

                   return

;*******************************

                   end

Бұл бағдарлама құрылымына негіз ретінде Dynamic Display бағдарламасы алынды да, оның жұмысында қалыптастырылатын сандардың жаңартылған мәндерінің EEPROM жадысына уақытылы жазылып отырылуы (қосалқы WR_EE бағдарламасы) қамтамасыз етілді. EEPROM жадысында сақталған деректердің келесі қалыптастырылым алдында оқылуы (қосалқы RD_EE бағдарламасы) бағдарламаның қалыпты жұмысына ешқандай кедергі келтірмейді, бірақ ол бағдарламаның келесі қосылымында кезекті сандардың қалыптастырылымын олардың бұрынғы жеткен мәндеріне сәйкесті жалғастыруға мүмкіндік береді.

Алдыңғы бағдарламада (EEPROM-1) EEPROM жадысына дерек жазылу жұмысына қажетті уақыт мерзімінің қалыптасуын нақтылы мөлшердегі кідіріс тудыру арқылы жүзеге асырғанбыз, ал қазіргі қарастырылып отырған бағдарламада (EEPROM-2) оны жазылымның аяқталу туының көтерілуін күте тұру (қосалқы Wait бағдарламасы) арқылы жүзеге асырылды. Бұған қоса EEPROM жадысына әрбір жазылым алдында, міндетті түрде жүргізілетін, “жалған” EECon2 регистріне 55 және AA сандарын жазу операциялары қосалқы бағдарлама түрінде (AA55 аталымымен) біріктірілді.

2.3.7     Құрама бағдарлама.

Алдыңғы бағдарламаларда әртүрлі қызметке бағытталған құрылғылардың қарапайым PIC16F84A микроконтроллерінің негізінде жұмыс атқаруын ұйымдастыру мүмкіндіктері қарастырылды. Қарастырылған бағдарламалық құрылымдарды ұйымдастыру жолдарын ынтазар оқырман өзінің болашақ құралымдарында жетісті қолдана алады деп үміттенемін (және сенемін). Осындай құралым ретінде жұмысына қарастырылған мүмкіндіктердің бәрі пайдаланылған, келесі құрылғының жұмыс бағдарламасын келтіруді дұрыс деп санадық. Бұл құрылғы (оған берілген техникалық тапсырма ретінде) келесі жұмыстар атқару керек:

-       бағдарлама іске қосылғанда, құрылғы сыртқы түйме арқылы берілетін, басқару сигналын күту режимінде тұру керек;

-       бұл сигнал түскеннен кейін, құрылғы F0 жиілігіндегі импульстер тізбесін (меандр түріндегі) қалыптастыру керек;

-       үзіліс сұранысының түсуімен құрылғы F0 жиілігіндегі импульстер тізбесінің қалыптастырылуын тоқтатып, тыныс аралығының ұзақтығы T болатын импульстер будасының тізбесін қалыптастыру керек;

-       будалардағы импульстер саны (бағдарламаның бірінші қосылымында) N0 санынан (бастапқы мәні) N1 санына дейін (ақырғы мәні) S қадамымен өзгеріп отыру керек;

-       әр будада қалыптастырылатын импульстердің ұзақтығы – T1, ал олардың тыныс T0 болу керек;

-       кезекті импульстер будасы қалыптасып болғаннан кейін, осы будадағы импульстер саны 7-сегментті индикаторларда екіразрядты ондық сан түрінде көрсетіліп, ол келесі будадағы импульстер саны көрсетілгенше сақталу керек;

-       үзіліс сұранысы алып тасталғаннан кейін, құрылғы негізгі жұмыс режиміне қайтып, онда қайтадан F0 жиілігіндегі импульстер тізбесін  қалыптастыру керек;

-       келесі үзіліс сұранысы түскенде, будалардағы импульс саны, алдыңғы үзіліс кезінде жеткен соңғы мәннен (яғни, үзіліс сигналының алып тасталар алдындағы соңғы будадағы) жалғастырылу керек;

-       алдыңғы жағдай (будалардағы импульс санының жалғастырылуы) бағдарлама жұмысы тоқтатылып, одан кейін оның қайта қосылғанында да жүзеге асырылу керек.

Жоспарланған құрылғының, 2.7-кестеде берілген параметрлерге сәйкесті жұмыс бағдарламасы төменде келтірілген.

2.7 к е с т е – Қалыптастырылатын импульстердің параметрлері

F0, кГц

T1, мкс

T0, мкс

T, мкс

N0, ед

N1, ед

S, ед

0,50

30

150

1000

5

23

3

 

;Compose Gadget

;======================

; Microcontroller PIC16F84A

; Clock Frequency 4.0 MHz

;======================

Led0           equ             1Ch

Led1           equ             1Dh

Index          equ             10h

Count                   equ             11h

Temp          equ             12h

Mem           equ             13h

Sec             equ             20h

SecL           equ             21h

SecH          equ             22h

W_T          equ             23h

Stat_T         equ             24h

Num           equ             25h

SecL_T       equ             26h

SecH_T      equ             27h

Num_0        equ             28h

;-------------------------------------

Num_S       equ             .5

Num_E       equ             .23

Del_T         equ             .02

Step            equ             .3

;======================

                  org             0

                  goto            Start

;======================

                  org    4

;**************************

INT            movwf        SecL_T

                  movf           SecH,W

                  movwf        SecH_T

                  movwf        W_T

                  movf           Status,W

                  movwf        Stat_T

                  movf           SecL,W

                  movlw         Num_S

                  movwf        Num

                  movwf        Num_0

;**************************

Pre_N         bcf             Status,RP0

                  clrw

                  movwf        EEAdr 

                  bsf              Status,RP0

                  bsf              EECon1,0

                  bcf             Status,RP0

                  movf           EEData,W

                  movwf        Temp

                  incf             Temp,F

                  btfsc           Status,Z

                  goto            Cont_0

                  movwf        Num

                  movwf        Num_0

;======================

Cont_0        btfsc           PortB,0

                  goto            Int_E

;======================

Cont           clrwdt

                  bcf             PortA,2

                  nop

                  movlw         .49

                  movwf        Sec

Int_0           decfsz         Sec,F

                  goto            Int_0

;-------------------------------------

                  bsf              PortA,2

                  movlw         .8

                  movwf        Sec

Int_1           decfsz         Sec,F

                  goto            Int_1

;======================

                  decfsz         Num,F

                  goto            Cont

                  bcf             PortA,2

;-------------------------------------

                  movlw         .5

                  movwf        Temp

                  movfw        Num_0

                  sublw          Num_E

                  btfsc           Status,Z

                  goto            WR_EE

                  movfw        Num_0

                  addlw          Step

                  movwf        Temp

WR_EE      bcf             Intcon,GIE

                  clrw

                  movwf        EEAdr

                  movfw        Temp

                  movwf        EEData

                  bsf              Status,RP0

                  bsf              EECon1,2

                  movlw         055h

                  movwf        EECon2

                  movlw         0AAh

                  movwf        EECon2

                  bsf              EECon1,1

;-------------------------------------

WR_end     btfss           EECon1,4

                  goto            WR_end

;-------------------------------------

                  bcf             EECon1,4

                  bcf             Status,RP0

;-------------------------------------

                  movfw        Num_0

                  movwf        Temp

                  call             BinDec

;-------------------------------------

                  movfw        Num_0

                  movwf        Temp

                  addlw          Step

                  movwf        Num_0

                  movwf        Num

                  movfw        Temp

                  sublw          Num_E

                  btfss           Status,Z

                  goto            Pause

                  movlw         Num_S

                  movwf        Num_0

                  movwf        Num

;-------------------------------------

Pause          movlw         .120

                  movwf        SecL

Paus           decfsz         SecL,F

                  goto            Paus

;-------------------------------------

                  goto            Cont_0

;======================

Int_E          bcf             IntCon,1

                  movf           SecL_T,W

                  movwf        SecL

                  movf           SecH_T,W

                  movwf        SecH

                  movf           Stat_T,W

                  movwf        Status

                  swapf          W_T,F

                  swapf          W_T,W

                  retfie

;**************************

Start           clrf             IntCon

                  clrwdt

                  bsf              Status,RP0

                  movlw         .1

                  movwf        TrisA

                  movlw         .1

                  movwf        TrisB

                  movlw         .143

                  movwf        Option_Reg

                  bcf             Status,RP0

;-------------------------------------

Cycle          btfss           PortA,0

                  goto            Start

;-------------------------------------

                  bcf             PortB,4

                  movlw         .144

                  movwf        IntCon

;-------------------------------------

                  movlw         .10

                  call             Table

                  movwf        PortB

                  movlw         .2

                  movwf        PortA

                  movlw         .10

                  call             Table

                  movwf        PortB

                  movlw         .1

                  movwf        PortA

                  clrwdt

                  bcf             PortA,3

                  nop

                  nop

                  movlw         .74

                  movwf        SecL

                  movlw         .2

                  movwf        SecH

Basic_0       decfsz         SecL,F

                  goto            Basic_0

                  decfsz         SecH,F

                  goto            Basic_0

;-------------------------------------

                  bsf              PortA,3

                  nop

                  movlw         .61

                  movwf        SecL

                  movlw         .2

                  movwf        SecH

Basic_1       decfsz         SecL,F

                  goto            Basic_1

                  decfsz         SecH,F

                  goto            Basic_1

;======================

                  bsf              PortB,4

                  clrf             IntCon

;-------------------------------------

                  goto            Start

;**************************

BinDec        bcf             Status,C

                  movlw         .8

                  movwf        Count

                  clrf             Led0

                  clrf             Led1

;======================

Loop4         clrwdt

                  rlf               Temp,F

                  rlf               Led0,F

                  decfsz         Count,F

                  goto            adjDEC

;-------------------------------------

                  swapf          Led0,W

                  andlw          0Fh

                  movwf        Led1

;-------------------------------------

                  movfw        Led0

                  andlw          0Fh

                  movwf        Led0

                  goto            Disp

;======================

adjDEC       movlw         Led0

                  movwf        FSR

                  call             adjBCD

;-------------------------------------

                  movlw         LED1

                  movwf        FSR

                  call             adjBCD

;-------------------------------------

                  goto            Loop4

;======================

adjBCD       movlw         3

                  addwf                  0,W

                  movwf        Mem 

                  btfsc           Mem,3

                  movwf        0

;-------------------------------------

                  movlw         30h

                  addwf         0,W

                  movwf        Mem

                  btfsc           Mem,7

                  movwf        0

;-------------------------------------

                  retlw           0

;**************************

Disp           clrwdt

                  movlw         .1

                  movwf        Index

                  movf           Led1,F

                  btfss           Status,Z

                  goto            IndexS

;-------------------------------------

                  decf            Index,F

;======================

IndexS        movlw         .10

                  movwf        PortB

                  call              Table

                  movwf        PortB

                  movlw         .2

                  movwf        PortA

;-------------------------------------

                  clrf             PortA

                  movf           Index,W

                  addwf                  PCL,F

                  goto            Disp0

;-------------------------------------

Disp1          clrf             PortA

                  movf           Led1,W

                  call             Table

                  movwf        PortB

                  movlw         .2

                  movwf        PortA

Disp0          clrf             PortA

                  movf           Led0,W

                  call             Table

                  movwf        PortB

                  movlw         .1

                  movwf        PortA

                  return

;**************************

Table          addwf         PCL,F

;-------------------------------------

                  retlw           b'01111110'

                  retlw           b'00001100'

                  retlw           b'10110110'

                  retlw           b'10011110'

                  retlw           b'11001100'

                  retlw           b'11011010'

                  retlw           b'11111010'

                  retlw           b'00001110'

                  retlw           b'11111110'

                  retlw           b'11011110'

                  retlw           b'00000000'

;**************************

                  end

Симулятор құрамынан шығарылып, бағдарлама зерттеліміне қолданылатын аспап-құралдар 2.9-суретте көрсетілген.

2.9 сурет

 

Әдебиеттер тізімі

1.     Токхейм Р. Основы цифровой электроники: Пер. с. англ. – М.: Мир, 1988.

2.     Токхейм Р. Микропроцессоры. Курс и упражнения: Пер. с. англ. – М.: Мир, 1988.

3.     Бураханова З.М., Шанаев О.Т. Аналогты және цифрлы электрондық құрылғылар / Оқу құралы. – Алматы: АЭИ, 1992.

4.     Бураханова З.М.,  Шанаев О.Т. Электрондық тізбектер / Оқу құралы. – Алматы: АЭИ, 1996.

5.     Бураханова З.М. Дербес ЭЕМ арқылы схемақұралыстық моделдеу / Оқу құралы. – Алматы: АЭжБИ, 1999.

6.     Шанаев  У.Т.  Основы     цифровой    техники / Учебное      пособие.  – Алматы: АГУ, 1999.

7.     Уэйкерли Дж. Ф. Проектирование цифровых устройств: Пер. с. англ. – М.: Постмаркет, 2002.

8.     Хамахер К. И др. Организация ЭВМ. Пер. с. англ. – СПб.: Питер, 2003.

9.     Шанаев О.Т. Electronic Workbench модельдеу жүйесі / казақ және орыс тілдерінде. – Алматы: 2003.

10. Угрюмов Е. П. Цифровая схемотехника. – СПб.: БХВ-Петербург, 2004.

11. Бойко В.И. и др. Схемотехника электронных устройств. Микропроцессоры и микроконтроллеры. – СПб.: БХВ-Петербург, 2004.

12. Сугано Т. Дж., Уидмер Н. С. Цифровые системы. Теория и практика: Пер. с англ. – М.: Издательский дом “Вильямс”, 2004.

13. Шанаев О.Т. Цифрлық құрылғылар және микропроцессорлар: Оқу құралы / Алматы: АЭжБИ, 2009.

14. Шанаев О.Т. Микропроцессорлық жүйелер: Оқу құралы / Алматы: АЭжБИ, 2009.

15. Шанаев О.Т. Микропроцессорлық техника негіздері. 1-бөлім. Зертханалық   жұмыстарды   орындауға    арналған    әдістемелік    нұсқаулар. – Алматы: АЭжБУ, 2011. – 21 б.

16. Шанаев О.Т. Микропроцессорлық техника негіздері. 2-бөлім. Зертханалық   жұмыстарды   орындауға    арналған   әдістемелік    нұсқаулар.  – Алматы: АЭжБУ, 2011. – 21 б.

17. Шанаев О.Т. Микропроцессорлық техника негіздері. 3-бөлім. Зертханалық   жұмыстарды   орындауға   арналған    әдістемелік    нұсқаулар.  – Алматы: АЭжБУ, 2011. – 30 б.

18. Шанаев О.Т. Бағдарламалы құрылымдар: Оқу құралы / Алматы: АЭжБУ, 2011. – 80 б.

 

Мазмұны

Кіріспе  3

1 Микропроцессорлар және микропроцессорлық жүйелер  6

1.1 Микропроцессорлық жүйелердің құрылым принциптері 6

1.2 Intel 8085 микропроцессоры   7

1.2.1 Микропроцессор құрылымы. 7

1.2.2 Микропроцессордың басқару сигналдары. 10

1.2.3 Микропроцессор жұмысының ұйымдастырылуы. 13

1.2.4 Микропроцессордың үзіліс жүйесі. 14

1.2.5 Микропроцессордың тізбекті енгізу/шығару жүйесі. 16

1.2.6 Микропроцессордың командалар жүйесі. 17

1.2.7 Микропроцессорда қолданылатын сілтеу тәсілдері. 20

1.3 Микропроцессорлық жүйе жұмысын бағдарлау  22

1.3.1 Дерек жіберілімдері. 23

1.3.2 Бірбайтты арифметика. 25

1.3.3 Екібайтты арифметика. 27

1.3.4 Көбейту бағдарламасы. 30

1.3.5 Стекпен жұмыс ұйымдастырылуы. 31

2 PIC микроконтроллерлері 34

2.1 PIC микроконтроллерлерінің құрылымы   34

2.2 PIC микроконтроллерлерінің командалар жүйесі 37

2.3 PIC микроконтроллерінің бағдарламалы симуляторы   39

2.3.1 Импульстер тізбесін қалыптастыру. 39

2.3.2 Байланыс сигналын қалыптастыру. 44

2.3.3 Үзіліс арқылы жұмыс ұйымдастырылуы. 53

2.3.4 Есептелмелі ауыстырылымның ұйымдастырылуы. 62

2.3.5 Динамикалы шығарылым. 69

2.3.6 EEPROM жадысымен жұмыс ұйымдастырылуы. 79

2.3.7 Құрама бағдарлама. 96

Әдебиеттер тізімі 105