ҚАЗАҚСТАН РЕСПУБЛИКАСЫНЫҢ БІЛІМ ЖӘНЕ ҒЫЛЫМ МИНИСТРЛІГІ
“Алматы энергетика және байланыс университеті”
коммерциялық емес акционерлік қоғамы
О.Т. Шанаев
МИКРОКОНТРОЛЛЕРЛЕР. СИМУЛЯТОРЛАР
Оқу құралы
Алматы 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) арқылы орындап, олардың жұмысын тексеру бағдарлама құрамындағы командалардың жұмысын түсінуге толық мүмкіндік береді.
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 сурет
Келесі 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 арқылы анықталатын өзге жолын жүзеге асырады.
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.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 таймерінің артына қосуға болады. Біздің құрылғыда сыртқы тактілік сигналдар жоқ, демек алғы бөлгішті 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 аталымымен) біріктірілді.
Алдыңғы бағдарламаларда әртүрлі қызметке бағытталған құрылғылардың қарапайым 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 б.
Мазмұны
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.2 Бірбайтты арифметика. 25
1.3.3 Екібайтты арифметика. 27
1.3.4 Көбейту бағдарламасы. 30
1.3.5 Стекпен жұмыс ұйымдастырылуы. 31
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