Функции на
програмна памет, паметта за данни, стека и програмния броячКратко представяне на микроконтролерите:
Работата на микроконтролера е да получава, обработва и предава информация, също така съхранява информацията за изпълнението на даден алгоритъм. Той казва на всички механизми (двигателчета, светодиоди, дисплеи и тн.) кога какво да правят, като получава информация как да управлява тези механизми от програмата заложена в неговата памет.
За да сте наясно с означенията ще ги разясня преди да почна да обяснявам. За да покажем че дадено число е в дадена бройна система ще използвам 2 начина. Единият е с главна буква пред самото число ето така:H-heximal 16, B-binary 2, D-decimal 10. Например числото А1 е в 16бройна система и ще го означаваме така H'A1', числото 100110 е в двоична броина система: B'100110'. Вторият начин е като след числото с малка буква означим бройната система. Напр. A1h, 100110b, 256d.
Под програма се има на предвид инструкции изпълнени по определен ред(алгоритъм)
Как работи МК:
МК изпълнява инструкции, кото са съхранени в паметта му. Всички инструкции се изпълняват за едно и също време, което зависи от самия контролер и най-вече от честотата която ние подаваме. Да приемем че подаваме на контролера честота 4MHz, периода на тази честота ще бъде T=1/F , тоест T=1/4000000Hz T=0,00000025 секунди (250ns), за да получим периода за които ще се изпълни една инструкция трябва да умножим периода на подаваната честота по 4: 250ns * 4 = 1us(микро секунда). От това следва че за 1s МК ще изпълнява 1милион инструкции:shock: . Така се определя и скоростта на процесора, тя се измерва във милиони инструкции за секунда - MIPS. На МК PIC16F84A можем да подаваме честота максимум 20MHz, тоест МК ще изпълнява 5MIPS(има и доста по-бързи)
Елементи на микроконтролерите:
Главните елементи без които не може да работи МК са:
Програмна паметВ програмната памет се записва програмата която ще изпълнява процесора. Представете си я като една страница с редове.
(паметта е долната част на картинката от 0000h до 1FFFh, а отгоре са стека и програмния брояч PC- program counter. Нас ни интересува само бялото поле от 0000h до 3FFh)
Всеки ред(дума) се състои от 14 бита. Един бит може да е 1 или 0. Информацията, която може да се съхранява в 1 ред(дума) може да изглежда например така: 00011101001100
Всеки дума си има адрес, които представлява шестнадесетично число.
Например първия ред има адрес H'0000'(относно това H прочети по-горе). В един ред може да се съхранява една инструкция. На картинката са показани 2 специални вектора(думи, редове). Те са със адрес 000h и 0004h, във тях ще се съхраняват инструкциите, които ще се изпълнят при определени ситуации. В нашия МК имаме на разположение 1К(1024) думи. Следователно нашите програми може да са дълги максимум 1024 инструкции. Както казах всяка дума си има адрес, като на последната адреса е : 3FFh, а например на 20 адреса е : 14h.
Съвместна работа на програмния брояч, стека и програмната памет.Процесора изпълнява по 1 инструкция едновременно, тоест не може да изпълнява по 2, именно ПБ казва на процесора коя да е тази инструкция. Програмния брояч(ПБ) извлича подред всички инструкции, като започне от адрес 0000h. По този начин се постига последователност на програмата. Тази последователност може да бъде разкъсана чрез определени инструкции. Това става чрез стека. Да приемем че на адрес 0010h има инструкция CALL H'00A0', това означава че трябва да се изпълни инструкция на адрес 00A0h, следователно в ПБ трябва да се извлече инструкцията съхранявана на адрес 00A0h. В това няма проблем, но преди да заредим инструкцията на въпросния адрес трябва да запишем някъде докъде е стигнало изпълнението на програмата преди да сме извикали инструкция CALL H'00A0', за да не се получава прекъсване на програмата. Адреса точно след инструкция CALL H'00A0' трябва да бъде записан в стека, зада може след това да се върнем на него. В нашия случай стека може да съхранява до 8 такива адреса. Това означава че ще можем да правим 8 прекъсвания на текущата програма и после да се връщаме във всяка предишна докато не стигнем до началната. Ако сега не ви се е изяснила работата на стека при описанието на инструкциите ще я разберете.
Памет за данни(RAM)В Паметта за данни се съхраняват стойности, необходими за изпълнението на програмата(променливи). В PIC16F84A тази памет е реализирана в 2 банки(банка0 и банка1)
Представете си отново листа. Този път са 2 листа(2 банки). При тях всеки ред е един регистър от 8 бита(1байт) 8 битова дума, докато при програмната памет беше 14 битова дума. Тези регистри се адресират по същия начин, като думите от програмната памет, като тук трябва преди да се обърнем към даден адрес да посочим в коя от двете банки се намира нашия регистър(на картинката не е точно така, по-нататък ще разберете). За да конфигурираме нашия контролер да работи както ние искаме трябва някъде да съхраняваме нашите настройки, това може да е например дали даден извод да е вход или изход. Нашите настройки и друга важна информация за работата на МК се съхранява в специални регистри, които се намират в паметта за данни. Това са регистрите с адреси 00h - 0Ch и в двете банки, някои от тях са STATUS, PORTA, TRISA(вижтеги на картинката). Тези специални регистри се означават с SFR, а останалите достъпни за потребителя - регистри с общо предназначение или GPR. В нашия МК имаме 80 регистъра, 12 от кото са резервирани за SFR. Останалите 68 регистъра(от 0Ch до 4Fh) са на разположение за потребителя. В тях той може да съхранява различни стойности, кото са нужни за функционирането на програмата. Относно адресирането. Когато се обръщаме към SFR регистър трябва преди да извлечем информацията от адреса да посочим в коя банка е регистъра. Например ако преди сме работили с банка 1 и без да сме избрали банка 0, ако се обърнем към регистър PORTA, ще получим съобщение за грешка. По-нататък ще обясня функцията на всички SFR регистрите.
Но паметта за данни има един недостатък. За разлика от програмната памет паметта за данни е енергозависима, тоест когато МК не работи информацията съхранявана в паметта се изтрива. Затова трябва всеки път преди да започне изпълнението на главната програма трябва да конфигурираме МК. Ако се нуждаем от някаква информация, която да е достъпна винаги, можем да използваме енергонезависимата памет EEPROM. За нея и останалите неща по-нататък в темата.