Во овој туторијал ќе објаснеме што всушност претставува микроконтролерот и како се употребува.
Во овој туторијал ќе бидат употребени поедноставувања кои на некои експерти во таа област ќе им изгледаат неточно но ќе бидат ставени овде само заради полесно учење на оваа тема.Микроконтролерите се дигитални или дигитално/аналогни (хибридни) интегрирани кола кои содржат во себе микропроцесор, меморија и некои други периферни влезно/излезни кола како на пример А/Д (аналогно-дигитални) конвертори, компаратори (споредувачи на напон), тајмери, бројачи и друго. Микроконтролерите можат да работат и без додатни електронски компоненти што би значело дека се самостојни (компјутер во чип) и за нив не секогаш е потребна „матична плоча“ за да работат.
Постојат повеќе видови и производители на микроконтролери. Постојат 4 битни, 8 битни, 16 битни и 32 битни микроконтролери во зависност од тоа колку битен микропроцесор содржат во нив и за каква намена е изработен. Бидејќи 4 битните микроконтролери веќе не се користат (беа користени порано во видео-рекордерите) ние во овој туторијал ќе се запознаеме со 8 битен микроконтролер од производителот Microchip со ознака PIC16F628.
Прво нешто што треба да го направите доколку сакате да работите со одреден микроконтролер е да го спуштите неговиот Datasheet (техничкиот документ) за тој микроконтролер. За овој туторијал линкот кон Datasheet-от на PIC16F628 можете да го превземете од овде:
http://ww1.microchip.com/downloads/en/DeviceDoc/40300C.pdf
Од овој документ на страна 3 можеме да ги прочитаме карактеристиките за овој микроконтролер кој има:
- од 0 до 20MHz брзина на работа;
- Вграден самостоен осцилатор од 4MHz (не е потебен надворешен кварц кристал);
- простор за 2048 инструкции (наредби) во неговата Flash меморија (3.5KB);
- 224 бајти RAM меморија;
- 18 пинови од кои 16 влезно/излезни пинови и 2 за напојување;
- можност за прекини (interrupts);
- 2 компаратори;
- PWM модул;
- 3 бројачи (тајмери);
- Сериски порт.
Од истиот документ на страна 4 се прикажани сите пинови на овој микроконтролер обележани (со скратеници) сите функции на секој од пиновите:
Во случајов RАх и RВх се влезно/излезни пинови, АNх - аналогни влезови, Тххх - Влезови за тајмерите, Rx и Tx - влез и излез за серискиот порт. Vss е - (минус) на напојувањето а Vdd е + (плус) на напојувањето кое може да изнесува од 2 до 6 волти. Понекогаш повеќе влезно-излезни единици делат ист физички пин и изборот кој од овие единици ќе работи се подесува со помош на регистрите (за ова подоцна).
RAx и RBx се викаат уште и портови и се поделени на групи од 8 (еден бајт). На овој микроконтролер постојат два порта (порт А и порт B) но има микроконтролери кои имаат повеќе пинови и повеќе портови. Влезно-излезните пинови на портовите може максимално да дадат 20mA, имаат заштита од пренапон и поднапон (влез поголем од 5V и помал од -0.7V и преголема струја) но сепак треба да се внимава да не се надмине оваа влезна или излезна струја за да не се уништи пинот. Аналогните влезови се користат за мерење на аналогни величини (на овие пинови има А/D конвертор кој може да биде исчитан како број).
Значи, во глобала главната цел на микроконтролерот е контрола на неговите пинови која се прави со програма. Програмата може да биде напишана во Асемблер или во C програмскиот јазик. Во овој туторијал ќе опишеме програмирање на микроконтролерот во Асемблер за да бидеме поблиску до самиот хардвер и за побрза работа.
Најпроста програма во Асемблер за овој микроконтролер е дадена на следниот листинг:
bsf STATUS,RP0
bcf TRISA,0
bcf STATUS,RP0
bsf PORTA,0
Оваа програма вклучува да свети LED диода поврзана на пинот 17 (RA0).
За да може воопшто да разбереме што значат различните делови од оваа асемблерска програма прво мора да се објасни што е што. Во програмата со мали букви се напишани Асемблерските наредби наречени директиви или мнемоници додека со големи букви се напишани имињата на регистрите и битовите. Регистри се мемориски локации кои постојат во внатрешната меморија на микроконтролерот и со промена на нивната содржина може да се променуваат излезите на микроконтролерот, да се вклучуваат/исклучуваат периферни единици (како компаратори и тајмери) и да се читаат вредности од А/D конверторот. Овој тип на микроконтролери или два типа на регистри - регистер W (кој е еден, фиксен и внатрешен и се употребува како регистер при пресметки и проверки на вредноста на други регистри) и регистри од типот F (регистри за општа намена). За полесна работа регистрите од типот F за овој микроконтролер се дефинирани со имиња наместо со нивната физичка мемориска адреса. Во datasheet-от на микроконтролерот може да се види кој регистер како се вика и на која физичка адреса се наоѓа.
Во нашата програма f регистерот PORTA е всушност регистерот кој ја контролира состојбата на пиновите на портот А. со впишување на вредности (бинарни) нули и единици на секој од осумте битови на овој реситер се сетираат излезите RA0-RA7 на портот А да бидат единици или нули. Наредбата bsf е наредба за сетирање на бит (bsf - bit set f) на даден регистер. Токму ова го прави оваа линија на код во нашата програма за да ја вклучи LED диодата поврзана на пинот 17 (портот А, прв пин - RA0):
bsf PORTA,0
Но зошто нашата програма има 4 реда код а не само овој ред? Бидејки имаме проблем, имено, кога се вклучува микроконтролерот тој е само-подесен сите портови да бидат конфигурирани како влезови поради сигурност (на пример за да не тргне машината додека микроконтролерот не е спремен за извршување на програмата). Значи мораме да го подесеме портот А да биде излез а не влез. Тоа се прави преку подесувачки регистер наречен TRISA (за портот А) и TRISB (за портот В). Во datasheet-от пишува дека со впишување на нула на одреден бит на овој регистер одреден пин од портот станува излез, што значи дека единицата која автоматски овој регистер ја добива на старт треба да ја направиме да биде нула. Затоа е наредбата:
bcf TRISA,0
bcf (bit clear f) на првиот бит (бит 0).
Но сепак имаме 4 линии код а не две, што е проблемот? Проблемот е што кај овој микроконтролер сите регистри не се на иста мемориска страна (memory page). Во datsheet-от стои дека одредени регистри се наоѓаат на страна 0, други на страна 1 итн. За несреќа, регистерот за контрола на насоката на пиновите (дали да се влезови или излези) се наоѓа на страната 1 додека регистерот за контрола на портот се наоѓа на страната 0. Па затоа со сетирање на битот RP0 (името на битот е предефиниран и е наречен RP0) во регистерот STATUS (регистер за контрола и проверка на работата на микроконтролерот) ја вклучуваме мемориската страница 1. со негово нулирање ја враќаме мемориската страница 0. Па сега, веројатно е сосема јасна нашата кратка програма и сите нејзини редови:
bsf STATUS,RP0
bcf TRISA,0
bcf STATUS,RP0
bsf PORTA,0