Voved-vo-mikroprocesorite-i-mikrokontrolerite
July 27, 2017 | Author: nakovz | Category: N/A
Short Description
Download Voved-vo-mikroprocesorite-i-mikrokontrolerite...
Description
Вовед во Микропроцесорите и Микроконтролерите
ВОВЕД ВО МИКРОПРОЦЕСОРИТЕ И
МИКРОКОНТРОЛЕРИТЕ
1
Вовед во Микропроцесорите и Микроконтролерите
Содржина
Предговор........................................................................................................................................ 3 1 Основи на микропроцесорските системи ................................................................................. 4 2 Бинарен – начин на кој микропроцесорите пресметуваат .................................................... 10 3 Хексадецимално – начин на кој ние комуницираме со микропроцесорите ....................... 25 4 Како микропроцесорите пресметуваат ................................................................................... 36 5 Вовед за логичките порти и нивното користење .................................................................... 46 6 Регистри и мемории .................................................................................................................. 58 7 Микорпроцесорски базиран систем ........................................................................................ 79 8 Типичен 8 битен микропроцесор ............................................................................................. 91 9 Програмирање – користејќи машински код и асемблер ..................................................... 111 10 Јазици на повиско ниво ......................................................................................................... 121 11 Развој на микропроцесорите и микроконтролерите ......................................................... 137 12 Фамилија Pentium .................................................................................................................. 157 13 PowerPC .................................................................................................................................. 167 14 Athlon XP ................................................................................................................................. 175 15 Микроконтролери и како да ги користиме ......................................................................... 180 16 Употреба на PIC микроконтролер во реален проект .......................................................... 199 17 Интерфејсинг .......................................................................................................................... 212 18 Опрема за тестирање и изнаоѓање на грешките ................................................................ 231 Додаток А: датотека на регистерот за специјални функции ................................................... 241 Додаток Б: Инструкционо множество за PIC16CXXX................................................................ 242 Одговори на квизовите .............................................................................................................. 244
2
Вовед во Микропроцесорите и Микроконтролерите
Предговор Првото издание на оваа книга започнува со зборовите: „Едно модерно општество повеќе не може да функционира без микропроцесорот.“ Ова е со сигурност сеуште точно, но е уште поточно ако го додадеме и микроконтролерот. Додека микропроцесорот се наоѓа во срцето на нашите компјутери, со голема доза на публицитет, микроконтролерот тивко го води остатокот од нашиот свет. Тие ги споделуваат нашите домови, нашите возила и нашиот работен простор, и ни „пеат“ од нашите честитки. Тие се нашите постојани, невидливи придружници и милјарди се инсталираат секоја година со мал или без никаков публицитет. Целта на оваа книга е да даде лесен вовед за микропроцесорите и микроконтролерите. Започнува од почетокот, и не бара никакво предзнаење за микропроцесорите или микроконтролерите и, со нежен чекор, го предава знаењето неопходно за да се преземат оние витални први чекори во светот на микрото. Џон Крисп
3
Вовед во Микропроцесорите и Микроконтролерите
1 Основи на микропроцесорските системи Раѓањето на микропроцесорите Во 1971 две компании, и двете од САД, го запознаа светот со нивната иднина, со производство на микропроцесорите. Toa беа две млади компании со назив Intel и нејзиниот ривал, Texas Instruments. Микропроцесорите како и најзините плодови, микроконтролерите, требаше да навлезат во секоја земја, во секаков вид на производство, и во речеси секој дом во светот. Тешко дека постои човек на светот кој не поседува или не знае нешто што е базирно на овие уреди. А необично е тоа што малкумина можат да ни дадат некаков одговор на едноставното прашање „Што е микропроцесор?“. Ова прашање, и прашањето „Како работат микропроцесорите?“ се две прашања што се почетни точки за оваа книга.
Да поченеме со разгледување на системот Зборот „систем“ се користи за да ни опише некоја организација или уред кој вклучува три карактеристики. Системот, мора да има најмалку еден влез, еден излез и мора да извршува нешто, на пр.: мора да содржи некој процес. Најчесто има повеќе влезови и излези. Некои излези ни се потребни, а некои пак ни се вишок (продукт). Во поголема или помала мера, сите процеси генерираат вишок топлина. Слика 1.1 ни ги покажува тие услови (карактеристики).
Слика 1.1 Суштински потреби на системот
Голем опсег на различни уреди се среќаваат со овие едноставни услови. На пример, автомобилот најчесто користи бензин, вода за ладење и батерија (акумулатор) за да го стартува моторот и за светлата и за шал таблата. Негов процес е да согорува бензин, со што ќе издвојува енергија за да може да пренесува луѓе и било какви други потреби. Излези ни се саканото движење на автомобилот и несаканото загадување како што се издувните гасови, топлина, испарување на водата и бучавата. 4
Вовед во Микропроцесорите и Микроконтролерите Автомобилот може да соджи и други системи во себе. На слика 1.2, додадовме напојување (батерија) за потребниот влез за стартување на моторот, за произведување на светлина и за шал таблата, но отпосле акумулаторот повторно се полно со помош на моторот. Потребно е електричен систем за работа, како на слика 1.3, значи очигледно е дека можно е еден систем да имаат вградено во него неколку помали системи. Во истиот контекст, автомобилот е само дел од системот за транспорт.
Слика 1.2 Секојдневен систем
Микропроцесорски систем Како и секој друг систем, така и микропроцесорот има влезови, излези и процес како што е прикажано на слика 1.4. Влезовите и излезите од микропроцесорот се серија на напони кои можат да се искористат за контролирање на надворешни уреди. Процесот се состои од анализирање на влезните напони и така да одлучи за потребните излезни напони. Одлуката се базира на претходно внесени инструкции кои се извршуваат доста слепо, свесно или не.
Слика 1.3 Полнење на акумулаторот (батеријата)
5
Вовед во Микропроцесорите и Микроконтролерите
Слика 1.4 Микропроцесорски систем
Негов и нејзин отварач на гаражната врата Еве мала задача која едноставен микропроцесор може да ни ја реши за нас. Кога жената пристигнува со нејзиниот автомобил, автомобилот испраќа светлосен сигнал до сензорот на гаражата и само нејзината врата ќе се отвори. Кога мажот пристигнува дома, исто и неговиот автомобил испраќа светлосен сигнал на истиот сензор, но овој пат се отвара само неговата врата, додека вратата на жената останува затворена. Автомобилите испраќаат различна секвенца на светлосен сигнал до сензорот. Сензорот на светлина ја конвертира светлината во електрични напонски импулси кои се препознаени од микропроцесорот. Излезниот напон го контролира електричниот мотор кој е поставен на соодветната врата. Целата шема е прикажена на слика 1.5. Сега со модерните микропроцесори, лесно е со мал број на измени да може да се зголеми бројот на автомобили и гаражи со цел да ги опфати сите автомобили и гаражи произведени досега. Поврзувањето на сите жици, останува друг проблем!
Слика 1.5 Отворање на вратата на десната гаража
6
Вовед во Микропроцесорите и Микроконтролерите
Физички изглед на микропроцесорот Микропроцесорот е многу мало електронско коло, типично 12 милиметри попречно. Лесно се оштетува од влага и абразија, па затоа најчесто е затворен во пластично или керамичко куќиште. За да се овозможи електрично поврзување директно со колото, конекторските пинови се слеани во самото куќиште на микропроцесорот кои влегуваат во џебови од главната плоча. Големината, формата и бројот на пинови на микропроцесорот зависи од големината на податоците за кои е дизајниран да ги обработува. Типичен микропроцесор е прикажано на слика 1.6.
Слика 1.6 Типичен микропроцесор
Терминологија Интегрирани кола Елктронско коло произведено од компактен блок на полупроводнички материјал, ваквиот дизајн на коло, наречено полупроводничко коло, ни дозволува многу комплексните кола да ги конструираме во мали размери. Интегрираното коло се наракува и „чип“.
Микропроцесор (µP) Ова е уредот којшто ти го купуваш: само интегрирано коло како на слика 1.6. Самиот, без околните кола и без доведениот напон, тој ни е некорисен. Тој само ќе лежи на твојата работна маса и ќе гледа во вас.
Микропроцесорски базиран систем Ова е секој систем кој содржи микропроцесор, и нема никаква потреба нешто да пресметува. Всушност, и покрај тоа, компјутерите користат само мал дел од произведените микропроцесори. Нашиот систем, отварање на гаражната врата, претставува
7
Вовед во Микропроцесорите и Микроконтролерите микропроцесорски базиран систем, понекогаш наречен микропроцесорски контролиран систем.
Микрокомпјутер Дел од микропроцесорски базиран систем кој се користи како компјутер се вика микрокомпјутер. Додатни кола се потребни за да може да биде составен компјутер во истото интегрирано коло кој прераснува во единствне чип-микрокомпјутер.
Микроконтролер Претставува комплетно микропроцесорски базиран систем за контрола заснован на еден единствен чип. Тоа е мал и удобен, но не прави ништо посебно што не може да биде направено со микропроцесор и уште неколку додатни компоненти. Подетално ќе има во подолните заглавја од книгата.
MPU и CPU MPU (MicroProcessor Unit) e микропроцесорска единица или само микропроцесор. CPU (Central Processing Unit) претставува централна процесинг единица. Ова е централниот „мозок“ на компјутерот и е составен (вообичаено) од еден или повеќе микропроцесори. IBM-овиот суперкомпјутер „Blue Gene“ е дизајниран од милион процесори.
Микро (Micro) Зборот „микро“ се употребува во електрониката и генерално во науката, што означува „милионити дел“ или 1 10. Исто така се употербува и во секојдневието како нешто многу мало, како многу мал процесор или микропроцесор. Така стана кратенка за микропроцесор, микрокомпјутер, микропроцесорски базиран систем или микроконтролер, всушност скоро сè што во својот збор содржи „микро“. Во научна смисла, зборот микро е прикажано со Грчката буква µ (ми). Тоа е мал чекор кога микропроцесорот се заменува со скратеницата µP. Можно е да настанат некакви забуни додака не се прецезира за што точно се употребува. Квиз 1 Во секој случај, одбери го најдобриот одговор. 1. Микропроцесор: a. Има потреба од гориво, вода и струја b. Или скратено µc. c. Најчесто е спакуван во пластично куќиште d. Никогаш не се употребува во CPU, но може да се користи во MPU. 2. Системот мора да има: a. Влез, излез и процес b. Нешто да прави во врска со транспорт c. Микропроцесор d. Гориво, вода и струја 8
Вовед во Микропроцесорите и Микроконтролерите 3. Сите системи генерираат: a. Движења b. Чипс c. Задушувачка топлина d. Издувни гасови 4. MPU: a. Е исто што и µP b. Може да биде направен од повеќе од една CPU c. Е мал, единствен чип компјутер d. Е скратеница за Main Processing Unit 5. Интегрираните кола не се: a. Нарекуваат чипови b. Употребуваат за изградба на микропроцесорски базирани системи c. Полупроводнички кола d. Потребен дел од мотор
9
Вовед во Микропроцесорите и Микроконтролерите
2 Бинарен – начин на кој микропроцесорите пресметуваат За разлика од нас, микропроцесорите не се „пораснати“ со идеја дека 10 е конвенционален број на дигити. Микропроцсорите и други дигитални кола користат само два дигити – 0 и 1 – но зошто? Ние би сакале нашите микропроцесори да ги завршуваат своите работи бескрајно брзо и никогаш да не прават грешки. Без грешки, или, големи брзини – што ви се чини побитно? Тоа е ваш избор, но јас секогаш би избрал без грешки, особено кога мојот автомобил е управуван од компјутерот за менаџирање на моторот или кога станува збор за полуавтоматско слетување на авион. Мислам дека повеќето би се согласиле со мене. Да погледнеме еден ефект од наговарувањето микропроцесорот да пресметува како нас.
Проблем со шумот Нека влезот на микропроцесорот е константен напон, на пример 4V, прикажано на слика 2.1.
Слика 2.1 Константен напон
Ако извршиме мерење на напонот ќе видиме дека немаме константна вредност, туку континуирано варира над и под главното ниво. Оваа случајна флуктација се нарекува електричен шум и ги намалува перформансите на секое електронско коло. Можеме да превземеме некои мерки за да го намалиме овој шум, но целосно да го анулираме е невозможно. Шумот предизвикува случајни дамки на екран, тоа го нарекуваме снег. Истиот ефект предизвикува шуштење од звучникот. Ефектот на шумот е прикажан на слика 2.2. Повеќето микропроцесори користат напојување од 5V или 3.3V. За полесна аритметика ние би разгледувале систем кој се напојува со 5V. Ако го наговориме микропроцесорот да брои од 0 до 9, како што ние броиме, користејќи го напојувањето од 5V би добиле 0.5V за дигит: 10
Вовед во Микропроцесорите и Микроконтролерите
Слика 2.2 Напон со шум
0=0V 1 = 0.5 V 2=1V 3 = 1.5 V 4=2V 5 = 2.5 V 6=3V 7 = 3.5 V 8=4V 9 = 4.5 V Ако му дадеме инструкција на нашиот микропроцесор да изврши задача 4 + 4 = 8, со притискање на копчето „4“ ние ќе генерираме сигнал од 2V кој е запомнат од микропроцесорот. Копчето „+“ ќе му каже дека се работи за собирање и повторно притискање на копчето „4“ ќе генерира друг сигнал од 2V. Така, внатре во процесорот ќе видиме дека треба да собери 2V и уште еден сигнал од 2V, и да добиеме резултат 4V. Тогаш микропроцесорот ќе ја искористи листата погоре за да го конвертира крајниот резултат во потребниот бројчен резултат 8. Овој едноставно собирање е прикажано на слика 2.3. Ова ни изгледа дека работи многу убаво, но го игнориравме ефектот на шум. Слика 2.4 ни покажува што може да се случи. Точниот напон мемориран од микропроцесорот е прашање на случајност. Со првото притискање на копчето „4“, се случило напонот да е 1.5V но вториот пат сме имале малку повеќе среќа и напонот ни е точно 2V.
Слика 2.3 Работи! 4 + 4 навистина е 8
11
Вовед во Микропроцесорите и Микроконтролерите
Слика 2.4 Шумот може да предизвика проблеми
Внатре во микропроцесорот имаме: 1.5 V + 2 V = 3.5 V и со коритење на табелата, за 3.5 V имаме број 7. Така нашиот микропроцесор пресметува дека 4 + 4 = 7! Бидејќи шумот е случаен, можно е, се разбира, крајниот резултат да ни е многу мал, многу голем или потполно точен.
Комплетно отстранување на електричниот шум Извинете, само сонувам. Не е возможно. Некои мали делови – како компоненти на електрицитетот, наречени електрони, се движаат во случаен ред во зависност од околната топлотна енергија. Кај проводниците, електроните се многи подвижни и доведува до некаков тип на електрично полнење кое го нарекуваме негативно. Резултантното негативно полнење е
Слика 2.5 Шумот може да предизвика проблеми
12
Вовед во Микропроцесорите и Микроконтролерите баланс помеѓу еднаквиот број на фиксирани делови наречени протони, кои доведуваат до позитивно полнење. (види слика 2.5)
Слика 2.6 Генерирање на случаен напон
Севкупниот ефект на подвижноста на електрони е слично со случајната навала на луѓе која се прави при чекање, пред стадион, пред да започне некој голем натпреваар. Ако, во некој дел од времето, се погоди да има повеќе електрони, или негативно полнење, кои се движат кон левата страна од парче материјал тогаш тој крај ќе биде повеќе негативен, прикажано на слика 2.6. Момент подоцна, спротивниот резултат може да се појави и тој истиот дел да стане повеќе позитивно наелектризиран (слика 2.7). Ваквиот ефект произведува некој мал случаен напон во секој проводник.
Слика 2.7 Сосема е ист и спротивниот ефект
13
Вовед во Микропроцесорите и Микроконтролерите
Топлински шум Колку е повисока температурата, толку се поподвижни електроните, т.е. имаме поголем случаен напон, а со тоа поголема е појавата на електричен шум. Решение:
Висока температура = повеќе шум
Следи:
ниска температура = помалку шум
За да го намалиме шумот можеме, целиот систем да го ставиме во многу ладно опкружување, на пример со ставање во течен азот (околу -2000C) или да го носиме системот во вселената каде температурате е околу -2690C. Ниската температура во вселената направила убави услови, со низок шум за колата, како што е телескопот Hubble. На Земјата повеќето микропроцесори работат на собна температура. Непристојно би било, ако не спомнеме колку е скапо за да се опкружат нашите микропроцесори со течен азот.
Поделен шум Да се навратиме на големиот натпревар. Најпосле две врати се отворени и фановите се втурнуваат низ рампите. Се очекува еднаков број на луѓе да влегуваат низ влезовите како што е прикажано на слика 2.8, но во реалноста тоа не е така. Некој ќе неможе да си го најде билетот, другарите ќе се чекаат еден со друг, некој ќе се обиде да се врати назад преку вратата за да стигне до другиот крај на стадионот итн. Како што прикажавме, протокот од луѓе може да биде еднаков за еден час, но ако гладаме секунда по секунда ќе се појават случајни варирање. Електроните не ги губат своите билети, но случајниот ефек на температурата, напонот и интеракцијата помеѓу соседните електрони дава многу сличен ефект.
Слика 2.8 Фанови влегуваат во стадион
Еднонасочна струја, на пример 1 А може да се подели на две струи од по 0.5 А, кога ќе се разгледуваат на подолг рок, но ако се разгледа повнимателно, секој ќе содржи случајни варијации (флуктации). Ваквиот електричен ефект се нарекува поделен шумот или ефект на делба. Севкупниот ефект е сличен како топлинскиот шум и ќе предизвика премногу шум кој ќе влијае врз правилата за користење на декадниот систем.
14
Вовед во Микропроцесорите и Микроконтролерите
Колку шум можеме да толерираме? 10-прстниот систем ние го нарекуваме „децимален“ систем. Видовме дака за напојување од 5V, за да го прилагодиме 10 дигитниот систем тогаш за секој дигит ќе имаме оделни 0.5 V, или пак ако користиме систем од 3.3 V, тогаш еден дигит ќе треба да има одделни свои мали 0.33V. Прашање: Со користење на 5 V напојување за декаден систем, колкава би била толеранцијата на највисокиот шум на напонот? Одговор: Секој дигит е одделен со само 5 V/10 = 0.5 V. На пример бројот 6 ќе има вредност од 3 V, а бројот 7 ќе биде претставен со 3.5 V. Ако шумот на напонот го зголеми напонот од 3 V над 3.25 V, тогаш ќе настане до грешно читање и ќе се прочита 7. Највисокото прифатливо ниво на шум би било 0.25 V. Ова не е толку многу и грешките ќе бидат чести. Доколку користиме напојување од 3.3 V тогаш ситуацијата ќе биде уште полоша. Тогаш зошто едноставно не го зголемиме оперативниот напон, да кажеме на 10 V, или 100 V? Повисок напон ќе доведе до намалување на проблемот со помалку саканот електричен шум. Ова е точно, но со зголемување на напојувањето, ќе ни треба подебела инсталација со што ќе ни ја зголеми визичката големина на микропроцесорот и ќе ни ја намали брзината. Повеќе за ова во Глава 11.
Употреба на само два дигити Ако го намалиме бројот на дигити, тогаш би можела да гористиме пошироки опсези на напонот за секоја вредност и тогаш појавата на грешки предизвикани од шумот ќе се намалат. Имаме изберено да користиме само два дигити, 0 и 1, за да обезбедиме максимален степен на сигурност. Подобрување можеме да постигнеме со обезбедување на безбедносна зона помеѓу секој напон. Наместо за напојување од 3.3 V, едноставно користиме долната половина за да ни претставува 0, а горната половина 1, нас да ни биде долната третина 0 а горната третина 1 како што е прикажано на слика 2.9. Ова значи дека нивоата на шум би биле најмалку 1.1 V (една третина од 3.3 V) за да го дотурка нивото на 0 дигитот до минималната вредност од нивото за 1.
Слика 2.9 Подобар избор на напонски нивоа
15
Вовед во Микропроцесорите и Микроконтролерите
Како ние броиме? Нормално, ние броиме со помош на систем наречен „декаден“. Почнуваме од 0, потоа 1, па некој нов симбол 2 кој го викаме „два“ итн. Ова набројување трае се додека ни снема симболи. За сега, тоа изгледа вака: 0 1 2 3 4 5 6 7 8 9
Дотука, еднаш ги искористивме сите симболи, и за да го покажаме тоа ние ставаме „1“ на лево од бројот и повторно ги употребуваме истите симболи. Тоа ни дава: 10 11 12 13 14
... итн. Се до 19, каде ставаме „2“ на левата страна и почнуваме повторно 20, 21, 22 итн. Кога ќе стигнеме до 99, повторно додаваме „1“ од левата страна и другите дигити ги враќаме на нула што ни дава 100. Кога ќе стигнеме до 999, одиме на 1000 итн. Броењето не е лесно. Најчесто го зимаме здраво за готово, но ако се навратиме во почетните денови од нашето школување, на учителите им беа потребни повеќе година за да не научат. Така броењето е потешко од микропроцесорите (досега ги назначивте како тешки!).
Основните основи за оснавата Оснавата на бројниот систем е број на различни симболи кои се користат во тој систем. Во декадниот систем, ние користиме 10 различни симболи, 0...9, каде другите броеви како 28657, едноставно се комбинација на тие основни 10 симболи. Бидејќи декадниот систем користи 10 дигити, се вели дека системот има основа 10. Оснавата ни претставува само технички збор кој ни означува за бројот на дигити кои се користат во било кој броен систем.
16
Вовед во Микропроцесорите и Микроконтролерите
Броење само со два прста Можеме да броиме користејќи ја било која основа. Во декадниот систем, користиме основа 10, но видовме дека микропроцесорите користат основа 2 – само два дигита 0 и 1. Ова се нарекува Бинарен систем. Најчесто ги скратуваме зборовите BInary digiT (БИнарен дигиТ) во bit (бит). Броењето ја прати истата шема како што ја разгледавме кај декадниот систем: ги користиме сите дигити и потоа почнуваме одново. Да пробаме. Почнуваме со листење на сите дигити: 0 1
И тоа е тоа! Сега ставаме „1“ во следната колона и почнуваме одново? 10 11
И со додавање на екстра „0“ од левата страна на првите два дигите нема да ја промени содржината на бинарните броеви. Исто е и кај декадниот систем, бројот 25 нема да биде променет ако го напишеме како 025 или 0025 или пак 000 000 000 000 025. Бинарните и декадните еквиваленти се: Бинарни 00 01 10 11
Декадни 0 1 2 3
Го правиме истото – ставаме „1“ во следната колона и ја повторуваме шемата: Бинарни 100 101 110 111
Декадни 4 5 6 7
Уште еднаш: Бинарни 1000 1001 1010 1011
Декадни 8 9 10 11 17
Вовед во Микропроцесорите и Микроконтролерите
Забуни и исправки На пример ако го имаме бројот: 1000. Кој број е ова? Дали е илјада во декаден систем или 8 запишано бинарно? Не знам. Можам да си погодувам, но разликата да се лета со авион на 8 стапки и илјада стапки е многу сериозно важно. Единствениот начин за да се биде сигурен во тоа е да се посочи за кој систем се работи. Ова се прави со пишување на бројчето за кој броен систем се работи, и тоа како индекс после бројот. Ако сакаме 1000 да ни претставува бинарен број ќе го запишеме како 10002, ако пак сакаме во декаден систем тогаш би било запишан како 100010. Ќе биде многу нереално ако го ставаме бројот за основата после секој број. Никој не го пишува бројот на основата после неговиот телефонски број, или на цените во маркетите. Треба да се употребува само кога треба да избегнеме забуни, како што би запишале израз 1000 = 8 (илјада = осум???). Запишано како 10002 = 810 ни прави многу леснотија во размислувањето.
Претворање од декадно во бинарно Секако, ако некој не запраша да го најдеме бинарниот еквивалент за девет, ние можеме едноставно да почнеме од нула и да изброиме да девет. Но ова е малку досаден начин и ако имаме големи броеви како 1 000 00010 би било многу заморно. Еве подобар начин. Начинот на претворање ќе го образложиме преку пример за претворање на бројот 5210 во неговиот бинарен број.
Пример
Претвори го 5210 во бинарен број Чекор 1: Напиши го бројот кој треба да се конвертира 52 Чекор 2: Подели го со 2 (бидејќи 2 ни е основа за бинарен систем), напиши го целиот број од резултатот и запомни го остатокот 0 или 1 52 26 0 Чекор 3: подели го резултатот (26) со 2 и повторно запомни го остатокот (0) како претходно 52 26 0 13 0 18
Вовед во Микропроцесорите и Микроконтролерите Чекор 4: подели го 13 со 2 и напиши го резултатот (6) и запомни (1) 52 26 0 13 0 6 1 Чекор 5: 2 во 6 го има 3 пати и запомни 0 52 26 0 13 0 6 1 3 0 Чекор 6: делењето на 3 со 2 ни дава резултат 1 и 1 за паметење 52 26 0 13 0 6 1 3 0 1 1 Чекор 7: конечно, делењето на 1 со 2 ни дава 0 и 1 за паметење 52 26 0 13 0 6 1 3 0 1 1 0 1 Чекор 8: не можеме понатаму да продолжиме со делење, бидејќи резултатите ќе бидат сите нули. Бинарниот број е точно во колоната за паметење. За да го добиеме резултатот треба да ја прочитме колоната за паметење од доле па нагоре. 52 26 13 6 3 1 0
0 = 1101002 0 1 0 1 1
Постапка 1 Подели го декадниот број со 2, запиши го целиот резултат под него и остатокот запиши го во колона десно од резултатот 2
Повторувај се додека не стигнеш до 0 како резултат
3
Бинарниот број е всушност колоната за остаток прочитано од доле нагоре.
19
Вовед во Микропроцесорите и Микроконтролерите
Друг пример Еве еден пример за да пробате и вие. Ако некаде заглавите, решението е подоле. Претвори го 218710 во бинарен број 2187 1093 1 = 1000100010112 546 1 273 0 136 1 68 0 34 0 17 0 8 1 4 0 2 0 1 0 0 1 Можеме истото да го направиме и со калкулатор, но за жал тие имаат граници и можат да претвораат само мали броеви бидејќи се ограничени со бројот на дигити кои можат да ги прикажат на екранот. Така за претворање, нас ни треба: 1 Калкулатор кој може да работи со различни бројни основи 2 книгичка со инструкции 3 да потрошиме половина час или недела ако сме ги изгубиле инструкциите.
Претворање на бинарен во декаден Ако го погледнеме декадниот број 8328, ќе видиме дека содржи две осмици. Овие две фигури ни се идентично исти без разлика како да ги разгледуваме, но суштински знаеме дека се многу различни. Осумката од десната страна ни е точно осум, додека другата, на левата страна, ни е всушност 8000 бидејќи таа осумка ни е во колоната за илјадарки. Вистинската вредност на дигитот зависи од две работи: дигитот кој го користиме и колоната каде тој се наоѓа. Во декадниот систем, колоните, почнувајќи од десно ни се: единици, десетки, стотки, илјадарки итн. Наместо да ги употребуваме овие зборови, можеме да се изразиме со 10 на некој степен. Илјада би ни било 10 10 10 10 , на сличен начин, стотка е 102, десетка ни е 101, а единици 100. Секоја колона ни го зголемува степенот кој се дава на бројот на основата за даден систем Колоните во бинарниот свет исто така би ни биле бројот на основата на степен кој расте од десно кон лево. Така имаме: 23 22 21 20 20
Вовед во Микропроцесорите и Микроконтролерите Декадниот еквивалент тогаш би ни биле: 2 2 2 2 8, за 22 = 4, 21 = 2 и конечно 20 = 1. Почнувајќи од десната страна, вредностите на колоните би биле 1, 2, 4, 8 итн. Да ги употребиме овие за да го претвориме бинарниот број 1001 во декаден.
Постапка Чекор 1: напишете ги вредностите за колоните 8 4 2 1 Чекор 2: Под нив напиши го бинарниот број 8 4 2 1 1 0 0 1 Чекор 3: Пресметај ги вредностите на колоните 818 400 200 111 Чекор 4: собери ги добиените вредности 819 Како што гледаме, сите колони кои содржаат бинарна 0 можат да се игнорират, бидејќи секогаш тие излегуваат нула, така побрз и поедноставен начин би ни било да ги собереме само вредностите од колоните кои содржат бинарно 1.
Постапка 1 2 3
Напиши ги вредностите на колоните за бинарен систем Напиши го бинарниот број, веднаш под вредностите од колоните Собери ги вредностите за секоја колона каде има 1 во бинарниот број
Друг пример Уште еднаш, еве еден пример за вас. Ако имате проблеми, решението е подолу. Претвори го 1011001012 во декаден број Чекор 1: запишете ги вредностите на колоните почнувајќи од 1 од десно и продолжете само да ја дуплирате вредноста се додека ви треба 28 27 26 25 24 23 22 21 20 256 128 64 32 16 8 4 2 1 Чекор 2: Впиши го бинарниот број веднаш под броевите од колоните 256 128 64 32 16 8 4 2 1 1 0 1 1 0 0 1 0 1 Чекор 3: собери ги вредностите каде што имаме бинарно 1 256 + 64 + 32 + 4 + 1 = 357 Значи, 1011001012 = 35710 или само 357 бидејќи се подразбира дека е декадно. 21
Вовед во Микропроцесорите и Микроконтролерите
Битови, бајти и слични работи Сите информации кои влегуваат или излегуваат од микропроцесорот се во форма на бинарен сигнал, напонот се менува помеѓу две „бит“ нивоа 0 и 1. Битовите поминуваат низ микропроцесорот со многу голема брзина и во голем број, така нас ни е полесно да ги групираме.
Nibble Група од четири бита заедно. Половина од бајт.
Бајт (Byte) Бајт претставува колекција од осум бита. Без разлика дали се единици или нули или за која цел тие се користат.
Збор (Word) Неколку битови можат да се групираат за да оформат „збор“ (word). За разлика од бајтите, зборовите немаат одреден број на битови од кои се составени. Должината на еден збор или бројот на бити во него зависи од микропроцесорот кој се користи. Ако микропроцесорот прифаќа бинарни податоци во група да 32 во единица време тогаш еден збор би бил составен од 32 бити. Ако друг микропроцесор користи помали порции на податоци, да кажеме 16 во единица време, тогаш еден збор ќе биде составен од 16 бити. Во овој контекст зборот е малку несекојдневен во смисла на неговата големина или должина, бидејќи зависи за каква ситуација зборуваме. Најмногу се користат 8, 16, 32 и 64 бити, но не е исклучена ниедна друга големина.
Долг збор (Long word) Кај микропроцесор кај кој должината на зборот е да речеме 16 бити, долг збор (long word) би било група од две нормални должини, во нашиот случај 32 бити.
Килобајт (Kilobyte : Kb или KB или kbyte) Килобајт претставува 1024 или 210 бајти. Во нормален случај, кило ни претставува 1000, на пример како киловолт или kV се точно 1000 волти. Во бинарниот систем, најблиската колона по вредност за 1000 е 1024, бидејќи 29 = 512 и 210 = 1024. Рзликата помеѓу 1000 и 1024 е многу мала доколку имаме само 1 или 2 Kb и тогаш разликата лесно ја игнорираме. Но како што се зголемува бројот така и разликата се зголемува. Точниот број на бајти за 42 Kb е 43 008 бајти (42 1024). Па така, во компјутерскиот свет, за да го избегнеме тој проблем ние би користеле голема буква K која ќе ни означува 1024, додека мала буква k ќе ни означува 1000.
22
Вовед во Микропроцесорите и Микроконтролерите За жал, бидејќи нема ни стандардно користење на голема и мала буква b за бити доведува до поголемо недоразбирање. 1000 бити ни се kilobit или kb. Понекогаш 1024 бити ги запишуваме како Kb. Еден начин за да се реши проблемот бити/бајти е да се користи kbit (или Kbit) и kbyte (или Kbyte).
Мегабајт (Megabyte: MB или Mb) Ова претставува килокилобајт или 1024 1024 бајти. Бројчено тоа е 220 или 1048576 бајти. Бидете претпазливи да не ги забуните овие мега со мегаволти (MV) кои се точно еден милион (106).
Гигабајт (Gigabyte: Gb) 1024 мегабајти т.е. 230 или 1 073 741 824 бајти. Генерално во инжињерството гига ни претставува илјада милиони (109).
Терабајт (Terabyte: TB или Tb) Терабајт е мегамегабајт или 240 или 1 099 511 600 000 бајти (Tera = 1012).
Петабајт (Petabyte: PB или Pb) Ова е 1024 пати поголемо од терабајт т.е. 240 што е многу голем број. Ако навистина ве интересира можете да помножите 1 TB со 1024.
Квиз 2 Во секој случај, одбери го најдобриот одговор. 1. Карактеристичен работен напон за микропроцесорите е: a. 0 V и 1 V. b. 3.3 V и 5 V. c. 220 V. d. 1024 V. 2. Најподвижниот електричен полнеж се наракува: a. Протон и неговиот позитивен полнеж b. Напон и секогаш е на едниот крај од проводникот c. Електрон и неговиот негативен полнеж d. Електрон и неговиот позитивен полнеж 3. Декадниот број 600 е еквивалент на кој бинарен број: a. 1001011000 b. 011000000000 c. 101001 d. 1010110000 23
Вовед во Микропроцесорите и Микроконтролерите 4. Кога би го претвориле во декаден број, следниов бинарен број 110101110 тогаш: a. Тој ќе заврши со 0. b. Мора да биде поголем од 256, но помал од 512. c. Ќе има основа 2 d. Ќе биде точно 656. 5. Бајт: a. е или 1024 или 1000 b. е колекција од 16 бити. c. Може да варира во должина во зависност од каков микропроцесор користиме. d. Може да има ист број на бити како што и зборот (word).
24
Вовед во Микропроцесорите и Микроконтролерите
3 Хексадецимален – начин на кој ние комуницираме со микропроцесорите Единствен проблем со бинарниот систем Од наша гледна точка, бинарниот систем има два недостатока: броевите се премногу долги, и второ, тој премногу не заморува. Доколку имаме „реки и реки“ на нули и единици ќе ни стане досадно, ќе се загубиме во просторот и ќе испуштаме битови. Брзината на светлината во m/s може да се запише декатно како 29979245910 или бинарно како 100011101111001111000010010112. Ако пробаш да ги запишеш овие два броја на хартија, сигурно полесно ќе ти биде пишувањето на декадниот број. Случајно, овој бинарен број е двапати помал по должина од броевите што ги обработуваат модерните микропроцесори милиони пати во секунда, со (речиси) 100% прецизност. За да ни биде уште полесно, декадниот број го поделуваме дури и во групи и го пишуваме како 299 792 459. На ваков начин ние се справуваме, со порции и 10 различни дигити кои изгледа ни се доволни за да ни го задржат вниманието. Можеме да го искористиме сличниот трик и со бинарниот број, да го поделиме во групи од четири бити почнувајќи од десно кон лево, исто како што правиме и со декадните. 1 0001 1101 1110 0111 1000 0100 1011 Вака изгледа полесен за паметење. Сега, ако земеме група од четири бити, со најмалиот можен 00002 и најголемиот 11112, и ако овие бинарни броеви ги претвориме во декадни, би добиле опсег на броеви од 0 до 15.
Хексадецимално (Hexadecimal), или „hex“ За броењето од 0 до 15 ќе ни требаат 16 различни дигити и 16 како основа. Не е важен изгледот на дигитите. Но, ние треба да се трудиме да ни биде што е можно полесно. Првите 10 се лесни, и ние ќе ги користиме 0123456789 како кај декаден систем. За последните шест, одличивме да ги користиме првите шест букви од абецедата: ABCDEF или abcdef.
25
Вовед во Микропроцесорите и Микроконтролерите Хексадецималниот систем почнува со: Хексадецимално Декадно 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 A 10 B 11 C 12 D 13 E 14 F 15 Кога ќе ни снема дигити, само додаваме 1 во втората колона и ја враќаме првата колона на 0 итн. Па броењето ќе продолжи: Хексадецимално 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 ... итн.
Декадно 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
Треба да бидеме претпазливи и да го ставаме бројот на основата за да избегнеме забуни. Основата најчесто со пишува со H, или пак h или мало 16, сеуште би било прифатливо. „Еден Осум“ хексадецимално, еднакво е на дваесет и четири декадно. Приметивте дека ставив наводници за hex бројот за да го избегнам бројот осумнаесет, бидејќи осумнаесет е декаден број и не постои таков како хексадецимален. Ако го читате на овој начин кажувате дека не станува збор за декаден број.
26
Вовед во Микропроцесорите и Микроконтролерите Еве неколку опции за запишување на хексадецимален број: 18H 18H 18h 18h 1816
= = = = =
2410 2410 2410 2410 2410
Предноста на хексадецималноит систем 1 2
Многу е компактен. Со користење на 16 како основа, ни кажува дека бројот е помал од истиот претставен бинарно или декадно. Лесно е претворањето на хексален во бинарен број и е многу полесно отколку во декаден. Запомнете дека микропроцесорите работат единствено со бинарни броеви, и дека сите конверзии помеѓу хексадекаден и бинарен број се извршуваат во други кола (слика 3.1).
Слика 3.1 хексадецимален систем е добар компромис
Претворање на декаден во хексадецимален број Процесот е по истата шема како што ја разгледавме за претворање на декаден во бинарен број.
Постапка 1 2 3 4
Запиши го декадниот број Дели го со 1610, запиши го целиот број на резултатот, а остатокот запиши го во колона десно од него Продолжи се додека делењето не стигне до нула. Прочитај го резултатот од колоната на остатоци од доле кон горе. ЗАПОМНИ! ПИШУВАЈ ГО ОСТАТОКОТ ХЕКСАДЕЦИМАЛНО
27
Вовед во Микропроцесорите и Микроконтролерите
Пример Претвори го декадниот број 23 823 во хексадецимален 1
2
3
4
5
6
запиши го бројот кој треба да се конвертира 23 823 До тука е ОК подели со 16. Може да ти треба калкулатор. Решението е 1488.9375. 1488 ќе го запишеме веднаш под бројот кој се конвертира 23 823 1488 но проблем е децималниот дел. Тој е 0.9375 и претставува всушност 0.9375 од 16. Кога ќе го помножиме со 16 добиваме 15. Значи 15 треба да го запишеме во хексадецмален број, а тоа е F. Тоа би изгледамо вака: 23 823 1488 F повторете ја постапката делејќи го 1488 со 16, резултатот е 93. Нема остаток, па така запишуваме 93 под 1488 и 0 во колоната за остаток. 23 823 1488 F 93 0 Уште еднаш, 93 го делиме со 16 и добиваме 5.8125. запишуваме 5 под 93, а 0.8125 го множуме со 16 и добиваме 13 или D хексадецимално 23 823 1488 F 93 0 5 D Следново е лесно. Со делење на 5 со 16 добиваме 0.3125. значи, стигнавме до нула и 0.3125 6 5. И така добиваме: 23 823 1488 F = 5D0F 93 0 5 D 0 5 Исчитај го хексадецималниот број од доле нагоре: 5D0FH (запомни дека „H“ означува дека се работи за хексадецимален број).
Пример Претвори го 44 25610 во хексадекаден 44 256 2766 172 10 0
0 = ACE0H E C A
28
Вовед во Микропроцесорите и Микроконтролерите
Друг пример Претвори го 540 70910 во хексадекаден 540 709 33 794 5 = 84025H 2112 2 132 0 8 4 0 8 Значи, 540 70910 = 84025H, но бидете крајно внимателни, кога хексадецималниот број не содржи букви, да ја ставите основата од десната страна за да не дојде до забуна.
Претворање на хексадецимален во декаден број За да го постигнеме ова можеме да ја искористиме истата постапка што ја користевме за претворање на бинарен во декаден број.
Пример Да се претвори A40E5H во декаден број 1 секоја колона да ја зголемиме 16 пати почнувајчи од десно, па ќе добиеме 164 163 162 161 160 65536 4096 256 16 1 2 едноставно запишете го хексалниот број користејќи ги колоните 65536 4096 256 16 1 А 4 0 Е 5 3 употребувајќи калкулатор пресметај ја декадната вредност на колоните 65536 4096 256 16 1 А 4 0 Е 5 655360 16384 0 224 5 Левата колона има хексална вредност од 1010 (А = 10), така вредноста на колоната ќе биде 65536 10 655360. Следната колона има вредност 4 4096 16384. Следната има вредност нула (256 0). Четвртата има 16 14 224 (Е = 14). И последната колона е лесна за пресметување т.е. 1 5 5. 4 соберете ги декадните вредности: 655 360 + 16 384 + 0 + 224 + 5 = 671 97310
Постапка 1 2
Напишете ги вредностите на колоните употребувајќи калкулатор, почнувајќи со 160 (=1) од десно кон лево и зголемувајќи за 16 пати на секоја колона. Впишете ги хексадекадните броеви во соодветните колони, претворате ги во декадни броеви ако е потребно, т.е. треба да запишеме 10 наместо „А“. 29
Вовед во Микропроцесорите и Микроконтролерите 3 4
Помножете ги овие декадни броеви со броевите на колоните за да се најдат резултатите за колоните. Соберете ги колоните за да добиете декаден еквивалент на дадениот хексадекаден број.
Друг пример Претвори го 4BF0H во декаден број 163 162 161 160 4096 256 16 1 4 11 15 0 16 384 2 816 240 0 Резултат = 16 382 + 2 816 + 240 + 0 = 19 44010
Претварење на бинарен во хексадекаден број Ова е многу лесно. Четири бинарни бита можат да имат минимум и максимум вредности од 00002 т.е. 11112. Претворањето во декаден број се добива минимум вредност 0 и максимум 1510. Дали ова се поклопува целосно со хексален број! Ова значи дека било која група од четири бита можат да се „преведат“ директно во еден хексадекаден дигит. Едноставно, над секоја група на битови од бинарниот број да ставиме 8, 4, 2 и 1 и да ги собереме оние каде што се појавува 1 во бинарниот број.
Пример Претвори го 1000000101010112 во хексадекаден број Чекор 1: почнувајќи од десно, направи групи од по четири дигити од бинарниот број. 100/ 0000/ 1010/ 1011/ Чекор 2: секоја група разгледувај ја посебно. Првата група од десно е 1011 и нејзиното претворање ќе биде: 8 4 2 1 1 0 1 1 8 0 2 1 Резултатот ќе ни е 8 + 0 + 2 + 1 = 1110 или B во хексадекадно. Значи последната група може сега да се замени со хексадекадната вредност B. 100/
0000/
1010/
1011/ B Чекор 3: втората група од десно, ќе ја претвориме на ист начин. 8 1 4 0 2 1 1 0 8 0 2 0 10 или хексадекадно A.
100/
0000/
1010/ А
Сега имаме: 1011/ B 30
Вовед во Микропроцесорите и Микроконтролерите Чекор 4: следната група е составена само од нули па така можеме да кажеме дека резултатот е нула. Значи: 100/
0000/ 1010/ 1011/ 0 А B Чекор 5: последната група би била: 4 1 2 0 1 0 4 што е и хексидекадно. Значи нашиот резултат би бил: 100/ 0000/ 1010/ 1011/ 4 0 А B Така ќе добиеме дека: 1000000101010112 = 40ABH. Со групирање на битовите од по четири бита во група е исто без разлика за должината на бројот, но треба да запамтиме дека секогаш групирањето почнува од десно кон лево.
Пример: Претвори го бројот 11000111110012 во хексадекаден Подели го бројот во групи од по четири бита почнувајќи од десно 1/ 1000/ 1111/ 1001/ Со додавање на 8, 4, 2 и 1 над секој бит од групите соодветно ќе имаме: 1 8421 8421 8421 1 1000 1111 1001 1 8 8421 81 1 8 15 9 Сега само треба да ги конвертираме крајните резултатит од групите во хексадекаден број, ако тое е потребно. Во овој пример треба само 15 да го смениме во F. Крајниот резултат е 11000111110012 = 18F9H
Претварање на хексадекаден во бинарен број Ова претставува обратно од последната постапка. Едноставно секој хексален број треба да се претвори во четири битен бинарен број. Видовме дека ги користиме 8, 4, 2 и 1 како помошна колона, па така претворањето се сведува само на комбинација од овие бројки за да ја добиеме потребната вредност. Колоните што се користат имаат 1 во бинарниот број, додека тие што не се користат 0. Кога претвараме мали броеви како што е 3H треба да пазиме да не заборавиме да ставиме нули од левата страна за да можеме да имаме група од четири бити во бинарниот број. Ако го конвертираме бројот 5H во бинарен број, треба да видиме која комбинација од 8, 4, 2 и 1 ќе ни даде 5? Одговорот е збир од 4 и 1. За секоја колона што ја користиме ставаме 1, а нула за колонота што не ја користиме, т.е. за 8 имаме 0, за 4 имаме 1, за 2 исто 0, а за 1 имаме 1. Така 5H е претворен во 01012. Сите вредности помеѓу 0 и FH се претвараат на ист начин.
31
Вовед во Микропроцесорите и Микроконтролерите
Пример Да се претвори 2F6CH во бинарен број Чекор 1: запишете го целиот хексадекаден број со доволно растојание меѓи цифрите за да може да ни ги собере бинарните броеви под нив 2 F 6 C Чекор 2: ставете ја комбинацијата на 8, 4, 2 и 1 под секоја цифра 2 F 6 C 8421 8421 8421 8421 Чекор 3: CH = 1210 кој е составена од 8 + 4, па така ставаме 1 на колоните со 8 и 4. Така четири битниот број ни е 11002 2 8421
F 8421
2 8421
F 8421
6 8421
C 8421 1100 Чекор 4: сега го правиме истото со следната цифра. 6 е соствен од 4 + 2, што ни укажува дека тоа е еднакво на 01102 6 C 8421 8421 0110 1100 Чекор 5: бидејќи 8 + 4 + 2 + 1 = 15, хексадекадно F, ќе имаме 11112 2 8421
F 6 C 8421 8421 8421 1111 0110 1100 Чекор 6: најпосле, последната цифра, 2 и бидејќи ова кореспондира со втората колона, тогаш тоа би било напишано како 00102 2 F 6 C 8421 8421 8421 8421 0010 1111 0110 1100 Крајниот резултат е 2F6Ch = 00101111011011002 Но дали треба да ги ставиме двете водечки нули? Има два одговори „да“ и „не“, но и тоа не ни е многу од помош. Треба да си поставиме друго прашање: зошто ја правиме конверзијата? Дали ќе се занимаваме со математика или со микропроцесори? Ако се занимаваме со микропроцесорски систем тогаш резултатот од 16 бити ќе ни кажува дека имаме 16 напони кои се на 16 жици (конектори). Како броевите се менуваат, сите конектори треба да го менуваат напонот помеѓу 0 V и 3.3 V за бинарните нивоа 0 и 1. Ова значи дека, сите 16 конектори мора да бидат присутни за да можеме да ги претставиме со бинарни нивоа посебно за сите нив. Иако претворањето е чиста математика, сепак водечките нули (од левата страна) немаат математичка вредност, па така нема потеба од запишување на истите во резултатот.
32
Вовед во Микропроцесорите и Микроконтролерите
Постапка 1 2 3
запиши го хексадекадниот број, но со растојание помеѓу цифрите искористи ја комбинацијата од 8, 4, 2 и 1 за да ја конвертираш секоја цифра посебно во четири битен бинарен број додади водечки нули за да бидеш сигурен дека секоја хексадецимална цифра е прикажана со четири бити.
Пример Претвори го 1E08BH во бинарен број Чекор 1 1 8421
E 8421
0 8421
8 8421
B 8421
Чекор 2 0001 1110 0000 1000 1011 т.е. 1E08BH = 000111100000100010112
Користење на отскочна штица Многу е лесно да се претвори бинарен во хексадекаден и хексадекадеен во бинарен број. Увидов дека е многу полесно да множиме и делиме со 2, одошто со 16, па така кога ќе се соочам со тоа да претворам хексадекаден во декаден и декаден во хексадекаден број, јас честопати најпрво го претворам во бинарен. Рутата е подолга, но тоа го правам без да го користам мојот калкулатор (види слика 3.2)
Слика 3.2 Подолгата рута може да се покаже полесна
33
Вовед во Микропроцесорите и Микроконтролерите
Застарениот октален систем – веројатно не вреди да се чита ☺ Октален систем е уште еден броен систем што нема некоја предност од хексадекадниот, но сеуште се сретнува од време на време. Овде ќе обрнеме мало вниемание за него, колку да кажеме дека сме го спомнале. Во хексадекадниот систем, користиме група од по четири бинарни бита бидејќи 11112 ни е 15 што ни ја претставува највисокат вредност (F) за хексадекаден систем. Во окталниот, користиме група од по три бита. Највисоката вредност ни е 1112, а тоа е 7. Окталниот броен систем има осум дигити и почнуваат од 0 до 7. Броењето е: 0 1 2 3 4 5 6 7 Нема 8-ка како дигит, па така ставаме 1 пред дигитот и го враќаме на 0. 10 11 12 13 14 15 16 17 Сега одиме право на 20 20 Итн. Нема букви во него и најчесто не може да се препознае дека се работи за октелен броен систем се додека не приметиме дека нема 8 и 9 во таквите броеви. Претворањето ја следи истата постапка како за хексадекадно. Октално во декадно: вредностите на почетната колона ни се 84, 83, 82, 81, 80. Декадно во октално: дели со 8 и запишувај ги остатоците, па на крај прочитај ги од доле нагоре. Користи 8 за индекс за да покажеш дека се работи за октален број, пр.: 6410 = 1008. Окатлно во бинарно: запиши го секој октален дигит како група од три бинарни дигити. Бинарно во октално: почни од десната страна и подели го бинарниот број на групи од по три бити, потоа пресметај ја секоја група.
34
Вовед во Микропроцесорите и Микроконтролерите Мислам дека ова е доволно за октален броен систем. Квиз 3 Во секој случај, одбери го најдобриот одговор. 1. Кој број од прикажаниве е најголем? a. 10008 b. 100010 c. 10002 d. 1000H 2. Бројот CD02H е еднаков на: a. 5248210 b. 5422810 c. 5632210 d. 5284210 3. Основата на бројниот систем е: a. Секогаш иста со најголемиот дигит кој го користиме во тој броен систем b. Најчесто +5 или +3.3 c. Еднаков на бројот на различни дигити кои се користат во бројниот систем d. Еден помалку од најголемиот дигит во тој броен систем 4. Кој од овие броеви е еднаков на 101101110102: a. 164610 b. 5BA16 c. AB5H d. B72h 5. Бројот на дигити т.е. цифрите во декадниот број најчесто се: a. Поголем од бројот на дигити во еквивалентниот бинарен број b. Помал или еднаков на бројот на дигити на неговиот хексадекаден еквивалент c. Поголем од бројот на дигити на неговиот хексадекаден еквивалент d. Поголем да бројот на дигити на неговиот децимален број.
35
Вовед во Микропроцесорите и Микроконтролерите
4 Како микропроцесорите пресметуваат Како микропроцесорите се справуваат со бројките (и буквите) Во претходното поглавје, видовме како можеме броевите да ги прикажеме во бинарна и хексална форма. Без разлика дали ќе мислиме на хексален или бинарен, па нека е и декаден, кај микропроцесорите тоа е само бинарен. Целиот хексадекаден концепт е само да си ја олесниме работата. Можеме да внесеме преку тастатурата било каков хексадекаден (или декаден) број, но првата работа на било кој микропроцесорски базиран систем е да го претвори истиот во бинарен. Цела аритметика се одвива бинарно и на крај неговата работа е да го претвори назад во хексадекаден (или декаден), само за да не усреќи. Форматот на бинарните броеви во еден микропроцесор зависи од дизајнот на системот и работата на софтверскиот програмер. Ќе ги разгледаме алтернативите, почнувајќи од негативните броеви. Во секојдневниот живот, тоа е многу лесно, едноставно го ставаме „–“ знакот пред бројот и тој станува негативен, така +4, станува -4. Лесно, но немаме начин да ставиме минус знак кај микропроцесорите. Проблемот го разгледавме на неколку различни начини.
Броеви со означена магнитуда Првиот обид изгледа лесен, но излезе неоптимистички. Се што требаше да направиме е да го искористиме првиот бит (msb) од бројот за да ни означува 1 = минус, а 0 = плус. Ова има два недостатока. 1
2
Користи еден бит, така 8-битен збор сега може да има само седум бита за да претставуваат број и еден бит за „плус“ или „минус“. Седумте бита сега можат да избројат до 11111112 = 127, додека осум битен може двапати повеќе, 255. Ако собереме два бинарни броја како +127 и +2, ќе добиеме 01111111 00000010 10000001 Msb ни кажува дека станува збор за негативен број
Овој дел ни е бројот 1
Msb (most significant bit), најзначајниот бит, е 1 и ни кажува дека станува збор за негативен број, а бројот без знак е 0000001 = 1. Така крајниот резултат, не е 129 туку минус 1. 36
Вовед во Микропроцесорите и Микроконтролерите Кога сакаме некој микропроцесор да обработи некоја аритметика со таков проблем, можеме да се осигураме дека микропроцесорот ќе го препознае овој случајно настанат негативен број. Можеме да го преуредиме микропроцесорот да го отстранува овој проблем, но тоа е комплицирано и бавно. За среќа со тек на време се појавил еден многу подобар начин кој се користел долги години.
Комплементарни броеви Овој начин иима две значајни предности: 1 2
Дозволува користење на сите битови, така 8 битен збор би имале од 0 до 111111112 т.е. 255. Лесно се имплементира со собирање и одземање користејќи во суштина еден потег.
Па како можеме да ги користиме сите осум бита од бројот, и сè уште да знаеме дали се работи за позитивен или негативен број? Најпрвин ќе ги разгледаме позитивните броеви, бидејќи тоа ни е полесно. Сите позитивни броеви од 0 до 255 се исти како што ги добивме со конверзија на декадните броеви во бинарни. Значи со ова завршивме.
Собирање Пример Соберете ги 01011010 + 00011011. Чекорите се скоро исти како за „нормално“ декадно собирање. Чекор 1: запиши ги и двата бинарни броја и почни од lsb (least significant bit, најмалку важен бит) т.е. од десната страна. 01011010 + 00011011 Собери ја десната колона. Па добиваме 0 + 1 = 1, т.е. 01011010 + 00011011 1 Чекор 2: следно е да ги собереме двете 1-ци од следната колона. Резултатот е 2 т.е. 10 бинарно. Ја запишуваме 0-та и ја памтиме 1-цата за следната колона 01011010 + 00011011 01 100
37
Вовед во Микропроцесорите и Микроконтролерите Чекор 3: следната колона ни е лесна т.е. 0 + 0 + 1 = 1 01011010 + 00011011 101 100 Чекор 4: следната колони ни е иста како втората колона, 1 + 1 = 10 бинарно. Значи, запишуваме 0, а памтиме 1 01011010 + 00011011 0101 10100 Чекор 5: следно, имаме 1 за секој ред и 1 што памтиме, добиваме 1 + 1 + 1 = 3 или 11 бинарно. Значи, запишуваме 1 и имаме 1 за паметење. 01011010 + 00011011 10101 110100 Чекор 6: следната колона е 0 + 0 + 1 = 1, наредната е 1 + 0 = 1 и за крајниот бит т.е. msb имаме 0 + 0 = 0, така можеме да ја комплетираме сумата. 01011010 + 00011011 01110101 110100
90 + 27 = 117
Одземање Размислете, за следново прашање: Кој број би го додале на 50 за да го добиеме резултатот 27? Во математичка форма ова би го напишале како 50 + x = 27. Кој број би можел да биде x? Разбирливо е дека, кој и да е број додаден на 50 ќе ни даде поголем број од него, доколку тој број не е негативен како на пример -23: 50 + (-23) = 27. Зачудувачки добро е тоа што постои број кој нема минус знак пред него, а го има истиот ефект како да е негативен. Таквиот број се нарекува втор комплемент на бројот. Па така нашата сума би била: 50 + (вториот комплемент од 23) = 27 Магичниот број е вториот комлемент од 23 и може да се најде многу лесно. Како да го пресметаме вториот комплемент од било кој бинарен број Инвертирај го секој бит, и додади 1 за да го добиеш посакуваниот резултат
Се што треба да направиме е да го инвертираме секој бит од бројот кој треба да го одземиме т.е. секоја единица ќе стане нула и секоја нула ќе стане единица. Да забележиме дека ваквата инверзија е наречена „прв комплемент“ од тој број. Механизмот за ова ќе го продискутираме
38
Вовед во Микропроцесорите и Микроконтролерите во следното поглавје, но тоа е многу лесно, и вештината за да се имплементира во микропрецесорите, не нè чини ама баш ништо. Претворајќи го 23 во бинарен број добиваме 000101112 (користејќи 8 бита). Со инвертирање на секој бит добиваме 111010002 и сега треба да додадме 1. Резултатот ни претставува „вториот комплемент на 23. 11101000 „прв комплемент“ 1 + 11101001 „втор комплемент“ Во овој пример, користевме 8 битен број, но аритметиката е сосема иста и за 16 битни, како и за 32 или 64 битни броеви. Реализирање на сумата Сега едноставно ќе ги собереме 50 и вториот комплемент од 23: 50 + (вториот комплемент од 23) = 27 00110010 11101001 + 100011011 100000000 Резултатот е 100011011.
= 50 = втор комплемент од 23 = резултатот е 27
Ако ги изброиме битовите ќе видиме дека се девет! Имаме зачувано 1 во последната колона т.е. во деветтата колона за паметење. Кај микропроцесорите има место само за осум бита, така деветтиот бит не се користи. Ако го побареме одговорот од микропроцесорот за оваа сума, тогаш тој ќе ни одговори само со 8 бита т.е. 000110112 или декадно 27. Така го добивме точниот одговор. Малку беше напорно, па да дадеме мало резиме за тоа што точно направивме. 1 2 3 4
Претвори ги и двата броја во бинарен броен систем. Најди го вториот комплемент на бројот што го одзимаме. Собери ги двата броја. Избришете го msb и ќе го добиете резултатот.
Крај на постапката. Неколку забелешки 1 2 3
Најди втор комплент само на бројот што го одзимаш – НЕ и на двата броја. Ако сте ја завршиле процедурата точно, секогаш ќе имаме додатна колона која треба да ја избришиме. Ако броевите немаат ист број на битови, додади водечки нули уште на почетокот, не оставај са попосле. И двата броја треба да имаат ист број на битови. Можат да бидат 8 битни броеви, 16, 32 или било колку долги само тие да се еднакви по должина.
39
Вовед во Микропроцесорите и Микроконтролерите
Брз начин за определување на вториот комплемент од некој бинарен број Почни од лево кон десно и инвертирај ги сите битови се додека не стигнеш до последната единица. Оваа единица не ја инвертирај и не ги инвертирај битовите после неа, ако има некои. Пример 1 Колку е -2410 пресметан со помош на 8 битен втор комплемент? 1 2 3
Претвори го 2410 во бинарен = 11000. Додади водечки нули за да имаме 8 битен број. Сега имаме 0001 1000. Сега почни да го инвертираш секој бит почнувајќи од лево кон десно се додека не стигнеме до последната единица „1“. Неа не ја инвертирај, и не ги инвретирај трите нули после неа. Не ги инвертирај овие!
00011000 Резултатот е 1 1 1 0 1 0 0 0 Овие инвертирај ги! Пример 2 Колку е -10010, пресметај со помош на 16 битен втор комплемент? 1 2 3
Претвори го 10010 во бинарен = 11001002. Додади девет водечки нули за да добиеме 16 битен број: 0000000001100100. Сега, со користење на брзиот метод, најди го вториот комплемент Овде престани со инвертирање!
0000000001100100 Резултатот е 1111 1111 1001 1100
Пример 3 Најди ја вредноста на 1011 01112 – 00 10112 со користење на собирање со вториот комплемент. 1 2 3
Вториот број има само шест бита, па ќе му додадиме уште две нуле од левата страна за да добиеме ист број на битови т.е. 1011 0111 – 0000 1011. Сега секој бит од вториот број ќе го инвертираме за да го најдеме првиот комплемент и ќе добиеме промена од 00001011 во 11110100. Со додавање на 1 ќе го добиеме вториот комплемент: 11110100 + 1 =11110101 (или ова направи го со брзиот метод).
40
Вовед во Микропроцесорите и Микроконтролерите 4
5
Собери го првиот со вториот комплемент од вториот број: 10110111 11110101 + 110101100 111101110 Резултатот ни е 110101100 кој содржи екстра бит msb кој го бришеме и добиваме 101011002.
Броеви со подвижна запирка Осум битните броеви се ограничени до максимална вредност од 111111112 или 25510, а тоа значи дека од 0 – 255 имаме вкупно 256 различни броеви. Не многу!. 32 битните броеви располагаат со 4 ¼ билиони. Ова е доста доволно за секојдневна работа. Но проблем имаме со научните истражувања каде се инволвирани екстремно големи броеви, што ги има во астрономијата, или пак во многу малите растојанија во нуклеарната физика. Како се снаоѓаме во вакви ситуации? Можеме да чекаме да излезе 128 битен микропроцесор, па понатаму да чекаме 256 битен микропроцесор итн. Но, најдобра опција ни е да разгледаме алтернативни патишта за да можеме да се справиме со големи опсези на броеви. Наместо да запишуваме број како што е 100, можеме да го запишеме како 1 10 . Ваквата форма ни кажува дека бројот е еден, следен со две нули, па така билион би бил напишан како 1 10 . На сличен начин, 0.001 е 1 на кој му претходат две нули и можеме да го запишеме како 1 10, така еден билионит би бил, 0.000000001 = 1 10 . Негативниот степен е за еден поголем од бројот на нули. Со користење на броеви со подвижна запирка, лесно можеме да одиме дури до 1 10 или до 1 10 без големо зголемување на бројот дигити.
Модерни имиња Нормализирање Запишувањето на секојдневните броеви како што е 275 во форма 2.75 10, се вика нормализирање на бројот. Првиот број секогаш почнува со еден дигит помеѓу 1 и 9 кој е придружен со десет на некој степен. Во бинарниот систем, го правиме истото само што децималната дел се вика бинарна децимален дел и првиот број секогаш е 1 придружен со 2 на некој степен, доколку е потребно. Три примери 1 2
3
Нека го користиме повторно 275, кој претворен во бинарен број е 100010011. Така овој може да се нормализира во 1.00010011 2 . За бројот како што е 0.00010012 треба бинарната точка да ја поместиме четири места на десно и да ја ставиме бинарната точка веднаш позади првата 1-ца, па така нормализираната вредност ќе биде 1.001 2 . Бројот 1.1012 кој е веќе нормализиран т.е. нема потреба од поместување на бинарната точка, па така формално може да биде запишано како 1.101 2 .
41
Вовед во Микропроцесорите и Микроконтролерите
Терминологија Има уште неколку модерни имиња кои се доделини на некои делови од бројот, за да ги направи навистина страшни. Exponent Експонент Нормализиран број: 8.0245 10
Mantissa Мантиса
Radix Основа
Експонентот претставува степенот на десет, во примеров, 9. Мантиса, или магнитуда, е бројот, во нашиот случај 8.0245. Радикс (radix), основа, е основата на бројниот систем кој го користиме, 2 за бинарен, 16 за хексадекаден, 10 за декаден.
Запишување на броеви со подвижна запирка Кај микропроцесорите, броевите со подвижна запирка се бинарни броеви. Па, кај бинарните броеви, мантисата секогаш почнува со 1 проследен со бинарен децимален дел. На пример, ако имаме 5 дигитна бинарна мантиса тогаш таа ќе се движи од 1.0000 и 1.1111. Бидејќи, секоја мантиса ни почнува со 1 и бинарна точка, можеме да заштедиме меморија едноставно со изоставување на нив, само треба да знаеме за нивното постоење. Сега опсегот кој треба да се меморира се движи од 0000 до 1111. Вообичаено се користи 32 битна меморија за броеви со подвижна запирка. Тие 32 бити не се организирана по некој стандард. Па треба да се биде внимателен пред да направиме некои претпоставки. Во овие 32 бита треба да ги сместиме екпонентот и мантисата кои и двата можат да бидат позитивни или негативни. Еден од најпопуларните методи е прикажан подолу.
Bit Бит
Exponent Експонент 31
Mantissa Мантиса 24 23
S З 1 0
Битот 0 се користи за знакот на мантисата, користејќи го конвенционалниот метод 0 = позитивен и 1 = негативен. Битовите 1 – 23 се користат за мантисата во нормална бинарна форма. Битовите 24 – 31 се за екпонентот. Осум дигити се користат за да се презентираат броеви од 127 до 128 користејќи го или вториот комплемент на бројот или вишок-127 нотацијата. Веќе се сретнавме, погоре во ова поглавје, со вториот комплемент на броевите, па така ќе ја разгледаме вишок-127 нотацијата.
42
Вовед во Микропроцесорите и Микроконтролерите
Вишок-127 нотација Ова е многу едноставно, исклучувајќи го впечатливиот назив. За да го најдеме експонентот само треба да го додадеме 127 и вредноста да ја претвориме во бинарен број. Ова додавање не осигурува дека ќе имаме екпонент кој има вредност од 0 до 255 т.е. сите вредности ќе бидат позитивни. Пример Ако експонентот ни е 35 па со додавање на 127 добиваме 92, кој можеме да го претвориме во бинарен број (01011100). Кога вредноста ќе се исчита од меморијата, едноставно го претвараме во декаден и го правиме обратниот процес т.е. одзимаме 127 од добиената вредност.
Големина, прецизност и брзина Мантисата може да биде на пример 1.1111 1111 1111 1111 1111 1112. Десно од бинарната точка децималните еквиваленти се во вредност од 1.5 + 0.25 + 0.125 + 0.0625 итн. Со собирање на овие вредности ќе дојдеме до приближен краен резултат 2. Колку е поголем бројот на бити во мантисата, се очекува, толку повеќе да биде поголема прецизноста. Експонентот има осум бити, па може да биде во опсег од -127 до +127 што ни дава максимален број од 1 2 кој приближно е 3.4 10. прецизноста е ограничена со бројот на бити кои можат да се внесат во мантисата, т.е. во овој случај тоа се 23 бити. Ако сакаме да се задржиме на вкупно 32 бити, тогаш мораме да направиме некаков баланс, т.е. ако ја зголемиме должината на експонентот, за да добиме што поголем број, мораме да ја намалиме должината на битови во мантисата, а со тоа ќе ја намалиме прецизноста. Floating point operations per second (FLOPS), операции со броеви со подвижна запирка во секунда, ни е еден начин за мерење на брзината на микропроцесорот. IBM (од 2002) гради нов супер компјутер составен од милион микропроцсори. Blue Gene (Сини гени) проектот ќе може да работи со брзина поголема од илјада милион милион операции во секунда (1 petaflop). Ова е илјади пати побрзо од Intel-овиот рекорд за брзина во 1998 или приближно два милиони пати побрзо од денешните најјаки декстоп компјутери.
Единечна и двојна прецизност Ако ни е потребна поголема прецизност, алтернативен метод е да го зголемиме бројот на битови, така за број од 32 бита (единечна прецизност) користиме број со големина од 64 бита (двојна прецизност). Ако оваа екстра меморија ја немениме за зголемување на битовите на мантисата, тогаш прецизност значајно ќе ни се зголеми.
43
Вовед во Микропроцесорите и Микроконтролерите
Бинарно кодиран децимални броеви (Binary coded decimal, BCD) Бинарно кодираните децимални броеви се многу едноставни. Секој декаден дигит е претворен во бинарен и запишан како 4 битен или 8 битен бинарен број. Значи бројот 5 ќе биде запишан како 01012 или 000001012. Засега, ова ни изгледа дека е „обично“ бинарно претворање, но разлика се јавува кога имаме повеќе дигити. Да го земеме бројот 2510 кој можеме да го запишеме со 4 бити за дигит, и ќе добиеме 0010 01012. Ова користи еден бајт и се нарекува Запакуван BCD (Packed BCD). Алтернативно, можеме да користиме 8 бита за секој дигит, така 2510 ќе биде 0000 0010 0000 01012 и сега ќе користиме два бајта. Ова се нарекува незапакуван BCD (Unpacked BCD). Се јавуваат две неповолности. Прво, повеќето броеви ја зголемуваат должината после претворање во BCD, посебно ако користиме неспакуван BCD, или пак ако броевите се многу големи како 25 10 . Додатно е тоа што сите аритметики стануваат се потешки. Предностите се јавуваат кога микропроцесорите контролираат надворешен уред како бројчани екрани на бензиска пумпа или примање на влезови од тастатура. Кодирањето е едноставно, и не инволвира конверзија на броевите во бинарни, тие веќе се бинарни. Севкупно За аритметика користи бинарен систем За внесување и печатење на броеви користи BCD
Квиз 4 Во секој случај, одбери го најдобриот одговор. 1. Бројот -3510, неговиот втор комплемент, ако го изразиме со 8 битен бинарен број, е: a. 00100011. b. 1111011101. c. 11011101. d. 00110101. 2. Бројот 710 претворен во неспакуван BCD формат ќе биде: a. 1110 0000. b. 7H c. 0000 0111. d. 0111. 3. Бројот со означена магнитуда 110011002 е еквивалентен на: a. -7610 b. 20410 c. CCH. d. 121210 44
Вовед во Микропроцесорите и Микроконтролерите 4. Во бројот 0.5 10 : a. 10 е мантиса. b. 24 е експонент. c. 0 е битот за знак. d. 5 е основата (radix). 5. Број со означена магнитуда има: a. Нула за msb ако е негативен број. b. Еден за lsb ако е негативен број. c. Еден за msb ако е негативен број. d. Нула за lsb ако е негативен број.
45
Вовед во Микропроцесорите и Микроконтролерите
5 Вовед за логичките порти и нивното користење Отворени и затворени порти Во претходното поглавје, бинарните вредности за нула и еден беа претставени со два различни напони. Бинарна нула е напон близок до 0 V, додека бинарна единица е напон близок до +5 V (некои логички кола користат други вредности за напонските нивоа, но ова се популарни вредности и ќе ги користиме како пример). Порта претставува едноставно електронско коло кој има единствен излезен напон кој што кореспондира со едно од двете бинарни вредности. Овие порти се познати како „логички порти“ и излезниот напон е „логичка 0“ или „логичка 1“, за бинарните 0 и 1. Разликата е само во називот. Ако запрашате математичар или компјутерски програмер, тие ќе укажуваат на излезите како бинарни вредности, но инжињерот по електроника ќе ги нарече логички нивоа. Навистина ова не е битно.
Што решава за излезниот напон? Ако приклучиме еден или повеќе напони на влезот од портата, кои можат да бидат или логичка 0 или логичка 1, тогаш логичката порта во зависност од нејзиниот дизајн и од тоа што има на влез, ќе одлучи што напон ќе испродуцира на излез од колото. Има само четири основни дизајни на порти. Наречени се НЕ порта (NOT gate), И порта (AND gate), ИЛИ порта (OR gate) и ИСКЛУЧИВО ИЛИ порта (XOR gate). Се пишуваат со големи букви за да се избегнат било какви недоразбирања. Не не или и не и или не (not not or and not and or not)... Мало потсетување пред да започнеме. Логичките порти ни се мали паметни „другари“, но не се магија. Исто како и секое друго електронско коло, потребно им е напојување за да можат да работат. Бидејќи, претпоставуваме дека, сите знаете дека и микропроцесорите мораат да се напојуваат, како и логичките порти, во диаграмите ќе го изоставиме напојувањето, но тоа не значи дека тие не го користат! Сега ќе ги анализираме овие порти, почнувајќи од наједноставниот.
NOT (НЕ) порта Има само еден влез и извршува многу едноставна функција, едноставно само ја превртува бинарната вредност. Ако на влез имаме логичка 1 (единица), на излез добиваме логичка 0
46
Вовед во Микропроцесорите и Микроконтролерите (нула), т.е. ако имаме 0 на влез, тогаш излезот ние е логичка 1. На слика 5.1 е претставен симболот за NOT порта.
Слика 5.1 Симболи за NOT (НЕ) порта
Таблица на вистинитост Ова е еден начин на опис со зборови како работат портите. Едноставно, таа претставува листа на сите можни влезови заедно со соодветните излези. Таблицата на вистинитост за NOT портата е многу лесна. Има само два можни влеза: 0 и 1, како што е прикажано на слика 5.2.
Слика 5.2 Таблица на вистинитост за NOT порта
Па како ова е искористено во микропроцесорите? Таблицата на вистинитост ни кажува што се случува за единечен бит, но ние кај микропроцесорите ќе сакаме да ја искористиме NOT портата да ни инвертира хексадецимален 47
Вовед во Микропроцесорите и Микроконтролерите број на пример A4H. Во ваков случај хексадецималниот број се претвора во 8 битен бинарен број, овој процес не се прави со микропроцесорот туку се некое друга надворешно коло. Кога ќе стигне до микропроцесорот тој веќе е претворен во својот бинарен еквивалент т.е. 101001002. NOT портата има само еден влез, па за обработка на 8 битен бинарен збор нас ни се потребни осум NOT порти. Сега е лесно, секоја NOT порта ни ја превртува вредноста на само еден од битовите и сите излези заедно ни формираат нов хексадецимален број. Тоа е прикажано на слика 5.3. резултатот ни е хексадецималниот број 5BH. Ова е интересно, бидејќи ако го додадеме A4H на резултатот 5BH ќе добиеме FFH т.е. сите битови во бинарен формат ќе ни се „единици“ т.е. 111111112. Нема ништо посебно со бројот A4H, ова се случува со секој пар на броеви генерирани од NOT портите. Зошто е ова така? Клучот ни го дава слика 5.3.
Слика 5.3 Инвертирање на hex број
Уште нешто! Можеме да ја покажеме, т.е. означиме инверзијата, со цртање на линија над променливата. На слика 5.2 влезот ни беше прикажан со буквата А, а излезот со буквата Х. Едноставно можеме да напишеме дека: .
AND (И) порта За разлика од NOT портата, AND портата има повеќе од еден влез. Всушност можеме да користиме колку сакема влезови, но добрата вест е тоа што кај микропроцесорите се користат само два влеза, а ова ни го поедноставува симболот и таблицата на вистинитост. AND порта е, било кое коло кој на излез дава логичка (бинарен) 1 ако (и само ако) секој влез во колото ни е логичка 1. Кај микропроцесорите имаме само два влеза, па лесно ни е да кажеме дека на излез ќе имаме 1 само кога и двата влеза се логичка 1. Симболот за AND порта ни е прикажан на слика 5.4. 48
Вовед во Микропроцесорите и Микроконтролерите
Слика 5.4 Симболи за AND (И) порта
Таблицата на вистинитост дадена на слика 5.5 има четири редици со сите можни комбинации на влезовите. Каква улога има AND портат? Многу често се среќавеме со AND портата, но за тоа не сме свесни, на пример кога влегуваме во лифт, вратата мора да биде затоврена И (AND) мора да имаме притиснато копче за на кој спрат да оди, за да стартува моторот на лифтот. Ова е AND порта во акција. Кај микропроцесорите, употребуваме групи од AND порти за да обработиме повеќе парови на влезови во исто време, исто како што направивме кај NOT портите. За да ни е полесно најчесто ние користиме хексадецимални броеви за да опишеме група на влезови и излези, но треба да запамтиме дека реално сите работи се одвиваат бинарно.
Слика 5.5 Таблица на вистинитост за AND порта
49
Вовед во Микропроцесорите и Микроконтролерите Признаваме дека хексадецималните броеви навистина се само групи од единици и нули, но пуштањето на броеви низ AND порти малку ни изгледа необично. Ова (малку) ни го разјаснува слика 5.6, каде како за влезови ги користиме хексадецималните броеви 37H и 5BH кои ни даваат резултат 13H. Да забележеме, дека AND портата НЕ ги собира броевите. Уште нешто Во упатствата и книгите за AND функцијата се користи точка, па така ако имаме два влеза А и В, а за излез користиме Х, тогаш можеме да напишеме Х=А.В Некогаш многу е поедноставно да запишиме дека Х=АВ. Многу често се среќаваме и со симболот , па така имаме Х=А В.
Слика 5.6 AND порта во акција
NAND (НИ) порта Зборот NAND (НИ) е само кратенка од NOT (НЕ) и AND (И). NAND портата едноставно е AND порта проследена со NOT порта, па сите излези прикажани во AND таблицата на вистинитост се само инвертирани со NOT порта. Во симболот ова го претставуваме со мало кругче на крајот, пред излезот од симболот. Симболот и таблицата на вистинитост се прикажани на слика 5.7.
Слика 5.7 Таблица на вистинитост за NAND (НИ) порта
50
Вовед во Микропроцесорите и Микроконтролерите Подобро е да не вложуваме многу труд за да ја научиме NAND портата, само треба да запомниме дека исто е како AND порта само што излезот ни е инвертиран со NOT порта, која е додадена внатре во NAND портата. Записот на NAND портата е едноставно ставање на линија врз симболот, за да го прикажеме присуството на NOT портата. NAND порта со два влеза се пишува како .
или или
најчесто .
OR (ИЛИ) порта OR (ИЛИ) портата ни дава логичка единица кога еден од (двата) влезови е логичка единица. Исто како AND портата, исто така и OR портата може да има колку сакаме влезови, но кај микропроцесорите користиме верзија само со два влеза. Симболот и таблицата на вистинитост се прикажани на слика 5.8. и слика 5.9.
Слика 5.8 Симболи за OR (ИЛИ) порта
Слика 5.9 Таблица на вистинитост за OR (ИЛИ) порта
51
Вовед во Микропроцесорите и Микроконтролерите Уште нешто OR функцијата се бележи со + или понекогаш !, па така ако OR портата има два влеза А и В, а излез Х, тогаш тоа можеме да го запишиме како Х = А + В или Х = А ! В. Никој пат не правете грешка со овој плус знак, и не го сметајте како сума, 3 + 4 = 7.
NOR (НИЛИ) порта Како што очекуваме, ова е исто како OR порта со исклучок, на една NOT порта додадена на излезот. Симболот се бележи со линија за инверзија, врз изразот т.е. (види слика 5.10).
или !
Слика 5.10 NOR (НИЛИ) порта
XOR (Исклучиво-ИЛИ) порта Ова се нарекува Исклучиво-ИЛИ (Exclusive-OR) порта со кратенка XOR или EOR. За да го појасниме ова ќе дадеме два секојдневни примера.
Слика 5.11 XOR (Исклучиво-ИЛИ) порта
52
Вовед во Микропроцесорите и Микроконтролерите Кога влегуваме во лифт, операторот не прашува „Каде ќе одите нагоре или надолу?“, па ние треба да направиме избор и да решиме каде ќе одиме. Имаме два можни одговори и тоа „нагоре“ или „надолу“. По пат накај дома си купуваме сендвич. И продавачот на прашува „Дали сакате кечап или сенф?“. овој пат можеме да одговориме дека сакаме „кечап“ или „сенф“ или пак можеме да одговориме дека сакаме и од „двете“. Ова е добар пример со кој можеме да покажеме едно нешто што е многу лесно, да направиме да изгледа тешко. Зборот „или“ во Македонскиот јазик има две различни значења кои укажуваат на исклучување или вклучување. Првиот пример ни покажува за исклучително „или“ бидејќи мора да одговориме со едната или другата можност, но не и со двете заедно. Втората ситуација ни е влкучиво „или“ бидејќи освен едната или другата можност можеме и двете заедно да ги одбереме. И двете „или“ секојдневно ги употребуваме и ги разбираме многу добро и автоматски знаеме за кое „или“ се мисли. Кај XOR портата излезот ќе ни е логичка единица ако и само ако еден од влезовите ни е логичка единица, но никако и двата влеза. Се произведуваат само двовлезни XOR порти, без разлика дали се наменети за микропроцесорите или не (види слика 5.11). Разгледувајќи на друг начин, излезот од XOR порта е логичка единица, ако двата влеза се различни, па заради ова, многу често оваа порта се нарекува порта на „нееднаквост“.
Електронска смисла Кога сакаме да извадиме пари од нашата банкарска сметка, едноставно одиме до банкоматот и ја ставаме картичката во него, тогаш банкоматот бара од нас да го внесиме PIN-от кој најчесто е четирицифрен број. Ако бројот е точен, ќе имаме пристап до нашата сметка. Во позадина е микропроцесор со два корисни атрибути: 1 2
Микропроцесорите многу добро забележуваат дали бројот е нула или не. Тие содржат серија на XOR порти.
Па како може да го провери нашиот број? Еден лесен начин е да го спореди внесениот број со бројот кој ќе го исчитува од магнетната лента, од позадината на нашата картичка. Секое внесено бројче од нашиот PIN го претвора во хексадецимален четирибитен број и резултатот ни е 16 битен бинарен број внесен од тастатурата, и еден од магнетната лента. Овие два броја сега може да ги спореди. Во микропроцесорот имаме 16 XOR порти секоја со по два влеза и тоа еден од картичката и друг од тастатурата. Кога и двата бита се исти, без разлика дали се нули или единици, излезот ќе ни биде нула. 16-те излези брзо се прегледуваат и се бара некој излез да е различен од нула, кој ни укажува дека внесениот број е неточен. Процесот е прикажан на слика 5.12, но за појасна слика само 4 XOR порти се нацртани, реално има 16 од нив. 53
Вовед во Микропроцесорите и Микроконтролерите Уште нешто XOR функцијата се пишува со знакот ", па така ако имаме XOR порта со влезови А и В, и излез Х, тогаш тоа можеме да го запишаме со Х = А " В.
Слика 5.12 Употреба на XOR порта за споредба на броеви
XNOR (или ENOR, исклучиво НИЛИ) порта Ова е инвертирана верзија на XOR порта. Резултатот од ова е излезот да ни е логичка 1-ца само кога двата влеза имаат иста вредност т.е. се еквивалентни. Поради ова, најчесто се нарекува „Еквивалентна“ порта (види слика 5.13).
Слика 5.13 Таблица на вистинитост за XNOR (Исклучиво-НИЛИ) порта
54
Вовед во Микропроцесорите и Микроконтролерите
Три-состојбен бафер (tri-state buffer) Ова личи на логичка порта, но повеќе се однесува како прекинувач. На слика 5.14 е прикажан три-состојбен бафер на кој може да видиме дека се состои само од еден влез, еден излез и уште една конекција наречена „овозможувач“ (enable). Целта на линијата „овозможувач“ (enable) е да го уклучи или исклучи баферот. Кога баферот е уклучен, тогаш секоја сигнал донесен на влез се појавува и на излез, а кога е исклучен, тогаш не е присутен излезен сигнал од баферот.
Слика 5.14 Три-состојбениот бафер е како прекинувач
Зошто едноставно не користиме прекинувач? Проблемот со прекинувачот е, еднаш затворен, тогаш влезот и излезот се физички поврзани, па влезното и излезното коло се поврзани. Баферот е еднонасочен уред за сигнали, така излезот е изолиран од влезот за да спречи било какви промени во следното коло од интерференција со влезното коло. Да ги погледнеме колата Во NOT, NAND, NOR и XNOR портите како што прикажавме, има мало кругче на излез за да ни покаже дека излезот е инвертиран. Истото го имаме и кај баферот. Ако има кругче, тогаш излезот е инвертирана копија на влезот.
Слика 5.15 Ниско активен три-состојбен бафер
55
Вовед во Микропроцесорите и Микроконтролерите Ја употребивме истата работа и кај „enable“ влезот, ако е логичка 1 тогаш баферот е вклучен, прикажано на слика 5.15. Како и да е, ако треба „enable“ влезот да биде логичка 0 за да го вклучиме баферот треба да ставиме мало кругче на местото каде „enable“ линијата влегува во баферот. Кога баферот е исклучен се вика дека е оневозможен. Ова ќе ни овозможи да имаме четири можни бафери прикажани на слика 5.16.
Слика 5.16 Четирите типови на три-состојбените бафери
Квиз 5 Во секој случај, одбери го најдобриот одговор. 1
Која од прикажаниве порти на слика 5.17 има логичка нула на излез? a. A, B, C. b. A и D. c. B и D. d. Ниедна од нив
Слика 5.17 Кој излез дава логичка 0
2
Ако на осум NOT порти се донесе хексадецималниот број 4C, тогаш на излез ќе ја добиеме вредноста: a. B3. b. 4C. c. FF. d. CD. 56
Вовед во Микропроцесорите и Микроконтролерите 3
4
5
Која од двовлезните порти, има излез логичка 0, ако двата влеза се логичка 1: a. OR. b. AND. c. NOT. d. XOR. Портата е: a. Потребна да се задржи добитокот во ранчот. b. Секогаш работи со напојување од +5V. c. Електронско коло со три приклучоци. d. Електронски прекинувачко коло, кај кој излезниот напон зависи од влезовите. Со собирање на влезот и излезот на бинарната вредност од NOT порта: a. Може да биде 0, 1 или 2 во зависност од влезовите. b. Ќе ни даде напон околу 2.5 V. c. Секогаш резултатот е 1. d. Ова не е можно.
57
Вовед во Микропроцесорите и Микроконтролерите
6 Регистри и мемории Логичките порти кои ги претставивме во претходното поглавје се појавуваат во многу голем број кај микропроцесорите и во околните кола. Се наоѓаат во сите микропроцесори почнувајќи од најстариот и наједноставниот, па дури се јавуваат и во овогодинешниот „Ultimate Wonder Child“, па и во наредниот „Нов и Подобрен Ultimate Wonder Child MkII“. Кога се употребуваат логичките порти во микропроцесорите, обично тие се групирани во кола, наречени флип-флоп (flip-flops), каде, секој од нив, е способен да запамти еден бинарен дигит.
Флип-флоп или бистабилно коло Флип-флоп или бистабилно коло, е коло кое може да запамти еден бинарен бит, било да е 0 или 1. Една корисна карактеристика на флип-флопот е тоа што на излез може да има само 0 или 1. Не може да се скрие некаде измеѓу. Флип-флопот е прикажан на слика 6.1. Целта на влезот „clock“ (такт) е да му укаже на флип-флопот кога да ја прифати новата влезна вредност. Текот на настани е: 1 2 3
Прифати го бинарнот ниво кое треба да се запомни. Почекај малку (неколку наносекунди) додека да се воспостави точен напон. Доведи clock сигнал за да му кажеш на флип-флопот дека може да го меморира сигналот кој е присутен на влез.
Слика 6.1 Флип-флоп, основен блок во градбата на микропроцесорот
Зошто треба да почекаме? Кога ќе доведеме напон на подолг проводник, се надеваме дека промената на напонот ќе биде како на слика 6.2, но за жал, потребни му се неколку наносекунди за да се стабилизира. Порастот на напонот патува низ целиот проводник со што може да се рефлектира различен напон на влезот. Оваа рефлексија, повторно се саморефлектира, и после повеќе рефлексии, напонот полека се стабилизира до новото ниво на напон (слика 6.3). Истото се добива ако истуриме кофа вода во полуполна када, со што додадената вода предизвикува бранови кои се одбиваат, нанапред и наназад во кадата, се додека не се смири истата вода и се добие некое
58
Вовед во Микропроцесорите и Микроконтролерите ново ниво на вода во кадата. Ако не почекаме да се стабилизира напонот, може случајно да запамтиме погрешна вредност.
Слика 6.2 Напонот е вклучен – еве како сакаме да биде промената на напонот
Слика 6.3 Напонот е вклучен – еве што навистина се случува?
А што е работата на clock сигналот? Ова е само влез кој му укажува на флип-флопот дека е време да се прочита нивото на влезот. Сите микропроцесори оперираат временски добро организирани преку тајмер (puls clock) со што нè осигурува дека системот работи со точен редослед на настаните.
Слика 6.4 Користење на тактен пулс за контрола на тајмингот на колото
59
Вовед во Микропроцесорите и Микроконтролерите Clock сигналот обично е позитивен напонски пулс, кој може да се искористи за вклучување на две кола во различно време, ако едното коло е дизајнирано да се активира при зголемување на напонот, додека другото коло на намалување на напонот. На пример ако пулсот од слика 6.4 е широк 10 ns, тогаш овој пулс можеме да го искористиме за потребната пауза која е потребна за стабилизирање на напонот. Колото ни дава влезен напон кој се активира со позитивно растечка ивица, и по 10 ns покасно, негативно растечката ивица, дава инструкции дека флип-флопот може да ја запомни вредноста присутна на влез во тоа време.
Регистер Регистерот преставува колекција на флип-флопови. Бидејќи флип-флоповите можат да запомнат само еден бит, па за да можеме да работиме со 32 бити во исто време ќе ни бидат потребни 32 флип-флопови, кои ќе се однесуваат како 32 битен регистер. На слика 6.5 прикажан е 8 битен регистер.
Слика 6.5 8-битен регистер
Ригистерот има две различни групи на приклучоци, и тоа: податочни, битовите од 0 до 7, и контролни сигнали. Податочните приклучоци или податочни линии се оние кои ги носат бинарните нивоа кон и надвор од регистерот. Бројот на податочните линии укажува на големината на регистерот, па така 64 битен регистер ќе има 64 податочни приклучаци.
Три контролни сигнали од кои два ни се нови 1
2
Овозможи (Enable). Ова е одноставен вклучи/исклучи прекинувач за регистерот. Со ова се сретнавме во Глава 5, кај три-состјбениот бафер. Линијата врз зборот ни укажува дека е „влклучен“ кога оваа линија е „ниска“ или логички нула. Во ваква ситуација навикнати сме да викаме дека регистерот е „ниско активен“. Оттаму, следува дека регистерот е исклучен кога линијата за овозможување ни е логичка 1 или „високо“ ниво. Најчесто сите контролни линии се ниско активни. Добивката од тоа што имаме линија за овозможување (enable) е тоа што можеме да исклучиме некој регистер без физички да го тргнеме. Читај/запиши (Read/write). Термините „читај“ и „запиши“ се користат за да го опишат движењето на податоци, „запишуваме“ податоци во регистарот, потоа „читаме“ подтоци, за да ги видиме.
60
Вовед во Микропроцесорите и Микроконтролерите
Слика 6.6 Двонасочен податочен тек
Се сеќаваме на сликата 6.1. каде беше претставен еден флип-флоп, кој има посебни линии за читање и запишување на податоците, па така ако тоа ни е ОК за еден флип-флоп, тогаш за 64 битен регистер ќе ни бидат потребни 128 линии само за да можеме да се справиме со податоците за влез и излез. Со употреба на три-состојбен бафер од Глава 5, можеме да ја искористиме секоја линија и за читање и за запишување во зависност од тоа што сакаме да правиме. Сите три-состојбените бафери се контролираат со логичко ниво донесено на линијата читај/запиши. Конвенционално, линијата врз „запиши“ (write) ни кажува дека ова линија е на ниско ниво за да запишиме податок, и се разбира, високо ниво за исчитување на податок. Интересно е да погледнеме внатре во регистерот за да видиме како три-состојбениот бафер го постигнува овој двонасочен пренос со еден проводник. Погледнете ја сликата 6.6. Двата трисостојбени бафери поврзани се меѓусебно (грб-со-грб), во првиот пример, логичка 1 на влез ќе го овозможи горниот бафер, контролниот напон ќе го инвертира на логичка 0 со што ќе го оневозможи долниот бафер. Податоците ќе течат од лево кон десно. Кога ќе се смени контролниот сигнал на логичка 0, горниот бафер ќе се оневозможи, а долниот ќе го овозможи и ќе добиеме спротивен правец во движење на податоците. Приметете како двата бафери и инвертерот се искористени за секоја линија да може да се контролира. Една единствена контролна линија се користи за да се контролираат податочните линии во исто време.
61
Вовед во Микропроцесорите и Микроконтролерите
Зошто служат регистерите? Регистрите се, всушност, мемориски простор, внатре во микропроцесорот. Скоро сите микропроцесори се направени од регистри. Тие ги чуваат податоците кои ќе се користат, ги чуваат инструкциите кои ќе се користат, и ги чуваат добиените резултати. Речиси сите регистри користат три-состојбени бафер за да го контролираат правецот на текот на податоци. Најчесто, податокот кој треба да се зачува е донесен на влезовите од регистерот, и после мала пауза доволна за да се стабилизира напонот, регистерот е овозможен за работа преку напон на контролната линија. Тогаш информацијата е сигурно зачувана, се додека нема друго барање. Редицата на настаните е: 1 2 3
Линијата за читање/запишување е поставена на логичка 0 за да се дозволи регистарот да го прими податокот од надворешен извор. Контролната линија за овозможување (enable) го префрла во уклучена состојба ON трисостојбениот бафер на влезот од секој флип-флоп. Податокот е запишен во секој флип-флоп и тогаш контролната линија за овозможување (enable) го става регистерот во „спиење“ мод се додека нема потреба од повторно да го употреби.
Колку долго може да биде зачуван податокот? Податокот ќе биде зачуван се додека има напон, без разлика дали ќе настане грешка во опремата, или почесто, обично системот го исклучуваат. Во меморијата податокот останува не променет т.е. не се унишутува.
Шифт регистри (Shift register) Ова е една варијанта на регистерска шема, тие сепак се составени од група на флип-флопови, но има промени во меѓусебното поврзување. Погледни го распоредот на слика 6.7 и претпоставете што се случува во него.
Слика 6.7 Шифт регистер
Ова се нарекува шифт регистер бидејќи податокот се поместува од еден флип-флоп на друг секој пат кога ќе се појави пулс во тајмерот (clock). Попрецизно, на сликата е прикажан шифт во 62
Вовед во Микропроцесорите и Микроконтролерите лево регистер, бидејќи при секое поместување на битовите, тие се поместуваат за едно место на лево при секој пулс на тајмерот. Сите битови се поместуваат во исто време. Последниот бит, т.е. 7-от бит се испушта и се губи, додека на другиот крај доаѓа нов бит кој се зачувува во 0-тиот бит. На слика 6.8, регистерот е наполнет со бинарниот еквивалент на 3610 или 24H и избрано е да се пушти серија на нули на крајот кај 0-от бит.
Слика 6.8 Шифт во лево регистер
Пратејќи ги настанатите промени, обратете внимание што настанува со веќе запишаниот број: 1
2
3
После еден пулс, сите битови ќе се поместат за еден на лево. Нова „0“ ќе се внеси во 0от бит, а последниот бит од податокот, кој е на 7-от бит ќе отпадне. Зачуваните битови во овој момент се 01001000 и бројната вредност ќе биде 48H, или декадно 7210. Забележете како со поместување на битовите на лево ја помноживме вредноста со 2. После осум пулса, сите податоци во регистерот ќе се избришат и ќе се наполнат со нули. Тогаш регистерот ќе го чува бројот нула, што значи дека има граница колку пати ќе можеме да множиме со 2, со поместување на регистерот. После 5000 пулса, сеуште регистерот ќе биде полн со нули. Да признаеме, тоа ќе бидат нови нули, но тоа нема никаква разлика.
Што ќе се случи ако не донесеме податок на влезот од 0-тиот бит? Ако влезната конекција едноставно се остави неповрзано, тогаш ќе немаме информација за напонот кој ни доаѓа од првиот флип-флоп. Тогаш за влезот се вели дека „плива“ и тогаш се претпоставува дека напонот е низок или висок. Кога ќе доаѓа пулс од тајмерот тогаш резултатот ќе биде податок по случаен избор кој влегува во регистерот. Случајниот податок не е од корист за никој, па така ние овој проблем го решеаваме со произведување на регистрите 63
Вовед во Микропроцесорите и Микроконтролерите така да имат склоност кон едно логичко ниво. Тоа зависи од производителот, но повеќето такви „пливачки“ влезови ќе „пливаат“ високо и на влезот ќе имаме единици. Претходниот шифт регистер преставуваше шифт во лево регистер, што значи дека информацијата се полни од десната страна и се движи прогресивно на лево се додека регистерот не го отфрли податокот на другата страна. Со преуредување на регистерот, лесно може да се направи шифт во десно регистер како на слика 6.9. Особините и на овој регистер се сите исти, освен што податоците ги поместуваа на десно и бројот го дели со 2 секој пат кога ќе има пулс. Споредете ги сликите 6.7 и 6.9.
Слика 6.9 Шифт во десно регистер
Користење на шифт регистер во реалниот свет Интересно е тоа што шифт регистер може да изврши едноставно множење и делење, но исто така можат да извршуват и други работи кои се повеќе интересни. На пример можат да се користат за автоматско проверување на некој влез, на слика 6.10 е прикажан како може да се контролира автоматски издавач на билети. Потрошувачот става некоја сума на пари и притиска некое копче од приложените осум за да прецезира каков билет му е потребен, но кое копче ќе биде притиснато? Со притискање на некое копче може да се реализира излезен напон кој ќе се менува од логичка 0 до логичка 1, па за почеток може да претпоставиме ситуација да нема ниедно копче притиснато, па одговорот од секое копче ќе биде нула. Како што доаѓа потрошувач кој што ги има веќе прочитано инструкциите, става некоја сума на пари и повторно ги прочитува инструкциите и одлучува на кое копче ќе притисне. Со притискање на копчето се генерираат осум пулса и вредноста од секое компче се впишуваат во некој шифт регистер. Кога еднаш ќе се притисне копче тогаш нули и единици, во зависност од излезот на секое копче, ќе се впишат во шифт регистер. Излезот од секое копче е достапен за некое надворешно коло и ќе се активира друго коло кое ќе го извади билетот од жлебот за билети.
64
Вовед во Микропроцесорите и Микроконтролерите
Слика 6.10 Употреба на шифт регистер
За колку време треба потрошувачот да притисне копче? Микропроцесорот е неверојатно брз во споредба со нас. Ако фатиме во рака парче метал кое е многу загреано, тогаш веднаш ја тргнуваме раката. Но колку долго трае ова? За повеќето од нас, времето потребно за да размислиме и да реагираме е околу една десеттина од секундата. Тенисерите кои што ја примаат топката треба да предвидат на која страна да тргнат за да ја примат топката или едноставно да користат магија. Ако чекаат да видат каде точно оди топката, нема да можат навреме да стигнат. Повеќето луѓе ќе го притиснат копчето за помалку од 0.1 s. Што може микропроцесорот да направи за истото време од 0.1 ѕ? Модерните микропроцесори можат да проверат во какво состојба е копчето (притиснато или не) за околу 0.25 µѕ или 0.25 милионити дел од секундата. Со други зборови, тој состојбата на копчето може да је провери околу 4 000 000 пати во секунда. Нашето најдобро време на одзив е 0.1 ѕ. Микропроцесорот има време на одзив од околу 0.25 µѕ, ова значи дека микропроцесорот „живее“ со брзина од околи 400 000 пати побрзо од нас. Па замислете како ние би се чувствувале, ако се соочиме со суштевство наречено „ПочекајМалку“ кој се движи 400 000 пати побавно од нас? Ќе му биде потребно 11 часа за да притисне некое копче. Па така со компензација, тој ќе може да живее 28 милиони години!
Ротирачки регистри Ова претставуваат модифицирани верзии на шифт регистрите, и за да се направат потребни се две едноставни промени. Првата е тоа што податокот се внесува паралелно, ова значи дека податок се внесува во секој флип-флоп од регистерот во исто време. Ова има потреба од одделни конекции за пренос на секој бит, но добрата вест е тоа што податоците се внесуваат со еден контролен тајмер (clock pulse) со што тоа се одвива многу побрзо. Откога ќе се внесат сите битови, тие се движат низ регистерот како што прикажавме претходно, но сега наместо да се испушта последниот бит од податокот, тој е поврзн назад кон другиот крај од регистерот. Погледнете ги сликите 6.11 и 6.12. 65
Вовед во Микропроцесорите и Микроконтролерите
Слика 6.11 Ротарирачки во лево регистер
Слика 6.12 Движење на податоците во ротирачки во лево регистер
Како и шифт регистрите, така и ротирачките регистри можат да се направат да ротираат во десно, како и да ротираат во лево. Кај микропроцесорите се користи еден ист регистер за да ротира или поместува во било која насока. Користа од користење на ротирачките регистри наместо шифт регистрите е тоа што не се губат податоци. Видовме дека кај шифт регистрите прогресивно се празнат битовите во „кантата“. Кај ротирачките регистри податокот не се менува. Ако ротираме, да кажеме шест пати на лево, за да го вратиме оригиналниот податок, потребно е да ротираме шест пати во десно.
Мемории Функцијата на меморијте е да ја зачува информацијата – речиси исто како кај регистрите. Генерлно, регистрите се внатре во микропроцесорот и чуваат мали количини на податоци за моментална употреба и можат да прават корисни мали трикови како поместување и ротирање на битовите. Меморијата е дизајнирана за обемно запишување на податоци, и тоа е сè што прават – без трикови овој пат. 66
Вовед во Микропроцесорите и Микроконтролерите Па скоро без триков – понекој пат можат да памтат податоци дури и да бидат исклучени од напојување. Можноста да чуваат податоци и после исклучување на напојувањето е главната граница која ги дели мемориите на два типа. Ако ги изгуби податоците откако ќе биде исклучено напојувањето, тогаш станува збор за RAM или пребришлива меморија. Ако ги чува податоците без напојување, тогаш имаме ROM или непребришлива меморија. Ова е прикажано на слика 6.13.
Слика 6.13 Две класи на мемории
RAM RAM доаѓа од Random Access Memory (меморија со случаен пристап) кое е бесмислено, застарено, име. Треба да биде наречена read/write (читај/запиши) меморија или RWM, но тешко да се сменат работите ако веќе еднаш е прифатено тоа. Без разлика, да го оставиме името и да ја разгледаме меморијата. Меморијата претставува интегрирано коло и личи на мал микропроцесор и затоа обично се нарекува мемориски чип. Внатре има многу голем број на регистри, стотици, илјадници, милиони во зависност од големината на меморијата. Меѓу другото, кога зборуваме за мемории, го употребуваме зборот „ќелија“ наместо регистер, без разлика што се мисли на истата работа. Па така, секоја внатрешна ќелија може да има 4, 8, 16, 32, или 64 бити запишано во флипфлоповите. На слика 6.14 е прикажан изглед на регистерот за многу мала меморија која содржи 16 ќелии или локации, која секоја од нив може да чува 4 бита и дадени се мемориски броеви или адреси.
Слика 6.14 Распоред на ќелиите во меморијата
67
Вовед во Микропроцесорите и Микроконтролерите
Зборот RAM Во праисториските компјутерски денови, меморијата се полнеше редоследно. Првата гупа од битови ќе се сместеше во локација 0, дригата во локација 1, потоа во локација 2 и се така, слично како кај шифт регистер. Вака времето за запишување и читање на информацијата се зголемува, како што се полни меморијта. Ова се нарекува sequential access memory (или serial access memory, секвенцијален/сериски пристап на меморија), или SAM. Ова беше добро додека големите компјутери користеа 256 битни информации, но ова е невозможно бавно ако го употребиме овој трик за гигабајт. За да го надминеме овој проблем, најден е начин со кој се пристапува до било која мемориска локација, каде времето на пристап не зависи од тоа каде треба да се зачува податокот, туку секогаш е исто. Овој систем е наречен случаен пристап на меморија (random access memory) или RAM. Сите мемории, без разлика дали се пребришливи или не пребришливи се дизајнирани со случаен пристап, па подобро би било да се поделат на два типа, и тоа мемории читај/запиши (read/write) и само читај (only read) мемории. Но ова нема да се случи, бидејќи RAM е многу цврсто вкоренет.
Пристап до меморијата Секоја локација на меморијата си има свој број, наречен адреса. На слика 6.14, 16-те локации на меморија ќе бидат нумерирани од 0 до 15, или бинарно 0000-11112. Ќелиите се поставени како во правоаголник, во случајот 4 4 квадрат со четири колони и четири редици. За да се пристапи до некоја ќелија, треба да биде селектиран редот кој ја содржи ќелијата, плус мора да биде активирана онаа колона што ја содржи таа ќелија. Засенчаната ќелија на слика 6.15 ја има адресат 0110 што ни укажува дека нејзиниот ред е 01, а нејзината колона е 10. За да можеме да пристапиме до ќелијата, бинарната адреса треба да се доведи до декодерите за редици и колони, па така кога е доведена адресата 0110, првата половина од адресата, 01, е доведена до декодер за редици, а втората половина од адресата се носи до декодерот за колони. Колото декодер, е мало логичко коло кое, кога ќе прими некоја адреса на некој локација, способен е да ја активира соодветната редица и колона.
Слика 6.15 Селектирање на мемориска локација
68
Вовед во Микропроцесорите и Микроконтролерите Максималниот број на локации кои што можат да се адресираат зависи од бројот на бити во адресата. Веќе видовме дека 4 битна адреса може да пристапи до 16 локации. Ова е заради тоа што 24 = 16, па генерално 2n = број на локации, каде n е бројот на бити во адресата. Еден реален пример: ако имаме 20 адресни линии тогаш ќе имаме 220 = 1 048 576 или 1 мега локации.
Два типа на RAM RAM чиповите можат да се дизајнираат на два различни начини кои ги нарекуваме, статичен RAM (SRAM) или динамичен RAM (DRAM), како на слика 6.16. Static (Статичен) RAM Ваквиот RAM е изграден од флип-флопови. Проблемот со флип-флоповите е тоа што низ нив цело време тече струја, што доведува до растење на температурата, затоплување, па така на еден чип, не може да се пакуваат многу блиску. Корисно е тоа што тие се многу брзи и се употребуваат онаму каде што ни е битна брзината на пристап. Статичкиот RAM најчесто се нарекува SRAM.
Слика 6.16 Два типа на RAM
Динамички RAM Овие мемории ја чуваат информацијата во кондензатори, тоа се мали компоненти кои чуваат електрично полнење како статичен електрицитет. Се нарекуваат „динамички“ поради недостатокот што тие го имаат, т.е. електрицитетот кој е во кондензаторот се „излева надвор“ поради неперфектното изолирање. Па така, после некое време електричното полнење треба да се дополни, инаку, DRAM-от ќе ни се испразни и цела зачувана информација ќе ја загубиме. Ова допoлнување се нарекува „освежување“ и треба да се извршува во интервали од околу 2 ms од страна на DRAM контролно коло. За да се избегне интерференција со работата на микропроцесорскиот систем, освежувањето се реализира во позадина без разлика дали се користи DRAM-от. Кога еднаш ќе се наполни статичко полнење, повеќе не ни е потребно напојување (освен за освежувањето), со што многу малку топлина се генерира и можеме да ја спакуваме меморијата во многу мали димензии. Велиме дека има високо ниво на пакување.
69
Вовед во Микропроцесорите и Микроконтролерите
Организирање на меморијата Меморијата содржи неколку ќелии или регистри, кои истите можат да чуваат информација за некој број на бити. На слика 6.14 прикажавме навистина едноставна меморија со 16 локации, каде секоја може да чува 1, 4 или 8 бити. Организацијата на меморијата секогaш се пишува како „број на локации бити кои можат да се зачуват“, па така оваа меморија може да има организација од 16 1, 16 4 или 16 8. Статичките RAM мемории најчесто чуваат по 8 бити во секоја локација, па типична големина на чипот би бил 131 072 8 кој ни дава вкупен капацитет на простор од 1 048 576 бити. Ово најчесто се запишува како 128 К 8. Динамичките RAM мемории чуваат или 1 или 4 бити во секоја локација. Многу пополарна организација е еден бит во секоја локација, па така типичната организација би била 1 048 576 1, така што, како што се гледа, всушност имаме ист број на бити кои можат да се зачуват и со дадениот пример за SRAM – промена има само во организацијата.
Три типа на ROM Сите ROM мемории информацијата ја запишуваат на повеќе или помалку перманентна основа. Во пракса, од ROM меморијата можеме да читаме, но не можеме дa запишеме нова информација. Со други зборови не можеме да пишуваме во неа (види слика 6.17).
Слика 6.17 Три типа на ROM
Маскиран ROM Маскираниот ROM е произведен врз основа на некоја наша спецификација, и истата не може да се промени. Мора да бидеме многу сигурни дека информацијата која треба да се запише е точна, пред да биде направен, во спротивно се ќе отиде во „кантата за отпадоци“ и личноста одговорна за тоа најверојатно ќе си бара нова работа. Почетната инвестиција е многу голема за нејзино правење, и вреди да се прави само ако ни се потребни најмалку неколку илјади идентични чипови (види слика 6.18). 70
Вовед во Микропроцесорите и Микроконтролерите
Слика 6.18 Економски избор на ROM
Програмабилен ROM (Programmable ROM, PROM) Овие чипови по набавка се со сите нули за податоците, со мали внатрешни осигурувачи, и кога еден од осигурувачите се тргне тогаш соодветниот бит се сменува од 0 на 1. За да се постигне ова потребна ни е опрема за програмирање. Оваа опрема не е многу скапа ако сакаме да програмираме еден PROM, но ако сакаме да имаме големо производство купувањето на опрема ќе не чини малку повеќе. Ако еднаш се тргне осигурувачот, тогаш не можеме да го вратиме и ако е направена некаква грешка тогаш сме го потрошиле чипот за џабе. PROM е поисплатлив за мало производство бидејќи почетните трошкови се многу помали за разлика од максираниот ROM, но вие треба да го извршите програмирањето.
Избришлив програмабилен ROM (Erasable programmable ROM, EPROM) Како што ни кажува името овој чип може да се програмира и ако се предомислиме можеме повторно да го испрограмираме. За бришење на податоците се користат два метода и тоа со – ултравиелетова светлина или со електронски напонски пулс. EPROM мемориите се идеални за изработка на прототипи, бидејќи лесно можат да се менуваат податоците при некаква модификација во програмата.
UVEPROM Чипот се „бомбардира“ со сноп од ултравиолетова светлина низ проѕирен прозорец на чипот. За ова ние е потребен специјално направен EPROM бришач, го ставаме чипот во него, ја затвораме вратичката и уклучуваме тајмер и после неколку минути сите податоци ни се избришени. Кога ќе се изврши бришењето, сите излези се поставени на 1. Обично, потребна ни е истата опрема за програмирање на таквиот PROM. За неколку минути ќе го наполниме со нови податоци и со тоа сме го завршиле процесот. Можат да се бришат и повторно да се програмираат околу 700 пати пред да станат многу „неспремни“ за бришење со што животниот век им завршува. Еднаш програмиран PROM податоците во него се сигурни околу седум години, па за подолгогодишна употреба на меморијата, најдобро е да ја обновуваме содржината, или уште подобро ако е тоа е возможно да користиме маскиран ROM. 71
Вовед во Микропроцесорите и Микроконтролерите Претпазлива забелешка: бидете многу внимателни да не гледате во ултравиолетовата светлина од EPROM бришачот, бидејќи брановата должина на светлината е 253.7 nm и е многу опасно!
Електронски избришлив програмабилен ROM (Electrically erasable programmable ROM, EEPROM) Кај овој чип потребен ни е електронски напонски пулс на влезот за да ги избришиме претходните податоци и потоа повторно да можеме да го програмираме на истиот начин како и UVEPROM. Има една додатна привилегија, а тоа е што можат индивудуални делови од податоците да се испрограмираат повторно без претходно да се избришат сите податоци, како што беше случај кај UVEPROM. EEPROM може да биде со сериски пристап (SAM), но обично тие се со случаен пристап. Повторнот програмирање може да се изврши и додека е инсталиран во некој микропроцесорски базиран систем, бидејќи не ни е потребен одделен програматор. Недостаток е тоа што многу бавно се програмираат и имаат ограничен број на циклуси за повторно програмирање.
Изглед на пиновите кај EPROM На слика 6.19 е прикажан изглед за пиновите за 1 Mb (1 048 576 бити) EPROM со организација од 131 072 8 бити.
Слика 6.19 Изглед на пиновите кај EPROM
72
Вовед во Микропроцесорите и Микроконтролерите
Напојување Основното напојување за да може да работи чипот е +5 V донесен на V+ пинот и 0 V на GND (ground, заземјување) пинот. За да се програмира меморијта, тогаш програмабилен напон се носи на Vpp. Кога не се програмира, тогаш на Vpp треба да има напон од +5 V. Бидете претпазливи при читањето на упатството за меморијата, бидејќи вредноста на Vpp не е стандардизиран.
Адресни пинови Адресните пинови секогаш се нумерираат почнувајќи од А0, па видовме дека бројот на локации е изразен со 2n, па така за 17 адресни линии (А0 до А16) бројот на локации би бил 2 131 072.
Податочни пинови Како кај адресните пинови, и овие пинови почнуваат со нумерирање од нула. Кај EPROM-от прикажан на слика 6.19 се користи скратеницата D за податоци (data) и почнуваат од D0 до D7 – севкупно осум пина. Некои производители ги нарекуваат излезни пинови (output) и нумерирањето е O0, O1, O2 итн. Излезот од овие пинови се или 0 V или +5 V или блиску до овие вредности.
Контролни пинови 1
2
Chip enable (CE, овозможувач на чипот), понекогаш наречен пин за избор на чипот (chip select, CS), е главниот вклучи/исклучи прекинувач на чипот. Обично е ниско активен, т.е. на чипот му е потребен напон од логичка 0 за да биде уклучен чипот. Ова е покажано со црта над CE. Кога ќе се исклучи чипот, тој оди на „спиење“ и моќноста се намалува за околу 150 пати. Output enable (OE, овозможувач на излезите) го остава чипот уклучен, но излезот е дисконектиран од податочните пинови. Ова е направено со оневозможување на серија три-состојбени бафери веднаш пред податочните пинови. Со дисконектирање на излезните пинови е многу побрзо одошто исклучување на чипот. Внимавајте на цртата врз името која ни кажува за поларитетот кој ни е потребен.
Неповрзани пинови Овие се обележани со NC и не се користат. Тие физички се одделени во внатрешноста на чипот и немаат никаков ефект. Треба да се остават неповрзани.
Изглед на пиновите кај SRAM Погледнете ја слика 6.20 каде е прикажан SRAM, повеќето од пиновите ќе ги препознаете бидејќи се истите како кај EPROM. 73
Вовед во Микропроцесорите и Микроконтролерите
Слика 6.20 Изглед на пиновите кај SRAM
Податочни пинови Бидејќи SRAM ни е читај/запиши (read/write) меморија, податочните пинови се користат за читање податоци од чипот и да се запишат во микропроцесорскиот систем. Така овие се наречени влез/излез (input/output) пинови (I/O) и вообичаено се нумерираат почнувајќи од нула.
Контролни пинови 1
2
Write enable (%&, овозможувач за запишување) ги контролира внатрешните трисостојбени бафери кои овозможуваат читање или запишување на податочните пинови. Цртата врз WE, ни кажува дека за да запишуваме податоци, треба пинот да биде на ниско ниво. Има два пина за избор на чипот (chip select, CS), едниот активен на ниско, а другиот е активен на високо ниво. За да се овозможи чипот, мора и двата напони да се со точни вредности. Ова дава поголем степен на флексибилност кај дизајнерот на системот. Ако не се потребни и двата, тогаш едноставно едниот можеме постојано да го држиме на соодветен напон, а другиот ќе го употребиме за контрола при работата со чипот.
Изглед на пиновите кај DRAM Row address strobe (RAS) и Column address strobe (CAS) Стробирана адреса на редица (RAS) и стробирана адреса на колона (CAS) На прв поглед, ни изгледа дека нема доволно адресни пинови за да можат да се адресира сите локации. А0 до А9 се само 10 пинови, кои ни кажуваат дека има 210 или 1024 локации. Трикот овде е да ги искористиме истите пинови двапати за да можеме да добиеме вкупно 220 или 1 048 576 адреси.
74
Вовед во Микропроцесорите и Микроконтролерите Редот на настаните ни кажува да кога RAS линијата е на ниско ниво долната половина од адресата е наполнета во редиците (Rows) – потоа RAS се враќа на високо ниво. Потоа CAS се носи на ниско ниво додека остатокот од адресата нè се наполни во колоните (Columns). После ова, состојбата на линијата за запис (исто како R/W) одлучува дали податоците ќе влегуваат или излегуваат од DRAM-от. Само еден бит е зачуван во секоја адреса, податоците влегуваат во Din пинот (data in) и излегува преку Dout пинот (data out).
Некои други мемории кои не се вклопуваат во генералниот модел на мемории SIMMs Single in-line memory (меморија во еден ред) е модул кој е колекција на одделни RAM чипови кои се поставени на едно парче плоча за да си ја олесниме и убрзаме инсталацијата. Тоа всушност, не се различни типови на мемории.
RAM картички Проблемот со RAM мемориите е тоа што ја губат информацијата откога ќе се исклучи системот. RAM картичките го надминуваат ова со користење на своја вградена батерија. Па така, RAM картичките можат да се извадат од системот без да ги загубат податоците, т.е. ова е RAM кој се претвара дека е ROM. Нејзиното работење со целосна брзина и постојаност трае како и животот на батеријата, околу 10 години.
Flash меморија Ова е непребришлив RAM (NVRAM). Всушност ова е реална форма на RAM со батерија која ни служи за напојување после исклучувањето. Нешто слично како верзија на RAM картичка.
Мапирање на меморијата Микропроцесорите имаат неколку адресни линии кои се користат за пристап до RAM, ROM или до некој друг уред во системот. Како што веќе кажавме кај мемориските чипови, за севкупно адресирање од страна на микропроцесорот беше употребена формулата 2n каде n е бројот на адресни линии. На пример, кај 8 битен микропроцесор, генерално имаме 16 адресни линии, кои можат да имаат пристап на 216 или 65 536 или 64 бајти на меморија. Digital Alpha 21064 има 34 битни адресни линии кои ни даваат 234 или малку повеќе од 17 Гигабајти. Оваа меморија е поделена помеѓу RAM-ови, ROM-ови и други уреди, вклучувајќи е неколку за употреба од страна на самиот микропроцесор. Дизајнерот на системот треба да одлучи како ќе ја искористи расположливата меморија. Тоа ќе го покажеме со користиње на мемориска мапа на 8 битен микропроцесор. Почнуваме со празен простор како на слика 6.21. Кога ќе се вклучи микропроцесорот тој веднаш ја извршува првата програма која е во него. Како знеа која програма е прва? Одговорот на ова е, дека при изградба на микропроцесорот се внесува која е таа адреса. 75
Вовед во Микропроцесорите и Микроконтролерите
Слика 6.21 Почетна точка за мемориската мапа
Да претпоставиме дека стартната адреса е FFFAH, тогаш ние мора да имаме внесено некоја корисна информација на таа адреса која микропроцесорот треба да ја следи. Ова ни кажува дека на врвот од мемориската мапа мора да има ROM меморија. Некои мемории имаат можност за многу брзо програмирање, па за ова ни е потребно RAM меморија на дното од мемориската мапа. Па останатите RAM и ROM мемории можат да се стават на било која позиција од мапата. Ова ни кажува дека мапирањето не мора да биде целосно. Билансот помеѓу RAM и ROM мемориите зависи за која цел ќе се користи системот. За систем на контрола на некое производство, повеќето од меморијата ќе биде ROM додека за компјутер ќе ни треба повеќе RAM. Едноставно мемориско мапирање е прикажано на слика 6.22.
Слика 6.22 Типична мемориска мапа за мал систем
76
Вовед во Микропроцесорите и Микроконтролерите
Подредување на адресите Ова е само вежба со хексадецималните броеви, каде калкулатор кој е способен да работи со хексадецимални броеви е бесценет. 1 kbyte меморија зафаќаат 210 или 1024 локации, што во децимално е 400H. Првата секција на RAM се протега до: почетната адреса + највисоката адреса на RAM меморија = 0000H до 03FFH, така највисоката адреса на секцијата „брзи инстрикции“ е 03FFH. Корисничката RAM меморија се протега од 0400H до 3FFFH, па колку килобајти меморија е ова? Ова се 15 килобајти меморија, ова се добива со одземање на 0400H од 4000H и се добива резултат од 3C00H и со делење на овој резултат со 400H т.е. хексадецималниот еквивалент за 1 килобајт. Делењето најдобро е да го направите со калкулатор. Запомнете го фактот дека корисничката RAM меморија завршува во 3FFFH, т.е. вкупниот број на локациии, вклучвајќи ја и првата на 4000H, така е позгодно да се користи 4000H непосредно од мемориската мапа. На сличен начин, видео RAM меморијата, која ја чува информацијата за тоа што треба да прикаже на екранот, може да се најде со одземање на долната адреса D800H од највисоката адреса E000H и се добива 800H, па со делење на резултатот со 400H добиваме 2 килобајти на видео RAM меморија.
Пример Ако 12 килобајтен блок од ROM меморија почнува на адреса 8000H, која е највисоката адреса на истата ROM меморија? Бидејќи 1 '()*+ 1024, следува дека 12 '()*+, 12 1024 т.е. декадно 12 288 или хексадекадно 3000H. Сега треба да бидеме малку претпазливи, ако ROM меморијата содржи 3000H адреси, тогаш тие ќе почнуваат од 0 па се до 2FFFH. Така со додавање на стартната адреса од 8000H на највисоката адреса ќе се добие 8000 2FFF AFFFH, која претставува највисоката адреса на ROM меморијата.
Квиз 6 Во секој случај, одбери го најдобриот одговор. 1
2
Кај SRAM со 12 адресни и 8 податочни пинови ќе имаме: a. Организација од 12 8 бити. b. Приближно 16 ¾ М локации. c. Организација од 12 8 бити. d. Капацитет од 32 768 бити. Бистабилно коло (a bistable): a. Може да чува двобитна информација. b. Тоа е друго има за флип-флоп c. Има „летачки“ излез. d. Е направен од неколку регистри. 77
Вовед во Микропроцесорите и Микроконтролерите 3
4
5
Пинот кој е најсличен со оној кој е означен како CS, може да се означи како: a. ОЕ. b. CAS. c. CE. d. Vcc. Ако во мемориското мапирање, најниската адреса на 8 килобајтен RAM e 1000H тогаш највисоката адреса ќе биде: a. 8192H. b. 2FFFH. c. 7FFFH. d. 3000H. UVEPROM: a. Се програмира со ултравиелетова светлина. b. Ги губи податоците ако се исклучи од напојување. c. Е некоја форма на непрепришлива меморија. d. Се употребуваат кај SIMM.
78
Вовед во Микропроцесорите и Микроконтролерите
7 Микропроцесорски базиран систем Колку едноставен е всушност микропроцесорскиот базиран систем? Очигледно треба да содржи микропроцесор, кој претставува едно едноставно електронско коло, кое треба да се програмира. Ова значи дека треба да му се внесат серија на инструкции кои треба да ги извршува. Како и да е, со програмирање на микропроцесорот добиваме бинарни броеви, како резултат, кои претставуваат едноставни чекор по чекор инструкции, кои треба да се извршат. Овие интрукции мора да се зачуваат во некоја меморија, но дали треба тие да се зачуват во RAM или ROM меморија? Обавезно тоа мора да е ROM меморија. Треба да запомниме дека RAM меморијата чува случајни податоци и при првото стартување на микропроцесорот, ако тој на пример ни контролира некоја операција во фабрика за динамит, последно нешто што сакаме е да се извршуваат инструкциите по случаен ред и тоа со брзина од милионити дел од секундата! Што одлучува за тоа колку брзо ќе се извршуваат инстрикциите? Веднаш ќе кажеме дека тоа е регуларниот пулс од напонот кој е донесен на микропроцсорот. Овој напонски пулс се нарекува clock pulse.
Clock (такт) Clock колото ја контролира работата на микропроцесорот. Ова коло произведува напонски пулсови, нешто како саат кој чука. Цел систем работи секвенцијално и ја извршува својата работа една после друга. Еден чекор се комплетира за секое отчукување на clock системот. Clock колото најчесто е вградено во микропроцесорот, но тој може да биде и целосно надворешно. Точната брзина на clock колото не е толку важна за разлика од нормалниот часовник. Може да работи со нормална брзина од 200 MHz, но нема да се направи голема паника ако работи и на 199 MHz, или пак 201 MHz. Кај модерните часовници, еквивалентната грешка е околу 7 минути на ден, па тоа би било големо доцнење за некој снабдувач. На слика 7.1 е прикажан типичен clock пулс.
Слика 7.1 Тактен пулс на 200 MHz
79
Вовед во Микропроцесорите и Микроконтролерите Обликот на пулсот детално е опишан во спецификацијата на микропроцесорот. Ќе се појават сериозни проблеми, ако не ги знаеме одредените граници за пулсот. Да претпоставиме дека имаме две кола кои работните напони се со незначителна разлика и треба да стартуваат во исто време. На слика 7.2 двата работни напони се јавуваат во виртуелно скоро ист момент, бидејќи растењето на пулсот е многу брзо. На слика 7.3 clock пулсот расте и опаѓа побавно, па така Колото 1 ќе стартува пред Колото 2. Во овој пример разликата е околу 2 ns. Дали разликата од 2 ns е значајна, ќе зависи од соодветните кола.
Слика 7.2 Речиси вертикалната предна ивица, значи нулто време на растење
Во сите техничките податоци за микропроцесорите, максималното време на растење и опаѓање на пулсот, како и меѓу кои напони да биде тоа време измерено, е по договор. На пример, микропроцесорот Intel 80386 има работен напон од 0–5 V и мора да има време на растење (и опаѓање) помалку од 2 ns, измерено помеѓу 0.8 V и 4.2 V. Ако времето на растење (rise time, означенот како tr или trise) не е дадено, тој може да се измери помеѓу вредностите на напонот за 10% и 90% од работниот напон. Секој микропроцесор има максимална и минимална фреквенција за clock пулсот.
Слика 7.3 Времето на растење е околу 2 ns
Зошто имаме минимална брзина? Микропроцесорите се изгредени од регистри и складишта наречени кондензатори, и тие се слични како динамичкиот RAM, и потребно им е повремено освежување. Со намалување на clock брзината, интервалот помеѓу освежувањата се зголемува и може да дојде до колапс, ако се случи ненавремено освежување на регистрите т.е. кондензаторите, со што ќе ги изгубат сите 80
Вовед во Микропроцесорите и Микроконтролерите информации. Типично, минималната брзина е околу една четвртина од максималната брзина. Intel-овиот 80386 може да се спушти до 800 KHz. Првиот микропроцесор, 1971, беше Intel 4004, и работеше со брзина од 0.108 MHz и можеше да обработи 4 бита во единица време. Во 1998, 64 битниот Alpha 21164 работи на 600 MHz. Скоро секој основен систем ќе содржи микропроцесор, clock и ROM чип за да може да ја изврши вградената секвенца на инструкции. Друга важна работа е дека терба да има кабли или друг вид на проводници за да може да се поврзи во колото. На слика 7.4 е прикажан наједноствниот микропроцесорски базиран систем, со своите најбитни работи. Обично, напојувањето не се прикажува.
Слика 7.4 Наједноставен микропроцесорски базиран систем
Сите микропроцесори се внатрешно поврзани, и со остатокот на системот се поврзува со колекција на проводници наречени магистрали (buses).
Магистрали Овие проводници се во групи, бидејќи сите одат до исто место и скоро за исти цели. На пример, 8 битен микропроцесор, нормално користи 8 проводника за да ги пренесува податоците помеѓу микропроцесорот и меморијата. Диаграмите ќе бидат многу комплицирани ако ги цртаме сите кабли посебно. Магистралите ни претставуваат колекција од кабли (проводници) кои имаат слична функција. Кај микропроцесорски базирани системи имаме три главни магистрали: податочна магистрала, адресна магистрала и контролна магистрала. Податочната магистрала е двонасочна и служи за пренос на податоците во системот. Информацијата влегува во микропроцесорот, а резултатот излегува од него. Адресната магистрала се „грижи“ за адресите и таа е еднонасочна и тоа од микропроцесорот кон меморијата, или до некој друг уред. Контролната магистрала е малку поразлична од претходните две, таа е некако „губитничка“ колекција на кабли. Ако го погледнеме микропроцесорски базираниот систем, слика 7.4, лесно ќе ги воочиме податочната и адресната магистрала, бидејќи тие содржат многу паралелни 81
Вовед во Микропроцесорите и Микроконтролерите конекции. Како и да е, контролната магистрала е само колекција од останатите потребни конекции како што се избор на чип (chip select) и читај/запиши (read/write) пиновите. Адресните, податочните и контролните сигнали треба да се носат, како во внатрешноста на микропроцесорот така и во надворешниот систем. Така ќе се сретнеме, со внатрешни, и со надворешни магистрали.
Влез/излез кола (Input/Output) Сигналот на податочната магистрала има многу ниско ниво на моќност, па за да биде од корист тој мора да се засилува. Првиот чекор е да се стават серија на засилувачи: по еден на секој крај од конекциите на податочната магистрала, но ова многу брзо се заменило со користење на пософистициран чип со повеќе можности. На пример, ако сакаме да испраќаме сигнал до принтерот во интервали од 1 ms, нема да биде логично да го ангажирме главниот процесор да ги брои овие интервали, туку подобро би било тоа да се „каже“ да го изработи излезниот чип, принтерот, и да го оставиме микропроцесорот да си работи друга поважна работа. Излезните уреди станаа многу комплексни и се среќаваат со разновидни имиња: I/O controller PIA VIA PIO PPI … и многу други.
-
Input/output controller Programmable interface adapter Versatile interface adapter Programmable input/output Programmable peripheral interface
Без разлика со какво име ќе биде наречен некој уред, тие во основа се исти, и се суштински за секој микропроцесорски базиран систем. Надограден основен систем е прикажан на слика 7.5.
Слика 7.5 Додадено е влезно/излезен чип
82
Вовед во Микропроцесорите и Микроконтролерите
Практичен микропроцесорски систем Без разлика дури и во најминималните кола, има потреба од „малку“ RAM. Па дури и микропроцесорски базиран систем кој контролира рерна, сепак потребна ни е вештина да може да ги извршува инструкциите за промена на температурата, временските циклуси, брзината на вентилаторот итн, поради ова мора да имаме малку RAM. Некои микропроцесори имаат мали количини на RAM додадени внатрешно, доволно, како за ваквите системи, да можат да работат, но сепак со лимитирани способности. Ако додадеме надворешен RAM, микропроцесорот ќе ја контролира работата на три чипови: ROM, RAM и I/O (влез/излез). За да ја контролира насоката на информацијата микропроцесорот мора да испрати сигнал на пинот за избор на чипот и читај/запиши пинот преку контролната магистрала. Читај/запиши сигналите им кажуваат на RAM меморијата и на I/O чипот дали треба да читат, т.е. да ја примат информацијата од податочната магистрала, или да запишат информација во податочната магистрала. Избор на чипот, претставува вклучи/исклучи прекинувач за секој чип и треба да бидеме многу претпазливи и да се осигураме дека имаме само еден вид на информација приклучено на податочната магистрала во даден момент. Ако еден ROM чип сака да запише бинарна 0 на една конекција од податочната магистрала, а во исто време друг ROM или RAM чип исто сака да запише бинарен 1, ќе настане до несогласување помеѓу двата чипа. Што ќе се случи? Најчесто доаѓа до „караница“ помеѓу чиповите и на крај едниот чип ќе биде „осуден на смрт“. Да не се случи ова, се користи адресен декодер за да даде примерок на адресната магистрала и да го избере соодветниот чип. Ако микропроцесорот сака да прати некакви податоци на RAM чипот, тогаш ја дава соодветната адреса на адресната магистрала која е приклучена за ROM-от, RAM-от и за контролерот за I/О, и ова нема никаков проблем додека тие се исклучени. Адресниот декодер е поле од логички порти кои се организирани во согласност со мемориската мапа на системот, ја обработува адресата, од адресната магистрала, и излезот го вклучува RAM чипот, а ги исклучува ROM и котролерот за влез/излез. Адресниот декодер може да се дизајнира да може да контролира колкав и да е бројот на надворешни чипови во системот. Надополнет систем е прикажан на слика 7.6.
Како тоа сè работи За да ја демонстрираме неговата операција, можеме да побараме да ни изврши некаква задача. Инструкција: испрати го бројот 25H, кој се наоѓа во ROM-от, и зачувај го во RAM-от на адреса 2500H. Еве што ќе се случи (акциите пратете ги според слика 7.6):
83
Вовед во Микропроцесорите и Микроконтролерите
Слика 7.6 Комплетен микропроцесорски систем
1 2
3
4
5 6
7
Микропроцесорот треба да ја исчита инструкцијата од адресата во ROM-от. Ова го прави со ставање на адресата во адресната магистрала. Адресата се дава на ROM-от, RAM-от, како и на адресниот декодер. Ова нема да предизвика никакви проблеми бидејќи во тој момент, немаме сигнал за селектиран чип. Кога логичките порти во адресниот декодер ќе одговорат, резултатот ќе го активира ROM-от, а останатите ќе бидат неактивни, т.е. исклучени. Со уклучување на ROM-от тој ќе ја преземи адресата од адресната магистрала, па така во ROM чипот, декодерот за редици и колони, ќе активира само една локација од меморијата и бинарниот број зачуван на таа локација ќе се стави во податочната магитрала со вклучување на три-состојбените бафери. Откога ќе се прочита информацијата, тогаш иборот на чип (chip select) ќе го исклучи и ROM чипот. Информацијата која сега се наоѓа во податочната магистрала ќе ја прочита микропроцесорот, а тоа е инструкција која може да се интерпретира како „оди на адреса F600H и прочитај го бројот кој е зачуван на таа адреса“. Како одговор на оваа инструкција, микропроцесорот ќе ја стави адресата F600H во адресната магистрала. Адресниот декодер го предава тој број на неговите логички порти со што резултатот повторно ќе го вклучи ROM-от. Тогаш ROM-от ќе ја прими адреста F600H и со декодерот за редици и колони ќе го исчита бројот од локацијата т.е. 25H и ќе го стави во податочната магистрала. Овој број е привремено зачуван во микропроцесорот.
84
Вовед во Микропроцесорите и Микроконтролерите 8
Микропроцесорот го става бројот 2500H во адресната магистрала и тогаш адресниот декодер ќе даде сигнал за избор на чип и ќе го вклучи само RAM-от. Тогаш тој праќа логичка 1 на читај/запиши линијата. Значи RAM-от ни е вклучен и кажано му е да го исчита податокот од податочната магитрала. Читај/запиши линијата оди и до I/O чипот, но ова не прави никакви проблеми бидејќи (chip select) изборот за чип го држи исклучен.
Бројот 25 сега е сигурно запишан во RAM-от и ќе стои таму додека не биде запишано нова информација врз него или додека не се исклучи напојувањето.
Уште еден поглед во адресниот декодер Во глава 6 видовме дека бројот на локации може да се најде со 2n, каде n ни е бројот на адресни линии. Поврзаноста помеѓу адресните линии и локациите е прикажан во табела 7.1. Табела 7.1 Поголеми мемории користат повеќе адресни линии Број на адресни линии
Број на локации
Број на адресни линии
Број на локации
Број на адресни линии
Број на локации
1
2
13
8k
25
32M
2 3 4 5 6 7 8 9 10 11 12
4 8 16 32 64 128 256 512 1024 = 1k 2k 4k
14 15 16 17 18 19 20 21 22 23 24
16k 32k 64k 128k 256k 512k 1024k = 1M 2M 4M 8M 16M
26 27 28 29 30 31 32 33 34 35 36
64M 128M 256M 512M 1024M = 1G 2G 4G 8G 16G 32G 64G
Исто така можеме да ја употребиме оваа табела за да го одредиме бројот на адресни линии, ако тоа ни е потребно, ако го знаеме бројот на адресни локации. На пример, ако сакаме да пристапиме до 700 локации, гледаме дека со 9 адресни линии имаме 512 локации, што е помалку од тоа што ни треба, па така ќе имаме 10 линии што ни дава пристап до 1024 локации. „Реалниот“ одговор би бил 9.45, ама тоа не е логично, бидејќи не можеме да имаме 0.45 од каблите, па така ако 9 не се доволни, тогаш ќе ни се потребни 10 адресни линии. За оние што обожаваат формули, математичкиот израз е:
број на адресни линии
logброј на локации log 2
85
Вовед во Микропроцесорите и Микроконтролерите
Дизајнирање на декодирачко коло Да замислеме дека имаме микропроцесорки базиран систем кој користи осум мемориски чипови, не е важно дали се ROM или RAM. Секој од чиповите има меморија од 8 килобајти. Од табелата 7.1 гледаме дека за 8 килобајтен чип ни се потребни 13 адресни линии за да можеме да пристапиме до секоја локација. Да претпоставиме дека нашиот микропроцесор користи 16 битна адресна магитрала, па ситуацијата која ја имаме е прикажана на слика 7.7. Адресните линии се нумерирани од А0 (адресна линија број 0) до А15. 13 бити, А0-А12, ќе одат до ROM и RAM чиповите, а останатите три адресани линии, А13-А15, ќе бидат искористене од адресниот декодер.
Слика 7.7 Резервирани се три адресни линии кои одат до декодерот
Декодерот Декодирачкото коло може да биде направено од одделни логички порти, или пак може да се купи веќе направено како едно интегрирано коло. Основните потреби се три влезни линии и осум излезни линии секоја поврзана за еден „избор на чип“ пинот од меморискиот чип. За да го вклучи чипот, „избор на чип’ мора да има напон на логичка 0, додека напон од логичка 1 би го исклучило чипот. Неопходно е само еден чип да биде вклучен во даден момент, инаку ќе испорачат конкурентни податоци до податочната магистрала, и многу лесно ќе се уништат податоците. Трите адресни линии ни даваат 23 = 8 различни влезови во логичките порти кои се наоѓаат во декодерот.
Слика 7.8 Работата на адресниот декодер
86
Вовед во Микропроцесорите и Микроконтролерите Внетрешниот дизајн нè осигурува дека ако адресните пинови се сите нули, тогаш првиот излез ќе биде логичка 0, а сите останати логичка 1. Меморискиот чип за кој е прикачен овој прв излез ќе се вклучи, а останатите ќе останат иклучени. Кога ќе се донесе друга комбинација на влез 0, 0, 1, вториот мемориски чип ќе се вклучи, а останатите ќе бидат исклучени. Следната комбинација ќе го вклучи наредниот мемориски чип, а останатите ќе бидат исклучени, и се така дадока имаме различни комбинации на трите адресни линии (види слика 7.8). За три влеза и осум излеза, јасно е дека е доволен 3-8 декодер. Табелата 7.2 изгледа многу лошо од навистина тоа што е. Тоа е збир на излезите од декодерот. Ако микропроцесорот ја стави адресата C2F1H во адресната магистрала, бинарно тоа би било: 1100 0010 1111 0001 (за полесно читање е поделена во групи од 4 бити). Најзначајниот бит, А15, е на левиот крај.
Табела 7.2 3-8 декодер може да контролира осум мемориски чипови Влезови
Излези
Резултат
C
A
B
0
1
2
3
4
5
6
7
Селектирај го
0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
0 1 1 1 1 1 1 1
1 0 1 1 1 1 1 1
1 1 0 1 1 1 1 1
1 1 1 0 1 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 0 1 1
1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 0
Чип 0 Чип 1 Чип 2 Чип 3 Чип 4 Чип 5 Чип 6 Чип 7
На табела 7.3, можеме да видиме дека 13 од 16 адресни линии ни се приклучени во меморискиот чип, а останатите три се за во декодерот. Трите линии во декодерот ја носат информацијата 1 1 0, каде вредноста за C = 1, B = 1 и А = 0 што е во долниот дел од табелата 7.2. Овие вредности ни кажуваат дека Чипот број 6 добива логичка 0 и тој ќе се вклучи, а останатите чипови ќе се исклучат бидејќи имаат логичка 1.
Табела 7.3 За целосно кодирање секоја адресна линија е искористена А 15 1
А 14 1
А 13 0
Овие го селектираат чипот 6
А 12 0
А 11 0
А 10 0
А 9 1
А 8 0
А 7 1
А 6 1
А 5 1
А 4 1
А 3 0
А 2 0
А 1 0
А 0 1
Оваа адреса, секој мемориски чип, внатрешно, ја декодира и покажува на една мемориска локација
87
Вовед во Микропроцесорите и Микроконтролерите
Целосно и делумно декодирање Целосно декодирање Во претходниот пример, 8 килобајтните мемориски чипови користеа 13 адресни линиии, а декодерот ги користеше останатите три. Ова вкупно се 16 линии кои се користат од 16 битна адресна магистрала. Нема неискористени линии, па ова се вика „целосно декодирање“.
Делумно декодирање Сега да направиме мала промена, нека мемориските чипови користат 4 килобајти наместо 8 килобајти. Каков ефект би ни дало ова? Прво, бројот на адресни линии ќе се намали и тоа на 12. Сеуште имаме само осум чипови кои можат да се селектираат со 3-8 декодер. Па што добивме сега? Дванасет адресни линии до чиповите и три до декодерот, тоа се петнаесет (15), па така ни останува една неискористена линија. Ако нема ништо приклучено за неа, не е важно каков напон ќе имаме (види табела 7.4) Да ја разгледаме нашата претходна адреса C2F1H. Но ако некако се случи адресата да се смени во D2F1H т.е. од: 1 1 0 0 0 0 1 0 1 1 1 1 0 0 0 1 (C2F1H) во 1 1 0 1 0 0 1 0 1 1 1 1 0 0 0 1 (D2F1H) Па така, сега имаме два броја кои можат да се донесат до адресната магистрала, со што ќе резултираат со пристап до иста мемориска локација, бидејќи сите битови кои се користат се идентични. Ако му дадиме инструкција на микропроцесорот прво да зачува некоја информација на адреса C2F1H, а потоа да му кажеме да ја исчита информацијата од D2F1H, тогаш тоа ќе биде истата информација што сме ја зачувале на локација C2F1H. Така адресата D2F1H претставува „дух“ адреса или слика. Важно е да се нагласи дека ваквите адреси немаат никаков ефект во работата на микропроцесорскиот систем. Нецелосното или делумно декодирање секогаш ни дава раст на адресите-слики, па работата со нив е многу лесна. Со говор на технологијата би кажале дека делумното декодирање ни дава повеќе од една софтверска адреса за покажување на една иста хардверска адреса. Табела 7.4 Една адресна линија е неискористена А 15 1
А 14 1
А 13 0
А 12 Х
А 11 0
А 10 0
А 9 1
3 линии за декодирање
А 8 0
А 7 1
А 6 1
А 5 1
А 4 1
А 3 0
А 2 0
А 1 0
А 0 1
12 линии за до меморијата
Оваа линија е неискористена, па така може да имаме две вредности 0 или 1
88
Вовед во Микропроцесорите и Микроконтролерите Работен пример Осумте мемориски чипови, сега да ги замениме со 1 килобајтни. Некој податок е запишан на адреса 4000H. Најди (а) колку адреси „слики“ ќе се појават и (б) кои се тие. (а) 1 килобајтните мемории ќе користат 10 адресни линии. Ова го видовме во табела 7.1, а за декодерот сеуште ќе ни бидат потребни три влеза. 16 битната адреса за дадената 4000H ќе ни даде три неискористени линии, види табела 7.5. Овие три бинарни дигити можат да бидат 000, 001, 010, 011, 100, 101, 110, 111 кои ни даваат осум различни вредности. Ова можевме да го заклучиме и преку 23 = 8. Со ставање на овие осум броеви во адресата ќе добиеме осум различни адреси.
Табела 7.5 Сега имаме три неискористени адресни линии А 15 0
А 14 1
А 13 0
А 12 1
А 11 1
А 10 0
А 9 0
линии за декодирање
А 8 0
А 7 1
А 6 0
А 5 1
А 4 0
А 3 0
А 2 1
А 1 0
А 0 1
линии до 1 килобајтните мемории
Три не искористени линии
Една реална адреса и седум „слики“. Но кои се „слики“, а кои се реални адреси? Не е важно! Можеме да ја земеме која сакаме бидејќи тие сите покажуваат на иста физичка адреса. Имајќи, го ова врпедвид, повеќето, ја одбираат најниската адреса, за реална. (б) Сега, да ги најдиме овие адреси, се што треба да направиме е да ги ставиме сите бинарни опции, 000, 001, итн. во „реалната“ адреса и да ги добиеме сите осум „слики“. Ова е дадено во табела 7.6. Табела 7.6 Генерирање на „слики“ адресите А А А А А А 15 14 13 12 11 10 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
А 9
А 8
А 7
А 6
А 5
А 4
А 3
А 2
А 1
А 0
Адреса
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
4000 4400 4800 4C00 5000 5400 5800 5C00
89
Вовед во Микропроцесорите и Микроконтролерите Тоа се адресите 4000H, 4400H, 4800H, 4C00H, 5000H, 5400H, 5800H и 5C00H. Па така, бидејќи веќе бевме запрашани, можеме да кажеме дека седумте последни адреси, ни се „слики“, а првата дека е реална адреса. „Слики“ адресите и мемориската мапа Може и да се сеќавате на мемориската мапа која ја разгледавме во претходното поглавје. Таа ни ги презентираше адресите зафатени од различните мемориски уреди и неискористените адреси помеѓу нив. Ако имаме делумно декодирање, ќе имаме поголем броој на „слики“ адреси. Сега, ако ги ставиме овие „слики“ адреси во мемориската мапа ќе забележиме нешто интересно, а тоа е дека „слики“ адресите секогаш се софпаѓаат со неискористената зона од мапата, па така тие никогаш нема да предизвикат проблеми. Квиз 7 Во секој случај, одбери го најдобриот одговор. 1
2
3
4
5
Digital Alpha 21064 микропроцесорот има 34 битна адресна магитрала која може да пристапи од меморија од: a. 64 Гигабајти b. 64 Мегабајти c. 16 Гигабајти d. 160 Мегабајти Податочната магистрала: a. е двонасочна b. е составена од осум проводника. c. Може да се користи за пренос на податоци до RAM и ROM мемориските чипови. d. Поврзана е за пинот избор на чип (chip select). 16 битна адресна магистрала има адреса 4567H и има делумно декодирање каде А15 и А13 не се користат. Која од овие адреси пристапува на различна хардверска локација: a. E567H b. 4567H c. 6567H d. 8567H Што од следново НЕ е потребно за микропроцесорски базиран систем: a. Адресна магистрала b. ROM c. Clock сигнал d. RAM „Слики“ адресите: a. Исто така и се нарекуваат „дух“ адреси b. Повеќе хардверски адреси покажуваат на иста софтверска адреса c. Исто е со делумна адреса d. Се појавуваат при целосно декодирање
90
Вовед во Микропроцесорите и Микроконтролерите
8 Типичен 8 битен микропроцесор Детално ќе опишиме 8 битен микропроцесор за да ги „поставиме темелите“ врз кои ќе се надоградува, за добивање на поновите микропроцесори, бидејќи микропроцесорите еволуираат од еден во друг, а не се појавени како „гром од ведро небо“.
8 битен микропроцесор – Z80180 Овој микропроцесор е модерната верзија на застарениот Z80 кој беше направен во 1978, кој беше подобрена верзија на Intel 8080. Имаат многу сличности бидејќи некои од инжињерите кои го дизајнираа 8080 заминаа од Intel, и се вработија во Zilog, и го направија Z80 кој се покажа како еден од најпопуларните микропроцесори, и микропроцесор со најдолг век – сеуште широко се користат, дури ги има и во мобилните телефони. Кога Zilog го произведе Z80180, природно, сакаше да ги задржи своите клиенти со производство на нова компатибилна верзија на претходниот Z80. Ова им овозможува на клиентите лесно да ги надоградат своите системи без многу трошоци за купување на комплетно различни уреди. Z80180 може да ја изврши секоја програма која е напишана за Z80, само во него се додадени некои нови особини. Технички, ова се нарекува дека овозможува комплетна компатибилност наназад.
X во Z8X180 Ако одиме да купиме автомобил од било која компанија, тие ќе ни понудат една цела серија автомобили, кои во оснава се исти, но со избор за јачината на моторот, различен менувач на брзините, распоред на седиштата и многу други опции. На ваков начин, тие можат да задоволат максимален број на потрошувачи без значајни промени и трошоци. И кај микропроцесорите е скоро исто. Почнуваат со некој основен дизајн, а сличните верзии се означени со мали промени во бројчето за типот. До сега, Zilog ги има произведено Z80180, Z8S180 и Z8L180. Со споредба на бројчето за типот, можеме да видиме дека се разликуваат само во третата бројка или буква и со промена на таа буква/бројка со X ние можеме да го генерализираме тој тип на микропроцесор како Z8X180. X генерално се употребува во индустријата. Група на микрорпроцесори се нарекува фамилија. Да се тргнеме на страна од компјутерската индустрија, која е желна за брзи и сè побрзи микропроцесори, има многу работи за што малите, бавни и едноставни микропроцесори се идеални. Билиони од 4 и 8 битни микропроцесори и микроконтролери се вградени во многу работи, како на пример, микробранови печки, печатачи и инструменти. Повеќето од нас во
91
Вовед во Микропроцесорите и Микроконтролерите домот имаат околу 50 вакви уреди без да знаеме дека тие постојат. Тие масовно го надминуваат бројот на многу брзите компјутерски микропроцесори.
Во единицата за централно процесирање (CPU) На слика 8.1 прикажани се главните делови на Z80180 CPU. Содржи повеќе различни регистри кои ги чуваат или ги користат податоците при извршување на некоја инструкција од програмата. За да ја задржат компатибилноста наназад, повеќето регистри го користат истиот систем за маркирање со букви, за да ја задржат сличноста со секој кој веќе има користено Z80.
Слика 8.1 The Central processing unit (CPU)
Инструкциски регистер Регистерот за инструкции е мала меморија која може да чува 8 бити т.е. 1 бајт информација. Оваа информација е инструкцијата која треба да ја изврши микропроцесорот. Оваа информација е „заклучена“ во инструкцискиот регистер, за да ја ослободи внатрешната податочна магистрала за други цели. Не прави ништо со бинарниот влез – само памти што е.
Инструкциски декодер Инструкцискиот декодер е дел од микропроцесорот кој е способен да извршува инструкции. Првиот чекор му е да ја идентификува инструкцијата која е внесена. Ова го прави со споредба на бинарниот код, кој е запишан во внатрешна листа. Откога ќе ја пронајде инструкцијата, тогаш извршува вградена програма наречена микропрограма. Микропрограмата е дизајнирана внатре во микопроцесорот, од производителот, и ги содржи сите потребни чекори за да ја заврши секоја инструкција за кој е способен. Комерцијално ова е сензитивниот и критичниот дел на микропроцесорот. Кога му е доделана некоја работа на Z80180, мора да му е зададена инструкција, инструкцијата е во форма на 8 битен бинарен број. За ова повеќе ќе кажеме подоцна.
92
Вовед во Микропроцесорите и Микроконтролерите
Аритметичка и логичка единица (Arithmetic and logic unit, ALU) Ова е едноставен џебен калкулатор, кој може да собира, одзема, множи, дели и да прави различни трикови со логички операции како AND, OR, XOR итн. Во споредба со просечен научен калкулатор, тој е многу едноставен.
CPU register banks (банка на регистри во CPU) Во техничките податоци за микропроцесорот секогаш ќе најдете листа на регистри кои се во микропроцесорот. Регистрите се мали мемории од 8 до 128 битни, во зависност од микропроцесорот. Кај Z80180, тие сите се со големина од 8 или 16 бити. Секој микропроцесор содржи своја колекција на регистри, па така многу е битно внимателно да ги прочитаме техничките податоци за микропроцесорот за да знаеме што точно работат регистрите. Има „регистри за општа намена“ кои се користат од корисникот и можат да се употребат за различни привремени запишувања. Исто така има и „регистри со специјална намена“ кои се веќе одредени да извршуваат некаква функција, таков е инструкцискиот регистер. Z80180 има 16 регистри за општа намена, и 6 за специјална намена. Регистрите се прикажани на слика 8.2.
Слика 8.2 Внатрешни регистри на Z80X80
За момент ќе обрнеме внимание на горните два регистри. Множеството на Главни регистри (Main register set) и множество на алтернативни регистри (Alternate register set), се идентични, освен малиот апостров ’ до буквата. Знакот ’ се нарекува „прим“, па така D’ ќе го прочитаме како „де прим“. Знакот „прим“ е ставен само за да можеме да ги разликуваме двете множества на регистри. Зошто имаме две множества? Двете множества му дозволуваат на програмерот да го употребуваат множеството на главни регистри, додека „прим“ регистрите може да ги наполни 93
Вовед во Микропроцесорите и Микроконтролерите со информации кои ќе бидат спремни за моментална, брза, употреба кога тоа ќе биде потребно. Замислете дека микропроцесорот е многу зафатен со контрола на машина за печатење, и кога ќе се активира алармот за пожар, со самото стигање на сигнал од алармот до микропроцесорот, тој веднаш ја прекинува програмата за печатење и ја стартува програмата „Аларм за пожар“ и ги известува пожарникарите. Вакви информации за извршување на вакви програми можат да се чуваат во резервно множество на регистри. Откога ќе заврши програмата „аларм за пожар“, микропроцесорот се префрла назад на множеството главни регистри, и си продолжува со печатењето.
Акумулатор (the accumulator) Програмерот може да го употреби акумулаторот за да запише 8 битен бинарен број во било кое време. Може да запише броеви кои можат да се искористат за аритметички операции или за логички операции. Резултатот после секое комплетно пресметување се враќа назад во акумулаторот. Бидејќи има само 8 битни регистри, можеме да чуваме само еден бајт во даден момент, па ако имаме претходно зачувано некој податок во регистерот, тогаш тој ќе биде презапишан кога ќе треба да се запише новиот податок.
Регистер за знаменце (the flag register) Ова е 8 битен регистер, но тој е малку невообичаен бидејќи можеме да запишуваме во секој бит независно од другите битови. Кај сите други регистри, секој бит е само дел од некоја единствена бинарна ведност, па така секој бит има бројчана вредност. Регистерот за статус, или регистарот за знаменце, ни претставува прозорец преку кој гледаме што работи микропроцесорот. Нешто слично како едноставен систем за комуникација. Како на пример, тој ни овозможува да му кажеме на микропроцесорот: „извести ме кога ќе видиш негативен број при пресметувањето“. Немораме да обрнуваме внимание за знаменцата, тие се само индикатори за нешто што може да се забележи или игнорира, исто како што правиме со термометарот закачен на ѕид. Секое знаменце се идентификува со буква, како на слика 8.3. Ќе забележете дека два бита, 3 и 5 се обележени со Х за да покажеме дека не се користат. Овие битови беа оставени празни за подоцнежно подобрување (кое никогаш не се случи).
Слика 8.3 Flag регистри за Z80180
94
Вовед во Микропроцесорите и Микроконтролерите Забелешка: Кај микропроцесорите, кај компјутерите и генерално во електрониката, ако нешто е обележано со Х, тогаш тоа не се употребува и не ни е важно каков напон или бинарна вредност тој има. Уште една забелешка: се вели дека знаменцето е „поставено“ кога има вредност 1, а се вели дека е „тргнато“ (избришано) кога е 0. Знаменце за знак (Sign flag, S) Ѕ знаменцето е само копија на 7-от бит од акумулаторот. Негативниот број има 1 на 7-от бит , а позитивниот 0, па така ова знаменце ни кажува за знакот на бројот. Сигурно се сеќавате дека кај броевите со означена магнитуда, се употребува 1 за негативни броеви и 0 за позитивни. Истотака негативниот број е изрзен со својот втор комплемент кој обавезно има 1 на првиот бит од лево. Бројот нула се третира како позитивен број, па така не можеме да го користиме Ѕ знаменцето за да забележиме нула како резултат. Ова го правиме со „вработување’ на специјален „нула“ знаменце. „Нула“ знаменце (Zero flag, Z) Z знаменцето го троши цело свое време за да примети резултат нула. Се сеќавате кога дадовме пример за користење на XOR портите, ги употребивме портите за проверка на кодот кај автомат за билети. Кога внесената вредност беше иста со вредноста на картичката, беше дозволено да се стават парите за потребниот билет. Што всушност сè случуваше, се споредуваа двата броја и ако беа исти, резултатот ќе беше нула и тука Z знаменце ќе се појави со своја акција. Се поставува во бинарно 1 ако има резултат нула, а останува бинарно 0 за другите случаеви. Треба да пазиме на две работи, Z знаменцето ја менува состојбата во 1 само и само ако сите битови во последниот резултат се нули, и внимавајте дека: нулти резултат го прави Z знаменцето = 1; а не нулти резултат Z знаменце = 0. Сите овие резултати ќе ни дадат нула вредност за Z знаменцето: 0100 0000 1111 1111 0000 0000 1001 1010 Само резултат од 0000 0000 ќе го направи Z знаменцето да има бинарна вредност 1. Собирање/одземање знаменце (Add/subtract flag, N) N знаменцето ни служи само да ни каже дали последната аритметичка операција била „собирање“ или „одземање“. N = 0 за собирање, а N = 1 за одзимање. Не è многу возбудливо! Carry flag (C) and half-carry flag (H) Кога се извршува собирање, понекогаш како резултат имаме бит кој се носи во колона за паметење. C знаменцето ја копира вредноста на 7-от бит од таа колона, а H знаменцето ја 95
Вовед во Микропроцесорите и Микроконтролерите зачувува вредноста на колоната за паметење од 3-от бит во 4-от бит при собирање. Исто така ја отсликува вредноста при „досадното“ одземање. Еве еден пример за собирање преку кој ќе ги покажеме C и H знаменцата. 0 1 0 1
1 1 0 0
1 0 1 0
0 0 0 0
1 0 1 0
0 0 1 1
0 1 0 1
1 1 0 0
:резултат :колона за паметење
1 + 1 + тоа што памтиме = 0 па значи за памтење имаме 1 па С знаменцето = 1
Нема за паметење во оваа колона, па Н знамецето = 0
Parity/overflow flag (P/V), парност/пречекорување знаменце Ова се употребува за две различни цели. „V“ ни доаѓа од англискиот збор за пречекорување (oVerflow) во аритметичките пресметки. Некоја комбинација на броеви може погрешно да бидат презентирани и да дадат неточен резултат, како што ќе видиме подолу. Кога ќе се забележи можна грешка ќе се „подигне“ знаменцето, а кога нема грешка тоа е „спуштено“. Еве еден пример за да го согледаме проблемот. Ќе ги собереме двата позитивни броја +96 и +66, па и да не го погодиме точниот резултат, очигледно е дека тој ќе биде позитивен број. 0 0 1 1
1 1 0
1 0 1
0 0 0
0 0 0
0 0 0
0 1 1
0 0 0
= = =
96 66 + -34??
Битот за знак ни кажува дека тоа е негативен број
Во овој пример, собравме два броја кои почнуваат со нула, бидејќи тие се позитивни, а резултатот ни почнува со единица, што претставува негативен број, па така P/V знаменцето ќе биде кренато т.е. ќе има вредност бинарно 1. Лесен начин за да провериме дали има можна грешка е да ги видеме 7-от бит во колоната за паметење и 7-от бит од резултатот.
96
Вовед во Микропроцесорите и Микроконтролерите Правилото е: Carry in AND carry out OR NO carry in AND NO carry out Памтиме AND за памтење OR НЕ памтиме AND НЕМА за паметење
= No error so P/V = 0
= Нема грешка, па P/V = 0
Во нашиот пример, запамтивме 1 за 7-от бит од собирање на претходната колона, а немавме бит за паметење, од 7-от бит во колона. Ова не се вклопува со нашето правило па така P/V знакот ќе биде поставено на 1, што ни укажува дека има можна грешка. Втората цел е да проверува парност. Ова го прави со проверка на податокот и ги брои единиците во него, и ако вкупниот број е парен, тогаш P/V = 1, а ако е непарен бројот на единици тогаш тој е 0. Ако имаме бајт 10110101, тогаш P/V = 0, бидејќи бројот на појавувања на 1 е 5 пати, т.е. непарен број. А бројот 10010110 ќе ни даде резултат за P/V = 1, бидејќи четири пати ни се појавува 1, а 4 е парен број. Ова знаменце работи во P и V мод, во зависност од инструкцијата која ја извршува. Подетално ќе ја разгледиме парноста во глава 17.
Регистри за општа намена Сите регистрите за општа намена се 8 битни регистри, но ако сакаме можеме да користиме истовремено два регистри, за да симулираме 16 битен регистер. Кога правиме спојка, тогаш изборот ни е ограничен. Видете ја повторно сликата 8.2, можеме да направиме комбинации BC, DE или HL, но изборот не ни е слободен, не можеме да ги споеми било кои, како што се B и L. можеме да користиме пар BC како 16 битен регистер, и во исто време да ги користиме D/E/H/L како одделни 8 битни регистри. Како и обично, истото можеме да го направиме и со алтернативните регистри. Може малку изгледа нелогично тоа што првите четири регистри се именувани B, C, D и E, а последните два се H и L. Причината за ова е бидејќи овие регистри ни служат за следење на мемориските адреси. Z8018Х има 16 битна адресна магистрала за што ни е потребен 16 битен регистер за зачувување на целата адреса. H и L се земени од High (горен) и Low (долен) дел од бајтот за адресата, па така ако сакаме да ја зачувиме адресата 2684Н, ќе ставиме 84 во L регистерот и 26 во Н регистерот, се разбира бинарно. Исто како што беа искористени за чување на адреса, Н и L исто така можат да се користат за било каква цел, исто како B, C, D и E.
97
Вовед во Микропроцесорите и Микроконтролерите
Регистри за специјална намена Program counter (PC), програмски бројач Програмата е листа на инструкции кои треба микропроцесорот да ги изврши. Тие треба да се зачувани во ROM или RAM. Да претпоставиме дека сакаме да ја употребиме адресата 6400Н како стартна адреса. За да ја стартуваме програмата мора да му кажеме на микропроцесорот да започне од 6400Н. Тоа што всушност правиме ја ставаме адресата 6400Н во програмскиот бројач (program counter, PC) и микропроцесорот почнува од таму. Откога ќе заврши со извршувањето на инструкцијата во 6400Н, оди на следната инструкција на адреса 6401Н, па на 6402Н итн., се додека не стигнеме да крајот на програмата. Целта на програмскиот бројач е да пази на адресата, која што наредна ќе се користи. Стек покажувач, stack pointer (SP) Ако некој ни даде телефонски број, ние најверојатно ќе земеме парче хартија и молив, па ќе го запишеме бројот. Нашата белешка би изгледала како на слика 8.4.
Слика 8.4 Број кој треба да го запамтиме
Ако потоа ни дадат уште неколку броеви, најверојатно и нив ќе ги запишеме, под првиот брот, како на слика 8.5.
Слика 8.5 Уште неколку броеви
Можеме да ги прочитаме во обратен редослед почнувајќи од долниот, па следниот, па се до најгорниот. Првиот кој го запишавме, сега последен го прочитавме. Микропроцесорот би направил нешто слично со зачувување на информациите во серија од 16 битни мемориски локации наречен „стек“ (stack). Стекот се полни по ред, а се празни 98
Вовед во Микропроцесорите и Микроконтролерите почнувајќи од последниот внесен број, па сè до врвот на стекот. Првиот број кој влегува, последен ќе испадне, па заради ова, овој метод се нарекува „прв влегува, последен излегува“, т.е. „first-in, last-out“ или FILO. За максимална забуна, ова може исто така да биде наречен и LIFO систем, што ја има истата смисла. Размислете малку за ова! (last-in, first-out) Кај микропроцесорот, серија од RAM локации се резервираат за да се користат како стек, и адресниот бројач има за задача да прати која е нареднат адреса која треба да се користи за стекот. Овој бројач се вика стек покажувач бидејќи тој „покажува на“ следната адреса која ќе се користи. Микропроцесорот во глобала го користи стекот за да зачува податок со многу привремена основа. Дозволено ни е да го користиме и ние, но микропроцесорот има поголем приоритет над него и не знае дека сме го наполниле со некоу податоци. На пример, ако микропроцесорот има сместено три бити од податок во редослед како на слика 8.6(а) и ако ставиме едно делче од наши податоци на крајот од стекот ќе добиеме ситуација како на слика 8.6(б), тоа ќе биде податокот на четвртата локација. Како и да е, микрорпроцесорот не знае за ова и кога тој ќе сака да ги поврати своите податоци, тој ќе ги исчита последните три и тогаш ќе добие различен сет на податоци, види слика 8.6(в).
Слика 8.6 Употреба на стек
Поуката од оваа приказна е да го оставиме стекот настрана – или пак да бидеме многу претпазливи! Во техничките податоци за микропроцесорот секогаш многу добро е образложено кога микропроцесорот го користи стекот, но сепак подобро е да не го користиме.
99
Вовед во Микропроцесорите и Микроконтролерите Индексни регистри Имаме два индексни регистри, едниот наречен Х, а другиот Y. И двата имаат иста функција. Индекси користиме во ситуации кога сакаме да извршиме секвенца на слични задачи една по друга. Може да користиме податоци запишани во серија на мемориски локации. 16 битна содржина на индексниот регистер може да се додаде во содржината на програмскиот бројач (PC), за да ја дава новата адреса. На пример, да претпоставиме дека е стартувана програма која после адресата 2600H, ќе сакаме да користиме податок запишан на адреса 3800Н. Може ова да го сториме со запишување на 16 битниот број за 1200Н во Х регистерот и да му дадеме инструкција на микропроцесорот да отиде на таа адреса, запишана како PC + IX (program counter and index X). Во овој случај, микропроцесорот ќе отиде на адреса 2600Н + 1200Н = 3800Н за да го добие податокот кој треба да го користиме. Овој скок од 2600Н на 3800Н го нарекуваме офсет (надоместок) или пак можеме да кажеме дека регистерот Х дава надоместок од 1200Н. Во примерот, може еквивалентно да се искористи и регистерот Y. Најчеста употреба на индексните регистри е да зачуваат податок кој е претходно внесен во некоја табела или пак податокот е од некој друг дел на меморијата. Корисникот на програмата може да биде запрашан да внеси некој број, така овој број ќе биде внесен во RAM меморијата, но програмата која ќе го користи овој податок ќе го стави во ROM меморијата. Погоден надоместок ставен во еден од индексните регистри може да ја помести адреста и да ја носи во RAM делот од мемориската мапа. Овие регистри, исто така се користат во ситуации кога програмата бара некој податок да биде внесен од корисникот, како на пример:
ПЕЧАТЕЊЕ Внеси го бројот на копии
Ова можеме да го имплементираме така што одговорот ќе го ставиме во еден од индексните регистри и, како печатачот ја печати секоја копија, така запишаниот број ќе го намалуваме за еден се додека не стигнеме до нула. Секогаш кога бројачот ќе го намалиме, му даваме инструкција на микропроцесорот да ја провери состојбата на Z знаменцето. Кога броењето конечно ќе стигне до нула, Z знаменцето ќе биде кренато, т.е. Z flag = 1, и печатачот ќе престане со својата работа. R бројач (R) Ова е едноставен бројач кај кој долните седум битови се користат за броење, колку инструкции се извршиле од микропроцесорот, додека работи некоја програма. Се враќа на нула кога микропроцесорот ќе се рестартира.
100
Вовед во Микропроцесорите и Микроконтролерите На слика 8.7 прикажани си останатите делови на микропроцесорот. На слика 7.4 сите овие делови се ставени во еден блок наречен „микропроцесор“ (µP). Овде се прикажани сите потребни поврзувања на уредите со надворешните кола и други потребни работи.
Слика 8.7 Микропроцесор Z80180
Податочни бафери Податочниот бафер е 8 битен регистер и се користи за чување на информации кои се донесени од надворешната податочна магистрала. Откога баферите ќе ја зачуват бинарната информација, тогаш три-состојбените бафери ќе ја „заклучат“ информацијата и ќе ја дисконектира надворешната магитрала за да може да се погрижи за други податоци. Овој процес се нарекува „заклучување“, „latching“. Како генерално правило, се што влегува во чипот од магистралата е заклучено. Ова е заради тоа што на магистралите им е потребно време додека да донесат нов напон на своите линии и треба да почне со работа што е можно порано.
Адресна и податочни магистрала Во секој микропроцесор има по три магистрали, адресна, податочна и контролна магистрала. Како што видовме во претходното поглавје, контролната магистрала е „губитничка“ колекција на кабли кои испраќа сигнали насекаде во системот за да има поврзаност и контрола на операциите во секоја област каде тоа е потребно. Ќе обрнеме внимание на адресната и контролната магистрала кај Z80180. Z80180 има (накој вид на) 16 битна адресна магистрала и 8 битна податочна магистрала. Кај помалите микропроцесори, обично беше пракса, адресната магистрала да биде двапати поголема од податочната магистрала, без некоја цел зошто е тоа така. Изборот на адресна 101
Вовед во Микропроцесорите и Микроконтролерите магистрала зависи од предвидената големина на меморијта, во крајниот дизајн, која што треба да се адресира. Необично, кај овој микропроцесор има две конфликтни побарувања: тој треба да остне компатибилен со 16 битната адресна магистрала на Z80, но исто так сакаме да можеме да адресираме 1 MB за кој е потребно 20 адресни линии. Овие побарувања се среќаваат во блокот наречен како MMU (memory management unit), единица за менаџирање на меморијата.
Memory management unit (MMU), единица за менаџирање на меморијата Ова коло вклучува 8 битен регистер кој памти информации за адресата, и е контролиран од софтверот кој што се користи. Овие 8 битови се комбинираат со горните четири адресни линии, А12–А15, од адресната магистрала. Долната половина од овие 8 бита се додадени на горните 4 бита од адресната магистрала и горните 4 бит се користат за да се прошири корисната меморија со додавање на четири екстра адресни линии, А16–А19, за да имаме вкупно дваесет линии за адресирње. Процесот е прикажан на слика 8.8. Z80180 фамилијата е произведена во четири различни пакувања. Оригиналниот 40 пински, стариот Z80, се зголемува на 64 пински во „dual-in-line (d.i.l)“ пакување сличен на горниот од слика 1.6. Исто така има 68 пински (plastic leaded chip carrier, PLCC) верзија кој е ист како квадратното пакување од слика 1.6, и конечно има 80 пинско кој е од површински монтирачки тип.
Слика 8.8 Проширување на адресната магистрала
Површински монтирачките уреди немаат пинови кои поминуваат низ дупчиња на веќе испринтана плоча, туку има конектори кои излегуваат хоризонтално и се залемуваат на повшината од плочата. Ваквиот метод ни зачувува значаен простор.
Забелешка Помалиот број на пинови кај DIL, го ограничуваат бројот на адресни пинови на деветнаесет, и максималната меморија до која може да се пристапи е 219 или 512k (поточно 52488, бидејќи ' 1024 како што кажавме во глава 2). 102
Вовед во Микропроцесорите и Микроконтролерите
Адресни бафери Ова се три-состојбени бафери исти како податочни бафери само што овие се еднонасочни уреди. Микропроцесорот испраќа адреси низ адресната магистрала, но вака не може да дојде до микропроцесорот никаква информација за адресите. Ако сакаме да испратиме адреса во микропроцесорот тогаш информацијата ја ставаме во податочната магитрала, и како што знаеме се што доаѓа во податочната магистрала може да се препрати на некое надворешно коло или до микропроцесорот.
Clock generator (генератор на clock сигнали) Како што видовме во глава 7, на микропроцеосорт потребен му е правоаголен пулс за да ги извршува своите операции по одреден редослед, инаку би настанал тотален хаос со податоците и инструкциите ќе се извршуваат во погрешно време и се ќе се испреврти. Во овој микропроцесор брзината на clock сигналите може да се движи во вредности од 6 MHz до 33 MHz. Тој се генерира или од кристал или од некој надворешен извор на сигнал – но никогаш од двата извора во исто време. Употребата на надворешен извор може да биде корисно кога микропроцеорот го користиме како дел од поголема инсталација, со што ова ни дозволува диктирање на времето на работа на микропроцесорот од страна на околните кола. Зголемувајќи ја фреквенцијата на кристалот, имаме три придобивки: правоаголните умпулси стануваат потесни, имаат помала амплитуда и им се намалува моќноста т.е. не трошат многу енергија. Градбата на clock колото има подели-со-два коло кое ни овозможува да користиме двапати поголема фреквенција на кристалот со кое ги добиваме спомнатите придобивки.
Interrupts (прекини, интерапти) Се сеќавате на приказната што ја раскажавме за нашиот микропроцесорски базиран систем кој го контролираше печатачот додека се околу него во канцеларијата гореше. Тој ја стопира својата главна програма и испрати сигнал до пожарникарите, го предупреди оделот за одржување, ги активира прскалките итн. Пожарот не е единствената катастрофа од кој може нашиот мал пријател да не спаси. Може да не извести, на пример, и кога снемува хартија во печатачот, или има некакво уништување на податоците пренесени преку телефонскиот кабел. Потребно е да му кажеме на микропроцесорот за каков проблем се работи и што да прави. Така имаме различни програми за секој од овие проблеми кои се зачувани во група од адреси во ROM чипот. На пример можеме да ги ставиме овие програми на следниве адреси: 0800 – 0855Н = резерви за хартија 0870 – 08А8Н = телевонски податоци. И двете програми имаат 08 во погорниот бајт од адресата, овие вредности ќе ги запишеме во интерапт векторски регистер. Подолниот бајт 00 и 70 се добива од сензорите – сондите. Кога
103
Вовед во Микропроцесорите и Микроконтролерите ќе се уништи некој телефонски податок, тоа го приметува сензорот и тој испраќа сигнал за да го прекине (интерапт) микропроцерот, во кој е делот од адресата 70Н. Тогаш тој ги комбинира 08Н од Интерапт регистерот и 70Н од надворешниот уред, сензорот, и го става во програмскиот бројач, PC. Тогаш микропроцеосор се префрла на адреса 0870Н и го повикува сервисерот за телефони. Кога микропроцесорот е прекината (interrupted), внатрешно запишува, информации за тоа што работел во тој момент и кога ќе се справи со интераптот се враќа на претходната задача.
Интерапт приоритети Не сите проблеми се третираат еднакво, ни од нас нити пак од микропроцесорот. Невообичаено е да се сретнеме со реченица како: „Заборавив да ставам шеќер во кафето. – Ќе одам да донесам малку шеќер – и приметив дека гори вашата куќа“. Како кај сите микропроцесори, така и кај Z80180, интерапти делумно се генерираат од надворешни кола, а некои се од внатрешни извори. Надворешните обично се блокираат или „маскираат“ и му кажуваме на микропроцесорот да ги игнорира и да ги подреди по приоритет, така што на повеќе интерапти им е доделено приоритет. Кај Z80180, најголем приоритет има кога ќе се добие непознат интрукциски код за да спречи некоја случајна операција да направи изопачување при прграмирањето или трансмисијата. Овој интерапт се нарекува TRAP. После овој доаѓа единичен немаскиран интерапт, non-maskable interrupt, NMI. Овој се употребува за критични ситуации кога мора да ја прекине секоја програма која е стартувана. Потоа следат три нивоа на надворешни, но превентивни (маскирани) интерапти. Ако не сакаме програмата да биде прекината, се што треба да направиме е да вметнеме „не прекинувај“ код во софтверот. Во некои документации овие се напишани како INT0, INT1, INT2, каде бројчето ни го покажува приоритетот, а во други документации се употребува IRQ кое доаѓа од Interrupt ReQuest, (барање за интерапт). Наредните седум нивоа се за внатрешни интерапти, генерирани од регистерот за контрола на интераптите, со цел кога на внатрешното коло му е потребен прекин на програмата за момент за да може да изврши некоја друга задача. Малку повеќе за интераптите ќе има во глава 17.
Чување на енергијата (Power saving) Енергијата која ја конзумира микропроцесорот, главно е како резултат од внатрешната активноста, па така, колку повеќе работи микропроцесорот, токлу повеќе се користи енергија. Менувањето на брзината на тајмерот (clock) од 6 MHz на 33 MHz скоро ја дуплира потребната енергија. Можеме да ставиме „sleep“ („спиј“) инструкција во програмата и ефектот од ова е стопирање на CPU тајмерот (clock) и дисконектирање на податочните и адресните магистрали. За да го 104
Вовед во Микропроцесорите и Микроконтролерите разбудиме CPU-то, треба да испратиме сигнал во влезовите за интерапти или да го активираме ресет колото со носење на низок напон на ресет пинот. Можеме да го исклучиме влезното/излезното коло на микропроцесорот со ставање во „систем стоп“ модот. Фамилијата Z8X180 има три претставника: Z80180, Z8S180 и Z8L180. Ѕ верзијата работи на напојување од 5 волти, а верзијата L работи на 3.3 волти. Ефектот од конзумација на енергијата со префрлање на микропроцесорот од нормално работење и „систем стоп“ модот е прикажан во табела 8.1. Табела 8.1
Z80180 Z8S180 Z8L180
Нормален мод
„Систем стоп“ мод
100 mW 90 mW 60 mW
25 mW 15 mW 6mW
Контролер на состојбата на магистралата Во системот, микропроцесорот е поврзан со сите околни кола со употреба на серија конекции наречени системски магистрали. Овие уреди некогаш сакаат да испратат податоци низ системската магистрала и контролерот на состојбата на магистралата, ни кажува дали уште некој друг уред сака да испрати податоци низ истата магистрала во исто време.
Direct memory access (DMA) controller, Контролер за директен пристап во меморијата Како што ни кажува името, ова коло ни овозможува директен пристап до меморијата без да ја користиме CPU единицата. DMA ни овозможува трансфер на податоци со големи брзини од еден дел во друг дел од меморијата. Исто така може и директно да пренесе податоци од меморијата до некој надворешен уред. Ова ни дава значајни подобрување во работната брзина на целиот систем.
Динамичко освежување на меморијата Дали се сеќавате на проблемот кој го имаат динамичките меморија, а тоа е константно освежување кое е потребно, за да RAM-от не ги изгибу податоците? За ова имаме внатрешен регистер кој се справува со освежувачкиот процес, наместо нас. Тој се вклопува помеѓу инструкциите и не ја забавува работата на микропроцесорот во секоја смисла, дури ни програмерот не се плаши дека до тоа може да се случи. Некои микропроцесори немаат ваков регистер и потребно е да се додаде надворешен чип кој ќе го извршува освежувањето. Било како и да е, нема никаков ефект врз работата на системот. 105
Вовед во Микропроцесорите и Микроконтролерите
Состојби на чекање За да ја олесни работата при испраќање на информации кон релативно бавен надворешен уред, микропроцесорот способен е да вметне „состојба на чекање“ кој ќе додаде повеќе време во временскиот циклус на магистралата. Може да се вметнат во програмата со програмирање или може внатрешно да се вметнат со генератор на состојба на чекање.
Серикси влезови и излези За да имаме движење на податоците во сериски мод, во еден влез, бит по бит имаме избор од две опции. Првата опција ни е clocked serial input/output (CSIO). Ова е едноставна податочна конекција со висока брзина со друг микропроцесор кој е способен за испраќање и примање на податоци, се разбира во исто време. Трансмисијата е синхронизирана од микропроцесорскиот часовник. Исто така имаме два интерфејса за асинхрона сериска комуникација, asynchronous serial communications interfaces (ASCI), кои ни даваат други две податочни конекции кои можат да се програмираат да ја изберат потребната брзина на трансмисија и ни овозможуваат двонасочна трансмисија.
Како работи системот За почеток Откога ќе се приклучат на струја, прво го вклучуваме системот, и има мало доцнење за да се овозможи време доволно за да се стабилизира напонот и да стартува часовникот, clock. Ова доценење е произведено од слично коло од тоа што е прикажано на слика 8.9.
Слика 8.9 ON/OFF прекинувач
Колото користи кондензатор, тоа е уред кој е направено да се полни со електрицитет, нешто слично како вазна која се полни со вода. Кога микро системот ќе го исклучиме, тогаш преку кондензаторот имаме куса врска и струјата поминува само низ отпорникот, а го заобиколува кондензаторот и нема да се наполни со 106
Вовед во Микропроцесорите и Микроконтролерите електрицитет бидејќи нема напон на неговите краеви. Истиот ефект се добива и кога држиме нула волти на ресет пинот доволно време, еквивалентно најмалку на шест циклуси на clock-от. Со вклучување на системот, струјата што тече низ отпорникот го полни кондензаторот и напонот почнува да расте. Растењето на напонот е прикажано на слика 8.10 и после некое кратко време, помалку од микросекунда, напонот има два волти, што се доволни да го вклучи микрорпроцесорот. Часовникот почнува да отчукува и микропроцесорот почнува да ја прати секвенцата на чекори наречена стартна микропрограма која е внесена во микропроцесорот од произведувачот. Прави неколку внатрешни тестови и потоа става адреса во адресната магистрала. Оваа адреса, очигледно веќе, се нарекува стартна адреса и, повторно, таа фиксирана од произведувачот. За Z80180 стартната адреса е 0000Н и на овој дел од мемориската мапа мора да содржи малку ROM за секогаш да ја памти/чува стартната микропрограма.
Слика 8.10 Има мало доцнење кога се вклучува
На слика 6.22 видовме типична мемориска мапа на која стартната програма беше на крајот од меморијата, за Z80180 потребна е малку поразлична мапа, со ова покажавме уште неколку некомпатибилности помеѓу микропроцесорите.
Првата инструкција Стартната адреса ја чита адресаниот декодер, кој дава сигнал „избор на чип“ во контролната магистрала. Овој сигнал го избира ROM чипот. Сите други чипови го игнорираат сигналот бидејќи тие не се избрани. Адресата влегува во ROM чипот и декодерот за редици и колони пристапува до соодветната адресна ќелија. Содржината во ќелијата се става во податочната магистрала за да биде исчитана од микропроцесорот.
107
Вовед во Микропроцесорите и Микроконтролерите
Второ читање Микропроцесорот ја испраќа следната адреса во адресната магистрала. Адресниот декодер повторно ќе го активира ROM чипот. ROM-от ќе стави уште податоци на податочната магистрала, кој повторно ќе бидат исчитани од микропроцесорот.
Што прави микропроцесорот со овие податоци? Ако првото читање од ROM-от е C0H, а второто читање е 86H, тогаш микропроцеосорот ги комбинира овие две и се добива 16 битна адреса, C086H. Запомнете дека сето ова е бинарно – го користиме хексадецималниот систем за да ни помогне да видиме што се сллучува. Микропроцесорот ја става новата адреса C086H во адресната магистрала. Изборот тоа да биде C086H не е на дизајнерот на микропроцесорот, тука на системскиот дизајнер – тоа е човекот кој го вметнува микропроцесорот во микросистемот.
Потоа што? Адресата, C086H од нашиот пример, пристапува до ROM-от, кој ни праќа бинарен број назад до микропроцесорот преку податочната магистрала. Во микропроцесорот, овие броеви се интерпретирани како инструкција. Со споредување на овој број со внатрешната листа на вградените контролни кодови се открива која е инструкцијата. Сетоа ова го прави микропрограмата. Што ќе се случува следно, зависи од тоа која е инструкцијата. Зошто? Зошто тоа е инструкција? Бидејќи така кажа микропроцесорот! Микрпроцесорот претпоставува дека првиот бинарен број кој пристигнува до него е интрукција, па така ако ја имаме инструкцијата ADD 25H, тогаш инструкцијата ќе биде, бинарниот код за ADD на почетокот, проследен со некоја податок што се користи, во нашиот случај 25H. Што ќе се случи ако направиме грешка и го ставиме 25 прв, проследен со бинарниот код на ADD во нашата програма? Микропроцесорот ќе мисли дека 25 е инструкција – што може да има значење за било што, или за ништо. Ако на оваа мистериозна инструкција и е потребен број, може да се искористи бинарниот еквивалент на ADD – што повторно може да биде било што. Ако на лажната инструкција не ѝ е потребно број, тогаш ADD инструкцијата ќе биде исчитана коректно како секоја ADD инструкција, но тогаш следниот бинарен влез ќе се земе како број кој треба да се собери. Нашиот микропроцесор сега има извршено неточна инструкција со користење на неточни податоци и програмота може да направи било што. Целата програма излезе од чекор и може да напрви нешто непредвидливо. Ова не е многу забавно во нашата фабрика за динамит.
108
Вовед во Микропроцесорите и Микроконтролерите Адресите се користат секој пат, микропроцесорот ја дознава преку моменталната вредност во програмскиот бројач PC, кој се зголемува секој пат кога се користи некоја инструкција или некој податок.
The fetch – execute cycle Ова претставува редот на операции во микропроцесорот и е причината за целата забуна во последниот параграф. Микропроцесорот нема ни малку интелигенција. Тој ја прати шемат прикажана на слика 8.11, без разлика што следува во програмата, или е наполнет со програма полна со грешки и ги отфрла сите тотално непотребни случајни инструкции.
Слика 8.11 The fetch-execute cycle
Тој ќе ја следи нашата инструкција, па така не ги убвинувајте микропроцесорите – зависи од нас дали ќе го наполниме со нешто разумно. За секогаш, запомнете GIGO – garbage in, garbage out. Како што видовме, нема никакви разлики помеѓу инструкции и податоци. И двете се бинарни броеви и нивната интерпретација зависи од тоа што микропроцесорот очекува да прави во тоа време. Квиз 8 Во секој случај, одбери го најдобриот одговор. 1
Стек е: a. Скратеница за стек покажувач. b. Серија од локации на RAM-от кои можат да се искористат од микропроцесорот за да запише податоци. c. Колекција на програми. d. Огниште (стек дрва). 109
Вовед во Микропроцесорите и Микроконтролерите 2
3
4
5
CPU: a. Е битен дел од секој микропроцесор. b. Е скратеница од Computer processing unit. c. Може да содржи повеќе од еднa MPU. d. Е функција на регистерот. Собирајќи ги бинарните броеви 1100 1100 и 0010 1001, користејќи го Z80180 микропроцесор, тогаш C и Н знаменцата ќе бидат: a. С спуштено и Н спуштено b. С спуштено и Н дигнато c. С дигнато и Н спуштено d. С дигнато и Н дигнато Итерапт векторскиот регистер (I) во Z80180 микропроцесорот се употребува да зачува: a. Горните бајти од интерапт адресата. b. Стартна адреса за микропроцесорот. c. Долните бајти од интерапт адресата. d. Адреса на стек покажувачот. The fetch – execute cycle: a. Работи хексадецимално b. Претпоставува дека вториот, четвртиот, шестиот итн., влез е податок. c. Претпоставува дека првиот влез е инструкција. d. Тоа систем кој се користи од инструкцискиот регистер за да ја канализира информацијата, кон точен дел од микропроцесорот.
110
Вовед во Микропроцесорите и Микроконтролерите
9 Програмирање – користејќи машински код и асемблер Микропроцесорот можеме да го користиме како дел од компјутер или како дел од контролер во фабрика за динамит, а единствената разлика помеѓу нив се инструкциите во микропроцесорот. Бидејќи микропроцесорот не е интелигентин, тој целосно се потпира на следење секвенца од инструкции, како што кажавме во fetch – execute cycle. Ако сме на некое предавање, и учителот ни каже, „Ова е крајот“, ние ќе знаеме дека е време да си ги собереме нашите работи и да ја напуштиме училницата. Но, овие зборови не се единствента можност со кои, учителот ќе не извести за крајот на предавањето, има и други „инструкции“ кои можат да се искористат за таа цел, на пример, „Ова е тоа, Благодарам“; „Овде ќе прекинеме“; „Изгледа е погодно време за пауза“; „Ќе прекинеме овде и ќе продолжиме наредниот час“, и многу други варијации. Учителот може инстантно да ја „исчисти“ цела училница, само да погледне во својот часовник и да каже, „Епа, . . .“. Има многу начини за да им се каже на луѓето кога е време да ја напуштат уќилницата.
Слика 9.1 Мал комуникациски проблем
Од друга страна, пак, микропроцесорот го нема овој степен на флексибилност, фактички тие немаат ни малку флексибилност. Многу е разочарувачки, но немаме заеднички јазик со микропроцесорот (слика 9.1). Секој микропроцесор има вградена листа на инструкции кои може да ги разбере. Оваа листа се нарекува „инструкционо множество“ и може да содржи околу стотина или повеќе инструкции, кои мораат да се зададени во точниот редослед за да може да се изврши потребната функција. Ова е работа на програмерот и е слична со градежен рабоник кој при изградба на куќа тој треба да ги стави малите делови како дрво, тули, плочки 111
Вовед во Микропроцесорите и Микроконтролерите во точен редослед. Инструкцискиот декодер ги препознава овие влезови и стартува внатрешен процес кој дозволува микропроцесорот да ги извршува интрукциите. Ова претпоставува дека микропроцесорот е веќе запознаен со инструкцијата, т.е. инструкцијата е на јазик кој го разбира микропроцесорот.
Слика 9.2 Сите велат: „ADD“
Како што видовме, не можеме директно да се обратиме на микропроцесорот, а за да биде уште полошо дури и микропроцесорите меѓусебно неможат директно да разговараат (слика 9.2). Ова е случај особено кога микропроцесорите се произведени од конкурентни производители и истовремено најголеми ривали. Секоја компанија, како Intel, има комерцијален притисок, кој им налага, новоиот микропорцесор да ги разбира бинарните кодови на своите претходни микропроцесори. Ова се рарекува „нагорна компатибилност“. Ништо не ја спречува компанијата да произведе микропроцесор со ист број на пинови и програмарачки можности како некој друг микропроцесор. Z80180 е направен како подобрена копија на Intel Z80, кој беше пак подобрена верзија на 8080A. Ова може е иритирачки за оригиналниот производител, но новиот микропроцесор е прифатен бидејќи внатрешниот дизајн не беше копиран. Навистина, и со понудата на новиот микропроцесор не ѝ се нанеси штета на оригиналната компанија, напротив, ако се продадат повеќе компатибилни процесори, ова ќе поттикне повеќе програмери да напишат програма, користејќи ист код, а ова ќе ја зголеми продажбата на микропроцесори, и така нема никој да настрада. Intel Pentuim, интеловиот пентиум, беше под сличен напад во 1997-1998 од други слични микропроцесори, серијата Athlon направени од A.M.D. (Advanced Micro Devices). Овие можат да извршуваат Pentium програми, па така, за некои цели тој е и подобар од Pentium. 112
Вовед во Микропроцесорите и Микроконтролерите
Машински код Бинарниот код кој може да го разбере микропроцесорот се нарекува машински код и се состои од „река“ на бинарни битови. Нив ги примат RAM или ROM мемориските чипови во група од 8, 16, 32, или 64 во зависност од микропроцесорот кој се користи. Да се употребуваат овие бинарни „реки“ е тотално „брборење“, т.е. наразбирливо.
Пример Ако го земеме Z80180, прикажан на слика 9.3, можеме да ја разгледаме инструкцијата која ќе ни собери два број. Едниот од броевите е веќе зачуван во акумулаторот т.е. регистер А. Да претпоставиме дека тоа е бројот 25Н. Инструкцијата: 11000110 00010101, е во два дела. Првиот бајт, 11000110, има значење да го додате бројот кој доаѓа на бројот кој е зачуван во акумулаторот. Овој прв бајт, кој ја содржи инструкцијата се нарекува операциски код (operation code), или скратено „op code“. Вториот бајт, 00010101, е бројот 15Н. Оваа инструкција има два бајта, но има и некои инструкции кои се од еден бајт, а има и такви кои користат три или повеќе бајти. Додатните бајти содржат некои податоци, кои се користат од операцискиот код, и се нарекуваат операнди.
Слика 9.3 Микропроцесорот собира два броја
Следи акцијата 1 2 3 4
Првиот бајт оди во инструкцискиот декодер каде се добиени секвенца од внатрешни операции. Тогаш го копира бројот 15Н од податочниот бафер во ALU, т.е. во аритметичка и логичка единица (Arithmetic and Logic Unit). Бројот 25Н од акумулаторот се копира во ALU за да му се придружи на 15Н кој веќе е таму, и двата броја се собираат. И резултатот се копира назад во акумулаторот. 113
Вовед во Микропроцесорите и Микроконтролерите Кој е резултатот? Тоа 3АН. Бидете внимателни да не ви „скокне“ мислата назад во декадниот систем и да одговорите 40. На крајот од програмата напишана со машинскиот код, мора да ставиме инструкција да ја стопира програмата, инаку ќе добиеме некои неочекувани и несакани резултати. Би требало да се сеќавате дека уште во развојната фаза на микропроцесорот, програмата најчесто е зачувана во RAM. RAM локациите имаат случајни вредности кога тие ќе се исклучат, па кога програмата ќе ја изврши својата последна инструкција, тој ќе почне да ги извршува тие случајни вредности како да се некоја програма. Овие инструкции можат, се разбира, да направат било што. Тие дури можат и да ја избришат или изменат програмата која тукушто сме ја напишале. Севкупно, ефектот е како авионот да се руши на крајот од својот пат.
Проблеми со машинскиот код Ги има многу. Програмата не е „пријателска“: 11000110 00010101 тешко се споредува со „собери го 15Н со бројот 25Н“ кој лесно го разбираме. Нема ништо во 11000110 кој ќе не потсети дека тоа значи „додади го бројот кој доаѓа на бројот кој е запишан во акумулаторот“, па така програмата треба тешко да се декодира бајт по бајт. Пишување на реки од единици и нули е многу досадно и ќе направиме многу грешки, особено ако се потсетиме дека една програма може да е десетици илјади инструкции подолги од ова. Можете ли да замислите да напишете половина милион битови, и тогаш програмата да стартува без грешка, и да седнете и да ги најдете грешките?! Друг проблем е тоа што програмерот мора да ја зема во предвид внатрешната структура на микропроцесорот, инаку како би знаеле кој регистер да го користиме, или пак кој регистер постои? Ќе го изучиш сето ова и потоа го сменуваш микропроцесорот и потоа што? Целиот процес на учење треба да почне одново – нови инструкции, нови регистри, и потребно е ново кодирање. Сето ова е заплашувачко.
Слика 9.4 Јазици на високо и ниско ниво
114
Вовед во Микропроцесорите и Микроконтролерите Во раните почетоци на микропроцесорите, тешкотиите со машинскиот код им нанело многу тешкотии во нивното произвотство. Секој кој што ги програмираше, беше фанатик и ја сакаше таа комплексност, но и имаа помалку работи кои ги извршуваа микропроцесорите. Овој прв програмски јазик беше наречен јазик на „ниско ниво“ за да го одделиме од нашиот вербален јазик кој е наречен јазик на „високо ниво“. Машинскиот код подоцна го нарекававме „прва генерација“ на јазик (слика 9.4). Многу брзо, користењето на микропроцесорите се зголеми во обемот на задачите и се појавија револуционерни идеи, како „брзина и леснотија“ кои отворија многу дискусии. Резултатот од ова беше нов јазик наречен Асемблерски, кој ги надмина повеќето недостатоци на машинскиот код.
Асемблерски јазик, втора генерација на јазик Асемблерскиот јазик беше направен да ја извршува истата работа како машинскиот код, но е многу полесен за користење. Ги замени сите единици и нули со букви кои се лесни за паметење, но сеуште е јазик на ниско ниво. Асемблерскиот еквивалент за нашиот машински код 11000110 00010101 е кодот ADD A,m. Ова значи „додади го m (било кој број) на вредноста кој е во акумулаторот. Може брзо да уочиме дека многу брзо и лесно можеме да го погодиме значењето на ADD A,m со што го прави прогрмирањето многу лесно. Ако треба да избираме букви за да ни престатвува „собирање“, ADD очигледно е добар избор. Подобро е вака, отколку да користиме алтернативи XYZ k,g или ABC r,h. Кодот ADD A,m е наречен мнемоник. Мнемоникот е само, помош во меморијата, и се користи за асемблерски код. Еве неколку примери: SLA E : за поместување (шифтирање) на содржината во регистерот Е на лево. LD B 25H : наполни го регистерот B со бројот 25H. Сега да видиме колку е лесно да го погодиме значењето на следнови: INC H LD C 48H Конечно, да го погодете значењето на нешто што сеуште не сме го спомнале. LD B B’ Ако SLA E ни значи да ја поместиме содржината на регистерот Е за едно место на лево, тогаш SRA E значи да се помести за еден бит на десно. LD C 48H значи, стави го бројот 48Н во регистерот С. LD B B’ ни овозмижува да го копираме бројот кој веќе е запишан во регистерот B’ во регистерот В. Забелешка: мнемониците се разликуваат кај микропроцесорите. Производителите издаваат „инструкциско множество“ кое е листа на сите кодови кои се користат во нивните микропроцесори, заедно си бројот за тактот (clock cycles) со кој се зема секоја инструкција и објаснување за секоја функција. 115
Вовед во Микропроцесорите и Микроконтролерите
Недеструктивно читање Инцидентно, но микропроцесорите заедно со мемориите, секогаш користат недеструктивно читање. Ова значи дека информацијата е поместена од едно место на друго со нејзино копирање, и со оставање на оригиналниот број недопрен. На пример, по инструкцијата LD A C, и двата регистри А и С ќе завршат со иста информација во нив. Ова овозможува да се употребува запишаната информација повторно и повторно. За да можеме да напишеме ADD A, 15 наместо 11000110 00010101, ние користиме друга програма за да ја направи оваа конверзија. Оваа програма е наречена Асемблер (слика 9.5)
Слика 9.5 Асемблер
Програмата ни дозволува да пишуваме асемблерски код, наречен изворен код, и таа ни го конвертира во машински код наречен како објектен код. Прогамата може да ни го покаже објектниот код на екран, или да ни го испечати, или пак да го стави во RAM меморија спремна за користење. Кога го стартуваме асемблерот, треба да ја наведиме стартната адреса на RAMот која ќе ја користиме. Ова е само за да се осигураме дека RAM-от е инсталиран. За да ни биде полесно објектниот код е прикажан со хексадецимални броеви наместо во бинарни. Асемблерот може да работи само со инструкционото множество кое доаѓа од дизајнерот на микропроцесорот. Не може да се додаде нова инструкција, тоа е само едноставен конвертер или транслатор помеѓу мнемониците и машинскиот код. Асеблерите можат да се најдат на многу места и сите тие ја овозможуваат потребната конверзија од изворен код во објектен код. Додатно, можат да имаат уште некои особини кои можат да ни помогнат при програмирањето.
Помош за синтаксата Синтакса ни е структура на исказите во некој јазик, без разлика дали е Македонски, Англиски или компјутерски јазик. Кај Македонскиот, повеќето од нас ќе забележат, ако кажеме „Тој одеа“, дека овој исказ е грешен, наместо да кажеме „Тој оди“. Ова е пример на, грешка во синтаксата. На пример, ако направи грешка при пишување на инструкцијата LD A C, и напишеме LD A V тогаш асемблерот не ќе може да ја конвертира во објектен код бидејќи не го препознава „V“ како постоечки регистер. Ефтин асемблер може да застане или да ја скокне оваа инструкција. Некој подобар, асемблер, може да не извести со „Синтаксичка грешка: кодот не го препознавам“, а пак некој многу подобар може да ни даде некои сугестии која ни е грешката, или пак како да ја исправиме. Може да ни каже: „Синтаксичка грешка. Невалиден регистер. Регистрите можат да бидат A, B, C, D, E, H или L“. 116
Вовед во Микропроцесорите и Микроконтролерите
Лабели Друга можност која ни ја нуди добар асемблер е лабелата. Лабела е збор кој може да се користи да претставува адреса додека ја пишуваме програмата. Да ве потсетам дека треба да му се даде инструкција на микропроцесорот да застане на крај од програмата, инаку ќе почне да следи случајни инструкции. Еден начин за да се стопира микропроцесорот е да му се даде да работи нешто незначајно, како, да претпоставиме отварате плико, ја читате пораката внатре „остави го пликото на масата, земете го пликото, отворете го пликото, прочитајте ја поракта и извршете ја инструкцијата“. Па така, го отварате пликото, ја читата инструкцијата, го оставата на масата, го зимате пликото, ја читате инструкцијата. Па го отварате пликото, ја читате инструкцијата . . . и сигурен сум дека ќе го погодите следниот чекор. Секако, многу брзо ќе престанеме да го правиме тоа бидејќи гледаме дека е безмислено. На друга страна, микропроцесорот нема меморија за тоа што направил претходно и ќе биде многу „среќен“ да го направи тоа и ако е потребно засекогаш. Секој бајт на програмата е запишана во секвенца од мемориски локации, па така, ако стартната адреса на програмата е 0300Н и сме стигнале до адреса 0950Н каде е потребна инструкција за стоп. Последната линија на програмата нека е „jump to address 0950H“. Jump инструкцијата му кажува на микропроцесорот да оди на адресата која следи, во овој случај 0950Н, и изврши ја инструкцијата што ќе ја најдеш таму. Па така, микропроцесорот ќе се најде во безкраен круг (јамка) прикажан на слика 9.6. Кога микропроцесорот ќе се најде во ваков круг, ќе се врти непрекинато се додека не се исклучи од струја, или додека ресет пинот не се стави на ниско ниво, или ако се активира еден од интерапт пиновите.
Слика 9.6 Еден начин на сопирање на микропроцесорот
Па каде ќе ја ставиме лабелата? Да претпоставиме дека треба да додадиме уште една линија на почетокот од програмата, ова ќе ни го помести секој бајт за една место подолу во меморијата и тогаш последната линија од програмата ќе биде 0951Н, наместо 0950Н. Кога програмата ќе му каже на микропроцесорот да скокне на адреса 0950Н, тој повеќе нема да биде во безкраен мал круг. Новата содржина на адреса 0950Н може да изврши некоја случајна инструкција и целата програма да крахира. Овој проблем е прикажан на слика 9.7, каде асемблерот нема да примети дека ова е грешка. Запомнете дека асемблерот само работи со познати кодови, не е паметна програма.
117
Вовед во Микропроцесорите и Микроконтролерите
Слика 9.7 Ако подоцна ја измениме програмата може да уништи сè
Ако напишеме збор врз позицијата каде што стои мемориската адреса, тогаш тој збор ќе биде препознаен како лабела. Тој збор е еквивалент на адресата која сме ја замениле. Ако ја користиме истата лабела на друго место во програмата, таа ќе ни враќа иста вредност. Добрата работа е тоа што, ако се промени програмата, ќе се променат и адресите, тогаш и вредноста на лабелата ќе се промени автоматски, па така двата збора „STOP“ во последната линија секогаш ќе имат иста вредност и тогаш безкрајниот круг ќе биде зачуван од инцидентно рушење. (види слика 9.8).
Слика 9.8 Спасот е во лабелите
Ако еднаш асемблерот ја прифати лабелата, таа може да се користи колку сакаме во прогрмата, но запомнете дека лабелата треба да има само едно значење во една програма, т.е. изборот на лабели треба да биде различен од зборчињата кои имаат специјално значење во асемблерот. Тие зборчиња се нарекуваат „резервирани“ зборчиња и обично се зборовите: jump, LD, ADD, HALT итн. Точната листа доаѓа со асемблерот.
Коментари Асемблерот и сите јазици на повиско ниво ни дозволуваат да пишуваме коментари или белешки, за да ни служат како потсетници, но да бидат игнорирани од асемблерот. За да му укажеме на асемблерот да не ги конвертира во објектен код, коментарот го почнуваме со точка запирка (;) или со зборчето REM: или нешто слично.
118
Вовед во Микропроцесорите и Микроконтролерите Последната линија од нашиот код го користи мнемоникот JP за скок (jump) и можеме да запишеме: STOP
JP STOP ;ова ќе го држи микропроцесорот во безкреан круг.
Со можноста да ставаме коментари во програмата, си олеснуваме во иднина полесно да сфатиме што прави програмата. Додека ја пишуваме програмата ние точно знаеме што правиме, но ако направиме поголема пауза можеме да се загубиме во програмата и да не знаеме што точно правиме. Па затоа убаво е да ставаме коментари, иако додека програмираме не ни се многу потребни.
Резиме за асемблерскиот јазик Асемблерскиот јазик и машинскиот код не се подвижни, т.е. тие се дизајнирани за употреба на еден тип микропроцесор и не можат да се користат на друг тип микропроцесори. Исто така потребно е да знае програмерот за внатрешната архитектура на микропроцесорот. Занемарувајќи ги двата претходни проблема, подвижноста и познавањето на архитектурата, асемблерскиот јазик го преживеа нападот на новите, модерни „подобрени“ јазици кои ќе ги разгледаме подоцна. Зошто? Асемблерскиот јазик има две поважни привилегии за компетентниот програмер. Пишувањето програма во асемблерски јазик е многу брзо и многу компактно, т.е. зазима помалку мемориски простор за да се зачува. Машинскиот код и асемблерскиот јазик се нарекуваат процедурални јазици. Ова значи дека програмата му дава инструкција на процесорот да ја изврши првата инструкција, потоа да ја изврши наредната, па наредната и се така додека не ја заврши својата работа. Ова е како некој рецепт. Скоро, сите микропроцесорски базирани системи се дизајнирани да работат на овој начин и многу јасно изгледа дека е тешко да се изнајде некоја алтернатива – но постои и ќе ги разгледаме подоцна. Квиз 9 Во секој случај, одбери го најдобриот одговор. 1
2
Асемблерот: a. Ја конвертира асемблерската програма во машински код. b. Е тип на микропроцесор. c. Го конвертира објектниот код во машински код. d. Е потребен за конвертирање на мнемониците во изворен код. Податокот кој го прати op code (операцискиот код): a. Секогаш го има и е составен од еден или повеќе бајти. b. Се нарекува објектен код. c. Се нарекува операнд. d. Употребува декаден број.
119
Вовед во Микропроцесорите и Микроконтролерите 3
4
5
Лабела е: a. Важна особина во дизајнирање на костуми. b. Форма на синтаксичка грешка. c. Претставник за адреса додека се пишува програмата. d. Делот од програмата кој доаѓа пред операндот. Машинскиот код: a. Не е јазик на ниско ниво. b. Се пишува корисејќи мнемоници. c. Јазик направен за контрола на машинеријата во индустријата. d. Е објектен код. Делот од микропроцесорот кој може да го разбира машинскиот код се нарекува: a. Асемблер. b. Инструкциски декодер. c. Инструкциски регистер. d. Механичар.
120
Вовед во Микропроцесорите и Микроконтролерите
10 Јазици на повиско ниво Трета генерација на јазици Третата генерација на јазици е одбран за да ни го олесни животот. Направени се за да ја подобрат читливоста, со користење на Англиски зборови кои ќе ни го олеснат разбирањето на програмата и на некој начин полесно да ги откриеме грешките (баговите) во програмата. Процесот на отстранување на грешките (bugs) се нарекува debugging (дебагирање, т.е. откривање на грешки). Дополнително, тие треба да го ослободат програмерот од потребата да ја знае внатрешната архитектура на микропроцесорот со што програмата станува целосно подвижна. Погодно е и тоа што програмерот, не ни треба да знае затоа кој процес се користи. Овие јазици се нарекуваат јазици на повисоко ниво и сите се процедурални. Со текот на годините, испаднаа многу јазици за програмирање исто како и многуте микропроцесори. Исто како и микропроцесорите, неколку јазици го имаа тој специјален талент кој ги отргна на страна од целата палета на јазици. Ќе претставиме неколку од „преживеаните“.
Fortran Во почетните денови на компјутерската ера, беше битно да се подобри брзината и прецизноста во извршувањето на математички пресметки – наместо користење на некоја нова и подобрена машина за калкулирање. IBM доминираше во компјутерскиот свет и во тоа време нивниот вработен John Backus го направи подобрениот јазик кој го заменуваше асемблерскиот јазик. Конечно во 1957, резултатот од тоа беше јазикот Fortran. Ова беше првиот јазик на високо ниво кој многу широко беше прифатен. Неговата „искра“ беше тоа што можеше да пресметува математички формули. Од овде му доаѓа и иметоа „FORmula TRANslation“ (оригинално „IBM Mathematical Formula Translating System“). (види слика 10.1)
Слика 10.1 Првиот успешен јазик на високо нови – и сеуште опстанува
121
Вовед во Микропроцесорите и Микроконтролерите Fortran има вметнати инструкции за да може да се справи со повеќето научни формули како што се пресметување на синус од некој агол, што е екстремно тешко да се направи со асемблерски јазик. Тешко, но не е невозможно. После се, програмата напишана во Fortran прво мора да се конвертира во машински код, кој што го разбира микропроцесорот. Откога ќе се конвертира во машински код, тогаш микропроцесорот ја гледа програмата како да е напишана директно во машински код. Како што течеше времето, се додаваа мали измени, и алтернативи, и така јазикот добиваше нов „диалект“. Недостатокот од ова е тоа што почнуваше да ја разјадува подвижноста – тоа е една од примарните особини кои треба да ги имаат јазиците на повисоко ниво. Во 1958 излезе редефиниран јазик наречен Fortran 2 кој многу брзо се замени со Fortran 3 и 4. Се изродија и уште нови верзии, па во 1966, конечно на крај се дефинираше верзијата Fortran 66, која истотака беше подобрена со Fortran 77, и асполутно конечната верзија и целосно дефинитна беше Fortran 90. Ова не беше така лошо, како што изгледа, бидејќи секоја нова верзија немаше промени тука имаше само додадени екстра работи. Потоа испадна Fortran 95, па излезе и една некаде во период помеѓу 2004 и 2006, и беше означена како 200Х која ни кажува дека е излезен не подоцна од 2009 година. Во меѓувреме испадна и многу лесна верзија за учење, наречена F, која е компатибилна со Fortran 77, 90 и 95 кој вклучува повеќе модерни карактеристики, додека старите и редунданти секции беа отфрлени. High Performance Fortran (HPF) (Фортран со високи перформанси) е сличен со верзиите 90 и 95, освен што е проширен со можноста микропроцесорот паралелно да извршува процеси за да добие во брзина.
Compilers, Компајлери Во асемблерскиот јазик ние користевме програма, асемблер, кој ни ги конвертираше мнемониците во машински код. Честопати кажуваме дека е извршено конверзија од изворен код во објектен код, но се мисли на истата работа. Кај Fortran, па и во секој јазик на виско ниво, се користи компајлер за да ни „произведе“ машински код. Компајлерот, исто така ќе ни даде и многу добра, како што се проверка за грешки и проверка на синтаксата, со кои се сретнавме во асемблерите. И компајлерите и асемблерите се софтвер – програми направени да извршуваат специфична работа. Ако сакаме да користиме 68000 микропроцесор, ние мора да користиме програма за специјален јазик, да кажеме Fortran, ние мораме да купиме „Fortran 90 за 68000“ компајлер. Тој ќе со ја изработи својата работа и ништо друго не може да работи. Не можеме да го приспособиме да може да го користиме за различен микропроцесор, види слика 10.2.
Слика 10.2 Компајлерите се слични со асемблерите
122
Вовед во Микропроцесорите и Микроконтролерите Во основа сите асемблери се еден-на-еден конверзија, го пишуваме op code-от и ни излегува објектен код, па така имаме разлика помеѓу два асемблери, и можноста за количината на дебагирање и работата со лабели кои можат да ја овозможат. Додека компајлерите се различни, конечните еквиваленти на објектниот код како за синус или квадратен корен не се секогаш исти, и зависат од вештините на дизајнерот на компајлерот. Програмерот мора да ги разгледа сите понудени команди за јазикот на повисоко ниво и тогаш да напише асемблерска програма што ќе извршува таа функција. Некои компајлери, за жал, се многу подобри од други.
Libraries, linkers and loaders, Библиотеки, поврзувачи и полначи Кога дизајнерот ќе го „извојува“ процесот на пишување асемблерски код за одредена тешка формула, треба да го зачува резултатот настран за да може да ја употреби во друга прилика. Колекцијата од ваквите решенија се нарекува библиотека и можат да се купат.
Слика 10.3 Од високо ниво кон ниско ниво на јазик
Ова ја намалува количинатана за пишување на целиот код кој е потребен. Може „новите“ формули да се направат со комбинација на веќе постоички код. Ставањето, на овие веќе направани рутини, од библиотеките во главната програма, се прави со поврзувачи (linkers) кои се уште едно парче софтвер. Поврзувачите ги групираат т.е. поврзуваат заедно повеќете одделни делови на кодот во една програма спремна за употреба. Последно што треба да се направи е да се стави во некој RAM кој е подготвен за употреба. Друго парче софтвер се користи за да детерминира кои адреси од микропроцесорската системска меморија е слободна за користење. Ова се нарекува полнач (loader). Полначот истотака ги конвертира лабелите во нивните крајни адреси. Многу често поврзувањето и полнењето се комбинирани во една поврзувач-полнач (linker-loader) програма. Процесот е илустриран на слика 10.3.
123
Вовед во Микропроцесорите и Микроконтролерите
Изворен код напишан во Fortran Кодот содржи нумерирани искази наречени програмски линии и се користат за да му соопштат на системот по кој редослед треба да се извршат инструкциите. Без разлика на командите, програмските линии се извршуваат по нумериран редослед. Кодот напишан во Fortran е во многу компактна форма, многу блиско како во математичка форма. На пример, кодот за да се зачува некој број и да се најде неговиот квадратен корен, би изгледал вака: 1 2
Read (4) P A = SQRT(P)
Во првиот исказ, микропроцесорот треба да го внеси бројот 4 (ова треба да биде претходно дефинирано) и да го вчитува со број кој го викаме P. исказот 2 го наоѓа неговиот квадратен корен. Fortran има многу голем број библиотеки за да може да се справи со научни и инжењерски проблеми. Недостатокот на Fortran е тоа што интрукциите му се многу компакти, и можат да изгледаат малку заплашувачки. Додатно, форматот му е многу прецизен и ова го први тежок за учење. Ако имате смртен страв од математика пристапот кон него сигурно ќе ви биде со мало застрашување.
Basic Во Dartmouth колеџот, САД, беше направен упростен јазик. Се базираше на Fortran и беше дизајниран да го поедностави јазикот и да го олесни изучувањето. Овој јазик беше наречен Basic (Beginners’ All purpose Symbolic Instruction Code) и првото појавување му беше во 1960 (види слика 10.4).
Слика 10.4 BASIC јазиците
124
Вовед во Микропроцесорите и Микроконтролерите Во почетните денови, имаше приоритет да биде „лесен за учење“ и да „користи минимални количини на меморија“ бидејќи тогаш меморијата беше многу скапа. Овие два атрубута го направија многу користен во колеџите, но беше многу игнориран „во реалниот свет“. Кога се појавија микропроцесорите и се зголеми бројот на микрокомпјутерите, придобивките од мали потреби од меморија им ја обнови популарности и го „отргна“ овој јазик. За да зачува во меморија, Basic беше направен како толкувачки јазик, толкувач (interpreter) наместо компјалер (compiler), ја извршуваше конверзијата од изворен во објектен код. Која е разликата? Компајлерот ја конвертира целата програма во објектен код, ја зачувува, и потоа ја стартува. Толкувачот има друг пристап, ја конвертира првата линија од програмата во изворен код, потоа првиот член од изворниот код го конвертира во објектен код и потоа го стартува и се така низ цела програма (види слика 10.5). толкувачот никогаш не го зачувува целиот машински код на програмата. Само го генерира, линија по линија, кога е потребно.
Слика 10.5 Бавен и лесен интерпретер
125
Вовед во Микропроцесорите и Микроконтролерите
Развојот на Basic „Експлозијата“ на користење на микрокомпјутерите во 1980 година резултираше со прифаќање во големи размери на јазикот Basic. Беше користен од, или најмалку се забавуваа со него, многу луѓе од било кој друг претходен програмски јазик дотогаш. Почнаа да се појавуваат многу варијации, или дијалекти, како што беше со Fortran. Во случајот на Fortran, American National Standard Institute (ANSI), Американскиот институт за стандарди, ги собра сите идеи заедно и го издаде стандардот Fortran-и како Fortran 66, 77 и 90. Ова не се случи со Basic и резултатот сега е, отворен пазар со неколку илјади различни натпреварувачи, на некој начин компатибилни, Basic јазици кои се појавија насекаде. Од најпрвите кои оставија голем впечаток и популарност беа верзиите Q-Basic, GW Basic и Quick Basic. Неодамна, со виртуелниот монопол на оперативниот систем Windows, се појави нова верзија наречена Visual Basic (VB), кој имаше особина многу лесно да генерира програми за Windows. Со годините, развојот на јазикот стигна до многу висок степен во неговите можности, за рзлика од неговиот близок ривал Fortran кој беше за математички пресметки. Basic се ослободи од почетниците и се користеше од многу проефесионални програмери. Сега големината на меморијата не е некој проблем, па се користи верзија со компајлер за да го убрзи извршувањето на програмите. Имаше серија на верзии од Visual Basic, од VB1 до VB6 и сега имаме VB.Net кој ни овозможува многу лесна манипулација со работа на Windows™ и Web страните.
Basic-от е многу читлив Користи нумерирање на линиите, како во Fortran, и генерално е читлив. Еве мал пример, тестирајте ја читливоста и претпоставете што ќе се случи: 10 20 30 40
input A, B Let C = A * B Print C End
Кај линијата 10, потребно е да се внесат два броја А и В, веројатно преку тастатура. Линијата 20 дефинира нов број С како резултат од множењето на А и В. Print значи да го испечати С на печатач или екранот. Последната линија ја стопира програмата. Како што се саќаваме, секогаш треба да му даваме на микропроцесорот нешто „сигурно“ да работи откога ќе заврши програмата, инаку ќе почне да извршува случајни инструкции. Тоа можеме да го постигниме ако го ставиме во безкраен круг, како што направивме во примерот со асемблерски јазик, да ја повторува цело време истата инструкција или можеме да го исклучиме пратејќи друга програма. END инструкцијата го прави баш тоа, програмата се става во „монитор“ програма. Монитор програмата ги прави често заборавените делови од системот како што е скенирање на тастатурата за да прифати идни инструкции и тоа не го покажува визуелно на екран.
126
Вовед во Микропроцесорите и Микроконтролерите Наредбите се извршуваат по броен редослед и ако недостига бројот на линијата, таа линија се игнорира. Ова ни дозволува да употербуваме броеви кои се зголемуваат за чекор од 5 или 10 наместо еден. Привелегијата од ова е ако имаме заборавено некоја инструкција, подоцна да можеме да ја вметниме во нова линија. На пример, ако сакаме да ја поделиме вредноста на С со 2 и потоа да го испечатиме резултатот, можеме да додадеме пар на екстра линии: 10 20 30 32 35 40
Input A, B Let C = A * B Print C Let D = C/2 Print D End
На крај да кажеме дека, ги немаме поставено A, B, C и D на почетокот, програмата ги превзема сите потребни работи, т.е. со други зборови не треба да ги декларираме променливите.
Cobol Ова е син на Fortran, и не се направани поголеми чекори за да се вметнат секојдневни фрази од Англискиот јазик. Cobol го претстави US Defense Department, Американскиот одел за одбрана, во 1959 – веднаш пред Basic (види слика 10.6). Неговата цел беше, не како на Fortran работа со бројки, туку работа со информации. Се покажа како успешен во ова и широко се користеше во Американската војска за запишување на стоковите резерви и намирници, па и во бизнис светот. Името доаѓа од COmmon Business Oriented Language.
Слика 10.6 Ова е бизнис
127
Вовед во Микропроцесорите и Микроконтролерите Cobol беше дизајниран, со надеж, да биде лесно прочитлив од не програмерите. Како и да е, изгледаше по пријателски настроен, отколку математичкиот пристап на Fortran и преживеа до сегашните денови. Големи бизниси работат со многу голема количина на информациони податоци, само замислете ја количината на информации кои се потребни за неколку секојдневни активности. Кога аплицираме за да отвориме сметка во банка – ни даваат апликација која е полна со приближно бесконечен број на прашања. Потоа сакаме кредитна картичка – уште апликации, уште повеќе информации, повеќето исти, со тие што сме ги дале за банкарска сметка. Потоа сме купиле нешто со картичката. Што купивме, бројот на стоката, нејзината цена, датата, нашиот број на картичката и името, ова сè се испраќа до националниот картичен центар и тогаш се обновува нашата сметка. Ниедна од ова трансакција нема потреба од некоја комплицирана математика, пресметките во основа се собирање и одземање. Па така пресметувачката особина на Cobol не треба да се натпреварува со Fortran, па дури и Basic. Но што треба да направи за да ги добие сите поврзани информации – со внесување на нашиот поштенски број да излезат сите информации за нас – запосленост, домашна адреса, хобиа, состојба на плата и скоро сè што ќе посакат. Некои од овие информации се купуваат и продаваат помеѓу компаниите без да не прашат нас. Како Fortran, и тој се сретнал со некои специфични потреби и имаше серија надоградување на стардната верзија. Тие се бележеа со додавање на годината во која испаднале: Cobol 60, Cobol 74, Cobol 85, Cobol 97 и новата 2002 верзија. Многу напор се направи за да им се дозволи да го разберат јазикот на оние кои знаат повеќе Англиски јазик одошто знаат да програмираат. Така, изразите во Cobol се Англиски фрази кои вклучуваат глагол и завршуваат со запирка. Фразите можат да се спојуваат за да формираат реченица или единечен израз може да заврши со точка. Една линија може да биде: 1
Add staff to customers to give total people.
Pascal Pascal најпрво беше дизајниран во Швајцарија во 1971 (слика 10.7). Тој повеќето се користеше за наставни цели и со тек на време на големо се превзема за професионално програмирање како што е и јазикот С. Кога се изучува некоја јазик за програмирање, многу често како вовед се одржува краток курс по Pascal. Тој се употребува бидејќи е „добар за вас“, исто како што се вели за да се научат Европските јазици е „добро“ најпрво да се научи Латински како основа пред да се започне да се учи Француски, Германски или Шпански. Pascal е многу структуриран јазик, и една структурирана програма содржи серија од одделни, самостојни целини која секоја си има своја единствена стартна точка и единствена крајна точка. Распоредот на програмата изгледа како едноставен блок диаграм со сите блокови во него подредени еден под друг. Бидејќи секоја целина може да се изолира од оние над и под неа, откривањето на грешки, или пак разбирањето на нова програма е релативно многу лесно.
128
Вовед во Микропроцесорите и Микроконтролерите
Слика 10.7 Pascal ве прави среќни
Јазиците како Basic може со користење на инструкцијата како GO TO да скокнат до нов дел од програмата и ова многу често доведува до резултат кој се нарекува „шпагети“ програмирање, кој го прави тешко откривањето на грешки во програмата или пак разбирањето што работи програмата (види слика 10.8). Pascal го избегнува ова со употреба на инструкции како што е „Repeat ... until“. Basic се исправи во овој поглед со воведувањето на ваков тип на инструкции во поновите верзии.
Слика 10.8 Структурирано и шпагети програмирање
129
Вовед во Микропроцесорите и Микроконтролерите
C Дел од навиките за „добро“ учење на програмирање, Pascal на големо беше заменет со програмски јазик наречен C, откриен една година подоцна од Pascal и ги овозможува сите добри вежби за методите при програмирање кој ги овозможуваше Pascal и уште неколку екстра (види слика 10.9).
Слика 10.9 С
Главната разлика е тоа што тоа е јазик на пониско ниво од Pascal кои изгледа многу чудно напредување, но неговите придобивки се тоа што може да ги контролира особините за ниско ниво, како што е запишувањето во меморијата исто како со асемблерски јазик, но без негово користење. Секако, тој има и многу особини за високо ново, и особини на ниско ниво, кои можеме да ги искористиме и да создадеме многу компактен, а со тоа и брз, код.
С++ и објектно ориентирано програмирање Новата верзија на С го вклучи целиот претходен јазик С, но и додаде една нова особина наречена објектно ориентирано програмирање. Оваа верзија, наречена С++, претставена е како супермножество на С (види слика 10.10). Објектно ориентираното програмирање е на некоја начин различен пристап кон програмирањето. Во сите претходни случаи, задачата ни беше поставена и ние баравме процес кој ќе стигнеше до потребниот резултат. Во објектно ориентираните јазици имаме неколку објекти кои можат да бидат било што од податоци, диаграм кој се прикажува на екранот, блок од текст или пак целата програма. Откога еднаш ќе ги дефинираме објектите,
130
Вовед во Микропроцесорите и Микроконтролерите тогаш можеме да ги алоцираме во нивни сопствени мемориски полиња и да дефинираме на кој начин да извршуваат нешто, кое се однесува на целиот објект во исто време.
Слика 10.10 С плус и Java
На пример, ако сакаме да нацртиме правоаголник на екранот и ако сакаме да го подместиме, можеме да пристапиме на два начина. Може да ја земаме секоја точка од екранот и да ја поместиме нејзината позиција, а со тоа повторно да го нацртаме правоаголникот на друга позиција. Објектно ориентираниот простап би бил да го дефинираме обликот на објектот, потоа да му дадеме инструкција за да го подместиме. Ова е многу слично како што го правиме и во Windows околина. Го користиме глувчето за да го држиме објектот, да речеме прозорец, и едноставно да го повлечеме на нова позиција. Прозорецот се однесува како една грутка, која е пример за објект. Сите прозорци имаат сличности и разлики. Слични објекти се групирани во класи „classes“. Класата ги вклучува дефиницијата и типот на податоци заедно со методите на манипулација кои можеме да ги направиме врз објектот. Во нашиот пример за класа ги вклучува прозорците, а секој специфичен прозорец се нарекува „инстанца“, „instance“. Сите класи делаат некои својства наречени „public“ својства, и некои пак се различни на некој начин, исто како различен текст кој е внесен, и овие се нарекуваат „private“ особини. Како што кажавме претходно, С++ е само стандарден С со екстра додаток за објетно ориентирано програмирање.
Java Сепак не е оригиналната дестинација (островот во Индонезија), Java е идеална за трансмисија на информации преку Интернет. На прв поглед изгледа дека е сличен на С++, но има некои 131
Вовед во Микропроцесорите и Микроконтролерите важни придобивки. Тој е мал и нема потреба од одредена архитектура и затоа може да се вгради во многу апликации и да се употребува во голем ранг на системи. Ова вградување на Java код се нарекува аплети „Applets“ и се опотребуваат во Internet Explorer и другите интернет пребарувачи.
Четврта генерација на јазици Четвртата генерација на јазици се не-процедурални и имаат тенденција да се концентрираат на она што треба да го прави програмата, за разлика од механичкиот чекор-по-чекор пристап за процедуралните јазици. Привремени дефиниции за овие јазици се дека тие се најнови, или најпопуларни или „најдобри“ јазици, но ниедна од овие дефиниции не е прифатена, па така може е најдобро да кажеме, и да се држеме на тоа, дека тие се не-процедурални јазици.
Lisp Lisp испадна во скоро исто време кога испадна и Cobol т.е. неколку години пред Basic. Тоа беше производ на работата на Американецот John McCarthy (види слика 10.11). Lisp (LISt Processing), процесирање на листи, работи со манипулација на податоци кои се во листи или пак внесени преку тастатура и се поврзани со вештачка интелигенција. Lisp е функциски ориентиран јазик, а тоа значи дека ние дефинираме функција, како собирање одземање или некоја повеќе комплексна. Листата содржи серија од „членови“ одделени со празно место и се „затворени“ во загради. Пример за листи: (2 5 56 234), или пак (мајка татко син ќерка).
Слика 10.11 List – се справува со листи
132
Вовед во Микропроцесорите и Микроконтролерите Дефиницијата на едноставна функција би билa (PLUS 6 4) и ќе ни врати резултат 10, кој е збир од двата броја. Бидејќи ова е интерпретирачки јазик, програмата се извршува чекор-по-чекор, а како влезни вредности се користи тоа што е внесено. Во некои верзии на Lisp, ова може да се запише како (+ 6 4), т.е. користејќи математички симбол. Можеме да си дефинираме наша функција, на пример: >(defun result (A B)(+ A B)) defun = дефинирај функција, а А и В се влезни броеви, а за одговор е именуван како „result“. Па така ако ги внесеме броевите 4 и 5 ќе добиеме одговор 9. Со ова дефиниравме функција со која можеме да ги собериме двата внесени броја А и В. Може ова да го искористиме да внесиме листа од вредности за А и В и да добиеме листа од сите резултати.
APL Буквите APL се скратеница од „A Programming Language“. Ова е уште еден интерпретирачки јазик изгреден од IBM, околу 1962 година, и се користи само за нумерички податоци. Тој е чиден микс од Lisp и Fortran. Тој ги комбинира функциската ориентираност на Lisp, со процедуралната математика на Fortrn (види слика 10.12). Дозволува корисникот да си дефинира свои функции, и има голема библиотека од решенија за одредени проблеми. Повеќето луѓе ќе се согласат со тоа дека ако сакаш да изучиш некој програмски јазик, APL не е јазик кој се учи ако се брзаш за нешто. На пример, иако ги има сите четири основни функции: собирање, одзимање, множење и делење, работата со нив не е лесна. Каков резултат ќе очекувате за 2 * 3? Тоа не е 6. За да добиете шест треба да напишете 2 3, а резултатот од 2 * 3 е всушност 23 т.е. 8. Изразот: 4 – -2, е одземи од 4 минус два и ќе добиете плус шест.
Слика 10.12 APL (A Programming Language)
133
Вовед во Микропроцесорите и Микроконтролерите Забележете ја разликата на симболот минус и симбилот за негативен број. Други математички функции како што се синус, косинус и тангенс се заменети со специјални знаци кои не се наоѓаат на стандардна тастатура. Не е лесно. Добрата страна е тоа што ако го изучиш еднаш ви овозможува брзи и компактни програми, но многуте криптични изрази ќе имаат потреба од многу коментари за да ви помагнат да ја разберете програмата.
Prolog Prolog се нарекува „декларативен“ јазик со кој програмерот не треба да знае што точо ќе биде излезот пред да почне да ја прави програмата. Прво е направен во Франција во 1972, со причина да може да се користи за создавање на вештачка интелиганција. Prolog доаѓа од PROgramming by LOGic. Во Велика Британија се произведоа други верзии како DEC10, IC Prolog, додека во Америка има и други верзии (види слика 10.13).
Слика 10.13 Jазик базиран на логика (prolog)
Prolog е уште еден не-процедурален јазик, со кој немаме рута до целта, туку множество на информации и методи со кои може да се дојде до резултатот. Во основа, идејата е да се внесат неколку факти и да се праша програмата да дојде до некој заклучок. Потсетете се на малата логичка сложувалка како „Ристо е женет со Ана, Благој е син на Петар и братот на Марко . . . Благој е брат на . . .“, ви текнува на ваквите сложувалки – со многу меѓуповрзани делчиња на информации се додека на ве заболи главата. Е ова е работа само за Prolog. Програмата е составена од факти и правила, па потоа можеме да поставиме прашање. Еве еден многи едноставен пример.
134
Вовед во Микропроцесорите и Микроконтролерите Facts: coins (franc, france) coins (centime, france) coins (dollar, usa) coins (cent, usa) Rules: french(x):-coins (x,france) american(x):-coins (x,usa) Сега можеме да поставиме прашање: ?french (centime) answer: Yes ?french (dollar) answer: No Засега е ОК, но: ?american (dime) answer: No Нема информација за тоа дали „dime“ е точно или не, па тој „игра“ сигурно и одговара со негативен одговор.
Иднина Зголемувањето на брзината на микропроцесорите со користење на повеќе микропроцесори за да си ја поделат задачата, заедно со намалување на големината и цената на меморијата е главен клуч за иднината. Идејата да се има десктоп компјутер кој работи на 20 GHz и кој има 126 Gbytes меморија не е веќе апсурдна. Во табела 10.1 се дадени трендовите кои беа во последните 26 година, и проектирани се уште 26 години во иднина. „Не можеме побрзо“ – цитат од 1972, 1973. 1974. 1975. 1976 . . . Табела 10.1 Микропроцесорски системи со слична цена
Intel 4004 во 1972
Intel Pentium Во 1998
Микропроцесор во 2024
Брзина Меморија Перформанси (MIPS)
0.108 MHz 640 bytes приближно 0.06
300 MHz 64 Mbytes приближно 600
833 GHz 6.4 Tbytes 6 000 000
Моја денешна преокупација е вистинска комуникација со мојата кристална топка. Пред некоја година распознавање на говорот беше само сон, но денес е реалност и станува многу ефикасно. Синтезата на говорот има добар прогрес и почнува да не наликува на роботски говор. Кога ќе созреат и се спојат овие две технологии, тогаш симултниот превод нема да биде 135
Вовед во Микропроцесорите и Микроконтролерите толку далеку, а ниту пак нема да биде чуден и разговор со компјутерот. Милион различни телевизиски програми, наеднаш ќе можете да ги гледата без превод (титлување). Шест милиони, милиони инструкции ќе се извршуваат за една секунда на 800 GHz брз микропроцесор и заедно со гласовната контрола на компјутерите наскоро ќе биде меѓу нас. Квиз 10 Во секој случај, одбери го најдобриот одговор. 1
2
3
4
5
Компајлерот: a. Го конвертира машинскиот код во јазик на високо ниво. b. Е побрз од интерпретерот. c. Е друго има за поврзувачот. d. Го нема во Basic. APL произлегува од влијанието на: a. Cobol и Prolog. b. Lisp и Fortran. c. Fortran и Basic. d. Pascal и Cobol. Четвртата генирација на јазици може да се опише како јазик кој: a. Сеуште се користи. b. Е објектно ориентиран. c. Е направен за вештачка интелигенција. d. Е не-процедурален. Јазикот кој доаѓа до логички заклучок со помош на внесените податоци е: a. C. b. Латински. c. Prolog. d. Fortran. Pascal: a. Во споредба со С е јазик на ниско ниво. b. Се користи само ако саката да преведите некој Европски јазик. c. Тој е многу структуриран јазик. d. Е прв популарен јазик на високо ниво.
136
Вовед во Микропроцесорите и Микроконтролерите
11 Развој на микропроцесорите и микроконтролерите Микропроцесорите стануваат поголеми – и побрзи Како расте комплексноста на микропроцесорите и на дигиталните интегрирани кола, неизбежен е растот на бројот на транзистори кои се вградени во нив. Подолу ими една листа, во која ги користиме транзистори и нивните еквиваленти. Оваа класификација не е универзално прифатена, и има различни именувања и броевите „пливаат наоколу“, па така треба да имаме голем степен на флексибилност кога споредуваме различни извори. Ова е особено точно во големи граници бидејќи сеуште немаме „силно“ изградена терминологија. SSI MSI LSI VLSI SLSI ULSI
Small scale integration Интеграција во мали размери Medium scale integration Интеграција во средни размери Large scale integration Интеграција во големи рзмери Very large scale integration Интеграција во многу големи размери Super large scale integration Интеграција во супер големи размери Ultra large scale integration Интеграција во ултра големи размери
1 – 10 транзистори 10 – 1000 транзистори 1000 – 10 000 транзистори 10 000 – 100 000 транзистори 100 000 – 1 милион транзистори 1 – 10 милиони транзистори
Зголемувањето на бројот на уреди исто така имаше влијание врз потребата од намалување на големината на секоја компонента. Ако се користеше истата големина на компонентите во сегашните микропроцесори, какви што беа во оригиналниот 4004, тие ќе имаа големина како еден лист А4. Па и ако ги разгледаме денешните микропроцесори, и ако ги користими истите компоненти, но без да ја намалиме нејзината големина, нема да можеме да ја зголемиме брзината на нивната операција, и максималната брзина би била помалку од 1 MHz.
Како ја мериме брзината на микропроцесорот? Ова е многу потешко отколку што си мислиме, бидејќи развивачите на микропроцесорите се во меѓусебен натпревар, и штом ќе се предложи некој метод, тие се обидуваат да ја искористат ситуацијата и да ги прикажат своите микропроцесори како побрзи од другите. Бидете претпазливи кога ги разгледувате комперациите – кои тестови се направени и зошто? Додека ги гледав последните Олимписки игри, јасно ми беше дека јас сум побрз од сите 137
Вовед во Микропроцесорите и Микроконтролерите натпреварувачи во трка на 100 метри. Да, да, сигурен сум дека можам побрзо да направам функционален микропроцеорски базиран систем од било кој атлетичар. Видовте, дека компарацијата зависи од каков тест сме одлучиле да правиме. Секој може да биде Светски шампион, но само треба добро да се избере тестот. Имајќи го ова на ум, еве неколку популарни компарации за брзината.
MIPS (million of instructions per second, милион инструкции во секунда) Ова изгледа лесен начин за мерење, тоа е само множење на бројот на фреквенцијата (clock cycles in second) со колку такта му се потребни на микропроцесорот да ја заврши инструкцијата (clock cycles taken to complete an instruction). На пример, Athlon работи со 2 GHz или 2000 MHz, и може да изврши 9 инструкции за еден такт (clock cycle), па така бројот на инструкции во секунда би бил 2 10 9 18 000 милиони инструкции во секунда. Но, животот никогаш не е едноставен, за некои инструкции потребно е повеќе време за да се извршат, па така нив им е потребен поголем број на тактови (clock cycles) за да ја завршат задачата. Натпреварувачите очигледно ќе изберат инструкција која ги дава најимпресивните резултати на нивниот микропроцесор. Екстремен пример се појави пред околу десет години со Intel 80386, ако му дадовме задача да собира, па со консултирање на инструкционото множество, ќе видиме дека за тоа е потребно два такта за да се комплетира. Фреквенцијата ја земаме да е 25 MHz, па така секој такт ќе трае 40 ns, така „add“ инструкцијата ќе трае 80 ns, т.е. брзината би му била 12.5 MIPS. Неучтив натпреварувач може „случајно“ да ја земе инструкцијата за делење која е 46 тактови, па така ќе се намали брзината на 0.54 MIPS. Одмаздољубив човек може да бара со „лупа“ низ инструкционото множество и да најде навистина „мрачна“ инструкција за која е потребно 316 тактови. Ова ќе даде брзина од 0.08 MIPS – приближно како брзината на 4 битен микропроцесор. Не можеме да кажеме дека е фер и ако користиме иста инструкција за секој микропроцесор, бидејќи инжењерите немаат, исто размислување, за проблем од исто поле. Ако имаме два микропроцесори и секоја со 5 тактови за „load“ инструкцијата и двата да работат со 10 MHz фреквенција, која би била нејзината брзина? 10/5 = 2 MIPS. (при решавањето на оваа равенка не треба да го игнорираме фактот дека фреквенцијат е во мегахерци, а брзината се мери во милиони иснтрукции). Но дали можат иста работа да ја извршуваат исто брзо? Можат, ама и не можат. Што ако едниот микропроцесор ни е 64 битен, а другиот 8 битен, тогаш 64 битниот може да ги полни податоците 8 пати побрзо. Па така со добра причина MIPS се толкува како „Meaningless Indication of Performance by Sales reps“ (Безначајна индикација за перформансите од застапниците за продажба.
138
Вовед во Микропроцесорите и Микроконтролерите
FLOPS (Floating-point Operations Per Second, операции со броеви со подвижна запирка во секунда) За да се надмине проблемот кој да биде инструкцијата што ќе ја тестираме, се користи некоја стандардна операција со децимални броеви. Брзо да се потсетиме дека, floating-point број е оној на кој децималната точка ја подместивме на почетокот од бројот, па 123.456 ќе биде конвертиран на 1.23456 10 . Вака математиката се одвива побрзо, па така модерните микропроцесори би имале вредности од редот на десетици GFLOPS (GigaFLOPS). И ова е исто така објективно, очигледно е прашање „Која ‘операција’ ќе ја користими?“. Па така ако ја избереме внимателно „операцијата“ тогаш можеме да ја оставиме опозицијата зад нас. И двата теста, MIPS и FLOPS се тестови за микропроцесорите, но не се системски тестови.
Системски тестови Друг начин на мерење на брзината е да се извршува системски тест наместо микропроцесорски тест, затоа ќе дадеме краток преглед за ваквите тестови. Benchmarks (компјутерски еталони, репери) Овие тестотови се базираат на извршување на некоја стандардна „benchmark“ (репер) програма. Недостигот за ваквиот тест е тоа што ако имаме програма која сакаме да ја извршиме на некој некомпатибилен микропроцесор треба да го тестираме и компајлерот, што не е дел од системот. Па така се појавуваат приговори од луѓето кои не се согласуваат со изборот на програмата бидејќи не се вклопува во нивниот систем. I/O операции (input/output „влезно/излезни“ операции) Како што нè сугерира името, ова мерење на брзината се сведува на брзината со која системот ги прима информациите и повторно ги испраќа истите. Но, ако на пример, читаме информации од CD, брзината ќе зависи од тоа каква информација ќе читаме од една иста трака, или дали главата се поместува за да го вклучиме и времето потребно да се пронајде информацијата? TPS (Transactions Per Second, трансакции во секунда) Овој модел на задача е преземен од ситуација во реалниот живот. Системот треба да ја исчита информацијата, да ја модифицира и повторно да ја запише. Овој тест става голема важност на времето потребно за пристап до меморијата и на компајлерите. SPECmark (Systems Performance Evaluation Co-operative’s benchmark) Ова е просечен резултат од извршени 10 прифатени реперни тестови, кои ни дава информација за перформансите на системот во поголем опсег на ситуации. Има два вида на вакви тестови, едниот е со користење на аритметика со floating point броеви, кој е од интерес за науката и инжењерите, и другиот е со помош на integer броеви кои се од интерес за нас. 139
Вовед во Микропроцесорите и Микроконтролерите Овие тестови познати се како SPECfp95 и SPECint95. Како почетна точка за компарација, Intel Pentium Pro на 200 MHz дава вредност од 8.71 со употреба на SPECint95.
Како да ги направиме побрзи микропроцесорите? Зголемување на брзината на тактот Ова изгледа очигледен одговор, и не е проблем да се генерира потребниот правоаголен импулс кој е прикажан на слика 6.4. Кај модерните микропроцесорски базирани системи има два тајмера кои треба да ги земеме в предвид. Тие се, тајмерот кој има правоаголен умпулс кој ги контролира интерните операции на микропроцесорот, ова е главната брзина која ја гледаме на рекламите, „2 GHz Pentium“, и исто така има тајмер, околу 133 MHz, за системот да може да ги контролира надворешните уреди и меморијата, ова не спасува од надоградување на сите надворешни уреди да се софпаѓаат со секој нов процесор. Брзина на внатрешниот тајмер веројатно ќе продолжи да се зголемува, но се јавуваат некои гранични фактори кои таквиот континуитет на зголемување на брзината ќе биде многу тешко да се постигне. Тоа ќе бидат тривијални електронски проблеми со генерирање на правоаголен импулс со брзина од 1000 GHz и повеќе.
Трошење на енергијата Топлината е форма на енергија која е непожелна ако е производ од било каква активност на микропроцесорот. @AB+C DAE*FG+ HICC+J* или Енергија напон струја т.е. & P Q Па за да ја намалиме произведената топлина, треба или да го намалиме напонот или струјата, или пак и двете. Полесно, нас ни е да почнеме со намалување на напонот. Првите микропроцесори користеа напон од 15 V кој со тек на време се намали, дури и во последните дизајни е доведен од 1.5 V. Уште колку можеме да го намалиме напонот под оваа линија? Изгледа дека веќе сме го достигнале лимитот. Интегрираните кола се изградени од силиконски полупроводници, низ кои се пренесува електрицитет под дејство на електричен напон. Едноставните уреди изградени со силиконски полупроводници им треба најмалку 0.6 V за да можат да работат, но ова можеме да го намалиме уште многу малку со додавање на мали количини од други материјали. Еден транзистор може да работи со напонот нешто помал од 1 V, па во комплексните кола невозможно е вкупниот напон да биде помал од ова. Значи, можностите микропроцесорите да работат со напон нешто помал од 1 V се безначајно мали. Ако бев похрабар, ќе реков дека тоа е невозможно. Од друга гледна точка за напонот треба да не го заборавиме ефектот од случајниот електричен шум, таков каков што го разгледавме претходно на слика 2.2. Брзата промена на струјата што течи во близина на колата може да предизвика случајни промени. Ако многу го намалиме напонот, тогаш микропроцесорот ќе биде склон на случајни грешки.
140
Вовед во Микропроцесорите и Микроконтролерите Брзите промени на струјата се случуваат на вертикалните растечки и опаѓачки ивици на тактот, па така со повисока фреквенција имаме повеќе ивици во секунда со што ќе имаме поголем тек на струја со што ќе се создава повеќе топлина. За да го намалиме ова создавање на топлина треба да ја намалиме брзината на тактот, кој е токму тоа што не сакаме да го направиме.
Големина на архитектурата и нејзиниот ефект Движењето на електрицитетот низ транзисторот, внатре во микропроцесорот, се одвива за некое одредено време, па ако ја намалиме големината на транзисторот тогаш движењето ќе се одвива побрзо, па така ќе можеме побрзо да ги пренесуваме податоците. Техниката со која се произведуваа првите микропроцесори можеше да оди диру до 10 µm иницијална големина; а сега таа се намали до 0.13 µm, што е многу значајно намалување. Ова намалување има два недостатока. Првиот, е тоа што е многу тешко и скапо да се произведат такви транзистори без да се прифати поголема рата на грешки, а вториот, е тоа што генерирањето на топлина не се промени, бидејќи тоа е зависно од напонот и струјата, а не од големината. Ова значи дека температурата ќе расте доколку ние не ја отстраниме. Жален проблем е тоа што полупроводниците се чувствителни на топлина и тие ќе се самоуништат ако температурата се зголеми многу. Даваме се од себе да ја намалиме температурата, со користење на ладилници (heat sinks, одземачи на топлина), кои во основа се парче алуминиум, со ребра за да се зголеми површината, и вентилатори за да ја отстраниме топлината. Типичен оперативен опсег е 0–850С, мерено во центарот, од надворешната страна на микропроцесорот (не на ладилникот).
За да ја зголемине системската брзина Кога ќе го погледнеме целокупниот систем, јасно е дека не сите работи во него напредуваа со ист прогрес. Најголемото тесно грло е меморијата. Ние веќе користиме побавна брзина, но микропроцесорот сепак поминува многу време, „потпевнувајќи си мелодија и правење оригами“, чекајќи информацијата да пристигне од меморијата. Од кога се испаднати микропроцесорите па до денес, брзината на микропроцесорот се зголеми од 0.1 MHz до околу 3 GHz, што значи околу 30 000 пати, а за истото време, брзината на DRAM мемориите исто така се зголеми, но само за околу 2000 пати. Современите микропроцесори имаат околу 128 Kbyte вграден on-board RAM, наречен кеш (cache). Кога микропроцесорот треба да зема информација од надворешна меморија, тој зачувува копија на адресата и на информацијата, во случај да не му затребат повторно. Тој исто така ги зачувува адресата и информацијата од следната мемориска локација. Причината за ова е тоа што повеќето програмски јазици се процедурални, со што е поизвесен пристап до следната локација. Ако не е така, програмата може да се врати назад на претходната адреса и да повторува дел од програмата како безконечен круг ,т.е. јамка, за да произведе одлагање. Ако микропроцесорот треба да пристапи до меморијата тој прво проверува дали информацијата е зачувана во кешот, меморија со голема брзина, и ако ја има, тогаш имаме „погодок“ (hit), со што систомот си ја зголемил брзината. Ако информацијата не е во кешот, тогаш имаме „промашување“ (miss) и се користи главната меморија. Оваа нова информација се зачувува во кешот, ако ни треба за подоцна. 141
Вовед во Микропроцесорите и Микроконтролерите Овој кеш понекогаш се нарекува кеш на прво ниво (level 1 cache), или L1 кеш. Ова значи дека може да постои и кеш на второ ниво – и го има. L2 кешот обично е 256 Kbyte. Кога е потребен некој податок, микропроцесорот прво го бара во кешот на прво ниво т.е. L1 кешот, потоа во кешот на второ ниво т.е. L2 кешот, и на крај во главната меморија.
Како да имаме повеќе корист од секој пулс Pipelining (групирање) Да се очекува премногу од фреквенцијата на микропроцесорот, е како да се каже дека максималниот број на вртежи на моторот ја одредува максималната брзина на возилото. Да, точно, но исто така значајна улоги има и степенот на менувачот. Ако возиме со 9000 вртежи во прва брзина (првиот степен на пренос) нема да ги рушиме рекордите за брзина. Реалната брзина на микропроцесорот, исто така зависи од тоа колку корисна работа е извршено во секој такт (clock cycle). Ова е местото каде што pipelining (групирањето) е навистина од голема помош, и сега е вклучено во сите микропроцесори. Да претпостовиме дека треба да поместиме неколку броеви од меморијата во единицата за аритметика и логика (ALU): Такт 1: Такт 2:
Бројот е поместен од мемориската локација во акумулаторот. Потоа е поместен од акумулаторот во ALU.
Ако имаме уште еден број кој треба да го исчитаме, терба да го повториме процесот, па така за читање на два броја ќе ни се потребни четири такта (пулса). Три броја ќе не чинат шест такта и така натака. За време на првиот такт, бројот се пренесува низ магистрала помеѓу меморијата и акумулаторот, па другиот дел од магистралате помеѓу акумулаторот и ALU не е искоритен. И за време на вториот такт, ние сеуште имаме еден дел од магистралата не искористен (слика 11.1).
Слика 11.1 Во еден такт се пренесува еден број
Групирањето (pipelining) е процес со кој ја подобруваме искористеноста на магистралата. Додека се поместува еден број од меморијата во акумулаторот, можеме да го искористиме истиот такт за поместување на друг број од акумулаторот во ALU низ другиот, неискористен, дел на магистралата. На ваков начин, добиваме повеќе активности за секој такт, со што микропроцесорот завршува повеќе инструкции побрзо без да се зголеми брзината на тактот (слика 11.2). 142
Вовед во Микропроцесорите и Микроконтролерите
Слика 11.2 Во еден такт се пренесуваат два броја
Ако имаме извршено две работи во ист такт, тогаш имаме значајни подобрувања на брзината, без да ја зголемиме фреквенцијата на микропроцесорот. Уште подобро би било, доколку успееме да менаџираме пренос на три парчиња информации, или извршени работи, во ист такт. Патем Pentium менаџира со пет, Pentium Pro може да менаџира 12, а Pentium 4 дури 126 инструкции „во еден лет“. За жал, не можеме да работиме со групирање на сите инструкции, не секој помага по помалку.
RISC и CISC Ако сакаме да ја применеме операцијата AND врз два бинарни броја, можеме тоа да го сториме со користење на логички пори како што видовме во Глава 5 или пак можеме да го употребиме микропроцесорот за да ја изврши потребната инструкција. Споредувајќи ги просечните уреди, логичките порти задачата ќе ја завршат за 8 ns, но во споредба со микропроцесорите (80386, 25 MHz) потребното време за задачата ќе биде 80 ns. Ваквите споредби го вкорени верувањето дека хардверот е секогаш побрз од софтверот. Во нашиот случај тоа е 10 пати побрзо. Ако треба да извршиме некоја задача со извршување на сто вакви инструкции, имаме избор: Софтверски метод Хардверски метод
= 100 операции 80 ns = 8000 ns (8 ms) = 1 операција од, да кажеме, 240 ns + 100 хардверски операции 8 ns = 1040 ns
Оваа филозофија се појави при изградбата на 4 и 8 битни микропроцесори. Ова доведе до градење на повеќе комплексен хардвер и постојано растење на инструкционото множество од мало, помалку од 50 инструкции за 4004, се до скоро 250 во случајот кај Pentium Pro. Во средината на 1980-те години, почна да се запрашуваат производителите дали пристапот хардвер-за-брзина е ОК. Постојаното зголемување на бројот и сложеноста на работните кодови беше обратен во некои дизајни. Овие микропроцесори се нарекуваат RISC (Reduced Instruction Set Computers, компјутери со редуцирано инструкционо множество) а „старомодните“ дизајни се наречени CISC (Complex Instruction Set Computers, компјутери со комплексно инструкционо множество). Историјата не е само црно и бело, како што ни кажува ова, повеќето е нијанси на сиво, па новите дизајни се ниту целосно CISC ниту пак RISC). Користењето на доминантните CISC микропроцесори го надминуваат бројот на RISC дизајни со големо мнозинство, барем 60:1. Ова не значи дека тие се подобро, туку тие едноставно имаат поголем дел од пазарот. Како што знаеме, повеќе се поседува она што е доминантно на пазарот, отколку да се има најдобриот производ.
143
Вовед во Микропроцесорите и Микроконтролерите CISC дизајн имаат сите 8 битни микропроцесори и Pentium, Pentium Pro, а сите од фамилијата 68000 се RISC вклучувајќи ги Digital Alpha и IBM/Motorola Power PCs.
RISC наспроти CISC Двата RISC и CISC микропроцесори ги користат сите техники за побрза работа, како што се групирањето (pipelining), superscalar структура и повеќебројни кеш мемории. Superscalar архитектура е кога постојат две ALU единици кои ја делат обработката, исто како да имате два микропроцесори. Па што е вистинската разлика? Со анализа на кодот кој всушност е производ од компајлерите, наоѓаме мал број на различни инструкции за голем дел од објектниот код. Повеќе популарни се инструкциите кои се занимават со поместување на податоците наоколу. Во овој момент се случи интересен пресврт во дизајнирањето. Се сеќавате дека „нормален“ или CISC микропроцесор имаше вградено микропрограма во својот инструкциски декодер или контролната единица. Оваа микропрограма беше одговорна за чекорите потребни за да се изврши некоја инструкција од инструкцискиот код. Така микропроцесорот кој што сме го фалиле дека користи хардвер за зголемување на брзината, всушност внатрешно работи софтверски. RISC пристапот е за да го намилиме бројот на инструкции, но да ги задржиме да бидат едноставни и да се извршуваат брзо. Бројот на инструкции се намали до нешто помалку од сто. Бројот на инструкции лесно може да се зголеми со додавање на додатоци во микропрограмата, што и беше намерата да се направи, а не смееме да отстраниме некоја претходна инструкција, бидејќи сакавме да ја задржиме компатибилноста со претходните верзии. Пратејќи ја изреката дека „хардверот е побрз од софтверот“, очигледен логички чекор е да не го правиме тоа со микропрограмата, туку со хардвер кој може да ни ги изврши потребните едноставни чекори. Овој хардвер беше направен многу едноставен со што инструкциите ја задржаа истата должина, па така групирањето стана полесно за организирање. Единствениот недостаток од ова константна должина на инструкциите е тоа што сите треба да бидат со иста должина како најдолгата, па така вкупната должина на програмата ќе се зголеми. CISC пренесува податоци кон и од микропроцесорот и надворешната меморија користејќи различни типови на инструкции. RISC системите имаат едноставно инструкции само за читање и запишување, а се друго прави, внатрешно, користејќи голем број на регистри како замена за надворешна меморија. Со користење хардвер за справување со инструкциите и внатрешни поместувања на податоците помеѓу регистрите, сите инструкции можат да се извршат со користење на еден такт, со што добиваме значајно зголемување на брзината. Генерално, Pentium Pro добива вакова брзина, со зголеменото користење на групирање (pipelining). Со тек на време, се зголеми тенденцијата за да се намали разликата помеѓу RISC и CISC. Современите RISC микропроцесори, како што е PowerPC970 имаат зголем број на инструкции
144
Вовед во Микропроцесорите и Микроконтролерите иако нивната тенденција е да се едноставни и брзи, а повеќе традиционалниот CISC пристап во Pentium 4 има едноставни и сеуште екстремно брзи инструкции.
Кој што направи и кога Како што знаеме, наша стартна точка беше Intel 4004 во 1972, а многу брзо беше проследен со 8 битен 8008 процесор. Овие се прикажани на слика 11.3. Забележете го тоа дека, дури и во иста компанија, нема општ договор за оперативниот напон.
Слика 11.3 Првите 4 и 8 битни микропроцесори
Исто така, почнавме со трендот да ги нумерираме, наместо да ги именуваме микропроцесорите. Ова има смисла бидејќи секој основен дизајн генерира серија на варијации, со различни брзини, модифицирани инструкциски множества итн. Преку броевите можеме да извлечеме заклучок за карактеристиките во хиерархијата. Некогаш го користиме Х за да означиме фамилија на уреди, на пример како 80Х86, па со задавање на различни вредности за Х, добиваме 80286, 80386 итн. Денес тенденција е да се користат имиња и броеви. Ова излезе од правните проблеми за то кој го „поседува“ тој број. Ова се истакна кога Intel ги направи 80286, проследени со 80386 и 80486, со што наредното име веќе им беше јасно на конкурентите. Па така Intel неможеше да ги земе авторските права за бројот 80586, па така имаше обиди да го нарекуваат Р5, со што се поклопуваше со светските права за буквата Р, и конечно тие го нарекоа „Pentium“. Настрана од целата забава која се случуваше, најмногу корист од ова имаа, како и обично, адвокатите.
Intel наспроти Motorola Во декември 1973, Intel го претстави 8080А, многу популарниот процесор кој имаше 16 битна адресна магистрала, со што може да адресира 64 Kbytes меморија, или пак како што кажуваа рекламите во тоа време „a MASSIVE 64k of memory, МАСИВНИ 64к меморија“. Напојувањето повторно се промени, овој пат на +5 V, +12 V и -5 V. Бројот на инструкции повторно се зголеми исто како и бројот на пинови се зголеми на 40. Внатре, нормално има акумулатор и 8 регистри за општа намена. Ова, тогаш, стана стандардна големина на „пакување“ за идните 8 битни микропроцесори прикажани на слика 11.4. Во скоро исто време, Motorola го претстави својот ривал MC6800. Исто како Intel 8080A, и овој беше 8 битен микропроцесор со 16 адресни пинови. Овде завршуваат сличностите, тој не беше
145
Вовед во Микропроцесорите и Микроконтролерите компатибилен со 8080А и така на пазарот имаше борба за превласт, со што Motorola испадна на второ место.
Слика 11.4 Стандардна големина на 8-битен микропроцесор
Напојувањето беше поедноставено, и сега се потребни само +5 V напојување. Блок диаграм за MC6800 е прикажан на слика 11.5. Можеме да приметиме дека е необично тоа што нема регистри за општа намена, но затоа има два акумулатора. Пристапот овде беше да се употребува надворешни локации на меморијата за привремено чување на информацијата, која што сите претходни микропроцесори требаше да ја стават во внатрешни регистри. Остатокот од микропроцесорот е доста сличен со изгледот на Z80 од Глава 8. 6800 во просек работи нешто побрзо од 8080, но тоа не го сруши Intel-овиот микропроцесор на пазарот.
Слика 11.5 MC6800 одговорот на Motorola на Intel-овиот 8080А
146
Вовед во Микропроцесорите и Микроконтролерите
Конечните 8 битни микропроцесори Во ова време, Intel работеше на дизајн кој ќе го заменеше 8080А, кој беше одговор на критиките упатени на 8080А: Зошто му се потребни три различни напојувања кога на 6800 му е потребен само едно? И зошто има само еден интерапт пин кога 6800 има два? Во ова време некои од инжењерите кои работеа на 8080А и ја создаваа неговата замена наречена 8085А одлучија, или беа принудени, да преминат во ривалната компанија Zilog. Во меѓувреме, Intel го произведе 8085, кој одговори на сите критики на 8080А и ја зголеми брзината на 5.5 MHz. Сеуште 8 битен со 16 битна адресна магистрала, и со своите осум регистри за опште намена. Пратејќи ја предноста на Motorola, исто така и тој напојувањето го направи на единичен +5 V, но ги задржа своите корисници со тоа што инструкциите беа компатибилни со 8080А. Кај Zilog пак, друга група на инжињери кои исто така работеа на 8080А, започнаа работ врз Z80 кој подоцна го направија Z80180. Тие ги комбинираа скоро сите добри идеи од Intel-овиот дизајн и неколку добри идеи од MC6800. Се користеше единечно напојување, и не само што користеше внатрешни регистри за општа намена туку тие се зголемија на 14 регистри. Инструкционото множество беше составен од целото множество на 8080А и беа додадени и нови инструкции со што вкупниот број скоро се дуплира.
Слика 11.6 MCS6502 – подобрување на MC6800
147
Вовед во Микропроцесорите и Микроконтролерите Во меѓувреме се појави нов „играч“, MOS Technology, со својата MCS650X фамилија од која MCS6502 беше најпознат микропроцесор. Ова резултираше со раст на користење на микрокомпјутерите во 1980 година. Во основа беше подобрување на Motorol-овиот MC6800 со трендовите да е 8 битен со 16 битна адресна магистрала и единечен +5 V напојување. Неговиот напредок беше поради идејата за групирањето (pipelining). Беа продадени две милијарди 6502-ки.
Да се вратиме на оснавата 6502 се нарекуваше дека е „акумулаторски базиран“, бидејќи немаше регистри за општа намена и единствено акумулатор беше тој низ кој влегуваа и излегуваа податоците, но со групирањето (pipelining) и неколку брзи инструкци – неколку години беше многу популарен. Ако ги споредиме слика 11.6 со слика 11.5 ќе го видиме влијанието на МС6800. Повеќето блокови се исти. МС6800 има два акумулатори и еден индексен регистер, додека пак МС6502 има два индексни регистри и еден акумулатор. Разликите помеѓу микропроцесорите беа мали, па така 6502 имаа предност кај пазарот на микрокомпјутери, додека МС6800 беше повеќе популарен во полето на индустриска контрола.
Микрокомпјутер со еден чип За да направиме самостоен стабилен систем, на микропроцсорот му е потребно малку RAM и ROM меморија, како што видовме на слика 7.6. Кај системите за контрола во индустријата големината на меморијата не треба да биде голема, и ги наведува дизајнерите да ги сместат сите потребни делови во еден чип. Кога се појави ова, името на микропроцесорот се замени со микрокомпјутер со еден чип. Intel го произведе 8048, ова не беше едноставно 8085 + RAM + ROM, туку тоа беше нов дизајн. Тој вклучуваше (уште една) промена во инструкциските кодови со што не беше компатибилен, ни со оригиналниот 8080А или пак 8085А. Вградената меморија беше составена од 1 килобајт ROM и 64 бајти RAM кој многу брзо се дуплира на 2 килобајти и 128 бајти во новите верзии, т.е. 8049. Тој исто така може да пристапи до 4 килобајти од надворешен ROM. Друго подобрување беше тајмерот. Овој тајмер можеше да брои прогресивно и регресивно за да произведи одложување. Без ова, микропроцесорот ќе требаше да се користи за оваа функција што можеше да се оневозможи да прави некои други покорисни работи. Zilog, се разбира не беа многу оддалечени. Тие го претставија Z8. Концептот му беше сличен, но имаше мали надоградувања. Тој имаше два бројача/тајмери кои можеа да се користат за броење на примените пулсови, исто така и за да го реализира одложувањето. Имаше 2 килобајти од ROM и 128 бајти на RAM кои се наракуваа регистри за општа намена. Големо подобрување беше тоа што можеше да пристапи до 64 килобјтна надворешна ROM меморија и 64 кбајтна надворешна RAM мемори, за да ни дозволеше, да можеме од „еден чип“ да го направиме, ако ни е потребен, да биде повеќе од еден. Motorola одговори со МС6801 кој ги вклучи повеќето особини на другите микропроцесори во својта генерација. Тој вклучуваше 2 килобајтен ROM и 64 бајтен RAM. Една интересна особина беше тоа што внатрешниот RAM имаше сопствено, одделно, напојување од батерија со што не 148
Вовед во Микропроцесорите и Микроконтролерите доаѓаше до губење на податоците при прекин на струјата. Исто така вклучуваше и универзален асинхрон ресивер/трансмитер (примач/праќач) (universal asynchronous receiver/transmitter UART) што ќе го разгледаме подоцна во Глава 15. Првиот микропроцесор на четвртата генерација е прикажан на слика 11.7.
Слика 11.7 Првите четири генерации
Микроконтролер Како се развиваа домашните компјутери, интересно за насловните страници беше само постојаното зголемување на брзината и способноста на микропроцесорот. Сепак, зад сцената, се продаваа микроконтролери во голем број кои имаа малку публицитет. Не беше превласт за насловна страница, бидејќи микроконтролерите се врагуваа во видеа рекордерите. Денешните компјутери со „огромини мотори“, не се употребуваат за повеќе цели во реалниот свет. Ние сме граничен фактор кога станува збор за секојдневната употреба на микроелектрониката. Ние сакаме нашиот компјутер да работи побрзо, но сеуште работиме со иста брзина како нашите предци. Колку брзо сакаме да работи нашиот автомат? Сакаме да работи со иста брзина како што работеше вчера, или како пред десет години. И покрај се, сепак не можеме да го притисниме копчето побрзо и не сакаме кафето да излета надолу низ цевката десет пати побрзо од претходната брзина. Ако сакаме некаква промена, тогаш таа треба да биде поверодостојна. Дали Pentium 4 е повеќе веродостоен (сигурен) од Z80? Се сомневам. Ние сигурно ќе сакаме да биде поевтин и да користи помалку енергија, и не ни е потребен обожавач (фан) да се изјасни со свој став. Треба да се преиспитаме што навистина сакаме и одговорот во повеќето случаи е нешто многу блиску до денешниве микроконтролери. Ќе се навратиме повторно на микроконтролерите со повеќе детали во глава 15 и 16.
Зголемување на бројот на бити Беше неизбежно тоа што 4 битен микропроцесор се претвори во 8 битен, кој за миг, порасна во 16 битен микропроцесор, но најпрво да одговориме на неколку навидум очигледни прашања.
149
Вовед во Микропроцесорите и Микроконтролерите
Што мислиме со 16 битен микропроцесор? „Големината“ на микропроцесорот е ширината на податочните регистри, па така 8 битен микропроцесор може да работи со 8 битни броеви. Традиционално беше тоа што 4 битни и 8 битни микропроцесори имаа адресни магистрали со двапати поголема ширина од податочните регистри. Ова беше само коинциденција која не се прати овие денови бидејќи никој не сака, или може да и дозволи, меморија која може целосно да користи 128 битна адресна магистрала (бројот на локации е поголем од 3 со 38 нули!) Друга заблуда е тоа што дека треба да е исто со широчината на податочната магистрала. Не е така. Pentium фамилијата користи 64 битна податочна магистрала, а тие се составени од 32 битни податочни регистри и затоа се 32 битни уреди. Користат 64 битна податочна магистрала за да можат истовремено да читат од два 32 битни регистри. Power PC и Digitаl Alpha фамилиите се вистински 64 битни уреди и имаат 128 битна податочна магистрала. Интересно е тоа што, Intel 8088 беше вистински 16 битен микропроцесор, но имаше 8 битна надворешна податочна магистрала. Ова му овозможуваше да биде компатибилен со поефтините 8 битни кола, кои не можеа да се прилагодат да користат 16 бити. Дури и да е така, податочните регистри не се универзално прифатени да ја дефинираат големината на микропроцесорот. Некои луѓе се држат до тоа дека податочната магистрала ја дефинира големината. Па така, во книгите и каталозите може да најдете микропроцесори кои се наведени со различна „големина“ од онаа која што ја очекувате. Во оваа книга ќе се држам до тоа дека податочните регистри е она што дефинира.
Фамилија 68000 М68000, кој беше прв произведен во 1979 година, беше VLSI чип кој беше направен од околу 70 000 транзистори. М68000 микропроцесорот беше добро познат како 16 битен микропроцесор, но во реалноста, тоа е 32 битен уред, ако се држи до нашата дефиниција од погоре. Тој секако има 16 битна податочна магистрала, но внатрешните регистри се 32 битни, иако некои аритметички опрации можат да користат само 16 битни податоци. Понекогаш ваквиот формат се нарекува 16/32 битен процесор. Тој беше во 64 пинско dil (dual-in-line) пакување, прикажано на слика 11.4, но малку подолго. Неговата должина честопати беше недостаток, бидејќи лесно можеше да се скрши при вадење со влечење од едниот крај на чипот. Тој имаше 24 битна адресна магистрала која можеше да пристапи до 16 Мегабајти меморија со фреквенција од 12 MHz. Една карактеристи на М68000 е неговата pre-fetch акција. Кога се извршува инструкција, микропроцесорот ја зимаше (fetches) следната инструкција од меморијата и ја чуваше во мала редица, подготвена за користење. Ова може да се направи кога сегашната инструкција не ја користи надворешната адреса и податочната магистрала. Ова значи дека следната инструкција е спремна, веќе исчитана, и може да се изврши штом тоа е потребно, а со ова се заштедува драгоцено време. Тој има вкупно седумнаесет 32 битни регистри за општа намена од кои осум се податочни регистри, кои по потреба можат да се користат како 8, 16 или 32 битни регистри.
150
Вовед во Микропроцесорите и Микроконтролерите Една интересна карактеристика е тоа што овој микропроцесор може да работи во два мода, надзорен и кориснички. Суштинската разлика е тоа што корисничкиот мод има на располагање ограничена листа на инструкции. Оперативниот систем може да го користи надзорниот мод кој го користи целото множество на инструкции, но корисничките програми имаа само пристап до ограничен опсег – доволен за да работат програмите, но, надевајќи се, не доволно да ги разбрка работите премногу. Постои софтверски пат за промена на двата мода, ако тоа е навистина потребно. М68000 придонесе до зголемување на својата фамилија како основен модел. Главните напредоци детално се прикажани на слика 11.8.
Слика 11.8 М68000 фамилија
Како што, 32 и 64 битни микропроцесори ги преземуваа компјутерите, 68000 фамилијата зголемено се користеа во вградената контрола на уредите со високи перформанси како принтерите и диск драјвовите.
Каде ќе одиме од овде? После микрокомпјутерите со еден чип, намалувањето на цената на дизајнот и изведбата на интегрираните кола доведе до полесно зголемување на комплексноста на чиповите. Ова доведе развојот да се подели на две посебни патеки: брзина и сила или ефтини и мали. Ако тргнеме по патеката за ефтини и мали, добиваме микроконтролери кои ја контролират работата на повеќето инструменти и машини кои секојдневно ги користиме, па дури ги има и во некои честитки кои можат да свираат мелодија. Со овие ќе се сретнеме во Глава 15 и 16. Преокупацијата, која никогаш не згаснува, за побрзи и помоќни компјутери резултираше во континуиран развој на поголеми и побрзи микропроцесори како што се Pentium 4 и неговите конкуренти. Секој нов дизајн е цар за момент, а потоа се зимаат и се стават во музај. Се што 151
Вовед во Микропроцесорите и Микроконтролерите чинело цело богатство, пред три години, сега е фрлено во ѓубре, тие се непотребни. Сега ќе ги разгледаме денешните, а утрешните уреди ќи ги разгледаме во следните три поглавја.
Машини за игри Ако ни е потребен компјутер само за да можеме да пишуваме текст во некој текст едитор, многу малку труд треба да вложиме за развој на ваков процес, какви што се имаат појавено во последните десет години – нашето пишување не се забрзува и текстот претставува едноставна работа. Со вметнување на слики во боја работите малку го менуваат нивото на „стрес“, но работите навистина почнуваат да бида посложени кога сакаме да имаме слика во кои се менуваат боите. Никогаш не се задоволуваме: сакаме побрзо менување, повеќе живи и реални слики – со вметната музика, се разбира. Нашите побарувања ќе ги надминат и најновите микропроцеори без оглед на нивната способност. Многу компјутери воглавно се користат за играње игри и симулации, но бидејќи тие имаат и други функции тие мора да бидат дизајнирани да можат да работат за различни цели и тие не се вистински оптимизирани за некоја посебна задача. Ова резултираше со развој на посебни, посветени машини за игри. Во моментов имаме избор на три – тука се Nintendo Gamecub, Playstation и X-Box.
Nintendo Gamecube Ова е најстариот дизајн и, неизбежно, најмалку технички напреден. Генерлно тој е ефтин, исто така и игрите се ефтини и повеќе се популарни меѓу помалите корисници. Тие се одлучија да користат 64 битен микропроцесор со 85 MHz фреквенција, т.е. микропроцесорот од IBM, PowerPC 750Cxe, наречен „Gekko“, што и беше неговото оригинално име при производството. Тој е малку модифицирана верзија од оние кои се користат во Macintosh компјутерите и е сличен со оние опишани во Глава 13. Модификацијата беше со софтверски додаток на речиси четириесет дополнителни инструкции за да обезбеди специфична помош при играњето, но кои се неопходни за ориганлните компјутерски апликации. Квалитетот на графиката при играњето се претставува со брзината со која може да се справи со графичките податоци, која конвенционално се мери со тоа колку форми (shapes) е во состојба да исцрта во една секунда. Во овој сличај избраниот ATI 162 MHz Flipper GPU (Graphics Processor Unit, единица за графичко процесирање) има максимална брзина од 12 милиони полигони во секунда – ова звучи брзо но во споредба со Playstation 2 и X-box не е многу импресивно. Главното место за складирање на игрите е 3 инчен со 1.5 GB Nintendo оптички диск. Исто така, има можност за 64 MB мемориска картичка, обезбедена од Panasonic.
152
Вовед во Микропроцесорите и Микроконтролерите
Sony Playstation 2 Наместо да земеше веќе направен микропроцесор, и да го доработеше дизајнот за им користеше за машина за игри, Sony, почна да дизајнира нивен нов микропроцесор наречен „Emotion Engine“ направен само за да стартува игри-програми, што е можно побрзо. Пристапот „единствена работа“ (single job) им овозможи повеќе да се фокусираат на дизајнот. Микропроцесорот е опкружен со потребните кола за да може да ги обезбеди потребните влезови и излези. Севкупниот блок диаграм е прикажан на слика 11.9.
Слика 11.9 Playstation 2
Ако се вчита игра од DVD, стартните информации се проследуваат од Emotion Engine-от кој ги приготвува графиката за играта и звукот било да е во аналоген или дигитален формат. Потоа чека да пристигне влезна инструкција од нашиот контролер или преку USB портите. Внатер во Emotion Engine, прикажан на слика 11.10, информациите од нашиот контролер доаѓаат преку единица за Влез/Излез (Input/Output unit) и тогаш почнува забавата.
Слика 11.10 The Emotion Engine
Игрите вклучуваат сериозен број на пресметики и тие можат да бидат многу комплексни. Има два вида на пресметки: директни пресметски (еден вид на пресметки кои можеме да ги извршиме и со џебен калкулатор) и геометриски преметки. Обичните пресметки се извршуваат со FPU (Floating-Point Unit), а другите со VU (Vector Unit). Па зошто толку многу пресметки?
153
Вовед во Микропроцесорите и Микроконтролерите Дали колата се удри во аголот? Ова зависи од тоа колку брзо му кажуваш да заврти, со колкава брзина возиш, избраните временски услови и податоците за автомобилот. Што ќе се случи ако „случајно“ удриш во дрви или во друго возило? Овие пресметки треба да се извршат во реално време – ако го завртиме воланот, тогаш колата треба веднаш да одговри, т.е. и таа да заврте. Геометриските пресметки се извршуваат од единицата за Вектори, која ни дава разултат за тоа што се случува на екранот. Исто така ни подготвува листа на настани која што контролира сè што се појавува на екранот – целиот пат што го гледаме, одроните, па и рефлексијата на ретровизорот. Во голема мера, финалниот квалитет на играта зависи од брзината на овие пресметки. Пресметките на броеви со подвижна запирка се извршуваат повеќе од шест милјарди во секунда! Тоа е движење. Па, колку е добар Playstation 2? Ова е премногу тешко да се одговори. Наместо тоа, можеме да ги погледнеме техничките информации, но има многу повеќе. Дали контролите за играње (gamepad) се чувствуваат удобно? Дали игрите се возбудливи и реални? Дали еден час на PS2 изгледа како една минута или недела? Опште земено, конзолата е прилично скапа но, дали го имате купено, игрите се ефтини. Без разлика PS2 купуваме само еднаш и кога ќе заборавиме колку чини, особено ако е подарок, можеме да си дозволиме да си купиме многу игри. Имањето на многу игри ја намалува привлечноста за да ја замениме за друга машина за игри – како што е Xbox. Emotion Engine работи само на 294 MHz, но оваа гранична брзина не е добар индикатор за тоа колку брзо си ја врши работата – ова зависи од тоа колку добро е дизајниран за својата работа. Се сеќавате дека микропроцесорот во Gamecube работеше на 485 MHz, повеќе за 50% од PS2, но погледнете ги брзините на исцртување: кај Gamecube имаме 12 милиот полигони/секунда, а кај PS2 25 милиони полигони/секунда, дупло повеќе. Ова ни го споредува микропроцесорот кој е во компјутерот за општа намена со уред за посебна намена.
Microsoft Xbox Xbox е последната понуда на пазарот. Тие се одлучија за спротивната стратегија од Playstation 2, т.е. козолата да биде многу поефтина, но да наплатуваат повеќе за игрите. Веројатно, имиџот на Microsoft заедно со однапред аткрактивната цена ќе доведе до празнење на продавниците, т.е. ќе се купи секој Xbox, а за игрите ќе се погрижиме подоцна. Тие како да сакат да го продадат на една постара група и дека цената на игрите нема да биде никаква пречка. Избраниот микропроцесор за оваа машина е Pentium 3 кој работи на 733 MHz. Тие се одлучија за стандардниот микропроцесор, наместо некој специјализиран дизајн, без разлика на тоа, тој сепак има таква моќ што може да направи чуда со играта во добра смисла. Брзината на геометриското цртање на текстурирани полигони е 50 милиони во секунда или двапати повеќе од брзината на PS2, т.е. осум пати повеќе од Gamecube. Во сите случаеви, изброените полигони се со вклучена текстура. Празните полигони се едноставни форма како рамка од 154
Вовед во Микропроцесорите и Микроконтролерите жица без никаква површина за боење која е од суштинско значење за да обезбеди реална сцена.
Слика 11.11 Xbox
Чипот North Bridge (северен мост) е централен блок на Xbox и ги обезбедува интерконекциите помеѓу другите единици. Го контролира пристапот до 64 МВ меморија која служи како кеш меморија за CPU (Central Processing Unit) за да го зачува програмскиот код и голем дел за GPU (Graphics Processing Unit). North Bridge исто така испраќа сигнали и до South Bridge чипот. South Bridge ги обезбедува сите надворешни влезови и излези преку USB и мрежни порти, заедно со аудио сигнали. Дизајнот на GPU единицата е прикажан на слика 11.12, наречен „nVidia“ базиран на GeForce 3 дизајнот, уште една популарна компутерска компонента. Графичкиот процесор го конвертира излезот од CPU единицата и во форма на готови информции се испраќаат до CPU или телевизорот.
Слика 11.12 Чип за графиката
Информацијата за секој објект на екранот како што се позицијата, осветленоста на површината која се појавува, сето тоа заедно е подготвена со две функции, можности, кои се користат за намалување на потребната моќ за пресметување или да се подбри изгледот, со користење на истиот процесор. „Нијансата на пикселот“ која што се применува за реална осветленост и ефектите врз текстурираната површина во текот на целата сцена без да се пресметува посебно за секоја индивидуална точка има vertex програма кој ги надгледува деталните промени кои се потребни во критичните подрачја. Ние тежнееме да бидеме многу одбирливи кога станува збор за детали, ќе ги приметиме и најмалите промени во изразот на лицето, и не игнорирајќи ги сите листови од дрвата. Со контролирање на светлината и текстурните карактеристики, vertex нијансерот ги исполнува до детали овие мали, но важни промени.
155
Вовед во Микропроцесорите и Микроконтролерите Квиз 11 Во секој случај, одбери го најдобриот одговор. 1
2
3
4
5
„Големината“ на микропроцесорот се одредува преку: a. Ширината на неговите податочни регистри. b. Бројот на линиите на неговата надворешна податочна магистрала. c. Број на дигити во неговиот број на типот на микропроцесорот. d. Ширината на неговите адресни регистри. Ингерираното коло кое има 15 000 транзистори е класифициран како: a. LSI уред. b. SLSI уред. c. VLSI уред. d. SSI уред. Полигон без текстура: a. Изгледа како диносаурус. b. Е само облик на рамка со жици. c. Нема облик. d. Е коцка. L1 кешот вообичаено е: a. Вграден во микропроцесорот. b. Напрвен од DRAM за максимана брзина. c. Побавен од L2 кешот. d. Надворешно од микропроцесорот. RISC: a. Е скратеница од „radical instruction set computer“. b. Има подолги инструкции и затоа е побавен од CISC чип. c. Е дел од секојдневниот живот. d. Чиповите имаат помало инструкционо множество.
156
Вовед во Микропроцесорите и Микроконтролерите
12 Фамилија Pentium Pentium е 32 битен микропроцесор исто како и претходните на Intel 80386 и 80486, но беше значително подобрен за да ја зголеми својата брзина на работење. Дури и 132 пинови на 80386 се зголемија на 196 кај Pentium. И другите целосно RISC чипови беа добро прифатени во истото време кога испадна CISC Pentium во 1993, тогаш Intel ги зеде во предвид овие нови дизајни, но тие беа тргнати на страна поради неговиот успех. Требаше да ја задржи апсолутната компатибилност со своите претходни микропроцесори 8086, 80286, 80386 и 80486 заедно со нејзините нумерички копроцесори. Компромис беше сите тие да користат RISC, а да ги задржат CISC кодовите. Тој има повеќе од 400 инструкциски кодови. Некои се извршуваат хардверски, а некои пак со микрокодови. Тој вклучуваше повеќе од два милиони транзистори во својата суперскаларна структура. Ова значи дека тој ги има дуплирано аритметичките и логичките единици кои можат да извршат две инструкции во исто време под поволни услови. Тој беше лансиран со 66 MHz и во својата прва година стана популарен како микропроцесорот кој неможе да брое. Имаше серија наслови во компјутерските весници како и шеги од типот „Колку Pentium-и е потребно да се промени сијалица“. Отпрвин, Intel негираше дека постои проблем, иако тие знаеа за тоа. И други наслови беа: „Не, нема да можете да си ги повратите парите.“, „Добро, постои многу мала разлика кај неколку суми при делење“. Грешки се јавува во непрецизноста во шестата или деветата децимала во некои суми при делење. Ова беше мала грешка за да влијае кај мал број на корисници, но почна да ја поткопува довербата во Pentium. Вистински проблем беше што се појавија две грешки при дизајнирањето во исто време. Ниедна посебно неможеше да се забележи, но двете грешки си служеа за да се кријат меѓусебно. Како и да е, го поправија. Беа афектирани само првичните верзии и сега повеќе не се значајни. Со тек на време брзината се зголеми на 200 MHz, со неизбежните гласини за дека Pentium II ќе работи на 400 MHz, што ќе го поддржава системски часовник на 100MHz.
Кус преглед на операцијата на Pentium Види слика 12.1.
Кеш за податоците и кодовите Конекциите со надворешниот свет се преку 64 битна податочна магистрала и 32 битна адресна магистрала. Влезниот податок кој е составен од нумерички податок и инструкциски код се исчитуваат многу брзо во двата внатрешни кеша – 8 килобајтен податочен кеш и 8 килобајтен кеш за инструкцискиот код. Овие кеш мемории ги поместуваат податоците многу брзо на внатрешни патеки кои се 128 и 256 битни широки. 157
Вовед во Микропроцесорите и Микроконтролерите Секогаш кога е можно, Pentium користи „рафален“ мод за да чита и запишува податоци. Со рафалниот мод системот го полни кешот, на пример, со повеќе податоци од ширината на податочната магистрала. Ако линијата за кешот е 128 бити широка и ако се полни од 64 битна податочна магистрала, можеме комплетно да го наполниме кешот со трансфер на 64 бита и потоа уште на едни 64 бита. Со рафалниот мод полнењето е многу брзо со што не е потребна понатамошна интервенција од микропроцесорот. Со ставање на повеќе нови податоци во кешот ќе ја зголеми можноста кешот да „држи“ потребни информации. Ова се нарекува кеш „погодок“ (cache ‘hit’).
Слика 12.1 Pentium процесор
Prefetch бафер Prefetch бафер е мала внатрешна меморија во која се чува листа на инструкции кои чекаат да бидат извршени. Ова осигурува дека инструкцискиот декодер никогаш не чека нова инструкција од надворешната (бавна) меморија и прави да има поефикасно користење на надворешната податочна магистрала, бидејќи новата магистрала може да се исчита кога и да се појави прилика. Кога ќе се појави момент, Pentium ја поместува инструкцијата од надворешната програма во кешот и пренесува една инструкција од кешот во prefetch баферот и истотака испраќа сигнал до колото за микрокод за да го припреми кодот за следната инструкцијата. Значи, одкога ги извршивме сите домашни задачи, инструкцискиот декодер може да се наполни со инструкции и податоци со неговата максимална рата. Prefetch баферот всушност има два независни 32 битни бафери, секој од нив овозможува влез во една од двете ALU единици.
Инструкциски декодер Инструкцискиот декодер ја врши скоро истата функција како кај другите микропроцесори. Тој има два излези кои ги полнат двете ALU единици наречени „u“ и „v“. 158
Вовед во Микропроцесорите и Микроконтролерите
Аритметички логички единици (Arithmetic and logic units, ALUs) Овие единици се под потполна контрола од единицата за контрола. Блоковите, прикажани на диаграмот како ALU ‘u’ и ALU ‘v’ всушност се групирање во пет чекори кои можат паралелно да работат за да извршат две инструкции во еден такт. Сите команди различни од аритметиката со броеви со подвижна запирка може да се изврши со ‘u’ групурање (pipeline), а поограничен опсег на команди се извршуваат со ‘v’ групирање (pipeline). Групирањето во пет нивоа може да го забрзи пренесувањето на една инструкција во еден такат. Во правилни услови, двете групирања може да се користат симултано за да се справат со две инструкции во еден такт. Понекогаш ова не е можно. Можеби и двете инструкции треба да пристапт до ист дел од хардверот, можеби резултатот од едната инструкција е потрбен пред да почне следната инструкција. Еве еден едноставен пример, ако сакаме да собериме два броја и потоа резултатот да го поделиме со 10, не можеме да почниме со делбата се додека не е овозможен првиот одговор. Еден мал недостаток е тоа што инструкциите не можат да си ги сменат местат иако втора може да заврши многу брзо, и тие се незавини една од друга.
Floating-point unit (FPU) За аритметика со броеви со подвижна запирка, FPU-то има 8-битно групирање (pipeline) кој е подобрен со користење на хардверски дел за множење и делење. Ова е значаен напредок во 80486, кој немаше групирање (pipelined) во FPU-то. Со групирањето и новиот хардвер доведува FPU-то да работи десет пати побрзо од 80486 со еквивалентен такт. Се саќавате од претходните поглавје дека придобивките на RISC дизајнот беа користење на хардвер за извршување на аритметичките операции. Понекогаш ‘u’ групирањето (pipeline) се преклопува со групирање (pipeline) на броеви со подвижна запирка, па има ситуации кога микропроцесорот е спречен да изврши две инструкции во исто време. Има осум FPU регистри со ширина од 80 бити, подредени како стек. Битовите од 0 до 63, служат за 64 битната мантиса, битовите од 64 до 78 служат за 15 битен експонент и последниот бит ни служи како знак бит.
S Exponent З Експонент Bits 79 78 64 63 Битови
Mantissa Мантиса 0
Забележете ја разликата на изгледот на децималниот број прикажан овде со дадениот пример во Глава 4.
Предвидување на (гранка) разгранување во програмата Кога програмата стигнува до „гранка“ или „скок“ (jump) инструкција, тогаш микропроцесорот е препратен на друг дел од програмата. Овие инструкции обично користат некој „услов“ како кај 159
Вовед во Микропроцесорите и Микроконтролерите „jump to address xxxx if the value in the accumulator is not zero“ (скокни на адреса хххх ако вредноста во акумулаторот не е нула). Кога ќе се сучи овој скок, следните неколку инструкции кои веќе се исчитани со групирањето се неточни и сега треба да се испразнат и повторно да се наполнат регистрите за групирање со нови, точни, информации. Ова се нарекува празнење „flushing“ на групирањето и предизвикува иритирачка пауза од четири или пет такта. Логиката за предвидување на гранка „држи“ околу 256 записи во кеш за да му помогне на Pentium микропроцесорот да ја погоди следната инструкција. Ако можеме да погодиме што ќе се случи следно пред тоа да се случи, тогаш податоците и инструкциите можат да се исчитат и да бидат спремни за извршување. Но како да погодиме? Произлегуваат две можности: кога ќе стигниме до гранка, или ќе скокнеме на друг дел од програмата, или ќе продолжиме со следната иструкција. Логиката за предвидување на гранка, тврди дека микропроцесорот ќе го повтори она што го сторил претходно. Ова почесто е точно одошто не точно. Причината позади ова е тоа што кога ќе се појави јамка (loop), програмата се праќа назад да повтори некоја секција од неа и тоа неколку пати. Тоа нема да го направи само еднаш, кога ќе биде исполнет условот таа ќе продолжи понатаму, а кога нема да биде исполнет условот ќе се врати назад, па така во просек почесто ќе се враќа наназад, наспроти тоа да продолжи со програмата. Во кеш се чуваат инструкциите веднаш пред гранката или скокот заедно со целната адреса при скок, претпоставувајќи дека ќе се случи скокот. Исто така чува и статистички информации за тоа колку често се исполнувал скокот во минатото. Овие информации се користат за да го предвиди веројатниот исход од ситуацијата, и ова е точно во околу 85% од случаевите. Кога ќе се појава гранка, историските информации се обновуваат за да следното предвидување биде уште поточно.
Регистри за општа намена Во Pentium има седум регистри за општа намена, и сите се со широчина од 32 бити. Еден од нив се користи како акумулатор, за да ја задржи компатибилноста со 80386 и 80486, и може да се адресира како единечен 32 битен регистер, два 16 битни или четири 8 битни регистри. Исто така три од останатите регистри за општа намена, можат да се користат со можност за слични делби, и уште три кои нудат можност да се користат како 32 и 16 битни регистри.
Интерапти (interrupts) Справувањето со интераптите (прекините) се нема изменето од сите оние шти ги препознавме кај Z80. Постојат два хардеверски интерапти. NMI или ,не маскиран интерапт (nonmaskabel interrupt) се активира со носење напон, на пинот, на високо ниво т.е. логичка 1. Веднаш по заврсшувањето на тековната инструкција, Pentium ја става содржината во знамеце flag регистерот и потребната адреса во стекот. Тогаш се префрла во flag регистерот и го ресетира, за да спречи понатамошно прекинување (interrupt). Тогаш микропроцесорот му служи на тој прекин (interrupt). NMI обично се појавува како резултат на хардверска грешка и намената му е брзо да го ограничи оштетуваето кое може да настане. 160
Вовед во Микропроцесорите и Микроконтролерите IRQ или interrupt request (барање за прекин) исто така се активира кога на соодветен пин (конектор) доведеме логичка 1 или високо ниво на напон, но во овој случај не заборавете дека тоа е само барање и може да се блокира со ресетирање на interrupt flag (знаменцето за прекин) во регистерот за знаменце (flag register). Ако имаме повеќе од еден интерапт, ги проверуваме приоритетите и оној со најголем приоритет побрдува. IRQ интерпатите, во глобала се иницираат од периферната опрема како што е печаточот.
Исклучоци Овие прекини се „издадени“ од самиот микропроцесор и се случуваат кога микропроцесорот ќе се најде во тешка ситуација која не знае како да је реши. Кога ќе се појава исклучок, најчесто на екранот се соопштува со некоја порака дека има исклучон и Pentium микропроцесорот се обидува повторно да ја изврши инструкцијата. Запрашувајќи го Pentium микропроцесорот за невозможен одговор ние предизвикуваме исклучоци. Тоа може да биде „делење со нула“. Делењето на некој број со нула е невозможно и Pentium не може да ни одговори. Друг исклучок, кој ги погодува во срце корисниците, е ‘General Protection Error’. Софтверот му испраќа адреса, на Pentium микропроцесорот, која не постои и очигледно, не постои и инструкција за извршување.
MMX Pentium MMX (MultiMedia eXtensions) е додадок на стадардниот Pentium микропроцесор, кој е дизајниран да ја зголеми брзината на мултимедијата, комуникацијата и други апликации во е кои е потребно да се повторуваат голем број на исти пресметки. Се започна со анализирање на голем опсег од типични апликации: графика, видео, игри, распознавање на говор итн. Intel ги бараше долготрајните заедничките карактеристи. Повеќето се наоѓаат во прилично едноставната инструкција каква што е менувањето на бојата на еден пиксел да се примени за поголем број на пиксели. Ова заснова една идеа наречена SIMD (Single Instrucion Multiple Data). Со користење на SIMD, можеме да извршиме една операција за повеќе бити податоци, кои се извршуваат паралелно. MMX дозволува осум пиксели да се процесираат заедно. SIMD е срцевината на MMX. MMX технилогијата подра целосна компатибилност со претходните инструкции и додаде уште 57 инструкции. Ова нема опасност кон RISC пристапот! ММХ инструкциите преземаат контрола на осум регистри за броеви со подвижна запирка и има уште едни осум регистри за да ги одржува адресите, контролата на јамката, инструкции за податочна манипулација итн. Регистрите за броевите со подвижна запирка се високо флексибилни и делот за 64 битна мантиса може да се искористи за осум одделни бајти (bytes), четири 16 битни зборови (words), два 32 битни „дуплизборови“ (doublewords) или единечен 64 битен „квадрозбор“ (quadword).
161
Вовед во Микропроцесорите и Микроконтролерите
Аритметичка заситеност (Saturation arithmetic) Во аритметиката со броеви со фикна точка, собирањето на два броја може да предизвика пречекорување (overflow) и може да се изгуби msb битот. Еве едноставен пример, со додавање на бројот 1 на бајтот 1111 ќе ни даде резултат 10000. Ова ќе ни даде резултат нула и ќе предизвика пречекорување (overflow) како што видовме во Глава 4. За да провери дали има overflow, на микропроцесорот му треба одредено време за да го провери статусниот регистер за да види дали знаменцето за overflow е подигнато. Ова е трошење на време. Кога ќе се примени во графиката, на пример нијансирање, ненајдејното враќање на нула може да предизвика ненајдејна и не сакана промена на бојата.
Слика 12.2 Аритметичката заситенос не заштитува од случајност
Saturation arithmetic гарантира дека секое зголемување кое може да предизвика случаен ефект на појавување нула е спречен (види слика 12.2). Ако почниме да броиме од 0000, Pentium микропроцесорот ќе овозможи нормално да продолжи броењето се додека не ја достигне максималната вредност 1111 и потоа ќе ја држи оваа вредност. Бојата во нашиот пример ќе биде црна, но ќе биде спречена случајно да стане бела.
Pentium 4 Како што споменавме претходно, една од границите на оперативната брзина е големината на внатрешните компоненти, до неодамна најмалите детали кои беа лимитирани до 0.18 µm. Како што продолжува натпреварувањето со AMD, беше време за следниот чекор на AMD да почне да користи 0.13 µm технологија, и како што се очекуваше, Pentium 4 микропроцесорот исто така го надоградија со истата технологија за побрзата верзија од 1.8 GHz и поголема. Исто така оперативниот напон се намали од 1.75 до 1.5 волти, дозволувајќи помал простор со што придонесе до уште поголемо зголемување на брзината (и 25% намалување на цената). Новиот дизајн му овозможи на Pentium 4 да го зголеми бројот на транзистори од 42 милиони во 55 милиони и зголемување на конекциските пинови на 478. Тоа беше долг пат за Intel од 16 пинско куќиште за нејзиниот 4 битен микропроцесор во 1972.
Термо безбедност Трошењето на енергијата се зголемува со побрзото работење на секое интегрирано коло, и тоа не е исклучок за Pentium 4. Сега, земајќи в предвид дека актуелниот процесор е само 162
Вовед во Микропроцесорите и Микроконтролерите 10 mm 10 mm и троши 55 вати. Мора да бидеме многу внимателни за да се осигуриме дека нема да прегрее. Ова го постигнуваме со голем ладилни и вентилатор. Новиот Pentium има коло за термо безбедност. Ако микропроцесорот почне да се загрева, тогаш вентилаторот ќе ги зголеми своите вртежи и микропроцесорот ќе ја намали својата брзина. Ако работите станат сериозни и го достигнат опасното ниво од 690С (1550F), тогаш ќе се јави термичкото коло кое ќе го исклучи компјутерот и ќе го заштити микропроцесорот од уништување.
Системеска магистрала Исто така наречена FSB (Front Side Bus), е широка 64 бити и е „Quad Pumped“ кое е фенси начин на изразување дека за еден такт, кој се јавува со фреквенција од 133 MHz, ќе пренеси четири групи од податокот низ магистралата. Малку да го појасниме ова, 133 MHz 4 = 533 MHz, па така магистралата изгледа како единечна која работи на 533 MHz. Влезната и излезната информација се чува во 256 kB level 2 Andvanced Transfer Cache (кеш со напреден трансфер на ниво 2) која се полни со 256 битни широки патеки. Интел го нарекува „Advanced Transfer Cache“ кој не е „quad pumped“ иако е поширока, сеуште се поклопува со брзината на системската магистрала.
Инструкциски декодер, Level 1 Execution Trace Cache и предвидувач на гранка Податокот кој е одбран од предвидувачот се запишува во бафер и потоа се префрла во инструкцискиот декодер. Во оваа фаза, инструкциите кои доаѓаат се анализираат и конвертираат во внатрешна кодна секвенца до која може да се пристапи од микро кодот, како што видовме во Z80180 микропроцесорот. Откога ќе се декодира инструкцијата, дури до околу 12 000 инструкции наречени „МикроОперации/Операнди“ или µОР, се запишуваат во редослед за користење, спремни за извршување. Правилниот редослед е потпомогнат од предвивувањето за разгранување – познат од Intel како Branch Target Buffer (BTB) (бафер за целна гранка). Овде се запишуваат претходните искуства за да погодиме што веројатно ќе се случи следно.
Hyper pipeline (хипер групирање) Како што видовме во Глава 11, групирањето е организација на микропроцесорот и не е посебен уред од неговиот дизајн, па така го немаме „pipeline“ блокот прикажан на слика 12.3. Со стекнаатото искуство од претходните верзии на Pentium, денес се многу подобрени дизајните во кои е вклучено „предвидувањето“. Колку е поточно предвидувањето, толку подолго и побрзо може да ни е групирањето (pipeline – цефководот). Intel беа многу задоволни со своите предвидување, претпоставки, па така новите подолги групирања ги нарекоа „hyper pipeline“. За максимална брзина би сакале подолг pipeline, така што многу едноставни чекори може да се извршат со поголема брзина, но генерално исходот зависи од тоа дали колото за предвидување ќе го направи правилниот погодок. Погрешна претпоставка значи дека „цефководот“ (pipeline) е наполнет со неточни податоци и треба да повторно да се наполни, или „flushed“, кој одзема драгоцено време. Pentium 4 има „цефковод“ (pipeline) од 20 163
Вовед во Микропроцесорите и Микроконтролерите фази кој ни овозможува да користиме 126 инструкции во исто време кои можат да содржат дури до 48 исчитани и 24 запишани инструкции.
Слика 12.3 Pentium 4 процесор
Micro-OP и мемориска искористеност µOP (микро-операциите) се наредени во ред и тие се мешавина на информации кои треба да се запишат во мемориските локации и аритметички операции. Аритметичките операции се поделени на операции за броеви со подвижна запирка и целобројни операции. Регистрите за операции со подвижна запирка се справувват со поместување и запишување додека ALU се справува со повеќе комплексни операции како множење на 128 битни броеви и MMX (multimedia instructions), мултимедијални инструкции, што ги разгледавме погоре. SIMD (Single Instruction Multiple Data) кој беше применет во претходните Pentium микропроцесори се прошири со дополнителни 144 инструкции. Оваа „вештина“ се нарекува SSE2 (Straming SIMD Extensions 2 instructions). Општата идеја е дека ако треба да извршиме некоја функција на повеќе бити од подотоците, поедноставно и побрзо е да ги собериме сите заедно и да ја извршиме функцијата врз сите нив во исто време. 164
Вовед во Микропроцесорите и Микроконтролерите
Rapid Execution Engine За целобројни инстукции имаме две ALU единици кои имаат двапати побрз такт од процесорот, што претставува подобрување за четири пати во однос на основната функција и обезбедува пренос на податоци со брзина од 48 GB/s. Кешот на 1 ниво за податови (level 1 data cache) се справува со податочните излези од ALU и AGU (Address Generation Units) единиците.
Иден развој Новиот дизајн на Pentium со брзини преку 1.8 GHz и технологија од 0.13µm има кодно име „Northwood“, кој го замени претходниот „Williamette“. Работата врз Williamette стигна до крајот на неговиот развој, па со оглед на тоа Northwood е само почеток и бидејќи тој веќе работи на 2.8 GHz, па така неминовен е чип со 3 GHz, тогаш веројатно ние можеме да погледнеме и понапред, па да ја погледнеме и уште поголемата магија од 4 GHz пред да застари дизајнот Northwood.
Celeron Секогаш се акцентираат „цената и брзината“ во компјутерските реклами, и повеќето корисници „паѓаат во стапица“, претпоставувакќи дека 2.8 GHz микропроцесор очигледно е побрз од 2.5 GHz микропроцесор. Оваа е грешна претпоставка, но сепак добро воспоставена, па така за овој дел од пазарот постои побарувачка за многу ефтин микропроцесор со висока брзина.
Квиз 12 Во секој случај, одбери го најдобриот одговор. 1
2
3
SIMD e: a. Искористен во стандардните Pentium, но не и во MMX верзиите. b. Начин на заштитно пакување. c. Single in-line multimedia data. d. Single instruction multiple data. Логика за предвидување на гранки: a. Е друг начин на именување на prefetch регистерот. b. Само се користи во MMX верзиите. c. Заштедува 85% меморија. d. Се обидува да ги погодин наредните чекори кои ќе ги изврши програмата. Исклучокот: a. Ќе го игнорира I знаменцето (I flag) ако е поставено на високо ниво. b. Е невообичано разгранување на програмата. c. Е сигна за прекин генериран од микропроцесорот. d. Се појавува кога Pentium е изненаден од аритметичкиот резултат. 165
Вовед во Микропроцесорите и Микроконтролерите 4
5
Иницијалите SIMD се скратеница од: a. SIM картичка од типот D. b. Single Instruction Multiple Data. c. Superscalar Instruction Mode for Data. d. Streaming Instruction Modular Data. За конструкција на Pentium 4 се користи: a. 0.13 µm технологија. b. 1.8 µm технологија. c. 1.3 µm технологија. d. 0.18 µm технологија.
166
Вовед во Микропроцесорите и Микроконтролерите
13 PowerPC Intel произведе серија на CISC микропроцесори, и заедно со Microsoft, беше во позиција да доминира на пазарот, со што целосно го отфрлија традиционалниот крал на компјутерите, IBM, кој во еден момент, произведуваше повеќе компјутери од сите други производители заедно. Big Blue како што го нарекуваа IBM, за сметка на нивното лого и синити костуми кои ги носеа армијата од продавачи, го постави стандардниот дизајн на компјутер кој сега ги замрачува сите останати дизајни во светот. Како и одамна, во стредината на 1970-тите години, IBM разви RISC микропроцесор, но не баш се најде на пазарот. RISC не „порасна“ се додека Acorn не ги произведе микропроцесорите ARM 2 и 3 за своите Archimedes микрокомпјутери, ниту и овие истотака, не можеа да се рашират на пазарот бидејќи имаше мали обиди тие да бидат компатибилни со Intel-овиот код. Acorn, во тоа време, ги претстави своите Archimedes како замена за многу посакуваните BBC микрокомпјутери. Во 1990, очигледно беше дека страшните близнаци, Microsoft и Intel, ќе го преземат светот, ако никој не им возврати. Многу години и беа потребни на младата компанија наречена „AMD“, полека да напредува и да расте низ годините и еден ден да стане постојан надразнувач на Intel. Сеуште Microsoft владее во светот, но постои систем наречен Linux кој може, еден ден, да постане проблематичен и за Microsoft. Во меѓувреме, се формираше алијанса помеѓу IBM, Motorola и Apple Computeros, во која IBM го донесе својот POWER микропроцесор (Performance Optimized With Enhanced RISC, перформансиски оптимизаран со подобрен RISC). Ова беше наследник на претходниот 801 RISC микропроцесор и беше избран поради тоа што беше RISC микропроцесор и веќе имаше развиен софтвер. Motorola ќе го изгради чипот, а Apple ќе го „даде“ својот компјутерски оперативен систем, кој беше неколку светлосни години понапред од Microsoft-овиот еквивалент во тоа време. Новата фамилија на микропроцесори беше наречена PowerPC. Дизајнерите добро се погрижија да го направат атрактивен за софтверските компании со тоа што беа претпазливи во укажувањето на проблемите од идниот развој. Тие ќе истакнат дека особините на целокупната архитектура ќе останат исти во текот на сериити, а не, како, овие особини всушност ќе се имплементираат. Ова им овозможува на програмирите да знаат врз кои делови можат да се потпрат, за да бидат конзистентни и кои делови најверојатно ќе се променат. На пример, тие дизајнираа систем за 64-битна работа, иако беа користени само 32 битни уреди.
PowerPC 601 (или MPC601) PowerPC 601 беше претставен во 1994 години и ја пратеше веќе прифатената архитектира на PowerPC, прикажана на слика 13.1. Употребени се 2.8 милиони транзистори, што е незначајно 167
Вовед во Микропроцесорите и Микроконтролерите помалку од Pentium, но многу од транзисторите во Pentium се за да ја задржат компатибилноста со нивните претходни микропроцесори.
Слика 13.1 Архитектура на PowerPC 601
Повеќето од прикажаните блокови се слични со оние од Pentium. 601 е 32 битен микропроцесор кој користи 64 битна податочна магистрала и 32 битна адресна магистрала.
Bus interface unit (Единица за магистрално поврзување) Ова служи за вообичаената цел, за поврзување на податочната магистрала и адресните магистрали со микропроцесорот. Исто така има улога на контролен уред кој одредува дали податокот се чита од страна на микропроцесорот или се запишува во надворешна меморија.
Кеш (Cache) Овде имаме единечен 32 килобајтен кеш кој се дели за податоците и интрукциите. Покасните верзии го надоградија вкупниот кеш кој е спроведен со два одделни 32 килобајтни кешови, еден за податоците и друг за инструкциите. Во рамките на кешот, информацијата е средена во серии од групи или линии од по 64 килобајти. За да обезбеди поврзаност со голема брзина (high-speed link) помеѓу кешот, единицата за магистрално поврзување и инструкциската единица и инструкциската редици, имаме 256 битна внатрешна магистрала. Во повеќето случаеви, резултатот од засебна инструкција не е од голем интерес, но ни два податок кој ќе се користи во идната инструкција. Па кога ќе се комплетира инструкцијата, резултатот се запишува во кешот. Наместо тој да се врати во главната меморија. Запишување на резултатот назад во кешот се нарекува „запиши-назад“ (write-back) организација како спротивна од „запиши-низ“ (write-through), кога информацијата е испратени во надворешната 168
Вовед во Микропроцесорите и Микроконтролерите меморија. Ова, се разбира, ни зачувува многу време бидејќи кешот е околу седум пати побрз од пристапот до главната меморија и милион пати побрз ако го користими хард дискот.
Инструкциски ред и инструкциска единица (Instruction queue and instruction unit) Брзата внатрешна магистрала содржи редица од дури осум инструкции. Користејќи ја нормаланта RISC идеа, сите инструкции се со иста должина од 32 бити. Осум вакви инструкции можат да се пренесат низ 256 битна широка внатрешна магистрала. Функцијата на инструкциската единица е да ја прати инструкцијата до три цефководи (pipelines): единица за цели броеви, единица за броеви со подвижна запирка и единицата за предвидување на гранка. Со правилна мешавина на инструкции, можеме да се справиме со три инструкции во исто време. За да ги задржиме цефководите (pipelines) ангажирани, исто така има можност некои инструкции да ги извршува без некој одреден ред. Ова е ограничено само на инструкциите, кои не се меѓусебно зависни.
Единица за предвидување на гранка Кај Pentium, предвидувањето на гранка вклучуваше анализа на историјата за секоја гранка или скок (jump) инструкцијата за да си помогне во предвидувањето што најверојатно ќе направи програмата. PowerPC користи еднофазен цефковод (pipeline) кој декодира и извршува во еден такт и вклучува многу поедноставна стратегија, која, необично, изгледа дека работи добро.
Слика 13.2 Предвидување на гранка
Не прави избор. Ако гранката ја враќа програмата на претходната инструкција, тој секогаш претпоставува дека ќе ја прифати гранката. Ова обично е точен избор, бидејќи повеќето јамки во програмите се многу слични. На друга страна, ако инструкцијата на гранката ни нуди можност за скок нанапред, тој претпоставува дека нема да ја прифати гранката. Ако предвидувањето е точно, претходно се земаат инструкциите и се полнта во инструкциски ред, 169
Вовед во Микропроцесорите и Микроконтролерите со што точни податоци се расположливи во цефководите (pipelines) и немаме никакво доцнење. Ако е неточно, цефководите (pipelines) терба да се избришат (flushed) и повторно д се наполнат, а со тоа губиме неколку такта. Во случај на безусловни скокови, програмата едноставно „му кажува“ на микропроцесорот да оди на друга секција од програмата, не е инволворан избор. Ако скокот е на оддалечена адреса, релевантната инструкција може да не е во кешот и тогаш кешот треба да се избрише (и повторно да се наполни) (flushed, re-loaded) (види слика 13.2).
Единица за цели броеви и регистри Како што се очекува во RISC процесор, имаме регистри во изобилие. Во овој дел од 601, имаме 32 регистри, секој широк 32 бита. Овие регистри се „двопортни“ (dual-ported). Ова значи дека две кола можат да пристапат до регистрите во исто време без да си сметаат меѓусебно. Ова е како некој да чита на задната страна од весникот кој вие го читате од предната страна – освен тоа што регистрите не се иритираат. „Порта“, ‘Port’, патем, е само фенси електронски збор кој значи „приклучок“. Општо, транзисторите имаат три жици (приклучоци) кои одат до нив, и тие се опишуваат како три-портни уреди. Единицата за цели броеви се справуват со сите инструкции како што се, аритметичка манипулација на битовите од цели вроеви, и пренос на податоци до и од надворешната меморија, и таа е организирана во три-фазен цефковод (pipeline). На слика 13.3, вториот такт ја извршува првата инструкција. Следнот такт ја извршува втората инструкција и последниот такт ја извршува третата. Ја постигнавме целта од еден такт за такт, и во четвртиот такт, можеме да забележеме дека следната инструкција пристигнува за да се декодира, веднаш после првото write-back (запишување-назад).
Слика 13.3 Групирање (pipeline) во единицата за цели броеви
Единица за броеви со подвижна запирка Овде има уште 32 регистри, но во овој случај, тие се 64 битни широки и за да се наполни регистерот со еден такт, имаме и внатрешна 64 битна магистрла која е поврзана со кешот. Pipeline-от е во пет фази: prefetch, бафер, декодирај, изврши и запиши-назад.
170
Вовед во Микропроцесорите и Микроконтролерите
Мемориски бафер Овој работи како бафер за надворешна меморија. Баферите вклучуваат две читања и три запишувања, секои до 32 бајти. Тој исто така се користи за запишување-назад на кешот.
Big and little endians Главната меморија е поделена на локации и секоја си има своја сопствена адреса. Секоја локација може да чува единичен бајт информација. Ако сакаме да зачуваме 32 битен број, тогаш треба да искористиме четири непрекинати локации. Замислете си дека сакаме да запишиме 32 битен број 00000000 01010101 00010001 111111112 и на располагање ги имаме адресите 24646603Н, 24646602Н, 24646601Н и 24646600Н. Littleendian форматот ќе ги запише најзначајниот бајт во највисоката мемориска адреса, па во нашиот пример, податокот 00000000 ќе оди во 24646603Н. Ова се користи од страна на Intel микропроцесорите. Big-endian, кој го користи Motorola, работи на спротивен начин, најзначајниот бајт се става во најниската мемориска адреса, па така во нашиот пример, податокот 00000000 ќе оди во адреса 24646600Н. Ова е прикажано на слика 13.4. Сите PowerPC микропроцесори се switchable за да им се овозможи користење на little-endian или big-endian.
Слика 13.4 Big and little endians
PowerPC 970 Голем број на PowerPC-а продолжија да се вградуваат во Apple-Mac и IBM десктоп компјутери, и како додатно, ги подржуваат и двата оперативни системи UNIX и Linux. Последната понуда е 970, кој е изграден од 52 милиони транзистори и го започна својот живот како уред на 1.8 GHz, кој сега се искачи до 2.0 GHz. Ова може да изгледа бавно, но тој има компензирачки атрибути, како што е неговта магистрала на 900 MHz во споредба со 533 МHz магистрала на Pentium 4. Тој е 64 битен микропроцесор, па така тој ракува со податоците во 64 битни делови, но останува да биде компатибилен со претходниот 32 битен дизајн. Има два кеша на ниво 1, еден за инструкциите со 64 kB и кеш за податоците од 32 kB, кој е малку поголем од продуктот на Intel, но и двете компании користат кеш на ниво 2 од 512 kB. 171
Вовед во Микропроцесорите и Микроконтролерите Како што продолжува растот на мемориската големина во секој дизајн, така е големината на меморијата кој може директно да се пристапи се зголеми со потегот за процесирање на 64 бити. Pentium 4 може да пристапи до 40 GB меморија, што изгледа претерано голема во овој момент, но имаше и времиња кога 4 MB беа доволни да не зачудат. PowerPC 970 може да се справи со меморија со пропорција од Star Trek измерени во терабаајти (илјади гига). Табела 13.1 Големина на кешот
PowerPC 970 Pentium 4
L1 Instruction
L1 Data
L2 cache
64 kB Ова е тајна!
32 kB 8 kB
512 kB 512 kB
За максимална брзина на микропроцесорот потребен ни е брз такт (висока фреквенција) во комбинација со максимална искористеност на секој дел од микропроцесорот. Првите 8 битни микропроцесори ќе ја прифатеа првата инструкција и ќе ја препратеја на микропроцесорот кој ќе ја декодираше, па ќе ја извршеше, т.е. ќе постапи по неа, и тогаш ќе го запишеше резултатот пред да ја земеше следната инструкција. Ова значи дека секој дел од микропроцесорот не работеше ништо за голем дел од времето. Денешните микропроцесори, за да има што помалку „залудно“ потрошено време, во исто време исчитуваат повеќе инструкции и ги поделуваат задачите, со што е многу веројатно дека тие ќе се извршат во исто време. Како и во Pentium 4, така и кај PPC970 за ова се користи кешот на ниво 1, и како што е познато, тој е поделен на инструкциски кеш и податочен кеш. Исто така има и кеш на ниво 2 и еден надворешен кеш на ниво 3.
Читање на инструкции Инструкциите се „истураат“ од инструкцискиот кеш со максимална рата од осум за еден такт, иако поверојатно е тоа да се пет. Но, ова е сепак брзо. РРC970 користи многу долг цефковод (pipeline) кој може да опслужи симултано дури и до 200 инструкции. Цената на ваков долг pipeline е тоа што мора да бидеме претпазливи и да се осигураме дега тој се полни со најкорисни инструкции и оттаму тој треба да биде поткрепен со ефективна техника за предвидување на гранки.
Предвидување на гранка За да се добие максимална можна брзина, кај РР970 голем дел од ресурсите се посветени за предвидување на разгранувањето. Како се чита инструкцијата, така колото за предвидување на гранки ја скенира дојдена инструкција и проверува дали е некоја инструкција која разгранува. Секој пат кога се среќаваме со таква инструкција имаме опција дали таа гранка ќе ја прифатиме или ќе ја одбиеме.
172
Вовед во Микропроцесорите и Микроконтролерите 970 има два метода за предвидување на гранка. Првиот е многу сличен со оној кој го користи Pentium 4, и за да си ја поедностави ситуацијата, ги следи сличните заклучоци какви што ги донесуваме во секојдневниот живот. Ако вообичано тоа се случува, многу веројатно е тоа повторно да се случи. 970 чува информации за претходните 16384 гранки во своја BHT (Branch History Table), табела за инсторија на гранките, за да види колку често е направен еден избор и овие информации се подредуваат со програма за предвидување пред да се дојде до конечна одлука. Вториот метод вклучува табела со слична големина наречена Global Predictor. И овој метод исто така дава заклучок за прифаќање, или пак не прифаќање, на гранката, но тоа го одлучува со генерирање на 11 битен вектор кој го чува конкретно извршениот пат „поминат“ од претходните единаесет исчитани групи кои водат до гранката. Значи постојат два независни механизми кои служат за донесување одлука за тоа дали да се прифати некоја гранка. Ако тие не се согласуваат, потребен ни е судија. Оваа работа е изведена од „Selector Table“ (селектор на табела) кој ги чува ратите на успеси за секој од двата претходни методи за секоја гранка посебно. И на крај тој донесува одлука – и како што велат (од IBM), тој е многу успешен, што веројатно и е успешен.
Справување со инструкциите Со комбинирање на влезната инструкција од инструкцискиот кеш и информацијата за предвидувањето на гранки, инструкцијата се става во ред и се препратува до единиците за Decode, Crack и Group Formation. Во оваа фаза, за да ја задржиме брзината на справување со инструкции на максимум, оваа единица ги зима инструкциските кодови од инструкцискиот кеш, ги декодира (decode) и ги поделува (cracks) на компоненти наречени внатрешни операции (Internal Operations IOPs). Овие многу мали, но едноставни задачи се проследени до специјални единици како петте блока прикажани на долниот дел од слика 13.5.
Слика 13.5 PowerPC 970
173
Вовед во Микропроцесорите и Микроконтролерите IOPs се извршуваат во таков ред кој ќе резултира со најбрза пропусна моќ, и за да ја намали комплексноста на следење на извршувањето за сите поединечно, тие се организираат во групи од по пет IOPs и тогаш се следат групите. Во последниот ред се прикажани аритметички базирани блокови кои се справуваат со векторите, пресметките со цели броеви и броеви со подвижна запирка, единица за читањезапишување која се справува со пренос на податоци до меморијата преку кешот на второ ниво, и конечно повратна врска за информацијата од предвидувањето на гранки.
PC-пазар PowerPC може не е во нашиот компјутер, но тој може да се најде во нашиот автомобил. Ford Motor Company го избра PowerPC да се користи за нивниот компјутер за менаџмент на моторот кој ќе го вградуваат во иднина. Квиз 13 Во секој случај, одбери го најдобриот одговор. 1
2
3
4
5
Максималниот број на инструкци кој симултано може да се справи PowerPC 970 е: a. 200. b. 3. c. 16384. d. 128. Запиши-назад (Write-back): a. Обратен редослед на битовите од податоците. b. Се користи за двојна проверка на прецизноста на податокот пред употреба. c. Се користи само во little-endian системите. d. Го запишува резултатот во кешот наместо во надворешната меморија. PowerPC 970 има внатрешна магистрала која работи на фреквенција од: a. 64 bits/s иако може да работи со 32 bits/s/ b. 512 kB/s. c. 900 MHz d. 533 MHz Регистерот до кој може да се пристапи во исто време преку две различни кола, познат е како: a. Кеш на второ ниво. b. Dual-ported (дво-портен). c. Бафер. d. Three-ported, три-портен уред. Big endian форматот: a. Го запишува нискиот бајт во највисоката адреса. b. Го запишува високиот бајт во највисоката адреса. c. Се употребува кај сите микропроцесори. d. Се употребува во кешот, но никогаш во главната меморија.
174
Вовед во Микропроцесорите и Микроконтролерите
14 Athlon XP Ова е конкуренцијата од AMD на постоечкиот Pentium, и двете компании се концентрирани на тоа, како ние да имаме поголеми добивки. Натпреварот помеѓу нив е сконценцентриран да ги подобрат работите во корист на потрошувачите. AMD се приближуваше кон Intel, неколку години и конечно Athlon микропроцесорот со 37 милиони транзистори му создаде сериозни проблеми на Pentium микропроцесорот. Обично е поефтин, и во повеќето тестови, тој е и побрз. Идејата зад Athlon, не е да се натпреварува во брзината на тактот, фреквенцијата, туку на реалната брзина со која ги извршува работите во секој такт. Дури и така, Athlon XP сега се натпреварува лице-в-лице во брзината, и го има достигнато Pentium на 2.8 GHz со користење на 0.13 микронска технологија со различен внатрешен дизајн, и осигурувајќи (се разбира) се дека двата микропроцесори не се пин-за-пин компатибилни. Athlon употребува сличен систем за заштита од термичкото загревање какво што е и во Pentium. Кус преглед на Athlon XP е прикажан на слика 14.1.
Слика 14.1 Athlon XP процесор
175
Вовед во Микропроцесорите и Микроконтролерите
Кешови За максимална брзина кешот е вграден во чипот. Со ова AMD го елиминраа времето потребно за да се пренеси податокот. Од надворешната меморија и околниот хардвер, влезната информација од системската магистрала се полни во 64 kB инструкциски кеш и посебен 64 kB податочен кеш. Податочниот кеш ги полни податоците во L2 кешот, кој е нешто поголем, т.е. 256 kB и има техника која нè осигурува дека L2 кешот нема дупликат информации кои се веќе зачувани во податочниот кеш, па заради ова имаме ефективен локален high speed мемориски простор од 384 kB.
Предвидување на гранка Како кај сите сегашни микропроцесори, и кај овој посветено е големо внимание за претпоставка на најверојатниот резултат од секоја гранка-инструкција. Секоја ваква инструкција, обично, произведува два алтернативни правци на програмата. Тие одговараат на прашања како „дали резултатот е нула?“ и одговорот одредува што ќе се случи следно. Ако секој пат чекаме да се одговри прашањето и само тогаш ги читаме инструкциите од следниот дел на програмата ќе имаме многу потрошено време, како што видовме во првите дизајни на микропроцесорите. Ако претпоставиме точно, можеме предвреме да го исчитаме следниот дел од програмата и да го стартуваме. Колото за предвидување на гранка ја прави таа претпоставка. Ако претпостави грешно, старите податоци се отстрануваат и се заменуваат.
Хардверско предвремено читање на податоци Ова е уште една слична форма на предвидување со која се следи дојдовната инструкција, уште при нивното пристигање, и се претпоставуваат податоците кои ќе и бидат потребни, и се полнат во податочниот кеш, па така Athlon ги чита податоците уште пред да знае дали тие ќе бидат потребни. Како и кај предвидувањето кај гранки, погрешните податоци треба да се презапишат, но во просек го забрзува протокот на податоци.
Инструкциски декодери За да биде во целосна употрeба својот побавен такт, Athlon има три инструкциски декодери кои работат независно. Секој од овие може да се справи со три операции во еден такт кој дава вкупен проток на девет операции во еден такт, кој сеуште е значајно поголем од шесте операции за еден такт кај Pentium.
Pipelines (цевководи) и инструкции Кај Athlon имаме три независни цефководи (pipelines) за цели броеви и исто така три слични цефководи (pipelines) за броеви со подвижна запирка, со оглед на оние кај Pentium, четири цефководи (pipelines) за цели броеви, но два цефководи (pipelines) за броеви со подвижна запирка.
176
Вовед во Микропроцесорите и Микроконтролерите Трите единици за броеви со подвижна запирка, извршуваат и симултано можат да се справат со: a) Функции за запишување и читање b) Функции за собирање c) Функции за множење како и сите Intel MMX (multimediа extensions) инструкции, плус сопствени SIMD (single intruction multiple data) инструкции за да обезбеди целосна подршка за SSE (streaming SIMD extension) и уште животно посакуваните инструкции за 3D слики и графики – AMD-овото име за овие нови инструкции е „3D NOW“ технологија. (MMX е заштитен знак на Intel; 3D NOW е заштитен знак на AMD).
Состојба на натпреварувањето Pentium има „мотор за брзо извршување“ кој има две ALU (arithmetic and logic units) за инструкции со цели броеви, секоја со такт двапати побрз од брзината на процесорот која работи со брзина на предната магистрала (front side bus) од 533 MHz, наспроти тоа Athlon има само 333 MHz FSB. Ова ја продолжува шемата да мислиме дека Pentium предничи во брзината, како и да е, во пракса, Athlon, во повеќето тестови, е нешто побрз од Pentium. Вести ... Тоа е напишано вчера, ова утро дојде веста дека Intel штотуку ја проби бариерата од 3 GHz со уред на (само) 3.06 GHz. Ова, кажуваат тие, дека вклучува hyper-threading, техника која вклучува поделба на програмата на помали единици кои можат да се извршуваат симултано. Ова овозможува микропроцесорот да работи со повеќе апликации во исто време, исто како да имаме два процесори. Таквиот multi-tasking (работа со повеќе задачи истовремено) е достапен во Windows XP и Linux и веројатно ќе биде достапен и во сите нивни наследници. Па каде во иднина води ова, дали ќе одиме на се поголеми и поголеми брзини, или ќе го развиваме multi-tasking-от за да имаме, во поголем број поефективни микропроцесори која ја делат работата? Имам чувство дека одговорот е поделбата на работата. Се чини дека веројатно Intel повторно се врати да биде прв. Доаѓаат возбудливи времиња... Уште вести ... Речиси веднаш, Athlon одговори со она што изгледа уште еден значаен чекор напред – 64 битно пресметување. Микропроцесорот кој сеуште опстојува со кодното име „Hammer“ ќе се продава како уште попријателското име „AMD Athlon 64“ и ќе биде достапен во средината на 2003 и ќе му се придружи на PowerPC 970 во клубот „64“. Тој ќе може да стартува 64 битни, 32 битни и 16 битни апликации, без пенали за брзината (без да ја намали брзината) и ќе ги избегне трошоците од купување на нов софтвер. Единствената техничка информација која беше вклучена во првичната најава беше новиот систем на магистралата која користи „hypertransport“ технологија, за која AMD тврди дека го
177
Вовед во Микропроцесорите и Микроконтролерите зголемува протокот низ нив за 50% повеќе од постоечкиот дизајн. Intel ќе има нешто да искаже во врска со ова тврдење, а тоа е: сè надевам. Фреквенцијата на првата избрана серија малку ќе се разликува од ХР, и ќе биде околу 2.8 GHz, но дизајнот ќе овозможи повеќе простор за развој и ќе може да стартува програми на повискои брзини. Доаѓаат навистина возбудливи времиња... повеќе од 3 GHz фреквенција, 64 битно пресметување и извршување на повеќе инструкции симултано. Звучи добро. Се одржуваше Олимпијада за брзина на десктоп компјутерите помеѓу PowerPC970, Pentium 4 и Athlon 64, без оглед на тоа што на компјутерскиот пазар доминираа кловнови на IBM кои оставија само мала „улога“ за PowerPC 970 вграден во Apple-Mac. Како што видовме претходно, резултатот од тестот за брзината зависи од природата на тестот. Со тоа на ум, и со ризик од иритирање на вентилаторите на секој микропроцесор, трката за севкупна брзина припадна на Athlon 64, кога тоа е на располагање, и ќе изгледа дека е победник помеѓу другите два, рамо до рамо, и оставајќи ги чекор зад себе. Но тоа зависи од избраниот тест и знаеме дека секој крал на брзината, многу брзо ќе биде симнат од престолот. Врз основа на моментално достапните информации на табела 14.1 е прикажана (многу) приближна споредба. Табела 14.1
Clock speed Bus speed Bits Process size Op systems Comparative speed Max memory
PowerPC970
Pentium 4
Athlon 64
2 GHz 900 MHz 64 0.13/0.09 microns OSX IBM linux 1988 Terabytes
2.8 GHz 533 MHz 32 0.13 microns Windows 1984 40 GB
2 GHz 533 MHz 64 0.13 microns Windows 2372 Terabytes
Квиз 14 Во секој случај, одбери го најдобриот одговор. 1
2
Во споредба со Pentium 4, дизајнот на Athlon XP има: a. Побрза FSB, која работи на 533 MHz. b. FSB со иста брзина. c. Побавна FSB, која работи на 333 MHz. d. Побрза FSB, која работи на 2.8 GHz. Бидејќи два микропроцесори, Pentim 4 и Athlon XP, користат 0.13 микронска технологија: a. Тие НЕМААТ никакви други сличности помеѓу дизајните. b. И двата ќе работат со иста брзина. c. Тие ќе имаат ист број на пинови. d. Големините на кешот ќе им биде еднаква. 178
Вовед во Микропроцесорите и Микроконтролерите 3
4
5
Трите единици за извршување на операции со броеви со подвижна запирка кај Athlon XP симултано можат да се справат со запишување и читање, функции за множење и: a. SIMD функции. b. Функции за собирање. c. Функции за делење. d. 3D NOW! Функции. Кога имаме точно предвидување на гранка: a. Ја зголемуваме севкупната брзина на стартуваната програма. b. Ја зголемуваме должината на цефководот (pipeline). c. Ја намалуваме брзината/фреквенцијата. d. Го заштитуваме микропроцесорот од прегревање. Инструкцискиот кеш кај Athlon има капацитет од: a. 256 kB. b. 32 bits. c. 64 kB. d. 384 MB.
179
Вовед во Микропроцесорите и Микроконтролерите
15 Микроконтролери и како да ги користиме Припремете се за полетување Во 1960-тите, електрониката започна да се буди од својот длабок сон, во кој се употребуваше технологија на термионски вентили кои беа претпознатливи како кола кои се градеа триесет години. Темпото на напредокот беше со благ раст. Тогаш се произведе првиот полупроводнички материјал и употребата на транзисторите се појави за неколку години. Се користеше фотографски процес за да се дизајнира и произведат транзисторите кои брзо доведоја до производство на едноставни интегрирани кола и микропроцесорот.
Почетокот на микроконтролерите Не порано од појавата во 1971 година на микропроцесорот и придружните мемории, стана јасно дека микропроцесорот секогаш е придружен со други кола, како влезно/излезни уреди, мемориски и тајминг кола, па би било добар потег за да ги искомбинираат во еден уред. Имавме избор – можевме сè да направиме општо и универзално и да го нарекуваме микропроцесор или да ги дизајнираме за една цел и да ги наречеме микроконтролери. Повеќенаменските уреди, станаа компјутери, па и овде имаме избор. Цената на компјутерите или „микрокомпјутерите“ беше значајна особина, и овие микропроцесори имаа вградено малку ROM и RAM. Набрзо, брзината стана главна особина со што цената почна да опаѓа и можевме да си дозволиме да ги опремиме нашите домови со компјутери какви што имаше само во канцеларии пред неколку години, и микропроцесорите станаа скапи и брзи. Брзината ја водеше популарноста на машините како што домашните и канцелариските компјутери стануваа брзи и побрзи. Тие се продаваа во милиони. Во меѓувреме уредите за специјализирана единствена цел, вистинските потомци на првите микрокомпјутери, и понатаму се развиваа и станаа многу ефтини, се продаваа милијарди од нив и никогаш не се спомнуваа. Тие беа моќта на џебниот калкулатор, видеа рекордерите, камерите, печките на микробранови, машините за перење, дури и во честитките кои свираат некоја музика – всушност се што е електронски.
Само размислување Микроконтролорите го надминаа бројот на популација веќе неколку пати, и како што претходно споменавме во нашите домови ги има, веројатно, околу педесет од нив. Тие се во секоја голема индустрија – производство на храна, транспорт, комуникации, истражување, оружје, производство на енергија, медицината, греење и климатизација – има многу малку нешта што не се потпираат на тоа да користат микроконтролери. Ако тие научат да
180
Вовед во Микропроцесорите и Микроконтролерите комуницираат независно од нас, тие може ќе развијат своја агенда. Сега тоа е само една мисла.
Повеќето микроконтролери се слични Кога еднаш ќе научиме да управуваме со возило, тогаш лесно заклучуваме дека сите возила се многу слични. Ние се радуваме на оваа генерална идеа и можеме да се концентрираме само на малите разлики. Имаме иста ситуација и со микроконтролерите. Кога ќе се запознаеме со основните блокови од дизајнот на едноставниот микропроцесор од Глава 8, лесно можеме да се префрлиме на микроконтролерите. Не е зачудувачки тоа што откривме дека сите микроконтролери во основа се многу слични. За да ги презентираме севкупните импресии од „големината“ на микроконтролерите, ние ќе разгледаме три многу популарни микроконтролери. Првиот е 8051, веројатно најкористениот микроконтролер, скоро дваесет година стар, кој сеуште е произведуван од многу различни компании и не покажува знаци на исчезнување. Следниот е од фамилијата AVR произведен од Atmel Corporation, еден од лидерите во ова поле. Ќе го разгледаме AT90S/LS2342, оној малиот, модерниот и RISC микроконтролер. Последниот ќе го откриме во Глава 16.
8051 Веројатно транзицијата од микрокомпјутер во микроконтролер започна со појавата на Intel 8048, како што видовме во Глава 11. Кај 8048 вградивме RAM, ROM и тајмер, па така можевме да го користиме, како уред за една цел, за контрола на тастатура – всушност, што и беше микроконтролер. Со искуството стекнато со неговото користење, стана очигледно дека има значаен пазар за микроконтролерите. Во 1980 година, Intel го лансираше 8051 кој и после дваесет и три години подоцна е „жив и здрав“. Фактички навистина многу здрав. Тој е веројатно најпопуларниот микроконтролер на сите времиња. Тој се прави од околу 44 снабдувачи. Овие снабдувачи честопати додаваат некои екстра особини за да ги направи верзиите или „алтернативите“, како што ги нарекуваат тие, особено погодни за одредена цел/работа. Има најмалку 92 алтернативи и сите се компатибилни со оригиналниот код. Освен различните алтернативи, има и серија на опции кои го зголемија вкупниот број на членови од фамилијата 8051 до неколку стотици.
Нумерирање Нумерирањето на уредите не е толку очигледно бидејќи достапни ни се многу микроконтролери од неколку снабдувачи кои имаат свои кодови на прозиводите. Па така тие произведуваат група во основа слични уреди, со мали измени како што е работниот напон или различна големина на вградениот RAM и ROM мемории – ваквите групи нас ни се познати како „фамилии“.
181
Вовед во Микропроцесорите и Микроконтролерите Па така на фамилијата ѝ се доделува име кој има мала поврзаност со кодот на производот. На пример, фамилијата на Intel, 8051 има име на фамилијата MCS51, која е составена од 803Х, 805Х, 875Х и верзиите со ниска моќност bXC45X и 8XCX52. Како и обично, Х ни заменува некоја бројка или буква, на истата позиција. Ситуацијата дополнително станува збунувачка (или можеби се поедноставува), бидејќи сите ги нарекуваме како 8051.
Блок диаграм за 8051 Блок диаграмот кој е прикажан на слика 15.1 е фамилијарен портрет за фамилијата 8051. Има неколку особини кои се разликуваат кај членовите на фамилијата, главно во мемориската конфигурација – некои верзии имаат помалку меморија, а некои пак, воопшто, немаат меморија. Сепак, ние ќе го разгледаме работењето на нашата „middle-of-the-road“ верзија (средна верзија), а за индивидуалните разлики ќе се погрижими подоцна.
Слика 15.1 Блок диаграм за 8051
Преглед на пиновите кај 8051 Кај сите микропроцесори и дигитални чипови, линија врз ознаката на пинот, има значење дека тие се ниско активни или, пак да го поедноставиме ова, за да ја користиме оваа функција (пинот) треба да примениме нула волти. Распоредот на пиновите се прикажана на слика 15.2, на прв поглед, повеќето пинови имаат двојна употреба што ни ја прави ситуацијата доста комплицирана. Ова е честа карактерисика кај микроконтролерите и претставува метод со кој се намалува бројот на пиновите. Ако има повеќе пинови, тогаш имаме поскап и поголем уред. Ова претставува лоша вест за уредите кои често се предодредени да бидат вградени во рамките на други кола. Има различни варијанти кои ни овозможуваат да го зголемиме бројот, виртуелно, на пиновите, па така имаме посебен пин за секоја функција.
182
Вовед во Микропроцесорите и Микроконтролерите
Слика 15.2 Преглед на пиновите кај 8051
Reset Без оглед на тоа која програма е стартувана, ние мораме секогаш да имаме контрола врз микроконтролерот, исто како што мораме да имаме контрола и врз микропроцесорот. Процедурата е сосема иста. Микроконтролерот има reset пин кој, кај 8051, се превзема од блокот за контрола на магистралата и, во нормална работа тој мора да биде на нула волти. Кога ќе се донесе позитивен напон нaд 2.0 V, тогаш микроконтролерот веднаш се враќа на својата стартна адресна локација, што во нашиот случај е 0000Н. Можеме да го организираме ова за да биде автоматски при вклучување, но ние исто така мораме да обезбедиме и reset прекинувач (копче) за да се здобиеме со контрола на системот во секое време без да го отстраниме од напојување. Ова е „reset“ прекинувачот (копчето), што го користиме кога нашиот компјутер се закочува и не игнорира.
Слика 15.3 Reset прекинувач
183
Вовед во Микропроцесорите и Микроконтролерите Кога ги заменуваме микроконтролерите, треба да запомниме да го провериме поларитетот на reset напонот. Споредете ги, колото од слика 15.3, со она прикажано на слика 8.7. Clock input Како што видовме во Глава 7, имаме потреба од clock (такт) сигнал. Оригиналниот дизајн на 8051 имаше кристал со фреквенција 12 MHz, што во покасните верзии може да работи на 33 MHz, 40 MHz дури и на 44 MHz. Како алтернатива, можеме да користиме керамички резонатор или пак надворешен сигнал. Clock input (влез за такт) кој користи кристал е прикажан на слика 15.4. За да употребиме надворешен сигнал, треба да го отстраниме кристалот и кондензаторите, и треба сигналот да го доведиме на Xtal1 пинот, а Xtal2 треба да го оставиме дисконектиран (откачен).
Слика 15.4 Clock (такт)
Ports (Порти) Имаме четири порти кои се нумерирани од 0 до 3. Во стандардниот 8051, портите 0, 2 и 3 се за двојна намена, додека портата 1 е само влез/излез порта. Во некои варијанти на 8051 сите порти се со двојна намена. Во однос на меморијата, може да се користи вградената меморија во чипот, со што го заджува колото едноставно, што е можно повеќе и вградувањето на уредот го прави најзгодно. Вградената меморија на чипот може да биде маскиран ROM или EPROM со кои се сретнавме во Глава 6. Со употреба на надворешна меморија очигледно ги зголемуваме можностите на чипот, но дозволено ни е само меморија до 64 kB, која е стандардна големина за 8 битен микропроцесор. До надворешната меморија се пристапува со носење на логичка нула на „external access“ (надворешен пристап), ЕА пинот. За да го вклучиме надворешниот ROM, треба излез овозможувач, output enable (OE) пинот да биде на ниско ниво и тоа од program store enable (PSEN) пинот од 8051. На сличен начин се пристапува до надворешен RAM за читање и запишување преку read (RD) и write (WR) пиновите кои носат напон на логичка нула на output enable (OE) и read/write (R/W) пинот, респективно.
Interrupts (интерапти, прекини) 8051 има вкупно пет интерапт сигнали, два од нив можат надворешно да се генерираат, додека останатите три се од внатрешна природа. За интераптите има дискусија во други 184
Вовед во Микропроцесорите и Микроконтролерите поглавја, но во основа кога ќе се појави интерапт/прекин, програмата која е стартувана во тоа време е прекината и се извршува друга секвенца на код, наречена interrupt service routine (ISR), сервисна рутина за интерапти. Кога ќе заврши ISR, микроконтролерот се враќа назад во оригиналната програма и продолжува од таму каде што прекинала, т.е. се појавил интерапт. Има различни ISR за секој интерапт кои треба претходно да се стават на специфични адреси и да бидат спремни ако тие се потребни. Што ако се појават два интерапти во исто време? За појава на интерапт, континуирано се проверува, како што викаме ние по избирачки редослед. Почнувајки од највисокиот. Редот за 8051 е: External Interrupt 0 Timer 0 External Interrupt 1 Timer 1 Serial port И покрај ова, секој интерапт има две нивоа на приоритет, па така ако се појават два интерапти, прво ќе се изврши оној со повисок приоритет. Ако и двата имаат ист приоритет, тогаш се одлучува по избирачкиот редослед.
Timer/counters (тајмери/бројачи) Тајмер или бројач ни е серија од бистабилно кола или флип-флопови кои ја менуваат состојбата за еден за секој влезен сигнал. Ваквите кола ќе ја делат влезната фреквенција со фактор два. Ако тој сигнал се носи на друго бистабилно коло, излезот ќе биде ¼ од оригиналната фреквенција, уште едно коло ќе ни даде излез од 1/8, потоа 1/16 од фреквенцијата итн. Има два тајмера, Т0 и Т1. Овие можат да се испрограмираат за да делиме со 256, 8192 или 65536 и ќе генерираат интерапт сигнал кога софтверски ќе се детектира дека тоа е завршено. Еден од модовите ни дозволува тајмерот/бројачот во 8 битен (делење со 256) мод континуирано да се полни и повторно да почне да брои секој пат. Влезниот сигнал кој што се одбројува може да потекнува од надворешно коло, па ги брои влезните пулсови, или може да користи внатрешен сигнал кој е всушност 1/12 од фреквенцијата која се користи. Како што спомнавме погоре, тој генерира интерапт сигнал кога ќе стигне до неговата максимална вредност. Можеме повторно да го наполниме тајмерот со број од кој ќе ни започне броењето. Ова ни овозможува да генерираме интерапт после појавата на одреден број од некој настан, или временски интервал.
Serial port (сериска порта) Бидејќи микроконтролерот, нормално, се справуваат со осум битен податок во единица време, за да може да работи паралелно за да прима и испраќа два такви податока мораме да овозможиме сериска/паралелна конверзација. Ова секој пат се постигнува со користење на
185
Вовед во Микропроцесорите и Микроконтролерите шифт регистри кои се контролираат со тактен сигнал. Работењето на шифт регистрите се опишани во Глава 17. Сериската порта ни овозможува во исто време да испраќаме и примаме податоци, ова нас ни е познато како full duplex (полн дуплекс/двоспрат) систем. Како што ни кажува името, битовите од податоците се движат еден после друг во континуиран тек. Pin 10 се нарекува RXD т.е. receive data (примај податок), a pin 11 е TXD transmit data (испрати податок), но, што е многу чест случај, работите не се така едноставни. Може да работи на три (четири) начини, или режими нумерирани како 0, 1, 2 и 3. Mode 0 (режим 0) Во овој режим, и само во овој, TXD пинот всушност се користи за такт сигнал, а RXD пинот се користи за примање или испраќање на податоци. Фреквенцијата на тактот е фиксирана на 1/12 од фреквенцијата од вградениот осцилатор, и ова, се разбира, ни ја одредува брзината со која се пренесуваат податоците преку 8 битните шифт регистри. Mode 1 (режим 1) И овој режим ни испраќа податоци во 8 битни „грутки/групи“, но неговата фреквенција е прилагодлива и работи како 8 битен UART (universal asynchonous receiver transmitter – повеќе за ова погледни во Глава 17). 8-те битови се зголемуваат на 10 со додвање на логичка 0 за да го обележиме почетокот на групата и логичка 1 за да го обележиме крајот на групата. Ова е нормалниот формат кој го користиме во RS232 трансмисија. За жал, излезниот напон не се совпаѓа со RS232 стандардите, па така мора да додадеме надворешен чип кој ќе ни ја врши конверзијата на напонот. Некои „погодни“ чипови се дискутирани во Глава 17. Mode 2 (режим 2) Овој е многу сличен со режим 1, освен тоа што бројот на пренесени битови се зголемува од 10 на 11. Додатниот бит може да се користи како бит за парност, кој се употребува за преверка на грешки при пренос. Шаблонот е: Почетен бит (0), податок од 8 бита, бит за парност и стоп бит (1). (повторно погледни во Глава 17). Ратата на трансмисија може да биде 1/32 или 1/64 од фреквенцијата на вградениот осцилатор. Mode 3 (режим 3) Ова е 11 битна трансмисија со програмабилна baud rate (бауд брзинска единица, бауд во секунда). Baud rate е скоро исто како брзината на трансмисијата измерена со бити во секунда.
Watchdog timer (тајмер заштитник) Кога микроконтролерот е вграден во некоја опрема, тој може да се најде во околина каде има проблем со електрична интерференција. Ова, или софтверски проблем може да го закочи микроконтролерот со носење во бескраен круг т.е. јамка. Тајмерот заштитник ќе го ресетира микроконтролерот после некој период, околу 20 милисекунди, освен ако му е кажано да не го направи тоа. Заглавен во софтверска јамка, и кога тој не генерира „не ме ресетирај“ сигнал, тогаш микроконтролерот се ресетира и излегува од јамката. 186
Вовед во Микропроцесорите и Микроконтролерите Тајмерот заштитник го има само во некои варијанти на 8051, но го има како самостоен чип. Тој е неизбежен во поновите дизајни. Кога сакаме микроконтролерот да го ставиме во континуиран круг/јамка, имаме избор, да се осигураме дека јамката го содржи потребниот совтферски код за да го оневозможиме тајмерот заштитник пред да ја започниме јамката.
AVR 8 битен RISC микроконтролери За пример ќе го разгледаме AT90S/L2343, и можеме да видиме дека е многу едноставен микроконтролер со минимална комплексност, но сеуште со многу корисни особини, а сепак ефтин, мал и релативно брз. RISC дизајнот и широчината на регистрите овозможуваат огромното мнозинство на инструкции да се извршуваат во еден такт, и сите други, со исклучок на пет, се извршуваат во два циклуса/такта.
Слика 15.5 AVRAT90S/LS2343
На слика 15.5, го имаме блок диаграмот. Големо олеснување е тоа што поголемиот дел е многу сличен со првите 8 битни микропроцесори и 8051 што го разгледавме во претходното поглавје. Веќе видовме дека повеќето уреди се комбинација од една или две иновативни идеи споени во стандардна мешавина. 187
Вовед во Микропроцесорите и Микроконтролерите
Влезови и излези Една забележлива особина во блок диаграмот, е тоа што гледаме дека има само пет влеза/излези обележени како PortB од 0 до 4, т.е имаме само пет конекции за податоците што е мал број се додека не ја разгледаме сестринската верзија AT90S/LS2323 кој има само три PortB од 0 до 2! Сепак, тие се нарекуваат 8 битни уреди, а во претходните 8 битни микропроцесори, пораснавме со очекувањето, дека секогаш ќе имаме најмалку една или две конекции од 8 битни влезно/излезни порти. Пиновите од PortB можат да се користат за испраќање на податоци во две насоки, т.е. можат да се користат како влезни или излезни пинови. Како што е заедничко и за другите микропроцесори и микроконтролери, правецот на движење на податоците во секоја линија од PortB се контролира од регистер за правец на податоците. Со ставање на „единица“ во регистерот ќе ја направи соодветната линија од PortB излезна, а пак на друга страна „нулата“, се разбира, ќе ја промени во влезна линија.
Мемории Овој микроконтролер има три мемории, или четири ако ги броиме и регистрите за општа намена. За запишување на меморискиот простор се користи сериски пренос на податоци и е постигнато од SPI (serial programming interface). Еден ROM мемориски простор за складирање, направен од Flash меморија, со 1k 16 организација. Сите програмски инструкции се или 16 или 32 битни широки, и може да се исчисти и препрограмира од останатото коло, и тоа може да се направи најмалку 1000 пати. Содржината на Flash меморијата не може да се промени од програмата која е стартувана од CPU-то и така сме ослободини од случајна корупција. Податоците се чуваат во EEPROM, кој може, повторно, да се исчисти и репрограмира електронски без да се отстрани од уредот. Тој има само 128 бајти меморија, не е во состојба да помине низ најмалку 100 000 циклуси. Корупција (губење) на податоците може да се појави ако многу се намали напонот на EEPROMот, но овој ефект може да се избегне со употреба на еден од следниве три методи. Првиот веќе го спомнавме – да користиме Flash меморија за критичните податоци. Другите два метода слични и кога ќе детектират пад на напонот, веднаш го го стават микроконтролерот во безбедна состојба. Ова често се нарекува „brown out protection“ (заштита од црнило). Надворешно коло го детектира падот на напонот и се додека не се „опорави“ напонот тој носи низок напон на reset пинот кој ефективно го исклучува чипот. Како алтернатива е да го стави микроконтролерот во режим на спиење, кој претставува режим за заштеда на енергијата, и има ефект на заштита на било какво декодирање или извршување на било каква инструкција – кој, се разбира, исклучува било какво „запишување“ во EEPROM-от. Исто така има и 128 бајтен SRAM (Static RAM) за привремено складирање на податоците и 32 8битни регистри за општа намена, кои два од нив можат во исто време да бидат поврзани со ALU (arithmetic and logic unit), кој е срцевината на „мозокот“ кај микроконтролерот.
188
Вовед во Микропроцесорите и Микроконтролерите
Clock (Такт) AT90S/LS2343 има внатрешен RC осцилатор кој работи на 1 MHz, 4 MHz или 10 MHz во зависност од тоа која верзија ја употребуваме. Ова е еден од ретките микро уреди кои не користат надворешен кристал кој може да се користи како натворешен тактен пулс. За овој надворешен тактен пулс потребен е еден пин, па оттаму имаме додатен пин кој може да го користиме како излез.
Interrupts (интерапти) Има само три интерапти, првиот, кој има највисок приоритет, е reset кој се активира со носење на низок напон на пинот 1, на power-on reset или сигнал од заштитникот. Следен е надворешно барање за интерапт, и последен, е пречекорување од тајмер/бројач колото.
Преглед на пиновите и пакување На слика 15.6 се прикажани пиновите и можеме да видиме дека на располагање е како 8пинско DIL (dual in line) пакување, кој има по две линии на пин, а за монтирање се користат пластични „крилца“ SOIC (small outline IC).
Слика 15.6 Преглед на пиновите за AT90S/LS2343
Пин 1 – Reset активен на ниско. Мора да биде на низок напон барем 50 ns. Пин 2 – Влез за надворешен такт или PortB 3. Пин 3 – PortB 4. Сите линии можат да носат 20 mA, па затоа способни се директно да снабдуваат со струја LED диоди. Со ова се мисли дека LED диодата или некој друг потрошувач е поврзан помеѓу позитевен Vcc напон и низок напон кој излегува од портата. Пин 4 – Заземјување. (Ground) Пин 5 – PortB 0 или MOSI. Во режимот на сериско програмирање, MOSI претставува сериски влез на податоци. Пин 6 – PortB 1 или MISO/INT0. Во режимот на сериско програмирање, MISO претставува сериски излез на податоци. Овој пин може исто така да има улога на надворешен интерапт, што го опишавме во претходниот пасус. Пин 7 – PortB 2 или SCK/T0. Во режимот на сериско програмирање, SCK претставува сериски влез за такт. Овој пин сто така може да ни овозможи влез за тајмер/бројач0 тактот. Пин 8 – Vcc. LS верзијата има потреба од позитивен напон кој се движи во граници од 2.7–6.0 V.
189
Вовед во Микропроцесорите и Микроконтролерите
Sleep mode (режим на спиење) Кога не се употебува микроконтролерот, тој може да ги исклучи некои од своите кола за да заштеди енергија. Sleep режимот е вграден во сите денешни микроконтролери и прави голема разлика кај целокупниот живот кај неконтинуираното користење на уредот т.е. трајноста му е поголема. Вака овозможувме единиците кои се запечатени во игралките и честитките да бидат активни со месеци или години. Idle-mode (неактивен режим) За да ви ги укажиме за продобивките ќе спомниме дека микроконтролерот во нормалното работење користи струја од 2.4 mA, но кога ќе се префрли во „idle/неактивниот“ режим, струјата се намалува до 0.5 mA. Тој ова го прави со стопирање на активноста на CPU-то, но дозволува сеуште да работат тајмерот/бројачот, заштитникот и интераптите. Со ова сме постигнале 80% намалување на потрошената енергија, но можеме да ја намалиме и уште повеќе инаку моите музички чорапи би престанале да свират многу одамна. Power-down modе (режим на исклучено напојување) Во овој режим, со работа продолжуваат да работат само надворешните интерапти и заштитникот (ако е овозможен) и струјата се намалува на помалки од 1 микроампер, што навистина импресивно намалување на потрошувачката. Микроконтролерот може да се разбуди од својот „сон“ само преку еден од следниве сигнали: надворешен reset, заштитникот (ако е овозможен) или INTO надворешниот интерапт.
PIC16F84A Ова е модерно развиен RISC дизајн и има многу особини кои се слични со AVR, кој претходно го разгледавме. AT90S/LS2343 го избравме како пример за многу мал и основен микроконтролер кој се наоѓа во многу производи. PIC16F84A од Microchip Technology е уред со „средни“ можности и е поголем и многу поспособен од AVR. Дијапазонот на PIC серијата започнува од едноставен 8 пински на 4 MHz микроконтролер, на ниво на AT90S/LS2343 што претходно го спомнавме, па се до 40 пински на 25 MHz уреди. Како што веќе спомнавме PIC16F84A е верзија со „средни“ можности кој е со 18 пински и што работи дури на 20 MHz. PIC микроконтролерите се дизајнирани за едноставна употреба и станаа многу популарни со нивниот прв чекор во светот на микроконтролерите. Microchip Technology нуди систем за развој на PIC микроконтролерите, PICSTARTTM, кој има многу прифатлива цена и има асемблер, компајлер, EPROM и EEPROM програматор, сите прирачници за хардверот, дури и еден примерок PIC за да си „играме“ со него. Треба да напомениме дека и другите компании имаат слични системи кои се компатибилни со PIC серијата и со други микроконтролери како што се AVR и 8051 сериите. Тој се покажа како лесна, без конкуренција, почетна точка за многу луѓе, и „PIC“ не е само нивниот прв избор, туку тој почнува да се користи како опште поим за било кој микроконтролер. 190
Вовед во Микропроцесорите и Микроконтролерите Општиот изглед на PIC16F84A е прикажан на слика 15.7.
Слика 15.7 PIC16F84A
Напојување DC напојувањето мора да остане во опсег од 2.0–5.5 V за тој да може да си работи „среќно“, иако верзиите слични на PIC16F84 можат да работат помеѓу 2.0 и 6.0 V.
Sleep mode (режим на спиење) За да ја намали тековната потрошувачка, PIC-от може да се стави во режим на спиење со употреба на софтверска инструкција. Снабдената струја многу зависи од фреквенцијата и нормално се движи од 1 до 20 mA, а кога ќе го ставиме во режим на спиење потрошувачката се намалува на приближно 1 µА. За да се добие најниска струја при режим на спиење, треба сите I/O пинови да се држат на VDD или VSS, да ги оневозможиме сите надворешни тактови (clock) и да го држиме master clear пинот во состојба на логичко високо ниво – не во состојба на reset. Целта на сето ова е да се заштитиме од билокакво варирање на напонот. Ако го направиме ова, струјат ќе биде многу мала, освен во моментот на префрлување што предизвикува скок на струјата, па што поголема фреквенција, скокот на струјата ќе биде поголем.
191
Вовед во Микропроцесорите и Микроконтролерите Микропроцесорот ќе се разбуди ако: ако се појави reset од носење на напон на логичко ниско ниво на MCLR пинот, „разбодувачки“ пулс може да пристигне и од единицата заштитник (ако е овозможена) или „EEPROM write comlete“ сигнал.
Меморија Како и обично, имаме два блока на меморија. Едниот е меморија за програмата, а другиот за податоците. За максимална брзина, и две си имаат посебна магистрала, со што можеме да пристапиме до двете мемории во еден такт. Program memory (меморија за програмата) Меморијата за програмата е сместена во flash меморија која е организирана како 1024 14. Сите инструкции кај PIC16 серијата користат 14 битни инструкции. Reset векторот покажува на адреса 0000Н, а интерапт векторот на 0004Н, па за да ги запишеме нашите програми достапни ни се адресните локации од 0005Н до 03FFН. Data memory (меморија за податоци) Просторот за податоци е поделен на два дела, FSR (file select register, регистер за селектирање на датотека) и GP (general purpose registers, регистри за опште намена), прикажани на слика 15.8.
Слика 15.8 Мапа на датотека во регистерот
192
Вовед во Микропроцесорите и Микроконтролерите
SFR (special function register, регистер за специјална функција) Овој регистер ја контролира работата на CPU-то, и вклучува работи како што се влезните и излезните порти, EEPROM адресите и податоците, тајмерот, програмскиот бројач и слични вакви работи. Сите регистерски датотеки се 8 битни широки и подредени во две банки наречени bank 0 и bank 1. Треба да му дадеме инструкции на микроконтролерот која банка да ја користи и тоа го постигнуваме со специјална инструкција која ни дава пристап до одредени page 1 registers. Пристапите до нив се прикажани на слика 15.8. Microchip Technology има во план да ги отстрани OPTION и двата TRIS регистери и наместо нив да се користи STATUS регистер. Ова нема влијание врз употребата на овој чип, но не осигурива дека нема да бидат потребни никакви модификации на софтверот при некакво идно надоградување. I/O (input/output) ports, (влезно/излезни порти) Сите излези можат да бидат „извор“ или пак да „излеваат“ 25 mA и затоа можат да напојуваат значајни надворешни кола без да бидат потребни дополнителни засилувачи. „Излевањето“ е оптоварување помеѓу позитивниот Vcc и нискиот напон од излезот на портата, и изворот за напојување на колата се обезбедува кога истото коло го поврзиме со излезниот пин и заземјувањето. PortA и TRISA регистри PortA е 5 битна широка двонасочна порта, и секоја линија посебно се контролира, па така некои лини можат да ни бидат влезови, а останатите излези. Изборот за влез и излез се прави со ставање на 0 (излез) или 1 (влаз) во соодветниот бит во регистерот за насока на податоците, TRISA. Заедничко за сите уреди е тоа што, кога прв пат ќе се уклучи, тогаш портата е поставена како влезна. Ова ни претставува заштитна опција, од ризикот при вклучување да не се испратат некои случајни информации до она што е приклучено.
PortB и TRISB регистри PortB е 8 битна широка двонасочна порта, каде секоја линија посебно се контролира преку употреба на TRISB, исто како кај PortA. Секој пин од PortB има слаб внатрешен „додаток“ кој може да се уклучуваат и исклучуваат од опционен регистер, RBPU. Овие „додатоци“ се оневозможуваат кога портата се користи како излезна и исто така кога се вклучува микропроцесорот. Секој од пиновите RB4–RB7 ако се конфигурирани како влезови имаат функција interrupt-onchange кои може да биде многу корисна. Ако еден или повеќе од овие пинови ја сменат својата логичка состојба, ако се користат за читање, тоа предизвикува промена за интерапт кај RB портата. Овој интерапт може да се искористи за да го рабуди микроконтролерот од „sleep“ режимот. 193
Вовед во Микропроцесорите и Микроконтролерите Status register, (Статус регистер) Овој регистер е многу сличен со оној што го сретнавме во Z80 во Глава 8. Битовите се: Бит 0 е C (carry/borrow) бит. 1 = го препишува MSB (најзначајниот бит) од резултатот, во спротивно се брише на нула. За „borrow“ вредностите се обратни. Одземањето се одвива со употреба на методот со вториот комплемент, оној што го сретнавме во Глава 4. Бит 1 ни ја прикажува carry ситуацијата која што се појавува на 4-тиот бит на резултатот. Ова исто така се нарекува и half-carry бит. Бит 2 е знаменце за нула. Се поставува на ЕДЕН кога резултатот од последната аритметика или логичката операција е НУЛА. Бидете претпазливи да не го прочитате погрешно ова. Бит 3 се става на 0 кога се стартува SLEEP инструкцијата. Вит 4 се става на 0 кога ќе заврши тајмерот заштитник (watchdog) со броењето. Бит 5 се користи за селекција на една од двете мемориски банки. Тој се поставува на 0 кога сакаме да пристапиме до Bank 0, а се поставува 1 ако сакаме да пристапиме до Bank 1. Бит 6 и бит 7 – не се употребуваат. Тие ќе се употребуваат во иднина, па затоа ќе ги програмирама да бидат 0, така што ќе обезбедиме идна компатибилност. Ова ќе ни заштеди многу време ако сакаме нашата програма да ја користиме во поновите верзии.
Option register (опционен регистер) Како што ни кажува името, тој ни нуди серија на опции (избори). Еден пример е контрола на prescaler-от. Prescaler (регистер за предимензионирање) Две функции се засегнати од prescaler-от, а тоа се, TMR0 (тајмер нула) и тајмерот заштитник. Секој од овие кола ни дава излезен пулс кога ќе се заврши броењето и започнуваат повторно од нула. Кај тајмерот заштитник, временскиот интервал е 18 ms, и ако ни е потребен подолг врменски интервал, имаме три алтернативи. Едноставно можеме да го исклучиме „заштитникот“, но, се разбира, тогаш ги губиме придобивките од тајмерот заштитник, а тоа е кога микроконтролерот ќе се „зароби“ во јамка. Едноставен начин е ако во софтверскиот код од програмата ставиме инструкција CLRWDT (clear watchdog timer) при секое завшување на броењето, со што ќе го ресетираме тајмерот за уште едни 18 ms, и ова можеме да го повторуваме толку пати колку што ни е потребно. Последно, можеме да го користиме prescaler-от за да ја намалиме фреквенцијата на влезните пулсеви и оттаму да го зголемиме времето за кое ќе ни генерира излезен сигнал. Кај prescaler-от 3-ти бита 0, 1 и 2 т.е. PS2:PS0 (prescaler битови за селекција на брзината) и тие ни овозможуваат осум алтернативи за брзината на пуслевите кои ќе ги користат тајмерот заштитник и TMR0. Со поставување на трите бита на 000, тгаош имаме тактен сигнал кој е
194
Вовед во Микропроцесорите и Микроконтролерите еднаков со надворешниот сигнал за такт или осцилаторот во чипот. Ако ги смениме во 001 тогаш ќе ја преполовиме фреквенцијата (т.е. ќе го дуплираме времето). 010 ќе ја намали фреквенцијата за една четвтина од оригиналната, и како ова броење се зголемува, тогаш фреквенцијата ќе се преполовува секој пат се додека не сигнеме да максималната вредност 111 со што ќе го зголемиме времето на „заштитникот“ за 128 пати. Како што е случај со TMR0, кое е поделен на две вградени кола, тогаш ако за битовите имаме поставеност од 000, ќе добиеме половина од фреквенцијата и тогаш максимумот 111 ќе ни ја намали фреквенцијата за 256 пати. Бит 3 PSA (prescaler assignment bit) – кај повеќето PICs, prescaler-от може да се примени врз TMR0 тајмерот или пак врз заштитник тајмерот, но не и врз двата, па така овој извор го правиме преку опциониот регистер. Бит 3 од опциониот регистер го поставуваме на 0 за да го употребиме предимензионирањето (prescaler-от) врз TMR0, а 1 за да употребиме врз заштитник тајмерот (watchdog). Останатите битови Бит 4 – T0SE (TMR0 source edge select). Со овој бит го контролирме зголемувањето на тајмерот при која ивица да реагира, ако е „0“ тогаш броењето се врши при растечка ивица, а ако е „1“ тогаш при опаѓачка ивица. Бит 5 – T0CS (TMR0 clock source select). Со ова избираме од каде да ни биде изворот на пулсовите. Ако изборот ни е „0“ тогаш сме одлучиле да го користиме внатрешниот такт кој доаѓа од CLKOUT пинот, а ако е „1“ тогаш броењето се врши со такт од RA4/T0CKI (timer zero clock input). Оваа опција ни овозможува пулсовите на тактот да бидат генерирани од било каков надворешен извор, на пример од детектор на конзерви на подвижна лента или пак од вртежи на некој мотор. Бит 6 – INTEDG (interrupt edge select). Ова е сличен со бит 4, но за разлика од него тука го контролираме моментот кога се препознава интерпт сигнал од RB0/INT пинот. За „0“ ја користиме опаѓачката ивица на напонот, а за „1“ растечката ивица. Бит 7 RBPU (PortB pull-up enable). Со овој бит ги контролираме додатоците „pull-ups“ на PORTB излезот. Ако имаме „0“ тогаш за секоја линија посебно од PortB имаме додаток (pull-up) кој по потреба може да се вклучи или исклучи. Ако имаме „1“ тогаш сите се исклучени. Pull-up колото (колото за додаток) е прикажано на слика 15.9.
Слика 15.9 Коло за додаток (pull-up circuit)
195
Вовед во Микропроцесорите и Микроконтролерите Кога прекинувачот е затворен со поставување „0“ на овој пин, тогаш тој го поврзува излезот со позитивно напојување преку граничен отпорник на струјата. Ова не осигурува дека при отсуство на било какви влезни податоци на портата, ќе го носиме во позитивна состојба, со што нема никогаш да ни залута со носење на непредвидливи влезови. Ако се ипотребува поголема вредност на отпорникот, тогаш влезниот напон полесно ќе го спушти напонот, и ова се нарекува како „слаб“ додаток (pull-up). Така, со намалување на отпорникот ќе го одредиме влезот на портата да остане висока вредност, и ова се наведува како „силен“ додаток (pull-up). PCL (program counter low) PC ни претставива програмски бројач (program counter) кој води сметка која инструкција да се изврши. Тој е 13 битен регистер, кој е поделен на PCL за долниот бајт и PCH за горниот бајт. Неговото однесување е заедничко со сите други микроконтролери и микорпорцесори какви што ги опишавме во Глава 8. Stack (стек) Овој регистер ги чува адресите кои се јавуваат при интерапти. Зачувува дури до осум 13 битни адреси. Повторно, повеќе детали има во Глава 8. Register 6-1: PIC16F84A configuration word Ова е специјален регистер кој всушност е мемориската локација 2007Н до кој може да се пристапи само при програмирањето. Непрограмираните пинови се читаат како „1“. Тој е 13 битен збор (word) кој ги има следниве својства: Битовите од 13–4, се користат за заштита на програмскиот код, дали да може да се чита после завршувањето на програмирањето. 1 = без заштита, 0 = цела програмска меморија е кодирана. Бит 3, овозможувач на тајмер при стартување. Ова ни овозможува номинално доцнење од 72 ms, при прво вклучување на микроконтролерот за да дозволиме да се стабилизира напојувањето. Доцнењето може да се активира ако ставиме во бит 3 вредност „0“, и нема да имаме доцнење ако е = „1“. Бит 2 – со овој бит го контролираме овозможувањето на watchdog тајмерот (заштитник), оневозможен е со „0“, е овозможен е со „1“. Битови 1–0 се користат за селкција на осцилатор. 00 = LP осцилатор 01 = HS осцилатор 10 = XT осцилатор 11 = RC осцилатор
Осцилатори На слика 15.10 се прикажани некои кристални или керамички резонатори, и осцилаторите се поделени во фреквентни групи како:
196
Вовед во Микропроцесорите и Микроконтролерите LP low power crystals (кристали со ниска моќ) 32 kHz – 200 kHz. XT crystal/ceramic resonator 100 kHz – 4 MHz. HS high speed crystal/ceramic resonator 4 MHz – 20 MHz. RC resistor/capacitor (отпорник/кондензатор)
Слика 15.10 Опции на осцилатори
Забелешка за керамичките резонатори Овие се како алтернативи за кристали употребени како освилатори. Општо тие се полесни, повеќе отпорни на потреси и обично тие се нешто помали и поефтини. Недостаток е тоа што тие немаат совршена фреквентна прецисност или стабилност, и со голема почит се вбројуваат помеѓу RC мрежите и кварцните кристали.
Резиме за интераптите PIC16F84A има четири извори на интерапти: (i) (ii) (iii) (iv)
Надворешен интерапт донесен на RB0/INT пинот. TMR0 пречекорување. Детектор на промена на пиновите RB7–RB4 од PortB. Интерапт при завршување на запис на податок во EEPROM. Овој се користи само кога ставаме нови програми во EEPROM-от. 197
Вовед во Микропроцесорите и Микроконтролерите Квиз 15 Во секој случај, одбери го најдобриот одговор. 1
2
3
4
5
8 битен микроконтролер има: a. 8 битна податочна магистрала. b. Осум порти. c. 8 битна адресна магистрала. d. Осум внатрешни регистри. Во споредба со Pentium 4, микроконтролерот: a. Е побрз. b. Троши помалку струја. c. Е покомплексен. d. Е поголем. Заштитник (watchdog) колото не заштитува: a. Од оштетување при ексесно зголемување на напојувањето. b. Пречекорува во тајмер/бројач колата. c. Провалници. d. Од трошење на енергија додека микроконтролерот не се користи. НЕ е од суштинско значење микроконтролерите да имат: a. Регистри. b. Ресет пин. c. Малку меморија. d. Кристал. Значењето на терминот „ISR“ е: a. Immediate service register. b. Internal system reset. c. Interrupt service routine. d. Instruction set register.
198
Вовед во Микропроцесорите и Микроконтролерите
16 Употреба на PIC микроконтролер во реален проект Изборот на PIC микроконтролер и многу погоден за почеток во оваа област, иако, како што видовме дека постои огромни области во кои се преклопуваат микропроцесорите и другите дизајни на микроконтролерите. Една погодност, е тоа што Microchip Technology го превземаа, многу сериозно, RISC концептот, кој има само 35 инструкции, и од овие се потребни само неколку за да се напише корисна програма. Сите движења на податоците се базирана врз еден регистер наречен „W“ (working), и има скоро иста функција како акумулаторот во првите процесори, како на пример 6502.
Да започнеме За да програмираме PIC, потребно ни е да имаме копија од софтверските инструкции и повеќе детали за распоредот на регистрите. Не можеме да го скриеме фактот дека кога првпат сретнавме микроконтролер, информациите за него беа во огромен обем – не само квантитативно, туку тие и изгледаа многу комплексни. Ова е така иако дизајнерите вложуваа многу напор да го направат што е можно поедноставно. Многу е слично со тоа кога прв пат ќе се сретнеме со некој нов странски јазик, кој навистина – и справувањето со него е на многу сличен начин, дел по дел.
Има четири златни правила кои можат да ни помогнат: 1 2 3 4
Не плашете се! Со тек на време, ќе ни доаѓа да оставиме се и да си најдеме нешто полесно за работа. Започни со нешто многу едноставно – чекор по чекор. Бидете подготвени на тоа дека на почетокот ќе ви треба многу време. Кога ќе се почувствувате исцрпени и очајни, запомнете дека и секој друг го почувствувал истото. Искрено, тоа ќе се подобри.
Хардвер Да го поедноставам ова, треба да купиме микроконтролер и да го поврзиме за да можеме да го програмираме. Уредот кој што ќе го користиме е PIC16F84A-04/P. Прегледот на пиновите е прикажан на слика 16.1. Бројот PIC16F84A е типот на микроконтролерот. 04 ни кажува дека максималната фреквенција му е 4 MHz, а /Р ни кажува дека е сместен во стандардна пластично (Plastic) 199
Вовед во Микропроцесорите и Микроконтролерите пакување. Нема минимална работна фреквенција, и колку побавно работи, толку помалку троши енергија.
Слика 16.1
На слика 16.2 е прикажано најосновно коло, во кое е вклучено само напојување на чипот и позитивно напојување за да се спречи MCLR (master clear) од ненадејно ресетирање на PIC-от во текот на програмата. Освен ако тие не се врзани за одредена вредност, тогаш сите неповрзани влезови ќе варираат и може да предизвикат случајно префрлување. Потребен ни е тактен сигнал и наједноставниот и најефтиниот е едноставна RC комбинација. Отпорникот треба да биде помеѓу 5 kΩ и 100 kΩ, а кондензаторот треба да биде поголем од 20 pF. Одбраните вредности за ова коло не се внимателно одбрани и не се критични. Во пракса, тешко е да се предвиди работната фреквенција кај RC комбинација. Ако ни е потребна одредена фреквенција, подобро е да користиме променлив отпорник за да можеме да ја нагодиме посакуваната фреквенција.
Слика 16.2
Подоцна, откога ќе ја напишиме програмата мора да „му кажеме“ на асемблерот, кој тактен сигнал ќе го користиме. Во нашата програма PIC-от ќе очекува тоа да биде RC осцилатор. Оваа информација, како алтернатива, можеме да ја наведиме во програмата. Тоа е наш избор. Но е нешто полесно тоа да го сториме во фазата на асемблирање, но во секој случај мора да го направиме тоа.
200
Вовед во Микропроцесорите и Микроконтролерите
Софтвер Има три важни информации кои треба да ги знаеме пред да ги употребиме регистрите. Прво, треба да ги знаеме имињата и адресите на датотеките, како што видовме во датотека на регистерската мапа на слика 15.8. Вториот чекор е да ја знаеме функцијата на секој бит од секој регистер, ова го има во Додаток А, и конечно, објаснувањето на овие функции можеме да ги најдеме во Додаток Б. Сите овие податоци изгледаат застрашувачки, но треба да запомниме дека едновремено користиме само еден бит, па така може да ги игнорираме останатите. Сите PICs и навистина сите микропроцесори и микроконтролери користат бинарни кодови и ништо друго. За да си го поедноставиме животот, ние користиме асемблерски јазик или некој друг јазик на повисоко ниво. За да можеме да ги употребиме овие јазици, потребна ни е програма која може да ги конвертира во бинарен код. За асемблерски јазик, потребната програма за тоа се нарекува асемблер (assembler), а за јазици на повисоко ниво, истата работа се прави со компајлер (compiler). Асемблер-от е дел од PICSTART PLUS развојниот систем, но постојат и други асемблери со кои можеме да обработиме код за сите PICs контролери. Кодот кој го пишуваме како влез во асемблерот се нарекува „изворен код“, „source code“, а кодот кој го добиваме од асемблерот се нарекува „објектен код“, „object code“. Објектниот код навистина е бинарен, но за да ни е полесен за разбирање, обично на екран се прикажува во хексадецимален формат.
Важна забелешка Кога ја пишуваме програмата не смееме да оставаме никакви празни места во инструкцијата или во податоците.
Чекори на програмирање Цел на нашата прва програма Сакаме да направиме нешто навистина едноставно, но тоа да не биде нешто што ќе се случи случајно. Ќе ги конфигурираме сите излези на PortB, и потоа ќе направиме излезен сигнал кој постојано се off, on, off, on, off, on, off, on. Така ќе можеме да поврзиме серија на LED диоди на излезните пинови, кои наизменично ќе се вклучуваат и исклучуваат во зависност од излезниот сигнал. 1 Ќе започниме со селктирање на Bank 1 од датотеката на регистерската мапа. За да го сториме ова, треба да „разговараме“ со статусниот регистер, па со консултација на слика 15.8, забележуваме дека статусниот регистер е датотека 03. Од нашиот поглед на статусниот регистер во Глава 15, видовме дека бит 5 е RP0 кој ни го контролира селектирањето на Bank0 или Bank1. Првата линија од нашата програма мора да го постави бит 5 од регистерот 3. Програмта започнува: BSF
3,5
; Постави го бит 5 од регистерот 3 за да ја селектираме Bank 1 201
Вовед во Микропроцесорите и Микроконтролерите Овде вреди да спомниме дека сè што ќе се напише после точка запирка е само белешка за нас и е игнорирано од асемблерската програма. Ова се нарекува поле за коментар. Секогаш вреди да го користиме ова поле за да објасниме што прави програмата, и честопати ова ни зачувува драгоцено време да запомниме што сме сакале да направиме при првото пишување на програмата. Ова може да се најде и во поголем проблем, ако некој друг ја напише програмата и се разболе и не остават нас, ние да откриме зошто не работи програмата. 2 Сега сакаме да ја прилагодиме PortB да работи како излез. За ова е потребно да ставиме 0 на секој контролен бит од регистерот за движење на податоците, како што гледаме на слика 15.8, тоа е TRISB и е регистер број 86. За да го сториме ова, треба да го избришиме W регистерот со употреба на CLRW инструкцијата, и потоа да ја копираме оваа нула во регистерот 86. За ова се потребни две додатни инструкции, па така нашата програма да сега ќе биде: BSF CLRW MOVWF
3,5 86
; Постави го бит 5 од регистерот 3 за да ја селектираме Bank 1 ; става нула во регистер W ; ја копира нулата во регистер 86 кој е регистер за движење ; на податоците за PortB
3 Значи за сега ја средивме насоката на движење на податоците, и можеме да го внесиме суштинскиот податок. Сега ќе го исчистиме бит 5 од регистерот 3 за да овозможиме пристап до Bank0. Сега можеме да го ставиме нашиот податок во W регистерот. Но кој е тој податок? Ако претпоставиме дека LED диодите се поврзани помеѓу излезите на портата и напон од нула волти, па така напонот кој одговара на секвенцата off, on, off, on, off, on, off, on ќе биде 0V, +5V, 0V, +5V, 0V, +5V, 0V, +5V, а податокот ќе биде 0, 1, 0, 1, 0, 1, 0, 1. Ако го запишеме ова како бинарен број ќе добиеме B’01010101’ или хексадецмалниот број ни е 55 кој е малку полесен за читање. Еднаш кога 55Н ќе биде во W регистерот, можеме да го искористиме кодот MOVWF за да го копираме во регистер 06, кој на слика 15.8 се гледа дека е податочен регистер на PortB. Програмата сега е: BSF CLRW MOVWF
3,5
BCF MOVLW MOVWF
3,5 55 06
86
; Постави го бит 5 од регистерот 3 за да ја селектираме Bank 1 ; става нула во регистер W ; ја копира нулата во регистер 86 кој е регистер за движење ; на податоците за PortB ; го брише бит 5 од регистер 3 ; ова е излезниот податок кој ќе ни даде секвенца од on, off ; ова го копира податокот во PortB
4 Како што и воопшто е, микроконтролерот го извршува секој чекор по еднаш и тогаш застанува. Овде имаме проблем бидејќи за да се извршат овие интрукции потребно е неколку микросекунди – секако ова е премногу брзо за да го видиме ова, дали точната секвенца на LED диоди свети. Треба да го ангажираме микроконтролерот да работи нешто што ќе ги задржи LED диодите да работат, и нашиот избор овде е континуирано да го освежуваме излезот од портата. Погледнете ја нашата нова програма: BSF CLRW
3,5
; Постави го бит 5 од регистерот 3 за да ја селектираме Bank 1 ; става нула во регистер W 202
Вовед во Микропроцесорите и Микроконтролерите
again
MOVWF
86
BCF MOVLW MOVWF GOTO
3,5 55 06 again
; ја копира нулата во регистер 86 кој е регистер за движење ; на податоците за PortB ; го брише бит 5 од регистер 3 ; ова е излезниот податок кој ќе ни даде секвенца од on, off ; ова го копира податокот во PortB ; оваа линија го присилува микроконтролерот да се врати ; на претходната линија
Зборчињата „again“ се нарекуваат лабели и асемблерската програма забележува дека двете зборчиња се идентични и ги заменува со точната адреса. Всушност го употребивме зборот „again“ за да има некоја смисла кој ќе ни помогне да ја разбереме програмата, асемблерот ќе го прифати и зборот „asdf“ или било што, што нас ќе нè направи посреќнi. Некои асемблери не дозволуваат да се употребуваат некои имиња, на пример, може да не дозволи да почниме со бројка, или некој одреден збор или симбол. 5 На крај од програмата, треба да ја ставиме инструкцијата END за да „му кажеме“ на асеблерот да застане. Ова се нарекува „асемблерска директива“ и тука е за да и укаже на асемблерската програма дека има стигнато до крајот на нашата програма. Директивите не се инструкции за микроконтролерот и не се конвертираат во машински код. 6 На почетокот од програмата може да ја користиме директивата ORG што има значење „origin (почеток)“ и ја дава стартната адреса на асемблирараната програма. И ова го додадовме во нашата конечна програма. Ако не го направиме ова, асемблерот ќе претпостави дека тоа е адресата нула, па во нашиот случај нема да направи некоја разлика ако ја додадеме или ја испуштиме оваа директива. Кога се ресетира PIC-от, тој секогаш оди на адреса 000, па ако сакаме програмата да започнува од некоја друга адреса треба да ставиме GOTO инструкција во адресата 000 за да му кажеме на микроконтролерот од каде да започне. Запомнете дека ORG е инструкција само за асемблерот која му кажува од каде да почне да ја запишува програмата – PIC-от не знае ништо за ова бидејќи директивите не се конвертираат во програмски код.
Па така нашата финална програма е:
again
ORG BSF CLRW MOVWF
000 3,5
BCF MOVLW MOVWF GOTO
3,5 55 06 again
END
86
; Програмата почнува на адреса 000 ; Постави го бит 5 од регистерот 3 за да ја селектираме Bank 1 ; става нула во регистер W ; ја копира нулата во регистер 86 кој е регистер за движење ; на податоците за PortB ; го брише бит 5 од регистер 3 ; ова е излезниот податок кој ќе ни даде секвенца од on, off ; ова го копира податокот во PortB ; оваа линија го присилува микроконтролерот да се врати ; на претходната линија ; крај на нашиот код што треба да се асемблира
Забележете, како програмата е запишана во колони или „полиња“. Потребно е да се користат соодветните полиња бидејќи тоа е показател за асемблерот што се тие. Запомнете да користите точка запирка за да почнете забелешки, што сакаме да ги игнорира асемблерот. 203
Вовед во Микропроцесорите и Микроконтролерите
Поврзување на LED диодите За да биде појасна сликата 16.2, само една LED диода е прикажана како се поврзува, а всушност треба по една LED диода и отпорник да се поврзат за сите пинови од 7–13. LED диодите ги има во различни бои и големини, и катодата треба да се поврзи за помал позитивен напон од анодата. Катодата, во основа, ја препознаваме или по пократкиот конектор или на таа страна од телото на диодата е зарамнето.
Вредности на компонентите Гледајќи ги податоците за стандардна црвена LED диода, кога светат типичниот напон (Vf) низ нив е 2 V со максимална струја (If) од 20 mA. Малото ‘f’ стои за „forward, напред“. Светлината се намалува (изгубува) со намалување на струјата под својата максимална вредност, и не е многу добро, но е сосема разумно ако LED диодите работат, да кажеме со 10 mA. За да ја ограничиме струјата, користиме отпорник кој сериски го поврзуваме. Сега, ако напојувањето на микроконтролерот е 5 волти, околу 0.7 волти се „губат“ во PIC-от и LED диодата користи 2 волти, тогаш серискиот отпорник мора да „ги искористи“ останатите 2.3 волти. Вредноста на отпорникот ќе ја добиеме преку T
U V
.
WX 230 Ω. Ако се
сомневате можеме да започниме со 470 Ω и да видиме како тоа работи – обично ова е безбедна вредност за сите ситуации.
Уште лабели Употребата на лабелите не само што ни ја прави програмта почитлива, туку ни овозможува полесно да ја модифицираме. На пример, ако ја ставиме вистинската адреса наместо лабела и потоа ја модифицираме програмата со додавање на додатна инструкција, тогаш вистинските адреси ќе ни се разместат за да обезбеди место за новата инструкција, со што нашата стара адреса станува несоодветна. Програмата нема да работи и може да ни одземи часови додека да увидиме што сме сториле. Има уште една корисна асемблерска директива, EQU, која е скратеница од equates (изедначува) или „is equal to (е еднакво на)“. Оваа директива можеме да ја употребиме за да ја направиме програмата почитлива со заменување на некои броеви со зборови. На пример, регистерот 86 е PortB Data Direction регистер, и програмата полесно ќе се чита ако овој број го замениме со некои име. Ова ќе го сториме со додавање на линијата: PortBDDR EQU 86 пред сите линии на програмата, и кога асемблерот ќе го сретне името PortBDDR ќе го замени со 86. Ова нема никакво влијание врз програмата, но ни го поедноставува животот. Ако додадиме уште неколку лабели, тогаш крајната програма може да се запише како: ;EQUATES PortBDDR
EQU
86
PortB
EQU
06
Status
EQU
03
; регистерот за насока на податоците на PortB ; е регистерот 86 ; податочниот регистер PortB ; е регистерот 06 ; Статусниот регистер (Status register) 204
Вовед во Микропроцесорите и Микроконтролерите
RP0 Data
EQU EQU BSF
05 55 Status,RP0
CLRW MOVWF PortBDDR BCF MOVLW again
Status,RP0 Data
MOVWF PortB GOTO again END
; е регистерот 03 ; Bank1 ја селектираме преку бит 5 ; податокот кој го користиме е 55Н ; Постави го бит 5 од регистерот 3 за да ја селектираме ; Bank 1 ; става нула во регистер W ; ја копира нулата во регистер 86 кој е регистер за ; движење на податоците за PortB ; го брише бит 5 од регистер 3 ; ова е излезниот податок кој ќе ни даде секвенца од ; on, off ; ова го копира податокот во PortB ; оваа линија го присилува микроконтролерот да се ; врати на претходната линија ; крај на нашиот код што треба да се асемблира
Со целосна употреба на лабелите, ја презапишавме нашата програма без употреба на било кој број воопшто. Ова е прашање на избор – сите лабели, неколку лабели или без лабели, како што сакаме ние.
Употреба на кристал Ова ни дава поголема прецизност на брзината на тактот, па така може да напишеме некоја програмата која ќе ја користиме за некоја реална цел, на пример ако сакаме да прикажеме секвенца која треба да се извршува со одредена брзина. За да се префрлиме да користиме кристал, треба да ги конфигурираме соодветните битови во PIC-от за да знае дека сега е контролиран од кристал наместо RC осцилатор. Ова најлесно се постигнува за време на асемблерскиот процес, т.е. со користење на асемблерската програма и со кликнување на „configuration bits“ да го избереме изворот за такт од понудените опции.
Слика 16.3 Такт (clock) контролиран со кристал
205
Вовед во Микропроцесорите и Микроконтролерите Двата кондензатори прикажани на слика 16.3 во колото за такт, секогаш се еднакви и прикажаните опсези се погодни за 200 kHz такт и тактови од 2 MHz и повеќе. Други препорачливи вреднсти се: за 32 KHz – 68/100 pF, за 100 KHz – 100/150 pF. Повисоки вредности во секој опсег резултира со повисока стабилност, но побавно време на стартување. Како plug-in замена на кристалот може да се користи и керамички резонатор.
Модификација на програмата Во последната програма ние го контролиравме напонот на секој излез од PortB. Со мали промени можеме да носиме било која комбинација на напони за да го контролираме било кои надворешно коло. Иако и првото коло имаше значајна можност за контрола, сега ние ќе ја прошириме оваа можност со броење на секвенцата на излезниот сигнал. Сите програми се направени врз грбот на други програми кои веќе претходно сме ги употребиле, со што си заштедуваме значајно време со чување на копии од нашите корисни програми. Ова убаво е демонстрирано во следниов пример. Програмата се состои од три чекори, од кои два веќе сме ги дизајнирале и тестирале, па знаеме дека работат. Ако новата програма не ни работи, не треба да почнуваме од почеток (од скици), знаеме дека две третини од нив се ОК. Ова е многу моќен метод на дизајнирање програми и достапни се цели библиотеки од програми, па така развојот на нови програми може да се сведе на спојување на веќе направени програмски делови. Кога правиме промени на претходна програма, многу важно е да ја зачуваме новата верзија под ново име, па така, дури и при катастрофа, да можеме да почнеме од почеток. Еве го делот кој што го „наследивме“ од претходната работа: ORG 000 BSF 3,5 CLRW MOVWF 86 BCF 3,5 MOVLW 55 MOVWF 06
; насока на податоците за PortB = излез ; PortB data direction = output
; PortB data set to a start value ; стартна вредност на податокот во PortB
Во оваа фаза можеме, се разбира, како стартна вредност за излез да ја поставиме било која вредност помеѓу 00Н и FFH, што бинарно е B’00000000’ и B’11111111’. Имаме само една нова инструкција за која треба да бидеме загрижени: INCF f,d. Оваа инструкција ја инкрементира или ја зголемува вредноста за селектираната датотека „f“ за 1, и новата вредност оди на место кое е зависно од „d“. Ако „d“ е 0, тогаш новата вредност се става во W регистерот, но ако е 1, тогаш новата ведност се враќа во оној регистер што се користи.
206
Вовед во Микропроцесорите и Микроконтролерите Податочниот регистер за PortB е регистерот 06, па така кодот INCF 06,1 ќе ја земе тековната ведност од податокот во PortB, ќе ја зголеми за 1 и резултатот ќе го врати во податочниот регистер за PortB, така во нашиот пример вредноста од 55 ќе се промени во 56 и излезните напони на пиновите ќе се сменат од 01010101 во 01010110. Ова е само единечно броење, но за да добиеме континуирано броење можеме да употребиме лабела и да ја натераме програмата да се врати назад и да го прави INCF трикот повторно и повторно. Кога ќе стигне до својата максимална вредност, тој ќе се „преврти“ на нула и ќе почне одново, па така процесот на броење може да биде континуиран. Програмата ќе ни биде: ORG 000 BSF 3,5 CLRW MOVWF 86 BCF 3,5 MOVLW 55 MOVWF 06 again
INCF goto
06,1 again
end
; насока на податоците за PortB = излез ; PortB data direction = output
; PortB data set to a start value ; стартна вредност на податокот во PortB ; go back and INCF again ; врати зе назад и изврши ја INCF повторно ; end of source code ; крај на изворниот код
Уште еден чекор Брзината со која се извршува броењето зависи од брзината со која се извршуваат инструкциите.
Забавување на работите Ако сакаме да ги забавиме работите, можеме да му додели нешто да работи микроконтролерот, само да го држиме зафатен. Има NOP инструкција, која апсолутно не работи ништо, но троши еден инструкциски циклус. Бидејќи не прави ништо, не е важно колку ќе имаме во програмата, или пак каде ќе ги користиме. За значајно доцнење ќе ни бидат потребни стотина, што претставува не елегантен начин за да си го решиме проблемот. Во последната измена на програмата, направивме бројач на PortB регистерот. За ова е потребно некое време, па така можеме овој трик да го употребиме за трошење време. PIC има 68 регистри за општо намена кои може да ги направиме да бројат за нас. Треба само да избериме еден од нив и да изброи до одредена вредност и потоа да се врати назад и да изброи +1 за PortB регистерот, и повторно да одиме да го „трошиме времето“. На слика 16.4, го наполнивме регистерот со број, на пример 30Н (48 декадно). Следната инструкција го намалува за 1 и ни дава 2FH (не 29!!!) и бидејќи одговорот не е нула, се вртиме во круг и повторно го намалуваме на 2EH и се така додека не стигнеме до нула, каде го напушта кругот (јамката) и ја извршува „инструкција 2“ прикажана на сликата. 207
Вовед во Микропроцесорите и Микроконтролерите
Слика 16.4 Користење на временска јамка
Инструкцијата што ќе ја користиме овој пат е DECFSZ f,d. Оваа инструкција е направена само за работа од ваков вид на броење. Го намалува одбраниот регистер и ако d = 0 резултатот оди во W регистерот, но ако е 1, тој ќе се врати во истиот регистер. За нашата цел, во нашиот код ќе ја вметнеме инструкцијата DECFSZ 20,1. Ова ќе ни ја намалува вредноста во регистерот 20, и резултатот ќе го враќа назад во регистер 20. Кога овој регистер стигне до нула, ќе ја пропушти следната инструкција, за да престане да се врти во јамката, и ќе оди на следната инструкција.
Побавно броење Уште еднаш, ова користи нешто од нашата претходна програма.
again
count
ORG BSF CLRW MOVWF BCF MOVLW MOVWF INCF MOVLW MOVWF DECFSZ goto goto end
000 3,5 86 3,5 55 06 06,1 30 20 20,1 count again
; насока на податоците за PortB = излезна
; стартна вредност на податокот во PortB ; стави во W 30Н ; стави го бројот 30Н во регистерот 20 ; намали ја вредноста во регистерот 20 ; намалувај се додека не стигнеш до нула ; врати се да ја заголемиш вредноста во PortB
За уште побавно броење на PortB, треба да го зголемиме бројот, од кој ќе броиме, во регистерот 20 на својата максимална вредност, која за овој микроконтролер кој што го употребуваме е 7FH или 127 декадно. 208
Вовед во Микропроцесорите и Микроконтролерите
Пресметување на доцнењето Почнувајќи од моментот кога се зголемува PortB: За MOVLW потребен е 1 такт. За MOVWF потребен е 1 такт. За DECFSZ потребен е 1 такт при нормално извршување, но за да излезе од јамката потребно е 2 такта. Бидејќи регистерот е наполнет со хексадецималниот број 30, кој е 48 декадно, тај ќе ја извршува инструкцијата со 1 такт 47 пати, и 2 такта за да излезе од јамката. Ова ни дава фкупно 49 такта. goto count ќе се изврши 48 пати и за секој пат е потебно 2 такта, што ни дава вкупно 96 такта. goto againt ќе се изврши само еднаш за да се врати кај PortB, и ова се уште 2 такта. Конечно, за INCF потребно е 1 такт за да ја зголеми вредноста на PortB. Вкупно: 1 + 1 + 49 + 96 + 2 + 1 = 150 такта. Претпоставувајќи дека фреквенцијата на кристалот е 32 kHz, за да ја добиеме фреквенцијата на извршување на инструкцијата треба да ја поделиме со 4, и тогаш доцнењето од 150 такта, ќе ни ја даде брзината на зголемување на вредноста на PortB, а тоа е околу 53 зголемувања за секунда. Броењето со PortB почнува, бинарно, од 0000 0000 до 1111 1111, и ќе заврши после 256, и одново ќе започне да брои после 256/53 или грубо 4.8 секунди. Ова доцнење можеме лесно да го зголемиме со додавање на NOP инструкции во јамката или со користење на подолга јамка.
Подолги доцнења Имаме три алтернативи 1 2
За мали промени, може да додадиме неколку NOP инструкции во јамката за да го зголемиме бројот на потребни такта. Нашето доцнење беше вградено во главната програма, но можеме да користиме потпрограма (subroutine). Потпрограма е секој блок од код, кој, може, сакаме да го користиме повеќепати. Во главната програма вметнуваме инструкција CALL проследена со лабела која ќе ни го означи блокот од код, па за нашата јамка за доцнење која ја нарековме „count“ ќе вметнеме инструкција „CALL count“ во секое време кога ќе сакаме нашата програма да предизвика доцнење. Кога „count“ јамката за доцнење ќе заврши, вметнуваме инструкција RETURN на крајот од блокот од кодот, со што микроконтролеро ќе се врати во главната програма.
Бенифициите од користење на потпрограмата е тоа што можеме да го стартуваме „count“ доцнењето двапати, само со вметнување на CALL count двапати во главната програма, и не треба повторно да ја пишуваме јамката за доцнење и да се плашиме дека нешто погрешно ќе напишеме и се ќе се распадне. Потпрограмата може да ни биде колку сакаме долга, и можеме да ја употребуваме колку што сакаме одноставно со додавање на CALL и RETURN инструкциите. Еве ја нашата претходна програма, но приметете како се користи „count“ јамката за доцнење како потпрограма. 209
Вовед во Микропроцесорите и Микроконтролерите count
DECFSZ goto RETURN
20,1 count
; намали ја вредноста во регистер 20 ; намалувак се додека не стигнеш до нула
ORG 000 BSF 3,5 CLRW MOVWF 86 ; насока на податоците за PortB = излезна BCF 3,5 MOVLW 55 MOVWF 06 ; стартна вредност на податокот во PortB again INCF 06,1 MOVLW 30 ; стави во W 30Н MOVWF 20 ; стави го бројот 30Н во регистерот 20 CALL count goto again ; врати се да ја заголемиш вредноста во PortB end Потпрограмата се нарекува count и има инструкција RETURN на крајот. Главната програма има инструкција CALL count што значи „оди и изврши ја потпрограмата која се вика count“. Тогаш може да напишеме: CALL count CALL count CALL count Во главната програма со што е лесен начин тројно да го зголемиме доцнењето. Може да направиме потпрограма која ќе ја наречеме „1second“ („1секунда“) и друга „0.1second“ („0.1секунда“). Па ако имаме потреба да вметнеме доцнење од 2.3 секунди, едноставно само ќе додадеме: CALL 1second CALL 1second CALL 0.1second CALL 0.1second CALL 0.1second Сите потпрограми ќе ни завршуваат со ист код RETURN, па како тие знаат каде да се вратат? Одговорот е серија од мемориски локации наречени стек (stack). Во него се чуваат сите адреси кога се појавило CALL, се испраќа релевантната адреса во стекот и при секое појавување на секвенца RETURN, адресите ќе се празнат од стекот во потребниот редослед. Стекот има firs-in last-out (FILO) (прв-влези последен-излези) организација. Повеќе за стекот види во Глава 8. Потпрограмата може да вклучува CALL (повик) до друга потпрограма. Овие се нарекуваат вгнездени потпрограми – PIC16F84A има место во стекот за осум return адреси – што е прилично малку за стандардите на микропроцесорите.
210
Вовед во Микропроцесорите и Микроконтролерите 3
Кај PIC повеќето инструкции се извршуваат во еден инструкциски такт кој е ¼ од брзината на осцилаторот, т.е. фреквенцијата. За да го промениме доцнењето, секогаш можеме да ја смениме фреквенцијата. Има две продобивки, помала фреквенција ја намалува потрошувачката, и нема долна граница за брзината за PIC, за разлика од некои уреди. Општо земено се употребуваат потпрограми, бидејќи често има други ограничувања во однос на брзината.
Квиз 16 Во секој случај, одбери го најдобриот одговор. 1
2
3
4
5
RETURN (врати): a. Се употребува само како дел од јамка за доцнење. b. Е билет за да можеш да се вратиш дома. c. Е асемблерска директива. d. Е инструкција која се наоѓа на крајот од потпрограмата. ORG: a. Никогаш не потребно бидејќи PIC секогаш започнува од адресата 0000. b. Е асемблерска директива. c. Е скратеница од организација. d. Е инструкциски код. Асемблерот конвертира: a. Декадно во хексадекадно. b. Главните кодови во потпрограми. c. Изворниот код во објектен код. d. Објектен код во бинарен код. При избор на тактно коло (clock circuit): a. Керамичкиот резонатор не е толку прецизен нути толку робусен (отпорен) како кристалот. b. RC колото работи четири пати побрзо од фреквенцијата на кристалот. c. Кристалот ни дава најпрецизна и најстабилна фреквенција. d. Се употебува RC коло и кристал за да се добие прецизност и отпорност. Кога користиме кристал со 4 MHz фреквенција, нормалното време на извршување е: a. 0.25 microseconds (микросекунди). b. 1 millisecond (милисекунда). c. 4 millisecond (милисекунда). d. 1 microseconds (микросекунди).
211
Вовед во Микропроцесорите и Микроконтролерите
17 Интерфејсинг Интерфејсинг е процес на поврзување на микропроцесорот со остантото коло и надворешните уреди. Дури и во наједноставниот компјутерски систем, имаме некој влезен уред, како тастатура. Па како, микропроцесорот знае дека сме притиснале тастер? Кога испраќаме текст до печатачот, како печатачот не известува дека е спремен за уште влезни податоци (текст)? Во микропроцесорски базиран систем за општа намен, ако прави нешто корисно, треба да има влезови и излези. Па затоа, надворешните уреди мора да комуницираат со микропроцесорот. Во некои случаеви, микропроцесорот ја зема работата во свои раце, и ги испраќа податоците како дел од неговата програма, но дури и во овој случај, нормално, дозволува да се помогне со надворешен уред. Ако микропроцесорски базиран систем се користи за затоплување на вода, лесно можеме да претпоставиме дека програмата ќе го вклучува напојувањето, и 10 минути ништо да не прави. Подобро би било да го искористиме микропроцесорот да ја затоплува водата и да чека сигнал од термостат, дека водата е затоплена до одредена температура. Овој сигнал од термостатот ќе пристигне до микропроцесорот преку интерапт пин.
Интерапти Со интераптите се запознаевме во Глава 8, кога ја разгледавме улогата на интерапт знаменцето во статусниот или flag регистерот, но сега ќе навлеземе малку подлабоко во системот. Сите микропроцесори има интерапти кои можат да се иницираат или од софтвер кој е стартуван во тоа време или од надворешно хардверско коло. Микропроцесорите се разликуваат во некои детали во нивниот одговор на хардверски интерапт и во бројот на различни интерапт пинови кои ги нудат. Деталите секогаш се запишани во техничките податоци кои што се доставуваат со уредот.
Сличностите се следни Има два основни типа на хардверски интерапти. Првиот е interrupt request (барање за интерапт) или IRQ (или INTR) пин. Ова му кажува на микропроцесорот да обрне малку внимание на уредот. Бидејќи ова е барање (request), а не е наредба (order), тогаш микропроцесорот слободно може да одговори „да“ или „не“, или пак „да, но не во овој момент – почекај додека не бидам спремен“. Ова не вклучува некаква интелигенција како дел од микропроцесорот – туку треба софтверот кој што е стартуван во тоа веме да му каже што да одговори. Во отсуство на инструкција, нормално, се прифаќа интераптот. Ако на одреден интерпат пин му се каже да не одговара на интерапти, тогаш велиме дека тој интерапт е „маскиран“ (masked). 212
Вовед во Микропроцесорите и Микроконтролерите Вториот тип се нарекува немаскиран (non-maskable) интерапт, кој е, незапирлива побарувачка за внимание, т.е. мора потврдно да се одговори. Ова секогаш ќе се зема со највисок приоритет. Типична употреба на ваков интерапт е кога имаме итно исклучување на системот при прекин на напојувањето. Програмата исто така може да поттикне интерапт со користење на софтверска инструкција како дел од програмата.
Што е хардверски интерапт сигнал? Ова е промена на напонот на интерапт пинот, која е генерирана од надворешниот уред. Потребната промена детално е дадена во техничките податоци, но има четири избори. Првите два избора е промена на нивото (јачината) на напонот. На пинот може да имаме +3.3 V или било која вредност што ни претставува „висок“ напон, и при пад на напонот на 0 V, тој го препознава интераптот. Ова го нарекуваме „ниско активен“, т.е. кога напонот на пинот се променува на ниско ниво тогаш се препознава интераптот. Алтернативно, тој може да биде на 0 V и да се активира со зголемување на напонот. Ова го нарекуваме „високо активен“.
Слика 17.1 Четири начини на сигнализирање интерапт
Алтернативниот пристап се постигнува со ненадејна, многу брза, промена на нивото. Од ниско на високо се нарекува „предна ивица“ или „растечка ивица“, а од високо на ниско се нарекува „задна ивица“ или „опаѓачка ивица“ (види слика 17.1, и погледнете ја сликата 6.4 за да ги видете алтернативните имиња). Кога еднаш ќе се активира интераптот, сигналот мора да се врати на својот нормален напон пред повторно да се активира. Влезот е маскиран, ако стартуваната програма го заштитува интерапт пинот, од прекинување на програмата, иако се појавило активно ниво на напонот за интерапт.
Сместување на неколку надворешни уреди Наједноставен и најбрз начин на поврзување на уредите со интераптите на микропроцсорот е секој уред да се поврзи за свој интерапт пин. Ова е ОК ако имаме доволно интерапт пинови. Малку микропроцесори имаат повеќе од два интерапт пинови, па така мора да поврзиме неколку уреди на еден ист пин. Кога ќе се појави интерапт, се активира програма наречена „first level interrupt handler“ т.е. FLIH. Функцијата на FLIH е да го идентификува уредот што го предизвикал интераптот и да ја 213
Вовед во Микропроцесорите и Микроконтролерите префрли контролата на „interrupt handler“ или „interrupt service routine“ („справуач со интерапти“ или „сервисна рутина за интерапти“) програма која што е запишана за да се справи со тој уред. Како знае кој уред бара помош? Има две можности, анкетирани (polling) инраптите и посочени (vectored) интерапти. Анкетирани интерапти (polling interrupts) Ова е бавен, но сигурен начин. Секој можен уред се испрашува со „дали си тоа ти?“ сигнал, се додека не се најде изворот на интераптот. Редот на испрашување е подреден според приоритет, па така најважнниот уред се испрашува прв. Посочени интерапти (vectored interrupts) Веднаш од кога ќе се појави интерапт, FLIH дава „кој е таму?“ сигнал, и потоа колото кој го пратил интераптот испраќа идентификационен сигнал на податочната магистрала. Овој сигнал, вообичаено е адреса со која се идентификува делот од програмата што треба да се изврши. Што ќе се случи ако се појави интерапт додаке се справуваме со претходниот интерапт? Повторно имаме избор. Може да го оневозможиме новиот интерапт се додека не заврши претходниот, и потоа да се справиме со новиот интерапт. Алтернативно, може да го провериме приоритетот на новиот аларм и да одлучиме според новите приоритети. Повисок приоритет, го става на чекање тековниот интерапт и неговата состојба ја запишува во стек, и се обработува новиот, а потоа се враќа назад и ја довршува работата што е внесена во стекот, т.е. си завршува со оригиналниот интерапт. Ако новиот интерапт е помалку важен, тој добива „почекај малку“ порака, се додека не заврши првиот интерапт. Кај микропроцесорски базиран систем, дизајнерот треба да одлучи за приоритетите и користењето на интераптите. Кај персоналните компјутери, интераптите се приоретизирани според брзината и важноста. Највисок приоритет е доделен на внатрешниот часовник, овој часовник ни го кажува времето – не е правоаголен такт кој ни ги синхронизира колата. Потоа, на ред, е тастатурата, па имаме две резерви за некакви други операции, потоа доаѓа сериската порта, хард дискот, дискетната единица и на крај печатачот.
Парност Ако влезете во преполна соба и кажете само „Хамбургери“ и ништо друго, повеќето ќе се обратат до своите соседи и ќе запрашаат „Што е ова?“, а некои само ќе стојат збунето. (некои дури може да не разберат убаво и да се почувствуват навредени.) Како форма на комуникација, ова не е многу ефикасно. Ако пробате со „Ручекот ќе содржи хамбургери“, сите ќе ја разберат твојата порака. Првиот обид беше многу ефикасен во однос на бројот на употребени зборови, но веројатно не е ефикасен за комуникација, бидејќи повеќето луѓе не разбраа што сакавме да кажеме. Во вториот обид, користевме четири збора за да бидеме сигурни дека сите ќе нè разберат. Ова се нарекува додавање „вишок“ (редудантност). Колку повеќе додаваме вишок (редудантност), толку поточна, и посигурна ќе биде пораката, но комуникациониот систем станува побавен и 214
Вовед во Микропроцесорите и Микроконтролерите помалку ефективен. Податоците кои се вратени од вселенските сонди користат многу високо ниво на редундантност, над 96%, што овозможува корекција на навистина измешаните сигнали, поради ниските нивоа на моќност кои се вклучени. Може да ја искористеме парноста за алармирање на можните појави на грешка при проток на податоците, а во некои случаеви и откривање и корегирање на грешките. Во својот наједноставен облик, зимаме група на битови кои се испраќаат, нормално се користат 4 или 8 бити, иако идејата е применлива и на други вредности. Во овој пример, ќе разгледаме група од 4 бити, на пример 1001. На крајот од преносот, додаваме додатен (екстра) бит на крајот, или 0 или 1, за да го направиме вкупниот број на единици (1) парен број. Во нашиот случај, имаме две 1-ци, па така бројот има парен број на 1-ци, па така додаваме нула. Податокот сега ќе биде 10010. На приемната страна, ако податокот е „осакатен“ и се добие 11010, и со брзо пребројување на единиците ќе видиме дека има непарен број на 1-ци, со што ни укажува дека се појавила грешка. Овој едноставен пристап може лесно да се измами, ако имаме две грешки, тогаш бројот на единици ќе биде парен и податокот ќе помине како точен. И, уште едно разочарување, ако се појави грешка, не сме во можност да кажеме кој бит е грешен за да го поправиме. Кога се користи овој систем, се испраќа сигнал за грешка на предавателот, кој побарува повторно да ја прати пораката, но ова претпоставува дека предавателот и приемникот се поврзани меѓу себе. Може да го измениме овој систем за да го направиме да може да врши ограничена автоматска корекција. Да претпоставиме дека имаме 16 битен податок кој треба да го испратиме. Чекор 1
Презапишете го податокот во квадратна форма 0 1 0 1
0 1 1 0
1 1 0 1
0 1 1 1
Чекор 2 Додади ги битовите за парност. На горната редица, го имаме бројот 0010 кој вклучува само една 1-ца. Во овој систем, кој го нарекуваме „парна“ парност, додаваме уште една 1-ца, ако е потребно да добиеме парен број на 1-ци во првата редица. Бидејќи имаме една 1-ца, додавеме уште една „1“ на крајот. Тоа сега ќе изгледа вака: 0 0 1 0 1 1 1 1 1 0 1 0 1 1 0 1 1 Горната редица, сега има парен број на 1-ци. Следната редица има четири 1-ци, што е парен број на 1-ци, па така нема потреба да додадеме уште една 1-ца. Па затоа додаваме 0: 0 1 0 1
0 1 1 0
1 1 0 1
0 1 1 1
1 0
215
Вовед во Микропроцесорите и Микроконтролерите Третата редица ќе ја комплетираме со „0“ бидејќи содржи парен број на „1-ци“ и последната редица има три „1-ци“ и треба да додадеме уште една 1-ца. Резултатот од ова е: 0 1 0 1
0 1 1 0
1 1 0 1
0 1 1 1
1 0 0 1
Чекор 3 Сега имаме пет колони, и треба во секоја да додадеме „1-ца“ на ист начин за да го направиме вкупниот број на „1-ци“ парен. Првите две и последната колона содржат две „1-ци“, па ќе додадеме нули. Третата и четвртата колона имаат по три „1-ци“, па така треба да додадеме уште по една „1“ во секоја колона. Резултатот е: 0 0 1 0 1 1 1 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 0 Забележете дека сега добивме вкупно 25 битови кои треба да се пренесат. Од овие 16 бити се податокот, а 9 бити се додадени за да се провери точноста на податокот. Па така, конечниот сериски пренос ќе биде 0010111110010101011100110. Ова значи дека 9 од 25 или 36% од преносот, всушност не е податок и ова го претставува вишокот т.е. редундантноста. Да видиме како ова работи. Ќе претпоставиме дека се појавила грешка, и еден од битовите се прима погрешно, па еве го приемниот податок: 0010111110010101001100110 Изгледот на податокот во матрица 5 5 е:
Чекор 1 0 1 0 1 0
Чекор 2
0 1 1 0 0
1 1 0 0 1
0 1 1 1 1
1 0 0 1 0
Проверка на парноста на секоја редица од матрицата.
Одлучивме секоја редица и колона да биде со парна парност. Првата редица има две 1-ци, ова е парно – ОК. Втората редица има четири 1-ци, ова е парно – ОК. Третата редица има две 1-ци, ова е парно – ОК. Четвртата редица има три 1-ци, ова е непарно – се појавила грешка. Последната редица има две 1-ци. Ова е парно – ОК. Сега знаеме дека еден од битовите во четвртата редица е грешно примен.
216
Вовед во Микропроцесорите и Микроконтролерите Чекор 3
Напревете го истото и со колоните.
Првата колона има две 1-ци, ова е парно – ОК. Втората колона има две 1-ци, ова е парно – ОК. Третата колона има три 1-ци, ова е непарно – во оваа колона има грешка. Четвртата колона има четири 1-ци, ова е парно – ОК. Последната колона има две 1-ци. Ова е парно – ОК. Чекор 4
Изолирај ја грешката и промени го податокот
Грешка се појави во третата колона и четвртата редица. Бидејќи се знае дека овде имаме грешка и бидејќи имаме избор само од 0 или 1, тогаш лесно можеме 0-та да ја промениме во 1 и да го поправиме податокот. 0 1 0 1 0
0 1 1 0 0
1 1 0 1 1
0 1 1 1 1
1 0 0 1 0
Во овој пример, одбравме да користиме парна парност, т.е. секоја редица и колона ја направивме да има парен број на 1-ци. Ова ќе работи сосема исто и ако користиме непарна парност, т.е. ако бројот на 1-ци го направиме непарен. Исто така ќе работи и ако ги броиме нулите наместо единиците. Ако се случи повеќе од една грешка, ќе не предупреди дека има грешка, но нема да бидеме во можност да ја поправиме. Ако пробате, ќе видите дека ќе имаме четири можни грешки за настанати две грешки т.е. девет за три грешки.
Пример Поправете го приемниот податок кој има една грешка. За да се овозможи автоматска корекција, употребена е непарна парност на 1-ци. Приемниот сигнал е: 1101001001111001010101101. Приказ на податокот во 5 5 матрица
Чекор 1 1 0 1 1 0 Чекор 2
1 1 1 0 1
0 0 1 1 1
1 0 0 0 0
0 1 0 1 1
Проверете ги колоните и редиците за непарен број на 1-ци 1 0 1 1 0
1 1 1 0 1
0 0 1 1 1
1 0 0 0 0
0 1 0 1 1
217
Вовед во Микропроцесорите и Микроконтролерите Чекор 3
Изолирај ја грешката 1 0 1 1 0
1 1 1 0 1
0 0 1 1 1
1 0 0 0 0
0 1 0 1 1
Чекор 4 Податокот каде што се сечат колоната и редицата е грешен. Па така едноставно ја променуваме 1-цата во 0. Чекор 5 Исфрлете ги битовите за парност за да го добиеме оригиналниот податок 1101000011101010
0110
Пренос на податоци Најосновен начин за да испратиме информација од едно место до друго, е едноставно да ги поврзиме со проводник и на едниот крај да носиме напон. Со варирање на напонот, можеме да испратиме различно ниво на напон, што може да ни биде дури и говор или музика. Ова се нарекуваат аналогни сигнали и имаат многу недостатоци. Главниот недостаток е ефектот од шум. Како што патува сигналот низ проводникот, тој ослабува и се вгнездува шум во него, од различни електро-магнетни сигнали и од вибрациите на молекулите во проводникот. Целокупниот ефект е што сигналот станува лош и ослабен. „Послаб“ бит не е проблем, можеме да го засилиме кога сакаме и да го доби во оригинална големина, но шумот претставува друг проблем. Електричниот шум се вградува во сигналот и може перманентно да го изобличи. Со засилувач ќе го засилиме и шумот и сигналот подеднакво. Немаме вакви проблеми со дигиталните сигнали, бидејќи знаеме дека сите имаат правоаголен облик, па така можеме да користиме засилувач кој ќе ги регенерира облиците на сигналот и притоа да го отфрли ефектот од шумот. Ако се соочиме со испраќање на некој аналоген сигнал, како што е говорот или музика, наша прва задача е да го конвертираме во дигитална форма.
Аналогно-дигитална конверзија (Analog to digital conversion, A to D, ADC, A-D) Оваа конверзија е неизбежна овие денови, каде конверзијата ја врши интегрирано коло, кое имаме повеќе различни дизајни. Можно е, но е тотално неекономично, да направиме наш сопствен ADC, па затоа тоа се прави со разгледување на каталозите и потоа го избираме најсоодветниот. Има неколку различни дизајни на ADC (аналогно-дигитален конвертер), кои се базираат на три основни различни пристапи.
218
Вовед во Микропроцесорите и Микроконтролерите
Flash converter Првиот дизајн е наречен flash конвертер или паралелен енкодер. Овде се користат кола наречени компаратори. Компараторот има два влеза, еден е аналогниот напон кој треба да се конвертира, а другиот е познат референтен напон. Се што бараме од компараторот е да ни одговори на едноставното прашање: „Дали аналогниот влезен напон е повисок или понизок од нашиот референтен напон?“ Тој ни одговара со промена на излезниот напон на логичка 1 (единица), ако е повисок, или логичка 0 (нула) ако е понизок. Тие се многу прецизни, и скоро се нема случено за да даде два различни напона за едно исто влезно напонско ниво. (види слика 17.2).
Слика 17.2 Компаратор кој се користи во flash ADC
Па како го користиме компараторот? Ако имаме три компаратори со поставени референтни напони 1 V, 2 V и 3 V, и ако донесеме влезен напон до сите од 2.5 V, првите два ќе ни дадат излезен напон на ниво 1, а последниот нема да се промени и ќе дава излез логичка 0. Логичките нивоа можат да се искористат да ни генерираат бинарен број кој ќе ни го претстави 2.5 V. Влезни напони од 2.4 V или 2.9 V, со користење на истите компаратори, ќе ни дадат ист резултат, со што ќе имаме ист излезен дигитален сигнал. Ваквите грешки се јавуваат во сите аналогно-дигитални конвертори. Можеме да ја намалиме големината на грешка со зголемување на бројот на компаратори, за да ни претставуваат повеќе нивоа. Реалните имаат помеѓу 16 и 1024 различни нивоа.
Рампа (ramp) генератори Ова е комбинација на бинарни бројачи кои едноставно бројат почнувајќи од нула до својата максимална вредност, можеби до 1024 како последниот тип. Како што се врши бинарното броење, рампа (ramp) напонот постојано се зголемува. Со користење на еден компаратор се споредува излезниот рампа напон со аналогниот напон кој треба да се конвертира. Токму кога рампа напонот го надмине влезниот напон, сигнал од компараторот го сопира бројачот. Тогаш излезот од бројачот е дигитален еквивалент на аналогниот сигнал (види слика 17.3).
Успешна апроксимација Ако употребуваме 3 битен дигитален сигнал за конверзија на аналоген напон помеѓу 0 V и 4 V, можеме да имаме комбинација од 3-те бита за да ни претставуваат 4 V, 2 V и 1 V. Еве како ќе одговори колото за влез од 3.5 V. 219
Вовед во Микропроцесорите и Микроконтролерите
Слика 17.3 ADC кој користи „рампа“ напон
Дигитите иницијално се поставуваат на 000. Се „вклучува“ битот од левата страна и добиваме 4V што ги споредуваме со влезот. Увидуваме дека влезот е помал од ова, па дигитот го враќаме на нула. Потоа пробуваме со следниот бит, т.е. 2V се споредуваат со влезот и се увидува дека е помалку од влезот и овој бит си останува вклучен. Дигиталниот сигнал сега е 010. Следно, го вклучуваме и последниот бит, т.е. додаваме уште 1 V, и резултатот е 3 V, кој го споредуваме со влезниот аналоген сигнал. Влезот од 3.5 V е поголем од тековната вредност од 3 V, па така и последниот бит е вклучен. Конечниот дигитален излез е 011. Колото ги испробува сите можни вредности се додека не го најде оној кој дава најблизок, но помал, резултат од влезниот сигнал. Исто како и претходно, колку повеќе битови користиме, толку е попрецизен резултатот. При избор на ADC кој што ќе сакаме да го користиме, треба да ги споредиме следниве критериуми.
Квантизациона грешка (quantization error) Во погорниот пример каде употребивме flash конвертор, можеме да видиме дека аналоген влез од 3.5 V ни дава ист излез како што ќе ни дадат вредности помеѓу нешто поголемо од 3 V и нешто помалу од 4 V. Оваа грешка кажува дека малите варијации во аналогниот влезен напон нема да се приметат, т.е. ќе исчезнат. Големината на оваа грешка е еднаква на растојанието помеѓу референтните напони на компараторите. 220
Вовед во Микропроцесорите и Микроконтролерите Ако наместо осум употребиме 1024 компаратори, тогаш растојанието помеѓу напоните ќе се намали од 1 V на 7.8mV, што ни претставува квантизациона грешка. Без разлика кој метод се користи за A-D конверзија, секогаш е присутна квантизациона грешка.
Битови (Bits) Повеќе битови подобро. Најверојатните вредности ќе бидат помеѓу 8 и 16.
Брзина Овде имаме два фактори. Колку често може да се добие ажурирана вредност за сигналот и колку добро може да се следат некаквите промени што настануваат? Дури и да не сакаме семплирањето, земањето на одбироци, да биде со многу голема брзина, сепак сакаме при промена на влезната вредност многу брзо тоа да се увиди и на реално измерената вредност, т.е. на излез. Кога станува збор за брзина, неможете да го победите flash конверторот. Тој може да зема одбирок со пауза помала од 3 ns, во споредба со многу поволните конвертори, ramp (рампа) генератори и типот со успешни апроксимација, кои имаат пауза од 10 µs.
Дигитално-аналогна конверзија (digital to analog conversion, DAC) Промената на вредностите на група дигитални битови во аналоген напон, во основа е обратен процес од A-D конверзијата која што ја сретнавме во претходната секција. Повеќето дигитално-аналогни конвертори работат со собирање на повеќе струи и потоа го конвертираат резултатот во аналоген напон. Бинарните нивоа се користат за да се вклучат или исклучат струите. Да претпоставиме дека имаме 4 битен дигитален сигнал, кај кој најзначајниот бит може да генерира струја од 8 mA, а останатите може да произведат, по ред, 4, 2 и конечно 1 mA. Ако дигиталниот сигнал кој што треба да го конвертираме е 10112, тогаш првиот, третиот и четвртиот извор на струи ќе се активираат и ќе ни дадат вкупно 8 + 2 + 1 = 11 mA (види слика 17.4).
Слика 17.4 DAC кој на излез има струја или напон
221
Вовед во Микропроцесорите и Микроконтролерите Кај некои DAC конвертори крајниот излез е промена на струјата, но кај други таа се претвара во напон. Ова зависи од тоа какво интегрирано коло сме избрале да користиме. Кај оние што дават напон на излез, вкупната струја поминува низ отпорник. Ако избереме убава вредност, како 1kΩ, тогаш напонот на отпорникот ќе биде 11 mA 1 kΩ = 11 V. На сличен начин, можеме да приметиме дека сите бинарни вредности помеѓу 0000 и 1111 можат да се конвертираат во напони помеѓу 0 V и 15 V. Има неколку спецификации кои треба да се проверат пред да одлучиме кој конвертор ќе го користиме.
Резолуција (resolution) Ова е бројот на дигитални битови кои се користат за да се конвертираат во аналоген напон. Можни типични вредности се од 4 до 18 битови. Како настанува промена на дигиталниот влез со промена на еден бит, на пример 1000 во 1001, резултантниот напон или струја се зголемува со дискретен чекор. Големината на овој чекор зависи од бројот на битови кои се употребени споредено со максималната вредност на излезната струја или напон. На пример, ако користиме 4 битови тогаш ќе имаме вкупно 16 различни чекори, и ако максимумот е во 8 V, секој чекор ќе претставува промена на напонот за 0.5 V. Така, постојаното зголемување на дигиталниот сигнал ќе предизвика аналогниот напон да се зголемува со мали дискретни чекори, како скалила. Ова е многу сличен случај со квантизационата грешка.
Брзина Брзината со која работи многу зависи од тоа кој чип го разгледуваме. Имаме конвертори кај кои времето на конверзија е премногу брзо, 1 ns, и послаби конвертори со 5 µs.
Сериски и паралелен пренос При пренос на информации во дигитална форма, имаме избор да користиме сериски или паралелен пренос. При сериски пренос, бинарните вредности се претставуваат со две различни нивоа на напон и потоа се испраќаат еден по друг преку кабелот. Ова е едноставно, но споро. Алтернативно, можеме да имаме неколку жици низ кои можеме да испраќаме неколку битови од податоците во исто време, по еден на секој проводник. Кај микропроцесорски базирани систем, дури и да е едноктратно, обично е подобро да се приспособи системот по некои воспоставени стандарди за каблирање, така што другите инструменти и кола, да можат да се поврзат со минимум проблеми.
Паралелна конекција Има неколку различни стандарди кои се употребуваат за паралелна конекција на податоци, но една од најпознатите, широко користена, и најсигурна, беше произведена од Centronics. Centronics системот испраќа осум бита во исто време и користи систем од 36 plug and socket (клин и џеб приклучок). За да испрати податоци, има четири основни контролни сигнали, како и осум податочни линии. Исто така, предвидува варијанти на други контролни линии кои можат да се користат, ако е потребно. 222
Вовед во Микропроцесорите и Микроконтролерите Важна работа што треба да ја запомните околу овие стандарди е тоа што не треба да ги користите сите конекции, но оние што ќе одлучите да ги користите треба да одговараат со спецификацијата и да бидат на правите пинови. Ова нè осигурува доколку го приклучиме за ново парче опрема, може нема да работи, но барем нема да го оштети.
Centronics пренос на податоци За да видиме како работи системот, ние ќе користиме временски диаграм за да покажеме што се случува и кога. Овие диаграми, кои на прв поглед сите изгледаат многу слични, се прикажани во сите прирачници за да ни ја покажат секвенцата на настани внатре во микропроцесорот и во околните кола. Има неколку точки кои треба да ги спомнеме. Веќе го спомнавме проблемот со времето на растење во Глава 7. Запомнете дека не можеме да го промениме нивото на напонот инстантно. Ова може не изгледа многу важно доцнење кога мислиме на вклучување на светлата во нашата соба, но кога микропроцесорот се справува со податоци од милиони бити во секунда, ова доцнење може да биде многу важно и честопати предизвикува потфрлање на колото кое „треба“ да работи. Повеќето брановидни диаграми краевите на правоаголниот бран го прикажуваат со закосени линии наместо вертикални.
Слика 17.5 Времето на растење и опаѓање може да биде многу важно
Слика 17.6 Приказ на алтернативните податочни нивоа
На слика 17.5 имаме пулс со позитивен тек за да ни претставува податок со вредност 1, се разбира, податок може да биде еднаков на 0 V за да ни претставува бинарна 0. Во случај кога сакаме да покажеме дека нивото се променило, но може да биде на две различни нивоа, па на диаграмите ги цртаме и двете можни нивоа во исто време, како на слика 17.6. На слика 17.7 е прикажан процес на пренос на осум битен податок, од микропроцесорот кон надворешен печатач или друг уред.
223
Вовед во Микропроцесорите и Микроконтролерите Чекор 1 Чекор 2
Чекор 3 Чекор 4
Микропроцесорот става осум битови од податокот на податочните проводници. Имаме мала пауза, додека не се стабилизираат напоните на сите осум проводници. Потоа се појавува strobe пулс кој му кажува на печатачот или друг додаток дека податокот е спремен. Линијата врз зборчето strobe ни кажува дека е ниско активен. Ако нема линија тогаш тој е високо активен. Печатачот почнува да ги чита податоците и busy линијата оди на високо ниво, за да спречи да не се испратат уште податоци. Кога податоците ќе се испечатат, тогаш busy линијата се спушта за да му се каже на микропроцесорот да го стави следниот дел од податоците на податочните проводници.
Слика 17.7 Временски диаграм на Centronics сигналите
Стандардот овозможува многу други контролни проводници за друга намена. Во овој пример, осумте податочни проводници се користат како излези од микропроцесорот, но сосема е можно нив да ги искористиме за да носат влезни податоци, иако ова не е дозволено во дизајнот на компјутерите.
Сериски пренос За да се испрати информација во сериска форма, потебно е само едноставна комуникациона врска, но ова неизбежно е побавно од паралелен пренос, бидејќи податоците се испраќаат бит по бит.
UARTs За да ги претвориме паралелните податоци од податочната магистрала на микропроцесорот во сериски пренос, можеме да користиме шифт регистер како во Глава 6. Денешната алтернатива е да користиме чип наречен UART (universal asynchronous receiver/transmitter) или USART (universal synchronous/asynchronous receiver/transmitter). Ова се интегрирани кола кои ги претвараат податоците од паралелен во сериски пренос, па така наместо да имаме осум проводници, каде секој носи еден бит во исто време, серискиот пренос ги пренесува битовите, еден по еден преку еден проводник. Тој исто така може да прими осум бита од сериски податок и потоа да ги прати до микропроцесорот како еден бајт. 224
Вовед во Микропроцесорите и Микроконтролерите Парелелниот пренос очигледно е многу побрз, бидејќи се носат осум бита во единица време, но потребни се осум конекции. На пример, за да се испрати fax сигнал ќе ни треба осум телефонски линии, додека со UART можеме да го конверираме во сериски пренос и да го пратиме преку една линија со брзина осум пати помала. Можностите на UARTs се многу повеќе од шифт регистерот, тие вклучуваат проверка на парноста, и бафери за да ни овозможат да можеме да се справиме со околу 16 бајти во единица веме без да го употребиме микропроцесорот. Повеќето преноси на податоци вклучуваат ASCII код за да претстават карактери кои треба да се пренесат. Ова е седум битен код, со кој можеме да го претставиме секој алфанумерички карактер и неколку варијанти на контролни инструкции. На пример, буквата Е хексадецимално е 45, и ако ги користиме само ниските седум бити тоа би било 1000101. ASCII кодот се кориси и при паралелен и сериски пренос. Секоја буква и симбол си има свој седум битен код. Додаден е уште еден бит на крајот за да ни обезбеди бит за парност, или пак може да се искористи за да нè префрли во алтернативно множество на карактери за пренос на математички симболи или Грчки букви, или пак ако не го користиме, тој е нула. На слика 17.8 е претставен ASCII кодот за буквата Е. Кога користиме ASCII сигнали во сериски пренос, треба да можеме да ја известиме приемната апаратура кога сме испратиле еден посебен ASCII карактер. Ова лесно е направено во синхроните системи кои осигуруваат дека прадавателот и приемникот се „држат заедно“ (locked together) и работат со иста брзина. Ова не е најлесниот начин за работа на системите, имајќи ги впредвид тешкотиите кои се јавуваат при обид два уредат да бидат синхрони. Затоа, имаме тенденција да работат асинхроно. Ова значи дека треба да испратиме сигнал заедно со ASCII кодот за да му укажиме на приемникот каде започнал и каде завршил ASCII кодот. Инаку, предавателот континуирано ќе испраќа податоци, и ако се изгуби некој бит, приемникот ќе испадне од чекор, и погрешно ќе ја прочита подсеквенцата од податоци.
Слика 17.8 ASCII кодирање
За да г0 решиме овој проблем, 0 V „старт“ бит се испраќа на почетокот од карактерот и позитивен „стоп“ бит се испраќа на крајот од ASCII кодот. Ова го доведува седум битниот ASCII код до вкупно 10 бита. Старт и стоп битовите ни осигуруваат дека ќе се појави најмалку една промена на нивото за секој карактер со што може да се искористи за да го синхронизираме тактот на применикот со тактот на предавателот во време кога се прима карактерот. За растојанија повеќе од неколку метри, треба да користиме малку пософистициран систем за пренос, за да се заштитиме од прекумерна интерференција на случајниот шум. Се користат неколку системи, најпознатите се оние креирани од EIA (Electrical Industries Association).
225
Вовед во Микропроцесорите и Микроконтролерите Како и кај повеќето медиуми за пренос, постои поврзаност помеѓу брзината и максималното растојание што може да го користи системот. Ако имате намера да го форсирате растојанието на пренос до максималната вредност, треба да прифатете дека брзината ќе се намали. Како некое непишано правило е, ако го дуплирате растојанието, тогаш ќе ја преполовите брзината.
RS232C Овој стандард за пренос е креиран од одборот на EIA. Стандардот ни овозможува пренос на растојанија до 15 m со брзина до 20 kbaud (всушност може да ја надмине оваа брзина и ова растојание, но не гарантира „сигурен“ пренос). Baud е мерка за брзина на пренос. Тоа е бројот на тактови во секунда, кој е приближен со бројот на битови во секунда. RS232C преносот е балансиран на околу 0 V. Сега треба да бидете претпазливи, бинарното ниво за единица е негативен напон (помеѓу –5 и –15 V), а бинарното ниво за нула е позитивна вредност помеѓу +5 и +15 V. Ова е наопаку во споредба со сите наши претходни употребени примери за бинарните нивоа. Буквата Е ќе се пренесе како на слика 17.9. предавателните нивоа се назначени како Z5 V, но границите на приемникот се [3 V. Ова ни овозможува, „шилците“ при шум да бидат дури до 6 V, пред да се јави можно погрешно читање на дел од податоците.
Слика 17.9 RS232C пренос
RS423A Ова е подобрена верзија која има максимална брзина од 100 kbits/s и максимална должина на кабелот од 1.2 km. Предавателниот напон може да биде помеѓу Z3.6 и Z6 V, а приемникот може да оди надолу до Z0.2 V. Промена на напонските нивоа Како ги менуваме бинарните или логичките вредности во RS232 напонски нивоа? Ако правите микропроцесорски базиран систем најочигледниот начин е да користите пар интегрирани кола, наречени 1488 (предавател) и 1489 (приемник). Овие интегрирани кола достапни се повеќе години и тие се едноставни и сигурни. Имаат мала пречка, а тоа е што се напојуваат на 12 V, за разлика од денешното напијување од 5 V, и многу почесто може да бидат поинтересни, и полесни за користење, новите трансивери (transmitter/предавател + receiver/приемник), направени од Maxim. За овие е потребно само напојување од единечни +5V, а тие си генерираат свои Z напони за RS232C преносот. Секој чип се состои од два предаватели и два приемника кои работат дури до 120 kbits/s. Уредите се нумерирани како MAX202, MAX208, MAX220, MAX232 и има и други. Кај компјутерите имаме сериска порта која ни овозмижува сигнал со RS232C нивоа. 226
Вовед во Микропроцесорите и Микроконтролерите
Употреба на RS232C во реалниот живот Повеќето RS232C врски се преку 25 пински „D“ клин приклучок или 9 пински „D“ клин приклучок и џебови (plug and socket) (слика 17.10), но за разлика од Centronics, што е сосема стабилен и работи без двоумење, RS232C може вистински да ги вознемири луѓето. Пред да се обидите да комуницирате, мора да се осигурате дека предавателот и приемникот користат иста должина на зборот и вредностите за парност се поставени на иста брзина на работа. Дури тогаш, може малку да експериментирате пред да можете убаво да го користите. Проблем е тоа што има многу повеќе опции за други конекции. Спецификациите не се објаснети доволно детално и можат да ве доведат до различна интерпретација. Не е зачудувачко тоа што е недоволно само да поврзате две парчиња опрема со RS232C кабел и да ги вклучите да работат. Туку ќе треба да ја земете спецификацијата за RS232C конекција и да се сместите во еден удобен стол.
Слика 17.10 Конектори од тип ‘D’ за RS232C
Модеми Модем, modem (MOdulator DEModulator), ги конвертира дигиталниот сигнал во два аудио тонови, па така можеме преносот да го направиме преку телефонска линија. Телефоните, генерално, се направени да прифаќаат фреквенции помеѓу 300 Hz и 3.1 kHz. Одбран е ваков релативно тесен пропусен опсег за да можеме да го пренесеме говорот со непотребно губење на квалитетот, и притоа да ни овозможи пренос на голем број повици преку ист кабел. Откако дигитални сигнали ги пренесовме преку телефонската линија, можностите станаа неограничени.
Избор на системите Неколку метри Може да користиме чисти бинарни податоци за пренос преку еден кабел (види слика 17.11).
Слика 17.11 Врска со многу кратко растојание
227
Вовед во Микропроцесорите и Микроконтролерите Десетина или стотина метри Може да го конвертираме сигналот за пренос во RS232C или RS232A, по потреба (види слика 17.12).
Слика 17.2 Околу и меѓу згради
Неограничена оддалеченост Додадете модем и врска (link) со телефонска линија или пак оптички влакна (види слика 17.13).
Слика 17.13 Околу светот
Врска (link) со оптички влакна Парче оптичко влакно е чисто парче од стакло или пластика. Пластичното влакно е со дијаметар од околу 1 mm и е погоден за пренос на кратки растојанија од неколку десетина метри, но има предности со тоа што е ефтин и е лесен за употреба. Неговата употреба е ограничена поради јасноста на денешните пластики. Специјално силиконско стакло е неверојатно чисто, и оттука има многу пониски загуби и може да се користи за секакви растојанија, со соодветни (повторувачи) репетери. Исто така има многу помал дијаметар – само околу 125µm, без да се додадат надворешните заштитни слоеви. Ако со некој светлосен избор се осветли еден крај од оптичкото влакно, тогаш светлината ќе се рефлектира од внатрешната површина низ целиот кабел. Како светлосен извор може да се користи ласер кој работи во регионот на инфрацрвениот спектар. За да го користиме за 228
Вовед во Микропроцесорите и Микроконтролерите испраќање на дигитален сигнал, треба да го вклучуваме и исклучуваме светлосниот извор и да го детектираме ова блескање на светлината на другиот, многу оддалечен, крај од кабелот преку фотоелектрична ќелија. Загубите можат да се надохнадат со репетерите (повторувачите), исто како кај бакарно базираните преносни системи, па така не е проблем опсегот на работа. Оптичкото влакно не страда од било какви електрични шумови кои, ги има во огромна ширина на опсегот. Во една смисла, овде не станува збор за избор бидејќи речиси сите телефонски кабли на долги растојанија користат оптички влакна. Ако сакаме да конструираме своја оптичка врска, се што ни треба е да купиме ласер (или LED диоди), фотоќелија и неколку приклучоци за да ги поврзиме. Може да се искористи како замена на бакарен кабел од секој претходно опишан систем (види слика 17.14). Внимавајте! Ифрацрвената светлина од ласерот може случајно да предизвика непоправлива штета на окото. Мора секој пат да запомниме дека ова ни се последниот пар очи.
Слика 17.14 Линк со оптички влакна – за било какви растојанија
Брзина на пренос на податоци Користејќи еден оптички кабел за сериски пренос, типичната брзина за пренос на податоци е 100 Mbytes/s до 10 km. Многу голема брзина на пренос на податоци од 1 Gbyte/s може да се постигне до 100 m, користејќи паралелен пренос низ повеќе, куп, оптички кабли.
Квиз 17 Во секој случај, одбери го најдобриот одговор. 1
2
Најбрзиот дизајн за аналогно дигитална конверзија е: a. Рампа (ramp) конвертор. b. Flash конвертор. c. Компаратор. d. Конвертор со успешна апроксимација. Квантизационата грешка може да се намали со: a. Зголемување на бројот на нивоата кај ADC. b. Зголемување на брзината на конверзија. c. Со користење на насочени (vectored) интерапти наместо (polling) анкетирани. d. Користење на flash конвертор. 229
Вовед во Микропроцесорите и Микроконтролерите 3
4
5
Користејќи RS232C стандард, бинарна 0 најверојатно ќе се пренесе како: a. 4 V. b. 2 V. c. 5 V. d. 10 V. Модем: a. Е некој USART тип. b. Нормално е поврзан помеѓу UART и RS232C конвертор. c. Се користи само во системите со оптички влакна. d. Се користи за конвертирање на дигиталните сигнали во аудио тонови за да се пренесат преку телефонски кабли. При пренос на 16 битен податок на приемната страна стигнале со една грешка. Системот користи непарна парност, и го добил блокот од 25 бити: 0000111010111000100110011. Корегираниот податок е: a. 1000111010111000101110011 b. 0000111010111000101110010 c. 0000111010111000101110011 d. 0000111010111000100110011
230
Вовед во Микропроцесорите и Микроконтролерите
18 Опрема за тестирање и изнаоѓање на грешките Ова поглавје е наменето да ни пренесе некои совети за изнаоѓање на грешките во микропроцесорски базираниот систем, и е цврсто базиран врз основа на искуство, па затоа може да се преименува во „Грешките што ги направив јас“.
Што ли сеге е прогрешно? Целиот процес на изнаоѓање на грешките треба да се одвива полека и внимателно. Постои една популарна заблуда дека треба многу да работите и да бидете зафатени со, мерења, со прилагодување и промена на компонентите. Но, всушност, повеќето време се троши само на седење и размислување (не ги заборавајте последните два збора!). Увидете ги сите симптоми и запишете ги. Бидете претпазливи со идеите за симптомите дадени од други луѓе, бидејќи ако тие не ве разбрале што точно се случува, може да ве наведат да изгубите часови или денови. Ако заборавите да ги запишете, порано или подоцна ќе се вратите назад за да ги повторите истите проверки.
Не прави го проблемот полош Во повеќето случаи, парче опрема или коло откажува при една грешка. Две симултани, но неповрзани грешки се многу ретки. Има два популарни начини на претварање на малите проблеми во многу големи. Овие се статичкиот електрицитет и приклучоците, итн.
Статички електрицитет Кога два различни материјала се тријат меѓусебе, некои негативни електрони се стремат да мигрираат од едниот материјал во другиот. Ова резултира со напонска разлика помеѓу двата материјала. Количеството на напон може да биде многу големо – неколку илјади волти. Ако одиме низ тепих или седиме на пластичен стол, можеме да бидеме смртоносни за интегрирано коло дизајнирано на 5V. Повеќето интегрирани кола имаат вградени антистатички претпазливи мерки, но и тие имаат ограничени својства. Мора да балансираме со ова, бидејќи ако користиме подобри антистатички претпазливи мерки, тогаш интегрираното коло ни е побавно. Овој проблем може да го надминеме со намалување на статичкиот електрицитет со дозволување тој да се излева надвор. Кај теписите, облеката и мебелот можеме ова да го постигниме со додавање на слој од восок т.е. да ги исполираме, со што ќе абсорбираат и задржуваат мали количини на влага. Малата влажност е многи ефикасен начин за заштита од проблемите предизвикани од статичкиот електрицитет. Па поради ова, времето и влажноста 231
Вовед во Микропроцесорите и Микроконтролерите на воздухот се многу важни. Смртната стапка на интегрираните кола се разликуваат сезонски! Ефектот од статичкиот електриците на интегрираните кола е тешко предвидлив. Обично предизвикува мали локализирани падови кои имаат многу чудни ефекти. Наместо да се попрскуваме самите себе си со вода, подобро е да имаме високо-технолошки пристап кон ова, но колку далеку треба да одиме во оваа насока зависи од тоа за што станува збор. Ако треба да се справиме со неколку ефтини AND порти еднаш неделно, тогаш исплатлива е едноставна претпазливост. Сепак, ако се работи за микропроцесор кој треба да го вградиме во некоја производна линија, тогаш треба претпазливоста да е економски исплатлива. Наједноставен метод е да имаме проводлив појас околу нашиот зглоб со дел кој води кон заземјување. Овие зглобни појаси се направени од гума во која е измешен јаглерод за да може да има мала спроводливост. Исто како и кај зглобните појаси, така можеме и лист од оваа гума да ставиме на горната и долната страна од клупа. Таквите антистатички работни станици се многу ефективни. Мало предупредување. Не правете си свој појас за зглоб од бакарна жица. Ова има многу мала отпорност и нема никаква заштита при случајно допирање на електричниот вод. Дома, избегнувајте да работите на пластична маса, или стол, или пак да носите облека направена од неприродни влакна. Природните материјали како памук, волна и необработеното дрво, природно апсорбираат малку вода и се прилично безбедни за работа. Треба да се избегнува убаво дрвена клупа, обложена со полиуретански лак бидејќи таа претставува, ефективна, пластична клупа.
Проблеми со приклучоците Многу приклучоци кои се користат во повеќето парчиња опрема имаат голем број на пинови. Со откачување на еден од нив, всушност доаѓа до прекин на некој напон. Ова може да биде фатално за интегрираните кола, бидејќи сите приклучоци мора да бидат вклучени, или сите да бидат исклучени, па затоа никогаш не приклучувајте или откачувајте со вклучен напон. Поради истата причина, никогаш не вадате или заменувајте интегрирано коло ако е вклучен напонот.
Тестови кои можеме да ги направиме без опрема за тестирање Дали напојувањето е вклучено? Дали ви се потебни две напојувања? Ако користите две напојувања, дали тие се поврзани меѓу себе за да напонот биде во ист чекор со другиот? Ако е потребно заземјување, дали тоа е поврзано? Повеќето напојувања имаат променлив излез, ова значи дека 5 V напојување, ќе има различни 5 V на двата краја. Ова значи дека ако го заземјиме негативниот крај, како на слика 18.1(а), другиот крај ќе биде 5 V. На друга страна пак, ако го поврзиме како на слика 18.1(b), другиот крај ќе ни биде 5 V. Обрнете внимание при лемењето, ако тоа е видливо треба да биде мазно и сјајно. Секоја нејасна и карпеста околина е сомничава. Ако интегрираните кола се приклучуваат во некоја база наместо да се лемат, погледнете дали тие се вметнати како што треба, со вистинската 232
Вовед во Микропроцесорите и Микроконтролерите страна. За жал, производителите на интегрирани кола преземаат малку мерки на претпазливост за да ги спречат грешките од ваков тип.
Слика 18.1 Поврзување на „лебдечко“ напојување
Кај повеќето интегрирани кола, пиновите се нумерирани од надворешната страна, како што е прикажано на слика 18.2. Позицијата на пин 1 секогаш е на левата страна од крајот на кој има вдлабнатина, дупче (indentation) кога го гледата одозгора, како на слика 18.2. Кога ја барате вдлабнатинката, пазете да не ве збунат некои мали кружни белези каде што пластиката е вкалапена. Печатените кола обично имаат или број „1“, или мало квадратче или некој друг знак кој ја покажува позицијата на првиот пин.
Слика 18.2 Нумерирање на пиновите кај ‘dual in line’ (DIL) чиповите
На слика 18.3 е прикажан изглед на мрежното поле од пинови, pin grid array (PGA). Забележете дека буквите скокнуваат од Н на Ј, поради можноста од забуна на I со 1. Уредот го одредува 233
Вовед во Микропроцесорите и Микроконтролерите бројот на пинови. Прикажаниот изгледа е постариот Intel 80386. Pentium има по 21 пин на секоја страна.
Слика 18.3 Нумерирање на пиновите кај Pin Grid Array (PGA)
Едноставна опрема за тестирање Покрај стандардните волтметар и осцилоскоп, единственото друго парче опрема што може да биде корисно е логичка сонда. Подобар е од просечен осцилоскоп при откривање на многу кратки напонски шилци и е побрз од работата со волтметар.
Слика 18.4 Логичка сонда (logic probe)
234
Вовед во Микропроцесорите и Микроконтролерите
Логичка сонда Логичката сонда е едноствен инструмент кој има две конекции за напојување (штипки) и уште една конекција зашилена на врвот за да може да се допре на точките од интерес. Генералниот изглед е прикажан на слика 18.4. На него има три LED диоди, првите две ги покажуваат логичките состојби 0 или 1, а третата покажува присуство на правоаголен пулс со многу висока фреквенција или единичен, многу краток пулс, наречен „glitch“ (дефект).
Едноставни тестови што можеме да ги направиме со овие парчиња на опрема Може да провериме неколку напони што се наоѓаат на пиновите од микропроцесорот. Ако е можно, добра идеја е да се проверува на пиновите, а не на базата за која е приклучена. Ова гарантира дека конекциите на базата се исправни. Исто така може да се најде некој свиткан пин, како што е прикажано на слика 18.5.
Слика 18.5 Не е препорачливо да се виткат пиновите
Најверојатните пинови кои вреди да се проверат се оние кои носат DC напон, како што се оние на кои се врзува напојувањето и оние за интерапти. Вреди да се погледне пинот кој треба да има 0V. Кога користиме волтметар, понекогаш може да измериме 0 V кога тие се дисконектирани или „лебдечка“ нула. Ако користиш волтметар за да го измериш напонот помеѓу позитивниот напон и осомничениот пин, тој сеуште ќе покажува 0 V, со што јасно се гледа дека нешто недостасува. Логичката сонда не може да се измами со „лебдечка“ нула, таа нема да покажува логичка нула, ако таа нула е „лебдечка“. Следната работа е да провериме дали воопшто работи микропроцесорот. Ова може да го сториме со употеба на осцилоскоп и сигналот да го приклучиме на тактот (clock signal). Претпоставувајќи дека тактниот сигнал е ОК, следно треба да провериме дали микропроцесорот извршува инструкции и дали адресната и податочната магистрала се читаат правилно. Интересен начин за да се провери дали работи микропроцесорот е да се организира да прави едноставна повторувачка програма која е составена од постојано ‘no operation’ (NOP) код. NOP кодот ќе му дава инструкции на микропроцесорот да не прави ништо, освен што треба да ја 235
Вовед во Микропроцесорите и Микроконтролерите исчита следната инструкција од податочната магистрала преку едноставно зголемување на вредноста на адресната магистрала. Новата инструкција ќе биде уште една no-operation код, па така адресната магистрала континуирано ќе се зголемува. За да овозможиме постојан NOP влез, на податочната магистрала може да го залемиме или на некој друг начин да ги поврзиме потербните логички кодови. Ова се нарекува цврсто-поврзување (hard-wiring) на податочната магистрала. Бидејќи адресната магистрала брои бинарно, тогаш најниската адресна линија ќе се менува многу брзо, од нула на еден, со што ќе ни даде правоаголен излез.
Слика 18.6 Адресната магистрала брои бинарно
Ако ја погледнеме слика 18.6, можеме да забележиме дека А1 линијата работи со половина фреквенција од А0 линијата. Слично, адресната линија А2 има половина од ферквенцијата на А1 и така натаму за сите адресни пинови. Ако поврзиме осцилоскоп на секоја линија по ред, фреквенцијата треба постепено да се намалува. Проверете дали се преполовува фреквенцијата на секоја адресна линија, и ако не е така имаме грешка при поврзувањето, со што ќе станат очигледни кратки споеви помеѓу адресните линии. Ако до сега се е како што треба, а сеуште не работи како што треба, тогаш сме во сериозна ситуација за изнаоѓање на грешката.
Сериозни парчиња од опремата за тестирање Сите претходни парчиња на опрема за тестирање не успеаја да ни помогнат, кога пробавме да видиме што се случува со адресните и податочните магистрали под реални работни услови. Со осцилоскоп не можеме да следиме на повеќе од две места истовремено, а може нас ни треба да следиме поголем број, можеби 50 или повеќе и потоа полека да ја провериме информацијата или да ја испечатиме. Инструмент наречен логички анализатор може да ги постигне овие функции и многу повеќе. 236
Вовед во Микропроцесорите и Микроконтролерите Може да ни одговори на прашања како: o o o
Која вредност се појавува на адресната магистрала кога предизвикуваме појава на интерапт? Дали точната програма е стартувана? Дали се појавиле некакви несакани напонски „шилци“?
Градбата на логичкиот анализатор во основа е многу едноставна комбинација од шифт регистри. Може се сеќавате, шифт регистрите ги разгледавме во Глава 6. Регистрите се полнат со некој податок, и на секој такт, податокот се поместува за едно место на лево или десно по потреба. Сега замислите шифт во десно регистер кој може да чува 36 битен податок. Ако го поврзиме за А0, првата адресна линија од адресната магистрала, и стартуваме програма, логичките вредности кои се јавуваат на адресната линија ќе се копираат во шифт регистерот, предадени до крај со секој такт, и случајно можат да испаѓаат на крајот. (види слика 18.7).
Слика 18.7
Сега ако имаме четири вакви регистри, може да собериме податоци од било кои четири дела од колото во исто време. На пример, може да ги следиме долните четири адресни линии, А0, А1, А2 и А3. На средина од регистерот имаме прозорец, ова значи дека можеме да пристапиме во средината на регистерот и да ја прочитаме вредноста во таа точка и да направиме компарација. На слика 18.8 за да биде појасна, прикажани се само четири регистри. Едноставен распоред како овој, има и 416 (четири по шеснаесет) логичкиот анализатор. Во спецификацијата на логичкиот анализатор, бројот на регистри ќе се нарекува како број на канали. Во реалниот живот, никогаш нема да најдиме ваков едноставен распоред на регистрите. Логичкиот анализатор може да содржи, на пример, 80 канали, и секој да содржи 4096 битен шифт регистер. Ова ќе биде претставен како 80 4 kbyte логички анализатор. Со еден од ваков размер, можеме да следиме 80 различни точки на микропроцесорски базиран систем. Кои точки ќе ги избереме зависи од нас, може да ги одбереме сите од адресната и податочната магистрала и некои контролни сигнали или пак некои други точки кои се од интерес. Изборот е целосно наш. Ако, на слика 18.8, четирите регистри ги користевме за следење на четири адресни линии, можеме да се сомневаме во линијата која ни покажува дека има константна вредност од логичка 1. Ово може да укажува на тоа дека оваа линија кратко се споила со позитивното напојување, или се откачила и е „лебдички“ висок. Не скокајте од стол поради возбудување 237
Вовед во Микропроцесорите и Микроконтролерите бидејќи ова е само едно објаснување. Може да бидат овие причини, или пак може да е очекуван резултат на дел од програмата.
Слика 18.8 Четири шифт регистри можат да направат едноставен логички анализатор
Па зошто е прозорецот? Во прозорецот, логичкиот анализатор ќе „види“ дел од податоците во секој канал. Може да пуштиме комбинација која што подоцна ќе ја бараме. За позгодно да ни е нас, внесуваме хексадецимални броеви и како што пристигнува такт од микропроцесорот, податоците се движат и постојано се споредуваат со внесениот број. Кога ќе бидат исти, се исклучува тактот и тогаш податоците се „заробени“. Сега можеме да се движиме назад и напред низ регистрите и да ја видиме работата на микропроцесорот, „замрзнат“ во времето. Користа од поставување на прозорецот на средина од шифт регистерот е тоа што ни дозволува да ги разгледуваме акциите на програмата пред, исто така и после, одбраниот момент. Додатни можности (способности) „Вистински“ логички анализатор има неколку додатни способности, како што е „заробување“, но не при првиот пат кога ќе се појави нашиот влез, туку после, на пример, 200 појавување, за да можеме да се погрижиме за повторувачките јамки во програмата. Тие исто така ни овозможуваат „не се грижи“ услови, со кои можеме на влезовите на прозорците од 20 канален логички анализатор да внесеме хексадецимален код 7ХХХ2, и да го „зароби“ секој податок што почнува со 7Н (01112) и завршува со 2Н (00102). Glitch (дефект/шилец) е пулс кој трае многу кратко и се појавува во логичките кола, или од надворешна интерференција, или како резултат на слаб дизајн. Тој може да предизвика несакано префрлање во логичкото коло и да „падне“, да ја „урне“, микропроцесорската програма. Тие се изворендно кратки, само неколку наносекунди, со што нивното забележување е многу тешко. Обично тие се пребмногу брзи за осцилоскоп, но некои логички сонди имаат вграден „glitch-catcher“ (фаќач на шилци), но тие само ни кажуваат дека се појавил glitch (шилец), но не кога се појавил. Оваа информација ќе ни биде потребна ако бараме грешки во дизајнот. Логичкиот анализатор може да ги промаши, бидејќи зимањето на примерок од влезните податоци се прави еднаш за еден пулс, и ако го промаши шилецот, тоа нема да биде снимено. За да го надминеме ова, логичкиот анализатор има сопствен внатрешен такт кој работи многу 238
Вовед во Микропроцесорите и Микроконтролерите побрзо од системскиот такт, па така една логичка единица може да се прошири на 10 или 20 бити во регистерот и тогаш може ќе се сними шилец.
Слика 18.9 Glitch catching (Ловење на шилци)
На слика 18.9 е прикажано кога внатрешниот такт работи 10 пати побрзо од микропроцсорскиот такт. Некои логички анализатори имаат вграден glitch catcher (фаќач на шилци) и се користат да се „зароби“ точната секција од податоците. Како што видовме, логичкиот анализатор е многу корисно и софистицирано парче опрема. Како и да е, неговото користење е бавен процес. Има многу поврзување кои треба да ги направиме со колото и многу седење и размислување.
Квиз 18 Во секој случај, одбери го најдобриот одговор. 1
2
Оштетување од статички електрицитет: a. Може да се појави само во зима. b. Најдобро е да се заштитиме со носење на влажна облека. c. Можни се само во простории со килим. d. Може да се намалат со носење на приземјена лента аколу раката. Ако две напојувања се поврзат како на слика 18.10, резултатот би бил: a. Излегување на чад од двете напојувања. b. Излез од +5V, но двапати појака струја. c. Излез од +10V. d. На излез ќе нема ништо, но исто така ќе нема ни чад.
Слика 18.10
239
Вовед во Микропроцесорите и Микроконтролерите 3
Стрелката на слика 18.11 покажува на пин број: a. 2. b. 8. c. 11. d. 16.
Слика 18.11
4
5
Логичката сонда: a. Кажува дека без разлика која техника за изнаоѓање на грешки ја користите таа е базирана на расудување по звук. b. Може да открие разлика помеѓу неповрзана и заземјена конекција. c. Може да смести „stream“ (поток, дел) од податоци. d. Детектира присуство на статички електрицитет. Логички анализатор, означен како 20 канали 1024 бити: a. Ќе ни прикаже четири дигитен хексадецимален број во својот прозорец. b. Може да ги следи било кои 1024 точки во исто време. c. Ќе зачува вкупно 1044 бити податоци. d. Може да ги следи било кои 20 точки во исто време.
240
Вовед во Микропроцесорите и Микроконтролерите
Додаток А: датотека на регистерот за специјални функции
Addr BANK 0 00H 01H 02H 03H 04H 05H 06H 07 BANK 1 81H 85H 86H 87H 88H 89H
Name
TMR0 PCL Status FSR PortA PortB
Bit 7
Bit 6
IRP
Uses contents of FSR to address data memory (not a physical register) 8-bit real-time clock/counter Low order 8 bits of the program counter (PC) RP1 RP0 T0 PD Z DC Indirect Data Memory Address Pointer – – RA4/T-CKI RA3 RA2 RA1 RB6 RB5 RB4 RB3 RB2 RB1
– RB7
Bit 5
Bit 4
– Option TRISA TRISB – EECON 1 EECON 2
Bit 3
Bit 2
Bit 1
Bit 0
C RA0 RB0/ INT
Power-on Reset
xxxxxxxx 00000000 00011xxx xxxxxxxx ---x xxxx xxxxxxxx
Unused RBPU –
INTEDG –
T0CS –
T0SE
PSA
PS2 PS1 PortA data Direction
PS0
11111111 ---11111 11111111
RD
---0x000 --------
PortB data Direction –
–
– EEIF WRERR WREN EEPROM control reg. (not a physical register)
WR
Севкупните детали (85 страни) апсолутно се за PIC16F84A (или за друг PIC) може да се преземе од www.microchip.com
241
Вовед во Микропроцесорите и Микроконтролерите
Додаток Б: Инструкциско множество за PIC16CXXX Syntax/ Синтакса ADDLW k ADDWF f,d ANDLW k ANDWF f,d BCF f,b BSF f,b BTFSS f,b BTFSC f,b CALL k
CLRF f CLRW CLRWDT COMF f,d DECF f,d DECFSZ f,d
GOTO k INCF f,d INCFSZ f,d
IORLW k IORWF f,d MOVF f,d
Description/опис
Status affected
Содржината на W регистерот е соберена со 8 битен број (k) и резултатот се става во W регистерот Собери ги содржините на W и f регистрите. Ако d=0 резултатот оди го во W. Ако d=1 резултатот оду во f рег. AND на содржината на W регистерот и 8 битниот број (k), па резултатот се запишува во W регистерот AND W со f регистерот. Ако d=0 резултатот оди во W. Ако d=1 резултатот од во f регистерот Битот b од регистерот f е избришан (се става 0) Битот b од регистерот f се поставува на 1 Ако битот b од рег. f=0, се извршува следната инструкција, ако е 1 следната инструкција се заменува со NOP Ако битот b во рег. f=1, се извршува следната инструкција, ако е 0 следната инструкција се заменува со NOP Повик на потпрограма. Вратената адреса (PC+1) се става во стек. Веднаш се става 11 битна адреса во PC битовите горните битови од PC се земаат од PCLATH . Се празни регистерот f, и се поставува Z знаменцето (1) Се празни регистерот W, и се поставува Z знаменцето (1) Го ресетира тајмерот заштитник (watchdog timer) и watchdog prescaler Се комплементира содржината на ‘f’, ако d=0 резултатот од во W, ако d=1 резултатот оди во f Содржината на ‘f’ се намалува за 1. Ако d=0 резултатот од во W, ако d=1 резултатот оди во f Содржината на ‘f’ се намалува за 1. Ако d=0 резултатот од во W, ако d=1 резултатот оди во f. Ако резултатот=1, се извршува следната инструкција, ако е 0 следната инструкција се заменува со NOP Веднаш се става 11 битна адреса во PC битовите горните битови од PC се земаат од PCLATH . Содржината на ‘f’ се зголемува за 1. Ако d=0 резултатот од во W, ако d=1 резултатот оди во f. Содржината на ‘f’ се намалува за 1. Ако d=0 резултатот од во W, ако d=1 резултатот оди во f. Ако резултатот=1, се извршува следната инструкција, ако е 0 следната инструкција се заменува со NOP OR на содржината на W регистерот и 8 битниот број (k), па резултатот се запишува во W регистерот OR W со f регистерот. Ако d=0 резултатот оди во W. Ако d=1 резултатот од во f регистерот Ако d=0, содржината на ‘f’ оди во рег. W, ако d=1 оди во ‘f’
C,DC,Z C,DC,Z Z Z
1 или 2 такта 1 или 2 такта 2 такта
Z Z Т0, PD Z Z 1 или 2 такта
1 или 2 такта
Z
Z 242
Вовед во Микропроцесорите и Микроконтролерите MOVLW k MOVWF f NOP RETFIE RETLW k RETURN RLF f,d
SLEEP
SUBLW k SUBWF f,d SWAPF f,d XORLW k XORWF f,d
8 битен број (k) оди во W Премести го податокот од рег. W во рег. f Не прави ништо – само троши време (еден такт) Return from interrupt. Top of stack Во рег W се става број, return address Враќање од потпрограма. Return address Содржината на ‘f’ е ротирана на лево за еден бит преку carry знаменцето. Ако d=0 резултатот оди во W, ако d=1 резултатот оди во f. Види слика подолу Powerdown status bit PD is cleared, Timeout status bit T0 is set, WDT and prescaler are cleared, oscillator stops and controller goes to sleep. Рег. W се одзема од бројот k, и резултатот оди во рег. W (метод на втор комплемент) Рег. W се одзема од рег. f. Ако d=0 резултатот оди во W, ако d=1 резултатот оди во f. (метод на втор комплемент) Се разменуваат горниот и долниот дел на f. Ако d=0 резултатот оди во W, ако d=1 резултатот оди во f. XOR на содржината на W регистерот и 8 битниот број (k), па резултатот се запишува во W реги XOR W со f регистерот. Ако d=0 резултатот оди во W. Ако d=1 резултатот од во f регистерот
2 такта 2 такта 2 такта C
T0, PD
C, DC, Z C, DC, Z
Z Z
243
Вовед во Микропроцесорите и Микроконтролерите
Одговори на квизовите
Квиз 1 1 2 3 4 5
(c) (a) (c) (a) (d)
Квиз 7 1 2 3 4 5
(c) (a) (d) (d) (a)
Квиз 13 1 (a) 2 (d) 3 (c) 4 (b) 5 (a)
Квиз 2 1 2 3 4 5
(b) (c) (a) (b) (d)
Квиз 8 1 2 3 4 5
(b) (a) (b) (a) (c)
Квиз 14 1 (c) 2 (a) 3 (b) 4 (a) 5 (c)
Квиз 3 1 2 3 4 5
(d) (a) (c) (b) (c)
Квиз 9 1 2 3 4 5
(a) (c) (c) (d) (b)
Квиз 15 1 (a) 2 (b) 3 (d) 4 (d) 5 (c)
Квиз 4 1 2 3 4 5
(c) (c) (a) (b) (c)
Квиз 10 1 (b) 2 (b) 3 (d) 4 (c) 5 (c)
Квиз 16 1 (d) 2 (b) 3 (c) 4 (c) 5 (d)
Квиз 5 1 2 3 4 5
(c) (a) (d) (d) (c)
Квиз 11 1 (a) 2 (c) 3 (b) 4 (a) 5 (d)
Квиз 17 1 (b) 2 (a) 3 (d) 4 (d) 5 (c)
Квиз 6 1 2 3 4 5
(d) (b) (c) (b) (c)
Квиз 12 1 (d) 2 (d) 3 (c) 4 (b) 5 (a)
Квиз 18 1 (d) 2 (c) 3 (c) 4 (b) 5 (d)
244
View more...
Comments