СОДЕРЖАНИЕ
ГЛАВА 1. Введение в архитектуру компьютеров
1.2. Системы счисления
1.3. Компьютерные форматы данных
1.4. Резюме
1.5. Вопросы и задания
ГЛАВА 2. Архитектура семейства PIC18 и разработка программ
2.2. Модель программирования
2.4. Язык Ассемблера, программа «ассемблер» и компоновщик
2.5. Резюме
2.6. Вопросы и задания
ГЛАВА 3. Набор команд семейства PIC18
3.2. Битовые команды
3.3. Байтовые команды
3.4. Команды управления выполнением программы и косвенная адресация
3.5. Табличные команды
3.6. Макропоследовательности
3.7. Резюме
3.8. Вопросы и задания
ГЛАВА 4. Программирование на языке Ассемблера
4.2. Сложные арифметические операции
4.3. Преобразования между десятичным и двоичным форматами
4.4. Временные задержки
4.5. Примеры программ
4.6. Резюме
4.7. Вопросы и задания
ГЛАВА 5. Программирование PIC18 на языке С
5.2. Использование включаемых файлов языка С
5.3. Примеры программ на языке С
5.4. Математическая библиотека
5.5. Резюме
5.6. Вопросы и задания
ГЛАВА 6. Спецификации аппаратных средств семейства PIC18
6.2. Выводы Ввод-Вывод
6.3. Введение в прерывания
6.4. Другие внутренние периферийные устройства
6.5. Резюме
6.6. Вопросы и задания
ГЛАВА7. Базовый ввод-вывод
7.2. Устройства индикации
7.3. Управления электромоторами
7.4. Реле, соленоиды и датчики
7.5. Резюме
7.6. Вопросы и задания
ГЛАВА 8. Прерывания
8.2. USART и прерывания
8.3. Прерывания по изменению состояния
8.4. Примеры систем, работающих с прерываниями
8.5. Резюме
8.6. Вопросы и задания
ГЛАВА 9. Системы управления
9.2. Примеры системы
9.3. Резюме
9.4. Вопросы и задания
ГЛАВА 10. Вопросы повышенной сложности
10.2. Загрузочный блок
10.3. Расширение ввода-вывода
10.4. Интерфейс CAN
10.5. Интерфейс USB
10.6. Расширенный набор команд PIC18
10.7. Резюме
10.8. Вопросы и задания
Приложения
Содержание компакт-диска
Текст
                    o:jII,


/ \'


411/f11f1t" .



..


","'''''''



< . . ... .


<)
;. ::
If,; .1"
{'. :L
<


fIIfIIIII'


....""",.


,;..- ,..


-


,.
........ ..,
 .'!- .


,
 . .,


"',.


< \ ".:. ..

, \\, " . .
"""" .


.


\ i>


:


.
/


" -..a.



 .
.;i:, ' <


,.


..00 .0


.
,.. .. .
 .::i.
. ... . ,

 __. ..-
-..J-r.

-..."..P
I-;;; ......
._

 ""'
."'
 ;.,.ff.".....


M
<KP()
()
TPOnnEP()
>






ApxMTeKTypa, npOrpaMMMpOSaHMe M
nOCTpOeHMe MHTep<pei1cos C
npMMeHeHMeM C M acceM6nepa


-.....


'--



.


WWW.MK-PRESS.COM


"





Applying PIC18 Microcontrollers Architecture, Programming, and Inte'rfacing Using С and AssembIy 
Applying PIC18 Microcontrollers Architecture, Programming, and Interfacing Using С and AssembIy . Barry В. Brey Pcarson Education Inc. {Jpper Saddle River, New Jersey 07458 OSA 
Барри Брей Применение микроконтроллеров PIC18 Архитектура, проrраммирование и построение интерфейсов с применением С и ассемблера Перевод с анrлийскоrо: В. В. Литвин Киев «МК-Пресс» СПб «КОРОНД-ВЕК» 2008 
ББК 32.9734 Б 87 УДК 004.312 Брей Б. 587 nрименение МLI1кроконтроллеров PIC18. ApxLl1TeKTypa, проrраММLI1рование и nOCTpOeHLI1e LI1нтерфейсов с npLl1MeHeHLI1eM С LI1 ассемблера: Пер. с аНrл.  К.: «МК-Пресс», Сnб:. «КОРОНА-ВЕК», 2008.  576с., LI1Л. ISBN 978-5793105163 (<<KOPOHABEK») ISBN 9789668806-551 (<<MKnpecc») ISBN 9780130885463 (анrл.) Сеrодня микроконтроллеры используются повсеместно в автомобилях, бытовой технике, промышленном и медицинском оборудовании и т.П. Этот учебник дает всестороннее представление об архитектуре, проrраммировании и построении интерфейсов этоrо cOBpeMeHHoro чуда. На Прlll\1ере ce меЙства микроконтроллеров PIC 18 производства Microcl1ip в книrе объясняется архитектура, про['рам l\1ирование и построение интерфейсов. Семейство PIC 18 выбрано не случайно. ПОСКОЛЬКУ оно относит ся К самым современным восьмиразрядным микроконтроллерам. Изложенный 13 KIIIII'e I\!атерllал также применим как к более ранним версиям микроконтроллеров Microcl1ip, так и к анаJlOl'ИЧНЫМ YCTp()ikT вам друrих производителей. Он рассчитан на опытных практиков и радиолюбителей, ИlпереСУIOЩIIХСЯ микроконтроллерами. K З2.97ЗО4 Научный редактор: Ю. Ф. Авраменко Компьютерная верстка: И. В. Авраменко rлавный редактор: Ю. А. Шпак Подписано в печать 07.07.2008. Формат 70 х 100 1/16. Бумаrа офсетная. Печать офсетная. УСЛ. печ. л. 46,8. Уч.изд. л. 35,4. Тираж 2000 :жз. 3аказ NQ 9 СПД Савченко Л.А., Украина, r.Киев, тел./ф.: (044) 5177377; email: info@mkpress.com. Свидетельство о внесении субъекта издательскоrо дела в rосударствеНIIЫЙ реостр ИЗ/1318JЮЙ, производителей и распростраllителей издательской продукции: серия дк N951582 от 28.11.2003r. Отпечатано в типоrрафии ЧП Швец С.М. (свидетельство дк NQ867 от 22.03.2002). 32300, Хмельницкая обл., r. КаменецПодольский, ул. Пятницкая, 9а. Тел.: (03849) 27201, 22079. Авторизованный перевод с анrлийскоrо книrи Pearson Edl1cation Inc., изданной под торrовой маркоЙ Prentice Hall, Copyright (g 2008. Все права закреплены. Никакая часть настоящеrо издания ни в каких целях не может быть BOC произведена в какой бы то ни было форме и какими бы то ни было средствами, будь то электронные или механиче ские, включая фотокопирование и запись на любой носитель данных, если на это нет письменноrо разрешения IJЗ дательства Pearson Edl1cation Inc. Издано на русском языке издательством "МКПресс", Copyrigl1t 19 200. Al1tl1Orized translation from t11e Englisl1 langl1age edition pl1bIis11ed Ьу Pearson Edllcatiol1 Il1c., pllbIis\1il1! as РЮ1tlсе НаН, Copyright (g 2008. АН rights reserved. No part of this book тау Ье reprodllced or tral1smitte(i il1 аl1У [01'111 ur Ьу <ту means, electrol1ic or mecl1anical, il1cludil1g photocopying, recording or Ьу апу il1torl11atiol1 stol.age retl.ieva\ systeт, wit11011t perl11ission from Pearsol1 Edl1cation, Inc. Rl1ssian lal1gl1age edition pl1bIisl1ed Ьу pl1bIis11il1g il11pril1t MKPress, Copyrig11t (g 2008. ISBN 97857931 0516-3 ((KOPOHABEK») ISBN 978966880655-1 ((МКПресс») ISBN 9780130885463 (анrл.) @ «МКПресс», 2008 @ Реаrsоп Еdосаtiоп Inc., 2008 
Co.u.eplKaHHe 5 СОДЕРЖАНИЕ rЛАВА 1. Введение в архитектуру компьютеров..................................... 7 1.1. ОСНОВЫ KOMnbIOTepHO архнтектуры ..............................................................7 1.2. снстемы C4HCJleHH .......................................................................................17 1.3. KOMnblOTepHbIe срорматы ,lJ,анных......................................................:............ .25 1.4. Ре3IОме.......................................................................................................... 34 1.5. Вопросы н заданн ............................................................................'............35 rЛАВА 2. Архитектура семейства PIC18 и разработка nporpaMM ...............40 2.1. Архнтектура PIC 18 ........................................................................................ .40 2.2. MO,lJ,eJlb nporpaMMHpoBaHH .......................................................................... .49 2.3. V1HTerpHpoBaHHa снстема разра60ТКН (IDЕ) ..................................................58 2.4. Язык Ассем6лера, nporpaMMa «ассем6лер» Н KOMnOHOBw,HK........................... 70 2.5. Ре3IОме.......................................................................................................... 76 2.6. Вопросы н за,lJ,анн ........................................................................................ 77 r ЛАВА З. Набор команд семейства PIC18.............................................. 79 3.1. ЛнтераJlьные коман,lJ,ы................................................................................... 79 3.2. Бнтовые коман,lJ,Ы .......................................................................................... 84 3.3. Батовые коман,lJ,Ы ................................... .................................................... .86 3.4. Команды ynpaBJleHH BbInOJlHeHHeM nporpaMMbI н KOCBeHHa aдpecau.H ........94 3.5. Т а6Jlнчные коман,lJ,Ы ...................................................................................... 1 04 3.6. МакропоСле,lJ,оВатеJlЬНОСтн............................................................................ 108 3.7. Ре31Оме ......................................................................................................... 109 3.8. Вопросы н за,lJ,анн .......................................................................................110 rЛАВА 4. Проrраммирование на языке Ассемблера ............... .................113 4.1. Структуры стека н 04ере,lJ,Н ............................................................................ 113 4.2. Сложные арнсрмеТН4ескне onepau.HH .............................................................119 4.3. Пре06раЗ0ванн Me)l(,lJ,Y ,lJ,eCTH4HЫM н ,lJ,ВОН4НЫМ срорматамн ........................128 4.4. Временные за,lJ,ержкн .................................................................................... 133 4.5. npHMep[:>1 nporpaMM .................................................................. .....................136 4.6. Ре3IОме.................................................... ......................................................147 4.7. ВОПРОСЫ н заданн ................................................ ........................................147 rЛАВА 5. Проrраммирование PIC18 на языке С ......................................150 5.1. KOMnHJlTop С18 с 3ЫKa С ............................................................................150 5.2. V1CnOJlb30BaHHe BKJl104aeMbIX cpaJlOB 3ЫKa С ................................................. 159 5.3. npHMepbI nporpaMM на 3ЫKe С ...................................................................... 170 5.4. МатемаТИ4еска 6н6лнотека........................................ ................................. 181 5.5. Ре3IОме:................................................ ........................................................ .183 5.6. ВОПРОСЫ и заданн ........................................... .............................................183 
6 Прнмененне МИКрОI\онтроnnеров PIC 18 rЛАВА б. Спецификации аппаратных средств семейства PIC18 ............ ....185 6.1. Цоколевка выводов н 6аЗ0вые операЦНОНllые характернСтикн.................. ..... 185 6.2. выводы BBo).\BЫBOД. ........ ..... .... .............. .......... .............. .... .... ................. ... ..20 1 6.3. Введенне в прерыванн............ ........... ........... ...... .................................... ..... 213 6.4. Друrне внутреннне пернсрернные YCTpOCTBa ........................................ .....229 6.5. Ре3IОме.. ........ ......... ............. ....... ........................ ..................... ...... ........... .. ..246 6.6. Вопросы н заданн ................................................................................... ....247 rЛАВА 7. Базовый BBOДBЫBOД ......................................................... .".249 7.1. Входы от КJllOчевых схем ............................................................................ '" .249 7.2. Устройства НlIднкацни ............................................................. ...... ......... ... '" .259 7.3. УпраВЛОIIН электромоторамн ................................................................... .... 289 7.4. Реле, соленонды н даТLIНКН ........................................................................ .... З06 7.5. Рс310ме........... ..... .... ........... ........... ....... ...... ... ...... ........................... ...... ..... .. ..Э28 7.6. Воп росы н задан H ..................................................................... .. .. . . . .. . .. ... ....329 rЛАВА 8. Прерывания....... ................. ............................................ ... .332 8.1. Повторное знакомство с прерываннмн ................................................... .....332 8.2. USART н npepbIBaHH ................................................................................ .... .343 8.3. Прерыванн по измененнlO COCTOHH ...................................................... .....357 8.4. Прнмеры снстем, pa60TalOw,Hx с прерываннмн ...................................... .....364 8.5. Ре3IОме... ... ......... ..... .......... ............. .... ..... ....... ...... .................... .............., .... .399 8.6. Вопросы н заданн .......... ..... ............ ......... ............... ........... ........... ......... ..... .400 rЛАВА 9. Системы управления ... ..... ...... ....... .... .............................. .... .403 9.1 . ФормаJlнзаu.н снстемы управленн........................................................ ..... .403 9.2. Прнмеры снстемы ... ........................... ........... ..... ..................................... ..... .408 9.3. Ре3IОме.................................................................................................... ,..... .440 9.4. Вопросы н заданн ................ ................................................................ ....... 441 r ЛАВА 1 О. Вопросы повышенной сложности ................................... ......443 10.1. PacwHpeHHe памтн.............................................................................. ,...... .443 1 0.2. ЗаrРУ304НЫ 6лок................................................................................ ....... .465 10. 3. PacwHpeHHe BBoдaBЫBoдa ................................................................. ........473 1 0.4. V1I1Tepcpec CAN .......... ........... ..... ........... .... ......... ............... .... .............. ....... .482 1 0.5. И HTepcpec US В .................................................................................., ........ 490 10.6. PacwHpeHHbI на60Р команд PIC18..................................................... .........524 1 0.7 . Ре310ме .............................................................................................. .........526 10.8. Вопросы н за,lJ,анн ............................................................................ .........527 Приложения............................................................................. ........529 Содержание компактдиска........................................................ '........575 
lnaBa 1. ВБедение в архитектуру компьютеров 7 rЛАВА 1. ВвеАенме в apxt1TeKТYPY компьютеров Мнкроконтроллеры PIC (проrраммируемый интерфейсный контроллер) BXO,lJ,T в cepHIO hhterpaJlbI-lbIХ схем RISC (KoMnblOTep с cOKpaw,eHHbIM на60РОМ коман,lJ,), выпус каемых cpHpMO Microchip Technology Incorporated (htlp:/ /www.microchip.com). V1меется цеJJЫЙ pд тнпоразмеров корпусов зтнх мнкросхем, начнна от малых корпусов с 18 выводамн дО 60ЛЬШНХ - С 128 выводамн. Выпускаетс также u.елы pд нзделн, пред назна4енных дл ра60ТЫ с РIСмнкроконтроллерамн, которые называlOТСЯ BAS/C Staтp@ н выпускаlOТС cpHPMO Parallax Incorporated (htlp://www.parallax.com). Онн про rpaMMHpYIOTC на 3ЫKe BASIC нлн Java вместо 3ЫKa Ассем6лера. Аанная rлава Bn eTC вве,lJ,еннем в мнкроконтроллернуlO н cHcTeMHYIO apxHTeкrypy в ка4естве ба3L11са уnравленн аnпаратнымн сре,lJ,ствамн с npHMeHeHHeM мнкроконтроллеров. Кроме Toro в He оnределетс MHoro термннов, нсnользуемых в мнкроконтроллерных TeXHOJlOrH- x, 6лаrО,lJ,ар 4ему 4нтатель 3HaKOMHTC с основам н 3TO 04ень HHTepeCHO npe,lJ,MeT HO 06naCTH. nOcJle завершенн нзученн это rлавы, вы сможете: 1. Аавать опре,lJ,еnенн термннам, нспользуемым в 06ластн мнкроконтроллеров. 2. Опнсывать назна4енне каждо КОМПOllенты компыoерно снстемы. З. nOHHMaTb ра60ТУ каждо 4астн KOMnblOTepHo снстемы, а так>ке ее взаНМОСВЯ3L11 с друrнмн снстемнымн компонентамн. 4. Оnре,lJ,елть THnbI данных, нспользуемые с мнкроконтроллерамн. 5. Выnолнть npe06pa30BaHH между заnнсми 4нсел в разлнчных 06Ы4/-10 нспош) зуемых снстемах С4нслеIШ. 1 . 1. ОСНОВЫ КОМПЬЮТРНОЙ архитектуры Нан60лее pacnpocTpaHeHHa apxHTeкrypa KQnblOTepoB НЛЛlOстрнруетс 6лок cxeMO, npe,lJ,CTaBJleHHO на рнс. 1.1. Впервые зта -pXHTeKTYpa 6ыла nреAflожена н HC ПОЛЬЗ0вана ЧаРЛЬЗ0М Бе66нджем (Charles Babbage) в ero (.днаЛНТН4еском ,lJ,внrателе» 8 1856 rоду ( http://www.cbi.umn.edu ). Она продолжает НСnОЛЬЗ0ватьс в качестве 6азо вой CHCTeMHO архнтектуры в 60льwннстве cOBpeMeHHblx u.HCPpOBbIX компыоеров.. «АнаЛНТН4ескн двнrатель» пре,lJ,ставлл c060 MexaHH4eCKH компьютер, I1РНВО,lJ,НМЫ в дествие PY4KO. В 60лее не,lJ,авнее BpeM перед повторным открытнем ра60Т Чарльза Бе66нджа архнтектура KOMnblOTepa npHnHcbIBanacb )].>Кону фон HeMaHY,  он ОПLl1сал ее BeCHO 1945. CerO,lJ,H 06 3TO apxHTeкrype 4qCTO rOBopT как 06 архитектуре фОН Неймана. В rllaBe 2 мы 6У,lJ,ем рассматривать ,lJ,pyrylO apxHTeкrypy компыоера,' KOTopa Ha3ЫBaeTC rарваРДСК9Й архитектурой. 3та apxHTeкrypa не так wироко распространена, как apxHTeкrypa срон HeMaHa, О,lJ,нако нменно она нсnользуетс в мнкроконтроллерах ceMeCTBa PIC.  .. BBOДBЫBOД r ЦП r Память    ШИНЫ  Рнс. 1.1. Блок-схема KOMnbIOTepHO системы 
8 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Центральный процессор (ЦП) Показанна 6локсхема компыоернойй снстемы, XOT LI1 является ПрОС10Й, однако содер>КLI1Т трн основных 6лока, отра>каlOЩНХ архнтектуру 60ЛЬWLI1нства cOBpeMelH IbIX цифровых компыоерныыx снстем. Ее rnaBHbIM звеном влется ЦП (центраlJl.)НЫЙ flpO цессор)  зnемент, осуществлIOЩНЙ управленне ра60ТОЙ снстемы. PaHHLI1e процессоры предстаВЛJlН c060 мехаНН4ескне снстемы,  такне, как «анаnНТLI1ческнй двиr-атеш>)), аРLl1фмометры н т.Д., которые WИрОКО НСПОnЬЗ0ваnнсь в 70x rодах проwлоrо стоnеТLI1Я. Первые цнсрровые злектронные компыоерыы первона4ально создаваnLl1СЬ с LI1СПОЛЬ30 l3aHLI1eM электронных ламп, а позднее  транзнсторов. Современные компыотер"ые CLl1C темы создаlOТС на 6азе HHTerpanbHbIX схем, НСПОnЬ3УlOЩLl1Х КМОП TeXHonorHIO. Вторым H3MeHIOw,HMC свойством ЦП BneTc ero TaKTOBa частота. Тактоuая частота ЦП BapbHpyeTC в WHpOKHX предеnах, cocTaBn в настощее BpeM lIеСКОJII.)КО Merarepu. ДJl мнкроконтроллеров LI1 вплоть до HecKOnbKHX rнrаrерц ДJl 60лее МОЩIIЫХ процессоров, нспользуемых в HacTOnbHbIX компыоерныыx CLl1CTeMaX. Меrаrерцоuые (мrц) снстемы  зто CLl1CTeMbI, основанные на НСПОЛЬЗ0ваннн тактовой частоты в MLI1J1 nLl10H нмпульсов за секун,lJ,У (4астота в однн нмпуnьс за секунду называется частотой u 1 repu.), в то BpeM как rиrаrерцовая (rrц) система  это CLl1CTeMa, оснопаll"а на TaKTO вой 4астоте в мнnлнар,lJ, нмпульсов в секун,lJ,У. XaHЦY Рудольсру rерцу (Heiппch Rudo/f Hertz) (http://www.ideafinder.com/history/inventors/hertz.htm) выпала чесrь Iшзвать CBO LI1M нменем еднннцу H3MepeHH KOnH4ecTBa нзмененнй полрностн переменноrо тока за секунду (первона4ально зта e,lJ,HHHu.a называлась "u.нклы за секунду"). XOT тактопа частота мнкроконтроллера нлн мнкропроu.ессора мо>кет не ука3ЫВа1Ъ КОЛН4ество KO манд, которые онн ВЫПОЛНlOт в секунду, однако она непосредственно опредеJlет 6ы стродействне снстемы. Т04ное KOnH4ecTBo команд, выпоnнемых в секунду, определ- eTC внутренней KOHCTpYKЦHe ЦП, сложностыо выполнемых команд, а также выпол- HeMЫMH проrраммамн. Одно можно сказать HaBepHKa: eCnH компыоерp на 10мrц сравннть с KOMnblOTepoM на 2 rru., то BTOpO компыоерp Т04НО окажеТС51 60nee быстрым. THn мнкропроu.ессора может также определть ero 6ыстродейстuне. Процессор ТLI1па RISC (компыоерp с сокращенным на60РОМ команд) представлет с060Й устройст во, которое ВЫПОJlнет О,lJ,ну коман,lJ,У на ка>K,D,ЫЙ тактовый нмпульс, ПрLl1 этом el-o на60Р команд СО,lJ,ержнт только 6аЗ0вые команды. Процессор тнпа CISC (компыоерp с COKpa w,eHHbIM на60РОМ коман,lJ,) может выполнть HaMHoro 60льwе ра3ЛLl1ЧНЫХ команд, в сравненнн с компыоеромM тнпа RISC, О,lJ,нако выполненне некоторых команд тре6ует более O,lJ,HOrO TaKToBoro перНО,lJ,а. CerO,lJ,H зтн термнны cTanH HecKOnbKO pa3MbITbIMLI1, поскольку 60ЛЬWННСТВО мнкропроu.ессоров ИСПОЛЬ3УlOт ком6ннаu.ию CISC н RISC тех- нолоrнй с u.елыо выполненн 60nbWHHcTBa команд в рамках одноrо TaKTOBoro пернода, ПрИ этом некоторые Н3 ннх  такне как процессоры ceMeCTBa Pentium@ от Intel, UЫflOЛ нют MHorHe коман,lJ,Ы Bcero лнwь за одну треть TaKTOBoro пернода. ПрLl1 этом в новых компыоерахx 4асто СО,lJ,ержнтс несколько 6локов u.еn04нслеНIЮЙ аРLl1фмеТLI1КLI1, К010рые pa60TalOT однопременно. Задача ЦП. ЦN ответственен за выполненне pдa последоuатеnьных команд, OpraHLI1 З0ванных в rруппы коман,lJ" которые Ha3bIBalOTc проrраммамн. ФактнчеСКLI1, единст венное, 4ТО ЦN может ,lJ,enaTb - зто выполнть команды от момента пода4Н на Hero Ha пря>кеIlН пнтанн вплоть .0.0 момента ero BbIКJlI04eHH. Проu.ессор HeyroMHMo LI1звле кает команды Н3 памтн н выполнет НХ. 3та последовательность нзвле4енн н выпоn HeHH коман,lJ, ДJlHTC до тех пор, пока на ЦП прнсутствует напрженне пнтаIlН. Идея ЦП н спос06, которым он доnжен ра60тать, 6ыла впервые преДJlожена ЧаРЛЬЗ0М Беб бид>кем. С тех пор онн не LI13MeHnHcb н BepOTHO OCTaHYТC TaKLI1MLI1 >ке еще KaKoeTO 
rnaBa 1. BBe.u.eHHe в архитектуру компьютеров 9 BpeM. Более новые KOMnblOTepbI ВЫnОЛНlOт 60лее OДHO команды О,lJ,новременно, так как ЦП сраКТН4ескн состонт Н3 p,lJ,a арнсрметнческнх н лоrН4ескнх npou.eccopoB. Неко- торые Н3 самых последннх KOMnblOTepoB HMelOT несколько ,lJ,ep. MHoro,lJ,epHbI компь- IOтер  зто KOMnblOTep, В мнкросхеме npou.eccopa KOToporo HMeeTC 60лее O,lJ,HOrO мнк- ponpou.eccopa. nporpaMMa KOMnblOTepHo снстемы  это на60Р коман,lJ" crpYnnHpoBaHHbIx после ,lJ,овательно, которые ВЫПОЛНlOтс KOMnblOTepoM одна за OДHO. Напрнмер, nредполо- жнм, 4ТО nporpaMMa ,lJ,олжна npH6aBHTb 6 к 2. Первым waroM (нлн KOMaHДO) 6удет И3 вле4енне Н3 памтн 4нсла 6. Вторым warOM 6У,lJ,ет нзвле4енне 4исла 2. Третнй war 6y дет заКЛlO4атьс В сложеннн 6 н 2. ЗаKJl104нтельна onepau.H 6удет COCTOTb в coxpaHe ннн суммы в какомлн60 месте naMTH. Как НЛЛlOстрнруетс зтнм прнмером, простая зада4а сложенн 6 н 2 раз6нваетс на warH, называемые командамн. 3тн команды CPOpMHPYIOT сле,lJ,УIOw,уlO nporpaMMY, KOTopa выполнетс MHKponpou.eccopoM НJ1Н MHK роконтроллером: 1. nОЛУ4НТЬ 6. 2. nОЛУ4НТЬ 2. 3. Сложнть 6 н 2. 4. Сохраннть сумму В naMTH Кажды war 3TO npocTo nporpaMMbI nepeBO,lJ,HTC на 3ЫK, KOTOpЫ KOMnblOTep поннмает. 3тот 3ЫK Ha3ЫBaeTC MawHHHbIM 3ЫKOM. MawHHHbI 3ЫK  это nоследова тельность 4нсел, которые nре,lJ,ставлIOТ команды. Еслн rOBopHTb о rHnoTeTH4ecKoM ЦП, то «KOMaHДO нзвле4енн Н3 памтн», может 6ыть 4НСЛО 00, KOMaH,lJ,O сложенн может 6ыть 4НСЛО 01, а KOMaH,lJ,O заnомннанн в naMTH может 6ыть 4HCnO 02. Ааllная I1pO rpaMMa на 4нсленном MawHHHoM 3ЫKe 6удет нметь ВН,lJ,: 00 06 00 02 01 0200, НJШ как зто показано В npHMepe 1.1. Пример 1.1 00.06 00 02 01 02 00 Как можно ВН,lJ,еть Н3 3Toro npHMepa, HanHcaHHe 4нсленных MawHHHbIx КО,lJ,ОВ  зто rpOM03,lJ,Ka н заnуТанна npou.e,lJ,ypa. К C4aCTblO, ce4ac уже ннкто не nHweT nporpaMMbI В 4нсленных MawHHHbIx КО,lJ,ах, XOT В раннне ro,lJ,bI KOMnblOTepHo зры зто ,lJ,елалось. Вместо 3Toro сталн НСnОЛЬЗ0вать ннструмент, называlOw,нся ассем6лср. Прн 310М nporpaMMa заnнсываетс В снмвольно срорме с НСПОЛЬЗ0ваннем Мllемоннческнх 060 3Ha4eHH КО,lJ,ОВ onepau.H,  такнх как GET н АОО. Ассем6лер, KOTOpЫ так>ке явлется nporpaMMo, npe06pa3yeT nporpaMMY, HanHcaHHYIO на снмвольном 3ЫKe ассем6лера, в 4нсленные MawHHHbIe КО,lJ,Ы. nporpaMMa на 3ЫKe ассем6лера, KOTopa reHepHpyeT про rpaMMY, показаннуlO В npHMepe 1.1, может нметь ВН,lJ" nоказанны в npHMepe 1.2. Пример 1.2 GET 6 GET 2 АDD STORE О Аа>Ке н TaKa заnнсь nporpaMMbI ,lJ,остаТ04НО rpOM03,lJ,Ka, О,lJ,нако она, по крайней мере, 601lее 4HTa6enbHa, 4ем nосnе,lJ,овательность 4Hcen. По ПРН4Нllе Toro, 4ТО nporpaMMbI на 3ЫKe ассем6лера MOryr 6ыть достаТ04НО длнннымн, а нх напнсанне HHOr,lJ,a может nредставnять c060 ВЫ30В nporpaMMHcry, в современном nporpaMMHpoBaHHH, как правнло, ,lJ.Il reHcpau.HH 
10 ITpHMeHeHHe МИКрОКОНТролnеров PIC 18 MaWL/1HHbIX кодов Hcnonb3YIOTc ЯЗblКИ проrраммирования BblCOKoro уровня. Язык nporpaM ML/1pOB3HH BbIcOKoro ypoВl - это nporpaMMa, KOTopa npHHL/1MaeT в ка4естве входа псевдо aHrnonoA06HbI язык, а затем прео6разует ero в 4НСЛОВОЙ маwннный код. ПрнмераМL/1 TaKL/1X 3ЫKOB MOryт 6ыть BASIC, С, с++ HnH Java. Уже paCCMOTpeHHa nporpaMMa мо>кет 6ыть напи сана на 3ЫKe С, как показано в прнмере 1.3. Пример 1.3 char answer; answer = 6+2; IlотвоАМТСЯ MeC'ro AnЯ ответа I I вьmоnняется cnoeHMe м Ilсохраняется сумма в lIepeMeHHO iшswс;r Как видно Н3 этой CnpOrpaMMbI, прн HanHCaHHH nporpaMMbI на 3ЫKe BbICOKOfO YPOBH, нужно MeHbwe вводнть L/1нсрормацнн с KnaBHaTypbI, нет неоБХОДL/1МОСТИ 3HaТl) MawHHHDIe коды нли 4исnенные 3Ha4eHH адресов памтн, кроме Toro, этL/1 nporpaMMbI HaMHoro леr48 4итаIOТС. Маwннный код, rенеРL/1руемый языком С, мо>кет 6ыть не СТОJII) эсрсреКТL/1ВНЫМ, как код, reHepHpyeMbI acceM6nepoM, однако nporpaMMbI на С HaMlloro леr4е пнсать, nOHHMaTb н 06служнвать. Кроме Toro, nporpaMMbI на С пнwутся HaMHoro быстрее, 4ем на ассем6лере, а 06У4енне HanHcaHHIO nporpaMM на С тре6ует HaMHoro MeHbwe вреМ8НН н YCL/1nH. V1MeHHo по 3TO npH4L/1He nporpaMMHoe 06еспечеНL/1е 4асто разра6атывается с L/1CnOnb30BaHHeM 3ЫKOB проrраммнровани BDIcoKoro ypOBH. Про ,раммное обеспечение компыоернойй снстемы  это ее nporpaMMbI, а аппаратнос 06еспе4енне  это эnектронные схемы компыоернойй системы. Иноrда nporpaMMHoe 06еспе4енне рассматрнвает аппаратное 06еспе4енне как переменнуlO BenL/14L/1HY, по cKonbKY оно H3MeHeT нnи MO,lJ,HcpHu.HpyeT спосо6 СРУIIКЦL/10ннроваНL/1Я аппаратных средств. 3то 0006еНIIО сnраведnиво An MHKpOKoHTponnepHbIx систем. Интересна отметнть, 4ТО ABrycTa Ада Барон (Augusta Ada Byron) (позднее, после выхода замуж з(l ЛОр,lJ,а Байрона  rpacpL/1H Лавnес (Lovelace)) заСЛУ>КL/1ла РСПУТ3ЦL/11О первоrо KOMnblOTepHoro nporpaMMHcTa. Это npoH30wno по ПрL/1ЧL/1не Toro, что она ПL/1салз проrраммы на 4HcneHHoM мащннном 3ЫKe Щl Чарnьза Бе66L/1д>ка L/1 ero «allаJlL/1тическо ro ABHraTen». В ее 4CTb 6ыл назван 3ЫK проrраммнроваllL/1Я Ada, который ИСIIOJIIJЭО Banc Мнннстерством 060РОНЫ США. ФУНКЦИИ цп. цn в компыоернойй CL/1CTeMe BbInonHeT TpL/1 OCllOBHbIC эздаЧL/1: (1) fюре нос данных, (2) арисрмеТИ4ескне н nоrнчеСКL/1е операЦL/1L/1 L/1 (3) управлет ПОСJ\СДОI33 телыюстыо выпоnнеНL1Я nporpaMM. Перенос данных - это одна L/1Э Н3L/1БОJ\се часто вы- полнемых за,lJ,а4 цп. Больwа 4асть временн ра60ТЫ ЦП расходуется на переllOС дан- ных. Пере нос данных ВКnЮ4ает нзвлечеНL/1е команд L/13 паМЯТL/1, 06мен данными ме>кду perHcTpaMH нлн 4ейкамн памтн, а так>ке nepeMew,eHHe резуnьтатOIЗ некоторых лоrL/1 4eCKL/1X HnH арнсрмеТН4ескнх операu.нй ме>КДу naMTblO н ЦП НЛL/1 между УСТРОЙСТlЗ3МL/1 BBoдaBЫBoдa н ЦП. Та 4асть зада4Н переноса данных, которая свзана с L/1зш!СчеНL/1СМ команд Н3 памтн, влетс HaL/160nee 4асто выполнемо н важно операЦL/1ей, реалн- зуемо ЦП. Извле4енне коман,lJ, Н3 памтн nозволет ЦП выпоnнять проrраммы, эarlL/1 санные в naMTL/1 CL/1CTeMbI, с высокнм 6ыстродействнем. КонцеrЩL/1 сохраl/яемой про- ,раммы AenaeT компыоерp весьма MOW,HbIM устройством - она 6bIna впервые предло >кена также Чарльзом Бе66L/1д>кем. БОЛЬШL/1НСТВО проrрамм по крайнсй мсрс 50% BpC мени cBoero выполнеНН51 занты nepeMew,eHL/1eM данных, 4асто этот процент 6удет нз- MHoro более BbICOKL/1M. В та6л. 1.1 перечнслены некоторые Н3 11aL/160nee распространсн IILJIX операцнй переноса данных, BbInOnlleMbIx 60nbwHHcTBOM ЦП. 
rnaBa 1. BBe.u.eHHe в архнтектуру компьютеров 11 Таблица 1.1. Нан60лее распространенных Onepau.H переноса ,lJ,анных Операция Комментарий Память -> Реrистр операций M3BneqeHMe onepaUMM С занесенмем Ee В pe. rMCTp onepaUM Память -> Реrистр данных M3BneqeHMe Аанных М3 naMRTM с занесенмем мх В perMCTp Аанных . "..., ................ ... Реrистр данных > Память Сохраненме Аанных М3 perMCTpa Аанных В Rqейке naMRTM Реrистр данных > Реrис'Х'р данных Оеренос COAepMMoro perMCTpa Аан HX В APY rой perMCTp Аанных Реrис'Х'р данных > BBOДBЫВOД Оеренос СОАеримоrо perMCTpa AaHlНЫx в YCT POCTBO BBOAa-ВЫВОАа Ввод-вывод > Реrистр данных Оеренос COAepMMoro YCTpOCTBa BBOAaBЫBOAa В perMCTp Аанных На выnолненне арнсрмеТН4ескнх н лоrН4ескнх операu.н ЦN тратнт на MHoro меньше временн, 4ем на onepau.HH переноса ,lJ,анных. 04ень 4асто nporpaMMbI ',.pe6YIOT, 4т06ы ЦN уделял арнсрмеТН4ескнм н лоrН4ескнм onepau.HM только не60ЛЬШО  npou.eHT CBO ero временн. В та6л. 1.2 nере4нслены THnH4HbIe арнсрмеТН4ескне н лоr'Н4ескне onepa- u.HH, uыnолняемые ЦN. 3тн onepau.HH 06Ы4НО ВЫnОЛНЯlOтся u.еЛ04нслеНlrlЫМ apHcpMeTH 4ескнм YCTPOCTBOM. ЦN не мо>кет ра60тать с ,lJ,ествнтельнымн 4нслам н 6ез нспользо вання cooTueTCTBYIOW,HX nporpaMM лн60 YCTpOCTBa, называемоrо арифметическим устройством или цифРОВblМ процессором. MHKpOnpOu.eccop часто СОД,ер>кнт, наряду с u.еЛ04нсленным npou.eccopoM, так>ке н u.HCPPOBO проu.ессор, в то upefv JЯ как MHKpOKOH троллеры 04ень ре,lJ,КО UКЛlO4аlOТ u.HcppOBO npou.eccop. Таблица 1.2. 06Ы4ные арнсрметнческие н лоrV',4ескне операции . Операция Комментарий Сложение MeAY perMCTpaMM, perMCTpoM м naMRTb MnM С Henoc :peACTBeHHbIМM Ааннымм. Вычмтание MeAY perMCTpaMM, perMCTpoM м naMRTb млм С Heno' ::реАС'l'венными Ааннымм. Умножение MeAY perMCTpaMM, perMCTpoM м naMRTb MnM С Heno cpeAc'rBeHHbIМM Ааннымм; pe3YnbTaT MoeT мметь YABoeHH opMaT Деление MeAY perMCTpaMM, perMCTpoM м rraMRTb MnM С Henc )среАС'l'веннымм Ааннымм; pe3YnbTaT MoeT мметь YABoeHHbrn opMaT . (Некоторые MMK pOKoHTponnepbl не BblrronHRT onepaUM AeneHMR.) Инверсия Знак qMCna M3MeHReTCR И Лоrмqеское n06MToBoe М MeAY perMcTpaMM, perMC'I 'ром м паМR'l'Ь MnM С неnосреАственнымм даннымм или Лоrмqеское n06MToBoe ММ MeAY perMcTpaMM,. per11c'rpoM м naMRTb млм С HenocpeACTBeHHbIМM Ааннымм ИСlCJIJOчитель Лоrмqеское n06MToBoe MCKnqMTenbHoe ММ MeAY perMC'I'paMM, pel'M. ное или стром м rraMRTb MnM С неnосреАственнымм AaHHЫNIM НЕ Лоrмqеское rr06MTOBoe НЕ Meдy реrмстрамм, perl- ICTpOM м naMR'rb MnM С неnосреАственнымм Ааннымм Нан60лее MOW,HO CPYHKu.He, выnолняемо ЦN, является er:o cnoc06HoCTb MOДH cpHu.HpoBaTb ХО,lJ, потока коман,lJ, nporpaMMbI 4ерез нсnользован не простых чнсловых решенн. Управление выполнением команд проrраММbI 06ecn е4нвает возможность MHorOKpaTHoro uыnолнення в nporpaMMe CeKu.HH лн60 CeKu.H nporpaMMHoro КО,lJ,а. Ko ман,lJ,Ы уnравлення uыnолненнем коман,lJ, nporpaMMbI так>ке nОЗВОЛЯlOт nepe,lJ,aTb ynpal3 
12 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 леНL/1е выполненнем nporpaMMbI CPYHKu.HH нлн nроu.едуре. V1MeIOTc условные L/1 безус ловные команды nереда4Н уnравленн. npHMepaMH команд безусловно nередаЧL/1 уnравленн ВЛlOтс команды GOTO н команда ВЫЗ0ва CPYHKu.HH CALL. Команды услов HO nередачн уnравлеНL/1 обесnе4L/1ваlOТ возмо>кность npoBepKH 4L/1сел на нх COOTBeTCT вив каКНМJlL/1бо условнм с u.елыо оnределенн Toro, дол>кна лн МОДНсрL/1цнроватьс последовательность уnравлени выполненнем nporpaMMbI. Условные команды. уnравлення последовательностью выnолнення проrраммы оБЫ4НО npoBepIOT 4нсла с u.елыо оnределенн Toro, ВЛlOтс лн онн нулевымн, нмел ЛL/1 место перенос после сло>кенн, лнбо Toro, вляетс лн результат оnераЦНL/1 отрнца- тельным ЛL/1бо nоло>кнтельным. В табл. 1.3 nере4нслены MHorHe L/1з оБЫ4НО nроверяемых условн ДJl больwннства цn. Условные команды уnравленн nоследовательностыо выnолнеНL/1Я проrраммы оБЫ4НО составлIOТ небольwо npou.eHT от всех команд, со- ставлlOw,нх ТНnНЧНУIO nporpaMMY, однако зтн команды делают цn MOW,lIbIM КОМIlОIЮН том KOMnblOTepHo снстемы, надел ее способностью npHHHMaTb решення. HanpL/1Mep, как мо>кет компыоерp оnредеЛL/1ТЬ, то, 4ТО с KJlaBHarypbI введено, HanpHMep, 4НСЛО 3? Он ,lJ,елает зто, OTIHL/1Ma 3 от введенноrо чнсла, а затем npoBepeT, не влетс лн резуль тат нулевым. Еслн результат нулево, то последовательность выnолненн nporpaMMbI моднсрнu.нруетс такнм 06раЗ0М, 4ТО как peaKu.H на ввод с KJlaBHarypbI 4нсла 3 выnол HeTC опредеJ1енна зада4а. Здесь возннкает НЛЛlOзн Toro, 4ТО компьютер мо>кет ду- мать н раССУЖJ'J,ать о npH4HHax ввода 4нсла 3 с клавнаryры, хотя в дествнтельностн едннственное, 4ТО он делает - так зто BbI4L/1TaeT 4НСЛО 3 Н3 введенноrо 1L/1сла, а затем npoBepeT, не влетс лн результат нулевым. Что делает KOMnblOTepHYIO снстему мощ ным ннструментом? Коне4НО >ке, - nporpaMMHoe обесnе4енне, HanHcallHoe nporpaMMH стамн, нбо нменно оно создает НЛЛlO3НIO TOro, 4ТО KOMnblOTep мо>кет думать н paccY>K дать. Таблица 1.3. Условн, npoBepeMbIe MHorL/1MH цn. Условие Ноль Пере но с Знак Переполне ние Комментарий ЯВnRеТСR qMCnO нуnевьш MnM нет? Ммел MnM не MMen место перенос? Чмсnо поnомтеnьно MnM OTpMuaTenbHO? HeKo'ope ЦП ВПОnНRТ проверку на apMMeTM4eCKoe nерепоnненме Память naMTb - зто 4pe3BЫ4aHO Ba>KHЫ компонент KOMnblOTepHo снстемы, поскольку она 06ecne4HBaeT место ДJl pa3Mew,eHH проrрамм, а так>ке данных, нсnользуемыx в nporpaMMax. Без n aMTH компыoерна снстема была бы не БОJlее MOW,HO L/1ЛН быст po, 4ем оБЫ4НЫ каJlЬКУЛТОР на 4етыре дeCTBH. npH наЛН4НН naMTH компьютер nОЛУ4ает досryn к командам, xpaHw,HMc в НЕЙ. Он L/1звлекает нх oтryдa с 04ень высо- KO CKOpOCTblO. "АнаЛНТН4еСКL/1 ,lJ,внrатель" Чарльза Беб6нД)Ка нмел naMTb объемом в 1000 4нсел по 20 ДI9СТН4НЫХ разрдов. 3тот KOMnblOTep так>ке ВЫnОЛНJ1 nporpaMMbI, xpaHw,Hec в nамти. С МL/1кропроu.ессорамн н МНКРОКОНТРОJlлераМL/1 НСnОЛЬ3УlOтс два THna nамятн: nocToHHoe запомнн alOw,ee YCTPOCTBO (ПЗУ) L/1 onepaTHBHoe заnомннаюw,ее YCTPOCTBO (ОЗУ), которое ew,e иноrда называlOТ заnомннаlOw,L/1М YCTPOCTBOM с nроизвольно BЫ борко (зУnв). ПЗУ в мнкроконтроллерных снстемах храннт стаТН4ескне данные, как HanpHMep npOrpaMMI::.I, а так>ке константы, нсnользуемые в nporpaMMax. Большннство встроенных мнкроконтроллерных НЛL/1 мнкроnроцессорных снстем coxpaHIOT только 
rnaBa 1. BBe.u.eHHe в архнтектуру компьютеров 13 одну проrрамму в памти, KOTopa срункционирует как операционная система. ОЗУ 13 микроконтроnnерной системе хранит динамические данные дл системы. Ва>кно OTMe тить, что дисковые накоnитеnи, а также ApyrHe под06ные YCTpOCTBa, не рассматрива IOTC как памть, а С4ита1OТС устроствами BBoдaBЫBoдa, XOT они и xpaHT данные LI1 проrраммы. Это разnнчие делаетс в сипу Toro, что дисковые накопители и подобные нм YCTpOCTBa TpaKTYIOTc иначе, чем памть, при ПОДКЛlOчении к системе. Драйвер (проrрамма, KOTopa уnравлет YCTPOCTBOM BBoдaBЫBoдa) дисковоrо накопитеn пе- реАает в ДИСКОВЫ накопнтель не60ЛЬШО 06ъем ннсрормацин дл Toro, чт06ы заста вить ero работать. Cyw,ecTBeHHoe отлнчне в случае пзу или ОЗУ состоит в том, что дос- туп к зтим устройствам nроцессор ocyw,ecTBneT не 4ерез драйвер, а непосредственно через pд проводов, идуw,их от запоминаlOw,еrо YCTpOCTBa к ЦN и которые непосред ственно управnютс сиrнаnами, выдаваемыми ЦN. пзу. пзу в COBpeMeHHO компыoерно системе  зто, как правило, стираемое про rраммируемое постонное ЗУ (СnnЗУ), зnектрически стнраемое nроrраммируемое постонное ЗУ (3СnnЗУ), а HHorAa  запроrраммированное на предпринии изrотовителе ПЗУ. Как СnnЗУ, так н ЭСnnЗУ спос06ны сохранять инсрормаu.иlO IlрИ- 6лнзнтельно на nрот>кенин 20 лет илн до момента их стирани. Фабрично запроrраммированное ПЗУ запроrраммировано HaBcerAa. СnnЗУ мо>кет 6ыть стерто примерно вплоть до 100 раз, в то BpeM, как 3СnnЗУ мо>кет стиратьс от 10000 до 1000000 раз, в зависимости от Toro, KorAa н кем оно 6ыло нзrотовлено. СnnЗУ исnользуютс у>ке довольно давно. 3ти YCTpOCTBa не06ходимо нзвлекать И3 системы, если ну>кно выполнить их стнрание. СnnЗУ стирается, 6удучи nOMew,eHHbIM под интенсивное ультрасрнолетовое 9БЛУ4ение в те4ении в среднем от 1 О до 20 минут. СП ПЗУ спос06но 06есnе4ИТЬ скорость доступа  4тени пордка около 100 нс. ЭСnnЗУ стираетс злеКТРИ4ески 6ез ero извnе4ени И3 системы. ЭСnnЗУ 4асто назы вают срnзшпамтыо. 3то YCTPOCTBO также спос06но 06еспе4ИТЬ скорость доступа я 4тени пордка OKOnO 100 нс. Основное ero ОТnИ4ие от СnnЗУ заКnlO4ается в том, что BpeM стнрани 3СnnЗУ BneTC HaMHoro 60лее коротким. В типичном случае  3СnnЗУ время CTHpaHH составлет мнллисекун,lJ,Ы, в то BpeM как  СnnЗУ  мину ты. Современные распространенные nрнменени 3СnnЗУ ВКЛlO4аlOТ системны BIOS (6азова система BBoдaBЫBO,lJ,a) в nерсональных компьютерах; срлешнакопнтели USB (имеlOw,ие Ha3BaHH JuтpDrives™, PocketDrives™, PeпDrives™ нли ThuтbDrives™), за меНIOw,ие накопители на rH6KHx маrнитных дисках в 60льшннстве компыоерныыx сис тем, а также аудиоплееры МРЗ. ОЗУ. ОЗУ системы мо>кет 6ыть ли60 стаТИ4еским ОЗУ (СОЗУ), либо динамическим ОЗУ (ДОЗУ). 06а названные типа памти ВЛIOТС разрушаемыми, Т.е. они не 06еспе4ива IOТ сохранени инсрормации после ОТКЛ104ени наnр>кени питани. СО ЗУ сохраняет данные в 4eKax памти, наnр>кение питани на которые подается постоянно. Это делает их 6ыстрыми, но также ведет к зна4ительному расходу моw,ности. YCTpOCTBa СОЗУ 06еспе4иваlOТ BpeM доступа пордка 1 нс н менее, 4ТО делает их ОТЛИ4НЫМИ KaH дндатами на НСПОЛЬЗ0ванне в ка4естве системной памти компыоеров,' еслн закрыть rлаза на BbICOKYIO потре6лемуlO MOW,HOCTb. АОЗУ XpaHT ннсрормацнlO в 4eKax naM тн, которые представлIOТ c060 КОН,lJ,енсаторы. Вследствне Toro, 4ТО конденсатор co xpaHeT инсрормациlO коне4ное BpeM, 4eKH АОЗУ ДОЛ>КНЫ пеРИОДН4ескн перезапи CЫBaTbC с целыо rарантин u.елостностн ннсрормации. npou.ecc пеРИОДН4еско переза- пнси данных в АОЗУ Ha3ЫBaeTC обновлением памтн. АОЗУ 06Ы4НО coxpaHeT инсрор мацнlO на прот>кении от 2 до 4 миллнсекунд, после 4ero ее ну>кно 06НОВJ\1Ъ. 06новле- ние инсрормаu.ни в АОЗУ тре6ует расходовани системноrо 'времени. Кроме Toro, ИН- 
]4 ITpHMeHcHHe микроконтроnnеров РТС] 8 срормация не мо>кет запоминаться и извлекаться ,lJ,а>ке при6лизителыю с TO >ке скоро- CTblO, 4ТО И В СОЗУ. Времена ,lJ,оступа к АОЗУ ле>кат в ,lJ,иапаЗ0Н около от 40 до 50 нс, 13 ТО время как время ,lJ,оступа M СО ЗУ мо>кет ,lJ,остиrать 1 нс и менее. Сеrодня АОЗУ ис- ПОЛЬ3УЮТС в 60JlЬWИХ KOMnblOTepHbIx системах, а СО ЗУ  в малых системах. 31 о 03Ha чает, 4ТО 60ЛЬWИНСПЮ микроконтроллеров не исnользует ДОЗУ, так как 06ъем памяти в них слишком мал. О,lJ,нако технолоrия меняетс и МОЖно надеться, что в скором f3pe мени потре6ляемая MOW,HOCTb СОЗУ СНИ3ИТС настолько, что ЗУ 3Toro типа 6удут ис ПОJlЬЗ0ваться в системах с 60ЛЬWИМ 06ьемом памяти, 4ТО принесет по крайней мерс 50-ти кратное ускорение 6ЫСТРО,lJ,ействия системной памяти зтих систем. BBOДBЪIВOД BBOДBЫBOД системы  3ТО связь ее ЦN с ,lJ,руrимн компыоерамии или JlIOД)МИ. Без BBO,lJ,aBЫBO,lJ,a ЦN мо>кет pewaTb зада4И, О,lJ,нако он не 6У,lJ,ет в состонии предстаf3И1Ъ результат JlIO,lJ,ЯМ или ,lJ,руrим KOMnblO'repaM. Всле,lJ,ствие wирокой l-IOменклвrуры уст- ройств BBO,lJ,a-вы, ВО,lJ,а nO,lJ,КJl104aeMbIX к ЦN, 60Jlьwая 4асть работы микропроцессоров иJlи МНКРОКОНТРОЛJlеров сопржена с орrанизацией взаИМQЦеtmи и ynfЭавленИя (4е- рез nporpaMMHbIe ,lJ,paBepы) YCTpOCTBaMH BBO,lJ,aBЫBoдa КОМпыоteрfОЙ систеМI. Се- rо,lJ,НЯ YCTpOCTBa BBO,lJ,aBЫBO,lJ,a реализуlOТ П04ТИ все воо6ра3ИМЫе за,lJ,Э.чи или срунк,,; u.ии. Большая 4асть зтой книrи посвяw,ена орrаннзаu.ии азаИМО,lJ,еЙ"СtВН мИlфОКОН троллеров с мноrими устройствами BBO,lJ,aBЫBO,lJ,a, а таК>Ке примеН(i,tи\О nporpaMMHbIx ,lJ,райверов ,lJ,Jlя их управления. Сре,lJ,И наи60лее pacnpoCTpaHetiHbIx YCTPOCTB [шода ВЫВО,lJ,а мо>кно назвать клавиаryру, 06еспе4иваlOw,уlO В03МО>кность ВВО,lJ,а инсрормацин\ а так>ке )lКК,lJ,исплен, пре,lJ,назначенные,,lJ,JlЯ вывода ин<рормации. В 06щем (}rta "t)e; 4ТО ПРОИЭВО,lJ,ИТ ИJlИ принимает элеКТРИ4еские СИП-iалы, мо>кет 6ыть ftMf10"l.itre  "'-бivl nblOTepy в ка4естве BHeWHero устройства. Шины Сое,lJ,инения между 6локами, показанными на боок...ехеме компыотеРllOЙ систе мы, называlOТСЯ шинами. Шина  3ТО на60Р ПРОВОДНИКОВ, которые несут ИlIсрормаu.иlO спеЦИСРИ4ескоrо Типа. компыоернаяя система нмеет три wины: (1) WИНУ адреса, (2) WИНУ ,lJ,анных н (3) WИНУ управлени. Wина а,lJ,реса несет aдpecHYIO инсрормаu.иlO, необ- ХО,lJ,ИМУIO ,lJ,JlЯ вы60ра 4ейки памяти нлн 4ейки BBO,lJ,a-вывода, шина данных нссет дaH ные, которые пере,lJ,аlOТСЯ между памятыо или устроствами вводаf3ЬШО,lJ,а и микрокон- троллером, а wина упраВJlения управляет 4тением ли60 записыо памяти или устройств BBO,lJ,aBЫBO,lJ,a. V1MeHHo 6лаrО,lJ,ар ИСПОЛЬЗ0вании Ha3f3aHHbIX трех шин, микроконтрол- лер становитс спосо6ным ВЫПОJlНЯТЬ nporpaMMbI, записанные в памяти системы, а так>ке упраВJlЯТЬ устроствами BBO,lJ,a-ВЫВО,lJ,а, nО,lJ,КЛlO4енными к системе. Шина адреса. Все KOMnblOTepbI имеlOТ WИНУ а,lJ,реса, сиrнальные линии которой П04ТИ BCer,lJ,a 060зна4аlOТСЯ как АО, AI, А2 н Т.,lJ,. Снrнал АО - 3ТО П03Иu.ия caMoro мла,lJ,wеrо раЗрЯ,lJ,а а,lJ,реса, сиrнал АI 3ТО nозиu.и сле,lJ,УIOw,еrо в сторону возрастани раЗрЯ,lJ,а а,lJ,реса и так ,lJ,алее. КОЛИ4ество прово,lJ,ОВ WИНЫ адреса или Сипалов изменяется от KOMnblOTepa к KOMnblOTepy. Например, еслн KOMnblOTep имеет 16-ти разря,lJ,НУIO aдpec HYIO шину (ПрОВО,lJ,ники KOTOpO HYMepYIOTc от АОдо А15), то он мо>кет адресовать 64К памти нли 64 Х 1024 (65536) 4eeK памяти запомннаlOw,е системы. V1спользуемый в KOMnbIOTepHO ,lJ,окументации и литературе символ «К» 0зна4ает 1024 или 210. мы мо>кем опре,lJ,елить КОЛИ4ество а,lJ,ресуемых Я4еек памти, B03Be,lJ, 4ИСЛО 2 в степень, раf3НУЮ КОЛИ4еству ПРОВО,lJ,ников wины а,lJ,реса Т.е. ПОЛУ4ИВ 216 в СЛУ4ае 16-разря,lJ,НО WИНЫ a,lJ, 
rnaBa 1. BBe.u.eHHe в архнтектуру компьютеров 15 реса. 3то 4НСЛО оnре,lJ,елет КОЛН4ество ,lJ,ВОН4НЫХ комбннаu.н (64К) ,lJ,Л СЛУ4а 16 разрядноrо адреса. АналоrН4НЫМ образом, снстема, KOTopa нмеет 20-разр,lJ,НУЮ WHHY а,lJ,реса, адресует 1 м 4eeK naMTH (220). 1 М 4eeK naMTH озна4ает 1 К умно>кенное на 1 К Я4еек нлн 1048576 4eeK. Разр,lJ,НОСТЬ WHHbI адреса колеблется от 12 разрядов (4К) в некоторых мнкроконтроллерах,lJ,О 40 разр,lJ,ОВ (1Т) в nосле,lJ,ННХ 64разрядных MLI1KpO nроцессорах Pentium (EMT64) от срнрмы Intel Corporation. В табл. 1.4 nеречнслены раз рядностн WHHbI адреса н объемы nамятн ДJlя p,lJ,a мнкроnроцессоров н мнкроконтрол леров. Ячекн nамятн HYMepYIOTc с нсnользованнем wестна,lJ,цатнрнчных 4нсел (основа системы счисления равна 16) от Я4екн номер О .0.0 макснмальноrо номера ячейкн ДJlя данной разрядностн WHHbI а,lJ,реса. HanpHMep, 4eKH naMTH 06ъемом 4К, которая нмеет 12-разря,lJ,НУIO aдpecHYIO WHHY, нумеруlOТСЯ от 4eKH nамятн номер 000.0.0 че KLI1 номер FFF в wестнадцатнрН4НО снстеме С4нсленн. Она СО,lJ,ер>кнт 1000 (wecTHa- ,lJ,цаТНРН41юе 4НСЛО) Я4еек nамятн. АналоrН4НЫМ образом, 4eKH naMTH объемом 64К, KOTopa нмеет 16-разря,lJ,НУIO a,lJ,pecHYIO WHHY, HYMepYIOTc от 0000 .0.0 FFFF в wecTHa ,lJ,цатнрнчно снстеме С4нсленн. 3та память СО,lJ,ер>кнт 10000 (wестнадцатнрнчное 4НСЛО) Я4еек naMTH. Anя nре,lJ,ставленн Ka>K,lJ,OrO разряда wестнадцатнрнчноrо адреса Tpe6yeTC 4раЗРЯ,lJ,ное ,lJ,ВОН4ное 4НСЛО. Шестна,lJ,цаТНРН4ные 4нсла 4асто заnнсываlOТ- си с нсnользованнем «Ох» nepe,lJ, 4НСЛОМ нлн 6уквы Н после 4нсла. npHMepaMH такой заnнсн MOryт 6ыть ОхЗА н ЗАН. Таблица 1 .4. Разря,lJ,НОСТЬ адреса н объемы nамятн. Разрядность адреса 10 разрядов 12 разрядов 16 разрядов 20 разрядов ЗО-разрядов Объем памяти Объем памяти в шестнадца Приме тиричной нотации чание Мер Мс6м rMr rM6M Тера Те6м Оета Ое6м Екса Екс6и Примечание: Киби, Меби, rиби, Теби, Пеби и Ексби являются предлааемыми на- именованиями единиц объема памяти 1 К ( 1, О 2 4 ) MnM 2 1 () 4К (4096 MnM 212) . 6 4 К (6 5, 5 3 6 ) MnM 216 1 М (1,048,576) MnM 220 1 G (1,073,741,824) MnM 230 400 1000 1 0000 100000 4000 0000 KMnO Км6м 40 разрядов 50 разрядов 60 разрядов 1 Т ( 1, О 9 9, 511, 6 2 7 , 7 6 6 ) MnM 2 4 О 1 О О О О О О О О О О 1Р (lК* 1 Т) MnM2 50 4 0000 0000 0000 IE (lК*lР) MnM2 60 1000000000000000 Шина данных. WHHa ,lJ,анных KOMnblOTepHo снстемы  3ТО оБЫ4НО ,lJ,вунаnравленна WHHa, KOTopa nepe,lJ,aeT ,lJ,анные Me>K,lJ,Y цn н naMTblO, а TaК)l(e.cHcTeMo BBoдaBЫBoдa. WHpHHa WHHbI ,lJ,анных, лнннн KOTOpO HYMepYIOTc от ОО .0.0 Оп, нзменетс. Как н в случае с адресамн naMTH, нулево разрд WHHbI ,lJ,анных (ОО)  3ТО самый МllадШLl1Й разр,lJ, WHHbI ,lJ,анных. 8-разр,lJ,НЫ KOMnblOTep 06Ы4НО нмеет 8разряднуlO WHHY дан- ных, 16-разря,lJ,НЫ KOMnblOTep оБЫ4НО нмеет 16 разря,lJ,НУIO WHHY ,lJ,анных н Т.,lJ,. В HeKO торых KOMnblOTepax WHHa ,lJ,анных В,lJ,вое wHpe, 4ем разр,lJ,НОСТЬ MaWHHHoro слова ЦП, что нмеет целыо увеЛН4НТЬ скорость ннсрормацнонноrо 06мена. Так, мнкроnроцессор Pentium от срнрмы Intel влетс З2-разр,lJ,НЫМ npou.eccopoM, KOTOpЫ нсnользует 64разр,lJ,НУIO WHHY ,lJ,анных. 
16 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 Шина управления.Ламть н YCTpOCTBa BBoдaBЫBoдa, ПОДКЛlO4енные к MHKpollpou.ec- сору, должны 6ыть 06ъектом управлени. Шина управления выполнет 3ТУ задачу через считыванне снrнала, KOTOPЫ 4асто Ha3ЫBaeTC А9, н запись снrнала, KOTOpЫ 4асто Ha3ЫBaeTC WR. 06ратнте вннманне, что пере4еРКНуТые снмволы (в ne4aTHoM тексте - 4ерта сверху) 03Ha4alOT прнставку "НЕ", Т.е. они YKa3bIBaIOT, что сиrнал 6удет активным в нулевом COCTOHHH. Напрнмер, снrнал RG (С4нтывание) иннциализирует c4HTbIBaHLI1e тоrда, коrда он HaXOДHTC в COCTOHHH лоrН4ескоrо нул. V1ноrда символ # нсnользуетс ДJl указанн Toro, 4ТО снrнал влетс актнвным в нулевом СОСТОНLI1И, как, например, #RD. Коrда мнкроконтроллер нзвлекает команду Н3 naMTH, 011 pa3Mew,aeT адрес пам тн на шнне адреса, затем снrнал C4HTЫBaHH переводнтс в нулевое состоние с тем, 4т06ы ннсрормнровать ЗУ о не06ходнмостн выnолненн операцнн 4TeHH, затем ,lJ,анные nepeHocTc Н3 памтн в MHKponpou.eccop 4ерез шнну данных. nодо6ным же 06раЗ0М аналоrН4ные шаrн ВЫПОЛНIOТС прн выnолненнн операцнн запнсн в памть, задача НСКЛlO4еннем Toro, 4ТО вместо снrнала 4TeHH мнкропроцессор выдает снrнал запнсн. Лю6ые друrне снrналы, передаваемые по шнне уnравленн, ВЛIOТСЯ специсрнческнми дл. кюкдоrо THna мнкропроцессора. Некоторые доnолннтельные сиrналы, передавае мые по WHHe уnравленн, 06ecne4HBalOT ввод прерыванн, а так>ке ВЫnОЛНIOТ ра3ЛН4 ные друrие срункцнн уnравлени, nOMHMo управлени naMTblO и npMoro управления KOMnblOTepHo -CHCTeMO. МИкропроцессор и микроконтроллер . Чарльз Бе66н.цж: постронл CBO KOMnblOTep на основе технолоrнн Toro временн, KOTopa носнла MexaHH4eCKH характер. Ero KOMnblOTep 6ыл сконструнрован с нсполь З0ваннем шестеренок н pbI4aroB. npH зтом механнзмы одоrрасрН4ескоrо THna нсполь З0Валнсь ДJl xpaHeHH 1000 20TH разрдных дeCTH4HЫX 4нсел в naMTH YCTpOCTBa. Ввод-вывод выполнлс 4ерез OTBepCTH, про6нтые в 6умажно ленте. 3тн ранние нден реалнзацнн MexaHH4ecKoro KOMnblOTepa некоторое BpeM npe6bIBaJlH в за6веНLI1И до тех пор, пока в двадцатом столетнн не повнлнсь 60лее современные KOMnblOTepbI. Корпорацн IBM создала целуlO и ндустрн 10 , OCHOBЫBaCb на НСПОЛЬЗ0ванин nep срокарт, которые домнннровалн в KOMnblOTepHbIx прнменених вплоть до середнны BOCbMHдeCTЫX rодов прошлоrо столетн. 3тн персрокарты (которые ew,e называлн Kap тамн Холлернта по нменн repMaHa ХОJlлернта (Herman Hollerith)  основател Kopnopa- цнн IBM) 6ылн мехаНН4ескнмн носнтелмн ннсрормацнн, которые НСnОЛЬЗ0валнсь ДJl реалнзаu.нн BBoдaBЫBoдa как в мехаНН4ескнх ВЫ4нслнтелх 50x rодов, так н в злек тронных KOMnblOTepax 60x rодов nрошлоrо столетн. Раннне механнческне KOMnbIoTe ры 4асто Ha3bIBaJlH С4етнымн MaWHHaMH  онн nporpaMMHpOBaJlHCb с НСПОЛЬЗ0ваннем nРОВОЛ04НЫХ переМЫ4ек. 3тн раннне машнны проложнлн дороry злектронным компыо- терам, которые 4асто называлн "MeHcppeMaMH". MeHcppeMЫ 6ылн дороrНМLI1 и 60ЛЬШНМН, с повленнем ннтеrральных схем онн устарелн. Процесс же полной nо6еды микропроцессоров на MeHcppeMaMH на4алс в 80x rодах прошлоrо столетн. nepBbI мнкропроцессор (4004) 6ыл создан cpHpMO Intel в 1971  3ТО 6ыл 4-разрдны ЦN, KOTOpЫ pa60TaJl на TaКТOBO 4астоте, paBHO 20 кrц, н адресовал naMTb с 4етырех6нтнымн 4eKaMH прн НСnОЛЬЗ0ваннн 12-разрдноrо адреса (4К). т ехнолоrн 6ыстро nроrресснровала н в конце 70x rодов мнкропроцессор срнрмы Intel стал 16разрдным npH 06ъеме naMTH в 1 М н TaКТOBO 4астоте в 6 мrц (.мнкроnроцес- сор 8086). Фнрма Motorola так>ке нзrотавлнвала мнкроnроцессоры н она тоже нмела ycnexH в оБJlастн TeXHOJlOrHH, BbInycTHB 32-разрдны мнкроnроцессор, KOTOpЫ aдpe совм naMTb 06ъемом 16 M6aT, pa60Ta на TaКТOBO 4астоте, paBHO 8 мrц (мнкро- nроцессор 68000). Было совершенно 04евидно, 4ТО Motorola имеет nреимуw,ество, oд 
rnaBa 1. Введение в архитектуру компьютеров 17 нако ей не удалос) добитьс доминируюw,еrо nоло>кеНLI1 на рынке. 3то, вероЯlНО, rlpo изошло по причине Toro, что IBM реwила использовать микропроцессор Intel в свосм персональном компьютере. Архитектура IBM LI1 МLI1кроnроцессоры Intel, блаrОАаря pe шению IBM, оказались на подъеме, микропроцессоры >ке Motorola были использованы в компьютерах Macintosh фирмы Apple, которые не получили TaKoro >ке успеха, как ПК срирмы IBM. НеАавно фирма Apple сообw,ила о том, что в ее новой линии KOMnbIOTepOB будут исnользоватьс микропроцессоры Pentium. Микроконтроллер, который nредставлет с060Й саМОАостаточную компьютерную систему, так>ке был СОЗАан Intel в 1977 как 8разрдное устройство (8048). Он cOAep>Kall микропроцессор, naMTb и обеспечивал возмо>кность подключения к устройствам BBO Аа-вывода. Микроконтроллер был спроеКТLI1рован в расчете на управление оборудова нием, а микропроцессор - как замена ЦN мейнфрейма. Первое широкое nрименение микрок6нrроллеры нашли в точечных матричных nринтерах FX80 фирмы Epson и в кла- виатурах nK IBM. nринтеры FX80 СОЗАаВaIlИСЬ на основе микроконтроллера 8048, что дало впервые возмо>кность поставить на рынок дешевые матричные принтеры. Кnавиа- тура СОАер>кала микросхему универсальноrd nериферийноrо интерфейса 8042 (UPI), которая была BbInyw,eHa в 1977 в качестве микроконтроллера, исnользуемоrо дл счи TbIBaHLI1 символов, вводимых пользователем с клавиатуры. 3то nрименение МИКрОКОII троллера привело к nовлению термина «встроенный контроллер» или «встроенный микропроцессор», потому что комnьютерна CLl1CTeMa была скрыта в APyroM изделии (в Аанном случае  в nринтере) LI1ЛLl1 встроена в Hero. По BHeWHeMY ВИАУ FX80 был nринте ром, XOT внутри он был компьютерной системой. То >ке самое .6ыло справедливо и в отношении клавиатуры  извне кnавиатура IBM была обычной клавиатурой, однако внутренне она была компьютерной .системой. Коrда в конце 80x rOAoB Intel отоwла от ИАеи микроконтроллера и универсально- ro nериферийноrо интерфейса, САелав вь!бор в пользу микропроцессоров, была соз дана срирма Microchip Incorporated, KOTopa реwила занть нишу в области микрокон троллеров в 1989 rOAY. С момента cBoero формироваНLI1, фирма Microchip стала лиАи- рУюw,им nоставw,иком технолоrLl1L11 8разрядных микроконтроллеров. При зтом Аа>ке название выпускаемых elO устройств  PIC (nерLl1ферLl1ЙНЫЙ контроллер интерфейса) было nредло>кено Intel неСКОЛЬКИМLI1 rOAaMLI1 ранее, так >ке как и noxo>Kee наименование устройства UPI (универсальный nерLl1срерLl1ЙНЫЙ интерфейс) 8042. 1.2.Сстемысчсленя V1сnользование микропроцессоров LI1 микроконтроллеров требует xopowero зна ния АВОИЧНОЙ, дестичной и шестнадцатиричной систем Fчислени. в 3ТОМ nодразделе изло>кены основные сведения по 3ТИМ вопросам, nреАназначенные для тех читателей, которые не знакомы с 3ТИМИ CLl1CTeMaMLI1 С4исления. В частности оnисываетс nреобра- зование между деСТLI1ЧНОЙ LI1 ДВОLl14НОЙ CLl1CTeMaMLI1 СЧLl1слений, дестичной LI1 wecTHa АцаТLI1РИ4НО, а так>ке AB0Ll14HO LI1 wестна,о,цаТИРИ4НОЙ c.LI1CTeM.aMLI1 С4L11сления. Цифры Перед тем, как мы будем nре06разовывать 4L11сла из CLl1CTeMbI счислеНLI1 с одним oCHOBaHLI1eM в систему СЧИСJlеНLI1 с ApyrLl1M oCHOBaHLI1eM, He06xoALl1MO nOHTb, что такое цифры LI1 какова их свзь с системой С4L11слеНLI1. В самом начале Hawe ,учебы в школе Mbl узнали, что десятичные числа (ocHOBaHLI1e CLl1CTeMbI счислеНLI1 равно 1 О) записыва- ются с использованием 1 Оти цифр  от О до 9. Первой цифрой в любо системе счи(}- лени BcerAa влетс ноль. 
18 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 HanpHMep, снстема C4HCJleHH с основан нем 8 (BOCbMHpH4Ha) нсnользует 8 u.исрр  от О до 7; а снстема C4HCJleHH с основан нем 2 (ДBOH4Ha) нсnользует 2 u.HcppbI: О н 1. Еслн основан не снстемы С4нсленн npeBbIwaeT 1 о, то НСnОJlЬ3УЮТС доnолннтельные u.HCPPbI, в ка4естве 0603Ha4eHH которых 6epyTC 6уквы алсравнта, Ha4HHa с А. HanpH мер, снстема C4HCJleHH с основаннем 12 НСnОJlьзует 4нсла от О до 9, а затем А ДJl 1 О н В ДJl 11. 06patHTe вннманне, 4ТО npH основаннн 1 О не НСnОJlьзуетс u.Hcppa «1 о», Т04НО так >ке, как н npH основаннн 8 не НСnОJlьзуетс u.Hcppa сс8». В современных KOMnblOTepax нан60лее pacnpocTpaHeH'bI дeCTH4Ha, ДВОН4ная н wecTHaAu.aTHpH4Ha (основанне 16) снстемы С4нслення. (MHoro JleT тому назад 6bIJla nоnулрна так>ке BOCbMepH4Ha CHC тема С4нсленн.) В данном nодразделе 6удет OnHcaHa кажда Н3 названных снстем С4нсленн. Позиционная нотация nOcJle Toro, как 6у,lJ,уТ nOHTbI u.HcppbI снстемы C4HCJleHH, мо>кно составлть Н3 ннх 60льwне 4HCJla, нсnользу n03Hu.HoHHYlO HOTau.HIO. В на4ально wколе У4ат, 4ТО n03НЦН CJleBa от e,lJ,HHHu. - это разр,lJ, ,lJ,eCTKOB, n03НЦН слева от дeCTKOB  это разрд сотен н Т.д. npHMepoM этоrо может 6ыть ,lJ,еСЯТН4ное 4HCJlO 132: в это 4НСЛО входнт 1 сотня, 3 дeCTKa н 2 еднннцы. Чему не У4ат в на4ально WKOJle, - так это тому, 4ТО кажды разрд 4нсла нмеет вес, ВЫ4нслемы по эксnоненu.нальному закону. Так, разрд eAHHHu. HMe ет вес 100 нлн 1; разрд дeCTKOB нмеет вес, равный 101 нлн 1 о; разрд сотен нмеет вес 102 нлн 100. nоказатель cTeneHH в зна4еннн веса разрда КРНТН4ескн ва>кен ДJl nOHH MaHH 4HCeJl, заnнсанных в снстемах С4нсленн, OTJlH4HbIX от деСТН4НОЙ. n03НЦН сле ва от заnтой, KOTopa Ha3ЫBaeTC ,lJ,еСТН4НОЙ заl1ТОЙ только в дестнчной снстеме С4нсленн, BcerAa BJleTC nознu.ней е,lJ,НННЦ в ЛlO60Й снстеме С4нсленн. HanpHMep, n03Hu.H слева от ДВОН4НОЙ заnто BcerAa 6У,lJ,ет n03Hu.He с весом 2., Т.е. 1; n03Нu.ня CJleBa от ВОСЬМНРН4НОЙ заnтой 6У,lJ,ет нметь вес 8. нлн 1. В кюк.цом СЛУ4ае ЛlO60е 4HC ло, возве,lJ,енное в степень О BCer,lJ,a 6У,lJ,ет равно 1. Вес раЗР,lJ,а CJleBa от раЗр,lJ,а е,lJ,НННЦ Bcer,lJ,a 6удет равен oCHoBaHHIO снстемы C4HCJleHH, возве,lJ,енному в степень 1; в ,lJ,eCTH4HO снстеме это 6У,lJ,ет 1 01 нлн 1 о. В ДВОН4НОЙ снстеме это 6удет 21 нлн 2; а в восьмеРН4НОЙ снстеме  81 HJlH 8. Такнм 06pa 30М, 11 в деСТН4НОЙ снстеме C4HCJleHH 6удет нметь ,lJ,pyroe зна4енне нлн KOJlH4eCTBo eAHHHu., 4ем 11 в ДВОН4НОЙ снстеме C4HCJleHH. AeCTH4Hoe 4НСЛО в данном СЛУ4ае co ставлено Н3 oAHoro дeCTKa nJlIOC e,lJ,HHHu.a н нмеет зна4енне, равное 11 eAHHHu.; в то BpeM как ДВОН4ное чнсло 11 COCTaBJleHO Н3 одной двойкн nJllOc еднннца, 4ТО дает зна- 4енне, равное 3 е,lJ,нннцам. 11 в BOCbMepH4HO снстеме 6удет нметь зна4енне, равное 9 еднннцам. В деСТН4НОЙ снстеме веса разр,lJ,ОВ справа от деСТН4НОЙ заnтой HMelOT OTpH цатеJlьные nоказатеJlН CTeneHH. Первый разр,lJ, справа от деСТН4НОЙ заnто нмеет вес, равный 10-1 нлн 0,1. В ,lJ,BOH4HO снстеме nepBbI разр,lJ, справа от ,lJ,ВОН4НОЙ заn той нмеет вес, paBHЫ 2-1 HJlH 0,5. В 06w,eM СJlучае npHHu.HnbI, npHMeHeMbIe к дeCTH4- ным 4HCJlaM, так>ке npHMeHHMbI ДJl Jl106bIX ,lJ,pyrHx снстем C4HCJleHH. npHMep 1.4 демонстрнрует ,lJ,ВОН4ное 4НСЛО 110.101 (здесь н AaJlee, как н во всех npHMepax, нсnользуетс заnнсь 4HCeJl, npHHTa в анrЛО3Ы4НОЙ лнтераryре, npH KOTO рой в ка4естве раздеJlнтеJl u.еJlОЙ н ,lJ,р06ной 4астн 4HCJla НСnОJlьзуетс не заnтая, а Т04ка (npHM. пер.)) (4асто заnнсываемое, как 110.1012)' Он так>ке nOKa3bIBaeT степень н вес HJlH зна4енне каждоrо раЗр,lJ,а 4HCJla. Дn npe06pa30BaHH ABoH4Horo 4нсла в дec TH4oe cкnaAbIBalOTc веса каждоrо разрда, умно>кенные на зна4ення cooTBeTcTI3YIO W,HX разрдов, в pe3YJlbTaTe cpopMHpyeTC дeCTH4HЫ эквнваJlент. Так, 4НСЛО 110.1012 6удет зквнвалентным дeCTH4HOMY 6.625 (4+2 + 0.5 + 0.125). 06ратнте вннманне, 4ТО 
rnaBa 1. BBe.u.eHHe в ар хн тек туру компьютеров 19 это 6удет сумма 22 (нлн 4) nЛIOС 21 (HJlH 2), однако 20 (ИJlИ 1) не прнбаВJlетс, поскольку в зтой nОЗLl1u.нн нет u.Hcpp. Аробна 4асть 4HCJla формируется из 2.1 (.5) nJlIOC 2-3 (нлн .125), однако под 2-2 (ИЛН .25) цнсрр нет, поэтому .25 не nрнбаВJlетс. Пример 1.4 Степень 22 21 20 2-1 22 2З Вес 4 2 1 .5 .25 .125 Чисnо 1 1 О 1 О 1 Чисnенное 4 + 2 + О + .5 + О + .125 6.625. знаqенме Предnоложнм, что мы хотим npHMeHHТb тот >ке метод nре06разованн к ЧLl1СЛУ, заnLl1сан- НОМУ в wеСТИРН4НО снстеме C4HCJleHH, HanpHMep 25.. npHMep 1.5 показывает зто ЧLl1СЛО, pacnLl1CaHHoe по cTeneHM н весам каждоrо разря.ца. В ,о,анном npHMepe в разряде с весом 61 стонт u.нфра. 3тот разря.о. нмеет зна4енне 12 (2 Х 6) н 5 в ра3РЯ,lJ,е с весом 6., KOTOpЫ дает Зlla- ченне 5 (5 Х 1). Все зна4енне 4HCJla нмеет зна4енне 12 + 5, Т.е. 17. Чнсло справа от деСТLI1ЧНОЙ ТQ4KH равно 2 no,lJ, 6-', 4ТО ,о,ает зна4енне .333 (2 Х .167). СJlе,lJ,овательно, ЧLl1СЛО 25.26 LI1MeeT зна4енне 17.333 в ,lJ,eCTH4HO снстеме. Пример 1.5 Степень 61 60 6-1 Вес 6 1 .167 Чмсnо 2 5 2 Чисnенное знаqение 12 + 5 + .333 17.333 Преобразование в десятичную форму npeAbI,lJ,yw,He npHMepbI npo,lJ,eMOHCтpHpoBa1lH, что .цл nреобразовання LI1З ЛlO60Й CLl1CTe- мы С4нсленн в десятнчнуlO, НУ>КНО CHa4a1la оnре,о,еш1ТЬ веса всех разря.о.ов ЧLl1сла, а затем npo суммнровать веса, умно>кенные на u.нфры 4нсла, с u.елыо nолученн десятнчноrо 3КВLI1валСllта. nредnоло>кнм, что мы хотнм npeo6pa30BaТb восьмеРН4Ное 4НСЛО 125.78 в дестнчную CLl1CTeMY СЧLl1сленн. Дл выnолненн 3Toro nреобразовання CHa4a1la заnнwем веса всех разрядов чнс ла. 3то nоказано в npHMepe 1.6. Зна4енне 125.78 равно 85.875 в ,lJ,естично снстеме счнслеНLI1 нлн, or 1 Х 64 nJllOC 2 Х 8 nJllOC 5 Х 1 плюс 7 Х .125. Пример 1.6 Степень 82 81 80 81 Вес 64 8 1 .125 Чисnо 1 2 5 7 Чмсnенное знаqение 64 + 16 + 5 + .875 == 85.875 Обратнте вннманне, 4ТО вес разр.ца, расnоло>кенноrо слева от разрда еднниц, равен 8. 3то 8 раз по 1. Затем заметьте, 4ТО вес СJlе,lJ,уюw,еrо слева разрда равен 64, нлн 8 раз по 8. Еслн бы в .цанном 4нсле HMeJlC СJlе,lJ,УЮw,н CJleBa разряд, то ero вес 6ыл бы равен 64 умно>кенное на 8, Т.е. 512. Дnя Toro, 4то6ы опре,lJ,елнть слеДУIOw,еrо c'rap- wero раЗр,lJ,а, необхо,lJ,НМО умно>кнть вес TeKyw,ero раЗР,lJ,а на основан не нсnользуе- MO снстемы С4нсленн (в ,lJ,анном СJlучае на 8). Дnя ВЫ4нслення весов разрдов, pac nоло>кенных справа от ,lJ,еСЯТН4НО ТО4КН, ВЫnОJlняется ,lJ,eJleHHe на основанне снстемы СЧLl1сленн. Так, в BOCbMHpH4HO снстеме вес раЗрЯ,lJ,а, CTOW,H HenOcpe,lJ,CTBeHHo cnpa ва от дeCTH4HO ТО4КН, равен 1/8 HJlH .125. Сле.цуюw,н справа разр,lJ, нмеет вес, рав- HЫ .125/8 нлн .015625, что мо>кет быть так>ке заnнсано как 1/64. Так>ке 06paTLI1Te BHLI1 манне на то, 4ТО 4НСЛО нз npHMepa 1.6 мо>кет 6ыть так>ке заnнсано как ,lJ,eCTH4Hoe чнсло ВН,lJ,а 85 7/8. 
20 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 Пример 1.7 показывает ДВОН4ное 4НСЛО 11011.0111, записанное с указанием веса и показателя степени основания снстемы С4исления для каждоrо разряда. Если про- суммировать зти веса, умноженные на соответствуюw,ие, то зна4ение ДВОИ4ноrо числа, преобразованноrо в деСЯТИ4НУЮ систему, будет равно 27.4375. . Пример 1.7 С'I'епень 24 23 22 2 20 2" 22 2З 2 4 Вес 16 8 4 2 1 .5 .25 .125 .062 ЦMpa 1 1 О 1 1 О 1 1 1 Чмсnенное 16 + 8 + О + 2 + 1 + О + .25 + .125 + .0625 27.4375 значенме V1HTepecHo отметить, 4ТО 21 также равно 1/2, 22 равно 1/4 и так далее. Также инте ресно отметнть, 4ТО 24 равно 1/16 нли .0625. Аробная 4асть этоrо 4исла равна 7/16 или .4375 в деСЯТН4НО форме. Обратнте вннманне на то, 4ТО 0111  эти 4ИСЛО 7 в двоичном коде, равное 4ислителю, а самая правая 1 находнтся в разряде с весом 1 /16, COOTBeT ствуlOw,им знаменателю. Аруrие аналоrИ4ные при меры: ДВОИ4ная дро6ная часть .101  зто 5/8, а двоичная дробная 4асть .001101 равна 13/64. ШестнадцаТИРИ4ные 4исла 4асто применяlOТСЯ в компьютерах. В примере 1.8 расписано число 6А.С с указанием весов разрядов. Сумма ero цифр, умноженных на веса разрядов, равна 106.75 илн 106 3/4. Целая 4асть 3Toro 4исла может быть пред ставлена как 6 х 16 плюс 1 О (А) х 1. Аробная же ero 4асть имеет 12 (С) в ка4естве 4ИСЛИ тел и 16 (161) в ка4естве знаменателя, Т.е. равна 12/16 или после упроw,ения 3/4. Пример 1.8 Степень 16:;' 160 161 Вес 16 1 .0625 ЦMpa 6 А С Чмсnенное знаqенме 96 + 10 + .75 = 106.75 Преобразование из десятичной формы nреобразование из деСЯТН4НО системы С4исления в друrуlO систему С4ИСJЮНИЯ выполнить несколько труднее, 4ем преобразование в деСЯТИ4НУlO форму. Аля преобра З0ваllИЯ цело 4асти 4исла в деСЯТИ4НУЮ форму необходнмо делить ero на зна4ение основания системы С4исления. Аля преобразования дробно 4асти необходимо BЫ полнять ее умножение на основан не системы С4исления. Преобразование целой части числа из десятичной формы. Аля преобразования целой 4астн деСЯТН4ноrо 4нсла в HHYIO систему С4нсления нужно последовательно дe лить ее на основанне HOBO снстемы С4нсления н запнсывать остатки в ка4естве зна чаw,их цнфр результата. Алrорнтм TaKoro преобразования имеет следуюw,и вид: 1. nоделнть деСЯТН4ное 4НСЛО на основание HOBO системы С4ИСЛ,НИ. 2. Сохранить остаток (первы остаток будет цнфро, стояw,е в самом младшем зна4аw,ем разряде). 3. Повторять warH 1 н 2 до тех пор, пока 4астное не будет нулевым. Напрнмер, для преобразовання деСЯТИ4ноrо 4нсла 1 О в ДВОИ4НУIO' форму, поде лим ero на 2. Результатом будет 5 с остатком, равным О. nepBbI остаток дает цифру разряда единиц результата (в данном примере  О). Аалее делим 5 на 2. Результатом 
I'naBa 1. BBe.u.eHHe в архнтектуру компьютеров 21 будет 2 с остатком 1.1 6удет цисррой, cTOw,e в разрде с весом 2 (21) pe3YJН)laTa. Продол>каем процесс делени до тех пор, пока 4астное не 6удет нулевым. При мер 1.9 иллюстрирует зтот процесс nре06раЗ0вания. Результат записывается как 10102 снизу вверх. Пример 1.9 22.l..Q. 212 212 и, о OC'l'aToK Ос'еа 'рок OC'l'a'l'OK OC'l'a'l'OK о 1 О 1 pe3YnbTa'l' 1010 Для nре06раЗ0вани деСЯТИ4ноrо 4исnа 10 в ВОСЬМИРИ4НУЮ срорму, nоследова телыю делим ero на 8, как nоказано в примере 1.1 О. ДеСТИ4ное 1 О 6удет равно BOCb меричному 12. . Пример 1.10 811Q Остаток 2 811 Остаток = 1 О pe3YnbTaT 12 nре06раЗ0вание И3 деСТИ4НО в wестнадцаТИРLl14НУЮ систему выполняется дe nением на 16. 3на4ение остатков при зтом мо>кет иметь диаnаЗ0Н от О до 15. Лю60Й остаток в диаnаЗ0не между 1 О LI1 15 затем переводится в 6уквенную срорму с ИСIIOJlЬЗО ванием 6укв от А до Р с целью срормировани wестнадцаТИРИЧIЮl'О числа. Пример 1.11 nоказьшает npe06pa30BalIHe деСТИ4l'юrо числа 109 в wестнадцаТИРИЧi юс 6О. Пример 1.11 1610 Остаток 13 (О) 16 Остаток  6 О Результат 60 Преобразование дробной части десятичноrо числа. nреобразование др06ной час ти десятичноrо 4исла в друrую систему СЧLl1СJlени выnоnняет посредством умно>кеllИЯ Шl значение основани системы С4ислени. Например, ДJ1 nре06раЗ0вания дp06HO 4асти дестичноrо числа в ДВОИ4НУЮ срорму, нужно BbInOJll-IТЬ умно>кение на 2. ПОСJ1е УМlю>кени цела 4асть результата coxpaHeTC в качестве зна4аще цисрры pe3YJ1bТa та, а дp06HЫ остаток вновь YMHO>KaeTC на зна4ение основания системы С4ИСJ1ени. Коrда дp06HЫ остаток становитс HyneBbIM, процесс умно>кения останавливается. 06ратите внимание на то, 4ТО некоторые числа 6есконе411Ы (периодические др06и). Таким 06раЗ0М, остаток при их умно>кении никоrда не 6удет нулевым. АJlrоритм ДJ1Я пре06раЗ0вани дp06HO 4асти дестичноrо 4исла имеет сnедующи вид: 1. YMHO>KLI1Tb др06ную 4асть на oCHOBaHLI1e HOBO системы С4ислени. 2. Сохранить целую 4асть pe3YnbТaTa (даже есnи она нулева) 13 ка4естве цисрры. 06paTLI1Te ВНLI1мание на то, 4ТО первый pe3YnbТaT зarlLl1сываетс непосредственно cnpa ва от точки, раздеnюw,е целую LI1 др06ную 4асть числа. З. nовторЯ1Ъ шаr 1 LI1 2, ИСnОnЬ3У др06ную 4асть wara 2 до тех пор, пока дроБНШI часть не станет равной НУJlЮ. Предположим, 4ТО нам ну>кно npe06pa30BaTb деСЯТИ4ное .125 в ДВОИLIНУЮ СРОРМУ. 3то выполняется УМlю>кением на 2, как nоказано 13 примере 1.12. 06ратите внимание на то, 4ТО процесс умно>кени должен nродол>катьс до тех пор, пока дробный ост'аток IЮ 
22 ITрименение МИКрОКОНТроллеров PIC18 станет равным нулю. ЦеЛ04L11сленные 4aCTLI1 pe3YnbТaToB заnLl1сывается как ЧLl1сnа ДВОLl1Ч HO дp06HO 4асти (0.001 в данном npLl1Mepe). Пример 1.12 .125 х 2 0.25 ЦMpa равна О .25 х 2 0.5 ЦMpa равна О . :! х 2 1 . О Цифра раВНи 1 реЗУЛb'l'ат =о 0.0012 Та же caMa меТО,lJ,нка НСПОJlьзуетс,lJ,Jl npeo6pa30BaHLI1 ,lJ,ро6ной 4aCTLI1 деСЯТLI14- Horo 4L11Cna в ЛlO6уIO снстему С4нсленн. npHMep 1.13 показывает ТУ >ке caMYIO ,lJ,P06HYIO деСТН4НУЮ 4асть .125 нз прнмера 1.12, npe06pa30BaHHYIO в ВОСЬМLI1РLl14НУЮ cLl1cTeMY посредством YMHO>KeHH на 8. Пример 1.13 .125 х 8 1.0 ЦMpa равна 1 резуnьтат = 0.18 npe06pa30BaHLI1e деСТLI14НО дp06HO 4aCTLI1 в wестнадu.аТLI1РLl14НУЮ срорму LI1ЛJlЮ- СТРLl1руется npLl1MepOM 1.14. З,lJ,есь деСТLI14на дp06Ha 4асть .046875 nре06разуется [3 wестнадu.аТLI1рLl14НУIO CLl1CTeMY С4нслеНLI1Я nосnедоватеnьным умножешем ее на 16. 06- paTLI1Te BHLI1MaHLI1e на то, 4ТО .046875 равно шестнадцаТLI1РLl14НОМУ О.ОС. Пример 1.14 .046875 х 16 0.75 ЦMpa равна О .75 Х 16 12.0 ЦMpa равна 12 (С) pe3YnbTaT О,ОС lб Двоичнокодированные шестнадцатиричные числа ДВОLl14НОКОДLl1рованные шестна,lJ,цаТLI1РН4ные 4L11сла (8СН) LI1СnОnЬ3УЮТСЯ для nредставnеНLI1Я шестна.о.u.аТНРLl14НЫХ ,lJ,анных с НСПОЛЬЗ0ваннем ,lJ,BoH4Horo кода. AB0Ll14 НОКОДLl1рованное шестна,lJ,цаТНРН4ное 4НСЛО - это шестнадu.аТLI1РLl14ное 4L11CnO, заnLl1сан- ное так, 4ТО каждая ero цнсрра пре,lJ,ставлена 4-разр,lJ,НЫМ ДВОLl14НЫМ 4L11cnoM. ЗначеНLI1 ЦLl1срр 8СН nоказаны в та6л. 1.5. 06ратнте вннманне на то, 4ТО 4асто мы заnLl1сываем wестнадцаТLI1рLl14ные 4L11CJla как, напрнмер, Ох8А, rде Ох  это СLl1rнал компьютеру, 4ТО сnедуюw,ее даnее 4L11СЛО влетс шестна,о,цаТНРН4НЫМ. ШестнадцаТLI1РLl14ные 4HCJla пре,lJ,ставлIOТС в коде 8СН посредством nре06разо вания каждо LI1X ЦLl1СРРЫ в 8CHKOД С вводом nр06ела nocne каждой КОДLl1рованно циср ры. Пример 1.15 nOKa3bIBaeT шестнадцаТLI1РLl14ное 4L11CnO 2АС, пре06раЗ0ванное в код ВСН. 06ратите внимаНLI1е, 4ТО каждая ДВОН4НОКО,lJ,LI1рованная ЦLl1срра отдеnяетс np06e лом. 
rлава 1. Бве.u.ение в архитектуру компьютеров 23 Таблица 1.5. ABOH4HO-KO,lJ,HpOBaHHЫ wестнадцаТL/1рL/14I1Ы код Шестнадцатиричная цифра О 1 2 3 4 5 6 7 8 9 А В С О Е F Код ВСН 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Пример 1.15 2АС = 0010 1010 1100 Ha3Ha4eHL/1eM кода 8СН влетс 06eCne4eHL/1e возможности заnL/1СИ ДВОИ4НО BepCHL/1 шестна,lJ,цаТНРН4НЫХ 4L/1сел в срорме, KOTopa может nerKO nрео6ра30выЕ3тьсяя в шестна,lJ,цаТL/1РL/14НУIO СРОРМУ н 06ратно. npL/1Mep 1.16 nOKa3bIBaeT ДВОИ4нокодированное wестна,о,цаТL/1рL/14ное 4L/1СЛО, пре06раЗ0ванное 06ратно в шестнадцаТИРИ411УIO СРОРМУ. Пример 1.16 1000 0011 1101 . 1110 83D.Е Дополнения V1ноrда ,lJ,Jl nредставnеНL/1 отрL/1цатеnьных 4L/1Cen, данные сохранютс в срорме доnолнеНL/1 AflЯ представлеНL/1Я отрL/1цатеJlЬНЫХ данных. npL/1 этом L/1СnОJlЬ3УЮТС две снстемы. Одна нсnользует ,lJ,ополнеНL/1е до OCHOBaHL/1 CL/1CTeMbI C4L/1CneHL/1, а BTopa - допоnнеНL/1е до OCHOBaHL/1 снстемы С4L/1сленн - 1. nepBo nовиnась система, ИСIlОJlЬ З0вавша ,lJ,оnолнеНL/1е .0.0 OCHOBaHL/1 системы С4L/1сnеНL/1Я  1, в KOTOpO IlpL/1 nредставnе HL/1L/1 отрнцательноrо 4нсла Ka)l(,lJ,a ЦL/1срра 4нсла BbI4L/1TaeTC L/13 основани CL/1CTeMbI С4ИС- JleHL/1 МННУС 1 с целыо nOJlY4eHH 3Ha4eHL/1 доnолнеНL/1 .0.0 основat-IL/1Я CL/1CTeMbI C4L/1Cne ни - 1. npHMep 1.17 nOKa3bIBaeT, как nOnY4aeTc ,lJ,OnOnHeHL/1e 8разрядноrо ДВОL/14ноrо 4L/1сла 01001100.0.0 3Ha4eHL/1 OCHOBaHL/1 снстемы С4L/1слеНL/1 ML/1HYC 1 с целью ото6раже- ння ero как ОТРL/1цательноrо 3Ha4eHH. 06ратнте BHL/1MaHHe на то, 4ТО Ka)l(,lJ,a цнсрра 4L/1C Jla BbI4L/1TaeTC Н3 е,lJ,ННL/1ЦЫ AflЯ reHepHpOBaHH ДОПОJlнеНL/1 .0.0 31-1a4еНL/1Я OCHOBal-IL/1 CL/1C темы С4L/1слеНL/1 мннус 1 (еДННL/1ца). 8 данном npL/1Mepe отрL/1цатет)ное 01001100 nред- cTaBneTc как 10110011. Та >ке caMa меТОДL/1ка мо>кет nРL/1меняться для лю60 CL/1CTe мы С4L/1СJlення, как НnЛIOСТРL/1руетс в npL/1Mepe 1.18, в котором доnоnнеНL/1е до nТllадца тн (основанне снстемы С4нслеНL/1 ML/1HYC 1) шестнадцаТL/1РL/14I-юrо числа 5СО ВЫЧИСJlяет- c nOCpe,lJ,cTBoM BbI4L/1TaHL/1 Ka)l(,lJ,o ЦL/1СРРЫ L/13 nтна,о,цатн. 
24 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Пример 1.17 ll11 1111 О]ОО 1100  011 СОН Пример 1.18 .15 1.::; 5 с D А 3 2 Сеrодн само по се6е ДОПОJlнеНLI1е до основания системы СLlисления  1 но ис- flOJ1ьзуетс; 0110 исnользуетс только в ка4естве зтаllа на nуrи к flOJ1учению пОfIOЛНОНИ5-1 до основани системы С4ислеНLI1. Дополнение до основания системы СЧИСJ1СНИ5-1 ис nользуетс дn представnеНLI1Я отриu.атеnьных 4L11сел в современных компыт орных системах. (ДоnолнеНLI1е до основания системы С4исления - 1 ИСnОЛЬЗ0валось в раннио дни КОМllыотерно технолоrLl1L11.) Основная nр06лема доnоnнения до ?нования СИСlемы счнслени  1 заКЛЮ4аетс в том, 4ТО при LI1СПОЛЬЗ0вании зтой системы возникаеr два нуля: nоложитеnьный LI1 ОТРLl1цатеnьный; в CLl1CTeMe, LI1СПОЛЬ3УЮЩСЙ ДОflOлноние дО OCIIO вания CLl1CTeMbI С4L11сnеНLI1Я, cyw,ecTByeT только положительный HOnb. Для срормироваНLI1 доnоnнеНLI1 до основшт системы счисnения Сllачала lIaxo ДT допоnнеНLI1е до oCHOBaHLI1 CLl1CTeMbI C4L11CneHLI1 - 1, а затем д06авляют единицу к pe зулыату. Пример 1.19 nOKa3bIBaeT, как 4L11CnO 0100 1 000 nре06разуетс в отрицателыюе значеНLI1е переводом ero в допоnнеНLI1е до двух (OCHoB?HLI1e CLl1CTeMbI СЧLl1сnеНLI1). Пример 1.19 1111 1111  0100 1000 1011 0111 (AononHeHMe АО одноrо) + 1 1011 1000 (Аопоnненме АО АВУХ) Чт06ы у6еДLl1ТЬС в том, 4ТО 0100 1000 явnетс инверСLl1ей (отрицательным зна- чеНLI1ем) 1011 1000, СnОЖLl1М LI1X ДJlя cpOpMLI1pOBaHLI1 8раЗрДI-юrо резулыата. Дешпый разрд OT6paCЫBaeTC и pe3YJlbTaT 6удет HyneM, потому 4ТО 0100 1 000  это ПОЛО>КИ- TenbHoe 72, в то время как 1 011 1 000  зто ОТРLl1цателы-юе 72. Та >ке самая методика примеllима дл лю60 CLl1CTeMbI счисnеНLI1. npLl1Mep 1.20 nоказьшает то, как инверсия шестнадцаТLI1РLl14ноrо 345 наХОДLl1ТС путем пеРВLI14ноrо определения допоnнени даllllО- ro числа до пятнадцаТLI1, а затем д06авnеНLI1 еДLl1НLI1u.ы к результату с целью опредеJ1е IIИ дополнения до шестнадцаТLI1. Как LI1 ранее, eCnLl1 LI1сходное 3-разрядное число 345 д06авить к ero инверСLl1И СВВ, то трехразрядным pe3YnbТaToM 6удет 000. Как и в прс дыдущем ПрLl1мере, 4eTBepTЫ разряд (перенос) OT6paCЫBaeTC. 3то подтrЮР>КДаЕ.У(, Lj П) 345 BJleTC LI1HBepCLl1e СВВ. ДОnОnНLI1теnьная LI1нсрормаЦLl1 о ДОllOЛIЮНИЯХ до одно! О И двух представлена paccMOTpeHLI1eM 4L11Cen со 3HaKaMLI1 в сnедующсм подразделе. Пример 1.20 15 15 15 .з 4 5 (доrrоnнение ДО 15) С в А + 1 (AononHeHMe ДО 16) С В В 
rnaBa 1. BBe.u.eHHe в архнтектуру компьютеров 25 1.3. Компьютерные форматы данных YcneWHoe проrраммироваНL/1е тре6ует nOnHoro nOHL/1MaHL/1 срорматов данных. В данном nодразделе OnL/1CaHbI мноrие WL/1pOKO распространенные компьютерные cpopMa ты данных в той мере, как они исnользуютс в ceMeCTBe микроконтроллеров PIC. ОБЫЧIIО fJ,aHIII::>le rlредставляются в срормате ASCII, как ДВОИ4нокодированные десЯlИЧ IIЫС; числа, целые 4исла со знаком L/1 6ез, а также L/1ноrда как 4L/1Cna с nnаваюw,ей точко (деЙСТLзитеJ1ЬНЫG 4исла). Moryт 6ыть L/1СПОЛЬЗ0ваны L/1 друrL/1е срормы предстаВJlени даНIIЫХ, однако OHL/1 здесь не оnисываютс, поскольку не вnютс столь же wироко pacrlpocTpaHeHHbIML/1. Данные в формате ASCII Данные в срормате ASCII (Американский Стандартный Код для Информационноrо Обмена) представляют аnсраВL/1ТНОЦL/1СРРовые СL/1МВОЛЫ в naMTL/1 комnыотерной систе- мы (см. та6л. 1.6). CTaHдapTHЫ АSСIIкод ВJlяется 76итным кодом, в котором BOCb MO И самый старwий 6ит, исnользуются как 6ит паРL/1тета в некоторых антикварных системах. ECJlL/1 АSСIIданные исnользуютс ДJ1 вывода на nринтер, то нулевое 3Ha4e ние caMoro старшеrо 6ита 6удет 0значать режим аJlсраВИТНОЦL/1СРРОВОЙ ne4aTL/1, а еди ничное  ре>ким rрасрL/1ческо lle4aTL/1. В Ilерсонаnыюм компьютере расwиренны на60Р сL/1мволов ASCII вы6ираетс YCTaHOBKO еДL/1НИЧlюrо сосroНL/1Я caMoro neBoro бита. ТаБJ1. 1.7 показывает расширенны на60Р симвоnов ASCII, L/1СПОnЬ3УЮЩИЙ кодировку Ox80OxFF. CL/1MBOJlbI paCWL/1peHHOro на60ра ASCII 060зна4ают некоторые иностранные 6уквы L/1 знаки nунктуаЦL/1L/1, rpe4eCKL/1e L/1 матемаТL/14еские CL/1MBOnbI, CL/1MBOnbI nсевдоrра срнки L/1 друrL/1е сnеЦL/1аnьные CL/1MBOnbI. 06paTL/1Te внимание на то, 4ТО срактически вид пе4атаемых символов paCWL/1peHHOro на60ра ASCII мо>кет L/1зменяться от nрИlIтера к ПрИlперу. Таблица 1.6. Коды ASCII В'l'орая 4aC'rb ко,Ца 1 я ХО Х1 Х2 Х3 Х4 Х5 Х6 Х7 Х8 Х9 ХА ХВ ХС ХD ХЕ XF 4ac'rb КОАа ОХ NUL SOH STX ЕТХ ЕОТ ENQ АСК BEL BS НТ LF V'I' ]<F СЕ SO Sl 1Х OLE DС1 DС2 ОС3 ОС4 NAK SYN ЕТВ CAN EMS SUJ3 ESC F'S GS 1\S US 2Х SP # $ % & ( ) + > / 3Х О 1 2 3 4 5 6 7 8 9 < > '? 4Х @ А В С О Е F G Н 1 J К L М N О SX Р Q 1\ S Т U V W Х У Z [ \ ] л 6Х а Ь с d е F 9 h i j k 1 m n О 7Х Р q r s t u V w х у z { 1 ПРL/1веденна та6nица символов рассчитана на ИСnОЛЬ30ваllL/1е с Ilринтером 'ВМ ProPrinter, она также соответствует на60рам сnеЦL/1аnьных символов, введенным в БОJ1ЬШИI iCTBO текстовых nроцессоров. Управляющие СL/1МВОЛЫ ASCII, также nере4исnенные в та6лице 1.6, выполняют функции управления в компьютерно системе, включая очистку 3КрШia, СИМВОЛ «шш liaзад», перевод строки и Т.д. Дл ввода управляющих кодов с KOMllbIoTepHo КJ1авиату ры нужно, удерЖL/1ВШl 8 на>катом СОСТОНИL/1 кnaBL/1WY Ctrl (Control), ВВОДL/1ТЬ соответст- ВУЮЩL/1е симвоnы. Так ДJl ввода ОхО1, ну>кно BBeCTL/1 Control-A; а код ОхО2 вводится как ControlB L/1 Т.д. 06paTL/1Te BHL/1MaHL/1e на то, 4ТО Уllравлюw,L/1е коды 4асто ПОЯВJ1ЯЮТСЯ lIа зкране как АА дn Control-A, АВ дn Control-B L/1 Т.д. Также 06paTL/1Te BHL/1MallL/1e на то, LIТO 
26 TIрименение МНКрОКОНТроnлеров PIC18 КОД возврата KapeTKLI1 (СА) в 60JlЬШLl1нстве современных кnaBLI1aryp соответствует Kna BLI1We Enter (Ввод). Ha3Ha4eHLI1eM СLl1мвола СА явnетс возврат курсора LI1nLl1 nе4атаю- w,e rоловкн на JleBOe поле. ApyrLl1M КО,lJ,ОМ, KOTOpЫ 4асто nовлетс во MHorLl1X npo- rpaMMax, BJleTC КО,lJ, переВО,lJ,а строкн (LF), KOTOpЫ nepeMew,aeT курсор BHLI13 на одну строку. npH LI1СПОЛЬЗ0ваННLI1 та6л. 1.6 LI1ЛLl1 1.7 ,lJ,Jl пре06раЗ0ванн алсраВLI1ТНО-ЦLl1СРРОВЫХ LI1nLl1 управлlOw,нх CHMBOJlOB в КО,lJ,Ы ASCII, сна4ала не06ХОДLl1МО наЙТLI1 алсраВLI1ТНО ЦLl1СРРОВО КО,lJ" nO,lJ,Jle>Kaw,H npe06pa30BaHHIO. Затем сле,lJ,ует найтн nepBYIO ЦLl1СРРУ ше- стнадцатнрН4ноrо ASCII-ко,lJ,а. nOcJle этоrо  BTOPYIO цнсрру кода. HanpLl1Mep, заrnавно 6укве А соответствует АSСII-код Ох41, а CTp04HO 6укве а - АSСIIкод Ох61. АSСIIданные 4aw,e Bcero coxpaHIOTc в naMTH npH LI1CnOnb30BaHHLI1 сnеЦLl1ально команды Ассем6лера, KOTopa Ha3ЫBaeTC dec/are byte (Объявить байт) НЛLl1 ОВ, JlLl160 KOMaIlДO ОАТА в сnучае строк. (Ассем6лер - это nporpaMMa, которая LI1спользуетс AflЯ npOrpaMMLI1pOBaHLI1 KOMnblOTepa на ero маШLl1ННОМ 3ЫKe.) Команды ОВ LI1 ОАТА, а так>ке несколько npHMepOB нх HCnOJlb30BaHH с снмволамн ASCII, nРLl1ВО,lJ,ТСЯ в npLl1Mepe 1.21. 06ратнте вннманне, 4ТО Ka)l(,lJ,bI CHMBOJl прн HCnOJlb30BaHHH коман,lJ,Ы ОВ 6ерется в апо стросры (') - HLI1Kor,lJ,a не LI1СПОJlьзуйте каВЫ4КН ("), еСЛLl1 только вы не nрнменяете команду ОАТА. Таблица 1.7. Расшнренные ASCIIKO,lJ,bI в том ВLI1де, как онн ne4aTalOTc на npLl1HTepe 'ВМ ProPrinter. первый второй ХО Х1 х2 ХЗ Х4 Х5 Х6 Х7 Х8 Х9 ХА ХВ ХС ХD ХЕ XF ОХ  . . . ... . . а о . d' !? jI 13 (1- 1Х .  1 11 1 Э - ! т l L.. ... .., 8Х <; Q е а а а а 9 е ё е i i 1 Д А 9Х  ее IE. 6 6 о Q u 9 С О ф € V. Pt f АХ а r 6 u n N о l. ,... ...,  у.. i « » ВХ ..... ! 1  ! 1 I А JI JI J .... ! 1 ;J 1 СХ '( r ".  JL ОХ .IL т L + J i I li . ;= т f rr r . ЕХ (х Р r 1t 1; а J.1 'у Ф в а а 00 , Е n FX а :1: :о!: ::s;; r J AI О J" n 2 . Пример 1.21 DВ 'В' DВ ' r' DВ 'е' DВ 'у' DВ ОхОО DВ 'Brey' , О DАТА "Brey", О DАТА "Barry", О 
rлава 1. Вве.u.ение в архитектуру компьютеров 27 Двоичнокодированные десятичные данные АВОLl14НОКОДLl1рованные ,lJ,eCTH4Hыe (ВСО) ,lJ,анные MoryT coxpaHTbC как в ynaKo BaHHO, так н неупакованно срорме. Упакованные BCO-,lJ,анные coxpaHIOTc в срорме двух ЦLl1СРР на 6aT, унеупакованные BCO-,lJ,анные coxpaHIOTc как одно 4L11CnO на 6aT. ALI1ana30H BCD-ЦLl1срр ле>кнт от 00002.0.0 10012' 4ТО соответствует дeCTH4HЫM 09. He упакованные BCOдaHHыe nocrynalOT от клавиаryры nH60 мало чнсленной KJlaBLI1aTYPbI. Упакованные BCO-,lJ,анные LI1СПОЛЬ3УIOТС в некоторых командах на60ра команд MLI1KpO- nроцессора, BKJlI04a ВСО CnO>KeHLI1e LI1 BbI4L11TaHHe. Ta6n. 1.8 показывает некоторые дeCTH4Hыe 4L11Cna, пре06раЗ0ванные, как в упа KOBaHHYIO, так н в HeynaKoBaHHYIO ВСО-срорму. nРLl1ло>кеНLI1МLI1, которые El TLI1nLl14HOM СJlУ 4ае Tpe6YlOT LI1СПОЛЬЗ0ваНLI1 BCO-,lJ,анных, BJlIOTC локальные ToproBbIe теРМLI1налы, а так>ке n04TLI1 nlO6bIe LI1HbIe YCTpOCTBa, ВЫnОЛНIOw,не MHHLI1MaJlbHoe КОЛLl14ество простых apLl1cpMeTLI14eCKHX операЦLl1Й. Еслн системы Tpe6YlOT выполненн сло>кных apHcpMeTLI14e CKLI1X оnерацн, то BCO-,lJ,анные в ннх HCnOJlb3YIOTC ре,lJ,КО, nOCKonbKY нет npoCToro LI1 эсрсректнвноrо меТО,lJ,а BbInOJlHeHH сло>кных арнсрмеТН4ескнх ВСDопераЦLl1. npLl1Mep 1.22 ,lJ,емонстрнрует то, как CJle,lJ,yeT НСnОЛЬЗ0вать Ассем6лер ,lJ,JlЯ опре- делеНLI1Я как упакованных, так н неупакованных BCO-,lJ,анных. npLl1Mep 1.23 показывает то, как это мО>кнО С,lJ,елать, НСnОЛЬ3У С/С++ н тнпы char нлн byte. Во всех СЛУ4ах He06 ХОДLl1МО npLl1,lJ,ep>KLI1BaTbC соrлашеНLI1 о таком nордке заnНСLI1 данных в памть, npLl1 KO тором nepBbIMLI1 заnLl1сываlOТСЯ мла,о,ШLl1е разрды 4L11сел. Это 0зна4ает, 4ТО Дn сохране- HLI1 в naMTLI1, HanpLl1Mep, 4L11Cna 83, сна4ала ну>кно сохраннть 3, а затем  8. Кроме Toro, 06paTLI1Te BHLI1MaHLI1e на то, 4ТО в CJlY4ae упакованных BCO-,lJ,анных, СLI1МВОЛЫ ОХ (npLl13HaK шестнадцаТНРН4НЫХ 4HCeJl) ,lJ,ол>кны nре,lJ,шествовать ЦLl1сррам с целыо 06еспечеНLI1s-1 ra рантнн Toro, 4ТО ACCeM6Jlep сохранит нменно ВСО-зна4енне, а не ,lJ,eCTH4Hoe 3Ha4eHLI1e в СЛУ4ае упакованных BCO-,lJ,анных. 06ратнте вннманне на то, как 4L11сла сохранIOТСЯ в naMTH по O,lJ,HO цнсрре в 6айте в СЛУ4ае HeynaKoBaHHbIx ,lJ,анных н по две цнсрры в 6aTe в CnY4ae упакованных ,lJ,анных. Пример 1.22 ;HeynaKoBaHHe BCDдaHHe (CHaqana заnисваТСR мnадшие раЗрRД) NUMB1 DВ NUMB2 DВ 3,4,5 7,8 .0npeAenReT qисnо 543 .0nредеnRет qисnо 87 ;YnaKoBaHHe BCDAaHHe (cHaqana заnисваТСR мnаАwие раЗрRД) МОМВ3 DВ МОМВ4 DВ Ох37,Ох34 3,Ох45 .0nредеnRет qисnо 3437 .0nредеnRет qисnо 4503 Таблица 1.8. Упакованные н неупакованные BCOдaHHыe Десятичные 12 623 910 Упакованные 0001 0010 0000 0110 0000 1001 0010 0011 0001 0000 Неупа ков а нные 0000 0001 0000 0010 0000 0110 0000 0010 0000 1001 0000 0001 0000 0011 0000 0000 
28 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Пример 1.23 I1 HeynaKoBaHHe II char Numbi char Numb2 BCDAaHHыe (cHa4ana заnмсватся млаАшме раЗРЯА) 3,4, 5; 7, 8; 11 оnреАеnяет чмсnо 543 I1 оnреАеnяет чмсnо 87 I1 11 YnaKoBaIlHe BCD.AaHHыe I1 char Numb3 char Numb4 (сначаnа заnмсватся мnаАшие разрялы) Ох37,Ох34; 3,Ox4S; 11 оnреАеnяет чмсnо 3437 11 оnреАеnяет 4MCnO 4503 Байтовые данные Байтовые данные xpaHTC как в срорме целых чисел без знака, так LI1 в срорме цe лых чисел со знаком. PLl1c. 1.2 LI1nnЮСТРLl1рует как знаковую, так LI1 6еззнаковую срормы 6aTOBЫX цеnых 4L11Cen. Ра3НLI1ца между 3ТLI1МИ cpopMaMLI1 заКnЮ4аетс в весе caMoro ле- Boro разрда. Ero 3Ha4eHLI1e равно 128 дn 6e33HaKoBoro целоrо LI1 MLI1HYC 128 для целоrо со знаком. В срормате цеnоrо со знаком caMЫ левый разряд одновременно явлется как знаковым разрядом 4L11Cna, так LI1 разрдом с весом минус 128. Например, Ох80 представлет 3Ha4eHLI1e 128 как 6e33HaKoBoro 4L11Cna; в ка4естве же числа со знаком 0110 nредставлет 4L11CnO -128. Цеnые 4L11CJla 6ез знака LI1меют ДLl1аnа30Н зна4ени OxOOOxFF (0-255). Цеnые 4L11Cna со знаком имеют диаnаЗ0Н 3Ha4eHLI1  128 до О и до +127. XOT отрLl1цатеnьные 4L11Cna со знаком LI1 nредставnютс таким спос060М, они co хранются в naMTLI1 в срорме доnоnнеНLI1 до двух. Метод оцеНКLI1 4L11Cen со знаком путем ИСПОnЬ30ВШiLl1Я весов n03L11ЦLl1 каждоrо разрда ЯВJ,Jетс HaMHoro 60nee nerKLI1M, 4ем операция нахождеНLI1Я доnоnнеНLI1 до двух 4исnа с цеnыо определеl JИЯ ero значения. 3то ос06енно CnpaBeДJlLl1BO в мире калькуляторов, сконструированных для прor-рамми- стов. Всякий раз, коrда выnолнетс нахождение дополнения до двух числа, знак 3Tor0 числа изменетс с отрицательноrо на поло>кительный ли60 с ПOJю>китеl1Ы IOro lIa о 1 ри цательны. HanpLl1Mep, 4ИСnО 00001 000  зто +8. Ero 01 РИЦaI еJlыюе зна l jсние (8) Haxo дитс посредством оnределени доnоnнени до 2-х 4исла +8. Дтl lfaхо>кnения /J,ОПОЛ нени 4исnа до 2x CHa4ana наХОДLl1ТС ero дополнение до OAIIOIO. ДЛЯ 11 ахо >кде 11 ия дo поnнени 4исла до одноrо, кажды разряд 3Toro числа инвертируется  с IIУl1Я на еди ницу nи60 с единицы на ноль. Как только дополнение до единицы 6удет ссрормироваllО, оnредеnяется доnолнеНLI1е 4L11cna до двух посредством до6авления еДLl1НИЦЫ к ДОПОl1не- нию до одноr-о. Пример 1.24 демонстрирует определение дополнения до двух чисnа с ИСПОЛЬЗ0ванием данной меТОДИКLI1. Пример 1.24 +8 00001000 1111 О 111 (доnолненме АО ощюrо) + 1 -8 11111000 (AononHeIlMe АО АВУХ) 
rnaBa 1. Вве.u.ение в архитектуру компьютеров 29 8 4 2 1  Двоичные веса байтовое значение без знака  128 16 8 4 2 1 ДВОИL1Ifые веса байтовое значение со знаком Рнс. 1.2. Батовые(8-6L11тные)данные Друrо LI1, возможно 60nee npocTo, метод нахождени доnоnнеНLI1Я 4исла до двух заKJlЮ4ается в следующем: 4ИСЛО сна4ала заnLl1сываетс. Далее, прмо под ним, наЧLl1 Ha с npaBoro разрs-ща, оно на4инает nереnLl1сываться вплоть до первой единицы. После ЭТОIО справа налево заПLl1сываетс OCTaBwac 4асть 4исла, однако с инвертированны MLI1 разрдаМLI1. Пример 1.25 ИЛЛЮСТРLl1рует зту методику с тем >ке 4ИСЛОМ, которое ис nOnb30BanOCb в npLl1Mepe 1.24. Пример 1.25 +8 00001000 1000 1111 8 11111000 (заnмсываем чмсnо АО первой 1) (мнвертмруем оставшмеся 6MT) Дл сохранения 86итных данных в naMTLI1 в nporpaMMe на Ассем6лере следует. LI1CnOnb30BaTb команды ОВ LI1nLl1 ОАТА, как в предыдущих npLl1MepaX, ли60 ключевое слово char, как зто nока3а1Ю в ранее nриведенном Ilримере проrраммноrо cpparmeht-а для С/С-Н-. В примере 1.26 nоказано coXpaHeHLI1 в nамти ра3ЛLl14НЫХ срорм 8-6итных чиссл В проrрамме на Ассем6лере. Батовые данные Moryт также сохранться в памяти с ис- nOJlb30BaHLI1eM команды ОАТА LI1JlLl1 ОЕ (06bBneHLI1e данных дn nаМЯТLI1 3СnnЗУ). 06ра- TLI1Te BHLI1MaHLI1e на то, 4ТО в данном npLl1Mepe wестнадцаТLI1рLl14ные 4исла оnределются nресриксом Ох, nредwествуюw,LI1М 4L11СЛУ, а так>ке на то, 4ТО деСТИ4ные 4исnа заnисы- ваются с T04KO, nредwествующе 4L11cny. Пример 1.27 демонстрLl1рует 06ъвлеНLI1е тех >ке 6aTOBЫX данных в nporpaMMe на С/С++. Пример 1.26 ;Батове AaHHe 6ез знака ОАТА1 DАТА2 ОАТА3 ОБ ОБ ОБ .254 Ох87 .71 onpeAeneHMe десятмчноrо 254 onpeAeneHMe шестнаАuаТМРМ4ноrо 87 onpeAeneHMe десятмчноrо 71 Батове AaHHe со знаком 
30 ITpHMeHeHHe МИКрОКОНТролnеров PIC18 DАТА5 DАТА6 DАТА7 DВ DВ DВ .100 OxFF .56 оnредеnение AeCRTMqHOrO 100 оnреАеnение деСRтиqноrо 1 оnредеnение деСRтиqноrо 56 Пример 1.27 11 Батове дaHHe 6ез знака 11 unsigned char Datal unsigned char Data2 unsigned char DaLa3 254; Ох87; 71; 11 оnредеnеНме AeCRTM4Horo 254 11 onpeAeneHMe wecTHaAuaTMpM4Horo 87 11 onpeAeneHMe АеСRтмчноrо 71 11 11 Батове дaHHe со знаком 11 char Data4 char Data5 char Data6 char Data7 -100; +100; -1 ; 56; II оnреАеnение деСRтиqноrо 100 II оnреАеnение AeCRTM4Horo -100 II оnредеnение деСRтиqноrо 1 II оnредеnение АеСRтиqноrо 56 Пословные данные Слово (16 6L11TOB) cpopMLI1pyeTc ,lJ,BYM 6aтaMLI1 данных. МлaдwLl1 6айт Bcerдa coxpaHeT- ся в семействе PIC 18 в 4eKe naMTLI1 с меньшНМ номером, а стаРШLl1Й  в 4eKe с 60nЬШLl1М номером. 3тот мето,lJ, сохранени 4L11сла Ha3ЫBaeTC форматом с обратным порядком байтов. AnbТepHaTLI1BHbI мето,lJ" нспользуемый во всех ,o,pyrнx 4ленах семейства PIC, Ha3ЫBaeTC фор- матом с прямым порядком. npH НСnОЛЬЗ0ваНLI1Н этоro <Рормата 4нсла coxpaHIOTc так, 4ТО Я4ека с меНЬШLl1М номером СО,lJ,ер>кнт стаРШLl1Й 6айт данных. '<t N  Q)   iO   N .... N  :о ID 11) N     сх) .... C\I двоичные веса (а) слово без знака Ох203 Ох202 Ox201 Ох200 Ох НУ 12Н З4Н  старший баЙт  младший байт (Ь) в ячейках памяти Ох200 и Ох20 I записано слово Ox1234 Рис. 1.3. Пословные (16 6нт) ,lJ,анные PLl1c. 1. За показывает веса AfI Ka)l(,lJ,O 6L11TOBO n03НЦLl1L11 слова ,lJ,анных, а pLl1c. 1. ЗЬ nOKa3bIBaeT, как 4L11СЛО 12З4Н заноситс в 4еЙКLI1 naMTLI1 ЗОООН LI1 ЗОО1Н. ЕдLl1НСТlЗеНllая 
rnaBa 1. Вве)].енне в архнтектуру компьютеров 31 раЗНLI1ца между CJlOBOM СО знаком LI1 6еззнаковым CJlOBOM связана с caMO JleBO 6L11TO BO ПОЗLl1ЦLl1е. В 6еззнаково форме caMЫ JleBbI 6нт не связан со знаком н LI1MeeT вес 32768; в форме со знаком ero вес 6У,lJ,ет равен -32768. Как н в CJlY4ae 6aTOBЫX ,lJ,анных со знаком, слово со знаком LI1MeeT форму ,lJ,onOJlHeHLI1 .0.0 ,lJ,ВУХ, Kor,lJ,a оно npe,lJ,CTaBJleT отрLl1цатеJlьное 4L11CJlO. Кроме Toro 06paTLI1Te BHLI1MaHLI1e на то, 4ТО МJlаДWLl1 6aT сохраня eTC в Я4ейке паМТLI1 с меНЬШLl1М адресом (3000Н), а старШLl1  в чеке naMTLI1 с 60ЛЬ WLl1M адресом (3001 Н), eCJlH ре4Ь LI1дет о ceMeCTBe YCTPOCTB PIC18. npLl1Mep 1.28 показывает несколько знаковых LI1 6еззнаковых nOCJlOBHbIX данных, сохраненных в naMTLI1 в рамках nporpaMMbI на AcceM6Jlepe. npLl1Mep .1.29 демонстрLl1РУ ет coXpaHeHLI1e тех >ке 4L11CeJl nроrраммой на С/С++, KOTopa LI1СnОJlьзует KJl104eBOe слово short Дn coXpaHeHLI1 16разр,lJ,НЫХ цеJlЫХ 4L11CeJl. 06paTLI1Te BHLI1MaHLI1e на то, 4ТО команда dec/are word LI1JlLl1 DW на AcceM6Jlepe npLl1Bo,lJ,LI1T к coXpaHeHLI1IO в naMTLI1 слов, а не 6aTOB, как в преДЫ,lJ,уw,LI1Х npLl1Mepax. КомаН,lJ,а ОАТА мо>кет так>ке 6ыть LI1СnОJlьзована Дn опре- ,lJ,eJleHLI1 CJlOBa. npLl1 LI1СПОJlьзоваНLI1L11 KOMnLl1JlTOpa С PIC С18, ,lJ,LI1ректнва int так>ке LI1CnOJlb зуетс Дn 06ЪВJlеНLI1 16раЗр,lJ,ноrо u.eJloro 4L11CJla. Пример 1.28 ;Беззнакове nOCnOBHe AaHHe DАТА1 DАТА2 DАТА3 DW DW DW .2544 Ох87АС .710 ;orrpeAenReT деСRтмqное 2544 ;оnредеnRет wестнадuатмриqное 87АС ;оrrредеnRет AeCRTMqHOe 710 ;Посnовне AaHHe СО знаком DАТА4 DАТА5 DАТА6 DW DW DW .13400 +198 OxFFFF ;оnредеnRет деСRтмqное 13400 ;оnредеnRет деСRтмqное +198 ;оnредеnRет деСRтмqное -1 Прер 1.29 IIDocnoBHe дaHHe 6ез знака II unsigned short Datal = 244; unsigned short Data2 = Ох87АС; unsigned int Data3 = 710; /1 оnредеnRет деСRтиqное 2544 II оnредеnRет wестнадuатмрмqное 87АС II.оnредеnRет деСRтмqное 710 1I I1 Посnовне дaHHe СО знаком I1 short Data4 = 13400; short Data5 = +198; int Data6 -1; int Data? = 3 ; II оnредеnRет деСRтмqное 13400 II оnредеnRет деСRтмqное +198 II оrrредеnRет деСRтмqное 1 II оnредеnRет деСRтмqное +3 Действительные числа AeCTBHTeJlbHbIe 4HCJla LI1Hor,lJ,a BCTpe4aIOTC в npLl1JlO>KeHLI1X  здесь OHLI1 paCCMaT pLl1BaIOTC в CLI1JlY Toro, 4ТО HHor,lJ,a встроенные KOHTpOJlJlepbI ,lJ,OJl>KHbI LI1MeTb деJlО с дeCT BLI1TeJlbHbIMLI1 4L11CJlaMH. AeCTBLI1TeJlbHOe 4HCJlO HJlLl1 4L11CJlO С nJlaBalOw,e T04KO, как ero 
32 TIpHMeHeHHe МНКрОКОНТрОЛJlеров PIC 18 часто называют, состоит L/13 двух частей: MaHTL/1CCbI,  значащей или дробной 'Iac 1 и и экспоненты. Рис. 1.4 показывает как 4байтовую, так L/1 8байтоuую форму дейс 1 L3и 1 elIb ных чисел, как они сохраняются в системах Intel. Обра 1 ите внимание на ю, чro 4байтоuая срорма назьшается срормой ЧL/1сла одинарной rОЧIIОСТИ, а 8бай 1013а>! форма называется срормой ЧL/1сла двойной точности. ПреДСlаШlClIные з/есь формы coxpaHe НL/1Я деЙСТВL/1тельных чисел являются TeML/1 >ке, ко.торые СllеЦИфИlированы С.lандар.том 'EEE754, верСL/1Я 10.0. 3тот стандарт был прин>!т u ка'ICСILЗе С.lаlщаРIНОЙ формы "peд стаuлеНL/1 дествнтельных 4L/1сел праКТL/1чеСКL/1 I3CeML/1 языками 11роrраммироваIlИ>!, а так>ке MHOrHML/1 приклаДНЫМL/1 naKeTaML/1. Данный стандарт так>ке примеНlетс>! npL/1 Ma НИllулироваНИL/1 даННЫМL/1 в аРL/1срметичеСКL/1Х сопроцессорах перСОllальных комIIы(те ров. PL/1c. 1. 4а показывает срорму ЧL/1сла ОДL/1нарной точности, котора>! содер>КL/1Т бит Эllа ка, 8битную экспоненту L/1 24БL/1ТНУЮ дробную часть (Malll иссу). Обра 1. L/1 Т е внимание на то, что в СL/1ЛУ TOIO, что nрL/1ло>кеНL/1Я часто требуют L/1спольэоuаНL/1Я 'lL/1сел с плаuающ(}й Т04КОЙ двойной точности, соответствующая форма так>ке предстаШlCна на рис. 1. 4Ь. Простой аРL/1фмеТL/1чеСКL/1Й ПОДС4ет показывает, что для сохранени>! rзсех назван ных фраrментов данных неоБХОДL/1МО 33 БL/1та. Однако это не .raK  24би IlIая маllтисса содер>КL/1Т подразумеваемый (неяI3НЫЙ) БL/1Т, что позволяет Мсlfписсе 11редсrаШIЯЛ) 24 БL/1та, будучи сохраняемой Bcero в 23 БL/1тах. Неяuный бит  это перuый бит нормаJJИЗО BaHHoro деЙСТВL/1тельноrо ЧL/1сла. ПрL/1 1I0рмаЛL/1заЦL/1И ЧL/1сла, оно пете Iраивается таким обраЗ0М, 4ТО ero значеНL/1е по крайней мере равно еДL/1нице, однако меllЫIЮ 2. HallpL/1 мер, еСЛL/1 12 преобраЗ0вать в ДВОL/14НУЮ срорму (11002)' то после нормализаЦL/1L/1 резуль татом будет: 1.1 х 23. Цела 4асть нормаЛНЗ0ванноrо ЧL/1сла (1) не сохраняется ПрL/1 L/1C ПОЛЬЗ0ваНL/1И 23-БL/1ТНОЙ чаСТL/1 4L/1сла, задающей MalITL/1CCY; 1 наХОДL/1ТСЯ в ,еДL/1НL/1ЧIЮМ "скрытом" БL/1те. Табл. 1.9 nоказьшает срорму этоrо L/1 друrL/1Х чисел одинарной точности. 3кспонента сохраняется в срорме смещенной экспоненты. В форме действитOJН Horo ЧL/1сла одинарной Т04IЮСТL/1 смещеНL/1е равно 127 (Ox7F), а npL/1 ИСПОЛЬЗ0вании фор мы деЙСТВL/1тельноrо 4исла двойной ТОЧНОСТL/1 она равна 1023 (Ox3FF). Значения смещс ния L/1 экспоненты складываютс перед сохранением экспоненты в ссютuетствующей чаСТL/1 ЧL/1сла с плаваюw,ей Т04КОЙ. В предыдущем npL/1MelJt; покаэана экспонента, равна>! 23, Ilредставленна 13 срорме смеw,енной экспоненты, равной 127 -1- 3 or 130 (Ох82) в срорме деЙСТI3L/1тельноrо 4L/1сла ОДL/1нарной ТОЧIЮСТL/1 L/1ЛL/1 как 1026 (Ох402) в форме дей СТВL/1телы-юrо 4L/1сла двойной T04HOCTL/1. 31 ЗА Ш :жспонента 23 22 I . ЖI.НТlJсса о I (а) 63 62 52 51 О [1 экспоне"т, I м.rпнсса I . (Ь) Рис. 1.4. Данные, заданные в срормате с nлаваюw,ей Т04КОЙ: (а)ОДL/1нарнаТ04НОСТЬ,(Ь)двойнаяточность 
rnaBa 1. Вве)].енне в архнтектуру компьютеров 33 Таблица 1.9. AeCTBL/1TeJlbHbIe 4HCJla O,lJ,L/1HapHO T04HOCTL/1 еся- воичное Нормаnизо- Знак CMeeHHaR Мантмсса ТМ4ное ванное 3KCnOHeHTa +12 1100 1.1 х 2 .! О 10000010 10000000 00000000 00000000 -12 1100 1.1 х 23 1 10000010 10000000 00000000 00000000 +100 1100100 1.1001х 26 О 10000101 10010000 00000000 00000000 -1.75 1.11 1.11 х 20 1 01111111 11000000 00000000 00000000 +0.25 0.01 1.0 х 22 О 01111101 00000000 00000000 00000000 +0.0 О О О 00000000 00000000 00000000 00000000 V1MeeTC два L/1CKJlI04eHL/1 L/13 npaBHn занесеНL/1 в памть 4L/1CeJl с nлаваlOw,ей ТОЧ KO. Так, 4L/1СЛО 0.0 coxpaHeTC в форме, все разрды KOTOPO равны НУЛIO. ЧL/1СЛО "бес конечность" coxpaHeTC в форме, все разрды экспоненты KOTOPO L/1MeIOT еДL/1I1L/14ное 3Ha4eHL/1e, а MaHTL/1CCbI - HYJleBoe. Знаковы 6L/1T в зтом CJlY4ae указьшает ЛL/160 nОЛО>КL/1 тельнуlO, ЛL/160 ОТРL/1u.атеJlЬНУЮ 6есконе4НОСТЬ. в с/с++ 4L/1CJla О,lJ,L/1нарной ТО4НОСТН оnре,lJ,еJlЮТС как f/oat, а 4L/1CJla ,lJ,BOHO T04 HOCTL/1 оnре,lJ,еJlЮТС как doubIe, как это nоказано в npL/1Mepe 1.30. Нет ВО3МОЖНОСТL/1 оnредеJlТЬ TaKL/1e 4L/1CJla npL/1 HCnOJlb30BaHL/1L/1 AcceM6Jlepa PIC, eCJlL/1 TOJlbKO, коне4НО, предварL/1теJlЬНО не npeo6pa30BaTb L/1X в nОСJlОВНЫЙ HJlH no6aTOBbI формат BPY4HYIO. KOMnL/1JlTOp CI8 PIC BOCnpHHL/1MaeT как форму f/oat, так и форму doubIe, О,lJ,нако 06а 3TL/1 TL/1na 4L/1CeJl фаКТL/14ескн сохранются н НСnОJlЬ3УЮТС как 32раЗр,lJ,ные 4L/1CJla O,lJ,L/1Hap ной T04HOCTL/1. Пример 1.30 IIествитеnьне чисnа одинарно точности 11 float Nurnbl = 1.234; float Numb2 23.4; float Numb3 = 4.3е2; 11 11 ествитеnьне чисnа ДBOHO точности double Numb4 double Numb5 123.4; -23.4; 
34 Применение МИКрОКОНТролnеров PIC18 IEEE754 s еее ееее е fff ffff fПf ffff ffff ffff ееее ееее Microchip s fff ffff I ffff ffff ffff ffff s = знаковый бит е = экспонента f= мантисса Рис. 1.5. Форматы 4Hcen С nJlaBalOw,e точко Microchip L/1IEEE Microchip L/1сnоnьзует ,lJ,руrой формат ,lJ,Jl 4L/1CeJl с nJlаваюw,е T04KO в КОМПL/1ЛТО ре с 3ЫKa С С18. Рнсунок 1.5 НJlJlюстрнрует разннцу мюкду форматом 4L/1ceJl с nJlaBalO- ще ТО4КОЙ <рнрмы Microchip н <рорматом IEEE. Разннца заKJl104аетс в размещеНL/1И знаКQвоrо бита ЧИСJlа. Эта разннца не оказывает воздеСТВL/1 на ра60ТУ KOMnL/1nTOpa С. 1 .4. Резюме 1. Чарльз Бе66НД)1( L/1з06реJl L/1 C03ДaJl первую ВЫ4L/1СЛL/1теJlЬНУIO CL/1CTeмy  "АНaJlL/1ТL/1чеСКL/1 двнrатеJlЬ". Позднее, Джон <рон HeMaH ycoBepWeHCТВOBaJl apXL/1Teктypy компыоера.. 2. Первым nporpaMMHCToM 6bIJla ABrycTa А,о,а Барон (позднее  rрафL/1Н Лав Jlecc), она заслу>кнnа реnуТаu.ню nepBoro проrраММL/1ста в СL/1ЛУ Toro, 4ТО ПL/1сала npo rpaMMbI AflЯ "Анanнтнческоrо ,lJ,внrатеJlЯ" ЧарJlьза Бе66L/1дж:а. 3. Первый в мнре MHKponpou.eccop - Inte14004, 6bIJl 46L/1THbIM МL/1кропроцессором, npe,lJ,cTaBJlBWHM co60 npOrpaMML/1pyeMbl KOHTpOJlJlep в ML/1KpOCxeMe. Он адресоваJl 4096 4етырехбнтных 4eeK naMTL/1. 4. ЦП ВJlется уnраВJlЮUJ,НМ эnементом комnьютерно CL/1CTeMbl. ЦN BblnOJlHeT перенос ,lJ,анных, BblnOJlHeT простые арнфмеТН4ескне L/1 JlorL/14eCKL/1e onepau.L/1L/1, а так>ке ПРL/1НL/1мает простые peWeHL/1. ЦN BbInOJlHeT nporpaMMbl, сохраненные в заnОМL/1наlO w,e CL/1CTeMe, 4ТО 06eCne4L/1BaeT возможность выполнеНL/1 СJlОЖНЫХ оnераЦL/1 зада4а КОрОТКL/1Й пернод BpeMeHL/1. 
rлава 1. Вве)].енне в архнтектуру компьютеров 35 5. Все компыоерныыe CL/1CTeMbI СО,lJ,ер>КаТ трн ШL/1НЫ, nре,о,назна4енные ,lJ,JlЯ ynравлеНL/1 памятью L/1 ycтpoCTBaML/1 BBoдaBЫBOдa. WL/1Ha адреса L/1cnOJlb3yeTc ,lJ,JlЯ обраw,еНL/1 по сщресу паМЯТL/1 L/1ЛL/1 к устройству BBoдaBЫBOдa. WL/1Ha данных переносит данные между мнкропроцес сором L/1 naMTblO, а так>ке nространством ввода-вывода. WL/1Ha ynpa8JleHH ynpa8JleT naMffiblO L/1 BBOДOMBЫBOДOM, заnраШL/1ва 4TeHL/1e L/1ЛН 3ЭЛL/1СЬ данных. 6. ЧL/1сnа пре06разуlOТС L/1з ЛI060 CL/1cтeMbI C4L/1CJleHL/1 в ,lJ,еСЯТL/14Нyto CL/1cтeMY С4ислеllL/1Я, Y4L/1TbIBa вес каждоrо разряда. Вес разряда, раСПОJlоженноrо непосредственно CJleBa от ТОЧКL/1 nОЗL/1ЦL/10ННО CL/1CTeMbI С4L/1слеНL/1, Bcerдa равен еДННL/1це в n1060 CL/1CTeMe С4L/1слеl-lL/1. Вес раз ряда, раСnОJlоженноrо непосредственно cneBa от nОЗL/1LJ.НL/1 еДННL/1Ц Bcerдa равен основаниlO L/1спользуемой CL/1CTeMbI С4ИСJlеНL/1, умноженному На еДННL/1ЦУ. Вес слеДУIOw,еrо слева разряда определяетс умножеНL/1ем на основанне CL/1cтeMbI С4L/1слеНL/1Я. Вес разряда, располо>кенноrо непосредственно справа от T04KL/1 ПОЗНЦL/10ННОЙ CL/1CTeMbI C4L/1CneHL/1, всеrда опредеJlяется дe JleHL/1eM на OCHOBaHL/1e CL/1CTeMbI C4L/1CJleHH. 7. npe06pa30BaHL/1e цеJlО 4aCTL/1 ,lJ,eCTL/14HOrO 4L/1CJla в Jl106ylO L/1HYIO CL/1CTeMY C4L/1C JleHL/1 ВЫПОJlнетс ,lJ,eJleHL/1eM на oCHOBaHL/1e CL/1CTeMbI С4НСJlеНL/1Я. nре06разоваНL/1е ,lJ,p06HO 4aCTL/1 деСТL/14ноrо 4L/1CJla в Jl106ylO L/1HYIO CL/1CTeMY C4L/1CJleHL/1 BbInOJlHeTC YMHO жеНL/1ем на oCHOBaHL/1e снстемы C4HCJleHH. 8. Шестнaдu.аrnРL/14ные данные пре,lJ,ста8JlIOТС в шестнадцаТL/1РL/14НО <Рорме L/1ЛИ в KO ,lJ,L/1poBKe, называемо ДВOH4HOKOДНpoBaHHЫM wecTHaдu.arnpL/14HbIM кодом (АКШК). А Двоично коднрованное шестнaдu.аТL/1РL/14Ное 4L/1CJlO  ЭТО 4L/1CJlO, которое заnL/1сываетс 4етырехБL/1ТНЫМL/1 ДВОL/14НЫМL/1 4L/1слаМL/1, nредста8JlIOw,L/1МL/1 кажды шестнaдu.aТL/1рL/14НЫ разряд. 9. Код ASCII L/1СnОJlьзуетс Дn XpaHeHL/1 аJlфаВL/1ТНОЦL/1фРОВЫХ ЛL/160 4L/1сленных ,lJ,анных. Код ASCII  3ТО 76L/1THbI КОД; О,lJ,нако, он может L/1MeTb BOCbMO бит, который L/1СnОJlьзуетс Дn paCWL/1peHL/1 на60ра CL/1MBOnOB от 128 до 256 кодов. Код возврата Ka peTKL/1 (Enter) возвраw,ает ne4aTalOw,ylO rOJlOBKY L/1JlL/1 курсор на JleBOe ПОJlе. Ко,lJ, перевода CTpOKL/1 перемеw,ает курсор L/1nL/1 ne4aTalOw,ylO rOJlOBКY ВНL/1З на О,lJ,ну строку. 1 О. ДвОL/14нокоднрованные дecrn4Hыe (,ЦК,Ц) данные L/1HOrдa L/1СnОJlЬЗУIOТ в KOMnblO TepHO CL/1CTeMe Д11 XpaHeHL/1 деCffiL/14НЫХ данных. 3m ,lJ,анные coxpaHIOT JlL/160 в ynaKoBaH HO (две ЦL/1фРЫ на 6aT) JlL/160 в неynакованной <Рорме (о,о,на ЦL/1фра на 6айт). 11. ABoL/14HbIe данные в компьютерных CL/1CTeMaX coxpaHIOTC в форме 6aTOB (8 6L/1TOB) L/1JlL/1 CJlOB (16 6L/1TOB). 3TL/1 данные MOryT 6ыть со знаком L/1ЛL/1 6ез. ОТРL/1цательные 4L/1Cna со знаком всеrда coxpaHIOTC в форме ДОnОJlнеНL/1 до двух. Аанные, ДJ1L/1Ha KOTO рых nревышает 8 6L/1T, Bcer,lJ,a coxpaHIOTC с L/1сnоnьзоваНL/1ем срормата с 06ратным по pДKOM 6aTOB. 12. Формат с nJlaBalOw,e T04KO L/1СnОJlьзуетс в KOMnblOTepHbIx CL/1CTeMaX ДJIЯ xpa HeHL/1 u.eJlbIx, смешанных L/1 ,lJ,ро6ных 4L/1CeJl. Формат с nJlаваlOw,ей T04KO составлется L/1з знака, MaHTL/1CCbI L/13KCnOHeHTbI. 1 З. AL/1peKTL/1BbI AcceM6Jlepa ОВ (06bBL/1Tb 6aT) L/1 DW (06bI3L/1Tb слово) L/1СПОЛЬЗУ IOTC Дn coXpaHeHL/1 6aTOB L/1 CJlOB ,lJ,анных в CL/1CTeMaX naMTL/1. 1.5. Вопросы и задания 1. Кто nOCTpOL/1Jl "aHaJlL/1TL/14eCKL/1 ДВL/1rатеJlЬ"? 2. nepBbI в ML/1pe МL/1кропроцессор 6bIJl создан в 1971 rоду З. Кем 6bIJla rрафL/1Н Лавnесс? 4. Что такое "маШL/1на фон HeMaHa"? 5. KaKa компаНL/1 разра60таJlа nepBbI ML/1KPOKOHTpOJlJlep? 6. Что зна4L/1Т cOKpaw,eHL/1e CISC? 7. Что зна4L/1Т cOKpaw,eHL/1e RISC? 
36 Прнмененне MHKpOKOHTpOnnepOB PIC18 8. АВОLl14НЫЙ 6L11T XpaHLI1T LI1nLl1 9. Компьютерное "К" равно  6aTaM. 10. KOMnblOTepHoe "М" равно К 6aT. 11. Компьютерное "G" равно  М 6aT. 12. Что такое nOJly6aT? 13. На4ертнте 6noKcxeMY KOMnblOTepHo CLl1CTeMbI. 14. nepe4HCJlHTe трн ШLl1НЫ, которые npLl1CyTcTI3YIOT во всех компыоерныыx CLl1CTe мах. 15. KaKa WHHa nepe,lJ,aeT адрес naMTLI1 YCTPOCTBY BBoдaBЫBoдa LI1ЛLl1 naMTLI1? 16. KaKO CLI1rHaJl ynpaBJleHLI1 застаВJlет naMTb ВЫПОЛНLI1ТЬ операЦLl1IО 4TeHLI1? 17. В 4ем заKJlЮ4аетс конu.еnЦLl1 coxpaHeMO nporpaMMbI? 18. В 4ем заKJlЮ4аетс pa3HLI1u.a ме>кду СnnЗУ LI1 3СnnЗУ? 19. ECJlLl1 naMTb LI1MeeT 14-6L11ТНbI а,lJ,рес, CKOJlbKO 4eeK naMTLI1 она может CO,lJ,ep >кать? 20 CKonbKO 4eeK naMTH CO,lJ,ep>KHTC в naMTLI1 06ьемом 4К х 8? 21. Что такое С03У? 22. Какой TLI1n заnОМLI1наlOUJ,еrо устройства ,lJ,OJl>KeH LI1сnоnьзоватьс .o.n XpaHeHLI1 ,lJ,HHaMLI14eCKLI1X ,lJ,анных? 23. ОnLl1ШLl1те Ha3Ha4eHLI1e cne,lJ,YIOw,LI1x ,lJ,LI1peKTLI1B AcceM6nepa: а. ОВ Ь. ОА ТА c.DW 24. OnLl1WHTe назна4енне CJle,lJ,YIOw,LI1x ,lJ,LI1реКТLl1В С/С++: а. char Ь. short с. int d. float е. doubIe 25. ECJlH aдpeCHa WLI1Ha naMTH СО,lJ,ер>кнт указанное даJlее KOnLl14eCTBO ЛLl1НLI1, on pe,lJ,eJlLl1Te KOnLl14eCTBO 4eeK naMTH, которые MOryr 6ыть а,lJ,ресованы. а.12 Ь. 14 С. 16 d.18 8.32 26. nре06разуйте npLl1Be,lJ,eHHbIe ,lJ,aJlee ,lJ,ВОН4ные 4Hcna в ,lJ,eCTLI14HbIe: а.1101.01 Ь.111001.0011 с. 101011.0101 d. 111.0001 27. nР80бразуте npHBe,lJ,eHHbIe ,lJ,anее BOCbMLI1pH4Hble 4L11CJla в ,lJ,еСТLI1чные: а. 234.5 Ь.12.3 с.7767.07 d. 123.45 е.72.72 28. nреобразуте npHBe,lJ,eHHbIe ,lJ,aJlee weCTHaдu.aTHpH4HbIe 4HCJla ,в ,lJ,eCTLI14Hble: а.А3.3 . Ь. 129.С с. АС.ОС 
fnaBa 1. Вве)].енне в архнтектуру компьютеров 37 d. FAB.3 е. ВВ8.0О 29. npeo6pa3YTe СJlеДУIOw,LI1е деСЯТLI14ные цеnые 4L11CJla в ,lJ,B0Ll1411YIO, BOCbMLI1pLl14 HYIO LI1 шестнадu.аТLI1РLl14НУIO формы: а.23 Ь.107 С. 1238 d.92 е.173 30. nрео6разуте СJlе,lJ,уюw,не ,lJ,eCTLI14HbIe 4L11CJla в ,lJ,вончную, ВОСЬМНРН4НУЮ Н ше стнадцаТLI1рLl14НУIO формы: а.О.625 Ь.О.00390625 С. 0.62890625 d.O.75 е.09375 31 . npeo6pa3YTe CJlе,lJ,УЮUJ,Не wecTHaдu.aTHpH4HbIe 4HCJla в ,lJ,BOH4HO КОДLl1рованны wecTHaдu.aTLI1pH4HbI КО,lJ, (ДКWК): а.23 Ь.АО4 с. 34.АО d. ВО32 е. 234.3 32. npeo6pa3YTe СJlе,lJ,УЮUJ,не ,lJ,BOH4HOKO,lJ,HpOBaHHыe WeCTHa,lJ,u.aTHpH4HbIe 4нсла в wecTHaдu.aTHpH4HbIe: а. 11000010 Ь. 0001 0000 1111 1101 с.10111100 d. 0001 0000 е. 100010111010 33. nрео6разуте СJlе,lJ,уюw,не ,lJ,ВОН4ные ЧНСJlа в форму ,lJ,OnOnHeHH .0.0 O,lJ,HOro: а. 1000 1000 Ь.0101 1010 с.01110111 d. 10000000 34. npeo6pa3YTe СJlеДУЮUJ,не ,lJ,ВОН4ные 4HCJla в ФОРМУ ,lJ,OnOJlHeHH до ,lJ,ВУХ: а. 10000001 Ь. 10101100 с.10101111 d. 10000000 35. Как 06ЬВJlЮТС батовые ,lJ,анные npH HCnOJlb30BaHHH ACCeM6Jlepa? 36. nрео6разуте сnе,lJ,УЮЩLl1е CJlOBa в CHMBOJlbHbIe строкн в КО,lJ,нровке ASCII, HC nОJ1ЬЗУ AcceM6Jlep: а. FROG Ь. Arc с. Water d.Well 37. Какнм 6удет KO,lJ,ASCII AfI KJlаВНШLl1 Enter н каково ero назна4енне? 38. V1СnОJlьзуте ДLl1реКТLI1ВУ AcceM6nepa Дn coxpaHeHH в naMTH строкн ASCII- CLI1MBOJlOB "What time is it?" (KOTOpы 4ас?). 
38 ITpHMeHeHHe микроконтроnnеров PIC 18 39. nреобразуте слеДУIOw,LI1е деСТLI14ные 4L11сла в 8разрдные ДВОLl1чные ЧLl1СJla СО знаком: а.+32 Ь. 12 с.+100 d. 92 40. nре06разуте сле,lJ,УIOw,LI1е ,lJ,eCTLI14HbIe 4L11cna в nOCJlOBHbIe ДВОLl1Чllые ЧLl1сла со знаком: а.+1000 Ь.  120 с.+800 d. 3212 41. V1СПОJlьзуте ДLl1реКТLl1ВУ AcceM6nepa Д11 coXpaHeHLI1 в naMTLI1 6аТО[з0rо ЧLl1СJIa 34. 42. Создате 6aToBYIO nepeMeHHYIO с LI1MeHeM Fredl LI1 COXpaHLI1Te в He 4L11СЛО 34 на С/С++. I 43. npO,lJ,eMoHCTpLl1PYTe, как cne,lJ,YIOw,LI1e 16раЗр,lJ,ные шестна,lJ,u.аТLI1РLI14ные 4L11сла coxpaHIOTC в заnОМLI1наlOw,ей CLI1CTeMe (LI1СnОJlьзуте как форму с 06ратным порядком 6aTOB, так LI1 форму С npMbIM nордком 6aTOB): а.Ох1234 Ь.ОхА122 с.ОхВIOО 44. В 4ем заKJl104аетс ра3НLI1ца между форматом с обратным nордком байтов LI1 срорматом с npMbIM nOp,lJ,KoM 6aTOB в CJlY4ae coXpaHeHLI1 4L11сел, nревышаlOw,LI1Х по ДnLl1He восемь разрдов? 45 V1СnОJlьзуйте ДLl1реКТLI1ВУ AcceM6Jlepa Д11 coXpaHeHLI1 в' naMTLI1 wестнадцаТLI1 РLl1чноrо 123А. 46. nре06разуте СJlеДУIOw,LI1е деСТLI14ные 4L11сла как в ynaKoBaHHYlO,TaK LI1 в Heyna KOBaHHYIO АКАФормы: а. 102 Ь.44 с.301 d.1000 47. nре06разуте Cne,lJ,YIOw,LI1e ДВОLl14ные 4L11CJla в дeCTH4Hыe 4L11CJla со знаком: а.10000000 Ь.00110011 с. 10010010 d. 10001001 48. nре06разуте СJlе,lJ,УIOЩLl1е AКA4L11cJla (в nредпоnожеНLI1L11, 4ТО зто упакованные 4L11сла) в деСТLI14ные 4Hcna: а.10001001 Ь.00001001 с.00110010 d.00000001 49. nре06разуте CJle,lJ,YIOw,LI1e ,lJ,eCTLI14HbIe 4L11сла в 4L11сла ОДLl1нарно T04HOCTLI1 с nJlaBalOw,e Т04КОЙ: а. +1.5 Ь.  10.625 с. +100.25 d.  1 200 50. Пре06разуте СJlеДУIOw,LI1е 4L11CJla с плаваlOw,е T04KO ОДLl1нарIlО ТОЧНОСТLI1 13 
fnaBa 1. Вве)].енне в архнтектуру компьютеров 39 формате IEEE754 верснн 10.0 в ,lJ,еСПН4ные ЧНСJlа: а.01000000011000000000000000000000 Ь. 10111111100000000000000000000000 С.О 10000010 10010000000000000000000 51. V1cnonb3YTe V1HTepHeT AflЯ Toro, 4т06ы HanHcaTb краткое со06щенне об одном LI13 НLI1жеnере4L11СJlенных nLl10HepOB в оБJlастн компьютеров: а. ЧарJlЬ3 Бе66L11,lJ,)1( Ь. ABrYCTa А,о,а Барон с. А>Кон фон HeMaH 52. V1СПОJlьзуте V1HTepHeT Дn Toro, 4т06ы HanHcaTb краткое СО06щенне 06 одном LI13 НLI1жеnере4L11СJlенных 3ЫKOB nporpaMMHpoBaHH: а. COBOL Ь. ALGOL с. FORTRAN d.PASCAL 53. V1CnOJlb3YTe V1HTepHeT Дn Toro, 4т06ы HanHcaTb краткое сообw,енне о CBOCT- вах MLI1KpOKOHTponnepoB ceMeCTBa PIC. 
40 ITрнменение МИКрОКОНТроnnеров PIC 18  rЛАВА 2. Архмтектура семейства PIC18 м разработка nporpaMM АО Toro, как nрLl1сryПLl1ТЬ к проrраММLI1роваНLI1IО MLI1KpOKOHTpOJlJlepa LI1ЛLl1 орrаНLI1за ЦLl1L11 [3заLl1МО,lJ,еСТI3L11 С друrLl1МLI1 YCTpoCTBaMLI1, не06ХОДLl1МО nOHTb ero арХLl1тектуру. В дaHHO rJlaBe nредставлетс apXLl1TeKrypa ceMeCTBa МLI1кроконтролnероl3 PIC, при этом осо60е BHLI1MaHLI1e удеJlетс MLI1KpOKOHTpOJlJlepaM ceMeCTBa PIC 18, выпускаемых фLl1р MO Microchip Technology Incorporated. CeMeCTBO PIC 18  зто самое НО130е LI1З семест13 PIC, LI1MelOw,LI1XC на рынке. В дaHHO rJlaBe так>ке nредстаI3JlIOТС вводные сведеllLl1 06 LI1HTerpaJlbHO сре,lJ,е разра60ТКLI1 (IDЕ) Дn MLI1KpOKOHTpOJlJlepOB PIC, а так>ке paCCMaTpLl1 [3aeTC процесс acceM6JlLl1pOBaHLI1/KoMnOHOBKLI1. nOcJle завершеНLI1 LI13Y4eHH дaHHO rJlaBbI вы сможете: 1. OnLl1CaTb BHyTpeHHlO1O apxLl1Teкrypy MLI1KpOKOHTpOJlJlepa PIC LI1 взаLl1модеСТВLI1е ero компонент. 2. AeTaJlbHo OnLl1CaTb cLl1cTeMHYIO apxLl1Teкrypy PICocHoBaHHo МLI1кроnроцессорно CLl1CTeMbI. З. 06bCHLI1Tb назна4еНLI1е каждоrо perLl1CTpa в 0606щенно модеЛLl1 npOrpaMMLI1pO BaHLI1 MLI1KpOKOHTpOJlJlepa. 4. ЗаnроrраММLI1ровать npocTo порт BBoдaBЫBoдa на ocyw,ecTI3JleHLI1e оnераЦLl1 BBoдaBЫBO,lJ,a. 5. V1CnOJlb30BaTb LI1HTerpaJlbHYIO среду разра60ТКLI1 (IDЕ) ДJlЯ проrраММLI1рОl3atlLl1Я MLI1KpOKOHTpOJlJlepOB ceMeCTBa PIC 18. 6. V1MLI1THpOBaTb BbInOnHeHLI1e nporpaMMbI Дn MLI1KpOKOHTpOJlnepa PIC. 7. OnLl1CaTb функu.НОНLI1рованне команд зыка acceM6Jlepa. 8. nOCHLI1Tb npou.ecc AcceM6JlLl1poBaHLI1 LI1 KOMnOHOBKLI1. 2. 1. Архитектура PIC18 ApXLl1TeKrypa PICocHoBaHHo MLI1KpOKOHTpOJlJlepHO CLl1CTeMbI HeCKOJlbKO ОТЛLl1чается от 06w,e KOMnblOTepHo CLl1CTeMbI, paCCMOTpeHHO в rJlaBe 1. ВСJlеДСТВLI1е Toro, что PIC содеРЖLl1Т naMTb н YCTpOCTBa BBO,lJ,aBЫBoдa, nрLl1rодные Дn 60JlЬШLl1нства ПРLl1мене HLI1, MLI1KpOKOHTpOJlJlep PIC  зто просто отдеnьны 6JlOK PICocHoBaHHo CLl1CTeMbI. Дo ПОЛНLI1теJlьна naMTb HJlLl1 ВОЗМОЖНОСТLI1 BBO,lJ,aBЫBO,lJ,a MOryr 6ыть до6авnены в CLl1CTeMY, однако ВО MHorHX сnучах naMTb LI1 ВОЗМОЖНОСТLI1 BBO,lJ,aBЫBO,lJ,a, 06eCne4L11BaeMbIe MLI1K pOKOHTpOJlJlepOM PIC ,lJ,остаТ04НЫ Дn 60JlbWLI1HCTBa npLl1MeHeHH. PLI1c. 2.1 НJlJlЮСТРLl1рует nросryю снстему, KOTopa LI1СnОJlьзует MLI1KpOKOHTpOJlJlep PIC. 3та CLl1CTeMa СО,lJ,ержнт ЖКНН,lJ,LI1катор Дn от06ражеНLI1 LI1нформаu.LI1L11, KJlaBLI1aTYPY Дn ВВО,lJ,а ,lJ,анных, OnTLI14eCKLI1 C4L11TbIBaTeJlb каРТ04ек Дn ВВО,lJ,а LI1нформаЦLl1L11 с карточек LI1 nOCJle,lJ,OBaTeJlbHbI LI1нтерфес с xocT-комnыоеромM Дn выrрузкн ,lJ,анных LI1 заrРУЗКLI1 LI1нформаu.НLI1 в KOHTpOJlJlep. 3та, LI1СnОJlьзуема в ка4естве ПрLl1мера, CLI1CTeMa не содер- ЖLl1Т BHeWHlO1O naMTb, nOMLI1MO naMTLI1, расnоложенно BHyTpLl1 MLI1KpOKOHTponnepa. CLI1C тема в u.eJlOM СО,lJ,ержнт только YCTpOCTBa BBO,lJ,a-вывода LI1 MLI1KpOKOHTpOJlJlep, 4ТО дела- ет ее по BHeWHeMY BLI1,lJ,Y OTJlLl14HO от 6nok-схеМbI компыoерно CLI1CTeMbI, предстаВJlен HO в rJlaBe 1. Однако, eCJlLl1 BbI4epTLI1Tb MLI1KpOKOHTpOnJlep в CTLI1ne pLl1c. 1. 1, то будет два БJlока - О,lJ,НН AfI PIC LI1 O,lJ,LI1H AfI BBO,lJ,aBЫBO,lJ,a. 
rnaBa 2. Архнтектура семейства PIC 18 н разработка проrpамм 41 ЖК -индикатор микроконтроллер PIC оптический считыватель карточек . клаВИЗ1)'ра последовательный интерфейс к хост-компьютеру Рис. 2.1. Простая MHKPOKOHTPOJlJlepho-основанная снстема. Каково назна4енне это пРосто снстемы? Она MorJla 6ы HCnOJlb30BaTbc ДЛ то- ro, 4т06ы, HanpHMep, nОJlучать ннформацнlO от ра604НХ на npoH3BoAcTBe, а так>ке функ- цноннровать как та6еJlНРУlOщне 4асы. Pa604H, nРНХО,lJ,я на ра60ТУ, может вставнть CBOIO ндентнфнкацноннуlO каРТ04КУ в onTH4ecKH c4HTbIBaTeJlb карточек н снстема заре rHcTpHpyeT ero ндентнфнкацнонны номер 4ерез nОСJlедовательны интерфес в yдa JleHHOM KOMnblOTepe хост-снстемы. xoct-комnыоерp затем npoBepHT допустнмость ндентнфнкацнонно каРТ04КН н от06разнт со06щенне "nрннято", со06щенне 06 oWH6Ke HJlH kaKYIO-Jlн60 иную ннформацню на ЖКннднкаторе. 3та снстема содержнт два YCT pOCTBa ввода данных (KJlaBHarypy н onTH4ecKH c4HTbIBaTeJlb каРТ04ек), YCTPOCTBO вывода (ЖК-ннднкатор), н ABYHanpaBJleHHOe YCTPOCTBO ВВО,lJ,а - вывода (nOCJleAOBa- тельны ннтерфес с xoct-комnыоером).. PIC MHKpOKOHTpOJlJlep СО,lJ,ержнт: память AflЯ xpaHeHH nporpaMM н данных, noA KJlЮ4ення YCTPOCTB ввода-вывода, ФОРМНРУlOщне ннтерфес со С4нтывателем карто- 4ек, ЖКннднкатором, KJlaBHarypo, nOCJleAOBaTeJlbHbIM ннтерфесом (внутренним ИН- терфесом контроллера), н также TaMepOM, KOTOpЫ может исnользоватьс в качестве 4асов peaJlbHOrO временн н каJlендаря снстемы. TaKO уровень интеrрации делает мик- pOKOHTpOJlJlep мощным н HeAoporHM средством создання снстем. МИКРОКОIIТРОJlлер PIC стонт Bcero HeCKOJlbKO AOJlJlapOB н может nроrраммнроваться на Ассем6лере, С, БЕЙСV1КЕ HJlH Java. Краткий обзор внутренней архитектуры PIC Теперь, KorAa мы нмеем некоторое npeACTaBJleHHe о мощностн PIC как KOHTpOJl- Jlepa снстемы, мы ДОJlЖНЫ понять BHyTpeHHlO1O структуру этоrо YCTpOCTBa. Как у>ке уnомннэnось, PIC содер>кнт naMTb н u.eHTpaJlbHbI nроцессор. Он так>ке содержнт KOM nOHeHTbI формнровання ннтерфеса ВВО,lJ,а - вывода, не06ходнмые AflЯ управления YCTpOCTBaMH снстемы. npe)l(,lJ,e, 4ем вы сможете nporpaMMHpOBaTb МНКрОКОНТрОЛJlер, не06ходнмо понять ero BHyTpeHHlO1O структуру. 
42 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 rенерирован тактовых нмпуnьсов порты А ... вво)].а- А ... ... .. вывода памSlТЬ )].анных  I:Q V О  I:Q О о.. t:: 00 памSlТЬ стека 32х21 А ... 1 таЙмеры 21 провод ... .. ие  8-бнтный ЦП А. -"" ... I:Q .. О  .А. I:Q АЦП 16 проводов 1 О 'f о.. r:: 00 памSlТЬ проrрамм после)].о- А ..J-. ватеnь 'j V ные ПортЫ ЭСППЗУ А. ..J-. данных ... I:Q .. О  дpyrнe I:Q пернфе о о.. А. J\. r:: рииные 00 ... .. YCTpOHCT J ва Рис. 2. 2. BHyTpeHH CTpyкrypa микроконтроллеров ceMeCTBa PIC 18 Рис. '2.2 из06ражает ВНуТреннlOЮ архитекryру ceMeCTBa контроллеров PIC 18. 06paTLI1Te внимание, 4ТО эта BHyTpeHH архитекryра nод06на блоксхеме KOMnblOTep HO системы, nоказанно на рнс. 1. 1. Основное ра3ЛИ4не 3ЭКЛlO4ается в том, 4ТО na MTb в PIC разделена в два ра3ЛН4НЫХ раздела - один AflЯ хранени nporpaMMbI, а дру- ro - AflЯ хранения данных. 3та архнтектура Ha3ЫBaeTC rарвардско архитектуро, нзобретенно в 1944 AflЯ ЭJlектромехаНН4ескоrо KOMnblOTepa (Mark 1), разра6отанноrо rовардом Хатавеем AKeHOM, KOTOpЫ в 1947 сказаJl: "Только weCTb злектронных u.иср- ровых KOMnblOTepOB nотребуетс AflЯ Toro, 4то6ы УДОВJlетворить ВЫ4ИСJlнтельные no требностн всех Соединенных WTaTOB." rарвардска архнтектура деJlНТ naMTb системы на два раздеJlа с тем, 4то6ы nOBblcHTb ее зффектнвность. В траднционн'о архнтектуре системы срон HeMaHa данные и команды вы6нраютс 4ерез ry же caMYIO WHHY, 4ТО 4ac то вызывает задержки вски раз, коrда команда маНИr:JУJlирует даннымн, заnисаннымн 
rnaBa 2. Архнтектура семейства PIC18 н разработка проrpамм 43 в nамти. Аанные в nамятн н nOJlY4aeMbIe онт YCTPOCTB BBO,lJ,a-выво,lJ, - 06Ы4НО 8 имеlOТ длину в восемь 6нтов, в то BpeM как команды 4асто HMelOT 60JlbWYlO разрдность. В rарвардско apxHTeкrype, peaJlH30BaHHo в PIC MHKpOKOHTpOJlJlepax, naMTb данных и шины BBoдaBЫBoдa HMelOT разрядность в 8 6нтов, а naMTb nporpaMM нмеет разрд ность в 16 6итов. TaKa орrаннзацн n03ВОJlяет командам вы6нраться И3 nамти npo rpaMMbI в одном u.икnе 4тення HJlH в рамках OДHO оnерацни, 4ТО повышает зфсректив ность системы. 06ратнте вннманне, 4ТО PIC-МНКрОКОнтрОJlJlерbI некоторых семейств ИСnОЛЬЗУlOт 12разрднуlO naMTb nporpaMM, однако здесь рассматриваетс 16разрядна naMTb nporpaMM, реаJlизованная в ceMeCTBe PIC 18. Вследствие Toro, 4ТО naMTb nporpaMM н naMTb данных разделены, вы60рка KO дОВ оnераu.ий nepeKpbIBaeT выполнение команды, 4ТО повышает эффективность микро контроллера. 3тот зсрсрект Ha3ЫBaeTC конвейерным режимом, он ИЛЛlOстрируетс на рисунке 2.3. 06ратите внимание на то, 4ТО во BpeM nepBoro TaKToBoro u.ИКJlа выnолне ния команды, команда 1 И3ВJlекаетс Н3 naMTH, затем во BpeM BToporo тактовоrо цик- ла выnолнени команды команда 2 Н3ВJlекается Н3 nамятн 2 nараJlJlелы-ю с выnолнени ем команды 1. 3то nepeKpblTHe НJlИ KOHBeepHЫ режнм 06ecne4HBaeT то, 4ТО 60JlЬШНН- ство команд ВЫnОЛНlOтс за однн тактовый цикn. nерекрытие нзвле4ени команд из nамти и выnолненн происходит TOJlbKO в снстемах, которые HMelOT раздельнуlO na- MTb nporpaMM н данных, нсnользу rарвардскуlO apxHTeкrypy. Такне MHKponpou.ecco ры, как Pentium от Intel сраКТН4ескн ВНуТренне HCnOJlb3YlOT эry архнтектуру 4ерез кэш данных и кэш nporpaMM, которые nрименIOТС дл BHyTpeHHe реализаu.ии KOHBeep Horo ре>кима и rарвардско архитекryры. Память пporpaMM. naMTb nporpaMM нмеет разрдность, paBHYIO 16 6итов, при зтом Ka>K,lJ,a 4eKa naMTH в 60Jlьшннстве CJlY4aeB содержнт одну nОСЛОВНУIO команду. 06ратите внимание, 4ТО некоторые команды Tpe6YlOT 32 6нта naMTH нлн две nОСJlедо вательные 4eKH naMTH, однако 60JlЬШННСТВО команд BJlIOTC 16-6итными. naMTb nporpaMM делится на ,lJ,ве 4астн: одна 4аС1Ъ  это BHyTpHcxeMHa naMTb nporpaMM, а друrа  это внешн naMTb nporpaMM, которая устанаВJlиваетс в СЛУ4ае не06ходи мости. 06ъем BHyTpHcxeMHO naMTH H3MeHeTC дл раЗЛИ4НЫХ 4ленов ceMeCTBa PIC 18, находясь в диапазоне от 4К дО 128К. ВНуТрнсхемная naMTb nporpaMM  зто ли60 срлзшnамть, KOTopa может MHoroKpaTHo nepenporpaMMHpoBaTbc в ceMeCTBe 18F, либо однократноnроrраммируема naMTb (Onn) в ceMeCTBe 18С. ФлзшnаМЯ1Ь про rpaMM 06Ы4НО nporpaMMHpyeTc с нсnользованнем внешнеrо nporpaMMaTopa, однако во MHorHx верснях MHKpOKOHTpOJlJlepOB она может 6ыть самоnроrраммируемо. Если она влетс самоnроrраммируемо, то YCTPOCTBO 06Ы4НО нмеет 6лок заrрузки, co держаw,н 06Ы4НО nporpaMMY, Ha3bIBaeMYlO заrРУ34НКОМ nporpaMMbl раскруТКИ, которая не стнрается н не nереnроrраммнруется npH nереnроrраммнровании срлзш-nамяти. БОJlее nодр06но caMonporpaMMHpoBaHHe н заrРУ34НК nporpaMMbI раскрУ1'КИ разбира IOTC в rлаве 10. Однократноnроrраммнруемая naMTb со BCX Т04ек зрени аналоrИ4 но сnnзу, за HCКnlO4eHHeM Toro, 4ТО в ее мнкросхеме нет KBapu.eBoro окошка стнрания, в CHJlY 4ero она не может 6ыть nepenporpaMMHpoBaHa. Она nporpaMMHpyeTc только однн раз. Ta6Jl. 2.1 nepe4HCJleT все нмеlOw,неся в HacTow,ee BpeM YCTpOCTBa ceMe- ства PIC 18 с указаннем 06ъема BHyTpeHHe naMTH, нмеlOw,еrося в Ka>K,lJ,o. 
44 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 о Период Период Период Период : Период тактовой тактовой тактовой тактовой : тактовой частоты 1 частоты 2 частоты 3 частоты 4 : частоты 5 I , О I , Команда Выполнение  I I О О Команда Выполнение о о о , Команда Выполнение Команда Выполнение Рис. 2.3. Конвеерная 06ра60тка коман,lJ, н НХ BbInOJlHeHHe в МНКрОКОНТрОJlлере. Таблица 2.1. 06ьем naMTH npOrpaMM в YCTPOCTBax ceMeCTBa PIC1,8. КОД издеJlИSl 1220, 1230,2220,4220 1320,1330,2320, 2331,4320,4331,6310,6390,8310,8390 2439,4439 242,248,442,2410,2420,2431,2480,4410,4420,4431,,4480, 6410,6490,8410,8490 2455,2539,4455,4539 252,258,452,458,658,858,2510,2520,2550,2580,4510,4520, 4550,6520,65J10,8520,85J10 2515, 2525, 2585, 4515, 4525, 4585, 6525,6527,6585,65J15,8525, 8527,8585,85J15 2610,2620,2680,4610,4620,4680,66J10, 6620,6621,6622,6680, 8620, 8621, 8622, 8680, 86J .10 6627,66J15,8627,86J15 6720, 6722, 67J10, 8720,8722, 87J10 Объем паиSlти в байтах 4К 8К 12К 16К 24К 32К 48К 64К 96К 128К Примечание: Всем UMpOB 0603Ha4eHMRM rrpeAwecTByeT rrpeMKC PIC18F млм PIC18C; YCTpOCTBa PIC18F MMeT nзw-rrаМRТЬ, а yCTpOCTBa PIC18C MMe OЦHO- кратно rrроrрамммруему rraMRTb (ООО). YCTpOCTBa PIC18C601 м PIC18C801 не MMeT BHYTpeHHe rraMRTM rrporpaMM. DaMRTb nроrрамм aApecyeTcR 4ерез 21-раЗРRАНЫ nроrраммны аАрес, COAepa CR в perMCTpe, который Ha3BaeTCR счетчиком команд. В rnaBe 1 B Y3HanM, 4ТО аАрес rraMRTM в 21 раЗрRА (221) MoeT аАресовать 2М rraMRTM. В ceMeCTBe PIC18 rrpOCTpaHCTBO rraMRTM rrроrрамм Ha4MHaeTCR С аАреса ОхОООООО м rrpOCTMpaeTCR АО OxIFFFFF. DpeAnonoMM,. 4ТО AnR McrrOnb30BaHMR в смстеме вы6рано YCTPOCTBO PIC18F4520. ДaHH MMKpOKOHTponnep ммеет 32К rraMRTM rrроrрамм, rrpM зтом rrep Be 32К rraMRTM rrporpaMM, KOTope HyMepyTcR в 6aTax, Ha4MHaTCR С аАреса ОхОООООО м rrpOCTMpaTCR АО адреса Ox007FFF. Мз rnaBbl 1 вы AOnH rrOMHMTb, 4ТО 4К rraMRTM Tpe6YT Ох1000 R4eeK, cneAOBaTenbHO 06ъем rraMRTM 32К тре6ует 32К  4К  8 MnM Ох8000 R4eeK rraMRTM. 
rnaBa 2. Архнтектура семейства PIC 18 н разрабтка nporpaMM 45 OxlFFFFF внешНSlSl naMSlTb проrpамм внутрисхемная память проrpамм OxOOOO18 вектор низкоrrриоритетноrо п ывания вектор высокоприоритетноro п е ывания вектор сброса ОхООООО8 ОхОООООО Рис. 2.4. Карта nамятн nporpaMM ceMeCTBa PIC18. Рнсунок 2.4 HJlJlIOCTpHpyeT структуру памяти nporpaMM. Некоторым нз 4eeK naM тн nOCTaBJleHbI в соответствне важные AfI снстемы зада4Н. OДHO нз такнх выделенных 4eeK nамятн явлетс Я4ека по адресу ОхОООООО, в KOTOpO расположен адрес Beктo p сброса. Адрес вектора с6роса - это тот адрес, по которому nporpaMMa на4ннает BЫ ПОJlНТЬС после .с6роса. nOCKOJlbКY HMeeTC TOJlbKO 8 6aTOB nамятн Me>K,lJ,y это 4e- KO н адресом вектора BbIcoKonpHopHTeTHoro npepbIBaHH, раСnОJlоженном в 4eKe naMTH по адресу ОхООООО8, то 06Ы4НО BbInOJlHeTC переход на друrylO 4eKY nамти AfI nрОДОJlженн BbInOJlHeHH nporpaMMbI от адреса вектора с6роса. 3тот переход 06Ы4НО BbInOJlHeTC OTpa60TKO в nporpaMMe команды бе3УСJlовноrо перехода GOTO. Адреса векторов npepbIBaHH, которые 6удуТ 06СУ>K,lJ,аться в rJlaBe 6, совместно с npe- pЫBaHHMH, YKa3bIBalOT на ТО4КН входа в nамятн nporpaMM nроцедур 06служнвани HH3 KO н BbIcoKonpHopHTeTHbIx npepbIBaHH. Остальна 4асть naMTH nporpaMM доступна для xpaHeHH nporpaMM, а так>ке стаТН4ескнх ,lJ,анных. СтаТН4ескнмн даннымн BJlIOTC pa3JlH4HbIe та6JlНЦЫ н константы, зна4енне которых не нзменяетс,- Они досryпны ДЛ НСnОJlьзованн nporpaMMaMH. Память данных. naMTb данных - это 06Ы4НО СОЗУ нли СО ЗУ И 3СnnЗУ. Память дан- ных (KOTOPYIO нноrда Ha3bIBalOT реrистровым файлом) nредоставлет место Aflя хране- ння ,lJ,анных, которые H3MeHIOTc по мере BbInOJlHeHH nрнложенн н cTHpalOTc (за НСКnlOченнем 3СnnЗУ) nOCJle OTKJlI04eHH ЭJlектроnнтанн снстемы. AocTYn к памяти данных СОЗУ ocyw,ecTBJleTC 4ерез HCnOJlb30BaHHe 12разрдных адресов, n03ToMY MaKCHManbHЫ 06ъем досrynно naMTH равен 3968 6aT с адресами от ОхООО до OxF7F. 
46 . TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Память данных СО ЗУ так>ке содержит адреса, которые исnользуютс ДЛ nроrрамми ровани сnеu.нальных CPYHKu.H микроконтроллера. Эти специальные функциональные ре/истры (СФР) расположены в диапазоне адресов nамти от OxF80 до OxFFF или за нимаlOТ верхние 128 6aT пространства nамти данных. Некоторые исполнения микро- контроллеров ИСnОЛЬЗУIOТ доnолнительнуlO naMTb данных, nредназна4енную для раз мещени дополнительных СФР. Аруrие 4еки памяти nporpaMM называются общими функциональными ре/истра ми (ОФР), они pa3Mew,eHbI в диаnаЗ0не адресов от ОхООО до OxF7F. ОФР иноrда также называlOТ Я4еками реrистровоrо срайла. Если МИКРОКОНТРОЛJlер PIC содержнт зсnпзу, то память данных ЭСППЗУ aдpecy ется 4ерез сnеu.иальные функцнонаJlьные реrистры в отдельном адресном npocTpaHcT ве, выделенном 3СnnЗУ. 06ъем 3СnnЗУ оnределется кодом исполнения PIC и имеет диапазон от О 6aT до максимanьноrо КОJlИ4ества, paBHoro 1024 6aT. Соrласно Microchip, 4eKa 3СnnЗУ может nерезаnисыватьс вплоть до oAHoro миллиона раз. Я4екн 3СnnЗУ ДОJlЖНЫ HCnOJlb30BaTbc AfI хранени инсрормации, которая не изме HeTC 04ень 4асто. Казалось 6ы, 4ТО возможность перезаписи миллион раз ячеек ЭСnnЗУ nозволет ИСnОJlЬЗ0вать ero ДЛ ЛlO6ых u.еле, однако не следует забывать, что микроконтроллер может функu.ионировать на 4астоте nopAKa 40 Mru., при зтом за He сколько секунд можно nерезаnисать Я4еку зсnnзу MHoro миллионов раз. В табли u.e 2.2 nepe4HCJleHbI pa3JlH4HbIe YCTpOCTBa ceMeCTBa PIC18 с указанием объема ОЗУ ИJlН 3СnnЗУ, ,lJ,OcrynHoro ДЛ хранения данных в Ka>K,lJ,oM из YCTpOCTBe. Память стека. В AOnOJlHeHHe к naMTH nporpaMM, nамти данных СОЗУ, а так>ке паМ>I т'и ЭСnnЗУ, имеется так>ке не60Jlьша 06ъемом 31 х 21 6ит память СОЗУ, которая назьша eTC памятью стека. naMTb стека, как это 6удет 06CY>K,lJ,aTbC в nоследуlOЩИХ nодраз делах, содержит только адреса возврата из срункu.ий. Разрядность стека равна 21 би там, nOCKOJlbКY он раСС4итан на хранение адресов nамти nporpaMM. Поскольку макси мальны 06ъем nамти nporpaMM равен 2М 6aT, то для доступа к He ну>кно ИСnОJII:>30 вать 21 битны адрес, Т.е. стек должен иметь разрдность в 21 бит. Почему 011 имеет rлу6ину в 31 Я4еку? просто Microchip решнла, 4ТО стек iJlубино в 31 AocTaTOtlHO велик дл обесnе4ения ра60ТЫ большинства nРИJlожени. Е,о,инственный способ ИСПОЛЬ30 вать Я4еку стека заКnlO4аетс в вызове функцин. ЕСJlИ срункu.ия вызывает ApyrylO cpYHK u.ИIO, то две 4еки стека 6удуТ ИСnОJlЬЗ0ваться дл хранени адресов возврата. Для ИСnОJlЬЗ0вання всех 4eeK стека нужно 4тобы rJlу6ина MHoroKpaTHbIx вызовов срункци ,lJ,OCTHrJla 31, 4ТО 6ывает KpaHe редко, eCJlH Bo06w,e 6ывает. Фактически единствеllНЫ CJlY4a nереnОJlнени стека может иметь место TorAa, KorAa в nporpaMMe nрисyrствует оши6ка, nриводяw,а к постоянному ВЫЗ0ВУ Функu.и, возврат из которых не отрабаты BaeTC. Рекурси влется единственно возмо>кно nРИ4ИНО 3Toro типа ошибки. BCJleACTBHe 3Toro npH разра60тке рекурсивных nporpaMM зтому вопросу не06ходимо уделть внимание. Код изделия Таблица 2.2. Память данных СОЗУ и ЭСППЗУ в ра3ЛИ4НЫХ исnолнеНLI1ЯХ YCTPOCTB ceMeCTBa 18F Объем ОЗУ в Объем ЭСППЗУ в байтах байтах 1230,1330 1320 2220,2320,4220,4320 2439,4439 2410,4410,6310,6390, 6410,6490, 8310, 8390,8410,8490 242,248,442,448,2331,2420, 2431, 2480, 4331,4420,4431,4480 256 256 512 640 768 128 256 256 256 О 768 256 
lnaBa 2. Архнтектура семейства PIC 18 н разработка проrpамм 47 Код изделия Объем ОЗУ в Объем ЭСППЗУ в байтах байтах 2539,4539 2510,4510 252, 258, 452, 458, 601, 658,801, 858,2520, 2580,4520, 4580 65J10,65J15,66J10,85J10,85J15,86J10 2455, 2550,4455,4550 6520,8520 2585,2680,4585,4680,6585,6680,8585,8680 6525,6620,6621,6720,8525,8620, 8621, 8720 2515, 2610,4515,4610,66J15,67J10,86J15, 87J10 2575,2620,4525,4620,6527,6622,6627, 6722, 8527, 8622,8627,8722 1408 1536 1536 256 О 256 2048 2048 2048 3328 3840 3968 3968 о 256 1024 1024 1024 О 1024 Примечание: Нм ОАНО М3 McrrOnHeHM 18С не COAepMT ЭСDDЗУ. Указанное KOnM4ecTBO R4eeK не BKnqaeT пространство сфр Порты BBoдaBЫBoдa. Порты ввода-вывода HCnOJlb3YIOTC AfI 06ecne4eHH взаимо ,lJ,eCTBH мнкроnроцессора с BHeWHHM мнром. Ka>KДЫ порт ввода-вывода 06Ы4НО нмеет разрдность в 8 6нтов Н может 6ыть заnроrраммнрован как на ввод, так н на BЫ вод ннформацнн. KOJlH4eCTBo 6нтов и портов BBO,lJ,aBЫBoдa КОJlе6лется AflЯ ра3ЛИ4НЫХ YC1POCTB ceMeCTBa PIC18 н в o6w,eM СЛУ4ае оnределетс КОЛИ4еством выводов инте rpanbHo схемы. Ta6JlHu.a 2.3 nере4нслет КОЛН4ество выводов BBoдaBЫBoдa, nрисyr- CTBYIOW,HX в ра3JlИ4НЫХ YCTpOCTBax ceMeCTBa PIC18. В дaHHO та6лнu.е указано коли 4ество 6нтов портов, однако npH nporpaMMHpoBaHHH МНКРОКОНТРОJlлера порты орrани- 3YIOTC как порт А AflЯ первых восьмн 6нтов, порт В AfI СJlедуlOЩИХ восьмн 6итов н так ,lJ,anее. HanpHMep, 18F1320 нмеет TOJlbKO порты А н В. nроrраммнрование портов ввода- вывода BbInOJlHeTC 4ерез сnецнanьные функцнонanьные реrистры, pa3Mew,eHHbIe на вершнне пространства nамятн данных по адресам от ОхР80 до OxFFF. Структура BBoдaBЫBO,lJ,a AfI pa3JlH4HbIX YCTPOCTB рассматриваемоrо ceMeCTBa КОJlе6летс в WHpOKHX npeAeJlax, однако все YCTpOCTBa HMelOT по KpaHe мере порт А н порт В. В первых HeCKOJlbKHX rJlaBaX это KHHrH npHBeAeHbI при меры nporpaMM, ис- nOJlb3YIOW,HX порт А н В. npH npoeeAeHHH эксnернментов с 6аЗ0ВЫМН cpYHKЦHMH ввода- вывода зтнх двух портов peKOMeHдyeTC HCnOJlb30BaTb peanbHYIO naHeJlb разра60Т4ика. То, какую снстему разра60ТКН nporpaMM вы6рать npH nроведенни экспериментов, дол жен решнть npenoAaBaTeJlb. Может 6ыть ИСnОЛЬЗ0вана Л106а нз снстем разра60ТКИ, npeAflaraeMbIX Microchip нлн Л1060 HHO срирмо. В первых rлавах 3TO кннrи npeAno Jlаrается, 4ТО НСnОJlьзуется порт BBO,lJ,aBЫBoдa, оснаw,енный, по KpaHe мере, 4етырь- мя светоднодамн н HeCKOJlbKHMH nереKJl104атеJlЯМН. В nОСJlедуlOЩИХ rлавах 6YAyr ис CJleAOBaTbC AOnOJlHHTeJlbHbIe MOAYJlH BBoдaBЫBoдa как в составе PIC, так и в составе нных yCTpOCTB. Таблица 2.3. nOAКnlO4eHHe портов BBoдaBЫBoдa в pa3JlH4HbIX YCTpOCTBax ceMeCTBa PIC18 Код устройства 1220,1230,1320,1330 2439,2539 258,2331,2431 242,248,252,258,1320,2220 601 С 4439,4539 442, 448, 452, 458, 4220, 4320,4331,4420,4431,4455,4550 Биты портов BBoдaBывoдa 16 21 22 23 31 32 34 
48 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 Код устройства Биты портов вводавьшода 4220,4320,4410,4480,4510,4515,4520,4525,4580,4585,4 36 610,4620, 4680 801 42 6390,6490, 65J10, 65J15, 66J10, 66J15, 67J10 50 658,6520,6620,6720 52 6525,6585,6621,6680 53 6310,6410,6527,6622,6627,6722 54 8390,8490,85J10,86J10,86J15 66 858,8520,8620,8720 68 8525,8585,8621,8680 69 8310,8410,8527,85J15,8622,8627,87J10 70 8722 72 Таблица 2.4. TaMepы в YCTpOCTBax ceMeCTBa PIC18 Код изделия 8БИТНЪlе 16Битныe таймеры 1 2 3 3 С242, С252, С442, С452 1230,1330 2439,2539,4439,4539 242F, 248,252F, 258,448, 452F, 458, 601, 658, 801,858,1220, 1320,2220,2320,2331,2410,2420,2431,2455,2480,2510, 2515,2520,2525,2550,2580,2610,2620,2680,4220,4320, 4331,4410,4420,4431,4455,4480,4510,4515,4520,4525, 4550,4580,4585,4610,4620,4680,6310, 6390, 6410, 6490, 8310,8390,8410,8490 6520,6525,6527,6585, 65J10, 65J15, 662'0,6621,6622,6627, 2 6680, 66J10, 66J15, 6720, 6722,67J10, 8520, 8525,8527,8585, 85J10,85J15, 8620, 8621, 8622, 8627, 8680, 86J10, 86J15, 8720, 8722,87J10 таймеры 3 О О 1 3 V1СnОЛЬЗ0ванне порта AflЯ npoCToro BBoдaBЫBoдa явлется весьма леrко зада- 4e. Реrистр TRISA оnредеJlяет HanpaBJleHHe (ввод илн вывод) AfI Ka)l(,lJ,Oro WTbIpbKa порта А. (TRISA nредназна4ен AflЯ порта А, TRISB - AflЯ порта В, н так далее). Реrистр TRIS порта - это perHCTp наnраВJlення nepeMew,eHH данных порта. После Toro как мик pOKOHTpOJlJlep с6расывается, perHCTpbI TRIS YCTaHaBJlHBaIOTC на onepau.HIO вывода. 3то заw,нw,ает схемы, nОДКnlO4енные к выводам порта ввода-вывода. ЛоrИ4ески ноль 6ита perHCTpa TRISA YCTaHaBJlHBaeT соответствуlOw,и 6нт порта А на вывод ннформа цин, а JlOrH4eCKa еднннца в 6нте yCTaHaBJlHBaeT cooTBeTCTBYIOW,H 6нт порта А на ввод данных. HanpHMep, AfI nporpaMMHpoBaHH 6нтов порта А от О до 3 (этн 6нты 0603Ha4a IOTC от ААО дО АА3) в ка4естве выходных 6нтов, а 6нтов порта А от 4 до 7 (зтн 6нты 060зна4аlOТСЯ от АА4 дО АА7) в ка4естве входных 6итов, в perHCTp TRISA не06ходимо заrрузить OxFO. Как только направление nеремеw,ення данных ДЛ 6итов порта будет запроrрам мировано, досryn к зтому nopry можно осуw,ествлть по ero LI1мени. Реrистр PORTA ис nОJlьзуетс AfI орrаннзацнн ннформаu.ионноrо 06мена с портом А. Например, если в реrистр РОАТА заnнсано значенне Ох28 wтырьки PORTA (если они запроrраммированы как выходные) 6у,lJ,уТ npHHHMaTb данные. АналоrН4НЫМ 06раЗ0М, дл С4итывания данных СО WTbIPbKOB порта А ВЫnОJlняетс С4нтывание реrистра РОАТА. Также явлется воз можным nОJlУ4ИТЬ досryn к одному WTbIPbKY порта А, как это описано в nоследуlOw,их nодразделах, HCnOJlb3Y днректнву PORTAbits языка С. 
rnaBa 2. Архнтектура семейства PIC18 н разработка проrpамм 49 Таймеры. TaMepы nредстаВJlIOТ c060 nporpaMMHpyeMbIe МОДУJlН С4еТ4НКОВ. TaMep мо>кет nОДС4итывать с06ытня н импульсы TaKTOBO 4астоты, он так>ке может ВЫПОЛНЯТI.> целы ряд сервисных функu.и AflЯ nporpaMM. TaMepы 4асто nporpaMMHpYIOTC на OT ра60ТКУ TaMayTa по npOXO>K,lJ,eHHH оnредеJlенноrо KOJlH4eCTBa тактовых импульсов. РаЗЛИ4ные YCTpOCTBa ceMeCTBa PIC HMelOT от двух до nTH TaMepOB. В та6л. 2.4 nepe 4ислены pa3JlH4HbIe YCTpOCTBa ceMeCTBa PIC 18 С указаннем КОJlИ4ества нмеlOw,ихс в НИХ таймеров. TaMepы HCnOJlb3YIOTC в мнкроnроцессорах AflЯ rенерацнн ра3ЛИ4НЫХ с06ыти,  от прерыванн с nеРНОДИ4еско 4aCTOTO до реаJlизаu.нн С4еТ4НКОВ реальноrо времени при определении зна4енн 4астоты HJlH С4ете c06ЫTH. TaMepы также ИСnОЛЬЗУlOтся для rенерировани сиrнаJlОВ AfI друrих YCTPOCTB в системе. БОJlее nодро6но таймеры будут рассматриваться nозже при 06су>кдении BHyrpeHHero ввода-вывода и ero исполь З0вани в раЗЛИ41-1ЫХ nрименених. Друrие внутренние устройства BBoдaBЫBoдa. Pa3JlH4HbIe модели YCTPOCTB семей ства PIC 18 так>ке содержат ДРуrне YCTpOCTBa BBoдaBЫBoдa, которые nроrраммируlOТ ся через сnецнаJlьные функцнонanьные реrистры (СФР). 3ти друrие YCTpOCTBa MorYT BКnlO4aTb анanоrо-цнфровые npe06pa30BaTeJlH (АЦn), wнротноимпульсные (ШV1М) модуляторы, а так>ке nОСJlедоватеJlьные коммуннкацнонные порты pдa ДРуrнх типов. nOCKOJlbKY нам ew,e nредстонт рассмотрение nporpaMMHpoBaHH PIC 18, зти ВНуТренние YCTpOCTBa BBoдaBЫBoдa пока намн ew,e не рассматрнвanись, однако они будyr nод р06но рассмотрены С ИЛJllOстрацне на примерах nозже в это KHHre. В 06w,eM CJlY4ae порты BBoдaBЫBoдa nporpaMMHpYIOTC 4ерез реrистр TRIS. Pe rистр TRIS оnределет HanpaBJleHHe штырьков ввода-ВЫВО,lJ,а (ввод НJlИ вывод) ДЛ дан- Horo порта. Еслн 6нт perHCTpa TRIS YCTaHOBJleH в состоние JlOrH4eCKoro HYJl, то COOT ветствуlOw,и 6нт порта nporpaMMHpyeTc как BЫXOДHO штырек. Если 6ит реrистра TRIS установлен в COCTOHHe JlOrH4eCKo единнu.ы, то соответствуlOw,и 6ит порта nporpaM мируетс как BXOДHO штырек. Ka)l(,lJ,bI порт нмеет CBO реrистр TRIS. Они 060значаlOТ- ся как TRISA AflЯ порта А, TRISB AfI порта В, и так даJlее. Аанные С4итываlOТС нли за- nисываlOТСЯ 4ерез perHCTp РОАТ. npH зтом РОАТА НСnОJlьзуетс AflЯ порта А, РОАТВ исnользуетс AfI порта В н так даJlее. Для вы60ра aHanoroBoro нли цисрровоrо режима ра60ТЫ WTbIpbKa AflЯ аналоrо-u.ифровоrо npe06pa30BaTeJl нсnользуется реrистр ADCON 1, сnецнфнцнруlOw,н, какне WTblPbKH порта А н порта В 6удуТ цнфровыми или аналоrовымн. ПО YMOJl4aHHIO YCTaHaBJlHBaeTC aHanoroBbI режнм работы. 2.2. Модель проrраммирования Перед nроrраммнрованием МИКрОКОНТрОJlJlера не06ходимо 0знакомиться с Ha 60РОМ BHyrpeHHHx фаJlОВЫХ perHcTpoB, досrynных AfI nроrраммиста. Этот набор pe rHCTpoB ynpaBJleT MHKpOKOHTpOJlJlepoM. МНКРОКОНТРОJlлер  это 86HTHoe YCTPOCTBO, поэтому MHorHe perHCTpbl имеlOТ разрдность, paBHYIO 8 JlH60 KpaTHYIO 8. Рис. 2.5 дe монстрнрует 060бw,еннуlO модеJlЬ nроrраммнровання MHKpOKOHTpOJlJlepOB ceMeCTBa PIC18. На нем нз06ражены perHCTpbl, HaH60Jlee 4асто НСnОJlьзуемые npH nроrраммиро ванин 60Jlьшннства команд. На нем не nрнведены все сnецнаJlьные функu.иональные реrистры, которые ocyw,eCTBJlIOT ynpaBJleHHe yCTpOCTBaMH BBoдaBЫBoдa н срункu.и- ми ЦN. 3тн OCTHaJlbHble сnецнаJlьные функu.нонanьные perHCTpbl 6удуТ 06CY>K,lJ,aTbC, Hapдy С YCTpOCTBaMH BBoдaBЫBoдa nозднее в nОСJlедуlOw,нх rJlaBax. 
50 ITpHMcHeHHe MHKpOKOHTpOnnepOB PIC 18 Реrистровый файл Область реrистровоrо файла или память данных, размеw,енная во внутрисхем ном СО зу, представляет собо на60Р 86L11THbIX реrистров 06w,ero назна4ения (РОН), ИСllOльзуемых для хранени динаМИ4еских данных. Как у>ке отмечал ось ранее, различ- ные модели YCTPOCTB ceMeCTBa PIC18 содер>кат раЗЛН4НЫ объем nамти данных, при этом все модели содер>кат, по KpaHe мере, адреса 06w,ero реrистровоrо срала от ОхООО до Ox07F, nлlOС сnеu.иальные срункu.иональные реrистры от OxF80 OxFPP илн 256 байт созу. OxF7F  OxF7E OxF7D   ОхОО4 ОхОО3 ОхОО2 ОхОО! ОхООО реrистровый файл (память данных) OxFEO I OxFE8 I ОХРР4 1 Оxf'f'З ОхРЕА I OxFE9 ОХРЕ2 1 ОхРЕ1 OXFDA I OxFD9 OxFD8 1 реrистр выбора банка памяти аккумулятор старшая часть произведения младшая часть rrpоизвеДения старшая часть реrистра выбора файла младшая часть реrистра выбора файла старшая часть реrистра выбора файла младшая часть реrистра выбора файла основные специальные функциональные реrистры старшая часть реrистра выбора файла младшая часть реrистра выбора файла I реrистр состояния счетчик команд \.. у 8 битов ) \ Примечание Примечание: счетчик команд является внутренним физическим 21-битным реrистром, который не может адресоваться. Рис. 2.5. Обобw,енная модель nроrpаммировани микроконтроллеров ceMeCTBa PIC18 
rnaBa 2. Архнтектура семейства PIC 18 н разработка проrpамм 51 Доступ к реrистровому срайлу осуw,ествлетс 4ерез 12разрядный адрес, 4 старшие разряды KOToporo содержат а,о,рес 6анка памти. Ka)l(,lJ,bI банк памяти данных содержит 256 байтов памти данных. Банк данных О (00002) содержит реrистры от ОхООО до OxOFF, 6анк данных 1 (0001;) СО,lJ,ержит реrистры от Ох100 до OxlFF и Т.д. Во мноrих СЛУ4ах при проrраммировании используlOТС а,о,реса от ОхООО до Ox07F 6анка AaHllbIX О и адреса от OxF80 .0.0 OxPFF 6анка ,lJ,анных 15. 3ти 06ласти памти вместе Ha 3bIBalOTc банком доступа. Банк ,lJ,оступа a,o,pecyeTC 6ез использовани реrистра 6анка данных, n03ToMY доступ к нему из nporpaMMbI осуw,ествлетс леr4е и 60лее зффектив- но. (Названное разделение 6анка ,lJ,оступа может изментьс в различных УСТРОЙСТl.зах семейства PIC18. Так, например, в PIC 18F2480, используlOТС адреса от ОхОО до Ox5F И3 банка данных О и адреса от OxF60 до OxFFP Д1l специальных функциональных реrи стров.) Банк доступа aдpecyeTC с использованием oAHoro 8разрдноrо а,о,реса. Д1I доступа к 4ейкам памти в ОЗУ данных вне 6анка ,lJ,оступа используетс ком6инация 8разрдноrо а,о,реса и 4-раЗР,lJ,ноrо реrистра вы60ра 6анка (РВБ). Например, Д1l адресации 4еки Ох432, а,lJ,рес 6анка 6У,lJ,ет равен 4, а 8-разрдный а,о,рес памяти 6удет равен Ох32. Бит коман,lJ,Ы, KOTOPЫ называетс абитом, вы6ирает 6анк доступа (KorAa а = О) или же 6анк, указываемы реrистром вы60ра 6анка (KorAa а = 1). Как, например, осуществить ,lJ,ocтyn к 4eKe Ох092? Она нахо,lJ,ИТС вне 6анка ,lJ,оступа, позтому единст- BeHHЫ cnoc06 а,lJ,ресовать 4eкy Ох092 заКЛlO4аетс в а,о,ресации ее при реrистре BЫ 60ра 6анка, установленном в О и 8-разр,lJ,НОМ а,о,ресе Ох92 при а-6ите, установленном в 1. Рисунок 2.6 ,lJ,емонстрирует а,lJ,ресациlO 6анка ,lJ,ocтyna и 6анка ,lJ,анных. Специальные функциональные реrистры Специальные функциональные реrистры (СФР) исnользуlOТС Д1lя выполнени цеnоrо pдa специальных за,lJ,а4 в микроконтроллере. Реrистр вы60ра 6анка влетс одним из 3ТИХ специальных срункu.иональных реrистров, при зтом остальные специаль ные функциональные реrистры осуw,ествлIOТ ,lJ,ocтyn к nамти непрмо, coxpaH про изве,lJ,ение после умножени, указыва состоние ВЫХО,lJ,а ко ман,lJ,Ы, аккумулиру ре- зультаты арисрмеТИ4еских и JlоrИ4еских оnераци и a,lJ,pecy 4ейку памяти в проrрам- ме. Все специальные срункциональные размеw,аIOТС на верwине памти данных в 6aH ке доступа. Все специальные срункu.иональные реrистры имеlOТ имена и адреса, - и то и Apyroe может 6ыть использовано Д1l ,lJ,ocтyna к ним. Аккумулятор (WREG). Аккумулятор или, как он 4асто называетс, рабочий реrистр (реrистр W или WREG) nре,lJ,ставлет с060Й 8-разрдный реrистр, доступ к которому осуw,ествлIOТ мноrие коман,lJ,Ы. BepOTHee Bcero, 4ТО 3ТОТ реrистр Ha3ЫBaeTC аккуму- лтором всле,lJ,ствие Toro, 4ТО он пре,lJ,стаВJlет c060 место, в котором аккумулируlOТС результаты мноrих коман,lJ,. Больwинство ЦN СО,lJ,ер>кат аккумултор в ка4естве rлашюrо pa604ero реrистра. В ceMeCTBe PIC18 ра604И реrистр (WREG) размеw,ен в 06ласти спеu.иаJlЬНЫХ срункu.ионаJlЬНЫХ реrистров по а,о,ресу OxFE8. XOT 3ТОМУ реrистру и при свое н а,lJ,рес, мноrие коман,lJ,Ы осуw,ествлIOТ ,lJ,ocтyn к нему 6ез указани а,lJ,реса  по имени или HeBHO в рамках ВЫnОJlнени коман.цы. 3та HeBHa срорма а,о,ресации и есть то, П04ему WREG называетс ра604ИМ реrистром ИJlИ aKКYMYJlTOpOM. Литеральный или непосре,lJ,ственны а,lJ,рес коман,lJ, адресует WREG как 4асть коман,lJ,Ы 6ез не06ходимости специсрицировани ero а,lJ,реса. Мноrие ,lJ,руrие команды так>ке исnользуlOТ реrистр W. 
52 Прнмененне MHKpOKOHTpOnnepOB PIC18 (а) есnи а-бит == О (банк доступа) (ь) есnи абит == 1 (выбор банка) OxFFF ОхР80 Ox07F 8р азрядный а дрес Oxl2 12разрядный адрес perHcTp выбора банка 8разрядный адрес Рис. 2.6. Вы60Р 6анка реrистровоrо срайла Ox012 ОхООО OxFFF ОхЗ2F ОхООО 
rnaBa 2. Архнтектура семейства PIC18 н разработка проrpамм 53 Реrистр выбора банка (BSR). Реrистр вы60ра 6анка (размерность KOToporo равна 4 6ита) ПЛIOС 86итный а,lJ,рес 06ъединIOТСЯ с целыо срормировани 12разрдноrо aд реса памти ,lJ,анных, KOr,lJ,a а-6ит команды нахо,lJ,ИТС в состонии лоrической еДИIIИЦЫ, как 3ТО ИJlЛlOстрируетс на рис. 2.6. 3то nO.3BOJleT осуw,ествлть ,lJ,оступ к ЛlO60МУ реrи- стру в ЛlO60М 6анке nамти ,lJ,анных. ЕСJlИ а-6ит коман,lJ,Ы нахо,lJ,ИТС в СОСТОЯIIИИ лоrиче- cKoro нул, то ,lJ,ocтyn 6У,lJ,ет оrраНИ4ен 6анком ,lJ,ocтyna, который 06Ы41-10 составлется из 4eeK с а,lJ,ресами от ОхООО,lJ,О Ox07F 4eeK от OxF80,lJ,O OxPPF. 8разрядные адреса от ОхОО,lJ,О Ox7F вы6ираlOТ 4еки nамти ,lJ,анных от ОхООО,lJ,О Ox07F, 8разрдные aдpe са от Ох80 .0.0 OxFF вы6ираlOТ 4еки памтн ,lJ,анных от OxF80 .0.0 OxFFF 6анка доступа. 3то описание применимо к стаН,lJ,артному на60РУ ко ман,lJ,. (Если вы6ран расwиренный на60Р команд, 6аllКИ и а6ит не срункu.ИОНИРУIOТ описанным 06разом. Подраздел rла вы 1 О детально описывает расwиренный на60Р ко ман,lJ,. Ао 3Toro момента в тексте дан- ной книrи преДПОllаrаетс, 4ТО ИСПОJlьзуетс CTaHдapTHЫ на60Р команд.) Смотрите рис. 2.7 для описани 6итовой структуры n06атно-ориентированных команд и разме- w,ени а6ита. Также 06ратите внимание на то, 4ТО ,lJ,руrой 6нт, называемый d-6итом или 6итом а,lJ,ресата, вы6ирает, влетс JlИ а,lJ,ресатом коман,lJ,Ы 8разрдный аАрес (KOr,lJ,a d = 1) или реrистр WREG (KOr,lJ,a d = О). 15 10 9 8 7 о код операции 8разрядный адрес памяти данных а-бит а=О  банк доступа а= 1 - использование реrистра выбора банка d-бит d= 1 - адрес памяти данных Рис. 2.7. АВОИ4на 6итова структура коман,lJ,Ы 6aTOBO операции, ИЛЛIOСТРИРУIOw,а месторасположение а6ита. Пример 2.1 ИЛJllOстрирует nepBYIO KOPOTKYIO nосле,lJ,оватеiJьность команд на Я3ЫКС Ассем6лера PIC, которые CKJla,D,bIBaIOT 6 и 2 и coxpaHIOT сумму в реrистре данных 6анка ,lJ,ocтyna по а,lJ,ресу ОхООО. Вспомните, 4ТО зта >ке за,lJ,а4а у>ке рассматривалась в rлаве 1. Как 3ТО BbInOJlHeTc? Во-первых, литераJlьна комаН,lJ,а (MOVLW) помеw,ает Ох06 в WREG. КомаН,lJ,а MOV на самом ,lJ,eJle НИ4еrо не nepeMew,aeT. 3тот сракт nРИВО,lJ,ил в за MeWaTeJlbCTBO на4инаlOw,их nроrраммистов на nрот>кенни мноrих лет. КомаН,lJ,а MOV выполнет KOnV1POBAHV1E. MOV копирует 6 в реrистр W. Буква L в комаН,lJ,е указывает на литерал, а 6уква W указывает реrистр WREG. Сле,lJ,овательно, MOVLW копирует лите- ральное значение в реrистр W. Литеральные команды ИСnОЛЬЗУIOТС TorAa, KorAa про- rpaMMe не06ходима константа известноrо зна4ени. BTopa команда вляетс друrой 
54 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 литерально командой. Команда ADDLW д06авляет Ох02 (указываетс в команде) к зна- чению Ох06 во WREG с целыо формнрованн суммы Ох08 в perHcTpe W. (06ратите вни мание на то, 4ТО сумма аккумулируется в аккумулторе нли perHcTpe W). V1, наконец, побайтноориентнрованна команда тove (MOVWF) nepeHocHT результат нз perHcTpa W в реrистр памтн данных ОхООО. Буква F в команде MOVWP 060зна4ает 4ейку perHcTpo- Boro файла. 3то 0зна4ает, 4ТО MOVWF KOnHpyeT содержнмое WREG в чеку реrистро- Boro файла, в данном СЛУ4ае 4ейку с адресом ОхОО. Q6paTHTe вниманне на то, что по- сле команды MOVWF указываlOТС два 4нсла. Первое  зто 4ейка perHcTpoBoro срала, а BTopa  а-бит (в данном npHMepe  О, в снлу 4e'ro aдpecyeTC 6анк доступа). В качест- ве альтернативы, может исnользоватьс кnючевое слово ACCESS (пншетс заrлавными буквами) вместо О ДЛ BToporo параметра, как, HanpHMep: MOVWF ОхОО, ACCESS. 3та запись ОТ4етлнво 60лее 4нта6ельна, однако тре6ует 60nьшеrо 06ъема ввода с клавиа туры, в силу 4ero мноrие nporpaMMHcTbI не BBOДT слово ACCESS в проrрамму, а просro BBOДT ноль. Пример 2.1 MOVLW ОхОб ADDLW Ох02 MOVWF ОхОО, О или ;nOMeaeT ОхОб в W ;A06aBnReT Ох02 АО W ;KonMpyeT W AnR AocTyna к perMCTpy 6анка ОхОО APyraR BepCMR С MCnOnb30BaHMeM KnqeBOrO CnOBa ACCESS: MOVLW ОхОб nOMeaeT ОхОб в W ADDLW Ох02 A06aBnReT Ох02 АО W MOVWF ОхОО, ACCESS; KOnMpyeT W AnR AocTyna к perMCTpy 6анка ОхОО Код операции  3ТО код, который ннструктнрует мнкроконтроллер выnолннть Ka кую-то операциlO. В прнмере 2.1, лнтеральные данные Ох06 nOMew,aIOTc во WREG KO дОМ оnерацнн MOVLW. Литеральные данные называlOТС операндом. Операнд нсnоnьзуетс в COOTBeT ствии с кодом оnерацнн. Команда нмеет TOnbKO О,lJ,НН код onepau.HH, однако может как не иметь операнда, так н нметь столько операндов, сколько Tpe6yeTC командой. Предположим, 4ТО НУ>КНО выnолннть ту же оnерацню, 4ТО н в npHMepe 2.1, однако вместо помеw,ени результата в perHcTp ,lJ,анных ОхООО, результат должен 6ыть поме щен в реrистр данных Ох200. А,о,рес Ох200 HaXOДHTC в 6анке 2 naMTH данных. Команд- Ha последовательность, nрнведенна в npHMepe 2.2, выnолнет 3ТУ оnерацнlO посред ством LI1СnОnЬЗ0вани perHcTpa вы60ра 6анка (РВБ) ДЛ адресации 6анка командой MOVLB (перемеw,ение лнтерала в РВБ). 06ратнте вннманне, как второй операllД (a бит) команды MOVWP 060зна4ает perHCTp вы60ра 6анка ДЛ команды вместо 6анка доступа. Вследствие Toro, 4ТО команда 06Ы4НО (по УМОЛ4аннIO) nOMew,aeT данные в чеку 6анка данных, 1 в команде MOVWF ОхОО может onycKaTbc. В ка4естве альтерна- тивы 1 при доступе к 6анку данных может 6ыть НСnОJlьзовано КnlO4eBoe слово BANKED. Все три версин nporpaMMbI pewalOT О,lJ,ну н ту же зада4У. Пример 2.2 MOVLW ОхОб ADDLW Ох02 MOVLB 2 MOVWF ОхОО, 1 или MOVLW ОхОб ;nOMeaeT ОхОб в W ;A06aBnReT Ох02 к W ;заrруает BSR 6анком 2 ;KonMpyeT W в perMCTp AaHHX ОхОО ;6анка 2 MnM аАресует Ох200 MCnOnb3YR KnqeBOe CnOBO BANKED: ;nOMeaeT ОхОб в W 
fnaBa 2. Архнтектура семейства PIC18 н разработка проrpамм 55 ADDLW Ох02 ; A06aBnReT Ох02 к W MOVLB 2 ,заrруает BSR 6анком 2 MOVLF ОхОО, BANKED ;KonMpyeT W в perMCTp AaHHX ОхОО ;6анка 2 MnM аАресует Ох200 МЛИ 6ез указаНМR 6анка MOVLW ОхОб ;nOMeaeT ОхОб в W ADDLW Ох02 ; A06aBnReT Ох02 к W MOVLB 2 ;заrруает BSR 6анком 2 MOVWF ОхОО ;KonMpyeT W to perMcTp AaHHX ОхОО ;6анка 2 MnM аАресует Ох200 в npeAbIAyw,eM подраздеnе 6bInH нзложены вводные CBeдeHH о npoCToM BBoдe выводе. nредnоложнм, 4ТО в HaweM расnорженнн HMeeTC снстема разра60ТКLI1, KOTO pa нмеет два светоднода, nOAКnlO4eHHbIe к 6нтам О н 1 порта А. (3то WTbIPbKLI1 ААО и АА 1 .) 3ада4а заКnlO4аетс в том, 4т06ы nOMeCTHTb О в 6нт О Н 1 в 6нт 1 . 3то BbInonHeTC посредством nporpaMMHpoBaHH perHCTpa ADCON1 на u.ифровые WTbIPbKH, в реrистре TRISA устанавлнваlOТС HYnH в младwнх разрдах О н 1, а затем nepeAaeTc Ох02 в ре- rHCTp РОАТА. npHMep 2.3 показывает cooTBeTCTBYIOW,YIO nоследоватеnьность команд. Дл команды MOVWF 6нт 6анка доступа не тре6уется npH нсnоnьзованин поимеНОl3ан Horo сnеu.нальноrо Функu.нональноrо perHCTpa  TaKoro как TRISA нnи РОАТА. V1M ПО именованноrо perHCTpa должно заnнсыватьс заrлавнымн 6уквами. Пример 2.3 MOVLW Ox7F MOVWF ADCON1 MOVLW ОхОО MOVWF TRISA MOVLW Ох02 MOVWF PORTA ;B6MpaeT AnR портов все UMpOBble штрькм ;nOMeaeT ОхОО в perMcTp наnравленмя порта l\ ;AnR B60pa onepaUMM BBOAa ; nOMeaeT Ох02 в порт А Реrистры произведения. Реrистры riроизведения содержат резуш)тат или IlрОИЗl3е денне после выполненн команды умноженн. Дл nРОН3l3едсни ну>кеll специальны perLl1CTp, н60 nронзведение BcerAa нмеет вдвое 60nьше раЗРАОI3, чем операнды. 3то сnраведлнво даже ДЛ деСТН4НОЙ снстемы  HanpLl1Mep, KorAa 4ИСЛО 5 умно>кается на 5. Резуnьтат 25 нмеет вдвое 60льwе разрдов, 4ем 5. Команда MULLW умножает реrистр W на лнтеральное зна4енне. Поскольку зто 86нтный мнкроконтроллер н пронзведение  ВОСЬМLI1разрдное, то результат 6удет нметь 16 разрдов н 6удет сохранен в perHCTpax PRODL н РАОDН. PerHCTp PRODL храннт младwне 8 6нтов результата (L озна4ает "Iow" (младwне)), а perHCTp РАОDН храннт cTapwHe 8 6нтов результата (Н озна4ает "high" (cTapwHe)). YnoMHyTbIe 4нсла BcerAa 6удуТ 6еззнаковымн, потому 4ТО в на60ре команд мнкроконтроллера ОТСуТствует команда YMHO>KeHH 4нсел семейство знаком. npHMep 2.4 показывает то, как 3 на 1 00 дeCTH4Hoe н как nронзведение coxpaH eTC по адресам Ох010 н Ох011. AeCTH4Hыe 4Hcna в nporpaMMax на Ассем6лерс 060 зна4аlOТС тем, 4ТО нм npeAwecTByeT Т04ка. 06ратнте вннманне на то, что ре3УЛL)тат coxpaHeTC с нсnользованнем формата с 06ратным nopAKoM 6айтов, KorAa младшая 4асть nронзве,lJ,енн сохраняетс в perHCTpe данных Ох01 О, а старша 4асть произведе HH  В perHCTpe данных Ох011. Команды MOVFF KOnHpYIOT результат в LleKH с aдpeca мн Ох01 О н Ох011. Команда MOVFF (nеремещенне perHCTpoBoro файла в реrнстроl3ЫЙ файл) допускает KOnHpoBaHHe лю60rо perHCTpa данных в лю60Й perHCTp данных. Ko манда MOVFF не нсnользует раз6L11енне naMTH на 6анкн. nocne выпоnнени дaHHO nporpaMMbI perHCTp данных Ох010 6удет СО,lJ,ержать Ох2С, а perHcTp данных Ох011 будет содержать Ох01. Ох12С равно 30010' Но rAe же а6ит? Команда MOVFF ЯI3Jlется 
56 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 32-6итовой KOMaHДO, KOTopa не нмеет a6HTa. Вместо 3Toro, она нмеет 6нтовое IlpO странство, достаТ04ное ДЛ xpaHeHH как адресансточннка, так н адресапрнемннка в 32 6L11Tax. А,о,рес нмеет 12 разрдов, n03ToMY только 24 6нта нз 32 НСnОЛЬЗУIOТСЯ ДЛ XpalleHLI1 адресов; oCTanbHbIe 6нты НСnОЛЬЗУlOтс ДЛ xpaHeHH 4HcneHHoro кода опера ции команды. Пример 2.4 MOVLW 3 MULLW .100 MOVFF PRODL, ОхО10 MOVFF PRODH, ОхО11 ;noMeaeT 3 в W ,YMHoaeT на 100 AeCRTMqHOe ;coxpaHReT мnaAWY qaCTb npoM3BeAeHMR в ОхО10 ; coxpaHReT cTapwy qaCTb npOM3BeAeHMR в ОхО11 Реrистры выбора файла (FSR). Реrистры выбора файла используются для косвенной адресации или индексирования naMTH данных. Устройства семейства PIC18 содержат трн perHcTpa вы60ра фала (FSRO, FSR1 н FSR2), ка)l(,lJ,ЫЙ нз которых содержнт 12разрдный адрес nамятн данных. д.л нллюстраu.нн Toro, как ра60тают perHcTpbI FSR, смотрнте npHMep 2.5, в котором ВЫnОЛНIOТСЯ те же onepau.HH, 4ТО н в прнмере 2.4. Разннu.а состонт в том, 4ТО В прнмере 2.5 perHCTp FSRO нндекснрует (адресует) perH- стры данных Ох10 н Ох11. Команда LFSR О, Ох10 заrРV>Kает PSRO зна4еннем Ох10. Bc- кнй раз, KorAa perHcTp вы60ра файла адресует naMTb, операнды INOFO, INOF1 HnLl1 INOF2 НСnОЛЬ3УlOтс в nporpaMMe ДЛ сnеu.нФнu.нрованн косвенных адресов О, 1 HnH 2. (INOFO нсnользует FSRO, INDF1 нспользует FSR1 а INDF2 нсnользует FSR2). КnlOчевое CnOBO POSTINCO (nocTHHKpeMeHTHpoBaHHe FSRO) в команде MOVFP д06авлет eДHHH u.y к FSRO nOCJle ero нсnользованн ДЛ адресацни 4ейкн памтн данных. POSTING 1 ,lJ,06авляет 1 к FSR1, а POSТlNC2 д06авлет 1 к FSR2. Пример 2.5 MOVLW 3 MULLW Охб4 LFSR 0,ОхО10 MOVFF PRODL, POSTINCO MOVFF PRODH, INDFO ;noMeaeT 3 в W ;YMHoaeT на 100 ;аАресует RqeKY ОхО10 qерез FSRO ;coxpaHReT мnaAWY qaCTb rrpoM3BeAeHMR, мнкрементмрует FSRO ;coxpaHReT cTapwy qaCTb npoM3BeAeHMR по аАресу ОхОll Реrистр состояния (SR). Реrистр состояния (SR) ннднцнрует COCTOHHe результата onepau.LI1H. Биты perHCTpa COCTOHH 4асто npoBepIOTC в nporpaMMax после выnолне- HH onepau.HH. Рнс. 2.8 НЛЛlOстрнрует содер>кнмое perHcTpa COCTOHH. Только nTb нз восьмн 6нтов ННДНЦНРУlOт COCTOHHe; онн 060зна4а1OТС как N (отрнu.ательность), OV (nереполненне), Z (ноль), ОС (перенос раЗрЯ,lJ,а) н С (перенос). Бнты состоянн npoBe рютс комаН,lJ,амн условноrо ne ре хода , которые HaH60nee 4асто нсnоnьзуютс ДЛЯ формнрованн KOHCTPYKu.H ifthen-else npH nporpaMMHpoBaHHH, а так>ке ApyrHx про rpaMMHbIx KOHCTPYKЦH. Бнты реrистра COCTOHH 06Ы4НО нзменIOТС в YCTpOCTBax PIC только арнфмеТН4ескнмн н лоrН4ескнмн onepau.HMH. . N (отрицательность)  6нт отрнu.ательностн нмеет зна4енне лоrН4еской 1, еслн резуnьтат арнфмеТН4еско нлн лоrН4еско onepau.HH отрнцателен н значенне лоrН4е CKoro HYn, еслн результат nоложнтелен. · O.V (переполнение) - 6нт nереnолненн нмеет зна4енне лоrН4ескоЙ 1, еслн арнфмеТН4еска onepau.H npHBeJla к nереnолненнlO 8раЗр,lJ,ноrо результата семейст во знаком. 
fnaBa 2. Архнтектура семейства PIC18 н разработка проrpамм 57 432 О перенос О == переноса нет 1 == перенос перенос разряа О == переноса нет 1 == перенос ноnь О == нуnя нет 1 == ноnь nерепоnненне О == nерепоnнення нет 1 == переnоnненне езуnьтат от нцатеnьный 0== резуnьтат поnожнтеnьный 1 == резуnьтат отрнцатеnьный Рис. 2.8. PerHcTp COCTOHH · z (ноль)- 6нт нул HaXOДHTC в COCTOHHH лоrН4еско eAHHHu.bI, еслн результат арнфмеТН4еской ли60 лоrН4еской ,оnерацнн явnетс HyneBbIM. Еслн результат не B летс HyneBbIM, то 6нт HYn HaXOДHTC в состонни лоrН4ескоrо нул. · ОС (перенос разрда) 6нт переноса разрда ннднцнрует nоловннны перенос. Он содержнт перенос нз мnадwей 4астн результата (4 6нта), а так>ке старшей nоловн- ны 6aTa (4 bits) н нсnользуетс TOnbKO командой DAW. . С (перенос) 6нт переноса perHcTpa COCTOHH содержнт пере НОС нз caMoro cTapwero 6нта резуnьтата. Счетчик команд (РС). С4еТ4НК команд, XOT н не явnется непосредственно aдpecye мым, как SR, влется 04ень важным perHcTpoM. С4еТ4НК команд в устройствах семей ства PIC18 nредставлет c060 21разр,lJ,НЫ perHcTp, он адресует следуlOw,уlO 4ейку памтн в naMTH nporpaMM н nозволет Qсуw,ествлять nоследовательны доступ к KO маН,lJ,ам в naMTH nporpaMM. С4еТ4НК команд BneTc С4еТ4НКОМ, однако он не С4нтает коман,lJ,Ы nporpaMMbI. Он С4нтает адреса naMTH, 4т06ы 06ecne4HTb доступ к следуlO w,e команде nporpaMMbI, 4ТО, BepOTHO, и nрнвело к тому, 4ТО он называетс С44етчн- '" ком команд. В некоторых nроцессорах зтот perHcTp называется perHcTpOM адреса KO манды (IAR). Последовательность выполненн команд nporpaMMbI моднфнцнруетс, еслн со- держнмое С4еТ4нка коман,lJ, нзменетс. Дл нзменення СО,lJ,ержнмоrо С4еТ4нка команд комаН,lJ,а GOTO нлн комаН,lJ,а условноrо перехода заноснт новое зна4енне в С4еТ4НК ко- манд, 4ТО npHBO,lJ,HT к нзмененнlO после,lJ,овательностн выnолненн команд nporpaMMbI. Функu.нн CALL н REТURN так>ке нзменIOТ СО,lJ,ержнмое С4еТ4нка коман,lJ,. Функu.н CALL nOMew,aeT адрес возврата (адрес коман,lJ,Ы, cne,lJ,YIOw,e непосре,lJ,ственно после CALL) в стек, а затем выполняет команду GOTO. Функu.н RETURN нзвлекает адрес возврата нз стека н nOMew,aeT ero в С4етчнк коман,lJ,. 3то npHBoAHT к тому, 4ТО слеДУIOw,е выполн eTC команда, следуюw,ая непосредственно после CALL. 
58 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 2.3. Интеrррованная CCTeMa разработк (IDE) npe>K,lJ,e, 4ем ABHraTbC ,lJ,аnьше, нам не06ходимо ознакомнтьс с интеrрирован ной снстемой разра60ТКН ДЛ мнкроконтроnлеров PIC. IDЕ позволет осуw,ествлть разра60ТКУ н HanHcaHHe nporpaMM как на 3ЫKe Ассем6лера, так и на 3ЫKe С. Она TaK >ке nозволет выыnолнть тестнрованне н имнтаu.ию выпоnнени проrрамм с ИСnОЛЬ30- ваннем ннструментальных средств отладкн, BКnlO4eHHbIx в IDЕ. MLI1KPOKOHTponnep может проrраммироватьс, еслн nporpaMMaTop nOAKnlO4eH к IDЕ лн60 схемно 3МУJlироватьс, есnи к IDЕ nОДКЛlO4ен змултор. IDЕ - зто заКОН4енна снстема разра60ТКН проrрамм ДЛ мнкроконтроллеров PIC, она может СЛУЖLl1ТЬ так>ке прекрасным средством 06Y4eHLI1 ввнду HHTerpHpoBaHHbIx в нее возможностей отладкн. J/:;_;yt\ ' i/:i?'.'.'.'.' ........................... ....... ........ ..f5..........Ii.....i........;;.......j.:.....:...._.B:.:'.;:..;:i..:.:.II.i_)....i........:g.;....1..:.;.: .. 1> tti.IT...........m..... "МPf АВ ЮС vl. 10 ' (C:\Progtdm filf!s\Мkrщ:hij)\.МРАSМ Suit!!\l СlJ1рlаlе\ОIJjс(:Л1 З201mj)().<JSm.J .:....._...'.-..........-..........,'..............,........'....,..,-.............'.-.'....'.............,'....,..........-..,'.......'-.-.-..-..................,........'.....-..-.'..'..,'..-..............'...-...........'..............-..'.................................-....-...........,'......_.......-..,.....,'..,...........,'.-..-',.-.................--'.........-..,......'...-............-..-.,......-........-.........,....-.........,....-,._.........,-....-,................ JIIOyf f JIIOyff JIIOyf f 1....t.fie B$]"I!iM .B3R till.lG  твкр . 'RJC S!ArUZT!!.fI.F ,S;:AfUS ;r&surQ BZI:. rеq:tst.фt ;rez<;QI:E: "l:Qt"kirl<:f re:gi:!lter ;re$'t.orQ З-!А!'US: :rel.}:1ztEX' ; 't 1.: ,*1V* *?f'1'*W", *  *'tr 't'* 't* **..:t $''1t*:t '''t:t :t-" '* *,:! 1t :\-* '* "-4 *.. s''t * :t b":t  1.: *-./1.-__ '* f:' ,,-1) '* $'-);:! *  1."1,-* ; 5't..&.rt f;t f a1.r1. р.rr;tiуЭ,ts. ; !Ъ'с': .tJ,,i:.fA. Vl'(,,!:a1ta. ..Q':1 lS ').1if,;::efl к,ак&. !l:s.in: .,.,.* %&a.in c:c-dli! gli!2= ht!!'t'E' *'** J'I!IDvlw 3 -й..1." Ох64 l.tsr О < Ох 10 JIIOvff ..t>OI:>!., 90S! хисо 1II8Ovft PMDH, rNDJO "" а.). t: ; lJU1;o '''f&.i. t, ; 't'**'X"'t':1' *'?('v't' :oe-1t,.... 't"*1V't;':t....7C''t;"t:1I'''''*'t'1';'.,..'t''** *«''''''',,*'t.: *''t''* 3'-.IC''''' :tw*,**"f"'" '" $'",1< **1t''t':+-"t: t«'*"'""1!'S""'W* ;Iп.! 01 prC>9'ra:<.. IJID Рис. 2.9. Сннмок зкрана IDЕдл мнкроконтролnеров PIC Обзор IDE Рис. 2.9 демонстрнрует сннмок зкрана IDЕ ДЛ мнкроконтроллеров PIC, KOTopa может 6ыть 6есnлатно выrружена по адресу http://www.microchip.com. 3тот Windows- 6азнрованный ннтерфейс леrко НСПОЛЬЗ0вать для созданн н отладкн nporpaMM. Так>ке являетс возможным нмнтнровать выnолненне проrрамм в nK прн nOMow,H нмитатора, KOTOpЫ влетс 4acTblO IDЕ. Кроме Toro MOryr нсnользоватьс аппаратные 3YnTo ры, уnравлемые от IDЕ н 06ecne4HBalOw,He 60лее T04HYlO HMHTau.HIO в масшта6е реаль- Horo временн. Ал нсnользованн IDЕ ДЛ созданн npoeKTa первый шаr заключаетс в вы60ре микроконтроллера, нсnользуемоrо в проекте, по ero ТLI1ПУ. 3то выnолнетс w,en4KoM на 
fnaBa 2. Архнтектура семейства PIC18 н разработка проrpамм 59 П03НЦLl1Н Configure (Конфнrурнровать) в MeHlO, HMelOw,eMc в BepXHe 4астн зкрана IDE. Далее ну>кно w,елкнyrь на nознцнн Select Device . . . (Вы60Р YCTpOCTBa) в nовившем- c развора4иваюw,емс MeHIO. Теперь на зкране pa3BepHeTC дналоrовое окно, пока- занное на рнс 2.10. Вы6ернте MHKpOKoHTponnep, который 6удет НСnОJlьзоватьс в TeKY w,eM проекте LI1З cnHcKa устройств. 3тн действн сконфнrурнруlOТ IDE на тот тнп микро- контроллера, который 6удет нсnользоваться в npoeKTe,  онн должны 6ЫПJ выполнены ПР8)кде Bcero, 4т06ы 06еспе4НТЬ nравнльную ра60ТУ IDЕ. Ew,e несколько waroB Tpe6YIOTc ДЛ выnолнеНLI1 попной нннцналнзацнн IDE. Так, найднте н w,елкннте на nознцнн Project (nроект) MeHIO н вы6ернте nОЗНЦНIO Project Wizard (Мастер nроектов) в развора4нваlOw,емс MeHIO. nоявнтся диалоrовое окно, nоказанное на рнсунке 2.11. Рис. 2.10. Вы60Р мнкроконтроллера ДЛ IDE. в окне мастера nроектов w,елкннте на кнопке Next (Аалее). nOBHTC дналоrовое окно, nоказанное на рнс. 2. 12. OnTb вы6ернте мнкроконтроnлер, KOTOPЫ 6удет LI1C nользоватьс в nроекте. 3то, коне4НО, нзБЫТ04на оnерацн, однако все же не06ходи мо вновь указать мнкроконтроллер в MeHIO Device Select (Вы60Р устройства). На слеДУIOw,ем ware дналоrа (см. рнс. 2.13) не06ходнмо вы6рать на60Р ИНСТРУ ментальных средств, который 6удет нспользоватьс npH Р,азра60тке nporpaMMHoro 06ecne4eHH мнкроконтроллера. В данном СЛУ4ае вы6рана nознцн Microchip MPASM Toolsuite (На60Р HHCTpYMeHTanbHbIX средств Microchip MPASM), 06ecne4H- ваюw,а возможность разра60ТКН ДЛЯ nроекта проrрамм на зыке AcceM6nepa (см. рнс. 2.13). MPASM - это ассем6лер от фнрмы Microchip AfI YCTPOCTB PIC. V1H,lJ,H цнруемые HaHMeHOBaHH nyTe фалов ДОЛ>КНЫ 6ыть корректными  онн не HY)I(,lJ,aIOTc в моднфнкацнн, еслн IDE 6ыла nравнльно установлена. 
60 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 Тм wizard helps уои create and configure а new MPLA8 project. Т о continue, click Next. Рис. 2.11. Окно мастера npoeKToB IDЕ , ?: у " Projcct Wildrd . :;1 Step Оne: S elect а device . '*' /. Рис. 2.12. Вы60Р мнкроконтроллера 
rnaBa 2. Архнтектура семейства PIC18 н разработка проrpамм 61 PrQject Wizard L J Step т wo: Select а language tool$uite . '... .' " Рис. 2.13. MeHIO вы60ра комплекта ннструментanьных средств Projct Wjzard IJ Step Three: N ате yoUf project 11 Рис. 2.14. MeHIO нменн nроекта 
62 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 Следуюw,ее дналоrовое окно заnрашнвает HM npoeKTa н nyrH фаnов, как э ro по казано на рнс. 2.14. Задате HM nроекта, которое onHcbIBaeT npoeKT, разра6атывае- мый вам н в текуw,нй момент временн. Последннй н нан60лее сложный war свзан с вы60РОМ срайnов компоновw,ика ДJl микроконтроллера, а так>ке вы60РОМ файла wа6лона проrраммы, чт06ы nporpaMMa моrла 6ыть HanHcaHa. Рнс. 2.15 демонстрнрует снимок зкрана ДJ1 AaHHoro ПОСJlеднеlО этапа настройкн IDЕ на разра60ТКУ nporpaMM ДJl текщеrо npoeKTa. Для ВЫПОЛllени этоrо найднте KaTanor с' именем Microchip; HaH60nee BepOTHO, 4ТО он расположен в каталоrе Program Files на днске С. OTKpOTe в каталоrе Microchip папку с именем MPASM Suite (комплект ннструментальных средств MPASM). В зтой папке найдите во вло>кенной папке Object folder (Папка 06ъектов) срайn ша6лона ДЛ МНКрОКОНТрОJ\лера, исnоnьзуемоrо в npoeKTe. 3тот файn должен нметь HM тнпа, напрнмер, 1320tmpo.asm, 4ТО соответствует СЛУ4аю, KorAa в npoeKTe нсnоnьзуется мнкроконтроллер 18F1320 ввнду ero ннзкой стонмостн (менее 3x долларов). Щеnкннте на LI1MeHH фала н д06aBb те ero в cnHcoK, w,enKHYB на кнопке Add (А06авнть). Теперь OTKpOTe папку LKR н HaДH- те в He файnы KOMnoHoBw,HKa для BbI6paHHoro мнкроконтроллера. В данном СЛУ4ае два Н3 3TLI1X сралов  18f1320.1 kr н 18t1320i.lkr д06авлIOТС в cnHcOK срайлов компоновкн ДЛ МLI1кроконтроллера 18F1320. Как только все трн cpana 6удут пере4нслены в окошке списка cpanoB, отметьте nереКnlO4ателн Add to project check Ьох (A06aBLI1Tb в KOH троnьный cnHcoK npoeKTa), cTow,He p,lJ,OM с каждым нменем файла, а затем w,enKHHTe на кнопке Next (Аалее). nовится nocneAHee дналоrовое окно, на котором 6удет кнопка Finish (Заверwнть). Щелкннте на 3TO кнопке ДЛ созданн npoeKTa  н новый npoeKT 6удет ycnewHo создан. pft}ject WiZaI'd . " ,п> > >; '. Step Four: Add an,y existing fes to 'уОШ project 11 Рис. 2.15. Вы60Р сралов KOMnoHOBw,HKa н срайла wаблона npoeKTa 
fnaBa 2. Архнтектура семейства PIC18 н разработка проrpамм 63 ,  . "МШ.J\В тЕ "11.10 о.... .... ...._. ......... ..... ._.....:...:.....................-. ....._....... .... ........;..,.;...;.;. '..:..................................;....._.............:.:....... ffi1It!rt@I;'.191::'..r'lpi, .....,.....................'................-.......................................... ....-............ ...,. . .. . . . .... . ...... . .. . . . .. . . . .. . .'.',... . .. . .......-.._..-.............. . ................-..'.. . .. . . . ......... . .. . .... . ..... . . . . . . . .. . .'-. . ... . . . . . . . ,... . . . . . .. . ...,. . . . . . .. . .. . . . . . . .. . . .. . . . . . ..... . о., ""Н__" _,_ .. '" ,_......., ._, .. _ ... .. ..;.......;,..,.;,..........,......,.,................... .......'......M......'..................,....,......,....................................................n. ,..,.........,......., . .. 8 Myfirst.mcp 8 Source Files 132Otmpo.asm нмder F'es Object Files . Libr ary Files 8 . Linker Scripts 18f1320.lJQ 1бf 1 Э2Oi.1I<r Ot:herFiles Рис. 2.16. MeHIO файлов npoeKTa Дn Toro, 4т06ы посмотреть на wа6nонный nроrраммный код (файл wа6лона), вставленный мастером npoeKTa, w,елкннте на nознu.нн View (Внд) MeHlO, а затем вы6е- рнте n03НЦНIO Project (npoeKT). Рнс. 2.16 показывает зкран, который nOBHTc, KorAa вы w,еЛКНLI1те на nознu.нн Project (npoeKT) развора4нваlOw,еrося меню Project (npoeKT). в зтом не60ЛЬWОМ окне 6удуТ от06ражены файлы, которые BКnlO4eHbI в nроект. На ,lJ,aH ном 3Tane нан60лее ннтересным 6удет файл HcxoAHoro текста, который влетс wa6 лоном, нсnользованным в снстеме. Дn просмотра 3Toro файла ABa>K,lJ,bI w,enKHHTe 1.la именн файла,  в зтом npHMepe на нменн "1320tmpo asm". Ка.залось 6ы, зто 04ень трудно  создать npoeKT н разра60тать ero nporpaMMHoe 06ecne4eHHe, однако cyw,ecT BYIOT простые warH, КОТОрЫХ нужно nрндерживатьс  н КОЛН4ество ннформацнн, кото- PYIO не06хо,lJ,НМО ввестн, зна4нтельно COKpaTHTC. Как TOnbKo вы разра60таете несколь ко nporpaMM, зтн warH станут ДJl вас естественнымн. Пример 2.6 показывает лнстинr файла wа6лона проекта. Больwа 4асть Toro, 4ТО имеетс в данном файnе на данном 3Tane 6удет ДJl вас «тайной за ceMblO nе4атми», О,lJ,нако позже 6удет все 06ЪCHeHO. Аанный nроrраммный текст содержнт 06шнрные комментарнн, которые OnLl1CbIBalOT назна4енне Ka>K,lJ,O сеКЦНLI1, а так>ке некоторые ко- манды, которые не06ходнмы ДJl настройкн 6азовых nporpaMM PIC. Снмвол Т04КН с заnято озна4ает KOMMeHTapH н все, что следует после этоrо снмвола до конца строкн не reHepHpyeT HHKaKoro кода. ФаКТН4ескн 60nьша 4асть 3Toro npHMepa влетс npo сто KOMMeHTapHMH. 
64 ITpHMeHeHHe MHKpoKoHTponnepoB PIC18 Пример 2.6 ;***************************************************************************** Этот an npeACTaBnReT c060 6a30B ша6nон С03Аанмя l1epeMeaeMoro КОАа acceM6nepa AnR PIC18F1320. Скопмруте зтот фаn в KaTanor вашеrо npoeKTa м МОАмфиuмруте ero в CnY4ae не06ХОАММОСТМ. C03AaTe npoeKT, MCnOnb3YR UPLINK в KaqeCTBe R3KOBoro среАства C03AaHMR шестнаАuаТМРМ4ноrо ana. 06aBbTe в npoeKT ЭТОТ an м фаn 18F1320.LKR Архмтектура IC18FXXXX AOnYCKaeT конфмrурмрованме АВУХ npepBaHM. aHH ша6nонн КОА HanMcaH в paCqeTe на уровнм npMopMTeTa npepBaHM. Орм зтом 6мт IPEN perMCTpa RCON AoneH 6Tb YCTaHoBneH AnR разреwеНМR MCnOnb30BaHMR уровней npepblBaHM. ECnM 6мт IPEN 6УАет OCTaBneH в YCTaHaBnMBaeMOM AnR Hero по YM0nqaHM HyneBoM COCTORHMM ТО, TOnbKO вектор npepBaHMR по аАресу ОхО08 6УАет MCnOnb30BaTbCR, а nepeMeHHe WREG_TEMP, BSRTEMP м STATUSTEMP не 6УАУТ ИСnОnЬЗ0ваТЬСR Смотрмте РУКОВОАСТВО ПОnЬЗ0ватеnR AnR n0nyqeHMR AOnOnHMTenbHO мнформаuмм по CBOCTBaM acceM6nepa м KOMnOHOBKa Смотрмте TeXHMqeCKMe cneUMMKaUMM PIC18F1220/1320 AnR n0nyqeHMR AOnOnHMTenbHO MHopMaUMM 06 архмтектуре м на60ре комаНА ;***************************************************************************** Имя ana: aTa: BepcMR ana: Автор: KOMnaHMR: ;***************************************************************************** Tpe6yeMe an: P18F1320.INC 18F1320.LKR LIST P=18F1320, F=INHX32 iAMpeKTMBa onpeAeneHMR npoueccopa м opMaTa фала #include <P18F1320.INC> ;onpeAeneHMe npoueccopho-орментмрованнх nepeMeHHX ;***************************************************************************** Бмт KOHMrypaUMM MpeKTMBa CONFIG onpeAenReT AaHHe конфмrурмроваНМR внутрм фаnа .ASM. Меткм, cneAye nocne AMpeKTMB, onpeAeneH в ane P18F1320.INC. TeXHMqeCKMe сnеuмфмкаuмм PIC18F1220/1320 ра3ЪRСНRТ функuмм 6мтов конфмrураuмм. Мзменмте HMecneAye строкм так, qT06 онм COOTBeTCTBOBanM BaweMY rrpMnoeHM. CONFIG _CONFIG1H, IESOOFFlH & FSCM_OFFlH & HS OSC 1Н CONFIG _CONFIG2L, _BOROFF_2L & PWRT OFF2L CONFIG _CONFIG2H, _WDT_OFF2H CONFIG _CONFIG3H, MCLRE OFF_3H 
rnaBa 2. Архнтектура семейства PIC18 н разработка nporpaMM 65 CONFIG CONFIG CONFIG CONFIG CONFI G CONFIG CONFIG _CONFIG4L, _CONFIG5L,  CONF'IG5H, _CONFIG6L, CONPIG6H, CONFIG7L,  CONFIG7H, DEBUG OFF 4L СРО OFF 5L &   - СРВ OFF 5Н & - - - WRTO OFF 6L &  -  WRTC OFF 6Н & EBTRO OFF 7L & -   EBTRB OFF 7Н - -- & LVP OFF 4L & CPl OFF 5L    СРD OFF 5Н    WRTl OFF 6L   - WRTBOFF6H Sc EBTRl OFF 7L -   STVR OFF 4L    WRTDOFF6H ;***************************************************************************** OnpeAeneHMe nepeMeHHblx Эти nepeMeHHble не06ХОАИМЫ топько, есnи МСnОnЬЗУТСR низкоnриоритетне nрерываНИR Боnьwе nеремеиных MoeT nонаА06ИТЬСR ДnR coxpaHeHMR Аруrих спеuиаnьнх ункuионаnьных perMcTpoB, исnоnьзуех в nОАnроrраммах 06сnуиваНИR npepBaHM. ОDАТА WREG ТЕМР RES 1 ;ПеременнаR в ОЗУ AnR icoxpaHeHMR контекста STATUS ТЕМР RES 1 ;ПеременнаR в ОЗУ AnR icoxpaHeHMR контекста BSR ТЕМР RES 1; ПеременнаR в ОЗУ AnR ;coxpaHeHMR контекста UDATA ACS EXAMPLE RES 1 ;npMMep nepeMeHHo в ОЗУ iдостуnа ;***************************************************************************** aHHe ЭСDПЗУ ЗАесь onpeAenRTCR Аанные, rroAneae nроrраммированм в ЭСDПЗУ ОАТА EEPROM СОDЕ DЕ OxfOOOOO "Test Data",0,1,2,3,4,5 ;***************************************************************************** iBeKTop с6роса ; Этот код HaqHeT BblrronHRTbcR rrocne с6роса. RESET VECTOR СОDЕ ОхОООО goto Main ;ПереХОА на заrrуск iOcHoBHoro parMeHTa КОАа i***************************************************** ************************ iBeKTop BcoKorrpMopMTeTHoro rrpepBaHMR Этот КОА HaqHeT BrronHRTbcR rrocne вознмкновеНМR BblcoKorrpMopMTeTHoro rrpepblBaHMR nM60 в cnyqae вознмкновеНМR rrрерываИМR, KorAa rrpMopMTeT rrpepBaHM не разреwены HI INT VECTOR СОDЕ ОхОО08 bra Highint irrереход на rrодrrроrрамму i 06ра60ТКМ BblcoKorrpMopMTeTHoro rrpepblBaHMR ;***************************************************************************** ; Вектор нмзкоnрмормтетноrо rrpepBaHMR 
66 Прнмененне MHKpOKOHTpOnnepOB PIC 18 Этот КОА HaqHeT BblnOnHRTbCR nocne B03HMKHOBeHMR HM3KOnpMopMTeTHoro npepblBaHMR ДaHH КОА MoeT 6ыть YAaneH, eCnM HM3KonpMopMTeTHe npepBaHMR не MCnOnb3YTCR LOWINT_VECTOR СОDЕ Ox0018 bra Lowint; nepexOA на nOAnporpaMMY ; 06ра60ТКМ HM3KonpMopMTeTHoro npepBaHMR ;***************************************************************************** DOAnporpaMMa 06ра60ТКМ BCOKOnpMopMTeTHoro nрерыванмя 3Аесь nOMeaeTCR nporpaMMHbl КОА 06ра60ТКМ BCOKonpMopMTeTHoro npepblBaHMR СОDЕ Highint: *** CAa nepexOAMT КОА 06ра60ТКМ BblCOKonpMopMTeTHoro ; npepBaHMR retfie FAST ;***************************************************************************** DOAnporpaMMa 06ра60ТКМ HM3KonpMopMTeTHoro npepBaHMR 3Аесь nOMeaeTCR nporpaMMHbl КОА 06ра60ТКМ HM3KonpMopMTeTHoro npepblBaHMR aHH КОА MoeT 6ыть YAaneH, eCnM HM3KonpMopMTeTHe npepblBaHMR не МСnОnЬЗУТСR Lowint: movff movff STATUS,STATUSTEMP WREG,WREG_TEMP ;coxpaHeHMR perMcTpa COCTORHMR ;сохраненме pa60qero perMcTpa movff BSR,BSR_TEMP icoxpaHeHMe perMCTpa BSR *** CAa nереходмт КОА 06ра60ТКМ нмзкоrrрмормтетноrо npepBaHMR *** movff movff movff retfie BSR TEMP,BSR ; сохраненме perMcTpa BSR wreg_temp,WREG ;BOCCTaHOBneHMe pa60qero perMCTpa STATUS_TEMP,STATUS ;BOCCTaHOBneHMe perMcTpa COCTORHMR ;3arrYCK rnaBHo nporpaMM ; CAa nOMeaeTCR КОА rnaBHo nporpa Main: *** CAa nepexoAMT КОА rnaBHo rrporpaM *** ;KoHeu nроrрамм END nepBbIMH ,lJ,BYM сраКТН4ескнмн коман,lJ,НЫМН строкамн BJleTC ,lJ,нректнва LIST н оператор #include. Днректнва LIST ннсрормнрует acceM6Jlep о том, tпо ,lJ,aHHЫ MHKpO KOHTpOJlJlep (Р) нмеет THn 18F1 320, а AfI сраЙJlа вы6ран 32-6HTHЫ wестнадцатнрН4НЫ срорма Intel, который НСnОJlьзуетс AfI coxpaHeHH nporpaMMbI, сформнрованно после KOMnHJlu.HH н KOMnoHoBKH nporpaMMbI на ACCeM6Jlepe. WестнадцатнрНtlНЫ фал HC nОJlьзуетс AfI nporpaMMHpoBaHH naMTH nporpaMM ВНуТрн мнкроконтроллера PIC. BTopa ceKЦH nporpaMMHoro КО,lJ,а KOHcpHrypHpyeT мнкроконтроллер. Соответст- вуюw,не 6нты 6у,lJ,уТ рассмотрены позже. На зтом 3Tane нас устронт конфнryрацня ЮЕ, устанавлнваемая по YMOJl4aнHIO, - она noдxo,lJ,HT AfI MHorHX nрнмененнй. 
fnaBa 2. Архнтектура семейства PIC 18 н разработка nporpaMM 67 СлеДУIOw,а секцня nporpaMMHoro КО,lJ,а оnре,lJ,еJlяет Jlю6ые nОJlьзоватеJlьскне ne ременные н cooTBeTcTBYIOw,He 4eKH nамятн, а так>ке Jl106bIe ,lJ,анные, nодле>каw,не со- xpaHeHHIO в зсnnзу. в данном CJlY4ae в эсnnзу 6У,lJ,ет заноснтьс CHMBOJlbHa строка "Test Data" (Тестовые данные), за KOTOpO 6у,lJ,уТ CJle,lJ,OBaTb 4HCJla О, 1,2, 3,4 н 5. BcnoM ннте, 4ТО зсnnзу НСnОJlьзуется для coxpaHeHH nOJlYnOCTOHHbIX ,lJ,анных, которые H3 меняlOТСЯ от СЛУ4ая к СЛУ4аlO. 3тн nолуnостоянные ,lJ,анные сохраняlOТСЯ н nocJle снятн злектроnнтання. Нан60лее важно 4acTblO npHBe,lJ,eHHoro nporpaMMHoro кода ЯВJlяется устаНОlЗка вектора с6роса по а,lJ,ресу ОхОООО. BcnoMHHTe, 4ТО МНКРОКОНТРОJlлер на4ннает BbInOJ1 HTb nporpaMMY с адреса ОхОООО. Так>ке npHnoMHHTe, 4ТО HMeIOTc только 8 батоlЗ па MTH ме>кДУ адресом вектора с6роса н адресом вектора BbIcoKonpHopHTeTHoro npepbI- BaHH. ПО 3TO npH4HHe комаН,lJ,а GOTO 06Ы4НО размеw,ается по адресу вектора сброса. Е,о,ннственная OCHOBHa nporpaMMa в этом npHMepe nРО,lJ,ОJlжает выnолнться по метке Main. КомаН,lJ,а GOTO нзменет COCTOHHe С4еТ4нка коман,lJ" устанаВJ1нва ero на адрес меткн Main с тем, 4то6ы nporpaMMa MOrJla nРО,lJ,ОJlжать BbInOJlHTbC по 3TO метке. Об ратнте вннманне на то, 4ТО в ,lJ,анном CJlY4ae по метке Main нет HHKaKoro nporpaMMHoro КО,lJ,а, а HMeeTC просто KOMMeHTapH, rJlacw,H: ***З,lJ,есь BBO,lJ,HTC код rлаlЗНО npo rpaMMbI***. Пример пporpaMMbI. Теперь, KOr,lJ,a Wa6JlOH nроекта ото6ражаетс на зкране IDE, He 06хо,lJ,НМО nOMecTHTb HeKOTOpы nporpaMMHbI КО,lJ, в секцнlO Main wа6лона с тем, чтобы узнать, как nporpaMMHpoBaTb MHKpOKOHTpOJlJlep н НСnОJlьзовать IDE дЛЯ теСТНРОlЗання nporpaMM. Заменнте строку Main (;***З,lJ,есь BBO,lJ,HTC КО,lJ, rJlaBHO nporpaMMbI***) nporpaMM ным КО,lJ,ОМ на зыке ACCeM6Jlepa, nоказанным в npHMepe 2.7. Эта nporpaMMa деJlает не так уж MHoro ра60ТЫ, О,lJ,нако она срормнрует ОСНОВУ nOHHMaHH Toro, как нужно HCnOJlb зовать IDE ДЛ TeCTHpOBaHH nporpaMMbI. Пример 2.7 MOVLW ОхО1 ADOLW Ох02 Wait: GOTO Wait iзаrрузка ОхО1 В W ;A06aBneHMe Ох02 к W ;3Аесь ВХОА В 6eCKOHeqH UMKn nporpaMMa нз npHMepa 2.7 заrРV>Kает perHCTp W JlHTepanOM ОхО 1, а затем nрнбав ляет к нему Jlнтерал Ох02. An Toro, 4то6ы УВН,lJ,еть 3ТУ nporpaMMY в ,lJ,eCTBHH, введнте КО,lJ, нз npHMepa 2.7 в Wa6JlOH npoeKTa по метке Main, заменнв KOMMeHTapH ***здесь BBO,lJ,HTC КО,lJ, rJlaBHO nporpaMMbI***. Как TOJlbKO зтн строка КО,lJ,а 6у,lJ,уТ введены в ша6- лон nроекта, w,eJlKHHTe на nознu.нн Project (nроект) MeHIO. nOcJle 3Toro w,eJlKHHTe на познцнн Build AII (Компоновать все) рзвора4нваlOw,еrос CnHCKa, KOTOpЫ nOBHTc. Опu.н Build AII (Компоновать все) nрео6разует nporpaMMY на языке AcceM6Jlepa в npo- rpaMMY в 4нсленных MaWHHHbIx КО,lJ,ах, KOTopa называется 06ъeКТHO nporpaMMo. 3ТУ nporpaMMY MHKpOKOHTpOJlJlep может BbInOJlHHTb. Аanее w,eJlKHHTe на nознu.нн View (8н,lJ,) , а затем w,елкннте на nознцнн Special Function Registers (СnецнаJlьные функ ционаJlьные perHcTpbI). Ha,lJ,HTe perHcTp W (WREG) по а,lJ,ресу ОхРЕ8. Щелкннте на no знu.нн MeHIO Debugger (OTJlaд4HK), а затем вы6ернте nОЗНЦНIO MPLAB SIM. (Смотрнте сннмок зкрана на рнс. 2.17.) MPLAB S/M  3ТО nporpaMMa, KOTopa нмнтнрует MHKpO KOHTpOJlJlep PIC на nK. An nowaroBoro запуска nporpaMMbI нажмнте функцнональнуlO клавнwу F7 KJlaBHarypbI HJlH w,eJlKHHTe на нконке, paCnOJlO>KeHHO непосредственно сnраlЗа от зеJlено ,lJ,BOHO CTpeJlKH, KOTopa называетс Step into (War Bnepe,lJ,). nOcJle кюкдоrо wara зеJlена CTpeJlKa 6У,lJ,ет nepeMew,aTbC вннз по nporpaMMe, показывая Т04- 
68 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 ное место ВЫnОJlнення nporpaMMbI. СО,lJ,ержнмое perHCTpa WREG так>ке нзменется по мере ВЫnОJlнения nporpaMMbI. An nOBTopHoro запуска nporpaMMbI w,eJlKHHTe на желто иконке, раСnОJlоженно справа от зеJlено ,lJ,BOHO CTpeJlKH, н nporpaMMa на4нет BЫ nОJlНЯТЬСЯ CHa4aJla, 4то6ы можно 6bIJlo nрОСJlеднть ее BbInOJlHeHHe вновь. Обратнте вниманне на то, 4ТО nporpaMMa BbInOJlHeTC в nK н не нужно НСnОJlьзовать микрокон троллер для Toro, 4т06ы НЗУ4НТЬ ACCeM6Jlep HJlH то, как нужно nporpaMMHpoBaTb микро контроллер nибо ,lJ,а>ке освонть отла,lJ,КУ npHnO>KeHH. MPLAB SIM (нмитатор) имнтнруе1 мнкроконтролnер на nK. Средн ,lJ,pyrHx cpYHKЦH 3Toro нмнтатора мо>кно назвать выпоn ненне трасснровання коман,lJ, (4ерез MeHIO View (Вн,lJ,)), а так>ке npH НСnОЛЬЗ0ванни пор- тов BBO,lJ,a-вывода npqcMoTp ,lJ,анных BBO,lJ,aBЫBO,lJ,a 4ерез n03НЦНIO Logic Analyzer (Ло rH4eCKH анаJlнзатор) MeHIO View (Вн,lJ,). ',;;, f'1yFirst.nк:p ;:ii 5otJ'ce Fies 1 З2Otmpo.asm Нeader RIeS Object FIeS Lbrary FIeS ; LЛker Scripts I ef 1 З20.1kt 18fIЭ2Ol.Ь other Fies )lJYLV OxOl U.L1f OxOZ 90" lIs.it ,..... as.:l.n code goes here ...... IND Рис. 2.17. Сннмок зкрана AflЯ npHMepa 2.6 н окна cneu.HaJlbHbIX срункцнональных perHCTpoB. 
rnaBa 2. Архнтектура семейства PIC 18 н разработка nporpaMM 69 Переное прораммы в микроконтроллер An переноса nporpaMMbI в MHKpOKOHTpOJlJlep нео6хо,lJ,НМО НСnОJlьзовать npo rpaMMaTOp. Некоторые РIС186азнрованные ,lJ,eMOHcTpau.HOHHbIe naHeJlH MHKpOKOHTpOJl JlepOB СО,lJ,ержат nporpaMMY, npe,lJ,Ha3Ha4eHHYlO AflЯ выrрузкн nporpaMMHoro 06ecne4e HH н nporpaMMHpOBaHH MHKpOKOHTpOJlJlepOB. Фнрма Microchip nред,лаrает u.елы ря,lJ, nporpaMMaTopOB, которые MOryr nporpaMMHpOBaTb MHorHe YCTpOCTBa ceMeCTBa PIC18. IDЕ nордержнвает CJle,lJ,YIOw,He nporpaMMaTopbI: PICSTART plus, ICO 2, РМ 3 н РАОМАТЕ 11. АоnолннтеJlЬНО, MHoro дРуrнх nporpaMMaTopOB, которые так>ке nporpaM MHPYIOT сnnзу, зсnnзу н ДРуrне мнкроконтроллеры, 06Ы4НО досrynны. Еслн нмеется О,lJ,НН Н3 IDЕnордержнваемых nporpaMMaTopOB, то IDЕ может ynpaBJlTb нм н nporpaM мнровать MHKpOKOHTpOJlJlep HenOCpe,lJ,CTBeHHO нз IDЕ. Рис. 2.18. РаскрываlOw,ееся MeHIO nporpaMMHpOBaHH нз IDЕ Как только nporpaMMa скомпонована н ОТJlажена в IDЕ, Bы6HpaeTC nporpaMMaTOp дnя Toro, 4то6ы nepe,lJ,aTb wестнадцатерН4НЫ фаJl в МНКрОКОНТрОJlлер. БОJlЫ..i.Jннство проrрамматоров nроверяет, npaBHJlbHO JlH nporpaMMHpyeTc nporpaMMa в мнкрокон- троЛJlере. Этот У4е6ннк не nbITaeTc 06ЪCHTb ра60ТУ Jl106oro KOHKpeTHoro nporpaMMa П)J>а. ДOKYMeHTaЦH н nporpaMMHoe 06ecne4eHHe AfI nporpaMMHpOBaHH MHKpOKOH тpoJlJlepa nOCTaBJleTC С nporpaMMaTopOM, н за,lJ,а4а nроrраммнровання MHKpOKOH троЛJlера BbInOJlHeTC 04ень просто. npH НСnОJlьзованнн O,lJ,Horo нз IDЕ-nордержнваемых nporpaMMaTopOB, после кон- фиryрнрованн nporpaMMHpOBaHHe, проверка, н тому nO,lJ,06HbIe функцнн BbInOJlHIOTC через развора4нваlOщнес MeHIO nознцн rJlaBHOro MeHIO IDЕ. Рнс. 2.18 НJlЛlOстрнрует такое pacKpbIBalOw,eec MeHIO AfI СJlУ4ая, Kor,lJ,a nporpaMMaTop уже установлен н nод I11Ю4ен к xoct-nк. ECJlH nордержнваемы IDЕ nporpaMMaTOp ОТСуТствует, то шестнадца repH4HbI 06ъeКТHЫ cpaJl должен 6ыть nepe,lJ,aH в нмеlOw,нся nporpamma-rор, а затем заrpужатьс в мнкроконтроллер. 
70 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 2.4. Язык Ассемблера, nporpaMMa «ассемблер» и компоновщик nре>кде, 4ем ассемБJlер 6У,lJ,ет НЗУ4ен н зсрсректнвно НСnОJlьзован AfI nporpaMMH ровани, ну>кно освонть HeKOTOPYIO 6азнснуIO HHcpopMau.HIO относнтельно ассемблера н KOMnoHOBw,HKa nporpaMM. 3тот nО,lJ,раЗ,lJ,еJl 06ЪCHeT pOnb зтнх ннструментальных средств в разработке снстем, н OnHcbIBaeT 6a3HCHЫ сннтаксис Ассемблера. Ассемблер и компоновщик ACCeM6Jlep  зто nporpaMMa, KOTopa nре06разовывает ассем6лер (СНМВОЛЫIЫ MaWHHHbI КО,lJ,) нз HCXO,lJ,Horo фала в 4HCJleHHbI машннны КО,lJ, н сохраняет ero в объ- ектном фаJlе. Как н Jl1060 цn, MHKpOKOHTpOJlJlep nOHHMaeT только 4HCJleHHbI машнн ный код. БОJlЬШННСТВО nporpaMM acceM6Jlepa BbInOJlHIOT nре06разованне НСХОДI-юrо cpaJla в 06ъeКТHЫ cpaJl за ,lJ,ва npoxo,lJ,a 4ерез HCXO,lJ,HЫ фаJl. nepBbI npOXO,lJ, reHepH рует таБJlНЦУ CHMBOJlOB, KOTopa СО,lJ,ержнт Ka)l(,lJ,YIO метку н ее а,о,рес в nporpaMMe. nep- BЫ npoxo,lJ, также Hw,eT OWH6KH ВВО,lJ,а, называемые сннтаКСН4ескнмн oWH6KaMH, н co обw,ает О ННХ nOCpe,lJ,CTBOM co06w,eHH 06 oWH6Kax. BTOpO npoXO,lJ, выnолнетс, eCJlH не 06наружено ннкакнх OWH60K в те4еннн nepBoro npoxo,lJ,a. В те4енне 3Toro BToporo npoxo,lJ,a нзвлекаlOТСЯ а,о,реса нз та6JlНЦЫ CHMBOJlOB н КО,lJ,Ы Ka)l(,lJ,O коман,lJ,Ы CPOpMHPYIOT объектнуlO nporpaMMY на 4HCJleHHOM MaWHHHOM зыке. V1CXO,lJ,HbI cpaJl ДJl acceM6Jlepa  зто 06Ы4НО cpaJl, KOTOpЫ НСnОJlьзует pacWH ренне cpaJla .asm; 06ъектный cpaJl, сrенернрованный ассем6лером, 06Ы4НО нмеет расшнренне .0. V1MeHa cpaJlOB ,lJ,ОJlЖНЫ соответствовать cOrJlaWeHHM, npHHTbIM в one paЦHOHHO снстеме. В 60Jlьшннстве CJlY4aeB НС:nОJlьзуетс onepau.HoHHa снстема Windows, в CHJlY 4ero в нменах cpaJlOB можно НСnОJlьзовать n04TH Jl106bIe CHMBOJlbI, за НСКЛlO4еннем несколькнх cneu.HaJlbHbIX. 06ъeКТHЫ cpaJl 06Ы4НО не нмеет формы HC nолннтеJlьноrо фала. V1СnОJlннтельны nporpaMMHbI cpaJl - зто 06Ы4НО cpaJl, nред Ha3Ha4eHHЫ для заrрузкн в MHKpOKOHTpOJlJlep н HMelOw,H wестна,lJ,цатнрН4НЫ срормат Intel. 3тот сраЙJl 06Ы4НО reHepHpyeTc ,lJ,Pyro nporpaMMO, называемо KOMnOHOBw,H- ком. nporpaMMa KOMnoHOBw,HKa 06ъe,lJ,HHeT HeCKOJlbKO 06ъектных фалов AfI языков AcceM6Jlepa н С в О,lJ,НН HCnOJlHeMbI cpaJl. В CJlY4ae MHKpOKOHTpOJlJlepa PIC зтот HCnOJl HeMЫ cpaJl 06Ы4НО нмеет weCTHa,lJ,u.aTepH4HbI формат Intel, нсnользуемы 13 PIC- nporpaMMaTope, н 4асто нмеет расшнренне .hex. KOMnoHoBw,HK также допускает \HC nОJlьзованне в nроцессе KOMnOHOBKH 6H6JlHOTe4HbIx фаJlОВ (.Iib) н сралов cцeHapH KOMnoHoBw,HKa (.Ikr). KOMnoHoBw,HK так>ке reHepHpyeT cpaJl .coff (06W,H срормат 06ъект- Horo cpaJla) н cpaJl .cod (CHMBOJlbHbI н OTJla,o,04HbI cpaJl) ДЛ снстемы разра60ТКН н nроцесса OTJla,o,KH. В ,lJ,OnOJlHeHHe к фаJlам .coff н .cod, rенернруется cpaJl .Ist (nOJlHbI срал лнстннrа nporpaMMbI), KOTOpЫ p,lJ,OM от06ражает как снмвольны, так н 4нслен ный код nporpaMMbI; IDЕ нмеет ,lJ,ocTYn к зтому cpaJlY JlHCTHHra, от06ражая ero npH ДH зассемБJlнрованнн 4ерез MeHIO View (Вн,lJ,). Aocryn к зтнм сралам 06Ы4НО выполняется нзнyrрн IDЕ н онн, как npaBHJlO, не НСnОJlЬЗУIOТС НН,lJ,НВН,lJ,уально. Ааже nporpaMMaTOp, KOTOpЫ НСnОJlьзует .hex фаJl, 06Ы4НО ynpaBJleTC нзlDЕ. Операторы языка Ассемблера Строкн acceM6JlepHOrO ко.ца называютс операторами. Оператор СО,lJ,ержнт 4eТblpe раЗJlН4НЫХ HHcpopMau.HOHHbIX nOJl: метка, КО,lJ, оnерацнн, операн.ц н KOMMeHTapH. Метка co держнт CHMBOJlbHbI ащ:>ес памяти, по которому оператор может 6ыть ащ:>есован нз Jl1060ro места nporpaMMbI. Так, оператор GOTO Main, раСnОJlоженны по ащ:>есу вектора с6роса, ссылается на метку, размеw,еннyto в .цpyroM месте nporpaMMbI. Ко,lJ, оnерацнн СО,lJ,ержнт KO 
rnaBa 2. Архнтектура семейства PIC18 н разработка nporpaMM 71 ман,lJ,У ассем6лера HJlH AIi1ректнву, которая ynpaBJleT pa60TO мнкроконтромера, acceM6Jle ра нлн nporpaMMbI КОМПОНОВLЩ'1ка. CJlOBO GOTO в GOTO Main ЯВJlетс прнмером KO,D,a one рацнн. OnepaН,lJ,  это JlнтерЭ11, адрес pernCтpoBoro cpaJla HJlH HeKOTopa .цруrая HHcpopMa u.ия, HCnOJlb3yeMa КО,lJ,ОМ операu.нн ДЛ ВЫПОJlнення зада4Н. В Операторе GOTO Main, слово Main - зто OnepaH,lJ" нсnользуемый КО,lJ,ОМ onepau.HH GOTO. nOJle KOMMeHTapH не06затель НО, 06Ы4НО ОНО указывает HeKOTOPYlO HHcpopMau.н1O о nporpaMMe HJlH же HCnOJlb3yeTc ДЛ TOro, 4т06ы Н,lJ,ентнсрнцнровать секu.ню KO,D,a. Комментарнн ,lJ,OJl>KНbI Ha4HHaTbC CHMBOJlOM Т04КН С заnто. Рнс. 2.19 НJlЛlOстрнрует строку ко,о,а С ннформацней в каждом nOJle onepa тора зыка AcceM6Jlepa. Метка. Метка 06Ы4НО npOCTaBJleTC TOJlbKO в строках КО,lJ,а, на которые HMeIOTC Ссыл- кн в какнхлнбо нных местах nporpaMMbI. Метка может COCTOTb нз Jl106bIx CHMBOJlOB, за HCКnlO4eHHeM зарезервнрованных лексем THna КО,lJ,ОВ оnерацн HJlH нмен perHCTpol3. Метка ,lJ,олжна Ha4aTbC С 6уквы (AZ) HJlH С CHMBOJla nодчеркнванн, как, HanpHMep Start. Метка может СО,lJ,ержать Jl1060 CHMBOJl, цнсрnу, CHMBOJl nО,lJ,4еркнвання Jlнбо CHM BOn BonpOCHTeJlbHOrO знака. Меткн 06Ы4НО закаН4нваlOТС ,lJ,воеТ04нем, НО зто не 06за TeJlbHO. Та6л. 2.5 показывает HeCKOJlbKO срорм ,lJ,OnYCTHMbIX меток зыка Ассем6лера. метка Start КО,lJ, onepau.HH MOVLW OnepaH,lJ, KOMMeHTapH ОХОО заrРV>Kает perHcTp WREG значеннем ОхОО Рис. 2.19. Оператор зыка ACCeM6Jlepa Таблица 2.5. npHMepbI меток. Пример метки КоМментарий опустимаR метка оnустимаR метка НеАоnустимаR метка ввмду HanMqMR CMMBona & HeAorrYCTMMaR метка, rroCKonbKY метка AOnHa HaqMHaTbCR С 6YKB nM60 симвоnа rrOAqepKMBaHMR onYCTMMaR метка HeAonYCTMMaR метка, потому qTO addlw преАстаВnRет c060 КОА onepaUMM START: Start Start&Stop: 4Ме: StartStop?: Addlw: КОД операции. nOJle КО,lJ,а onepau.HH ,lJ,OJl>KHO СО,lJ,ержать ,lJ,OnYCTHMbI КОД оnерацнн MHK pOKOHTpOJlJlepa. nOJle КО,lJ,а onepau.HH может также СО,lJ,ержать директиву, которая npeA- CTaBJleT c060 сnецнаJlЬНУIO коман,lJ,У AfI acceM6Jlepa НJlИ KOMnoHonw,HKa. nOJle кода onepau.HH может также СО,lJ,ерЖать нмя макроса. Макрос  зто rpynna коман,lJ,Ю npeABa pHTeJlbHO onpe,lJ,eJleHHa nОJlьзоватеJlем н Н,lJ,ентнсрнu.нруемая YHHKaJlbHO JleKCeMO нлн именем. Ко,lJ, оnерацнн может nнсаться как С ИСnОJlьзов.С1ннем СТр04НЫХ, так н заrлавных букв, О,lJ,нако в 60JlbWe 4астн зтой KHHrH HCnOJlb3YIOT'C заrJlавные 6уквы, 4т06ы нз6е жать oWH60K в np04TeHHH 6уквы "1" н u.исрры "1". Так, напрйМер, npH НСnОJlьзованнн СТР04НЫХ 6укв комаН,lJ,а movlw может 6ыть неверно nрочнтана как mov1w, в то BpeM как MOVLWTPY,lJ,HO СПуТать С MOV1W. IDЕ НСnОJlьзует WPHCPT "курьер" npH от06раженнн npo- rpaMMbI, а в зтом wрнфте CTp04Ha 6уква I н цнфра 1 О,lJ,ннаковы. ПО 3TO npH4HHe npH НСnОJlьзованнн СТР04НЫХ 6укв вместе С u.HcppaMH OWH6KH прочтенн 6у,lJ,уТ 06Ы4НЫМ BJleHHeM. 
72 Прнмененне MHKpOKOHтpOnnepOB PIC 18 Операнд. поле операнда указывает ннсрормаLJ.L4Ю, с KOTOPO ,lJ,oJl>KНa ра60тать onepau.H, за ,lJ,a8aeM КО,lJ,ОМ onepaLJ.L4H. Оно размещаеТCfl справа от ко,о,а оnерсщнн н может 6ыть пустым либо СО,lJ,ер>кэть Jlю6ое 4HCJlO nOJle, раздеJlенных заnтымн. Ta6JlHцa 2.6 ,lJ,емонстрнрует не- сколько коман,о" которые НСnОJlЬ3уюТ pa3JlH4Hoe KOJlH4ecтвO операндов. Комментарий. KOMMeHTapH  это все, что Ha4HHaeTC с CHM80Jla Т04КН с заnто. Все, 4ТО CJle,lJ,yeT nOCJle CHMBOJla Т04КН с заnто, HrHopHpyeTc .0.0 конца строкн. Каждая строка KOMMeHTapH ,lJ,ОJlжна Ha4HHaTbC CHMBOJlOM Т04КН с заnто, поскольку 13 Ас- сем6лере нет cnoc06a nРО,lJ,ОJlженн KOMMeHTapH 8 HeCKOJlbKHX строках, как зто воз- можно В ,lJ,pyrHx зыках. Xopowa nрактнка nporpaMMHp08aHH связана с KOMMeHTHpo ваннем ceKu.H nporpaMMHoro КО,lJ,а, а не OT,lJ,eJlbHbIX коман,lJ,. Так>ке xopowe npaKTHKo Я8лется раЗ,lJ,еJlенне ceKu.H КО,lJ,а по KpaHe мере O,lJ,HO nYCTO CTpOKO. Xopowa nрактнка комментнровання н nроrраммнровання может 6ыть nРОНЛЛlOСТРНР08ана уже рассмотренным намн npHMepoM 2.6. 06ратнте вннманне на то, 4ТО Ka>Kдa nporpaMM ная секu.ня в нем OT,lJ,eJleHa от ,lJ,pyrHx nYCTbIMH н KOMMeHTapHMH с НСnОJlьзованнем CHM 80JlOB точкн С запятой. Это важно, nOCKOJlbKY язык ACCeM6Jlepa неnрозра4ен н KOMMeH тарнн nOMoralOT понять значенне nporpaMMHoro КО,lJ,а. Директивы ДиреКТИВbI - этн сnецнаJlьные коман,lJ,Ы acceM6Jlepy, которые MoryT от06ражаться, а MOryт н не от06ражаться на MawHHHbI КО,lJ,. Анректнвы KJlaCCHcpHu.HPYIOTC по нх cpYHK u.HM Н 06ъсняются В это KHHre в соответствнн с нх срункцнонаJlЬНЫМН rpynnaMH. Ce 4ас мы рассмотрнм не все ,lJ,нректнвы, - некоторые I:1з ннх 6уДуТ рассмотрены позже. В 3ТОМ nО,lJ,раЗ,lJ,еJlе мы рассмотрнм ,lJ,нректнвы, которые HaH60Jlee 4асто НСnОJlЬЗУIOТС npH nporpaMMHpOBaHHH. Таблица 2.6. npHMepbI onepaH,lJ,08 некоторых комаllД Код операции с операндами Комментарий RETURN MOVLW ОхОО MOVFF OxlO,Oxll DЕ 1, 2, 4 , 6, 9 CALL HomeET Оrrеранд отсутствует ОАМН orrepaHA (ОхОО) Ba оrrеранда (OxlO М Ox11) HeCKOnbKO orrepaHAoB ОДМН оrrеранд Таблица 2.7. Анректнвы 06ъектных cpaJlOB Директива ACCESS OVR СОDЕ СОDЕРАСК EXTERN GLOBAL IDATA IDATA ACS UDATA UDATA ACS ОDАТА OVR Комментарий Оверnеный достуrr к озу 06ъектноrо фаnа Haqano 6noKa rrроrраммноrо КОАа Haqano yrraKoBaHHoro 6noKa КОАа 06ЪRВnRет, qTO метка orrpeAeneHa в каком-то ApyroM nроrраммном модуnе 06ЪRВnRет, qTO метка AocTyrrHa ApyrMM nроrраммным МОАУЛRМ Наqинает ceKUM дaHHX мнмuмаnмзаuмм Наqинает секци дaHHX мнмuмаnмзаuим в озу AocTyna Наqинает ceKЦM дaHHX мнмuиаnмзацим Наqинает секци Аанных мниuиаnизаuии достуrrа Наqинает ceKUM оверnейнх дaHHX мниuмаnмзаuмм 
rnaBa 2. Архнтектура семейства PIC18 н разработка nporpaMM 73 Директивы объектноrо файла ynpaBJlIOT тем, как acceM6Jlep reHepHpyeT КО,lJ, в 06ъ ектном фале. 06ратнтесь, вновь, к npHMepy 2.6, н 06ратнте вннманне на то, 4ТО HeKO торые ,lJ,нректнвы ynpaBJlIOT cnoc060M, которым создаетс 06ъeKTHЫ cpaJl. Ta6Jl. 2.7 nepe4HCJleT MHorHe нз ,lJ,нректнв 06ъектноrо cpaJla. HaH60Jlee 06Ы4НЫМН ,lJ,нректнвамн 06ъектноrо фаJlа BJlIOTC ,lJ,нректнвы СООЕ, UDATA н UDATAACS. Анректнва СООЕ onpe,lJ,eJleT раЗJlН4ные секцнн nporpaMMHoro КО,lJ,а. Метка в ,lJ,анном CJlY4ae 6У,lJ,ет нменем ceKu.HH nporpaMMHoro КО,lJ,а, OnepaH,lJ,  зто a6COJlIOTHbI адрес секцнн nporpaMMHoro КО,lJ,а. HanpHMep, 4т06ы nOMecTHTb код по aд ресу вектора с6роса, НСnОJlьзуте оператор RESET _ VECTOR СООЕ ОхОООО, как зто no казано в npHMepe 2.6. 3та днректнва ннсрормнрует ассем6лер о том, 4ТО вектор с6роса Ha4HHaeTC по адресу nporpaMMbI ОхОООО. ECJlH ,lJ,нректнва СООЕ нсnользуетс 6ез MeT кн лн60 операнда, то Tor,lJ,a ceKЦHe КО,lJ,а 06Ы4НО 6У,lJ,ет OCHOBHO текст nporpaMMbI н acceM6Jlep сам onpe,lJ,eJleT адрес. npHMep 2.8 показывает то, как ,lJ,нректнва СООЕ MO жет НСnОJlьзоватьс в снстеме npH разра60тке nporpaMM. Пример 2.8 RESETS HERE GOTO HIGH INT GOTO LOW INT СОDЕ ОхОООО Му Stuff СОDЕ ОхОО08 HighInterrupt СОDЕ ОхОО18 ;rro С6росу rrepeXOA CAa ;всокоnрморитетное npepblBaHMe ;HM3KonpMopMTeTHoe npepBaHMe GOTO LowInterrupt СОDЕ ;КОА 6ез nреАваритеnьно onpeAeneHHoro аАреса HighInterrupt: ; **** CAa заНОСМТСR КОА 06ра60ТКМ BblCOKonpMopMTeTHoro npepBaHMR **** Lowlnterrupt: **** CAa заНОСМТСR КОА 06ра60ТКМ нмзкоrrрмормтетноrо npepBaHMR **** MyStuff: **** CAa заНОСМТСR КОА rrрмnоеНИR **** ЕНD ;KOHeu фаnа Анректнвы UDATA н UDATAACS резервнруlOТ пространство в nамятн данных для переменных. nporpaMMbI HaMHoro Jler4e 4нта1OТСЯ, eCJlH в ннх меткн, а не 4нслоые aд реса НСnОJlЬЗУIOТС д,л H,lJ,eHTHcpHЦHpOBaHH адресов naMTH ,lJ,анных. nOCMOTpHTe вновь прнмер 2.6 н 06ратнте вннманне на то, 4ТО 06JlaCTb naMTH зарезервнрована AflЯ трех переменных ,lJ,HpeКТHBO UDATA. Эта 06JlaCTb Ha4HHaeTC по адресу perHCTpa ,lJ,анных ОхО80, кроме Toro 06JlaCTb naMTH д,ля O,lJ,HO nepeMeHHo оnре,lJ,елена ,lJ,HpeKTHBO UDATAACS. Эта 06JlaCTb на4ннается по адресу perHcTpa ,lJ,анных ОхООО. Не за6ывате, что память 6анка ,lJ,ocryna (ACS в ,lJ,нректнве) HaXO,lJ,HTC по адресам perHCTpoB от ОхООО ДО Ox7F. Остальна 4асть 6анка ,lJ,OcTyna СО,lJ,ержнт спецнаJlьные срункцнональные perH- стры, размещенные по адресам от OxF80 .0.0 OxFFF, как зто оnре,lJ,елено ,lJ,HpeКТHBO UDATA. Анректнвы IDАТА н IDATAACS nохожн на ,lJ,нректнвы UDATA н UDATAACS, за HC КЛЮ4еннем Toro, 4ТО онн НСnОJlЬЗУIOТС AfI нннцналнзацнн naMTH ,lJ,аннымн вместо резервнрованн пространства naMTH. Microchip отме4ает, 4ТО ,lJ,нректнвы IDАТА н IDATAACS MOryT не CPYHKu.HoHHpoBaTb корректно в CJlY4ae НСnОJlьзованн 3MYJlTopa. ПО это npH4HHe онн не ,lJ,ОJlЖНЫ НСnОJlьзоватьс AfI нннцнаJlнзацнн ,lJ,анных. Еслн вам He оБХО,lJ,нмо разместнть ,lJ,анные в памтн, наnншнте nporpaMMHbI КО,lJ" KOTOpЫ нннциа лнзнрует ,lJ,анные. Днректнва СООЕ так>ке НСnОJlьзуетс AflЯ нннцнаJlнзаu.нн naMTH ,lJ,анных эсnnзу, как nоказано в npHMepe 2.6. npH сохраненнн ,lJ,анных в зсnnзу нсnользуте 
74 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 адреса от OxFOOOOO, как nоказано в npHMepe 2.9. У6е,lJ,нтесь в том, 4ТО вы НСnОJlьзуете ,lJ,нректнву IDЕ AfI сохранення ,lJ,анных в 3СnnЗУ, как 06 зтом rOBOpHJlOCb в rJlaBe 1. 06 ратнте вннманне на то, 4ТО адрес OxFOOOOO не ЯВJlяется а,lJ,ресом в naMTH nporpaMM, он так>ке не BJleTC реальным адресом 3СnnЗУ. 3то а,lJ,рес, KOTOpЫ снrналнзнрует IDЕ, 4ТО 3ТО данные AflЯ ЭСnnЗУ  н HH4ero 60Jlbwe. Пример 2.9 EEPROM МЕМ СОDЕ OxFOOOOO DЕ "This is for my EEPROM!", О ;HyneBaR строка CcTMnR Директивы управления. ДиреКТИВbI управления BJlIOTC cJle,lJ,YIOw,e HaH60Jlee pac npocTpaHeHHO rpynno ,lJ,нректнв ACCeM6Jlepa, которые ynpaBJlIOT acceM6JlepOM, а так>ке, н Hor,lJ,a, н nроцессом компоновкн. HaH60Jlee pacnpocTpaHeHHbIMH ВЛlOтся CJle ,lJ,УlOщне ynpaBJlIOw,He ,lJ,нректнвы: #include, end, processor, equ н set. Ta6Jl. 2.8 nepe 4НСJlяет ,lJ,нректнвы уnраВJlення MHKpOKOHTpOJlJlepOB PIC. Не все ,lJ,нректнвы ynpaBJleHH рассмотрены З,lJ,есь, а TOJlbKO те, которые наи60лее 4асто НСnОJlЬЗУIOТС npH nporpaMMHpOBaHHH. БОJlее nOJlHOe OnHcaHHe ,lJ,нректнв ynpaB JleHH, не рассмотренных в ,lJ,aHHO KHHre, 06paw,aTecb к ,lJ,окументацнн на Ассемблер MPASM, которая размеw,ена на caTe срнрмы Microchip. Анректнва #include BKJl104aeT cpaJlbI КО,lJ,ОВ, 4асто называемые cpaJlaMH заrолов ков, зыка С. npHMep 2.6 показывает npHMep ее НСnОЛЬЗ0вання, KOr,lJ,a она nрнменяется AfI ,lJ,06aBJleHH СО,lJ,ержнмоrо cpaJla P18F1320.INC к JlHCTHHry КО,lJ,ОВ. ФаJl P18P1320.INC  3ТО BKJl104aeMbI фаJl, KOTOpЫ содержнт ннсрормацнlO (в ОСНОl3ном, 3ТО ,lJ,нректнвы equ), KOTopa onpe,lJ,eJleT консрнrурацнlO PIC18P1 320 н ero perHCTp013, а так>ке СО,lJ,ержнт друrylO ннсрормацнlO о MHKpOKOHTpOJlJlepe. Анректнва end, XOT 3ТО н может nоказаться ннтунтнвно CHЫM, ,lJ,олжна nOMe w,аться в конце фала nporpaMMbI. ECJlH 3Toro не сделать, то cpaJl не будет ассемблн- pOBaTbC. Не nOMew,aTe ,lJ,нректнву end во BKJl104aeMbI срал, нбо в зтом СЛУ4ае про u.ecc ассем6лнрованн, называемы построеннем, останоl3НТС в конце I3KJlI04aeMoro cpaJla. Анректнва end ВJlется CHrHaJlOM acceM6Jlepy заверwнть процесс ассемблнро вання, n03ToMY HH4ero, 4ТО СJlедует nOCJle 3TO ,lJ,нректнвы, не БУ,lJ,ет охва4ено зтнм про цессом. Анректнва processor, KOTopa Н,lJ,ентнфнцнрует npou.eccop, нсnользуется с фа лом nроекта,  она может НСnОJlьзоватьс, а может н не НСnОЛЬЗQ[3аТЬС 13 зтом срале. ECJlH THn npou.eccopa вы6ран в ceKu.HH консрнryрнровання IDЕ, то нет не06ходимостн I3KJl104aTb 3ТУ ,lJ,нректнву в cpaJl nporpaMMbI. Во MHorHX СJlУ4аях ,lJ,нректнва processor не BKJlI04aeTC в cpaJl nporpaMMbI. Анректнва equ HJlH ,lJ,нректнва 3KBHBaJleHTHOCTH YCTaHaBJlHBaeT зквнвanенТlIOСТЬ зна4ення нлн меткн друrо метке. Еслн вы npocMOTpHTe О,lJ,НН нз cpaJlOI3 заrОJlОI3КОI3, nре,lJ,оставляемых IDЕ, то сможете заметнть, 4ТО в ннх HCnOnb3YIOTc MHoro днректн13 equ, nрнравннваlOЩНХ а,lJ,реса СФР меткам. HanpHMep, WREG npHpal3HHl3aeTC OxFES, n03ToMyWREG может 6ыть НСnОJlьзован в nporpaMMe по нменн, а не по номеру. ФаJlЫ BKJlI04eHH н ,lJ,нректнвы equ ,lJ,елаlOТ nporpaMMbI на зыке ACCeM6Jlepa 60Jlee JlerKHMH AflЯ HanHcaHH н np04TeHH. 
rnaBa 2. Архнтектура семейства PIC18 н разработка проrpамм 75 Таблица 2.8. Днректнвы ynpaBJleHH Директива #define #include #undefine Constant End Equ Org Processor Radix Set Variable Комментарий OnpeAenReT текстовое замеенме меткм BKnqaeT МСХОАНЫЙ an YAanReT замеенме меткм OnpeAenReT cMMBonbHY константу KOHeu nporpaM (не06ХОАмма) Ормравнмвает константу 3аАает HaqanO 6noKa B6MpaeT TMn npoueccopa Спеuммuмрует мсnоnьзуемое по YM0nqaHM основанме CMCTe CqMCneHMR OnpeAenReT nepeMeHHY AcceM6nepa OnpeAenReT CMMBonbHY nepeMeHHY Таблица 2.9. nеречень ,lJ,нректнв Директива error errorlevel list messg nolist page space subtitle title Комментарий BAaeT co06eHMe 06 ошм6ке 3аАает уровень co06eHMR 06 ошм6ке YCTaHaBnMBaeT TMn npoueccopa м BxoAHoro ana, а Tae MHe мсhоnьзуеме по YM0nqaHM знаqеНМR AnR nроrраммноrо nMCTMHra 3аАает nOnb30BaTenbCKoe co06eHMe OTKnqaeT nMcTMHr ВВОАМТ HOBY CTP?HMUY nMcTMHra BCTaBnReT nYCTY строку в nMCTMHr CneUMMUMpyeT nОАзаrоnовок nporpaM CneUMMUMpyeT названме rrporpa Днректнва set нсnользуетс AfI установкн метки, эквнвалентно зна4еннlO, KOTO рое может 6ыть нзменено позже nocpe,lJ,CTBOM HOBO установки зна4енн это же меlКИ. Днректнва set нсnользуетс менее 4асто при nроrраммированнн, 4ем ,lJ,нректнва equ, прн этом по ,lJ,eCTBHIO она похожа на ,lJ,нректнву equ. Директива List. Днректнва list nре,lJ,назна4ена AfI уnравленн npou.eccoM cpopMHpOBa НИ лнстннrа. Та6л. 2.9 nере4нслет HMelOw,Hec ,lJ,нректнвы ynpaBJleHH JlHCTHHrOM. Сре,lJ,Н всех этнх ,lJ,нректнв 4aw,e Bcero НСnОJlьзуетс ,lJ,нректнва list. Днректнва list ynpaB ляет 06W,HM npou.eccoM cpopMHpOBaHH JlHCTHHra AfI выбранноrо MHKponpou.eccopa. Повлетс co06w,eHHe, как в npHMepe 2.6, в котором в ка4естве THna npou.eccopa AfI лнстннrа YCTaHOBJleHO P=18F1320, а F=INHX32 BbI6HpaeTTHn BbIXO,lJ,HOrO срала. В ,lJ,анном npHMepe BЫXO,lJ,HO cpaJl нмеет 32-разр,lJ,НЫ weCTHaдu.aTHpH4HbI срорма Intel. Директивы управления данными. Днректнвы уnравленн ,lJ,аннымн, которые onHcbIBalOT данные, nОВЛlOтс в nporpaMMax во MHorHX местах. Онн, nOBH,lJ,HMOMY, ВЛlOтс HaH более нсnользуемым THnoM ,lJ,нректнв ACCeM6Jlepa. MHorHe нз ннх 6ыли onHcaHbI в rлаве 1 npH оnре,lJ,еленнн ,lJ,анных, некоторые OnHCbIBaIOTc З,lJ,есь. Днректнвы уnравленн даннымн в 06w,eM СЛУ4ае onpe,lJ,eJlIOT THn данных. Смотрнте Ta6Jl. 2.10, в KOTOpO ne pe4HCJleHbI ,lJ,нректнвы ynpaBJleHH ,lJ,аннымн 
76 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Таблица 2.10. Днрективы уnравленн даннымн Директива badram badrom config config . idloca maxram maxrom cblock da data db de dt dw endc fill res Комментарий MAeHTMMUMPyeT нереаnмзованное ОЗУ MAeHTMMUMpyeT нереаnмзованное DЗУ YCTaHaBnMBaeT 6MT KOHMrypMpoBaHMR npoueccopa YCTaHaBnMBaeT 6MT KOHMrYPMpoBaHMR npoueccopa в ceMeCTBe PIC18 YCTaHaBnMBaeT знаqенме RqeeK naMRTM MAeHTMMKaUMM npoueccopa YCTaHaBnMBaeT MaKcMManbH 06ъем ОЗУ YCTaHaBnMBaeT MaKcMManbH 06ъем DЗУ OnpeAenReT 6noK nOCTORHHX AaHHX CoxpaHReT строкм в naMRTM nporpaMM (PIC12/16) СОЗАает qMCneHHe м TeKCTOBe AaHHe OnpeAenReT 6aT OnpeAenReT AaHHe ЭСDDЗУ OnpeAenReT Ta6nMU (PIC16/12) OnpeAenReT cnoBa Заверwает 6noK aBTOMaTMqeCKMX констант ЗаnОnНRет naMRTb константамм Резервмрует naMRTb HaH60Jlee 4асто НСnОJlьзуемымн ,lJ,нректнвамн ynpaBJleHH ,lJ,аннымн в ceMeCTBe PIC 18 BJlIOTC: db, de, dw н res, как это onHCbIBaJlOCb в rnaBe 1. E.o.HHCTBeHHO друrо 4асто НСnОJlьзуемо днректнвой ynpaBJleHH ,lJ,аннымн в nporpaMMo PIC 18 влетс ,lJ,нректнва config. Не nyтaTe ,lJ,нректнву _config с ДHpeKTHBO) config. Директнва config может НСnОJlьзоватьс в ceMeCTBe PIC 18 так, как это nоказано в npHMepe 2.6. 3та ,lJ,H ректнва устанавлнвает KOHcpHrypau.HIO MHKponpou.eccopa AfI nроекта. 3тн 6иты и нх CPYHKu.HH раз6нраlOТС в nосле,lJ,УIOw,нх раЗ,lJ,елах это KHHrH. 2.5. Резюме 1. Архнтектура PIC нсnользует rapBap,lJ,cкylO apXHTeкrypy, раЗ,lJ,ел naMTb npo rpaMM н naMTb ,lJ,анных. Назна4еннем ,lJ,aHHO архнтектуры влетс 60лее зсрсректив ное BbInOJlHeHHe nporpaMM. 2. PIC  это caMO,lJ,OCTaT04Ha KOMnblOTepHa снстема, cO,lJ,ep>Kaw,a naMTb н уст  pOCTBa BBO,lJ,aBЫBO,lJ,a. 3то сннжает стонмость реаJlнзацнн снстем. 3. naMTb nporpaMM, ,lJ,ocТYnHa в PIC, нмеет 06ъем от 4К 6aT .0.0 128К 6aT, в за внснмостн от YCTpOCTBa ,lJ,aHHoro ceMeCTBa, BbI6paHHoro AfI реалнзацнн nрнложени. Всле,lJ,ствне Toro, 4ТО 60JlbWHHCTBO коман,lJ, нмеет AflHHY в ,lJ,ва 6aTa, это 06есnе4ивает возможность ИСnОJlьзованн в nporpaMMax от 2К .0.0 64К коман,lJ,. Bc naMTb nporpaMM ,lJ,oCТYnHa 4ерез 21-разр,lJ,НУIO aдpecau.HIO. 4. naMTb nporpaMM opraHH30BaHa в perHCTpOBbI срал. Bc naMTb ,lJ,анных нмеет разр,lJ,НОСТЬ в 8 6нт Н нзмен'етс по 06ъему от 256 .0.0 3840 6aT nJlIOC ,lJ,оnолннтеJlьные 128 6aT AfI сnеu.нальных срункu.нональных perHcTpoB. Bc naMTb ,lJ,анных a,lJ,pecyeTC 4ерез 12-разр,lJ,НЫ адрес. 5. Сnецнальные СРункu.нональные perHCTpbI (СФР) НСnОЛЬЗУIOТС как pa604H pe rHCTp (W); AfI СО,lJ,ер>канне nронзве,lJ,енн nOCJle YMHO>KeHH (perHCTpbI nронзведенн); и M KOCBeHHO aдpecau.HH perHCTpoB ,lJ,анных 4ерез perHCTpbI вы60ра сралов (FSR), 6и тов COCTOHH В perHCTpe COCTOHH, а так>ке С4еТ4нка коман,lJ, AfI nросле>кнвани хода выnолненн nporpaMMbI. V1MeeTC так>ке MHoro ,lJ,pyrHx СФР, нсnользуемых,lJ,Jl уnравле ния YCTpOCTBaMH BBO,lJ,aBЫBO,lJ,a МНКрОКОНТрОЛJlера, как это 6удет 06CY)I(ДaTbC в no 
rnaBa 2. Архнтектура семейства PIC 18 н разработка проrpамм 77 сле,lJ,УIOw,их rлавах. 6. Направление nepeMew,eHH ,lJ,анных AfI порта BBO,lJ,a-ВЫВО,lJ,а nporpaMMHpyeTc 4ерез perHCTp TRIS порта, npH этом лоrН4еска 1 nporpaMMHpyeT cooTBeTcTBYIOW,H 6нт как вход, а О  как ВЫХО,lJ,. порт А НСnОJlьзует TRISA, порт В НСnОJlьзует TRISB н Т.,lJ,. 7. Аанные C4HTbIBaIOTC лн60 заnнсываlOТС 4ерез WTbIPbKH BBO,lJ,aBЫBO,lJ,a, HC nользу perHcTp РОАТА AfI perHcTpa А нлн РОАТВ AfI порта В. 8. Снстема разра60ТКИ nporpaMM, нсnользуема ДЛ rенернровани nporpaMM AflЯ микроконтроллеров PIC, называетс HHTerpHpoBaHHo cpe,lJ,O разра60ТКН ИJlН IDЕ. IDЕ предоставляет редактор AfI ВВО,lJ,а nporpaMMHoro КО,lJ,а, доступ к nporpaMMaTopy AfI nporpaMMHpoBaHH кода в МНКРОКОНТРОЛJlер PIC, ,lJ,ocтyn к ВНуТрнсхемному эмул тору, а так>ке ,lJ,OCTYn к нмнтатору, nОЗВОЛIOw,ему выnолнть эмулu.ИIO nporpaMMbI на персональном KOMnblOTepe. 9. IDЕ нннu.налнзнруетс AfI HOBoro npoena noCpe,lJ,CTBoM вы60ра THna npou.ec сора нз MeHIO ConfigurejSelect Device (КонсрнryрироватьjВы6рать YCTPOCTBO), а TaK же noCpe,lJ,CTBoM запуска мастера npoenoB  cooTBeTCTBYIOw,a nознu.н HaXOДHTC в развора4нваlOw,емс MeHIO nознu.нн rJlaBHoro MeHIO Project (npoeKT). 10. Оператор зыка Ассем6лера COCTaBJleH нз 4етырех nоле: метка, КО,lJ, опера- цин, onepaH,lJ, н KOMMeHTapH. 11. поле меткн  это C\I1MВOnbНbI адрес naмяIVI, npe,DJ-ia3Нa4eННbIе ,lJJlЯ и.центифнu.ированн я-JeЙЮtI naмяIVI. Меткэ,D,OЛ>KНa нCПOJlЬЗОВаТЬСЯТOJlЬКО, еслн Я4еЙка,D,OЛ>KНa а,ОРеСОВаТЬСЯ и3 nporpaмMbl. 12. Поле кода оnерацин СО,lJ,ержит команду мнкроконтроллера HJlH .циректнву acceM6Jle ра. Код оnераu,ин дает комаНду микраКОнтрОJlЛеру BbInOJlHHТb kakylO-лн60 оnераu,иlO. 13. Поле операнда содержит ннсрормациlO, нсnользуемую кодом оnераu,ии ДJl выnолнени ICOман,ЦЫ. Операндом может 6ьпь HM реrистра, адрес ОЗУ данных, 4HCJleHHoe зна4ение и Т.Д. 14. Поле KOMMeHTapH не 06pa6aTЫBaeTC acceM6JlepOM, О,lJ,нако оно npe,lJ,oCTaB ляет nporpaMMHCТY мето,lJ, KOMMeHTHpOBaHH 6JlOKOB КО,lJ,а с тем, 4т06ы nporpaMMa стала более 4ита6еJlЬНО. 15. Анректнва  это комаН,lJ,а ассем6леру HJlH KOMnOHOBw,HKY, KOTopa 4асто не re- нернрует никаких КО,lJ,ОВ В naMTH nporpaMM лн60 naMTH ,lJ,анных. Днректнвы ynpow,alOT зада4У HanHcaHH nporpaMMbI. 2.6. Вопросы и задания 1. На рисунке 2.1 мнкроконтроллерна снстема не СО,lJ,ержнт naMTH. r,lJ,e разме щена в He naMTb MHKPOKOHTpOJlJlepa? 2. Что такое rapBap,lJ,CKa архнтектура? 3. Сравннте rapBap,lJ,CKYIO архнтектуру с apXHTeктypo срон HeMaHa. 4. Что такое KOHBeepHa 06ра60тка ннсрормацнн н как она nOBbIwaeT эсрсректнв ность BbInOJlHeHH nporpaMMbI? 5. naMTb nporpaMM нмеет разр,lJ,НОСТЬ B6HTOB. 6. naMTb ,lJ,анных нмеет разр,lJ,НОСТЬ B6HTOB. 7. Что такое nepBbI н nосле,lJ,НН а,lJ,реса В naMTH nporpaMM PIC? 8. Что такое nepBbI н nосле,lJ,НН а,lJ,реса В naMTH ,lJ,анных 9. naMTb nporpaMM НСnОJlьзует адрес В разр,lJ,ОВ В ceMeCTBe PIC 18. 10. Адрес ,lJ,анных в ceMeCTBe Р1С18 BJleTC  разр,lJ,НЫМ а,lJ,ресом. 11. В 4ем разннu.а М8>КДУ 18F cepHe PIC н 18С cepHe PIC? 12. ECJlH HMeeTC 3СПnЗУ в Р1С18, r,lJ,e оно расположено н как a,lJ,pecyeTC? 13. Еслн PIC18F6620 НСnОJlьзуетс npH разра60тке снстемы, ero адреса nамти nporpaMM на4инаlOТС с  н закаН4иваlOТС . 14. Еслн PIC18F442 НСnОJlьзуетс npH разра60тке системы, ero адреса nамти nporpaMM Ha4HHaIOTC с  н закаН4нваlOТС . 15. Сколько WeCTHa,lJ,u.aTHpH4HbIX 4eeK naMTH СО,lJ,ержнт naMTb на 12К? 
78 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 16. Если 06ласть 16К nамти Ha4HHaeTC по адресу nамти npOl-рамм ОхОО4000, каким 6У,lJ,ет nOCJle,lJ,HH а,lJ,рес это 06ластн? 17. Какнмн 6у,lJ,уТ на4альны и nосле,lJ,НИ а,lJ,реса naMTH ,lJ,анных в мнкроконтрол- лере 18F452 PIC? 18. r,lJ,e HaXO,lJ,TC perHCTpbI, которые nроrраммируlOТ YCTpOCTBa ввода вывода CLI1CTeMbI? 19. r,lJ,e в naMTH ,lJ,анных HaXO,lJ,TC сnецнальные срункциональные реrнстры 1.3 МНКРОКОНТРОЛJlере PIC? 20. Каково назна4енне pa604ero perHcTpa? 21 . Что такое aKKYMYJlTOp? 22. r,lJ,e раСnОJlожен perHcTp W в мнкроконтроллере PIC? 23. KaKYIO 4асть naMTH PIC 4асто называlOТ perHcTpoBbIM сралом? 24. Каково назна4енне трех perHCTpOB вы60ра сралов в PIC? 25. Каково назна4енне perHCTpoB вы60ра 6анка n04eMY он не06ходнм? 26. r,lJ,e нужно смотреть  не nронзоwел JlH перенос после сложенн? 27. Каково назна4енн 6ита В perHCTpa состони? 28. Что такое perHCTpbI TRIS? 29. Как реrистр ТА1 SB nporpaMMHpyeTc на вы60Р оnерацнн вывода ДЛ 6ито1.3 порта В от О .0.0 2 оnерацнн ВВО,lJ,а AfI WTbIPbKOB ОТ 3 .0.0 7 порта В? 30. Как 4НСЛО Ох33 nepe,lJ,aeTC на WTbIPbKH порта А, еслн порт А заnроrраммиро ван как порт ВЫВО,lJ,а? 31. n04eMY HMeeTC на60Р perHcTpoB AfI nронзве,lJ,енн и r,lJ,e зтн реrистры? 32. CKOJlbKO 86HTHЫX perHCTpoB СО,lJ,ержат С4еТ4НК коман,lJ,? 33. Каково назна4енне С4еТ4нка коман,lJ, н n04eMY он называетс С4еТ4НКОМ? 34. Что такое IDE? 35. KaкylO ннсрормаu.иlO СО,lJ,ержнт cpaJl Wa6JlOHa МНКРОКОНТРОЛJlера? 36. IDE нсnользуетс при разра601;ке nporpaMM, а какне нные зада4Н она может выnолнть ? 37. Что такое мастер nроекта н n04eMY он не06хо,lJ,НМ? 38. Что такое имнтатор? 39. Какне 4етыре 4астн оператора Ассем6лера вы знаете н каково нх назна4енне? 40. В ннжеnрнве,lJ,енных операторах AcceM6Jlepa Н,lJ,ентнсрнu.ируте nол операторов: а. Start: GOTO Heaven Ь. ADDLW Ох29 ;addaOx29 с. Loopy 1: MOVFFWREG, Ох145 ;nepeMew,eHHe 41. Какне Н3 сле,lJ,УIOw,нх меток BJlIOTC ,lJ,onYCTHMbIMH? а. 2РАА Ь. FARAWAY с. FAR_A_WAY d. FarAWay 42. Что такое npou.ecc ассем6лнрованн? 43. Что такое исхо,lJ,НЫ cpaJl? 44. Что такое 06ъeKTHЫ cpaJl? 45. Каково назначенне KOMnoHoBw,HKa? 46. Что такое .Ikr -сраJl? 47. Каково назна4енне ,lJ,нректнвы UDATA? 48. Каково назна4енне ,lJ,нректнвы СООЕ? 49. Анректнва ОЕ нсnользуетс AfI размеw,енн ,lJ,анных в . 50. Что ,lJ,елает ,lJ,нректнва СООЕ Ох1 ООО? 51 . ,lJ,n 4ero в nроекте НСnОJlьзуетс ,lJ,нректнва LIST? 52. Что ,lJ,eJlaeT оператор ОАТА1 RES 2? 53. Что делает комаН,lJ,а GOTO? 
rnaBa 3. Набор коман)]. семейства PIC18 79 rлава з. Набор комаНА семейства PIC18 3то О,lJ,на нз нан60лее важных rлав во Bce это KHHre. В He разъснетс cpYHK u.HoHHpoBaHHe коман,lJ, нз на60ра коман,lJ, мнкроконтроллеров ceMeCTBa PIC18. XOT npH nроrраммнрованни 04ень 4асто НСnОЛЬЗУlOтс зыкн nporpaMMHpoBaHH BbICOKoro ypOBH THna С, важно nOHHMaTb ра60ТУ Ka)l(,lJ,o коман,lJ,Ы, nOCKOJlbКY npH этом ЛУ4wе no- нимаетс ра60та МНКРОКОНТРОJlлера в целом. 3та rJlaBa также ,lJ,емонстрирует оrрани- 4eHH мнкроконтроллера. Ka)l(,lJ,a комаН,lJ,а нлн rpynna команд в ,lJ,aHHO rлаве nредставлетс с ИСnОJlьзова ннем не60ЛЬWНХ nрнложенн, которые Moryт 6ыть вве,lJ,ены н выполнены в IDЕ. 3то no зволет иссле,lJ,овать ра60ТУ коман,lJ, н ЛУ4wе ее nOHTb 6лаrО,lJ,ар нмнтатору IDЕ. В 3TO rлаве развнваlOТС MHorHe Н,lJ,еи н концеnu.нн, которые у>Ке рассматрнвалнсь в rла вах 1 н 2. Как только 6У,lJ,ет nOHT на60Р коман,lJ" в nосле,lJ,УIOw,нх rлавах 6у,lJ,УТ paCCMOT рены nрнложенн, которые ВЫnОЛНlOт ,lJ,ocтyn к YCTpOCTBaM BBO,lJ,a-ВЫВО,lJ,а. nOcJle НЗУ4енн ,lJ,aHHO rлавы вы сможете: 1. OnHcbIBaTb срункцноннрованне режнмов адресацнн, HMelOw,Hxc в микрокон троллере. 2. Аетально OnHCbIBaTb ра60ТУ Ka>K,lJ,O коман,lJ,Ы нз на60ра команд мнкроконтрол лера. 3. Разра6атывать н нмнтировать BbInOJlHeHHe короткнх nporpaMM, НСnОJlЬЗУ IDЕ. 4. Описывать процесс nporpaMMHpoBaHH с НСnОJlьзованнем nporpaMMHbIx KOHCT рукцн . 5. V1сnользовать KOCBeHHYIO адресаu.нlO npH доступе к naMTH данных. 6. V1сnользовать Ta6JlH4HYlO адресацнlO npH ,lJ,ocтyne к naMTH nporpaMM. 7. reHepHpoBaTb н нсnользовать в nporpaMMe макроnоследователы,IOСТН. 3. 1. Литеральные команды nepe,lJ, тем, как нсnользовать коман,lJ,Ы в nporpaMMe, не06хо,lJ,НМО nOHTb режимы адресацнн, которые MOryr нсnользоватьс этнмн комаН,lJ,амн. ДaHHЫ nО,lJ,раЗ,lJ,ел разъ- яснет раЗЛН4ные режнмы aдpeCau.HH, ,lJ,ocТYnHbIe в мнкроконтроллерах ceMeCTBe PIC18, а также cooTBeTcTBYIOw,ee npHMeHeHHe коман,lJ, с нсnользованнем зыка Ассем6- пера. Литеральные команды Лнтеральна aдpecaЦH  это, nовнднмому, caMЫ леrки AflЯ nонимани THn aд pecau.HH, поэтому рассмотрнм ero первым. Лнтерал  это константа, TaKa как 4ИСЛО или ASCIICHMBOJl. БОJlЬWННСТВО нз коман,lJ, с JlHTepaJlbHO a,lJ,pecaЦHe pa60TalOT с pa60 чим perHcTpoM WREG. В Ta6Jl. 3.1 все ,lJ,ocТYnHbIe лнтеральные.'коман,lJ,Ы, HMelOw,Hec в наборе коман,lJ, ceMeCTBa PIC18. Больwннство лнтеральных коман,lJ, НСnОЛЬЗУlOт BTOpO бат 16-тн разр,lJ,НО коман,lJ,Ы AfI xpaHeHH Jlнтеральных ,lJ,анных. ECJlH вам He06XOДH мы 60лее ,lJ,етальные CBe,lJ,eHH относнтельно 4нсленных MaWHHHbIx КО,lJ,ОВ ко ман,lJ" пожа- луйста, 06paw,aTecb к nРНJlоженнlO А, в котором nере4нслены все команды в срормате численноrо MaWHHHoro кода совместно с ,lJ,Pyro nолезно HHcpopMaЦHe о них. 
80 ITpHMeHeHHe MHKpoKoHTponnepoB PIC 18 Таблица з. 1. ЛитераJlьные команды Код Операнд 1 Операнд 2 Примеры Комментарий операции ADDLW Лмтераn ADDLW Ох20 06aBnReT Ох20 к W ADDLW.100 06aBnReT 100 к W ANDLW Лмтераn ANDLW OxOF М OxOF с W ANDLW 15 М 15 деся'rмчноrо С W ANDLW М ABOMqIlOl'O 00001111 С W ObOOOOl 111 IORLW Лмтераn IORLW Ох80 BKn4aee ЮIИ Ох80 С W IORLW 1 BKnqaee J1ЛИ 1 С W LFSR Номер Лмтераn LFSR 0,Ох123 ЗаI'руае'l' FSH.O Ох123 peI'MCTpa FSR LSFR2,Ox10 ЗаI'руает FSR2 Ох010 MOVLB Лмтераn MOVLB 2 ЗаI'руает 2 в BSR MOVLB О ЗаI'руает О в BSR MOVLW Лмтераn MOVLW 3 ЗаI'руает 3 в W MOVLW Ох34 ЗаI'руает Ох34 в W MULLW Лмтераn MULLW .100 YMHoaeT W на 100 MULLW 2 YMHoaeT W на 2 RETLW Лмтераn RETLW 2 Возврат npM W = 2 RETLW Ох2А Возврат W Ох2А SUBLW Лмтераn SUBLW 5 B4MTaHMe W мз 5 SUBLW.19 BqMTaHMe W мз 19 XORLW Лмтераn XORLW 4 МСКn4мтеnьноеJ1ЛМ 4 С W XORLW oxf'O Мскnюqмтеnьное-J1ЛМ OxFO С W 06ратнте вннманне (см. та6л. 3.1), 4ТО HMeeTC не так MHoro лнтеральных коман,lJ" которые CJle,lJ,yeT НЗУ4НТЬ. Первые трн 6уквы 60льwннства лнтеральных команд указы BalOT оnерацнlO, выnолнемуlO KOMaH,lJ,O. Как отме4алось в rлаве 1, ЦN может выnол HTb только несколько onepau.H: АОО (сложенне), AND (лоrН4еское V1), 10R (ВКЛI04аlO w,ee V1ЛV1), MOV (KonHpoBaHHe), MUL (умноженне), SUB (ВЫ4нтанне) и ХОА (HCКnI04H тельное ОА). nOCJle,lJ,HHe ,lJ,ве 6уквы КО,lJ,а onepau.HH ,lJ,alOT ,lJ,ОnОJlннтельнуlO инсрормациlO о команде. HanpHMep, 6уква L указывает на лнтерал, а 6уква W указывает на perHCTp WREG. 3то озна4ает, 4ТО комаН,lJ,а ADDLW CKJla,lJ,bIBaeT JlHTepaJlbHbI операнд С СО,lJ,ержн мы м реrистра WREG. Е,о,ннственнымн комаН,lJ,амн, которые не nРИ,lJ,ерживаlOТС 3TO схемы, ВЛlOтс коман,lJ,Ы LFSR н MOVLB. КомаН,lJ,а LFSR заrружает литерал (06ычно а,lJ,рес perHCTpoBoro срала) в О,lJ,НН нз трех perHCTpoB вы60ра срала FSR, используемых ДЛ KOCBeHHO aдpecau.HH naMTH ,lJ,анных. КомаН,lJ,а MOVLB заrру>Кает perHCTp вы60ра 6анка (BSR) 4НСЛОМ между О, AfI 6анка 0,.0.0 15, AfI 6анка 15. В МНКРОКОНТРОJlлерах PIC на60Р арнсрмеТН4ескнх н лоrН4ескнх коман,lJ, не BJleT c полным. Так, комаН,lJ,а деJlенн в мнкроконтроллерах ceMeCTBa PIC не реалнзована, О,lJ,нако команда умноженн реалнзована. Еслн в снстеме не06хо,lJ,НМО выnолннть де1lе нне, то нужно реалнзовать nporpaMMHoe 06ecne4eHHe, которое peWHT эту зада4У. В 06w,eM СЛУ4ае арнсрмеТН4ескне н лоrН4ескне оnераu.ии нзменIOТ состоянне 6нтов perHCTpa COCTOHH. V1CKJlI04eHHeM влетс команда умноженн, которая не OKa зывает HHKaKoro влннн на 6нты perHCTpa COCTOHH. (BcnoMHHTe, 4ТО 6иты perHCTpa COCTOHH HrpalOT важнуlO роль, nOCKOJlbKY МНКРОКОНТРОJlлер НСnОJlьзует их при nРИII тнн решенн). ,lJ,n НЛJllOстраu.нн нзмененн 6нтов perHCTpa состони может 6ыть BЫ nолнена npoCTa nporpaMMa, nоказанна в npHMepe 3.1. 3та nporpaMMa не BbInOJlHeT столь уж MHoro ра60ТЫ, О,lJ,нако однако содержимое perHCTpa COCTOHH нзменетс 
fnaBa 3. Набор коман)]. семейства PIC 18 81 после выnолненн коман,lJ,Ы ADDLW. В этом npHMepe nporpaMMbI Ox7F nepeMew,aeTC в реrистр WREG KOMaH,lJ,O MOVLW, а затем ,lJ,06aBJleTC 1 к perHCTPY WREG KOMaH,lJ,O ADDLW ДЛ rенерировани суммы, paBHO Ох80, в perHCTpe WREG. Обратнте вннмание на то, как AfI заверwенн nporpaMMbI нсnользуетс комаН,lJ,а GOTO. Всле,lJ,ствие Toro, 4ТО e,lJ,HHCTBeHHa Bew,b, KOTOPYIO выnолнет МНКрОКОНТрОJlлер, заKJl104ается в постоян- ном нзвле4еннн н BbInOJlHeHHH коман,lJ, nporpaMMbI, то TaKa хнтрость, как «GOTO Stop» иноr,lJ,а нсnользуетс AfI заверwенн nporpaMMbI. В ремьном снстемном nporpaMM ном 06ecne4eHHe нет не06хо,lJ,НМОСТН нсnользовать эту YJlOBKY, nOCKOJlbKY 60ЛЬШННСТВО оnерацнонных систем pa60TalOT в режнме HenpepbIBHoro ЦНKJlа по своему нзна4aJlЬНО МУ замыслу. ECJlH операцнонна снстема OCTaHOBHTC, то это npHBe,lJ,eT к сратальной oWH6Ke выnолнення nporpaMMbI. Пример 3.1 MOVLW Ox7F ;Заrрузка w Ox7F ADDLW 1 A06aBneHMe 1 к W stop: GOTO Stop ;stop here nOMeCTHTe этот npOCTO npHMep в wа6лонны cpaJl IDЕ (нсnользуте срал nри мера 2. 6 нз rJlaBbI 2) в ceKu.H 10 , KOTopa нмеет метку Main. npH выnолненнн это npo rpaMMbI от06разнте СО,lJ,ержнмое cneu.HaJlbHbIX срункu.нональных perHCTpOB в MeHIO View (Ви,lJ,) н 06ратнте вннманне на то, что реrистр WREG (по адресу OxFE8) СО,lJ,ержнт Ох80, а реrистр COCTOHH СО,lJ,ержнт Ох1А. Дn просмотра сnеu.ИaJlЬНЫХ CPYHKu.HOHaJlbHbIX perH стров заnустнте nporpaMMY, а затем остановите ее перед просмотром СО,lJ,ержнмоrо Cneu.HaJlbHbIX CPYHKu.HoHaJlbHbIX perHCTpOB. Еслн вы nOCMOTpHTe в ННЖНIOIO 4асть экрана, то УВН,lJ,нте, 4ТО там от06ражаетс СО,lJ,ержнмое perHCTpa W, совместно с ,lJ,Pyro nолез HO HHcpopMau.He. ECJlH вы не остановнте BbInOJlHeHHe nporpaMMbI, то не сможете уви деть nравнльные зна4енн perHCTpOB npH нсnользованни нмнтатора. V1MHTaTOp OTO бра>Кает 06новленнуIO HHcpopMau.HIO TOJlbKO Tor,lJ,a, Kor,lJ,a nporpaMMa остановлена. Зна4енне OxlA в perHCTpe СОСТОЯНН rOBopHT нам о том, 4ТО результат отриu.ате- лен, потому 4ТО 6нт отрнu.ательноrо результата (N) HaXO,lJ,HTC в состонни лоrИ4еское еднннu.ы. Зна4енне Ох80 HJlH 1000 00002 В perHCTpe WREG BJleTC, коне4НО, отрица тельным. BCnOMHHTe, 4ТО самые npaBbIe nTb бнтов perHCTpa COCTOHH СО,lJ,ержат HH дикаторы, О,lJ,ННМ нз которых BJleTC бнт oTpHu.aTeJlbHOrO результата. 3тнмн 6нтамн ЯВJlIOТС N, OV, С, ОС н Z CJleBa направо, Ha4HHa от бнтовой nознu.нн 4. При зна4енни perHCTpa COCTOHH, равном ох1А, N = 1, OV = 1, С = О, ОС = 1 н Z = О. Такое состоние nepe4HCJleHHbIX perHCTpoB 0значает, 4ТО pe3YJlbTaT oTpHu.aTeJleH, HMeJlO место Ilереnол ненне perHCTpa W, переноса не БЫJlО, HMeJl место перенос раЗр,lJ,а nолу6ата, Т.е. no- ловннны перенос. nереnолненне ВОЗННKJlО в этом npHMepe BCJle,lJ,CTBHe Toro, 4ТО +1 (Ох01) 6bIJla дo бавлена к +127 (Ox7F), а реЗУJlьтат равен 128 (Ох80). Макснммьное nоложнтельное число, которое nOMew,aeTC в восьмнразрдном perHCTpe, равно +121 (Ox7F), а макси- MaJlbHOe oTpHu.aTeJlbHOe 4НСЛО равно  128 (Ох80). ECJlH ЛlOба нз названных веЛН4НН npeBbIweHa, то в реЗУJlьтате возннкнет nepenOJlHeHHe. YCJlOBHe nepenOJlHeHH OTHOCHTC только к 4нслам со знаком. ECJlH 4HCJla в ,lJ,анном примере рассматрнвать как 6еззнако- вые, то Ох80, 4ТО равно 6ез знака 128, будет корректным и бнты N н OV perHcTpa co CTOHH не 6у,lJ,УТ нметь HHKaKoro 3Ha4eHH ,lJ,Л pe3YJlbTaTa 6еззнаково оnерацнн. Рис. 3.1 ИЛЛlOстрнрует onepau.HIO СJlоженн (см. npHMep 3.1) и меСТОnОJlожение ,lJ,ВУХ битов переноса. 
82 ITpHMeHeHHe MHKpOKOHTpOnnepOB РI С 18 Пример 3.2 MOVLW 6 ;nеремещает 6 в W SUBLW 5 ;BqMTaeT W ( 6) М3 5 Stop: GOTO Stop Kor,lJ,a вЫnолнетс ВЫ4нтанне, то 6нты COCTOHH переноса (С) н nоловинноrо переноса (ОС) perHCTpa COCTOHH сраКТН4ескн СО,lJ,ержат HHcpopMau.HIO о занмствова ннн (О = занмствованне, 1 = нет занмствованн). Еслн nporpaMMa по npHMepy 3.2 6удет выполнена, то результатом 6У,lJ,ет OxFF в perHCTpe WREG, а perHcTp состонин 6У,lJ,ет СО,lJ,ержать зна4енне, равное Ох10. КомаН,lJ,а SUBLW ВЫ4нтает содержнмое реrистра WREG нз JlитераJlьноrо зна4енн. СОЗ,lJ,аетс вnе4атленне, 4ТО эта onepau.H ВЫnОJlняет c в 06ратном nOp,lJ,Ke  так оно н есть: 06ратнте вннмание на то, как выnолнетс one- раu.и BЫ4HTaHH в этом мнкроконтроллере. В этом СЛУ4ае 6 BЫ4HTaeTC нз 5 н реЗУJlЬ- тат 6удет отриu.ательно e,lJ,HHHu.e нлн OxFF. PerHCTp COCTOHH 6У,lJ,ет иметь еднннu.ы как в 6нте С, так н в 6нте ОС. 3то озна4ает, 4ТО npH выnолненн ,lJ,aHHO оnерацнн BЫ4H TaHH 6ыло не06хо,lJ,НМО занмствованне, как nоказано на рнс. 3.2. с  о 1 1 1 О О О О ОС  + 1 1 1 1 О О О 1 1 О О О О О О О Рис. 3. 1. COCTOHHe 6нтов С н ОС в ХО,lJ,е onepau.HH сложенн по npHMepy 3.1. О==заимствование С ос s. 0000 0010 0000 0011 1 1 1 1 1 1 1 1 Рис. 3.2. Состоянне бнтов С н ОС в ходе onepau.HH сложенн по npHMepy 3.2. Литеральные лоrические команды. V1MeIOTC трн лоrН4ескне лнтеРaJlьные HHCTPYK u.HH: AND (V1), 10R (ВKJllOчающее V1ЛV1) н ХОА (V1СKJlючаlOщее V1ЛV1). Та6лнu.а нстннностн ДЛ всех трех оnераu.нй nоказана на рнсунке 3.3. 3тн onepau.HH ВЫnОЛНIOТС на n06HT HO основе (бнт за бнтом) npH выnолненнн nporpaMMbI. Onepau.H AND 4асто НСnОJlЬЗУ eTC ДЛ выБОР04НО установкн одноrо лнбо 60льwеrо 4нсла 6нтов в HOJlb, потому 4ТО npH выnолненнн onepau.HH v1 с нулем результат BCer,lJ,a 6удет нулевым. Оnераu.и BKJlIO 4alOw,ero V1ЛV1 (IOR) 4асто нсnользуетс ДЛ Bы60p04HO установкн O,lJ,Horo лн60 60ЛЬ- шеrо 4нсла 6нтов в е,lJ,НННЦУ, потому 4ТО npH выnолненнн onepau.HH BKJl104alOw,ero V1ЛV1 с единице реЗУJlьтат BCer,lJ,a 6удет е,lJ,ИНН4НЫМ. Оnерацн HCKJl104alOw,ero V1ЛV1 (ХОА) ce 
rnaBa 3. Набор кома н)]. семейства PIC18 83 лектнвно инвертнрует О,lJ,НН JlH60 HeCKOJlbKO 6нтов Н3 HYJl В e,lJ,HHHu.y, Jlнбо нз e,lJ,HHHu.bI в HOJlb, norOMY 4ТО npH выnолненнн onepau.HH HCKJl104alOw,ero ИЛV1 e,lJ,HHHu.bI с какнм лн60 onepaH,lJ,OM, результатом 6У,lJ,ет HHBepCH этоrо операнда. 3тн трн сракта так>ке НЛЛlOст РИРУlOтс на рнс. 3.3, npH зтом Х нсnользуетс AfI nре,lJ,ставленн Jl1060ro 4HCJla; npH меры nоказываlOТ, как этн onepau.HH МО,lJ,исрнu.НРУlOт 4HCJlO Х. и (Т=А.В) А в Т о о о о ] о ] о о 1 1 1 ХХХХ ХХХХ и 000011]1 0000 ХХХХ Включающее ИЛИ (Т=А+В) А В Т о о о о 1 1 1 О 1 1 1 1 хххх ХХХХ IOR О О О О 1 1 1 ] ХХХХ 1111 Исключаюее ИЛИ (Т==А<:ВВ) А В Т о о о о 1 I 1 О 1 1 1 О ХХХХ ХХХХ XOR О О О О 1 1 1 1 ХХХХ ХХХХ Рис. 3.3. Onepau.H V1, BKJl104alOw,ee V1ЛV1 н HCKJl104alOw,ee V1ЛV1 nре,lJ,nОЛОЖНМ, 4ТО cHтyau.H требует, 4т06ы крание JleBbIe ,lJ,ва 6нта (6нт О и 1) pe rистра WREG ,lJ,ОJlЖНЫ 6ыть установлены в 1, а биты 6 н 7 ,lJ,ОJlЖНЫ 6ыть c6poweHbI в О. Это BbInOJlHeTC nOCpe,lJ,CTBOM HCnOJlb30BaHH коман,lJ,Ы AND, 04Hw,alOw,e 6нты О н 1, а так>ке коман,lJ,Ы ЮR, устанаВJlнваlOw,ей е,lJ,ННН4ное COCTOHHe 6нтов 6 н 7. В при мере 3.3 
84 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 nриводитс не60льwа nporpaMMa, ВЫnОЛНIOw,а эту за,lJ,а4У. В ,lJ,анном СЛУ4ае perHcTp WREG nре>кде Bcero заrружаетс тестовым зна4еннем OxIF. Если nporpaMMa выполн ется под управленнем IDЕ, то СО,lJ,ержнмое perHcTpa WREG нзменетс на ОхОС. Пример 3.3 MOVLW ANDLW IORLW OxIF OxFC ОхСО ;OqMCTKa 6мтов О м 1 ;установка 6мтов 6 м 7 Stop: GOTO Stop в сле,lJ,УIOw,ем npHMepe Tpe6yeTC, 4т06ы самые левые три 6ита perHcTpa W 6ЫJlН ннвертнрованы. 3то BbInOJlHeTC с нсnользованнем onepau.HH ХОА с лнтерanЫ-lЫМ зна 4ением ОхЕО (1110 0000), 4ТО npHBo,lJ,HT к HHBepTHpoBaHHIO KpaHHX левых трех 6итов perHCTpa W. npHMep 3.4 показывает TeCToBYIO nporpaMMY, KoТbpa ннвертирует самые левые TpLl16HTa зна4енн Ох90 (1001 0000). РеЗУJlьтатом влетс Ох70 (0111 0000). Пример 3.4 MOVLW Ох90 XORLW ОхЕО Stop: GOTO Stop ;мнвертмрует neBe 3 6мта Еслн сравннвать 4астоту НСnОJlьзованн всех лоrН4ескнх коман,lJ" то комаН,lJ,а AND 4aw,e Bcero нсnользуетс AfI nporpaMMHpoBaHH MaCKHpOBaHH 6нтов perHCTpoB. Ha при мер, nреДnОJlОЖНМ, 4ТО perHCTp WREG СО,lJ,ержнт 4НСЛО ох4А, не06хо,lJ,НМЫ только 4етыре самых KpaHHX npaBbIx 6ита (А). Как выnолннть маскнрованне 4етырех левых 6итов? Команда ANDLW OxOF сотрет 4 в Ox4F, ссрормнровав ОхОА в ка4естве результа та. АналоrН4НЫМ 06разом, еслн Tpe6YIOTC только 4етыре самых левых 6нта 4, можно использовать коман,lJ,У ANDLWOxFO, CTHpalOw,ylO самые npaBbIe 4 н оставлlOw,уlO Ох40 в perHcTpe W. 3.2. Битовые команды Намн 6bIJlH рассмотрены JlorH4eCKHe оnерацнн. В ,lJ,анном nО,lJ,раЗ,lJ,еле рассматри BaIOTC 6нтовые onepau.HH. 3тн оnерацнн устанавлнваlOТ, c6paCbIBalOT н nереКЛlO4аlOТ COCTOHHe только o,lJ,Horo ОТ,lJ,ельноrо 6нта, в то BpeM как коман,lJ,Ы AND, 10R н ХОА, B лсь 6aTOBЫMH комаН,lJ,амн, MOryr нзменть COCTOHHe как О,lJ,НО, так н несколькнх 6H тов. Та6л. 3.2 nере4нслет 6нтовые команды, реаJlнзованные в ceMeCTBe PIC. Мноrие nримененн мнкроконтроллеров Tpe6YIOT нсnользованн 6нтовых коман,lJ, ,lJ,л уnравле HH и тестированн в nporpaMMe oT,lJ,eJlbHbIX 6нтов. 3то ос06енно сnраведлнво npH срормированнн интерсреса н ynpaBJleHHH YCTpOCTBaMH BBO,lJ,aBЫBO,lJ,a. А-6нт (см. та6л. 3.2) не06хо,lJ,НМ только то r,lJ,a , Kor,lJ,a npH nроrраммироваllНИ на AcceM6Jlepe 4HCJleHHbI адрес perHcTpoBoro cpaJla нсnользуетс в комаН,lJ,е ДЛ сnецн cpHЦHpOBaHH лн60 6анка досrynа, лн60 perHCTpa вы60ра 6анка. Еслн комаН,lJ,а 06paw,a eTC к perHCTpy по ero нменн JlH60 по нменн 4eKH naMTH вместо 4нсленноrо адреса, то а-6нт в nporpaMMe не НСnОJlьзуетс. 06ратнте вннманне на то, 4ТО в Ta6Jl. 3.2 а6ит не Cneu.HcpHu.HpyeTc, Kor,lJ,a в ка4естве onepaH,lJ,a 1 НСnОJlьзуетс perHcTp WREG. Ас- сем6лер ,lJ,остаТ04НО «ннтеллекryаJlен» AfI TOfO, 4т06ы знать, 4ТО 6анк ,lJ,ocтyna  это то место, r,lJ,e расположен perHCTp WREG, поэтому а-6нт не влетс не06хо,lJ,НМЫМ в KO мандах, которые HMeHYIOT KOHKpeTHЫ perHcTp,  TaKO как WREG. 
fnaBa 3. Набор коман)]. семейства PIC18 85 Таблица 3.2. Бнтовые команды Команда Операнд 1 Операнд2 ОперандЗ Примеры Комментарий BCF PerMCTp Бмт N! а-6мт BCFWREG,7 С6расывает 6мт 7 pePMC'l' ра W BCF Ох10, 1,0 C6paCBaeT 6мт 1 perMcTpa 6анка AocTyna Ох10 BCF Ох10, 1, C6paCBaeT 6мт 1 6анка ACCESS AocTyna BSF PerMcTp Бмт N! a6MT BSFWREG, 1 YCTaHaBnMBaeT 6мт 1 ре-- rMCTpa W BTFSC PerMcTp Бмт N! a6MT BTFSC WREG, 2 ECnM 6и'.r 2 W равен О, ']'0 nponycK cneAYlOe команды BTFSS PerMcTp Бмт N! a6MT BTFSS WREG, 7 ECnM 6мт "7 W равен 1, '1'0 npOnYCK сnедуей KOMaHA BTG PerMCTp Бмт N! a6MT BTG WREG, 4 DepeKn4eHMe (MHBep'l'MpO ванме) 6мта 4 реrистра W An НJlЛlOстрацнн коман,lJ, BCF (04нстка 6нта F) н BSF (установка 6нта F), npLl1 мер 3.3 6ыл npe06pa30BaH в npHMep 3.5 с НСnОЛЬЗ0ваннем 6нтовых коман,lJ, вместо KO ман,lJ, ANDLW н 10RLW. Еслн этн npHMepbI сравннть, то мо>кно отметнть, 4ТО npHMep 3.5 Jlеrче nOHHMaeTC, XOT разннцы в pe3YJlbTaTe нет. Me)l(,lJ,Y этнмн прнмерамн есть He CKonbKO отлнчн; О,lJ,НО нз ннх заКJl104аетс в том, 4ТО 6нтовые коман,lJ,Ы не MO,lJ,HcpHЦH PYIOT perHCTp COCTOHH, вместе с тем коман,lJ,Ы ANDLW н 10RLW MO,lJ,HcpHu.HPYIOT perLl1CTp COCTOHH. Кроме Toro, поскольку H3MeHIOTC COCTOHH пар 6L11TOB, то две 6L11TOBbIe коман,lJ,Ы не06хо,lJ,НМЫ AfI с6роса нлн установкн ,lJ,ВУХ 6нтов. An МО,lJ,нсрнкацнн COCTO- ни несколькнх 6нтов 60лее эсрсректнвно 6У,lJ,ет НСnОЛЬЗ0вать коман,lJ,Ы ANDLW н 10RLW. Пример З.5 MOVLW BCF' BCF BSF BSF GOTO Stop: Ох1Р WREG, О WREG, 1 WREG, 6 WREG, 7 Stop ;с6рос 6мта О ;с6рос 6мта 1 ;установка 6мта 6 ;установка 6мта 7 npHMep 3.6 нсnользует условные 6нтовые команды ДЛЯ установкн 6нта О perHCTpa WREG только Tor,o,a, Kor,o,a 6нт 7 равен О. Команда BTFSS (6нтовое тестнрованне perHCTpa фала н nponYCK в случае установкн) тестнрует 6нт 7 perHcTpa WREG н еслн он в е,lJ,НННЧНОМ COCTOHHH, то сле,lJ,уюw,а команда (BCF) nponycKaeTc. Еслн 6нт 7 perHcTpa WREG HaxO,lJ,HTC в нулевом COCTOHHH, то Tor,o,a коман,о,а BCF выnолнет н устанавлнваетс нулевое значе ние зтоro 6нта. An KOнтpoJl этоro процесс нсnользуте IDЕ н ее нмнтатор. V1сnользуте раЗJlН4ные 3Ha4eHH ДЛ коман,lJ,Ы MOVLW,  такне как Ox7F н OxFF. Пример З.6 MOVLW BTFSS BCF GOTO Ox7F WREG, 7 WREG, О Stop ;заrрузка тестовых данных ;04мстка 6мта О Stop: 
86 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 nре,lJ,nОЛО>КНМ, 4ТО нам не06ХО,lJ,нма nporpaMMa, KOTOPYIO мы 6ы MorJlH НСnОЛЬЗ0 вать С naHeJlblO PICDEM2 PLUS н KOTopa 6ы от06ра>кала Ох05 на свеТО,lJ,НО,lJ,ах, nO,lJ,КnIO 4енных к 6нтам от О .0.0 3 порта В, KOr,lJ,a кнопка, nO,lJ,КnI04eHHa к 6нту 4 порта А не Ha>Ka та. nporpaMMa ,lJ,ол>кна от06ра>кать Ох03, KOr,lJ,a кнопка на>ката. На>катне KHonKH reHepH рует лоrнческн О, в npoTHBHOM СЛУ4ае reHepHpyeTc лоrН4еска 1. npHMep 3.7 110казы вает nporpaMMY, KOTopa выnолнет Эry за,lJ,а4У. Еслн нсnользуетс друrая дeMOHCTpa u.L/10HHa nанель то порты BBO,lJ,a-ВЫВО,lJ,а н nознцнн 6нтов He06xo,lJ,L/1MO откоррокr.L/1роваrъ ДЛ KOHKpeTHO nанелн. порты BBO,lJ,aBЫBO,lJ,a a,lJ,peCYIOTC как РОАТА и РОАТВ при Ilере даче ,lJ,анных. Наnравленне переноса ,lJ,анных AfI 6L/1Ta порта nроrраммнруется Ila выход посредством pa3Mew,eHH нул в cooTBeTCTBYIOw,eM 6нте perHCTpa TRISA ЮIН TRISB, а на вход  nOCpe,lJ,CTBoM размеw,енн 1 в соответствуюw,ем 6нте perHCTpa TRISA нлн TRISB. PerHCTp ADCON 1 nporpaMMHpyeTc на <рункцноннрованне цн<рровых штырьков разме щеНL/1ем Ox7F в perHCTpe ADCON 1 лн60 как аналоrовх штырьков размеw,еннем ОхОО в perHCTp ADCON 1. 06ратнте вннманне на то, 4ТО <рункцноннрованне н cooTBeTCTBYIOw,He значенн заrрузкн perHcTpa ADCON 1 H3MeHIOTC AfI pa3JlH4HbIX 4ленов ceMeCTBa PIC18. Рассматрнваемые 3,lJ,есь nporpaMMbI HanHcaHbI AfI мнкроконтроллера PIC 18F1320. Еслн нсnользуетс ,lJ,pyro мнкроконтроллер, то cooTBeTCTBYIOw,He значе HH MOryr 6ыть ,lJ,pyrHMH, JlH60 perHCTp ADCON 1 мо>кет не НСnОЛЬЗ0ватьс Bo06w,e. Пример 3.7 Main: MOVLW Ox7F MOVWF ADCONl MOVLW ОхОО MOVWF TRISB MOVLW OxFF MOVWF TRISA Main1: MOVLW Ох05 BTFSS PORTA, О MOVLW ОхО3 MOVWF PORTB GOTO Main1 ;06ЪRвnенме всех ПОрТОВ UMpOBM ;rropT В 06ЪRВnRеТСR выходом irropT А 06ЪRВnRеТСR входом ;OCHOBHO nporpaMMH UMKn ;npOBepKa COCTORHMR KHOnKM ;М npOnYCK 3TO команды, eCnM кнопка oTnyeHa ;мзмененме COCTORHMR порта В м свеТОДМОАОВ irrOBTOp ЕСЛL/1 комаН,lJ,а а,lJ,ресует 6нты perHCTpa COCTOHH, то 4асто нсnользуетс HM ДЛ адресаЦL/1Н KOHKpeTHOrO 6нта . HanpHMep, AfI с6роса 6нта переноса нсnользуетс KO маН,lJ,а BCF STATUS, С вместо BCF STATUS,2. 3.3. Байтовые команды Батовые коман,lJ,Ы наи60Jlее мноro4нсленны как в на60ре команд, так н в nporpaMMax. Батовые коман,lJ,Ы 06есnе4нвают возмо>кность НСnОЛЬЗ0ванн в nporpaMMax nepeMeHHbIx .цанных, в то BpeM как JlHTepanbHbIe коман,lJ,Ы 06ecne4HBalOT вОзмО>кность НСnОЛЬЗ0ванн в nporpaMMax nOCTOHHbIX .цанных. В ТИПИ4НОМ cnyчае 6aTOBыe команды HCnOJlb3YlOT perHCTp W, а так>ке 4eкy perHcтpoBoro <райла AflЯ выnолнення како-лн60 оnераu.ин. Ta6JlHu.a 3.1 nере4нслет все 6aTOBыe коман,lJ,Ы с O,lJ,НHM JlH60 ,lJ,Вyм npHMepaMH на команду. Боnьшннст во L/1З зтнк команд HMelOT трн onepaн.цa: первым 06Ы4НО ВJleTC 4eKO perHCTpoBoro <pa- 
rnaBa 3. Набор кома н)]. семейства PIC18 87 ла, BTOPO оnре,lJ,елет 4еку-nрнемннк, а Tpeтн вы6нрает 6анк ,lJ,ocryna HJlH 6анк perHcTpo Boro срала, задаваемы perнcTpoM вы60ра 6анка (BSR). Еслн второй операн,lJ, (d6HT) равен О, то чейкоnрнемннком 6У,lJ,ет perHcTp WREG, а еслн BTOpO onepaH,lJ, равен 1, то чекой npLl1eMHLI1KOM 6У,lJ,ет 4eKa perHcTpoBoro фала. Еслн третнй onepaH,lJ, (a6HT) 6удет равен НУЛIO, то Tor,o,a 6анк ,lJ,ocтyna 6У,lJ,ет НСnОЛЬЗ0ватьс как местоnоло>кенне perLl1CTpOBOro срала (06ычно OxOOO-Ох07F н OxPSO-ОхFFF), а еслн он 6У,lJ,ет равен е,lJ,нннце, то TOr,lJ,a 6анк, onpe ,lJ,елемы BSF, 6У,lJ,ет НСnОЛЬЗ0ватьс в ка4естве месторасnоло>кенн perHcTpoBoro срала. А-6нт Tpe6yeTC TOJlbKO npH aдpecau.нH perHcTpa фала по номеру; еслн ,lJ,ocryn 6У,lJ,ет ocyw,e СТВJlЯТЬС по метке, то а-6нт не 6У,lJ,ет НСnОЛЬЗ0ватьс в команде. ПО УМОЛ4аннIO а = 1. D-БLl1Т не06хо,lJ,НМ только ,lJ,Jl размеw,енн результата onepau.HH в perHcTp WREG; по умолчаннlO d = 1. На 3ЫKe Ассем6лера 6уква W нли F HCnOJlb3YIOTC ,lJ,Jl указанн не06хо,lJ,НМОСТН нс- nОЛЬЗ0ванн d-6нта. Некоторые npHMepbI этоrо nрнводятс в Ta6Jl. 3.3. nредnоло>кнм, 4ТО ,lJ,ва 16разрядных чнсла складываIOТС, CPOpMHPy 16разряднуlO сумму. Ао этоrо nО,lJ,раздеJlа эту onepau.н1O 6ыло BbInOJlHIt1Тb довольно тру.цно, о.цнако 6лаrо,о,а- p тому, 4ТО средн 6aTOBЫX команд нмеется коман.ца CnO>KetM с переносом, сейчас можно 60Jlee леrко складывать.о.ва 4Hcna, которые нмеют 60льше, 4ем 8 разрядов. npHMep 3.8 пока- зывает короткую nporpaMMY, KOTopa складывает 16-разрядное чнcnо, расnоло>кенное в чей ках 6анка ,lJ,ocryna с адресамн Ох1 О н Ох11, с 16-раз.цным 4НСЛОМ, расnоло>кенным в 4eKax 6анка ,lJ,ocryna с aдpecaMLI1 Ох12 н Ох13. 06а этн 4нсла xpaHтc с НСnОJlьзованнем срормата с 06ратным порядком 6айтов, Kor,o,a мnа.цшая 4асть 4Hcna xpaHLI1TC в 4eKe с MeHbWHM номе- ром. Pe3YJlbТaT этоro 16разрядноrо сло>кенн сохранется в чеках 6анка ДОСlуnа Ох14 н Ох15. nporpaMMa кa>KeTC cnншком ,lJ,JlHHHO, о.цнако ее 4асть, KOTopa выnолнет соБСТВG/1l1O сло>кенне (nосле,lJ,нне шесть коман,lJ,) весьма коротка. 06ратнте BHLI1MaHHe на то, как складыва IOTC мnа.цшне 6aTЫ, а затем складываlOТС cтapWHe баты с переносом. V1сnользу зту MeTO ДНКУ, мою складывать 4Hcna Л1060 ,lJ,JlHHbI. Рнс. 3.4 ,lJ,емонстрнрует работу nporpaMMbI, а так>ке то, как нсnользуетс пере нос npH срормнрованнн 16-разрядно суммы. Таблица 3.3. Батовые команды Комама Оnерандl Оnеранд2 OnepaHA3 Opммep Комментармй AODWF perMcTp d6MT а-6мт ADDWF Ox10,W,0 СкnаАРшает W М R4ейку 6анка доступа Ох10, coxpaHReT резуnьтат в W ADDWFOx-10, F,O CкnaдывaeT W М R4eKY банка..' доступа Ох10, coxpaHReT резуnьтат в Rчеке 6анка AOCTyna Ох10 AODWFC perмcTp d-6MT a6MT ADDWFC Ох10,0,0 СкnаАРшает W с переносом с R4eKo 6анка AocTyna Ох10, coxpaHReT pe3YnbTaT в W ADDWFCOx-10, 1, 1 CкnaдывaeT WREG с переносом М Rчеку 6анка BSR Ох10, coxpaHReT резуnьтат в R4e ке 6анка BSR Ох10 ANDWF perмCTp d6MT а-6мт ANDWF Ох10, О, 1 М W с o 6анка Aocтyna Ох10, coxpaHReT резуnьтат в W CLRF perMcTp а-6мт CLRFWREG C6paBaeT W в ОхОО CLRF Ох10, ACCESS 04ищает R4eKY 6анка AOCTY па Ох10 в ОхОО CLRF ВОВ 04ищает R4eKY ВОВ COMF perмcTp d-6MT a6MT COMFWREG ononHeHMe W до 1 COMF Ох10,0,0 ononHeHMe АО еАМНМЦЫ R4e ки 6анка доступа Ох10 
88 ITpHMeHeHHe MHKpoKoHTponnepoB рте 18 КомаНАа Оnерандl Оnеранд2 Оnеранд3 CPFSEQ perMCTp A6MT CPr'SGT perMCTp a6MT CPFSLT perMCTp абмт DECF perмCTp dбит a6MT DECFSZ perMCTp dбмт a6MT DCFSNZ perMCTp dбмт а-6мт INCF perMCTp d6MT a6MT INCFSZ perMCTp d6MT а-6мт INFSNZ perMCTp d-бмт a6MT IORWF perMCTp d6MT a6MT MOVF perMCTp d6MT a6MT МОVП' perMCTp perмCTp source destination MOVWF perMCTp а6ит KorrмpoBaHMe W в R4eKY 6aH ка доступа Ох10 Dр:имер COMF Ох10, 1, 1 CPFSEQ Ох10,0 CPFSEQOxH, 1 CPFSGT Ох12,0 CPFSLT Ох13, 1 DECFWREG DECF Ох10, 0,0 DECF Ох10,1,0 DECFSZ WREG DCFNSZOx10, 1,0 INCFWREG INCF Ох10, 0,0 INCFSZ WREG INFSNZ WREG IORWF Ох10,0,0 MOVF Ох10,0,0 МOVFF WREG, Ох130 MOVWF Ох10,0 KoммeHTapM оnоnненме до eAМHMI.1,bI R4e км 6анка BSR Ох10 Сравненме W с Я4еко 6аllка доступа Ох10 м nponYCK cne-' Аующе команды, ecnм есть равенство Сравненме W с R4eKo 6анка BSR Ох11 м проnуск cneA e KOMaHAPl, естм есть pa венство Сравненме W с Я4еко 6анка BSR Ох12 м nponYCK сnед' e команды, еслм coдep мое R4екм 6анка доступа Ох12 Боnьwе, 4ем WREG Сравненме W с R4eKo 6анка ВSR Ох13 м пропуск cneA e команды, ecnм coдep мое Rчекм 6анка ДОС'l'упа Ох13 MeHbwe, 4ем WREG Taнмe 1 мз W Выqитанме 1 мз R4екм 6анка AOCTyna Ох10 м сохраненме резуnьта'l'а в R4eKe 6анка доступа Ох10 Taнмe 1 мз R4екм 6аllка Аоступа Ох10 м сохраненме резуnьтата в Я4еке 6анка доступа Ох10 eKpeMeHTмpOBaHMe W м про пуск сnеде команды, ecnм резуnьтат HyneBo eкpeмeHTмpOBaHMe R4екм 6анка AocTyna OxIC м npo- пуск сnедующе команды, ecnм резуnьтат не равен О Мнкрементмрованме W. Мнкрементмрованме Я4екм 6анка доступа Ох10 Мнкрементмрованме W м eCnM резуnьтат равен HY, npo пуск cnедующе команды. Мнкрементмрованме W м eCnM резуnьта'l' не равен нул, nponycK сnедующе команды В4ающееИЛИ W С R4eKo 6анка доступа м сохраненме резуnьтата в R4eKe 6анка доступа Ох10 Копированме R4ейки 6анка доступа Ох10 в W Копированме W в Rчеку Ox130 
fnaBa 3. Набор коман)]. семейства PIC18 Комама Оnерандl Оnеранд2 МULWF perMCTp a6MT NEGF RLCF RLNCF RRCF RRNCF SETF SUBFW8 SUBWF SUВWFB SWAPF TSTFSZ XORWF perMCTp perMCTp perMcTp perMcTp perMcTp perMCTp perMCTp реrистр perMcTp реrистр реrистр реrистр а6ит d-6MT d6MT d6MT d6MT a6MT d-6MT d6MT d6MT d-6MT d-6MT d6MT Оnеранд3 Пр:имер МULWF Ох10,0 а-6мт NEGF WREG RLCF WREG 89 комментармй YMHoeнмe W на Rчейку 6анка AocTyna Ох10 м сохраненме nромзвеАеНМR в PRODL м PRODH оnonненме до 2 (oтpмuaнмe) w Цикnмческий сдвмr BneBO W С переносом Цикnмчески сдвмr BneBo W 6ез переноса Цикnмческмй CABMr вправо W С пере носом Цикnмческ:ий CABMr вправо W 6ез пере носа Заrрузка OxFF в W Заrpузка OxFF в R4eKY 6aH ка доступа Oxl1 BTaнмe с заимствованмем Rчеки 6анка доступа Охl0 мз W м сохраненме резуnь'rа. та в Rчеке 6анка доступа Ох10 BTaнмe W мз Rчеки 6анка достynа Охl0 м сохраненме резуnьтата в Rчеке 6анка AocTyna Ох10 ВыtrnTaнмe W м заимствованме мз Rчеки 6анка naMRTM Ох10 м сохраненме резуnьтата в Rчеке 6анка доступа Ох10 Своnинr nony6aToB в W DponycK сnедующе KOMa, ecnм W равен HY МскnающееИЛИ W с R4eKo 6анка доступа Ох10 м coxpa ненме резуnьтата в Rчеке 6анка доступа Ох10  ...;. Oxll Охl0 0000 0001 1 1 1 1 1 1 1 1 Ox13 Ox12 + 0000 0010 I I 0000 О 011 OxlS Ox14 0000 0100 I I 0000 0010 Рис. 3.4. npHMep 16-раЗр,lJ,ноrо сло>кенн. a6MT RLNCF WREG a6MT RRCF WREG а-6мт RRNCF WREG SETF WREG SETF Ох11, ACCESS а-6мт SUBFWB Ох10, 0,0 a6MT SUBWF Ох10,0,0 а-6мт SUВWFB Ох10,0,0 a6MT SWAPF WREG TSTFSZ WREG a6MT XORWF Ох10,0,0 с 
90 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 Пример З.8 MOVLW OxFF MOVWF Ох10 MOVLW ОхО1 MOVWF' Ох11 MOVLW Ох03 MOVWF Ох12 MOVLW Ох02 MOVWF Ox13 MOVF Ох10, W, ACCESS ADDWF Ох12, W, ACCESS MOVWF Ох14 MOVF Ох11, W, ACCESS ADDWFC Ох13, W, ACCESS MOVWF Ох15 Stop: GOTO Stop ;сохраненме OxOIFF ;в Ох10 м Ох11 ;сохраненме Ох0203 ; в Ох12 м Ox13 ;cnoeHMe Ох10 м Ох12 ;сохраненме резуnьтата в Ох14 ;cnoeHMe Ох11 м Ох13 с переносом ;сохраненме pe3YnbTaTa в Ох15 HaMHoro 60лее 4HTa6eJlbHa н леrка в HanHcaHHH BepCH это nporpaMMbI npHBe дена в npHMepe 3.9. Разннца между npHMepoM 3.8 н npHMepoM 3.9 заКЛlOчаетс в том, что ДЛ оnре,lJ,еленн чеек naMTH нсnользуетс ассем6лер, KOTOPЫ делает неНУЖI/ЫМ НСnОЛЬЗ0ванне всех OnepaH,lJ,OB, нсnользованных в npHMepe 3.8. 06ласть UDATA у>ке оnре,lJ,елена в ша6лоне nporpaMMbI н ceKЦH nporpaMMbI по npHMepy 3.9 ,lJ,06авлетс к wа6лону 6ез ,lJ,оnолннтельно ,lJ,нректнвы UDATA (nользовательскне ,lJ,анные). ECJlH ,lJ,ан- ные ,lJ,ол>кны 6ыть pa3Mew,eHbI в 6анке ,lJ,ocryna, то ,lJ,нректнва UDATAACS nepe,lJ, коман- ,lJ,амн RES (резервнровать naMTb). 3то 06ecne4HBaeT возмо>кность вы60ра Toro, r,lJ,e данные 6у,lJ,уТ coxpaHTbC. Аанные, сохраненные в 6анке досrynа, 06ычно нзвлекаlOТС быстрее, поскольку perHcTp вы60ра 6анка не ,lJ,ол>кен HHHu.HaJIH3HpoBaTbc адресом 6анка. Пример З.9 ОDАТА NumIL RES 1 NumlH RES 1 Num2L RES 1 Num2H RES 1 AnsL RES 1 AnsH RES 1 Main: MOVLW Oxff MOVWF NumIL MOVLW Ох01 MOVWF NumlH MOVLW Ох03 MOVWF Num2L MOVLW Ох02 MOVWF Num2H nepeMeHHe, зарезервмрованные по мменм 1-3 ООАТА coxpaHReTc OxOIff в Numi coxpaHReT Ох0203 в Num2 
rnaBa 3. Набор коман)]. семейства PIC 18. 91 MOVF NumIL ADDWF Num2H, W MOVWF AnsL MOVF NumlH ADDWFC Num2H, W MOVWF AnsH 3top: GOTO Stop CKnaAЫBaeT мnадwме 4астм coxpaHReT pe3YnbTaT AnsL ;cKnaABaeT CTapWMe 4астм с переносом ; coxpaHReT резуnьтат в AnsH An выnолненн 16-раЗР,lJ,ноrо BЫ4HTaHH, nporpaMMa по npHMepy 3.9 МО,lJ,НСРН- ЦHpyeTC noCpe,lJ,CTBOM замены коман,lJ, ADDFW н ADDWFC комаН,lJ,амн SUBFW н SUBWFB. Кроме Toro, 4eKH onepaH,lJ,OB реrистровоrо срала ,lJ,олжны 6ыть нзменены ВВН,lJ,У cno с06а, которым ра60тает оnерацн ВЫ4итанн. КомаН,lJ,а BЫ4HTaHH всеrда ВЫЧLl1тает WREG LI13 4eKLI1 perHcTpOBoro <рала, указанно в комаН,lJ,е. npLl1Mep 3.1 О демонстрLl1Ру ет 16-раЗр,lJ,ное вычнтанне. AaHHЫ npHMep НСnОJlьзует те >ке самые оnре,lJ,елеНLI1 дaH ных, что н npHMep 3.9. Пример 3.10 MOVLW OxFF MOVWF NumIL MOVLW ОхО1 MOVWF NumlH MOVLW Ох03 MOVWF Num2L MOVLW Ох02 OVW Num2H MOVF NumIL SUBWF Num2H, W MOVWF AnsL MOVF NumlH SUBWFB Num2H, W MOVWF AnsH Stop: GOTO Stop ;coxpaHReT OxOIFF ;В Num1 ;coxpaHReT Ох0203 ;в Num2 ;B4MTaeT мnaAWMe 4астм ; coxpaHReT pe3YnbTaT AnsL ;B4MTaeT CTapWMe 4астм с заммствованмем ;coxpaHReT резуnьтат в AnsH Циклический сдвиr. На60Р коман,lJ, ceMeCTBa PIC 18 BКnlO4aeT четыре 6aTOBЫX KO ман,lJ,Ы ЦНКnLl14ескоrо C,lJ,BHra. Баты C,lJ,BHraIOTC вправо HJlH влево С переносом, ЛLl1бо 6ез переноса. Рнс. 3.5 НЛJllOстрнрует этн 4етыре коман,lJ,Ы ЦНКnН4ескоrо C,lJ,BHra. О,lJ,НН Н3 мето,lJ,ОВ YMHO>KeHH лн60 ,lJ,еленн свзан С ЦНКnН4еСКLI1М C,lJ,BLI1rOM ЧLl1сел. ECJlH 4НСЛО ЦНKJlН4ескн C,lJ,BHraeTC влево С нулем, nOMew,aeMbIM в самый nравый раз P,lJ" то это зна4НТ, 4ТО 4НСЛО YMHO>KaeTC на коэсрсрнцнент, paBHЫ 2. АнаJlоrLl1ЧНЫМ 06 раЗ0М, eCJlLl1 4HCJlO ЦHКnH4eCKH C,lJ,BHraeTC вправо С нулем, nOMew,aeMbIM в самый левы разр,lJ" то это 3Ha4L11T, 4ТО 4НСЛО ,lJ,eJlHTC на коэсрсрнцнент, paBHЫ 2. An ,lJ,eJleHH се- 
92 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 MeCTBO знаком на ,lJ,ва 6L11T знака ЦLl1КnLl1чеСКLI1 С,lJ,ВLI1rается в самый левы БLl11 результата. Однако, еслн 4НСЛО мо>кет 6ыть умно>кено, лн60 nО,lJ,елеllО на ,lJ,ва, то оно может 6ыть nО,lJ,елено лн60 умножено на ЛlO60е ЧНСJlО. HanpHMep, ДЛ YMHO>KeHH на 5 (nTb равно 4х nлlOС Ix HJlH 1012)' нужно УМНОЖLl1ТI ЧНСJlО на 4 (,lJ,ва ЦLl1КnН4ескнх C,lJ,BHra влево), а затем A06aBLI1Tb к реЗУJlьтату нсходное 4НСЛО. 3та оnераци НЛЛlOстрнруетс npHMepoM 3.11. 3тот npHMep умножает тестовое ЧНСJ10 4, HaXO,lJ,w,eec во WREG, на коэсрсрнцнент 5 н OCTaBJleT результат, paВllbI 20, во WREG. 3та nporpaMMa срункцноннрует корректно, О,lJ,нако комаН,lJ,а умноженн, BXOД- w,a в состав на60ра коман,lJ, PIC, BJleTC 60лее эсрсректнвно. Смотрнте ry же npo rpaMMY, НСnОЛЬ3УIOw,уlO коман,lJ,У MULWP в npHMepe 3.12. Так>ке 06ратнте ШILl1манне в зтой nporpaMMe, как 04Hw,aeTC 6нт переноса npH нсnользованнн команды BCF. n RRNCF h r1 RLNCF  С rtl1 RRCF h С  RLCF h Рис. 3.5. Четыре комс1н,lJ,Ы ЦНКnН4ескоrо C,lJ,BHra Пример 3.11 UDATA ACS Num RES 1 ;perMCTp в 06naCTM доступа UDATA Main: MOVLW 4 ;эаrруэка TeCTOBoro 3Ha4eHMR MOVWF Num ;сохраненме 1х по аАресу Ох10 BCF STATUS, О ;с6рос переноса RLCF WREG ;WREG х 2 BCF STATUS, О RLCF WREG ; WREG х 4 ADDWF Num, О ;WREG х 5 Stop: GOTO Stop 
fnaBa 3. Набор коман)]. семейства PIC18 93 Пример 3.12 ОDАТА ACS Num RES Main: 1 MOVLW 5 MOVWF NUM MOVLW 4 MULWF NUM MOVFF PRODL, WREG Stop: GOTO Stop perMCTp в 06nacTM Аоступа UDATA ;сохраненме 5 в Ох10 ;заrрузка TecToBoro зна4еНМR ;YMHoeHMe на 5 ;занесенме 8-раЗРRдноrо nромзведеНМR во WREG Еслн нужно выnолннть ,lJ,еленне на степень 2, ТО это ,lJ,OCTHraeTC C,lJ,BHrOM 4нсла вправо. npLl1 HCnOJlb30BaHLI1H коман,lJ,Ы ЦНКnН4ескоrо C,lJ,BHra C,lJ,BLI1r вправо выполнетс no- сре,lJ,СТВОМ npe,lJ,BapHTeJlbHO 04НСТКН срлаrа переноса, за которым сле,lJ,ует комаН,lJ,а RRCF. nре,lJ,nОЛО>КНМ, нам ну>кно nоделнть СО,lJ,ержнмое perHCTpa WREG на 8. 3то ,lJ,ОСТН- raeTC посредством трех C,lJ,BHrOB вправо, как это nоказано B.npHMepe 3.13. 06ратнте вннманне, 4ТО резуль тат окруrлетс после Toro, как 06нару>кено B03HHKHOBeHLI1e nepe носа после nосле,lJ,неrо ЦНКnН4ескоrо C,lJ,BHra вправо. Бнт переноса TeCTHpyeTC н ко- манда npOnYCKa по нулlO нсnользуетс AfI npOnYCKa коман,lJ,Ы INCF (ннкремент) в CJlY чае, еслн перенос влетс нулевым. В ,lJ,анном случае 100 деСТН41-юе ,lJ,елнтс на 8 н результат, paBHbl 12.5 OCTaeTC во WREG как 13 (oKpyrJleHHOe 12.5). Больше ннсрорма- ЦНН н nporpaMMbI AfI ,lJ,еленн npHBO,lJ,TC в rлаве 4 в форме npHMepOB nporpafv1M на зыке Ассем6лера. Пример 3.13 MOVLW .100 BCF STATUS, О RRCF WREG BCF STATUS, О RRCF WREG BCF STATUS, О RRCF' WREG BTFSC STATUS, О INCF WREG Stop: GOTO Stop ;заrрузка во WREG 100 AeCRTM4Hoe ;деnенме на 8 ;oKpyrneHMe резуnьтата An НЛJllOстрацнн ра60ТЫ коман,lJ, ЦНKJlН4ескоrо C,lJ,BHra на ,lJ,eMOHCTpaЦHOHHO na- нелн,  TaKO как PICDEM2 PLUS, сле,lJ,ует nре,lJ,варнтельно заnроrраммнровать порт В как BЫXO,lJ,HO порт, а порт А  как BXOДHO порт. npHBe,lJ,eHHbI ,lJ,алее nporpaMMHbI npH- мер в случаном nOp,lJ,Ke вы6нрает О,lJ,НН из четырех свето,lJ,НОДОВ, nO,lJ,КnlO4eHHbIx к nop ry В, KOr,lJ,a oTnyw,eHa кнопка, nO,lJ,COe,lJ,HHeHHa к штырьку 4 порта А. An BbInOJlHeHH этоrо в npHMepe 3. 14 нсnользуетс комаН,lJ,а ЦНКnН4ескоrо CABHra 6ез переноса. В ,lJ,ан- ном примере npH на>катнн KHOnKH 6у,lJ,уТ CBeTHTbC все CBeTO,lJ,LI1 0.0. а , а npH ее OTnYCKaHLI1H только О,lJ,НН свето,lJ,НО,lJ, 6У,lJ,ет BКn104aTbc в случаном nOp,lJ,Ke. 
94 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Пример 3.14 Main: MOVLW ОхОО MOVWF TRISB MOVLW OxFF MOVWF TRISA MOVLW Ох11 MOVWF PORTB Main1: BTFSS PORTA, 4 RLNCF PORTB ;nроrрамммрованме портов А м В ;заnуск порта В по Ох11 ;UMKnM4eCKM CABMr, eCnM кнопка HaaTa GOTO Main1 ;noBTopeHMe 3.4. Команды уnравленмя выnолненмем nporpaMMbI и косвеннаяаАресация nepe,lJ, тем, как прнсrynнть к реальному nporpaMMHpoBaHHlO, нам сле,lJ,ует L/1ЗУЧНТЬ команды уnравленн выполненнем nporpaMMbI. В ,lJ,анном nО,lJ,разделе рассмотрены коман,lJ,Ы уnравленн nporpaMMo, nрИВО,lJ,тс так>ке ,lJ,оnолннтеЛЫlые npL/1MepbI, ВЫI10Л HIOw,He простые за,о,а4И. Коман,lJ,Ы уnравленн выnолнеНL/1ем nporpaMMbI MO,lJ,HcpHu.HPy IOт наnравленне nере,lJ,а4И уnравленн в nporpaMM 4ерез условные nepexo,lJ,bI н вызовы <pYHKЦH. Онн так>ке nре,lJ,оставлIOТ некоторую степень контрол на,о, HeKOTOpbIML/1 внуТ- ренннмн <pYHKЦHMH мнкроконтроллера. Так>ке рассмотрена KOCBeHHa a,o,pecau.H че рез perHcTpbI вы60ра <ралов (FSRO, FSR1 н FSR2). Ta6Jl. 3.4 НЛЛlOстрнрует команды уnравленн выполненнем nporpaMMbI, ,lJ,OcrynHbIe мнкроконтроллерам ceMeCTBa PIC18. КомаН,lJ,а GOTO y>t<e нсnользовanась в nporpaMMax, О,lJ,нако .0.0 снх пор она не раз 6нралась достаТ04НО ,lJ,eTaJlbHo. GOTO  это З2раЗР,lJ,на комаН,lJ,а, KOTopa мо>кет BЫ nолнть nepexo,lJ, на ЛlO6ую 4eKY naMTH nporpaMM. КомаН,lJ,а ВАА (nocToHHbI пере- ход), KOTopa так>ке выnолнет 6езусловны nepexo,lJ" представляет собо 16-разр,lJ,НУIO команду, днаnазон nepexo,lJ,a в KOTOPO оrраНИ4ен. КомаН,lJ,а ВАА coдep ЖL/1Т 11-раЗР,lJ,ное чнсло, которое влетс не адресом, а npHpaw,eHHeM а,о,реса. 3то npHpaw,eHHe нлн смещение, как ero часто Ha3bIBalOT, nозволет ВАА осуw,ествлть ne- рехо,lJ, в nporpaMMe Bnepe,lJ, на paCCTOHHe вплоть .0.0 1024 байтов от а,lJ,реса слеДУIOw,е команды в nporpaMMe лн60 наза,lJ, вплоть до  1 024 6aT от а,о,реса слеДУIOw,ей KOMaH ды в nporpaMMe. 3тот TL/1n nepexo,lJ,a 4асто Ha3bIBalOT относитеЛЬНblМ переходом, no скольку зта команда нннцнаЛL/1знрует nepexo,lJ, в соответствнн с указанным значеннем cMew,eHH вне завнснмостн от Toro, в каком месте naMTH она располо>кена. Все ко- ман,lJ,Ы условноrо nepexo,lJ,a L/1СnОЛЬ3УIOТ <рорму а,о,ресацнн со cMew,eHHeM, однако в HL/1X нсnользуетс ew,e 60Jlee KOpOTKH ,lJ,Hana30H перехода  от +127 до 128 бат, ОТСЧL/1ТЫ Ba от а,lJ,реса сле,lJ,УIOw,е команды nporpaMMbI. npH4HHO такнх оrраннченн влетс оrраНН4ение КОЛН4ества 6нтов, ,lJ,OcrynHbIx в комаН,lJ,е AfI a,o,pecau.HH naMTH. KOMallAY GOTO 4асто Ha3bIBalOT a6COJllOTHbIM nepeXO,lJ,OM, nOCKOJlbKY адрес перехода в He вл eTC <рнкснрованным нли а6сол1OТНЫМ. Коман,lJ,У ВАА н коман,lJ,У условноrо перехода часто Ha3bIBalOT комаН,lJ,амн относительноrо перехода , потому что а,lJ,рес nepexo,lJ,a оп ределетс OTHOCHTeJlbHbIM а,о,ресом команды nepexo,lJ,a в naMTH nporpaMM. 
rnaBa 3. Набор коман)]. семейства PIC18 95 Примеры Таблица 3.4. Коман,lJ,Ы уnраВJlення BbInOJlHeHHeM nporpaMMbJ. Комментарий Операнд Операнд Команда 1 2 ВС п1 BN п1 BNC n1 BNN п1 BNOV п1 BNZ п1 BOV п1 Ш<'А п2 BZ п1 CALL п3 CLRWDT DAW GOTO п3 NOP РОР ВС AGAIN BNWOW BNC FLOP BNN POSITIVE BNOV BIG BNZ MORE BOV NOW BRA WINK BZ BOSTON CALL НОМЕ CLRWDT DAW GOTO ERIE NOP РОР S PUSH PUSH RCALL п2 RCALL 6 RESET RE'I'FIE S RESET RETFIE 1 RETLW L RETLW 6 RETURN S RETURN 1 SLEEP SLEEP ОереХОА к AGAIN eCnM перенос равен ОереХОА к WOW eCnM отрмuателен ОереХОА к FLOP eCnM перенос равен О ОереХОА к POSITIVE еслм не OTpMuaTeneH ОереХОА к BIG eCnM нет nepenOnHeHMR ОереХОА к MORE eCnM нет HYnR ОереХОА к NOW еслм nepenonHeHMe Безусnовный nepexoA к WINK ОереХОА к BOSTON eCnM HOnb B30B YHKUMM С мменем НОМЕ С6рос CTopoeBoro TaMepa eCRTM4HaR nOACTpOKa COAepMMoro WREG Безусnовньщ nepeXOA к ERIE Нет onepaUMM M3Bne4eHMe аАреса возврата М3 вершмны стека 3анесенме аАреса возврата в вершмну стека Относмтеnьный CALL по аАресу С4еТ4МК кома нА + 2 + 2 * 6 BnepeA по nроrрамме DporpaMMH с6рЬС Возврат М3 npepBaHMR С теневьшм perM страмм, заrруенньшм в perMCTp м раз решеннм npepBaHMRMM Возврат М3 YHKUMM СО зна4енмем 6 во WREG Возврат М3 YHKUMM с TeHeBM perMCT рамм, заrруеннм в perMCTp. ВХОА в peMM 6e3AeCTBMR Примечания: п1 = 8разрядное смещение, п2  11  разрядное смещение, пЗ = 21 разрядный абсолютный адрес, s  теневой бит, 1  8разрядньm литерал. Мноrие Н3 коман,lJ, уnравленн HCnOJlb3YIOTC AfI реаJlизаu.ин nporpaMMHbIX KOH CTPYKu.H, COCTaBJlIOw,HX cTpOHTeJlbHbIe 6JlOKH nporpaMM. 3тнми конструкu.ИЯМLI1 ЯВЛЯlOт ся CJle,lJ,YIOw,He KOHCTPYKu.HH: «if-then-else» (Еслнтоина4е), «repeatuntil» (nовторять пока) «<dowhile» (,lJ,eJlaTbnoKa) нлн «dofor» (,lJ,елаТЬAfI условн)), «while» (пока) н срункu.и . Коман,lJ,Ы CALL н REТURN HCnOJlb3YIOTC AfI C03,lJ,aHH CPYHKu.H нлн nO,lJ,npOrpaMM, НСnОJlьзуемых в nporpaMMe. КомаН,lJ,а CALL заноснт а,lJ,рес В03IЗрата во ВНуТренннй npo rpaMMHbI стек, а затем BbJnOJlHeT onepau.HIO GOTO по а,lJ,ресу nамти, указанному IЗ OnepaH,lJ,e коман,lJ,Ы CALL. КомаН,lJ,а RETURN выnолнет возврат И3 СРункu.LI1И,  точно так >ке, как она это ,lJ,eJlaeT в 3ЫKe С. Что комаН,lJ,а RETURN ,lJ,елает сраКТИ4ескн  так зто И3 влекает а,о,рес возврата Н3 nporpaMMHoro стека н заноснт ero в С4еТ4НК коман,lJ,. Коман- ,lJ,а CALL НСnОJlьзуетс AfI ВЫЗ0ва CPYHKu.HH, а REТURN нсnользуетс AfI возврата Н3 срункu.ин. КомаН,lJ,а RETURN BCer,lJ,a B03Bpaw,aeT уnраВJlение КО М аН,lJ,е, сле,lJ,УIOw,е Heno сре,lJ,ственно nocJle caMO nOCJleAНe коман,lJ,Ы CALL. Коман,lJ,Ы PUSH н РОР так>ке ocyw,ecTBJlIOT ,lJ,ocryn к nporpaMMHoMY стеку микро KOHTpOJlJlepa. КомаН,lJ,а PUSH НСnОJlьзуетс AfI nре,lJ,варнтельно заrрузкн а,о,реса 1З03 врата, paBHoro РС (С4еТ4НК коман,lJ,) + 2 в nporpaMMHbI стек, а комаН,lJ,а РОР ИСnОЛЬ3У 
96 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 ется AfI H3BJle4eHH а,lJ,реса возврата Н3 стека. 06е этн коман,lJ,Ы ,lJ,ОЛ>КНЫ НСnОJlьзовать- . C С OCTOpO>KHOCTblO. КомаН,lJ,а NOP не BbInOJlHeT a6COJllOTHO HH4ero, за HCKJl104eHHeM Toro, 4ТО на нее раСХО,lJ,уется О,lJ,НН KOMaH,lJ,HЫ u.HKJl. КомаН,lJ,а NOP HHOr,lJ,a НСnОJlьзуетс npH отра60тке временных задер>кек на О,lJ,НН KOMaH,lJ,HЫ u.HKJl. NOP так>ке ,lJ,о6авлетс к некоторым комаН,lJ,ам acceM6JlepOM. КомаН,lJ,а RETLW НСnОJlьзуетс AfI возврата Н3 срункu.ни С perLl1CTpOM WREG, за rpY>KeHHbIM OnepaH,lJ,OM коман,lJ,Ы RETLW. Она нсnользуетс в некоторых nporpaMMax на AcceM6Jlepe AfI возврата 3Ha4eHH срункцнн. иначе да HarpeB охлаждение Рис. 3.6. KOHcTpYKu.H "ifthenelse" ПроrwpаММНЪJе КОНСТРУКЦИИ Проrраммные КОНСТРУКЦИИ - это CTpOHTeJlbHbIe 6JlOKH nporpaMMHpOBaHH  их He 06хо,lJ,НМО 06су,lJ,НТЬ С тем, 4то6ы nporpaMMbI, которые вы 6У,lJ,ете nHcaTb, 6bIJlH эсрсрек. тнвнымн. nepBa KOHCTPYKu.H, KOTOPYIO мы раз6ерем  это KOHCTPYKu.H "ifthenelse" (еслнтонна4е). Рнс. З.6 HJlJlIOCTpHpyeT 06w,ylO срорму это конструкцнн. 06ратнте вннманне на вопрос, (см. рнс. З.6). Он 3ВУ4нт как: "В комнате >карко?". ЕСJlИ в комнате >карко, то nporpaMMa nepeXO,lJ,HT на 6JlOK КО,lJ,ОВ, 06ecne4HBalOw,Hx nOHH >кенне TeMepaTYpы в комнате, нна4е (т.е. в npOTHBHOM CJlY4ae) BbInOJlHeTC HarpeB. 3та KOHCTPYKЦH НСnОJlьзуетс TOr,lJ,a, KOr,lJ,a в nporpaMMe за,lJ,аетс каКО-Jlн60 вопрос. БJlОК КО,lJ,а, назна4еннем KOToporo BJleTC заданне вопроса, HJlJlIOCTpHpyeTc в npHMe ре З.15. AaHHЫ npHMep тестнрует perHCTp 6анка ,lJ,ocryna Ох1 О на наЛН4не зна4ени, paBHoro 4. ECJlH СО,lJ,ер>кнмое этоrо perHCTpa равно 4, то по адресу Ох10 заноснтся 6. ECJlH это не так, то по а,lJ,ресу Ох10 заноснтс 9. 
rnaBa 3. Набор коман)]. семейства PIC18 97 Пример 3.15 MOVLW 4 SUBWF Ох10, О BNZ NOPE MOVLW 6 ВМ DONE1 ;eCnM не 4 ;eCnM 4 NOPE: MOVLW 9 DONE1 MOVWF Ох10 ;заnмсь 6 MnM 9 nре,lJ,ПОЛОЖИМ, 4ТО нам ну>кно npe06pa30BaTb 4L11сла от ОхОО до OxOF 130 WREG из шестна,lJ,u.атиричноrо КО,lJ,а в КО,lJ, ASCII. Цнсрры ASCII Jle>KaT в ,lJ,Hana30lle ОТ Ох30 до Ох39, а 6уквы от А .0.0 F соответствуют значеНИJ1М ОТ Ох41 до Ох46. Дл выполнени 3Toro npe 06pa30BaHLI1 Ох30 nриБВSJlетс к wестнар,цаtЩjИ4НОЙ цифре (OxOOOx09) LI1 Ох37 nри- 6авлется к шестна,lJ,u.аТИРН4НО 6укве (OxOA-ОхОF). К-онэтрукu.и "if" (еСЛLl1), LI1ЛЛIOСТ РLl1руемая прнмером 3.16, ИСnОJlьзуетс AfI ВЫnОJlнення Этой простой ЭS,lJ,а4И. В зтом примере BbInOJlHere npH6aBJleHHe значенн Ох30, а затем, Ьли результат является MeHbWHM, 4еМ Ох3А, ,lJ,06аВJlется еще семерка AfI npe06pa30BaHLI1 бук. ДaHHЫ nри мер ,цл обесnе4еНLI1Я срункцноннровония nporpSMMbI нсnользует ,lJ,ве временные flчейки в perHcTpOBOM cpaJle данных. Хотя 06ЫIВJlення этнх ячеек в ,lJ,анном npHMepe не npLl1Be AeHbl, они опре,lJ,еляюtся е исndЛЬЗ0ванием RES 1 в сеl<.ЦИИ UDATA ИСХО,lJ,ноrо срайла. КомаН,lJ,а CPFSGT в\)\hолнет сравненне cO,lJ,ep>KLI1MOrO Temp2 (Ох3А) с W LI1 еСЛLl1 Тетр2 60льше, 4ем W,.команда ADDLW nроnускается. Пример 3.16 ADDLW Ох30 MOVWF Temp1 MOVLW Ох3А MOVWF Temp2 MOVFF Temp1, WREG CPFSGT Temp2 ADDLW Ох07 ;А06ав.nяет Ох30 ;npOnYCK AnR ОТ О АО 9 ;TOnbKO AnR 3А nM60 60nbwe ИмееТОf1 еЩ0 более KOpOTKH, хотя LI1 менее nрозра4НЫЙ, метод выполнения Ha 3BaHHoro преобрgЗОlЗ8НИf1 - он ИJlJlIOСТРLl1руется npLl1MepOM 3.17. В нем для выполнения npe(jOpa30BaHH ИСnОJ1ьэуется КОмаН,lJ,а DAW в HeMHoro He06Ы4HO манере. Команда DAW nре,lJ,наЗН84ена ,цля nepeUOAa 4ИСJlа во WREG в ,lJ,BOH4HOKO,lJ,LI1pOBaHHYIO ,lJ,еСТLI1ЧНУIO (ДКД) форму nocJle BbInOJlHeHH ДКДСJlо>кенн. Она BbInOJlHeT это nOCpe,lJ,CTBOM oцeH .. кн 3Ha4eHLI1 MJla,lJ,Wero пьлу6ата н eCJlH оно BJleTC 60JlЬШНМ, 4ем 9 HJlLl1 установлен DСбнт (6нт nOJlOBHHHOro переноса), то ВЫnОJlняетс ,lJ,06aBJleHHe 6. Она так>ке оu.енива- ет cTapWH nOJly6aT н eCJlH он ВJlется 60JlbWHM, 4ем 9 HJlH установлен 6ит С (6L11T ne реноса), то BbInOJlHeTC ,lJ,06aBJleHHe Ох60. Это npHBO,lJ,HT к тому, 4ТО pe3YJlbTaT 6У,lJ,ет равен от Ох30,lJ,О Ох39 ДЛ 4HCeJl н от Ох40,lJ,О Ох45 AfI 6укв. Как мО>кно в Н,lJ,еть , резуль таты AfI букв MeHbwe на SНИЦУ, 4ем не06ХО,lJ,нмые корректные зна4ения, позтому ПРLl1меllяется комаН,lJ,а BTFSC (тестированне 6L11Ta LI1 npOnYc"K, если с6рошен) ,цля npo BepKLI1 6нта 6 результата. Бит 6 с6расывается для шестнадu.аТLI1РLl1ЧНЫХ чисел и устанаIЗ ливается для wестнадu.аТНРИ4НЫХ 6VKB. После команды BTFSC выполняется команда LI1нкрементирования WREG только AflЯ зна4ений от Ох40 до Ох45 с целыо reHepHpOBat IИЯ корректных зна4ени ,цл 6укв  от Ох41 ,lJ,оОх46. 
98 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Пример з. 1 7 ADDLW Ох30 DAW BTF'SC WREG, 6 lNCJT WREG ХОТЯ 3ТО L/1 эсрсреКТL/1ВНО, О,lJ,нако, возмо>кно, 60Jlee СРУНКЦL/10нальным 6У,lJ,ет nOMec- TL/1Tb зry оnераЦL/11О в СРУНКЦL/11О. Функцин 4асто ИСnОJlЬ3УIOТСЯ AflЯ снижения TpyдoeMKO стн наnL/1СШIН nporpaMM. npL/1Mep 3.18 nOKa3bIBaeT, как OcpOpML/1Tb nporpaMMY, COIJ1aCIIO примеру 3.17, в срун кu.и 10 , Ha3bIBaeMYIO Hex2ASCII, 4ТО влетс У,lJ,ачным L/1MeHeM для зтой СРункu.ин. Bcer,lJ,a старайтесь называть CPYHKu.L/11O так, чт06ы ее L/1M OTpa>KaJJO ра60ТУ СРУНКЦИL/1 . 3та срУНКЦL/1 Hex2ASCII nре06разует WecTHa,lJ,u.aTHpH4HbIe u.HcppbI 130 WREG в ASCIIu.L/1cppbI во WREG. Пример 3 .18 ;*** ФУНКUМR npe06pa30BaHMR weCTHaAuaTMpMqHOrO opMaTa в opMaT ASCI *** ;Оре06раЗ0ванме npaBoro nony6aTa во WREG в ASCIIKOA во WREG Hex2ASCII: ANDLW OxOF ADDLW Ох30 DAW BTFSC WREG, 6 INCF WREG RETURN ;***rnaBHaR nporpaMMa *** Main: Stop: MOVLW Ох5с MOVWF ASC II Н CALL Hex2ASCII MOVWF ASC II L MOVFF ASCII_H, WREG SWAPF WREG CALL Hex2ASCII MOVWF ASCII Н ВМ Stop ;OqMCTKa cTapwero nony6aTa ;npe06pa30BaHMe в ASCII ;заrрузка TeCTOBX AaHHX ;nре06разованме MnaAwero nony6aTa ;сохраненме ero в ASCII L ;nonY4eHMe CTapwero rrony6aTa ;nре06разованме ero в ASCII ;сохраненме в ASCIIH КомаН,lJ,а CALL nOMew,aeT а,о,рес возврата во ВНуТренни стек (32х21), а затем от- ра6атывает nepeXO,lJ, по a6COJllOTHOMY а,о,ресу CPYHKu.HH, KOTopa в ,lJ,анном случае назы BaeTC Hex2ASCII. Адрес возврата Bcer,lJ,a указывает на коман,lJ,У, которая CJle,lJ,yeT Heno сре,lJ,ственно после CALL. ECJlH B3Tb nepBYIO коман,lJ,У CALL в npHBe,lJ,eHHO nporpaMMe, то а,о,ресом возврата 6У,lJ,ет а,о,рес Я4екн nамятн, CO,lJ,ep>Kaw,e коман,lJ,У MOVWF ASCII.L. BCKL/1 раз, KOr,lJ,a BCTpe4aeTC комаН,lJ,а REТURN, МНКРОКОНТРОJlлер L/1звлекает caMЫ nOCJle,lJ,HH а,lJ,рес возврата Н3 стека н BbInOJlHeT nepeXO,lJ, по этому а,о,ресу. BCJle,lJ,CTBL/1e Toro, 4ТО стек COCTOL/1T Н3 3 1 4eKH, BJlO>KeHHe ВЫЗ0ВОВ CPYHKu.H мо>кет ВЫIlОЛНТЬСЯ на rJly6L/1HY BnJlOTb .0.0 31. 06ратнте вннмание, 4ТО 60JlЬШННСТВО nporpaMM НСnОЛЬ3УIOТ Bce ro HeCKOJlbKO ячеек стека. 
rnaBa 3. Набор коман)]. семейства PIC18 99 V1MeeTC ,lJ,ва THna коман,lJ, возврата: обычна у>ке оnнсанная комаН,lJ,а возврата (RETURN) LI1 ,lJ,Pyra комаН,lJ,а (RETURN 1), KOTopa называетс быстрым возвратом, 11O скольку хотя она LI1 не 6ыстрее 06bI4Horo REТURN, О,lJ,нако она aBToMaTH4eCKLI1 BOCCTaHaB nHBaeT зна4енне perLl1CTpOB WREG, STATUS н BSR. Дn НСnОJlЬЗ0вання это CPYHКlJ,LI1L11 BOCCTaHOBJleHH, СРУНКЦLl1Я ,lJ,ОЛ>кна 6ыть вызвана коман,lJ,ОЙ CALL SUBROUTINE, 1. CALL со вторым параметром, равным 1, автомаТН4ескн сохраняет perHCTpbI WREG, STATUS и BSR во ВНуТренннх скрытых теневых perHCTpax. КомаН,lJ,а RETURN 1 H3BJleKaeT даllные И3 ЭТLI1Х теневых perHCTpOB. Друrнм THnOM возврата ВJlется комаН,lJ,а RETLW. Так, KO маН,lJ,а RETLW 6 B03Bpaw,aeT ynpaBJleHHe BbI3bIBalOw,e nporpaMMe, О,lJ,нако так>ке заllОСНТ 6 в perHcTp WREG прн возврате. БОJlЬШННСТВО CPYHKu.H HCnOJlb3YIOT пару команд CALL н RETURN. npHMep 3.19 HJ1JlIOCTpLl1pyeT то, как nHweTC HOBa срункu.ия, Ha3BaHHa Hex2ASC, которая нсnользует вло>кенны ВЫЗ0В CPYHKu.HH Hex2ASCII. Функu.LI1 Hex2ASCII BЫ3ЫBa eTC cpYHKЦHe Hex2ASC ,lJ,ва раза, 4ТО тре6ует О,lJ,НУ 4eKY стека ДflЯ а,о,реса возврата для Hex2ASC н ew,e О,lJ,НУ - AflЯ Hex2ASCII. nporpaMMa CTaJla 60Jlee Llнта6елы.lO ВСJlедст вне HCnOJlb30BaHH HOBO срун Ku.H Н , KOTopa nре06разует nOJlHOCTblO 6айт. E,o,LI1HCTBeH НЫМН perHCTpaMH, которые НСnОJlьзует эта nporpaMMa, ВJlIOТСЯ реrистры WREG, ASCIIL н ASCIIH. nporpaMMa так>ке npH своем BbInOJlHeHHH НСnОJlьзует ,lJ,ва YPOBH CTe ка. О,lJ,ННМ Н3 cnoc060B YJlY4weHH это nporpaMMbI BJleTC возврат ,lJ,ВУХ СLI1МВОЛОВ ASCII в perHCTpax PRODL н РАООН. БJlаrО,lJ,ар этому npH npe06pa30BaHHH не 6удуr LI1C rЮJ1ЬЗ0ватьс perHCTpbI 06w,ero Ha3Ha4eHH, это XOPOwo - так как perHCTpbI 06w,ero Ha значенн часто 6bIBalOT в ,lJ,ecpHu.HTe. Пример 3.19 ;*************ФУНКUМR Hex2ASCII *********** ; мсnоnьзует 1 уровень стека ;мсnоnьзует WREG ; nре06разует npa rrony6 во WREG из weстнaдu.атерич:ноro формата в ASCIIKOA ;******************************************** :iex2ASCII : ANDLW ADDLW DAW BTFSC INCF RETURN ;************ ФУНКUМR Hex2ASC ************** OxOF Ох30 ;мзоnмрует мnаАWМЙ rrолубат WREG, 6 WREG мсnоnьзует 2 ypOBHR стека мсrrоnьзует WREG, ASCII_L и ASCII_H мсnоnьзует Hex2ASCII nре06разует 6aT во WREG мз wecTHaAuaTMpMqHOrO opMaTa в opMaT ASCII npM 3ТОМ ASCIIL COAepMT caMY npaBY ASCII-UMPY а ASCIIH COAepMT caMY neBY ASCII  UМФРУ ;******************************************** nex2ASC: MOVWF CALL MOVWF ASCII Н Hex2ASCII ASCII L ;nре06разует мnаАWМЙ nony6aT 
100 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 MOVFF SWAPF CALL MOVWF RETURN ;**************rnaBHaR Main: MOVLW Ох5с CALL Hex2ASC Stop: ВМ Stop ASCII Н, WREG WREG Hex2ASCII ASCII Н ;BnOnHReT CBOnnMHr nony6aToB ;npe06pa3yeT старшм nony6aT nроrрамма ****************** ;заrруает TeCTOBe AaHHe ;nре06разует rrOnHOCTb 6aT в opMaT ЛSСIJ KOHCTPYKu.LI1 "repeatuntil" (nовторять,lJ,О тех пор, пока) повторяет оnераЦLl1IО cpLl1K CLI1pOBaHHoe KOJlH4eCTBO раз JlH60 .0.0 тех пор, пока 6удет cnpaBeAflLl1BO некое условие. Рнс. 3.7 НJlЛlOстрнрует KOHCTPYKu.HIO "repeat-until". npe,lJ,nOJlO>KHM, 4ТО perHCTpbI naMTH ,lJ,анных С адресамн от Ох10,lJ,О Ох28 c6pacы BaIOTC nроrраммой в COCTOHHe ОхОО. 3то мо>кет 6ыть BbInOJlHeHO nOCpe,lJ,CTBOM нсnоль З0ваНLI1Я HeCKOJlbKHX коман,lJ, MOVWF. О,lJ,нако 60Jlee ЭJlеrантны cnoc06 заKJllOчается в НСПОJlЬЗ0ваннн косвенной aдpecau.HH совместно с KOHCTPYKu.He "repeatuntil". ЦLl1КЛ 6У,lJ,ет nовторться Ох 19 раз, coxpaH Ох 19 HYJle в ОХ 19 ра3ЛН4НЫХ 4eKax perHCTpOBO ro cpaJla. V1MeeTC Ох19 4eeK ме>кду Ох1 О н Ох28 (разность nJlIOC 1). npLl1Mep 3.20 nOKa зывает nporpaMMY, KOTopa pewaeT эту зада4У. Пример 3.20 LFSR О, Охl0 MOVLW Ох19 Loop: BRA CLRE' DECFSZ Loop Stop: BRA ;адрес Охl0 через FSRO ;заrрузка WREG счетчиком POSTINCO WREG ;очистка ячейки и инкрементирование указателя ;декрементирование счетчика, пропуск ВНА, если О ;повтор цикла до тех пор, пока WREG не станет ; нулевым Stop Таблица 3.5. ДетаJlН KOCBeHHO адрссаЦLl1L11 Мнемоника операндов INDFO INDFl INDF2 POSТDEC POSTINC PREINC PLUSW Комментарий Пример MOVFF WREG, INDFO KOnMpyeT WREG в R4eKY naMRTM, KOCBeH но aApecyeMY FSRO Мнкрементмрует COAepMoe R4eKM naMR тм, aApecyeMO FSR1 KOnMpyeT WREG в R4eKY naMRTM, KOCBeH но aApecyeMY FSR2 KOnMpyeT WREG в R4eKY naMRTM, KOCBeH но aApecyeMY FSRO, а затем B4MTaeT 1 мз FSRO KOnMpyeT COAepMMoe R4eKM naMRTM, aApecyeMO FSRO, в R4eKY naMRTM, aд pecyeMY FSR1, а затем BnOnHReT AeK рементмрованме как FSRO, так м FSR1 04MaeT RqeKY rraMRTM, адресуемую FSR2, а затем мнкрементмрует FSR2 Мнкрементмрует FSR1, а затем AeKpeMeH тмрует COAepMMoe R4eKM naMRTM, Te nepb aApecyeMO FSR1 Мнкрементмрует COAepMMoe R4eKM naMR тм, aApecyeMO FSRO + WREG INCF INDF1 MOVWF INDF2 MOVWF POSTDECO MOVFF POSTDECO, POSTDEC1 CLRF POSTINC2 DECF PREINC1 INCF PLUSWO 
rnaBa 3. Набор коман)]. семейства PIC18 10 I Выполнение какойто операции Нет Да Рис. З.7. KOHCTPYKu.H "repeat-until" Косвенная адресация Прнмер 3.21 влетс первым npHMepoM НСnОЛЬЗ0ванн косвенной адресацнн. Микроконтроллер нмеет трн perHCTpa, которые нсnользуютс ДJl косвенной aдpeca цин 4eeK naMTH. 3тн perHcTpbI Ha3bIBaIOTC perHcTpaMH вы60ра фала (FSRO, FSR1 и FSR2). ПО некоторым npH4HHaM еДVIнственной коман,о,ой, которая нсnользует FSR в качестве OIlepa.-ща, вляетс кома.-ща LFSR, KOTopa нсnользует Д11 занесенн адреса 4eKH nамя- п1 файла .цанных в FSR. Все дpyrne коман,о,ы, ВЫnОЛНIOw.не адресацнlO 4ерез perHCTp вы60- ра фаJlа, НСnОЛЬ3УlOт дpyrHe мнеМОНН4ескне 0603Ha4eHH. В та6л. 3.5 nepe4HCJleHbI мне- МОНН4ескне 0603Ha4eHH н нх функu.нн В СЛУ4ае npHMeHeHH зтнх мнемоннческнх 060 зна4еннй к косвенной a,D,peCau.HH 4ерез perHcTpbI FSR. ,дn НЛЛlOстраu.ни возмо>кностей зтнх косвенных операндов, nреДnОJlО>КНМ, tHO блок данных по a,D,peCaM naMTH ,lJ,анных от Ох1 О до Ох32 дол>кен 6ыть сло>кен с 6локом .цанных, расnоло>кенным по a,D,pecaM naMTH данных от Ох40 .0.0 Ох62. Ка>кдый 6лок co дер>кнт Ох23 4eeK naMTH. CooTBeTCTBYIOw,a nporpaMMa тре6ует орrаннзаu.нн цнкла, выnолнемоrо Ох23 раза, она так>ке тре6ует НСnОЛЬЗ0ванн косвенной адресаu.нн ДЛ досrynа к 06енм 06ластм naMTH данных с НСnОЛЬЗ0ваннем двух perHcTpoB вы60ра фалов (FSRO н FSR1). nporpaMMa, ВЫnОЛНIOw,а зry зада4У, nрнведена в npHMe- ре 3.22. 06ратнте вннманне на то, как нсnользуетс perHcTp 5 в ка4естве С4еТ4нка npH проrраммнрованнн ЦНKJlа. 
102 ITpHMeHeHHe мнкроконтроnnеров PIC18 Пример 3.21 LFSR О, Ох10 LFSR 1, Ох40 MOVLW Ох23 MOVWF 5 Loop: Stop: MOVF ADDWF DECFSZ BRA ВМ POSTINCO, О POSTINC1 5 Loop Stop ;aApecaUMR Ох10 4ерез FSRO ;aApecaUMR Ох40 4ерез FSR1 ;rronY4eHMe Ох23 AnR С4ета ;сохранение С4еТ4ика в R4eKe 5 ;rronY4eHMe R4eKM 6noKa 1 во WREG ;cnoeHMe WREG с R4eKo 6noKa 2 ;Аекрементмрованме С4еТ4мка ;rrporoH UMKna Ох23 раза nре,lJ,nОЛО>КНМ, 4ТО в naMTH CO,lJ,ep>KHTC ннформацн, nОЛУ4еllная ОТ HeKOTOpOrO внешнеrо устройства н nporpaMMa ,lJ,ол>кна просмотреть память данных на предмет Ha JlH4H вхшкденн 4нсла ОхОО. CooTBeTCTBYIOw,a та6лнu.а расnоло>кена по адресам от Ох20 до Ох5А. Аанная та6лнu.а нмеет длнну, paBHYIO Ох3В 4eKaM. Еслн 4НСЛО ОхОО 6у- дет 06нару>кено, то nporpaMMa nрО,lJ,ол>кнт выnолнтьс по метке Foundlt, а еслн зто 4НСЛО 06нару>кено не БУ,lJ,ет, то nporpaMMa nрО,lJ,ол>кнт свое выnолненне по метке NotFound. Пример 3.22 LFSR О, Ох20 MOVLW Ох3В MOVWF 5 Loop: MOVLW ОхОD SUBWF POSTINCO, О BZ FoundIt DECFSZ 5 ВМ Loop NotFound: **** ;aApecaUMR Ох20 4ерез FSRO ;заrрузка WREG зна4енмем ОхОD ;ecnM наЙАено ;rrpoBepKa счетчмка на ;неравенство нул КОА AnR сnучаR, KorAa ОхОD не HaдeHO **** Foundlt: **** КОА AnR cnY4aR, KorAa ОхОD HaAeHO **** Stop: ВМ Stop Последне npOrpaMMHO KOHCTPYKЦHe влетс KOHCTPYKu.H "while" (до тех пор, пока), KOTopa нллюстрнруетс рнс. 3.8. nре,lJ,nОЛО>КНМ, 4ТО npHMep 3.22 nерепнсан с НСnОЛЬЗ0ваннем KOHCTPYKu.HH while вместо KOHCTPYKu.HH repeat-until. В зтом npHMepe- nOHCK ОхОО nOBTopeTc .0.0 тех пор, пока С4еТ4НК не станет нулевым. ,дn выполненн 3TO зада4Н,lJ,Jl всех 4eeK, зна4енне С4етчнка ,lJ,ол>кно увеЛН4нватьс на 1. npHMep 3.23 НЛЛlOстрнрует HOBYIO nporpaMMY, НСnОЛЬ3УIOw,УIO KOHCTpYKu.HIO while. 
rnaBa 3. Набор коман)]. семейства PIC 18 103 Пример 3.23 LFSR О, Ох20 MOVLW ОхЗС MOVWF 5 =..оор: DCFSNZ 5 вм NoU;'ound MOVLW ОхОD SUBWF POSTINCO, О I3NZ Loop FoundIt: aApecaUMR Ох20 4ерез FSRO ;rrpoBepKa С4еТ4мка ;АО тех пор, rrOKa С4еТ4МК неНlевой ;eCnM 4MCno ee не HaAeHO **** КОА, eCnM ОхОD HaAeHO **** otFound: **** КОА, eCnM ОхОD не HaAeHO **** 3LOp: ВМ Stop Нет Выnоnнение нужной операцин Да { ;  Рис. 3.8. KOHCTPYKu.H "While" Еслн сравннть два прнведенные npHMepa, то мо>кно заметнть, 4ТО сраКТН4ескн изменнлось только место pa3Mew,eHH команды дeKpeMeHTHpOBaHH С4еТ4нка. В Bep снн nporpaMMbI, НСnОЛЬ3УIOw,ей KOHCTpYKu.HIO repeatuntil по npHMepy 3.22, проверка после дeKpeMeHTHpOBaHH - зто nоследн проверка ЦHкna, а в npHMepe 3.23, проверка после дeKpeMeHTHpOBaHH  зто nepBa проверка u.Hкna. Во всем остаJlЫЮМ nрнведен ные nporpaMMbI nOXO>KH, 4ТО в верснн nporpaMMbI с KOHCTpYKu.He while LI1СnОJlьзуется знаt/енне С4еТ4нка, которое на еднннu.у 60льше, 4ем в верснн с конструкцней repeat until, nРН4ННОЙ 4ero влетс то в nporpaMMe с KOHCTpYKu.He while декрементнроваНLI1е выnолнетс сна4ала. Нн однн Н3 рассмотренных BapLl1aHTOB не LI1MeeT HLI1KaKLI1X 06ъeK тивных npeHMyw,eCTB перед ДРуrнм. 
104 ITримененне MHKpOKOHTpOnnepOB PIC18 3.5. Табличные команды ИмеlOТСЯ две та6ЛLl14ные команды: TBLRD (та6ЛН4ное C4L11TblВaHHe) н TBLWТ (Ta6 JlLl1чна заnнсь). 3тн Ta6JlH4HbIe команды nepeMew,alOT ннсрормаЦLl1IО мюкду flамятъlO прorраММJ KOTopa вляетс неразрушаемо naMTblO, н nамlыо данных, которая яв ляется разрушаемой naMTblO. Та6лнu.ы, которые НСnОЛЬ3УIOТС совместно с ПрОIрамм HbIMLI1 кодамн, н MOryr, СJlедовательно, xpaHHTbC в nамятн nporpaMM, в случае He06xo ДLl1МОСТLI1 nереносятс ДJl нх НСnОЛЬЗ0вання в naMTb данных. Команда та6ЛLl1LllIOrо СЧLl1 TbIBaHLI1 C4L11TbIBaeT данные нз naMTH nporpaMM н coxpaHeT нх в памтн данных. Ko манда та6ЛLl14НО заnнсн С4нтывает данные нз naMTH данных н заnнсывает нх в naMTb nporpaMM. Та6ЛНL/ное С4нтыванне с4нтыlзетT naMTb nporpaMM, а та6лнчна заnнсь осуществлет заnнсь в naMTb nporpaMM. 06ратнте BHHMaHLI1e на то, 4ТО та6Jlнчная за I1НСЬ в памть проrрамм невозмо>кна в мнкроконтроллерах нсnолнення отр (ceMeCTBO 18С). Мнкроконтроллер дол>кен нметь срлзшnамть ДJl Toro, 4т06ы 6ыла ВОЗМО>Кllа запнсь в naMTb nporpaMM. V1сnолненне мнкроконтроллеров отр не нмеет срJl3Ш памтн. Команда TBLRD* Таблица 3.6. Та6ЛИ L IНЬЮ команды TBLWТ* TBLRD*+ TBLWТ*+ TBLRD* TBLWТ* TBLRD+* TBLWТ+* Комментарий aHHыe nepeHOCRTCR М3 naMRTM nporpaMM в TABLAT, та6ЛМ4НЫ указа Tenb не M3MeHReTCR aHHe rrepeHOCRTCR М3 TABLAT В rraMRTb Tenb не M3MeHReTCR aHHe nepeHOCRTCR М3 rraMRTM rrporpaMM Tenb затем MHKpeMeHTMpyeTcR aHHыe rrepeHOCRTCR М3 TABLAT В naMRTb Tenb затем MHKpeMeHTMpyeTcR aHHыe nepeHOCRTCR М3 rraMRTM nporpaMM Tenb затем AeKpeMeHTMpyeTcR aHHe nepeHOCRTCR М3 TABLAT В naMRTb Tenb затем АекрементируеТСR Та6nИ4Н указатеnь MHKpeMeHTMpyeTcR, М3 naMRTM nporpaMM в TABLAT Ta6nM4H указатеnь мнкрементируеТСR, затем Аанные переI!ОСЯТСЯ И3 TABLAT В rraMRTb nроrрамм nporpaMM, 'l'абnмqн ука за. в TABLAT, табnмчн указа nporpaMM, 'rаБJIМ4НЫ указа в TABLAT, 'l'аБJIМЧНЫ указа nporpaMM, 'l'а6ЛМ4НЫ указа , затем Аанные nереносятсн Та6ЛН4ные команды НСnОЛЬ3УlOТ указатель (называемы Ta6JlH4HbIM указателем) (TBLPTR) ДJl доступа к naMTH nporpaMM. Та6ЛН4НЫЙ указатель pa3Mew,eH в 06ластн SFR, он нмеет трн 6aTa в ДJlHHY н мо>кет содер>кать 21-разрдный адрес. PerLl1CTp TBLPTRL содер>кнт 8 младшнх 6нтов, perHcTp TBLPTRH содер>кнт слеДУIOw,не по стар- ШLl1НСТВУ 8 6нтов, а perHcTp TBLPTRU  самые старшне 8 6нтов адреса в nамятн npo rpaMM. nереда4а данных выnолнетс 4ерез perHCTp TABLAT в лн60 Н3 naMTH npo rpaMM. Варнанты команд та6ЛН4IЮ заnнсн н C4HTЫBaHH НЛЛIOСТРНРУIOТС та6лнu.е 3.6. 3тн варнанты доnускаlOТ ннкрементнрованне нлн декрементнрованне та6ЛН4ноrо ука- зател до лн60 после та6ЛН4ноrо C4HTЫBaHH нлн заnнсн. Декрементнрованне перед та6JlLl14НОЙ заnнсыо нлн С4нтываннем не доnускаетс. Однн Н3 nере4нсленных BapHaH тов зтнх команд не ннкрементнрует н не декрементнрует та6ЛН4НЫЙ указатель. Та6ЛН4 ное счнтыванне лн60 заnнсь nepeMew,aeT 8-разрдное 4НСЛО ме>кду Я4еко nамя I-H nporpaMM, aдpecyeMO perHcTpoM та6ЛН4ноrо указател (TBLPTR) н сnеu.нальным СРУIIКЦLl10нальным perHCTpoM, называемым perHCTpoM срнксацнн Ta6JlHu.IзI (TABLAT). 
rnaBa 3. Набор коман)]. семейства PIC 18 105 Табличное считывание. Табличный указатель (TBLPTR) (21 разрдны адрес н 22й разрд ДЛ адресацнн 06ластн конфнryрацнн) н perHCTp фнксаu.нн та6ЛLl1ЦЫ (ТАВLAТ) (8-разр,lJ,НЫЙ perHcTp) размеw,ены в ceKu.HH SFR naMTH данных. 06ласть памятн IIpO rpaMM ле>кнт в днаnазоне адресов от ОхОООООО до Ох1 FFFFF, а 06ласть KOHcpHrypau.HH HaXOALl1TC в днаnазоне адресов от ОхЗООООО до Ox30FFFF. nредnоло>кнм, что нам He06 ходнмо nре06разовать 4НСЛО в днаnазоне ме>кду О н 9 нз кода ВСD (ДКД) (3 7 -сеrмеНТНbI код ДJl oT06pa>KeHH 3Toro 4нсла на cerMeHToM светоднодном чнслен 110М HHДHKaTope.,дn выnолненн 3Toro nре06разованн 06Ы4НО НСnОЛЬ3УlOТ nOLl1CKO(3YIO rаблнu.у. Всле,lJ,ствне Toro, 4ТО naMTb данных относнтелы-ю невелнка н нмеет ALl1llaMLI1l/ HYIO npHpoAY, nOHcKoBa та6лиu.а xpaHHTC в naMTH nporpaMM, KOTopa нмеет значн тепьны объем н нмеет cTaTH4ecKYlO npHpoAY. npH coXpaHeHLI1L11 1l0Ll1CKOBO таБЛLl1ЦЫ в паМЯТLI1 nporpaMM зта та6nнца CTaHOBHTC nocToHHO. BcerAa, KorAa l-/еоБХОДLl1МО ис пользовать nOHcKoBYIO таблнu.у, cooTBeTcTBYIOw,He 4ейкн КОnНРУIOТСЯ (3 naMTb данных И3 naMTH nporpaMM с НСnОЛЬЗ0ваннем команды таБЛНl/ноrо С4НТЫВalШЯ. Как зто (3ы nолНетс? nре>кде Bcero nOHCKOBa таблнца coxpaHeTC в naMTH nporpaMM, нсnоль 3Y 6лок nporpaMMHbIx кодов, nоказанны в npHMepe 3.24. Пример 3.24 ;-************* 7cerMeHTHaR nOMCKOBaR та6nмца **************** :ABLE7 CODEPACK Ox1FFO :'00k7: db Ох06 ; О db Ох5Ь ; 1 db Ох79 ; 2 db Ox4F ; 3 db Ох66 ; 4 db Ох6D ;5 db Ох7D ;6 db Ох07 ; 7 db Ox7F ; 8 db ОхЗF ; 9 nOHCKoBa та6лнu.а по npHMepy 3.24 расnолаrаетс перед rла(Зно nporpaMMo, непосредственно перед оператором RESEТ_VECTOR1 СООЕ ОхОООО в фале ша6лона;> Она оnределетс после nОЛЬЗ0вательскнх данных н данных зсnnзу. Важно LI1СПОЛЬ30 вать днректнву СООЕ_РАСК ДЛ coxpaHeHH в naMTH nporpaMM бато(З в срорме двух 6aTOB на слово. KorAa комаН,lJ,а TBLRD осуw,ествлет доступ к naMTH nporpaMM, она адресует 6aTЫ naMTH nporpaMM, n03ToMY та6лнu.а дол>кна 6ыть упакована n06айтно (3 СЛУ4ае 6aTOBO та6лнu.ы. Чнсла в та6лнu.е за,lJ,аlOТ 6нты, не06ХО,lJ,нмые ДJl реалнзаu.ин 7-сеrментноrо КО,lJ,а, как зто НЛЛlOстрнруетс рнс. 3.9. CerMeHTbI nOMe4eHbI 6уквамн  от а до g, а лоrН4еска 1 в данном npHMepe озна- чает све4енне cerMeHTa. Еслн, HanpHMep, Ох66 nepe,lJ,aeTc на ЖК-ннднкатор, то BКnIO чатс cerMeHTbI Ь, с, f н g, OT06pa>Ka u.нфру 4 на ЖК-НН,lJ,нкаторе. Та6лнu.а содер>кнт (3се 7-сеrмеНТНbIе коды в 4нсленном nopAKe, как зто НЛЛlOстрнруетс npHMepoM 3.24. npo rpaMMa, осуw,еСТВЛIOw,а ,lJ,ocryn к 3TO таблнu.е, показана в npHMepe 3.25. НаLl1болое зффектнвный cnoc06 nОЛУ4енн кода нз таблнu.ы заKJl104аетс в НСnОJlьзо(3аНИLl1 одной команды TBLRD, KOTopa осуw,ествлет AOCryn к 4eKe nOHcKoBO та6ЛLl1ЦЫ, соответст- ВУIOw,ей ну>кному коду. Перва команда а,lJ,ресует та6лнu.у Look7 nосредст(Зом заl-РУЗКLI1 в ТВ LPTR Look7. В данном СЛУ4ае HanHcaHa функu.н, осуw,еСТВЛIOw,а ,lJ,ocryn к Ta6JlHu.e н ВЫnОЛНIOw,а nре06разованне нз коднровкн ВСО в 7 cerMeHTHbI код. V1CnOllb30BaH 
106 ITpHMeHeHHe MHKpOKOHTpOnnepOB РI С 18 HЫ ДЛ 3KCnepHMeHTOB MHKponpou.eccop нмел 4К naMTH npOrpaMM, n03TOMY та6лнu.а 6ыла nOMew,eHa в 4ейкн naMTH npOrpaMM в днаnа30не адресов от Ох1 FFO дО Ох1 FF9 n06JlH30CTH от вершнны naMTH nporpaMM. Байт таблицы g f е d с Ь а о о о о о 1 1 о " == ОДИН Рисунок З.9. 7 -сеrмеНТНbI 4НСЛОВО ннднкатор Пример 3.25 ;********** в 7cerMeHTH КОА ************************ мсnоnьзует 1 уровень стека AaHHX мсnоnьзует WREG, TABPTR м TABLAT AOCTYn К Ta6nMue rro аАресам от OxlFFO АО Ox1FF9 nре06разует WREG М3 ВСD в 7-сеrментн КОА 7cerMeHTH КОА B03BpaaeTCR во WREG T07seg: ANDLW ADDLW MOVWF MOVLW MOVWF MOVLW MOVWF OxOF OxFO TBLPTRL OxlF TBLPTRH О TBLPTRU ;04мстка CTapwero nony6aTa ;reHepMpOBaHMe аАреса та6nиц TBLRD* MOVFF ;nOnY4eHMe 7cerMeHTHoro КОАа TABLAT, WREG RETURN 3та >ке методнка мо>кет 6ыть нсnользована ДЛ выnолненн ДОСlуnа к JlI060MY TH ny фнкснрованной та6лнu.ы в naMTH npOrpaMM, npH условнн, 4ТО та6лнu.а coxpaHeTC в 4eKe, KOTopa леrко моднФнu.нруетс nре06разуемым 4НСЛОМ. Д,л НЛЛlOстраu.нн 3TO ro, nредnоло>кнм, 4ТО та6лнu.а нспользуетс ДJl npe06pa30BaHH шестнадu.аТНРН4НЫХ кодов в коды ASCII вместо метода, НСnОЛЬЗ0ванноrо 8 npHMepe 3.16. Вне BCKoro co MHeHH, метод, отра>каемый npHMepoM 3.16, HaMHoro КОр04е н rораздо 60лее зффектн вен, одна вместе с тем зто nре06разованне может 6ыть так>ке реаЛНЗ0вано с нсnользо 
rnaBa 3. Набор коман)]. семейства PIC 18 107 ваннем та6лнцы. Смотрнте npHMep 3.26 ДJl ознакомленн с соотвеТСТВУIOw,ей nOHCKO BO таблнu.е н nроrраммой, осуw,еСТВЛIOw,ей nреобраЗ0ванне. 3та функu.н 6ыла Ha звана Hex2ASCII, - точно так >ке, как н функu.н Н3 npHMepa 3.18, nOCKOJlbKY она выnолн ет Т04НО ту >ке зада4У. Пример 3.26 ;************** ПомсковаR та6nиuа ASCII **************** TABLE7 СОDЕ РАСК OxlFFO HexASC DВ Ох30, Ох31, Ох32, Ох3З DВ Ох34, Ох35, Ох36, Ох37 DВ Ох38, Ох39, Ох41, Ох42 DВ Ох43, Ох44, Ох45, Ох46 ;********** Hex2ASCII ************************ мсnоnьзует 1 уровень стека Аанных мсnоnьзует WREG, TABPTR м TABLAT AOCTYn к Ta6nMue по аАресам от Ox1FFO АО Ox1FFF nре06разует WREG М3 wестнаАuаТМРИ4ноrо в ASCIIKOA ASCIIKOA B03BpaaeTCR во WREG Hex2ASCII: ANDLW OxOF ADDLW . MOVWF MOVLW MOVWF MOVLW MOVWF TBLRD* MOVFF RETURN ;04мстка cTapwero rrony6aTa ;reHepMpoBaHMe аАреса Ta6nMUЫ OxFO TBLPTRL OxlF TBLPTRH О TBLPTRU ;rrOnY4eHMe ASCIIKoAa TABLAT, WREG Табличная запись. Onepau.H та6ЛН4НО заnнсн мо>кет оказаться pHCKOBaHHO. Ha npHMep, еслн во BpeM выnолненн заnнсн в naMTb nporpaMM nронзодет сброс, 1б 3ТО мо>кет npHBeCTH к разрушеннlO ,lJ,анных. Еслн 3ТО возмо>кно, то следует нсnользо вать какойлн60 мето,lJ, вернфнкаu.нн заnнсн ,lJ,анных. О,lJ,нако возмо>кно 3ТО не всеrда. MoryT ВОЗННКНуТь н друrне nр06лемы, свзанные с та6ЛН4НО заnнсыо' - коrда, HanpLl1 мер, во BpeM заnнсн nРОНЗ0йдет с60Й злектроnнтанн лн60 не 6удуТ заnреw,ены пре . pЫBaHH. По зтнм npH4HHaM та6ЛН4на заnнсь 6удет 06cy>кдaTbC n03>Ke, коrда ynoM НуТые вопросы 6удуТ npOaHaJ1H3HpoBaHbI. Однн Н3 методов вернфнкаu.нн заnнсн данных заKJl104аетс в заnнсн данных в две отдельные та6лнu.ы. Ka>Kдa та6лнu.а также содер>кнт 6айт С4еТ4нка. Коrда выnолнетс заnнсь в та6лнu.у, то 6aT С4еТ4нка HHKpeMeHTHpyeTC. При сохраненнн Ta6JlHu.bI она заnнсываетс С ннкрементнрованным зна4еннем С4еТ4нка. Затем заnнсываетс Apyra та6лнu.а так>ке с ннкрементнрованным зна4еннем С4еТ4нка. Еслн пронзодет c60, то зтн две та6лнu.ы не 6у,lJ,уТ соответствовать друr друrу, 6aTЫ С4еТ4НКОВ так>ке 6удуТ раз- нымн. Восстановленне после c60 в ,lJ,анном СЛУ4ае 6удет заКnlOчатьс в откате к Ta6JlLl1 u.e, содер>каw,е меньшее зна4енне С4еТ4нка. XOT 3ТО н не nолна nроu.едура BOCCTa новленн от c60, все >ке оно nозволет 06нару>КНТЬ ошн6ку н ВЫnОЛl-fНТЬ необходнмы откат. 
108 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Команда та6лнчно заnнсн нсnользуетс в rлаве 1 О, в nporpaMMe заrруЗ t /нка для заnнсн ннсрормацнн в naMTb nporpaMM. Едннственное npHMeHeHHe та6ЛНЧIIО заПLl1СН заКJllОчаетс в заnнсн ннформаu.нн в naMTb nporpaMM нлн в perHCTpbI КОllсрнryраЦLl1Н. 3.6. Макропоследовательности Макропоследовательности нлн макросы  зто rpYnnbI комаllД, которые pa60TalOT так >ке, как н Функu.нн, однако ОТСуТствует CB3b ДJl 06paw,eHH к макроnоследоватеJ\Ь ностн нлн ДJl возврата Н3 нее. Второе ОТЛН4не заКnlO4аетс в том, 4ТО команды, BXO дw,не в состав макроса, вставлIOТС в nporpaMMY вскнй раз, коrда HMeeTC вызов 3Toro макроса. Определение маХРОСОБ Макросу npHcBaHBaeTc HM, за которым следует слово МАСАО, после KOTOpOlO следует Л1060 параметр, связанны с зтнм макросом. npHMep 3.27 НЛЛlOстрнрует on ре,lJ,еленный ДJl ассем6лера макрос, который C,lJ,BHraeT параметр "what" влево. Метка "what" называетс замещаемым параметром. BCKH раз, KOr,lJ,a команды макроса нс- nОЛЬЗУIOТС в nporpaMMe, метка "what" замеw,аетс параметром, указанным справа от нменн макроса. В зтом npHMepe макрос, названный ShiftL, нсnользуетс два>кды н вся KH раз параметр "what" замеw,аетс WREG. Пример 3.27 ShiftL МACRO what ;макрос и мменем ShiftL ADDWF what endm ;Макрос ShiftL мсnоnьзуеТСR 2 раза MOVLW 1 ShiftL WREG ;исnоnьзует макрос AnR WREG ShiftL WREG ; мсrrоnьзует макрос AnR WREG В npHMepe 3.18 nоказана nporpaMMa, KOTopa нсnользует фУНКЦНIO ДJl nре06разова IIH нз шестнадu.аТНРН4ноrо формата в формат ASCII. npHMep 3.28 показывает ту >ке caMYIO nporpaMMY, однако вместо НСnОЛЬЗ0ванн функu.нн Д11 npe06pa30BaHH нз шестнадu.атн- РН41.юrо формата в формат ASCII нсnользуетс макрос. ECnH зтн два npHMepa сраш-/нть, то мо>кно YBltlДeTb, 4ТО ме>кду ннмн не столь уж. 60льша pa3HHu.a. Функцн завершается KOMaH дo return, а макрос - командой ENDM. ENDM не вноснт HHкaKoro ко.ца в nporpaMMY, в то Bpe M как REТURN вставлет ОДНУ команду. Макрос на ОДНУ команду КОро4е, 4ем Функu.н. В rлавно nporpaMMe функu.н BЫ3ЫBaeTC ДВа>КДЫ, макрос также BЫ3ЫBaeTC два>КДЫ. Коrда BЫ3ЫBaeTC функu.н, команда CALL тре6ует ДВУХ машннных слов Д11 cBoero pa3Mew,eHH, а npH ВЫЗ0ве макроса доnолннтеЛЫ-iые машннные cnoBa Bo06w,e не нуж.ны. V13 ЛНСlинrа по npHMepy 3.28 вндно, 4ТО команды макроса вставлIOТС в проrрамму два раза - по одному на Ka>K,lJ,Oe обраw,енне к макросу. 
lnaBa 3. Набор коман)]. семейства PIC 18 109 Пример 3.28 ;*** Макрос npe06pa30BaHMR мз wecTHaAuaTMpMqHOrO opMaTa в opMaT ASCII *** Пре06разует npaB nony6aT WREG в opMaT КОАа ASCII, B03BpeMoro во WREG Hex2ASCII MACRO ANDLW OxOF ADDLW ОхЗО DAW BTFSC WREG, 6 INCF WREG ENDM ;04мстка npaBoro nоnубата ;nреобразованме ero в ЛSСII ;*** Main program *** Main: MOVLW Ох5с ;заrрузка TeCTOBX Аанных MOVWF ASCII Н Hex2ASCII ;rrре06раЗ0вание мnaAWero nony6aTa MOVWF ASCII L ;сохраненме ero в ASCII L MOVFF SWAPF ASCIIH, WREG WREG ;nonY4eHMe cTapwero nоnу6айта Hex2ASCII ;npe06pa30BaHMe ero в ASCII MOVWF ASC 1 1 Н ;сохраненме ero в ASCII Н Stop: GOTO STOP , I':""ot. Еслн вы скомnилнруете зтот npHMep, то nOHTb cnoc06, которым макрос отобра >KaeTC в лнстннrе комnнлu.нн nporpaMMbI, мо>кет nоказатьс вам трудным делом. В зтом лнстннrе Ka>Kдa команда макроса nовлетс ,lJ,ва>кды С раЗЛН4НЫМН несме>кнымн · адресамн. Однако, еслн вы мысленно nepeMeCTHTe Ka>KAYIO команду макроса на COOT BeTCTBYIOw,ee ей место в nporpaMMe, то все станет на свон места. То, n04eMY команды макросов npHBoATC в лнстннrе нменно такнм 06раЗ0М - зто заrадка. 3.7. Резюме 1. Лнтеральные команды n03ВОЛЯlOт НСnОJlьзоваlше IlнтераЛЫ-IЫХ HJlLl1 nОСТОЯНllЫХ данных, в основном с perHCTpoM WREG. ЛLl1тераJlьные команды нсrюльзуlOТ коды onepa u.H, - такне как MOVLW нлн ADDLW, npH зтом первые трн 6уквы обозначаlOТ оnераЦLl1Ю, а nоследнне ,lJ,ве  06ъект onepau.HH (L = лнтераJl, W = WREG). При 3ТОМ команда ADOLW добавляет лнтеральные данные к WREG. HanpHMep, команда ADDLW 6 добавляет 6 к WREG. 
11 О ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 2. V1MeIOTc так>ке друrне лнтерanЫ-iые команды: ВЫ4нтанне (SUBLW), ВКJIЮ4аlO w,ee ИЛV1 (IORLW), НСКЛlO4нтеJlьное V1ЛV1 (XORLW), v1 (ANDLW), а так>ке УМIЮ>КСННС (MULLW). Имеетс так>ке лнтеральны возврат нз nроu.едуры (RETLW), KOTOPЫ 1103130- JleT возвраw,ать JlHTepaJl во WREG. З. Две Jlнтеральные команды не нсnользуют WREG. 3то команды MOVLB н LFSR, которые заrру>каlOТ perHCTp вы60ра 6анка (BSR) L/1ЛН perL/1CTp вы60ра срала (FSRO, FSR1, or FSR2) лнтеральнымн даннымн. 4. Бнтовые команды 06ecne4HBalOT возмо>кность с6роса отдельных бнтов (BCF), установкн (BSF) нлн nepeКnlO4eHH (BTG). 3то 06есnечнвает nOJlHbI контроль над co CTOHHeM всех 6нтов в ЛlO60М месте naMTH данных, BКnI04a сnеu.нальные cpYHKЦHO нальные perHcTpbI. 5. Друrнмн 6нтовымн командамн ВЛlOтс BTFSC н BTFSS, которые npoBepIOT COCTOHHe 6нта н nponYCKalOT следуlOw,уlO команду, еслн 6нт лн60 с6рошен (BTFSC), лн60 установлен (BTFSS). 6. Батовых коман,lJ, 60льше, 4ем команд какоrолн60 HHoro THna. Все оtlн рабо TalOT с 6aTOBЫMH даннымн. Cnoc06, которым 0603Ha4a1OTC зтн команды, указывает на то, как ра60тает зта комаН,lJ,а. HanpHMep, команда ADDWF д06аВJlяет 6aT L/13 WREG к 4eKe perHCTpoBoro файла нлн >ке содер>кнмое 4eKH perHcTpoBor"O срала к coдcp >кнмому perHCTpa WREG. Наnравленне onepau.HH мо>кет Bы6HpaTbC. 7. Данные адресуlOТС посредством нсnользованн номера perHCTpa НJlН >ке KOC венно 4ерез указатель, расnоло>кенны в perHCTpe вы60ра фала (FSR). Еслн нсnользу eTC FSR, то OnepaH,lJ,aMH ДJl косвенной a,lJ,pecau.HH ВЛlOтс INDFO, INDF1 н INDF2. Так>ке досrynными ДJl косвенной адресаu.нн naMTH ВЛlOтс POSТlNCO, POSТlNC1 н POSТlNC2, а так>ке PREINCO, PREINC1 н PREINC2. 'PLUSWO, PLUSW1 н PLUSW2 MOryr так>ке L/1сnользоватьс для сло>кенн WREG с perHCTpOM FSR. 8. Команды уnравленн n03ВОЛlOт осуw,ествлть проверку условн, а затем, OC HOBЫBaCb на результатах 3TO npoBepKH, выnолнть переход к друrой CeKu.HH nporpaM- мы. 3тн команды 4асто реалнзуlOТ оператор if (еслн) . 9Лроrраммные KOHCTPYKu.HH BJlIOTC стронтелы !ымн БJlокамн nporpaMMHpoBa HH. HaH60Jlee 4асто НСnОЛЬЗУlOтс слеДУIOw,не nporpaMMHbIe КОНСТРУКЦL/1L/1: ifttlCпCJSC, repeatuпtil, while, а так>ке Функu.нн. 10. Та6ЛН4ные команды 06есnечнваlOТ досryn к naMTH nporpaMM. ПамТI) про rpaMM C4HTЫBaeTC С НСnОЛЬЗ0ваннем команды та6ЛL/14lюrо чтення (TBLRD) н заnнсыва eTC с НСnОЛЬЗ0ваннем команды та6ЛН4НОЙ заnнсн (TBLWR). 11. Данные в naMTH nporpaMM адресуlOТС С НСnОЛЬЗ0ваннем perHCTpa TBLPTR, а nepCHoCTC ,lJ,анные всеrда 4ерез perHCTp TABLAT. 12. nOHCKoBbIe та6лнu.ы 4асто НСnОЛЬ3УlOтс ДJl nре06разованн данных нз oд HO формы В друrуlO. 1 З. Макроnоследовательностн НСnОЛЬ3УlOтс в nporpaMMax ДJl nовышенн нх скоростн работы, однако 06Ы4НО онн Tpe6YlOT 60льшеrо 06ъема пространства nамятн, 4ем зквнвалентные функu.нн. 3.8. Вопросы и задания 1. Что такое лнтеральные данные? 2. С какнм perHCTpoM МНКРОКОНТРОЛJlера 06Ы4НО pa60TalOT лнтеральные KOMall ды? З. Что делает команда AODLW? 4.Вы6ернте ЛL/1тераJlЬНУIO коман,lJ,У для ВЫnОJ1нення кюкдо нз СЛСДУIOw,L/1Х задач: 
rnaBa 3. Набор коман)]. семейства PIC18 111 а. поместнть Ох34 в perHcTp WREG Ь. д06авнть 3 к perHcTpy WREG с. выполннть операu.нlO BKJl104alOw,ero V1ЛV1,цл 6 н содер>кнмоrо perHcTpa WREG d. заrрузнть 2 в perHcTp вы60ра 6анка е. OTHTb от О содер>кнмое perHcTpa WREG 5. nOCHHTe, 4ТО делаlOТ слеДУIOw,не лнтеральные команды: а. MOVLWOx6A Ь. XORLW 4 с. LFSR Ох123 d. MULLW.10 е. MOVLB 2 6. Напншнте KOPOTKYIO последовательность команд, KOTopa заrру>кает 3 во WREG, затем д06авляет 9 н, HaKoHeu., выполнет операu.нlO ВKJlючаlOw,еrо V1ЛV1 ,цл co дер>кнмоrо WREG н лнтерала 5. 7. Напншнте KOPOTКYIO последовательность команд, KOTopa помеw,ает OxOF во WREG, а затем 04Hw,aeT два самых правых 6нта, устанавлнвает самый левый 6нт, а за тем ннвертнрует 6HTOBYlO познu.НIO 5, НСnОЛЬ3У только лнтеральные команды ,цл pe шенн это зада4Н. 8. Вы6ернте 6HTOBYlO команду, KOTopa: а. 04Hw,aeT 6HTOBYlO познu.НIO 2 perHcTpa WREG Ь. Устанавлнвает 6HTOBYlO познu.НIO 3 perHcTpa 6анка досryпа Ох11 с. nepeKJl104aeT 6HTOBYlO познu.НIO 3 perHcTpa банка досryпа Ох1А d. Устанавлнвает реrнстровый 6нт COCTOHH пере носа е. 04Hw,aeT 6нт N perHcTpa COCTOHH 9. Что делает команда BTFSC? 10. Что делает команда BTFSS? 11.Напншнте последовательность команд, НСПОЛЬ3У только 6нтовые н лн repaJlb- ные команды, KOTopa выnолннть прн6авленне 1 к содер>кнмому perHcTpa WREG, еСJ1Н 6нт переноса perHcTpa COCTOHH HaXOДHTC в еДННН4НОМ COCTOHHH 1 . 12. Какне 4eKH perHCTpOBoro срала содер>кнт 6анк досryпа? 1 З. 06ЪCHHTe, как проrрамма ПОЛУ4ает досryп к 4ейке perHCTpOBoro срала Ох200? . 14. В 4ем заKJl104аетс pa3HHu.a мюкду 6айтовым сло>кеннем н лнтеральным сло- >кеннем? 15. Опнwнте, 4ТО делает кюкда Н3 следуlOw,нх команд: а. MOVFFWREG, Ох10 Ь. ADDWF Ох20, О с. ADDWF Ох20, 1, 1 d. DECF ОхЗ4 е. INCF ОхЗ4, 1 16. Напншнте KOPOTKYIO проrрамму, KOTopa coxpaHeT Ох5А в 4eKax 6анка дoc тупа Ох1 О, Ох20 н ОхЗО. 17. Напншнте KOPOTKYIO проrрамму, KOTopa ду6лнрует содер>кнмое 4eKH банка досryпа Ох12. 18. Напншнте KOPOTKYIO последовательность команд, KOTopa В031ЮДНТ в квадрат содер>кнмое perHcTpa WREG. 19. KaKa 6aTOBa команда выполнет сложен не с У4етом бнта состояння пере- носа? 20. rде находнтся HHcpopMau.H о занмствованнн после выполнеllНЯ ВЫ4нтаIlНЯ? 21. Что делает команда SETF? 
112 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 22. Напншнте KOPOTKYIO последовательность команд, KOTopa добавлет 24разрдное 4НСЛО, находw,еес в 4eKax Ох10, Ох11 н Ох12 к 24разрядному чнслу, находw,еес в 4eKax ох20, Ох21 н Ох22. Чнсла xpaHTbC в срормате с 06ратным no pДKOM 6айтов. Результат coxpaHeTC в 4ейках Ох20, Ох21 н Ох22, ЛlOьые переllОСЫ ме>кду 6айтамн ДОЛ>КНЫ Y4HTЫBaTbC. 23. 06ЪCHHTe, как FSRO нспользуетс ДЛ KOCBeHHO адресацнн 4ейкн памятн u Л1060 команде. 24. Что делает команда DCFSNZ? 25. Напнwнте последовательность команд, KOTopa умножает содер>кнмое perH стра WREG на десять. Вы не ДОЛ>КНЫ НСПОЛЬЗ0вать команду YMHO>KeHH. 26. д,л 4ero служнт операнд POSTINC1? 27. Как ПОЛУ4НТЬ дополненне до двух perHcTpa WREG? 28. Как ПОЛУ4НТЬ дополненне до еднннu.ы perHcTpa WREG? 29. Что делает команда ВАА? 30. Сравннте н протнвопоставьте команды ВАА н GOTO. . 31. Команда BNZ выполнет относнтельный лн60 а6солlOТНЫ переход? 32. Каков днапаЗ0Н адресов, в пределах KOToporo команда BZ мо>кет выnолнть переход в проrрамме? 33. Наnншнте KOPOTКYIO проrрамму, KOTopa pa3Mew,aeT Ох12 в 06ласть nамятн 6анка досryпа от ОхОО до Ох22. 34. Контрольна сумма представлет с060Й сумму (прн от6расыоаннн переllО- соо) всех 4нсел 6лока памтн. Напншнте проrрамму, которая reHepHpyeT 8разрднуlO КОНТРОЛЬНУIO сумму ДЛ содер>кнмоrо 6анка памтн О (от ОхОО до OxFF) н coxpalleT ее BoWREG. 35. Как pa60TalOT команды CALL н RETURN? 36. Как нспользуетс стек CPYHKu.HMH CALL н RETURN? 37. Напнwнте срунKu.H10, KOTopa срормнрует 16разрднуlO КОНТРОЛЬНУIO сумму ДЛЯ всех 4eeK 6анка памтн О. 3та контрольна сумма дол>кна 6ыть сохранена u perH страх PRODL н РАООН в срормате с 06ратным расположеннем 6aTOO, поскольку one pau.H YMHO>KeHH не выполнлась. 38. 06ЪCHHTe, как в прнмере 3.17 выполнетс пре06раЗ0ваllне Н3 шеСТlЩLща ТНРН41-юrо кода в код ASCII. 39. Что такое та6лнчные команды? 40. Напншнте CPYHKu.H 10 , KOTopa осуw,ествляет доступ к таблнце простых чнсел с u.елыо определенн Toro, влетс лн 4НСЛО простым нлн нет. 8pa3PMHoe проверяе- мое 4НСЛО передаетс это CPYHKu.HH 4ерез WREG. Та6лнu.а дол>кна содер>кать простые чнсла uплоть до 251. Еслн 4НСЛО влетс простым, то дол>кна OTpa6aTЫBaTbC комаllда RETURN с установленным в 1 6нтом переноса, а еслн нет  то дол>кна OTpa6aTЫBaTbC команда RETURN с 6нтом переноса, c6poweHHbIM вО. 41. Как определетс макропоследовательность? 42. Каков расход памтн прн ВЫЗ0ве макропоследовательностн? 43. Напншнте макрос, KOTOPЫ сдвнrает 8-раЗрЯДllое содер>кнмое ЛlO60rо perH- стра вправо на однн разрд. (npH сдвнrе вправо помеw,ается ноль u caMЫ левый 6нт результата). 
rnaBa 4. ITporpaMMHpoBaHHe На Slзыке Ассембnера 113 rлава 4. Проrрамммрованме на языке Ассемблера Ce4ac, после Toro, как вы Н3У4НЛН u.елый pд команд PIC, вы мо>кете нх ДOCTa точно эсрсректнвно нсnользоuать в короткнх nporpaMMax. Однако, вам необходнмо У3- нать 60льше относнтельно проrраммнрованн на 3ЫKe Ассем6лера. Вместе с тем, если вы nрндете к выводу, 4ТО проrраммнрованне на 3ЫKe Ассемблера окажетс для оас слишком СЛО>кНЫМ, то вы смо>кете перетн к НСnОЛЬЗ0ваннIO 3ЫKa nporpaMMHpo вания С npH разработке nporpaMM Д1l YCTPOCTB PIC. Еслн вы уже решнлн, 4ТО будете создавать npoenbI в основном на С, то можете проnустнть эry rлаву н nерети lIeno средственно к нзученнlO rлавы 5. Матернал, KOTOpЫ вы уже нзучнлн в rлаве 3, является достаТ04НЫМ, 4т06ы делать 60ЛЬШУlO 4асть не06ходнмых вставок на Ассемблере в npo rpaMMax на С. В дaHHO rлаве представлены некоторые алrорнтмы н проrраммы на Асссмблере,  онн предназна4ены Д1l проrраммнстов, pa60TalOw,Hx с 3ЫKOM Ассем6лера. MHorHe И3 этнх алrорнтмов так>ке paccMaTpHBalOTc в не06ходнмых СЛУ4ах так>ке и rлаве 5 npH И3У4еннн nporpaMMHpoBaHH на 3ЫKe С. Самым лучшнм подходом в данном СЛУ4ае 6удет Н3У4енне 06енх rлав  как rлавы 4, так н rлавы 5. В зтой rлаве нзлаrаетс важный матернал,  он позволнт вам развнть 3HaHH об Ассемблере, которые ЕЗы уже имеете. После завершенн H3Y4eHH дaHHO rлавы вы сможете: 1. nHcaTb nporpaMMbI, работаlOw,не со стеком данных. 2. nHcaTb проrраммы, НСПОЛЬ3УIOw,не 04ередь. З. nHcaTb проrраммы, ВЫnОЛНIOw,не деленне н умно>кенне 4нсел. 4. Маннпулнровать ,lJ,BOH4HOKOДHpOBaHHЫMH дестнчнымн (ВСО) чнсламн, HC nользу сло>кеНl;-1е н ВЫ4нтанне. 5. Осуw,ествлть двунаправленное пре06раЗ0ванне ме>кДУ ДВОН4НЫМН и BCO 4нсламн. 6. Формнроuать проrраммнуlO BpeMeHHYIO задер>кку 4. 1. Структуры стека и очереди 04ередн н стекн  3ТО ,lJ,ве структуры данных, которые НСnОЛЬ3УIOТС во MHorHx nporpaMMax с u.елыо решенн ра3ЛН4НЫХ зада4. 04ередь храннт данные по nрннu.ипу "первым воwел  первым вышел", KOTOpЫ 4асто Ha3bIBalOT npHHu.HnoM FIFO. Стек xpa'.. ннт данные по прннu.нпу "первым вошел - последннм вышел", KOTOpЫ 4асто называют nрннu.нпом LIFO. 04ередь - это 6усрер, KOTOpЫ 4асто нспользуетс ме>кду внешнимн YCTpOCTBaMH ввода-вывода н мнкроконтроллером. Стек 4асто нсnользуется Д1l Bpe MeHHoro н эсрсректнвноrо xpaHeHH данных в памтн. HanpHMep, С4еТ4НК команд coxpa HeTC в стеке как адрес возврата Н3 CPYHKu.HH. Блаrодаря стеку, ВЫЗ0ВЫ срункu.нй MoryT вкладыватьс. 06су>кдаемые здесь стекн П03ВОЛIOТ храннть данные в срорме отдеnьно ro стека в naMTH данных. Стек данных Фнрма Microchip не пошла пока по nyrH аппаратно реалнзаu.нн стека данных. Вместе с тем, мо>кно 6ыло 6ы предnоло>кнть, 4ТО он cyw,ecTByeT, поскольку имеются команды PUSH (Занестн в стек) н РОР (V1звле4Ь Н3 стека). Однако назна4енне команд PUSH н РОР не свзано с сохраненнем лн60 нзвле4еннем данных Н3 стека данных,  анн НСnОЛЬ3УIOТС Д1l занесенн содер>кнмоrо С4еТ4нка команд + 2 в проrраммны стек, а команда РОР нзвлекает адрес возврата Н3 проrраммноrо стека. 
114 Прнмененне MHKpOKOHTpOnnepOB PIC18 Стек данных  это хорошее место Д1l BpeMeHHoro coxpaHeHH данных BHyrpH ФУIIКЦНЙ либо нных прнкладных проrрамм. Стек данных вляетс ннтеrралыюй частыо комnнлтора 3ЫKa С. Еслн содер>кнмое всех perHcTpoB сохранется в стеке BIlYIPH ФУIIКu.ин, то эта CPYHKu.H CTaHOBHTC прозра4НО Д1l проrраммы, которая ее нспользу ет. 3та nрозра4НОСТЬ 06еспе4нвает возмо>кность НСnОЛЬЗ0ванн ЛОКaIlЫIЫХ перемен ных с локально областыо дeCTBH в cpYHKЦHX на 3ЫKe С. CoxpalleHHe perHcTpoB BHyrpH CPYHKu.HH предотвраw,ает с60н. д,л созданн стека данных проrрамме lIужеll указатель на 06ласть памтн данных, а так>ке метод занесенн н Н3ВJЮ4ення AallllbIx Н3 стека данных. PerHcTp FSR2, KOTOpЫ может прнментьс в качестве указателя стека, нспользуетс в прнмере 4.1 Д1l адресацнн 06ластн naMTH, KOTopa может ра60ТЭIЪ как стек данных. д,л занесенн данных в стек мы 6удет нспользшзать срорму KOCBellllO адресаu.нн POSTDEC2, а Д1l нзвле4енн данных Н3 стека  срорму KocoeHHO адресацнн PREINC2 ШеСТllадu.ать 6aTOB naMTH, зарезервнрованных под стек данных, 06есnечнuаlOТ возмо>кность cpopMHpOBaHH стека, достаТ04ноrо по rлу6нне ДЛЯ 60ЛЫllНIIства про rpaMM. Стек данных эсрсректнвно MHoroKpaTHo нсnользует одну н ту же 06ласть памятн ,lJ,анных. Как только данные помеw,аIOТС в стек данных, стек увеЛН4нuаетс в размерах в наnравленнн, cooTBeTcTBYIOw,eM YMeHbweHHIO адресов памтн, а по мере Toro, как дall ные нзвлекаlOТС Н3 стека, он "C>KHMaeTC" по направленнlO возрастаllНЯ адресов f1амя тн. Занесенне HHcpopMau.HH в стек Ha3bIBalOT "заталкнваннем" данных в стек, а нзuле4е нне данных Н3 стека  нх "выталкнваннем". npHMep 4.1 НЛЛlOстрнрует нннu.налнзаu.нlO указател стека, а так>ке команды, заносw,не данные в стек н нзвлекаlOw,не нх Н3 Hero. Стек определетс в ceKu.HH UDATAACS нлн UDATA как Stack RES 16. Л106а 06ласть может НСnОЛЬЗ0ватьс прн том >ке временн досryП,а вонду НСПОЛЬЗ0вання FSR2. nop док данных в стеке данных peBepCHpyeTC; стек данных ра60тает по прннu.нпу FILO (первым uошел, последннм вышел) как 6ycpepHЫ масснв. В npHMepe 4.1 в стек rlOMe w,aeTC 2, затем З. Коrда данные нзвлекаlOТС Н3 стека, перво нзuлекается 3, затем 2. Пример 4.1 ОDАТА ACS Stack RES .16 LFSR 2, Stack + .15 ;иниuиаnмзаUИR указатеnR стека ; (аАрес BepWMH стека) ;nporpaMMH КОА, rrомеща в стек Ава qисnеннх знаqеНИR MOVLW MOVWF MOVLW MOVWF 2 POSTDEC2 3 POSTDEC2 ;занесение в стек 2 ; занесенме в стек 3 **** вrrоnнение Аруrих Аестви ****** rrроrраммныli КОА, извnека мз стека Ава qисnеннх знаqеНИR MOVF MOVF PREINC2, О PREINC2, О ;мзвnеqение из стека 3 iизвnеqение И3 стека 2 
rnaBa 4. Проrpаммнрованне на Slзыке Ассембnера 115 Теперь, коrда мы nОНЯJlИ ценность стека, нам сле,lJ,ует НСПОJlьзовать ero в про rpaMMax ДЛ BpeMeHHoro хранения ,lJ,анных. Во мноrих npHMepax, прнведенных в OCTaB шеся 4астн это rлавы, преДnОJlаrаетс, 4ТО в ка4естве указателя стека данных нс- ПОJ1ьзуетс FSR2, а стек ,lJ,анных нмеет rлу6нну в 16 6айтов. nредполо>ким, 4ТО прнмер 4.1 nереписан такнм образом, 4ТО он ВЫnОJlняет пре- 06раЗ0ванне 6айта во WREG в двухразрядное чнсло ASCII, возвраw,аемое в ASC"L н ASCIIH. npHMep 4.2 иллюстрирует Эry, уже рассмотренную нами ранее, <рункцнlO (Hex2ASC). Единственна Bew,b, которая нзмеННJlась с тех пор, коrда Эry <рункцню мы назывanн Hex2ASCII, вляетс исnользованне ячеек памяти ASCIIL н ASCIIH. Стек нс- пользуетс ДЛ coxpaHeHH содер>кнмоrо perHcTpa WREG перед пре06разованнем н восстановленн ero нз стека после nре06раЗ0вання. Едннственнымн perHcTpaMH оне Функu.нн Hex2ASC, содер>кимое которых нзменетс, явлютс 4eKH perHcTpouoro файла ASC"L н ASCIIH. Прииер 4.2 ;AaHHe В nаМRТИ Аанных MyData UDATA_ACS Stack RES .16 ASCII L RES 1 ASCII Н RES 1 ;опреАеЛRет, rrpOCTpaHCTBO стека ;размещает младшую часть ASCIIKoAa ;размещает старwую часть ASCIIKoAa ;************* ФУНКЦИR Hex2ASCII *********** использует l' уровень проrраммноrо стека исnоnьзует 2 ypOBHR стека Аанных исnоnьзует WREG nре06разует nравый rrолубат WREG из wестнаАuатириqно КОАИРОВКИ в КОД ASCII, возврааемый в стеке Аанных ;******************************************** Hex2ASCII : ANDLW ADDLW DAW BTFSC INCF RETURN OxOF Ох30 ;изолмрует младши полубат . , :l WREG, 6 WREG ;************ ФУНКUИR Hex2ASC ************** использует 2 ypOBHR проrраммноrо стека исrrользует 1 Rчеку стека Аанных использует Hex2ASCII использует ASCIIL и ASCII_H nреобразует бат во WREG мз wecTHaAuaTMpMqHO КОАИРОВКИ в КОА ASCII, результаты возвращаЮТСR в ASCII L и ASCII Н  - ;******************************************** 
116 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Hex2ASC: MOVFF CALL MOVFF MOVFF MOVFF SWAPF CALL MOVFF MOVFF RETURN WREG, POSTDEC2 Hex2ASCII WREG, ASCII_ L PREINC2, WREG WREG, POSTDEC2 WREG Hex2ASCII WREG, ASCII Н PREINC2, WREG ;занесенме WREG В стек (сохраненме Wl\EG) ;npe06pa30BaHMe MnaAero nony6aTa ;n0nyqeHMe WREG ;noBTopHoe занесенме WREG В стек ;cBonnMHr nony6aToB ;npe06pa30BaHMe cTapero nony6aTa ;M3Bne4eHMe WREG М3 стека ;************** rnaBHaR nporpaMMa ****************** Иnnстрмрует B30B YHKUMM Hex2ASC nре06разует Ох5с В ASCII, nepeAaeT pe3YnbTaT В ASCII L (Ох43) м В ASCII Н (Ох35) Main: ;eCnM В nporpaMMe мсnоnьзуеТСR стек, то он AoneH ;npeABapMTenbHo MHMUManM3MpoBaTbcR м TOnbKo ОАМН раз LFSR 2, Stack+.15 ;мнмuмаnмзаUМR указатеnR стека MOVLW Ох5с ;заrрузка TeCTOBX AaHHX CALL Hex2ASC ;npe06pa30BaHMe Bcero 6aTa В ASCII ;резуnьтат nOMeaTcR В стек AaHHX ;********* 3Аесь HaxoAMTcR npoAoneHMe nроrрамм ********** Stop: ВМ Stop Очередь 04ередыо 4асто Ha3bIBalOT 6ycpepHYlO 06ласть памтн. 04ередь coxpaHeT пордок заноснмых в нее данных. 04ередн 4асто pa3Mew,aIOTc ме>кду YCTpOCTBaMH ввода- вывода н проrраммо. 04ередь ра60тает как 6усрер, поэтому данные не TepIOTC. В ОТЛН4не от стека данных, Д1l ра60ТЫ с 04ередыо не06ходнмо НСnОЛЬЗ0вать два указа тел. Однн указатель адресует 4eKY, в KOTOPYIO данные заностс в 04ередь, а друrо указатель адресует 4eKY, Н3 KOTOpO данные нзвлекаlOТС Н3 04ередн. Дол>кны pacno 3HaBaTbC два COCTOHH 04ередн: очередь пуста н очередь заполнена. Коrда 04ередь пуста, 06а указател адресуlOТ одну н ry >ке 4eKY памтн. Коrда 04ередь заполнена, то указатель выхода адресует на одну 4eкy нн>ке от указател входа. 04ередь  это KPy rOBa 06ласть памтн, KOTopa повторно нспользует одну н ту >ке 06ласть памтн, aHa лоrнчно тому, как это пронсходнт в СЛУ4ае стека. Одна 4eKa над BepWHHO 04ередн  это перва 4eKa 04ередн. Указателн дол>кны переKJl104атьс с BepWHHbI 04ередн на ее caMYIO HH>KHIOIO 4eKY, коrда указатель HHKpeMeHTHpyeTC 4ерез KOHeu. 04ередн. Прииер 4.3 ОDАТА ACS ; 6CTpaR naMR'rb Queue QEntry QExit RES .16 RES 1 RES 1 ;04ереАЬ ;указатеnь ВХОАа ;указатеnь BXOAa 
rnaBa 4. TIporpaMMHpoBaHHe на Slзыке Ассембnера 117 ОDАТА Stack RES .16 ;стек ;cneAye KOA pa3MeaTcR в ceKUMM nporpaMM СОDЕ ;AnR мнмuмаnмзаuмм OqepeAM MOVLW MOVFF MOVFF Queue ;мнмuмаnмзаUМR WREG, QEntry WREG, QExi.t npHMep 4.3 показывает, как зарезервнровать 16 6aTOB nамятн данных под оче- редь 2 6aTa под указателн, адреСУIOw,не 04ередь. nредnолаrаетс, что очередь 6удет ceKЦHe памтн, KOTopa по 06ъему не nередет 256-батовуlO rраннцу н размещена ннже Ox07F 6анке досryпа памтн данных, еслн зто возможно. д,л Toro, 4т06ы это cдe лать, разместнте 06ъвленне 04ередн в на4але ceKu.HH UDATAACS проrраммы. Секu.и досrynа к данным нсnоnьзуетс Д1l 04ередн, поскольку она адресуется одннм 8 разрдным адресом н не требует НСnОЛЬЗ0ванн perHcTpa вы60ра банка. Еслн также нсnользуетс стек, поместнте ero 06ъвленне в на4але ceKu.HH UDATA. д,ля Toro, 4тобы 04ередь 6ыла срункцнонально, нужно нсnользоuать дое CPYHKu.HH: одну Д1l эанесеllИ данных в 04ередь н друrуlO  Д1l нзвле4енн данных Н3 04ередн. 3тн CPYHKu.HH Ha3UatlbI PutQ н GetQ в npHMepe 4.4. С u.елыо достнженн нх макснмально B03MO>KHO стеllенн прозра4НОСТН, так>ке нспользуетс структура стека с perHCTpoM FSR2, pa60TalOw,HM как указатель стека. Функu.н PutQ coxpaHeT содер>кнмое perHcTpa WREG [3 04ередн, а функu.н GetQ нзвлекает данные Н3 04ередн н B03Bpaw,aeT нх во WREG. В обенх Ha3BaH ных CPYHKu.HX 6нт переноса perHCTpa COCTOHH указывает на ошн6ку, еслн С = 1 при воз[3рате н на oTcyrcTBHe oWH6KH, еслн прн возврате С = О. в прнмере 4.4 ошибка cpYHK u.HH PutQ 0зна4ает заполненне 04ередн, а ошн6ка CPYHKu.HH GetQ 0зна4ает, 4ТО очередь пуста. д,л нннu.налнзаu.нн 04ередн, у6еднтесь в том, 4ТО CPYHKu.HH QEntry н QExit с aдpe самн 04ередн, как показано в прнмере. Пример 4.4 **************** PutQ ********************** .' мсnоnьзует 1 уровень nроrраммноrо стека мсnоnьзует 3 ypOBHR стека AaHHX, aApecyeMX FSR2 coxpaHReT WREG в оqереАИ npM возврате С 1, eCnM OqepeAb заnоnнена PutQ: MOVFF MOVFF MOVFF MOVF'F MOVLW MOVWF MOVF MOVLW SUBWF BNZ FSROL, POSTDEC2 E'SROH, POSTDEC2 WREG, POSTDEC2 QEntry, FSROL О FSROH POSTINCO, О Queue+.16 FSROL, О PutQ1 ;занесенме в стек FSRO м WREG 
118 Прнмененне МНКрОКОНТроnлеров PIC 18 MOVLW MOVFF PutQ1: MOVF SUBWt BNZ SE'l'F MOVFF ВМ PutQ2: MOVF MOVFF MOVFF MOVFF CLRF РutQЗ: MOVFF MOVFF RETURN Queue WREG, FSROL QEntry, О FSROL, О PutQ2 S'I'ATUS, О PREINC2, WREG РutQЗ QEntry, О FSROL, QEntry WREG, FSROL PREINC2, INDFO STATUS, О PREINC2, FSROH PREINC2, FSROL ;проверка на заполнение ;если попна, то ;оqистка стека ;сохранение Аанных оqереАИ ;выrрузка стека ;**************** GetQ ********************** использует 1 уровень проrраммноrо стека использует 3 ypOBHR стека Аанных, аАресуемых FSR2 извnекает WREG из очереАМ rrри возврате С = 1, если очереАЬ пуста GetQ: MOVF SUBWF BNZ SETF RETURN GetQl: MOVFF MOVFF MOVFF MOVLW MOVWF MOVFF MOVFF MOVLW SUBWF BNZ MOVLW MOVFF GetQ2: MOVFF MOVFF MOVFF CLRF RETURN QEntry, О QExit, О GetQl STATUS, О FSROL, POSTDEC2 FSROH, POSTDEC2 QExit, FSROL О FSROH POSTINCO, POSTDEC2 FSROL, QExit Queue+.16 FSROL, О GetQ2 Queue WREG, QExit PREINC2, WREG PREINC2, FSROH PREINC2, FSROL STATUS, О ;npOBepKa на пустоту ;есnи rrYCTa iзанесение FSRO в стек ;занесение в стек Аанных мз оqереАИ iКОНТРОЛЬ rраниu ;выrрузка МЗ стека данных очереАИ и FSRO 
rnaBa 4. ITроrраммированне на Slзыке Лссембnера 119 04ередь нан60лее полезна прн орrаннзаu.нн взанмодествн МНКрОКОIIТрОJlJюра с внешннмн YCTpOCTBaMH. Аанные с BHeWHero YCTpOCTBa BBoдaOЫBoдa 3ШЮСЯ1СЯ в очередь н сохраllЯIOТС в ней. Коrда мнкроконтроллер будет rOToB к npHeMY даIlНЫХ, 01\ извлекает данные Н3 04ередн. 04ередь nредостаuляет меlОД 6усрернзаu.ии даllНЫХ ОТ. внешнеrо YCTpOCTBa на нх nyrH к мнкроконтроллеру. Напрнмер, KlIaBHaTypa может 'IOД КЛlO4атьс к мнкроконтроллеру 4ерез порты BBoдaOЫBoдa. Некоторые маШНIIНСТКН MOryr настолько быстро вводнть ннформаu.нlO с KJlaBHarypbI, что МНКРОКОНТРОJlлер Mor бы потерть 4асть данных, выnолн ДРуrне зада4Н. Очередь предотuращает потерю lCакнхлн60 данных, ос06енно в СЛУ4ах, коrда 06ра60тка входных данных nронзводнтся в режнме прерыванн, KOTOPЫ 6удет рассмотрен поз>ке. 4.2. Сложные арифметческие операц 3тот подраздел не рассматрнвает НС4ерпываlOw,е сло>кные арнфметическне Оllе pau.HH; однако алrорнтмы н методы, рассматрнваемые в нем, коне41Ю >ке, вляютс СЛО>КIIЫМН ДЛ мнкроконтроллеров, которые не YMelOT выnолнть оnераu.иlO делення. Такнм 06раЗ0М, дallHЫ подраздел рассматрнвает то, как ну>кно пнсать проrраммы .для выполненн деленн н YMHO>KeHH 4нсел, nревосходw,нх по разрядностн 8 разрядоu, ДЛ BCOapHcpMeTHKH, а так>ке ДЛ выnолненн ДРуrнх арнсрмеТН4ескнх оnерацн, KOTO рые сло>кны ДЛ выполненн мнкроконтроллерамн PIC. ВСDарифме.тика Встроенные снстемы 4асто НСnОЛЬ3УIOт ВСD-4нсла, по npH4HHe U03МОЖllOСТН бы cтporo npe06pa30BaHH ме>кду ДВОН4НЫМН н ВСD4нсламн. YCTpOCTBa отобра>кеllНЯ часто требуlOТ данные лн60 в ВСО, лн60 в ASCIIcpopMaTax. Е.тJ.ИIIСlвеIIl1a51 ра311ица Me>K ду ВСО н ASCII заKJllOчаетс в нanН4НН cMew,eHH, paBHoro ОхЗО. Pa311Hu.a ме>кду двоич- ным срорматом н ВСО HaMHoro 60лее сло>кна, тре6уя реаJlизаu.нн аЛIоритма, lIеобхо димоrо ДЛ пре06раЗ0вання ме>кду ннмн. Например, ВО3Ьмем ДВОН4ное 4НСЛО 11 111 О 1000 (ОхЗЕ8). Есть лн простой спос06 преоораЗ0вать ОхЗЕ8 в 1 000 дестнчное лнбо 0001 000000000000 в упакованном BCOcpopMaTe? Коне4НО же, cnoc06 есть, ОДllако он тре6ует ДЛ CBoe реалнзаu.ни зна4нтельноrо расхода проu.ессорноrо оременн н BЫ.;' ПОJlнення операций Д6Jlення, которые 4асто недосrynны для встроенных nрнложеllН, напнсаllНЫХ на 3ЫKe Ассем6лера, в снлу 4ero 4нсла 4асто oCTalOTc в BCOcpopMaTe. ВСО сложение и вычиание д,л выполнення прео6раЗ0вання прн BCO сло>кеннн предусмотрена спеu.наJlЬ Ha команда, называемая командой дeCTH4HO HaCTpOKH WREG (DAW). Команда DAW корректнрует результат ВСDупакованноrо (две u.HcppbI на 6aT) СJlожеIlНЯ. 3та комаllда явлетс He06XOДHMO вследствие Toro, 4ТО мнкроконтроллер складыuает только Д130 И4ные 4нсла. Команда DAW BbInOJlHeT показанные дanее проверкн после сложення упакованных ВСD4нсел во WREG с u.елыо KoppeKu.HH суммы для ПОЛУ4енн доnустнмо ro ВСD4нсла во WREG. (Уделнте вннманне тому, чт06ы Пр04есть сообщення завода изrотовнтел относнтельно нспользуемоrо вамн микроконтроллера, потому что одна И3 BepCH мнкроконтролnера нмеет пр06лемы с выполненнем KOMallДbI DAW. no внднмому в одном Н3 нсполненн мнкроконтроллера ДЛ правнлы-юrо ВЫllOлнення KO манды DAW nредварнтельно не06ходнмо с6роснть 6нт переноса. В данном подразделе 
120 TIpHMeHeHHe микроконтроnnеров PIC 18 мы будем nредnолаrать, 4ТО команда DAW корректно CPYHKu.HoHHpyeT во всех HCrlOJ1He HHX микроконтроллеров.) V1TaK, команда выnолнет сnеДУIOw,ее: 1. Еслн caMЫ правы nолу6ат WREG 60льше, 4ем 9 нлн 6нт ОС = 1, то д06авл ет Ох06. 2. Еслн caMЫ левы nолу6ат WREG больше, 4ем 9 нлн 6нт С = 1, то добаUJ1яет Ох60 Команда DAW добавлет ОхОО, Ох06, Ох60 нлн Ох66 к WREG Д1l коррекцнн резуль- тата после сложенн 4нсел в упакованном BCOcpopMaTe. Еслн результат 60Jlьше, чем 100 ВСО, то 6нт переноса (С) устанавлнваетс Д1l ннднкаu.нн разряда сотен резулыа- та. Следовательно, еслн 6удyr сло>кены 99 ВСО н 05 ВСО, то результатом 6удет 04 ВСО с установленным в еднннu.у бнтом С, НН,lJ,нu.НРУlOщнм наЛН4не сотнн в реЗУllьтате после BbInOJlHeHH команды DAW. nредпоnо>кнм, 4ТО 4разрдное упакованное ВСD4НСЛО в perHcTpax срайла дoc тупа Ох1 О н Ох11 CYMMHpyeTC с 4разрдным упакованным ВСD4НСЛОМ в perHcTpax срайла досryпа Ох20 н Ох21. nporpaMMa, показанна в прнмере 4.5, решает зту зада4У. Обратите вннманне на то, 4ТО перенос после сложенн 6aTOB Ох1 О н Ох20 прн6авлет c к результаry сло>кенн Ох11 с Ох21 с НСnОЛЬЗ0ваннем команды сложенн с перено- сом. Введнте nporpaMMY в IDЕ н выполннте ее с несколькнмн ра3ЛН4НЫМН ВСD4нсламн в perHcTpax Д1l H3Y4eHH Toro, как ра60тает эта nporpaMMa. Так>ке 06ратнте вннмание на то, 4ТО еслн KOHe4HЫ пере нос 6удет равен лоrН4еско, то Ох01 6удет заIЮСНТЬС в Я4еку Ох22, ннднu.нРу разрд 10000 результата. Пример 4.5 Main: MOVF Ох10, О ADDWF Ох20, О DAW MOVWF Ох20 MOVF Ох11, О ADDWFC Ох21, О DAW MOVWF Ох21 CLRF Ох22 BTFSC STATUS, О INCF Ох22 Stop: ВМ Stop iA06aBneHMe Ох10 к Ох20 ;npe06pa30BaHMe в BCD-opMaT ;сnоение с переносом Ох11 с Ох21 ; npe06pa30BaHMe в BCD-opMaT ;no nocneAHeMY переносу nредnоло>кнм, 4ТО CKJlaдbIBaIOTC 4разрдные неупакованные ВСD4нсла. nep вое 4НСЛО coxpaHeTC в 4eKax от Ох1 О до Ох1 3, а второе  в 4eKax от Ох20 до Ох2З, при этом Ох24 содер>кнт разрд 10000 результата. HeynaKoBaHHoe ВСD-4НСЛО coxpaH eTC как О,lJ,на u.Hcppa на 6aT. Поскольку Д1l cpopMHpOBaHH суммы ну>кно ВЫllОЛНН1Ъ 4етыре оnерацнн сло>кенн, KOCBeHHa адресаu.и будет наНЛУ4ШНМ выбором при HanH саннн дaHHO проrраммы, как это показано в npHMepe 4.6. AaHHa nporpaMMa мо>кет CKJlaдbIBaTb неупакованные ВСD4нсла ЛlO60Й разрдностн посредством изменени 3Ha4eHH С4еТ4нка. nporpaMMa CKJlaдbIBaeT одновременно два НЗ0лнрованных HeynaKo ванных 4Hcna н, еслн pe3YnbTaT равен Ох1 О нлн 60льше после выnолненн команды DAW, nporpaMMa удалет Ох10 KOMaHДO ANDLW OxOF, 4ТО coxpaHeT 6нт состоння пе 
rnaBa 4. ITporpaMMHpOBaHHe на SlзЫке Ассембnера 121 реноса. Команда ANDLW изменет только биты cpJlarOB нулевоrо LI1 отриu.ателыюrо pe зультатов. Пример 4.6 ain: LFSR О, Ох10 ;аАресаЦМR qMCen LFSR 1, Ох20 MOVLW 4 ;заrрузка CqeTqMKa MOVWF Ох30 BCF STATUS, О ;OqMCTKa С =..оор: MOVF POSTINCO, О ADDWFC INDF1, О DAW BTFSC WREG, 4 BSF STATUS, О ;eCnM сумма от 10 АО 18 ANDLW OxOF ;YAaneHMe 10 MOVWF POSTINC1 DECFSZ Ох30 ;UMKn BRA Loop CLRF INDF1 BTFSC STATUS, О INCF INDF1 Stop: BRA Stop Однако, как выnолнетс ВЫ4итание ВСD-4исел, если ОТСуТствует комаl-ща DAW ДЛЯ ВЫ4итани? Команда DAW срункu.ионирует корректно только ДЛ ВСDсложени. ВСDВЫ4итание выnолнетс посредством сложени с дополнением. Например, еСJlИ 123 ВЫ4итаетс И3 391, то правильное зна4енне разности nOJlY4aeTc в результате сло жени доnолнени 4исла 123 до дeCTH с 4НСЛОМ 391. дополнение до дести Д1l 4исла 123 равно 877. 877 плюс 391 даст 1268. Перенос (nоказанный как 1,000) OT6paCЫBaeT н результатом 6удет 268,  правильное зна4енне разности. Рис. 4.1 иллюстрирует nOJlY чение доnолнени 4исла 123 до 10. Было 6ы неплохо написать срункu.ию, KOTopa складывает или ВЫ4итает ynaKoBaH ные ВСD4исла лю60 размерностн. Возможно ли 3ТО? Аа, npHMep 4.7 иллюстрирует такую срункu.ию. AaHHa срункu.и имеет 4етыре параметра ВЫЗ0ва, которые должны 6ыть предварительно заrружены ДЛ Toro, 4т06ы зта срункu.и срункu.ионировала KOp ректно. Параметрами ВЫЗ0ва влютс: адрес 4исла 1 (FSRO), адрес 4исла 2 (FSR1), при зтом результат заnисываетс поверх 4исла 1; размерность 4исел в 6айтах (PRODL), а так>ке зна4ение ОхОО (ДЛ сложени) или Ох9А (ДЛ ВЫ4итани) в РАООН. 06ратите внимание, 4ТО в случае ВЫ4итани 4ИСЛО 1 ВЫ4итаетс И3 4исла 2. 
122 Прнмененне МНКроКОНТроnлеров PIC 18 999 123 876  дополнение до 9 + 1 877 ..............дополнение до 1 О OR 99А 123 877 дополнение до 1 О  Рис. 4. 1 . Аополненне .0.0 ,lJ,eCTH Пример 4.7 ;*************** ФУНКUМR SubAdd *************** мспоnьзует 1 уровень проrраммноrо стека мспоnьзует 2 ypOBHR стека дaHHX мсnоnьзует FSRO, FSR1, PRODL м PRODH Скnадвает/вqмтает упакованное BCDqMCnO, адресуемое FSRO к nM60 мз qMCna, адресуемоrо FSR1. Резуnьтат замеает qисnо в FSRO. Параметры вызова: FSRO = адрес number1 м резуnьтат FSR1 = адрес number2 PRODL KOnMqeCTBO 6aTOB каждом qMCne PRODH = ОхОО (cnoeHMe) or Ох9А (BqMTaHMe) SubAdd: MOVFF MOVFF WREG, POSTDEC2 TABLAT, POSTDEC2 ;занесенме в стек WREG ;занесенме в стек TABLAT BCF SubAdd1 : MOVFF MOVF STATUS, О ;с6рос переноса STATUS, ТАвит POSTINCO, О TSTFSZ PRODH SUBWF PRODH, О MOVFF ADDWFC DAW MOVWF MOVLW TABLAT, STATUS POSTINC1, О POSTINC2 Ох99 
rnaBa 4. Проrpаммнрование на Slзыке Ассембnера 123 TSTFSZ PRODH MOVWF PRODH DECFSZ PRODL ВRЛ SubAdd1 MOVFF PREINC2, TABLAT MOVFF PREINC2, WREG ;M3Bne4eHMe И3 стека TABLAT ;извлеqение мз стека WREG H.ETURN Умножение PaCCMaTpHBaeMЫ на60Р коман,lJ, ВКJlЮ4ает команду умноженн, однако днаl1азон ее ,lJ,eCTBH orpaliH4eH выполненнем 8ра3ря,lJ,ноrо умноження. Однако 6ывают случан, коrда нужно выnолннть умноженне 4нсел 60льшей разрядностн. Как только вы поймете алrорнтм умноження., то сможете nHcaTb проrраммы, выnолняюw,не умноженне 4нсел лю60Й разрдностн. Умноженне в ,lJ,вончной снстеме  зто после,lJ,овательность СДl3нrоl3 и onepau.H сложення. ДaHHЫ aJlrOpHTM тре6ует сохранення пронзве,lJ,енн, которое имеет вдвое 60льше разрядов, чем множнмое н множнтель. HanpHMep, 16раЗр,lJ,lIое умножение тре6ует nОЛУ4енн 32разрдноrо пронзве,lJ,ення. nporpaMMHbI алrоритм ВЫIIОЛllени 16раЗрЯДllоrо 6e33HaKoBoro сложени может 6ыть OnHcaH следующим обраЗ0М: . 1. С6рос 2раЗРЯ,lJ,ноrо пронзве,lJ,енн. 2. C,lJ,BHr множнтел вправо. 3. Еслн установлен 6нт пере носа, сложнть множнмое с результатом nрОН3lзсде tfи. 4. Еслн множнтель равен О, то завершнть BbIrlOJlHellHe CPYIIKu.HH. 5. C,lJ,BHr множнмоrо влево на О,lJ,ну nознu.ню 6. nOBTOpHTb шаrн от 2.0.0 5. 3тот aJlrOpHTM умноження ра60тает TOJlbKO с 6еззнаковымн 4нсламн, он ЮIJ1ЮСТ рируетс nроrраммой по npHMepy 4.8. В зтом прнмере 16разрядны множнтеш, псре дaeTC CPYHKu.HH 4ерез 4ейку памятн данных, адресуемую FSRO, 16разрядное МIIОЖИ мое HaXOДHTC 13 LleKe, aдpecyeMO FSR1, а 4eKa, предна31-1a4еНllaЯ ДJ1 хранения 32-' раЗрДlюrо пронзве,lJ,ения, aдpecyeTC FSR2. 3та CPYHKu.H мо>кет 6ыть МОДНСРиu.НрОl3а на такнм 06раЗ0М, 4ТО прн НСnОЛЬЗ0ваннн Toro же aJlrOpHTMa 6удет выполняться YMHO женне чнсел лю60 разр,lJ,НОСТН. Прииер 4.8 ;******************* ФУНКUМR MUL16 ******************** мспользует 2 ypOBHR проrраммноrо стека мсnоnьзует WREG, FSRO, FSR1, FSR2, TABLAT, PRODL м PRODH мсnоnьзует ункuим АddЗ2 м Shift YMJ\oae'l' coдepMMoe яqекм FSR1 на COAepMMoe Rчекм FSRO, coxpaHReT pe3YnbTaT в FSR2 16-раЗРRдное 4ИСnО х 16раЗрRдное 4MCnO > 32раЗрRДНЫ резуnьтат MUL16 : 
124 ITpHMeHeHHe MHKpoKoHTponnepoB PIC 18 MOVLW 3 MUL16a: CLRF ОЕСЕ' BNN MOVLW С LIr MOVl,W Сl,Ю;" MUL16b: MOVLW ННСЕ' RRCF BNC CALL MUL16c: CALL MOVF IORWF BNZ RETURN PLUSW2 WREG MUL16a 3 PI,USW] 7 РIЛSW] 1 PLUSWO lNDFO MUL16c Add32 Shift PLUSWO, О INDFO, О MUL16b ;OqMCTKa nромзвеАеНМR ;очмстка 2 6aTOB MHOMMoro ;CABMr MHoMTenR вправо ;eCnM нет переноса ;npM6aBMTb MHOMMoe к nромзвеАенм ;CABMr MHOMoro BneBO ;eCnM MHoMTenb не равен О ;*************** ФУНКUМR Add32 Add32: MOVFF MOVFF BCF MOVLW MOVWF Add32a: MOVF' ADDWF'C DECF'SZ BRA MOVFF MOVFF RETURN FSR2L, PRODH FSR1L, PRODL STATUS, О 4 TABLAT POSTINC1, О POSTINC2 TABLAT Add32a РНОDН, FSR2L PRODL, FSR1L ******************** ;**************** ФУНКUМR Shift ************* Shift: MOVFF BCF MOVLW Shift1: RLCF DECFSZ ВНА MOVF'F' RETURN FSR1L, РНОDН STATUS, О 4 POSTINC1 WREG Shiftl РЕООН, FSR1L 3та СРункu.и леrко модисрнu.ируетс ДЛ умножени 4L11сел ЛlOбо разрдности, однако, если зада4а заКnЮ4аетс в выполнении 16-разрдноrо умножени, то ее следу 
rnaBa 4. ITporpaMMHpOBaHHe на языке Ассембnера 125 ет решать посредством 4x KpaTHoro выnолнени команды MULWF с u.еJН)Ю ПОЛУ4ения 16разрдноrо произведени в аnsЗаnsО по следуюw,ему алrоритму: 1. УМIЮ>КИТЬ младшие байты и поместить реЗУJlьтат в ansO, ans1. 2. Умножить старшие байты и Ilоместить результат в ans2, апsЗ. З. Выполнить пере крестное умножение младшеrо байта nepBoro or18ранда со старшим байтом BToporo операнда, nри6авить произведение к ans1, ans2, апsЗ. 4. Выполнить перекрестное умножение мла.цшеrо байта BToporo операнда со старшим 6айтом nepBoro операнда, nрибавить nроизведение к ans1, ans2, апsЗ. 3тот npou.ecc иллюстрнруетс nримером 4.9, соответствуюw,ая nporpaMMa ro раздо КОр04е, 4ем срункци, nоказанна в при мере 4.8. 3та срункu.и использует множи- тель, aдpecyeMЫ FSRO, и множимое, адресуемое FSR1, при зтом Ilроизведение aдpe суется FSR2. Пример 4.9 так>ке выnолнетс 6ыстрее и требует MeHbwe nамти, 4ем пример 4.8. Пример 4.9 :У****************** Функuмя MUL16f ***************** исnоnьзует 1 уровень стека мсnоnьзует WREG, PRODL, PRODH, TABLAT, FSRO, FSR1, FSR2 16'раЗРRАное 6еззнаковое YMHoeHMe. COAepMMoe RqeKM, aApecyeMO FSRO, YMHoaeTCR на COAepMMoe RqeKM, aApecyeMO FSR1, pe3YnbTaT nOMeaeTCR в RqeKY, aApecyeMY FSR2 "".";ul6f : MOVF INDFO, О MULWF INDF1 MOVt't PRODI" lNDF2 MOVLW 1 MOVIF PRODH, PLUSW2 MOVFF FSR1 L, TABLAT MOVF PLUSWO,O MULWF PREINC1 MOVLW 2 MOVFF PRODL, PLUSW2 MOVLW 3 MOVFF PRODH, PLUSW2 МОVП' TABLAT, FSR1L MOVFF FSRlI, , TABLAT MOVJ INDtO , О MUI"WE' PH,EINC1 МОVП' 'l'ABLAT, rSR1L MOVFF FSR2L, TABLAT MOVF PRODL, О ADDWF PREINC2 MOVF PRODH, О ADDWFC PREINC2 CLRF WREG ADDWFC PREINC2 MOVE'F TABLAT, FSR2L MOVF PREINCO, О MULWF INDF1 
126 Прнмененне MHKpOKOHTpOnnepOB PICI8 MOVE' ADDWF MOVF ADDWC CLHF ADDWFC H.ETURN PRODL, О PREINC2 РНООН, О Pl"\EINC2 Wl\EG PREINC2 Деление к сожалению, команды делени в наборе команд PIC нет. Однако cyw,ecTBye'. co ответствующи алrоритм, который можно ИСnОЛЬЗ0вать в СJ1У4ае нео6ходнмости BЫ ПОЛllения операu.ии деJlени. Аеление  зто оnерацн, противоположная умножеllИlO, поэтому при rенераu.ии частноrо вместо сдвиrа вправо нужно НСПОJlЬЭОВЮЪ СДIЗИI IЗле во, а вместо СJ10ження  ВЫ4нтанне. Явлетс 06Ы4НЫМ делить делнмое ДBOHO раз pIДHOCTH и reHepHpoBaTb цеЛО4нсленное частное н u.еЛО4нсленны остаток. HarlpHMep, еслн 22 nоделнть на 5, то 4астным 6удет 4, а остатком  2. nрнводнмый далее аяrоритм ,lJ,елнт беззнаковое 16раЗрЯ,lJ,ное чнсло на 6еззнаковое 8разрдное 4HCJlO, npH зтом как 4астное, так остаток 6удут 6еззнаковымн 8разряднымн чнсламн. 1 . Сдвинуть делимое н 4астное влево на однн разрд. 2. Сравннть самые cTapwHe 8 разрдов делнмоrо с делнтелем и, если они 60ЛЬ ше, чем делнтель, Bbl4ecTb делнтель Н3 самых cTapWHX восьми разрядов делнмоrо, 110- cJle 4ero инкрементировать 4астное. З. Повторить war 2 восемь раз. 4. Остатком 6удут самые старшие 8 разрдовделнмоrо. Дл НЛЛlOстраu.ии выnолнени делени, срУliКu.ия, nоказаНllая в Ilрнмере 4.10, дe лит содержимое PRODL и РАООН на содержимое ТАВ LAT , nомеща частное в PRODL, а остаток  в РАООН после возврата И3 срункu.ии. Пример 4.10 ;***************** ФУНКUМR Div ******************* мсnоnьзует ОАМН уровень nporpaMMHoro стека МСПОJ1ьзует WREG, Pl\ODL, РНОDН, TABLAT, TBLPTRL м TBLPTRH Частное B03BpaaeTcR в PRODL, а остаток  в PRODH TABLAT npeABapMTenbHo заrруаеТСR AenMTeneM PRODL м РНОDН npeABapMTenbHO заrруаеТСR Аеnммьш Div: MOVLW 8 MOVFF WREG, TBLP'I'RL Divl : BCF STATUS, О RLCF TBLPTRH BCF STATUS, О RLCF PRODL RLCF РНОDН MOVF TABLAT, О SUBWF РНОDН, О BNC Div2 ; заrруае'.r в сqе'l'ЧМК 8 ;CABMraeT qaCTHOe BneBO ; CABMraeT деnммое BneBO ; сравнивает делммое с AenM'.reneM ;есnи AenMTenb 60nbwe AenMMoro 
f'naBa 4. ITporpaMMHpOBaHHe на Slзыке Ассембnера 127 MOVFF WREG, PRODH lNO' TI:3LPTRH : 1 v2: !)ECF'SZ TBLPTRlJ Вl{A Div1 MOVFF 'l'I:3LPTRH, PRODL H.ETUHN ;декрементмрует CqeTqMK ;4астное в PRODL Функция, nоказанна в примере 4.10, может 6ыть модисрицирована на деление чисел ЛlO60Й разрдности, она также может выполнять деление со знаком, если перед выполнением делени 4исла 6удуТ сделаны nоложитеЛЫ-IЫМИ. Если предnринимаетс попытка делеllИ 4исел со знаком, то как 4астное, так н остаток 6удут отриu.ательными, если ВЫllолняется деление 4исел, имеюw,нх разные знаки, в противном СЛУ4ае 06а онн будут положительными. V1СКЛЮ4аюw,ее V1ли исnользуетс ДJl сравнени знаков дели MOI-O и делител с u.елью определенн Toro, должен ли результат 6ыть nоложнтельным или отриu.атеЛЫ.IЫМ. Пример 4.11 nOKa3bIBaeT то, как 32разрдное число делитс на 16разрдное число с u.еJlЬЮ nОЛУ4ени 16разрдноrо 4acTHoro и 16разрдноrо остатка. Сравните ero с nримером 4.10, чтобы увидеть, как nepeTLI1 к деленнlO с 60лее высокой Т041Ю стью. Вместо Toro, 4т06ы передать числа в СРУНКЦLl1Ю 4ерез реrистры, в данном случае числа l1ередаютс с ИСl10ЛЬЗ0ванием реrистров вы60ра срала ДJlЯ нх адресацни, также исnользуютс реrистры PRODL и РАООН. В данном СЛУ4ае FSRO указывает на 32 разрядное делимое, а PRODL и РАООН содержат 16разрдный делитель. После за вершеllИ деленн, частное B03Bpaw,aeTc в 4ейке naMTH, адресуемой FSR2, а оста- ток  в ячейке nамти, адресуемой FSRO, он соответствует старшнм двум 6aTaM дели Мor'о. СчеТ4ИК 6ыл изменен с 8 на 16, nocKoJlbKY в данном СЛУ4ае выnолнется 16- разрдное деление. Пример 4.11 ;***************** ФУНКЦМR Div16 ******************* ИС'!lOJlI>зуе'l' О)..\ИН уровень nporpaMMHoro C'l'eKa ИСllOJ1ьзуе'l' WHEG, PRODL, Рн.оон, TABLl\'I', TBLI?'l'RL, TBLP'l'RH, FSRO м FSR1 " .#  Частное B03BpaaeTCR в RqeKe, aApecyeMO FSR2 I?RODL м PRODH npeABapMTenbHo заl'руа'l'СR деJШ'l'елем FSRO nреАвармтелыю заrруае'.rся аАресом деnммоrо FSRO адресует остаток npM возврате Jlv16: MOVLW MOVFF .16 WREG, TABLAT ;заrруает в CqeT4MK 16 )iv16a: MOVI,W BCF RLCF RLCF 1 STATUS, О INDF2 PLUSW2 ;CABMraeT частное BneBo ВСЕ' RLCF RLCF' STATUS, О POSTINCO POS'I'INCO ;CABMraeT Аеnимое BneBO 
128 Прнмененне MHKpOKOHTpOnnepOB PIC 18 RLCF' POSTINCO RJ..JCF' POSTDECO MOVI.' РI{от., О s lJВЮ' i-'OS'I'TNCO, О МОVЮ. ТШ,Р'['Нl, MOV['. PI<'O[)I j, О SUНЮ'В POSTI)ECO, О MOVwr. 'I'Bl,i-''l'Ю! BNC Div16b МОVП' TBLPTRl" POS'I'INCO МОVП' 'l'Вl,Р'l'Ю!, POSTDECO LNCF' INИ'2 BNC Div16b MOVLW 1 INCF PI,USW2 Div16b: MOVLW О IORWF' POSTDECO IORWF POSTDECO DECFSZ TABLAT I3RA Div16a IORWF POSTINCO IORWF POSTINCO RETURN ; сравнмвает леЛМ'l'ель м )еJ]имое ;BqMTaHMe ; мнкремеН'l'ированме qaC'l'HOl'O ;Аекрементмрованме CqeTqMKa 4.3. Прео6разованя между десятчным  двочным форматам ЧL/1сла часто остаютс в срормате ВСО, однако L/1меютс СЛУ4аL/1, коrда 4исла L/13 срормата ВСО должны 6ыть npe06pa30BaHbI в ДВОИ4НЫ срормат. ЕСЛL/1 нужны 4L/1сла в срормате ВСО, однако они доступны только в ДВОИ4НО срорме, то так>ке не06ХОДL/1МО выполнить nре06раЗ0вание. В данном nодразделе paCCMaTpL/1BaeTC npe06pa30BaHL/1e между ДВОИ4НЫМ срорматом и срорматом ВСО. Формат ASCII также иноrда Tpe6yeTC, однако nре06раЗ0вание М8>КДУ срорматами ASCII и ВСО - зто npocTa задача, СВ5lзаllllая с nрL/16авлеНL/1ем L/1ЛИ ОТНL/1манием ОхЗО, как зто 06ъснлось В nредшеСТlзуюw,L/1Х nод разделах. Преобразование из двоичноrо формата в формат BCD 310 nре06раЗ0вание выnолнетс достаТ04НО леrко, еСЛL/1 имеется возможность BbIIIOJIIleHL/1H оnераu.ИL/1 делеНL/1. CooTBeTcTBYIOW,L/1 алrОРL/1ТМ (Ha3ЫBaeMЫ «nраВL/1ЛОМ Хорна») npe06pa30BaHL/1 И3 ДВОL/14ноrо срормата в срормат ВСО L/1сnользует деление "а 1 О L/1 мо>кет 6ыть OnL/1CaH следуюw,им 06раЗ0М: 1. Поделить на 1 О 2. Сохранить остаток как u.исрру результата З. Повторять шаrL/1 1 и 2 до тех пор, пока 4астное не станет нулевым 
lnaBa 4. ITporpaMMHpOBaHHe на Slзыке Ассембnера 129 Пренrюложим, что 0110 0111 2 должно быть nреобраЗ0вано в последовательность 8СD- цисрр. Если 0110 01112 поделить на 10102' то 6удет ПОЛУ4ено 4астное 10102 и остаток, равный 00112' The 00112nредставлет с060Й младшую u.исрру результата. Вследствие Toro, что част ное 10102 не вляется нулевым, выnолнем деление на 10102 ew,e раз. На этот раз мы ПОJ1У чнм частное, равное 00012' и остаток, paBHЫ 00002' Оnть-такн 00012 делитс на 10102' при зтом nОЛУ4аетс 4астное, равное 00002' при остатке, равном 00012' Числа 00112 ' 00002 И 00012 составлют pд остатков, nОЛУ4енных в данном примере. Результат равен 103, nоря док, в котором возвраw,аютс 4исла, реверсируетс. Пример 4.12 nOKa3bIBaeT срункu.ию, KOTopa исnользует 8разрядное И3 прLl1ме ра 4.10 ДJl nре06раЗ0вани 4нсла И3 PRODL в срормат ВСО, сохранив результат в чей ке nамти, адресуемой FSRO. 3то 4ИСЛО coxpaHeTC младше u.исррой вперед и orpa lIичиваетс в nамти 4ИСЛОМ Ох10. Число 103 coxpaHeTC как 3, 0,1 и Ох10. Пример 4.12 ;************ BinBCD ************** мсnоnьзует 2 ypOBHR nporpaMMHoro стека ; мсnоnьзует Div м ее perMcTp, а TaKe FSRO ;nре06разует ABOMqHOe qMCnO М3 PRODL в opMaT ВСD в ;naMRTM, aApecyeMO FSRO. Pe3YnbTaT заканqмваеТСR ;3HaqeHMeM Ох10 3inBCD: MOVLW . .10 MOVFF WREG, TABLAT 8in.l:3CD1: CALL MOVFF CLRF MOVF BNZ Div PRODH, POSTINCO PRODH PRODL, О BinBCD1 ;AenMT на 10 ;coxpaHReT остаток ;АО тех пор, пока qaCTHOe не станет paBHM О MOVLW MOVWF RETURN Ох10 POSTINCO ;coxpaHReT метку KOHua Предположим, 4ТО последовательность ВСDu.исрр, coxpaHeMa в памти, nреобразу eTC в строку символов ASCII NULL, 4ТО 06есnе4ивает совместимость с 3ЫKOM С. 3то выпол HeTC срункu.ие, показанно в примере 4.13. Пример 4.13 ;************** ASCIInull **************** мсnоnьзует 1 уровень nроrраммноrо стека мсnоnьзует FSRO, FSR1, WREG, TABLAT реверсмрует nopRAoK CMMBOnOB строкм и преобразует МХ в строку ASCII null АSСПпull: MOVFF FSROL, FSR1L 
130 llрнмененне MHKpOKOHTponnepOB PIC 18 MOVFF FSROH, FSR1H ASCIInulla: MOVLW Ох30 ; в ASCII ADDWF INDFO MOVIJW Ох40 CPF'SEQ POSTINCO jjЮ\ ASCIInulla ;eCnM не KOHeu DECF FSROL MOVLW О SUBWFB FSROH MOVWF POSTDECO ASCllnullb: MOVFF INDFO, TABLAT ;CBOnMHr дaHHX MOVF INDF1, О MOVWF POSTDECO MOVFF TABLAT, POSTINC1 MOVF FSROH, О CPFSEQ FSR1H, О ВМ ASCIInullb ;eCnM не KOHeu MOVF FSROL, О CPFSEQ rSR1L, О BRA ASCIInullb ;eCnM не KOHeu RETURN Алrорнтм nре06разовання нз ,lJ,80H4HOro формата в ,lJ,еСЯТН4НЫ формат так>ке работа ет ,цля снстем с APyrHMH основаннямн С4НСJlення, eCJlH ,lJ,eJlHTeJlb нзменяется в соответствнн с основаннем снстемы С4нслення. HanpHMep, ,цля nреобраЗ0вання нз ,lJ,BOH4HO формы В BOCbMepH4HYIO, необхо,lJ,НМО BblnOJlHтb ,lJ,eJleHHe на 8. 3тот anropHTM НСnОJlьзуется,ЦЛ npe обраЗ0вання 4нсел в Jl106ylO снстему С4НСJlення nocpe,lJ,CTBOM нзменення деJlнтеля в соответ  ствин с основанием снстемы С4НСJlени. 8CnOMHHTe, 4ТО nре06разованне Н3 ,lJ,ВОН4НОro формата в формат 8СО (npHMepbI 4.9 и 4.10) требует, 4т06ы остаткн сохраНЯJlНСЬ в памятн, однако nОРЯ,lJ,ок остатков peBepcHpyeTC. Одннм Н3 способов нзменення nоря.цка остатков Я8Jlяется занесение НХ в стек перед coxpa неннем нх в строке ASCII. npHMep 4.14 noкa3blBaeT, как зто выnолняетс с НСnОJlЬЗ0ванием стека, npH зтом заменяются ,lJ,ве функu.нн, соотвеТСТ8ytow,не npHMepaM 4.12 н 4.13. Обратн- те вннманне на то, HaCKOJlbKO КОр04е стanа nporpaMMa после НСnОЛЬЗ0ванн стека ,ЦЛ pe верснровання ,о,анных. Пример 4.14 ;************* BinBCDs ************** испоnьзует 2 ypOBHR nporpaMMHoro стека мсnоnьзует Div м ее perMcTp, а TaKe FSRO м WREG мсnоnьзует TABLAT м PRODH npe06pa3yeT двомqное qMCnO в PRODL в opMaT ВСD по ;аАресу naMRTM в FSRO; заканqмваеТСR ОхОО BinBCDs: MOVLW .10 ;заrрузка AenMTenR, paBHoro 10 
rnaBa 4. ITporpaMMHpOBaHHe на Slзыке Ассембnера 131 MOVb't MOVI,W MOVWl:' :l nBCUs1 : CALL MOVLW ADDWF MOVFF CLRF MOVt BNZ "<'I)C[)s2: MOVt' MOVWF BNZ RETURN WRl::G, TABLAT О POS'['\)EC2 Div ОхЗО PRODH PRODH, POSTDEC2 PRODH PHOUL, О BinBCDs1 PREINC2,O POSTINCO BinBCDs2 ;сохраненме меткм KOHua в стеке ;AeneHMe на 10 ;npe06pa30BaHMe в ASCII ; сохраненме остатка в стеке ;noKa qaCTHOe не станет HyneM ;M3BneqeHMe AaHHX М3 стека npHMep 4.14 нсnользует РАООН н TABLAT Д11 nреобраЗ0вання. С целыо обеспе ченн TOrO, чтобы онн не НСnОЛЬЗ0валнсь ew,e r,lJ,eTo, целесообразно МО,lJ,нфнцнровать функцнlO такнм обраЗ0М, 4тобы зтн perHCTpbI с'охраНЯJlНСЬ в стеке ,lJ,анных перед тем, как cpYHKЦH БУ,lJ,ет нх НСПОJlЬЗ0вать, н BOCCTaHaBJlHBaJlHCb бы nepe,lJ, возвратом Н3 функ цин, как зто nоказано в npHMepe 4.15. Пример 4.15 ;************* BinBCDs ************** использует 2 ypOBHR nроrраммноrо стека мсnоnьзует 6 nporpaMMHX ypOBHR (максммум) стека дaHHX, aApecyeMoro FSR2 мсnоnьзует Div м ее perMcTp, а TaKe FSRO м WREG coxpaHReT BCDCTpOKY В naMRTM, aApecyeMO FSRO закаН4мваеТСR ОхОО (HyneBaR строка CCTMnR) 3.i.nBCDs: MOVFF MOVF'F MOVLW MOVFF MOVLW MOVWF BinBCDs1: CALL CALL MOVLW ADDWF MOVFF CLRF MOVF BNZ !3iпBCDs2: MOVr' MOVWF BNZ TABLAT, POSTDEC2 PRODH, POSTDEC2 .10 WREG, TABLAT О POSTDEC2 Div Div ОхЗО PRODH PRODH, POSTDEC2 PRODH PRODL, О BinBCDs1 PREINC2,O POSTINCO BinBCDs2 ;занесенме в Стек TABLAT м PRODH J ;., ;сохраненме в стеке маркера KOHua AeneHMe на 10 ;деnенме на 10 ;npe06pa30BaHMe в ASCII ; сохраненме остатка в стеке ;noKa qaCTHOe не станет HyneM ;M3BneqeHMe AaHHX М3 стека 
132 Прнмененне микроконтроnnеров PIC 18 MOVFF MOVFF RETURN PEEJNC2, PRODH PH.EINC2, l'ABLAT ; мзвnеченме PRODt! м 'l'1\B,A'l' из C'l'GKa Обратите вннмание на то, как perHcTpbI TABLAT н PRODH заносятся в стек перед н}м, как срункцня на4ннает работу н нзвлекаlOТС Н3 стека непосредственно перед BЫ II01Iнением команды return. Эта cpYHKЦH теперь исnользует только FSRO, WREG и стек данных. Обычно рабочнй perHcTp не coxpaHeTC. Какое пространство стека данных необходимо? Два байта необходимы дл Т ABLA Т н PRODH и ew,e на три байта болыuе для остатков, которые помеw,аlOТСЯ в стек. Маркер конца требует одноrо байта про- . странства стека данных,  в обw,ем ДЛ ,lJ,aHHoro npHMepa необходнмо ИСnОЛЬЗ0вать ВJIЛОП) дО шести байтов пространства стека данных. Преобразование формата BCD в двоичньm формат npepbIBaHHe 4HCeJl Н3 формата 8СО в ДВОИ4НЫЙ срормат требует НСnОЛЬЗ0вани умноженн вместо деленн. AnropHTM TaKoro nреобраЗ0вани требует, чтобы двоичное число lIа4нналось с нул н по мере обработкн каждоrо разрда, двоичное чнсло ДОЛ>КIIО УМIIO>каться на 10, после 4ero HOBa цнсрра добавлетс к ДВОИ4НОМУ результату. Этот алrОрLl1ТМ опнсываетс следуlOw,нм обраЗ0М: 1. Начать с результата, paBHoro НУЛIO. 2. УМI-Ю>КLI1ТЬ результат на 10. 3. Добавить HOBYIO 8COЦHcppy к результату. 4. Повторть шаrн 2 и 3 до тех пор, пока не будет достиrнута последняя цисрра. Дл НЛЛlOстрацни 3Toro алrорнтма, CPYHKu.H.B примере 4.16 преобразует нулевую ASCIICTPOKY, HaxoAw,ylOc в 4ейке naMTH, в ДВОН4ное чнсло, B03Bpaw,aeMoe как 8- разрядное беззнаковое 4НСЛО в perHCTpe TA8LAT. Нулева ASCIIcTpoKa aдpecyeTC реrистром выбора фала FSRO на ВХО,lJ,е срункцин. Пример 4.16 ;************** ASCIIBin **************** мсnоnьзует 1 уровень стека мсnоnьзует WREG, TABLAT, FSRO lIpe06pa3ye'l' HyneBY ASCI I CTPOKY, aApecyeMY реrистром FSRO, в 8раЗрRдное Авомчное чмсnо, возврааемое в perMCTpe TABLAT ASCIIBin: CLRF ASCIIl:3in1: MOVLW CPFSEQ ВМ RETURN 1\SCIIBln2 : MOVLW MULWF MOVf'F MOV1W SUBWF TABLAT ;OqMCTKa pe3YnbTaTa О INDFO ASCIIBin2 ;возврат по HYn .10 TABLAT PH.ODL, TABLAT Ох30 POSTINCO, О ;х10 ;АSСП в ВСD 
I'naBa 4. ITроrpаммнрование на Slзыке Ассемблера 133 ADDWf' TABLAT ВЕА ASCIIBin1 ;A06aBneHMe UMp Как н в случае anrорнтма nреобразованн ДВОН4НЫХ 4нсел в десятнчные, дaHHЫ алrо ритм также работает с ЛlOбым основаннем снстемы С4нслени, еслн нзмеllНТЬ КОЭсрфИЦLl1еllТ 1 О на 311a4ellLl1e ОСlIовання снстемы С4ислени. HanpHMep, если требуется преобраЗ0вать строку IЮСЬМИРИ4НЫХ 4исел, то ну>кно выnолнЯlЪ умно>кение на 8. Данная СРУIIКЦИЯ LI1СПОJ(ЬЗУ ет 8-разрядное умно>кение, однако в случае ИСnОЛЬЗ0вани 16-разрIДНor"0 умно>кения, MO жет быть получен ДВОИ4НЫ результат больше разрЯJJ.НОСТИ. 4.4. Временные задержк Мноrие npHMeHeHH мнкроконтроллеров требуlOТ отработкн временных задер- хек. В данном nодразделе paCCMaTpHBaeTC то, как ну>кно формировать точные Bpe lI.4енные задер>ккн, НСnОЛЬ3У nporpaMMbI, которые их reHepHpYIOT. Например, npeAno- .10>КНМ, 4ТО ну>кно актнвнровать соленонд на 100 мс дл nравилыюrо персмещеllИ5-1 Ka 1(0rOTO MexaHH4eCKoro nрнсnособлеIlН. An срормнровання это временной задер>ККLI1, :>авной 100 мс, необходимо ИСnОЛЬЗ0вать какойто метод rенерирования IЗРСМСIIIЮЙ задер>ккн. ПроrраI для формирования временных задержек An начала рассмотрени AaHHoro вопроса, нсследуем ПРОСТУIO срункцию срорми- ;ювани BpeMeHHO задержкн, nоказаннуlO в npHMepe 4.17. В зтой СРУIIКЦНИ выnолняет- :я декрементнрованне perHcTpa WREG н еслн результат будет нулевым, то отрабаты!За eтc 1З0зврат Н3 функцнн. Еслн результат не будет равным НУЛIO, то WREG AeKpeMeHTLI1 :>yeTC повторно н Т.д. Эта CPYHKu.H BJleTC npocTo н достаточно KOPOTKO, Оllа имсет "редсказуемое BpeM выnолненн, оnределемое тем, сколько раз будет ВЫПОЛIIЯТl)С leKpeMeHTHpOBaHHe реrистра WREG '.р. Пример 4. 1 7 . --::: i ау: DE:CE'SZ WP..EG НМ Delay ;Аекрементмрованме WREG ;nepeXOA, eCnM WREG не равен О I{ETURN Предnоло>кнв, 4ТО WREG заrружаетс перед вызовом срункцин, мо>кно сказать, "но КОЛН4естIЗО временн, требуемое ДЛ выnолнени 3TO nроцсдуры, будет опрсде ..1Яться колнчеством командных циклов, ну>кных на отработку команд CALL и RETURN, 1111ОС КОЛLl14естIЗО комаНДIIЫХ ЦHкnoB, требуемых ДЛ nоследователыюrо декреМСIIТИРО 3aHH WREG дО нулевоrо COCTOHH. Декрементнрование WREG выполняется командой JECFSZ, за KOTOPO следует команда BRA. Вы мо>кете обратитьс к nрило>кеНLI1Ю А, IЗ .. (отором указано КОЛН4ество командных ЦHкnoB, требуемое ДЛ выполнения кюкдой (оманды. Кажда И3 команд CALL н RETURN требует ДЛ cBoero выnолнени два KO l.caHAHbIX цикnа, Т.е. Bcero на нх выnолненне требуетс 4етыре командных цнкла. Ko I.taHAa DECFSZ требует ДЛ cBoero выnолненн однн KOMaHДHЫ u.HКn, а команда BRA 
134 ITpHMeHeHHe микроконтроnnеров PIC 18 требует ДJl CBoero выnолненн два командных ЦHкna. npHMep 4.18 показывает уравне- ние, которое ну>кно НСnОЛЬЗ0вать ДЛ onpe,lJ,eJleHH BpeMeHHO задержкн в данном слу чае. Пример 4.18 ЧИС.JIO '['актовых ММnУЛЬСОВ 4 + WREG х 3 иnи ЧМСnО TaKTOBX MMnYnbCOB  4 WREG ------- 3 V13 3Toro ypaBHeHH, eCJlH WREG равен 1, nОЛУ4аем, 4ТО колнчество BpeMellLl1, тре- буемое ДЛ выnолненн функцнн Delay, равно 7 ЦHКnOB. Если во WREG заrрузить MaK CHMaJlbHOe KOJlH4eCTBO нуле (1 ноль дает 256 HTepau.H, то KOJlH4eCTBo командных ЦHK лов будет равно 4 + (256 ( 3) нлн 772 ЦНKJlа. KOMaHДHЫ u.HКn в семействе устройств PIC 18 нмеет длнтеJlЬНОСТЬ, paBHYIO 4етырем nepHoAaM следованн нмnульсов внеШllеrо TaKTOBoro reHepaTopa. Еслн BHeWH TaКТOBa 4астота равна 4 Mru. (250 нс), то 4астота, COOTBeTCTBYIOw,a одному командному ЦHКnY, 6удет равна 1 Mru. (1,0 мкс). Это 0зна4ает, 4ТО cpYHKЦH Delay по прнмеру 4.17 мо>кет reHepHpoBaTb BpeMeHHYIO задер>кку в AHana- З0не от 7,0 мкс .0.0 772 мкс, в завнснмостн от 3Ha4eHH, заrру>кенноrо во WREG. Это BpeM даже 6лнзко не соответствует 3Ha4eHHIO BpeMeHHO задержкн в 100 мс, О KOTOPO rоворнлось в Ha4aJle ,lJ,aHHOrO nО,lJ,ра3,lJ,ела. Прнмер 4.19 ,lJ,емонстрнрует О,lJ,НН нз мето,lJ,ОВ nOJlY4eHH 60Jlee длнтеJlЬНО Bpe менной задержкн. В ,lJ,анном CJlY4ae в ка4естве С4етчнка во WREG заrру>кено значение, равное 165. npH BHewHe TaКТOBO 4 астоте , paBHO 4 Mru., 3ТО дает BpeM задер>ккн, равное 165 х 3 + 4 HJlH 499 мкс (в зтом npHMepe окруrлем 3ТО зна4енне до 500 мкс). Если ну>кно Т04НО 500 мкс, ТО В фУНКЦНIO Delay BBO,lJ,HTC оnерацн NOP (отсутспзне опе- раЦLl1И) (NOP ДЛ CBoero выnолненн требует однн командный цикл) непосредствеНIIО перед командой RETURN, как 3ТО показано в npHMepe 4.20. An срункций, показанных в npHMepax 4.19 н 4.20, зна4енне BHeWHero С4етчнка равно 200. Еслн мы отработаем BpeMeHHYIO за,lJ,ер>кку в 500 мкс 200 раз, то nОЛУ4НМ BpeM задержкн, Т04НО равное 100 мкс. Коне4НО же, Т04НОСТЬ 3TO BpeMeHHO задержкн завнснт от Т04НОСТН внешнеrо НСТ04ннка TaKTOBO 4астоты. 3то BpeM так>ке не будет Т04НЫМ в снлу Toro, 4ТО мы не учнтываем BpeM, не06ХО,lJ,нмое AfI ,lJ,eKpeMeHTHpOBaHH BHeWHero С4еТ4нка в TABLAT, однако в СЛУ4ае соленонда Т04НОСТЬ BpeMeHHO задержкн в пределах одной мнллисе кунды npH обw,е за,lJ,ержке в 100 мс BJleTC BnOJlHe nрнемлемо. Пример 4.19 Delaym: MOVLW MOVWF Delaym1 : CALL DECFSZ BRA .200 ;200 раз TABLAT Delay TABLAT Delaym1 RETURN Dе1ау: ;165 раз MOVLW .165 
rnaBa 4. Проrpаммнрованне на Slзыке Ассембnера 135 " I CJ У 1 : l)O'SZ WI<'EG BI Delay1 RETURN Пример 4.20 Jelaym: MOVLW MOVWF ::Jelaym1: САУ,;, IJECFSZ RHJ\ .200 ;200 раз TABLAT I)e 1 а у TABLAT Delaym1 RE '1' URN :elay: MOVLW .165 :::elay1: DECFSZ WREG ВМ Delay1 NOP RETURN ;165 раз ;nnc ee 1 комаНАНЫЙ UMKn При исnользованнн в ка4естве базнса BpeMeHHO задержкн в 100 мс мо>кно nолу чать так>ке более длительные временные задержки. Напрнмер, еслн требуется времен- Ha задер>кка в 5 секунд, то она может быть nОЛУ4ена в результате 50-кратноrо ВЫЗ0ва Функu.нн Delay (см. npHMep 4.21). Аanее в 3TO KHHre будyr рассмотрены также нные методы nОЛУ4енн временных задержек, НСnОЛЬЗУЮЩt1е BHyrpeHHHe таймеры. Будет также рассмотрен мето,lJ, nОЛУ4енн временных задер>кек, nредусматриваlOw,и HC ПОЛЬЗ0ванне npepbIBaHH от таймера peaJlbHoro времени (АТС). 3тот метод будет pac CMaTpHBaTbC тоrда, коrда будет aHanH3HpOBaTbC HCnOJlb30BaHHe npepbIBaHH в раз- ЛН4НЫХ nрнложеннх. OCHOBНO nр06лемо, связанно с npHMeHeHHeM nporpaMMHoro TaMepa, BJleTC то, 4ТО МИКроКОНТРОJlJlер npH отра60тке BpeMeHHO задер>ккн не MO '.." жет делать НИ4еrо друrоrо. В некоторых СЛУ4ах 3ТО nрнемлемо, а во мноrих друrих  мет. Еслн, HanpHMep, снстема нсnользует npepbIBaHH, то отработка временной за дер>ккн мо>кет быть npepBaHa, 4ТО приведет к не корректному зна4ениlO временной за дер>ккн. Пример 4.21 :::5sec: MOVLW MOVWF J5sec1: CALL DECFSZ ВМ .50 TBLPTRL ;5-сеКУНАнаR заАерка мсnоnьзует Delaym Delaym TBLPTRL D5sec1 RETURN 
136 Прнмененне MHKpOKOHTpOnnepOB PIC18 4.5. Прмеры nporpaMM В зтом подразделе рассмотрено несколько nporpaMMHbIx npHMepoB, НЛЛlOстрн РУlOщнх ра3ЛН4ные методы проrраммнрованн. Как н в случае ApyrHx npHMepoB, рас- смат'риваемых в зтой KHHre, IlpHMepbI Н3 AaHHoro nодраздела дол>кны быть введены IDЕ и выrЮlIIЮIIЫ  как на полной скоростн, так н в nошаrовом ре>кнме, чтобы было AOCTHr "YIO rЮJll-юе поннмаllне cooTBeTCTBYIOW,HX nporpaMM. Первый проrраммный пример Этот nepBbI nроrраммный npHMep НЛЛlOстрнрует первый случай НСllOЛЬЗ0ваlfИ1 ввода-вывода. Данный npHMep нсnользует бнты О (RAO) н 1 (RA 1) порта BBoдaBЫBOHa А мнкроконтроллера PIC ДJl C4HTЫBaHH данных с кnaBHaTYpы ПКС1НJIЯ. Клавна тура nKCTHJl выбрана BCJleACTBHe Toro, 4ТО она леrко ПОДKJl104ается к МНКрОКОllТрОЛ леру по ПРН4нне ее ТТЛсовместнмостн н НСПОЛЬЗ0ванн 0/5 В лоrнкн. 6wтырьковый coeAHHHTeJlbHbI разъем тнпа DIN кnaBHaTYpы nK-стнл nоказан на рнс. 4.2. Соеднннтельны разъем кnaBHaTYpы нсnользует только 4 Н3 6 выводов ДJl noAa tlИ ЭIlектроnнтанн н nepeAa4H снrналов. npH зтом в ка4естве снrнальных НСПОЛЬ3УlOтс две Н3 чеl ырех лнннй. ПО снrнальным лнннм nepeAalOTC данные н TaКТOBa 4астота. Клавнатура запнтываетс от +5,0 В с заземлlOw,нм входом н требует макснмум 250 мА тока, KOTOpЫ noAaeTC от НСТ04ннка nHTaHH мнкроконтроллера. РНСУIЮК 4.3 нллlOСТ рирует снrналы данных н тактовой 4астоты, которые оБЫ4НО ПРНСУТСТВУlOт на ннтер- срейсе. Разъем I(абеля клавиатуры Рис. 4.2. 6TH контактный соеднннтельный разъем тнпа DIN KJlaBHarypbI nКстнл Однн фрем данных кnaBHaTYpы состонт Н3 11 нмпульсов TaKTOBO 4астоты, no ло>кнтельные фронты которых НСnОЛЬ3УlOтс ДJl ПОЛУ4енн данных от клавнаryры. TaK ювые импульсы передаlOТС на номннальной 4астоте, равной 1 О Kru.. Чтобы ннтерфейс СРУlIкцноннровал корректно, 4астота тактовых нмnульсов ДОЛ>Кlia ле>кать в днаnа3Шlе ме>кду 10 н 10.7 Kru.. BpeM переда4Н бнта (BpeM между нмnульсамн) следовательно, номинально н равно 100 мкс. npH прнеме данных от KJlавнюуры контролнруетс со- CTOHHe лнннн тактовых импульсов, н вскнй раз npH nepeКnlO4eHHH TaKToBoro нмnульса с лоrН4ескоrо нул в лоrН4ескуIO eAHHHu.y мнкроконтроллером пронзводнтс выборка линнн данных. 3то 0зна4ает, 4ТО дол>кна быть напнсана nporpaMMa нлн функu.н, KOH ТРОЛНРУIOw,а тактовые нмпульсы н BCKH раз, KorAa тактовый нмпульс переходнт в еДИНН4ное COCTOHHe, данные noAalOTC на вход мнкроконтроллера, а затем преобра зуютс в снмвол, nepeAaHHbI от KJlaBHarypbI. 
InaBa 4. ITporpaMMHpOBaHHe на Slзыке Ассембnера 137 Оwибка сррейма возннкает TorAa, KorAa стартовый бнт влетс ненулевым, а сrОllOВЫЙ бнт не вляетс еДННН4НЫМ в cooTBeTcTBYIOw,He моменты времени. Ошибкн сррейма возникаlOТ нанболее оБЫ4НО TorAa, KorAa данные nрнннмаlOТСЯ прн HeKoppeKT Iюй скоростн ннформацнонноrо обмена. Такнм обраЗ0М, мнкроконтроллерная I1рО- rpaMMa может содержать ceKu.HH, КОНТРОЛНРУIOw,не nравнлы-юсть скорости инсрорма цнонноrо обмена. Бнт парнтета добавлетс к данным с целыо обеспечения 101"0, чю BcerAa будет nepeAaBaTbc нечетное КОЛН4ество еднниц. В npHMepe снrналоu, пока- занном на рнс. 4.3, передаетс еДННН411ЫЙ бнт napHTeTa, срормируя не4етный парите1. Данные HMelOT два еДННН4НЫХ бнта, а так>ке е,lJ,ННН4НЫЙ бнт паритета, что в сумме нает трн еДННН4НЫХ бита. Поскольку трн  зто нечетное 4HCJIO, то сообw,ение нмеет нечет- IIЫЙ napLl1TeT. Еслн обнару>кнвается HeBepHЫ паритет (4етный napHTe), то зто означает, чro сообщен не влетс некорректным. Ошнбкн napHTeTa B03HHKalOT в СЛУ4аях npLl1cYT- СП3Ll1Я помех В некоторых случах в сообw,енне вводитс символ uоnроснтельноrо зна- ка, еслн обнару>кена оwнбка napHTeTa. В ApyrHx СЛУ4ах НСnОЛЬ3УIOТС1 средства ynpaB ленн HHcpopMau.HoHHbIM потоком с цеJlыо заnроса nOBTopHO передачн данных. Сl С2 С3 С4 С5 С6 С7 С8 С9 CIO Cll тактовая частота  даНllые ст.." DO Dl D2 D3 D4 D5 D6 нечетный стоп D7 паритет J.J- Стартбит Bcerдa ноnь Парнтет всеща нечетный Стопбит Всеrда в е.u.ИНИЧ1l0М состоянии Рис. 4.3. Снrналы TaKTOBO 4астоты н данных КJlaBHaTYpы 8следствне Toro, 4ТО в зтом npHMepe НСnОЛЬ3УlOтс бнты О н 1 порта А, то ну>кно знать, KaKa команда BbInOJlHeT С4нтыванне порта А .0.0 Toro, как на4ать nHcaTb npo rpaMMY, c4HTbIBalOw,ylO нажатые КJlавншн КJlaBHaTYpы. Порт А c4H1ывeTc посредством чтенн 4eKH perHcTpoBoro срайла с адресом OxF80. В nporpaMMe обраw,ение к РОАТА идет по адресу OxFO. Порт А nporpaMMHpyeTc nocpe,lJ,CTBOM заrрузкн соответствуlOЩИМ значением perHcTpa TRISA по адресу OxF92. E,o,HHHu.a в бнте perHcTpa TRISA задает pe ЖLl1М ввода ДЛ cooTBeTcTBYIOw,ero вывода, а ноль  режнм вывода. В данном примере НСnОЛЬ3УlOтс бнты О н 1 ДЛ установкн режнма ввода данных, n03ToMY в perHcTp TRISA заrру>каетс значенне Ох03. npHMep 4.22 демонстрнрует nporpaMMY, требуемуlO ДJl 
138 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 nporpaMMHpoBaHH бнтов О н 1 порта А так, 4тобы онн функцноннровалн как входные выводы. Бнты порта должны так>ке nporpaMMHpoBaTbC как u.HcppoBbIe выводы в HeKOTO рых BepCHX PIC nOCpe,lJ,CTBoM заrрузкн Ox7F в perHCTp ADCON 1. Пример 4.22 MOVLW Ox7F MOVWF ADCON1 ;nopT nporpaMMMpyeTcR как UMpOBO MOVLW MOVWF 3 TRISA ;6MT О М 1 06ЪRВnRТСR ВХОАамм Функu.н, KOTopa npHHHMaeT OT,lJ,eJlbHbI снмвол от KJlaBHaTypbI, НJlЛlOстрнруетс npHMepoM 4.23. В 3TO nporpaMMe npe,lJ,nOJlaraeTC, 4ТО бнт RAO (бит О порта А) noAcoe дннен к ВЫВО,lJ,У ,lJ,анных KJlавиаryры, а 6нт АА 1 (бнт 1 порта А) сое,lJ,ннен с JlHHHe TaKTO вых CHrHaJlOB. AaHHa Функu.ия nOJlY4aeT CHMBOJl от KJlaBHarypbI н B03Bpaw,aeT ero в pe rHCTpe WREG. ЕСJlИ 06HapV>KeHa oWH6Ka (фрема HJlH парнтета), бнт переноса YCTaHa лнвается в еДННН4ное COCTOHHe npH возврате Н3 функu.нн. Еслн В perHCTpe WREG npH сутствует корректный снмвол, бнт переноса сбрасываетс. Anя Toro, 4тобы сделать зry nроцедуру более зсрсректнвно н 4нтабеJlЬНО, в нее BКnlO4eHa CPYHKu.H, Ha3BaHHa Wait4Clock, KOTopa О>КН,lJ,ает nepexo,lJ,a JlHHHH nO,lJ,a4H тактовых снrналов в нулевое со- CTOHHe, а затем ожндает перехода JlHHHH noAa4H тактовых снrналов в еДННН4ное со- CTOHHe пере,lJ, ВЫХО,lJ,ОМ Н3 функu.нн. Функu.ня Wait4Clock nоказана nepBo в лнстннrе. Команды npoBepKH состоння бнта н nponYCKa НСnОЛЬ3УlOтс в 3TO срункцнн ДЛ KOH трол H3MeHeHH состояння BXOAHoro снrнала. Пример 4.23 ;************** Wait4Clock ***************** OMAaeT nepexOAa nMHMM TaKTOBX CMrHanOB в HyneBoe ;COCTORHMe, а затем в eAMHMqHOe nepeA возвратом М3 ;YHKUMM Wait4Clock: BTFSC ВМ PORTA, 1 Wait4Clock ;npOBepKa RA1 ;eCnM тактовый CMrHan 1 Wait4Clock1: BTFSS ВМ PORTA, 1 Wait4Clock1 проверка М1 eCnM TaKTOBЫ CMrHan о RETURN ;************** GetData **************** мсnоnьзует 2 ypOBHR nporpaMMHoro стека Мсnользует PRODL, PRODH м TABLAT CqMTBaeT символ с KnaBMaTypbl м возвраает ero во WREG oWM6Ka = YCTaHaBnMBaeTcR 6мт переноса 
rnaBa 4. ITporpaMMHpOBaHHe на Slзыке Ассембnера 139 etl)ala: CAIJL. B'l']:'8S BRA Wait4C]ock PORTA, О GetData1 BSF STA'fUS, О RETURN ;OMAaeT nepBoro TaKTOBoro CMrHana ; npoBepRe'l' RAO ;eCnM на nMHMM AaHHX CTapTOB ;6мт, nepeXOA на GetData1 ;eCnM Ha4anbHoe COCTORHMe ; некорректно, установка 6мта переноса (CARRY) ;м возврат nроrрамма npoAonaeT BnOnHRTbCR с 3Toro места, ;eCnM paCn03HaH KoppeKTH CTapTOB 6мт PRODL мспоnьзуеТСR как CqeTqMK 6мтов дaHHX JJ1Ю[)Н МСIIОJlьзуеТСR AnR nOACqeTa едмнмu в потоке AaHHX с uenb KOHTpOnR .аРИ'['С'l'а etData1: MOVLW MOVWF CLRF 8 PRODL PRODH etData2: CALL Wait4Clock BTFSC PORTA, О INCF PRODH BTFSC PQRTA, О SETF STATU8, О RRCF TABLAT DECF PRODL BNZ GetData2 ;установка CqeTqMKa на 8 ;с6рос CqeTqMKa napMTeTa ;OMдaHMe TaKTOBoro MMrrYnbca смнхронмзаuмм 6мта AaHHX ;npOBepKa RAO ;yqeT OAHO eAMHMUbl - 6мт napMTeTa м с6рос CARRY ;npOBepKa RAO ;установка 6мта переноса, eCnM бмт данных  1 ;UMKnMqeCKM CABMr 6мта переноса (6мт Аанных) в TABLAT ;декрементмрованме CqeTqMKa ;noBTop 8 раз AnR 8 6мтов AaHHX CALL Wait4Clock ;oдaHMe CMHxpoMMnYnbca AnR 6мта napMPeTa MOVF PORTA, W XORWF РRОDП BTFSS PRODH, О BRA GetData3 BSF STATUS,O RETURN 3etData3: CALL ;заrрузка 6мта Аанных во WREG t ,.i"'- ;MCKnqaee ИЛМ со CqeTqMKOM napMTeTa ;eCnM napMTeT npaBMneH ;eCnM oWM6Ka napMTeTa, установка CARRY ;eCnM нет oWM6KM napMTeTa Wait4Clock BTFSC PORTA, О ВМ GetData4 BS!:' STATU8, О RETURN ;npOBepKa МО на cton-6мт ;eCnM все HopManbHO, peaKUMR на cton-6мт ;eCnM oWM6Ka peMa, установка 6мта переноса 
140 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 GetData4: MOVF BCF ;eCnM нет oWM60K TABLAT, W ;заrрузка 6aTa Аанных во WREG STATUS, О ;04мстка 6мта переноса RETURN Функu.и, иллюстрируема nримером 4.23, nОЛУ4ает бат от клавиатуры, однако мы не nОЛУ4ИМ ASCIIKOA нажато клавиши до тех пор, пока не nOMeM, как ра60тает клавиатура, и не восnользуемс зтим знанием. Вски раз, KorAa нажимаетс клавиша кnавиатуры, клавиатура посылает Т.Н. CKaHKOД кnавиши. Скан-код не вляетс АSСIIкодом; 3ТО число, которое поставлено в соответствие Ka>K.ЦO клавише клавиату ры. Та6л. 4.1 пере4ислет CKaHKOДЫ клавиатуры. 06ратите внимание на то, 4ТО некоторые CKaHKOДЫ имеют Д1IИНУ, соответствующую двум ли60 60льшему 4ИСЛУ символов. Все скан-коды, длина которых nревосходит один сим вол, на4ннаютс кодом ОхЕО, KOTOpЫ pacn03Haeтc nporpaMMHo как сиrнал о не06ходнмости приема доnолнитеJlЬНЫХ 6aTOB CKaHKOдa, cocTow,ero И3 нескольких 6afu. KorAa на кnавиатуре нажата кnавиша, интерсрес кnавиатуры посылает CKaHKOД, а KO rAa кnавиwа oTnycKaeTc, интерсрес кnавиатуры посылает код nрерывани, за которым сле дует CKaHKOД кnавиши. Например, Korдa нажата кnавиша А, nосылаетс код Ох1 С. А KorAa кnавиша А отпускаетс, nepeAaeTc код OxFO, за которым cneAyeT код Ох1С. 3то nозволяет отслеживание nporpaMMHbIM 06есnе4ением нажати нескольких ЮlaВИШ. Так, нажатие кла- виши "Левы SHIFТ (BpeMeHHЫ BepXHH реrистр)" с nоследуюw,им нажатием кnавиши А приведет к rенерированию следуюw,е последовательности кодов, если nepBo 6удет отпу w,eHa кnавиша Shift: Ох12, Ох1 С. Если же nepBo 6удет oTnyw,eHa кnавиша А, а затем будет oTnyw,eHa кnавиwа Shift, то 6удет послана слеДУIOw,ая nоследователыюсть кодов: OxFO, ох1С, OxFO, Ох12. KorAa отпускаетс кnавиша, rенерируюw.a код, nревосходящий по Д11ине один 6айт, как, например, кnавиwа Insert (Вставка), то после кода ОхЕО 6удет r!Ослаll код, Т.е. no слеДовательность кодов 6удет иметь ВИД: ОхЕО, OxFO, Ох70. Единственным ИСКnЮ4ением И3 3ТИХ правил влетс кnавиwа Pause (nауза) key, KOTopa rенерирует КОД, наfинаюw,ийс с ОхЕ1, а при ее отпускании rенерируетс ОхЕ1, OxFO, Ох14. Последовательность кодов npepbI вани дл Юlаuиши Print Screen (ne4aTb зкрана) влетс друrим ИСКnЮ4ением, она имеет вид: ОхЕО, OxFO, Ох7С, ОхЕО, OxFO, Ох12. Таблица 4. 1 . CKaHKOД Юlавиатуры Кла КОД Клавиша КОД Клавиша КОД виша О Ох45 Z Ох1А Ох49 1 Ох16 F1 Ох05 / Ох4Л 2 Ох1Е F2 Ох06 Enter (ВВОА) Ох5А 3 Ох26 F3 Ох04 Escape (ВЫХОА) Ох76 4 Ох25 F4 ОхОС Print Screen (Пеqать зкрана) ОхЕО, Ох12, О хЕ О , Ох7С 5 Ох2Е F5 Ох03 Scroll Lock Ох7Е (Замок npoKpYTKM) 6 Ох36 F6 ОхОВ pause (Пауза) ОхЕ1, Ox14, Ох77 7 ОхЗD F7 Ох83 Insert (Вставка) О xF: О , ОхС/О 8 Ох3Е F8 ОхОА Home (В МСХОАное) ОхЕО, ОхБС 
rnaBa 4. ITporpaMMHpoBaHHe на языке Ассембnера 141 Кла- виша 9 А в с D Е F G н 1 J к L м N о Ох46 Ох1С Ох32 Ох21 Ох23 Ох24 Ох2В Ох34 Ох33 Ох43 Ох3В Ох42 Ох4В Ох3А р Q R S Т КОД Клавиша КОД Ох01 Ох09 Ох78 Ох07 Ох66 Ох29 ОхОО Ох58 Ох12 Ох14 ОхЕО, Ox1F Ох11 Ох59 ОхЕО, ОхlЗ ОхЕО, Ох27 ОхЕО, Ох11 ОхЕО, Ox2F ОхОЕ Ох4Е Ох55 Ох5D Клавиша page Ор (CTpaHMua вверх) Delete (CTepe'l'b) End (KOHeu) J?age Down (С'l'раниuа вниз) Ор Arrow (CTpenKa вверх) Left Arrow (CTpenKa вnеио) Down Arrow (CTpenKa ВНМ3) Right Arrow (CTpenKa вправо) Замок UMpOBO KnaBMaTypbl I на UMpOBO KnaBMaType * на UMpOBO KnaBMaType - на UMpOBO KnaBMaType + на UMpOBO KnaBMa'l'ype Enter (ВВОА) на UMpOBO KnaBMaType на UMpOBO KnaBMaType О на UMpOBO KnaBMaType О 1 на UMpOBO KnaBMaType 2 на UMpOBO KnaBMaType 3 на UMpOBO KnaBMaType 4 на UMpOBO KnaBMaType 5 на UMpOBO клавматуре КОД ОхЕО, Ох7О О xF. О , Ox71 ОхЕО, Охб9 ОхЕО, Ох7А ОхЕО, Ох75 О хЕ: О , Ох6В ОхЕО, Ох72 ОхЕО, Ох74 Ох77 О xt:: О , Ох4А Ох7С Ох7В Ох79 ОхЕО, Ох5А I J.. F9 F10 F11 F12 Backspace (Шаr назаА) Dp06en ТаЬ (Ta6YnRUMR) Ох31 Caps Lock (Замок BepxHero perM стра) Left Shift (ЛеваR KnaBMwa BpeMeH Horo nepeKnqe HMR perMcTpoB) Left Control (YnpaBneHMe neBaR) Left Alt Option (ЛеваR кnавиwа Alt (AnbTepHa тмва) AOnOnHM TenbHaR) Left Alt (ЛеваR KnaBMwa Alt (AnbTepHaTMBa) ) Right Shift (DpaBaR KnaBMwa BpeMeHHoro ne- peKnqeHMR pe rMcTpoB) Right Control (DpaBaR KnaBMwa yrrpaBneHMR) Right Alt Op tion (DpaBaR KnaBMwa Alt (AnbTepHa тмва) AOnOnHM TenbHaR) Right Alternate (DpaBaR KnaBMwa Alt (AnbTepHaTMBa) Applications (ОрМJIоенме ) Ох71 Ох"/О Ох69 Ох72 Ох7А Ох6в Ох73 Ох44 Ох4О Ох15 Ох2О Ох1В Ох2С \ 
142 Кла КОД виша U ОхЗС V Ох2А W Ох1D Х Ох22 у ОхЗ5 TIpHMeHeHHe MHKpOKOHTponnepOB PIC 18 Клавиша КОД Клавиша Ох54 6 на ЦMpOBO KJJaBMa'l'ype Ох5В 7 на UMpOBO клавма'l'уре Ох4С 8 на UMpOBO KJIaBMa'l'ype Ох52 9 на ЦMpOBO клавма'l'УРС Ох41 КОД Ох"/4 ОхБС Ох75 Ох7О Может 6ыть написано nporpaMMHoe 06есnечение, которое ссрормирует интер- cpec клавиаryры, однако в 60льшинстве СЛУ4аев весь зтот проu.есс управляетс npe рываними. Не06ходимость ИСnОЛЬЗ0вани nрерывани свзана со скоростью интер- cpeca клавиаryры. Если ДJl С4итывани клавиатуры исnользуютс рассматриваемые здесь nporpaMMbI, то микроконтроллер не должен I.3ЫIlОЛНЯТЬ никакой ДОllOлнителы-юй ра60ТЫ. Мы пока не 6удем рассматривать оставшуюс 4асть nporpaMMHoro 06еспече- ни работы с клавнаryро  это 6удет сделано nозже 1.3 3TO Кllиrе, после исслеДОl.3ания Ha3Ha4eHH и роли nрерывани. Здесь же мы рассмотрим то, как нужно pacn03HaBaTb наЛИ4ие TaKToBoro импульса и принимать данные 4ерез порт BI.30Aal.3bIBOAa, ИСПОЛЬ3У HecKonbKo ero штырьков. Второй проrpаммный пример nepBbI nporpaMMHbI пример nРОИЛЛlOстрировал то, как npoBepTb наЛИ4ие сиr нала тактовой 4астоты, как орrаНИЗ0вать поисковую та6лиu.у ASCIIKoAOB (XOT COOTBeT cTBYIOw,a nporpaMMa не рассматривалась), а так>ке то, как нужно ра60тать с портом BBoдaBЫBoдa. Некоторые радиолю6ители при nepeAa4e ннсрормаu.ии с u.елью сужени попосы 4астот исnользуют код Морзе. Сwнал незаryхаюw,их коле6аний, исnользуемый при nepeAa4e кода Морзе, имеет полосу 4астот, ширина которой составляет Bcero 150 ru.. Код Морзе nервона4ально ИСnОЛЬЗ0валс телеrрасристами, он 6ыл разра60тан дл орrанизаu.ии СВ3И меж.цу железнодорожнымн станu.ими в 19 столетии и широко ис nользовалс так>ке и в 20 столетии. Та6л. 4.2 демонстрирует коды Морзе ДJl 6укв и 4исел. В таблнu.е npHBeAeHbI сим 1.30ЛЫ и соответствуюw,ие им КО,lJ,Ы И3 Т04ек (называемых "дит") (.) и тире (назыl.3емыыx "дах") (), а так>ке wестнадu.аТИРИ4ные 4исла, указываюw,ие КОЛИ4ество Т04ек и тире (npaBbIe три 6ита), а так>ке их структуру (левые 5 6нтов). Т04ке соответствует лоrиче- ский ноль, а тире - лоrИ4еска единиu.а. Предположим, 4ТО нам не06ходима система, KOTopa посылает коды Морзе. Вследствие Toro, 4ТО не так У>К MHoro людей знают код Морзе, мы решили разработать простую микроконтроллерную снстему, nредназначенную ДJl Iенерировани 3Toro кода. Поскольку аппаратные средства в зтой книrе пока ew,e не рассматривались, бу дем С4итать, 4ТО наша система 6ерет ASCII  символ И3 реrистра WREG и rенерирует ДJl Hero код Морзе. Поскольку мы уже знаем, как С4итывать клавиаryру, например стандартную клавиаryру nK, то 6удем С4итать, 4ТО символы от клавиаryры передаются в nporpaMMY ДJl их nре06раЗ0вани в код Морзе. 3то nозволит нам передавать коды Морзе noCpeACTI.30M ввода букв и u.исрр с клаl.3иатуры. В дополнение к таблнu.е кода Морзе, KOTopa coxpaHeTC в nамти nporpaMM как nоискова та6лиu.а, не06ходнмо знать так>ке некоторые друrие сракты относительно кода Морзе. BpeM nepeAa4H тире в трн раза 60льше, 4ем BpeM nереда4И Т04КИ. npo межуТКН меж.цу буквам н в слове равны трем периодам nереда4И Т04КИ. nромежуrки меж.цу словами равны семи периодам nереда4И Т04КИ. При nepeAa4e данных со CKOpO стью 50 слов в минyrу, период nереда4И Т04КИ будет равен 24 миллисекундам. 3та CKO рость nереда4И (50 слов в минyry) Ha3ЫBaeTC "nари>кским" стандартом, потому 4ТО Olla 
rnaBa 4. ITporpaMMHpOBaHHe на Slзыке Ассембnера 143 попучена посредством nереда4Н слова "PARIS" 50 раз в минyry. Слово "PARIS" дает Т04НО 50 nернодов nереда4Н Т04КН с npOMe>KyTKaMH меж.цу словами Соответствуюw,а nporpaMMa ,lJ,олжна отра6атывать временную задержку, равную одному периоду nереда4Н Т04КИ (24 мс), а так>ке трем периодам nереда4И точки (72 мс). Поскольку мы пока ew,e не знаем, как актнвировать реле (КnЮ4), то rOToBa функu.и, назыеаема KeyOn, исnользуетс M активнровани реле и функци KeyOff исnользуетс,lJ,Jl ВЫКnЮ4ени реле. Функu.и KeyOn устанавливает 6ит АВО, а Функu.и KeyOff с6расывает 6ит АВО. nр06ел, соответствуюw,н АSСIIкоду, в та6л. 4.2 не OTpa >кен, однако меж.цу словами OTpa6aTЫBaeTC промежуток, равный семи периодам nepe да4И Т04КИ. Пример 4.24 иллюстрирует поисковую та6лиu.у в nамти проrрамм, nредна- зна4енную M сохранени кода Морзе. Та6лиu.а в nамти состоит из двух 4aCTe: Morze.L содержит 6уквы, а MorzeN  u.ифры. Таблица 4.2. Код Морзе Символ Код Байт Символ Байт Байт Символ Код Байт А Ох42 М ОхС2 У   ОхВ4 В Ох84 N Ох80 Z ОхС4 С ОхА4 О ОхЕ3 О OxFD D Ох83 Р Ох64 1 Ox7D Е ОхО1 Q OxD4 2 Ox3D F Ох24 R Ох43 3 OxlD  G ОхС3 S ОхО3 4 OxOD Н ОхО4 Т Ох81 5 ОхО5 ОхО2 U Ох23 6 Ох85 J Ох74 V Ох14 7 ОхС5 К   ОхА3 W Ох63 8 ОхЕ5 L  . . Ох44 Х  . .  Ох94 9 OxF5 Пример 4.24 MORSE СОDЕ - РАСК Morse L: ;6уквы ОТ А АО Z db Ох42, Ох84, Оха4, Ох83, Ох01 db Ох24, Охс3, Ох04, Ох02, Ох74 db Оха3, Ох44, Охс2, Ох80, Охе3 db Ох64, О xd4, Ох43, Ох03, Ох81 db Ох2 3, Ох14, Ох63, Ох94, ОхЬ4 db Охс4 Morse N: ;qMCna ОТ О АО 9 db Oxfd, Ox7d, Ox3d, Ox1d, OxOd db Ох05, Ох8 5, Охс5, О хе 5 , Oxf5 nроu.едура, KOTopa 6ерет один АSСIIсимвол И3 реrистра WREG и посылает код Морзе, nоказана в при мере 4.25. XOT BBOДBЫBOД 6удет рассматриватьс nозже, дaH Ha nроu.едура использует порт В,  однн И3 портов BBoдaBЫBoдa, и ero 6ит OM акти- вировани реле. Если к зтому 6иry nОДКnlO4ИТЬ осu.илnоrраф, то мы Уl.3идим код Морзе 
144 Прнмененне MHKpOKOHTpOnnepOB PIC 18 как последовательность нуле и единнu., которые исnользуютс для ВКJIЮ4ения и ВЫ- КJlЮ4ени реле. Реле н ero интерфес 6удут 06суж.цатьс в nоследуюw,их rлавах. nри BeдeHHa nporpaMMa написана в раС4ете на тактовую 4астоту, равную 4 Mru.; если ис nользуетс ина TaKTOBa 4астота, то то С4еТ4ИКИ временных задержек должны 6ып> подстроены так, как зто 06ъснлось в npeAbIAyw,eM nодраздеllе данной rлавы. Пример 4.25 ;************* ФУНКUИR SendChar ************** мсnоnьзует 3 ypOBHR nporpaMMHoro стека мсnользует LookUp, KeyOn, KeyOff, Delay24, Delay72 м Delay мсnоnьзует WREG, PRODL, PRODH, TABLAT, TBLPTR посылает CMMBon мз WREG на TenerpaH клq (репе) SendChar: MOVWF MOVLW SUBWE' BN MOVLW SUBWF SendChar 1 : MOVLW SUBWF BNZ CALL CALL RETURN SendChar2: MOVLW SUBWF ВС RETURN SendChar3: MOVLW SUBWF ВС CALL ВМ SendChar4: MOVLW SUBWF ВС RE '1' шт SendChar5: MOVLW SUBWF BNC RETURN SendChar 6 : CALL PRODL Ох61 PRODL, О SendChar1 Ох20 PRODL Ох20 PRODL, О SendChar2 Delay72 Delay24 Ох30 PlODL, О SendChar3 Ох3а PRODL, О SendChar4 LookUp SendCharSend Ох41 PRODL, О SendCharS Ох5Ь PRODL, О SendChar6 LookUp1 ;coxpaHReT WREG ;eCnM 6YKB заrnавне ;npe06pa30BaHMe в заrnавне ;eCnM не np06en ;nnc 4 TOqKM ;eCnM "О" MnM 60nbwe ;eCnM не "О"  "9" ;еслм менее, qeM "А" ;eCnM 60nbwe, qeM "Z" 
rnaBa 4. ITporpaMMHpOBaHHe на Slзыке Ассембnера 145 Sепdcri) r:-5end: MOVWi-' MOVWF MOVLW ANDW}O SendCharSend1: CALL RLCF BNC CALL BRA SendCharSend2: CALL SеndСhаrSеndЗ: CALL CALL DECF BNZ CALL CALL RETURN PRODL РН.ОDН "1 PRODL KeyOn PlODH SendCharSend2 Delay72 SеndСhаrSеndЗ Delay24 KeyOff Delay24 PRODL SendCharSend1 Delay24 Delay24 ;КОА в РЕОDН ;CqeTqMK в PRODL ;pene BKn ;n0nyqeHMe TOqKM MnM тмре ;eCnM Т04ка ;заАерка на трм nepMOAa nepeAaqM TOqKM ; за.церка на ОАМН rrермод llepeAaqM 'l'ОЧКМ ; репе BKn ; заАерка на ОАМН перМОА nepeAaqM ТОqКИ ;eCnM не KOHeu ; заАерка на Ава nepMOAa nepeAaqM TOqKM наХОАМТ КОА в nOMCKOBO Ta6nMue КОАа Морзе =..ookUp: КОД B03BpaaeTcR ВО WREG MOVLW SUBWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF ВМ :"'00kUp1 : MOVLW SUBWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF ;"00kUp2: MOVF ADDWF MOVLW ADDWFC ADDWFC ОхЗО PRODL ;npe06pa30BaHMe мз ASCII UPPER(Morse_N) TBLPTRU HIGH(MorseN) TBLPTRH LOW(MorseN) TBLPTRL LookUp2 Ох41 PRODL UPPER(Morse L) TBLPTRU HIGH(MorseL) TBLPTRH LOW(MorseL) TBLPTRL PRODL,O TBLPTRL О TBLPTRH TBLPTRU t ;'''' 
146 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 TBLRD* MOVF TABLAT,O RETURN ;КОА М3 nOMCKOBO Ta6nMU ЗаАерка на nepMOA nepeAaqM TOqKM (Амта) Delay24: MOVLW MOVWF .48 TABLAT ;48 раз Delay24a: CALL DECFSZ ВМ RETURN Delay TABLAT Delay24a ЗаАерка на 3 nepMoAa nepeAaqM TOqKM (Амта) Delay72 : CALL CALL CALL RETURN Delay24 Delay24 Delay24 BpeMeHHaR заАерка на 500 МКС; Delay: ;165 раз MOVLW .165 ;500 МКС Delay1: DECFSZ WREG ВМ Delay1 RETURN Установка 6мта О порта В KeyOn: BSF PORTB, О RETURN установка 6мта О порта В С6рос 6мта О порта В KeyOff: BCF PORTB, О RETURN с6рос 6мта О порта В nроu.едура SendChar достаТ04НО проста. Больша ее 4асть выnолнет фильтра u.ню символов ASCII с тем, 4т06ы 06ра6атывались только 4исла, 6уквы и пробелы; лю- 6ые иные символы ASCII иrнорируютс. Как только pacn03HaH доnустимы АSСII-символ, структура кода Морзе и значени С4еТ4ика иw,утс в двух та6лиu.ах в na- мти nporpaMM с ИСnОЛЬЗ0ванием команды TBLRD*. 06ратите внимание, как адрес за rpY>KaeTC в реrистр TBLPTR в Функu.ии LookUp. Аирективы ассемблера UPPER, HIGH и LOW нсnользуютс ДJl досrynа к ра3ЛИ4НЫМ 4aCTM адреса при сохранении ero в TBLPTR. V1, HaKoHeu., структура кода Морзе ра3,lJ,елетс на значение С4еТ4ика и битовую структуру ДJl 6ита О порта В. Бнтова структура затем сдвнrаетс nобитоlЗО для опре- деnени Toro, как долrо 6ит О OCTaeTC в состонии лоrИ4еской единиu.ы. Т04ке (<<диту») соответствует 24 МС, а тире (<<даху»)  72 мс. 
rnaBa 4. ITporpaMMHpOBaHHe на языке Ассембnера 147 4.6. Резюме 1. Стек данных  зто место в nамти данных, в котором информаu.и сохранется по принципу «первым вошел, посnедним вышел». Реrистр вы60ра фала CPYHKu.HOHHPy- ет как указатель стека, ИСnОllЬЗУЮw,ий форму адресаu.ии РОSТDЕС,ЦЛ сохранени ,lJ,ан- ных в стеке и срорму РRЕINС,ЦЛ извле4ени данных И3 стека. 2. 04ередь  зто буфер данных, который coxpaHeT информаu.ию по nринципу "первым вошел, первым вышел». An срункu.ионировани 04ереди не06ходимо исполь 30вать два указател. nepBbI адресует Т04КУ входа, а BTOpO  точку выхода. Ошибоч- нымн состоними, расnознаваемыми nporpaMMHbIM 06есnе4ением, ра60тающим с ачереЩIМИ, вляютс состояние заnолненно очереди и состоние пустой очереди. З. Оnераu.ии сложени и ВЫ4итани ДВОИ4нокодированных деСЯТИ4НЫХ чисел ,ВСО) ИСnОllЬ3УlOТ команду DАW,ЦЛ коррекu.ии результата после ВСDсло>кения. В слу чае ВСDвычитани, исnользуетс nри6авление доnолнени до дести,ЦЛ срормирова НИ разности и ИСnОЛЬЗ0вани команды DAW. 4. Команда DAW корректирует результат ВСDсложени, исследу состоние 6ита переноса и 6ита nоловинноrо переноса реrистра состони, а также зна4ение обеих разрдов результата. Результат 3Toro иссnедовани оnределет, nри6авляетс ,цля коррекu.ни pe3YnbТaTa ОхОО, Ох06, Ох60 или Ох66. 5. АВОИ4ное умножение исnользует аnrоритм сдвиrа и суммировани Д1l срорми ровани nроизведени. АВОИ4ное nроизведение так>ке выnолнетс командами MULLW и MULWF. Описанный алrоритм nозволет выnолнть умножение 4исел лю60rо разме ра. 6. АВОИ4ное деление исnользует алrоритм сдвиrа и вычнтани ,ЦЛ rенерирования частноrо и остатка. Частное и остаток при ИСnОЛЬЗ0вании 3Toro алrоритма  3ТО BcerAa беззнаковые u.елые 4исла. 7. nреобраЗ0вание ДВОИ4ноrо 4исла в деСТИ4ное тре6ует делени на дeCTb. Ал rоритм, Tpe6yeMЫ ,ЦЛ TaKoro nреобраЗ0вани, Ha3ЫBaeTC nравиnом Хорна. 3тот ал rоритм так>ке ра60тает в сnучае nре06раЗ0вани ABoH4Horo 4исла в любую систему С4ислени посредством изменени 4исла, на которое выnолнетс деление, установив ero равным основанию системы С4ислени. 8. nреобраЗ0вание И3 деСТИ4НО в ДВОИ4НУЮ форму выnолнетс посредством умно>кени на дeCTb. 3то nре06раЗ0вание также 06есnе4ивает перевод И3 любо сис темы счисленн в ДВОИ4НУЮ посредством изменени козФФиu.иента с установкой ero ,., равным основанию системы С4ислени. 9. BpeMeHHa задержка 4асто срормируетс nporpaMMHo. 3то выnолнется вслед ствие Toro, что известно КОnИ4ество времени, необходимое ,ЦЛ выnолнени команды. Таким 06раЗ0М Т04ные временные задержки формируютс за С4ет использования npo rpaMMHbIx u.иклов. 4.7. Вопросы и задания 1. Что такое стек данных? 2. Что такое проrраммный стек? З. Сравните стек данных с nporpaMMHbIM стеком. 4. Если реrистр FSR1 исnользуетс как указатеnь стека, вы6ерите команды или команду, которые: а. Заност содер>кимое WREG в стек Ь. V1звnекают данные И3 стека и заност их во WREG. с. Заност nроизведение в стек 
148 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 5. KaKa команда используетс ДЛ иннu.иализаu.ии FSR2 как указател стека? 6. Если содержимое WREG 6ыло занесено в стек, после 4ero в стек 6ыло 3attCcellO СОАер>кимое PRODL, KaKO И3 названных реrистров 6удет первым выrружен И3 стека? 7. Что такое 04ередь? 8. Опишите состони оши60К, KOTOpЫ должны pacn03HaBaTbc nporpaMMHbIM обеспечением ра60ТЫ с 04ередми. 9. Если 04ередь имеет размер, paBHЫ 16 6aTOB. Сколько 6айтов данных Moryr 6ыть сохранены в 3TO 04ередн? 10. Что 0зна4ает, коrда rOBopT, 4ТО очередь  зто u.иклична naMTb? 11. Коrда складываютс ВСD4исла, KaKa команда должна ИСnОЛЬЗ0ваться Дl1Я коррекu.ни результата? 12. Опиwите разниu.у мюкду упакованными и HeynaKoBaHHbIMLI1 ВСDЧИСl1ами. 13. Определите 4ИСЛО, д06авлемое KOMaHДO DAW в СЛУ4ае следующнх onepa u.ий сложени упакованных ВСD-4исел. а. 03 + 08 Ь. 1 0+ 28 с. 92 + 99 d. 92 + 90 14. Как выnолнетс ВЫ4итание ВСD4исеn? 15. Что такое дополнение до 1 О и как оно nОЛУ4аетс? 16. n04eMY ВСD4исла исnользуютс в nporpaMMax? 17. Умножение может 6ыть выполнено при ИСnОЛЬЗ0вании последовательности  сдвиrов и сложений. 18. Команда умноженн ра60тает только с 8разрдными числами. Как она мо>кет быть ИСnОЛЬЗ0вана ДЛ 16разрдноrо умножени? 19. Как долrо выnолнетс команда умножени? 20. Наnиwите Функu.ню, KOTopa умножает СО,lJ,ержимое WREG на содержимое TABLAT. 3та функu.и должна B03Bpaw,aTb результат во WREG в форме 8разрдноrо сnо>кения, иrнориру старшую часть nроизведени. 21. Напишите Функu.ню, KOTopa возводит в квадрат число во WREG, B03Bpaw,a результат во WREG в форме 8разрдноrо 4исла. 22. Оnиwите изменени, требуемые в примере 4.8 с тем, 4т06ы он выnолнл YM ноженне двух 16-разр,lJ,НЫХ 4исел со знаком и rенерировал 32разрдное nронзведе ние со знаком. 23. Аеление может 6ыть выполнено при ИСnОЛЬЗ0вании последовательности сдвнrов и ВЫ4итани. 24. Если 4ИСЛО ну>кно nоделнть на 4, 4ТО 6удет наИЛУ4ШИМ методом? 25. Может ли алrоритм делени, paCCMOTpeHHЫ в 3TO rлаве, 6ыть модиФиu.иро ван ДЛ выnолнени 24-разрдноrо делени? Если да, то какие измеllени в нем ну>кно выполнить? 26. Можно ли написать nporpaMMY, KOTopa делит 256разрдное 4ИСЛО на 28разрдное4ИСЛО? 27. Что такое правило Хорна? 28. МодиФиu.ируте при мер 4.15 так, 4т06ы выnолнлось nре06раЗ0вание не в деСТИ4НУЮ, а в ВОСЬМИРИ4НУЮ форму. 29. Предположим, 4ТО npLl1Mep 4.15 должен npe06pa30BaTb 4ИСЛО в шестнадu.ати РИ4НУЮ срорму. Оnиwите изменени, которые должны 6ыть в нем ВЫПОЛllены с u.el1bIo достнжени 3Toro и срормировани как 4исел, так и 6укв в результируюw,е nоследова тельности АSСIIкодов. 30. Опишите, как nporpaMMHo npe06pa30BbIBaeTc деСТИ4ное 4ИСЛО в ДВОИЧllOе 
rnaBa 4. ITporpaMMHpOBaHHe на Slзыке Ассембnера 149 31. МО>КНО ли npe06pa30BaTb 4ИСЛО И3 ВОСЬМИРИ4НО В ,lJ,ВОИ4НУЮ форму? Еслн да, то как? 32. Сколько времени замет выполнение функu.ии по примеру 4.15, есnи таКТОl3ая частота микроконтроллера равна 8 Mru.? 33. Что такое командный u.икл и сколько импульсов системной тактовой частоты Tpe6yeTC ДJl одноrо командноrо u.икла? 34. Сколько времени замет выполнение нижеnриведенно Функu.ии, если сис- TeMHa TaКТOBa 4астота равна 40 Mru.? (У4тите BpeM выnолнени команд CALL и RETURN). Wait: MOVLW Wait1: DECFSZ ВМ RE'l'URN .10 WREG Wait1 35. Напишите функu.ию, реализуlOw,ую 1 ООмиллисекундную временную задер>кку с именем D 1 00, а так>ке Функu.ию, реализуюw,уlO 1 миллисекундную временную за держку с именем О1, если TaKTOBa 4астота микроконтроллера равна 20 мrц. 36. V1сnользуйте срункu.ию И3 примера 4.23 ДJl С4итывани клавиши кnавиатуры. HOBa срункu.и должна заносить ОхОО в 4eKY nамти Ох01 О вский раз, коrда на>кима eTC npaBa кnавиша Shift, н заносить OxFF в 4eKY naMTH данных Ох01 О вски раз, коrда npaBa кnавиша Shift. Все друrие кnавншн и комбинаu.ии кnавиш должны иrнори pOBaTbC . 37. Повторите n .36 ДJl 06еих кnавиш Shift. 38. HaДHTe та6лнu.у кодов Морзе в V1HTepHeT и выделите И3 нее символы nYHK- туаu.ии. А06авьте коды символов nункryаu.ии к та6лиu.е КО,lJ,ОВ Морзе, сохранемой в nамти в примере 224, BBeд третью секu.иlO та6лиu.ы с именем MorseP. 39. Каково назна4ение директив LOW, HIGH и UPPER в nporpaMMe, приведенной в при мере 4.25? 
150 ITpHMeHeHHe микроконтроnnеров PIC 18 rлава 5. Проrрамммрованме PIC18 на языке С Теперь, после Toro, как Вы ознакомнлнсь с Ассем6лером PIC, вам не06ходнмо узнать, как nporpaMMHpoBaTb YCTpOCTBa ceMeCTBa PIC18 с НСnОJlьзованнем зыка С. MHorH8 среды nроrраммнровання НСnОЛЬЗУIOТ язык С вместо Ассем6лера, потому 4ТО !з этом СЛУ4ае ЦНKJl разра60ТКН nporpaMM nОЛУ4ается HaMHoro КОр04е, а nporpaMMbI 60 лее леrкн в HanHcaHHH н 06слу>кнваннн. В дaHHO rлаве подразумевается нсnользова- нне комnнлтора языка С, KOTOpЫ мо>кет 6ыть 6есnлатно BbIrpY>KeH с caTa Microchip. В данной rлаве не nреследуется цель НЗУ4ення языка С, так как nредnолаrается, 4ТО чнта тели у>ке знакомы с ннм до HeKOTOpo степени. V1сnользуется комnнлятор С18, KOTOpЫ представляет c060 комnнлтор с языка С дnя мнкроконтроллеров ceMeCTBa PIC18. Бесплатная версня 3Toro комnнлятора  3ТО версня nолносрункцнональноrо комnилято ра с orpaHH4eHHbIMH возмо>кностямн, она достаТ04на дnя НЗУ4ення Toro, как ну>кно про rpaMMHpoBaTb PIC н создавать nрнло>кення. Разннца ме>кду 6есnлатно версие н nол носрункцнонально BepCHe комnнлятора заKJl104аетс в том, 4ТО В 6есnлатно версин оnтнмнзаu.н не выполняется, 4ТО озна4ает, 4ТО reHepHpyeMbIe коды MoryT 6ыть HeMHO ro 60лее ДnHHHЫMH, кроме Toro, в He так>ке за6локнрована 06ра60тка расшнреНIIЫХ команд, досrynных в ceMeCTBe PIC18. Большннство nporpaMM н anropHTMoB, представленных в 3TO rлаве, ИСnОЛЬЗУIOТ в ка4естве nлатсрормы зык С. В некоторых npHMepax nporpaMM, npHcyтcTBYIOT cppar  менты, HanHcaHHbIe на зыке Ассем6лера. Как отме4алось во введеннн в rлаву 4, caMЫ ЛУ4ШИ подход заКЛlO4ается в НЗУ4еннн как rлавы 4, так н rлавы 5. После Н3У4ення дaH HO rлавы Вы: 1. Смо>кете НСnОJlьзовать комnнлятор зыка С С18 в рамках HHTerpHpoBaHHo системы разра60ТКН nporpaMM PIC дNЯ nporpaMMHpoBaHH мнкроконтроллеров ceMe ства PIC18. 2. Узнаете о некоторых срункu.нях, нмеlOw,нхся в 6н6лнотеках, nрнлаrаемых к ком- nнлятору С18. З. НаУ4нтесь нсnользовать н reHepHpoBaTb СЛУ4аные 4нсла. 4. Смо>кете сохранять та6лнu.ы н друrylO ннсрормацнlO в nамятн nporpaMM. 5. Смо>кете nHcaTb nporpaMMbI на С, НСnОЛЬ3УЯ временные задер>ккн н 6н6лноте кн временных за,о,ер>кек. 6. Узнаете, как НСnОЛЬЗ0вать состояння на днаrрамме переходов прн реализацин nporpaMMbI. 7. НаУ4нтесь nHcaTb nporpaMMbI с нсnользованнем MaTeMaTH4eCKO 6н6лнотекн. 5. 1. Компилятор С18 с языка С nporpaMMa, которая nредназна4ена дnя разра60ТКН nporpaMM на языке С н кото- PYIO Microchip предоставляет в рамках HHTerpHpoBaHHo среды разра60ТКН ЮЕ, назы- BaeTC комnнлятором С18. Комnнлятор С18 мо>кет 6ыть 6есnлатно BbIrpY>KeH с caTa Microchip (http://www.microship.com). BpeM нсnользовання 3TO 6есnлатно верснн orpaHH4eHo 60 днямн. Вместе с тем ее срункцнональность достаТ04на дnя решення ЛIO 60 nporpaMMHo за,lJ,а4Н, XOT reHepHpyeMbIe elO коды н 6удут несколько 60лее ДnHH нымн, 4ем в СЛУ4ае npHMeHeHH nолносрункцнонаJlЬНО верснн. ОrраНН4енная версня комnнлтора не BKJl104aeT pacWHpeHHbIe коман,lJ,Ы; однако 3ТО не создает ннкакнх npo 6лем  ПРОСТО реЗУЛЬТНРУIOw,не nporpaMMbI nОЛУ4аlOТСЯ HeMHoro 60лее ДnHHHЫMH. npH разра60тке nporpaMM дn ceMeCTBa PIC18, следует nрндер>кнваться nред n04тнтельноrо НСnОЛЬЗ0ванн в nporpaMMax 6еззнаковых СНМВОЛЬНЫХ nepeMeHHbIx, поскольку мнкроnроцессор нмеет 86HTHYIO архнтектуру. Еслн нсnользовать 4нсла 
rnaBa 5. ITporpaMMHpoBaHHe PIC18 на языке С 151 60льшей разрядности, то это увеЛИ4ИТ время выполнения nporpaMMbI, поэтому ЧLl1СЛ3 601lьшей размерности следует ИСnОЛЬЗ0вать как мо>кно ре>ке. Чем 60ЛЬШИМ будет УХОД от природы аппаратных средств, тем 60ЛЬШНМИ 6удут nporpaMMbI и тем дольше OHLI1 6удут выnолнтьс. Так 16разрядное u.еЛ04ИСJlенное сло>кение тре6ует 60льше време- ни н 60льwеrо 06ъема памяти nporpaMM, 4ем 8-разрядное u.еЛ04исленное сло>кеНLI1е; З2разрдное сло>кенне с nлаваlOw,е T04KO тре6ует HaMHoro 60Jlьше времени и 06ъe ма памяти nporpaMM, 4ем 8-разрядное СJlо>кение. nepeMeHHbIe в nporpaMMe следует вы6ирать с OCTOpO>KHOCTblO; если 4ИСЛО 6еззнаковое, то у6едитесь в том, 4ТО оно 06ъ- явлено 6еззнаковым. PIC  это не nK, 06ъем ero памяти nporpaMM 4pe3BЫ4aHO мал, по сравнениlO с nерсональным KOMnblOTepoM. В силу оrраНИ4енности nамти следует пи- сать nporpaMMbI 04ень Tw,aTeJlbHO, уделя ос060е внимание вы60РУ nepeMeHHbIx. Смешанное nроrраммирование, совместно ИСnОЛЬЗУIOw,ее Ассем6лер и С, так>ке допускается и 4асто исnользуется. Ассем6лерные 6локи на4инаlOТСЯ с директивы asm и закаН4иваlOТСЯ директиво _endasm. Блоки кодов Ассем6лера не 6ерутся в сриryрные ск06ки { }, как это имеет место в nporpaMMHbIx 6локах на языке С. Комментарии, раз Mew,aeMbIe в ассем6лерных 6локах, дол>кны 6ыть комментариями Сстиля, а не исполь- зовать символ Т04КИ с заnто, как это 06Ы4НО делается в nporpaMMax на 3ЫKe Ac сем6лера. Аанные, определенные на языке С, ЯВЛЯlOтся доступными ДЛ nporpaMM, написанных с ИСnОЛЬЗ0ванием внутритекстовоrо ассем6лера. Ew,e OДHO ра3НLI1цей ме>кду языком Ассем6лера и и внутритекстовым ассем6лером 3ЫKa С ВJlется то, что в последнем НИ4еrо не nредnолаrаетс. Так, если nроизводится доступ к nамти дан- ных в 6анке Aocryna, не06ходимо явным 06раЗ0М ИСnОЛЬЗ0вать КЛlO4евое слово ACCESS и Т.Д. Перед тем, как Вы смо>кете 60льше узнать о КОМnИJlяторе С18, не06ходимо по НЯ1Ь ero ИСnОЛЬЗ0вание в IDЕ. IDЕ npeAHa3Ha4eHa, KaKM разра60ТКLI1 nporpaMM на зы I(е Ассем6лера, так и ,lJ,JlЯ разра60ТКИ nporpaMM на зыке С, поэтому, если Вы ИЗУЧLl1J1L11 rлаву 4, HOBЫ интерсрес вам И3У4ать не придется. Однако имеlOТСЯ несколько раЗЛLl1- чий МЮКДУ HaCTpOKO IDЕ M разра60ТКИ nporpaMM на 3ЫKe С и ее настройкой для разра60ТКН nporpaMM на языке Ассем6лера. Ал ИСnОЛЬЗ0вания компилятора С18 в IDЕ, установите комnилтор, следуя noA сказкам, выдаваемым на экран. Убедитесь в том, 4ТО при установке компилятора BЫ браны все не06ходимые nозиu.ии. Wаrи, Tpe6yeMыeM настроки IDЕ на ра60ТУ с KOM nнлятором С18, noA06HbI waraM, не06ходимым M ее настроки на ра60ТУ с Ассем6':.'" лером. 1. В pacKpbIBalOw,eMc MeHIO Configure (Консриryрирование) вы6ерите nозициlO Select Device (Вы6рать устройство), а затем вы6ерите ИСnОJlьзуемы МLI1КРОКОI-IТРОЛ лер. 2. В раскрываlOw,емся MeHIO Project (npoeKT) вы6ерите n03L11ЦLl11О Project Wizard (Мастер npoeKToB) и вновь вы6ерите микроконтроллер, исnользуемы в проекте. З. На шаrе 2 ра60ТЫ мастера npoeKToB вы6ерите Microchip С18 Toolsuite (KOM плект инструментальных средств Microchip С18), а затем w,еJlкните на кнопке Next (Дa лее). Если компилятор С18 6ыл установлен правильно, то все пути 6удут указаны KOp ректно и изменять их не надо. 4. Вве,lJ,ите имя npoeKTa н нмя KaTaJlOra, затем w,елкните на кнопке Next (Аалее). 5. На шаrе 4 вы моrли 6ы захотеть на4ать ра60тать с сралом Example 1 И3 каталоrа mcc18/example/GettingStarted. В этом СЛУ4ае вам следует д06авить к npoeKTY срайл Ех- ample1,c file. 6. под nозиu.ие Project (npoeKT) rлавноrо MeHlO, вы6ерите Build Options (Опu. ии компоновки), затем вы6ерите "h" в каталоrе mcc18 в ка4естве пути BКnlO4aeMbIx срай- лов. После этоrо w,елкните на кнопке Apply (nрименить), а затем на кнопке Ok. 
152 Применение МИКрОКОНТроnnеров PIC 18 7. Щелкните правой KHonKo мышки на nозиu.ии Linker files (Фалы КОМПОНОВЩLl1 ка) в списке срайлов npoeKTa на экране, затем вы6ерите add file (А06ави.тъ срайл), после чеrо д06авьте срайл 18fxxxx.lkr. (О6ратите внимание на то, 4ТО ХХХХ - это серийный HO мер микроконтроллера, исnользуемоrо в nроекте). 8. Под nозиu.ие Debugger (ОтлаД4ИК) вы6ерите инструментальное средство "MPLAB SIM." 3то приведет к ВКЛlO4ениlO в npoeKT инструментальных средств имита ЦLl1L11. Если в вашем расnор>кении имеется внутрисхемный эмулятор (ICE), то д06авьте корректный эмултор к разра6атываемому nроекту. Пере4исленные шаrи не 60лее трудны, 4ем настройка nроекта при использовании Ассемблера. При мер 5.1 демонстрирует ЛLl1стинr nporpaMMbI Example1.c. 3тот листиш. nporpaMMbI является HaMHoro 60лее коротким, 4ем листинr ша6ЛОIIIIОЙ проrраммы, предназна4енной ,lJ,JlЯ ИСnОЛЬЗ0вания с Ассем6лером, поскольку язык С является Ha MHoro 60лее MOW,HbIM и менее вер6альным, 4ем 3ЫK Ассем6лера. Пример 5.1 1* * Это npMMep 1 МЗ KaTanora "Getting Started with MPLAB С18" (Начаnо работ с MPLAB С18) *1 #include <p18cxxx.h> 1* дnя объявnенм TRISB М PORTB*I 1* YCTaHaBnMBaeT 6MT KOHMrypaUMM АnЯ МСnОnЬЗ0ванмя с Аемонстраuмонной nnaTO ICD2/PICDEM2 PLUS: *  YCTaHaBnMBaeT peMM reHepaTopa HS *  OTKn4aeT CTopoeBO TaMep *  OTKn4aeT нмзковоnьтное nporpaMMMpOBaHMe *1 #pragma config OSC HS #pragma config WDT OFF #pragma config LVP OFF int counter; void main (void) counter = 1; TRISB = о; 1* KOHMrypMpyeT PORTB на BBOA *1 while (counter <= 15) { PORTB = counter; 1* OT06paaeT зна4енме nepeMeHHo "counter" на свеТОАМОАах *1 counter++; } }<inst></inst></emphasis> 3та nporpaMMa написана ,lJ,JlЯ ИСnОЛЬЗ0вания с отлаД04НО платой PICDEM2 plus. Она имеет CTaHдapTHЫ, ,lJ,JlЯ языка С срормат, ИСnОЛЬ3У срункu.ИIO main, содер>кащую nporpaMMY. 3та nporpaMMa нсnользует одну nepeMeHHYlO, Ha3bIBaeMYIO counter. Она консриrурирует Port В как BXOДHO порт, а затем от06ра>кает 4исла от О до 15 при nOMO щи светодиодов, подсоеДиненных к nopry В. Если имеется в наЛИ4ИИ демонстраЦLl101l- Ha плата PICDEM2 Plus, то дaHHa nporpaMMa мо>кет выnолнться на He. ЕСЛLl1 >ке эта 
rnaBa 5. ITроrpаммнроваине PIC 18 на языке С 153 плата отсутствует, то nporpaMMa мо>кет ВЫnОJlНЯТЬС на имнтаторе. V1митатор OT06pa ж:ает 4исла по мере ИХ изменени в порте В. Дл имитаu.ни выполнения это nporpaMMbI перейдите к MeHIO View (Вид)и от06разите содер>кимое сnеu.иаJlЬНЫХ срункu.ионаЛЫ-IЫХ реrистров, указав порт В. ВЫnОJlнйте nporpaMMY nошаrово и на6ЛlOдате за измене ними состояни порта В по мере nowarOBoro выnолнени nporpaMMbI. В данном rlрИ- мере ИСnОJlьзуетс PIC18F1220, поэтому ,lJ,JlЯ Toro, 4т06ы этот микроконтроллер cpYHK ЦИОНИРОВaJl корректно, к nporpaMMe из при мера 5.1 6ыла д06авлена одна команда, ВЫnОЛНЯIOw,ая вы60Р u.исрровой ре>ким ра60ТЫ всех выводов BBoдaBЫBoдa. А именно 6ыл д06авлен оператор ADCON 1 = Ox7F перед оператором counter = 1. Скомпонуйте и выполните nporpaMMY, а затем посмотрите на окно имитатора  вы ДОJl>КНЫ увидеть экран, nоказанны на рис. 5.1. Для nОЛУ4ения вида экрана, cooTBeTcTBYIOw,ero nоказанному, ИСnОJlьзуте инст румент увеJlИ4ени (квадрат) ,lJ,JlЯ увеЛН4ения окна и nОJlУ4ени TaKoro ero внешнеrо Вида, KOTOpЫ nоказан на упомянутом рнсунке. Что не так на этом экране. В 06щемто все в порядке, за ИСКЛlO4ением Toro, 4ТО возникает оw,уw,ение Toro, 4ТО имеется оши6 ка, так как зна4ение С4еТ4ика, равное 15, oT06pa>KaeTC в те4ении 60лее одноrо nерио да TaKTOBO 4астоты. Однако, если посмотреть nporpaMMY, то можно видеть, 4ТО она от06ра>кает зна4ени С4еТ4ика от 0000 до 1111, а затем nерезаnускается, 4ТО отнимает ,lJ,оnолнитеJlьное время. Для корректирования nporpaMMHoro примера, nриводимоrо Microchip, модисриu.ируем пример 5.1 таким 06раЗ0М, 4т06ы он выrJlядел так, как nри- мер 5.2. контролируя выход на лоrИ4еском анализаторе. Выхо,lJ, теперь 6удет изменять c от 0000 ДО 1111 и nовторятьс 6ез «провалов» В зна4еннях С4еТ4ика. , ; I , I I I I I I I , I I I I I I I 1 I I J I I I I 111 З1 800.0 11131900.0 11132000.0 11132100.0 11132200.0 Рис. 5. 1. Внешни вид окна Пример 5.2 1* * Это МОАммuированн rrример 5.1, * наrrисанн AnR PIC18F1220 *1 
154 Применение микроконтроnnеров PIC 18 #include <p18cxxx.h> 1* Аnя объявnенм TRISB м PORTB *1 1* YCTaHaBnMBaeT бмты KOHMrypaUMM AnR МСnОnЬЗ0ванмя с * AeMOHCTpaЦMOHHO nnaTO IСО2/РIСОЕМ2 PLUS: *  YCTaHaBnMBaeT peMM reHepaTOpa HS *  OTKn4aeT CTopoeBO TaMep *  OTKn4aeT HM3KOBOnbTHOe npOrpaMMMpOBaHMe *1 #pragma config OSC HS #pragma config WDT OFF #pragma config LVP OFF int counter; void main (void) ADCON1  Ox7F; TRI SB = о; while (1) { 11 объявnяет nopT ЦMpOBMM 1* KOHMrypMPyeT PORTB на BXOA *1 counter = о; while (counter <= 15) { PORTB  counter; counter++; 11 С4еТ4МК передается на светодмоды Оператор #include BKJl104aeT срайл заrоловка, который определяет все реrис 1 ры BBoдaBЫBoдa устройств семейства PIC18, вы6ранные дл npoeKTa. 3то позволяет мик роконтроллеру выnолнть операции ввода-вывода. Файл заrоловка дол>кен включаться во все npoeKTbI. Операторы #pragma config nроrраммируют 6L/1TbI КОНСРL/1rураЦL/1И МL/1кроконтролле ра. BepOTHO, что TepML/1H pragтa произошел от слова pragmatic (llраrмаТL/1ЧНЫЙ), что озна4ает nраКТИ4еСКL/1Й cnoc06 делать 4то-ли60. Команды pragma осв060>кдают про rраммиста от не06ХОДL/1МОСТИ наnL/1сани длинных последовательностей команд или шаrов при выполнении некоторых зада4. Таким 06разом они отра>кшот nраКТL/14НЫЙ L/1JJL/1 nраrмаТИ4НЫЙ cnoc06 выnолнени зада4И. Аиректива #pragma используетс для Toro, чтобы дать команду компилятору. БL/1ТЫ консриrураЦИL/1 уnравлют nеРВL/1ЧIIOЙ настрой кой микроконтроллера PIC18. 3ти 6L/1TbI разъснIOТС в деталях в rl1aue 6 npL/1 paCCMOT реНL/1И аппаратных средств микроконтроллера. Кюкдая верСL/1Я МL/1КРОКОНТРОЛl1ера PIC18 имеет друrL/1е 6иты КОНсрL/1ryраЦИL/1, которые nере4L/1слены в документе "MPLAB С18 Соп fig Settings" (Настройка консриrураu.L/1И MPLAB С18), который доступен ЩIЯ uыrРУЗКL/1 lIa сайте Microchip. Пример проrраммы nредnоло>ким, что нам ну>кна nporpaMMa, KOTopa СЧL/1тьшает СОСТОЯНL/1е переклlO чатеn 4ерез порт А и инкремеНТL/1рует ЧL/1СЛО, от06ра>каемое 4ерез порт В ОДL/1Н раз u секунду только тоrда, коrда кнопка на>кат. Эта проrрамма noxo>Ka на nporpaMMY L/1З ПрL/1 мера 5.1, однако для отра60ТКИ задер>ККL/1 L/1сnользуется СРУНКЦL/1Я временной задер>кки из стандартной би6лиотеКL/1 С. БL/16ЛL/10тека С обеспе4L/1вает временные задер>кки, YKa занные в та6лице 5.1. ЭТL/1 срУНКЦL/1И являютс Ba>KHUIML/1, так как nОЧТL/1 любая IlpOrpaMMa, 
rлава 5. Проrpаммированне PIC 18 на языке С 155 исnользуема для уnравnени nерисрерийными устроствами, HY)f(ДaeTc в отра60тке временных задер>кек. 3TLI1 срункu.ии делаlOТ Т04ное rенерирование временных задер>кек HaMHoro 60лее npocTo зада4е, 4ем в СЛУ4ае ИСnОЛЬЗ0вания cnoc060B, 06Су>Кдавших ся в rлаве 4. Ka)f(Дa И3 ynoMHYТbIX срункu.и срормирует BpeMeHHYIO заде р>кку , Bыpa женнуlO в КОЛИ4естве командных u.HKJlOB, на4иная от 1 командноrо u.ИKJlа и вплоть n04ТИ до ЛlO60rо командных u.иКJlОВ. Для ИСnОЛЬЗ0вани этих срункu.и В на4але nporpaMMbI исnользуетс оператор #include <delays.h> ДЛ ВKJl104ени срункu.и временных задер жек. Описание CTaHдapTHO 6и6лиотеки досrynно на caTe Microchip в документе "MPLAB С18 Libraries" (Би6лиотеки MPLAB С18). Как и в СЛУ4ае временных задер>кек, которые рассматривались в rлаве 4, срункu.ии delays.h 6удут Т04НО отра6атываться только тоrда, коrда система не 6удет npepbIBaTb их выполнение. Пример 5.3 демонстрирует nporpaMMY, которая инкрементирует индикаu.иlO CBe тодиодов, nОДКЛlOченных к порту В, коrда кнопка удер>киваетс в на>катом состонии по крайней мере одну секунду. Если она 6удет удер>киваться в на>катом состоянии немно- rим дольше 2x секунд, индикаu.и на светодиодах инкрементируется ДBa)f(ДЫ и Т.д. Опять-таки эта nporpaMMa nредnолаrает ИСnОЛЬЗ0вание PIC18F1220. 3тот микрокон троллер вы6ран по nРИ4ине ero низко стоимости (менее $3) и малых размеров мик росхемы. В данном примере АА4 nОДKJl104ен к кнопке. СиrнаJl с кнопки находитс в co стонии лоrИ4еско единиu.ы, коrда кнопка не на>ката, и в состонии лоrИ4ескоrо нуля, коrда кнопка на>ката. Пример 5.3 1* * Это npMMep 5.3 АЛЯ TaKTOBO 4aCTOT 4 Mru, * HanMcaHH AnR PIC18F1220 *1 #include <p18cxxx.h> IIBKn4eHMe cneUMMKaUM портов #include <delays.h> IIBKn4eHMe BpeMeHHX заАерек 1* Установка 6мтов KOHMrypaUMM *  установка peMMa reHepaTopa HS *  BKn4eHMe cTopoeBoro TaMepa *  BKn4eHMe HM3KOBOnbTHoro nроrрамммроваНМR *1 . J' #pragma config OSC HS #pragma config WDT OFF #pragma config LVP OFF II ****************** ПЕРЕМЕННЫЕ В ПАМЯТМ HHЫX******************** int counter; 1I ********************* КОНСТАНТЫ ***************************** #define MSEC Delay1KTCYx(1) II MSEC = 1 MMnnMceKYHAa 1I ***************** rЛАВНАЯ проrРАММА ****************************** void main (void) ADCON1 = Ox7F; II KOHMrYPMpoBaHMe портов А м В как UMpOBX II Этм установкм MorYT M3MeHRTbcR в завмсммостм II от версмм MMKpOKoHTponnepa TRISB TRISA PORTB О; OxFF; о; II KOHMrypMpOBaHMe PORTB на BBOA AaHHX II KOHMrypMpoBaHMe PORTA на ВВОА AaHHX 11 свеТОАИОА BKn. 
156 ITрнменение МИКрОКОНТроnnеров PIC 18 while (1) { counter = о; II 6eCKOHe4H UMKn nporpaMMbl II мнмuмаnмзаuмя С4етчмка while ( (PORTA & 16) о) II пока кнопка HaaTa { MSEC; 11 OMAaHMe 1 МС counter++ ; if (counter 1000) II 1 секунда { PORTB++; counter = о; Таблица 5.1. Функu.ии отра60ТКИ временных задер>кек из delays.h Функция DelaylTCY Delayl0TCYx Пример Delay1TCY() ; Delay10TCYx(10); Delayl00TCYx Delay100TCYx(10); ЬеlауlКТСУх Delay1KTCYx(3); Delayl0KTCYx Delay10KTCYx(20); Примечание BCTaBnReT в nporpaMMY одну команду NOP BCTaBnReT 100 KOMaHAHX UMKnOB (ЧМСJlа AOnH бть в AMana30He MeAY О м 255) (о B3BaeT задерку в 2560) BCTaBnReT 1000 KOMaHAHX UMKnOB (4Mcna AOnH быть в AMana30He MeAY О м 2S) (о B3BaeT заАерку в 25600) BCTaBnReT 3000 KOMaHAHX UMKnOB (чмсnа AOnHbl бть в AMana30He MeAY О м 255) (о B3BaeT заАерку в 256000) BCTaBnReT 20000 KOMaHAHX UMKnOB (4MC па AOnH бть в AMana30He MeAY О м 255) (о B3BaeT заАерку в 2560000) в 3TO nporpaMMe одна nеременная исnользуется для nОДС4ета nриращений в 1 миллисекунду. При мер 5.3 nредnолаrает, 4ТО тактовая частота микроконтроллера paB на 4 Miu. (1/4 Miu. = 250 нс), 4ТО озна4ает, 4ТО командный u.икл paueH 1 мкс, ПОСКOJIЬКУ 4 тактовых импульса тре6уется ДЛ одноrо KOMallДHOrO u.LI1кла. Функu.ия Delay1 КТСУх( 1 ) вызывает задер>кку в 1000 командных u.икла, ли6о в 1 мс. 3та временная задер>кка on ределяется как MSEC с тем, 4т06ы nOBbICLl1Tb 4L11та6ельность nporpaMMbI. Операторы define ДОЛ>КНЫ использоваться nоказанным cnoc060M с тем, 4т06ы сделать проrрамму 60лее ясной и менее зашисррованной. Состоние кнопки nроверяется оператором while. С зтой кнопкой соедннена 6L11товая nозиu.и 4 порта А, поэтому 16 (Ох1 О) лоrLl14е ски YMHO>KaeTC (AND) с портом А для оnределени СОСТОЯНLI1 кнопки. Если кнопка не на>ката, то 6итовая nозиu.ия 4 находится в состоянии лоrической еДLl1НИu.ы, 4ТО после лоrическоrо умно>кени с 16 дает 16. Если >ке кнопка на>ката, то результатом лоrИ4еско ro умно>кеНLI1Я порта А с 16 6удет ноль. До тех пор, пока кнопка 6удет на>ката, условие оператора while 6удет истинным, lПО приведет к выполнению команд теJlа оператора while. В данном случае по исте4ении одной секунды содер>кимое порта В инкремеНIИ- pyeTC и выnолнется с6рос C4eT4L11Ka в ноль. 3то nерезаnускает односекундный обраl ный ОТС4ет. Ос06ый интерес в зтой nporpaMMe представляет cnoc06 проверки СОСТОНLI1Я 6и та порта А, соединенноrо с кнопкой. Как nоказано в рассматриваемом rlримере, onepa u.ия AND используется для изолu.ни 6L11Ta порта А. Число, LI1сnользуемое в оnераЦИLl1 
rnaBa 5. ITporpaMMHpoBaHHe PIC 18 на языке С 157 AND, выделяет 6ит: так, 1 вы6ирает 6ит номер О, 2 вы6ирает 6ит номер один, 4 вы6ира ет 6ит номер два, 8 uы6ирает 6L/1T номер три L/1 так далее (см. рис. 5.2). Несколько MeHb ШL/1Й интерес представляет С4еТ4ИК, используемый для срормировани односекундной временной задер>кки шаrами, равными одной миллисекунде. n04eMY зта nporpaMMa содер>кит 6eCKOHe4HЫ u.ИKJl в срорме оператора while( 1)? Среда, nредоставлема комnилтором 3ЫKa С, повторно выполняет mаiп(). nр06лема здесь заКnlOчаетс в том, 4ТО оператор mаiп(), KOTOpЫ иниu.иализирует nporpaMMY, дол>кен выполнятьс только один раз. После ИНИЦL/1ализаu.ии проrраммы оператор while( 1) 6удет в ре>киме повторения выполнять команды u.икла, ToeCTb 6удет ссрорми рован 6есконе4НЫЙ u.икn while. В случае встроенных систем или иных систем nод0611Оrо типа rлавна nporpaMMa или сама оnераu.ионная система pa60TalOT в ре>киме 6еско- He411Oro ЦИKJlа. Рис. 5.3 ИЛJllOстрирует структуру всех оnераu.ионных систем, - как BCl poeHlIbIx, так и иных. При этом термин ХОЛОДНЫЙ старт 0зна4ает аппаратный с6рос. Проrрамма L/13 примера 5.2 непосредственно следует nоказанной модели. В комnил торе PIC С18 холодный старт предварительно выполняется срункцией main(). 7 6 Позиции битов 5 4 3 2 о Значения 2 4 8 16 , ,:  32 64 128 Рис. 5.2. Выделение разрдов 4исла 
158 ITримененне микроконтроnлеров PIC 18 "холодный старт" системы . j 1 инициализация СИСТl\lЫ, всех переМСlIIIЫХ и устройств ВIЮ)(аВЫВО)Щ  r только операционная система Рис. 5.3. Структура оnераu.ионной системы ApyrHM cnoc060M КОНТРОJlЯ состояни 6ита явлетс использование дирек-тиuы PORTAbits 3ЫKa С. Так, оператор PORTApits.RA4 используетс для nроuерки СОСТОЯНLI1Я 6итшюй nозиu.ии 4 порта А. Фал комnоновw,ика ДЛ данноrо МLI1КрОКОНТрОЛJlера опре делет все выводы порта А, а команда PORTAbits.RA4 проверет состоние 6L11ТОВОЙ nозиu.ии АА4 порта А. Пример 5.4 nерера60танный пример 5.3, при зтом В новой верСLl1И зтой nporpaMMbI исnользуетс команда nрОlЗерКLI1 СОСТОЯНLI1Я 6L11Ta. 3тот метод nршзеРКLI1 состояни 6ита не явлетс не06ходимым, однако он вляется удобным способом Tec тирования 6ита. Код на Ассем6лере, сrенеРLl1рованный ДЛ 060Ll1X методов npOBepKLI1 состония 6L11Ta вляетс идеНТИ4НЫМ, и нет HLI1KaKLI1X nреLl1муществ IЗ LI1сnользоuаНLI1И одноrо метода, в сравнении с друrим. ЕСЛLl1 состояние 6ита perLl1CTpa TRIS ДОЛ>КНО быть LI1зменено, то мо>кет 6ыть использована вида TRISBbits.TRISB3 = 1, KOTopa в данном npLl1Mepe используется дл YCTaHoBKLI1 6ита 3 реrистра TRISB в состояние 1. Иноrда зто не06ХОДLl1МО, коrда Tpe6yeTC LI1зменить состояние только ОДНОIО БLl1та IЗ рcrистрс TRIS. Пример 5.4 \ 1* * Это пример 5.4 AnR TaKTOBO 4aCTOT 4 Mru,  * наnмсаин AnR PIC18F1220 *1 #include <p18cxxx.h> IIBKn4eHMe cneUMMKauM портов 'include <delays.h> IIBKn4eHMe BpeMeHHX заАерек 1* Установка 6мтов KOHMrypaUMM *  установка peMMa reHepaTopa HS *  ВКЛЮ4енме cTopoeBoro TaMepa * - BblKn4eHMe HM3KOBOnbTHoro nроrрамммрованмя *1 ;-, 
rnaBa 5. ITporpaMMHpoBaHHe PIC18 на языке С 159 tragma config OSC HS tagma config WDT OFF tagma config LVP OFF :::. coun te r ; fefine mSec Delay1KTCYx(1) II mSec 1 MMnnMceKYHAa -,-::d main (void) ADCON1 == Ox7F; II KOHMrypMpoBaHMe портов А м В как UMpOBX II Этм установкм MorYT M3MeHRTbcR в завмсммостм II от версмм MMKpOKoHTponnepa TRISB TRISA PORTB о; OxFF; о; II KOHMrYPMpoBaHMe PORTB на BBOA Аанных II KOHMrypMpOBaHMe PORTA на ВВОА AaHHX II CBeTOAMOA BKn. .::,lle (1) { 11 бесконе4Н UMKn nроrрамм counter = о; II мнмuмаnмзаUМR С4еТ4мка while (PORTAbits .М4 о) II пока кнопка HaaTa mSec; II OMAaHMe 1 мс counter++; if (counter 1000) II 1 сеКУНАа { PORTB++; counter = о; 5.2. Использование включаемых файлов языка С в данном nодразделе nриведены дальнешие примеры проl-рамм на языке С, KO" торые ИСnОJlЬ3УlOТ некоторые друrие BКnlO4aeMbIe сралы, входяw,ие в состав 6и6лиоте ки С18. В nодразделе 5.1 6ыл представлен ВКЛlO4аемы cpaJl delays.h, KOTOpЫ содер- жит срункu.ии отра60ТКИ временных задер>кек, поскольку временные задер>кки исnоль ЗУlOтс в 60льшинстве nporpaMM, написанных ,lJ,Jlя микроконтроллеров. В данном nод- разделе мы рассмотрим некоторые друrие nOJle3HbIe ВКЛlO4аемые срайлы, исnользуе мые,lJ,JlЯ nроrраммировани микроконтроллеров. Преобразования Как у>ке отме4алось в rлаве 4 при рассмотрении ИСnОЛЬЗ0вани языка Ассем6ле ра, данные редко 6bIBalOT изна4ально в HY>KHO срорме. BКnlO4aeMbIe сралы nре06разо BaHH (в stdlib.h) ИСnОJlЬЗУIOТС ,lJ,JlЯ выполнения nре06раЗ0вани И3 OДHO 4исленной формы в друrуlO. В та6л. 5.2 nере4ИСJlены мноrие И3 06Ы4НО используемых срункций nре06раЗ0вани, имеlOw,ихся в 6и6лиотеке, nоставлемо совместно с компилятором 
160 ITpHMeHeHHe МНКрОКОНТроnлеров PIC 18 С18 и 06ъявляемой в срале заrоловка стандартной 6и6лиотеки stdlib.h. Для исrlОl1Ь30- ваНLI1Я СРУНКЦLl1Й stdlib в nporpaMMe дол>кен nрисутствовать оператор #include <stcjlib.h>. Таблица 5.2. Часто исnользуемые срункции nре06разований stdlib.h. Функuмя atob atof atoi atol btoa itoa itol rand srand tolower toupper ultoa Орммер atob( buffer atof( buffer atoi( buffer atol( buffer ) btoa( num, buffer ) itoa( num, buffer ) itol( num, buffer ) rand() srand( seed ) tolower( letter toupper( letter ) ultoa(num, buffer ) Dриме4анме Пре06разует 4MCnO М3 CTpOKOBO OpM В буере. B03BpaaeT 6aTOBoe 4MCno СО знаком (от +127 до 128) Пре06разует 4MCno М3 CTpOKOBO OpM В 6yepe. B03BpaaeT 4MCno С nnaBae T04KO Пре06разует 4MCno М3 CTpOKOBO OpM В 6yepe. B03BpaaeT 16раЗРЯАное uenoe чмсnо СО знаком (от + 32,767 АО 32, 768) Пре06разует 4MCnO М3 CTpOKOBO OpM В 6уфере. B03BpaaeT 32разрядное uenoe 4MCnO СО знаком (от + 2 147 483 647 АО -2417 483 648) Пре06разует бат со знаком в строку СММВОЛОR, coxpaHReMY в буере Пре06разует 16раЗРЯАное uелое 4MCno СО знаком в строку CMMBonoB, сохраНRемую в 6yepe Dреобразует 32-раЗРRАное uenoe 4MCno СО знаком в строку CMMBonoB, coxpaHReMY в буере Returns а 16-bit random number ( О to 32, 767) YCTaHaBnMBaeT значенме Ha4anbHOro 4Mcna на 16 раЗРЯАное uenoe ПереКn4ает букв в opMe 6aTOBX CMMBonoB С BepXHero perMCTpa на нинм, B03BpaaeT букв HMHero perMCTpa. Dерекnчает 6уквы в OpMC бай'l'ОВЫХ CMMBOJJOl, С HMHero perMCTpa на BepXHM, B03BpaaeT 6уквы BepXHero perMcTpa. То e, 4ТО м itol, , за MCKn4eHMeM '1'01'0, 4'1'0 num ЯВnRеТСR 4McnoM 6ез знака Предnоло>ким, 4ТО нам ну>кно от06ра>кать СЛУ4аные 4исла на светодиодах порта В 4ерез каждуlO половину секунды. Проrрамма, которая BbInOl1HeT 3ТО, используs-I СРУIIКu.иlO rand(}, nоказана в примере 5.5. В данном СЛУ4ае' при rенерации случайных 4исел исnользуетс на4альное 4ИСЛО, равное 1. Пример 5.5 \ 1* * Это npMMep 5.5 AnR TaKTOBO 4астоты в 4 MrU *1 #include <p18cxxx.h> #include <delays.h> #include <stdlib.h> 1* Установка 6мтов KOHMrypaUMM *  установка peMMa reHepaTopa HS *  BblKn4eHMe cTopoeBoro TaMepa *  BKn4eHMe HM3KOBOnbTHoro nporpaMMMpOBaHMR *1 
rnaBa 5. Проrpаммнрованне PIC18 на Slзыке С 161 tpragma config OSC HS tpragma config WDT OFF fpragma config LVP OFF loid main (void) ADCON1 = Ox7F; // конфиrурирование портов А и В как uифровх // Эти установки MorYT измеНRТЬСR в зависимости // от версии микроконтроnnера TRISB = о; PORTB = о; srand(l); while (1) { // конфиrурирует PORTB на BBOA AaHHX /1 свеТОАИОА BKn. // Ha4anbHoe 4ИСnО reHepaTopa cnY4aHX 4исеn // nOBTopRTb 6есконе4НО Delay10KTCYx(50); PORTB = rand(); // ОАание 1/2 ceKYHA // от06раение cnY4aHoro 4исnа npHMep 5.6 показывает ,lJ,pyro мето,lJ, OT06pa>KeHH СЛУ4аных 4нсел, О,lJ,нако прн этом СЛУ4аные 4нсла rенернруlOТСЯ BCer,lJ,a, KOr.o,a на>ката кнопка. nоказанная про rpaMMa сраКТН4ескн ннкрементнрует С4етчнк на макснмально скоростн н reHepHpyeT СЛУ4аные 4нсла в ,lJ,напаЗ0не ме>кду О н 9. О,lJ,НО Н3 прнмененн ЭТО проrраммы мо>кет заКnlO4аться в вы60ре 4нсел AflЯ лотерен. В ,lJ,анном прнмере пре,lJ,полаrается, 4ТО к 6нту 4 порта А ПО,lJ,соедннен КНОП04НЫ переКnlO4атель. 3та проrрамме не нспользует KaKHe лн60 BКnlO4aeMble сралы, за НСKJlЮ4еннем BKJl104aeMOro срала мнкроконтроллера p18cxxxx.h. д,лнна проrраммы, reHepHpyeMo по НСХО,lJ,ному тексту, прнве,lJ,енному в этом прнмере, является HaMHoro, прн6лнзнтельно наполовнну, КОр04е, 4ем в пре,lJ,Ы,lJ,У щем прнмере. Чем MeHbwe BKJl104aeMbIX сралов н CPYHKu.H нспользуется в проrрамме, тем ЛУ4wе. Еслн нмеется каколн60 спос06 нз6е>кать НСПОЛЬЗ0вання 6н6лноте4ноrо фала, то сле,lJ,ует нм ВОСПОЛЬЗ0ваться. Прииер 5.6 /* * Это пример 5.6 *1 . '10.", linc1ude <p18cxxx.h> 1* Установка 6итов конфиrураuии - установка реима reHepaTopa HS *  ВКn4ение cTopoeBoro TaMepa * - ВКn4ение низковоnьтноrо nроrраммироваНИR 1<1 tpragma config OSC HS tpragma config WDT OFF tpragma config LVP OFF int seed; void main (void) ADCON1 = Ox7F; // конфиrурирование портов А и В как uифровх // Эти установки MorYT измеНRТЬСR в зависимости // от версии микроконтроnnера 
162 Прнмененне MHKpOKOHTpOnnepOB PIC 18 TRISB = О; TRISA = OxFF; PORTB = о; while (1) // конфиrурирование PORTB на BBOA AaHHX // кониrурирование PORTA на ВВОА AaHHX // свеТОАИОА BKn. // 6ecKoHe4H uикn nроrрамм whi1e ( PORTAbits.RA4 ( о ) // пока кнопка HaaTa seed++; if (seed == 10) seed = 1; // есnи Ha4anbHoe 4ИСnО равно 10 PORTB =: seed; Память и строковые функции Приводимая далее nporpaMMa нсnользует 4нсла в срорме строки символов для иллюстраЦИLl1 ИСnОЛЬЗ0вання ,lJ,pyro срункu.ИLl1 Н3 стандартной бибЛLl10теКLI1. Эта npo rpaMMa не LI1сnользует какой-ли60 BBO,lJ,BЫBOД  зто просто npHMep, нллюстрируюw,ий строковые CPYHKu.HH. Строка снмволов с нменем string1 содер>кнт сообщеНLI1е "The timG is 22 hours" (СеЙ4ас 22 4аса). nporpaMMa нзвлекает 4НСЛО 22 после ero нахождеl-IНЯ в строке и сохраняет ero в Я4ейке nаМЯТLI1 hour. В npLl1Mepe 5.7 строка символов npocMaT ривается на предмет нахождени nepBoro вхождення u.HcppbI 4нсла. После 3Toro 4ИСЛО, заКnlO4енное в символьной строке, нзвлекается Н3 нее с НСnОЛЬЗ0ваннем срункции atob, которая nреобразует 4НСЛО, заданное в срорме CTpOKLI1 снмволов, в данные, размером в 6айт НЛLl1 снмвол. Пример 5.7 1* * Это npMMep 5.7 *1 #inc1ude <p18cxxx.h> #inc1ude <string.h> #include <stdlib.h> ') /* Установка 6мтов конфиrураuии *  установка реима reHepaTopa HS * - BKn4eHMe cTopoeBoro TaMepa *  BKn4eHMe низковоnьтноrо nроrраммироваНИR */ #pragma config OSC HS #pragma config WDT OFF #pragma config LVP OFF char buffer[J = "The time is 22 hours."; char hour; int а; 
rnaBa 5. Проrpаммнрованне PIC18 на Slзыке С 163 -.raid main (void) for (а = О; а < strlen(buffer); а++) lf (b1.:ffer[a] >= 'О' && buffer[a] <= '9') break; hour = atob (buffer + а); 3тот npL/1Mep нсnользует CPYHKu.HIO strlen ДJlЯ определення ДJ1ННЫ CTpOKL/1, а так>ке ЦИKJl for с onepaTopaMH if н break ДJlЯ орrаннзаu.нн сканнровання СL/1МВОЛЬНОЙ CTpOKL/1 с цеnыо ПОL/1ска снмвола u.HcppbI. KorAa отра6атывается оператор break (ЗавершеНL/1е), переменна а СО,lJ,ер>кнт OTHocHTenbHYIO познu.НIO 4нсленноrо снмвола в MaCCL/1Be. ФУНК ЦИ atob затем пре06разует 4НСЛО Н3 строковой срормы в срорму u.enoro 4L/1CJla L/1 coxpa няет ero в переменной hour. Строковые CPYHKu.HH совместно с прнмераМL/1 L/1X L/1CnOnb30 вaHL/1 пере4ислены в та6л. 5.3. Строковые CPYHKu.HH располо>кены в срайле string.h, KO торый дол>кен 6ыть BKJl104eH в проrрамму, еслн в ней НСПОЛЬ3УIOтся строковые CPYHKu.L/1L/1. Имеется MHoro строковых срункu.нй, которые 06еспе4L/1ваlOТ решеНL/1е для мноrих при ложеНL/1Й, предназна4енных ДЛ ра60ТЫ со строкамн. Некоторые L/13 HL/1X ВКЛЮ4ены в стандарт языка С (ANSI), а некоторые ЯВЛЯlOтся уннкаЛЬНЫМL/1 ДJlЯ МL/1кроконтроллеров PIC. Не06хо,lJ,НМОСТЬ наЛН4НЯ спецнanьных срункцнй ДJlЯ мнкроконтроллеров PIC BЫTe кает Н3 наЛL/14НЯ в ннх памятн проrрамм, 4ТО 06Ы4НО не характерно для 60ЛЬШL/1нства KOMnblOTepHbIx снстем. Для НЛЛlOстрацнн строковых коман,lJ" nредполо>кнм, что КОЛL/14ество СL/1МВОЛЬНЫХ строк сохраняется в памятн проrрамм. Память проrрамм является постоянно, позтому она L/1спользуется ДJl хранення стаТН4НЫХ проrраммных данных. Дл сохранеНL/1Я дaH ных в памятн проrрамм, в проrрамме НСПОЛЬ3УIOтся ,lJ,нректнвы rom н near L/1ЛL/1 far. AL/1- реКТL/1ва rom ннсрормнрует компнлятор о том, 4ТО он ,lJ,ол>кен размещать данные в пам- ти проrрамм, а днректнвы near илн far определяlOТ ДJlHHY а,о,реса. А,о,рес МО,lJ,еЛL/1 паМТL/1 near вляется 16разрядным а,lJ,ресом, в то время, как адрес моделн памятн far  зто 21  разрядный адрес. Еслн мнкроконтроллер нмеет менее, 4ем 64К паМЯТL/1 проrрамм, L/1C- пользуйте модель памятн near; еслн >ке он нмеет 60лее, 4ем 64К паМЯТL/1 проrрамм, HC пользуйте МО,lJ,ель памятн far. npHMep 5.8 ,lJ,емонстрнрует, как сле,lJ,ует сохранять несколько снмвольных строк в масснве, располо>кенном в памятн проrрамм. Данная проrрамма так>ке резеРВL/1рует 20 с байтов в памятн данных с тем, 4т06ы строка снмволов Н3 памятн проrрамм моrла KOnL/1 роваться в память данных AflЯ маннпуляu.нй elO в nporpaMMe. В ,lJ,анном СЛУ4ае L/1СnОЛЬ зуется срункu.ня strcPypgm2ram (КОПL/1роваНL/1е строкн Н3 памтн проrрамм в ОЗУ) дЛЯ копнровання BTOpO строкн (элемент 1) в 6усрерное пространство ОЗУ. ЕСЛL/1 просмот- реть COAep>KL/1MOe памятн проrрамм н памятн ,lJ,анных в IDЕ после выnолнеНL/1 этой ко- роткой проrраммы, то 6усрерная 06ласть 6удет СО,lJ,ер>кать вторую СНМВОЛЬНУIO строку. Таблица 5.3. Строковые CPYHKu.HH, ПРНСУТСТВУIOw,L/1е в string.h Ф ун кция memchr Пример memchr (area51, 'а' ,23) mеmсmр mcmcmppgm mеmсmр (areal, area2, 4) memcmppgm (area3, area4, 2) П р имечание Просматривает первые 23 байта area51 на вхожде- ние 'а' Просматривает первые 5 байтов area 1 на вхождение 65 (если обнаружен, возвращается указатель на этот символ, если нет, то возвращается ноль) Сравнивает area 1 с area2 для 4 байтов Сравнивает area3 в памяти проrpамм с area4 в памя- ти проrpамм для 2 байтов memchrpgm memchrpgm (areal, 65, 5) 
164 Прнмененне MHKpOKOHTpOnnepOB РУС 18 ФУНКЦИЯ memcmppgm2ram memcmpram2pgm П р име р memcmppgm2ram (а1, а2, 5) mel11cl11pram2pgm (а3, а4, 6 ) тетсру mеmсру (а1, а2, 4)" memcpypgm memcpypgm (а3, а4, 5) memcpypgm2ram memcpypgm2ram (а5, а6, 7) memcpyram2 pgm memcpyram2pgm (а7, а8, 2) шеmшоvе l11еl11l110уе (а 1, а2 , 3) mешmоvерgш mешшоvерgm (а3, а4, 3) mеш l11еl111110vерgm2rаш (d, е, 3) mоvерgш2rаm шеm- шешшоvеrаш2рgш (f, g, 45) mоvеrаш2рgш strcat strcat (str 1, str2) strсаtрgш strсаtpgш (str3, str4) strсаtрgш2rаm strcatp gmram (str5, str6) strсаtrаm2рgш strcatpgmram (str3, str4) strchr strchr (str1, 'а') strсhrрgш strchrpgm (str2, 'О') strcmp strcmp (str1, str2) strcmppgm strcmppgm (str3, str4) strсmррgm2rаш strcmppgmram (str5, str6) strсmрrаm2рgш strcmprampgl11 (str3, str4) strcpy strcpy (str 1, str2) strcpypgm strcpypgl11 (str3, str4) strpypgm2ram strcpypgm2ral11 (str5, str6) strсруrаш2 pgm strcpyram2pgm (str3, str4) strcspn strcspn (str1, str2) strсsрпрgш strcspnpgm (str3, str4) strсsрпрgmrаш strcspnpgl11ral11 (str5, str6) strcspnrampgm strcspnrampgm (str3, str4) strlen strlen (str 1) strlenpgm strlenpgm (str2) strlwr strlwr (strl) strlwrpgm strlwrpgm (str2) strncat stmcat (strl, str2, 3) strпсаtрgш stmcatpgm (str3, str4, 2) strncatpgm2 rаш stmcatpgm2ram (str5, str6, 1) strncatram2 p m stmcatram2 pg m ( str3, str4, 2 ) П р имечание Сравнивает аl с а2 в памяти проrрамм на 5 байтах Сравнивает а3 в памяти ПрОlрамм с а4 на 6 байтах (возврат <О, если первое меньше BTopor'o, возврат ====0, если строки равны, возврат>О, еСJ/И первая строка больше второй) Копирует а2 в а 1 для 4 байт Копирует память проrpамм а4 в память проrpамм а3 для 5 байтов Копирует память проrpамм а6 в памЯ1Ъ проrpамм а5 для 7 байтов Копирует а8 в память проrpамм а7 для 2 байтов То же, что и шеI11СРУ, за исключением TOI'O, что разрешены перекрываlOщиеся области Добавляет str 1 к str2 Добавляет str3 в памяти проrpамм к str4 Добавляет str5 к строке str6 в памяти проrpамм То же, что и strcatpgm Находит первое вхождение буквы а в strl Находит первое вхождение нуля в str2 Сравнивает str} со str2 Сравнивает str3 в памяти проrpамм со str4 в памяти проrрамм Сравнивает str5 с str6 в памяти проrpамм Сравнивает str3 в памяти проrрамм со str4 (возврат >0, если первая c'rpoKa меньше второй, возврат ====0, если строки равны, возврат<О, если первая строка больше второй) Копирует str2 в str 1 Копирует str4 в памяти проrpамм в str3 Копирует str6 в позицию памяти проrpамм str5 То же, что и strcpypgm Просматривает str1 на вхождение str2; возвращает- ся количество совпадений Просматривает str3 в памяти проrpамм на вхожде ние str4 из памяти проrpамм Просматривает str5 в памяти проrpамм на вхожде ние str6 Просматривает str3 на вхождение str4 из IIамяти проrpамм Возвращает д1ину str} Возвращает длину str2 в памяти проrрамм Преобразует символы BepxHero реrистра str 1 в символы нижнеrо реrистра Преобразует символы BepxHero реrистра str2 в памяти проrpамм в символы нижнеrо реrистра Добавляет str} к str2 для 3 символов Добавляет str3 в памяти проrpамм к str4 для 2 сим- волов Добавляет str5 к строке str6 в памяти проrpамм для } символа То же, что и strcatpgm 
rnaBa 5. Проrpаммнрованне PIC18 на Slзыке С 165 Ф ун кция П р име р strnсmр stmcmp (strl, str2, 2) strncmppgm stmcmppgm (str3, str4, 4) strncmppgm2ram stmсmррgmrаш (str5, str6, 3) strncmpram2pgm stmcmprampgm (str3, str4, 1) strnсру stmcpy (strl, str2) strncpypgm stmcpypgm (str3, str4) stmpypgm2ram stmсрурgш2rаш (str5, str6) strncpyra m2 pgm stmсруrаm2рgш (str3, str4) strpbrk strpbrk (strl, str2) strpbrkpgm strpЬrkрgш (str3, str4) strpbrkpgmram strpЬrkpgmrаш (str5, str6) strpbrkrampgm strpbrkrampgm (str3, str4) Strrchr stпсhr (str, 'О') stnрп strspn (strl, str2) stnpnpgm strsрпрgш (str3, str4) stnpnpgmram strsрпрgшrаш (str5, str6) stnpnrampgm strsрnrашрgш (str7, str8) stntr strstr (str 1, str2) stntrpgm strstrpgm (str3, str4) stntrpgmram strstrpgшrаm (str5, str6) stntrrampgm strstпаmрgш (str7, str8) strtok strtok (strl, str2) strtokpgm strtokpgm (str3, str4) strtokpgmram strtokpgmram (str5, str6) strtokrampgm strtokrampgm (str3, str4) strupr strupr (strl) struprpgm strupr (str2) Примечание Сравнивает strl со str2 для 2 символов Сравнивает str3 в памяти проrpамм со str4 в памя ти проrpамм для 4 символов Сравнивает str5 в памяти проrpамм со str6 для 3 символов Сравновает str3 в памяти проrpамм со str4 для 1 символа (возврат >0, если первая строка меньше второй, возврат ===0, если строки равны, возврат<О, если первая строка больше второй) Копирует str2 в str 1 Копирует str4 в памяти проrрамм в str3 Копирует str6 в область памяти проrpамм str5 То же, что и strcpypgl11 Просматривает str 1 на вхождение символов из slr2 Про сматривает str 1 в памяти проrpамм на вхожде ние символов из str2 в памяти проrpамм SПросматривает str5 в памяти проrpамм на вхож- дение символов из str6 Просматривает str3 на вхождение символов из str4 в памяти проrpамм. Возвращает указатель на последнее вхождение О Возвращает количество последовательных вхожде ний в strl символов из str2 Возвращает количество последовательных вхожде- ний в str3 в памяти ПрОJ']Jамм символов из str4 в памяти проrpамм Возвращает количество последовательных вхожде ний символов из str6 в str5 памяти проrpамм Возвращает количество последовательных вхожде- ний символов из str8 памяти проrpамм в str7 Определяет первое вхождение str2 в strl Определяет первое вхождение в str3 памяти про- rpaMM str4 из памяти проrpамм Определяет первое вхождение в str5 памяти про rpaMM str6 Определяет первое вхождение в str7 памяти про rpaMM str8 (если вхождение найдено, возвращается .;, указатель на Hero, в противном случае возвращает ся ноль) Вставляет ноль в strl на место знаков, специфици- рованных str2 Вставляет ноль в str3 из памяти проrpамм на место знаков, специфицированных в str4 Вставляет ноль в str5 из памяти проrpамм на место знаков, специфицированных в str6 То же, что и strtokpgm (возвращает нулевой указа- тель, если ничеrо не найдено) Преобразует символы нижнеrо реrистра из strl в символы BepxHero реrистра Преобразует символы нижнеrо реrистра из str 1 в символы BepxHero реrистра для str2 из памяти I!pO rpaMM 
.1'66 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Пример 5.8 1* * Это npMMep 5.8 *1 #include <p18cxxx.h> #include <string.h> 1* Установка 6мтов конмrураuми *  установка реима reHepaTopa HS *  BKn4eHMe cTopoeBoro TaMepa * --- BKn4eHMe HM3KOBOnbTHoro проrраммироваНМR *1 #pragma config ose HS #pragma config WDT OFF #pragma config LVP OFF II program memory data rom near char 100kUpTable[] [20] "my first message", "my second message", "my third message", "my fourth message", "my fifth message" } ; II AaHHe в naMRTM AaHHX char buffer[20]; II rnaBHaR nроrрамма void main (void) strcpypgm2ram (buffer, 100kUpTable[l]); npLl1Mep 5.9 демонстрнрует ew,e О,lJ,НН прнмер осуw,ествлення ,lJ,осryпа к паМЯТLI1 проrрамм. В зтот раз ,lJ,осryп к паМЯТLI1 проrрамм осуw,ествляется с u.елыо ПОLl1ска 7 cerMeHTHoro кода в ПОLl1СКОВО та6ЛLl1u.е, пре,lJ,назна4енноrо дЛЯ ВЫВО,lJ, на 7 сеrментный свето,lJ,НО,lJ,НЫЙ LI1H,lJ,LI1KaTop. д.nя ,lJ,осryпа к ПОНСКОВОЙ та6ЛLl1u.е LI1спользует- ся соответствуюw,ая срункu.ня. Функu.LI1Я с LI1MeHeM Get7Seg прео6разует ВСО (АКД) - 4L11СЛО в 7-сеrментный КО,lJ, только Tor.цa, KorAa зто 4L11СЛО ото6ра>кает СLl1МВОЛ от О до 9. ЕСЛLl1 CPYHKu.LI1L11 передается какоелн60 LI1HOe 4L11СЛО, то возвраw,ается значеНLI1е охОО. Пример 5.9 1* * Это пример 5.9 *1 #include <p18cxxx.h> 1* Установка 6мтов конфиrураuии 
rnaBa 5. Проrpаммнрованне PIC 18 на Slзыке С 167  установка реима reHepaTopa HS  ВКn4ение cTopoeBoro TaMepa , ВКn4ение низковоnьтноrо nроrраммироваНИR tpragma config OSC HS tpragma config WDT OFF tpragma config LVP OFF ! AaHHe В nаМRТИ nporpaMM =om near char 100kUp7Seg[] = 1/ nоисковаR та6nиuа 7-сеrментнх КОАОВ Ox3f, Ох06, Ох5Ь, Ox4f, Ох66, Ox6d, Ox7d, 7, Ох7 f, Ox6f naMRTb AaHHX :::'ar data1; I function Get7Seg :har Get7Seg (char bcd) if (bcd <;:= 9) return 100kUp7Seg[bcd]; else return О; I main program i:)id main (void) data1 = Get7Seg(3); nporpaMMa по прнмеру 5.1 О нллюстрнрует НСnОЛЬЗ0ванне срункu.LI1Й уnравлеНLI1Я naMTblO нз 6н6лнотекн строковых CPYHKu.H. Так, функu.н memset LI1СПОJlьзуется ДЛЯ запнсн 4нсла Ох20 во все Я4екн 6усрера в nамятн ,lJ,анных. Прииер 5.10 * Это пример 5.10 *1 tinclude <p18cxxx.h> tinclude <string.h> * Установка 6итов конмrураuии - установка реима reHepaTopa HS ВКn4ение cTopoeBoro TaMepa BKnqeHMe низковоnьтноrо nроrраммироваНИR 
168 Прнмененне MHKpOKOHTpOnnepOB PIC 18 *1 #pragma config osc HS #pragma config WDT OFF #pragma config LVP OFF Ildata memory char buffer [20]; void main (void) { memset(buffer, Ох20, 20); в rлаве 4, nporpaMMa на языке Ассем6лера (прнмер 4. 25) нспользовалась для осуществлеНLI1Я досryпа к та6лнu.е снмволов кодов Морзе npH nOMow,H CPYHKu.HH, KOTO рая называлась SendChar. npOCMoTpHTe ew,e раз зтот прнмер н сравннте ero с верСLl1ей это проrраммы на языке С, nрнведенной в прнмере 5.11. Здесь, как LI1 в rлаве 4, память nporpaMM нспользуется с u.елью хранення структур кодов Морзе для упомянутой CPYIIK- u.HH. nporpaMMa тестнровання CPYHKu.HH SendChar передает 6уквы от а до z 4ерез 6нт О порта В,  Т04НО так >ке, как в npHMepe 4.25. nрнведенная версня зтой проrраммы на языке С HaMHoro 60лее 4нта6ельна н леr4е поннмается, 4ем ее версня на языке Ас- сем6лера. Е,о,ннственное, 4ТО еще мо>кно д06авнть в зry nporpaMMY - так зто ew,e ОДНУ понсковую та6лнu.у для хранення кодов Морзе снмволов nYHKTyau.LI1H. Самая ЛУ4шая проверка ра60ТЫ зтой nporpaMMbI, коне4НО >ке, связана с НСnОЛЬЗ0ваннем осu.нллоrра сра для на6ЛlOдення выходных СLl1rналов для 6нта О порта В. Пример 5.11 /* * Это пример 5.11 AnR TaKTOBO 4астоты в 4 MrU */ #include <p18cxxx.h> #include <delays.h> /* Установка 6итов кониrураuии *  установка реима reHepaTopa HS *  ВКn4ение cTopoeBoro TaMepa *  ВКn4ение низковоnьтноrо nроrраммироваНИR *1 #pragma config OSC HS #pragma config WDT OFF #pragma config LVP OFF ) // nоискове та6nиu в nаМRТИ nporpaMM rom near char Morse_L[] Ох42, Ох84, Оха4, Ох83, ОхО 1, Ох24, Охс3, ОхО4, Ох02, Ох74, Оха3, Ох44, Охс2, Ох80, ОхеЗ, Ох64, Oxd4, Ох43, ОхО 3, Ох81, Ох23, Ох14, Ох6З, Ох94, ОхЬ4, Охс4 } ; 
rnaBa 5. Проrpаммнрованне PIC 18 на Slзыке С 169 om near char MorseN[] Oxfd, Ox7d, ОхЗd, Ox1d, OxOd, Ох05, Ох85, Охс5, Охе5, Oxf5 } ; functions ;id sendDitDah (char pattern) int а; int count pattern & 7; for (а = О; а < count & 7; а ++) { PORTB 1; if ((pattern & Ох80)) Delay1KTCYx (72); else Delay1KTCYx (24); PORTB = О; Delay1KTCYx (24); тоqки pattern «= 1; } Delay1KTCYx (48); реАаqи Т04КИ i void sendChar' (char sendData) { /1 nepeAaqa симвоnа в КОАе Морзе I / Kn4 BKn. // KOHTponb СОСТОRНИR 6ита // тире // Т04ка // Kn4 BKn 1/ ОИАание в те4ении nерИОАа nереАа4И // nOnY4eHMe cneAyero 6ита / / ОИАание в те4ении АВУХ nеРИОАОВ ne.. if (sendData >= 'а' && sendData <= 'z') sendData = Ох20; // nepeBoA в симвоn if (sendData == , ') // есnи nр06ел Delay1KTCYx (96); // ОАание 96 мс else if (sendData >= 'А' && sendData <= 'Z') sendDitDah (Morse_L [sendData  Ох41]); else if (sendData >= 'о' && sendData <= '9') sendDitDah (MorseN [sendData  Ох30]); } II rnaBHaR nроrрамма AnR тестироваНИR функuии sendChar void main (void) BepxHero реrистра . ! int а; ADCON1 = Ox7F; // конфиrурирование портов А и В как uировх // ЭТИ установки MorYT измеНRТЬСR в зависимости // от версии микроконтроnлера TRISB = Охоо; // кониrурирование порта В как BxoAHoro for (а = О; а < 26; а++) sendChar('a' + а); // тестирование sendChar 
170 ITpHMeHeHHe МНКрОКОНТролnеров PIC 18 АВО 1"'"'   r""     L...-..   ..... 2900000.0 I 2910000. О I 2920000.0 Рис. 5.4. CHL/1MOK зкрана лоrН4ескоrо анаnнзатора для кода Морзе, передаваемоrо проrраммой L/1З npL/1Mepa 5.11 PL/1c. 5.4 AeMOHCTpL/1pyeT nporpaMMY Н3 прнмера 5.11 в ,lJ,еЙСТВL/1L/1. В данном СЛУ4ае лоrL/14еСКL/1Й анаЛL/1затор нспользуется для демонстраЦИL/1 выходных данных на штырьке АВО. На этом pL/1cYHKe показана переда4а кодов Морзе СL/1МВОЛОВ, на4L/1ная с 6уквы В. Поскольку проrрамма передает СL/1МIЗОЛЫ в алсраlЗL/1ТНОМ порядке, после В следует С L/1 так далее. Список кодов Морзе CMOTpL/1Te в та6л. 4. 2. ШL/1рОКИЙ ВЫСОКL/1Й импульс соот- ветствует TL/1pe, а узкий uысоки L/1МnУЛЬС  точке. ЕдL/1нспзенным спос060М nОЛУ4еНL/1 3Toro CHL/1MKa зкрана 6ыла замена CPYHKu.L/1H временной задерЖКL/1 Delay1 КТСУх на Delay10KTCYx, - зто 6ыло необходимо только ЩlЯ Toro, 4т06ы выходной СL/1rнал от06ра>кanся на 3КрШlе анаЛL/1затора. ФL/1рма Microchip в BepCL/1L/1 IDЕ 7.11 не реаЛL/1З0вала cnoc06 MOAL/1cpL/1Kau.L/1L/1 4астоты выборки лоrическоrо анаЛL/1затора. Остается надеятьс, 4ТО зтот недостаток будет устранен в будуw,их Bep CL/1X IDЕ. 5.3. Примеры nporpaMM на языке С Теперь, после Toro, как БЫЛL/1 L/1зло>кены ВLЗодные сведеНL/1Я языка С для семейс'ruа PIC18, IЗ данном nодраздеnе рассмаТРL/1ваlOТСЯ ПРL/1меры некоторых простых проrрамм, которые L/1ЛЛЮСТрL/1рУIOТ ДОnОЛНL/1тельные B03MO>KHOCTL/1 nроrраММL/1роваНL/1Я ML/1KpOKOII тролле ров PIC на языке С. Как у>ке отме4ШIOСЬ, С ДЛ PIC в основном вляетс таким >ке, как язык С для ЛlOбой нной CL/1CTeMbI, хотя некоторые БL/1БлиотеКL/1 6ЫЛL/1 расширены с u.елыо ВKJlI04еНL/1Я функu.L/1Й, ра60таЮЩL/1Х с nространстlЗОМ памяти PIC. Пример первый Этот первый прнмер проrраммы (npHMep 5.12) ,lJ,eMOHCTpL/1pyeT переработанный npL/1Mep проrраммы на 3ЫKe Ассем6лера L/13 rлавы 4, который OpL/1eHTL/1pOBaH на р'а60ТУ с клаUL/1атурой nКСТL/1Л. 3тот новый ПРL/1мер возвраw,ает ASCIIKOAL/1pOBaHHbIe СL/1МВОЛЫ дЛЯ 60ЛЬШL/1нства кnaBL/1W клавиатуры. Работа с клаВL/1шаМL/1 Ctrl L/1 Alt не реаЛL/1ЗОВalta, 
rnaBa 5. ITporpaMMHpoBaHHe PIC18 на языке С 171 однако на>катие кnавиши Shift OTpa6aTЫBaeTC. Аве та6лицы в памяти IlpOrpaMM LI1C- ПОЛЬЗУlOтс ДJl 06есnе4ени возврата ASCIIKoAOB как ДJl ввода с клавиатуры 6ез Ha жати кnавиши Shift, так и ДJl ввода с на>катием кnавиши Shift. Функция getChar реЭJlLI1 3Ована с использованием рекурсии ДJl nОЛУ4ени дополнительных символов с клаВLI1а туры. При реализации отра60ТКИ на>кати клавнши Ctrl д06авлIOТС доnолнитеш>ные та6лнцы ДJl Ctrl = О Ь Ctrl = 1. Коды ДJl Ha>KaTO кnавиши Ctrl 06Ы4НО onpeAel1IOTc в диапазоне от ОхОО до Ох 1 А ДJl кnавиш от А до Z. Таблица 5.4. Коды специальных функциональных клаВLI1Ш Клавиша  K  Клавиша Код Клавиша Код F9 Ох80 Левая Alt Ох8В 8 на цифровой Ох96 клавиатуре F5 Ох8\ Левая Ctrl Ох8С Num 140ck Ох97 f3 Ох82 Caps Lock Ох8О Fll Ох98 Н Ох83 1 на цифровой Ох8Е + на цифровой Ох99 клавиатуре клавиатуре F2 Ох84 4 Ila цифровой Ox8F + на цифровой Ох99 клавиатуре клавиатуре Н2 Ох85 7 на цифровой Ох90 3 на цифровой Ох9А клавиатуре клавиатуре НО Ох86 О на цифровой Ох91  на цифровой Ох9В клавиатуре клавиатуре F8 Ох87 . на цифровой Ох92 * на цифровой Ох9С клавиатуре клавиатуре F6 Ох88 2 на цифровой Ох93 9 на цифровой Ох9О клавиатуре клавиатуре .'4 Ох89 5 на цифровой Ох94 Scroll Lock Ох9Е клавиатуре ТаЬ Ох8А 6 на цифровой Ох95 F7 Ox9F клавиатуре ASCIIKoA, возвращаемы функu.ие getChar, пре,lJ,ставлет c060 CTaHдapTHЫ ASCIIKO,lJ, ДJl всех KJlавиw, за ИСКnlO4ением сnеu.нальных KJlавиш,  таких как page up (страница вверх), page down (страница вниз) н так далее. Специальные кnавиши relle РИРУlOт коды, как зто nоказано в та6л. 5.4. 06ратите внимание на то, 4ТО двухраЗРДllьiё коды не реализованы в данном примере, однако они MOryт 6ыть д06авлены в реЗУJlьта те модификации nporpaMMbI и ,lJ,06авленн та6лицы. Пример 5.12 1* * Это rrpMMep 5.12 *1 #include <p18cxxx.h> 1* Установка 6мтов KOHMrypaUMM *  установка peMMa reHepaTopa HS *  BKnqeHMe cTopoeBoro таймера * - BKnqeHMe HM3KoBonbTHoro rrроrрамммроваНМR *1 #pragma config OSC HS #pragma config WDT OFF 
172 ITpHMeHeHHe MHKpoKoHTponnepoB PIC 18 #pragma config LVP = OFF II AaHHe в rraMRTM rrporpaMM II rroMCKoBaR Ta6nMua AnR 6укв BepxHero perMCTpa rom near char upperCaseTable[] = ОхОО, Ох80, ОхОО, Ох81, Ох82, Ох83, Ох84, Ох85, ОхОО, Ох86, Ох87, Ох8 8, Ох89, Ох8А, Ох7Е, ОхОО, ОхОО, Ох8В, ОхОО, ОхОО, Ох8С, Ох51, Ох21, ОхОО, ОхОО, ОхОО, Ох5А, Ох53, Ох45, Ох57, Ох4 О, ОхОО, ОхОО, Ох4 3, Ох58, Ох44, Ох4 5, Ох24, Ох23, ОхОО, ОхОО, Ох20, Ох56, Ох46, Ох54, Ох52, Ох25, ОхОО, ОхОО, Ох4Е, Ох42, Ох48, Ох47, Ох59, Ох5Е, ОхОО, ОхОО, ОхОО, Ох4D, Ох4А, Ох55, Ох2 6, Ох2А, ОхОО, ОхОО, Ох3С, Ох4В, Ох4 9, Ox4F, Ох2 9, Ох28, ОхО О, Ох4Е, Ох3 F, Ох4С, Ох3А, ОхОО, Ох50, Ox5F, ОхОО, ОхОО, ОхОО, Ох22, ОхОО, Ох7В, Ох2В, ОхОО, ОхОО, Ох8D, ОхОО, ОхОD, Ох7D, ОхОО, Ох7С, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, Ох08, ОхОО, ОхОО, Ох8Е, ОхОО, Ox8F, Ох90, ОхОО, ОхОО, ОхОО, Ох91, Ох92, Ох93, Ох94, Ох95, Ох96, Ох1В, Ох97, Ох98, Ох99, Ох9А, Ох9В, Ох9С, Ох9D, Ох9Е, ОхО О, ОхОО, ОхОО, ОхОО, Ox9F, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, ОхО О, ОхОО, ОхОО, ОхОО } ; II rrOMCKOBaR Ta6nMua AnR 6укв HMHero perMcTpa rom near char 10werCaseTable[) = ОхОО, Ох80, ОхОО, Ох81, Ох82, Ох83, Ох84, Ох85, ОхОО, Ох86, Ох87, Ох88, Ох8 9, Ох8А, Ох60, ОхОО, ОхОО, Ох8В, ОхОО, ОхОО, Ох8С, Ох71, Ох31, ОхОО, ОхОО, ОхОО, Ох7А, Ох73, Ох61, Ох77, Ох32, ОхОО, ОхОО, Ох63, Ох7 8, Ох64, Ох65, Ох34, Ох33, ОхОО, ОхОО, Ох20, Ох76, Ох66, Ох74, Ох7 3, Ох35, ОхОО, ОхОО, Ох6Е, Ох62, Ох68, Ох67, Ох79, Ох3 6, ОхОО, ОхОО, ОхОО, Ох6D, Ох6А, Ох7 5, О хЗ7 , Ох38, ОхОО, ОхОО, Ох2С, Ох6В, Ох6 9, Ox6F, ОхЗО, Ох39, ОхОО, Ох2Е, Ox2F, Ох6С, Ох3В, ОхОО, Ох60, Ох2D, ОхОО, ОхОО, ОхОО, Ох27, ОхОО, Ох5В, Ох3D, ОхОО, охОО, Ох8D, ОхОО, ОхОD, Ох5D, ОхО О, Ох5С, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, Ох08, ОхОО, ОхОО, Ох8Е, ОхОО, Ох8 F, Ох90, ОхОО, ОхОО, ОхО О, Ох91, Ох92, Ох93, Ох94, Ох95, Ох96, Ох1В, Ох97, Ох98, Ох99, Ох9А, Ох9В, Ох9С, Ох9О, Ох9Е, ОхОО, ОхОО, ОхОО, ОхОО, Ox9F, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО, ОхОО } ; II AaHHe в rraMRTM AaHHX int shift О; II YHKUMM 
rnaBa 5. ITporpaMMHpoBaHHe PIC18 на языке С 173 OMAaHMe OAHoro rrOnHoro UMKna мзменеНМR CMrHana на тактовом ВХОАе возврат, KorAa тактовый MMrrYnbC rrepexoAMT в eAMHMqHOe COCToRHMe .ld Wait4Clock (void) while (PORTAbits.RA1 while (PORTAnits.RA1 1) ; О) ; II while clock II while c10ck 1 О int readChar (void) { int parity = о; int keyData = о; int а; Wait4Clock(); if (PORTAbits.RAO == 1) keyData = Ох100; II eCnM oWM6Ka peMa else II корректный CTapTOB 6мт for (а = о; а < 8; а++) keyData »= 1; IIacceM6nMpoBaHMe .<.eyData Wai t4Clock (); keyData 1= (PORTAbits.RAO 1); parity += PORTAbits.RAO; } Wait4C10ck(); II rronyqeHMe 6мта rrapMTeTa parity Л= PORTAbits.RAO; if ((parity & 1) == О) keyData = Ох101; II eCnM oWM6Ka rrapMTeTa Wai t4Clock () ; if (PORTAbits.RAO == О) keyData = Ох100; II eCnM нет oWM6KM peMa на cTon6MTe, return keyData; t getChar (void) int step = О; int scanCode = readChar(); while (step == О && scanCode < Ох100) { switch (scanCode) { case Ох12: case Ох59: II cABMr shift = 1; scanCode readChar(); break; case OxFO: II OCB060AeHMe scanCode readChar(); switch (scanCode) 
174 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 case Ох12: case OxS9: 11 CABMr shift о; break; } scanCode break; readChar(); } default: { step 1; break; } if (step = 1 && scanCode < Ох100) { if (shift) scanCode upperCaseTable [scanCode]; else scanCode 10werCaseTable [scanCode); } return scanCode; 3та функци С4итывает клавиатуру и возвраw,ает АSСII-символ, однако она Tpe бует большоrо расхода времени МLI1кроконтроллера. Дл Toro, 4тобы снизить зтот pac ход, ЛУ4ше Bcero переделать nporpaMMY так, 4тобы она работала в ре>киме nрерываНLI1Й. 3та MeTOALl1Ka будет обсуждатьс в rлаве 8. Пример второй Существует система уnравлени моделми >келезно дороrи, которая назьiвается ОСС (управление при nомоw,и цифровых команд). CLI1CTeMa ОСС посылает цифровые сиrналы 4ерез рельсы модели, которые уnравлIOТ злектромоторами и друrИМLI1 компо- нентами модели >келезно дороrи. Одна из функци контроллера в зтом СЛУ4ае заклlO 4aeTC в активировании дополнительных устройств модеЛLl1 с использованием npo rраммируемых адресов. Адрес nосылаетс и nринимаетс МLI1кроконтроллерно систе MO, которая аКТИI3L11рует УСТРОСТ130. Схема, исnользуема ДJl извле4ени цепочки последовательных СLl1rналов, идуw,их 4ерез модель, nоказана на pLl1c. 5.5. В 3TO схеме LI1спользуетс 0llТИ4еска развзка ДJl LI1ЗОЛЦИИ системы от наllрl>кеIlLl1Я на p8JH.>cax модели, а так>ке rенерации ПЛ-совместимоrо сиrнала дл МLI1кроконтроллера. Полр- ность nОДКЛlO4ени к рельсам не имеет зна4ени, поскольку сиrнал на рельсах  зто сиrнал nepeMeHHoro тока, а информаци nepeAaeTc 4ерез ШИрLl1НУ LI1МIlУЛЬСОI3, переда- ваемых по рельсам. .;:":1 . C-:'t,....., "'-.';' :1'..".... 
rnaBa 5. ITporpaMMHpoBaHHe PIC 18 на языке С 175 vcc R1 1К R2 R pe..lЪCЫ 1$01 8 з i 7 6 к биту О lIорта В 6N 1 37 Рис. 5.5. Аетектирование сиrнала ОСС nepeAaBaeMbI 4ерез рельсы сиrнал относитс к сиrналам nepeMeHHoro тока. Ero амплитуда изменетс в пределах :t14 В. 3тот сиrнал несет ЦLl1сррОВУIO инсрормациlO CМ. рис. 5.6). Бит данных, состоние KOToporo соответствует лоrИ4еско еДLl1НLI1це, ne peдaeTC сиrнаJ10М, ДJlительность KOToporo ле>кит в пределах 54.. .64 мкс. Бит данных, состоние KOToporo соответствует лоrИ4ескому нулlO, соответствует импульсам ДJ1Ll1 тельностыо 90...10000 мкс. V1нсрормационны naKeT, nepeAaBaeMbI на YCTpOCTBa, co аер>кит 3 бата. При зтом заrоловок naKeTa nредставлет собо последовательность -з 12 еДИНИ4НЫХ битов, за которыми следует нулево CTapTOBЫ бит адреса. nepBbI байт naKeTa содер>кит nеРВИ4НЫ адрес в диапазоне от Ох80 (128) до OxBF (191). BTOpO байт содер>кит ew,e три бита адреса, бит контрол данных и ВТОРИ4НЫ Збитны адрес. Трети и nоследни бат naKeTa содер>кит контрольнуlO сумму naKeTa, nОЛУ4еннуlO по npинциnу ИСКnlO4ительноrо V1ЛV1. 3тот naKeT данных типа 1 ИЛЛlOстрируетс на рис. 5.6. Биты адресы указываlOТС посредством исnользовани cTaHAapTHoro соrлашени OT ., носительно nрименени доnолнени до единицы трех старших битов адреса. В примере 5.13 nоказана nporpaMMa, KOTopa декодирует все БLl1ТЫ IlaKe1a и BЫ noлнет проверку на nравильность контрольно суммы. 3та nporpaMMa не задает aд рее, а так>ке не выnолнет иные функции, оБЫ4НО характерные ДJl ТLI1nИ4ноrо контрол- .аера YCTPOCTB, она так>ке не уnравлет устроствами. Перед тем, как мы смо>кем зто сделать, нам необходимо рассмотреть некоторые аппаратные схемы. 
176 ITpHMeHeHHe MHкpOKOHTpOnnepOB PIC 18 ( нули А '\ +14V ov 14V '- у едиющы ) (а) 1111111111 О 1 ОАsАзА2АIАо о 1 А 8 А 7 А 6Сааа О ХХХ:ХХХХХ 1  зarОЛОВОК ААААААААА = 9-биПlЫЙ первичный адрес С = контрольный бит ааа = адрес устройства ХХХХХ:ХХХ = контрольная сумма, полученная по принципу исключительноro ИЛИ (ь) NМRA type 1 accessory packet Рис. 5.6. (а) Сиrнал на рельсах в системе ОСС и (Ь) информационный пакет типа 1 Пример 5.13 1* * Это rrpMMep 5.13 AnR TaKTOBO qaCTOT в 4 MrU *1 #include <p18cxxx.h> #include <delays.h> 1* Установка 6мтов KOHMrypaUMM *  установка режима reHepaTopa HS *  BKnqeHMe cTopoeBoro TaMepa *  BKnqeHMe нмзковоnьтноrо rrроrрамммроваНИR *1 /" 
rлава 5. ITporpaMMHpoBaHHe PIC 18 на языке С 177 ragma config OSC HS ragma config WDT OFF Lagma conflg LVP OFF Аанные в памяти nporpaMM :;t count; :;t state; :;t dataBit; :;t preambleCount; ::t firstByte; :'.t secondByte; :1t checkSum; 1 functions 70id assembleByte (int* locale, int nextState) if (preambleCount != 9) { *locale »= 1; *locale += dataBit; preambleCount++; } else preambleCount = о; state = nextState; oid stateO (void) if (dataBit == 1) { preambleCount; if (preambleCount { о && dataBit == О) state = 1; preambleCount 11 nРИНRТЬ KoppeKTH заrоnовок о; } else preambleCount++; 11 в заrоnовке 60nьше еАИНМЦ } else preambleCount 10; Ilnерезаnуск } void state1 (void) assembleByte (&firstByte, 2); if (dataBit == 1) state = о; 1I по оши6ке } void state2 (void) assembleByte (&secondByte, 3); if (dataBit == 1); state = о; 11 по ошм6ке } void state3 (void) 
178 Прнмененне MHKpOKOHTpOnnepOB PIC 18 assembleByte (&checkSum, 4); if (dataBit == О) state = о; II rro оwи6ке } void state4 (void) state  о; I1 с6рос state if ((firstByte л secondByte л checkSum) == о) { 11 CAa BCTaBnRTcR rrporpaMMa yrrpaBneHMR 1I AnR rrроrрамммроваНМR KOHTponnepa II MnM aKTMBMpoBaHMR YCTpOCTBa, nOAKn4eHHoro аАреса к ПОР'J'У В CJly(ae соответствме } typedef void (*ptr) (void); ptr states[] { II массмв указатеnе YHKUM II AnR COCTORHMR YCTpOCTBa &stateO, &state1, &state2, &state3, &state4 } ; void Update (void) if (count == О) { 1/ комаНАа с6роса смстемы state = firstByte = secondByte  checkSum  dataBit = о; preambleCount = 10; IIMMHMManbHoe зна4енме счеТ4ика 6мтов заrоnовка count = 1; } II замер WMpMHbl MMrrYnbca 1I CqeTqMK = О с6рос CMCTeM 1I CqeTqMK = 1 MnM 2 (от 28 АО 84 мкс) 3HaqeHMeM AaHHX RBnReTCR norM4eCKaR eAMHMua II CqeTqMK COAepMT 60nee 2 OTCqeTOB зна4енмем AaHHX RвnяеТСR nOrMqeCKM HOnb else { count = о; if (PORTBbits.RBO == 1) { II заnуск HOBoro С4ета whi1e (PORTBbits.RBO { 1) Delay10TCYx(2); count++; II 20 мкс } else { while (PORTBbits.RBO == О) { Dе1ау10ТСУх(2); count++; II 20 мкс 
rnaBa 5. ITporpaMMHpoBaHHe PIC18 на slзыеe С 179 } if (PORTBbits.RBO == 1) while (PORTBbits.RВO II rrporrycK сnеАущеrо rrony6MTa 1) ; else while (PORTBbits.RВO if (count == О) state = О; else if (count < 3) dataBit 1; О) ; II 6мт 1 else dataBit о; II 6мт II взов YHKUMM COCTORHMR о } states [state] () ; eAMHcTBeHHaR rnaBHaR rrроrрамма :id main (void) II с6рос CMCTe ADCON1 = Ox7F; II KOHMrypMpoBaHMe rropTOB А м В как UMpOBX II Этм установкм MorYT мзмеНRтЬСR в завмсммостм от версмм MMKpOKoHTponnepa II KOHMrYPMpoBaHMe rropTa В II HaqanbHOe COCTORHMe = О II с6рос rrроrраммы м HaqanO oMAaHMR II KoppeKTHoro заrоnовка II OCHOBHO UMКn II OMAaHMe заrоnовка м KoppeKTHoro rraKeTa TRISB 1; state о; count о; while (1) Update(); Ожидание 1 Оти полных единиц заrоловка Выделение первоrо байта пакета Выделение BToporo байта пакета Выделение байта контрольной суммы Проверка контрольной суммы и выполнение нужной функции Рис. 5.7. COCTOHH 060рудовани AfI примера 5.12 
180 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 rлавная проrрамма nредставлет собой бесконечры ЦLl1КЛ while, KOTOpЫ вызы вает функцию Update с нулевым значением счеТ4L11ка (nеременная count). ФУНКЦИ5-1 Up date распознает нулевое значеНLI1е C4eT4L11Ka LI1 04L11щает три бата пакета, а затем YCTa навливает счеТЧLl1К заrоловка на 10. Заrоловок дол>кен состоять, по краней мере, из 1 О последовательных лоrLl1чеСКLI1Х еДLl1НLI1Ц, однако КОЛLl14ество еДLl1НLI1Ц мо>кет быть HaMHoro БОl1l)ШИМ. Функция Update затем вызывает функцию, 4ей адрес хршштся в массивс с LI1MeHeM states (СОСТОНLI1Я). Поскольку начальное СОСТОЯНLI1е являеТС5-1 нулевым, вызыва е TC5-1 фУНКЦLl1Я stateO, которая ОТСЧLl1тывает по крайне 1 О лоrLl14еСКLI1Х еДLl1НLI1Ц во входных данных. При этом первичном LI1НLI1ЦLl1аЛLl1ЗLl1РУIOw,ем ВЫЗ0ве СРУНКЦLl1L11 ничеrо не счи rаеrся LI1 orpa6aTbIBaeTc возврат в rлавную проrрамму, в которой счеТ4L11К с6расываеlСЯ rlОсле 06раw,ения к фУНКЦLl1И Update. Затем выполняется замер ШLl1рИНЫ BxoAHoro импульса в функции Update. ECl1L11 BXOДHO бит HaXOALl1TC в состоянии лоrической 1, запускается первы цикл while, or СЧLl1ТЫВШОЩLl1Й время, а еСЛLl1 входной БLl1Т находится в СОСТОЯНLI1И лоrИЧССКОIО НУl1Я, OT С4ет BpeMeHLI1 выnолняетс во втором ЦLl1KJlе while. ЭТLI1 ЦLl1КЛЫ занимают точно 28 мкс на LI1тераЦLl1Ю npLl1 тактовой 4астоте, равной 4 мrц, npLl1 этом значение счеТЧLl1ка увеЛИЧLl1ва ется так долrо, пока BXOДHO сиrнал не LI1зменяет свое СОСТОЯНLI1е. ЕСЛLl1 значеНLI1е BXOf\a не изменяется в течеНLI1L11 BpeMeHLI1, ле>кащеrо в ДLl1аnазоне от 28 до 56 мкс, значение счетчика будет равно 1, аналоrичным образом, еСЛLl1 значеНLI1е входа не изменяе ТС5-1 в течении времени, ле>кащеrо в ДLl1аnазоне от 56 до 84 мкс, зна4еНLI1е счеТЧLl1ка будет paB но 2. Длительность LI1мпульса лоrLl1ческоrо нуля ле>кит в ДLl1аnазоне ме>кду 52 LI1 64 мкс. Импульс лоrLl1ческой единицы LI1MeeT Д1lLl1тельность, nревосходщую 90 мкс, n03TOMY, еСЛLl1 счетчик AOCTLI1r значеНLI1Я 3 LI1ЛLl1 больше, то 3ТО озна4ает, 4ТО вход lIе LI1змеНЯllСЯ по крайней мере в течеНLI1L11 84 мкс, 4ТО в свою очередь ЗIIaЧLl1Т, 4ТО BXOДHO импульс rlpe восходит длительность лоrLl1ческоrо нуля. Приведенна nporpaMMa соответствует вре- менным требованиям как для нулевых, так LI1 Д1lя еДLl1НLI1ЧНЫХ битов. Как ТОJll)КО nроизо дет смена СLl1rнала, КОНТРОЛLl1руетс, однако не замеряется, BTopa половина БLl1та. Дол>кна замеряться только одна nОЛОВLI1на БLl1та. После замера БLl1та LI1 ero nрохо>кдения, nporpaMMa счета устанаВЛLl1вает ЛLl1бо сбрасывает dataBit, а затем вызывает функцию states[state](}, определяемую СОСТОЯНLI1ем YCTpOCTBa. На pLl1c. 5.7 npLl1BeAeHa ALl1arpaM- ма состояний, отра>каюw,ая назна4еНLI1е Ka>KДO СРУНКЦИLl1 СОСТОНLI1Я (от stateO до stat(4). Проrраммы управлеНLI1Я YCTpocTBaMLI1 4асто LI1СnОЛЬЗУЮТ ряд состояний ПрLl1 вы- nолнеНLI1И задаЧLl1. В данном npLl1Mepe MaCCLl1B адресов функций используетс для ВЫЗ0ва раЗЛLl14НЫХ функци для раЗЛLl14НЫХ COCTOHLI1. Блаrодаря такому подходу ДОСТLI1rается nРЯМОЛLl1неная орrаНLI1зация nporpaMMbI. Проrрамма так>ке ДОЛ>Кllа ИСnОЛЬЗОВaJЪ Ka KO-TO метод Д1lя оnределеНLI1Я факта «заВLI1сания» CLl1CTeMbI в течеНLI1И более 1 О милли секунд. 3то выnолняетс npLl1 nОМОЩLl1 LI1сnользования CTOpO>KeBOrO TaMepa, однако поскольку зта тема будет рассматриватьс поз>ке, здесь она не LI1ллюстрируетс. V1c ПОЛЬЗОВа!ше CLl1CTeMHbIX LI1 сторо>кевых TaMepOB будет рассмотрено LI1 ПрОLl1JlЛЮСТрLl1рО вано npLl1MepaMLI1 проrрамм поз>ке в 3TO KHLI1re. ЕСЛLl1 BXOДHO LI1МnУЛЬС «застыл» 13 со- СТОЯНLI1L11 лоrLl1ческой еДИНLI1ЦЫ, 4ТО мо>кет LI1MeTb место в случае ОТКЛЮ4еНLI1Я nOAa4L11 Ha nря>кеНLI1Я на рельсы модеЛLl1, то CLl1CTeMa «заВLI1снет»  3ТО явлетс nРLl1ЧLl1НОЙ LI1СnОЛЬЗО вания какоrОЛLl1бо мехаНLI1зма вывода CLl1CTeMbI LI1З nодобноrо СОСТОНLI1Я. 
rnaBa 5. ITporpaMMHpoBaHHe PIC 18 на языке С 181 5.4. Математическая библиотека XOT MaTeMaTH4eCKa 6н6лнотека н не нсnользуетс столь же часто, как БLl1Блио :Ka временных задержек, CPYHKu.HH, входщне в состав математнческой бибJJLI101еки, axOДT определенное npHMeHeHHe npH nporpaMMHpoBaHHH. Математическая бибЛLl10- :Ka нсnользует только 32разрдные чнсла с nлаваlOw,ей точкой, при Э10М 64 :азрдные чнсла двойной Т04НОСТН не nО,lJДер'жнваIOТС. Поскольку мы изучаем 8 :.азрдный мнкроконтроллер, 64разрдные оnерацни потребовали бы для свое! о BЫ олненн слншком MHoro временн. Во встроенных мнкроnроцессорных системах npo :>aMMЫ редко работаlOТ с даннымн в срормате nлаваlOw,ей точки. Таблица 5.5. Математнческие функции, BxoAw,He в состав включаемоrо файла math.h Ф у нкция П р и ме р acos acos (data 1 ) asiD asin (data2) ataD atan (data3) ataD2 atan2 (datal, data2) ссП ceil (data 1) cos cos (data2) cosh cosh (data3) еlР ехр (data4) (аЬ [аЬ (data5) floor f100r (data6) fmod fпюd (пит, пюd) frexp frexp (data 1, intr) ieeetomchp ieeetomchp (data2) idexp idexp (data3, int 1) log log (data4) log10 log 1 О (data5) mchptoieee l11chptoieee (data6) modf пюdf(dаtа7, data8) ро\у pow (data 1, data2) SiD sin (data3) SiDh sinh (data4) sqrt sqrt (data5) (ап tan (data6) taDh tanh ( data7) Коммеllта рий Возвращает арккосинус в радианах datal (от О до п) Возвращает арксинус в радианах data2 (от п/2 до п/2) Возвращает apKTaHreHc в радианах data3 (от п/2 до 7[/2) Возвращает apKTaHreHc в радианах clata 1 / data2 ( от от  п до 7[) Возвращает целое число, которое больше или равно числу с плавающей точкой datal Возвращает косинус data2 в радианах Возвращает rиперболический косинус data3 Возвращает edata4 Возвращает абсолютное значение data5 Возвращает целое число, которое больше ИJIИ равно числу с плавающей точкой data6 Возвращает остаток пит по модулlO тod Разделяет datal на дробную (возвращает) I! целую часть (coxpa няется по указателю intr) Преобразует data2 в формат с плавающей точкоiI Мiсюсl1iр Возвращает data3 * i ntl Возвращает натуральный ЛОI'арифм data4 Возвращает обычный лоrарифм data5 Преобразует data6 из формата с плаuающеп TOLIKOJI Мiсюсhiр Возвращает дробную часть data7 и сохраняет целую часть но указателю data8 Возвращает data 1 data2 Возвращает синус уrла в радианах data3 Возвращает rиперболический синус data4 Возвращает корень квадратный из data5 Возвращает TaHreHC УI'ла в радианах data6 Возвращает rиперболический TaНJ'eHC data7 МатемаТИ4еска 6н6лнотека, nоставлемая совместно с компилятором С18, pea изует те же CPYHKu.HH, 4ТО н CTaHдapTHa математнческа бнблнотека зыка ANSI С, (JTopa nоставлетс с 60ЛЬWННСТВОМ комnилторов. В табл. 5.5 nереЧLl1слены эти :Jункцнн, BКJlI04a npHMepbI н комментарнн о нх работе. Ал НЛЛlOстрацнн нсnользовани матемаТН4еской библиотеки, nporpaMMa из pHMepa 5.14 pewaeT уравнен не 4астоты резонанса, нзвестное из курса электроники Fr = 1/2 n-VLC). 3та nporpaMMa находнт 4астоту резонанса дл конденсатора eMKO :TblO 1,0 мкФ Н зна4еннй нндуктнвностн в днаnазоне от 1,0 до 1 О MI, сохранSlЯ десять ::езультатов в масснве с именем Fr. 
182 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Пример 5.14 1* * Это npMMep 5.14 *1 #iпclude <p18cxxx.h> #lclude <math.h> 1* Установка 6мтов конфмrураuмм *  установка peMMa reHepaTopa HS * - ВКnЮ4енме CTopoeBoro TaMepa * - ВКnЮ4енме HM3KoBonbTHoro nроrрамммроваНМR */ / #pragma config OSC #pragma config WDT #pragma config LVP HS OFF OFF II данные в naMRTM nporpaMM float Fr [10]; f10at L 1.0е-3; float С = 1.0е-6; // rnaBHaR nроrрамма void main (void) int а; for (а = о; а < 10; а++) { Fr[a] 1/ (6.2831853*sqrt(L*C)); L += 1.0e6; ECJlH вы наnнwите .цанную nporpaMМY, НСnОJlЬ3УЯ IDE, н посмотрите на КОJlН4ество nамffiИ, HCnOJlb30BaHHO ,lJ,Л coxpaHeHH 3TO за,ца4Н, то увнднте, 4ТО ее длнна 6удет COCTaВnтb 1941 6айта памяти nporpaMM. Такое 60JlbWoe КОJlН4ество памяти нужно в свзн С НСnОЛЬЗ0ваннем матемаТН4ескнх срункu.нн,lJ,Л выnолненн onepau.нH нзвле4енн ква,ораn-юrо KOpH, а таюке one раu.нй С nлаваlOw,е T04KO. Как уже отме4МОСЬ, в npHкnaднbIX nporpaмMax CJleAyeT НСnОЛЬЗ0 вать снмволы н u.елые 4исла Bcer.цa, Kor.цa зто возмо>кно, н60 размер nporpaMMbI мо>кет npeBbI- снть 06ъем дocтynHO памяти nporpaMM. Предnоло>кнм, 4ТО нам ну>кно onpe,lJ,eJlHTb козфсрнu.нент УСНJlення наnря>кенн в децн6елах. 3то достиrаетс нсnользованнем ypaBHeHH Vgain = 2010g,o(V ou ,fV,J. Функ цня, KOTopa НСnОJlьзует MaTeMaTH4ecKYlO 6н6лнотеку npH peweHHH 3TO зада4Н, nOKa зана в npHMepe 5.15. Как н в CJlY4ae npHMepa 5.14, зта cpYHKЦH HY)I(ДaeTC в 60ЛЬШОМ КОЛН4естве naMTH ,lJ,Jl BbInOJlHeHH onepau.HH lOglO, а таюке арнсрмеТН4ескнх onepa- u.H С nлаваlOw,е T04KO. Пример 5.15 float gainDB (float voиt, float vin) { return 20 * 10g10 (vout/vin);  
rnaBa 5. ITporpaMMHpoBaHHe PIC18 на языке С 183 5.5. Резюме 1. Комnнлтор С18 3ЫKa С ,lJ,OcryneH в CBoe Y4e6HO верснн как 6есnлатны BЫ ужаемы срал. Ero МО>КНО BbIrpY3HTb С caTa фнрмы Microchip. 2. IDЕ nOJlHOCTblO nOPдep>KHBaeT nporpaMMHpoBaHHe на С с НСnОЛЬЗОIJaННGМ KOM 1илтора С18. З. Операторы #pragma config конфнryРНРУIOТ мнкроконтроллер РС 18 на зыке С anguage. 4. Анректнвы asm н endasm НСnОJlЬ3УIOТСЯ 6ез {} ,lJ,Jl ВВО,lJ,а ассем6лерноrо кода 3 проrрамму на зыке С. 5. Точные срункцнн временных за,lJ,ер>кек HMeIOTC во ВKJllOчаемо 6н6лнотеке <омnнлятора С18, KOTopa Ha3ЫBaeTC delays.h. 6. АостУП к портам BBoдaBЫBO,lJ,a Н3 nporpaMM на 3ЫKe С орrаннзуетс с нсnоль- зованнем, а так>ке nporpaMMHpoBaHH perHCTpoB наnравленн ,lJ,анных. 7. Файл заrОJlОВка stdlib.h СО,lJ,ер)I(ИТ фун Ku.н Н , которые ВЫnОЛНIOТ nре06разовання. 5оJlЬWННСТВО Н3 ннх ВЛIOТ Функu.нмн npe06pa30BaHH CTaндapTHOro 3ЫKa ANSI С. 8. Фал заrОJlовка striпg.h СО,lJ,ер>кнт CPYHKu.HH, которые 06есnечнваlOТ возмож ТЬ выnолненн маННnУJlЦН С снмвольнымн строкамн н naMTblO, НСnОЛЬ3У как 1aMTb nporpaMM, так н naMTb ,lJ,анных. 9. Анректнвы rom near HJlH rom far HCnOJlb3YIOTC AfI coxpaHeHH HHcpopMau.HH в 1ЗМтн nporpaMM МНКрОКОНТрОJlлера. 1 О. ФаJl заrоловка math.h СО,lJ,ер>кнт CPYHKu.HH, которые ВЫПОЛНIOТ математнче :кие оnерацнн, стаН,lJ,артные AfI ANSI С. 11. В комnилторе С 18 арнсрметнка С nлаваlOw,е T04KO оrраннчена onepau.HMH : З2разрднымн 4HCJlaMH с nлаваlOw,е T04KO O,lJ,HHapHO Т04НОСТН. 5.6. Вопросы и задания 1. Сравннте 3ЫK С18 С ANSI С. 2. Как КО,lJ, 3ЫKa ACCeM6Jlepa вставлетс в nporpaMMY на 3ЫKe С? З. Каково назна4енне оператора #include <p18cxxx.h>? 4. Каково назна4енне оператора #pragma config? 5. Что такое на60Р инструментаJlЬНЫХ сре,lJ,СТВ Microchip С18? 6. 06ъсните ,lJ,етanьно, как cpyнкu.н Delay1 КТCfx нсnользуетс ДЛ отработкн'  миrulнсекундно BpeMeHHO задер>ккн, eCnH снстемная тактовая 4астота равна 4 Mr Ц. 7. nOBTopHTe вопрос 6,lJ,Jl СЛУ4а TaКТOBO 4астоты, paBHO 20 Mru.. 8. V1сnользу 6н6лнотеку delays.h, HanHWHTe KOPOTKYIO nporpaMMY, KOTopa нзме "'IЯeТ COCTOHHe 6HTOBO n03Hu.HH О порта В так, чт06ы в те4еннн O,lJ,HO секунды она Ha I(}ДИлась в е,lJ,ННН4НОМ состояннн н так>ке в те4еннн О,lJ,ной секун,lJ,Ы в нулевом COCTO ....и. C,lJ,eJlaTe nре,lJ,nоло>кенне о том, 4ТО TaКТOBa 4астота МНКРОКОНТРОЛЛGра ра13на .( мrц. 9. HanHWHTe KOPOTКYIO nporpaMMY, KOTopa reHepHPyeT nрмоуrольные нмnульсы : частото 1 Kru. в 6HTOBO nознцнн 2 порта В. 10. HanHwHTe nporpaMMY, KOTopa выnолнет npocrylO проверку всех восьмн !IXO,lJ,HbIX KOM6HHau.H на ЗВХО,lJ,ОВО лоrН4еско схеме NAND (HE-V1), nOAКnI04eHHo к "1IOpTaM BBO,lJ,aBЫBoдa MHKpOKOHTpOJlJlepa. Порт В, 6нты О, 1 н 2 nOAКnlO4eHbI ко входам .1()("И4еско схемы NAND, а 6нт 4 порта А сое,lJ,ннен С ВЫХО,lJ,ОМ лоrнческо схемы. Еслн :)езультат проверки nоло>кнтелен, nOMeCTHTe лоrН4ескуIO e,lJ,HHHu.y В 6нтовую nОЗНЦНIO 3 Ta В, а еслн результат npoBepKH oTpHu.aTeJleH, nOMeCTHTe лоrН4ескн ноль В 6нтовую iOЗнцню 3 порта В. 
184 ITрименение микроконтроллеров PIC 18 11. ИСnOJlLJЗУЯ фУНКЦИIO rand, наnншнте nporpaMMY, которая будет rel Jерироваrь числа для лотереи в ДL/1аnазоне между 1 н 47 на 6нтах порта В микроконтроллера I3ский раз, коrда На>Кимается кнопка, nОДKJlюченна к БL/1ТУ 4 порта А. V1сходите нз Toro, что npH На>Катнн кнопка rС;llерируе r лоrL/1ческий ноль, а при отnусканни  лоrическуlO еднннцу. 12. В чем разница между ДL/1рективамн rom near н rom far? 13. Создайте nOL/1CKoBYIO таблнцу в памяти nporpaMM, которая содержит ASCII коды ЦL/1фР от О до 9 и букв от А дО F. После этоrо наnишнте СРУНКЦИIO, которая бу/еr L/1сrlOЛLJЗОЕШТЬ nонсковую таблнцу дл nреобразовани переданноrо ей символов от О /o 15 в KoAASCII. 14. Объсните, каким образом nознu.нн та6лнu.ы в naMTH nporpaMM L/13 nримс ра 5.11 КОДИРУlOт коды Морзе. 15. Объясннте, как функцн sendDitDah ра60тает в npHMepe 5.11. 16. Сформируйте оператор зыка С, который nРОl3еряет состояние бнтовой nози ции 2 порта В. Еслн этот бнт находитс в состонин лоrнческой единицы, то nporpaMMa должна остановнться на этом операторе, а еслн в COCTOHHH лоrическоrо нул, то про- rpaMMa Аолжна nрОДОЛЖL/1ТЬ свое выполненне. 17. Объсните, как функци Wait4Clock в npHMepe 5.12 О>КНАает завершенн OДHO ro nолноrо u.L/1кла тактовой частоты в битовой nОЗL/1ЦИН 1 порта А. 18. Какое значенне возвраw,ает функци readChar 13 примере 5.12 в СЛУ4ае ошиб ки napL/1TeTa? 19. Какое зна4енне B03Bpaw,aeT cpYHKЦH readChar в npHMepe 5.12 в случае ошиб ки фрейма? 20. Объсните, как rлавна nporpaMMa в npHMepe 5. 13 оnределет шнрнну BXOД Horo снrнала Jlоrическоrо нул нлн лоrнческой единицы в бнтовой nознu.нн О порта В. 21. Каков смысл оператора &ЬоЬ на языке С? 22. Объясните, как оператор states[state]() в npHMepe 5.13 вызывает разлнчные срункцнн, в завнсимостн от зна4енн переменной state. 23. Если TaKTOBa частота в при мере 5.13 6удет нзменена с 4 на 8 Мiц, то что должно быть L/1зменено в nporpaMMe ДЛ Toro, чтобы она работала nравнлыю? 24. V1сnользу заrоловочный срайл math.h, напишите nporpaMMY, KOTopa будет оrlределть емкостное соnротнвление (хс) конденсатора на 1,0 мкФ для частот от 100 'ц до 1000 iu. шаrамн по 100 ,ц. Емкостное соnротивленне оnределется по фор муле:  2лFС' 25. Предnоложнм, 4ТО порт А (6нты О, 1 н 2) влетс входом от цифровоrо кодн- руюw,еrо устройства, которое reHepHpyeT трехразрдный двончный код, коrорый npeA ставлет 45. на каждое nрираw,ение двоичноrо чнсла, ToeCTb 000 = О., 001 = 45., 01 0= 90. н так далее. Напишите фУНКЦНIO с нменем sinPortA, KOTopa счнтывает порт А н B03 Bpaw,aeT сннус уrла. Исnользу срункu.ню sin(bob) 6н6лнотекн math.h library, возвраТL/1те синус уrла ЬоЬ, предполаrа, 4ТО уrол ЬоЬ задан в paAL/1aHaX (360. = 2л radians). Запиши- те длину СРункu.ин, KOTopa сообw,ается IDЕ. 26. Повторите вопрос 25, исnользу nОИСКОВУIO та6лнцу, coxpaHeHHYIO в naMHL/1 nporpaMM, дл возврата тех же значеннй, которые рассчитывались в вопросе 25.CpaB нин: длину этой функцнн С срункцией, написанной вами npL/1 работе над вопросом 25. 27. Как вы СЧL/1таете по результатам ра60ТЫ над BonpocaMH 25 и 26, являются ли поисковые таблиu.ы важным средством СОЗ,lJ,анн nporpaMMHoro обеспечения для YCT ройств С оrраниченным объемом naMTH  такнх, например, как мнкроконтроллеры? ): 
rnaBa 6. Спецнфнкацнн аппаратных Cpe.u.CTB семейства PIC 18 185 rЛАВА 6. Спецмфмкацмм аппаратных среАСТВ семейства PIC18 Прежде, чем может 6ыть создана снстема на основе лю60rо МНКРОКОlIтроллера :емейства PIC18, должно 6ыть достнrнуто полное nОllиманне срункцноналыюrо назна -jения ero выводов, а так>ке CPYHKu.H, реалнзованных в конкретном мнкроконтроллере. Эта rлава onHcbIBaeT характернстнкн семейства PIC 18 как по nOCTOHHOMY, так и по пе земенному току, схемы сннхроннзацнн, тре6уемые ДЛ срункu.нонироваllИ PIC18, а акже nрнводнт cyw,ecTBeHHo Ba>KHYIO ннсрормацнlO в отношеннн ра60ТЫ некоторых нз fСТРОЙСТВ BBO,lJ,aBЫBoдa, HMelOw,Hxc внутрн мнкроnроцессоров PIC18. ВНУI'реllние fстройства, не рассмотренные в зтой rлаве, 6удут рассмотрены в nоследуюw,нх rлавах, -iарду с cooTBeTcTBYIOW,HMH nрнло>кеннмн. После НЗУLlенн 3ТОЙ rлавы Вы: 1. Смо>кете nравнльно орrаннзовать электроnнтанне мнкроконтроллера, OnHcaTb ero характеристнкн по nocToHHOMY току н nравнльно нх нсnользовать. 2. Сможете детально onHcaTb раЗЛИ4Н в мнкросхемах МИКрОКОlIl роллеров ce 'Аейства PIC 18. 3. Сможете характернзовать мнннмальные н макснмальные наnряженн н токи на выводах Ввод  Вывод н на выводах ДЛ nОДКЛ104енн nнтания. 4. Сможете НСnОЛЬЗ0вать сторо>кевой таймер. 5. Сможете nporpaMMHpoBaTb выводы портов. 6. Сможете coxpaHTb н С4нтывать данные нз 3СnnЗУ данных. 7. Узнаете о npepbIBaHHx н смо>кете nHcaTb nporpaMMbI на зыке С, нсnользуlO щие npepbIBaHH. 8. Смо>кете OnHcaTb внутреннне nepHcpepHHbIe YCTpOCTBa мнкроконтроллеров семейства PIC18. 9. V1сnользовать TaMep, а так>ке модуль cpaBHeHH н с60ра данных в прнкла[J,IIЫХ nporpaMMax. 6. 1. Цоколевка выводов и базовые операционные характеристк Как у>ке отме4алось в rлаве 2, мнкроконтроллеры семейства PIC 18 Moryт нмеТЬ разные нсnолненн. 3тот подраздел OnHCbIBaeT деталн этнх нсnолненнй, а также cne цнфнцнрует Tpe60BaHH относнтельно nотре6лемой MOW,HOCTH по постоянному току н наrрузочнуlO cnoc06HoCTb мнкроконтроnлеров. 3тн знанн не06ходнмы npH разработке снстем, cnoc06HbIX срункцноннровать nродол>кнтельное BpeM. Цоколевка вьшодов Cyw,ecTByeT orpoMHoe колнчество BepCH мнкроконтроллеров семейства PIC18, начнна от 18BЫBOДHЫX корпусов Н заканчнва 128BЫBOДHЫMH KopnycaMH. Чтобы BЫ брать nравнльны мнкроконтроллер AfI KOHKpeTHoro npHMeHeHH, не06ходнмо блнзкое знакомство с раЗЛН4НЫМН варнантамн u.околевкн выводов. Мнкроконтроллеры семей ства PIC18 nронзводтс в сле,lJ,УIOw,нх варнантах корпусов: PDIP (пластмассовый двух рдный корпус), SOIC (мала ннтеrральна схема ДЛ nOBepxHocTHoro монтажа), PLCC (пластмассовы 6езвыводно КОРПУС), QFN (KBaдpaTHЫ nлоскнй 6езвыводной), QFP (квадратный nлоскнй), ТОРР (TOHKH KBaдpaTHЫ nnоскнй), LQPP (ннзкоnросрнльный KBaдpaTHЫ nлоскнй) н SSOP (маJlЫЙ КОРПУС занн>кенноrо nросрнл). Все зтн корпуса, за 
186 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 НСКЛlOчением PDIP н PLCC, разра60таны AfI nOBepXHoCTHoro монта>ка н не НСnОЛЬЗУlOт C npH работе с npoToTHnaMH. Рнс. 6.1 нллюстрнрует названные варнанты корпусов. PDIP 06ычно НСnОЛЬЗУlOтс AfI ра60ТЫ с npoToTHnaMH снстем, а корпуса с nОlЗерхност- ным монтажом НСnОЛЬ3УlOтс в npoMbIwneHHbIX нзделнх. //' 1\J  /' J ' · }-  i  . ) PDIP PLCC ..............., // '.''-, //..,/ '-'-, f...... > .  ,./;] '- ,. ''-O/ "-','r/ QFP /... .    LQFP \; , /'.......... /'  SOIC Q QFN ../;.,......................  TQFP //"" ,,'/ ........ ,,'" ...... ;;t/.  SSOP Рис. 6.1. Варнанты корпусов мнкроконтроллеров. 
rnaBa 6. СnецнФнкацнн аппаратных Cpe.u.cTB семейства PIC 18 187 PDIP, SOIC RAO/ANO ...... АА 1/AN1/LVDIN ....... RA4rrOCKI ...... McLRN pp/RA5........... V55/AV55........... RА3IАNЗNRЕF+ ........ ABO/AN4/INTO ........... AB1/AN5rrx/...... СК/INТ1 MCLAN pP/AE3 ............... о 1 ААОI ANO ....... 2 АА 1/ AN 1........ 3 AA2IAN2NREF-/CVREF ........ 4 AA3IAN3NREF+ ........ 5 RA4rrOCKIIC 1 OUT ......... 6 RA5/AN4 /551lV DIN/C20UT ........ 7 V 55 ............ 8 05C1/CLKI/AA7 ......... 9 05C2ICLKO/AA6........ 1 О RCOrr1 050rr1 CКI......... 11 AC1rr10sl/CCP2*........... 12 АС2/ССР1/Р1А........ 13 АС3IsСК/sСL........ 14 ...... АВ3IССР1/Р1А ....... AB2IP1 B/INT2 ........ OSC1/CLКI/RA7 ...... OSC2ICLKO/RA6 ............ Voo/AVoo R67/PGDrr10511 .......... Р1 D/КВIЗ ...... RB6/PGCrr1 0501 Т1 ЗСКl/Р 1 C/KBI2 .......... RBS/PGM/KBI1 .......... АВ4/ AN6/RXI ОТ/КВIO 18Р1230/1330 .......... RВ7IКВIЗ/РGD .......... AB6/KBI2/PGC ............ AB5/KBI1/PGM .......... АВ4/АN111КВIO .......... RВЗlАN9/ССР2* .......... AB2/AN8/1NT2 .......... АВ 1/AN1 OllNT1 ......... RBO/AN121INTO ........... V()D ........... V 55 .......... AC7/AXlDT .......... RC6rrX/CK ......... АС5/5ОО ....... AC4/SDI/SDA 00 C'\IN C'\I('I) C'\IN LLLL со со т- т- ()() 0:0: PJC18F2220/2320 Рис. 6.2. HecKoJlbKO npe,lJ,CTaBHTeJle мнкросхем ceMeCTBa PIC18 в KopnycaxTHna PDIP н SOIC (на4ало) 
188 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 MCLRN pp/RE3 ..........-... ААО/ ANO ............... АА 1/AN1 ........ . RA2/AN2NREr./CVREF .............. RA3/AN3Nf1EF+ .. RА4IТОСКl/СlОUТ  АА5/ AN4iss/LVDIN/C20UT ....... REO/AN5/ RD  RE1/AN6IWR ............. RE2/AN7 /CS ---------- V оо -----...... VSs OSC1/CLKI/RA7 .............. OSC2/CLKO/RA6 .............. RCOIТlOS0IТ1CKI ............. RС1IТlОSI/ССР2* ............... RC2/CCP1/P1A ............. RC3/SCКlSCL ... RDO/PSPO .......... RD1/PSP1 ---------- [ МСLRN рр/RЕЗ  Q 1 RAO/ANO ........... 2 RA1/AN1  3 RA2/AN2NREF- ........... 4 RА3/АN3NПЕF+ ............. 5 RA4rrOCКI ........... 6 RA5/AN4/ss/HLVDIN............ 7 V 88 -----+- 8 OSC1/CLКI/RA7 ............... 9 OSC2/CLKOlfiA6 +------ 1 О RCOIТ10s0rr13CКI......... 11 RС1rrюsl........... 12 Ас2/ССР1.......... 1 3 RСз/sСК/sсL........... 14 18Р4220/4320 18п480/2580  RВ7/КВI3/РGD ...... ПВ6/КВI2/РGС  RB5/KBI1/PGM  RB4/AN11/KBIO 36 ................. RB3/AN9/CCP2* 35 ' ............... RB2/AN8I1NT2 34 ..... RB1/AN10/INT1 33  RBO/AN12/INTO 32  Voo 31 ............... Vss ЗО ..-....-... RD7/PSP7/P1 [) 29  RD6/PSP6lP1 С 28 ............... RDS/PSP5/P1 В 27 ................ RD4/PSP4 26 ............... АС7/АХ/ОТ 25 ............... АС6/ТХ/СК 24 ...-..-.. RC5/SDO 23 .... fiC4/SDIiSDA 22 .........-... RD3/PSP3 21 ............... HD2/PSP2 о о N N N М '<t '<t LL LL (х) (х) ..... .....  а. а. 00 (х)со '<tU') "'''' LLLL (х)со ..... ,... ОО а.а.  RB7/KBI3/PGD ...... RB6/KBI2/PGC .......... flB5/KBI1/PGM  RB4/KBIO/AN9 ....... RB3/CANRX ......... RB2/INT2/CANTX ........... RE31/INT1/I\N8 ......... RBOIINTO/AN10 ........... VOO ........... VSS ......... RC7/RX/DT ........... RС6IТХ/СК RC5/SDO .......... RC4/SDI/SDA Рис. 6.2. Несколько nредставнтелей мнкросхем семеЙСТlЗа PIC18 в корпусах THna PDIP и SOIC (продолженне) 
rnaBa 6. Сnецнфнкацнн аппаратных Cpe.u.cTB семейства PIC 18 189 МСLR/V Рf'/RЕЗ 1 RAOIANO/CVREF 2 АА 1/AN1.............. 3 RA2I АN2NЯЕF- 4 RАЗ/АNЗ/VRЕF+ ............... 5 RA4rrOcКl.............. 6 RA5IAN4 /ss/ HLVDIN............. 7 REO /RO/ AN5  8 RE1 IWR/ AN6/C1OUT  9 RE2/ cs/ AN7/c20UT............... 10 VDD ............... 11 Vss............... 12 Osc1/cLКI/RA7............... 13 Osc2lcLKO/RA6............... 14 RСО/Т1ОS0/Т1 зсКl............... 15 RС1rrЮSI  16 Ас2!ссР1............... 17 Rc3/scКlscL............ 18 RDO/PsPO/c1IN+............... 19 R01/PsP1/c1IN-.............. 20 'v 00 фф '<;f'U') 'O:to::t IJ..IJ.. фф ,... ,... 2 а.а. 18Р4480/4580 40 ......--.. RВ7/КВIЗ/РGО 39 ............... RB6/KBI2!PGC 38 ............... RB5/KBI1/PGM 37 ............. АВ4/КВIO/ AN9 36 ............... RB3/CANRX 35 ............... RB2/INT2/CANTX 34 .............. RB1/INT1/AN8 33 ............... RBO/INTO/FLTO/AN1O 32 ............... VOD 31 ............... Vss 30 .....---. RD7/PSP7/P1 О 29 ............... R06!PSP6/P1 С 28 ............... RD5IPSP5IP1 В 27 ............ R04/PSP4/ECCP1/P1A 26 ............... АС7/АХ/ОТ 25 ............... RC6rrX/CK 24 ............... RC5/SDO 23 ............. RC4/SDI/SOA 22 ............... RDЗ/РSРЗ/С2IN- 21 ............ R02!PSP2!C2IN+ Рис. 6.2. Несколько nредставнтелей мнкросхем ceMeCTBa PIC18 в корпусах THna PDIP н SOIC (ОКОН4ание) Рнс. 6.2. НЛЛlOстрнрует u.околевку выводов некоторых мнкроконтроллеров семей ства PIC18. nоказанные npHMepbI ВЛIOТС THnOBbIMH ДЛ семейства МНКРОКОIIТРОJJле ров PIC18, npH этом в нх состав не BXOДT мнкросхем 18F242/248/252/258/448/458, исnользованне которых в новых npoeKTax не peKOMeHдyeTC срнрмой Microchip, в связи со CHTHeM нх с nронзводства в не,lJ,алеком 6удуw,ем. )J,л ознакомленн с полным ne- речнем доступных в HacTow,ee BpeM устройств семейства 18F, noceTHTe сайт фнрмы Microchip. В 06w,eM CJlY4ae npH нсnользованнн 18BЫBOДHЫX мнкросхем с KopnycaMH PDIP, BBOДBЫBOД 6удет оrраннчен nopTaMH А н В; nopTaMH А, В н С npH нсnользованнн 28-выводных BepCH мнкросхем н nopTaMH А, В, С, D н Е npH нсnользованнн 40BЫBOДHЫX корпусов. YCTpOCTBa paccMaTpHBaeMoro ceMeCTBa в 60лее, чем 40-выво,lJ,НЫХ корпусах THna PDIP не BnIOTc 06w,едостуnнымн, поэтому здесь онн Не paCCMaTpHBaIOTCJ н60 моrлн 6ы возннкнуть трудностн npH созданнн nрототнпов. Как только этн младwне верснн корпусов 6удут нзучены, мы сможем леrко nереклIOЧНТI:)С на L/1зученне корпусов ДЛ nOBepxHocTHoro монтажа с 60ЛЬШНМ колнчеством в ЬIlЗОДОЕЗ , поскольку все члены семейства во всем остальном ндентнчны. ЕДННСТЕЗенное разлнчие" заKJllOчаетс в cnoc06e установкн мнкросхемы (THn корпуса), д06авленнн дополннтеJlЬ- ных выводов ДЛ BBoдaBЫBoдa, а так>ке в некоторых доnолннтельных CPYHKu.HX, KOTO рые реаЛНЗ0ваны в BepCHX мнкросхем с MeHbWHM КОЛН4еством выводов. Выводы для подключеция напряжения питания' Как н в Л1060 ннтеrрально схеме на полевых МОnтранзнсторах, ДЛ подачи номннальноrо Hanp>KeHH nHTaHH, paBHoro +5В (3ТО Hanp>KeHHe может снн>каться до 4,2 В ДЛ 06ecne4eHH макснмальноrо 6ыстродействн) нсnользуетс вывод VDD; ДЛ51 nОДКЛlOченн землн СЛу>кИТ вывод VSS. Все выводы VDD н VSS должны 6ыть nОДKJlI04е ны к нсточннку электроnнтанн, ВKJllOча те верснн МНКрОКОНТрОЛJJероЕЗ, которые имею r 60лее одноrо вывода VDD илн VSS. Во всех случах макснмально доnустнмое напряже 
190 ITpHMeHeHHe микроконтроnnсров PIC18 нне питанн нормируетс уровнем + 7,5 В. Микросхемы nОЗВОЛЯlOт нспользова',1, самые различные нсточникн электроnнтанн, ВKJllOча 6атареи. V1меется также l3ерсня микро контроллера со снн>кенным nотре6леннем MOW,HOCTH (PIC18L), в которой допускается, чтобы наnрженне nHTaHH опускалось 6ы до YPOBH 2,5 В npH ра60те с полным 6ыст- родействнем. МИКРОКОНТРОJlJlер - зто устройство выполнено на KMOnCTpYKTypax, с которым нужно работать cooTBeTcTBYIOW,HM образом. Мнкросхема может 6ыть nOBpe>K дена злектростаТН4ескнм разрдом (ESD). УДОСТОl3ернтесь в том, что МИКрОКОНТрОJlJlер храннтся в антнстатнческом заw,нтном корпусе до тех пор, пока 011 не установлен в схе- му, а также в том, что при ра60те с ннм nрименяютс надлежаw,не методы. OHLI1 I3КJ'IO чаlOТ nравнльное заземленне, а также ра60ТУ 13 среде с надлежаw,ей шIaжIюстыо (СВЫ- we 20%). Прн ра60те с мнкроконтроллером, всеrда одевайте на руку заземляющий 6раслет, а также у6еднтесь, что pa604a зона заземлена надлежащнм образом. Если некоторые нз входов мнкроконтроллера не НСnОЛЬЗУlOтс, не06ходнмо нх nОДКЛlOчнть на 06щнй провод нлн к нсточннку питанн, как Toro тре6ует теХНН4сское оnнсание на мнкроконтроллер. НеnОДКЛlOченных выводов 6ыть не Дол>кно. 3лектростатнческнй раз pд на «BHC4H» вывод, приведет к выводу нз CTpO мнкросхемы. В обw,ем случае ток nотре6ленн оnределетс тактовой частотой, 011 может нметь днаnазон от 60 мкА npH ра60те с тактовой частотой в 31 кrц до 12 мА и выше, коrда нсnользуетс TaKTOBa 4астота 40 Mru.. Макснмалыюе зна4енне тока мо>кст дoc THraTb 300 мА, а макснмальное значенне MOW,HOCTH, рассеНl3аемой устройством, равно 1 Вт. Величина тока nотре6ленн нзменетс в завнсимости от таКТОL30Й чаС10"'Ы н Ha rрузко на выводах ввод - вывод, однако она указываетс в техническнх данных кон- крепюrо устройства дл определенной частоты. Наrрузка на ВЫL30дах дл ввода - L3bIBO- да дол>кна 6ыть определена дл KOHKpeTHor.o nрнложени н д06а13леlla к МОW,IЮСТН, по- треблясмой мнкроконтроллером. В неnосредственной 6лизостн от ннтеrрально схемы ДОJl>кен 6ыть установлен развзываlOw,нй конденсатор eMKocTblO 0,1 мкФ, ШУНТНРУIOw,н вывод VDD на 06w,ий провод (вывод VSS). Микроконтроллер PIC пронзводнт 60льшое КОЛН4ество внутренне- ro nереКЛlOчательноrо WYMa, KOTOpЫ может nередаватс на друrне компоненты CHC темы 4ерез WHHbI nHTaHH. ПО 3TO nрнчнне налнчие развзываюw,еrо конденсатора 06зателыю. 3тот ВЫСОК04астотный WYM reHepLl1pyeTc всякн раз, коrда внутрен- ннй KJlЮЧ на полевом МОnтранзнсторе замыкаетс нлн размыкаетс, вызыва броскн тока на выводе nHTaHH. Все цифровые ннтеrральные схемы nронзводят этот THn wy МО13, поэтому выводы nHTaHH дол>кны шунтироватьс. Да>ке лннейный УСИЛИТCJII, такой как onepau.HoHHbI уснлитель, reHepHpyeT шумы н наЛН4не конденсаторов разL3ЯЗКИ на выводах nHTaHH обзательно. Подключения BBoдaBывoдa Характернстнки ВВО,lJ,а - вывода весьма ва>кны AfI орrаннзацнн взанмодествн с друrнмн устройствамн. Характернстнкн ннтерфейса мнкроконтроллеров nеречнслены в та6л. 6.1. В зтой та6лнu.е макснмальные токн лоrнческоrо нул н еднннu.ы указаны совместно с cooTBeTcTBYIOW,HMH днаnазонамн Hanp>KeHH. Указанных значеннй нсоб ходнмо твердо nрндер>кнватьс, еслн выходы нсnользуютс ДЛI уnравленн лоrиче скнмн схемамн. В друrнх случах (как, HanpHMep, npH уnравленнн светоднодами н т.д.) сраКТН4ескнй максимальны выходной ток равен 25 мА дл лоrнческоrо нул или Jlоrи- ческой еднннu.ы npH условнн, что не nревышен общнй ток потребления мнкросхемы мнкроконтроллера. Еслн Вывод ввода  вывода нмеет сла6ую наrрузочнуlO способность (порт В н порт D в некоторых BepCHX мнкросхем), как это 6удет OnHCbIl3aTbC в 1l0сле- ДУIOw,нх раздеJlах, то макснмальны входной ток 6удет равен 400 мкА. Еслн Tpe6yeTC 
rnaBa 6. Сnецнфнкацнн аппаратных среДСТВ семейства PIC18 191 ток, nревышаlOw,и peKOMeHдyeMЫ, то в ка4естве HHTepcpeca BBoдa вывода ИСnОJlЬ- зуетс УСИJlитеJlЬ. В 06w,eM CJlY4ae ток на выходном выводе 6удет достаТ04НЫМ ДЛ уnраВJlени 4eTыpbM стандартными ТТЛ-мнкросхемами ИJlИ 10 высокоскоростными KMOn-микросхемами. ЕСJlИ ИСnОJlЬ3УIOТС иные зна4ени наnр>кени питания, то 06 paw,aTecb к теХНИ4еским данным на МИКрОКОНТрОJlJlер AfI nОJlУ4ени доnолнитеJlbl'lЫХ сведени о токе nотре6Jlени и токах на выводах мнкросхемы. Таблица 6.1. ЛоrИ4еские уровни на выводах «ввод-вывод» при VDD = +5,0 В. Лоr. уровень Vmin Vmax Imax О ВХОА 0.0 В 0.8В :t1.0 мкА 1 ВХОА 2.0 В 5.0В :t1.0 мкА О BXOA 0.0 В 0.6В 8.5 мА 1 BXOA 4.3 В 5.0В 3 МА *MaKCMManbHO AonycTM 06 ток MMKpocxe равен 200 мА npM BnnOTb АО 25 мА на KaA BBOA, npM YCnOBMM, 4ТО npeAen в 200 мА не npeBweH AnR всей микро" cxeM, а ее BXOД не nOAKn4eH ко ВХОАам nоrИ4ескмх схем. Сброс An nраВИJlЬНО ра60ТЫ ми KpOKOHTpOJlJlepa, AOJl>KHa 6ыть nраВИJlЬНО выполнена оnераu.и nриведени ero в исходное состоние ИJlИ с6роса. BXOДHO Вывод МGbR - зто Вывод 06w,ero с6роса, KOTOpЫ иниu.иanизирует МИКрОКОНТрОJlJlер таким 06раЗ0М, 4ТО он на4инает ра60ТУ, вы6ира команду И3 HYJleBO 4еки naMTH, KOTopa Ha3ЫBaeTC адресом вектора с6роса. ECJlH питание растет со CKOpOCTblO 0,05 В/мс (минимумом), то TorAa резистор с номинаJlОМ от 1 кОм до 1 О кОм nOAKJlI04aeTC Me>K,lJ,Y входом MGl::R и + 5.0 V, при зтом внутреннне схемы автомаТИ4ески c6paCbIBalOT МИКрОКОНТрОJlJlер. ЕСJlИ скорость роста наnря>кенн неJlЬ3Я rарантировать, как со всеми nрнмерами в 3TO кни- re, потому 4ТО характер НСТ04ника nитани неизвестен, то схема, ИJlЛlOстрируема рн- сунком 6.3, nраВИJlЬНО с6расывает МИКрОКОНТрОJlJlер. 04ень 4асто HOpMaJlbHO раЗ0МК- HYТЫ KHon04HbI переKJl104атеJlЬ ИСnОJlьзуетс AfI PY4Horo с6роса МИКрОКОНТрОJlJlера (зта кнопка с6роса мо>кет 6ыть CHTa, eCJlH PY4HO с6рос не Tpe6yeTC). RCnoCToHHa времени u.еnи с6роса AOJl>KHa 6ыть Me>K,lJ,Y 1 О мс И 20 мс. Схема на рис. 6.3 имеет no- CTOHHYIO времени АС, paBHYIO 1 ОК х 1.0 мкФ ИJlИ 1 О мкс. МИКрОКОНТрОJlJlер так>ке c6paCЫBaeTC при следуlOw,их УСJlОВИХ в ДОnОJlнение к зазеМJlеннlO вывода 06w,ero с6роса: 1. С6рос по сторо>кевому TaMepy (WDT) 2. nроrраммируемы с6рос по 4аСТИ4НО потере nHTaHH (ВОА) 3. KOMaндo RESEТ (Reset) при 06раw,енин к cooTBeTCTBYIOw,e срункu.ии на 3ЫKe С. 4. С6рос по заnОJlнениlO стека 5. С6рос по потере зна4ИМОСТИ стека nрОХО>K,lJ,ение сиrнаJlа 06w,ero с6роса от входа 06w,ero с6роса разрешаетс на языке С оператором #pragma config MCLRE = ON. ЕСJlИ он не разреwен, то TorAa BЫ nOJlHeTC с6рос по росту наnр>кени nитани, КОНТРОJlируемоrо на выводе VDD при УСJlОВИН, 4ТО ero нарастание соответствует тре60ваним теХНН4еских данных. Входом o6w,ero с6роса становитс 6ит BBoдaBЫBoдa порта А, еСJlИ вход 06w,ero с6роса дезак тивирован оператором #pragma config MCLRE = OFF. ФаКТН4еский номер штырька и позиu.и 6ита порта onpeAeJlIOTC версие МИКрОКОНТрОJlJlера. Во мноrих СЛУ4аях KOH денсатор с6роса н резистор тре6уIOТСЯ AfI Toro, 4т06ы rарантировать nраВИJlьное вы- ПОJlнение оnераu.ии с6роса. '" 
192 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 vcc R1 10К SW1 С::О:::::.  j MCLR Сброс С1 1.0 uF Микро контроллер Рис. 6.3. Цепь с6роса МL/1кроконтроллера PIC18 Команда #pragma config на 3ЫKe С определяет СОСТОЯНL/1е 6L/1TOB КОНсрL/1rураЦL/1L/1 микроконтроллера. ЭТL/1 6L/1TbI pa3Mew,eHbI в пространстве nамти nporpaMMbI, которое является доступным только 4ерез ИСnОЛЬЗ0вание команд та6ЛL/14ноrо 4тения L/1 заПL/1СL/1 по адресам от ОхЗООООО до Ox3FFFFF. ВВL/1ДУ значителы-юrо КОЛL/14ества работы, Tpe буемой ДЛ Toro, 4тобы L/1зменить 3TL/1 Я4еЙКL/1, язык С реаЛL/1зует команду #pragma config ДЛ зтой зада4L/1. БL/1ТЫ КОНсрL/1ryрации Moryr так>ке L/1зменяться в MPLAB IDЕ на вкладке Сопfigurаtiоп (KoHcpL/1rypau.L/1) rлавноrо MeHlO, НО HaMHoro 60лее ОnL/1сателы-ю зто бу дет, еСЛL/1 КОНсрL/1rУрL/1рование 6удет выполнено с nOMow,blO оператора #pragma config. Сторожевой таймер. Сторо>кевой таймер (WDT) - зто внутренний С4еТ4ИК, KOTO рый сбрасывает МL/1кроконтроллер по L/1CTe4eHL/1L/1 заданноrо nepL/1oAa BpeMeHL/1. Этот таймер мо>кет npOrpaMML/1pOBaTbc. WDT мо>кно ВKJlЮ4ать ИЛL/1 ВЫКЛI04ать, L/1СnОЛЬ3УЯ команду #pragma config ИЛL/1 >ке cooTBeTcTBYIOw,L/1e команды nporpaMMbI на языке Ac семблера. На языке С команда #pragma config 4асто L/1сnользуется для Toro, 4т06ы включать L/1ЛL/1 отключать WDT дЛЯ всей nроrраммной CL/1CTeMbI. WDT работает при пе pL/1oAe тактовой 4астоты равном 4 мс. Тактовая 4астота rенеРL/1руется BlJyrpeHHL/1M reHe- ратором. WDT масшта6L/1руетс с КОЗсрсрL/1u.L/1ентом от 1 до 32К, как зто nоказано 13 та6л. 6.2 и мо>кет OTC4L/1TbIBaTb время в AL/1ana30He между 4 мс L/1 131 секундой. Друrая команда KOHcpL/1rYPL/1pOBaHL/1 L/1сnользуетс ДЛ Toro, 4т06ы ВKJlЮЧL/1ТЬ WDT. #pragma config WDT = ON/OFF L/1сnользуетс на 3ЫKe С и WDT ON2H или _WDT _OFF _2Н (ДЛ 18F1320) L/1сnользуется на Ассем6лере. ПРL/1мер 6.1 ИJlJ1IОСТРL/1рует BepCL/1L/1 cooTBeTcTBYIOW,L/1X команд как на 3ЫKe С, так и 3ЫKe Ассем6лера, ВКЛI04аlOw,L/1G WDT L/1 задаюw,L/1е КОЗсрсрL/1u.L/1ент масшта6L/1роваНL/1, равный 4, который npOrpaMML/1pYGT WDT на сброс микроконтроллера по L/1CTe4eHL/1L/1 16 мс. 
rnaBa 6. Сnецнфнкацнн аппаратных Cpe.u.cTB семейства PIC18 193 Пример 6.1 '/ комаНАЫ R3Ka С АnЯ всех 4neHoB ceMeCTBa 18F 'pragma config WDT ON 'pragma config WDTPS =4 ; KOMaHД R3Ka ,AcceM6nepa ДnR PIC18F1320 TaMaYT WDT равен 16 мс CONFIG CONFIG2H, WDT ON 2Н WDTPS 4 2Н Оператор С tpragma config 'pragma config 'pragma config 'pragma config 'pragma config 'pragma config tpragma config tpragma config tpragma config tpragma config tpragma config tpragma config 'pragma config tpragma config tpragma config tpragma config WDTPS WDTPS WDTPS WDTPS WDTPS WDTPS WDTPS WDTPS WDTPS WDTPS WDTPS WDTPS WDTPS WDTPS WDTPS WDTPS 1 2 4 8 =16 32 64 128 256 =512 1024 2048 4096 8192 16384 32768 Таблица 6.2. Аоnустимые козсрсрициенты масшта6ировани CTOpO>KeBOrO таймера Язшс Ассемблера WDTPS12H WDTPS22H WDTPS42H WDTPS82H WDTPS162H WDTPS322H WDTPS642H WDTPS1282H WDTPS2562H WDTPS5122H WDTPSI0242H WDTPS20482H WDTPS40962H WDTPS81922H WDTPS163842H WDTPS327682H Коэфф. масшт. 1: 1 1: 2 1: 4 1:8 1:16 1:32 1:64 1:128 1:256 1:512 1:1024 1:2048 1:4096 1:8192 1:16384 1:32768 Время до сброса 4 мс 8 мс 16 мс 32 мс 64 мс 128 мс 256 мс 512 мс 1.024 с 2.048 с 4.096 с 8.192 с 16.384 с 32.768 с 65.536 с 131.072 с риме4ание: rronH сrrисок команд R3Ka AcceM6nepa имееТСR во BKnqaeMOM ane хикроконтроnnера PIC18F (здесь в KaqeCTBe иnnстраuии исrrоnьзуеТСR микрокон тponnep PIC18F1320) WDT заnускается nOCJle с6роса МИКрОКОНТрОJlJlера, он на4инает ОТС4итывать Bpe мя с интерваJlами в 4. В примере 6.1 интерваJl С4ета равен 4етыре периода по 4 мс ишt 16 мс. nOcJle ра60ТЫ nporpaMMbl в те4ении 16 мс WDT ИНИЦИaJlизирует с6рос. 3то no- З80лет с6расывать систему при nереnОJlнении WDT в CJlY4ae c60 nporpaMMHoro 06ec neчени. Если проrрамма срункu.ионирует HOpMaJlbHO, WDT nерезаnускаетс 6ез ини- ЦИaJ1изации с6роса, nOMew,a команды SLEEP (SleepO на С) ИJlИ CLRWDT (ClrWdt() на С) '. В HOpMaJ1bHYIO nOCJleAOBaTeJlbHOCTb команд nporpaMMbI (см. при мер 6.2). WDT мо>кет таюке 6ыть BKJl104eH (Jlor. 1) HJlH BblKJl104eH (Jlor. О) с ИСПОJlьзованием 6ита SWDTEN pe rистра WDTCON. ЕСJlИ nporpaMMa зависнет, то WDT не 6удет с6рошен срункцией ClrWdtO и nроизойдет с6рос системы. nерезаnуск системы, в этом примере, nроисхо дит по исте4енни 16 мс. TaKa ос06енность 4ре3ВЫ4айно Ва>Кна в системах, которые ДOJl>KHbl срункu.ионировать непрерывно 6ез с60ев. Во06разите TOJlbKO, 4ТО WDT OTCYТCT вует В снстеме анти6JlОКИРОВКИ ТОрМ030В автом06ИJlЯ (ABS) и nporpaMMa за6Jlокнрова лась, KorAa BOAHTeJlb Ha>KaJl на ТОРМ03! При наJlИ4НИ WDT система с6роситс и заnус титс вновь. И да>ке ew,e худwи CJlY4a: 4ТО 6удет, еСJlИ KOHTpOJlJlep управления зажи- fЗннем "зависнет", KorAa Baw aBTOM06HJlb HeceTC по автостраде со CKOpOCTblO 70 миль в час? 
194 ITpHMeHeHHe MHкpOKOHTpOnnepOB PIC18 Пример 6. 2 II OnepaTop на Rзыке С ДЛR всех BepCM ceMeCTBa 18F void MAin(void) while (1) { // cMcTeMHbrn UMКn CIrWdtOi // с6рос cTopoeBoro TaMepa // 3Аесь BCTaBnReTCR смстемное rrporpaMMHoe 06ecrre4eHMe R3bIK AcceM6nepa . ) MAin: CLRWDT ; с6рос cTopoeBoro TaMepa здесь BCTaBnReTCR смстемное rrporpaMMHoe 06ecrre4eHMe GOTO Main Сброс при частичной потере питания. С6рос при 4аСТИ4НОЙ потере nитани (ВОА) nерезаnускает систему вски раз, KOr,lJ,a наnр>кение nитани nони>каетс ниже предварительно заnроrраммированноrо ypOBH. БУДУ4И nерезаnуw,енным, МИКрОКOI-i троллер не на4инает ра60тать, пока наnр>кение nитани не поднимется выше предва рительно заnроrраммированноrо ypOBH. 3тот с6рос останавливает систему и nереза пускает ее, если по како-ли60 nРИ4ине наnр>кение nитани сни>каетс ни>ке предва- рительно заданноrо зна4ени. Снижение наnр>кени моrло 6ы 6ыть вызвано neperpy3- KO или в СЛУ4ае 6aTapeHoro nитани  севшими 6атареми. С6рос ВОА nредотвраw,а ет nporpaMMHbIe с60И в сиryаu.их, свзанных со сни>кением наnр>кени nитани. no- poroBoe зна4ение наnржени, иниu.иаЛИЗИРУIOw,ее с6рос по 4аСТИ4НО потере nита ни, nроrраммируlOТС, ИСnОJlЬ3У ry >ке caMYIO мето,lJ,ИКУ консриryрировани, 4ТО и при nроrраммировании WDT. В Ta6Jl. 6.3 nере4ислены параметры и уровни наnр>кени ДЛ ВОА. ВОА разрешаетс консриryРИРУlOщим зна4ением ВОА = ON и заnреw,аетс значе нием ВОА = OFF. Предnоло>ким, 4ТО в системе ДЛ ВОА исnользуетс noporoBoe значение lIanp >кение nитани, равное 4,2 В. Пример 6.3 ИЛЛlOстрирует операторы языка С, устанаuли вающне ВОА. Таблица 6.3. Уровни наnр>кени с6роса по 4аСТИ4НОЙ потере наnр>кени nитани Язк С Язк AcceM6nepa HanpReHMe с6роса по потере nMTaHMR #pragma config BORV 45 BORV 45 2L 4.5 В  #pragma config BORV 42 BORV 42 2L 4.2 В  #pragma config BORV 27 BORV 27 2L 2.7 В  #pragma config BORV 20 BORV 20 2L 2.0 В Прмме4анме : указанне уровнм наnрRенмя MorYT 6Tb MHbIМM В ApyrMx ммкрокон- Tponnepax, n03ToMY 06paaTeCb к теХНМ4ескмм дaHH на MMKpOKoHTponnep MnM к справке по 6мтам KOHMrypMpoBaHMR комnмnятора С18 (здесь в ка4естве MnncTpa- UMM pacCMaTpMBaeTCR MMKpOKoHTponnep PIC18F1320) . 
rnaBa 6. СnеЦНфl;(кацнн аппаратных cpe.u.CTB семейства PIC18 195 Пример 6. 3 tpragma config BORV tpragma BOR = ON 42 /1 установка rroporoBoro наrrрRеНИR с6роса на 4.2 В Сброс стека. Стек никоrда не nepenOJlHeTC н не onycTowaeTc при нормальной ра- 6оте nporpaMMbI., Если по KaKO- Jlи60 nРИ4ине возннкает c60 в системно nporpaMMe, то может возникнутЬ nереnолнение лн60 оnустоwение стека. Опустошение стека вызывается слншком 60JlЬШИМ КОJlИ4еством возвратов или оnераu.и выталкивани адресов И3 стека, а переnОJlнение стека BЫ3ЫBaeTC СJlИШКОМ 60JlЬШИМ КОJlИ4еством ВЫЗ0ВОВ срункци ИЛLl1 one раци вставки адресов в стек. ЕСJlИ nРОИСХО,lJ,Нт одна Н3 названных оши60К, то снстема aBTO маТИLlески c6paCЫBaeTC, еСJlИ зтот вид с6роса разрешен. С6рос стека разрешает- ся/заnрещаетс командой #pragma config SТVR = ON/OFF. nереnОJlнение nроисходнт, eCJlH 6ольше 4ем 31 адрес возврата nOMew,aeTc в стек, а опустошение nРОИСХО,lJ,Нт, еСJlИ СJlИШКОМ MHOro адресов возврата Y,D,aJleHO И3 стека. Ре>ким 6е3,lJ,естви. МИКРОКОНТРОJlJlер nepeBO,lJ,НTC в состоние или режим 6ездест ВИ, ИСnОJlЬ3У Jlи60 команду SleepO 3ЫKa С ИJlИ команду SLEEP Ассем6лера. В ре>киме 6ез действи TaКТOBЫ reHepaTop МИКРОКОНТРОJlJlера BbIKJl104eH и выполнение nporpaMMbI aCTa новлено с u.eJlblO миннмизаu.ни nотре6Jlени енерrии. 3тот ре>ким nОJlезен в системах с 6a тapeHЫM питанием. В ре>кнме 6е3,lJ,естви сторожево TaMep может 6ыть заnроrраММLI1- рован так, 4т06ы nocJle исте4ени KOHTpoJlbHOrO интервanа времени МИКрОКОНТрОJlJlер 6bIJl выведен И3 COCTOHH 6е3,lJ,есТ8Н. С06ыти, которые rенерируют npepbIBaHH, так>ке BЫBO дят МИКрОКОНТрОJlJlер И3 состони 6е3,lJ,ействн, nOCKOJlbКY nрерывани npepbIBalOT зтот режнм. Мноrие nРИJlо>кени H3BJleKalOT nOJlb3Y И3 ре>кима 6ездестви, nOCKOJlbКY он П03ВО ляет зкономить ЭJlектроnитанне, однако, eCJlH система не 3КСnJlуатируетс в УСJlОВНЯХ 6aTa рейноrо nитани, то ре>ким 6е3,lJ,ействн ИСnОJlьзуетс редко. Хорошнм nримером ра60ТЫ в режнме 6е3,lJ,естви BJleTC nYJlbТ дистанu.нонноro уnраВJlени теJlеВИЗ0РОМ. npLl1 на>каТИLl1 IНOnки ДЛ nереKJl104ени на APyro канan Jlи60 ВЫnОJlнени HHO срункции reHepHpyeTc рывание, которое застаВJlет МИКРОКОНТРОJlJlер выйтн И3 ре>кима 6ездестви и выпал- жть требуемуlO срункu.ИIO. nOcJle заверwени BbInOJlHeHH нужно срункu.ии микроконтроллер ВНОВЬ входнт в ре>ким 6ездейсТ8И. 3то сни>кает nотре6Jlение 3Jlектрознерrии, доводя ero до очень низкоrо YPOBH, n03BOJl 6атарейкам nYJlbТa ра60тать в те4ении длитеJlЫ-lOrо времени. Синхронизация MHKpOKOHTpOJlJlep - это CHHxpOHHa снстема, KOTopa AfI CBoe ра60ТЫ тре6ует IIIICПОJlЬЗ0вани ИСТ04ника тактовой 4астоты  тактовоrо reHepaTopa. БОJlЬШИНСТВО MLI1K IXЖОНТРОЛJlеров семейства PIC18 имеlOТ CPYHKu.HIO вы60ра входа TaKTOBO 4астоты, ко- тopa может nocrynaTb от BnJlOTb до 1 О ра3JlИ4НЫХ ИСТ04ННКОВ. (Некоторые ИСnОJlнени 184KpOKOHTpOJlJlepOB, отме4енные 3Be3Д04KO в ни>кеСJlедуюw,ем списке, не имеlOТ внyrpeHHero тактовоrо reHepaTopa, а некоторые ,lJ,руrие ИСnОJlнени МИКРОКОНТРОJlле ров MOryт реаJlИЗ0вать ДОnОJlнитеJlьные ре>кимы.) TaКТOBЫ reHepaTop задает скорость работы МИКрОКОНТрОJlJlера и ИСnОJlьзуетс так>ке при отра60тке временных задер>кек н обра60тке иных с06ытий внутри МИКрОКОНТрОJlJlера. V1СТ04никами TaKTOBO 4астоты lIOfYf 6ыть: 1. МаJlОМОw,ный KBapu.eBbl reHepaTop (LP) 2. KBapu.eBbI Jlи60 кераМИ4еский реЗ0натор (ХТ) 3. BЫCOK04aCTOTHЫ кварu.евый Jlи60 кераМИ4еский реЗ0натор (HS) 4. BЫCOK04aCTOTHЫ KBapu.eBbl Jlи60 кераМИ4ескн реЗ0натор с контуром фАnЧ НSPLL) 5. Внешни резнстор/конденсатор с ВЫХО,lJ,ОМ Fosc/4 на OSC2 (АС) 
196 ITримененне MHKpOKOHTpOnnepOB PIC 18 6. ВнеШНLI1 резистор/конденсатор с ВХОДОМ/ВЫХО,lJ,ОМ на OSC2 (RСЮ) 7. Внутренни reHepaTop с Fosc/4 на АА6 и входом/выходом на АА7 (INTI01) 8. ВнутреННLI1Й reHepaTop с входом/выходом на АА6 и АА7 (INTI02) 9. Внешни reHepaTop с Fosc/4 (ЕС) 1 О. Внешни reHepaTop с входом/выходом на АА6 (ЕСIQ) Первые 4етыре pe>KLI1Ma требуlOТ внешнеrо кварцевоrо или кераМИ4ескоrо резо наторов, которые nOAKJlI04aIOTC к выводам OCS1 и OSC2 МLI1кроконтроллера. 3то  наи 60лее распространенные cnoc06bI 06есnе4ИТЬ МИКРОКОНТРОJlлер TaKTOBbIMLI1 LI1мnульса MLI1. ЕСЛLl1 LI1сnользуетс KBapцeBЫ реЗ0натор, то не06ходимо ИСnОJlЬЗ0вать nараллель ный, а не nоследовательны реЗ0нанс. При nОСJlедовательном реЗ0нансе, тактовые импульсы не rенерируlOТС nocJle nервичноrо ВKJllOчеНLI1 CLl1CTeMbI, n03ToMY он редко LI1СПОЛЬ3УlOТСЯ в CLl1CTeMHOM nроектироваНLI1L11. Рис. 6.4 ИЛЛlOстрирует типовое ПОДКЛlOче ние KBapu.eBoro реЗ0натора к выводам OSC1 и OSC2. В данном случае KOIlAeHcaTop на 27 пФ ИСnОJlьзуетс совместно с кварцевым reHepaTopoM. Мо>кет nOTpe6oBaTbc He 60ЛЬWО noA60p емкостн 3Toro конденсатора (15 - 33 пФ), однако конденсатор емко- CTblO 27 пФ наде>кно ра60тает AfI 60Jlьшннства 4астот KBapu.eBoro Jlибо KepaMLI14eCKOro реЗ0наторов. PIC OSCl У1 D OSC2 С2 27 pF Рис. 6.4. ИСnОJlЬЗ0ванне KBapu.eBoro ЛLl160 KepaMH4eCKoro реЗ0натора в ка4естве ИСТ04ннка TaКТOBO 4астоты ЕСJlИ выбран режим PLL (контур ФАnЧ), то внутренние u.enH ФАnЧ 06ecne4aT ум- но>кенне 4астоты KBapu.eBoro reHepaTopa на козсрсриu.иент, равный 4. СледоватеJlЬНО, при KBapu.eBoM реЗ0наторе 4 Mru., nO,lJ,KJl104eHHOM к выводам OSC1 и OSC2, н Bы6paH ном pe>KLI1Me PLL, МИКРОКОНТРОJlлер 6удет ра60тать с BHyтpeHHe TaKTOBO 4aCTOTO, равной 16 мrц. 3тот тип СРОРМLI1ровани TaКТOBO 4астоты мо>кет nотре60ваться в тех системах, в которых не06ходимо снизить уровень злектромаrнитных помех (EMI), удер>кива внешнlOlO тактовуlO 4астоту настолько низкой, насколько 3ТО возмо>кно. 
fnaBa 6. СnецнФнкацнн аппаратных cpe.u.CTB семейства PIC18 197 TaKTOBa 4астота мо>кет так>ке срормнроваться npH nомоw,и внеwней частотно за даlOще RСцеn04КИ. Рнс. 6.5 из06Ра>Кает cooTBeTcTBYIOw,ee nO,lJ,KJlI04eHHe. БJlИ3КО аnnроксимаu.ией nOJlY4aeMoro зна4ени 4астоты 6удет выра>кение 1/4,2АС. 3то 3Ha4e ние 4астоты 6удет зависеть от наnря>кення nHTaHH и Т04НОСТИ номиналов 3JleKTpOHHbIX компонент. ПО nРИ4нне раз6роса HOMHHaJlOB ЭJlектронных компонентов, времязадаlO щие RСu.еnи должны ИСnОJlЬЗ0ваться TOJlbKO в тех системах, в которых не Tpe6yeTC T04HO синхроннзации ВЫnОJlнени команд. В ре>киме АС вывод OSC2 npOrpaMMLI1PyeT c как ВЫВОД ВХОд/ВЫХОД, ли60 как выход TaKTOBO 4астоты, деленно на 4 (Fosc/4). vcc ( PIC i R1 I R > OSC2 Fosc/4 OSCl 1 g' --:::- . ра60та на 4астоте 2 Mru.AOcTHraeTc при А=3,9 кОм и С = 30 пФ; Fosc/4 равно 500 Kru. при указанных HOMHHaJlaX компонент; от 3 кОм до 100 кОм; С 60льше 20 пФ. Рис. 6.5. V1СnОJlЬЗ0вание AfI синхронизаu.ии RСu.еn04КИ PIC Вход внеIШlей тактовой OSCl частоты Рис. 6.6. УnраВJlение PIC от ВХО,lJ,а внешне тактовой 4астоты Ава друrие ре>кима ра60ТЫ HCnOJlb3YlOT внешни НСТ04НИК TaKTOBO 4астоты, ПрLl1 этом BHeWH TaKTOBa 4астота nOAaeTc на ВЫВО,lJ, OSC1. Выво,lJ, OSC2 исnользуетс ..60 как вход/выход, Jlи60 как вывод тактовоrо сиrНaJlа Fosc/4, KOTOPЫ равен одной четверто тактовой 4астоты. Рнс. 6.6 ИJlJllOстрирует nOAa4Y сиrнаJlа BHewHe TaКТOBO частоты. An вы60ра ре>кима ра60ТЫ тактовоrо reHepaTopa, соответствуlOw,им 06раЗ0М nporpaMMHpYIOTC 6иты консриryраu.ни. npHMep 6.4 НJlJllOстрирует код консриryрирова 
198 ITримененне MHKpOKOHTpOnnepOB PIC 18 IIИЯ системы на 3ЫKe С при ИСnОJlЬЗ0ванни в ка4естве ИСТО4ника TaKTOBO 4астоты в 4 мrц KBapu.eBoro reHepaTopa. Зна4ение OSC будет тем, которое указано в на4ШШ laIlIlO ro подраздела, т.е. HS ДЛ pe>KLI1Ma 3, АС Д11 ре>кима 5 и т.Д. Если nporpaMMa созrастс TOJlI..!KO при LI1СnОЛЬЗ0вании 3ЫKa Ассем6лера, то смотрите BKJl104aeMbI срал микро КОllтроллера, BbI6paHHoro ДЛ ИСnОJlЬЗ0ванн в системе. 3тот ВКЛlOчаемы срайл co Aep>KLI1T LI1нформациlO по 3ЫKY Ассем6лера, необходимуlO ДЛ nроrраммирования pe rистра консриrурации на соответствуlOw,нй ре>ким ра60ТЫ тактовоrо reHepaTopa. Пример 6. 4 #pragma config OSC HS 11 B6MpaeT BCOK04aCTOTHbrn KBaPUeBbrn reHepaTOp 11 юш #pragma config OSC RC 11 B6MpaeT RC reHepaTOp Если выбран режим ра60ТЫ от BHyтpeHHero TaKTOBoro reHepaTopa (режимы 7 и 8), ВЫВОДЫ OSC 1 LI1 OSC2 6удут ,lJ,ocrynHbI ДЛ орrанизаu.ии Ввода  Вывода (порт А, биты 6 LI1 7) или же ДЛ сиrналов Fosc/4 н РА7. (Не все версии PIC LI1MCIOT внутреНIIИ reHepaTop.) Доступны ,lJ,ве 4астоты BHyтpeHHero тактовоrо reHepaTopa, - 8 Mru. и 31 кrц. СLI1rнал с частото 8 мrц мо>кет 6ыть отмасшта6нрован В сторону уменьшени с 4 Mru. до 125 Kru. внутренним делитеJlем. Рис. 6.7 из06ра>кает perHcTp уnраВJlени reHepaTopa и реrистр настройки reHepaTopa, KOTOpЫ НСnОJlьзуетс AfI уnраВJlени внутренннм reHepaTo- ром. ПРLl1мер 6.5 nOKa3bIBaeT, как ИСnОJlЬЗ0вать 3ЫK С AfI nроrраммнровани PIC на ИСnОЛЬЗ0ваНLI1е BHyтpeHHero reHepaTopa npLl1 ра60те с 4aCTOTO paBHO 4 Mru.. В зтом примере задаетс cpeДH 4астота. В доnолнеНLI1е к nporpaMMHoMY коду по примеру 6.5, в nporpaMMe дол>кны npLl1cyтcTBoBaTb операторы #pragma config OSC INI02 ИЛLl1 #pragma config OSC = INTI01 AfI вы6ора ре>кима ра60ТЫ от BHyTpeHHero таКТОЕЗоrо re- нератора. Ре>ким INTI02 застаВJlет OSC1 и OSC2 срункu.ионировать для Ввода  ВыЕЗО да, а INTI01 иниu.LI1алнзирует ВЫ,lJ,а4У на ВЫВО,lJ, OSC2 4астоты Fosc/4, OSC1 npLl1 зтом 6y дет СРУНКЦLl10нировать AfI Ввода  Вывода. An вы6ора BHyтpeHHero reHepaTopa, ра6о- таlOщеrо с 4aCTOTO 31 Kru., в nporpaMMe ИСnОJlьзуетс nсевдокомментари INTRC. Пример 6. 5 OSCCON = Ох62; 11 B6MpaeT qaCTOTY BHYTpeHHero reHepaTopa OSCTUNE = о; 11 HaCTpOKa reHepaTopa на cpeAH 4астоту Теперь, после Toro, как мы рассмотрели назна4енне выводов СИНХрОНLI1заЦLl1И LI1 сброса, u.елесоо6разно рассмотреть пример, KOTOpЫ nOMor 6ы свзать все зто BMe сте. Рис. 6.8 ИJlЛIOСТРLl1рует МИКрОКОНТрОJlлер, HCnOJlb3YIOW,LI1 KBapu.eBbI reHepa rop, работаlOЩLl1Й с 4aCTOTO 4мrц с реально KHonKo с6роса и соотвеТСТЕЗуюw,ИМLI1 цеrl ми. Пример 6.6 nOKa3bIBaeT nporpaMMY на 3ЫKe С, ИСnОJlьзуемуlO ДЛ nроrраММИрОЕЗа ни МИКрОКОНТрОJlJlера таким 06раЗ0М, 4т06ы CTOpO>KeBO таймер ИIILl1u.ИaJlизироваJl сброс OALl1H раз в секунду, noporoBoe наnр>кение с6роса по 4аСТИ4НО потере nитаНLI1 устанаВJlиваетс при зтом на 4,2 В. 
rnaBa 6. СnецнФнкацнн аппаратных Cpe.u.CTB семейства PIC18 199 (а) реrистр OSCCON lDLEN = о разрешение режима ШLЕN = 1 разрешение режима без.u.ействия: IECF2 IRCFl IRCFO О О О О О 1 О 1 О О 1 1 1 О О 1 О 1 1 1 О 1 1 1 31 кI'ц 125 кI'ц 250 кI'ц 500 кI'ц lмrц 2мrц 4мrц 8мrц 0818 = о работа таймера запуска reHepaтopa 0818 = t истечение интервала счета таймера запуска rеиератора IOF8 = О внутрешшй reHepaтOp нестабилен IOFS ::; 1 внyrpeшшй reHepaтop стабилен ЭСЭ 1 8С80 О О = первичный reHepaтop О 1 = reHepaтop таймера 1 I О = внyrpeшшй reHepaтop 1 1 = внyrpешшй reHepaтop (Ь) реrиСТр OSCТUNE т -биrы: 011 t t 1 = максимanънаSl частота 00000] 000000 = среДНSIЯ частота 111111 100000 = МИЮlМanънaSI частота Рис. 6.7. Внутреннне реrистры уnраВJlени reHepaTopOM Цепь, nоказанная на рнсунке, имеет ДОnОJlнитеJlЬНЫ конденсатор (С4). AaHHЫ конденсатор ВЫnОJlняет срункu.ию развязки. nOCKOJlbКY МИКРОКОНТРОJlJlер - зто синхрон Ha снстема, то она rенерирует ВЫСОК04астотный шум (nepeKJlI04aTeJlbHbI шум) на BЫ водах nнтания. Чт06ы ОТсрИJlьтровать этот WYM, с4 06есnе4ивает путь отвода Jl1060ro BbICoK04aCTOTHOrO WYMa, сrенерированноrо МИКрОКОНТрОJlлером, на землlO. 06Ы4ная практнка свзаНа с ИСnОJlЬЗ0ванием конденсатора на 0,1 мкФ AfI отвода шума на каж дo аналоrовой ИJlИ u.исррово HHTerpaJlbHO схеме снстемы. ЕСJlИ AflЯ шунтировання выводов nитани КОН,lJ,енсатор не ИСnОJlьзуетс, то 6удут 4асто возннкать np06JleMbI и таннственные nporpaMMHbIe с60Н. 
200 ITpHMeHeHHe MHкpOKOНTpOnnepOB PIC18 Пример 6.6 #pragma config MCLRE = ON #pragma config OSC = HS #pragma config WDT = ON #pragma config WDTPS = 256 #pragma config BORV =42 nMTaHMR #pragma BOR = ОМ void main (void) 11 мнмuмаnизаUИR CMCTeM while (1) 11 rnaBHbrn nporpaMMH UMКn 11 разреwенме Mcrronb30BaHMR входа 06ero с6роса 11 вы60Р KBapueBoro reHepaTopa 11 установка cTopoeBoro TaMepa 11 BpeMR cTopoeBoro TaMepa = 1 сеКУНАе 11 установка наnряеНМR с6роса по 4acTM4Ho потере 11 с6рос rro qacT. Потере nMTaHMR BKn. { CIrWdtf) ; 11 с6рос cTopoeBoro TaMepa 11 3Аесь BCTaBnReTCR сметемное rrроrpаммное 06ecne4ele 5V PIC С4 0.1 uF VDD R1 10К SW1 ...-:з.... MCLR RESET OSCI D У1 4UIiz 1 uF сз С2 OSC2 VSS Рнс. 6.8. ТИnИ4ные u.enH с6роса и reHepaTopa. Основной u.ИKJl В это npOrpaMMe СО,lJ,ер>кит срункu.иlO ClrWdt. Поскольку правильно cnpoeKTHpoBaHHa система срункu.ионирует в основном u.и KJle , WDT 04иw,аетс н ннко- rAa не сра6атывает на с6рос МИКрОКОНТрОJlJlера. На 3ЫKe С OCHOBHO u.ИKJl nporpaMMbI ДЛ Jl1060Й оnераu.ионно снстемы 6есконе4ен  да>ке в CJlY4ae такнх CJlO>KHbIX оnераu.и онных систем, как Windows н Linux. WDT мо>кно так>ке активнровать, ИСnОJlЬ3У коман,lJ,У wrCONbits.SWDTEN = 1 в nporpaMMe на 3ЫKe С вместо оператора #pragma. 
rnaBa 6. Спецнфнкацнн апПtlратных Cpe.u.cTB семейства PIC18 201 6.2. ВЫВОДЫ ВВОД-ВЫВОД Число портов Ввод - Вывод и КОЛИ4ество выводов у этих портов раЗЛИ4НО AfI 4ленов ceMeCTBa Р1С18, однако все версии микросхем имеют по KpaHe мере порт А и порт В. Выводы портов Ввод - Вывод 060зна4аются так, как, например, ААО AflЯ 6ито- BO позиu.ии О порта А. R в 060зна4ении "ААО" 0зна4ает "реrистр", так 4ТО это вывод 6ита О реrистра А. Порт А Выводы Порта А ИСПОЛЬ3УlOтс в схеме, показанно на рисунке 6.8. Вход МGbН  зто АА5 (AfI PIC18F1220), в типовом СЛУ4ае он используется AflЯ pY4Horo с6роса, по зтому он 4асто недоступен в ка4естве вывода Ввод - Вывод. Аналоrично, биты АА7 и АА6 (AfI PIC18F1220) ИСПОЛЬ3УlOтся в схеме (см. рис. 6.8) как выводы OCS1 (АА7) и OSC2 (АА6). Порт А имеет три реrистра, которые управляют ero pa60TO н ИСПОЛЬ3УlOт СЯ в ходе это ра60ТЫ: это реrистры TRISA, РОАТА и LATA. PerHcTp TRISA определет направление переноса данных на WTbIpbKax порта А, при этом лоrИ4еская единиu.а 6и- TOBO позиu.ии определет Вывод как BXOДHO, а ноль 6итово позиu.ии определяет Вывод как BЫXOДHO. Некоторые версии микросхем ИСnОЛЬ3УlOт реrистр ООАА (реrистр направлени данных), KOTOpЫ вляется вторым названием (псевдонимом) реrистра TRISA, используемым при управлении 6итами TRISA. (Для конкретных верси микро контроллера, смотрите фал Ikr AflЯ знакомства с соответствуlOw,ими определениями). Реrистр РОАТ А используетс AflЯ считывания выводов порта А или записи в зти выво- ды. Реrистр LATA используется ВНуТренне AflЯ С4итывани и модификации AallHbIX с nослеДУIOw,е их записыо в порт А. В ТИПИ4НОМ СЛУ4ае он непосредственно не адресу- eTC nporpaMMHbIM 06еспе4еннем. Буферны perHcTp позволяет порту изменть свое состоние 6ез с60ев. nримером выполнения оnераu.и 4тения, модификаu.ии и записи мо>кет 6ыть такая команда языка С, как РОАТА ++, KOTopa С4итывает порт А, инкремен- тирует ero, а затем записывает результат 06ратно в порт А. Чт06ы ЛУ4wе понять xapaK тер ра60ТЫ порта, посмотрите на рис. 6.9, KOTOpЫ ИЛЛlOстрирует BHyTpeHHlO1O структу- ру порта. Чт06ы записать данные в порт, не06ходимо записать их ли60 в реrистр LATA или в реrистр РОАТА. Чт06ы С4итать ВЫВОДЫ порта, ну>кно С4ИТalЪ РОАТА. Чт06ы счи- тать содержимое 6уферноrо реrистра порта, ну>кно С4итать LATA. 06ычно только РОАТ А используетс как реrистр, в nporpaMMe AflЯ 06раw,ени к данным порта А. На языке С весь порт С4итывается или заnисывается, ИСПОЛЬ3У команду РОАТА, а отдельны 6ит С4итывается или заnисывается, ИСПОЛЬ3У команду вида PORTAbits.RAO, которая С4итывает/записывает 6ит О порта А. Пример 6.7 показыuаст, как заnисать зна4ение Ох45 в порт А, ноль в 6ит 3 порта В и единиu.у в 6ит 5 порта В. При этом прннимается, 4ТО УПОМЯНуТые порты определены как u.ифровые, а cooTBeTcTBYIO- щие выводы запроrраммнрованы на выnолненне операu.ии вывода данных. ДaHHЫ пример ИЛЛlOстрнрует так>ке то, как ну>кно адресовать отдельные 6нты реrистра TRIS AflЯ проrраммирования выводов порта на ввод (1) нлн вывод (О). 
202 Прнмененне MHKpOKOHTpOnnepOB PIC18 .....,.... OJ<O........ "., .,.."..... . 'A'_'_""'"'' Буфер чтения УОО D1 Шина данъIX D Q LAT Буфер записи CLK D Q TRIS Запись реrистра 'Ш.IS CLK Чтение реrистра ТRIS Q D G Чтение порта Рис. 6.9. ВНуТренняя структура ПОДKJl104ения ВЫВОДОВ порта Пример 6.7 TRISBbits.TR.ISB3 =0; TRISBbits.TRISB5 o; PORTA = Ох45; PORTBbi.ts.RВ3 =0; PORTBbits.RB5 =1; // rrporpaMMMpoBaHMe RB3 как Bxoдa // rrporpaMMMpoBaHMe RB5 как Bxoдa // Оорт А = Ох45 // RB3 о // RB5 = 1 В Ta6Jl. 6.4 nере4ИСJlены все ВЫВО,lJ,Ы порта А, а так>ке НХ Функu.ии ДЛ микрокон ТрОJlлера PIC18F1220. Друrне версии микроконтроллеров Moryт иметь иные функции выводов портов. По это ПрН4нне всеrда не06ходнмо 06paw,aTbc к теХНИ4еским дaH ным микроконтроллера, BbI6paHHoro для npoena. Кроме Toro, OTKpOTe фаJl .Ikr, 4т06ы УВ, И,lJ,еть какие имена реrистров 6ыли определены AflЯ реrистра TRISA (TRIS или ООА). Мноrие ВЫВОДЫ ДЛ ввода - вывода имеlOТ ,lJ,ве иJlи три функu.ии, вы6ранные при их про- rраммировании, как 6удет 06суждатьс n03>Ke в 3TO rJlaBe. ВЫВОД АА5 (06w,и с6рос) 
rnaBa 6. Спецнфнкацнн аппаратных Cpe.u.CTB емейства PIC18 203 не мо>кет nроrраммироватьс как вывод AflЯ вывода. Аналоrовые входы ИСnОJlЬ3УlOТСЯ совместно с ВНуТренним аналоrоu.исрровым nре06раЗ0вателем, IТO так>ке 6удет обсу >кдaTbC nозже в 3ТОЙ rлаве. При с6росе микроконтроллера в некоторых версиях PIC18, 6иты 0...3 проrрамми PYIOTC как аналоrовые входы. Для nроrраммировани зтих 6итов как u.ифровых входов, реrистр ADCON 1 адресуется и nроrраммируется с YCTaHOBKO лоrИ4еско единиu.ы ДЛ ка>кдоrо вывода порта А, KOTOpЫ является u.исрровым BXOДoМ, Н нул AflЯ ка>кдоrо aHa лоrовоrо входа. По УМОЛ4аниlO выводы порта nроrраммируlOТСЯ как аналоrовые входы, потому, 4ТО реrистр ADCON1 с6расывается в HOJlb при с6росе. Самые npaBbIe семь 6и тов реrистра ADCON 1 идентиФиu.ируlOТСЯ nporpaMMHo как ANO-AN6. Некоторые И3 зтих аналоrовых входов (ANO-AN3) находятся в порте А, а некоторые (AN4AN6) - в порте В. Чт06ы сконсриryрировать порт А как u.нФрово BXOДHO порт, В котором AAOAA2 - 6y дут входами, а AA3AA4  выходами, 06ратитесь к npHMepy 6.8. В данном СЛУ4ае nрини MaeTC, 4ТО MGtR разреwен н установлен ре>ким reHepaTopa HS, в силу Toro, 4ТО OSC1, так и OSC2 ПОДКЛlO4ены к KBapu.eBoMY реЗ0натору. Пример б.8 ADCON1 = OxOf; TRISA = Ох07; СИМВОЛ RAO/ ANO RAlIAN1/LVDIN RA2/AN2Nref RA3/ AN3Nref+ RА4/ТОСКI RA5/MCLR /Npp RA6/OSC2/CLKO RA 7 /OSC I/CLКI Позиция бита О 1 II BBOAЫ портов А м В  UMpoBe II 6MT 02 порта А  вхоАЫ II 6MT 34 порта А  BXOA Таблица 6.4. Функu.иональное назна4ение выводов порта А ункция 2 3 4 5 6 7 ВЫВОД вводавыводаl аналоrовый вход Вывод BBoдaBЫBoдal аНaJЮI'ОВЫЙ вход I вход распознавания низкor'о Ha пряжения Вывод BBoдaBЫBoдal аналоrовый вход I VI'ef ВЫВОД ввода-выводаl аналоrовый вход I Vref+ ВЫВОД вводавыводаl вход внешней синхронизации таймера О ВЫВОД вводавыводаl общий сброс I проrpаммируемый вход напряжения Вывод ввода-выводаl OSC2 I Вывод выхода тактововой частоты Вывод BBoдaBЫBoдal OSCl I ВЫВОД входа синхронизации Таблица 6.5. Функu.ИОНaJlьное назна4ение выводов порта В СИМВОЛ Функция RBO/ AN4/INTO RB 1/ AN5//INТl RB2/P 1 B/INT2 RB3/CCP 1 RB4/ AN6 RB5/PGM RB6/PGC RB7/PGD Позиция бита О 1 2 3 4 5 6 7 ВЫВОД BBoдaBЫBoдa I аналоrовый входl вход прерывания О Вывод ввода-вывода I аНaJюrовый входl вход прерывания 1 Вывод BBoдaBЫBoдa I данные Рl В I вход прерывания 2 Вывод ввода-вывода I реrистрация/сравнение или выход шим Вывод BBoдaBЫBoдa I аналоrовый вход Вывод BBoдaBЫBoдa I проrpаммирование отделъноrо напряжения Вывод ввода-вывода I синхронизация последователъноrо проrpаммирования Вывод ввода-вывода 'данные последователъноrо проrpаммирования * OnpeAeneHMR зтмх BBOAOB M3MeHRTCR в pa3nMqHX 4neHax ceMeCTBa 
204 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 '-- Порт В Порт В nроrраммируется тем >ке самым cnoc060M, 4ТО и порт А. Реrистр TRISB nроrраммирует направление переноса данных AflЯ 6итов порта В, реrистр РОАТВ ис nользуется AflЯ Toro, 4т06ы С4итывать или заnисывать порт, а реrистр LATB  ДЛ Toro, 4т06ы С4итывать или заnисывать 6усрерный реrистр порта. Как у>ке упоминалось ДЛ порта А, реrистр ADCON 1 nроrраммирует срункu.ионирование аналоrооых и цисрровых выводов как AflЯ порта А, так и AfI порта В. Функции ВЫВО,lJ,ОВ порта В (AfI PIC18F1220) nере4ислены в та6лиu.е 6.5. Как и в СЛУ4ае порта А, выводы порта В имеlOТ мно>кественные срункu.ии. Не все оерсии микро схем имеlOТ все nере4исленные срункu.ии, в то >ке BpeM некоторые И3 них имеют допол нительные срункции. ПО мере рассмотрения кюкдо срункu.ии, множественносТl срунк- ций станет понтной. Выводы порта ИСnОЛЬ3УlOтс, npe>KДe Bcero, как простые выводы AfI u.исрровоrо ввода/вывода. Cna6bIe HarpY304HbIe резисторы вы6ираlOТС nроrраммированием 6ита реrистра INTCON2, КОТОРЫЙ называется RBPU. Если в 6ит RBPU реrистра INTCON2 помещеlllЮ rИ4еский ноль в, то наrрузки AfI выводов порта В активируIOТС. 3ти наrрузки 6локиру IOTC после с6роса или >ке TorAa, коrда ВЫВОД порта nроrраммируетс как ОЫХОДIЮЙ. Если сла6ые HarpY304HbIe резисторы активированы, то микропроцессор ПО,lJ,ключает вывод nнтани к 5 В 4ерез внутреннее сопротивление наrрузки. 3то позооnет СШ13Ы вать YCTpOCTBa ввода данных типа nереКnlO4ателей HenocpeAcTBeHllo с оыоодами flОр та В 6ез ИСnОЛЬЗ0вани внеwних HarpY304HbIX резисторов. 3то сни>кает 06w,ую стои- мость системы ввиду сни>кенноrо КОnИ4ества компонент. Пример 6.9 nOKa3bIBaeT, как мо>кно активировать сла6ые HarpY304HbIe резисторы на 3ЫKe С. Как и с друrим nporpaMMHbIM 06есnе4ением инициаnизаu.ии, COOToeTCT ВУlOщи nроrраммный КО,lJ, nомещаетс в на4але проrраммы перед осюоным npo rpaMMHbIM u.икnом. Пример 6.9 INTCON2bits.RBPU 1; // актмвмрованме cna6x HarpY30K Порты G, D, Е и друие MHorHe 4лены ceMeCTBa PIC18 имеlOТ 60лее ,lJ,ВУХ портов воода - ОЫВО,lJ,а и MorYT содер>кать порты С, D и Е. 3ти допоnнительные порты nроrраммируlOТС тем >ке самым cnoc060M, как порты А и В. Ka>KДЫ порт имеет реrистры TRIS, РОАТ и LAT AfI 06w,er0 u.исрровоrо проrраммировання ввода  вывода. Как и с портами А и В, мноrие И3 вы[ю ДОВ дополнительных портов имеlOТ 60nee одноrо срункu.иональноrо назна4ения. В Tex НИ4еских ,lJ,анных Ka>KДOrO KOHKpeTHoro 4лена ceMeCTBa nере4ИСЛЯIOТС мно>кестоенные срункu.ии кюкдоrо вывода AflЯ ввода - вывода. В 06щем СЛУ4ае, 4ем 60льwее КОЛИ4ество выводов имеет корпус интеrрально схемы, тем 60льwее КОnИ4ество nopTOO ввод  BЫ вод ,lJ,OcТYnHbI AfI орrанизаu.ии интерсреса. Пример ввода  вывода В этом nодразделе описан nолны пример, ИЛЛIOСТРИРУlOщи как аппаратные средства, так и nporpaMMHoe 06есnе4ение, наu.еленные на то, 4т06ы 06ьеДИIIИТЬ BMe сте материал, изло>кенны в зтой и nредwествуlOЩИХ rлавах. 3то первы пример сис темы, KOTopa у>ке мо>кет 6ыть создана. Он ,lJ,емонстрирует, как разра60тать и заnро rраммировать npocТYIO систему зnектронной иrры "вы6расыоание костей", имеlOЩУЮ 
rnaBa 6. Спецнфнкацнн аппаратных средств семейства PIC 18 205 кнопку и 14 светодиодов, от06ра>каlOЩИХ пару KOCTe. 3то проста система с KOpOTKO nporpaMMo, написанно как на С, так и на Ассем6лере с тем, 4т06ы выделнть разли- 4И. 3тот пример, исnользует микроконтроллер PIC18F1220 ввиду ero невысокой стои- мости ($2,78) и малоrо размера интеrрально схемы (корпус РО1 Р с 18 выводами). На рис. 6.10 nоказана nринu.ипиальная схема злектронно иrры "вы6расывание KOCTe". На схеме указано напр>кение питани, равное 5 8, однако в 3TO системе Moryт 6ыть ИСПОnЬЗ0ваны три последовательно соединенные 6атареки типа Ад 6атареи. 3та схема использует RCreHepaTop, ра60таlOw,и на 4астоте около 2 Mru., 4ТО яв neTC достаТ04НО для данноrо nрименени. Аанное применение не имеет никаких кри ТИ4еских временных СРункu.и, так 4ТО RCreHepaTop  3ТО простеши мето,lJ, nОЛУ4ени TaKTOBO 4астоты, по,цходw,и AfI дaHHO снстемы. В это системе ИСПОЛЬ3УIOТС две кнопки, однако кнопку RESET (СБРОС) мо>кно удалить, 4т06ы уменьwить стоимость системы. Чт06ы 6росить кость, на>кмите кнопку TOSS (Бросок); KorAa она 6удет отпу w,eHa, от06разитс произвольна пара лиu.евых поверхносте KOCTe. 3та система 6ро- сани KOCTe мо>кет ИСПОЛЬЗ0ватьс с ЛlO60Й иrро. Е,о,инственна аппаратна дора60Т- ка мо>кет 6ыть свзана с ПО,lJ,60РОМ резисторов смеw,ения светодио,lJ,ОВ. Наи60nее де- шевые светодиоды Tpe6YlOT AfI cBoero све4ени номинальноrо тока в 1 О мА и npMoro наnр>кени, paBHoro 1,658. Так как PIC 06есnе4ивает BЫXOДHO ток (см. детали на пер- вых нескоnьких страниu.ах это rлавы) paBHЫ 8,5 мА то ме>кДУ PIC и светодиодами до- 6авлен 6ycpepHЫ каскад. Бусрерны каска,о, мо>кет 6ыть удален, в зтом СЛУ4ае pKoeTb свечения светодиодов уменьwитс. 8 СЛУ4ае превыwени зна4ени 8,5 А, напр>кение на выводах СНИ3ИТС и мо>кет не достиrать KoppeKTHoro ПЛ-уровиtI напря>кения. ХОТЯ выводы в этом примере не ИСПОЛЬЗУЮТСЯ ДЛЯ передачи сиrналов ПL, этот пр им ер or раничения уровней тока обеспечивает хороший практический опыт формирования ин терфейса. ОТ,lJ,ельны свеТОДИОА (LEDA) тре6ует AfI cBoero смеw,ения ИСПОЛЬЗ0вани рези- стора в 300 Ом. npMoe падение напря>кени на свеТОДИО,lJ,е изменетс от 1,5 8 до 28, хотя в спеu.исрикаu.иях 06Ы4НО указывается, 4ТО номинальным влетс 1,65 8. д,л расчетов примем, 4ТО на резисторе na,o,aeT 3 В наnр>кени и 2 8 na,o,aeT на светодиоде, KorAa выход 6ycpepHoro каска,о,а становитс лоrИ4еским HyneM. 8Ы4исленное зна4ение 6удет равно (иепользу закон Ома R = U/I) 3 8/10 мА или 300 Ом. Резистор 100 Ом не- пользуетс последовательно с паро свето,lJ,ИОДОВ. Падение напр>кени на резисторе равно 1 8, при па,о,ении наnр>кени в 2 В на кюкдом светодиоде, 4ТО дает зна4ение co противления в 100 Ом (1 В/1 ОмА). Све4ение светодиода 06еспе4ивает лоrИ4ески О на cooTBeTcTBYIOw,eM ему выво- де. Бусрерны каска,lJ, выполнен на интеrральном 6усрере 7 4LS244. KoppeKTHa БИТОl3ая структура nО,lJ,све4ивания свето,lJ,ИОДОВ хранитс данным прило>кением в поисковой та6лиu.е в памти nporpaMM. Чт06ы coxpaHTb ,lJ,анные в памти nporpaMM, cneAyeT ие- ПОЛЬЗ0вать лексемы "rom" и "near" перед типом данных, в данном СЛУ4ае  это тип дан- ных char. Лексема rom заставлет траНСJlЯТОР coxpaHTb та6лиu.у в памти проrрамм (KOTopa влетс стаТИ4еско), а лексема near заставлет TpaHcnTop ИСПОЛЬЗ0вать 16разрдны 6nи>кни а,о,рес, KOTOpЫ ,lJ,олжен ИСnОЛЬЗ0ватьс в системах е коnичеет вом памти, меньwим, 4ем 64К памти nporpaMM, потому 4ТО это 60nee зсрсрективно. Если лексема near не испоnьзуется, 6удет ИСПОЛЬЗ0ватьс 24-разрдны адрес. 8ереи cooTBeTcTBYIOw,e nporpaMMbI на 3ЫKe С nоказана в примере 6.10. 3та nporpaMMa ото- 6ра>кает 36 ком6инаu.и пар KOCTe, которые сохранены в nоисково та6nице. д,ля сравнения пример 6.11 ИЛЛlOстрирует версиlO 3TO >ке nporpaMMbI на языке Аееем6ле ра. ЕСJlИ 3ТИ версии сравнить, то 04евидно, на написание KOTOpO yдeT меньше opeMe ни. 06е версии ИСПОЛЬ3УlOТ, XOT в прикладно nporpaMMe типа 3TO использооание WDT не влетс не06ходимым. 
+5V DIE 1 R1 100 R11 R10 R9 PIC18F1220 74LS244 10К 10К 3.9 К TOSS ::!: U2 о U1 N 1 RAO QRBO 8 А1 U У1 18 2 RA1  RB1 9 А2 u У2 16 6 17 > 14 7 RA2 RB2 18 АЗ У3 12 3 RA3 RB3 10 А4 У4 9 4 RA4 RB4 11 А5 У5 .7 16 #МCLR RB5 12 А6 У6 5 15 gg  : 1З А7 У7 3 А8 У8 .1Qf. Q Z С1 С2 С4 20Е (!) СЗ 1.0 uF ЗО pF 0.1 uF 0.1 uF s!  R3 100 G А   R4 300 DIE2 N О 0\ В8 D8 F8 Рис. 6.10. Пример Системы электронной иrры "вы6расывание костей" R8 300 8 А 8 G 8 Е 8 е ::1 "'CI ::s: ;s: (tI ::t: (tI ::t: ::s: (tI ;s: ::s: ::о: "'CI о ::о: о ::t: ..а о  ;.  (tI "'CI о t:I:J """=' n ':i 00 Размещение светодиодов .:; ::." 
rnaBa 6. Спецнфнкацнн аппаратных Cpe.u.cTB семейства PIC 18 207 Пример 6.10 1* * Орммер nporpaMM 6pocaHMR KOCTe, HanMcaHH ДnR PIC18F1220 *1 #include < p18cxxx. h > 1* Установмть 6MT KOHMrypaUMM *  Установмть RC reHepaTOp  OTKn4MTb CTopoeBO TaMep *  0'l'КЛ4мr.rь HM3KOBOnbTHoe nporpaMMMpOBaHMe OTKn4MTb с6рос по qaCTM4Ho потере nMTaHMR *  Разреwмть 06M с6рос *1 #pragma config OSC = RC #pragma config WDT = ОМ #pragma config WDTPS = 256 #pragma config LVP = OFF #pragma config BOR = OFF #pragma config MCLRE = ОМ II **************** AaHHe в naMRTM nроrрамм ********************************* II nOMcKOBaR Ta6nMua AnR KOCTe II 7 <0111>. = 1, Е <1110>. = 2, 6 <0110>. = 3, II А <1010>. = 4, 2 , <0010>. == 5, 8 <1000>. = 6 rom near char lookup[] = II все 36 KOM6MHaUM KOCTe Ох77, Ох7Е, Ох7 6, II 1, 1 1,2 1,3 Ох7А, Ох72, Ох78, II 1,4 1,5 1, 6 ОхЕ7, ОхЕЕ, ОхЕ6, II 2,1 2,2 2,3 ОхЕА, ОхЕ2, О хЕ 8 , II 2,4 2,5 2,6 Ох67, Ох6Е, Ох66, II 3,1 3,2 3,3 Ох6А, Ох62, Ох68, II 3,4 3,5 3,6 , ОхА 7, ОхАЕ, ОхА6, II 4,1 4,2 4,3 ОхАА, ОхА2, ОхА8, II 4,4 4,5 4,6 Ох27, Ох2Е, Ох2 6, II 5,1 5,2 5,3 Ох2А, Ох22, Ох28, II 5,4 5,5 5,6 Ох87, Ох8Е, О х8 6, II 6,1 6,2 6,3 Ох8А, Ох82, Ох88 II 6,4 6,5 6,6 } ; 1I **************** AaHHe в naMRTM AaHHX *********************************** int count; II ****************** IlcnyqaHoe qMCnO rnaBHaR nporpaMMa ************************************** void main (void) II II мнмuмаnмзаUМR CMCTe II ADCON1 = OxOF; TRISA Ох01; TRISB о; PORTB OxFF; count о; II все BBOA UMpOBoro порта II Оорт А, 6мт О RBnReTCR BXOAoMt II Оорт в RBnReTCR BXOAOM II все CBeTOAMOA BKn. II HaqaTb С4ет с HYnR 
/\ 208 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 II *************** while (1 ) { ра60ЧМ UMKn CMCTe************************************** II eAMHCTBeHH nporpaMMH UMKn ClrWdt(); II с6рос cTopoeBoro TaMepa if (PORTAbits.RAO == О) II есnи TOSS = О { count++; II reHepMpoBaHMe сnучаЙНОl'О чмсnа if (count == 36) count = о; I I УАерI3ание oTc4e'1'a в диапаЗ0не o'.r О АО PORTB = lookup[count]; II OT06paeHMe КОАа костм Пример 6.11 ***************************************************************************** ;Орммер nporpaMM 6pocaHMR костм, напмсанн на R3blKe Ассемблера LIST P=18F1220, F=INHX32 ;Амректмва onpeAeneHMR npoueccopa м opMaTa ana #include <18F1220.INC>. ;onpeAeneHMe cneuMM4HblX AnR npoueccopa перемен HX; ************************************************************************ ;Бмт KOHMrYPMpoBaHMR CONFIG CONFIG1H, IESO OFF 1Н & FSCM OFF 1Н & RC OSC 1Н     - - CONFIG CONFIG2L, BOR OFF 2L & PWRT OFF 2L -  CONFIG CONFIG2H, WDT ON 2Н & WDTPS, 4 2Н -   CONFIG  CONFIG3H,  MCLRE ON 3Н CONFIG CONFIG4L, DEBUG OFF 4L & LVP OFF 4L & STVR OFF 4L   CONFIG CONFIG5L, СРО OFF 5L & СР1 OFF 5L -   CONFIG - CONFIG5H, СРВ OFF 5Н & СРD OFF 5Н  CONFIG CONFIG6L, WRTO OFF 6L & WRT1 OFF 6L -   - - CONFIG CONFIG6H,  WRTC OFF 6Н & WRTB OFF hH & WRTD OFF 6Н -  CONFIG CONFIG7L, EBTRO OFF 7L & EBTR1 OFF 7L  CONFIG CONFIG7H, EBTRB OFF 7Н  ;**************************************************************** ;OnpeAeneHMR AnR naMRTM AaHHX ОDАТА ACS COUNT RES 1 iC4eT4MK ДnR cnY4aHoro 4Mcna OnpeAeneHMR AnR naMRTM nporpaMM ;nOMCKOBaR Ta6nMua Look СОDЕ РАС К Lookup: DВ Ох77, Ох7Е, Ох76 1, 1 1,2 1,3 DВ Ох7 А, Ох72, Ох78 1,4 1,5 1, 6 DВ ОхЕ7, ОхЕЕ, ОхЕ6 2,1 2,2 2,3 DВ ОхЕА, ОхЕ2, ОхЕ8 2,4 2,5 2,6 DВ Ох67, Ох6Е, Ох66 3,1 3,2 3,3 DВ Ох6А, Ох62, Ох68 3,4 3,5 3,6 DВ ОхА 7, ОхАЕ, ОхА6 4,1 4,2 4,3 DВ ОхАА, ОхА2, ОхА8 4,4 4,5 4, 6 DВ Ох27, Ох2 Е, Ох26 5,1 5,2 5,3 DВ Ох2А, Ох22, Ох28 5,4 5,5 5,6 
rnaBa 6. Спецнфнкацнн аппаратных Cpe.u.cTB семейства PIC 18 209 ОБ DБ Ох87, Ох8Е, Ох86 Ох8А, Ох82, Ох88 ; 6,1 6,2 6,3 ; 6,46,56,6 ;**************************************************************** ; 13eK'l'op сброса ; Этот КОД на4нет BnOnHRTbCR nocne с6роса. RESET VECTOR СОDЕ ОхОООО goto Main СОDЕ ;nepeXOA на HaqanO rnaBHO nporpaMM ;**************************************************************** ;Ha4ano rnaBHO проrрамм Main: MOVLW OxOF MOVWF ADCON1 MOVLW Ох01 MOVWF TRISA MOVLW О MOVWF TRISB CLRF PORTB CLRF COUNT MainLoop: CLRWDT BTFSC PORTA,O БRA MainLoop INCF COUNT MOVLW .36 SUBWF COUNT, О BNZ DoNotClear CLRF COUNT DoNotClear: MOVLW UPPER(Lookup) MOVWF TBLPTRU MOVLW HIGH (Lookup) MOVWF TBLPTRH MOVLW LOW(Lookup) MOVWF TBLPTRL MOVF COUNT,O ADDWF TBLPTRL MOVLW О ADDWFC TBLPTRH ADDWFC TBLPTRU TBLRD* MOVF TABLAT,O MOVWF PORTB GOTO MainLoop ;все nopT UMpoBe ;nopT А, 6мт О RBnReTCR ВХОАОМ ;оорт В RBnReTCR BXOAOM ;все CBeTOAMOA BKn. ;с6рос С4еТ4мка ;с6рос cTopoeBoro TaMepa ;npoBepKa 6мта О порта А ;eCnM 6мт О в eAMHMue ;мнкрементмрованме С4еТ4мка ;eCnM ОТС4ет не равен 36 ;n0nyqeHMe аАреса nOMCKOBO Ta6nMU ;A06aBneHMe ОТС4ета К аАресу Ta6nMU ;КОА nOMCKa ;nepeAa4a КОАа во WREG ;OT06paeHMe ero 
210 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 ;**************************************************************** ;Заверwенме nporpaM END Пре,lJ,nОJlО>КИМ, 4ТО схема (см. рис. 6.10) nepepa60TaHa с тем, 4т06ы ИСПОЛЬ3013ать все возмо>кности, доступные в PIC18F1 с u.enblO максимаnьноrо уменьшени стоимости Системы. Одно изменение схемы дол>кно уменьшить ток светодио,lJ,ОВ до 8,5 мА и уда- nИ1Ъ 6ycpepHYlO микросхему. Друrое изменение ДОЛ>КНО nереместить переКЛlO4атель TOSS (Бросок) на Выво,lJ, порта В с тем, LIТ06bI отпала не06ходимость в ИСllОЛЬЗ0ваllИИ HarpY304Horo резистора. Выводы порта В имеют внутренние lIаrрузки, разработаllllые ,lJ,ЛЯ зтих цепей. Вместо RCreHepaTopa мо>кет ИСПОnЬ30ВЮЬС внутренний rенерюор, 4т06ы устранить затраты на резистор и КОН,lJ,енсатор. В заКnlOчение, кнопка СБРОСА так>ке мо>кет 6ыть удалена. ACKOHTYP в u.епи с6роса OCTaeTC все >ке не06ходимым, потому 4ТО природа ИСТ04ника nитанн неизвестна и мо>кет оказатьс, 4ТО он lIe 06ес- печит достаТ04НО 6ыстрое нарастание напр>кения с тем, 4т06ы правиnьно с6росить МИКрОКОНТрОJlлер. На рис. 6.11 ПРИВО,lJ,ится ВИ,lJ,оизмененна схема, а пример 6.12, иn- ЛlOстрирует cooTBeTcTBYIOW,YIO версиlO nporpaMMbI на 3ЫKe С. Для проведения Ha3BaH ных изменени, потре60валось ввести только несколько строк nporpaMMHoro кода. Пример 6.12 1* * Орммер CMCTeM в6расвания KOCTe, наnисанн AnR PIC18F1220 *1 #inc1ude <p18cxxx.h> 1* Установмть 6MT конмrураuми *  Установмть RC reHepaTOp * OTKn4MTb CTopoeBO TaMep *  OTKn4MTb HM3KOBOnbTHoe nроrрамммрованме * OTKn4MTb с6рос по qaCTMqHO потере nMTaHMR *  Разреwмть 06M с6рос *1 #pragma config OSC = INTI02 #pragma config WDT = ON #pragma config WDTPS = 256 #pragma config LVP = OFF #pragma config BOR = OFF #pragma config MCLRE = ON II AaHHe в naMRTM nроrрамм II nOMCKoBaR Ta6nMua KOCTe II II 7 <0111> 1, Е <1110> 2, 6 <0110> 3 II А <1010> 4, 2 <0010> 5, 8 <1000> 6 II rom near char 100kup[J = II все 36 KOM6MHaUM KOCTe Ох77, Ох7Е, Ох76, Ох7А, Ох72, Ох78, II 1,1 1,2 1,3 II 1,4 1,5 1,6 
rnaBa 6. Сnецнфнкацнн аппаратных средств семейства PIC 18 21 t ОхЕ7, ОхЕЕ, ОхЕ6, 11 2,1 2,2 2,3 ОхЕА, ОхЕ2, О хЕ 8 , 11 2,4 2,5 2,6 Ох67, Ох6Е, Ох66, 11 3,1 3,2 3,3 Ох6А, Ох62, Ох68, 11 3,4 3,5 3,6 ОхА7, ОхАЕ, О хА 6, 11 4,1 4,2 4,3 О хМ, ОхА2, ОхА8, 11 4,4 4,5 4,6 Ох27, Ох2Е, Ох26, 11 5,1 5,2 5,3 Ох2А, Ох22, Ох28, 11 5,4 5,5 5,6 Ох87, Ох8Е, Ох86, 1I 6,1 6,2 6,3 Ох8А, Ох82, Ох88 1I 6,4 6,5 6,6 } ; II AaHHe в naMRTM дaHHX int count; IIСЛУ4айное 4МСЛО I1 main program void main (void) { 11 I1 initia1ize system 11 OSCCON = Ох64; 11 4астота устанавливаеТСR на 4 MrU ADCON1 = OxOF; 11 все BBOД цмфровх портов TRISB Ох01; 11 порт в, 6мт О - вход TRISA о; 11 порт А  BXOД PORTB OxFO; 11 все светодиоды вкл PORTA OXOF; INTCON2bits.RBPU 1; 11 наrрузки вкл. count :: о; 11 на4ало С4ета с НУЛR , /1 II uмкл onepaUMoHHo систе I1 whi1e (1) { 11 еАинственн nроrраммн uмкл ClrWdt () ; 11 с6рос cTopoeBoro TaMepa if (PORTBbits.RBO == О) { 11 еслм TOSS = О count++; 11 rенермрование слуqаноrо qMCna if (count == 36) count = о; PORTA PORTB lookup[count]; lookup[count] ; 11 nОЛУ4енме кода костм 11 nОЛУ4енме кода костм 
+5У > R1 ( R2 ( R3 > R4 > R5 > R6 (' R7 (' > 120 < 120 < 120 > 120 > 120 > 120 ( 120 ;> !:   !:       {  TOSS < R10 r--<>с=::!:Ь:. ( 10К + !: !: !: !: !: .",  ..         " " PIC 18F 1220 U1  1 RAO QRBO 8 2  6 RA1 RB1 7 RA2 RB2  RАЗ RВ3 .......4..- RA4 RВ4 10 4 #МCLR RB5 11  OSC1  RB6 12 ......1L OSC2 > RB7 13 :;:::::::: С1 С4 'f 1.0 uF It) 0.1 uF "::'" 8 8 .. 8 8 8 8 8 Рис. 6.11 . RAf')(':И Пf1АJl.hlJl.УЩАЙ r:XAMhI (r:M. f1ИС. n 1 ()) с никnй r:АоР.r:ТnИМnСТЫ{1 N N R6 360 ::::1 '"о := :: (1) ::с (1) ::с := (1) :: := :>: '"о о :>: о ::с .а о :::J :::J (1) '"о о l;tI 'i:j n 00 
rnaBa 6. СnецнФнкацнн аппаратных Cpe.u.CTB семейства PI С 18 213 6.3. Введение в прерывания Прерывани исnользуютс во MHorHX nРИКJlа,о,ных npOrpaMMax Д1l орrаннзаu.LI1L11 nОЧ1L11 Bcero, кроме caMoro npocToro, ввода  вывода. Семейство PIC18 имеет Ава базо l3ых YPOBH прерываннй: НИ3КОnРИОРLl1тетное nрерывание, вектор KOTOporO раСllOло>кен в памяти npolpaMM по адресу ОхООО018, и ВЫСОКОnРLl10ритетное npepbIBaHLI1e, вект.ор KOToporo расположен в nамти nporpaMM по а,о,ресу ОхОООО08. nРИОРLl1тет nрерывания имеет зна4ение только тоrда, коrда 06а npepbIBaHLI1 nроисходт одновременно LI1, в таком СЛУ4ае, ВЫСОКQnриоритетное nрерывание 06служнваетс ИЛLl1 06ра6атывается первым. Высокоnриоритетное nрерывание 6удет всеrда nрерыватъ НИЗКОПРLl10ритетное nреРЫl3ание. nрерывание влетс ли60 аппаратным, Jlи60 nporpaMMHbIM с06ытием, которое LI1ниu.LI1ализируетс, коrда 06раw,ение к срункu.LI1И npepbIBaeT выnолнемую в HacTow,ee BpeM nporpaMMY. В СИJlУ Toro, 4ТО npepbIBaHHe вызывает срункu.LI1Ю, Т04ка npepbIBaHLI1 nOMew,aeTc в nроrраммный стек, так 4ТО возврат возвратнт уnравлеНLI1е к Т04ке npepbI вания 13 KOHu.e Функu.ии 06ра60ТКИ nрерываннй. Функu.иlO, вызываемую nрерыванием, часто называlOТ СРункu.ией 06служиваНLI1 nрерывани (ISF) или nроu.еАУРОЙ оБСЛУ>КLI1ва НLI1Я rlрерывани (ISP). В семействе PIC18 только две такие срункu.ии с неnосредствен ным доступом Moryт сраКТН4ескн cyw,ecTBoBaTb в системе, потому 4ТО доступны ТOJlIКО Ава вектора npepbIBaHH. Вектор nрерывани - зто а,о,рес nроu.едуры 06СЛУ>КLI1вани' nрерывани. Как в CJlY4ae низкоnриоритетноrо, так и ВЫСОКОnРИОРLl1теТlюrо прсрыва ни, nроu.едура 06служиваНLI1 npepbIBaHH опредеJlет nРИ4ИНУ или ИСТ04НИК npepbIBa HH, npoBep 6иты срлаrов nрерывани, которые размеw,ены в раЗЛИ4НЫХ реrистрах уnравлени nрерываними. nодо6ное тестирование срлаrов nрерываний, часто назы вают опросом nрерываний ИJlН пулинrом. Опрос исnользуетс дл Toro, чт06ы распо- ложить по приоритетам множественные npepbIBaHH, отсыла их либо на высокоnри ОРLl1тетный, ли60 на НИЗКОnРLl10ритетный вектор nрерывани. Коrда микроконтроллером 06наружено nрерывание, соответспзую1:ций бит раз решени rл06альноrо nрерывани 04иw,аетс, 6локиру тем самым прерываНLI1Я рашю ro ИЛLl1 60лее НLI1зкоrо ypOBH. ЕСЛLl1 произойдет высокоприоритетное npepbIBalle, то' HLI1KaKOe друrое npepbIBaHHe не 6удет возможным до тех пор, пока бит разрешеНLI1Я IJIO 6альtюrо прерыlJЭНН не 6удет установлен, 4ТО нноrда может выnолнтьс E3HYТPLl1 11pO rpaMMbI 06ра60ТКН nрерывани. Если nронсходит ннзкоnриоритетное прерЫЕ3аНLI1е, эrо оно может 6ыть npepBaHo высокоnриорнтетным nрерыванием. Биты уnравлеНLI1 npe pЫBaHHMH размеw,ены в perHcTpe INTCON и perLl1CTpe RCON, Hapдy с друrими 6L11тами уnравлени, (см. рис. 6.12). Все версии МLI1КРОКОНТРОЛJlеров PIC18 имеют реrистры INTCON LI1 RCON (уnраВJlение с6росом). PerHcTp уnравлени с6росом указывает co стояние раЗЛИ4НЫХ THnoB с6росов в системе, он так>ке ИСnОJlьзуетс Д1l Toro, 4тобы разрешать только высокоnриоритетные npepbIBaHH (IPEN = О) или высоко  и НLI1ЗКО прноритетные npepbIBaHH (IPEN = 1). 3тот реrистр также nроверется с тем, чтобы оnрсделнть, какой с6рос произошел, если nporpaMMa должна оnределнть тип сброса. THnoBoe использование ннсрормаu.ИLl1 о с6росе заКЛЮ4аетс в оnределеНLI1И Toro, вл eTC JlH перезапуск "холодным" или "rОр4ИМ". "Холодный" перезапуск СЕ3зан с BKJlIO- чением наnряжени nитанн снстемы, а "rОр4ИЙ" может иннu.LI1аJlизироватьс с6росом по сторожевому таймеру HJlH с6росом по 4aCTH4HO потере nнтани. 
214 Прнменение микроконтроллеров PIC18 INТCON GIE/GIEH О GIE/GIEH 1 PE1.E/GIEI, О PEIE/GIEL 1 TMROIE О TMROIE 1 INTOIE О INTOIE 1 RВШ=О RBIE=I TMROIF=O TMHOIF=l INTOIF О INTOIF 1 RBIF=O RBIF=1 IPEN=O IPEN=l LWRT=O LWRT=l =o R1- = 1 !FG =0 -'!'{) =1 .р&=о .р.& =1 .рен =0 -P9R =1 вен =0 BGR =1 GIE PEIE ТМROIE INТOТE RВШ ТМROIF INTOIF RBIF GIЕИ GIEL OTKnqaeT все rrрерваНИR коrда IPEN = О; OTKnqaeT BCOKO npMopMTeTHe npepBaHMR, коrда IPEN = 1 Разреwает все BcoKonpMopMTeTHe nрерваНИR, KorAa IPEN = 1; разреwает HeMaCKMpOBaHHe npepBaHMR, KorAa IPEN = О OTKn4aeT все nрерванмя? KorAa IPEN = о; Откnчает Irn3KO npMopMTeTHble npepBaHMR KorAa IPEN = 1 Разреwает все HM3KonpMopMTeTHe npepBaHMR, KorAa IPEN = 1; Разреwает HeMaCKMpOBaHHe rrpepBaHMR, KorAa IPEN = О OTKnqaeT rrрерваНИR rro neperronHeHM TaMepa О Разреwает nрерываНИR rro nepenonHeHM TaMepa О OTKnqaeT npepBaHMR от BBoдa INTO Разреwает npepBaHMR от INTO OTKnqaeT npepBaHMR по M3MeHeHM COCTORHMR порта В Разреwает nрерваНИR по M3MeHeHM COCTORHMR порта В TaMep О не nepenOnHMnCR TaMep О nepenOnHMnCR (AoneH 6Tb c6poweH nporpaMMHO) Прерванме от BBOAa INTO не npOMCXOAMnO. Прерванме от BBOAa INTO npoM30wno (AonHo 6Tb c6poweHo nроrраммно) Прерванме по измененм COCТORHMR BBOAOB порта В не npo изоwnо Прерванме по изменени СОСТОRНИR BBOAOB порта В npoM30wno (по KpaHe мере COCTORHMe OAHoro М3 BBOAOB HB4HB7 M3MeHM- nOCb) OTKnqaeT nриоритетне npepBaHMR. Разреwает npMopMTeTHe nрерваНИR OTKnqaeT та6nиqну заnись во BHYTpeHH naMRTb nporpaM Разреwает Ta6nMqHY заnись во BHYTpeHH naMRTb nporpaM КомаНАа RESET 6ыna BnOnHeHa (nроrраммное 06есrrеqение AOnHO установмть  nocne KOMaHA RESET) КомаНАа RESET не BnOnHRnaCb TaMaYT WDT C6poweH BKnqeHMeM nMTaHMR, CLRWDT иnи SLEEP BnonHeHa комаНАа SLEEP C6poweH вкnqением nмтаНИR или CLRWDT C6poweHa с6росом по вкnчени nитаНМR (AoneH 6Tb устанон.' neH nporpaMMHO nocne с6роса по вкnченм nMTaHMR) С6рос по Вклqенм nитаНМR не nромсходил Промзоwел с6рос по 4aCTM4HO потере rrитаНИR (Аолен 6Tb yC тановлен rrроrраммно) С6рос rrO qaCTM4HO rrOTepe rrитаНИR не rrРОИСХОАМЛ Примеqание: ункuионаnьное назнаqение бита LWRT MoeT различаТЬСR в разлиqнх верСИRХ PIC18. Рис. 6.12. PerHCTp уnраВJlення с6росом н nрерываннямн (ОКОН4анне) 
rnaBa 6. Спецнфнкацнн аппаратных Cpe.u.CT8 семейства PIC 18 215 Коrда npepbIBaHLI1e разрешено MHKpOKOHTpOJlJlepOM, оно мо>кет ПРОНСХОДLl1ТЬ в лlO 60 Т04ке nporpaMMbI. V1зза np0Ll13BOJlbHOrO характера прерываннй, все реrистры, LI1C nользуемые nроu.едуро 06служнванн прерываНLI1Я, ДОJlЖНЫ 6ыть nредварнтельно co хранены, в npoTHBHOM CJlY4ae лю6ые нх LI13MeHeHH в nроu.едуре 06СЛУЖLl1вани npepbI BaIlLl1 изменит ход выnолнення nporpaMMbI, KOTopa 6bIJla npepBaHa. npH LI1СnОЛЬ30I3а НИLl1 Ассем6лера зто тре6ует HeKOTOpo ра60ТЫ, на 3ЫKe же С, 60ЛЬШИНСТВО оnераци по coXpaHeHLI1IO данных вЫnолнетс KOMnHJlTOpOM. (Т04ное сохранение COCTOHLI1 для npepbIl3aHLI1 определено в KOHu.e срала .Ikr cpaJla). V1MeIOTc, однако, СЛУLIaLl1, коr.п.а nporpaMMa ДОJlжна все же coxpaHTb perHcTpbI LI1 на 3ЫKe С. РеlИСТРЫ, nереLlислеllные в та6л. 6.6, сохранIOТСЯ структурой 06СJlУЖLl1ваНLI1 прерываннй комnнлтора 3ЫKa С. В зтой Ta6JlLl1u.e не указан perLl1CTp nронзведенн (РАОО), ПОТОМУ 4ТО зтот реrистр lIе со- xpaHeTC автомаТИ4ескн. ECJlH nроu.едура 06служнванн прерывани нсnользует pe rLl1CTp nрОLl1зведеНLI1 LI1ЛН perLl1CTpbI Ta6JlLl1u., то OHLI1 должны 6ыть I3HЫM 06раЗ0М coxpa нены, нна4е nроu.едура 06СJlУЖLl1ваНLI1Я npepbIBaHH нзменнт ХО,lJ, BbInOJlHeHLI1 nporpaMM Horo 06есnе L lения. nримером 3Toro может 6ыть СJlУ4ай, коrда npepbIBaHLI1e происходит после выполненн команды YMHO>KeHLI1, но npe>KДe, 4ем perLl1CTpbI PRODL и РАООН 6y дут сохранены. ЕСЛLl1 nроu.едура 06СJlУЖLl1вани npepbIBaHLI1 нсnользует реrистр PRODL НЛLl1 РАООН, то соответствуюw,LI1е зна4ени изментс в nporpaMMe, KOTopa 6ыла I1pe рвана. Таблица 6.6. Реrистры, которые аl3томаТLI1чески coxpaHIOTc на 3ЫKe С при nрерЫl3ании Ресурс Описание РС WREG STATUS BSR FSRO FSR1 FSR2 ААресует KOMaHA DpoMeYTOqHe nepeMeHHe Бмт условм B60p 6анка nаМRТИ Указатель на naMRTb AaHHX Указатель на стек AaHHX Указатеnь фрема  npLl1Mep 6.13 nOKa3bIBaeT, как сохраннть perLl1CTp РАОО LI1ЛLl1 та6ЛИ4НЬЮ реrис-,ры 13 проu.едуре 06служнванн прерываНLI1. nроu.едура MyHighlnt coxpaHeT реrистр РАОО, а проu.едура MyLowlnt сохраняет perLl1CTpbI, LI1СnОJlьзуемые матемаТН4еской 6и6лиотекой. ECJlH срункu.ня, которая B03BpaUJ,aeT 16-разряднуlO nepeMeHHYIO, BЫ3ЫBaeTC И3 проце дуры 06СJlужнвання nрерывання, то perHCTp РАОО должен 6ыть сохранен, а если CPYHK цИЯ возвращает 24-разр,lJ,НУIO HJlH 32разрднуlO nеременную, то ceKu.LI1 "MATHOATA" должна 6ыть сохранена. ECJlLl1 CPYHKu.LI1 B03Bpaw,aeT 8-разрдные данные ИЛLl1 не B03 Bpaw,aeT ннкакнх данных, то ннкакне cneu.Ha1lbHbIe действн по сохранению контекста не тре6уютс. Должны 6ыть nРНJlожены все YCHJlH AfI Toro, 4т06ы сделать nроцедуру 06СJlужнваНLI1 npepbIBaHH TaKO короткой LI1 npocTo, насколько зто возможно. 06рати те вннманне, 4ТО CTaHдapTHa BepCLl1 cpaJla .Ikr уже coxtJaHeT perHcTp РАОО при npe pblBaHHLI1. Пример 6.13 #pragma interrupt MyHighInt save=PROD #pragma interruptlow MyLowlnt save=section("МATHDATA") #pragma interrupt Highint save=PROD, save=section("МATH DАТА") 
216 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 INТCON2 H&PU=O RBPU =1 INTEDGO = О INTEDGO =1 INTEDG1= О INTEDG1 = 1 INTEDG2 = О INTEDG2 =1 TMROIP О TMROIP = 1 RBIP=O RBIP=l IEECВJ MIP I HarpY3KM порта В за6локмрован Наrрузкм порта В раз6nокмрован INTO nepeKn4aeTcR по oTpMuaTenbHoMY перепаду INTO nереклqаеТСR по nоnомтельному nepenaAY INT1 nереКЛ4аеТСR по отрмuательному nepenaAY INT1 nepeKn4aeTcR по nоломтельному nepenaAY INT2 nepeKn4aeTcR по OTpMuaTenbHoMY перепаду INT2 nepeKn4aeTcR по nonoMTenbHoMY перепаду Прмормтет npepBaHMR от TaMepa О = HM3KM Прмормтет npepBaHMR от TaMepa О = BЫCOKM Ормормтет npepBaHMR по измененм порта В нмзки Прмормтет npepBaHMR по M3MeHeHM порта В = BCOKM Рис. 6.1 З. PerHCTp INTCON2 nреДnОJlОЖLl1М, что счетчнк (count) ,lJ,ол>кен HHKpeMeHTHpOBaTbC в naMTH кажды раз, KOrAa снrнал 04ень короткой ,lJ,JlLl1тельности nрLl1ХОДИТ на АВО (ВХОД INTO). 3тот сиr нал достаТ04НО ,lJ,JlLl1HeH, 4т06ы вызвать npepbIBaHHe, но 4ерез несколько микросекунд, " он возвраw,аетс в состоянне лоrLl14еско eAHHHu.bI, так 4ТО nporpaMMHoe 06есnе4ение не BcerAa cnoc06HO 06наружить зтот сиrнan. Вывод INTO nредставлет c060 I3ход с nереКЛlO4ением по перепаду СLl1rнала. Пока BpeM HapaCTaHLI1 сиrнала достаТ04НО Д1l раСllознаваНLI1 микроконтроллером как перепад CLl1rHaJla, 6удет npOLl1CXOAHTb npepbIBa HLI1e. MLI1HHMaJlbHa ,lJ,Jlительность импульса должна 6ыть не менее 25 нс. nрерывание LI1сnользуетс AfI ВЫnОJlнени зтой зада4И В СLl1ЛУ Toro, 4ТО CLl1CTeMa ДОJlжна так>ке 6ыть cnoc06Ha BbInOJlHTb и друrие за,о,а4И, помимо КОНТРОJlЯ СLl1rнала, nрнложенноrо к АВО. Пример 6.13 nOKa3bIBaeT nporpaMMY на языке С, тре6уемую AfI Toro, 4т06ы нниu.LI1аЛLl1- ЗИРОЕ3ать ВЫВО,lJ, АВО как ВХОД INTO, KOTOpЫ вызывает высокоnриоритетное прерыва HLI1e. 06ратнте BHHMaHLI1e на то, 4ТО ВХОД INTO может вызывать только высокоnриоритет- ное npepbIBaHLI1e. Рис. 6.13 показывает содержаНLI1е perHcTpa INTCON2, KOTOpЫ вы6и рает уровень nереKJlЮ4ення по перепаду сиrнала AfI вывода INTO. Пример 6.14 ADCON1 = OxOF; TRISB = 1; RCONbits.IPEN = 1; 11 06ЪRвляет BBOA порта UMpOBMM 11 06ЪRВnRет НВО ВХОАОМ 11 IPEN = 1 INTCON2bits.INTEDGO = о; INTCONbits.INTOIE 1; INTCONbits.GIEH = 1; 11 06ЪRВЛRет INTO nереКЛ4ае по отриuательному nepenaAY // активмрует INTO // разреwает всокоnриормтетные npepBaHMR 11 INTO ceqac nОАrотовлен и актмвен 
['пава 6. Спецнфнкацнн аппаратных сре)].ств семейства PIC 18 217 npLl1Mep 6.14 проrраммирует АВО порта В как BXOДHO Выво,lJ, порта LI1 06ъвлет Вывод INTO ВХОДОМ ОТРLl1u.ательноrо CHrHaJla npepbIBaHH. nОСJlедня команда разреша ет npepbIBaHLI1 TaKLI1M 06раЗ0М, 4т06ы npH повленнн нмnульса на INTO пронсходило ВЫСОКОnРLl10ритетное прерыванне. Как У>Ке YnOMLI1HaJlOCb, а,о,рес вектора преРЫlЗани ДЛЯ BbIcoKOnpHOpLl1TeTHOro npepbIBaHH HaXOДHTC в 4ейке naMTH nporpaMM ОхООО8. npLl1Mep 6.15 показывает, как HanLl1CaTb nporpaMMY, KOTopa нсnользует высокоnрнори тетное npepbIBaHLI1e. Он так>ке демонстрнрует оnредеJlенне HLI13KOnpLl10pLl1TeTHOro npepbI вани. Первое, 4ТО присутствует в показанной nporpaMMe  зто прототип nроцеАУры 06СЛУЖLl1вани npepbIBaHLI1, за которым следуют два оператора nсевдокомментари #pragma, определюw,их содержимое высокоnриоритетноrо вектора nрерывани как npepbIBaHLI1e. Как оператор #pragma interrupt MyHighlnt (LI1деНТИСРLl1ЦLl1рует MyHighlnt как nроцедуру 06СЛУЖLl1вани npepbIBaHLI1), так и оператор #pragma code.highvector = ОхО8 (LI1деl-IТИСРИЦLl1рует расположение вектора nрерывани) ВЛlOтс не06ходимыми. One ратор GOTO должен 6ыть оператором AcceM6Jlepa BHYТpLl1 вектора. Остальна 4асть nporpaMMbI довольно ПрМОЛLl1нена, за LI1СКJlЮ4еНLI1ем Toro, 4ТО оператор #prama code ДОЛЖGН nРLl1сутспювать nepe,lJ, nporpaMMHbIM кодом, KOTOpЫ исnользует прерывани, LI1Ha4e КОМnИJlu.LI1 не 6удет корректноl1 Кроме Toro, CJle,lJ,yeT У4есть, 4ТО только один 6L11T может 6ыть изменен одновременно в perLl1CTpe INTCON, нна4е результаты 6удут неnредсказуемы. Кюкдый раз, коrда на входной Вывод INTO поступает ОТРLl1u.ательны перепад сиr нала, BЫ3ЫBaeTC CPYHKu.LI1 06ра60ТКН BbICOKonpLl10pLl1TeTHbIX nрерывани. 3та CPYHKu.LI1 LI1MeeT только две команды. Одна LI1нкрементирует счетчик, который С4итает отрLl1ца- тельные nepena,o,bI BXO,lJ,HOrO СLl1rнала, а BTopa 04ищает заnрос nрерывани, pa3Mew,eH ный в 6ите INTOIF (срлажок npepbIBaHLI1 INTO) реrистра INTCON (реrистр управления npepbIBaHLI1MLI1). Еслн не 04НСТНТЬ 6L11T INTOIF, то ннкакне друrне npepbIBaHLI1 по INTO не nРОНЗ0ЙДУТ. Пример 6.15 1* * npMMep BCOKonpMopMTeTHoro npepBaHMR *1 , tinclude <p18cxxx.h.> /* Установмть 6MT KOHMrypaUMM  Установмть RC reHepaTOp OTKn4MTb CTopoeBO TaMep ОТКЛ4МТЬ нмзковольтное nроrраммированме OTKnqMTЬ с6рос по 4aCTMqHO потере nMTaHMR Разреwмть 06 с6рос *1 tpragma tpragma tpragma tpragma tpragma config OSC config WDT config LVP con fig BOR config MCLRE RC OFF OFF OFF ON 70id MyHighInt (void); void MyLowlnt (void); 1I npOTOTMn npoueAYP 06сnумванмя 11 npepBaHM tpragma interrupt MyHighlnt tpragma code high_vector=Ox08 11 MyHighlnt  зто npepBaHMe /1 high_vector - зто вектор по аАресу Ох08 
218 ! '). ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 ':р' ,:. нА void high_vector (void) asm GOTO MyHighInt endasm } #pragma interruptlow MyLowlnt #pragma codc lowvector = Ох18 void low vector (void) asm GOTO MyLowInt endasm 11 AaHHe в naMRTM AaHHX int count; 11 BcoKonpMopMTeTHoe npepBaHMe i!\Ai; r!j. II MyLowlnt  зто прерыванме 11 low vector . зто вектор по адресу Ох18 #pragma code 11 зтот оператор Аолен здесь npMcYTcTBO вать, мна4е nporpaMMa не 6УАет корректно cKoMnMnMpoBaHa void MyHighInt (void) { count++; INTCONbits.INTOIF о; } void MyLowlnt (void) { 11 оqистка nara INTOIF } 11 main program 11 06ра60тка нмзкоnриормтетноrо nрерваНИR Ha4MHaeTCR 3Аесь void main (void) ADCON1 = OxOF; TRISB  1; count = о; RCONbits.IPEN = О; INTCON2bits.INTEDGO = о; INTCONbits.INTOIE = 1; INTCONbits.GIE = 1; 11 06ЪRвляет BBOA порта uмфровм 11 06ЪRВnRет RBO ВХОАОМ 11 заnуск С4еТ4мка с О 11 IPEN = О (только BcoKonpMopMTeTHoe 11 npepBaHMe BKn.) 11 06ЪRВЛRет INTO nepeKnqaeMbW по 11 отрмuательному nepenaAY смrнала 11 разреwает INTO 11 разреwает npepBaHMR 1I 3Аесь ВЫnОЛНRеТСR АальнеwаR инмциаnизаUМR while (1) { 11 rлавн nporpaMMH uикл 
rnaBa 6. Спецнфнкацнн аппаратных сре)].ств семейства PIC 18 219 Существуют так>ке друrне perHCTpbI, nOMHMo RCON, INTCON, н INTCON2, предна- значеНllые ДJl управлеНLI1Я прерываннмн МLI1КрОКОНТрОJlлера. 3TLI1 друrие реrистры вы6L11рают уровнн ПРНОРLl1тета н указывают COCTOHHe друrLl1Х прерываний в сис.roме. Рис. 6.14 LI1ЛЛЮСТРLl1рует perHcTp ynpaBJleHLI1 номер TpLl1 (INTCON3). Как LI1 INTCON2, ре- rLl1CTp INTCON3 содержнт 6L11TbI YCTaHOBKLI1 прнорнтета прерываНLI1Й, 6L11TbI разрешеНLI1Я прерыванн, а также 6нты COCTOHLI1 выводов ДJl ВВО,lJ,а прерываllИЙ. ECJlH в снстеме НСПОJlьзуетс TOJlbKO однн прнорнтет nрерываНLI1Я, то зто rlpcplk BallLl1e должно 6ыть высокопрнорнтетным. В зтом СJlучае GIEH 6ит 4асто помечается как GIE (разрешенне rл06аJlы-юrо npepbIBaHH), а 6нт GIEL HrHopHpyeTC. Чт06ы вы6ирюъ ОДLl1I1 уровень ПРLl10РLl1тета AfI nрерываНLI1Й, nOMeCTHTe ноль в 6L11T IPEN. ВстречаlOТС СЛУ4ан, коrда жеJlатеJlЬНО разреwать npepbIBaHH нзнутрн nроu.едуры 06ра60ТКН npe pbIBaIlLl1. Чт06ы сделать зто, устанаВJlLl1вайте 6нт GIEH HJlH GIEL6HT В зтой проu.едуре. nредnоложнм, 4ТО трн входа npepbIBaHH свзаны с INTO (непроrраммируемый вывод), INT1 LI1 INT2. Все трн npepbIBaHH YCTaHOBJleHbI как ВЫСОКОПРLl10рнтетные. Все OHLI1 nереКЛlO4аlOТС отрнu.ательным перепадом входноrо снrнала. nporpaMMa 06ЪВJlе НLI1Я LI1 aKTLI1BLI1pOBaHH нх nоказана в npLl1Mepe 6.16. 06ратите вннмание на то, как TeCTLI1 PYIOTC 6L11TbI IF, с тем, 4т06ы HanpaBHTb nporpaMMY на nравнлЫ.tУю проu.еАУРУ 06ра60ТКИ nрерываннй AfI трех разных входных WTbIpbKOB. В 3TO проrрамме INTO LI1MeeT самый BЫCOKH npHopHTeT, а INT2 - caMЫ HH3KH.  INTCON3 INT2IP INT 1 IP INT21E INТlIE INT2IF lNfllF IN'I'2IP О Ормормтет BBOAa INT2 HM3KM INT2IP 1 DpMopMTe'r BBOAa INT2 BCOKM INTlIP О Ормормтет BBOAa INT1 HM3KM INTlIP 1 Прмормтет BBOAa INTl BCOKM INT2IE О заnреает npepBaHMe INT2 INT2IE 1 разреwает npepBaHMe INT2 INTlIE О заnреает npepBaHMe INT1 INTlIE 1 разреwает nрервание INT1 INT2IF О INT2 не возникnо INT2IF 1 INT2 вознмкnо ( AOnHO 6Tb c6poweHo nроrраммно) INTlI F О INT1 не возникnо IN'l'lIF 1 INT1 вознмкло (AonHo 6Tb c6poweHo nроrраммно) Рис. 6.14. PerHCTp упраВJlенн npepbIBaHHMH номер трн Пример 6.16 /* * nриормтет MHoeCTBeHHX nрервани *1 linclude <p18cxxx.h>. 1* Установмть 6MT конфмrураuми  Установмть RC reHepaTOp  OTKn4MTb CTopoeBO TaMep ОТКЛ4МТЬ нмзковольтное nporpaMMMpOBaHMe 
220 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 *  *  OTKn4MTb с6рос по 4aCTMqHO потере nMTaHMR Разреwмть 06M с6рос *1 #pragma config OSC RC #pragma config WDT OFF #pragma config LVP OFF #pragma con fig BOR OFF #pragma config MCLRE ON void MyHighlnt (void); #pragma interrupt MyHighlnt #pragma code highvector = Ох08 void highvector (void) { asm GOTO MyHighInt endasm } #pragma code void IntO (void) { INTCONbits.INTOIF = о; // с6рос лаrа INTOIF 1I 3Аесь BnOnHReTCR nроrрамма 06cnYBaHMR INTO } void Int1 (void) INТСОNЗЬits.INТ1IF о; 1/ с6рос флаrа INT1IF I1 3Аесь BnOnHReTCR nроrрамма 06сnумванмя INTl } void Int2 (void) INТСОNЗЬits.INТ2IF = о; 1I do INT2 software here 11 с6рос флаrа INT2IF void MyHighInt (void) 11 nулмнr ВХОАОВ npepBaHM if (INTCONbits.INTOIF IntO () ; 1) I 1 самое всокоnрморм'rе'I'lюе nрерывание else if (INТСОNЗЬits.INТ1IF Int1 () ; 1) IlcneAyee по npMopMTeTY else if (INТСОNЗЬits.INТ2IF Int2 () ; 1) 11 самое нмзкопрмормтетное nрерыванме 11 rnaBHaR nроrрамма void main (void) { ADCON1 == OxOF; TRISB = 7; 11 06ъявление WTыpbKOB порта UMpOBM 11 06ЪRвnенме RBO, RBl м RB2 входамм RCONbits.IPEN 1; 11 IPEN = 1 
rnaBa 6. Спецнфнкацнн аппаратных сре)].ств семейства PIC 18 221 INTCON2bits.INTEDGO О; INTCON2bits.INTEDG1 О; INTCON2bits.INTEDG2 о; INTCON3bits.INT1IP = 1; INTCON3blts.INT2IP = 1; INTCONbits.INTOIE = 1; INTCON3bits.INT1IE 1; INTCON3bits.INT2IE = 1; INTCONbits.GIEH = 1; // 06ЪRвnенме INTO nерекnqаемьш по // oTpMuaTenbHoMY nepenaAY CMrHana // 06ЪRвnенме INT1 nepeKnqaeM /1 по oTpMuaTenbHoMY nepenaAY CMrHana 11 06ЪRвnенме INT2 nерекnqаемьш 1/ по oTpMuaTenbHoMY nepenaAY CMrHana // 06ъявnенме INT1 всокоnрмормтетньш // 06ЪRвnенме INT2 всокоnрморитетнм /1 разрешенме INTO // разрешенме INT1 1/ разрешенме INT2 II BbInOnHeHMe ApyrMx onepaUM мнмuмаnмзаuмм // разрешенме всокоnриормтетнх npepbIBaHM while (1) { II rnaBH nporpaMMH UMKn Каждое внутреннее перLl1срерLl1йное устройство LI1MeeT TpLl1 6L11Ta в трех разных ре- rLl1CTpaX, 06eCne4L11BalOw,LI1e управлеНLI1е ра60ТОЙ каждоrо перLl1срерLl1йноrо устройства в структуре прерываНLI1Й. V1MeIOTc perLl1CTpbI IPR, устанаВЛLl1ваlOw,LI1е ПРИОРLl1теты npepbI ваНLI1Й, perLl1CTpbI PIE, устанаВЛLl1ваlOw,LI1е 6L11TbI разреwеНLI1 nрерываНLI1Й, а также perLl1CT ры PIR, содержаw,LI1е 6L11TbI срлаrов, KGTOpbIe npoBepIOTc с тем, 4т06ы опредеЛLl1ТЬ, Ka кой вход вызвал npepbIBaHLI1e. PLI1C. 6.15...6.17 показываlOТ все 3TLI1 perLl1CTpbI LI1 отражаlOТ ра60ТУ каждоrо 6L11Ta управлеНLI1/СОСТОНLI1. I Как можно BLI1AeTb на 3TLI1X трех pLl1cYHKax, LI1MeeTC MHoro bhytpel-IНLI1Х перLl1срерLl1Й ных устройств, которые MoryT 6ыть LI1сnользованы в CLl1CTeMe, OHLI1 BКnlO4alOT таймеры, аналоrОЦLl1СРРОВОЙ пре06разователь (АЦn), встроенный УНLI1версальный aCLl1HXpOH HO/CLl1HXpOHHbI npLl1eMHLI1K/nepeAaT4L11K (EUSART LI1ЛLl1 USART) LI1 Т.д. Cyw,ecTByeT также MHoro ApyrLl1x TLI1nOB прерываНLI1Й. rлава 8 nocBw,eHa 06суждеНLI11О прерываНLI1Й LI1 LI1X ис пользоваНLI1IО во встроенных CLl1CTeMax. Самый простой npLl1Mep CLl1CTeMbI npepbIBaHLI1  зто СLl1ПШЛLl1заЦLl1Я. 3Т01 ТLI1П npe pbIBaHLI1 влетс НLI1ЗКОПРLl10РLl1тетным npepbIBaHLI1eM. nOA06Hoe прерыuш ILI1e не СJlуча eTC 4асто LI1 может ждать 06СЛУЖLl1ваНLI1. 3лектронна схема ДЛ 3Toro TLI1na npepbIUaHLI1 составлетс LI1З переКnlO4ателей, nOMew,eHHbIx на каждой ABepLl1 LI1 каждом окне. V1c nО1IЬЗУЮТСЯ переКЛlO4атеЛLl1 TLI1na SPST (ОДНОПОЛlOсные одноходовые), предстаВЛIOw,LI1е с060Й AaT4L11KLI1 6ЛLl1ЗОСТLI1, 06Ы4НО LI1СПОЛЬЗУIOw,LI1е MarHLI1THbIe КnI04L11. KorAa маП-ILI1Т распо ложен 6ЛLl1ЗКО к переКnlO4ателlO, то послеДНLI1Й замыкается, а npLl1 удалеНLI1L11 маПILl1та, nереКЛlO4атель размыкаетс. MarHLI1T установлен на ABepLl1 LI1ЛLl1 окне, а nереключатеJН) установлен, HanpLl1Mep, на OKOHHO раме. 
222 Применение микроt<ОнтрОЛJJеров PIC 18 IPRl PSPIP ADIP RCIP TXIP » SSPIP = CCP1IP TMR21P TMRlIP OSCFIP CMIP  EEIP BCLIP HLVDIP TMR3IP ECCP1IP = PSPIP ADIJ> RCIP TXIP SSPIP ССР I IP TMR2IP TMR IIP npepBaHMe 4теНИR/заnмсм BeAOMoro napannenbHoro порта (О = HM3KM npMopMTeT, 1 = BCOKM npMopMTeT) npepBaHMe АЦО(О = HM3KM npMopMTeT, 1 = BCOKM приоритет) npepBaHMe npMeMa EUSART(O = HM3KM npMopMTeT, 1 = BЫCOKM npMopMTeT) npepblBaHMe nepeAa4M EUSART(O = HM3KM npMopMTeT, 1 = BЫCOKM npM opM'r е '1' ) nрервание BeAyero синхронноrо nocneAOBaTenbHoro порта (О = нмз KM npMopMTeT, 1 = BCOKM npMopMTeT) npepBaHMe ССР1 (О = HM3KM npMopMTeT, 1 npepBaHMe COOTBeTCTBMR TaMepa 2 PR2 (О BCOKM npMopMTeT) npepBaHMe по nереnоnнени TaMepa 1 (О = нмзки npMopMTeT, 1 = BCOKM npMopMTeT) BCOKM npMopMTeT) нмзкмй прмормтет, 1 IPR2 OSCFlP CMIP EEIP BCLIP НLVDIP TMR3IP ЕССР llP npepBaHMe по c60 reHepaTopa (О низкм npMopMTeT, 1 = BCOKM npMopMTeT) npepblBaHMe 06ЪRВnRет компаратора (О = нмзки приоритет, 1 B COKM npMopMTeT) npepBaHMe по заnиси в ЭСППЗУ (О = HM3KM nриормтет, 1 = BCOKM npMopMTeT) лрерванме по коnnмзии wин (О = HM3KM приоритет, 1 = BCOKM npMopMTeT) '1 npepBaHMe 06HapyeHMR BcoKoro/HM3Koro HanpReHMR (О = HM3KM nрморитет, 1 = всоки npMopMTeT) npepBaHMe по nepenonHeHM TaMepa 3 (О = низкм приоритет, 1 BCOKM npMopMTeT) npepBaHMe ССР1 (О = HM3KM nриормтет, 1 = BCOKM npMopMTeT) Рис. 6.15. PerLl1CTp IPR (на4ало) 
rnaBa 6. Спецнфнкацин аппаратных сре)].ств семейства PICl8 223 IRXIP WAKIP ERRIP ТХВ2IР 'l'XBnlP TXBIIP TXBOIP RXB1IP RXBnIP RXBOIP FIFOWMIP PSIE ЛDIE == RCIE ТХIE SSPIE == ССРНЕ == ThfR21E = ThfRllE == IPR3 IRXIP ТXB2IP RXВIIP RXВOIP W AКlP ЕRЮР ТXВnlP тхв IIР ТXBOIP RXBnIP FIFOWМIP npepBaHMe по неверному npMeMY CAN (О = HM3KM npMopMTeT, 1 = BCOKM npMopMTeT) npepbIBaHMe по aKTMBMpOBaHM шмны CAN (О = нмзкмй l!РИОРМ'l'е'l', 1 , BCOKM npMopMTeT) npepBaHMe по ошм6ке шмны CAN (О 1 = BCOKM npMopMTeT) npepBaHMe 6yepa nepeAa4M (О = HM3KM npMopMTeT, 1 = npepBaHMe 6yepa nepeAa4M (О = HM3KM npMopMTeT, 1 = npepBaHMe 6yepa nepeAa4M COKM npMopMTeT) CAN transmit buffer О npepBaHMe(O = HM3KM npMopMTeT, 1  высо- KM npMopMTeT) nрервание 6yepa npMeMa CAN, реим О (О BCOKM npMopMTeT) CAN receive buffer interrupt, mode 1 and 2 (О = HM3KM npMopMTeT, 1 = high priorit] npepBaHMe 6yepa npMeMa О CAN, peMM О (О = BCOKM npMopMTeT) npepBaHMe по ypOBH FIFO, peM 1 м 2 (О BЫCOKM npMopMTeT) HM3KM npMopM'l'G'l', 2, CAN, peMM О BCOKM npMopMTeT) CAN , реим О ЮIМ 1 BCOKM npMOpMTeT) 1 CAN (О = HM3KM npMopMTeT, 1 = BЫ HM3KM npMopMTeT, 1 = HM3KM npMopMTeT, 1 HM3KM npMopMTeT, 1 Рис. 6.15. PerHCTp IPR (ОКОН4анне) PIEl PSPIE ADIE RCIE ТХШ SSPlE ССРНЕ TМR2IE ТМRIIE npepBaHMe 4теНМR/заnмсм BeAOMoro napannenbHoro порта (О = HM3KM npMopMTeT, 1 = BCOKM npMopMTeT) npepBaHMe АЦО(О = HM3KM npMopMTeT, 1 = BCOKM npMopMTeT) npepBaHMe npMeMa EUSART(O = HM3KM npMopMTeT, 1 = BCOKM npMopMTeT) nрервание nepeAa4M EUSART(O = HM3KM npMopMTeT, 1 = BCOKM npMopMTeT) npepBaHMe BeAyero CMHxpOHHoro nocneAOBaTenbHoro порта (О = нмз- KM npMopMTeT, 1 = всоки npMopMTeT) npepBaHMe ССР1 (О = HM3KM npMopMTeT, 1 npepBaHMe COOTBeTCTBMR TaMepa 2 PR2 (О BCOKM npMopMTeT) npepBaHMe ПО nepenonHeHM TaMepa 1 (О = HM3KM npMopMTeT, 1 = BCOKM npMopMTeT) BCOKM npMopMTeT) HM3KM npMopMTeT, 1 Рис. 6.16. PerLl1CTpbI разреwеНLI1 прерыванн ОТ перLl1срерLl1ЙНЫХ YCTPOCTB (начало) 
224 ITримененне MHKpOKOHTpOnnepOB PIC 18 PIE2 ОSСПЕ = СМУЕ EEIE BCLIE = HLVDIE == TMR3IE == ЕССР 1 IБ== IЮСШ WAKIE EH..RIE ТХВ2IБ тхвпш ТХВ 1 IE ТХВОШ ЮСВ 1 IE ЮСВпШ RXBOIE FIFOWMIE == OSCFIE СМIБ ЕБIЕ BCLIE HL VDI.E 'IМRЗIE ЕССР 1 IE npepblBaHMe по c60 reHepaTopa (О = HM3KM прмормтет, 1 '" BЫCOKM npM.opM'I'e'l') npepbIBaHMe от компаратора (О = нмзкмй прмормте'l', 1 = BCOKM npMopMTeT) npepBaHMe по заnмсм в ЭСDDЗУ (О = HM3KM nриормтет, 1 = BCOKM npMopMTeT) npepBaHMe по KOnnM3MM шмн (О = HM3KM npMopMTeT, 1 = BCOKM npMopMTeT) npepblBaHMe 06HapyeHMR BcoKoro/HM3Koro HanpReHMR (О = нмзки nрморитет, 1 = BCOKM npMopMTeT) npepblBaHMe по nepenonHeHM TaMepa 3 (О = HM3KM приоритет, 1 = BCOKM npMopMTeT) npepblBaHMe ССР1 (О = HM3KM npMopMTeT, 1 = BCOKM nрморитет) PIE3 IRXIE WAКIE ERRlE ТХВ2Щ ТХВ l]E ТXBOIE RXBlIE RXВOlE ТХВпШ RXBn1E !FIFOWMlE npepBaHMe по неверному npMeMY CAN (О = HM3KM npMopMTeT, 1 7 BCOKM npMopMTeT) npepBaHMe по актмвированм шины CAN(O = низкм nриормтет, 1 '" BCOKM npMopMTeT) npepBaHMe по ошм6ке шмн CAN (О HM3KM npMopMTeT, 1  BCO KM npMopMTeT) I npepBaHMe 6yepa nepeAa4M 2, CAN, peMM О (О HM3KM nрмори тет, 1  BCOKM npMopMTeT) npepBaHMe 6yepa nepeAa4M CAN, peMM О им 1 (О = нмзки npM ормтет, 1  BЫCOKM npMopMTeT) npepBaHMe 6yepa nepeAaqM 1 CAN (О = нмзкмй прмормтет, 1 BCOKM npMopMTeT) CAN transmit buffer О npepBaHMe(O = HM3KM npMopMTeT, 1 == B COKM npMopMTeT) npepBaHMe 6yepa npMeMa CAN, peMM О (О HM3KM приоритет, 1 = BЫCOKM npMopMTeT) CAN receive buffer interrupt, mode 1 and 2 (О = HM3KM npMopM тет, 1 = high priorit] npepBaHMe 6yepa npMeMa О CAN, peMM О (О HM3KM npMopM'I'e'l', 1  BCOKM npMopMTeT) npepblBaHMe по ypOBH FIFO, peMM 1 м 2 (О HM3KM nриормтет, 1 = BCOKM npMopMTeT) Рис. 6.16. PerLl1CTpbI разреwеНLI1 npepbIBaHLI1 ОТ перLl1срерLl1ЙНЫХ YCTPOCTB (OKOH4aHLI1e) 
fnaBa 6. Спецнфнкацнн аппаратных сре)].ств семейства PIC 18 225 3леКТРН4еска схема ДЛ зтой снrнальной CLl1CTeMbI npHBOALl1TC на рнс. 6.18. Ко- rда ЛlOбой переКnlOчатель размыкаетс, он вызывает npepbIBaHHe. npou.eAypa CPYIfKu.LI1H обрабОТКLI1 прерываНLI1 заставлет сра6атывать aKycTLI14ecKLI1 СLl1rналнзатор. В данном СJlУLше LI1СПОЛЬЗУIOТС малые наrРУЗО4ные резнсторы порта В с тем, чтобы nОДКЛIO L fLl1ТЬ входной вывод АВ2 порта В к 5 В, так 4ТО, KorAa переКJllOLfaтель разомкнутый, вывод АВ2 noACOeALl1HeTC к 5 В. Вход АВ2 nporpaMMLI1pyeTc как вход INT2 ДЛ MLI1KpOKOH ТРОJlлера PIC18F1220, как показано на данном pLl1cYHKe. Вывод АВ4 nporpaMMLI1pyeTc как выход, 4тобы BКnlO4aTb аКУСТLI14ескнй СLl1rнаЛLl1затор. Кнопка SW6, связанная с UЫlю дом АВ5, СЛУЖLl1Т ДJI BbIКnI04eHLI1 аКУСТLI14еСКLI1Й СLl1rнаЛLl1затор. Е,о,LI1нственный способ ВЫКJllOЧLl1ТЬ аКУСТLI14еСКLI1Й снrнаЛLl1затор COCTOLl1T в том, 4тобы OTКnlO4L11Tb ero 3J1eKTpOnLl1 тш-tLl1е LI1ЛLl1 нажать кнопку сброса TpeBOrLl1, KOTopa может быть rдеЛLl1бо скрыта, LI1ЛН же зто может 6ыть Кn104. Bc cooTBeTcTBYIOw,a nporpaMMa nоКазана в npLl1Mepe 6.17. Эта тревожна CLl1CTeMa может быть BКnlO4eHa в ЛlOбое нное мнкроконтроллерное прнложе HLI1e npLl1 МLI1НLI1мальных трудозатратах. В зтой CLl1CTeMe, как только npepbIBaHLI1 будут разреwены, nporpaMMa остается в беСКОllе4НОМ ЦLl1кnе while. E,o,LI1HCTBeHHoe, 4ТО npoLl1CXOALl1T в ЦLl1кnе так зто проверка со- СТОЯНLI1 KHOnKLI1, свзанно с АВ5, с тем, 4тобы ОТКnIOЧLl1ТЬ тревожнуlO СLl1ПШЛLl1заЦLl1Ю. Однако как после 3Toro BКn104aeTc тревожный СLl1rнал? Тревожный СLl1rнал BКn104aeTc, KorAa npoLl1CXOALl1T npepbIBaHLI1e н разрываетс OCHOBHO u.HКn nporpaMMbI. Это прерыва- HLI1e BКnlO4aeT тревожны CHrHa1l. В KOHu.e процедуры CPYHKu.LI1L11 обра60ТКН IlpepbIBaHLI1, управлеНLI1е возвраw,аетс обратно основному u.HКnY nporpaMMbI, rде тревожный снrнал может быть BbIКnlO4eH, еслн кнопка на>ката. Сторожево TaMep так>ке нспользуетс, потому 4ТО зто не было бы xopowe LI1Aee - нметь nporpaMMY тревожно СLl1rнаЛLl1зацнн, KOTopa моrла бы заВLI1СНУТЬ на неопределенное BpeM в результате СЛУ4айной OWH6KLI1. РSРП: == ADIF = RCIF == ТXIF == SSPIF = CCPIIF = ТМR2IF == ТМRlIF== PIRl PSPIF ADIF RCIF TXlF SSPIF ССРIП: TMR21F TMR IIР npepBaHMe 4теНМR/заnмсм BeAOMoro napannenbHoro порта (О == HM3 KM nрморитет, 1 = BCOKM nриормтет) nрервание АЦО(О = НИ3КИ приоритет, 1 = всоки приоритет) npepBaHMe npMeMa EUSART(O = низки приоритет, 1 BCOKM npM ормтет) npepBaHMe nepeAa4M EUSART(O = HM3KM npMopMTeT, 1 = BCOKM npMopMTeT) npepBaHMe BeAyero CMHxpOHHoro nocneAoBaTenbHoro порта (О = HM3KM npMopMTeT, 1 = BCOKM прмормтет) npepBaHMe ССРl (О = HM3KM npMopMTeT, 1 BCOKM npMopMTeT) npepBaHMe COOTBeTCTBMR TaMepa 2 PR2 (О = HM3KM npMopMTeT, 1 = BCOKM nрморитет) npepBaHMe по nepenonHeHM TaMepa 1 (О = нмзкм npMopMTeT, 1 = всоки nрморитет) Рис. 6.17. PerHcTpbI срлаrов запроса npepbIBaHLI1 от nерLl1срернйных YCTPOCTB (на4ало) 
226 ITрнменение микроroтpmшеров PICl8 .РnU" " ОSСПI = CMIF= ЕEIР= BCLIF = HL VDIF = ", TMR3IF = ECCPIIF = IRXIF = WAКIF= EH.RIF = TXB2IF = l   TXBnIF = ТХВ lIF = TXBOIF = RXBIIF = RXBnIF = RXBOIF = FIFOWMIF = . ..'... . .1fJr....< ...  OSCFlF CMIF EEIF ВСLП; HL VDIF TMR3IF ECCPIIF '1 прерванме по c60 reHepaTopa (О = HM3KM npMopMTeT, 1 = BCOKM nриормтет) прерванме от компаратора (О = HM3KM npMopMTeT, 1 = BCOKM npMopMTeT) npepBaHMe по заnмси в ЭСDDЗУ (О = HM3KM npMopMTeT, 1 = высокий npMopMTeT) npepBaHMe по KOnnM3MM шмн (О = HM3KM nрморитет, 1 BCOKM npMopMTeT) npepblBaHMe 06наруенмя BcoKoro/HM3Koro наnряеНМR(О HM3KM npMopMTeT, 1 = BЫCOKM npMopMTeT) npepblBaHMe по nepenonHeHM TaMepa 3 (О нмзкм nриормтет, 1 = BCOKM npMopMTeT) npepBaHMe ССР1 (О = HM3KM npMopMTeT, 1 = BЫCOKM npMopMTeT) PIR3 ТXB2IF ТХВ 1 IF ТXBOIF RXB 1 IF RXBOIF IRXIF W AKIF ERRlF ТXBnIF RХВпП: FIFOWMIF npepBaHMe по неверному npMeMY CAN (О = низкм npMopMTeT, 1 = BЫCOKM npMopMTeT) npepBaHMe по aKTMBMpOBaHM шмны CAN (О = HM3KM npMopMTe'r, 1 = BCOKM npMopMTeT) npepBaHMe по ошм6ке шмн CAN (О 1 = BCOKM npMopMTeT) npepBaHMe 6yepa nереАаЧМ (О = HM3KM npMopMTeT, 1 = npepBaHMe 6yepa nepeAa4M (О = HM3KM npMopMTeT, 1 = npepBaHMe 6yepa nepeAaqM 1 = BЫCOKM npMopMTeT) npepBaHMe 6yepa nepeAaqM О CAN (О 1 = BCOKM npMopMTeT) npepblBaHMe 6yepa npMeMa CAN, peMM О (О 1 = BCOKM npMopMTeT) npepblBaHMe 6yepa npMeMa CAN, peMMЫ 1 м 2 (О = HM3KM npMopM тет, 1 = BCOKM npMopMTeT) npepBaHMe 6yepa npMeMa О CAN, peMM О (О 1 = BCOKM npMopMTeT) npepBaHMe по ypOBH FIFO, peMMЫ 1 м 2 (О 1 = BCOKM npMopMTeT) нмзкм npMopMTeT, 2, CAN, режИм О BCOKM npMopMTeT) CAN, peMM О MnM 1 BЫCOKM npMopMTeT) 1 CAN (О HM3KM npMbpMTeT, нмзкмй npMopMTeT, HM3KM npMopMTeT, низкм npMopMTeT, HM3KM npMopMTeT, Рнс. 6.17. PerHcTpbI срлаrов заnроса прерывани отnерLl1срерLl1ЙНЫХУСТрОЙСТВ(ОКОН4аНLI1е) 
rnaBa 6. Специфнкацнн аппаратных сре)].ств семейства PICl8 227 TIример б. 1 7 1* * Орерыванме 0'1' C'1'opoeBO CMCTe *1 #inc1ude <p18cxxx.h.> 1* Установмть 6мты KOHMrypaUMM  Установмть RC reHepaTOp Откnючмть CTopoeBO TaMep О'1'КЛЮЧМ'l'Ь нмзковоnьтное nporpaMMMpOBaHMe ОТКnЮ4МТЬ с6рос по 4aCTMqHO потере nмтанмя Разрешмть 06M с6рос *1 #pragma #pragma #pragma #pragma #pragma #pragma config OSC = config WDT = config WDTPS config LVP = config BOR = config MCLRE RC ON = 4 OFF OFF ON void MyHighlnt (void); void MyLowlnt (void); #pragma interrupt MyHighInt #pragma code high_vector=Ox08 void high vector (void) asm GOTO MyHighlnt endasm #pragma interruptlow MyLowlnt #pragma code low vector=Ox18 11 MyLowlnt  зто npepBaHMe 11 low vector  зто вектор по аАресу Ох18 void 10w vector (void) asm GOTO MyLowlnt endasm #pragma code void MyHighInt (void) void MyLowlnt (void) if (INТСОNЗЬits.INТ2IF == 1) { INТСОNЗЬits.INТ2IF  о; PORTBbits.RB4 = 1; 1I зто ВЫВОА INT2 ? I1 с6рос nara INT2IF II BKn4eHMe TpeBorM . I main program ..тоid main (void) 
228 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 J' ADCON1 = OxOF; TRISB = Ох24; PORTB = Охоо; INTCON2bits.RBPU 1; RCONbits.IPEN = 1; INTCON2bits.INTEDG2 = 1; INTCON3bits.INT2IP INTCON3bits.INT2IE о; 1 . , INTCONbits.GIEH = 1; INTCONbits.GIEL 1; while (1) { ClrWdt(); if (PORTBbits.RB5 == О) PORTBbits.RB4 = о; +5V R2 10К f gз R1 3.9К PIC18F 1220 U1  С2 1.0 uF С1 30 pF 11 06ЪRВnRет BBOA порта uмровьшм I1 06ЪRВnRет RB2 м RB5 ВХОАамм 11 06ъявnяет RB4 BXOAOM 1I TpeBora BKn II Зkn. Наrрузок порта В 11 IPEN = 1 11 06ЪRВnRет INT2 nepeKnqaeМbll по 11 nOnOMTenbHOMY nepenaAY CMrHana 11 06ЪRВШIе'I' INT2 HM3KonpMopM'.rec.rHbIM 1I разрешает INT2 11 разрешает BCOKonpMopMTeTHe 11 npepbIBaHMR II разреwает HM3KonpMopMTeTHe 11 npepBaHMR II rnaBH nporpaMMH UMKn II HaCTpOKa тона (HM3KM/BcOKM) I1 кнопка HaaTa 11 TpeBora BKn SW1  о Передняя дверь SW2 SW3 SV'{1 ARM   I SW5 SW4 .....a..- Окно 4 Окно 3  Рис. 6.18. Простая работаюw,а по nреры[анLI1мM сторожевая снетема во взведенном COCTOHLI1L11 
['пава 6. Специфнкацнн аппаратных сре)].ств семейства PIC 18 229 6.4. Друrие BHyтpeHHe перферийные устройства Семейство PIC18 нмеет MHoro BHyTpeHHLI1X перLl1срерLl1ЙНЫХ YCTPOCTB, от таймеров ДЛ СLl1НХрОНLI1заЦLl1L11 соБЫТLI1Й до мноrоканальноrо АЦn ДЛ осуw,ествлеНLI1 выБОРКLI1 aHa лоrовых СLl1П..IaЛОВ. ВВLI1ДУ зна4L11тельноrо 4L11сла BHyTpeHHLI1X nерLl1срерLl1ЙНЫХ YCTPOCTB, некоторые LI1З IШХ представлIOТС в зтом подразделе, а затем OnLl1CbIBaIOTc LI1 LI1СПОЛЬ зуетс в nрLl1кладных nporpaMMax в nослеДУIOw,LI1Х rлавах. В 3TO KHLI1re cpaKTLI14eCKH все BHyтpeHHLI1e перLl1срерLl1йные устройства, в коне4НОМ С4ете, LI1СnОЛЬ3УlOТСЯ в ПрLl1кладных nporpaMMax. Таймеры МLI1кроконтроллер содер>КLI1Т 4етыре LI1ЛLl1 nTb таймеров, которые LI1СnОЛЬ3УlOТСЯ ДЛ peWeHLI1 ра3ЛLl14НЫХ за,о,а4. Некоторые LI1З 3TLI1X зада4 BKJl104atOT nредваРLl1тельное масwтаБLl1роваНLI1е СLl1rналов TaКТOBO 4астоты, reHepLl1pOBaHLI1e СLl1rналов множественных 4астот, LI1НLI1ЦLl1аЛLl1заЦLl1IО npepbIBaHLI1 в спеu.LI1срLl1ЦLl1рованное BpeM LI1 Т.д. 3тот nодраздел представлет таймер 1 Hapдy с ero npepbIBaHLI1eM, 4тобы nРОLl1ЛЛIOСТРLl1ровать LI1СПОЛЬ 30BaHLI1e таймера реальноrо BpeMeHLI1 (АТС). Аанное nрнложеНLI1е LI1ЛЛIOСТРLl1рует полез ность таймера. 3то только ОДLl1Н LI1З BHyтpeHHLI1X TaMepOB, друrLl1е TpLl1 LI1ЛLl1 4етыре тай мера также доступны ДЛ peWeHLI1 ДОnОЛНLI1тельных за,о,а4. Таймер 1  зто 16разрдный таймер, который срУНКЦLl10НLI1рует 13 трех режнмах. На pLl1c. 6.19 показана BHyтpeHH структура таймера 1. Таймер 1 может ра60тать как тай мер, СLl1НХРОННЫЙ C4eT4L11K НЛLl1 как aCLl1HXpOHHbI C4eT4L11K. Таймер  это СЧGТЧНК, рабо таlOw,LI1Й от внутренней тактовой 4астоты командноrо ЦLl1кnа LI1ЛLl1 от внешнеrо входа TaK товой 4астоты. По каждому командному ЦLl1КnУ LI1ЛLl1 nерLl10ДУ BHeWHe тактовой частоты таймер LI1HKpeMeHTHpyeTc, н, еСЛLl1 он nереПОЛНLI1ТС LI1 C6pOCLI1TC в ноль, то 6удет LI1I1L11 u.LI1аЛНЗLl1рован ЦHКn npepbIBaHH. HanpLl1Mep, преДПОЛОЖLl1М, 4ТО BXOДHa TaKTOl3a 4асто- та МLI1кроконтроллера равна 4 Mru., СLI1rналы KOTOPO заставлIOТ таймер LI1HKpeMeHTLI1pO BaTbC ОДLl1Н раз каждуlO МLI1кросекунду, потому 4ТО TaКТOBa 4астота n04TLI1 всеrда дe ЛLl1ТС на 4етыре (KOMaHДHa TaKTOBa 4астота) ДЛ БОЛЬWLI1нства BHyтpeHHLI1X модулей. ВОСЬМLI1разрдны таймер C4L11TaeT от ОхОО до OxFF, а затем c6pa CЫ BaeTC в ноль LI1 начн нает C4L11TaTb снова от нул. npLl1 входной TaKTOBO 4астоте МLI1кроконтроллера, равной 4 мrц, будут rенерLl1роваться npepbIBaHHe ОДLl1Н раз каждые 256 мс. СLI1НХРОННЫЙ С4еТ4НК - зто С4еТ4НК, KOTOPЫ C4L11TaeT HapacTalOw,He срронты СLI1rнала BHeWHero входа тактовой 4астоты, nРLl1ложенноrо к выводу Т1 OSI (АВ7). АСLl1НХРОННЫЙ C4eT4L11K - это С40ТЧLl1К, кпто рый так>ке ра60тает с BHeWHLI1M входом, однако ero BHyтpeHHLI1 C4eT4L11K не CLl1HXpOHH3L11 рован с тактовой 4aCTOTO мнкроконтроллера. В aCLI1HXpOHHOM реЖLl1ме таймер не может использоватьс в onepau.Hx cpaBHeHLI1 НЛLl1 сбора данных. 
230 Прнмененне MHKpOKOHTpOnnepOB PIC 18 ССР триrreр -1'Н" )Р ;.., : !.. ""1\ TМR 10N Таймер 1 16разрядный ОЧlIстка ТМRlIF суммирующнй Тактовая IIрерывание 110 счетчик LlaCTOTa выпоnнению тl SYNC T1OS0 вывод 2 т 1031 ВЫВОД I r J1CS Fosc/4 Внутренняя тактовая частота Рис. 6.19. BHyтpeHH структура TaMepa 1 nреДnОJlОЖLl1М, 4ТО нам ну>кен таймер peaJlbHOrO BpeMeHLI1 (АТС). Таймер реально ro времен н C4L11TaeT BpeM в секундах, MLI1Hyтax LI1 4асах; он XpaHLI1T реальное BpeM ДH, как LI1 noApa3YMeBaeT ero HaLl1MeHOBaHLI1e. АТС также LI1сnользуетс ДЛ отраБОТКLI1 Bpe менных задержек. АТС может ра60тать от внешнеrо кварцевоrо reHepaTopa, связанноrо со входом TaKTOBO 4астоты TaMepa 1, LI1ЛLl1 от BHeWHero KBapu.eBoro reHepaTopa, LI1C пользуемоrо для СLl1нхроннзаЦLl1L11 работы МLI1кроконтроллера. Однак.о, прежде 4ем HanLl1CaTb соответствуюw,уlO nрLl1кладнуlO nporpaMMY, необхо ALl1MO LI1ЗУЧLl1ТЬ perLl1CTp управлеНLI1 таймера 1. PLl1c. 6.20 LI1ЛЛIOСТРLl1рует содер>кнмое pe rHCTpa уnравлеНLI1 таймера 1. Что6ы LI1сnользовать таймер 1, perLl1CTp управлеНLI1Я тай мера 1 (Т1 CON) LI1 perLl1CTpbI уnравлеНLI1 npepbIBaHLI1MLI1 LI1сnользуетс в зтом npLl1Mepe nporpaMMbI ДЛ орrаннзаu.LI1L11 таймера реальноrо BpeMeHLI1. Бнт АО16 BbI6L11paeT, 6удут ЛLl1 счнтыватьс LI1 заnLl1сыватьс все 16 6L11TOB C4eT4L11Ka сразу, LI1ЛLl1 же кюкдая 8разрядная половнна C4eT4L11Ka 6удет С4L11тываться НЛLl1 заnLl1сыватьс отдельно. npLl1 одновременном C4L11TbIL3aHHLI1 LI1J1L11 заПLl1СН всех 6L11TOB (АО = 1), cTapwa 4асть отсчета выl.3дLl1тсяя nepBo LI1 coxpaHeTC BHYТpLl1 МLI1кроконтроллера до тех пор, пока младwая часть отсчета не будет заnнсана npLl1 06новленнн 06енх половин ОТС4ета TaMepa. 
rnaBa 6. Спецнфнкацнн аппаратных сре)].ств семейства РI С 18 231 TICON KD16 11 CКPS 1 11CКPSO If 1 OSCEN T1SYNC ТМRl CS TMR 1 ON RDIG TICKPSl TICKPS2 Т 1 OSCEN T1SYNC TMR 1 CS TMR 1 ON } режим 16разрядноrо считывания/записи 1 =считывание/запись 16 разрядов О =о считывание/запись по 8 разрядов 00 =0"';'- 1; 01 =  2; 10="';'-4 и 11 =...;.-8 бит активирования I'енератора 1 =о активирован О =0= заблокирован Синхронизация таймера 1 = стинхронизации нет О = синхронизация по внешнему тактовому входу Источник синхронизации таймера 1 1 = внешняя синхронизация О =о внутренняя синхронизация бит включения таймера 1 1 =о таймер 1 вкл. О = таймер 1 выкл. (остановлен) Рис. 6.20. Реrистр управления TaMepa 1 в таком nрименеНLI1L11 использует тиnово (4aCOBO) KBapцeBЫ резонатор на 4ac тоту 32,768 кrц, 3тот KBapцeBЫ резонатор nОДКЛЮ4ен к выводам TaMepa 1 (Т1050 и Т1 051), см. рис. 6.21. 06paTLI1Te внимшше на то, 4ТО зта система содержит два источни <а TaKTOBO 4астоты. OCHOBHa TaKTOBa 4астота в 2 мrц, которая синхронизует BUInOJl- --!ение команд, срормируетс RCreHepaTopoM LI1 nодаетс на BXOДHO Вывод 05С1. Дpy ОЙ ИСТ04НИК TaKTOBO 4астоты - это KBapцeBЫ reHepaTop, связанны со выводами RB6 . RB7. Вывод RB6  это Т1050 (выход reHepaTopa Т1), а вывод RB7 - это Т1 051 (вход eHepaTopa Т1). ОТС4ет, paBHЫ 32768 или Ох8000 вызf,lВает nрерываllие через одну :екунду, если TaMep nроrраммируетс так, 4т06ы на4инать считать с этоrо значения. :четчик TaMepa 1 явлетс 16-разрдным, поэтому AJl Toro, чтобы он вызывал преры занне один раз в секунду, он должен предварительно заrружаться ЗfШ4ением Ох8000. Заnроrраммированны таким 06разом TaMep nOTpe6yeT 32768 nориодов входной Час OTЫ ДЛ Toro, 4т06ы вызвать nрерывание по nереnолнению один раз в секунду. В nри 1.epe 6.18 приuедена nporpaMMa на зыке С, которая поддерживает 244aCOBЫ отсчет аймера в доступных Я4ейках памяти, сохраня секунды, минуты и часы. 
232 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 R1 R2 10 К 3.9 К SW1 c::!3:::t Сброс С2 1.0 uF С1 30 pF +5 U1  PIC18F1220 RAO QRBO RA1  RB1 RA2 RB2 RA3 RB3 RA4 RB4 t#MCLR RB5 OSC1  RB6 OSC2 > RB7 Рис. 6.21. Схема TaMepa реальноrо временн 11) Пример б .18 1* * TaMep peanbHoro временм (RTC) AnR PIC18F1220 */ #include <p18cxxx.h>. 1* Установмть 6мты кониrураuмм Установмть RC reHepaTop * - * * OTKnqMTb CTopoeBO TaMep ОТКn4ИТЬ нмзковоnьтное nporpaMMMpoBaHMe OTKn4MTb с6рос rro 4acTM4Ho потере rrитаНМR Разреwмть 06M с6рос * * *1 #pragma config OSC RC #pragma config WDT OFF #pragma config LVP OFF #pragma config BOR OFF #pragma config MCLRE = ON void MyHighInt (void); I1 ************ npoToTMnbl YHKUM 06ра60ТКМ npepBaHM *********************** D С3 33 pF С4 33 pF 
rnaBa 6. Спецнфнкацнн аппаратных сре)].ств семейства РI С 18 233 #pragma interrupt MyHighlnt #pragma code highvector = Ох08 II ************ вектор BblcoKonpMopMTeTHoro npepblBaHMR ************************ void highvector (void) asm GOTO MyHighlnt endasm 11 *********** память AaHHX************************************************** II С4еТ4МКМ временм АНЯ #pragma udata access IntMyData II размеенме в 6анке доступа near char seconds; near char minutes; near char hours; IlceKYHAbl 1I ммнуты 11 4асы I1 ************** YHKUMM***************************************************** #pragma code 1 I ункuмя мнкремеН'l'мрованмя TaMepa void DoTime (void) { I 1 ормированме CMrHana C4e'l'a кажд сеКУIЩУ PIR1bits.TMR1IF о; 11 nреАзаrpузка Taepa 1 зна4енмем Ох8000 11 TIMR1L ye ОхОО 11 с6рос npepblBaHMR от TaMepa 1 TMR1H = Ох80; seconds++; I1 мнкрементмрованме сеКУНА if (seconds == 60) { 11 eCnM ceKYHA Аостмrnи 60 seconds = о; minutes++; if (minutes == 60) { 11 с6рос сеКУНА в HOnb 11 мнкрементмрованме ммнут 11 eCnM MMHYT Аостмrлм 60 60 minutes = о; hours++; if (hours 24) hours = о; II с6рос ммнут! 11 мнкрементмрованме 4асов 11 eCnM 4асы AOCTMrnM 24 11 с6рос 4асов 11 npoUeAypa 06сnуиваНМR npepblBaHMR void MyHighInt (void) 11 контекст coxpaHReTcR KOMnMnRTopoM { if (PIR1bits.TMR1IF 1) DoTime(); 11 ЗАесь TecTMpYTCR Аруrие narM npepblBaHM } IlrnaBHaR nporpaMMa 
234 Применение микроконтроnnеров PIC 18 void main (void) ADCON1 = OxOf; 11 nроrраммированме UMpOBbIX WTbIPbKOB TRISA = ОхП'; RCONbits.IPEN 1; 11 порт А  ВХОА 11 IPEN 1 TMR11 1'MR1H о; Ох80; 11 nреАзаrрузка TaMepa 1 Ох8000 T1CON OxOF; 11 B60p внешне смнхронизаuмм 11 м актмвмрованме TaMepa 1 seconds  minutes = hours = О; II HaqanO CqeTa С попудня IPR1bits.TMR1IP PIE1bits.TMR1IE 1; 1; II 06ъявnяет TaMep 1 BcoKonpMopMTeTHM 11 разрешает npepbIBaHMe TaMepa 1 INTCONbits.GIEH 1; 11 разрешенме BcoKonpMopMTeTHx npepbIBaHM while (1) {  1. I1 BnOnHeHMe ApyrMx He06XOAMMX onepaUM Каждый раз по исте4ении секунды, TaMep 1 ИНLI1циаЛИЗИРУGТ nрGрывание, BЫ3Ы Ba СРункцию DoТiтe в nроцедуре СРУНКЦИLl1 оБСЛУЖLl1ваНLI1Я ВЫСОКОПРLl10ритетноrо npepbI- вани. В DoTime, TaMep 1 nерезаrружаетс Ох8000, срлаr nрерывани TaMepa 1 сбра- CЫBaeTC LI1 АТС инкрементируется. При каждом nрерывании С4етчик секунд LI1HKpeMeH TLI1pyeTc, один раз в MLI1HYТY инкрементируетс счеТ4ИК минут и один раз в 4ас инкре MeHTLI1pyeTc С4еТ4ИК 4асов. nриведенна nporpaMMa ДО130ЛЬНО проста и XpaHLI1T I3рамя так, как еСЛLl1 6ы оно сохранялось дискретными С4еТ4иками, Точность ОllреДGllЯGrся частото кварцевоrо reHepaTopa, она 06ычно лежит в пределах +/0,005%, что означает nоrрешность несколько секунд в месяц. Единственна не60льша nр06лема с этим TaMepOM состоит в ТОМ, что необходима срункция, с4L11тыаюw,аяя содеРЖLl1мое TaMepa и nрео6разуюw,ая ero в nОСl1еДОl3атеl1ЫЮСТЬ символов ASCII ДЛЯ от06ражеНLI1. Пример 6,19 иллюстрирует срУНКЦLl1Ю, KOTopa получает I3ремя в 24-4асовом или 12-4асовом срормате LI1 сохраняет nоследоватеl1ЬНОСl ь СИМВOJIOI3 В паМТLI1 в nepeMeHHo timeString как последователыlOСТЬ СИМВОllОВ ССТLI1ЛЯ, 13 которой В каче стве разделителя исnользуетс символ нул, 3та СРУНКЦИЯ выьшаетсяя всяки раз, KorAa время в этом срормате необходимо подать на LI1НДикатор. Время сохраняется как 22: 12:01 Д,ЛЯ 24-часовоrо срормата или как 10:12:01 РМ (пополудни) в 12-4асовом срормате. Параметр режима вы6ирает срормат 24/12, коrда вызываетс срункци getТimeString. ЕСllИ парамаrр режима равен 1, ro B03Bpaw,aeTc 124aCOBЫ срормат. 06ратите ВНLI1мание, как ASCII код создаетс д06авлением ОхЗО к значениям, 110 лу4енныM ДJlя nepeMeHHbIx 4асов, минут LI1 секунд после делени их на 1 О или по МОДУЛЮ 10. Если 4ИСЛО 4асов равно 12 LI1 оноделитс на 10, то результатом будет 1, KOTOpЫ IЮ соответствует АSСIIкоду. После д06авлени ОхЗО к 1 результатом будет ОхЗ1, КОlOрый Яl3ляется АSСII-кодом "1". Если 12 делится с LI1спользованием делени по МОДУlllО (%), ВОЗl3раw,аетс остаток 2.2 также nрео6разуется в АSСII-код nосредспюм д06авлеНLI1Я ОхЗО. Аналоrичным 06разом, операция ВКJlючаюw,еrо V1ЛV1 (1) может использоваться для nреобразования в код ASCII. 
rnaBa 6. Специфнкацнн аппаратных сре)].ств семейства РI С 18 235 Пример 6.19 #pragma udata 11 вы60Р nамятм AaHHX char timeString[12]; 11 строка временм #pragma code void getTimeString (char mode) char ptr = о; char tempHours hours; char amPM = 'А'; 11 указатеnь на злемент массмва О if (mode 1) if (hours = 12) { tempHours = 12; amPM = 'Р' ; } if (tempHours  о) tempHours 12; 11 12qacoB peMM 11 npe06pa30BaHMe в 12-4асовый opMaT } if ((tempHours 1 10) timeString[ptr++] timeString[ptr++] о) 11 4М с 'lыI nреАшествуюмй ноль , , . , tempHours 1 10 + Охзо; else timeString[ptr++] tempHours % 10 + Охзо; timeString[ptr++] , . , . timeString[ptr++] minutes 1 10 + Охзо; timeString[ptr++] minutes % 10 + Охзо; timeString[ptr++] , . , . . , timeString[ptr++] seconds 1 10 + Охзо; timeString[ptr++] seconds % 10 + Охзо; if (mode == 1) { 1I 124acoB peMM timeString[ptr++] timeString[ptr++] timeString[ptr++] , ,. , amPM; 'М' ; timeString[ptr] о; 1I завершенме строкм CMMBOnOM нуnя АльтернаТLI1ВНЫЙ метод 06pa60TKLI1 BpeMeHLI1 СуТОК COCTOLl1T В том, 4т06ы использо- вать однн 24разрдны C4eT4L11K в nаМЯТLI1, KOTOPЫ содержал 6ы 4асы, MLI1HYТbI, и се- кунды. В дне LI1MeeTC 86400 (60 * 60 * 24) секунд. 3то 4НСЛО леrко вписываетс в 24 разрдное u.елое 4L11СЛО срормата short long (KopOTKH AJlLl1HHbI срормат). 3то уменьшает IDЛИ4ество BpeMeHLI1, затра4иваемоrо в nроu.едуре срункции 06СЛУЖLl1вани IlрерываllИ, IDТ сложность LI1звле4ения зна4ения времен н HeMHoro 60лее трудна. Пример 6.20 ил J80CTpLl1pyeT nроцедуру СРУНКЦLl1L11 06СЛУЖLl1вания nрерывания с этим типом С4етчика. 
236 Примененне MHKpOKOHTpOnnepOB PIC18 (Операu.ионна система Windows нсnользует зry меТОДLl1КУ ДJlЯ АТС, однако в He ис пользуетс 64разрдная nеременная, KOTopa ОТС4нтывает МLI1ЛЛLl1секунды от 100 до 9999). npLl1Mep 6.21 показывает функцию getТimeString ДJl этоrо TLI1na TaMepa. Здесь 4асы nОЛУ4аются делеНLI1ем времени на 3600. MLI1HYТbI ПОЛУ4аютс nРННLI1мая остаток ОТ времени, разделенноrо 3600 и ,lJ,ел ero на 60. Секун,lJ,Ы nОЛУ4аются, 6ep остаток от BpeMeHLI1, разделенноrо на 3600, а затем раЗ,lJ,еленны на 60. Мето,lJ" нсnользуемы ДJl АТС, зависит от Toro, как АТС нсnользуется в друrих CPYHKu.HX nporpaMMbI. Если АТС нсnользуетс AfI орrаннзаЦLl1Н Т04НЫХ временных за держек, то nepBbI OnLl1CaHHbI метод 6удет самым ЛУ4ШLl1М. ЕСЛLl1 он просто использует- ся ДJl С4ета временн ДH, то BTOpO мето,lJ, будет самым ЛУ4ШНМ. XOpOWLl1 ПРLl1мер cpOpMLI1pOBaHLI1 Т04НЫХ' временных задержек nрнведен в nРLl1ложеНLI1L11 D для USB аКТИВLI1руемой CLl1CTeMbI, KOTopa поддерживает Т04ные временные задеРЖКLI1 с шаrом l3 1 мнллисекун,lJ,У ДJlЯ CLl1CTeMbI реальноrо временн. Пример 6.20 #pragma udata access IntMyData 11 nOMeaeT в 6анк AocTyna near short long time; 11 24-раЗРRДН С4еТ4МК #pragma udata char timeString[12]; 11 строка временм #pragma code 11 HOBaR npoueAypa 06cnYBaHMR npepBaHMR AnR RTC void DoTime (void) { TMR1H = Ох80; PIR1bits.TMR1IF = о; time++ ; if (time == 86400) time = о; 11 nреАзаrpузка TaMepa 1 зна4енмем Ох8000 11 с6рос npepblBaHMR TaMepa 1 11 eCnM HOB Аень Пример 6.21 void getTimeString (char mode) { char ptr = о; 11 указатеnь на зnемент массмва char hours = time 1 3600; 11 nOnY4eHMe 4асов char amPM = 'А'; char minutes (time % 3600) 1 60; 11 nOnY4eHMe ммнут char seconds = (time % 3600) % 60; 1I nOnY4eHMe сеКУНА if (mode == 1) { 11 12Часов peMM if ('hours { 12) 11 nре06разованме в 124acoBo opMaT hours -= 12; amPM = 'Р'; 
rnaBa 6. Спецнфнкацнн аппаратных сре)].ств семейства PIC18 237 } if (hours == О) hours = 12; } if ((hours 1 10) == О) timeString[ptr++] , ,. , else timeString[ptr++] hours 1 10 I Ох30; timeString[ptr++] hours % 10 I Ох30; timeString[ptr++] ':'; timeString[ptr++] minutes I 10 timeString[ptr++] = minutes % 10 Ох30; Ох30; timeString[ptr++] , : ' ; timeString[ptr++] seconds I 10 Ох30; timeString[ptr++] seconds % 10 Ох30; if (mode  1 ) 11 124acoB peMM timeString[ptr++] timeString[ptr++] timeString[ptr++] , ,. , amPM; 'М' ; timeString[ptr] = о; Остальные TaMepы, Hapдy с мноrLl1МИ ApyrHMLI1 прикnаднымн nporpaMMaMLI1, LI1Л- ЛЮСТРLl1РУЮТС В nоследуlOw,нх ра3,lJ,елах. Некоторые И3 3TLI1X ,lJ,pyrLl1x nРLl1ложеНLI1 LI1C пользуют npepbIBaHLI1, ,lJ,pyrLl1e  нет. ,д11 опре,lJ,елеНLI1 TaMepOB может LI1сnользоваться фал заrоловка Тimers.h. npLl1MepbI LI1З 6L116ЛLl10теКLI1 timers.h nрнводятс в 60лее поздних разделах это rлавы, в друrLl1Х rлавах дaHHO KHLI1rH, а так>ке в nРLl1ложеНLI1L11 8. АЦП ApyrLl1M BHyTpeHHLI1M перLl1ферLl1НЫМ YCTPOCTBOM вляетс аналоrоu.нсррово nре06раЗ0ватель (АЦn). АЦn nре06разует аналоrовое входное наnряжеНLI1е в 4L11СЛО. 60ЛЬШННСТВО 4ленов ceMeCTBa PIC 18 содержнт 1 Оразр,lJ,НЫ nре06разователь, KOTO pы nре06разовывает аналоrовы ВХО,lJ, в u.HcppoBoe зна4ение с разрешеНLI1ем, равным (Vref+ - Vref )/1023. Еслн Vref + равно  5 V, а Vref- это земля, то зна4еНLI1е шаrа Hanp жеНLI1Я 6удет равно (5/1023)*0,00489 В. Сле,lJ,овательно, еСЛLl1 входное напряжение рав- но 1,0 8, то nреобраЗ0ватель creHepHpyeT u.исррово ВЫХО,lJ, 1,0 8/0.00489 8 LI1ЛLl1 205 деСЯТLI14ное. nре06разователь также LI1MeeT до 16 входов, в заВИСLl1МОСТLI1 от LI1сnолнения члена ceMeCTBa. 3TLI1 ВХО,lJ,Ы LI1СnОЛЬ3УЮТСЯ для Toro, 4т06ы КОНТРОЛLl1ровать наnржения от разных ИСТ04НLI1КОВ. V1MeeTc так>ке два бнта управлеНLI1, которые BbI6L11palOT LI1СТОЧ ннк для ВХО,lJ,а Vref nре06разовател. 8НуТрення структура АЦn nоказана на pLl1c. 6.22. Обратнте щшмаНLI1е, 4ТО несколько 4ленов ceMeCTBa содержат 12-разрдны npe06pa- З0ватель, КОТОРЫЙ нсnользует ту же caMYIO ОnLl1санную здесь методику, за ИСКI1IОЧСllием шаrа наnряження, KOTOpЫ оnределяетсделеннем на 4095 (2121) вместо 1023 (2101). 
238 Прнмененне мнкрокоитроnперов PIC 18 CHSJ.-....CHSO __lUL I I I I I I I . 1 ОразрSlдНый АЦП  IIII  IIIO 1101  IIUO 1011 1010 IOOl IOOO Olll 0110  0101  0100 0011 0010 0001 0000 Анаnоrовый ВХОД Vref Vref+ VCFGlVCFGO    L   J .. I I : : AVDD I AVSS ,     -      : снsз.........сНSО Выбор входноrо снrнала VCFG1VCFGO Выбор источника onopHoro напряжения ЛN15 ANI4 ANI3 ЛNI2 ANII ЛNIО AN9 ЛN8 AN7 ЛN6 ЛN5 ЛN4 ЛN3 / Vref+ ЛN2 / Vref ЛNl ЛNО 00 == А VDD, А VSS 01 == Vref+, А VSS 10 == Vref, AVDD 11 == Vref+, Vref Рис. 6.22. 16KaHanbHbI 1 O-разр,lJ,НЫ АЦn ::. TpLl1 реrистра уnравлеНLI1Я (ADCONO, ADCON1 и ADCON2) определют работу АЦn. Р\ I rLl1CTp ADCON 1 оnределет, 6удут ЛLl1 входные выводы порта А и В СРУНКЦИОНИРОl3ать как циq ровые или как аналоrовые входы. Реrистры уnравлени АЦn показаны на рис. 6.23. Чтобы nрОИЛЛЮСТрLl1ровать простое nрименение АЦП, предположим, что нам ну>кно KOI тролировать nода4У наnряжени в 3,3 В НСТ04нике элеКТРОnLl1тания nK. PIC может выполнить э зада4У при использовании одноrо нз входов АЦn. nре,ЦJlОЛОЖИМ, 4ТО схема, изображенная I рис. 6.24, используется ДП контроля наnржения элеКТРОnLl1тания. 3та схема исnользует ШICL. ни KBapцeBЫ reHepaTop на4 мrц LI1 только один входANО (RАО)дпя контрол наnряжеНLI1е. 
rлава 6. Спецификации аппаратных средств семейства РI С 18 239 nporpaMMa, тре6уемая Д1l измереНLI1Я наnрження, заKJlючена в срункции getVoltage(), KOTopa возвраw,ает зна4ение напржени на ANO в срормате с nлавающе запятой. Так>ке 13 пример 6.22 ВKJlЮ4ена nporpaMMa, Tpe6yeMa Д1l nроrраММНрОl3аниs.l штырька ANO, llOЮМУ 4ТО опрос аналоrовоrо входа размещен в начanе срункu.ИLl1 main. ADCONO СНSЗ CHS2 CHSI CHSO  ADON GO/DONE СНSЗНSО GO/DONE ADON Select the input channcl as depicted in I'igure 6-19 АОС status bit (О = Ьшу converting, 1  done) ЛDС оп bit (О = disabIcd, 1 = enabIed) ADCONl VCFGl VCf'GO PCFG3 PCFG2 PCFGI PCFGO VCFG1VCFGO PCFG3PCFGO Select the voltage reference as depicted in Figure 6-19 Select the digital/analog input pins (see tale) PCFGn АЮ5 ANI4 AN9 AN8 AN7 AN6 AN5 AN4 AN3 AN2 ANI  AN13 AN12 ANll ANIO ANO 0000 А А А А А А А А А А А А А А А А 0001 D D А А А А А А А А А А А А А А 0010 D D D А А А А А А А А А А А А А -  ООН D D D D А А А А А А А А А А А 0100 D D D D D А А А А А А А  А _A А 0101 D D D D D D А А А А А А А А А А 0iI0" D D D D D D D А А А А А А А А А ОНI D D D D D D D D А А А А А А А А 1000 D D D D D D D D D А А А А А А А 1001 D D D D D D D D D D А А А А А А 1010 D D D D D D D D D D D А А А А А IOIl D D D D D D D D D D D D А А А А 1100 D D D D D D D D D D D D D А А А ...!!_ D - D D D Р D D D D D D D D А А l.!!Q D D D  D D D D D D D D D - --" D А -  ,... Illl D D D D D D D D D D D D D D [) ADCON2 ADFM ADCS2 ADCSI ADCSO / ADFM ADC result format (О = left justified, 1 = right justified) ADCS2ADCSO Clock select bits 000 == F osc/2 001 = I"osc/8 010:.= Fosc/32 011 = FRC (internal RC clock; 1 Mllz тах) 100 == }o'osc/4 ]01 = l'osc/l6 110 = Fosc/64 111 = FRC (Clock from RC oscillator, 1 MНz тах) Рис. 6.23. Реrистры уnравлени АЦn 
240 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 +5V I С4 0.1 uF U1  R1 10 К 3.3 V olt Input RAO QRBO SW1 RA1 RB1 RA2 RB2  RA3 RB3 RM RВ4 D #МCLR RB5 RESET OSC1 RB6 У1 OSC2 > RB7 4MHz LS1 С2 С3 27 pF 27 Р Рис. 6.24. V1сnользоваНLI1е PIC ДJlЯ контрол подачн наnр>кени в 3,3 В LI1CT04HLI1Ke nLl1таllИЯ nK Пример 6.22 1* * От60Р HanpReHMR с МСТ04нмка nMTaHMR 3.3 В AnR PIC18F1220 *1 #include ,p18cxxx.h. 1* Установмть 6MT KOHMrypaUMM Установмть RC reHepaTop OTKn4MTb CTopoeBO TaMep OTKn4MTb нмзковоnьтное nроrраммированме OTKn4MTb с6рос по 4acTM4Ho потере nMTaHMR Разреwмть 06M с6рос * - *  * - * *  *1 #pragma #pragma #pragma #pragma #pragma config OSC "= config WDT config LVP = config BOR = config MCLRE HS OFF OFF OFF = ON #pragma code float getVoltage (void) { SOUNDER 
rnaBa 6. Спецнфнкацнн аппаратных сре)].ств семейства PIC18 241 ADCONObits.GO = 1; Ilзаnуск npe06pa30BaHMR while (ADCONObits.GO == 1); II ОМАание заверwеНМR return (ADRESL I (ADRESH" 8)) * 0.00489; I1 main program void main (void) ( ADCONO Ох01; ADCON1 ОхОе; ADCON2 Ох84; TRISA 1 ; PORTA О; II B60p ВХОАа ANO, активмрованме АЦП II ANO  aHanoroB, VDD м VSS  опорне II пре06раЗ0ванме С MCnOnb30BaHMeM 1 мrц II Порт А, 6мт О = ВХОА дnя АЦП II сиrнаn BKn. while (1) ( if (getV01tage() . 3.465 11 getVoltage() , 3.135) PORTAbits.RA1 1; II CMrHan BKn. else PORTAbits.RAl о; I1 CMrHan BKn. Коrда BЫ3ЫBaeTC CPYHKu.L/1 getVoltage, БL/1Т GO в ADCONO устанаВЛИl3аетс 13 1, чтобы заnУСТL/1ТЬ nреобраЗ0ваНL/1е. Он затем npOBepeTC с тем, чтобы проконтролиро- вать, завершено ЛL/1 nреобраЗ0ваНL/1е (GO = О) с ИСnОЛЬЗ0ваНL/1ем u.L/1кла while. Проrрамма мо>кет быть раСШL/1рена TaKL/1M обраЗ0М, чтобы ОДL/1Н раз в секунду КОНТРОЛL/1РОl3алось наnр>кение в nроu.едура CPYHKu.L/1L/1 обрабОТКL/1 npepbIBaHL/1 АТС. Если имеет место no вышеНL/1е Hanp>KeHL/1 на 5% L/1JlL/1 ero CHL/1>KeHL/1e на 5%, то ВKJlЮ4аетс nьезозлектриче СКL/1Й зуммер. В примере 6.22 СL/1rнал TpeBOrL/1 nодаетс на АА 1. АОnОЛНL/1тельные приме- ры L/1СnОЛЬЗ0вани АЦП nрL/1ВОДТС в более nоздних rлавах. эсппзу данных 3СППЗУ данных L/1MeeTC во MHorL/1X версих МL/1кроконтроллера, оно исnользуетс ДЛ Toro, 4тобы coxpaHTb CTaTL/14eCKL/1e данные. ПаРОЛL/1, данные настройки или любой ИНО TL/1n данных, которые сохранютс ДЛL/1тельное врем" Moryт coxpaHTbC 13 эсnnзу данных. В HacTow,ee BpeM L/1СnОЛЬ3УЮТС два размера naMTL/1 данных эсnпзу "на 4L/1ne": 256 L/1 1 024 бата. Aocтyn к YCTPOCTBY с 256 батами выnолнетс через ОДL/1Н 8разрдны а.црес, nOMew,eHHbI в perL/1CTp ЕЕАDА, а УСТРОСТ130 с 1024 байтаМL/1 L/1СnОJlьзует два 8разрдных perL/1CTpa адреса ДЛ орrаНL/1заu.L/1И доступа: ЕЕАОА L/1 ЕЕАDАН. ЕЕАDА содер>КL/1Т млаДШL/1е 8 разрдов 10-разрдноrо адреса, а ЕЕАОАН содер>КL/1 стаРШL/1е 2 БL/1та адреса. Так как MHoro YCTPOCTB L/1меют только 256 только батов 3СПnЗУ, в зтом nодразделе paCCMaTpL/1BaeTC только L/1СnОЛЬЗ0вание perL/1CTpa ЕЕАDА ДЛ выбора 4eKL/1 naMTL/1 3СnnЗУ. 3СnnЗУ данных coxpaHeT данные в течеНL/1е 40 лет без какоrОЛL/1бо nL/1тани и может быть nерезаnL/1сано до 1 МL/1ЛЛL/10на раз (теХНL/1чеСКL/1е сnеu.ИСРL/1каu.L/1L/1 nрИI30ДТ цисрру ML/1HL/1MYM 100000, так 4ТО зто еДL/1нственное rapaHTL/1pyeMoe число). Почему эсnnзу paCCMaTpL/1BaeTC в зтом nодраздеJlе, вместо Toro, чтобы рассмаТРИl3атьс вместе с nамтью? 3СnnЗУ TpaKTyeTC как YCTPOCTBO ввода  вывода, в Hero нельз 
('.. 242 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 непосредственно nLl1CaTb LI1JlLl1 4L11TaTb как в случае нормально naMTLI1. Чтение LI1ЛИ за- пись в эсnnзу требует ДОnОЛНLI1тельных усили LI1 nOHLI1MaHLI1 команд ввода - вывода. Пример 6.23 nOKa3bIBaeT срункu.ию, KOTopa 4L11TaeT любую чеку ЗCnnзy объемом в 256 байт. Эта ФУНКЦLl1 B03Bpaw,aeT содер>КLI1мое чейки ЭСППЗУ, передаваемое как параметр. Пример б. 23 char eeRead (char address) EECON1bits.EEPGD = о; EEADR = address; EECON1bits.RD = 1; return ЕЕDАТА; II B6MpaeT ЭСDDЗУ AaHHX II YCTaHaBnMBaeT аАрес ЭСDПЗУ II B6MpaeT оnераuи qTeHMR II CqMTBaeT AaHHe М3 ЭСDDЗУ 3та KopOTKa срУНКЦLl1 помещает HOJlb в БLl1Т EEPGD. БLI1Т EEPGD выБLl1рает либо зсппзу данных, либо срлешnамть nporpaMM (EEPGD = 1). Флешnамять nporpaMM оБСУ)I(Даетс в rлаве 1 О совместно с nроrраммой начально заrрузки. ЗаnLl1СЬ в зсппзу требует HeMHoro больше усилий, чем считывание, поэтому срункци заnLl1СLl1 в зсnnзу данных более длннна. Пример 6.24 nOKa3bIBaeT срункцию заnLl1СLl1 байта в зсппзу данных ЕЕРАОМ. Пример б. 24 void eeWrite (char address, char data) { INTCONbits.GIEH = о; EECON1bits.EEPGD = о; EECON1bits.WREN = 1; EEADR = address; ЕЕОАТА data; EECON2 = Ох55; EECON2 = ОхАА; EECON1bits.WR = 1; while (PIR2bits.EEIF PIR2bits.EEIF = о; EECON1bits.WREN о; INTCONbits.GIEH = 1; II OTKnqaeT все nрерванмя II B6MpaeT ЭСDПЗУ AaHHX II снммает замту запмсм II заАает аАрес ЭСDDЗУ II заАает AaHHe ЭСDDЗУ II стмрает TeKYM 6aT О) ; II B6MpaeT onepaUM заnмсм II ОМАание OKOHqaHMR II c6paCBaeT nar npepBaHMR ЕЕ II заает ЭСDDЗУ от заnмсм . II повторно актмвирует все npepBaHMR Как у>ке OTMe4aJlOCb, БОJlьшее КОЛLl14ество работы требуетс дл Toro, чтобы заnLl1- сать данные в зсппзу. Так как JlоrLl1ческие схемы зсппзу вызывают nрерывание, KO торое оБЫ4НО не LI1сnользуетс, первые LI1 nОСJlедние шаrLl1 соответствуюw,ей nporpaMMbI ОТКЛЮ4ают LI1 заново ВKJlЮ4ают CLl1CTeMHbIe npepbIBaHLI1. В данном СЛУ4ае как ННЗКОnРLl1- оритетные, так LI1 ВЫСОКОnРLl10ритетные npepbIBaHLI1 БЛОКLI1РУЮТСЯ битом GIEH реrистра уnравлени npepbIBaHLI1MLI1. Бит WREN заw,нw,ает зсппзу от ОШLl1БО4НОЙ заПLl1СLl1, кото- pa MorJla бы np0Ll130TH. npLl1 заnLl1СLl1 в зспnзу зтот бит устанаВЛLl1ваетс, а затем сбрасываетс, 4тобы заw,LI1ТLI1ТЬ зсnпзу в конце CPYHKu.LI1H. Я4ека nамти зсnnзу, выбранна ЕЕАDА стираетс заnLl1СЬЮ Ох55, а затем ОхАА в perLl1CTp EECON2. 3то coxpaHeT OxFF в выбранной 4ейке naMTLI1,  зто состоние рассматриваетс как состоние CTHpaHLI1. ФаКТLI1ческа запнсь в naMTb 3СППЗУ co xpaHeT только нулевые биты 4L11сла в чеке naMTLI1. Как только заnLl1СЬ будет LI1НLI1циа лизирована, БLl1Т EEIF (EEIF = О) в реrистре PIR2 указывает на то, 4ТО 3СПnЗУ занто 
rnaBa 6. Спецнфнкацнн аппаратных сре)].ств семейства PIC18 243 заnисью данных. npou.ecc заnиси зсnпзу требует nРL/1БЛL/13L/1тельно 4 мс ,lJ,л CBoero выполнення. Бит флаrа npepbIBaHL/1 L/1сnользуетс ДЛ Toro, 4тобы указать, 4ТО зсnпзу занято выполнением заnИСL/1, еСЛL/1 nporpaMMa решает npepbIBaTb зту оnераu.L/1Ю. В зтом npL/1Mepe nporpaMMa ожидаот еДL/1НL/14ноrо COCTOHL/1 cpJlara EEIF перед заПL/1СЫО 13 Hero нул L/1 nоследуюw,L/1М nродол>кеНL/1ем работы. rлава 1 о обсуждает nроrраммирование BHyтpeHHe срлзшnаМТL/1 nporpaMM, которое выnолнетс n04TL/1 так >ке, как и nporpaM- ML/1pOBaHL/1e зсnnзу данных. Поскольку L/1MeHa nepeMeHHbIx не MorYT быть назна4ены в nporpaMMe ДJl эсппзу, один L/13 методов решеНL/1 3TO за.ца4L/1 свзан с L/1СnОЛЬЗ0ваНL/1ем оператора #define, чтобы nрисвоить числовые адреса меткам. ПРL/1мер 6.25 L/1ллюстрирует то, как выпол IIL/1Tb зту задачу, а затем использует срункцию eeRead, 4тобы C4L/1TaTb nеременную в pe rистровый файл данных. Пример б. 25 11*********** aHHe ЭСDDЗУ ************************************************** #define timeMode О #define unitAddressL 1 #define unitAddressH 2 II timeMode npMcBaMBaeTcR аАрес О II unitAddressL nрмсваиваеТСR аАрес 1 II unitAddressH npMcBaMBaeTcR аАрес 2 II ********* nepeMeHHe в rraMRTM Аанных ************************************** #pragma udata :::har TimeMode; :::har UnitAddressL; :::har UnitAddressH; /1 даnее в nроrрамме TimeMode = eeRead (timeMode); II CqMTBaHMe ЭСDDЗУ по аАресу ОхОО UnitAddressL eeRead (unitAddressL) UnitAddressH = eeRead (unitAddressH) 11 still later in the program eeWrite (timeMode, TimeMode) II заnмсь TimeMode в ЭСDDЗУ Модуль сравнения и сбора данных (ССР) Модуль cpaBHeHL/1 L/1 сбора данных мо>кет L/1СnОЛЬЗ0ватьс с ШV1Ммодултором (PWM) L/1ЛL/1 perL/1CTpL/1pOBaTb ОТС4еты TaMepa 1 L/1ЛL/1 TaMepe 3 npL/1 замере nродол>кн- TenbHOCTL/1 интервала BpeMeHL/1. HanpL/1Mep, nреДnОЛО>КL/1М, 4ТО TaMep 3 работает с ne РL/10ДОМ С4ета в МL/1ЛЛL/1секунду, а BXOДHO L/13MepeMbI СL/1rнал L/13MeHeT скорость CBoero нзменеНL/1Я. Модуль сср мо>кет L/13MepTb 3TL/1 L/13MeHeHL/1, perL/1CTpL/1py содер>каНL/1е таймера npL/1 L/13MeHeHL/1L/1 входноrо СL/1rнала. 3то n03BOJleT замерть скорость L/13MeHe- HL/1 ВХОДноrо СL/1rнала в МL/1JlJlL/1секундах, потому 4ТО TaMep C4L/1TaeT МL/1ЛЛL/1секунды. Рис. 6.25 nOKa3bIBaeT PIC18F1220, KOTOPЫ L/13MepeT 4астоту CeTL/1 злектроnита- НИ в CL/1CTeMe контрол nотреблени MOW,HOCTL/1. В nоказанно схеме, сеть L/1З0лирова- на от микроконтроллера. В ка4естве pa3B3KL/1 L/1сnользуетс onTonapa, KOTopa nреоб- разует сетевое Hanp>KeHL/1e 120 В в nLYPoBeHb. ПЛуровень npL/1KJla.цbIBaeTc ко входу ССР1 (АВ3) МL/1кроконтроллера. МОДУJlЬ ССР npOrpaMML/1pyeTc так, 4тобы perL/1CTpL/1pO 
('. 244 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 вать содер>кимое TaMepa 3 BCKL/1 раз, коrда nОЛО>КL/1тельны перепад СL/1rнала nовл eTC на выводе ССР1. В зтом npL/1Mepe таймер 3 работает с nерL/10ДОМ 8 мкс. ОТС4ет, CHTЫ с вывода ССР1, нсnользуетс ДЛ Toro, 4тобы оnредеЛL/1ТЬ 4астоту входноrо cL/1r нала н COXpaHL/1Tb зту 4астоту в 4ейке naMTL/1. Содер>КL/1мое TaMepa 3 делиrся на 125000, 4тобы вычислL/1ть 4астоту. ПРL/1мер 6.26 L/1ллюстрирует nporpaMMY, используе- мую дл Toro, 4тобы ВЫnОЛНL/1ТЬ зто L/13MepeHL/1e, L/1СnОЛЬ3У модуль ССР микроконтрол лера. 3та nporpaMMa L/1сnользует сралы timers.h L/1 capture.h ДЛ срУНКЦL/1 таймера 3 L/1 ССР. Файл заrоловка TaMepa охватывает CPYHKu.L/1L/1 L/1НL/1u.L/1аЛL/1заu.L/1L/1, 4тени L/1 записи любоrо таймер. Файл заrоловка МОДУJl сбора ,lJ,анных охватывает срункu.ИL/1, которые открывают модуль сбора данных L/1 обесnе4L/1вают ero СЧL/1тываНL/1е. +5V R4 R PIC18F1220 U2 :t R2 10К U3 RЗ  , vv 10К 120 V АС 4N36 СЗ 0.1 uF Рис. 6.25. Схема, L/1сnользуюw,а МОДУJlЬ ССР AfI L/13MepeHL/1 4астоты в CeTL/1 3JlектрОnL/1таНL/1 . Пример 6.26' 1* * Мзмеренме qaCTOTbl в линмм злектроnмтаНМR по nepeMeHHOMY ТОКУ *1 II nR Toro, qT06 зтот rrporpaMMH КОА BrrMCanCR в заrрузоqн 6noK, II an KOMnoHoBMKa 6ьт мзменен AnR Mcrronb30BaHMR ana мнмuмаnмзаuмм сО18.0 II вместо ana C018i.O II II Эектом 3Toro RВЛRеТСR то, что в nporpaMMe не 6УАет немнмuмалмзмрованных RqeeK naMRTM AaHHX #include ,p18cxxx.h. #inc1ude ,timers.h. #include ,capture.h. 
fnaBa 6. Спецнфнкацнн аппаратных сре)].ств семейства PIC18 245 1* Установмть 6MT KOHMrypaUMM  Установмть RC reHepaTOp OTKnqMTb CTopoeBO TaMep OTKnqMTb HM3KOBOnbTHoe nporpaMMMpOBaHMe OTKnqMTb с6рос rro qaCTMqHO потере rrMTaHMR Разреwмть 06M с6рос *  *1 #pragma config OSC HS #pragma config WDT OFF #pragma config LVP OFF #pragma config MCLRE = ON #pragma interrupt MyHighInt #pragma code highvector = Ох08 II BHewHM reHepaTOp на 4 MrU save=PROD II highvector rro аАресу ОхОО08 vold high vector (void) II BcoKonpMopMTeTH вектор asm GOTO MyHighInt endasm KonpMopMTeTHoro npepBaHMR } f10at frequency; II rrepexoA на rrporpaMMY 06pa60'I'KM BCO. II qaCTOTa лмнмм злектроnмтаНМR #pragma code void MyHighInt (void) { int count; if (PIR1bits.CCP1IF == 1) { PIR1bits.CCP1IF = о; count  ReadCapture1(); WriteTimer3 (о); frequency = 125000.0 I (count); II в repuax } ,void main (void) { TRISBbits.TRISB3 = 1; II RB3 RBnReTCR ВХОАОМ OpenCapture1 (С1 EVERY RISE EDGE & CAPTURE_INTON); II rrpepblBaHMe rro nОАъему pOHTa OpenTimer3 (TIMER_INT OFF & Т3 PS 1 8 & Т3 SOURCE INT); II 8 МКС WriteTimer3 (о); II с6рос TaMepa 3 INTCONbits.GIEH while (1) { 1; II разреwенме BcoKorrpMopMTeHx nрервани 
246 Прнмененне МНКрОКОНТрОnЛеров PIC 18 Дополнительные внутренние устройства В данной rлаве БЫЛL/1 L/1зло>кены ВВО,lJ,ные CBeдeHH о МНКРОКОНТРОЛJ1срах н. lIeKO торых нх внутренннх YCTpOCTBax; обсужденне друrнх внутренннх YCTPOCTB будет вы- nолнтьс в nоследуюw,нх rлавах, Hapдy с рассмотреннем нх работы. В состав зтнх друrнх YCTPOCTB входнт USART (уннверсальны сннхронно/аСL/1НХРОIIНЫЙ прнемопсрс датчнк) н ра3ЛН4ные друrне YCTpOCTBa, которые Moryт быть, а MOryт н не быть уннкаль- нымн ДJl KOHKpeTHO верснн мнкроконтроллера. 6.5. Резюме 1. YCTpOCTBa ceMeCTBa PIC18 nронзводтс в ра3ЛН4НЫХ корпусах  от PDIP с 18 выводамн до корпуса TQFP с 128 выводамн. 2. Hanp>KeHHe nL/1TaHH ДJl PIC18 мо>кет onycKaTbc до 4,2 B"npH работе с полным быстродествнем н током от 60 мкА ДJl работы с ннзкнм быстродеСТl3нем до 12 мА npH работе на 4астоте 40 Mru.. 3. Ток HarpY3KH достато4ен.o.n 4eТblpex стан.цартных m cxeM н десятн КМОП-схсм. 4. МНКРОКОНТРОЛJlер сбрасываетс автомаТН4ескн, еслн Hanp>KeHHe nHTaHH бы стро растет до 5,0 В (0,05 В/мс), нна4е он 4асто сбрасываетс с НСnОЛЬЗ0ваннем BHeWHe комбннаu.нн резнстора/конденсатора н KHonKH сброса. 5. Мнкроконтроллер сбрасываетс сбросом от CTOpO>KeBOro таймера (WDT) , сбросом по 4aCTH4HO потере nHTaHH (ВОА), KOMaHДO RESET (Reset () на С), сбросом по переnолненню стека, сбросом по освобожденню стека нлн друrнмн схемамн. 6. Сторо>кевой TaMep  зто nporpaMMHpyeMbI С4еТ4ИК, который сбрасывает мнкроnроцессор, еслн ему nозволют nереполннтьс. КОЛИ4ество времен н до пере- полненн мо>кет KoppeКТHpOBaTbC, оно мо>кет достнrать 131 секунды. 7. Сброс по 4aCTH4HO потере nHTaHH nporpaMMHpyeTc так, 4тобы сБРОСL/1ТЬ мнкроконтроллер, еслн Hanp>KeHHe nHTaHH nOHH>KaeTC нн>ке заданно отметкн. 8. Мнкроконтроллер мо>кет nporpaMMHpoBaTbc на сброс в случае nереnОJ1неНL/1Я нлн оnустошенн стека. 9. TaKTOBa частота ДJl PIC18 мо>кет поступать от внешнеrо L/1CT04HHKa, KBapu.eBo ro reHepaTopa нлн реЗ0натора, АС-схемы сннхроннзацнн нлн BHyтpeHHero rCHepaTopa. 10. Оператор #pragma config оnределет консрнrурацию мнкроконтролл.,ра в nporpaMMe на С. 11. Выводы ввода  ВЫВО,lJ,а в PIC18 crpYnnHpoBaHbI в 8разрдные порты, 4НСЛО которых H3MeHeTC от одноrо 4лена ceMeCTBa к друrому. Все верснн микросхем со- дер>кат порт А н В, а некоторые верснн содер>кат порты С к J. 12. Порт ввода  вывода СО,lJ,ер>кнт perHcTp TRIS ДJl nporpaMMHpOl3aHH lIanpal3 ленне пере носа данных на штырьках порта, perHcTp РОАТ ДJl 4TeHH нлн заnнсн порта, а так>ке perHcTp порта LAT ДJl заnнсн во BHYTpeHHH бусрер порта. MHorHe верснн мик росхем так>ке содер>кат perHcTp ADCON 1, KOTOPЫ nporpaMMHpyeT выводы порта на работу в аналоrовом нлн u.HCPPOBOM ре>кнме. 13. Прерывание  зто обраw,енне к срункцнн, вызванное аппаратным снrналом нлн некоторым внутренннм событнем. Коrда nрОL/1СХОДНТ nрерывание, микроконтрол лер нспользует нлн BЫCOKO нлн НН3КОnРL/10рнтетный вектор nрерывани ДJl ВЫ3013а процедуры обслу>кнванн npepbIBaHH. 14. Структура npepbIBaHH уnравлетс несколькимн реrистрамн, которые про rраммнруют уровень npHopHTeTa, указывают COCTOHHe npepbIBaHH, а так>ке разреша IOТ или заnреw,ают npepbIBaHHe. 
rnaBa 6. Спецнфнкацнн аппаратных сре)].ств семейства PIC18 247 15. Таймеры L/1СnОЛЬ3УЮТС ДЛ Toro, 4тобы вызвать npepbIBaHL/1e npL/1 своем nepe nолнеННL/1 L/1ЛL/1 ДЛ nОДС4ета CL/1HXpOHHbIX JlL/1бо aCL/1HXpOHHbIX соБЫТL/1. 16. Мнкроконтроллер содер>КL/1Т 1 Оразрдный ahaJlOrO-u.L/1сррОВО nреобра30lЗа тель, который L/1MeeT до 16 каналов входных данных. 17. эсппзу данных - зто не TaKa naMTb, как СЗУПВ perHcTpoBoro файла дaH ных L/1ЛL/1 naMTb nporpaMM. AocTYn к зсппзу данных nрОL/13ВОДИТС так, как будто это YCTPOCTBO ввода  вывода 4ерез perL/1CTp а.цреса L/1 perL/1CTp данных. 6.6. Вопросы  заданя 1. ЗаДL/1те на caT Microchip L/1 оnредеЛL/1те, KaKL/1e срорматы корпусов ML/1KpOCXeM доступны ДJl PIC18F1320. 2. Что такое корпус PDIP? 3. Что такое корпус SOIC? 4. Что такое корпус SSOP? 5.Вновь nOCeTL/1Te сайт Microchip L/1 оnредеЛL/1те МL/1ннмальную L/1 маКСL/1мальную це- ну BepCL/1L/1 YCTpOCTBa ceMeCTBa PIC18. МL/1НL/1мальна u.eHa за устростlЗО PIC18 = J а маКСL/1мальна u.eHa за YCTPOCTBO PIC18 = 6. Как называютс ЛL/1НL/1L/1 nода4L/1злеКТРОnL/1таНL/1 на PIC18? 7. Каков ДL/1аnа30Н Hanp>KeHL/1, ДОnУСТL/1МЫХ ДЛ высокоскоростной работы MHK роконтроллера? 8. KaKO ток требуетс ДЛ работы PIC18 на маКСL/1мальной 4астоте? 9. KaKO ток требуетс ДJl u.L/1cppoBoro входноrо СL/1rнала МL/1КрОКОНТрOJlЛера PIC? 10. ML/1KPOKOHTpOJlJlep мо>кет nepeBeCTL/1 HarpY3KY в COCTOHL/1e лоrнческоrо нул npH MaKCL/1MYMe тока в 11. МL/1КРОКОНТРОJlлер мо>кет nepeBecTH HarpY3KY в COCTOHHe лоrL/1ческой еднннцы npL/1 MaKCL/1MYMe тока в . \ 12. ЕСЛL/1 в цеnн сброса (см. pL/1c. 6.3) L/1сnользуетс pe3L/1CTOp на 15 кОм н конден- сатор на 1,0 мФ, nOCTOHHa BpeMeHL/1 будет равна . 13. Каково 3Ha4eHL/1e вывода MGl::R МL/1кроконтроnлера? 14. rде расnоло>кен адрес вектора сброса? 15. KaKa команда оБЫ4НО размеw,аетс по а.цресу вектора сброса н почему? 16. Что такое сторожево TaMep (WDT) L/1 4ТО nрОL/1СХОДL/1Т, коrда WDT nереnолняетс? 17. WDT проrраммируетс на МL/1НL/1мальны ОТС4ет, paBHЫ L/1 макснмаль HЫ ОТС4ет, paBHЫ 18. С KaKO TaKTOBO 4aCTOTO работает WDT? 1--9. Что такое ВОА L/1 KaKL/1e Hanp>KeHL/1 MoryT npOrpaMML/1pOBaTbc ДЛ ВОА? 20. Что такое сброс стека L/1 4ТО влетс nрL/14L/1НОЙ ero B03HL/1KHOBeHH? 21. Каково Ha3Ha4eHL/1e оператора #pragma config MCLRE = ON на 3ЫKe С? 22. Какова маКСL/1мальна TaKTOBa 4астота ДЛ PIC18? 23. V1MeeTc ЛL/1 МL/1нимальна TaKTOBa 4астота ДЛ PIC18? 24. ОДL/1Н KOMaHДHЫ u.L/1КЛ cpopML/1pyeTc L/13 nерL/10ДОВ тактовой частоты. 25. Что такое pe>KL/1M хт TaKToBoro reHepaTopa ДЛ PIC18? 26. Что такое pe>KL/1M АСIO TaKTOBoro reHepaTopa ДЛ PIC18? 27. ВыбеРL/1те pe3L/1CTOp L/1 конденсатор ДЛ работы PIC18 на 4астоте, nрнБЛL/13Н- тельно равной 750 Kru.. 28. Как pe>KL/1M СL/1НХрОНL/1заu.ИL/1 HSPLL устанаВЛL/1вается ДЛ PIC18 в nporpaMMe, HanL/1CaHHO на 3ЫKe С? 29. Какне lЗыводы МL/1кроконтроллера nодсоеДL/1НЮТС к KBapu.eBoMY илн KepaMH 
248 ITрнменение MHKpOKOHTpOnnepOB РI С 18 4ескому реЗ0натору? за. Выполните nOVlCK в Internet L/1 наДL/1те постэвw,L/1КОВ кераМН4ескнх pe30HaTO ров. Какне зна'iени частот обесnе4L/1ваютс 3ТL/1МИ реЗ0наторамн (составьте cnHcoK JеЬадресов упомнутых nocTaBw,L/1KoB)? З1. Объсните, как работает pe>KL/1M СL/1НХрОНL/1заЦНL/1 HSPLL. 32. Объсните, как в npHMepe злектронно HrpbI «ВыбраСЫl3аНL/1е KOCTe» l3ыбира eTC случайное число ме>кду О L/1 35. 33. Еслн дл светоднода ну>кно Hanp>KeHL/1e в 2,5 В L/1 ток В 20 мА, какой НОМL/1нал резнстора смещеНL/1 требуетс, еСЛL/1 наnр>кение L/1СТОЧНL/1ка nL/1TaHL/1 равно 5,0 В? 34. Если для свеТОДL/10да ну>кно Hanp>KeHHe в 2,5 В L/1 ток В 20 мА, KaKO HOML/1Han резнстора cMew,eHH требуетс, еСЛL/1 Hanp>KeHL/1e L/1CT04HL/1Ka nL/1TaHL/1 равно 12 V? 35. Какова роль реrистров TRISA, LATA н РОАТА во вводеВЫl30де порта А? 36. НаnL/1ШL/1те короткую последовательность команд, KOTopa заnроrраММL/1рует порт В как BЫXOДHO порт, в котором все выводы будут nредназна4ены ДЛ ВЫ130да цнфровой ннформаЦНL/1. 37. НаnL/1шнте KOPOTKYIO nоследоватеJlЬНОСТЬ команд, KOTopa заnроrраММL/1рует БНТОl3ые nОЗНЦL/1L/1 2 L/1 3 порта В на ввод ннформаu.L/1L/1, а остаЛЫlые БНТОl3ые nознцнн nop та В  на вывод ннсрормаЦНL/1. 38. OnHwHTe, как работают npepbIBaHL/1. 39. Что nрОL/1СХОДНТ, коrда возннкает BbIcoKOnpHOpL/1TeTHOe npepbIBaHL/1e? 40. Объсннте назначенне операторов #pragma interrupt MyHighlnt L/1 #pragma code high vector = Ох08. 41. ЕСЛL/1 CPYHKu.L/1, возвраw,аюw,а 16-разрдное 4L/1СЛО, L/1сnользуетс в nроu.едуре обслу>кнвани npepbIBaHL/1, 4ТО дол>кно быть указано в операторе #pragma ДЛ соот- ветствуюw,еrо npepbIBaHL/1? 42. Что выnолнет HanL/1CaHHa на 3ЫKe С команда INTCONbits.GIEH = 1? .  43. Каково Ha3Ha4eHL/1e perHcTpoB IPR, PIE L/1 PIR? .. 44. ОnИШL/1те, как TaMep 1 нсnользуетс ДЛ Toro, 4тобы ВЫЗЫl3ать 1 секундныe npepbIl3aHH в прнмере таймера peanbHoro временн, рассмотренном в разделе 6.4. 45. Переnншнте nроu.едуру TaMepa реальноrо BpeMeHL/1 так, 4тобы отсчеты се- кунд, минут L/1 4асов храНL/1ЛНСЬ не в двоичном, а в ДВОL/14нокоднрованном дестнчном формате (CMOTpL/1Te OnL/1CaHHe команды DAW в тексте данной KHL/1rL/1). 46. Что будет, еСЛL/1 флаr заnроса npepbIBaHL/1 не будет сброшен в ноль 13нутрн процедуры оБСЛУ>КL/1ванн npepbIBaHL/1? . 47. CCPOpMHpYTe BbICOKOnpL/10pHTeTHoe npepbIBaHHe, которое будет вызывать срункцню tick(void) однн раз в мнллнсекунду. ПРНМL/1те, 4ТО тот >ке caMЫ К13арцевы re нератор на 32768 ru. L/1сnользуетс ДЛ формированн масштаба по OCL/1 BpeMeHL/1 для таймера 1. 48. IЕСЛL/1 вход Vref+ PIC равен 3,3 В, а на вход Vrеfnодана земл, каков будет шаr Hanp>KeHH АЦП? 49. ОnL/1шнте, как nporpaMMa мо>кет осуществлть выборку входа АЦП на ААО 2000 раз в секунду. 50. Как Ha4HHaeTC npou.ecc nреобраЗ0ваНL/1 в АЦn? 51. Как выбнраетс BXOДHO канал АЦП? 52. Объсните, как l3ыnолнетс c4HTbIBaHL/1e данных L/13 3СПnЗУ данных. 53. Как долrо 3СПnЗУ данных coxpaHeT L/1нсрормаu.L/1Ю 6ез nодаЧL/1 на Hero Hanp >KeHH nитаl/Н? 54. Сколько BpeMeHL/1 заНL/1мает заnL/1СЬ в 3СnnЗУ данных? 55. Почему npepbIBaHL/1 заnрещаютс в CPYHKu.HH, nрL/1веденно в npL/1Mepe 6.24? 56. ОБЪСНL/1те, как модуль ССР замерет 4астоту в CeTL/1 nepeMeHHoro тока в npL/1Mepe 6.26. 
rnaBa 7. Базовый вво)].-выво)]. 249 rЛАВА 7. Базовый BBOДBЫBOД AaHHa rлава OnL/1CbIBaeT то, как OpraHL/130BaTb L/1HTepcpec L/1 L/1СnОЛЬЗ0вать MHOIL/1e ра3ЛL/14ные баЗ0вые устройства BBoдaBЫBoдa CL/1CTeM PIC18. В He L/1зло>кена L/1l1cpopMa- ЦL/1 по аппаратным L/1 nporpaMMHbIM средствам, неоБХОДL/1ма ДЛ орrаНL/1заu.L/1L/1 L/1HTep срейса МL/1КРОКОНТРОЛJlера с nереКnЮ4атеЛЬНЫМL/1 L/1 ДL/1сnлеНЫМL/1 YCTpoCTBaML/1, а так>ке нзло>кены основы nporpaMMHbIx средств, неоБХОДL/1МЫХ ДЛ уnравлеНL/1 3TL/1ML/1 YCTPO CTBaML/1. 3та rJlaBa также OnL/1CbIBaeT MHoro ,lJ,aT4L/1KOB, npe,lJ,Ha3Ha4eHHbIx ДЛ Toro, 4тобы CHL/1MaTb L/1нсрормаu.L/1Ю о ML/1pe BOKpyr нас L/1 уnравлть ра3ЛL/1ЧНЫМL/1 acneKTaML/1 среды, 13 KOTOPO мы наХОДL/1МС. После завершеНL/1 L/13Y4eHL/1 зтой rлавы вы смо>кете: 1. Выnолнть YCTpaHeHL/1e дребезrа контактов L/1 разрабатывать nporpaMMbI для работы с КЛЮ4аМL/1. 2. ФОРМL/1ровать ннтерсрейс L/1 npOrpaMML/1pOBaTb клаВL/1атуры любых размеров. З. ПL/1сать nporpaMMbI как ДЛ отдельных свеТОДL/10ДОВ, так L/1 ДЛ cerMeHTHpoBaH ных светодиодных ДL/1сnлеев, работаюw,L/1е в МL/1кроконтроллерах PIC18. 4. Уnравлть ЖК-L/1НДL/1катораМL/1, nОДKJlЮ4еННЫМL/1 к МL/1кроконтроллеру. 5. Разрабатывать nporpaMMbI ynpaBJleHL/1 шаrОВЫМL/1 злектромотораМL/1, а так>кс злектромотораМL/1 nocTOHHoro тока. 6. ФОРМL/1ровать L/1HTepcpec L/1 уnравлть peJle L/1 солеНОL/1,lJ,аМL/1. 7. V1СnОЛЬЗ0вать даТ4L/1КL/1 ДЛ pacn03HaBaHL/1 ра3ЛL/14НЫХ соБЫТL/1. 8. V1СnОЛЬЗ0вать КО,lJ, АС5 npL/1 реаJlL/1заu.L/1L/1 ДL/1стаНЦL/10нноrо уnравлеНL/1 в nрL/1ло>ке HL/1X, paCCMaTpL/1BaeMbIX в ка4естве npL/1MepoB. 9. BbInOJlHTb замеры pa3JlL/14HbIX rазообразных Bew,ecTB в окру>каюw,е среде. 7. 1 . ВХОДЫ ОТ ключевых схем nереKJlючатеЛL/1 у>Ке L/1СnОЛЬЗ0валL/1СЬ в npL/1Mepax npOrpaMML/1pOBaHL/1, рассмотренных в nредыдуw,L/1Х rлавах, однако npL/1 зтом не давалась HL/1KaKa L/1HcpopMau.L/1 о L/1X nОДКJ1Ю4еНL/1L/1. ПереKJlЮ4атеЛL/1 ДОЛ>КНЫ nОДKJlЮ4атьс корректно, L/1Ha4e MOryт B03HL/1KHYТb проблемы - такнс, 'HanpL/1Mep, как 4УВСТВL/1тельность к помехам L/1ЛL/1 MeXaHL/14eCKL/1 дребезr контактов. Переключательный интерфейс ПереKJlЮ4атеJlL/1 4асто nредстаВJlIOТ собо однополюсное одноходовое YCTPOCT во (SPST), которое npL/1 своеабатываНL/1L/1 соеДL/1нет вместе полюсные детаЛL/1 (KOH такты). Контакты замыкаютс L/1ЛL/1 размыкаютс, коrда nереKJlЮ4атеnь ВЫКnЮ4аетс. На pL/1c. 7.1 представлено несколько TL/1nOB MeXaHL/14eCKL/1X nереКЛlO4атеJlе, наL/1более 4асто нсnользуемых с МL/1кроконтроллераМL/1. Кажды nереKJlЮ4атель L/1nL/1 кнопка ВКnЮ4аютс в схему TaKL/1M обраЗ0М, 4тобы на ero выходе НЛL/1 выходах nРL/1сутствовал L/1ЛL/1 лоrL/14еСКL/1Й ноль, L/1ЛL/1 лоrL/14еска e,lJ,L/1HL/1u.a. На pL/1CYHKe nоказаны nереKJlЮ4атеЛL/1 TL/1nOB SPST, SPDT (одноnолюсны ДBYXXOДOBO) L/1 DРDТ (ОДНОnОJlЮСНЫ ДBYXXOД0130) nерекnючатеnL/1 L/1 KHOn04HbIe. Во всех СЛУ4ах L/1сnользуетс HarpY304HbI pe3L/1CTOp в 1 О кОм, nодаЮЩL/1 на выход nереKJlЮ4атеJl JlоrL/14ескую еДL/1НL/1u.у, коrда контакты nереКnЮ4ател раЗ0МКНУ- ты. Зна4еНL/1е 3Toro pe3L/1CTOpa может L/13MeHTbc от OTHOCL/1TeJlbHO MaJlorO в 1 кОм (бо лее HL/13KL/1e 3Ha4eHL/1 COnpOTL/1BJleHL/1 ВЫЗ0ВуТ 4pe3MepHЫ ток) до маКСL/1маJlыюrо 3Ha чеНL/1 в 47 кОм (БОJlЬWL/1е 3Ha4eHL/1 ВЫ30ВуТ nроБJlемы с nOMeXaML/1). V13 rлавы 6 вы моrЛL/1 бы BCnOMHL/1Tb, 4ТО выводы порта В снаб>кены слабыми HarpY304HbIML/1 pe3L/1CTOpaML/1, которые L/1СnОЛЬ3УЮТС как HarpY3KL/1 npH работе как с nереKJlЮ4атеЛМL/1, так L/1 друrL/1МL/1 устроствами, требуюw,L/1МL/1 HaJlL/14L/1 HarpY304HbIX СОnРОТL/1влеНL/1. Некоторые верСL/1И PIC нмеют так>ке слабые HarpY3KL/1 выводов порта D. 
250 ITримененне MHKpOKOHTpOnnepOB PIC] 8 VCC vcc 10К 10К '  тум:бnер THna SPST очный 7' nерекшочarеnь SPST vcc vcc 10К 10К тум:бnер THna SPOT кнопочный псреКЛIOчаТСJIЪ тнпа SPOT vcc vcc тум:бnер THna DPDT 10К 10К переюпочателъ тнпа DРПТ Рис. 7.1. Ра3ЛL/1чные nереKJlЮ4атеЛL/1. An орrаннзаЦL/1L/1 npoCToro ввода CL/1rHaJlOB в МL/1кроконтроллер в CL/1CTeMaX 4асто L/1СnОЛЬ3УЮТС тумблеры TL/1na SPST L/1JlL/1 KHOn04HbIe nерекnючатели. nереКЛЮ4атсль THna SPST  зто caMЫ дешевы L/13 имеющнхс в HacTow,ee BpeM nереключателе. В об- щем CJlY4ae nереKJl104атели Moryт создавать nроБJlемы npH нх L/1СnОЛЬ30I3аНL/1L/1 ДJl 13 13 ода некоторых TL/1nOB данных в CL/1JlY Toro, 4ТО онн nодвер>кены механнческому ,lJ,ребезrу KOH тактов. BHYТPL/1 nереКnЮ4ател HaXOДTC метаЛЛL/1ческне контакты, пр н соединеНL/11 которых cpH3L/14eCKL/1 возннкает вленне MeXaHL/14eCKOro дребезrа контактов, которое ДJlHTC некоторое BpeM. 3тот дребезr ДОJl>кен быть KOMneHCL/1pOBaH 13 снстемах, 13 KOTO рых КОЛL/14ество соеДL/1неннй илн сннхронизаu.L/1 срабатыванн nереКЛЮ4ателей влет C ва>кной. 
rnaBa 7. Базовый BBO)].BЫBO)]. 251 Компенсация дребезrа контактов переключателей V1MeIOTc ра3ЛИ4ные схемы устранени ,lJ,ре6езrа контактов nepeKJlI04aTene. Рис. 7.2 показывает срорму злеКТРИ4ескоrо сиrнала в СЛУ4ае ,lJ,ре6езrа контактов nepe- ключател. Помехи возникаlOТ в сиrнальных линнх nереKJl104ателе в силу Toro, что оБЫ4НО явлетс невозмо>кным зкранировать nереKJl104атель н ero соединени с сис темой от окру>каlOw,их помех. В большинстве СЛУ4аев помехи, так >ке, как и дребезr, ДОЛ>КНЫ быть удалены с контактов системы ДJl обесnе4ения ее надежно работы. Как можно видеть на НЛЛlOстрации, nереKJlЮ4атели Moryт оказаться чрезвычайно WYMHbIMLI1 устроствами. КОЛИ4ество шума зависнт от oKpY>KalOw,e среды, при зтом на рис. 7.2 представлен зкстремальны СЛУ4ай. Дребезr контактов так>ке является nepe менной веЛИ4ИНО. Коrда nереKJl104атель яВляетс новым, дребезr контактов будет ми НИМaI1ЬНЫМ, однако по мере старени nереКЛlOчателя дребезr контактов CTaHOBHTC все более серьезным. nOMeXH, возникаlOw,ие при разрыве контактов, nраКТИ4ескн отсутст- BYIOT, коrда nереKJllOчатель HOBЫ, однако они возникаlOТ по мере старени nepeKJl104a тел и становятс все более интенсивными со временем. Как устранить зти проблемы, 4т06ы nОЛУ4ИТЬ 4ИСТЫ сиrнал, nоказанны в ни>к He 4астн рисунка? nporpaMMHbIe временные задержки 4асто ИСnОЛЬ3УlOтся, 4тобы nponycTHTb nроблемные временные областн сиrналов. Moryт так>ке ИСnОЛЬЗ0ватьс специальные злектронные схемы, однако онн CTOT денеr, n03ToMY LI1СnОЛЬ3УlOТСЯ дo вольно редко. Рис. 7.3 демонстрирует некоторые злектронные схемы, которые приме НЯlOтся ДJlЯ устранени дребезrа механическнх nереKJllOчателе. Эти схемы весьма зсрсрективны, однако достаТ04НО дороrи. ЛУ4ШИМ и менее дороrостоw,им способом YCTpaHeHH проблемы дребезrа кон- тактов и шума ВЛетс ИСnОЛЬЗ0вание nporpaMMHoro обесnе4ення. Функция, которая удалет дребезr контактов н шум nереКЛlO4ателя, nОДКЛlO4аемоrо к ЛlOбому бнту порта А, ИЛЛlOстрируетс npHMepoM 7.1. Этот пример исnользует временные задер>ккн ДJlЯ YCTpaHeHH шума и nроблем дребезrа контактов nереКЛlOчател. Коrда nереКЛlOчатель аходитс в УСТО4ИВОМ состонии лоrИ4ескоrо нул, отрабатывается выход И3 cpYHK ции. nредnолаrается, что TaKTOBa 4астота равна 4 мrц, а временная задер>кка равна  15 мс. nереКЛlOчатели имеют макснмальное BpeM дребезrа контактов, равное 8 МС, позтому в данном npHMepe исnользуется BpeM задер>кки, равное 15 мс, rарантирую- w,ee nponycKaHHe периода дребезrа контактов. В 06w,eM СЛУ4ае ДJlЯ удаленн дребезrа контактов nриемлемыми ВЛlOтс времена задер>ккн от 1 О до 20 мс. ЕСЛLl1 I3ремя за ,lJ,ер>ккн будет HaMHoro больwи20 мс, ра60та nереКЛlO4ателя замеДJlИТС, потому 4ТО он дол>кен будет удер>киваться в состонни срабатывани слишком долrо. В nриведен- HO nporpaMMe ИСnОЛЬ3УIOТС два оператора #define, оnределlOw,их порт, а так>ке 3Ha 4енне BpeMeHHO задер>ккн. nримененне операторов #define nозволяет леrко изменть порт и зна4ение BpeMeHHO за,о,ержки. 
252 Прнмененне MHKpOKOHTpOnnepOB PIC 18 УСС 10К 2 7 тумбnер тнпа SPST Фактический сиrнал на переключателе Побочные помехи \u   Побочные ПОIнехн Дрсбезr контактов Разрывные помехи Сиrнал на переключателе, очищенный от дре6езrа контактов r Побочные помехи Рис. 7.2. Дре6езr контактов переKJl104ател и шум 
rnaBa 7. Базовый ВВОkВЫВО)]. 253 U1A U1B 4 74НСТ04 74НСТ04 Дешевая версия vcc R1 10К U2A 2 3 74НСТОО U2B 74НСТОО R2 10К  Классическая, описываемая в учебниках, VCc версия Рис. 7.3. 3лектронные схемы nодавлени дре6езrа контактов. 
254 Прнмененне мнкроконтролnеров PIC18 Пример 7.1 1I »> Не за6УАьте BKnqMTb оператор #include <delays.h> «< II *************** перекnqатеnь ************************* 11 Аnя МСnОnЬЗ0ванмя 3TO YHKUMM она доnна взыва'l'СЯ сnедующмм 06разом: 11 11 < перекnчатеnь на 6мте 2 11 11 11 I1 < rrерекnчатеnь на 6мте б 11 II II II <- перекnqатеnь на 6мтах О м 1 II Switch (Ох04) or Switch (Ох40) мnи Switch (Ох03) II ********************** КОНСТАНТЫ ************************* #define KEYPORT PORTA I1 мзменмть Аnя соответствмя peanbHOMY ПОРТУ #define DELAY 15 I1 мзменмть, eCnM HYHO 11 Аnя COOTBeTCTBye BpeMeHHO заАеркм void Switch (char bit) do { 1I OMAaHMe oCB060AeHMR while ((KEYPORT & ЬН) ! = bi t) ; I1 while ((KEYPORT & ЬН) '! = ЬН) CIrWdtO; eCnM не06ХОАММО De1aylKTCYx (DELAY) ; } while ((KEYPORT & bit) != bit); do { II OMAaHMe наатмя while ((KEYPORT & bit) == bit); II while ((KEYPORT & bit) == bit) CIrWdt () De1aylKTCYx (DELAY) ; eCnM не06ХОАММО ) while ((KEYPORT Sc bit) == bit); Первы цикл dowhile rарантирует, что переключатель находнтся в СОСТОНL/1И ло rИ4еской еднннцы, т.е. в oTnyw,eHHOM состояннн - еСЛL/1 3ТО не так, то nporpaMMa будет ЦL/1KJlL/1ТЬ в зтом месте. В некоторых случах цнкл while будет содержать срункцию ClrWdt(), сбрасываlOw,ую сторожевой таймер. (Еслн вам nотребуетс зта срУНКЦL/1, рас- KOMMeHTL/1pYTe оператор while перед оператором //while). Первый цнкл dowhile YCTpa HeT ВСЯКL/1е импульсы помех, возникаюw,ие прн переходе выхода nереКЛlOчателя L/13 состояния лоrL/1ческой еДИНL/1ЦЫ в COCTOHL/1e лоrическоrо нуля, как зто nоказано на рнс. 7.2. Дл nОЛУ4еНL/1Я усточивоrо OTKpbIToro СОСТОЯНL/1 nереключатель должен раз MЫKaTbC с отработкой как до, так L/1 после ОТКРЫТL/1Я временной задержкн в 15 мс. V1MeHHo так YCTpaHeTC дребезr контактов н шумы. Как только nереKJllOчатель будет открыт, BTOpO ЦL/1КЛ dowhile тестирует nереКЛlOчатель на состоянне лоrнческоrо нул, Т.е. на замкнутое состояНие. (Этот u.икл так>ке мо>кет ВКЛlO4ать СРУНКЦL/11О ClrWdtQ.) Если pacn03HaHo УСТОЧL/1вое состояние лоrическоrо нул, nродолжаюw,ееся дольше, чем 15 
rnaBa 7. Базовый вво)].-выво)]. 255 МС), отрабатывается возврат L/13 CPYHKu.HH. ЭТО зсрсреКТL/1ВНО удалет ЛlOбой дребезr НЛL/1 шумы на любом входном бите порта, соединенном с переКЛЮ4ателем ЛL/1бо кнопкой. Единственный случа, коrда OnL/1CaHHbI алrоритм не сработает,  зто 04ень редкий, однако все >ке B03MO>KHЫ случай, коrда импульсы шумов следуlOТ точно с 15 МL/1ЛЛL/1секундным ннтервалом. Эта nporpaMMa nредnолаrает, что nереKJlючатель вклю чен, коrда ero BЫXOДHO снrнал находится в COCTOHHH лоrИ4ескоrо нуля; еслн >ке зто не так, то ну>кно nOMeHTb местами два ЦНKJlа do-while в CPYHKu.HH. 3та nporpaMMa обесnе чивает так>ке удаление дребезrа контактов н шумов ДJl несколькнх nереключателей, если задано корректное значенне nepeMeHHo YCTaHOBKL/1 битов. HanpHMep, ДJl удале HH дребезrа контактов и шумов от nереKJllOчателей, nОДKJl104енным к бнтам 1 и 5 порта А, следует ИСnОЛЬЗ0вать ВЫЗ0В СРУНКЦL/1И Switch (Ох22). 3на4енне Ох22 (0010 0010) выби рает бнты 1 ДJl 5 теСТL/1рования. Возврат будет отработан, еслн какой лнбо nереключа- тель будет aKTL/1BL/1pOBaH. Клавиатуры D nрикладных nporpaMMax, иноrда ИСnОЛЬ3УlOтс цисрровые KJlaBHaTypbI, в HL/1X так>ке ну>кно YCTpaHTb дребезr контактов. В дополнение к YCTpaHeHHIO дребезrа KOHTaK тов, ЦL/1сррова KJlaBHaTypa дол>кна B03Bpaw,aTb код Ha>KaTO клавиши. Рнс. 7.4 L/1ЛЛЮСТ рирует ЦИСРРОВУIO клавиатуру телесронноrо типа, nОДKJllOченнуlO к портам А н В. Это матрица размерностн 4 х 3 клавншн. Цисрровые клавиатуры доступны в целом ряде стилей и размеров - от размера 2 х 2 до n04TH любоrо размера. МатрL/1ца цисрровой кла 8иатуры создаетс с НСПОЛЬЗ0ваннем кнопочных nереKJl104ателе THna SPST, которые "ри на>катни соединIOТ вертикальный столбец с rОРИЗ0нтальным pДOM матрицы. Кла зиатурная матрица  зто наиболее pacnpocTpaHeHHa схема коммутацни клавиш в Ma .1ЫХ KJlaBHaTypax. В зтом интерсресе, порт А исnользуетс как входной порт ДJl считываНL/1Я строк, 3 порт В нсnользуетс как BЫXOДHO порт для выбора столбцов. НаrРУЗ0чные резисторы ..::\QЛ>КНЫ быть установлены во входной порт ДJl обесnе4ення ero nравнльной работы. Еслн порт В нсnользуется как BXOДHO порт со включеннымн слабымн HarpY3KaMH, Ha УЗ0чные резнсторы не устанавливаIOТС). Матрицы ЛlOбых pa3Mep013 подключаются зналоrН4НЫМ способом, за ИСKJl104еннем Toro, 4ТО выбор портов I3вода  вывода мо>кет JТличатьс. nporpaMMa, исnользуема дл обнару>кени замыкани КЛlOче, так>ке YCT :JaHeT ребезr контактов мало клавиатуры. Дл YCTpaHeHH дребезrа контактов малой U1aBL/1aTypbI лоrическнй ноль nOMew,aeTc во все три бита порта В. nporpaMMa для уст- :>знення дребезrа контактов ЛlOбых KJlавиш идентнчна nрнведенной в npL/1Mepe 7.1, за сключеннем Toro, что nроверяlOТС биты от"ЯАО дО RАЗ вместо одноrо БL/1та. Как roль <.0 дребезr замкнутоrо КЛlOча устранен, ero nозицня рассчнтываетс nporpaMMHO no :редством контрол каждоrо столбца по отдельностн L/1 тестнроваНL/1Я порта А, на npeA мет замыкання KaKoro лнбо КnlOча в столбце. В примере 7.2 nрнведена СРУНКЦL/1Я, кото- :эая B03Bpaw,aeT код KJlавнши ДJl данноrо КЛlOча. 3та cpYHKЦH исnользует CPYHKu.L/11O Switch, nрнведенную в примере 7.1 ДJl устранени дребезrа контактов клаВL/1ШИ, OДHa 1[() 6итова структура в бнтово nepeMeHHo срункции Switch в ней нзменена на OxOF, результате чеrо срункци проверет самые npaBbIe 4 бита порта А. 
256 Прнменен'ие мнкроконТролnеров PIC18 vcc RAO RAl RЛ2 RЛ3 RВO RВl RB2 10К 1 2 3 4 5 6 7 8 9 10 О 11 о 4 8 1 5 9 2 6 10 3 7 11 Клавиarура с точки зрения проrpаммы перед просмотром поисковой таблицы Фактическая клавиатура Рис. 7.4. Матрнца малой KJlaBLI1arypbI телесронноrо TLI1na 
fлава 7. Базовый ВВО)].-ВЫВО)]. 257 Пример 7.2 1I 1I KOA кnавмш KnaBMaTYP TeneOHHoro тмпа, I 1 сохраняеме как ста'l'мчные KOHCTaHT в паМRТМ проrрамм II rom near char 100kupKey[] = 1, 4, 7, 10, 1, 5, 8, о, 3, 6, 9, 11 II neB cTon6eu I1 cpeДHM cTon6eu I1 прав cTon6eu ) ; 1I II мсrrоnьзует YHKUM Switch мз rrpMMepa 7.1 11 unsigned char Кеу (void) { #define МASK OxOf #define ROWS 4 11 установка маскм I1 установка 4Mcna строк char а ; char keyCode; PORTB = keyCode =0; Swi tch (МASK); II 04мстка порта В м keyCode 11 устранение дре6езrа м оание o кnaBМWМ PORTB = OxFE; while ((PORTA & МASK) { II B60p caMoro neBoro cTon6ua МASK) II пока кnaBMwa не HaдeHa PORTB  (PORTB « 1) I 1; keyCode += ROWS; II ПОnУ4енме cneAyero cTon6ua II прм6авnенме строкм к КОАУ кnавмшм for (а = 1; а != о; а «= 1) { II find row if ((PORTA & а) == О) break; keyCode++; } return 100kupKey[keyCode]; II просмотр на KoppeKTH КОД кnавмшм  Клавиаryрна npOrpaMMa сканнрует KJlaBHaTYPY cneBa направо н сверху ВНИ3. ЭТО показано на рис. 7.4, Hapдy с сраКТИ4ескими кодамн KJlавнш ДJl 3TO клавнатуры. Как TOnbKO стол6еu. Ha,lJ,eH, 4ИСЛО 0,4 нnи 8 nOMew,aeTc в nepeMeHHYIO keyCode, чтобы ука- зать CTapTOBЫ код KJlaBHWH (код BepXHe KJlaBHWH) ДJl Ha,lJ,eHHOrO столбца. После HaxO>K.цeHH cTon6u.a, строка npocMaTpHBaeTc на norH4ecKH ноль в порте А с тем, что бы HaTH KJlавишу и ее строку. Если KJlавиша не Ha,lJ,eHa, keyCode ннкрементнруется, чт06ы 6ыло nOnY4eHo 4HCnO Me)l(,lJ,y О н 11, которое соответствует KJlавнше на клавиату ре. Есnи KJlавиwа HaдeHa, то nРОН3ВО,lJ,итс 06раw,ение к nOHcKoBO таблице с тем, чт06ы npe06pa30BaTb nросканированны код KJlавнwи (CKaHKOД) в срактическн код клавиwи, соответствуlOw,и ее 060зна4ениlO. nporpaMMa rенерирует коды клавиш О, 1,2 
258 Прнмененне МНКрОКОНТролnеров PIC18 и 3 для крайнеrо левоrо столбца; 4, 5, 6 н 7 ДJlЯ среднеrо стол6u.а н 8, 9, 10, LI1 11 ДJlЯ caMoro npaBoro столбца. В СLl1ЛУ Toro, что обозначения клаВLI1Ш не совпадают с 31 LI1МИ кодаМLI1, исnользуется nОLl1сковая таБЛLl1ца таБЛLl1u.ы дл Toro, чтобы преобраЗ0вать Ha денные коды в nравнльные обозначения кnавнш KJlaBHaTYPbI. Функu.н Кеу HanLl1CaHa с НСnОЛЬЗ0ванием несколькнх операторов #define, KOTO рые обnеrчаlOТ выполнение нзменеНLI1Й в консрнryрацнн кnaBHaTYpы. Напрнмер, еслн LI1сnользуется клавнаryра 5 х 6, то 5 строк ее матрнцы nодключаlOТСЯ к выводам от RAO до RA4, а 6 столбцов зтой матрнцы подсоедннIOТСЯ к выводам от RBO до RB5. Onepa торы #define H3MeHIOTc npH зтом так, 4тобы nеременная MASK была равна OxIF, а nеременная ROWS  пяти. npH зтом nporpaMMa 6удет работать с новым н pa3MepaMLI1 матрLl1ЦЫ кnaBLI1arypbI. Понсковая таБЛLl1ца так>ке доnжна быть нзменеlШ С тем, 4тобы содер>кать 30 входов вместо 12, потому что KJlaBLI1aтypa с MaTpHцe 5 х 6 имеет 30 KJla ВLI1Ш, а не 12. nреАnОЛО>КНМ, что 4НСЛО счнтываетс Н3 KJlaBLI1aTypbI в nporpaMMY. Аля ero ввода нсnользуетс СРУНКЦLl1Я #key, npLl1 зтом срункци *key нсnользуетс ДJlЯ заБLl1ВКLI1 ЛlOбых ошибок ввода. Функцн, KOTopa нсnользует CPYHKu.HIO Кеу ДJlЯ считыванн ЧLl1сла с кла виатуры, nоказана в прнмере 7.3. Эта срУНКЦLl1Я B03Bpaw,aeT 16-разрядное целое без знаковое чнсло npH на>катин клаВLI1ШИ. 3тот возвраw,аемый параметр трудно НСnОЛЬ30 вать, потому 4ТО отсутствует cooTBeTCTBYIOw,ee YCTPOCTBO от06ра>кени, о 4ем будет rOBopHTbC в слеДУIOw,ем nодразделе. nриводнмый пример nporpaMMbI, однако nOKa- зывает, как осуw,ествляетс ввод числа с KJlавиатуры. Пример 7.3 unsigned int GetNumber (void) ( char number[5] ; int retva1 =о О ; char count = О; char temp = Кеу(); while (temp != 11) { // rrOKa нет ввода if (temp == 10 && count != О) count-; else { Ilшаr назад number[count] temp; if (count != 5) count++; // rrpMHRTb 4ИСnО } temp == Кеу() ; } for (temp  О; temp < count; temp++) retval = retval * 10 + number[temp] return retval; II пре06раЗ0вать в АВОИ4rtyЮ opмy 
rлава 7. Базовый вво)].-вывод 259 7.2. Устройства индикации Сеrодня доступно MHoro ннднкаторных YCTPOCTB, ВКЛlOча светодноды, >КL/1ДКОК ристаллнчеСКL/1е инднкаторы, срлуоресцентные инднкаторы н Т.,lJ,. Этот ра3Аел описыва- ет зтн L/1НДL/1каторные устройства, Hapдy с злектроннымн схемамн н nporpaMMHbIM обеспеченнем, ну>кнымн ДJl Toro, чтобы свзать нх с мнкроконтроллером. Светодиоды Светодноды впервые nовнлнсь в середнне 1960ыx. Сеrодня доступны CBeTO ДL/10ДЫ MHorHx разлнчных цветов, о>кидаетс, что скоро онн будут L/1MeTb BL/1A rибкой op rанической nанелн, KOTopa была названа OLED (орrаннческнй CBeTOAL/10A). V1з-за L/1X дешеВL/13НЫ н ДJlнтельноrо срока СЛУ>кбы, через относнтельно короткое время CBeTO диоды MOryт заменить лампы накалнванн и срлуоресцентные трубкн в качестве HCT04 ников освеw,ення обw,еrо назначенн. Светодиоды часто ПОДКЛI04аIOТС к встроенным CL/1CTeMaM в ка4естве инднкаторов илн cerMeHTHbIx цисрровых ИН,lJ,икаторов. V1x rлавное преимуw,ество заKJllOчаетс в BЫCOKO внднмости Н долrове4НОСТН. СвеТОДL/10ДЫ обычно работаlOТ в теченнн nрнблизительно 20 лет. Друrими их nреимуw,ествамн явлются относительно ннзкне требования к nотреблемо MOW,HOCTH и ннзкое теnловыделеНL/1Я, по cpaBHeHHIO с лампами накалнванн. CTaHдapTHЫ KpaCHЫ, зелены, илн >келты СВЕТОДV10Д требует ДJlя cBoero полноrо свечени ток в 1 О мА н наnря>кенне в 1,65 В. Потребляемая MOW,HOCTb свето- ДL/10да в ре>кнме nолноrо свеченн (1 О мА х 1,65 В) равна 16,5 мВт. Эквнвалентная лам па накалнвани требует 6,3 В наnр>кення npH токе в 100 мА нлн 630 мВт MOW,HOCTL/1. Т.е для CBoe работы СВЕТОДV10Д требует в 40 раз меньше моw,ности, чем 3КВL/1валент ная лампа накалнванн. Рнс. 7.5 nOKa3bIBaeT однн светоднод, nОДКЛlOченный при nOMO J..).И L/1нтерсрейса к выводу порта PIC18. Однн Н3 nоказанных HHTepcpeCOB потребляет ток равный 1 О мА и L/1MeeT ннвертор, KOTOpЫ обесnечнвает ток, достаточный ДJlЯ свечеНL/1Я С веТОДL/1 ода , что HeMHoro больше, 4ем ток, доnускаемы ДJl вывода порта. Второй L/13 показанных интерсрейсов nponycKaeT ток в 8,5 мА, - 3ТОТ ток вляетс доnустнмым для BBoдa порта. В обонх случах исnользуется последовательное ВKJllOченне TOKoorpaHH чиваlOw,еrо резнстора, велнчнна KOToporo выбнраетс в соответствнн с законом Ома (R = U/I). Поскольку nаденне наnря>кенн на светодноде равно 1,65 В, nадеНL/1е Hanp>Ke- ння на резнсторе равно 3,35 В, то ток в 1 О мА оnределет резнстор в 335 Ом (3,35/1 О мА). Резисторов номнналом 335 Ома не cyw,ecTByeT, n03ToMY выбнрается стандартный резистор с номиналом в 330 Ом. (nеречень стандартных номиналов pe3L/1CTOpOB мо>кет быть найден в V1HTepHeT.) 3начени резистора ДJl тока в 8,5 мА выБL/1рается тем >ке ca мым способом. V1СnОЛЬЗ0ванне тока в 8,5 мА заставлет светоднод светитьс n04TL/1 так же снльно, как н npH ИСnОЛЬЗ0ваннн тока в 1 О мА, 3TOT ток явлется nрнемлемым в большинстве nрнло>кени. Как 06ЪCHeTC в rлаве 6, в зависимостн от обw,ей MOW,HO- стн потребления PIC н ИСnОЛЬЗ0вани выводов BBoдaBЫBoдa, на отдельных выводах ток мо>кет достнrать веЛИ4ННЫ 25 мА. 
260 Прнмененне MHKpOKOHTpOnnepOB PIC 18 5V 5V R1 330 R2 390 U1A g  D1 ifomA g j 02 g  g 8.5 тА ВЫВОД порта 2 ВЬШОД lIopl'a 7404 Рис. 7.5. Управление светоднодом npH ИСnОnЬЗ0ваннн наnря>кенн nнтани, paBHoro +5,0 В nредпоnо>ким, 4ТО ДJl уnравлени светодно,lJ,ОМ нсnоnьзуется Hanp>KeHHe nHTa HH не 5 В, а 12 В. Макснмальное наnря>кенне на ЛlO60М выводе PIC 18 равно 7,5 В, - 3ТО 0значает, 4ТО 12 В выведет мнкроконтроллер Н3 строя. Чтобы свзать ИСТ04ННК nи таНLI1Я в 12 В со светоднодом в 3ТОМ случае не06ходима cooTBeTcTBYIOw,a схема ynpaB- лення. Во MHorHX СЛУ4аях нан60лее зсрсректнвной, с точки зрения стоимостн, схемой уnравленн будет npocTo TpaH3HCTOpHЫ ннвертор, как 3ТО nоказано на рис. 7.6. На nоказанно схеме транзнстор 2N2222 НЗ0лнрует микроконтроnnер от наnря>кенн nH тання 12 В н обеспечивает соответствуlOw,нй ток ДJl СВЕТОДV10ДА. В 3ТОМ npHMepe исnользуется CHHH светоднод, KOTOpЫ требует ДJlя CBoe работы наnржени в 3,5 В и тока в 20 мА. Транзнстор в данном сnучае ра60тает как усилнтель тока, KOTOpЫ YM но>кает BXOДHO ток базы на козсрсрнцнент усилення TpaH3L11CTOpa, модуnнру ток змит- TepHoro перехода н срормиру ток колnектора. В данном npHMepe требуется ток коллек тора, равный 20 мА, при 3ТОМ МLI1нимальны козсрсрицнент уснлення тока ДJl данноrо транзнстора (2N2222) равен 100. Такнм обраЗ0М, ток базы, необходимы ДJlя Toro, 4TO бы ПОЛУЧLl1ТЬ ток коллектора в 20 мА, следоватеJlЬНО равен 20 мА/100 НЛLl1 0,2 мА,  3ТОТ ток мо>кет быть леrко ссрормирован микроконтроnлером. Pe3L11CTOp в цеnн базы рассчн TЫBaeTC, LI1СnОЛЬ3УЯ ток в 0,2 мА н значенне nаденне наnржеНLI1 на резисторе базы, равное 3,6 В. Падение наnря>кенн базазмнттер в данном СЛУ4ае будет равно 0,7 В. Вспомннте Н3 rлавы 6, 4ТО мнннмальное выходное наnря>кенне nоrН4еской еДLl1I1НЦЫ для мнкроконтроллера равно 4,3 В, а макснмальны ток  3,0 мА. nреДnОЛОЖLl1М, что нам ну>кна CBeTOДHOДHa LI1нднкаторная nанель снrналов nOl.Ю рота, устанаВЛLl1ваемая на заднем стекле автомобнл LI1ЛLl1 же над номерным знаком мо- тоцнкла. Дл создаНLI1 3TO ннднкаторной nанелн мы будем НСnОЛЬЗ0вать 20 яркнх красных свеТОДLl10ДОВ, а в ка4естве мнкроконтроллера - PIC18F1220. PLI1C. 7.7 показыва ет орrаНLI1заЦLl1Ю nодобно снстемы. ДeCTb выводов порта мнкроконтроллера уnравля IOТ свеТОДНО,lJ,аМLI1, н два входных вывода слу>кат HHTepcpeCOM злеКТРLl1ческой снстемы. nporpaMMHoe обесnечеНLI1е дол>кно обнаРУ>КLI1вать снrнал левоrо LI1 npaBoro поворота от автомоБLl1ЛЯ, а так>ке СLl1rнал тормоза. Наnря>кенне от лево н npaBo задней лампы no- 
rnaBa 7. Базовый вво.u.-выво)]. 261 HH>KaeTC до 5,1 В с нсnользованнем ryннельноrо днода. nOcJle ннх CTOLl1T пара транзн сторных ннверторов. 12 В nOBJleTC тоrда, коrда BKJlI04aIOTC за,о,нне JlaMnbI н CHHMa ется, коrда онн ВЫКЛI04аIOТС. V1HBepTopbI необходнмы npH нсnользованнн резнсторов слабых наrрузок в порте В ДЛ reHepHpoBaHH входных снrналов мнкроконтроллера. Дл указанн левоrо HJlH npaBoro поворота ДОЛ>КНЫ BKJlI04aTbC только левые нлн пра- вые светодноды. Дл ннднкаu.нн снrнала тормоза, ДОЛ>КНЫ BКn104aTbc все светодиоды. Яркне красные светодноды требуlOТ ДЛ cBoero CBe4eHH Hanp>KeHH в 2 В н тока в 30 мА. HeHHBepTHpYIOw,a бусрерна схема 74LS244 обесnе4нвает вплоть до 32 мА тока наrрузкн на выходном выводе (У). На nрнведенно схеме 7805 нсnользуетс Щl Toro, 4т06ы 06ecne4HTb nHTaHHeM + 5,0 В мнкроконтроллер н бусрерные схемы. Anьтернатив ным peweHHeM будет нсnользованне МАХ603 от Maxim Technology (http://www.maxim- ic.com) в ка4естве стабнлнзатора. Фнрма Maxim Technology бесплатно nредоставлет образu.ы свонх нзделн Y4aw,HMc. +12V 3.5 V { Gi:\  8.SV {R1 430 О1 [ 20тА  4,3 В мннимум 3,0 мА максимум З.6V  О1 2N2222 Вывод порта 18К   \!!!у " Рис. 7.6. Уnравленне светоднодом при нсnользованнн транзнсторноrо уснлнтел. nporpaMMHoe обесnе4енне ДЛ 3Toro nрнло>кенн нсnользует временные задер>к !СИ, nре,lJ,nолаrа нсnользованне TaКТOBO 4астоты в 2 Mru., CHHMaeMO от АС reHepaTo ра. В npHMepe 7.4 nрнводнтс nporpaMMa на зыке С, KOTopa уnравлет снrналамн, подаваемымн на светодноды поворота н тормоза. В данном примере nepeMeHHa DELAY (ЗАД,ЕРЖКА) оnределетс как 20, 4ТО вызывает BpeMeHHYIO задер>кку в 40 мс. Это BpeM мо>кет реrулнроватьс на установку nреДn04тнтельноrо временн CBe4eHH, 
262 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 однако 20 ДОЛЖНО быть прнемлемым значеннем. Также обратите внимание на то, что ИСПOJlьзуетс CTOpO>KeBO TaMep на случа зависани nporpaMMbI - коrда 3ТО IIРОИ30Й дет, система автомаТН4ескн перезарДLl1ТС н BOCCTaHOBHTC от c60. РаБОl"а задннх ламп влетс ва>кной ДЛ зтой системы - ЛlOбое HapyweHHe нх работы ДОЛ>КНО 6ыТl предотвращено. В зтом примере сброс CTOpO>KeBOrO таймера (WDT) выnолнетс в трех различных местах nporpaMMbI. Пример 7.4 1* * Прммер ПОАа4М cMrHanoB поворота АnЯ PIC18F1220 * частота RCreHepaTopa равна 2 MHz *1 #include <p18cxxx.h> #include <delays.h> 1* Установка 6мтов KOHMrypaUMM установка peMMa reHepaTopa HS *  * BKn4eHMe cTopoeBoro TaMepa BKn4eHMe нмзковоnьтноrо nроrрамммроваНМR OTKn4eHMe с6роса по 4acTM4Ho потере nMTaHMR разреwенме 06ero с6роса * * *1 #pragma config OSC = RC #pragma config WDT = ON #pragma config WDTPS = 64 #pragma config LVP  OFF #pragma config BOR = OFF #pragma config MCLRE = ON II CTopoeBO TaMep на 256 мс #pragma code II rnaBHaR nporpaMMa void main (void) #define DELAY 20 /1 установка ОТС4ета заАеркм на 20 (40 мс) ADCON1 = OxOF; II Оорт А м В  UMpoBe TRISA =0; TRISB = ОхСО; II rropT А  BXOA II порт в - BXOA, за MCKn4eHMeM /1 6мтов 6 м 7 IMTCON2bits.RBPU =1; /1 наrРУЗ04не резмстор BKn. while (1) { II rnaBH UMKn CIrWdtO; II с6рос cTopoeBoro TaMepa if ((PORTB & ОхСО) == О) { II еслм ТОРМОЗ PORTA =0; II все CBeTOAMOA BKn. 
rnaBa 7. Базовый ВВОkВЫВО)]. 263 PORTB о; } else if ((PORTB & Ох40) Ох40) II eCnM ВЛЕВО PORTB = Ох10; II . ...Х DelaylKTCYx(DELAY) PORTB = Ох18; II .. .ХХ DelaylKTCYx( DELAY) ; PORTB = OxIC; II . .ХХХ DelaylKTCYx(DELAY) ; PORTB  OxIE; II .ХХХХ DelaylKTCYx (DELAY) PORTB = OxIF; II ХХХХХ while ((PORTB & ОхСО) != ОхСО) { CIrWdtO; II с6рос cTopoeBoro TaMepa if ((PORTB & ОхСО) == О) II eCnM npeKpaeHMe TopMoeHMR; } else if ((PORTB & Ох80) Ох80) II eCnM ВОРАВО { PORTA = Ох1 о; II Х... . DelaylKTCYx(DELAY) PORTA = Ох18; II ХХ.. . tJelaylKTCYX (DELAY) PORTA = OxIC; II ХХХ. DelaylKTCYx (DELAY) PORTA = OxIE; II ХХХХ. DelaylKTCYx(DELAY) PORTA = OxIF; II ХХХХХ while ((PORTB & ОхСО) 1= ОхСО) { CIrWdtO; II с6рос cTopoeBoro TaMepa if ((PORTB & охСО) == О) II eCnM npeKpae!!Me TopMoeHMR; else II { PORTA PORTB } eCnM HM4ero не npoMcxoAMT ./" OxFF; OxFF; II все CBeTOAMOA BKn. 
N 0\ ..12V А D1 D2 270 U2 С1  100 uF 2 А1 4 6 А2 R12 R11 8 АЗ 3.9К 101< 11 М 13 А5 левые 15 Ав 17 А7 М 1 ТОЕ  19 2ОЕ 10 "t:I  :s: и1 ;s: 74LS244 ('1) ::J: "', ('1) ::J: :s:  LМ7805 ('1) и5 ;s: 3 :s:  "t:I О  О С2 С3 ::J: О11 D12 .а 27 р' ы о :::1 :::1  ('1) 2 "t:I А1 u У1 о 4  = -=:=- 1.0 uF 6 А2 У2 ." 8 АЗ VЗ n А4 У4 правые 11 А5 У5 13 00 15 А6 У6 17 А7 У7 ОТ левой задней А8 У8 R13 1К лампы тормоза 01 2N2222 ОТ правой задней 02 пампы тормоза R14 1К 2N2222 " D22 О21 5.1V - -  Рис. 7.7. Схема световых СLl1rналов тормоза н поворота 
rnaBa 7. Базовый ВВОkВЫВО)]. 265 7cerMeHTИble светодиодные индикаторы Друrо распространенный THn ннднкатора  зто 7 -сеrмеНТНbI светоднодный HH днкатор. 3тн YCTpOCTBa НСnОЛЬЗУlOтс в тех СЛУ4ах, коrда ннднкатор дол>кен быть дo вольно 60ЛЬWНМ Н обесnе4нвать xOPOWYIO наБЛlOдаемость. npHMep 3Toro мо>кет быть оборудованне ДЛ СРНЗН4еской TepanHH JlHu. nо>кнлоrо возраста, которые 4асто HMCIOT недостаТ04ное зренне. 7-сеrмеНТНbIе светоднодные ннднкаторы досrynны с размера мн в пределах от 0.25 до 5.0 ДIOма (смотрнте caT срнрмы Liteon http:/ www.liteon.com). Рнс. 7.8 НЛЛlOстрнрует однн TaKO светоднодный ннднкатор. Доступны верснн светоднодных ннднкаторов с обw,нм анодом н обw,нм катодом. В верснн с об- W,HM анодом все аноды СlЗетоднодов nОДKJl104ены к 5,0 В, npH зтом СIЗе4енне cerMeHTa lЗызыuаетс лоrН4ескнм нолем. В верснн с обw,нм катодом все катоды СlЗетоднодов 11OДKJllOчены к земле, npH зтом свеченне cerMeHTa вызываетс лоrН4еско СДНlIнцей. Оба THna светоднодных ннднкаторов WHpOKO НСnОЛЬЗУlOтс в npHJlO>KeHHx. PaCCMaTpH BaeMЫ CBeTOДHOДHЫ ннднкатор содер>кнт семь cerMeHToB, nOMe4aeMbIx буквамн от а до g. Некоторые ннднкаторы так>ке содер>кат деСТН4НУIO Т04КУ, обозначаемуlO как dp. Рнс. 7.9 НЛJllOстрнрует 7 -сеrмеНТНbI ннднкатор, nОДКnlO4енный к PIC18F1220. К мнкроконтроллеру nОДKJl104ен так>ке однн KHon04HbI nереKJl104атель. nереКnlOчатсль СIЗзан с выводом ААО, а 7 -сеrмеНТНbI НН,lJ,нкатор nОДKJl104ен к nopry В. 3тот ннднкатор ynpaBJleTC бусрерно cxeMO 74LS244, обесnе4нваlOw,е ток в 10 мА на cerMellT, KOTO pы Tpe6yeTC ннднкатору. nporpaMMa, уnраВЛIOw,а ннднкатором, показаllа в прнме ре 7.5. 3та nporpaMMa YCTpaHeT дребезr контактов KHonKH так, 4тобы npH каждом ее на>катнн 4НСЛО на 7-сеrментном ннднкаторе увеЛН4НВалось бы на еднннu.у. Обратнте вннманне, как nOHCKoBa таблнu.а в naMTH nporpaMM нсnользуетс ДЛ Toro, 4тобы оп ределнть 7-сеrмеНТНbI коддл ннднкатора. Общий анод abCdefg .--. -- .. а Б ё d ё f g        Общий катод Рис. 7.8. 7 -сеrмеНТНbI CBeTOДHOДHЫ ннднкатор 
266 ITримененне MHKpOKOHTpOnnepOB PIC18 Пример 7.5 1* * AeMOHCTpaUMOHH rrpMMep мсnоnьзоваНМR 7-сеrментноrо МНАмкатора, HanMcaHH AnR PIC18F1220 *1 #include <p18cxxx.h> #include <delays.h> 1* Установка 6мтов KOHMrypaUMM *  установка peMMa reHepaTopa HS BKn4eHMe cTopoeBoro TaMepa *  BKn4eHMe HM3KoBonbTHoro nporpaMMMpoBaHMR oTKn4eHMe с6роса по 4acTM4Ho потере rrMTaHMR *  разреwенме 06ero с6роса * * *1 #pragma config OSC RC #pragma config WDT OFF #pragma config LVP OFF #pragma config BOR OFF #pragma config MCLRE = ON II *************** HHЫE В DАМЯТМ DРоrРАММ ************************** rom near char 100k7[] = II rrOMCKOBaR Ta6nMua ДnR 7cerMeHTHoro МНАмкатора Ох40, 11 О CMrHan с aKTMBH nоrмческмм HyneM Ох7 9, 11 1 х g f е d с Ь а Ох24, 1I 2 ОхЗО, 11 3 Ох19, 11 4 ох12, 11 5 Ох02, 11 6 Ох78, I1 7 ОхОО, 11 8 Ох10 II 9 } ; II *************** AHHЫE В DАМЯТМ AHHЫX ***************************** int count; #pragma code II *************** ФУНКЦММ ************************************ void Switch (char bit) {  do { II OMAaHMe oTnycKaHMR } while do { while ((PORTA & bit) != bit); Delay1KTCYx(30); 1I 15ms delay ((PORTA & bit) != bit); II OMAaHMe HaaTMR while ((PORTA & bit) bit) ; 
rnaBa 7. Базовый BBO)].BЫBO)]. 267 Delay1KTCYx(30) ; }whi1e ((PORTA & bit) == bit); 11 ***************I'ЛАВНАЯ DPorPAMМA ********************************* void main (void) ADCON1 = Ox7F; TRISA 1; TRISB о; count о; II nopT А м В  UMpoBe 11 порт А, 6мт О  ВХОА 1I порт в  BXOA II Ha4ano ОТС4ета с нуnя while (1) 11 rnaBH UMKn PORTB 100k7[count]; I1 OT06paeHMe 4Mcna Switch (1); 11 OMAaHMe наатмя KHOnKM count++; if (count >= 10) count = о; V1ноrда необходнмо нсnользовать более одноrо ннднкатора. nре,o,nоло>кнм, 4ТО нам требуетс снстема, KOTopa будет отоБРа>Кать 4разрдные 4нсла на 4-разрядном светодн- одном н нднкаторе. Еслн будет npHMeHTbc та >ке caMa методика, KOTopa реалнзована в схеме, прнведенно на рнс. 7.9, то nотребуетс нсnользовать MHoro выводов ввода  вывода, а так>ке MHoro 6усрерных схем н резнсторов. Чтобы умеНЬWН1Ъ КОЛН4ество компонентов и требуемых выводов ввода  вывода, ннднкаторы оБЫ4НО мулртнплекснруIOТС. Все HHДHKa торы мультнnлексноrо мноrоразрядноrо нндикатора совместно НСnОЛЬЗУlOт одну схему управленн, npH зтом одновременно HHcpopMau.H отоБРа>Каетс только в одном разрде ннднкатора. Вследствне HHepu.HoHHOCTH 4eJlOBe4eCKoro зренн, rлаз н сеТ4атка заlЮМИllают вспыwку света npHMepHo на 20 мс. Еслн свет будет MHraTb быстрее, 4ем 50 раз в секунду, то на6ЛlOдателlO будет казатьс, 4ТО он светнт nocToHHO. Еслн кюкда u.Hcppa нндикатора будет BЫCBe4HBaTbC по крайне мере 50 раз в секунду, то будет казатьс, 4ТО все четыре цнсрры CBeTTC одновременно. Тот >ке caMЫ зсрсрект нсnользуетс npH просмотре киносрнльма в кинотеатре. На пленке HMeIOTC 24 неnодвн>кных кадра, которые все npoeKTHpYIOTC на ПРОТЯ>КСIIИИ одной секунды. Каждый кадр BЫCBe4HBaeTC на зкране дважды. Частота мелькания Kaд ров кнносрнльма равна 48 rц, прн зтом ннкакое миrанне не заметно  наблюдается только rладкое двн>кенне. В более старых немых кнносрнльмах НСnОЛЬЗОВaJlaСЬ частота смены кадров 18 кадров секунду, онн так>ке подсве4нвалнсь два раза в секунду, обес пе4нва 4астоту MHraHH ка,о,ров 36 ru.. Все знаlOТ, 4ТО мнrание в зтнх срильмах было заметно. Амернканское аналоrовое телевнденне нмеет 4астоту реrенерации кадро13, paBHYIO 60 ru., npH 4астоте смены кадров, равной 30 ка,о,ров в секунду. 
SW1 С::::!:Ь:::а счет RЗ R2 R1 3.9 10К 10К +5V :f С3 0.1 uF U1  U2 о N 1 RAO °RBO 8 А1 (,,) У1 18 2 9  16 6 RA1 RB1 17 А2 У2 14 7 RA2 R82 18 АЗ У3 12 3 RАЗ R83 10 А4 У4 9 4 RA4 R84 11 А5 У5 7 16 #MCLR RB5 12 А6 У6 5 15 OSC 1 (J) R86 13 А7 У7 3 OSC2  RB7 А8 У8  О PIC18F1220 Ll) z С1 20Е с!) 1.0 uF 74lS244  ЗЗО Рис. 7.9. Проста система управления 7-сеrмеНТНbIМ свеТОДLl10ДНЫМ индикатором N 0\ 00 Общий анод  "о :s: ;s: ('1) ::J: ('1) ::J: :s: ('1) ;s: :s:  "о О  О ::J: .а о ::; ::; ('1) "о О = ." n 00 
rnaBa 7. Базовый ВВОkВЫВО)]. 269 Рнс. 7.1 О НЛЛlOстрнрует мультнnлексны ннднкатор, свзанны с PIC18F1220. 3та схема CPYHKu.HoHHpyeT как npocTo вольтметр н отобра>кает на 4-разрдном ннднкаторе напря>кение, которое nрнлаrаетс к выводу ААО. Поскольку ннкакое масwтабнрованне входноrо напр>кенн не нспользуетс, то днаnазон входных наnр>кеннй ле>кнт в пре делах 0...5 В. Расnоло>кенна на втором нндикаторе слева от u.HcppbI дeCTH4Ha точка соедннена с землей. Смотрнте опнсанне npocToro аналоrовоrо входа, свзанноrо с АЦП, в rлаве 6. 3та схема нсnользует в ка4естве уnраВЛIOw,еrо контура уснлнтель на паре со- ставных транзнсторов Аарлннrтона DS2003, 06ecne4HBalOw,H необходнмы ток ЩIЯ инднкаторных cerMeHToB. (Фнрма National Semiconductor 4ерез caT www.national.com предоставлет студентам бесплатные образu.ы свонх нзделн с оплато только CTOH мостн доставкн.) Поскольку уснлнтелн на паре Дарлннrтона инвертнруlOТ BXOДHO cHr- нал, 7 cerMeHTHa nOHCKOBa таблнu.а дол>кна быть OTKoppeKTHpOBalla на 7 -сеrмеНТНbIе коды с актнвнымн еДННИ4НЫМН YPOBHMH. Кажды cerMeHT ннднкатора потребляет ток в 40 мА. Номннальны ток cerMeHTa на u.HCPPY ннднкатора составляет 1 О мА, однако по тому 4ТО кажда u.Hcppa BКnlO4eHa только 1/4 Bcero временн, ток увеJ1нчнваетс на ко- зсрсриu.нент, paBHЫ 4етырем в СЛУ4ае 4разрдноrо индикатора с u.елыо подцер>кання среднеrо нлн номннальноrо тока в 1 О мА на cerMeHT. (Челове4ескнй rлаз ycpeДHeT УРОВIIН pKOCTH.) Последовательно BКnI04eHHbI TOKoorpaHH4HBalOw,H резнстор paCC4H TЫBaeTC с нсnользованнем зна4енн naдeHH Hanp>KeHH на резнсторе, paBHoro 3 В, н велнчнны TeKyw,ero 4ерез Hero тока, paBHoro 40 мА, 4ТО дает веЛН4ННУ сопротнвления, paBHYIO 75 Ом. nаденне Hanp>KeHHe на светоднодном ннднкаторе прнблнзнтельно paB но 2 В. УnравлlOw,нм злементом в u.enH анода влетс PNP транзнстор 2N2907 с мн- ннмальным козсрсрнu.нентом уснленн по току, равным 100. Поскольку BpeM от BpeMe нн отобра>кает'с u.Hcppa 8, nодсве4нва все семь cerMeHToB ннднкатора, снла тока, ко- TOpЫ дол>кен nponycKaTbc уnравлlOw,нм злементом в u.enH анода, равна 7 раз по 40 мА, нлн 280 мА. Ток базы npH зтом будет равен 2,8 мА, npH nадеllНН Hanp>KeHH в 4,3 В на резнсторе базы, HMelOw,eM номннал в 1,5 кОм. nporpaMMHoe обесnе4енне 3TO снстемы НJlЛlOстрнруетс прнмером 7.6. naKeT инструментальных средств зыка С не содер>кнт CPYHKu.HlO, KOTopa nреобразовывает 'числа с плаваlOw,е запто в последовательность u.Hcpp. Цнкл for, nрнведенный в зтом прнмере, выnолнет 3ТО nреобразованне, nOJlY4a u.еЛ04нсленнуIO 4асть напр>кенн, Bblpa>KeHHOrO как u.Hcppa в срормате с nлаваlOw,ей заnто, в внде u.HCPPbI, которая BЫ4H тaeTC нз зна4енн Hanp>KeHH. Затем перед слеДУIOw,е HTepau.He, напр>кенне ум- HO>KaeTC на 1 О, в результате 4ero u.Hcppa, расnоло>кенна непосредственно справа от дeCTH4HO Т04КН, CTaHOBHTC досrynно как u.елое 4НСЛО. 3тот npou.ecc nродол>кается до тех пор, пока не будуТ определены все 4етыре u.HCPPbI, отобра>каемые на ннднкаторе. 
R9 ::::1 '"d 10К Q4 ::: :::: 1.5К 2N2907 (1)  :I: ::: (1) PIC18F1220 ;s: U1  U2 052003 ::: :>:: 1 8 1 16 '"d 2 RAO DRBO 9 2 INA OUTA 15 . о RA1 RB1 INB OUTB :>:: 6 17 3 14 О 7 RA2 RB2 18 4 INC OUТC 13 :I: RАЗ RB3 IND ouro ,.., 3 10 5 12 '"d 4 RA4 RB4 11 6 INE OUТE 11 О #МCLR RB5 INF OUTF :::1 16 12 7 10 . :::1 15 gg  : 13 ING о OUTG (1) D z 75 '"d СОМ о " DP  It) '"'d n 00 С2 33 pF  Аналоroвый ВХОД (О - 5 В) С3 33 pF  N ......з о +5V Рис. 7.10. Мноrоразрядный цифровой индикатор, который работает как вольтметр 
аналоrовый ВХОД (O500 п) А10 А11 А12 В1К вк 1К +5V АВ 101< Сз ЗЗpF и2 DS200з 1.5К 'J  pj t:Q pj ;--J ti.I  о t:Q tТ' :S:C t:Q 75 t:Q В, О J:;" t:Q tТ' ; О J;:;i Рис. 7.11. Цифровой вольтметр с тремя пределами измерения напряжения N -..J 
272 ПрнменеlQfе мнкроконтроллеров PIC 18 Пример 7.6 1* * nроrрамма BOnbTMeTpa, * мсnоnьзуемаR TaKTOBaR *1 HanMcaHHaR AnR PIC18F1220 м 4астота 4 Mru #include <p18cxxx.h> #include <delays.h> 1* Установка 6мтов KOHMrypaUMM *  установка peMMa reHepaTopa HS BKn4eHMe cTopoeBoro TaMepa BKn4eHMe HM3KOBOnbTHoro nроrрамммроваНМR О'1'клченме с6роса по 4acTM4Ho потере nMTaHMR *  разреwенме 06ero с6роса * * * *1 #pragma #pragma #pragma #pragma #pragma config OSC config WDT config LVP config BOR config MCLRE HS OFF OFF OFF = ON II Аанные в naMRTM nporpaMM rom near char 100k7 [] II 7-сеrментнаR nOMcKoBaR Ta6nMua ОхЗF, II О cMrHan с aKTMBHO norM4ecKo 1 ОхО 6, II 1 х 9 f е d С Ь а Ох5В, II 2 Ox4F, II 3 Ох66, II 4 Ох6D, II 5 Ох7D, II 6 Ох07, II 7 Ox7F, II 8 Ox6F II 9 } ; II AaHHe в naMRTM AaHHX float volts; #pragma code II rnaBHaR nporpaMMa float getVoltage (void) { ADCONObits.GO = 1; IIHa4ano nре06разоваНМR while (ADCONObits.GO == 1); II ожиданме заверwения return (ADRESL + (ADRESH « 8)) * 0.00489; } void main (void) 
rлава 7. Базовый ВВОkВЫВО)]. 273 char а; char selectPattern; ADCONO 1; ADCON1 ОхОе; ADCON2 Ох8С; TRISA о; TRISB = о; while (1) { II B60p ВХОАа ANO, актмвмрованме АЦО I I мо  aHanoroB CИf'нang, VOD м VSS  опорные напряжения II все ApyrMe BBOA порта А м В RBnRTCR UMpOBbIMM II npe06pa30BaHMe с MCnOnb30BaHMeM 1 MrU II порт А BXOA II порт в - BXOA II rnaBH UMKn v01ts = getVoltage(); II nOnY4eHMe наnрRенмя selectPattern OxFC; for (а = о; а , 4; а++) II npe06pa30BaHMe в UMp II м OT06paeHMe мх PORTA selectPattern; II заАанме UMp PORTB 100k7[ (int) volts ]; volts (int) volts; volts *= 10; selectPattern (selectPattern« 1) I 2; Delay1KTCYx(3); II заАерка в 3 мс r , BpeMeHHa задержка исnользуетс M TOrO, 4т06ы отображать Ka)l(,lJ,YIO u.исрру один раз Ka)l(,lJ,bIe 3 мс. 3то обесnе4ивает 4астоту BCnbIweK, paBHYIO 83.3 rц ,lJ,JlЯ 4етырех цисрр индикатора, 4ТО влетс вполне достаТ04НЫМ M Toro, 4тобы npeAoTBpaTHTb мерu.ание. Частота BcnbIweK не должен быть paBHO 50 ИJlИ 60 rц, либо JllOбому 4ИСЛУ, кратному указанным зна4еним. В CWA 4астота злеКТРИ4еско сети равна 60 ru., 4ТО заставлет срлуоресцентные лампы Mepu.aTb с 4aCTOTO в 120 rц. (Флуоресu.ентна лам- па зажиrаетс только TorAa, KorAa наnрженне на He равно 90 В или BbIwe, поэтому она ВКЛlO4аетс и BbIКnI04aeTC 120 раз в секунду, один M Ka)l(,lJ,OrO изменени знака Ha пржени.) Если 4астота BcnbIweK индикатора будет кратна 120 rц, то возникнуТ npo блемы при наБЛlOдении индикатора в УСЛОВИХ срлуоресu.ентноrо освеw,ении. Тот >ке caMЫ истинно в отноwении 100 ru. в друrих странах, потому 4ТО в ННХ исnользуетс частота злеКТРН4еско сети, paBHa 50 ru.. Частота BcnbIweK может иметь ЛlO60е зна4е- ние - вплоть до nри6лизительно 30 Kru.. Если будет ИСnОЛЬЗ0ватьс более BЫCOKa 4ас- тота вспышек, то возникаlOw,и злектромаrнитны сиrнал на4нет создавать nOMeXH для радНОСВ3И  В силу Toro FCC (Федеральны Комитет по СВ3И) не nроnустит COOTBeT СТВУIOw,УIO систему в WИрОКУIO продажу. Цисрровые данные содержат значителыюе ко- ЛИ4ество rармоник  вплоть до 150 rармоникн. Частота BCnbIweK в 30 Kru., умно>кенная на 15 даст 4астоту в 450 Kru.. FCC реryлирует и лиu.ензирует спектр ра.цИ04астот от 450 кrц и выше. Если какоелибо u.исрровое YCTPOCTBO создает радиопомехи, то FCC не смо>кет 
274 Применение МИКРОКОНТРОЛJi'еров PIC 18 выдать лицензиlO на соответствуlOЩИ У4асток спектра, поэтому все цнсрровые устрой сша ДОЛ>КНЫ 6ыть приняты И од06рены FCC. Если ДОЛ>КНО измерться наnря>кенне, 60льwее, 4ем 5 В, то на входе дол>кен ис ПОЛЬЗ0ваться делитель напр>кени, пони>каlOw,и напря>кение до значени 05 В. На- пример, 4т06ы отмасшта6ировать BXOДHO сиrнал с коэсрсрициентом 1 О (О-50 В), ВКЛIO- 4ите последовательно резисторы 9 кОм и 1 кОм ме>кду входом и земле, сняв входное наnря>кение с резистора в 1 кОм. Дл делени входноrо сиrнала на коэсрсрициент 100, используте резисторы 91 кОм, 9 кОм и 1 кОм, ВКЛlO4енные последовательно, и сни- MaTe входное наnря>кени с резистора в 1 кОм. Ал это цели ну>кно ИСnОЛЬ3013аТЬ резисторы 91 кОм, 9 кОм н 1 кОм, точность номинала которых составляет +/-1 %. Рис. 7.11 ил ЛЮСТРLl1рует cooTBeTcTBYIOw,ee nОДКЛlO4ение к микроконтроллеру с переКЛlOчателем, установленным на диаnаЗ0Н 0500 В. ABYCTopOHH nереКЛlOчатеЛЫIaЯ схема мо>кет ИСnОЛЬЗ0ваться дл выбора входа, замен механически nереКЛlO4атель. К со>кале НИIO, в этом СЛУ4ае, аналоrовые входы микроконтроллера 6удут оrраНИ4ены лоrически ми уровнми TTL, так 4ТО все три входы не Moryт непосредственно ПОДKJl104атьс к мик- роконтроллеру дл С4итывани наnр>кени. ЖК-ндкаторы ЖКV1 (>кидкокристаJlJlН4еские нндикаторы) заменнли светоднодные индикаторы во мноrих прило>кених. Однако, ЖКнндикаторы (ЖКИ) трудно на6ЛlOдать в ситуациях сла60 освещенности, прн этом размеры индикатора демонстрируют тендеlЩLl1IО к TO му, 4т06ы 6ыть довольно небольшими, так что светодиодные индикаторы все еще ис- nОЛЬ3УlOтс в ряде применени. Мноrие изrотовители >кидкокристаЛЛИ4еских индика- торов начали продавать ЖКИ с pKO подсветко, 4т06ы преодолеть Ha3BaHHYlO npo 6лему на6ЛlOдаемости. Однако, если цена OLEO (орrанические светодиоды) 6удет дос- таточно НИ3КО, то и ЖКиндикаторы, н стандартные светодиодные индикаторы просто НС4езнут. Рис. 7.12 ИЛЛlOстрнрует ПОДКЛlO4ение ЖК-инднкатора Optrex OMC20481 к MHKpO контроллеру PIC18F1220. OMC20481 - это 4-CTP04HЫ индикатор, 06есnе4иваlOЩИЙ от06ра>кение 20 символов в строке, KOTOpЫ принимает ASCII- коды как входные дaH ные. Он так>ке принимает команды, которые иниu.иализируlOТ ero и уnравляlOТ ра60ТОЙ индикатора. Как мо>кно видеть И3 рис. 7.12, ЖКV1 имеет только несколько ПОДКЛlOчени. Инсрормационные и уnраВЛЯlOщие ПОДКЛI04ения, соединенные с портом В, ИСПОЛЬ3УlOт- c ,lJ,JlЯ Toro, 4т06ы ввести данные в индикатор и считать инсрормациlO И3 индикатора. ЖКИ СРункu.НОНИРУlOт при 8разрядном ли60 4-разрядном интерсресе данных. В дaH ном примере ИСnОЛЬЗ0ван 4разрядный интерсрес данных с тем, 4т06ы уменьшить 4НСЛО используемых WTbIpbKOB - это распространенны cnoc06 ПОДКЛlO4ения ЖКИ к микроконтроллеру. При ИСnОЛЬЗ0ванни 4-разрдноrо интерсреса данных, 6иты данных от 04 дО О7 ИСПОЛЬ3УlOтс в ЖКV1 и nередаIOТС, 6иты от ОО дО DЗ не ИСnОЛЬ3УlOтс и не ПОДКЛI04аIOТС . 
rлава 7. Базовый ВВО)].-ВЫВО)]. 275 +5V О4 VDD О5 D6 D7 Е RS R/#W VSS R4 R3 3.9 10К U1  i   7 7 RA2 RB2 18 3 RАЗ RB3 10 RA4 RВ4 4 #МCLR RВ5 11  g :: ; +VLEVLEI) жки PIC 18F1220 о/) С1 1.0 uF Рис. 7.12. Схема управления ЖКИ V1ндикатор имеет 4етыре вывода управлени. Вывод VEE корректирует KOHTpaCT ность ЖКИ и оБЫ4НО соединетс с потенциометром на 1 О кОм. Вход RS (выбор реrист ра) вы6ирает данные (RS = 1) или команды (RS = О). Вход Е (разреwение) дол>кен быть в состонии лоrИ4еской единиu.ы ДJl OMC20481, 4т06ы С4итывать или заnисывать ин срормаu.иlO, а так>ке СРункu.ионировать в ка4естве стр06ИРУlOщеrо входа, активноrо по еДИНИ4НОМУ импульсу. V1, HaKoHeu., вывод Rf\N вы6ирает оnераu.иlO 4тения или заnиси. 06Ы4НО вывод RS устанавливается в 1 или О, вывод Rf\N устанавливаетс в 1 или О, дан- ные помещаlOТС на выводы ввода данных, а затем подаетс импульс на вывод Е  либо с целыо занесени данных в ОМС-20481, ли60 С4итывани данных И3 Hero. 3тот инди катор так>ке имеет два входа (LEDA [анод] и LEDK [катод)] ДJl управления светодиода ,ми подсветки. Подсветка тре6ует тока в 240 мА, KOTOpЫ срормируетс при ИСnОЛЬЗ0ва нин последовательно ВКЛlO4аемоrо токооrраНИ4иваlOщеrо резистора. Некоторые инди- каторы имеlOТ элеКТРОЛIOМLI1нисu.ентнуlO подсветку, KOTopa ДJl своей правильной pa боты требует 120 ВА ДJl CBoe правильно ра60ТЫ. 3леКТРО-ЛlOминисцентная nOAcBeT ка 06еспе4иваетс срлуоресu.ентно Tpy6KO. Некоторые индикаторы, которые исполь ЗУlOт светодиоднуlO подсветку, имеlOТ токооrраНН4иваlOЩИ резистор, BCTpoeHHЫ не- посредственно в индикатор. С u.елыо проrраммировани и ИСnОЛЬЗ0ванн ОМС-20481 в системе, он дол>кен быть иниu.иализирован. 3то относитс к ЛI06ым индикаторам, которые ИСПОЛЬ3УlOт схе- му управлени индикатором НО44780 (срирма Hitachi), BCTpoeHHYIO в нндикатор или ее эквивалент. Bc лнни малых индикаторных панеле от срирмы Optrex и 60льшинства дpyrHx изrотовнтеле nроrраммируетс аналоrИ4НЫМ 06раЗ0М. KorAa выполняется neРВИ4ное ВКЛlO4ение ЖКинднкатора, НО44780 выnолнет последовательность команд самопроверки, KOTopa от06ра>кает последовательность снмволов 4ерных квадратов tASCII код Ox7F) в nepBo строке индикатора. Перед тем, как индикатор смо>кет быть МСПОЛЬЗ0ван в системе, упомянутые квадраты дол>кны 6ыть стерты, а индикатор дол>кен быть Нllиu.нализирован выполнением ни>кеоnнсанных waroB. 1'nодождать по KpaHe мере 15 мс после Toro, как наnр>кение на входе VCC оодниметс до 5 В. 2. Выдать команду установки срункu.ии (ОхЗО [86HTHa] нли Ох20 [4битная]) и no- до>кдать по KpaHe мере 4, 1 мс. 
276 Прнмененне мнкроконтролnеров PIC18 З. Выдать команду установки срункu.ни (охЗО ИЛИ Ох20) ew,e раз и подождать по KpaHe мере 100 мкс. 4. Выдать команду установки срункu.ии (ОхЗО или ох20) трети раз и подождать по KpaHe мере 40 мкс. 5. Выдать команду установки срункu.ни 4eTBepTЫ раз (охЗ8 ДJl 8битноrо интер- cpeca или Ох28 ДJl 4-6итноrо интерсреса) и подождать по KpaHe мере 40 мкс. 6. Выдать Ох01 ДJl вывода курсора в исходнуlO познu.иlO и 04ИСТКИ индикатора, подождать по KpaHe мере 1,64 ms. 7. Выдать команду активированн диспле при ВЫКЛlO4енном курсоре (ОхОС), по дождать по KpaHe мере 40 мкс. 8. Выдать Ох06 ДJl вы60ра aBToMaTH4ecKoro ннкрементнрования, которое сдви- raeT курсор вправо вски раз, KorAa на индикатор nосылаетс символ, and wait at least 40 мкс. nporpaMMa, выnолняlO ИНИLJ,ll1aJ1Н3aL..J,II11О Жк ИНДLl1катора, пока3ана в примере 7.7. Она достаточно ДJlинна, однако контроллер индикатора тре6ует TaKoro ДJlинноrо диалоrа иницналнзаu.ии. Ра3ЛИ4ные команды, посылаемые на ЖКнндикатор, предъвлIOТ раз ЛИ4ные тре60вани к временным задер>ккам. В табл. 7.1 пере4ислены временные за- дер>кки, тре6уемые ДJl команд. 3та nporpaMMa передает и принимает данные 4ерез порт В. Дл выда4И команды с6роса Ох20, сна4ала выдается 2, а затем О 4ерез четы рех6итны интерсрес данных. Пример 7.7 II npeAnonaraeMaR TaKToBaR 4астота равна 2 Mru II npM комаНАНОМ UMKne в 2 мкс #define LCD PORTB #define RS PORTBbits.RB5 #define Е PORTBbits.RB4 II onpeAeneHMe порта AaHHX II onpeAeneHMe RS II onpeAeneHMe Е void SendLCDdata (char data, char rs) { LCD = data » 4; II nepeAa4a neBoro nоnу6айта RS = rs; II ynpaBneHMe RS Е = 1; II MMnYnbc Е Е = о; Delay10TCYx (2) ; II заАерка 40 мс LCD = data & OxOF; II nepeAaqa npaBoro nony6aTa RS = rs; II ynpaBneHMe RS Е = 1; II MMnYnbc Е Е = о; Delay10TCYx (2) ; II заАерка 40 мс . void InitLCD (void) char а; DelaylKTCYx (10); for (а = о; а < 3; а++) { SendLCDdata (Ох20, О); Delay1KTCYx (3); II OMAaHMe 20 мс (смотрмте текст) II вьщаqа Ох20 II OMAaHMe 6 мс 
rлава 7. Базовый вво)].-выво)]. 277 } SendLCDdata (Ох28, О) ; II BAa4a Ох28 SendLCDdata (Ох01, О) ; II BAa4a Ох01 Delay1KTCYx (1) ; II OMAaHMe 2 мс SendLCDdata (ОхОС, О) ; II Ba4a ОхОС SendLCDdata (ОхО 6, О) ; II BAaqa Ох06 Таблица 7.1. Команды ДJl 60льwинства ЖК индикаторов. Команда Очистка МНАмкатора Время 1.6-1 мс BBOA курсора в MCXOAHY n03MUM Установка peMMa ВВОАа МНАмкатор BKnIBKn CABMr Kypcopa/MHAMKaUMM ЗаАанме YHKUMM Установка аАреса rСЗУDВ Установка аАреса DОЗУDВ CqMTBaHMe nara заНRТОСТМ Заnмсь AaHHX C4MTBaHMe AaHHX Код 0000 0001 0000 0010 0000 01AS 0000 1DСВ 0001 SROO 001L NFXX 01ХХ ХХХХ 10ХХ ХХХХ ВООО 0000 aHHe aHHe Описание Очмает МНАмкатор м BBOДMT курсор В МСХОАНУЮ n03MUM BBOAMT курсор в MCXOAHY n03MUM YCTaHaBnMBaeT HanpaBneHMe nepeMeeHMR курсора (А = 1, мнкрементмрованме) м сдвмrа (S = 1, CABMr MHAMKaUMM) BKn4aeT/BKn4aeT MHAMKa тор (О = 1, BKn.) (С = 1, курсор BKn.) (В = 1, MMra нме курсора) YCTaHaBnMBaeT nepeMeeHMe курсора м CABMr MHAMKaUMM (S = 1, CABMr MHAMKaUMM) (R = 1, вправо) Dроrрамммрует uenM K МНАмкатора (L = 1, 86MTHЫ MHTepec) (N = 1, 2 CTpO км) (F = 1, CMMBOn Sx10) (F = О, CMMBOn Sx7) YCTaHaBnMBaeT аАрес ЗУDВ reHepaTopa CMMBOnOB YCTaHaBnMBaeT аАрес ЗУDВ naMRTM oT06paeHMR C4MTBaeT лаr заНRТОСТМ (В = 1, заНRТ) Заnмсвает AaHHe в память oT06paeHMR ЗУDВ MnM e ЗУDВ reHepaTopa CMMBOnOB CqMTBaeT AaHHe М3 nамятм oT06paeHMR ЗУDВ млм ЗУDВ reHepaTopa CMMBonOB 1.64 мс 40 мкс 40 мкс 40 мкс 40 мкс 40 мкс 40 мкс О 40 мкс 40 мкс Зад.ер>кки, отра6атываемые в nporpaMMe, ВЛIOТС несколько 60лее дпннными, 4ем тре6уемые вследствие Toro, 4ТО имеетс временная зад.ер>кка в срункu.ин SendLCD, rаранти- руюw.a, 4ТО отводнмое BpeM 6удет достаТ04НЫМ. reHepaTop, исnользуемы в этом примере, явnетс RC-rенератором, 4астота KOToporo мо>кет изменяться. Как и в СЛУ4ае с друrими npH мерами, временные зад.ер>ккн MOryт HacтpaHBaТbC, еСJlИ 4астота reHepaTopa (2 Mru.) не 6удет TO >ке, KOTopa исnользуетс в рассматриваемо схеме. Обраn1Те внимание на то, 4ТО He 6ольwа BpeMeHHa зад.ер>кка мо>кет оказатьс He06XOДНMO перед н после Ka>KДOrO измене- ни сиrнanа Е с u.елыо сни>кенн ypoBH электромаrнитных помех ДП 060рудовани, которое ДOJl>KHO 6ыть од06рено Федеpanьно Комиссие СВ3И. 
278 Применение MHKpOKOHTpOnnepOB PIC 18 Как только ЖКиндикатор 6удет иннu.иализирован, понадо6тс несколько процсдур, необходимых дпя от06ражени инсрормаu.ии и управления индикатором. После ИНИЦИaJтиза ции временная задер>кка в 40 мкс OTpa6aTЫBaeTC в срункции SendLCDData, KOTopa исполь зуется при посылке данных или ряда команд на индикатор. Команда очистки ИНДИКalора таюке нуждаетс во BpeMeHHO задер>кке, потому 4ТО срлаr занятости не используется с KO мандами в срункцих по примеру 7.7. Вместо ИСnОЛЬЗ0вани времеНIIЫХ задер>кек мо>кет проверяться состояние срлаrа зантости с u.елыо определени Toro, завершил ли индикатор выполнение Tpe6yeMO оnераu.ин. Если исnользуетс срлаr занятости, то выl.3дд R;W IIОДКJIIO- чается к 6иту 6 порта В в этом примере, он управлетс при СЧИТЫl3ании ЖКИlIдикатора. Процедура проверки состони срлаrа зантости показаная в примере 7.8. Процедура BUSY проверяет состояние ЖКиндикатора; при этом возврат Н3 нее отра6атывается ТOJ1ЬКО тоrда, коrда индикатор завершнл выполнение предыдуw,е команды. Пример 7.8 #define LCD PORTB #define RS PORTBbits.RBS #define Е PORTBbits.RB4 #define RW PORTBbits.RB6 #define LCD TRIS TRISB II onpeAenReT порт AaHHX II onpeAenReT RS II onpeAenReT Е II оnреАеnяет RW II onpeAenReT LCD TRIS void SendLCDdataWbusy (char data, char rs) RW = о; LCD = data » 4; RS = rs; Е = 1; Е = о; Delay10TCYx (2); LCD = data & OxOF; RS = rs; Е = 1; Е = о; Delay10TCYx (2); RW = 1; RS = 1; LCD TRIS OxOF; RS = о; Е 1; Е = о; data = LCD; while ((data & 8) { Е 1; Е о; Е 1; Е о; data LCD; } LCD TRIS о; II вы6мрает peMM заnмсм II nосьшает neBbl nony6aT II YCTaHaBnMBaeT RS II MMnYnbc Е II заАерка 40 мкс II nocaeT npaB nony6aT II YCTaHaBnMBaeT RS II MMnYnbc Е II задерка 40 мкс II B6MpaeT peMM чтенмя II YCTaHaBnMBaeT R/W II YCTaHaBnMBaeT RBORB4 как входы II комаНАа сqмтванмя nara занятостм II nocaeT cTapwM nony6aT II CqMTblBaeT 6мт занятостм 8) II CqMTBaeT MnaAwM nony6aT II MMnYnbc Е II CqMTBaeT cTapwM nony6aT II CqMTBaeT KMHAMKaTOp II nporpaMMMpyeT PORT В как BXOAHO 
[пава 7. Базовый BBO)].BЫBO)]. 279 Если эта HOBa проu.едура будет доступна, то данные MorYT посылаТl}СЯ на ИIIДИ катор с выполнением операu.ин запнси 6ез временных задер>кек в ЛlOбое время. Аиалor инициализации установил курсор на автомаТН4еское инкрементирование, поэтому, если процедура WRITE 6удет BЫ3ЫBaTbC 60лее ОДноrо раза, то символы, заПИСЫl3ае мые в индикатор, 6удут oT06pa>KaTbC однн pДOM с друrим,  так >ке, как на экране KOM пыoерноrоo дисплея. Е,о,инственно друrо проu.едурой, не06ходимо ДJlЯ 6a30Boro ИСnОЛЬЗ0вания ИII днкатора, явлется проu.едура с именем CLS, ВЫПОЛНlOща 04ИСТКУ индикатора и BЫ вод ero курсора в исходное поло>кение. 3та процедура пока3а1Ш в примаре 7.9. Olla использует макрокоманду SEND из nporpaMMbI инициализации для Toro, чт06ы послаТl} команду 04ИСТКИ индикатора. ИСПОЛЬ3УЯ процедуру CLS, а так>ке проu.едуры, ОПИСallllые к данному времени, на индикатор мо>кно вывести ЛlOбое сообщение, 04ИСТИТЬ elo, а затем от06разить друrое сообw,ение, выполн 6аЗ0вые операции управления индика- тором. Как упоминалось ранее, команда 04ИСТКИ индикатора тре6ует ДJl cBoero выпол- нения BpeMeHHO задер>кки (по KpaHe мере paBHO 1,64 мс). Пример 7.9 .;oid CLS (void) SendLCDdata (ОхО1, О); Delay1KTCYx (1); II вьщача ОхО1 11 OMдaHMe 2 МС Среди дополнительных проu.едур, которые MorYT быть разра60таны, мо>кет 6Ы1Ь процедура вы60ра позиции в ЗУПВ отобра>кения. А.п,реса ЗУПВ памяти от06ра>кения ...jачинаIOТС с О и возрастаlOТ по мере заrрузки ННДLl1катора символами  вплоть до aд :)еса последнеrо символа перво строки, paBHoro 19. Как только адрес курсора или pec от06ра>кени 6удет изменен, индивидуальные символы на индикаторе MorYT 5ыть изменены или С4итаны, при этом данные Moryт читатьс с индикатора. Баты, не используемые ДJlЯ памяти отобра>кени, Moryт ИСnОЛЬЗ0ваться ДJlЯ хра- HeHH данных. Поскольку микроконтроллер имеет оrраНИ4енное КОЛИ4ество 4eeK ЗУПВ .:щнных, то неиспользуемые 4ейки nамти данных Moryт их дополнять. ЖК-индикаrор содер>кит 128 6aTOB памяти, адресуемой от ОхОО до Ox7F. Не вся эта память всеrда .1спользуется. Например, OДHOCTp04HЫ 20символьны индикатор использует только первые 20 6aTOB памти (OxOOOx1 3). nepBa строка ЛlO60rо И3 этих индикаторов Bce rда начинаетс с адреса ОхОО. BTopa строка ЛlOбоrо индикатора, уnравляемоrо НО44780, всеrда на4инаетс с адреса Ох40. Например, двустрочны х40-СИМВОЛЫIЫЙ 1ндикатор использует адреса OxOOOx27 ДJl хранени АSСIIкодированных данных ДJlЯ перво строки. BTopa строка в этом индикаторе coxpaHeTC по адресам Ox40Ox67. В четыреХСТР04НЫХ nepBa строка coxpaHeTC, начина от адреса ОхОО, вторая - от aдpe са Ох40, TpeTb  от адреса Ох14 и последня строка  о r адреса Ох54. Самое 60льшое инднкаторное YCTPOCTBO, которое использует НD44780,  это двустрочный x40 ::;нмвольны индикатор. ЧетыреХСТР04ные х40символьные индикаторы ИСIlОJlЬЗУК)l М505ЗО или пару HD44780S. Инсрормация, касаlOщаяся этих устройств, может 6ыть найдена в Internet, поэтому она не приводитс в это книrе. nporpaMMa, приведенна в примере 7.1 О, от06ра>кает сообщение "Hello" (Привет) в строке 1 индикатора 4х20, а во BTOpO строке со06щение "I'm PIC18" (Я  PIC18). Этот пример BKJl104aeT одну дополнительнуlO СРУНКЦИIO, от06ра>каlOЩУIO nycTylO строку C стил. Коrда aдpecyeTC 4eKa памяти, caMЫ левы 6ит адреса дол>кен 6ыть в co 
280 Прнмененне МНКрОКОНТроллеров PICl8 стоянии JlоrИ4еско еДl1ННЦЫ (см. та6лиu.у 7.1 ДJl задани адреса ЗУnВ индикатора). Например, ДJl адресаu.ии nepnoro снмвола в строке 1 исnользуте адрес Ох80. Анало rично, 4т06ы адресовать первы снмвол в строке 2 следует ИСПОЛЬЗ0вать адрес ОхСО (Ох40 + Ох80). Пример 7.10 1* * LCD example written for а PIC18F1220 * for а 2MHz internal RC clock *1 #include <p18cxxx.h> #include <delays.h> 1* Установка 6мтов KOHMrypaUMM *  установка режима reHepaTopa HS *  BKn4eHMe cTopoeBoro TaMepa * - BKn4eHMe нмзковоnьтноrо nроrрамммроваНМR *  OTKn4eHMe с6роса по 4aCTM4Ho потере nMTaHMR * - разреwенме 06ero с6роса *1 #pragma config OSC RC #pragma config WDT OFF #pragma config LVP OFF #pragma config BOR OFF #pragma config MCLRE = ON #pragma code char str1[] char str2[] "Hello"; "11m the PIC18"; II rnaBHaR nроrрамма #define LCD PORTB #define RS PORTBbits.RB5 #define Е PORTBbits.RB4 II onpeAeneHMe порта AaHHX II onpeAeneHMe RS II onpeAeneHMe Е void SendLCDdata (char data, char rs) LCD = data » 4; II вьща4а neBoro nony6aTa RS = rs; II ynpaBneHMe RS Е = 1; II MMnYnbc Е Е = о; Delay10TCYx (2) ; II заАерка 40 мс LCD = data & OxOF; II BAa4a npaBoro nony6aTa RS = rSi II ynpaBneHMe RS Е = 1; II MMnYnbc Е Е = о; Delay10TCYx (2) ; II заАерка 40 мкс void InitLCD (void) 
[пава 7. Базовый вво)].-выво)]. 28\ char а; Delay1KTCYx (10); II OAaHMe 20 мс (см. текст) for (а = о; а < 3; а++) SendLCDdata (Ох20, О); Delay1KTCYx (3); II вьща4а Ох2 О II ОИАанме б мс SendLCDdata (Ох28, О) ; II BAa4a Ох28 SendLCDdata (Ох01, О) ; II вьща4а Ох01 Delay1KTCYx (1) ; II OMAaHMe 2 ms SendLCDdata (ОхОС, О) ; II BAa4a ОхОС SendLCDdata (ОхОб, О) ; II BAa4a ОхОб void CLS (void) { SendLCDdata (Ох01, О); Delay1KTCYx (1); II Ba4a Ох01 II OMAaHMe 2 МС void String (char *str, char position) int ptr = О; SendLCDdata (position, О); II BAa4a rr03MUMM while (str[ptr] != О) SendLCDdata (str[ptr++], 1) ;11 BAa4a CMMBona void main (void) { ADCON1 = OxOF; CMI'HanOB TRISB = О; PORTB = о; Ini tLCD () ; II B60p всех UMpOBblX II rropT В  BXOA II все BBOA rropTa В II мнмuмаnмзаUМR KM О while (1) { String (str1, Ох80); String (str2, ОхСО); 
282 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 ПреДnОЛОЖLl1М, 4ТО данные на LI1НДLl1каторе ДОЛ>КНЫ смещатьс слева направо, по- добно LI1НДLl1катору "беrуще CTpOKLI1". ФУНКЦLl1, KOTopa посылает данные в строку 1 ЖК- LI1НДLl1катора ЭТLI1М способом, nоказана в npLl1Mepe 7.11. 3то выnолняетс посредством nереда4L11 4етырех символов в секунду на LI1НДLl1катор. AaHHa срункция nредполаrает, ч ro строка была 04L11щена перед ее ВЫЗ0ВОМ. C4eT4L11K ЦLl1КЛОВ в цикле for имеет тип char. ЕСЛLl1 TLI1n char LI1сnользуетс вместо TLI1na integer, то объем nамти, требуемы для цикла, 3Ha4L11TeJlbHO CHLI1>KaeTc. 3то Ba>KHЫ момент npLl1 разработке nporpaMM дл PIC. Пример 7.11 void scroll (char *str) char а; char Ь; for (а = о; а < strlen (str); а++) for (Ь о; Ь <= а; Ь++) SendLCDdata (Ох80 I ab, о); II nозмцмонмрованме в строке] SendLCDdata (str[ strlen (str) - Ь], 1); } Delay1KTCYx (125); II OMAaHMe 1/4 ceKYHA ЕСЛLl1 4L11СЛО выводов, доступных на PIC OrpaHLI14eHO 4L11СЛОМ, меньwим, чем WCCTb, то следует LI1СnОЛЬЗ0вать ЛLl1бо nоследовательны ЖКLI1НДLl1катор, ЛLl1бо схему, nри!3е денную на pLl1c. 7.1 З. 3та схема LI1сnользует только два вывода МLI1кроконтроллера для уnравлеНLI1 ЖК-LI1НДLl1катором, однако требует ОДLl1Н ДОПOlIНLI1тельны компонент. В cxe ме LI1сnользуетс СДВLI1rовы perLl1CTp, дл nОЛУ4еНLI1 данных от микроконтроллера. Один вывод порта влетс входом данных ДЛ СДВLI1rовоrо perLl1CTpa, а BTOpO - ИСТ04НИКОМ СLl1rнала TaКТOBO 4астоты. Посредством уnравлеНLI1 ЛLl1НLI1е данных LI1 ЛLl1ние СLl1rнала TaKTOBO 4астоты, 4L11СЛО nосылаетс в СДВLI1rовы perLI1CTp LI1 далее в виде параллелы-юrо кода  на ЖКLI1НДLl1катор. 3та схема разработана TaKLI1M обраЗ0М, 4тобы, коrда СLl1rнал данных из микрокон- троллера будет нулевым LI1ЛLl1 3Ha4eHLI1e 05 будет нулевым, то СLl1rнал Е также буде 1. в HY ле. Чтобы nОЛУ4L11ТЬ СLl1rнал TaKTOBO 4астоты Е, nостуnаЮЩLl1 на ЖКИ, как 05, так и RBO оба ДОЛ>КНЫ быть в COCTOHLI1L11 лоrLl14еско еДLl1НLI1ЦЫ. Ава ДLl10да LI1 реЗLl1СТОр номиналом в 1 кОм СРОРМLI1РУЮТ лоrLl14ескуlO схему V1. АLI10дные лоrLl14еСКLI1е элементы все еще иноrда LI1СnОЛЬ3УЮТСЯ в современных ЦLl1сррОВЫХ электронных схемах, 4тобы С3КОНОМИ1Ъ затра- ты, не B!30Д ДОnОЛНLI1тельную LI1нтеrральную схему. В npLl1Mepe 7.12 npLl1BeAeHa nporpaMMa, требуема дл Toro, 4тобы переда!3аrь данные на ЖКV1. Поскольку данные ВЛlOтс nоследоватеЛЬНЫМLI1, БОЛЬWLI1НСТВО !3po менных задер>кек, требуемых ДЛ уnра!3леНLI1Я ЖКLI1НДLl1катором, уже включены в саму срУНКЦLl1Ю, передающую данные на ЖКLI1НДLl1катор. Единственна часть nporpaMMbI, ко- Topa влется nРLl1НЦLl1nиально HOBO  3ТО срУНКЦLl1 04L11CTKLI1 СДВLI1rовоrо perLl1CTpa 74НСТ164. 
R2 R1 З.9К 10К PIC18F1220 U1 1 RAO °RBO 2 6 RA1 5! RB1 RA2 RB2 3 RАЗ RB3 4 RAo4 RВ4 16 #МCLR RB5 15 OSC1 1/) R 86 OSC2 RB7 С2 С1 1.0 uF 30 pF +5V Ro4 12 '"1 :f: С3 ;;;<  0.1 uF RЗ 10К tX' 7о4НСТ164  U2 :t :---1 VDD УЕЕ +VLED  VLED tт:1 1 А u ао D4  2  о В 01 DS VSS tX' 02 D6 tr' CLK 03 D7 :S:C 04 RS LCD tX' 9 Ш О tX' 05 о z 06   (!) 07 tX' tr' R6 Е R/W 65 1К о t--  02 Рис. 7 .13. 2проводное подключение микроконтроллера к ЖКИ N 00 VJ 
284 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Пример 7.12 1* * rrpMMep rrocneAOBaTenbHoro KM, HarrMcaHHbl AnR PIC18F1220 *1 #include <p18cxxx.h> #include <delays.h> 1* Установка 6мтов KOHMrypaUMM *  установка peMMa reHepaTopa HS *  BKn4eHMe cTopoeBoro TaMepa *  BKn4eHMe HM3KoBonbTHoro rrроrрамммроваНМR *  oTKn4eHMe с6роса по 4acTM4Ho потере nMTaHMR *  разреwенме 06ero с6роса *1 #pragma config OSC RC #pragma config WDT OFF #pragma config LVP OFF #pragma config BOR OFF #pragma config MCLRE = ON #pragma code II main program void clockShiftReg (void) PORTBbits.RB3 РОRТВЬits.RВЗ 1; о; II TaKTOB MMrrYnbc на RВЗ } void clearShiftReg (void) char а; PORTBbits.RBO = о; for (а = о; а < 6; а++) clockShiftReg() ; II nMHMR AaHHX = О II rrepeAa4a 6 TaKTOBX MMnYnbCOB void sendNibble (char nib, char RS) char а; clearShiftReg(); PORTBbits.RBO  1; clockShiftReg(); PORTBbits.RBO = RS; clockShiftReg(); for (а = о; а < 4; а++) II 04мстка CABMrOBoro perMcTpa II BAaqa Е II BAa4a RS PORTBbits.RBO = nib & 1; clockShiftReg(); nib »= 1; 
[пава 7. Базовый BBO)].BЫBO)]. 285 'loid sendLCDdata (char data, char RS) sendNibble (data » 4, RS) ; sendNibble (data, RS) ; lOid initLCD (void) Delay1KTCYx (1 О) ; sendLCDdata (Ох20, О) ; Delay1KTCYx (3) ; sendLCDdata (О х2 О, О) ; Delay10TCYx (1) ; sendLCDdata (О х2 О, О) ; sendLCDdata (Ох28, О) ; sendLCDdata (Ох01, О) ; Delay1KTCYx (1) ; sendLCDdata (ОхОС, О) ; sendLCDdata (ОхОб, О) ; void main (void) ADCON1 = OxOF; TRISB = О; PORTB = о; ini tLCD () ; II BAa4a neBoro nony6aTa I1 BAa4a npaBoro nony6aTa II OMAaHMe 20 мс (смотрмте текст) 1 I вьща4а Ох2 О II OMAaHMe б мс 1I BAa4a Ох20 II OMAaHMe 100 мкс II вьща4а Ох20 II вьща4а Ох28 1I вьща4а Ох01 II OMAaHMe 2 мс 1 I вьща4а ОхОС II BAa4a ОхОб II уста нов всех cMrHanoB как UMpOBX 11 rropT В - BXOA II все BBOA порта В  = О II мнмuмаnмзаUМR KM I1 здесь BBOARTCR AaHHe AnR oT06paeHMR Таблица 7.2. ФУНКЦLl1И ДЛ работы с ЖКLI1ндикатором в раС4ете на LI1СnОЛЬЗ0ваНLI1е контроллера НО44780 ФУНКUМR BusyXLCD (void) OpenXLCD (unsigned char init) Орммер while (BusyXLCD()); OpenXLCD (FOUR_BIT & LINES 5Х7); putcXLCD (char data) putsXLCD (char *buffer) See WriteDataXLCD putsXLCD (buffer); putrsXLCD (const rom char *buffer) putrsXLCD (buffer); Ормме4анме Ороверка заНRТОСТМ KM MHMUManM3MpyeT KM на 4 6мта AaHHX м peMM MHoeCTBeHHЫX строк cMMBonoB FOURBIT на 4 nMHMM AaHHX EIGHTBIT на 8 nMHM AaHHX LINE 5Х7 AnR OAHO nMHMM LINE 5Х10 AnR OAHO nMHMM LINES5X7 AnR HeCKOnbKMX nинм Same as WriteDataXLCD OT06paaeT COAepMMoe 6yepa в rraMRTM AaHHX, KOTOp COAep MT строку с HyneBM pa3AenM TeneM OT06paaeT COAepMMoe 6yepa в naMRTM nporpaMM, KOTopbrn co AepMT строку с HyneBM pa3Ae nMTeneM 
286 ITрнменение MHKpOKOHTpOnnepOB PIC 18 Dример ПРИМСЧCJНИС: С4итывае'1' ацрес 13 3УПВ И,I)lика тора М3 ЖКМ С4мтывает 6a'l' цанных М3 ЖКИ ФУНКЦМЯ unsigned char ReadAddrXLCD (void) char ReadDataXLCD (void) SetCGRamAddr (un signed char addr) SetDDRamAddr (un signed char addr) WriteCmdXLCD (un signed char cmd) WriteDataXLCD (char data) addr = ReadAddrXLCD(); data = Read DataXLCD(); SetCGRamAddr (Ох40); Адресует CMMBOJ! @ в I'eHepa'l'ope сммволов ААресус'l' ПОЗИЦИЮ символа данных 3апмсывает команду в ЖКИ SetDDRamAddr (Ох80); WriteCmdXLCD (BLINK_ON) ; WriteDataXLCD ('А'); DON  мдмкатор BKn. DOf'F  идмка'J'ОР BbIKn. BLINK  ON . МИl'днме курсора BLINK  Or'l" курсор не МИ1'аС'I' CURSOROET курсор выкл, SHIFT RIGHT CUR   SHIFT LEE'T CUR SHIFT DISP RIGHT SНIFT DISP LEFT 3апмсь 6aTa AaHHX в ЖКМ Поддержка работы с ЖКИ в трансляторе С18 Транслтор С18 с 3ЫKa С обесnе4L11вает noMep>KКY работы с ЖК-индикаторами 4ерез срункции, nере4исленные в табл. 7.2. 3ти СРУНКЦLl1L11 собраны в срало заr-оловкоЕ3 xlcd.h. В ПрИЕ3е- дeHHO таБЛLl1це nере4L11слен nолны набор срункци Д1l работы с ЖК-ИНДИКalораМLI1, включая LI1зменеНLI1е данных в СLl1МВОЛЬНОМ reHepaTope, так 4ТО MorYT отображаться специаЛЫlые СLl1МВОЛЫ. Чтобы LI1СnОЛЬЗ0вать xlcd.h LI1 ero СРУНКЦLl1L11, ДОЛ>КНЫ быть обеспечены TpLl1 времен- ные задеР>ККLI1: DelayFor18TCY (ДЛ задер>ККLI1 в 18 командных ЦLl1KJlО(3), DelayPorXLCD (для задер>ККLI1 15 мс) LI1 DelayXLCD (ДЛ задер>ККLI1 5 мс). Если срал заrоловков OCTaULl1Tb без LI13MeHeHLI1, то вывод АВ4 будет LI1СnОЛЬЗ0ватьс ДЛ СLl1rнала Е, вывод АВ5  ДЛ СLl1rнала RS, вывод АВ6  ДЛ СLl1rнала RW, а выводы от АВО дО АВ3 будут LI1СnОЛЬЗ0вать c как 4-разрдны LI1HTepcpec данных LI1НДLl1катора. npOCTO npLl1Mep, LI1ЛЛЮСТРLl1РУЮЩИ LI1спользоваНLI1е срала заrоловков xlcd, nоказан в npLl1Mepe 7.13. ВслеДСТВLI1е Toro, 4ТО вывод RjW дол>кен LI1сnользоватьс ДЛ Toro, 4тобы данные СРУНКЦИLl1 работали правиль но, что требует LI1СnОЛЬЗ0ваНLI1 доnолнительноrо вывода BBoдaBЫBoдa, на практике ЭТLI1 СРУНКЦИLl1 LI1СnОЛЬ3УЮТС редко. Пример 7.13 1* * Dример nocneAoBaTenbHoro ЖКМНАмкатора, напмсанн AnR PIC18F1220 *1 #include <p18cxxx.h> #include <delays.h> #include <xlcd.h> 1* Установка 6мтов KOHMrypaUMM *  установка peMMa reHepaTopa HS *  вкnюqенме cTopoeBoro TaMepa *  ВКn4ение низковоnьтноrо nроrраммирсванмя 
[пава 7. Базовый ВВО)].-ВЫВО)]. 287 *  OTKn4eHMe с6роса по 4acTM4Ho потере пмтаНМR *  разрешенме 06ero с6роса *1 #pragma #pragma #pragma #pragma ffpragma config OSC config WDT config LVP config BOR config MCLRE HS OFF OFF OFF = ON II ROM ОАТА ear rom char str1[] near rom char str2[] "I am PIC18F"; "How are you?"; #pragma code 1I rnaBHaR nporpaMMa void DelayFor18TCY (void) II AnR TaKTOBO 4acToT, paBHO 4 MrU Delay10TCYx (2); II 20 МКС void DelayPORXLCD (void) Delay1KTCYx (15); II заАерка в 15 мс void DelayXLCD (void) Delay1KTCYx (5); II заАерка в 5 МС } void main (void) { ADCON1 = OxOF; II B60p всех UMpOBbIX CMrHanoB , II мнмuмаnмзаUМR ЖКМ OpenXLCD (FOURBIT & /1 OTKpTMe ЖКМ LINES 5Х7); while (1) { SetDDRamAddr (Ох80); putrsXLCD (str1); SetDDRamAddr (ОхСО); putrsXLCD (str2); II строка 1 II строка 2 Вакуумные флуоресцентные индикаторы Вакуумные срлуоресцентные LI1НДLl1каторы (ВФV1) наLl1более 4асто LI1СnОШ)ЗУЮТСЯ u сиrнальных 4асах, а так>ке в автомобильных раДLl104асах. 3TLI1 LI1НДLl1каторы обычно харак- терLl13УЮТС LI1X СLl1незеJlеным цветом, KOTOpЫ влетс ВИДLl1МЫМ во MHOrLl1X раЗЛИ4НЫХ cLl1Tyau.LI1x освещеНLI1, XOT следует OTMeTLI1Tb, 4ТО LI1меютс ВФV1 LI1 С друrим цветом СLЗе 4eHLI1. ВФV1 БЫЛLl1 nepBbIMLI1 ДОСТУnНЫМLI1 злеКТРОННЫМLI1 LI1НДLl1каторными YCTpoCTBaMLI1, которые nредwествовали свеТОДLl10дам. 3TLI1 МОДУЛLl1 (оБЫ4НО вставные) часто встре4а- 
288 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 ютс во MHOrLl1X nотреБLl1теЛЬСКLI1Х электронных YCTpOCTBax, LI1X срок СЛу>кбы составляет до 80000 4асов. PLl1c. 7.14 LI1ЛЛЮСТРLl1рует внутреннюю КОНСТРУКЦLl1Ю ВФV1. ВФV1 работает подобно ТрLl10ДНО электронно трубке, за LI1СКЛЮ4еНLI1ем Toro, 4ТО наnря>кеНLI1е анода ВФV1 составлет от 1 О до 15 В вместо сотен вольт, LI1сnользуемых в злеКТРОIlНО трубке. HLI1Tb накала (катод) свзана с 1,5 В, ток 4ерез нее застаЕ3ляет HLI1T ь наr.реЕ3аться LI1 relle pLl1pOBaTb облако электронов. ЕСЛLl1 к аноду nРLl1кладывае-r ся ПOJlOжительное lIапря>ке- HLI1e, то электроны nРLl1тrLl1ваютс к аноду LI1 коrда они соударяются с ним, то nрОLl13Е30ДЯТ сротон света, KOTOpЫ влетс ВLI1ДLl1МЫМ. Анод nOKpbIT сроссрором, KOI-OpЫ LI1 оrlреде лет окраску LI1ЗЛУ4аемоrо света. УnраВЛlOща сетка, расnоло>кеНllая ме>кду анодом LI1 НLI1ТЬЮ накала, мо>кет быть подключена к небольwому ОТРLl1цателыюму наnря>кеНLI1Ю с тем, 4тобы оттолкнуть некоторые электроны, умеНЬШLl1В тем самым pKOCTb LI1НДLl1като- ра. ОБЫ4НО с уnравляюще ceTKO свзан nереКЛЮ4атель, соеДLl1НЯЮЩLl1 ее ЛLl1бо с зем ле, ЛLl1бо с  1 В. ЕСЛLl1 уnраВJlюща сетка заземлена, то LI1I1ДLl1катор свеТLI1ТСЯ ярко, а если на нее подан  1 В, то LI1НДLl1катор не CBeTLI1TC. В СLl1ЛУ Toro, 4ТО это YCTPOCTBO хорошо работает npLl1 Hanp>KeHLI1L11 12 В, обесnе4L11 Ba достаТО4НУЮ pKOCTb, в 60ЛЬШLl1нстве автомоБLl1ле оно LI1сnользуется Е3 одометрах, а так>ке в LI1I1ДLl1каторах раДLl10nрLl1еМНLI1КОВ LI1 4асов. Что касается ero ПрОIраММИрОЕ3аIlИЯ, то это YCTPOCTBO доступно В nоследовательно BepCLl1L11, которая rlроrраММLI1руется по добно ЖКLI1НДLl1каторам, поэтому соотвеТСТВУЮЩLl1 npLl1Mep здесь не nРИВОДLl1ТСЯ. Стеклянная колба . I . . . Аноды I . . I . . . Нить накала Управляющая сетка Рис. 7.14. BHyTpeHH конструкци BaKYYMHoro срлуоресцентноrо LI1НДLl1катора (ВФV1) 
rnaBa 7. Базовый вво)].-выво)]. 289 7 .3. Управленя электромоторам В этом разделе обсу>кдаетс уnравлени электромотораМL/1. Несколько баЗL/1СНЫХ TL/1nOB электромоторов упраЕ3ЛЯЮТС BCTpOeHHbIML/1 CL/1CTeMaML/1, ВКЛЮ4а waroBbIe злек тромоторы L/1 электромоторы nocToHHoro тока. В этом разделе рассмаТРL/1вается cpop МL/1рОВШ-IL/1е L/1HTepcpeca L/1 nporpaMMHbIe npL/1MepbI дл Ka>KДOrO L/13 ynoMHYTbIX TL/1nOB электромоторов. Шаrовые электромоторы YCTpOCTBOM, которое 4асто nОДКJlЮ4аетс к BCTpoeHHO CL/1CTeMe, ЯШIЯQТСЯ шаrо E3ы электромотор. Шаrовы электромотор оБЫ4НО рассматривается как дискреТIIЫ злектромотор, потому 4ТО он nеремещает вал ДL/1скреТНЫМL/1 шаrами, переходя Lюрез 3600. ОБЫ4НЫ шаrовы электромотор L/1MeeT передаТ04НЫ мехаНL/1ЗМ, обеспе4L/1UШО ЩL/1 уrол поворота nРL/1БЛL/13L/1тельно от 150 до 10 на ша.r в nреЦL/13L/10ННЫХ шаrоЕ3ЫХ элек тромоторах. Во всех СЛУ4ах, ЭТL/1 шаrL/1 обесnе4L/1ваютс 4ерез L/1СnОЛЬЗ0ваНL/1е несколь KL/1X полюсов MarHL/1Ta и (L/1ЛИ) L/1СnОЛЬЗ0ваНL/1е nередаТ04НЫХ MeXaHL/13MoB. Обратите E3HL/1 мание, на то, 4ТО две ПРОТL/1воnоло>кные каТУШКL/1, nоказанные на pL/1c. 7.15, возбу>кдаIOТ c одновременно. 3то называетс полноwаrовым pe>KL/1MOM L/1 заставлет ротор nOE3opa 4иватьс на О .,90 ., 180. и 270.. С целью ЭКОНОМL/1L/1 MOW,HOCTL/1, одновременно мо>кет возбу>кдатьс только одна катушка, однако это CHL/1>KaeT СL/1ЛУ поворота. На pL/1C. 7.15 nрL/1ВОДL/1ТС 4eTbIpexKaтywe4HbI шrовы мотор, в котором L/1СnОЛЬ зуетс ротор с ОДНL/1М полюсом. Шаrовы мотор nоказан в 4етырех состояниях с ро.то- ром (постоянно HaMarHL/14eH), находw,L/1МС в 4етырех ДL/1скретных СОСТОНL/1ЯХ. Соответ- СТВУIOЩL/1 поворот ротора ДОСТL/1rаетс посредством заnL/1тываНL/1 пары катушек, как nоказано на pL/1cYHKe. 3то ИЛЛЮСТРL/1рует nолношаrовы pe>KL/1M. Шаrовы мотор управ- летс с L/1СnОЛЬЗ0ваНL/1ем Nканальноrо nолевоrо MOn-траН3L/1СТОра для обеспечения зна4L/1тельноrо тока на ка>кдую KaтywKY. УСL/1ЛL/1тель на полевых MOnTpaH3L/1CTOpaX мо- жет быть заменен УСL/1ЛL/1телем на составном TpaH3L/1CTOpe АаРЛL/1нrтона. TaKO УСL/1ЛL/1тель ,содер>КL/1Т BHYTpeHHL/1e демnсрерные ДL/10ДЫ, nредназна4енные ДЛ шунтироваНL/1 любых выбросов обратноrо ИНДУКТL/1вноrо Hanp>KeHL/1, reHepL/1pyeMbIx коллапсом маrнитноrо поля BOKpyr nолевоrо MOnTpaH3L/1CTopa. Цепь уnравлеНL/1 waroBbIM мотором L/1ЛЛЮСТРL/1руетс pL/1c. 7.16, на котором nOKa- заны 4етыре каТУШКL/1 waroBoro злектромотора. В 3TO цеnL/1 L/1сnользуетс микрокон троллер, KOTOpЫ cpopML/1pyeT СL/1rналы уnравлеНL/1, L/1сnользуемые дл поворота ротора мотора ЛL/1бо по ЛL/1бо ПрОТL/1В 4aCOBO стреЛКL/1. 
290 Примененне MHKpoKoHTponnepoB PIC18   :"[ frl II ".. s N . s: \1 s \=::::==-.:::.)  s r111 ,} -"! S j 00 ((...  II <') . u JJ s . "..............................\ f с::::;;.'1 \ N 1==== 8, 1 N '\.::::::::::..-:::!..)  N S OIIJ N 1800 Рис. 7 .15. WaroBbI электромотор II 900 . N I .  : II . s I ;; II 2700 
12V 1 О MG1 +5V 2 Шaroвый 3 электроютор U2A 7 2 RВO ;; ТС1427  t:C  <о U1A - :--J tТ:I 2  RВ2 о t:C tТ' =с U2B Информационнысвхо t:C ТС1427 t:C о - 4 RВI  t:C  tТ' ; О ТС1427 }:;1 U1B - 5 4 RВЗ ТС1427  Рис. 7.16. Схема управления шаrовым электромотором N '-D 
292 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 Простая nроцедура на 3ЫKe С, KOTopa ynpaBneT зnектромотором (ПРLl1lIимая, что порт В заnроrраммирован как выходной порт), показана 13 примере 7.14. Эта функ ция l3ызываетс с параметром шаrа, KOTOpЫ содержит чисnо шаrов и направлсния вращени. Если значение параметра шаrа боnьше, 4ем Ох8000, то мотор nоворачиваст c в направлении враw,ени 4aCOBO стреnки; есnи зна4ение пара метра шatа МСНЫIЮ, чем Ох8000, то мотор nOBOpa4L11BaeTC в наnравnении против вращсния часовой стрел ки. Например, eCnLl1 зна4ение параметра шаrа равно охОООЗ, то мотор 11OвораЧИ13ает ротор nротиl3 часово CTpenKLI1 на TpLl1 шаrа, а есnи параметр шаrа pal3eH Ох800З, то он повернет ротор на три шаrа в направnении движени 4aCOBO стреnки. KpaHLI1 nеl3ЫЙ разрд параметра шаrа удаnетс, при зтом OCTanbHbIe 15 разрдоl3 содер>кат 4ИСJJО шаrов. Обратите внимание, 4ТО в nоказанно проu.едуре LI1споnьзуетс временная за держка, равная 1,0 мс. Эта BpeMeHHa задержка требуетс дn Toro, 4тобы дать ротору шаrовоrо злектродвиrатеn BpeM на выход в сnедуlOw,уlO nозициlO. Пример 7.14 char currentPosition = ох33; void moveStepper (int steps) unsigned int а; if ((steps & Ох8000) Ох8000) for (а о; а < steps & Ox7FFF; а++) _asm RLNCF currentPosition, 1, BANKED endasm PORTB = currentPosition; } else for (а о; а < steps; а++) _asm RRNCF currentPosition, 1, BANKED endasm PORTB = currentPosition; TeKyw,a П03L11u.LI1 ротора coxpaHeTC в 4eKe паМТLI1 currentPosition, которая ,lJ,on>KeH быть LI1НLI1u.LI1аЛLl13L11рована 3Ha4eHLI1eM ОхЗЗ, Ох66, ОхЕЕ LI1nИ Ох99. Это П03lзоnет ПрLl1 помоw,LI1 простых команд RRNCF (шаr вправо) LI1nLl1 RLNCF (шаr I3ne130) CPOpMLI1pOBaTb двоичные БLl1товые структуры ДЛ сnеДУIOw,еrо шаrа посредством u.ИKJlLl14ескоrо СДВLI1rа. При LI1CnOnb30BaHLI1L11 Ассембnера в проrрамме на 3ЫKe С, доnжны быть BKJl104eHbI I3се поля команд, как зто ИnnlOСТРLl1руетс в примере 7.14. n04eMY ИСПОnЬЗ0ваnс Ассемб- лер дn Toro, 4тобы ocyw,ecTBnTb u.ИКnLl14ески СДI3L11r 4исnа в 4ейке памяти 
rnaBa 7. Базовый вво)].-выво)]. 293 currentPosition? В 3ЫKe С L/1меется TOnbKo команда СДВL/1rа, позтому реализация цикли ческоrо сдвиrа на С будет HaMHoro боnее CnO>KHO  она будет сопряжена с pacxoд()Вa HL/1eM HaMHoro боnьшеrо объема паМЯТL/1 L/1 BpeMeHL/1. Шаrовые зnеКТрОДВL/1rатеnL/1 так>ке CPYHKu.L/10HL/1PYIOT в реЖL/1ме ПОnОВL/1нноrо шаrа, KOTOpЫ позвоnет выпоnнть восемь шаrов на одну посnедоватеnьность. Это ВЫllOЛ нется при L/1СПОnЬЗ0ваНИL/1 ОПL/1санно поnношаrово посnедоватеnЬНОСТL/1, L/1 cpOpML/1pO- BaHL/1L/1 ПОnОВL/1Нноrо шаrа за С4ет воз6У)l(,lJ,еНL/1 TOnbKO OДHO KaТYWKL/1 L/13 4L/1cna YCTaHOB ленных Me)l(,lJ,Y ПОnНЫМL/1 шаrаМL/1. РеЖL/1М ПОnОВL/1нноrо шаrа позволет ротору позицио HL/1pOBaTbc на 450, 135 о, 225 о и 315 о в допоnнеНL/1е к П03L/1ЦИМ реЖL/1ма поnноrо шаrа. Коды П03L/1ЦИ реЖL/1ма ПОnОВL/1нноrо шаrа  зто Ох11, Ох22, Ох44 L/1 Ох88. Полна последо- вательность И3 восьми шаrов, ВКnlO4аlOw,ая поповинные и nOnHbIe шаrL/1, имеет вид: Ох11, Ох33, Ох22, Ох66, Ох44, охСС, Ох88, и Ох99. Эта последователыюсть ДОЛЖllа JlL/1бо извлекаться L/13 поисково табnL/1u.ы, nибо reHepL/1pOBaTbc проrраммно. На рис. 7.15 L/1nnIOCTpL/1pyeTc 6-проводны шаrовы зnектродвиrатеnь. Также мо- жет L/1СПОnЬЗ0ватьс 4проводны шаrовы зnеКТРОДВL/1rатеnь, в котором имеlOТСЯ no сnедоватеnьно соеДL/1ненные каТУШКL/1 с 4eTыpbM проводаМL/1. Ero основным lIeДOCTaT ком BneTc то, 4ТО ПрL/1 управnеНL/1L/1 L/1M доn>кен L/1СПОnЬЗ0ватьс двухпоnрный L/1CT04- HL/1K ПL/1таНL/1 nL/1бо схема H06pa3Horo моста. Электромоторы постоянноrо тока Эnектромотор постонноrо тока BneTc  зто YCTPOCTBO, работаюw,ее ЛL/1бо в реленом реЖL/1ме (реЖL/1М BKnI04eHL/1/BbIKnI04eHL/1), nL/1бо в реЖL/1ме, КОIда ВЫnОnllется ynpaBneHL/1e, как ero CKOPOCTblO, так L/1 'направnеНL/1ем Bpaw,eHL/1. НазваНllое управлеllИЯ выпоnнетс посредством L/13MeHeHL/1 напр>кеНL/1е на зnектромо'торе, либо посредст БОм L/13MeHeHL/1 ПРОДОn>КL/1теЛЬНОСТL/1 L/1мпуnьса, ПРL/1nоженноrо к зnектромотору. Здесь paccMaTpL/1BaeTC посnедн меТОДL/1ка, потому 4ТО она реаЛL/1зует наиболее распро- cтpaHeHHЫ в HacTow,ee BpeM метод управлеНL/1 CKOpOCTblO Bpaw,eHL/1 зnектромото- ров постонноrо тока. В зтом подра3,lJ,еnе paCCMaTpL/1BaeTC управnеНL/1е зnектромото p3ML/1 ПОСТОlIноrо тока с L/1СПОnЬ30ВЮL/1ем ШL/1РОТНОL/1мпуnьсноrо модуnтора (ШИМ), pa3Mew,eHHoro BHYТpL/1 МL/1кроконтролnера. На pL/1C. 7.17 ПРL/1ведены схемы управnеНL/1, тре6уемые ДЛ Toro, 4тобы уnравnять электромотором nocToHHoro тока как однонаправnенным, так L/1 двунаправnенным уст- ройством. На 3TO L/1nnlOcTpau.L/1L/1 L/1СПОnЬ3УIOТС схемы управnеНL/1 на поnевых МОП тpaH3L/1CTOpaX, потому 4ТО в зтом СЛУ4ае CTOL/1MOCTb схем подобна CTOL/1MOCTL/1 схем lIа биполрных переKJl104атеnьных TpaH3L/1CTOpaX, кроме Toro в cnY4ae ИСllOЛЬЗ0вания ин терфеса на поnевых MOnTpaH3L/1CTOpaX Tpe6yeTC меньше детаnе. Двунаправленная схема управnеНL/1 ОПТL/14еСКL/1 L/130nL/1pOBaHa от схемы управnеНL/1 зnектромотором на Н- 06разном мосте. 3то распространенна праКТL/1ка, L/1MelOw,a u.enblO предотвраw,т-lL/1е проблем L/1 L/1золu.L/11О МL/1кроконтроnлера от схемы управлеНL/1 злектромотором. С u.e- JIblO управлеНL/1 злектромотором упраВЛIOw,L/1 ВХО,lJ, H06pa3Horo моста BKnlO4aeT пару ПРОТL/1ВОПОnО>КНО BKJl104eHHbIx поnевых MOn-траН3L/1СТОрОВ. nOporoBoe напржеНL/1е болЬWL/1нства MOW,HbIX полевых MOnTpaH3L/1CTOpOB влетс ПРL/16nL/13L/1тельно равным 3.0 В. Anя BКJlI04eHL/1 nолевоrо MOnTpaH3L/1CTOpa на вход подаетс ПOJIOЖL/1теnьное на- npяжеНL/1е, превышаlOw,ее пороr, а ДЛ ero BbIKJlI04eHL/1  напржеНL/1е, явnяюw,ееся бо вее HL/13KL/1M, 4ем пороrовое. nOCKonbКY попевые MOnTpaH3L/1CTOPbI  зто YCTpOCTBa, ynpaвлемые по напржеНL/1IО, то мо>кно 6bIno 6ы nреДПОЛОЖL/1П), 4ТО ток затвора 5ШЛЯСТ ся 04ень неБОЛЬШL/1М. ЭТО L/1CTL/1HHO В cnY4ae Mow,Horo полевоrо МОnтранзистора, pac СМЗТРL/1ваемоrо как OT,lJ,enbHoe YCTPOCTBO, однако на pL/1c. 7.17 не показшю то, 4ТО TЫ И noneBbIx MOnTpaH3L/1CTOpOB BКnlO4eHbI в парanлеnь BHYТpL/1 корпуса микросхемы с 
294 ITpHMeHeHHe мнкроконтроллеров РIС 18 Ц8J1ЫО уnра!JлеНL/1 60ЛЬШL/1МL/1 TOKaML/1. Так как запзор полевоrо МОПтраНЗL/1стора пред- c-таЕ3ляет собой конденсатор, а коrда конденсаторы ВКnlOчаются nаралnеnыю, то их емкости складываIOТС, то ВХО,lJ, L/1MeeT довоnьно боnьшуlO емкость. Зард L/1nL/1 разряд eMKOCTL/1 затвора может nOTpe60BaTb знаЧL/1теnьноrо тока. НаПРL/1мер, ДОЕ30ЛЫЮ ТИПL/1ЧIIO, ЧТО переКЛlO4ение тока в 1 А ПрL/1 помоw,L/1 Mow,Horo поnевоrо MOnTpaH3L/1cTopa требует ,-ока затвора, paE3Horo 1,5 мА. Однако, переКnlO4еНL/1е тока в 12А потребует у>ке 150 мЛ тока затвора. TaKL/1M 06раЗ0М, схемы управnеНL/1 для CL/1nbHOT04HbIX применений требу ются для орrанизаu.L/1L/1 L/1нтерсрейса ML/1KpOKOHTponnepa с MOW,llbIML/1 полевыми М О П - TpaH3L/1CTOpaML/1. Чтобы измеНL/1ТЬ скорость Bpaw,eHL/1 злектромотора L/1сnользуется ШИММОДУIlЯ юр микроконтролnера с тем, 4т06ы обеспе4L/1ТЬ схеме уnравлени сиrнал с nepeMellllo ШИрL/1НО L/1мпуnьса. ШИМ испоnьзует TaMep 2 L/1 срункu.L/10нирует как схема управлсния с ОДIIL/1М выходом, L/1ЛL/1 как схема управnени с ДBYM выходаМL/1 для ПОnОЕ3ИIIЫ H образноrо моста, L/1nL/1 >ке как схема управnеНL/1 с 4eTыpbM выходаМL/1 дл уnравлеllИЯ полным Н-образным мостом. Ра3ЛL/14ные 4neHbI семейства L/1MeIOT один L/1nи большее КОЛL/14ество ШV1ММО,lJ,улторов с u.елыо управnеНL/1 боnее, чем одним злектромотором. Сиrнаn, подаваемы на зnектромотор, доnжен быть выше ДL/1аnа30на слышимых частот, L/1бо в ПРОТL/1ВНОМ cnY4ae зnектромотор будет "петь" на частоте МОДУJlЯЦИИ. ОСНОШlа51 частота ШИМ доnжна быть по крайне мере paBHO 5 кrц. (БОЛЬШИIIСТЕ30 электромото ров MeXaHL/14eCKL/1 не cMoryт ВL/1брL/1ровать на 4астоте в 1 О кrц, которая 51Шl5ЮТСЯ СJlЫШИ мой). Она должна так>ке 6ыть меньше, 4ем nРL/1бnизительно ЗО кrц, L/1наче MorYT Е30ЗНИК- нуть пробnемы, eCnL/1 ДЛ L/1здеЛL/1 потребуетс одобрение FCC. В БOJIЬШL/1l1стве случасЕ3 8разрдна ШИМ 6удет достаТ04на ДЛ управnеНL/1 БОnЬШL/1НСТВОМ ОДlIонаnравлеНIIЫХ электромоторов постонноrо тока. Она обеспе4L/1вает 256 разных 3lшчеНL/1Й CKOpOCTL/1. ЕСЛL/1 будет ПрОL/13ВО,lJ,L/1ТЬС управnеНL/1е двунаправnенны злектромотором, то такая ШИМ обесnеЧL/1Т 128 3Ha4eHL/1 CKOpOCTL/1 ДЛ кюкдоrо направлени, 4ТО может быть, а может L/1 не быть достаТ04НЫМ CKopOCTe ДЛ поnноu.енноrо уnравnеНL/1Я. Чтобы rellepL/1 ровать боnьшее КОЛL/14ество ПРL/1раw,еНL/1 CKOpOCTL/1, требуетс L/1СПОnЬЗ0вание ШИМ больше раЗРДНОСТL/1. К C4aCTblO, ШV1М в ML/1KpOKOHTponnepe L/1MeeT разрдность в 1 О БL/1ТОВ, 4ТО позволет L/1СПОnЬЗ0вать вплоть до 1 024 зна4ени CKOpOCTL/1. Вероятно, 4ТО это более, чем достаТ04НО ДЛ БОnЬШL/1нства nрименеНL/1. В rлаЕ3е 6 быn L/1зло>кен BBOДНЫ мaTepL/1aJl о TaMepax, однако в He Ile рассмаТРИЕ3алась работа TaMepa 2. Бnок схема TaMepa 2 показана на pL/1c. 7.18. Таймер 2 - 3ТО 8раЗрЯДIIЫ счеТЧL/1К, об03ta4енны на pL/1cYНKe как TMR2. Входом модуn TaMepa является систеМllая TaКТOBa 4астота, ра3,lJ,еленна 4,  она может ДОПОnНL/1теnьно деЛL/1ТЬС предваРL/1телы IbIM де- JlL/1телем на 1, 4 L/1nL/1 16, как 3ТО nporpaMML/1pyeTc БL/1таМL/1 T2CKPS 1 L/1 T2CKPSO perL/1CTpa ynpaB леНL/1 (T2CON) таймера 2. НаПРL/1мер, eCnL/1 CL/1CTeMa L/1споnьзует TaКТOBЫ reHepaTop на 4 мrц, а предваритеnьны деnL/1тель YCTaHOBneH на К03фсрL/1ЦL/1ент деnеНL/1 4, то TaMep будет L/1IIKpeMeH тироватьс ОДL/1Н раз каждые 4 мкс (4 Mrц/16 = 250 Kru.). Реrистр периода (PR2) определяет значение ОТС4ета, которое C6poCL/1T TMR2. TaMep 2 L/1нкрементируется по каж,цОМУ входному тактовому L/1МnУЛЬСУ, а затем, есnи PR2 равен TMR2, выпоnняетс сброс TaMepa по ПрИХОДУ следуюw,rо импуnьса TaКТOBO 4астоты. Вход TMR2 деJlИТС на PR2 + 1. Например, если пред ваРL/1теЛЫIЫ деЛL/1теnь YCTaHoBneH на К03срфL/1u.L/1ент деnеНL/1, paBHЫ 4, BXOДHa TaКТOBa час тота равна 4 Mru., а PR2 заnроrраММL/1рован на 9, то BЫXOДlla частота таймера 2 частота будет равна 25 Kr u.. TaMep 2 L/1MeeT два выхода: ОДL/1Н L/1споnьзуетс дnя схемы ШИМ внутри микро- контролnера, а ,lJ,pyro YCTaHaBnL/1BaeT БL/1Т cpnara прерываНL/1 (TMR2IF), вызывающий IlрерьшаНL/1е от TaMepa 2. Частота CL/1rHana на cpnar прерываНL/1 деnL/1ТС на К03ффL/1ЦL/1 ент, установnенный ДЛ постдеnL/1теn, который может проrраММL/1роваться на делеНL/1е сиrнала от TaMepa 2 на nlO60e u.enoe 4L/1CnO от 1 до 16. 
два напрявлен-ия +12У уСС УСС Одно направление +12V  U2 PS2501-1 N ;j  tX:I  N  U5A tТ:I  74НСТ04 О tX:I tТ' :S:c tX:I tX:I О   U4 tX:I tТ' PS2501-1 ; О  UБA 74НСТ04 - Уrrрав,:IЯЮЩИЙ вход  обратная ucrrb 12 В Рис. 7.17. Схемы управления электромотором постоянноrо тока цифровая зеl\1ЛЯ N '-D v1 
296 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 f'osc/4 нредварительный делитель + 1, +4, or + 16 TМR2 выход схема сравнсния по стдеJIlпе:п, рanснстlЮ + 1 to + 16 устаНО8 TМR2IF PR2 TOUTPS3 TOUTPSO = постделитель (0000 = + 1,0001 = + 2 to 1111 = + 16) TMIUON"" НКJlю'(ение/НЫ((J(Ю'lение л:iЙмера 2 (()HhIКJI.; Iню(.) T2CКPS1T2CКPSO "" предварителыlеделение(оо== +1,01 = +4, lХ= +16) Рис. 7.18. Блок-схема TaMepa 2 L/1 ero perL/1CTpa ynpaBneHL/1 nepe,lJ, тем, как на4ать paccMOTpeHL/1e nporpaMMHoro 06eCne4eHL/1, nредназна4ен- Horo ДЛ ynpaBnelalL/1 WV1M L/1 reHepL/1pOBaHL/1 WL/1pOTHO-L/1МПУnЬСНО МОДУnL/1рованноrо CL/1r Hana ynpaBneHL/1 злектромотором, не06ХОДL/1МО nOHTb CPYHKu.L/10HL/1pOBaHL/1e ШV1М. Мо- дуnь сср (сбор данных/сравнеНL/1е/ШИМ) BKnlO4aeT WL/1pOTHOL/1MnYnbCHbI модуnтор, L/1MelOw,L/1 до 4етырех выходов. В pe>KL/1Me с60ра данных сср perL/1CTpL/1pyeT содер>каНL/1е TaMepa 1 L/1ли TaMepa 3, Kor,lJ,a на штырьке RB3 прОL/1СХОДL/1Т C06bITL/1e. C06bITL/1eM может быть HapacTalOw,L/1 срронт СL/1rнала, HL/1cna.o.alOw,L/1 Kpa, Ka)l(,lJ,bI 4eTBepTЫ HapaCTalO- щий срронт CL/1rHana L/1nL/1 Ka)l(,lJ,bI 16ы HapacTalOw,L/1 срронт. ЭТL/1 соБЫТL/1 L/1CnOnb3YIOTC для Toro, 4тобы L/13MepL/1Tb BpeM Me)l(,lJ,y cppoHTaML/1 CL/1rHana, OTC4L/1TblВaeMoe по TaMepy 1 L/1nL/1 TaMepy 3. 8 реЖL/1ме cpaBHeHL/1 TaMep 1 L/1ЛL/1 TaMep 3 сраВНL/1вается с CCPR1 (16- разрдный perL/1CTp). ECnL/1 L/1MeeT место cooTBeTCTBL/1e, то R83 YCTaHaBnL/1BaeTC в со- CTOHL/1e nOrL/14eCKO еДL/1НL/1L..I,bI, н.ул, nepeКnlO4aeTC L/1nL/1 Bыpa6aTЫBaeTC заnрос npepbI- BaHL/1. Этот реЖL/1М nолезен ДЛ reHepL/1pOBaHL/1 CL/1rHana по L/1CTe4eHL/1L/1 HeKoToporo KOnL/1 4ества nepL/10,lJ,OB TaKTOBO 4астоты. Pe>KL/1M ШV1М, который явnется основной TeMO данноrо nодраздела, L/1споnьзует TaMep 2 L/1 Функu.L/11О cpaBHeHL/1 сср ДЛ Toro, 4тобы reHepL/1pOBaTb BЫXO,lJ,HO ШL/1РОТНО-L/1МnУЛЬСНЫ МОДУЛL/1рованны СL/1ПШn на штырьке Р1А, KOTOpЫ Ha3ЫBaeTC АВ3 в 60nЬШL/1нстве BepCL/1 МL/1кроконтролnеров. Это выходной CL/1rHan, nредназна4енны ДЛ уnравлеНL/1 О,lJ,нонаправленным зnектромотором. ЕСЛL/1 nоnовинны L/1ЛL/1 nолны Н-образны мост L/1сnоnьзуетс ДЛ Toro, 4тобы ynpaBnTb ДBY направленным зnектромотором, то L/1CnOnb3YIOTC выводы Р1А, Р18 L/1ЛL/1 Р1А, Р1 8, Р1 С L/1 Р1 О. Некоторые BepCL/1L/1 МL/1кроконтроnлеров L/1MeIOT 60nee одноrо модул ШV1М. 
rnaBa 7. Базовый BBO.u.-ВhIВО.u. 297 PL/1C. 7.19 L/1ЛЛIOСТРL/1рует блоксхему WV1M ДЛ СЛУ4а 8разрдноrо pe>KL/1Ma рабо ты L/1 BЫXOДHO CL/1rHan, ,lJ,eMOHCTpL/1PYIOW,L/1 pa604L/1 u.L/1Кn, paBHЫ 50%. (Раб04L/1 u.L/1Kn - зто BpeM BbICOKoro COCTOHL/1 СL/1rнала, nO,lJ,eJleHHOe на BpeM ero HL/13KOrO COCTOHL/1.) TaMep 2 определет nepL/1oA сле,lJ,оваНL/1 СL/1rнала, а CCPR1 L BbI6L/1paeT BpeM BbICOKoro COCTOHL/1 выходноrо CL/1rHana, которое onpe,lJ,eJleT pa604L/1 u.L/1KJl выхода ШV1М. Коrда TMR2 (TaMep 2) ДОС4L/1тает до ОТС4ета, nредварL/1теnьно заnроrраММL/1рованноrо PR2, то BЫXOДHO CL/1rHan устанавливаетс в еДL/1НL/1u.у L/1 содер>КL/1мое CCPR1 L заrружаетс в CCPR1 Н, npL/1 зтом TaMep 2 c6paCЫBaeTC в ноль. Коrда TaMep 2 досчL/1тыветT до зара нее оnределенноrо ОТС4ета, запроrраММL/1рованноrо CCPR1 L, то BЫXOДHO CL/1rHan сбра CЫBaeTC. HanpL/1Mep, ДЛ reHepL/1pOBaHL/1 pa604ero u.L/1Kna в 50%, eCnL/1 PR2 запроrрам ML/1pOUaH на 100, в CCPR1L нужно заrРУ3L/1ТЬ 50. Это прL/1ведет к установке выходноrо CL/1rHana Ka>KAЫ раз npL/1 04L/1CTKe TMR2, а затем, KOr,lJ,a TMR2 ДОС4L/1тает до 50, выходной СL/1rнал c6paCЫBaeTC L/1 OCTaeTC в COCTOHL/1L/1 nOrL/14eCKOro HYn .0.0 тех пор, пока отсчет не ДОСТL/1rнет 100, rде BЫXO,lJ,HO СL/1rнал YCTaHaBJlL/1BaeTC снова. Pa604L/1 u.L/1KJl в 25% будет nOnY4eH, HanpL/1Mep, еСЛL/1 РА2 запроrраммирован на 100, а CCPR1 L  на 25. nреДПОЛО>КL/1М, 4ТО злектромотор nOCTOHHoro тока nOAKJl104eH к ВЫВО,lJ,У Р1А (R83), см. pL/1c. 7.20. 3лектромотор управлетс только в одном направлеНL/1L/1, так 4ТО схема схемы ynpaBneHL/1 злектромотором не ,lJ,оnжна 6ыть сло>кно. 3тот L/1HTepcpec ИСПOIн)зует KBapu.eBbI реЗ0натор на 4 Mru. ДЛ СL/1НХрОНL/1заu.L/1L/1 L/1 две KHOnKL/1, ПОДКnlO 4енные к РАО L/1 РА 1 ДЛ ynpaBneHL/1 CKOpOCTblO. Одна L/13 3TL/1X кнопок 060зна4ена как UP (увеJlL/1ЧИТЬ), а друrая  DOWN (умеНЬШL/1ТЬ). Кнопка UP увеnL/14ивает скорость враw,ени зnектромотора, а кнопка DOWN  уменьшает ее. ECnL/1 ШV1М reHepL/1pyeT COTHL/1 раБОЧL/1Х u.L/1KnOB BbIxO,lJ,HOrO CL/1rHana, то MHoro ра60ТЫ Ну>Кно ДЛ Toro, 4т06ы L/13MeHL/1Tb скорость Bpaw,eHL/1 от oCTaHOBKL/1 .0.0 полно CKOpOCTL/1, n03ToMY npL/1Mep 7.15 L/1споnьзует только 1 О раЗnL/14НЫХ CKopOCTe. 3neKTpoMoTOP в зтом npL/1Mepe Mor бы 6ыть зnектромотором по- TOn04Horo BeHTL/1nTopa. Пример 7.15 nepMOA шим (PR2 + 1) х TMR2PS х 4 х Tosc nepMOA ШИМ (10 + 1) х 4 х 4 х 1/4 мкс 11 х 4 х 1 мкс  44 мкс пеРМОА ШИМ = 1/44 мкс = 22,7 KrU Примечание: TMR2PS содержи'.r коэффициент предваРИ'j'еJIЫlOl'О деЛGllИЯ для таймера 2) CL/1CTeMHa nporpaMMa, nоказанна в npL/1Mepe 7.16, npOrpaMML/1pyeT ШИМ на пе рL/10Д в cooTBeTCTBL/1L/1 с ypaBHeHL/1eM по npL/1Mepy 7.15. В зтом npL/1Mepe 4астота WИМ paB на 22,7 Kru.. TaКТOBa 4астота TaMepa 2 - зто Bcer,lJ,a 4астота тактовоrо reHepaTopa, раз деленна на 4. В зтом cnY4ae TaKTOBa 4астота TaMepa 2 равна 1 Mru., потому 4ТО в CL/1C теме L/1споnьзуетс TaKTOBЫ reHepaTop на 4 Mru.. Всле,lJ,СТВL/1е Toro, 4ТО предварL/1теnь HЫ деnL/1теnь TaMepa 2 настроен на КОЗсрсрL/1u.L/1ент деnеНL/1, paBHЫ 4, то TaMep 2 бу ,lJ,ет ра60тать на 4астоте 250 Kru.. TaMep 2 запроrраММL/1рован на с6рос nocne Toro, как AOC4L/1TaeT от О до 1 О (PR2). TaMep 2 C4L/1TaeT от нул ДО 1 О, а затем c6paCЫBaeTC, деn ВХО,lJ, TaKTOBO 4астоты в 250 Kru. на 11 (250 Kru.j11 = 22,7 ru.). 3та 4астота не явnется СЛЫШL/1МОЙ. 
298 ITpHMeHeHHe MHKpOKOHTpOnnepOB РIС 18 такrовая частота фнкснрующей схемы '4 выход ПIИМ R Q s БnОКСХС1а lI.IИМ пернод (РЮ + 1)  .. рабочий цнкл (ССРЮЦ  I Выходной сю'пал IПИМ Рис. 7 .19. CTPYKTYPHa схема ШИМ и форма LЗыходноrо сипшла Ha4anbHbI ОТС4ет CCPR1 L равен 11. Это заставnет вывод выходноrо СLl1rнала ШИМ (RВЗ) устанаВЛLl1ватьс в СОСТОЯНLI1е nоrLl1ческой единицЫ, потому 4ТО выходной сиrнал компаратора ССР никоrда не сбрасывает внутреННLI1Й RS триrrер. Аналоrично, eCnLl1 CCPR1 L будет запроrраММLI1рован нулем, то BЫXOДHO сиrнал станет постонным лоrLl1чеСКLI1М нулем, потому 4ТО BЫXOДHa CPLl1KcLl1pYIOw,a схема будет nОСТОЯllНО сброше- на. ЛоrLl1ческа 1, поданна на вход схемы упраLЗnения электромотором, связанный с RВЗ, заставnет схему управnеНLI1 КМОП ВЫКnlOчитьс, потому 4ТО нет никакоrо вход- Horo напржеНLI1. Это останавливает зnектромотор. Если кнопка UP будет Ha>Kal а, то содер>КLI1мое CCPR1 L декремеНТLI1руетс на 10. Это заставляет выход ШИМ сrенериро вать CLl1rHan, KOTOPЫ будет в СОСТОЯНLI1L11 nоrLl1ческо 1 на nротяжеНLI1И 1 О отсчетов и LЗ COCTOHLI1L11 nоrLl1ческоrо О на nротжеНLI1L11 1 отсчета. Схема управления КМОП будет ВКЛlO4ена ДЛ 1 ОТС4ета LI1 BbIKJl104eHa ДЛ 10 ОТС4етов. PLI1c. 7.21 показьшает HeCKOnbKO сиrналов ДЛ нескольких разnичных установок CCPR1 L. 
+5У R4 RЗ 10К 10К U1 PIC18F1220 :! RAO CR80 RA1 RB1 RA2 RB2 RАЗ RB3 RA4 RB4 #МCLR R85 OSC1 (f) R 86 OSC2 g; RB7 It) С1 1.0 uF - DOWN  (") О1 IRF620 MG1 2 Motor Servo Рис. 7.20. Управление однонаправленным электромотором nOCToHHoro тока + 12 V '"1   tX:I  :--J tТ:I  о tX:I tт' :S:C tX:I tX:I О Jт tX:I tт' ;; О }:;1 N '-D '-D 
300 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 о останов (CCPRIL = 11) о Поnная скорость (CCPRlL:::; О) o 45% (CCPRlL = 6) : 1 9  u u u 18% (CCPR1]::: 9) Рис. 7.21. HecKonbKo сНrналов AfI поснеНLI1 схемы (см. pLl1c. 7.19) LI1 проrраммы в ПРLl1мере 7.14 Пример 7.16 1* * YnpaBneHMe скоростью зnектромотора AnR PIC18F1220 *1 #include <p18cxxx.h> #include <delays.h> 1* Установка 6мтов KOHMrypaUMM установка peMMa reHepaTopa HS *  * * BKnqeHMe cTopoeBoro таймера BKnqeHMe НМЗковоnьтноrо nроrрамммрованмя oTKn4eHMe с6роса по qaCTM4Ho потере nMTaHMR разреwенме 06ero с6роса * * #pragma config OSC HS #pragma config WDT OFF #pragma config LVP OFF #pragma config BOR OFF #pragma config MCLRE = ON #pragma code II rnaBHaR nроrрамма void Switch (char bitP) II устраненме Аре6езrа контактов II nepeKn4aTene 
rnaBa 7. Базовый BBO.u.-ВbIВО.u. 301 do { IloMAaHMe oTrrycKaHMR (6MT 3) while ((PORTA & bitP) != bitP); Delay1KTCYx (15); } while ((PORTA & bi tP) ! = ЬНР); do I1 OMAaHMe HaaTMR (6MT != 3) { while ((PORTA & bitP) == bitP); Delay1KTCYx (15); }while ((PORTA & bitP) == bitP); void main (void) TRISB о; TRISA 3; T2CON 1; CCP1CON ОхОС; 11 06ЪRвnенме всех cMrHanoB 11 UMpOBMM 11 порт в  BXOA 1I 6MT о м 1 порта А  BXOA ADCON1 = OxOF; TMR2 = о; PR2 = 10; CCPR1L = 11; T2CONbits.TMR20N 1; II HaCTpOKa npeABapMTenbHoro 1I AenМTenR на K03MuмeHT АеnеНИR 4 II MOAYnb ССР BKn, BXOA с 11 aKTMBHM BCOKMM уровнем 11 OqMCTKa TaMepa 2 11 TaMep 2 c6pacBaeTcR на 10; 11 останов зnектромотора (11) Ilзаnуск TaMepa 2 м ШММ while (1) Switch (3); контактов if (PORTAbits.RAO == О) if (CCPRlL != О) CCPR1L; 11 проверка м устраненме Аре6езrа I1 HaaTMe KHonKM ОР (6CTpee) else if (CCPR1L != 11) CCPR1L++; 11 HaaTMe KHOnKM DOWN (MeAneHee) в 3TO nporpaMMe ССР1 CON (реrистр управления ССР) nроrраммируется дЛЯ TO ro, 4тобы выбрать режим работы реrистра модуля ССР. Рисунок 7.22 иллюстрирует содержимое реrистра управления ССР модуля. В зтом примере ССР1 CON nроrрамми- руется на ОхОС, 4ТО обесnе4ивает выбор одноrо выход (Р1А), KOTOpЫ является актив ным по лоrИ4еско единиu.е. Ра3ЛИ4ные режимы работы и сиrналы, доступные на Р1А 4ерез выводы Р1 D иллюстрируются на рисунке 7.23. Выходы Р1А LI1 Р1С nредназна4ены ДJlя активирования одноrо из HarpY304HbIX полевых MOn-транзисторов в Н-образном мосте, в то время как сиrнал nеремеw,ения злектромотора поступает на выходные BЫ воды Р 1 D или Р 1 В AflЯ срормирования результируюw,еrо выхода моста. 
302 ITрнменение микроконтроnnеров PIC 18 CCPICON PIMl PIMO OClВ) ОС 1 ВО сср 1М3 CCPIM2 CCPIMI CCPIMO Р1 М1 P1 МО Биты конфиrурирования выхода ШИМ 00 = один выход Р1А 01 = полномосювой выход  вращение BllOpen 1 О = полумостовой выход 11 = полномостовой выход  вращение назад DC1 В1 DC1 ВО Биты расширения ШИМ Младш ие биты 1 О-битнorо сиrнала Ш И М ССР1 МЗССР1 МО Биты выбора режима 0000 = сброс сср 0001 = не ИСПОЛl,зуеТСf1 001 О = режим сраШЮНИf1, переКJlючение по соответствию 0011 = не используется 0100 = режим реrистрации, по каждому срезу 0101 = режим реrистрации, ПО каждому нарастающему ФРОНТ-У 0110= режим рor.истрации, ПО каждому 4 мУ 'нарастающему фРОНJУ 0111 = режим реrистрации, по каждому 16 МУ нарастающему фронту 1000 = режим сравнеНИf1, установ по соо'шет.ствию 1001 = режим сравнеНИf1, сброс по соответствию 1010 = режим сравнеllИf1, rенеРИРОl3аllие прерывания ПО соответсrвию 1011 = режим сравнеНИf1, переключение 110 специалыюму событию 1100 = режим ШИМ, Р1А, Р1 С активен по лоrической единице, Р1 В, Р1 О активен по llоr'и ческой единице 1101= режим ШИМ, Р1А, Р1С активен по лоr..ической единице, Р1 В, Р1 О акrивен 110 1101 и ческому нулю 1110= режим ШИМ, Р1 А, Р1 С активен по лоrическому нулю, Р1 В, Р1 О ак] ивен по лоrи'ю ской единице 1111 = режим ШИМ, Р1А, Р1 С активен по ЛОI-ическому нулю, Р1 В, Р1 О ак] ивенпо Jfоrиче скому нулю Рис. 7.22. Реrистр уnравлеНLI1Я ССР 
rnaBa 7. Базовый ВВО)].-ВЫВО)]. 303 PIA I 1 J PlВ I Полумост PIA О PlВ PIC О РIО I Полный мост, вперед PIA О PlВ РIС РIО О Полный l\ЮС1 назад Рис. 7.23. nолу и полномостовой выход блока ШV1М nреДnОЛОЖL/1М, 4ТО злектромотор дол>кен управляться от устройства типа д>кой стика, которое содер>кит потенциометр. Потенциометр задает напря>кение, по мере Toro, как РУ4ка ДЖОЙСТL/1ка перемеw,ается от одноrо крайнеrо nоло>кения к друrому. По скольку МL/1кроконтроллер содержит АЦn, выход джойстика используется как ВХОД для 3Toro АЦП, rенерируя дискретное 4ИСЛО, которое соответствует установке ручки джой CTL/1Ka. АЦn rенерирует 8разрядное 3Ha4eHL/1e, которое исnользуется как вход дЛЯ ШV1М с целью управления CKOpOCTblO L/1 наnравлеНL/1ем враw,еНL/1Я злектромотора, связанноrо с микроконтроллером как Н-образный мост, управляемый полевым MOn-транзистором. Такая система L/1зобра>кена на рис. 7.24. В 3TO схеме 4етыре IRF540N уnравляlOТ током, который мо>кет достиrать вплоть до ЗЗ А, так 4ТО зтой схемой мо>кет уnравлятьс AO вольно большой злектромотор. В зтой схеме так>ке ИСnОЛЬ3УlOтся ОnТИ4еские развязки, изолируюw,ие схему управления злектромотором от микроконтроллера. Схемы управ леНL/1Я дл полевых МОnтранзисторов требуlOТСЯ в СЛУ4ае управления электромотора- ми, потребляlOw,ими БОЛЬШL/1е токи. 
w О  R4 R1 1К 1К :::1 "о R10 U2 :s:: R11 10К  == ДЖОЙСТИК  (1) ::t: 2 (1) ::t: :s:: (1) U1 == 12V :s:: RAO QRBO 8 батарея  9 О RA1 RB1 17 ::>:: RA2 RB2 о 18 ::t: RA3 RВ3 10 .а RM RВ4 11 #МCLR RВ5 О 12 R3 :::з У1 OSC1 RB6 13 1К :::з OSC2 RB7 (1) D "о О  """=' С2 n С3 С1 00 22pF 1.0 uF 22 pF Рис. 7.24. Управление злектромотором от джойстика 
rnaBa 7. Базовый ВВО)].-ВЫВО)]. 305 Полномостовые сиrнanы ИСnОЛЬ3УlOтс AfI Toro, 4т06ы уnравлть злектромото ром в рассматриваемо схеме. В npMoM направлении лоrИ4еска единиu.а на Р1А (RВЗ) ВКЛlOчает nолево MOn-транзистор ОЗ. ЛоrИ4ески ноль на Р1С (АВ6) ВЫКЛlO4ает nолево МОnтранзистор 01. npMO сиrнал от WV1M nрикладывается к Р1 D (АВ7) и к О2. В ре>киме npMoro враw,ени злектромотора пара 02 и SОЗ активна, 4ТО nозволяет току течь от вывода "+" на злектромоторе к выводу "", Bpaw,a ротор злектромотора в nрямом направлении. В ре>киме 06paTHoro враw,ени злектромотора ОЗ ВЫКЛlO4ается, а О1  ВКЛlOчаетс, при зтом сиrнал от WV1M nocrynaeT на Р1 В (АВ2), уnравл 04. В pe жиме обратноrо враw,ени злектромотора О 1 nозволет току те4Ь 4ерез злектромотор от вывода "-" к выводу "+" 4ерез 04, Bpaw,a ротор злектромотора в 06ратном HanpaB лении. А>костик nОДКЛlO4ен к штырьку ААО или аналоrовому входу номер ноль АЦП. npo rpaMMa по примеру 7.17 С4итывает наnр>кение с Д)Костика и rенерирует u.ИсррОЕ30Й вход ШV1М с u.елыо уnравлени CKOpOCTblO и направлением враw,ени ротора злектро- мотора. Пример 7.17 * Dроrрамма ynpaBneHMR зnектромотором от джостмка, HanMcaHHaR AnR PIC18F1220 "1 *include <p18cxxx.h> * Установка 6мтов KOHMrypaUMM  установка peMMa reHepaTopa HS  BKn4eHMe cTopoeBoro TaMepa  вкnченме HM3KOBOnbTHoro nporpaMMMpoBaHMR  OTKn4eHMe с6роса по 4acTM4Ho потере rrMTaHMR *  разреwенме 06ero с6роса Т/ tpragma 'f'pragma 'f'pragma fpragma tpragma config OSC config WDT config LVP config BOR config MCLRE HS OFF OFF OFF = ON tpragma code I main program :ar getJoy (void) ADCONObits.GO = 1; IIHa4ano nре06разоваНМR while (ADCONObits.GO == 1); II OMAaHMe заверwеНR return (ADRESL » 2 I (ADRESH« 6); .aid main (void) ADCONO = 1; ADCON1 = ОхОе; HanpReHMR II B60p ВХОАа ANO, актмвмрованме АЦП II ANO  aHanoroB ВХОА, VDD м VSS - onopHe 
306 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 ADCON2 == Ох8С; TRISA 1; ТЮSВ о; II npe06pa30BaHMe С MCnOnb30BaHMeM 1 MrU II 6мт 1 порта А = BXOA II порт в  BXOA T2CON CCP1CON о; Ох4С; II B60p npeABap. enMTenR MnM AeneHMe на 1 II MOAYnb ССР BKn, nOnH мост, ВХОЮЮ CMrHan II актмвен по nOrMqeCKO eAMHMue II с6рос TaMepa 2 TMR2 = о; PR2 = Oxff; 1/ TaMep 2 c6npaCBaeTcR на 255; whi le (1) CCPR1L getJoy () II C4MTBaHMe AOCTMKa; мзмененме CKOpOCM 7.4. Реле, соленоиды и дтчики в данном nодразделе рассматриваетс то, как ну>кно орrаНИЗ0вывать HHTepcpec н осуw,ествлть управление ра3JlИ4НЫМИ nри60рами, BKJlI04a peJle, соленоиды и раз нообразные даТ4ИКИ. Реле Реле НСnОЛЬ3УlOтс AfI nереKJl104ени нескольких сиrналов или наnр>кени oд новременно, они имеlOТ MHoro nрименений. V1MeIOTc злектромехаНИ4еские, а также ннтеrральные реле. Нара60тка ЭJlектромехаНИ4еских peJle на nрот>кенни их срока слУ>кбы составлет от 10000 до 100000 u.ИKJlОВ. V1HTerpaJ1bHbIe реле HMelOT более AflHH ные сроки слУ>кбы. DS1 LS1 реле лампочка на 25 Вт сеть 120 В 3 ...."! +5v 1 2 RВO О1 2N2222A О1 Рис. 7.25. nОДКJl104ение не60льшоrо реле к мнкроконтроллеру 
rnaBa 7. Базовый BBO.u.BbIBO.u. 307 ПОДКJl104ение злеюромеханИ48Скоrо peJle к микроконтроnnеру 06Ы4НО тре6ует НСnОЛЬ30- ванин схемы уnраШlени, потому что ток 06моткн реле 06Ы4НО выше, 4ем 3 мА (лоrическая еди ница), достуnны на выходном выводе. Рис. 7.25 ИJlЛlOстрнрует nОДКJl104ение реле к ВЫВОАУ А80 MHкpOKOHTpoJUlepa. 8 зтом при мере peJle исnользуетс Д11 Toro, чт06ы ynраВЛffib ламnочко MO>KHOCТbIO 25 Вап, nОДКЛlO4енно к сети 120 В. 3тот рисунок так>ке ИnnlOстрирует простую cxe му уnравnени на одном транзисторе, исnользуемуlO Д1l ВКnlO4ени реле. Данное реле требует ток обмотки 60 мА. Усиление транзистора 2N2222A, как минимум, равно 100, n03ToMY базовый ток будет равен 60 мА/100 или 0,6 мА. Так как мннимanьное наnржение лоrическо единицы, сннмаемое со вывода порта микроконтроллера, равно 4,2 8, то naдeHHe наnрени на резисто ре базы 6удет равно 3,5 В. 3на4енне резистора в u.еnи базы оnределетс как 3,5 8/0,6 мА Иl1И 5833 Ом. Самое 6лизкое стан.цартное зна4ение номинanа резистора равно 5,6 кОм. Аиод защи щает транзистор от 6росков индуктивноro наnр>кени, возникаlOUJ,ИX во BpeM возмуw,ения Mar  нитноrо nол BOкpyr обмотки реле. Без зтоrо,Щ,1ода транзистор 6bUl 6ы выведен И3 строя сразу же после nepBoro ВЫКn104ени реле, потому 4ТО падение наnрения на транзнсторе npLl1 этом будет nри6лизительно равным 12000 В, (6 МА х 20 кОм, которое влется сопротивлением заnер TorO COCTOHH транзистора). +5V R2 390 Clarc СРС1909У 2 Интеrpальное реле D1 .JL  LED DS1 з Лампочка на 25 Вт ..-N CeTh 120 В 10К R RВO Рис. 7.26. Управление интеrральным peJle Рис. 7.26 ИЛЛlOстрирует то >ке самое nрименение реле, 4ТО и на nредыдуw,ем, ОА- ><:ако нсnользуетс реле в интеrральном исполнении (твердотельное реле). 8 данном ;::ЛУ4ае исnользуетс интеrраJlьное реле срирмы Clare, раСС4итанное на ток веЛИ4ИНОЙ 10 А. Ток, nротекаlOw,и 4ерез BCTpoeHHЫ светодиод, дол>кен быть по краней мере BHЫM 1 ОмА, n03ToMY не06ходим транзисторны KJl104 AfI усилени тока от микро (онтроллера. Падение наnр>кени на светодиоде равно 1,2 В. Резистор базы в зтом lримере 06ecne4HBaeT HaMHoro больши ток, 4ем требуемы AfI ВКЛ104ени инте- альноrо реле. 
308 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Соленоиды Соленоиды уnравляlOТС а6солlOТНО аналоrИ4НЫМ cnoc060M, однако они не имеlOТ KOHTaKTHO rpYnnbI. Соленоиды ИСnОЛЬ3УlOтс AfI Toro, 4тобы nереместить объекты на короткое расстоние. Например, соленоид исnользуетс в кассовом аппарате, 4тобы открыть выдвижно KaCCOBЫ w,ик, nepeMew,a арретир nри6лизительно на 5 мм (1/4"). Как только арретир 6удет сдвинут, nру>кина nродвиrает w,ик. Соленоид в Kacco вом аппарате тре6ует ток, nри6лнзнтельно paBHЫ 0,5 А, npH своем сра6аТЫIЗании от 12 В. Ал Toro, 4то6ы rарантировать, 4ТО w,ик прошел арретир, соленоид заnИТЫlЗается nриблизительно в те4енин 500 мс. Схема уnравленн AfI соленоида ИЛЛlOстрируется на рис. 7.27, а nporpaMMa, KOTopa исnользует TaMep 3 микроконтроллера и npepbIBa ни, nоказана в примере 7.18. TaMep настраиваетс таким 06раЗ0М, 4тобы МИКрОКОII троллер Mor делать друrие оnераu.ин в те4енне 500 мс, тре6уемых дл nОДКЛlOчения nитани к соленоиду. Усилнтель на паре Аарлннrтона MPSA 13 нмеет усиление 10000 и 06есnе4ивает максимальны HenpepbIBHbI ток в 500 мА. +12V Соnенои.u. R1 01 RВO Рис.7.27.Схемауnравленисоленоидом Пример 7.18 #include <timerS.h> void OpenDrawer (void) II OTKpTMe RKa WriteTimerO (64560); II nporpaMMMpoBaHMe TaMepa О II AnR AeneHMR на 976 OpenTimerO (TIMERINTON & ТО 16BIT & ТО SOURCE INT &   ТО PS_1256); II BKn. npepBaHMR от TaMepa О II TaMep О - 166MTH II BHYTpeHHRR смнхронмзаUМR TaMepa О II npeABapMTenb AenMTenb таймкера О на 25Е PORTBbits.RBO = 1; II HaCTpOKa RBO 
rnaBa 7. Базовый ВВО)].-ВЫВО)]. 309 :oid TimerOlnt (void) I1 npoueAypa 06сnумванмя nрерванмя INTCON.TMROIF = о; PORTBbits.RBO = о; CloseTimerO(); II с6рос npepBaHMR I1 с6рос RBO II OTKn4eHMe TaMepa О Пример 7.18 исnользует две СРУНКЦНИ. Проrрамма, Tpe6yeMa, 4т06ы активировать структуру nрерывани микроконтроллера, не nоказана. Одна срункu.и открывает ВЫДВИ>КIIOЙ ящик, nOMew,a лоrическуlO единицу на вывод АВО и заnуска TaMep О, так 4ТО ОН вызывает прерывание по 500 мс. Apyra  3ТО nроцедура 06служивани nрерывани для TaMepa О, KOTopa помещает лоrИ4ески ноль на вывод АВО и останавливает TaMep. В зтом примере предnолаrаетс, 4ТО исnользуетс TaКТOBa 4астота RC-rенератора, paBHa 2 Mru.. Так как TaKTOBa 4астота делитс на 4 npe>KДe, 4ем nocrynaeT на nредварительны делитель TaMepa О, то на вход TaMepa после nреАварительноrо делител 6удет nocrynaTb сиr -1ал с 4aCTOTO 500 Kru. (2 мкс), разделенны на 256, или 1953 ru. (512 мкс). Если TaMep установлен таким 06разом, 4тобы nереnолнтЬС 4ерез 976 тактовых ЦИКJlОВ, ТО ОН бу- дет выставлть nрерывани от TaMepa О 4ерез 499,7 мс после Toro, как 6удет заnуw,ен .1ЛН открыт. ФУНКЦН WriteTimerO (64560) nроrраммирует TaMep О так, 4ТО он вызывает :lрерывание по nереnолнениlO 4ерез 976 периодов TaKTOBO 4астоты. ВЫ30В 3TO cpYHK ции мо>кет быть так>ке заnисан как WriteTimerO (-976), 4ТО мо>кет 6ыть HeMHoro более :lOHTHO. Разрешение nрерывани здесь не nоказано, не отра>кено оно и в nроцедуре ;)бслу>кивани nрерывани  единственно срункu.ии, KOTopa вы3ыlзетс в AallHOM :lримере, коrда происходит nрерывание от TaMepa О. В 3ТОМ примере исnользуетс BКJl104aeMbI срал timers.h, чтобы обесrlечить функu.ии, которые уnравлIOТ TaMepOM. Коrда TaMep nрерывает микроконтроллер, вывод АВО nереводитс 06ратно в состоние лоrИ4ескоrо нул и nрерывание от TaMe- ра О 6удет заnреw,ено, пока выдви>кно w,ик не 6удет ew,e раз открыт ВЫЗ0ВОМ срункu. ии OpenDrawer. 3тот процесс rенерирует импульс на АВО nродолжителыюстыо в 500 мс. Более nодро6на инсрормаu.и о срале timers.h nриведена в rJlaBe 8 при оБСУ>КАении звода - вывода с управлением по nрерываним. П04ему BpeMeHHa задержка не ИСnОЛЬЗ0валась ДЛ задани времени срабатыва- I-IИ соленоида? ЕСJlИ исnользуетс BpeMeHHa задержка, то НИ4ТО иное в системе не будет ра60тать на nрот>кении времени отра60ТКН 3TO задер>кки. Аруrими словами, :истема не 6удет досrynно в те4ении 500 мс, т.е. то BpeM, коrда отрабатывается BpeMeHHa задер>кка. An временных задер>кек nордка нескольких миллисекунд 3ТО не :::остаВJlяет никаких np06JleM, но ДЛ AflитеJlЬНЫХ временных задер>кек системе мо>кет все >ке nOTpe60BaTbc делать 4ТО-ТО ew,e. TaMep и nрерывания  3ТО 4асто caMЫ луч ший no,lJ,Xo,lJ, к орrанизацин временных задер>кек, AflитеJlЬНОСТЬ которых npeBOCXOAHT несколько миллисекунд. Датчики V1MeeTc мно>кество типов даТ4ИКОВ. Некоторые рассматриваlOТС здесь, а друrне - в nОСJlедуlOw,их rлавах. Не все даТ4ИКИ рассматриваIOТС, потому 4ТО имеетс 04ень MHoro разных типов даТ4ИКОВ. В 3ТОМ У4е6нике npe,lJ,CTaBJleHa только ИЛЛlOстративна вы60рка даТ4ИКОВ. Один pacnpocTpaHeHHbI тип даТ4ика - 3ТО даТ4НК температуры. Рис. 7.28 ИЛЛIOСТ рирует датчик LM70 от срнрмы National Semiconductor, nОДКJl104енны с помощыо ин- 
310 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 терфейса к микроконтроллеру. Само по се6е данное YCTPOCTBO  зто достаТ04НО Ma ленький даТ4ИК TeMrlepaTYPbI, KOTOpЫ мо>кет устанавливатьс n04ТИ в ЛlOбом месте. LM70 имеет вход выбора микросхемы, разрешаlOw,и оnераu.иlO 4тени или заnисн, ВЫLЗод SI/O AfI последовательных ,lJ,анных и вход SC, KOTOpЫ срункu.ионирует как no следоватеЛЫ.IЫ сиrнал TaKTOBO 4астоты. Чт06ы 4итать TeMneparypy, ну>кно nоместиrь лоrичееки ноль на вход вы60ра микросхемы, а затем подать импульс на вход SC. no еле подачи импульса на вход SC, С4итываетс 6ит зна4ени температуры с вывода SI/O. Единственна nРИ4ина обесnе4ени возмо>кности nереда4И данных в LM70 состоит u том, чтобы иметь возмо>кность С4итать код издели изrотовителя, KOTOpЫ обычно lIe требуетс в 60льшинстве систем. Первы бит данных 6удет доступен, KorAa вход выбо- ра мнкросхемы 6удет заземлен; BTOpO и nослеДУIOw,ие биты данных nОВЛЯlOтся через 70 нс после среза ИМnУJlьса на входе SC. +5V LM70 R2 R1 10К З.9К U1  CS V+ sиo sc GND С2 С1 1,0 uF 20pF . т емпераIYра . 9бит целая часть 2бита робная часть Рис. 7.28. Пример nО,lJ,КЛlO4ени ,lJ,атика температуры 
rnaBa 7. Базовый ВВО)].-ВЫВО)]. 311 Аанные зна4ени 16-разр,lJ,НО TeMneparypbI nОВЛlOтс на штырьке 81/0 по oд ному биту одновременно, на4ина с caMoro cTapwero 6нта. Сама температура СЧLl1ТЫl3а eTC, как зто ИJlЛlOстрируетс на рис. 7.27, таким 06раЗ0М, 41'0 срормируеТС51 11-разрдное зна4ение TeMneparypbI, которое в СЛУ4ае CBoe отриu.ателыюсти имеет форму доnолнени до двух. Аа>ке при том, 4ТО самые npaBbI nTb битов lIe со.цеР>Ка! никаких данных, они дол>кны С4итыватьс каждый раз, коrда значение температуры ПОЛУ4аетс от LM70. Проrрамма С4итыванн TeMneparypbI nоказана в примере 7.19. LM70 выдает TOJlbKO TeMneparypy в rpa,lJ,ycax Цельси, О,lJ,нако в показанном примере TeMneparypa по шкале Фаренrета B03Bpaw,aeTc как окруrленное u.елое число со зна- ком И3 срункции getТemp. Пример 7.19 , * * Орммер nporpaMM nOnY4eHMR TeMnepaTYP, HanMcaHH ДnR PIC18F1220 *1 include <p18cxxx.h> '* Установка 6мтов KOHMrypaUMM  установка peMMa reHepaTopa HS  BKn4eHMe cTopoeBoro TaMepa  BKn4eHMe HM3KOBOnbTHoro nроrрамммроваНМR - OTKn4eHMe с6роса по 4acTM4Ho потере nMTaHMR  разрewенме 06ero с6роса "1 Фрrаgmа config OSC RC Фрrаgmа config WDT OFF fpragma config LVP OFF pragma config BOR OFF tpragma config MCLRE = ON Фрrаgmа code / rлавная nроrрамма фjеfinе SC PORTBbits.RB2 фjеfinе CS PORTBbits.RBO фjеfinе SIO PORTBbits.RB1 id sendClock (void) SC SC о; 1; II SC II SC о 1 t getTemp (void) int temp; int Ь; char а CS = о; for (а = о; а < 16; а++) II #CS = о; II n0nyqeHMe 16 6мтов 
312 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 temp «= 1; temp != SIO » 1; sendClock(); а = о; CS = 1; II #CS = 1 if ((temp & Ох8000) ( Ох8000) II проверка знака а = 1; temp temp; II npe06pa30BaHMe в nоnомтельное } ь temp; temp »= 7; i f (( ь & 1) == 1) temp++ ; temp = (9 * temp) I 5 + 32; if (а) II oKpyrneHMe pe3YnbTaTa II npe06pa30BaHMe в rpaAYC Фаренrета temp = -temp; return temp; II возврат с TeMnepaTYPo void main (void) ADCON1 = OxOf; TRISB Ох02; PORTB = Ох05; II все BBOA порта UMpoBe II nроrрамммрованме порта В II #CS = 1 м SC = 1 1/ здесь BrronHReTcR ApyraR ра60та Устройства кодирования уrла поворота вала YCTpOCTBa коднровани yrJla поворота - YCTpOCTBa, которые 06Ы4НО содер>кат ОnТИ4еские даТ4ИКН, co06w,alOw,He о nозиции BaJla. 3ти даТ4ИКИ выдаlOТ выходные сиr налы caMO раЗЛН4НО разрдности - от 2 6итов, указываlOw,их n03ИЦИlO вала шаrами по 900, до YCTPOCTB KO,lJ,HpOBaHH, которые nроизводт ТЫС4И ИМnУJlЬСОВ на один 060РОТ вала. Некоторые Н3 названных YCTPOCTB СРОРМИРУIOТ ДВОИ4НЫ BЫXOДHO сиrнал, а не- которые - TOJlbKO HMnYJlbC на снrнально лннин. YCTpOCTBa кодированн yrJla поворота BaJla, КО,lJ,ИРУIOw,не ВЫХО,lJ,ные ,lJ,анные, выдаlOТ ннсрормаu.иlO в внде кода rpe иJlи eCTe CTBeHHoro ,lJ,ВОИ4ноrо КО,lJ,а. Ко,lJ, rpe в CJlY4ae 3-разрдноrо YCTpOCTBa кодирования соответствует CJle,lJ,YIOw,e nосле,lJ,овательностн: 000, 001,011, 111, 110, 100. Обратите вннманне, 4ТО только однн разр,lJ, H3MeHeTC одновременно от одноrо зна4ени кода до СJlеДУIOw,еrо. 3-разря,lJ,НЫ КО,lJ, rpe имеет weCTb состони, 4разр,lJ,НЫ код rрея имеет восемь СОстоний и Т.,lJ,. . Рис. 7.29 ИЛЛlOстрирует YCтpoCТ80 КО,Щ,1ровани yrла поворота вanа, свзанное с мик роконтроллером. Здесь YCТPOCТ80 КО,Щ,1ровани yrла поворота вanа s4 от срирмы US Digital 
rnaBa 7. Базовый ВВО)].-ВЫВО)]. 313 nOДКJl104eHO к микроконтроллеру. 3то YCTpoCTBO кодировани уrла поворота вanа исnоnьзует интерсресный ка6ель с 4 проводами, KOTOpЫ содержит + 5 В (вывод 1), землlO (вывод 3), снrнал А (вывод 2) и сиrнал В (вывод 4). Лннни сиrнала А (caMЫ младши 6ит) и СИП-Jа ла В СРОРМИРУlOт коды 00, 01, 11, 1 О (код rpe) по мере враw,ени вала в npMoM Ha nравлении и коды 10, 11,01,00, коrда вan Bpaw,aeTc в обратном направленин. +5V R1 10К U1  RAO QRBO RA1 g RB1 RA2 RB2 RA3 RB3 RA4 RВ4 'МClR RB5 OSC1  RB6 OSC2 > RB7 А +V В 84 Земля PIC18F1220 \1) С1 27 pF Рис. 7 .29. YCTpOCTBO кодировани уrла поворота BaJla, nОДКЛlO4енное к PIC18F1220 Предnоло>ким, 4ТО YCTPOCTBO кодировани уrла поворота BaJla исnользуетс AfI Toro, 4тобы измерить скорость враw,ени вала злектромотора. 3nenpoMoTOp Bpaw,aeT C со CKOpOCTblO вплоть ДО 4000 060РОТОВ В минyrу. Он Bpaw,aeTC до 67,7 раз за ceKYH ду, при зтом выход устройства кодировани уrла поворота вала изменяетс вплоть до 267 раз в секунду. Чтобы измерить 3ТУ скорость, входы микроконтроллера должны дискрети зироватьс, по KpaHe мере, КIOкдые 3,75 мс. 06разец nporpaMMbI (см. при мер 7.20) npo BepeT входы АВО н АВ 1 4ерез КIOкдые 1,024 мс с тем, 4т06ы 06нару>кить COOTBeTCT ВУIOw,ие изменени. Прерыванне исnользуетс ДЛ Toro, 4тобы выполнить проверки и опредеJlНТЬ, Bpaw,aeTC ли 3JleKTpOMoTOp по 4асовой стрелке нли против 4асовой стрелки, а так>ке реrнстрировать скорость в 060ротах в минyry в u.еЛ04исленно 4eKe памти с именем speedRPM. Зна4ение скорости 6удет ТО4НЫМ в диаnаЗ0не от 15 060 ротов в минyry ДО 4000 оборотов в минyry. ЕСJlИ не06ходимо определить 60лее Meд neHHYIO скорость, то 4астота nрерывани дол>кна 6ыть уменьшена от одноrо на КIOКДУIO 1,024 мс. Например, если зта 4астота будет сни>кена до одноrо nрерывани кюкдые 10,24 мс, то зна4ение скорости 6удет Т04НЫМ в диаnаЗ0не от 1,5 оборота в минуrу до 4000 060РОТОВ В минyry. 
314 Прнмененне MHKpOKOHTpOnnepOB PIC 18 Пример 7.20 1* * Орммер onpeAeneHMR скоростм м HanpaBneHMR BpaeHMR AnR PIC18F1220 *1 #include <p18cxxx.h> #Lпclude <timers.h> 1* Установка 6мтов KOHMrypaUMM установка peMMa reHepaTopa HS BKn4eHMe cTopoeBoro TaMepa BKn4eHMe HM3KOBOnbTHoro nроrрамммроваНМR OTKn4eHMe с6роса по 4acTM4HO потере nMTaHMR разреwенме 06ero с6роса *  * * * * *1 #pragma config OSC HS #pragma config WDT OFF #pragma config LVP OFF #pragma config BOR OFF #pragma config MCLRE ON void MyHighInt (void) ; // npeAnonaraeT TaKTOBY 4астоту в 4 Mru 1/ npoToTMn AnR npepblBaHM #pragma interrupt MyHighInt #pragma code high_vector=Ox08 // MyHighInt  зто npepBaHMe // high_vector  зто вектор по аАресу Ох08 void highvector (void) { asm GOTO MyHighInt endasm II AaHHe в nамятм AaHHX int speedRPM; char direction; 1/ скорость в 060ротах за минуту // HanpaBneHMe: 1  BnepeA // О = назаА // 3Аесь Aa храНМЬСR самая nоcnеДНRR n03МUМR // 3HaqeHMe ОТС4ета char lastCount; iпt timer; /1 BcoKonpMopMTeTHoe npepBaHMe #pragma code void TimerO (void) { char temp = PORTB & 3; WriteTimerO (OxFC); // TaMep О на 252 OpenTimerO (TIMER_INTON & ТО 8BIT & ТО SOURCE INT &   TO_PS_1256); if (lastCount != temp) { / / BKn4eHMe прерываНИR 0'1' таймера О / / TaMep О  16раЗрRЩI // смнхронмзаUМR TaMepa О - внутренняя // rrpeАВаритenьньм Аелитеnь Tepa О на 256 switch (lastCount) 
rnaBa 7. Базовый BBO.u.BbIBO.u. 315 case о: if (temp  1 ) direction 1; else direction о; break; case 1 : if (temp == 2) direction 1; else direction о; break; case 2: if (temp == О) direction 1; else direction о; break; case 3: if (temp == 2) direction 1; else direction о; break; } speedRPM timer 1 1.024 * 15; rpaAYCOB timer = о; 1I KOnM4eCTBO nрерванмй AnR 90 } else timer++; void MyHighInt (void) if (INTCONbits.TMROIF 1) TimerO () ; 11 main program void main (void) { ADCON1 = OxOf; TRISB  ОхОО; II все BBOAЫ порта  UMpoBe II nporpaMMMpoBaHMe порта В 
316 Прнмененне MHKpOKOHTpOnnepOB PIC 18 lastCount = timer = о; WriteTimerO (OxFC); II TaMep О на 252 OpenTimerO (TIMERINTON & ТО 8BIT & ТО SOURCE INT &  - TO_PS 1 256); // BKn. OpepBaHM от TaMepa О 1/ TaMep О  16раЗРRАНЫ / / смнхронизаUМR Tepa О  внутреННRЯ II npeдвaриrern,ный Аenи:re.JIb таймера О на 256 RCONbits.IPEN = 1; INTCONbits.GIEH = 1; II 3Аесь вnоnняеТСR ApyraR ра60та II IPEN = 1 II разpeweнме выIокоnpмормте'rныыx nреrываний +5V U1  R2 R1 1К 10К красный белый Gems Ff-110 У1 PIC18 220 tl) черный D кварцевый резонатор  сз с С1 1.0 uF 27 р 27 pF Рис. 7.30. ДаТ4НК расхода, nОДКЛlO4енны к МL/1кроконтроллеру Датчики расхода ДаТ4L/1КL/1 расхода <POpML/1PYIOT L/1MnYnbcbI по мере Toro, как поток >КL/1дкосте npoxo ДL/1Т сквозь HL/1X. nреДnОЛО>КL/1М, 4ТО в CL/1CTeMe ДОЛ>КНЫ L/13MepTbc расход L/1 nотре6леНL/1е TOnJlL/1Ba. 3то мо>кет 6ыть выполнено посредством НСnОЛЬЗ0ванн даТ4L/1К расхода TL/1na даТ4L/1ка FТ-110 от <PL/1pMbI Gems. 3то YCTPOCTBO (модель 173934) nрОL/13ВОДL/1Т 8300 L/1M nYJlbCOB на rаллон потока >КL/1ДКОСТL/1. V13MepeTC расход от 0,07 до 5,3 rалnонов в ML/1HY ту. PL/1c. 7.30 L/1ЛЛIOСТРL/1рует nОДКЛI04еНL/1е TaKoro даТ4L/1ка расхода к МL/1кроконтроллеру. 3то YCTPOCTBO просто В ПОДКЛI04еНL/1L/1  ero L/1HTep<pec состонт L/13 трех проводов L/1 oд Horo HarpY304Horo pe3L/1CTopa. CooTBeTCTBYIOw,a nporpaMMa nоказана в npL/1Mepe 7.21. 3та nporpaMMa 06eCne4L/1 вает CHTL/1e MrHoBeHHo CKOpOCTL/1 потока >КL/1ДКОСТL/1 4ерез даТ4L/1К L/1 занесеНL/1е ero в 
rnaBa 7. Базовый BBO.u.-ВbIВО.u. 317 чеку naMTLI1 flowRate с LI1СnОЛЬЗ0ваНLI1ем срормата с nлаваlOw,е заnто. ЧLl1СЛО в 3TO чейке naMTLI1 0значает скорость потока >КLI1ДКОСТLI1, BbIpa>KeHHYIO в rаллонах за MLI1HYTY. Это зна4еНLI1е 06новлетс 1 О раз в секунду. Пример 7.21 /* * Орммер замера раСХОАа MAKOCTM, HanMcaHH AnR PIC18F1220 *1 ffinclude <p18cxxx.h> #iпclude <timerS.h> 1* Установка 6мтов KOHMrypaUMM  установка peMMa reHepaTopa HS  ВКn4ение cTopoeBoro TaMepa *  BKn4eHMe HM3KOBOnbTHoro nроrрамммроваНМR *  OTKn4eHMe с6роса по 4aCTM4Ho потере nMTaHMR *  разреwенме 06ero с6роса "1 #pragma config OSC HS #pragma config WDT OFF #pragma config LVP OFF #pragma config BOR OFF #pragma config MCLRE ON void MyHighInt (void) ; I1 прототмn AnR npepBaHM #pragma interrupt MyHighInt #pragma code high_vector=Ox08 II MyHighInt  зто npepBaHMe I1 high_vector  зто вектор II по аАресу Ох08 void high_vector (void) asm GOTO MyHighInt endasm 1I AaHHe в nамятм AaHHX float flowRate; 11 BcoKonpMopMTeTHe npepBaHMR #pragma code void Timer1 (void) 1I KaAY 1/10 ceKYHA PIR1bits.TMR1IF = О; I1 повторное актмвмрованме TaMepa 1 flowRate = ReadTimerO() * 10.0 * 60 I 8300; WriteTimerO (О); II с6рос ОТС4ета void MyHighInt (void) if (PIRbits.TMR1IF 1) Timer1(); 
318 Прнмененне MHKpOKOHTpOnnepOB PIC 18 II main program void main (void) AI)CON1 = OxOf; TRISA = Ох10; WriteTimerO (О); OpenTimerO (TIMERINTOFF & ТО 1БВIТ & ТО SOURCE ЕХТ &   ТО EDGE FALL & ТО PS 1 1); WriteTimer1 (5303); OpenTimer1 (TIMER_INTON & T116BITRW & Т1 SOURCE INT & -  Т1 PS 1 8 & T1OSC1EN_OFF); RCONbits.IPEN = 1; INTCONbits.GIEH  1; II 3Аесь BnOnHReTCR ApyraR ра60та II все ВЫВОАЫ порта цмрОRые II nporpaMMMpOBaHMe nop'l'a А II TaMep О на О II BКn. Dрерываний 0'1' 'l'аймера О II TaMep О 1браЗРЯАНЫ II СИНХРОВХОА 'Т'aMepa О ВЫВОД М4 II ВЫВОА М4 по срезу II npeABapMTenbH AenMTenb II TaMepa О на 1 II TaMep 1 на 5303 II BКn. nperыв от 'rаймера 1 II TaMep 1 16раЗрRАН II BHYTpeHHRR смнхронмзаЦМR IITaMepa 1 II npeABapMTenbH AenMTenb II TaMepa 1 на 8 II IPEN = 1 I I разреwенме BbIcoKonpMOpMTe'l'HX II npepBaHM Инфракрасные устройства дистанционноrо управления V1HcppaKpacHbIe YCTpOCTBa ДL/1станu.L/10нноrо уnравлеНL/1 чрезвычайно pacnpo странены L/1 L/1MeIOT MHoro npL/1MeHeHL/1 во встроенных CL/1CTeMax. В ка4естве L/1ЗЛУ4аlOщеr0 даТ4L/1ка L/1сnользуетс L/1HcppaKpacHbI свеТОДL/10Д L/1JlH несколько светоднодов Щ1 pac CTOHL/1, npeBbIwalOw,HX несколько метров. В ка4естве npL/1eMHL/1Ka на nРОТL/1ВОnОЛО>КIIОМ KOHu.e, L/1сnользуетс 06Ы4НО L/1HcppaKpacHbI срОТОДL/10Д L/1ЛL/1 срототраНЗL/1СТОр. СL/1rнал во MHOrL/1X устройствах днстанu.L/10нноrо уnравлеНL/1 4асто nередаетс на ОТНОСL/1телыю HL/13KO 4астоте (36 Kru., 38 Kru. L/140 Kru..), 4ТО делает L/1HTepcpec с нимL/1 ос06енно noдxo дw,L/1М Щ1 мнкроконтроллеров. Полезное YCTPOCTBO, которое L/1ЛЛIOСТРL/1рует npL/1Hu.L/1n L/1H<ppaKpacHbIx даТЧL/1КОВ  зто схема раСWL/1РL/1тел ДL/1аnа30на ДL/1станu.L/10нноrо уnравлеНL/1, созданна с npL/1MeHe HL/1eM МL/1кроконтроллера. Схема L/1сnользует недороrо PIC18F1220 L/1 несколько доnол ннтельных компонентов. В ка4естве L/1CT04HL/1Ka злеКТРОnL/1таНL/1 в He L/1сnользуется 6a TapeHЫ комплект, COCTOW,L/1 L/13 4етырех 6атареек тнпа М. Кроме Toro, в схеме ис nользуетс L/1нтеrральны ста6L/1ЛL/1затор с MaJlbIM nадеНL/1ем напржеНL/1 ме>кду входом L/1 выходом МАХ603. 3то nревосходна V1C, nредназна4ена Щ1 L/1сnользоваНL/1 в YCTPO ствах с 6aTapeHЫM nL/1TaHHeM. PL/1c. 7.31 nOKa3bIBaeT схему L/1HcppaKpacHoro раСШИРL/1те л ДL/1апа30на. 
U4 МA>Q503 IN 4 ё5'F'F С2 1.0 uF  ВТ1 4хАА CI CI CI CI OUT zzzz с> G G G SET ('001(")«0..... С1 10 uF R5 10К PIC18F1220 U1 С4 1.0 uF :!: RAO QRBO RA1  RB1 RA2 RB2 RA3 R 83 RA4 R 84 #МCLR RB5 OSC1 R86 OSC2 > RB7 It)  С3 0.1 uF Рис. 7. 31. Инфракрасное ДУ R4 27 О2 2N2222 U2 м NJLЗ5V360 () 1 Output  "о С CJ ('001  ' O<J' D1   ОР165А '" '"1 ::; р)  р) :--J t:r1 р) w О  I:r :S:C   о   I:r ;; О  VJ \D 
320 Прнмененне МНКрОКОНТроnлеров PIC 18 Данные nосылаlOТС в срорме L/1МnУЛЬСНЫХ naKeToB на 4астоте 36 Kru. с L/1сrlОЛЬЗО BaHL/1eM двухсразноrо кода, KOTOpЫ L/1HOrAa называlOТ MaH4eCTepCKL/1M кодом. V1l1cpopMa ЦL/10ННЫ naKeT COCTOL/1T L/13 14 6L/1TOB, которые ВКЛlO4аlOТ две стартовых 6L/1Ta, находяw,L/1Х- c в COCTOHL/1L/1 JlоrL/1ческо 1, за KOTOpbIML/1 следует 6ит уnравлеНL/1, KOTOpЫ nереклlO 4aeTC кажды раз, KorAa наЖL/1маетс кнопка на передатчике. После 6нта управлення следует 5разрдны адрес. V1, наконец, последние шеСl ь битов задают команду, по сылаемуlO на YCTPOCTBO. V1мпульс 6L/1Ta L/1MeeT ширину в 1,728 мс и через кюкдые 30 мс выnолнетс nOBTopHa nepeAa4a кода, еСЛL/1 кнопка на пульте ДИС1ШЩL/10ННОJ0 упра13 леНL/1 на>ката. MaH4eCTepCKL/1 код nосылаетс таким 06разом, что лоrическая единица L/1змеllет выход на ноль L/1З еДL/1НL/1ЦЫ на среднем 6ите, а лоrL/14ески ноль изменяет l3ы ход L/1З лоrL/1ческо eAL/1HL/1u.bI в лоrL/14еСКL/1 ноль на среднем 6L/1Te. СL/1rнал, посылаемый на L/1HcppaKpacHbI AL/10A, L/1MeeT 4астоту 36 Kru., еСЛL/1 MaH4eCTepCKL/1 код отражает лоrL/1че- CKYIO eAL/1HL/1u.y. Наша CL/1CTeMa не дол>кна reHepL/1pOl3aTb 3TL/1 коды,  она должна только 06наРУЖL/1вать L/1X, npL/1HL/1MaTb L/1 вновь передавать. PL/1CYHOK 7.32 ЮIЛIOСТРL/1рует срормат кода AL/1CTaHu.L/10HHOrO уnравлеНL/1 АС5, L/1сnользуемоrо cpaKTL/14eCKL/1 BCeML/1 COOTBeTCT BYIOW,L/1ML/1 злеКТРОННЫМL/1 устройстваМL/1. nOJlY4eHHbI CL/1rHaJl noAaeTC на вывод АВ 1, KOTOpЫ являетс также входом пре pbIBaHL/1, L/160, KorAa СL/1rнал не nрL/1ХОДИТ в Te4eHL/1L/1 ДJ1LI1теЛЫlOrо периода времени, то МL/1кроконтроллер BXOAL/1T в режим 6ездеСТВL/1Я с u.елыо 3КОНОМL/1И злеКТРОПL/1таНL/1Я. V1з rлавы 6 вы, возможно, nOMHL/1Te, 4ТО L/1З реЖL/1ма 6ездеСТВL/1Я МИКРОКОlIтроллер выходит по ЛlO60МУ npepbIBaHL/1IO. Как только СL/1rнал nОЛУ4ен, отра6атывается JlporpaMMa, КО"I o pa выnолнет ou.eHKY входа L/1 передачу команды на nередаТ4ИК. Модуль ШV1М, как зто уже 06суждалось ДJ1 СЛУ4а уnравлеНL/1 CKOpOCTblO враw,ени злектромотора, L/1СJlОЛЬ зуетс ДJ1 Toro, 4т06ы CreHepL/1pOBaTb СL/1rнал 4aCTOTO в 36 Kru. ДJ1 nередаюw,еrо CBe ТОДL/10да. npL/1Mep 7.22 nOKa3bIBaeT раС4ет выходнои 4астоты WV1M. Как можно BL/1AeTb L/1З npL/1BeAeHHbIx раС4етов, 6ЛL/1жаше к HaдeHHO, при L/1СПОЛЬЗОВaIL/1L/1 BHyтpeHHero CL/1H xporeHepaTopa на 4 Mru., будет 4aCTOTa'paBHa 37 кrц. 3та 4астота достаточно 6ЛL/1зка с тем, 4т06ы CL/1CTeMa СРУНКЦL/10НL/1ровала корректно. В данном СЛУ4ае в perL/1CTp РМ2 за rружаетс зна4еНL/1е, равное 26.  Рис. 7.32. KOAAL/1cTaHu.L/1oHHoro уnравлеНL/1 АС5 
rnaBa 7. Базовый BBO.u.BbIBO.u. 321 Пример 7.22 ПеРИОА ШИМ  (PR2 + 1) х TMR2PS х 4 х Tosc .Iсриод ШИМ = (26 1 1) х 1 х 4 х 1/4 мкс 27 х 1 х 1 мкс 27 мкс Частота Ш11М 1/27 мкс = 37 KrU (Ормме4анме: TMR2PS  зто зна4енме K03MUMeHTa npeABapMTenbHoro АеnМ'l'еля 'l'ай. У.ера 2) nолны ЛLl1СТLI1нr npOrpaMMbI ДJl 3TOrO nРLl1ложеНLI1 nоказан в npLl1Mepe 7.23. Обра тите BHLI1MaHLI1e, что коrда ВХОД АВ1 нзменетс, зто вызывает npepbIBaHLI1e, которое aK ТИВLI1рует МLI1КРОКОНТРОJlлер. В nроu.едуре 06ЛУЖLl1ваНLI1 npepbIBaHLI1 включается BЫXOД ной СLl1rнал свеТОДLl10да, LI1MelOw,LI1 4астоту 36 Kru. к LI1 так долrо, пока BXOДHO сиrнал от детектора nocrynaeT ОДLl1Н раз каждые 35 мкс (зтот период OTC4L11TbIBaeTc таймером О), выход OCTaeTC на 4астоте 36 Kru.. TaMep О 04L11w,aeTC через каждуlO половину периода входноrо CLl1rHana от детектора. ЕСЛLl1 посмотреть на MaH4eCTepCKLI1 код LI1 выходные СLl1rналы, nоказанные на pLl1c. 7.31, то можно вндеть, 4ТО самый ДJlL11HHbI период BpeMe HLI1, коrда CLl1rHan падает до нул, равен nерLl10ДУ TaКТOBO 4астоты LI1ЛLl1 27 fv'1KC. Проrрам ма 06наРУЖLl1вает npeKpaw,eHLI1e LI1зменеНLI1 СLl1rнала на nротжеНLI1L11 35 мке:"  зтот период достаТ04НО ДJlL11HeH, 4т06ы 06Hapy>KLI1Tb сракт OTCYТCTBLI1 LI1зменеНLI1 СLl1rнала. Коrда вход перестает LI1зменть свое COCTOHLI1e, BЫXOДHa 4астота в 36 кrц ВЫКJIlOчаетс, npepbIBa- HLI1 вновь разрешаlOТС LI1 возврат LI1З nодnроrраммы 06СЛу>КLI1ваНLI1 nрерывани пере дает уnравлеНLI1е вновь к основному бесконе4НОМУ ЦLl1КJ1У  npLl1 зтом CLl1CTeMa вновь BXO ALl1T В pe>KLI1M 6ездеСТВLI1, 3KOHOM злектрознерrLl1IО. Пример 7.23 * Расwмритеnь АмапаЗ0на пуnьта Амстанцмонноrо управnеНМR *1 finclude <p18cxxx.h> * Установка 6мтов KOHMrypaUMM *  установка peMMa reHepaTopa HS  BKn4eHMe cTopoeBoro TaMepa - BKn4eHMe HM3KOBOnbTHoro nроrрамммроваНМR  OTKn4eHMe с6роса по 4acTM4Ho потере nMTaHMR *  разреwенме 06ero с6роса "1 fpragma config OSC INTI02 tpragma config WDT OFF 'pragma config LVP OFF tpragma config BOR OFF 'pragma config MCLRE = ON 1 ********* nepeMeHHe в naMRTM AaHHX ************ ioid MyHighInt (void); I1 прототмn AnR npepblBaHM tpragma interrupt MyHighInt fpragma code highvector=Ox08 II MyHighInt  зто npepBaHMe II high_vector  зто вектор 
322 Прнмененне МНКрОКОНТролnеров PIC 18 II vector at Ох08 void highvector (void) asm GOTO MyHighInt endasm #pragma code II npoueAypa 06cnYMBaHMR npepblBaHMR, II B03HMKaero ПО лбому nOnOMTenbHOMY POHTY cMrHana на INT1 (RB1) II void MyHighInt (void) { INTCON3bits.INT1IF = о; char state = PORTBbits.RB1; T2CONbits.TMR20N = 1; do { /1 с6рос заnроса npepBaHMR // запуск BXOAa 36 KrU output TMROL = о; // OqMCTKa TaMepa О while (state == PORTBbits.RB1 && TМRO L < 2 О) ; / / О)JЩЦание мзменеНИR nм60 таймаута state = PORTBbits.RВ1; } while (TMROL < 20); T2CONbits.TMR20N = о; // 36 KrU BKn. void main (void) { OSCCON ADCON 1 Ох63 OxOF; // BHYTpeHHM reHepaTop на 4 MrU // порты ЦMpOBe TRISB PORTB 2; о; // nроrрамммрованме портов T2CON О; TenR на 1 CCP1CON = ОхОС; ПО BCOKOMY TMR2 = о; PR2 = 26; CCPR1L = 14; // установ преАвармтеnьноrо AenM // MOAYnb ССР BKn, BXOA актмвен // OqMCTKa TaMepa 2 // TaMep 2 OqMaeTCR ПО 10; // установ на KBaApaTH cMrHan //(запоnненме 50%) TOCON = ОхС8; // TaMep О CqMTaeT в мкс RCONbits.IPEN о; // BKn. TOnbKo BcoKonpMopMTeTHe 1/ npepBaHMR INTCON2bits.INTEDG1 = 1; nonoMTenbHoMy POHTY INTCON3bits.INT1IE = 1; INTCONbits.GIE = 1; // установ nepeKnqeHMR INT1 по // разреwенме INT1 // разреwенме прерванм while (1) { 
fnaBa 7. Базовый вво.u.-выво.u. 323 Sleep () ; 1/ nepeXOA в неактмвное COCTORHMe nреДnОЛО>КL/1М, 4ТО зта CL/1CTeMa так>ке ДОJl>кна функu.ноннровать, деКОДL/1ру CL/1r налы от внешнеrо nYJlbTa ДL/1станцнонноrо уnравлеНL/1. BXOДHO СL/1rнал в зтом случае 6удет 06наРУЖL/1ватьс в проu.едуре 06СJlУ>КL/1вання npepbIBaHL/1, однако HL/1 BpeM BЫCO Koro 3Ha4eHL/1 СL/1rнала, HL/1 BpeM ero HL/13KOrO зна4еНL/1 замертьс не 6удут. В про rpaMMe L/1З npHMepa 7.23 TaMep О может L/1сnользоватьс ДJl замера времен для 13ход Horo СL/1rнала, ОН может так>ке оnределть, коrда Ha4L/1HaTb L/1 npeKpaw,aTb деКОДL/1роваllие MaH4ecTepcKoro кода, nередаваемоrо Н3 пульта ДL/1станu.L/10нноrо уnравлеНL/1. 3та часть nporpaMMbI здесь не nрL/1ВОДL/1ТС, однако она 6удет разра60тана в 60лее nОЗДНL/1Х rлавах ДJl друrнх nРL/1ложенн, которые L/1CnO/lb3YIOT манчестерскнй код. rазовые датчики V1MeeTc мно>кество датчнков, предназна4енных ДJl H3MepeHL/1 KOJlL/14eCTBa HeKO торых ra30B в атмоссрере. Этот подраздеJl nредставлет однн L/13 ннх, nредназна4енны ДJl L/13MepeHL/1 содер>кання двуокнсн уrJlерода. V1MeeTc так>ке MHoro друrL/1Х даТ4L/1КОВ, которые замерIOТ содержаНL/1е KL/1, СJlорода метана, аJlкоrол, водорода, сульсрата 130- Аорода L/1 т .д. nреДnОЛОЖL/1М, 4ТО нам не06ХОДL/1М npH60p ДJl Toro, 4т06ы L/13MepHTb KOHцeHTpa ЦL/11О ABYOKL/1CL/1 уrлерода в воздухе. V1MeeTc 60льшое КОЛН4ество ра3ЛН4НЫХ даТ4L/1КОВ ABYOKL/1CL/1 уrлерода, HanpL/1Mep TGS-2442 от срнрмы Figaro Corporation. 3то устройство содер>кнт наrреватель н даТ4НК. Наrpеватель актнвнзнрует даТ4НК, 4ье СОnрОТL/1влеНL/1е H3MeHeTC в заВНСL/1МОСТН от KOHu.eHTpau.L/1H двуокнсн уrлерода. Чт06ы КОНТРОЛL/1ровать KOJlL/14eCTBO ДВУОКНСL/1 уrле рода , наrреватель aКТHBHpyeTC на 14 мс, а соnротивлеНL/1е даТ4L/1ка H3MepeTC на npOT>KeHHH 5 мс в u.HКJle HarpeBa. 3тот ЦHКJl наrрева/контрол nOBTopeTc Ka)l(,lJ,YIO секунду на nротя>кеннн пернода H3MepeHH. ДaHHЫ AaT4L/1K мо>кет H3MepTb конu.ентрацнlO С0 2 в днапаЗ0не от 30 до 1 000 4aCTe на МНЛЛL/10Н (nРОМL/1ллей). Наrреватель тре6ует наnрженн в 5 В npL/1 токе в 200 мА на nротжеНL/1L/1 14 мс на каждые 1000 мс, так 4ТО в среднем потре6ляетс только ток в 2,8 мА. Датчнк T8Mnepa туры nрОL/13ВОДL/1Т напр>кенне, которое МО>К8Т контролнроваться АЦn в мнкроконтрол- лере L/1 от06ражатьс как зна4енне KOHu.eHTpau.HH С0 2 нлн НСnОJlЬЗ0ваться ЛlO6ым дpy rHM cnoc060M. PL/1c. 7.33 НЛЛlOстрнрует даТ4НК н схему, нсnользуемуlO ДJl Toro, 4тобы контролнровать KOHu.eHTpau.L/11O С0 2 . 
324 ITpHMeHeHHe MHKpOKOHTpOnnepOB РI С 18 А .. 3 HarpeBaтenb Vout R2 БОК R1 Начало В 10К - j} 1000 МС IL 5х22К 14 мс Vout:;:: А 22К + Rs I I I I I I I I I I I I j}t 5мс  В I I I . , I I . I I I . , I I . ,  Здесь выполняется выборка V out Рис. 7.33. AaT4L11K СО 2 Выходное напря>кеНLI1е, 060зна4аемое как V out , определетс переменным conpo ТLI1влеНLI1ем AaT4L11Ka RS. ВерСLl1Я TG2442A1 LI1MeeT 3Ha4eHLI1e RS в ALl1ana30He от 6,81 до 21,5 кОм. 3тн устройства ,lJ,OJl>KHbI каЛLl16роваться с тем, 4то6ы CHLI1MaeMbIe LI1MLI1 ОТС4еты БЫJlLl1 T04HbIMLI1. - LI1MeHHO поэтому nOTeHu.LI10MeTp на 50 кОм LI1спользуется в u.enLl1 коллек тора 2N2222. PLl1c. 7.34 nOKa3bIBaeT AaT4L11K, nOAKJlI04eHHbI к МLI1кроконтроллеру PIC18F1220. В схему так>ке BKJl104eH ЖКLI1НДLl1катор 1х16, преДl-lазна4енны ,цля LI1НДLl1каЦLl1L11 3Ha4eHLI1 
rnaBa 7. Базовый ВВОkВЫВО.u. 325 концентрации СО 2 в nромиллх. Дл Toro, 4т06ы 6ыть Т04НЫМ, AaT4L/1K помещаеrся в среду с L/1звестной концентраЦL/1ей СО 2 , затем COCTOHL/1e потеНЦL/10метра KOppeKTL/1pyeT c с целыо получеНL/1 праВL/1льноrо отсчета на ЖКL/1НДL/1каторе. АаТЧL/1К L/1MeeT ЛИllеЙIlУЮ xapaKTepL/1CTL/1KY, так 4ТО, 6YAY4L/1 однажды откаЛL/16рованным, он в дальнейшем бущн 06eCne4L/1BaTb Т04ные показаНL/1. AaT4L/1K так>ке тре6ует 2AHel3llOro пеРL/10да Ilро[рева nршкде, 4ем он 6удет каЛL/16роватьс. nporpaMMa ,цля данной CL/1CTeMbI npL/1BeAeHa в npL/1Mepe 7.24. КОЭСРСРL/1ЦL/1еIП УМIIО- >кеНL/1Я L/1спользуетс ,цл Toro, 4т06ы oT06pa3L/1Tb по ПОЛУ4енным отсчетам в ПРОМИJ1J1ЯХ L/1НДL/1каЦL/1 10 , Y4L/1TbIBalOw,ylO wкалу npL/160pa. 3тот КОЭсрсрL/1ЦL/1ент дол>кен настраL/1ваться с тем, 4т06ы соответствовать характерL/1СТL/1кам реальноrо AaT4L/1Ka. Соответствующая lIастройка выполнетс каЛL/16РОВ04НЫМ потеНЦL/10метром. +5V R5 10К VDD VEE vss RJ#W D7 О2 2N2907 f С2 0.1 uF R4 PIC18F1220 10К U1 :t наrреnаreль RAO QRBO 8 9 RA1 RB1 17 RA2 RB2 18 RA3 RB3 10 RA4 RB4 11 #МCLR RB5 12 ОЗС1  RB6 13 ОЗС2 > RB7 R2 БОК Il) С1 R1 1.0 uF 10К - Рис. 7.34. V1HTepcpec AaT4L/1Ka СО 2 
326 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Пример 7.24 1* * npMopMTeT MHoeCTBeHHЫX rrрерывани *1 #include <p18cxxx.h> #include <de1ays.h> 1* Установка битов кониrураuии *  установка реима reHepaTopa RC  BKnqeHMe cTopoeBoro TaMepa *  BKnqeHMe HM3KoBonbTHoro nроrраммироваНМR *  oTKn4eHMe сброса по 4acTM4Ho потере nитаНМR *  разреwение o6ero с6роса *1 #pragma config OSC INTI02 #pragma config WDT OFF #pragma config LVP OFF #pragma config BOR OFF #pragma config MCLRE = ON void MyHighInt (void); II ********* rrepeMeHHe в nаМRТИ дaHHX ************ II nрототиrr ДnR npepBaHM #pragma interrupt MyHighInt #pragma code highvector=Ox08 void highvector (void) asm GOTO MyHighInt endasm #pragma code char str1 [] char str2 [ ] "СО2 = "; " ppm"; II MyHighInt - зто nрервание II highvector - зто Berop по аАРесу Ох08 II nроuедура 06сnуиваНИR nрерваНИR, II В03НИкаеrо Kaдy сеКУНДУ II void sendLCDdata (char data, char rs) { PORTB = (PORTB & ОхСЗ) PORTBbits.RB6 rs; PORTBbits.RB7 = 1; PORTBbits.RB7 = 9; Dе1ау10ТСУх(1); PORTB = (PORTB & ОхСЗ) PORTBbits.RB6 rs; PORTBbits.RB7 = 1; PORTBbits.RB7 = о; Delay10TCYx(1); void initLCD (void) ((data » 2) & ОхЗС); II rrереда4а neBoro II установ RS II имrrуnьс Е II задерка 40 мкс I ((data« 2) & ОхЗС); II rrереда4а npaBoro II установ RS II имrrуnьс Е II задерка 40 мкс 
rnaBa 7. Базовый BBO.u.BhIBO.u. 327 Delay1KTCYx (5) ; sendLCDdata (О х2 О, О) ; Delay1KTCYx (2) ; sendLCDdata (Ох20, о) ; Delay10TCYx (5) ; sendLCDdata (Ох20, О) ; sendLCDdata (Ох08, О) ; sendLCDdata (ОхО 1, О) ; Delay100TCYx (5) ; sendLCDdata (ОхОС, О) ; sendLCDdata (Ох06, О) ; void string (char *str, char position) I1 ОИАание 20 мкс (смотрите текст) II rrосылка Охзо I1 ОЖИАание 8 мкс II посылка Охзо II ОЖИАание 100 мкс II rrосылка Охзо II посылка Ох28 II rrосылка ОхО1 II OMдaHMe 2 ms II посылка ОхОС 11 nOCnKa Ох06 int ptr = О; sendLCDdata (position, О); II nepeAa4a nозиuии while (str[ptr] != О) sendLCDdata(str[ptr++], 1); II nOCbIJIKa симвоnа void MyHighlnt (void) float analog; PIR1bits.TMR1IF о; TMR1L ОхЕЕ; 250 TMR1H Ох85; PORTBbits.RBO о; PORTBbits.RB1 1; DelaylKTCYx (1) ; Dе1ау100ТСУх(2); Delay10TCYx(S); II take sample ADCONObits.GO = 1; while (ADCONObits.GO == 1); ana10g = (ADRESL + (ADRESH « PORTBbits.RВ1 = о; Dе1ау1КТСУх (2); PORTBbits.RBO = 1; string (str1, Ох80); str2[0] = analog I 100 + ОхЗО; analog = (int) analog % 100; str2[l] = (int) analog I 10 + str2[2] = (int) analog % 10 + string (str2, Ох86); void main (void) OSCCON = Ох4З; 11 rrOBTopHoe разреwение npepBaHM 1/ заrрузка TaMepa 1 3HaqeHMeM 31, 1I AnR rrрерваНИR KaAY сеКУНАУ II заrrитка АаТ4ика м HarpeBaTenR 1/ ОЖИАание 4 мс II ОЖИАание ,8 мс II ОЖИАание ,2 мс II заrrуск rrреобразоваНИR II ожидание заверwеНМR 8)) * 0.489; II MaCWTa6MpoBaHMe на // максимум 500 npoMMnne II ое 8 мс II от06раение "СО2 ОхЗОi ОхЗО; II внутренни reHepaTop YCTaHaBnMBaeTCR IIHa 1 мrц 
328 Прнменение MHKpOKOHTpOnnepOB PIC 18 ЛDСОN1 ADCON1 Ох7Е; ОхОе; II B60p ВХОАа ANO, актмвмрованме АЦО II ANO  аналоrовы, VDD м VSS  OIlOpHble I I наПрRеШR ADCON2  Ох84; TRISA 1; TRlSB о; РОЕТВ 1; II 6мт 1 порта А II порт В  BXOД II вкл. Аатчмка ВХОд ini tLCD () ; T1CON TMR1L l'MR1H OxF9 ; ОхЕЕ; Ох85; II TaMep 1 CqMTaeT 32 мкс на ОТС4ет II заrрузка TaMepa 1 3HaqeHMeM 31, 250 II AnR nрерыванмя KaAY секун)(у ECONbits.IPEN о; II BKn. Только BcOKonpMopMTeHblx II npepBaHM PIE1bits.TMR1IE  1; INTCONbits.GIE = 1; II разреwенме nрерыванмя 0'1' 'l'aepa 1 II разреwенме nрерыванм while (1) { II nothinq 7.5. Резюме 1. Доебезr KoкraКТOB переКЛlO4ателе nрОL/1СХОДИТ ПРL/16ЛL/1знтелы 10 в течеНL/1L/1 1 О мс  он дол>кен быть KOMneHCL/1pOBaH ,цля праВL/1ЛЬНО работы MHorL/1X ПрL/1ло>кеНL/1Й. YCTpaHellL/1e дре6езrа контактов ЛУ4ше Bcero ДОСТL/1rаетс nporpaMMHo. 2. Вспомоrательные KJlaBL/1arypbI 4асто ПОДKJllOчаIOТС к МL/1кроконтроллерам дл ввода ра3ЛL/14НЫХ TL/1nOB данных. Вспомоrательные KJlaBL/1arypbI наL/160лее часто создаlOТ- c как матрL/1ЦЫ,  npL/1 Ha>KaTL/1L/1 KJlаВL/1ШL/1 строка матрL/1ЦЫ соеДL/1няетс со стол6цом. З. СвеТОДL/10ДЫ, которые ПОДКЛI04аIOТС к МL/1кроконтроллеру, 4асто Tpe6YlOT L/1C- пользоваНL/1 схемы уnравлеНL/1, ФОРМL/1РУIOw,е ток, СL/1ла KOToporo достаТ04на,цля CBe чеНL/1 свеТОДL/10да. ЧL/1словые L/1НДL/1каторы L/1СПОЛЬ3УIOТ свеТОДL/10ДЫ в 7 сеrментной КОII- СРL/1rураЦL/1L/1,,цл уnравлеНL/1 L/1ML/1 L/1СПОЛЬ3УIOТС 7cerMeHTHbIe коды. 4. ЖL/1ДКОКрL/1стаЛЛL/14еСКL/1е L/1НДL/1каторы (ЖКL/1НДL/1каторы) 4асто ПОДКЛЮ4аlOТСЯ к МL/1кроконтроллерам ,цл Toro, 4т06ы отобра>кать алсраВL/1тноu.L/1срровые данные. Дос- тупны ра3ЛL/1чные размеры nанеле ЖКL/1НДL/1каторов  от ОДНОСТР0411ЫХ до 4CTpOLlIlbIX. ПрL/1 этом В строке MOryr pa3Mew,aTbc от 16 до 40 СL/1МВОЛОВ. 5. Вакуумные срлуоресцентные L/1НДL/1каторы (ВФV1)  зто pKL/1e СL/1l1езеленые L/111- ДL/1каторы, L/1спользуемые во MHorL/1X L/1здеЛL/1ЯХ ШL/1рокоrо потре6леllL/1 с целью от06ра- >КОIIL/1Я алсраВL/1Т1IОu.исрровых данных. 6. 3лектромоторы в форме злектромоторов nOCTOHHoro тока L/1ЛL/1 шаrовых злек ТРОДnL/1rателей часто L/1СnОЛЬ3УIOТС ,цл Toro, 4тобы ПО3L/1ЦL/10НL/1ровать L/1ЛL/1 nepeMeCTL/1Tb устройства. OHL/1 4асто ПОДКЛI04аIOТС к МL/1кроконтроллерам. 7. 3лектромоторы 4асто управлIOТС с L/1СПОЛЬЗ0ваНL/1ем МОЩIIЫХ половых МОП ТрШ-l3L/1СТОрОВ. Распространенно КОНсрL/1rураЦL/1е схемы управлеllL/1 на полевых MOn траНЗL/1сторах влется H06pa3Hbl мост. 8. Модуль WV1M МL/1кроконтроллера 4асто L/1спользуетс,цл Toro, чтобы управлть CKOpOCTblO L/1 направлеНL/1ем Bpaw,eHL/1 ротора злектромотора ПОСТОЯllllоrо тока. V13Me 
rnaBa 7. Базовый BBO.u.BbIBO.u. 329 НЯ КОЭсрфL/1ЦL/1ент заполнеНL/1 СL/1rнала на выходе WV1M, мо>кно L/1зменять скорость рабо ты ЭJlектромотора, потому 4ТО среДНL/1Й ток 4ерез злектромотор 6удет L/1зментьс. 9. Реле  как злектромехаНL/14еСКL/1е, так L/1 L/1нтеrраЛЫ.lые L/1СПОЛЬ3УIOТС для Toro, 4т06ы ВКЛlO4ать BbICOKL/1e Hanp>KeHL/1 L/1ЛL/1 несколько контактов одновременно. Боль WL/1I1CTBO реленых схем Tpe6YlOT npL/1MeHeHL/1 схем уnравлеНL/1, фОрМL/1РУIOw,L/1Х TOKL/1, He06xoAL/1MbIe ДЛ nодаЧL/1 на 06мотку реле. 10. СОЛ8l-IOL/1ДЫ  зто злектромехаНL/14еские YCTpOCTBa, которые L/1СПОЛЬ3УIOТСЯ ,ДЛЯ Toro, 4то6ы nepeMeCTL/1Tb YCTPOCTBO на короткое раССТОЯНL/1е. СолеllOL/1ДЫ ДОЛ>КIIЫ B03 6Y>K,lJ.aTbC в Te4eHL/1L/1 определенноrо отрезка BpeMeHL/1, что треБУОl ПрL/1МОНОIIL/1Я rlpo rpaMMHbIx временных задер>кек. СолеНОL/1ДЫ так>ке Tpe6YIOT 60ЛЬWL/1Х токов L/1 наЛИЧL/1Я схемы уnраВЛ8l-1L/1. 11. AaT4L/1KL/1  зто устройства, которые преобразовываlOТ ABL/1>KeHL/1e L/1ЛL/1 KaKL/10 JlL/160 Иllые фL/13L/14еСКL/1е влеllL/1 в злеКТРL/1чеСКL/1 СL/1rнал, который обра6аТЫ[JaО.JСЯ ML/1K роконтроллером. 3TL/1 явлеНL/1 ВКЛlO4аlOТ враw,ательное ABL/1>KeHL/1e, давлеНL/1е, темпера- туру, поток >KL/1AKOCTL/1 L/1 т.Д. 12. Код АС5 наL/160лее 4асто L/1спользуетс в L/1HcppaKpacHbIx YCTpOCTBax ДL/1СТall- ЦL/10нноrо управления для Toro, 4тобы посылать СL/1rналы на частоте 36 кrц. 7.6. Вопросы и задания 1. KaKL/1e пр06лемы MOryT L/1MeTb место в MeXaHL/14eCKL/1X nереКЛЮ4ателях? 2. Как долrо ДJlL/1TC MeXaHL/14CKL/1 дребезr в переКЛI04ателх? 3. KaKa nporpaMMa L/1спользуетс ДЛ Toro, 4т06ы YCTpaHL/1Tb дре6езr контактов llереКlIЮ4ател? 4. НаПL/1WL/1те 06ращеНL/1е к срУНКЦL/1И, L/1СnОЛЬЗУ СРУНКЦL/1Ю Switch L/13 ПРL/1мора 7.1, ДIlЯ устранеНL/1Я дре6езrа контактов в двух переКЛlOчателх, свзанное с 6L/1TaML/1 О L/1 7 порта А. 5. В 4ем ра3ЛL/14L/1е между переКЛI04атеЛМL/1 TL/1nOB SPST L/1 SPDT? 6. П04ему He06xoAL/1M HarpY304HbI pe3L/1CTOp npL/1 COeAL/1HeHL/1L/1 переКJlЮ4ател с МL/1кроконтроллером? 7. OnL/1WL/1Te КОНСТРУКЦL/11О MaTpL/1u.bI всnомоrателыlO KJlaBL/1aTYPbI 8. ИзмеНL/1те nporpaMMY в npL/1Mepe 7.2 TaKL/1M 06раЗ0М, 4т06ы она моrла L/1СПОЛЬ30 вать вспомоrательнуlO KJlaBL/1arypy 4х6. 9. Поскольку nporpaMMa в ПРL/1мере 7.2 L/1спользует порт А, как входной, CKOJН)KO маКСL/1малыю строк моrло 6ы 6ыть ПОДКЛlO4ено к порry А в PIC18F1220? 10. nреДПОЛО>КL/1М, 4ТО 6елы CBeTOAL/10A ПОДKJlЮ4ен к 6L/1TY АВО порта В ML/1KpOKOH ТрОЛJlера PIC. CBeTOAL/10A требует Hanp>KeHL/1 2,5 В L/1 тока 30 мА дл Toro, 4т06ы полно CTblO CBeTL/1TbC. npL/1 L/1СnОЛЬЗ0ваНL/1L/1 TpaH3L/1CTOpa 2N2222, разра60тайте соопютспзую- w,L/1Й L/1нтерфес. 11. nOBTOpL/1Te вопрос 1 О для KpacHoro pKoro CBeTOAL/10Aa, KOTOpЫ тре6ует Ha np>KeHL/1 в 2,0 В L/1 тока в 20 мА. 12. nOAKJlI04L/1Te пару красных cBeTo,lJ,L/10AOB к 6L/1TaM АВО L/1 АВ 1 порта В. 3ти CBOTO AL/10AbI Tpe6YlOT 1 О мА тока L/1 Hanp>KeHL/1 в 1,65 В. Разра60тате СРУIIКЦL/11О ДЛ PIC, KOTO pa ПО04ередно 6удет за>КL/1rать два свеТОДL/10да с 4aCTOTO 2 ru. в Te4eHL/1e 1 О секунд ПрL/1 ВЫЗ0ве функu.L/1L/1 flashLeds. npL/1ML/1Te, 4ТО TaKTOBa 4астота МL/1КРОКОlпроллера равна 4 Mru.. 13. Cyw,ecTBYIOT трехцветные cBeTOДlitOДЫ. 3ти YCTpocтвa L/1MeIOT четыре подключеl.М: (1) общее ПОДКЛlOчеНL/1е анода, (2) KpaCHЫ катод CBeTOДlitOдa, (3) зеленый катод свеТЩ1,Нода и (4) СL/1I1ИЙ каюд СIЗеТОДlitода. nОДКJlЮ4L/1те зто ycтpocтвo к PIC  к выводам АВО, АВ1, L/1 АВ2. 
330 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Красные L/1 зеленые ceKu.L/1L/1 тpe6ytOT напря>кеНL/1Я 1,65 В L/1 тока 1 О мА, а CL/1H ceКl, тре6ует наnря>кеНL/1Я в 2,5 В L/1 ток В 20 мА. Разра60тайте срун KLJ.Н 10 , которая 6удет BbICBe4L/1BaTb ПроL/13 вольные цвета с 4aCTOTO 3 rц в Te4eHL/1L/1 20 секун,ц ВСЯКL/1 раз, Korдa на вход ААО поступает лоrL/14еская еДИНL/1LJ.a. ПРОL/1звольные цвета  это 4L/1сла от 000 .0.0 111, посылаемые на тpL/1 6L/1Ta порта В. ПрL/1МL/1те, 4ТО тактовая 4астота равна 4 мrц. 14. KorAa CBeTO,lJ,L/10AbI МУЛЬТL/1nлеКСL/1рованы, OHL/1 BKJlI04aIOTC ИНДL/1ВL/1дуально только 4асть BpeMeHL/1, но создаетс впе4атлеНL/1е, 4ТО OHL/1 CBeTTC ПОСТОННО. n04eMy7 15. Какова МL/1НL/1МaJlьная L/1 маКСL/1мальная 4астота вспышек ДЛ МУЛЬТL/1пnексных L/1HAL/1KaTOpOB7 16. Kor,lJ,a шесть CBeTOAL/10,lJ,HbIX L/1HAHKaTopoB МУЛЬТL/1плеКСL/1рованы, ПL/1КОВЫЙ ток ДЛ кюкдоrо ИНДL/1катора ,lJ,OJl>KeH 6ыть YBenL/14eH на KaKO КОЗСРФL/1u.иент7 17. Как устанаВЛL/1вается 4астота вспышек в npL/1Mepe 7.67 18. naHeJlb ЖКL/1Н,lJ,L/1катора L/1MeeT вывод VEE, L/1спользуемы ЩlЯ YCTaHOBKL/1 KOH траста. ЧТО 06Ы4НО сое,lJ,нняется с VEE7 19. Каково Ha3Ha4eHL/1e ВХО,lJ,а RS панеЛL/1 ЖК-L/1ндикатора7 < 20. Каково назначенне ВХО,lJ,а Е н ЖК-L/1Н,lJ,L/1катора7 21. ОПL/1ШL/1те npou.ecc, Tpe6yeMЫ для Toro, 4т06ы L/1HL/1u.L/1aJlL/13L/1pOBaTb ЖК L/1H,lJ,L/1KaTop. 22. Как курсор nepeMew,aeTc в nанеJlИ ЖК-L/1НДL/1катора7 23. Каков 6У,lJ,ет адрес от06ра>кення ДЛ строк н 1 ЖКL/1НДL/1катора 24 х 17 24. Разра60тате СРУНКЦL/11О с L/1MeHeM cursor, KOTopa перемеw,аJlа 6ы курсор в лю- 6ylO ,lJ,OcrynHYIO n03L/1u.L/11O ЖКНН,lJ,L/1катора. npOTOTL/1n это функu.L/1L/1 6удет L/1MeTb BL/1A void cursor (nОЗL/1u.L/1Я CL/1MBOJla). ПрL/1МL/1те, 4ТО Е связан с А84, RS связан с АВ5, а 4разрдные данные nодаlOТСЯ на АВО-АВ3. 25. Аан ЖК-L/1Н,lJ,L/1катор 2х16. Разра60тате CPYHKu.L/1IO, которая CTL/1paeT только строку номер 1 на инднкаторе. (ВЫ,lJ,а4а np06eJla стнрает CL/1MBOJl.) 26. Какая комаН,lJ,а nОСЫJlается на ЖК-НН,lJ,L/1катор, 4т06ы 04L/1CTHTb весь зкран7 На- ПL/1ШL/1те CPYHKu.L/11O ОЧL/1СТКL/1 экрана с L/1MeHeM Clear. 27. BaKYYMHЫ cpJlyopecu.eHTHbI L/1НДL/1КПОр ра60тает как BaKYYMHa тру6ка. 28. Что ЯВJlяется основным npeL/1Myw,ecTBOM ВФV17 29. KaKO u.BeT 06Ы4НО от06ра>кается ВФИ7 30. n04eMY waroBbI ЭJlеКТРО,lJ,ВL/1rатеJlЬ Ha3blBalOT "waroBbIM" 7 31. Что является основным npeL/1Myw,ecTBoM шаrовоrо злеКТРОДВL/1rателя7 32. 06ЪЯСНL/1те, в 4ем pa3JlL/14L/1e между ПОJlНЫМ шаrом L/1 ПОЛОВL/1ННЫМ шаl ом в ша rOBoM злеКТРОДВL/1rателе. 33. Что такое H06pa3Hbl мост7 34. 06ЪСНL/1те, как L/13MeHeHL/1e WL/1pL/1HbI импульса, ПрL/1Jlо>кенноrо к злектромотору постонноrо тока, может L/1зменять скорость эnектромотора. 35. На 4ТО указывает "neHL/1e злектромотора" L/1 как ero npeAOTBpaTL/1Tb 7 36. Что такое ОТ,lJ,а4а ,lJ,емпсрерноrо ,lJ,L/1o,lJ,a L/1 как ее npeAOTBpaTL/1Tb 7 37. Как 6ыстро 6удет враw,аться электромотор nocTOHHoro тока, свзан"ы с H 06разным мостом, еСЛL/1 HMnYJlbCHbl WHpOTHO-МО,lJ,УJlL/1рОваННbI CHrHaJl нмеет К03фсрL/1 u.L/1eHT заnОJlненн в 50%7 38. nри6JlнзнтеJlЬНО, как 6ыстро ЭJlектромотор nостоянноrо тока 6У,lJ,ет Bpaw,aTb C, eCJlH он уnравлется O,lJ,HL/1M nOJleBbIM MOnTpaH3L/1CTOpOM, а ero BXO,lJ,HO СL/1rнал WV1M L/1MeeT коэсрФнu.нент заnолнеНL/1Я в 50%7 39. nре,lJ,ПОJlО>КL/1М, 4ТО peJle ПО,lJ,КЛlO4ено MHKpOKOHTpOJlnepy L/1 тре6ует ток в 100 мА. Разра60тате схему уnравлеНL/1Я реле, L/1СnОЛЬ3УIOw,уlO TpaH3L/1CTOp 2N2222. 40. ПО,lJ,KJlI04L/1те солеНОL/1,lJ, к MHKpOKOHTpOJlJlepy, nрнняв, 4ТО солеНОL/1,lJ, тре6ует ток 
rnaBa 7. Базовый BBO.u.-ВbIВО.u. 331 600 мА L/1 напря>кеНL/1е 12 В. Разра60тате nporpaMMY, воз6у>кдаюw,ую COJleHOL/1,lJ, в Te4e HL/1H 700 мс кажды раз, Kor,lJ,a вызывается функu.ня Fire. npHMHTe, 4ТО тактовая 4астота равна 4 Mru., а соленон,lJ, nO,lJ,KJl104eH к АВ3. 41. Как КО,lJ, rрея нсnользуется в YCTPOCTBax КО,lJ,L/1рования уrла поворота вanа ? 42. НаПL/1ШL/1те код rрея для 4раЗр,lJ,ноrо YCTpOCTBa КОДL/1роваНL/1Я yrna поворота вала. 43. Каково Ha3Ha4eHL/1 YCTpOCTBa КОДL/1роваНL/1Я yrna поворота вала? 44. AaT4L/1K TeMneparypbI LM70 L/1MeeT разрешаlOw,уlO спосо6ность в rpaдycax ЦеJlЬСИЯ. 45. ДаТ4L/1К температуры LM70 выдает  разрядное ,lJ,B0L/14HOe 4HCJlO в ка4естве ОТС4ета температуры. 46. 06ЪСНL/1те, как nporpaMMa Н3 npHMepa 7.19 окруrJlяет температуру. 47. KaKYIO L/1HcpopMau.L/11O L/1НДL/1u.L/1рует ,lJ,аТ4НК раСХО,lJ,а? 48. За,lJ,L/1те в Internet L/1 составьте CnL/1COK L/13 трех ,lJ,аТ4НКОВ, которые не рассмат- pHBaJlHCb в тексте. Так>ке OnHWL/1Te ВЫХО,lJ,ные CHrHaJlbI этнх ,lJ,аТЧL/1КОВ. 49. Имеется JlL/1 ,lJ,аТ4 L/1K , npe,lJ,Ha3Ha4eHHbI для ou.eHKL/1 КОЛL/14ества КL/1СЛОрО,lJ,а в aT мосфере? (OnTbTaKL/1, BbInOJlHHTe nOHCK в Internet). 50. nOCKOJlbKY L/1меется мно>кество TL/1nOB ra30BbIX ,lJ,aT4L/1KOB, можно ЛL/1 разра60тать YCTPOCTBO, которое 06HapY>KL/1Ba1l0 6ы npaKTL/14eCKL/1 все, 4ТО L/1MeeT характерный заnах? ЕСЛL/1 да, то составьте спнсок, по KpaHe мере, L/13 трех n03L/1u.L/1, 4ТО мо>кно 6ыло бы 06нару>кивать? 51 . Сколько 6L/1TOB BKJl104alOT однн КО,lJ, АС5? 52. KaKa 4астота НСnОJlьзуетс для пере,lJ,ачн ннфракрасноrо снrнала, исполь- 3YIOw,ero КО,lJ, АС5? 
332 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 rлава 8. Прерыванмя npepbIBaHLI1 у>ке предстаВЛЯЛLl1СЬ ранее в зтой книrе, но BBLI1AY LI1X Ba>KHOCTLI1 BC эта rлава nocBw,eHa LI1СnОЛЬЗ0ваНLI11О npepbIBaHLI1 в npLl1KJlaдHbIX nporpaMMax. П04ТLI1 все CLl1CTeMbI LI1СnОЛЬ3УIOТ npepbIBaHLI1. npepbIBaHLI1 разрешаlOТ ПРLl1ло>кеНLI1М зсрсреКТLI1ВНО коллеКТLl1ВНО LI1СnОЛЬЗ0вать МLI1кроконтроnлер,  без них 6ыло 6ы 4резвычайно трудно реаЛLl1З0вать MHoro nрLl1КЛадных nporpaMM. Однако npepbIBaHLI1 весьма ТРУ,lJ,НЫ npLl1 Il0 LI1CKe LI1 YCTpaHeHLI1L11 ОШLl1бок, а так>ке в отладке. После заверwеНLI1 LI13Y4eHLI1 зтой rлавы вы смо>кете: 1. 3срсреКТLl1ВНО LI1СnОЛЬЗ0вать npepbIBaHLI1 npLl1 npOrpaMMLI1pOBaHLI1L11 ПРLl1ло>кеНLI1Й ДЛ МLI1кроконтроллеров. 2. V1СПОЛЬЗ0вать в nporpaMMax как HLI13KO так LI1 BbICOKOnpLl10pLl1TeTHbIe nрерываНLI1Я. 3. npOrpaMMLI1pOBaTb USART на ра60ТУ в pe>KLI1Me прерываНLI1Й. 4. npOrpaMMLI1pOBaTb, LI1СПОЛЬ3УЯ npepbIBaHLI1, LI1зменюw,LI1е COCTOHLI1 БLl1ТОВ. 5. Понять, как функu.LI1ОНLI1РУIOТ мanые сети, LI1СnОЛЬ3УЯ npepbIBaHLI1. 6. npOrpaMMLI1pOBaTb LI1 LI1СПОЛЬЗ0вать устройства 4TeHLI1 WTpLl1XKOAOB. 8.1. Повторное знакомство с прерываниями MHKPOKOHTpOJlJlep нмеет ,lJ,ва уровня npepbIBaHLI1: BbICOKonpLl10pHTeTHoe npepbIBa HLI1e LI1 HLI13KOnpLl10pLl1TeTHOe npepbIBaHLI1e. YpOBHLI1 npLl10pLl1TeTa LI1MelOT 3Ha4eHLI1 TOJlbKO TO rAa, KorAa 06а nрерывання ПРОLl1СХОДЯТ О,lJ,новременно. KorAa aKTLI1BHbI 06а BLI1Aa преры BaHLI1, то сна4ала МLI1КРОКОНТРОJlлером OTpa6aTЫBaeTC BbICOKonpLl10pLl1TeTHoe npepbIBa HLI1e. npLl10pLl1TeT так>ке LI1rpaeT роль в СЛУ4ае, еСЛLl1 npLl1 отра60тке HLI13KonpLl10pLl1TeTHOI0 npepbIBaHLI1 B03HLI1KHeT BbICOKonpLl10pLl1TeTHoe npepbIBaHLI1e.  в зтом СЛУ4ае BbICOKOnpLl1 OpLl1TeTHOe npepbIBaHLI1e прервет отра60ТКУ HLI13KOnpLl10pLl1TeTHOro прерываНLI1Я. Некоторые ПрLl1кладные nporpaMMbI LI1СnОЛЬ3УIOТ только BbICOKonpLl10pLl1TeTHbIe npepbIBaHLI1, в то BpeM как ,lJ,PyrLl1e LI1CnOJlb3YIOT 06а уровня npepbIBaHLI1. Вы60Р Toro, KaKO уровень LI1nLl1 KaKLI1e YPOBHLI1 npepbIBaHLI1 LI1CnOJlb30BaTb всецело ОТНОСLl1ТСЯ к KOMneTeHu.LI1L11 разра60Т4L11 ка nporpaMMHoro 06еспечеНLI1Я, но в 06w,eM СJlучае мо>кно сказать, 4ТО BbICOKonpLl10pLl1 тетные npepbIBaHLI1 LI1спользуется для 06ра60ТКН соБЫТLI1Й, которые дол>кны 06СЛУ>КLI1- BaTbC 6ыстро, а HLI13KonpLl10pLl1TeTHbIe прерываНLI1Я LI1СnОЛЬ3УIOТС ДЛ 06pa60TKLI1 менее срочных C06bITLI1. БLI1Т IPEN в perLl1CTpe управлеНLI1 с6росом (RCON) BbI6L11paeT ЛLl1бо BЫ COKOnpLl10pLl1TeTHOe npepbIBaHLI1e (lPEN = О). ЛLl160 BЫCOKO LI1 HLI13KonpLl10pLl1TeTHbIe npepbI- BaHLI1 (IPEN = 1). Например, преДПОЛОЖLl1М, 4ТО CLl1CTeMa LI1спользует таймер, который Ilрерыпает MLI1KpOKOHTpOJlJlep OALl1H раз каждые 100 мс с тем, 4т06ы 06HOBLI1Tb COCTOHLI1e TaMepa реальноrо BpeMeHLI1. Второе npepbIBaHLI1e npLl1 зтом LI1споnьзуетс ДЛ Toro, 4тобы KOII ТРОЛLl1ровать внешнее c06bITLI1e от AaT4L11Ka расхода. СLI1rнал от AaT4L11Ka расхода B03HLI1Ka- ет в LI1нтервале BpeMeHLI1 между 1 мс LI1 40 мс. По npLl14L11He Toro, 4ТО СLl1rнал от даТЧLl1ка расхода nрLl1ХОДИТ 60Jlee 4асто, 4ем прерываНLI1Я TaMepa реальноrо BpeMellLl1, СLl1Пlалу от AaT4L11Ka расхода nРLl1сваLl1вается 60лее BbICOKLI1 npLl10pLl1TeT, а npepbIBaHLI1IO TaMepa peaJlbHOrO BpeMeHLI1  60Jlee HLI13KLI1 npLl10pLl1TeT. В 06w,eM СЛУ4ае, C06bITLI1M, которые ПрОLl1СХО,lJ,ЯТ 60Jlee 4асто, nРLl1сваивается 60лее BbICOKLI1 npLl10pLl1TeT, но не BCer,lJ,a. Bыco KOnpLl10pLl1TeTHOe npepbIBaHLI1e ,lJ,OJl>KHO 06Ы4НО 06СЛУ>КLI1ватьс в nepBYIO 04ере,lJ,Ь, потому 4ТО в СЛУ4ае, еСЛLl1 OHLI1 не 6удуТ 06CJlY>KeHbI nepBbIMLI1, nРОLl1зодет потер данных. Как у>ке УПОМLI1налось в rnaBe 6, BbICOKOnpLl10pLl1TeTHbIe векторы npepbIBaHLI1 дол>к ны nporpaMMLI1pOBaTbC на Я4еку паМЯТLI1 с адресом ОхОО08, а HLI13KonpLl10pLl1TeTHbIe BeK 
rnaBa 8. TIрерывания 333 торы прерываний  на 4eKY паМТLI1 с адресом ОхОО18 ДIl ВЫЗ0ва соотвеТСТВУIOЩLl1Х процедур 06СЛУ>КLI1ваНLI1 прерываНLI1Й. Так как объем naMTLI1 по адресам ЭТLI1Х векторов OrpaHLI14eH, то 4ейка по адресу вектора прерываНLI1 06Ы4НО cOAep>KLI1T команду GOTO, передаlOЩУIO уnравлеНLI1е на nроце,lJ,УРУ оБСЛУ>КLI1ваНLI1 npepbIBaHLI1. На сеrОДНЯWНLI1Й день 60ЛЬШLl1НСТВО nРLl1КЛадных проrрамм nLl1ШУТС на языке С. потому 4ТО зто знаЧLl1 телы-ю CHLI1>KaeT КОЛLl14ество BpeMeHLI1, Tpe6yeMoro Д11 проrраММLI1роваl-lLl1 ПРLl1ло>кеl-ILI1. Схема реаЛLl1заЦLl1L11 структуры npepbIBaHLI1 на 3ЫKe С LI1ЛЛIOСТРLl1руется ПрLl1мером 8.1. Размеw,еНLI1е векторов прерываНLI1 вляетс KpLl1TLI14eCKLI1 ва>кным моментом, ПрLl1 зтом больша 4асть ПРLl1веденно проrраммы дол>кна КОДLl1роваться LI1meHI-IО в ПРLl1ведеlНIOМ порядке. nporpaMMHbI код, который следует за объвлеНLI1ем двух векторов прерыва ний, дол>кен отделтьс оператором nceBAoKoMMeHTapLl1 #pragma. ФУНКЦLl1 main в этом ПРLl1мере разреwает 06а прерываНLI1 после вы60ра 060Ll1X ПРLl10РLl1тетов прерыва- HLI1 6L11TOM IPEN perLl1CTpa RCON. ЕСЛLl1 IPEN 6удет в COCTOHLI1L11 лоrLl14ескоrо нуля, ТО это будет озна4ать, 4ТО разрешено только BbICOKOnpLl10pLl1TeTHOe прерываНLI1е. ApyrLl1MLI1 сло ЕШМLI1, Moryт быть разреwены ЛLl160 06а YPOBH npepbIBaHLI1, ЛLl160 только ВЫСОКОПрLl10рLl1- тетные прерываНLI1. Пример 8.1 / * * Орммер MCnOnb30BaHMR npepBaHM *1 include <p18fxxx.h> '* Установмть 6MT KOHMrypaUMM Установмть RC reHepaTop OTKnqMTb CTopoeBO TaMep OTKn4MTb HM3KOBOnbTHoe nporpaMMMpoBaHMe OTKn4MTb с6рос rro qaCTM4Ho потере nMTaHMR Разреwмть 06 с6рос *  *  *  *  *  *1 fpragma config OSC RC fpragma config WDT OFF #pragma config LVP OFF 1tpragma config BOR OFF pragma config MCLRE = ON /1 ******** ПРОТОТМПЫ М ВЕКТОРЫ ПРЕРЫВАНМЙ **************** void MyHighlnt (void); void MyLowlnt (void); II rrpoTOTMrr AnR npepBaHM II cepBMCHe npoueAYP tpragma interrupt MyHighInt tpragma code highvector=Ox08 void high_vector (void) II MyHighInt  npepBaHMe II highvector  по аАресу ОхОО08 1I BcoKonpMopMTeTH вектор asm GOTO MyHighInt endasm I1 nepexoA на YHKUM 06ра60ТКМ 11 BcoKonpMopMTeTHoro npepBaHMR tpragma interruptlow MyLowInt tpragma interruptlow MyLowInt 1I MyLowInt - npepBaHMe I1 HM3KonpMopMTeTH вектор  I1 по аАресу ОхОО18 
334 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 void low vector (void) // нмзкоnрмормтетн вектор {  asm GOTO MyLowInt endasm // nepexoA на YHKUM 06pa60'l'KM  // нмзкоnрмормтетноrо rrрерванмя /1 ******************* проrРАММНЫЙ KO *********************к** 1/ DporpaMMH КОД Аолен 6Tb nOMeeH ЗАесь после 1I Toro, как BeKTOp npepBaHM 6УАУТ onpeAeneH II #pragma code void MyHighInt (void) //наqало nporpaMMHoro КОАа // BblcoKonpMopMTeTHoe npepblBaHMe nepexoAMT CAa } void MyLowInt (void) // Нмзкоnрмормтетное npepBaHMe nepeXOAMT CAa II rлавнаR nporpaMMa void main (void) RCONBITS.IPEN = 1; INTCONBITS. GIEH 1; INTCONBITS. GIEL = 1; // IPEN = 1 AnR разреwеНМR npMopMTeToB npepBaHM // разреwает .BbleoKonpMopMTeTHoe npepBaHMe // разрешает нмзкоnрмормтетное npepblBaHMe // DpepBaHMR теперь вклqен, выnолненме ApyrMx nporpaMMHX AeCTBM Процедуры обслуживания прерываний nporpaMMa по npHMepy 8.1 - ЭТО все, 4ТО не06хо,lJ,НМО, 4т06ы настронть н разре- шнть как ннзко, так н BbICOKonpHopHTeTHbIe nрерывання. npou.e,lJ,YPbI 06СЛу>Кнвання npe pЫBaHH, которые 06ра6атывают как ннзко, так н BbICOKonpHopHTerHbIe nрерывання, не ВKJlЮ4ены в ЭТОТ npHMep. В Hero ВKJlЮ4ены только 060Л04КН npou.e,lJ,YP 06СЛу>Кнвання nрерываннй. npou.e,lJ,ypa 06слу>кнвання nрерывання, HHOr,lJ,a называемая ХЭН,lJ,Jlером npepbIBa- HH, ,lJ,ол>кна nравнльно 06слу>КНТЬ npepbIBaHHe. В npoTHBHOM СЛУ4ае снстема завнснет нлн за6локнруется, 4ТО С,lJ,елает nOHCK н устраненне oWH6KH 04ень ТРУ,lJ,НЫМ нлн HeB03 мО>кным. С Ka)l(,lJ,bIM устройством, которое выставляет nрерывання мнкроконтроллеру, связано трн 6нта уnравлення: · 6нт npHopHTeTa nрерывання (IP) . 6нт разреwення nрерывання (lE) · 6нт срлаrа nрерывання (IF) Бнт npHopHTeTa nрерывання (lP) вы6нрает лн60 высоко-, лн60 HH3KonpHopHTeT- ное прерыванне ,lJ,Jlя YCTpOCTBa. ЛоrН4еская 1 в 6нте IP ,lJ,Jlя ,lJ,aHHOrO ВХО,lJ,а nрерывання вы6нрает высокопрнорнтетное npepbIBaHHe, а лоrН4ескн ноль вы6нрает HH3KonpHopH тетное npepbIBaHHe. Бнт разреwення nрерывання (IE) разреwает nрерывання от YCT 
[пава 8. TIрерывання 335 ройства, KorAa устанавлнвается в COCTOHHe лоrН4еско еднннцы. Бнт срлаrа npepbIBa ння (IF) устанавлнвается ,lJ,Jlя Toro, 4т06ы указать, 4ТО YCTPOCTBO вызвало npepbIBaHHe. Бнт IF оnрашнвается nporpaMMHo в nроцедуре 06СЛу>Кнвання nрерывання с тем, 4тобы оnределнть, какое YCTPOCTBO вызвало npepbIBaHHe. Флаr nрерывання должен быть 04Hw,eH nporpaMMo 06ра60ТКН nрерывання, KorAa npepbIBaHHe 6удет 06СЛу>Кено. Еслн этот бнт не 6удет с6расываться ВНуТрн nporpaMMbI 06ра60ТКН nрерывання, то Apyroe npepbIBaHHe HHKorAa не сможет nрОНЗ0ЙТН. nредnоложнм, 4ТО TaMep О, TaMep 1, а так>ке вывод входа nрерывання INT1 нс- nользуются nрнложеннем. npepbIBaHHe от TaMepa О является BbIcoKonpHopHTeTHbIM npepbIBaHHeM, а nрерывання от TaMepa 1 н входа INT1 являются ннзкоnрнорнтетнымн nрерываннямн. npHMep 8.2 нллюстрнрует nporpaMMY, не06ходнмую ,lJ,Jlя Toro, 4т06ы реanНЗ0вать соответствуюw,ую структуру. В этом npHMepe не nоказано, как npou.eAypbI обслужнвання npepbIBaHH завершаются возвратом по команде возврата Н3 noAnpo- rpaMMbI обработкн nрерывання (RETFIE). Соответствуюw,ее завершение noAnporpaMMbI обработкн npepbIBaHH по команде RETFIE 06есnе4нвается операторам н #pragma interrupt н #pragma interrflow nporpaMMbI. 3тн операторы nceBAoKoMMeHTapHeB нден- тнсрнu.нруют срункцнн, нсnользуемые,lJ,JlЯ Toro, 4тобы 06ра60тать как BЫCOKO, так н НН3- KonpHopHTeTHbIe nрерывання. Команда RETFIE (возврат Н3 срункцнн с разрешеннымн nрерываннямн) автомаТН4ескн повторно разрешает 6YAyw,He nрерывання в конце срункцнн 06ра60ТКН npepbIBaHH. Содержнмое perHcTpoB уnравлення nрерываннямн OnHcaHo в rлаве 6. Пример 8.2 1* * Орммер МСnОnЬЗ0ванмя BCOKO- м HM3KonpMopMTeTHX npepBaHM *1 'include <p18cxxx.h> 1* Установка 6мтов KOHMrypaUMM *  установка peMMa reHepaTopa HS *  BKnqeHMe cTopoeBoro TaMepa * - вкnqение HM3KOBOnbTHoro nроrрамммрованмя *  OTKnqeHMe с6роса по qaCTMqHO потере nмтанмя разреwенме 06ero с6роса *1 'pragma config OSC HS 'pragma config WDT OFF Ipragma config LVP OFF 'pragma config BOR OFF 'pragma config MCLRE = ON 11 ********* npoToTMn м вектора npepBaHM *************** void MyHighInt (void); void MyLowInt (void); 1I npoToTMn rrpoueAYP 11 06cnYMBaHMR npepBaHM 'pragma interrupt MyHighInt 'pragma code high_vector=8 1I MyHighInt - зто npepBaHMe 11 high_vector по аАресу ОхОО08 void high_vector (void) 1I BcoKonpMopMTeTH вектор asm GOTO MyHighInt endasm I1 nepexoA на nОАnроrрамму' 06ра60ТКМ 
336 ITpHMeHeHHe МНКрОКОНТрОJIлеров PIC 18 1 I BCOKorrpMopMTe'.rHbIX I!рерваj{И #pragma interruptlow MyLowInt #pragma code low vector=Ox18 I1 MyLowInt  зто npepBaHMe I I нмзкоприормтетн BCK'.rOP II по аАресу ОхОО18 II нмзкоrrриормтстный вектор void lowvector (void) asm GOTO MyLowInt endasm НМЗКОnРМОРМ'l'етных npepBaHM ) II nepexoA на nOAnporpaMMY 06ра60ТКИ 1I ******************** nроrраммнй КОА ****************** #pragma code II 3Аесь на4мнается nроrраммны КОД II BcoKonpMopMTeTHoe npepBaHMe void MyHighInt (void) INTCONbits.TMROIF = о; II с6рос заnроса от 'I'aMepa О 1I 06ра60тка nрерыванмя от TaMepa О 11 HM3KonpMopMTeTHoe npepBaHMe void MyLowInt (void) if (INTCON3bits.INT1IF == 1) { 11 зто INT1? INTCON3bits.INT1IF = о; 1I с6рос заnроса 1I06pa60TKa npepBaHMR INT1 } else if (PIR1bits.TMR1IF == 1) I1 зто TaMp 1? PIR1bits.TMR1IF = о; II с6рос заnроса II 06ра60тка nрерванмя от TaMepa 1 II main program void main (void) II nporpaMMMpoBaHMe TaMepa О, TaMepa 1 м INT1 INTCON2bits.TMROIP = 1; INTCONbits.TMROIE = 1; IPR1bits.TMR1IP = о; PIE1bits.TMRIIE = 1; INTCON3bits.INT1IP о; INTCON3bits.INT1IE 1; RCONbits.IPEN = 1; INTCONbits.GIEH 1; II TaMep О ммеет BCOKM npMopMTeT II разреwенме npepblBaHMR от TaMepa О II TaMep 1 ммеет HM3KM npMopMTeT II разреwенме npepBaHMR от TaMepa 1 1I INT1 ммеет HM3KM npMopMTeT II разреwенме INT1 II IPEN = 1 AnR разреwенмя npMopMTeToB II npepBaHM II разреwенме BcoKonpMopMTeTHx II npepBaHM II разреwенме HM3KonpMopMTeTHx INTCONbits.GIEL 1; 
rnaBa 8. ITрерывання 337 I1 nрерванмй 11 nрерванмя теперь BKn4eH, BnOnHeHMe друrмх заАа4 Для НЛЛlOстрацнн ТНnОIЗО снстемы, nредnоложнм, 4ТО некоторый банк нуждается в установке ннднкатора временн н температуры. Он nОРУ4НЛ нам разработать 'акой ннднкатор. npH разра60тке это снстемы нам nонад06нтся большо ннднкатор, nоэто му для отображення ннсрормацнн в наше снстеме мы 6удем НСnОЛЬ30IЗать имеющие 5AIOMOB в высоту светоднодные ннднкаторы от срнрмы Liteon (Liteon 50801 НАВ). Че тыре такнх светоднодных ннднкатора нсnользуются для от06раження зна4ення IЗреме нн, а 4етыре ApyrHx - для отображення зна4ення температуры. Рис. 8.1 nоказьшает консриrураu.иlO TaKoro ннднкатора, от06ражаюw,еrо зна4енне временн в 11 :03 н TeMne ратуры в 1040 F. (nOBHAHMOMY, это жаркн день.) Однн 8-мнллнметроlЗЫЙ СlЗеТОДНОА исnользуется для nре,lJ,ставлення снмвола rpaAyca н однн - для отображення СНМlЗола двоеТ04НЯ между 4асамн н МННуТамн. Восемь ннднкаторов 060зна4аlOТСЯ от ОО АО О7 с тем, 4т06ы МО>КНО 6ыло создать схему злеКТРН4ескуlO снстемы. О3 О2 О1 ОО . 18П I .8U -J IO'-l8:8 F D7 О6 О5 О4 Рисо 8.1. V1HAHKaTop Liteon 50801 НАВ Поскольку ннднкаторы мультнnлекснрованы н тре6уют НСnОЛЬЗ0вання 15 ВЫIЗО дОВ ввода - вывода мнкроконтроллера, PIC18F1220 не noдxoAHT для noA06Horo npHMe нення. Такнм 06раЗ0М, ДЛЯ реалнзацнн снстемы не06ходнмо вы6рать большнй MHKpO контроллер. В данном СЛУ4ае npHMeHeH мнкроконтроллер PIC 18F2220 в корпусе THna SPDIP, нмеюw,н 28 выводов. nтндюмовые 7-сеrмеНТНbIе светоднодные ННАнкаторы срнрмы Liteon тре6уют 4 В на cerMeHT npH токе в 30 мА. 8мнллнметровыые СlЗеТОДНОА ные ннднкаторы тре6уют наnряженн в 2 В npH токе в 20 мА. 
+5v R2 10 150 ' А..А. #'#' ..,.., .А..А. #,#,I ..,.., I .A..A. #,#,1' ..,..,  .A.. #'#': ..,  #'#' v A. #'#' V 1 ....L.C 000 VCC u. Ground +0 .111=  UЗ U4 SIIO ф:!! ,.. SN75441 CID ф...  r--N SN R1  ф к( < 1ОК N... < SC N...  $;S  $;S < CS C5 (.)(.) cв--. (.)(.) SW1 U1  PlC 18F2220 0.1 Ui: :  ёIS... O.1 U  ёIS:::  2 ii---- ЭNО RAO а RВO ЭNО  RA1  R81  12 ЭNО SEТ RA2 R82 23 13 GND 1;  RАЗ RВЗ 111i Itll  RA4 R84 1 RA5 R85 U2 ULN2ООЗА У1 9 МCLR RM 10 ОЗС1 R87 1 16 ......А.. D7D6DSD4 DЗD2DlDO ОЗС2 RCO 18 1С а --..;Dr--- RC1 1 2 28 2с Hi л."VА.. Ь 16 3 14  .А. "А..  RC5 RC2 1 4 эв зс 13 "VЛV.А. С 4МНz ....!L RC8 RC3 :1 48 4с 12 ....."' d 8 светодиодов высотой 5 дюймов RC7 RC4 с 58 5с 11 Y.A.."'.A.. С I 7 ев ее 10 ....."v..... f ::::::::: ;:: ::::: С2 ;:: ::::с 1 ф  78 7С .., g 22pF 22pF 9 СОМ 4.3 J... С3 1.0uF ":'" Рис. 8. 2. Индикация времени и температуры w w 00 754410 :::! "t:S :s: :: (1) ::z:: (1) ::z:: :s: (1) :: :s: :or; "t:S О :or; О ::z:: .а о   .а о tc "'с n 00 
fnaBa 8. ITрерывання 339 Входамн мнкроконтроллера (см. рнс. 8.2) является кнопка установкн времени н АаТ4НК температуры LM70. 3тн YCTpOCTBa нсnользуют штырькн RAO-RA2 мнкроконтроллера. В ка- чсспю схемы уnравлення cerMeHTaMH нсnользуется мнкросхема ULN2003 (7 бусрерных ИН вертнруюw,нх каскадов), связанная с 6нтамн АСО-АС6 порта С. В ка4естве анодных KJl104ей исnользуется пара мнкросхем уnравлення с BЫCOKO HarpY304HO cnoc06HoCTblO от срирмы Texas Instruments (754410). Мнкросхема ULN2003 - это ннвертнруюw,и уснлнтель, поэтому в случае ИСnОЛЬЗ0вання 7cerMeHTHoro кода с aКТHBHO лоrН4еско eДHHHцe и HeHHBepTH руюw,нх анодных KJlЮ4е, лоrН4еская еднннца будет за,о,авать све4енне cerMeHTa. Анодные KJl104H нсnользуют все восемь 6нтов порта В. nporpaMMa для AaHHoro nрнменення HanHcaHa так, 4ТО дЛЯ уnравлення всей сис темой она использует одно npepbIBaHHe от TaMepa 1. npepbIBaHHe от таймера 1 ин крементнрует TaMep реальноrо временн. Однн раз в мннуту npou.eAypa обслужнвани nрерывання от TaMepa 1 нзвлекает зна4енне температуры Н3 LM70, а так>ке выполняет отображение временн дня. rлавная nporpaMMa в это снстеме не делает НИ4еrо, nоми мо с4нтыlзllняя состояння KHon04Horo nереKJlЮ4ателя в СЛУ4ае, еслн время должно 6ыть нзменено. Еслн rOBopHTb о том, как HanHcaHa nporpaMMa установкн временн, то следует отметнть, 4ТО одна кнопка нсnользуется для Toro, 4т06ы установнть как 4асы, так н MH НуТы. (Возможно, 4ТО нзrотовнтелн цнсрровых 4асов npHMyT эту методику установкн временн) . Последовательность Onepau.H npH НСnОЛЬЗ0ваннн KHonKH установкн времени яв nяется следуюw,е:  еслн кнопка нажата, то nporpaMMa входнт в режнм установки временн, а caMЫ npaBbI ннднкатор температуры от06ражает снмвол Н для установкн 4асов;  еслн кнопка нажнмается в те4еннн nepHO,lJ,a временн, меньшеrо, 4ем 3 сеКУНАЫ, то зна4енне 4асов 6удет ннкрементнроваться по Ka)l(,lJ,OMY нажатню KHonKH;  еслн кнопка нажнмается в те4еннн nepHO,lJ,a временн, 60льшеrо, 4ем 3 сеКУНАЫ, то проrрамма входнт в режнм установкн мннуТ, а самый nравый ннднкатор TeMnepaтy ры от06ражает снмвол М для установкн мннуТ;  еслн кнопка нажнмается в те4еннн nepHoAa временн, меньшеrо, 4ем 3 секунды, то зна4енне мннуТ 6удет ннкрементнроваться по Ka)l(,lJ,OMY нажатнlO KHonKH, а еслн это не так, то nporpaMMa входнт в режнм установкн секунд, а самый npaBbI ннднкатор TeM пературы 6удет от06ражать снмвол S для установкн секунд; - еслн кнопка на>кнмается в те4еннн nepHoAa временн, меньшеrо, 4ем 3 сеКУНАЫ, то зна4енне секунд 6удет ннкрементнроваться по Ka)l(,lJ,OMY На>Катню KHonKH, а еслн это не так, то nporpaMMa восстанавлнвает оБЫ4НЫ режнм работы ра60ТУ н отображает новое время н TeMneparyPY. npHMep 8.3 нллюстрнрует полную nporpaMMY для это снстемы. Снстема наnиса на в языке С, потому 4ТО Ассем6лер сrенернровал 6ы 04ень 60ЛЬШО срал листинrа, а nporpaMMa 6ыла 6ы 04ень трудна в np04TeHHH н отладке. 06W,H 06ъем памяти, нсnоль- зуемо это CHCTeMO, составляет 1044 слова (только nрн6лнзнтельно nоловнну дос- ТYnHoro 06ъема) nамятн nporpaMM н 432 6aTa nамятн ,lJ,анных. 3та nporpaMMa, в основ- ном, составлена Н3 APyrHx npHMepoB nporpaMM, npHBe,lJ,eHHbIx в 60лее ранннх rлавах. Самое 60льшое нзмененне в nporpaMMe - это KoppeKu.H срункцин Switch. Так как nозн цня разряда нзвестна, то она не передается CPYHKu.HH Switch в ВЫЗ0ве. Друrое H3MeHe нне срункцнн Switch связано с тем, как в He отра6атывается TaMayT по нсте4еннн 3 секунд. Еслн B03Bpaw,aeTc О, то зто 0зна4ает, 4ТО кнопка 6ыла нажата, а еслн B03Bpa w,ается 1 то 3ТО зна4НТ, 4ТО к кнопке не nрнкасалнсь по KpaHe мере в те4енни 3 ce кунд. 3тн нзменення не06ходнмы для НСnОЛЬЗ0вання KHOnKH с целью установкн време- нн дня. 
340 ITpHMeHeHHe MHKpoKoHTponnepoB PIC18 Пример 8.З 1* * Dример oT06paeHMR временм м TeMnepaTYP *1 #include <p18cxxx.h> #include <timers.h> #include <delays.h> * 1* Установка 6итов KOHMrypaUMM *  установка peMMa reHepaTopa HS BKn4eHMe cTopoeBoro TaMepa BKn4eHMe HM3KOBOnbTHoro nроrрамммрованмя OTKn4eHMe с6роса по qaCTMqHO потере nмтанмя * - разреwенме 06ero с6роса * * *1 #pragma #pragma #pragma #pragma #pragma config OSC config WDT config LVP config BOR config MCLRE HS OFF OFF OFF ON void MyHighInt (void); void MyLowInt (void); void timeTemp (void); int getTemp (void); // npoToTMn AnR npoueAYP 06cnYMBaHMR // npepBaHM #pragma interrupt MyHighInt // MyHighInt - npepBaHMe #pragma code high_vector=Ox08 1/ high_vector - в ОхОО08 void highvector (void) 1/ BcoKonpMopMTeTH вектор asm GOTO MyHighInt _endasm // переход на nOAnporpaMMY 06ра60ТКМ // BcoKonpMopMTeTHoro .nрерванмя #pragma interruptlow MyLowInt #pragma code low vector=Ox18 void low vector (void) // MyLowInt - npepBaHMe 1/ HM3KonpMopMTeTH вектор  в ОхОО18 // HM3KonpMopMTeTH вектор asm GOTO MyLowInt endasm 1/ nepexoA на nОАnроrрамму 06ра60ТКМ // HM3KonpMopMTeTHx npepBaHM } II ДaHHe в nамятм nporpaMM rom near char 100k7[] = 1/ 7cerMeHTHaR nOMcKoBaR Ta6nMua Ox3F, Ох06, Ох5В, Ox4F, Ох66, Ох6D, Ох7D, Ох07, Ox7F, Ox6F /1 о cMrHan С aKTMBHO norM4ecKo едмнмuе 1/ 1 /1 2 // 3 // 4 // 5 // 6 // 7 // 8 // 9 
fnaBa 8. TIрерывання 341 } ; 11 OepeMeHHe в naMRTM AaHHX char tenths; char tenths; char minutes;' char hours; char displayRAM[8]; char setTimeFlag; char select; char pointer; 11 храненме временм 11 OT06paeHMe MHopMaUMM II установка nara временм II OT06paeHMe КОАа B60pa 11 OT06paeHMe указатеnя #pragma code II 3Аесь Ha4MHaeTCR nporpaMMHbl КОА void MyHighInt (void) IN'IaJ'Jbits.1МROIF = о; 1 I с6рос 3aI1pOca от r.rpa О R:RТВ = select; PORTC = displayRAM[pointer++]; select «= 1; if (pointer == 8) { pointer = о; select = 1; void MyLowInt (void) PIR1bits.TMR1IF = о; WriteTimer1(53000); tenths++; if (tenths == 10) { 11 с6рос заnроса от TaMepa 1 II rrерезаrрузка С4еТ4мка ММНУС CMeeHMe (36) 11 мнкрементмрованме TaMepa tenths = о; seconds++; if (seconds { 60) seconds = о; minutes++; if (minutes == 60) { minutes = о; hours++; if (hours 13) hours = 1; } if ((tenthslseconds) timeTemp(); о) 11 ОАМН раз в ммнуту void timeTemp (void) { int temp; if (setTimeFlag О) 
342 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 displayRAM[4] Ох71; displayRAM [о] 100k7 [minlltes % 10]; displayRAM[l] 100k7 [minutes 1 10]; disp1ayRM[2] 100k7[hours % 10]; displayRAM[3] 100k7[seconds 1 10]; temp = getTemp(); displayRAM[7] = о; i f (temp < о) { temp = temp; disp1ayRAМ[7] Ох40; } else if (temp >= 100) { temp = 100; displayRAМ[7] = 6; } displayRAM[4] displayRAM[5] 100k7[temp % 100]; 100k7[temp 1 10]; void sendClock (void) PORTAbits.RA1 о; PORTAbits.RA1 1; } int getTemp (void) int temp = о; char а; PORTAbits.RA3 о; for (а = о; а < 16; а++) { temp «= 1; temp 1= PORTAbits.RA2 » 1; sendClock(); а = о; if ((temp & Ох8000) Ох8000) а = 1; temp -temp; } temp »== 7; if (STATUSbits.C = 1) temp++i temp == (9 * temp) 1 5 + 32; if (а) temp  temp PORTAbits.RA3 = 1 return temp; } int Switch (void) int de1ay = 1500; II F АnЯ TeMnepaTYP II SC о 1I SC 1 11 #CS = о; 11 nOnY4eHMe 16 6мтов I1 проверка знака 11 фDI::ммI:юванме nатюжиre.льноро qмспа 11 по Фаренrету 1I #CS = 1 11 возврат с TeMnepaTYPo 11 AnR 3-ceKYHAHO задеркм 
fnaBa 8. ITрерывання 343 do { 11 OAaHMe отnусканмя while ((PORTA & 1) != 1); Dе1ау1КТСУх(15); } while ((PORTA & 1) ! = 1); do { II OMAaHMe наатмя =while ((PORTA & 1) == 1) { Delay1KTCYx(2) ; delay; if (delay == О) return 1; 11 eCnM TaMaYT } Delay1KTCYx (15); }while ((PORTA & 1) == 1); return о; 11 eCnM кнопка HaaTa rnавная rrporpaMMa oid main (void) ADCON1 = OxOF; TRISA Ох05; TRISB о; TRISC о; PORTB о; PORTA ОхОА; II все nopT UMpOBe 1I nporpaMMMpoBaHMe rropTa А I1 nporpaMMMpoBaHMe порта В 1I nроrрамммрованме порта С 1I все МНАмкаторы BKn. 11 #CS м SC 1 tenths = seconds select = 1; hours = 12; minutes setTimeF1ag = pointer о; timeTemp(); 11 мнмuмаnмзаuмя МНАмкатора INTCON2bits.TMROIP 1; IPR1bits.TMR1IP  о; 11 TaMep О всокоnрмормтетный 11 таймер 1 нмзкоnрморитетны WriteTimerO (О); OpenTimerO (TIMERINT ON & ТО 8BIT & ТО SOURCE INT & - - TO_PS 1 4); 11 KaAe 1024 мкс WriteTimer1 (53036); OpenTimer1 (TIMERINTON & Т1 8BIT RW & Т1 SOURCE INT & - - Т1 PS 1 8); I1 KaAe 100 мс INTCONbits.GIEL 1; 11 IPEN = 1 АnЯ разреwенмя 11 npMopMTeToB rrpepBaHM 11 разреwает BCOKonpMopMTeTHe 11 nрерванмя I1 разреwает HM3KonpMopMTeTHe 11 nрерванмя 11 rnaBH UMKn RCONbits.IPEN = 1; INTCONbits.GIEH 1; while (1) 
344 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 while (Switch() == 1); setTimeFlag = 1; displayRAM[4] = Ох76; time'I'emp () ; while (Switch () == О) { I I OMдaIlMe l!аа'I'ИЯ КI!ОПКМ 1/ не oT06paaTh F I I oT06paa'lЪ Н hours++; if (hours == 13) hours = 1; timeTemp(); } displayRAM[4] = Ох6D; t imeTemp () ; while (Switch () == О) { I I 0'l'06paaTb S minutes++; if (minutes 60) minutes = о; timeTemp() ; } setTimeFlag о; timeTemp () ; 3та npOrpaMMa НСПОJlьзует ,lJ,ва прерыванн: высокопрнорнтетное прерыванне, МУЛЬТLI1nлеКСLI1РУIOw,ее НН,lJ,нкаторы н ннзкоnрнорнтетное npepbIBaHHe, которое npoHCXo ДLI1Т каждые 100 мс С тем, 4то6ы ннкрементнровать TaMep реалыюrо BpeMeHLI1. НLI1ЗКО npLl10pLl1TeTHOe npepbIBaHHe так>ке нзменет СО,lJ,ержнмое оnераТН8НОЙ naMTLI1 от06ра- >KeHLI1 ОДLI1Н раз в мннуту, KOr,lJ,a нзменетс BpeM 4ерез вызов CPYIIKu.LI1H timeTemp. 3та взта в ка4естве npHMepa снстема нсnользует ,lJ,ва TaMepa, которые вл IOтс Ba>KHbIMLI1 ДЛ CPYHKu.HoHHpoBaHH TaMepa реальноrо временн н НН,lJ,нкаторов. TaMep О нсnользуетс ДЛ Toro, 4то6ы MYJlbTHnJleKCHp08aTb НН,lJ,нкаторы  кюкды раз npLl1 ero nереnолненнн reHepHpyeTc BbIcoKonpHopHTeTHoe npepbIBaHHe. TaMep О Ha CTpaLl1BaeTC такнм 06разом, 4ТО ОН НСnОJlьзует козсрсрнu.нент ,lJ,eJleHH flре,lJ,варнтелыlO ro деЛLl1тел, paBHЫ 4. npH зтом BXO,lJ,HO CHrHaJl TaMepa, 4астота KOToporo равна 1 Mru. (TaKTOBa 4астота снстемы равна 4 Mru.) nре06разуетс в снrнал С 4aCTOTO, рав- HO 250 Kru. (4 мкс). В perHcTp TaMepa заностс HYJlH, n03ToMY nрерывання 6удут вы- ЗЫ8атьс 4ерез кюкдые 256 4MHKpoceKYH,lJ,HЫX ВХО,lJ,НЫХ тактовых HMnYJlbCOB LI1ЛLl1 (ЩLl1I1 раз каждые 1024 мкс. Это заставлет частоту МLI1rаIШ каждоrо LI1НДLI1катора 6ыть rlрИ БЛLl13L11тельно paBHO 125 ru.. Таймер 1 НСnОJlьзуетс ДЛ Toro, 4то6ы creHepLl1pOBaTb ННЗКОПРLl10рнтеПlOе пре pbIBaHLI1e ОДLI1Н раз кюкдые 100 мс, LI1СnОЛЬЗУ КОЗСРСРLl1u.нент nре,lJ,варнтелыюrо ДeI1L11ТeIIЯ 8 с тем, 4тобы ссрормнровать nepHo,lJ, TaKTOBO 4астоты на ВХО,lJ,е TaMepa 1, paBHЫ 8 мкс. Таймер 1 nporpaMMHPyeTc ОТС4етом, равным 53036, KOTOPЫ o6ecne4HBaeT npLl1 ХОД 12500 тактовых HMnYJlbCOB nepe,lJ, nepenOJlHeHHeM TaMepa. 12500 раз по 8 MLI1KpOCe КУНД БУАет равно 100 MHJlJlHCeKYH,lJ" n03TOMY ннзкоnрнорнтетное npepbIBaHHe ВОЗНLI1кает 4ерез каждые 100 м HJlJlнсекун,lJ" TaMep peaJlbHOro временн деJlLl1Т 100-МНJlЛLl1секундные LI1МnУЛЬСЫ на 1 О, nОJlУ4ая ОТС4еты в сеКУН,lJ,ах н cpOpMHPY остаток ОТС4ета BpeMeHLI1. TaMep реальноrо временн ОТС4нтывает BpeM в 12-4асовом срормате с H"I,lJ,HKau.He букв АМ (ДО nолу,lJ,Н) HJlH РМ (nocJle nOJlY,lJ,H), KOTopa WHpOKO распространена в LI1НДLl1 каторах BpeMeHLI1 TaKoro THna. 06ратнте 8HLI1MaHHe на то, 4ТО aJlbTepHaTHBo Нсnользо- 
fnaBa 8. ITрерывання 345 IJaHLI1IO на4альноrо ОТС4ета в 53036 может 6ыть заrрузка 4нсла  12500, KOTopa н долж на, BepOTHO, НСnОJlьзоватьс, н60 CMbICJl этоrо 4HCJla проw,е поннмаетс. 53036  это 16раЗр,lJ,ное 4HCJlO OxCF2C, а  12500  так>ке OxCF2C, позтому Jlюбо нз названных пре,lJ,варнтельных ОТС4етов может НСnОJlьзоватьс в nporpaMMe. npHMep 8.3 НСnОJlьзует cpaJl заrОJlовка timers.h ДЛ Toro, 4т06ы ynpOCTLI1Tb npo rpaMMHpOBaHHe TaMepa. ФаJl заrОJlовка timers.h СО,lJ,ер>кнт 4етыре CPYHKu.LI1L11 ДЛ каж доrо TaMepa: OpenTimer, CloseТimer, ReadTimer н WriteTimer. В ,lJ,анном npLl1Mepe LI1C пользуютс TOJlbKO CPYHKu.HH OpenТimer н WriteTimer. Дn nОЛУ4еНLI1 nолноrо CnHCKa 3TLI1X CPYHKu.LI1, а так>ке ,lJ,етальных cBe,lJ,eHLI1 по ннм, 06paw,aTeCb к He6caTY фирмы Microsoft, а также CMOTpLl1Te РDFсрал 6н6ЛLl10текн MPL.A8-C18 н ПРLl1ложенне 8, в KOTO ром nрLl1веден сжаты nepe4eHb 6H6JlHOTe4HbIx CPYHKu.H. 8.2. USART и прерывания USART (уннверсаJlЬНЫЙ CHHxpOHHoaCHHxpOHHЫ npHeMonepe,lJ,aT4HK) reHepHpyeT и nOJlY4aeT как сннхронные, так н асннхронные nOCJle,lJ,OBaTeJlbHbIe ,lJ,анные. Как н БОJlЬ- шннство устройств MLI1KpOKOHTpOJlJlepa, зто устройство также НСnОJlьзует прерыванн во BpeM CBoe HOpMaJlbHO ра60ТЫ С тем, 4т06ы nOBbICHTb эсрсректнвность снстемы. USART может ЭКСnJlуатнроватьс н 6ез npepbIBaHH, eCJlH зто не06хо,lJ,НМО, но в 60ЛЬ шннстве CJlY4aeB ero ра60та в реЖLl1ме npepbIBaHH BJleTC 60лее зсрсректнвно. В 6L116ЛLl10теке С 18 LI1MeeTC проrраммное 06ecne4eHHe ра60ТЫ с UART (уннверсальны aCLI1HXpOHHbI npLl1eMOnepe,lJ,aT4HK) которое ра60тает с асннхроннымн nоследовательны мн ,lJ,aHI-lbIМLI1. UART paCCMaTpHBaeTC в 60лее поздннх подраЗ,lJ,елах 3TO KHHrH. Последовательные данные nоследоватеJlьные данные, MOryт 6ыть как сннхроннымн, так н aCHHxpoIIHbIMH. CHllXpoH- ные данные nepeдalOTC с СННХРОНМПУJlЬСОМ ДЛ сннхроннзаu.нн, а aCHllxpoHHbIe данные nepe дaIOTC 6ез СННХроLl1мnульса. БОJlЬWННСТ80 ,lJ,анных сеrодн  зто асннхронные данные. В дo ПОJlненне к зтнм .цвум 6азнсным типам nOCJle,lJ,OBaTeJlbHbIX данных, ,lJ,анные MOryт посылап,ся IЗ СLI1мnлексном режнме, а так>ке nОЛУ,lJ,ynлексном илн nОJlнодynJlексном (KOTOpы 06ычно назы BalOT просто ,lJ,ynлексным) pe)l(l..1Me. Снмnлексны режнм озна4ает HHcpopMau.HlO, которая Bce rдa nосылаетс в одном HanpaBJleHHH,  типа радноснrнала от cnyrHHKOBoro персдаILI1ка. HLI1- KaKa HHcpopMau.H HLI1KOrдa не nосылает на cnyrнLl1K, она только npLl1HHMaeTC. nолудуnлекс- HЫ режнм озна4ает HHcpopMau.HIO, которая мо>кет 6ыть nOCJlaHa HJlH nОЛУ'-lена, 110 О,lJ,новремен- но TOJlbKO в О,lJ,НОМ направленнн. npHMepoM nОJlУ,lJ,уnлексно снстемы влетс С8 (rpa>KДaH CKa полоса) в радносвзн илн интерфес USB (уннверсальн nосле,lJ,оватеЛЫ'iа WHHa) в компыоере.. В CBpaднOCB3H передаваемое COO6w,eHHe закаН4нваетс словом "over" (KOHeu.), 4т06ы HllcpopMHpoBaТb слуwатеJl о том, 4Т0 ce4ac ero 04ереАЬ выполнять передачу. В US8 CLI1cтeMe, KOTopa ВJlется nОJlУ,lJ,ynлексно CHCTeMO, ПРОТОКОJl тре6ует, 4Т06ы устросшо npHeMHHK ждaIlО момента, Korдa nOCJle,lJ,OBaTeJlbHa JlHHH станет ,lJ,OCтynHO пере,lJ, пере,lJ,а4е ннформаu.нн. 8 nОJlНО,lJ,ynлексно снстеме ннформаu.н nepeдaeTC н npHHHMaeTC OДl ювре менно. npHMepoM nОJlНО,lJ,ynлексно снстемы вneTC телесронная снстема. На рнс. 8.3 npe,lJ,CTaBJleHbI асннхронные ,lJ,анные, KOr,lJ,a онн пере,lJ,аlOТС USART HJlH UART. Фрем nосле,lJ,оватеJlЬНЫХ асннхронных ,lJ,анных СО,lJ,ержнт в 60льwннстве случаев 10 6нтов н Ha4HHaeTC стартовым 6нтом. ЗакаН4L11ваетс cppeM, по KpaHe мере O,lJ,IILI1M стоповым 6нтом, XOT Moryт прнсутствовать н MHoro стоповых 6нтов, CKOJlbKO зто He06 XOALI1MO ДЛ Toro, 4т06ы ВЫПОJlННТЬ раЗ,lJ,еJlенне HHcpopMau.HLI1. ЛоrН4ескн ноль 4асто называют пробелом, а JlоrН4ескую e,lJ,HHHu.y - MeTKO. Данные, которые заКЛlOчены меж ду стартовым н CTOnOBblMH 6нтамн, зто 06Ы4НО восемь 6нтов, npH зтом первым переда- 
346 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC] 8 eTC мла,lJ,WНЙ 6нт. Данные Moryт 6ыть ycnewHo nОЛУ4ены всле,lJ,СТВLI1е Toro, 4ТО 4астота nepeAa4H HJlH BpeM nepe,lJ,a4H 6нта ВЛIOТС нзвестнымн. БОJlЬШLl1НСТВО CLI1CTeM толе- рантны к коле6аннм в зна4еннн nepHO,lJ,a nepe,lJ,a4H 6L11Ta nop,lJ,Ka +/ 5%. НаПрLl1мер, еслн ,lJ,анные nepe,lJ,alOTC со CKOpOCTblO 9600 6нт/сек (6L11TOB в се КУН,lJ,У), то 3ТО означает, 4ТО 960 снмволов нлн 6aTOB nepe,lJ,aeTC за секун,lJ,У. Кюкды снмвол тре6ует ЩIЯ своей nepeAa4H 1 О перно,lJ,ОВ nepe,lJ,a4H 6нта. Данные nepeAalOTC СО CKOPOCTblO 960 6a- то в/се КУН,lJ,У. Скорость nepe,lJ,a4H 6L11TOB составляет (4асто называема CKOpOCTblO в бо ,lJ,ах) 6У,lJ,ет равна 1/9600 HJlLl1 104,2 мкс на 6нт. 06paTLI1Te BHLI1MaHLI1e на то, 4ТО скорость переда4Н 6L11TOB - 3ТО не есть скорость LI1HcpopMau.HOHHoro 06мена в 60Аах. Скорость HHcpopMau.HOHHoro 06мена в рассматрнваемом СЛУ4ае равна 960 6L11T /секунду, а CKO рость nepe,lJ,a4H 6нтов нлн скорость В 60дах 6У,lJ,ет равна 9600 6нт /сек. Скорость пере да4Н 6нтов 6ыла названа в 4есть Эмнл БО,lJ,а, KOTOPЫ СОЗ,lJ,ал код, называемы кодом БО,lJ,а. 3тот КО,lJ, нсnользоваJlС в телеrраСРLl1Н на nротженнн XIX века. Ко,lJ, Бода LI1CnOIlb зует CTapTOBЫ 6нт, 5 6нтов ,lJ,анных н nOJlTOpa стоповых 6нта, он 6ыл nоnулрен вплоть .0.0 не,lJ,авннх 1960-ых н НСnОJlьзоваJlС Hau.HOHaJlbI.lbIMH nOCTaBw,HKaMLI1 HOBOCTe. Cero ,lJ,H стаН,lJ,артные асннхронные nOCJle,lJ,OBaTeJlbHbIe ,lJ,анные nОЧТLI1 8cerAa LI1СnОЛЬЗУЮТ CTapTOBЫ 6нт, 8 6нтов ,lJ,анных н 1 cTonoBbI 6L11T. Можно 6ыло 6ы JlerKO reHepHpOBaTb этот THn ,lJ,анных nporpaMMHO, однако это ПрLl1 вело 6ы к n04TH nолно заrрузке мнкроконтроллера ,lJ,aHHO зада4е. В снлу 3Toro cxe ма, называема USART, 6ыла BKJl104eHa в состав мнкроконтроллера с тем, чт06ы nepe- ,lJ,авать LI1 ПОЛУ4ать как сннхронные, так н асннхронные последовательные данные. USART 6bIJl nepBO коммеР4ескн ,lJ,ocrynHo БV1С (больwо LI1нтеrралыю cxeMO), npo нзве,lJ,енной в 1968 cpHpMO Texas Instruments. Сннхронные ,lJ,анные, которые не 04ень распространены CerO,lJ,H, нспользуlOТ ЛLl1 HHIO nepe,lJ,a4H CLI1rHaJlOB н JlHHHIO TaKTOBO 4астоты. Рнс. 8.4 HJlJlIOCTpLl1pyeT ВН,lJ, сннхрон- НЫХ nосле,lJ,оватеJlЬНЫХ ,lJ,анных. Онн не СО,lJ,ержат HHKaKoro CTapTOBoro НЛLl1 CTOnOBoro HMnYJlbCa, 4ТО nOBbIwaeT скорость nере,lJ,а4И ,lJ,анных, потому 4ТО взамен НСnОJlьзоваНLI1 1 О 6L11TOB на 6aT ,lJ,анных npH CHHXpOHHO nepe,lJ,a4e ,lJ,анных НСnОЛЬЗУIOТСЯ только 8 6L11TOB на 6aT ,lJ,анных. Этот тнп ,lJ,анных выwел нз WHpOKoro ynoTpe6J1eHLI1 BBLI1,lJ,Y He06xo,lJ,LI1MO СТН нсnользованн ,lJ,оnолннтельноrо npOBO,lJ,a Щl nepe,lJ,a4H TaKTOBO 4астоты. ЕСЛLl1 сравннть ,lJ,ва рнсунка (см. рнс. 8.3 н рнс. 8.4), ТО можно УВН,lJ,еть, 4ТО в 06eLl1x СЛУ4аях nepe,lJ,alOTC те же самые ,lJ,анные (CHMBOJl А, за которым сле,lJ,ует СLI1МВОЛ В), однако npLl1 CHHXPOHHO nepe,lJ,a4e ,lJ,анных на nepe,lJ,a4Y тех же ,lJ,анных УХО,lJ,НТ MeHbwee КОЛLl1чество временн. Что не показывает рнсунок 8.4, - так 3ТО то, 4ТО CLI1HXpOHHbIe ,lJ,анные 06Ы4НО nере,lJ,аютс naKeTaMH. naKeT СО,lJ,ер>кнт срнкснрованное 4НСЛО 6aTOB, npLl1 зтом первым Н,lJ,ет 6aT, KOTOPЫ указывает на Ha4aJlO naKeTa, а nOCJle,lJ,HLI1M - 6aT, указываlOw,LI1 на KOHeu. naKeTa. BpeM! тре6уемое на nepe,lJ,a4Y 3ТНХ ,lJ,ВУХ 6aTOB, сннжает скорость HH cpopMau.HOHHoro 06мена., Эта KHHra KOHu.eHTpHpyeTc rJlaBHbIM 06разом на aCHHxpOHHO nepeAa4e nOCJle,lJ,OBaTeJlbHbIX ,lJ,анных. Управление USART USART, нахо,lJ,w,нйс внутрн PIC18, СО,lJ,ержнт nporpaMMHPyeMbI reHepaTOp CKO ростн HHcpopMau.HoHHoro 06мена, YCTaHaBJlHBalOw,H скорость 06мена ,lJ,аннымн. reHe ратор скоростн HHcpopMau.HoHHoro 06мена nporpaMMHpyeTc nocpe,lJ,CTBOM заrРУ3КLI1 4HCJleHHOro зна4енн в perHCTp, KOTOpЫ называетс SPBRG. Этот perHCTp nporpaMMH рует BHyTpeHHH TaMep такнм образом, что снстемная TaKTOBa 4астота деЛLl1ТС на 4HCJlO, заrРV>Kенное в SPBRG. npHMep 8.4 показывает ypaBHeHH, нсnользуемые Щl Toro, 4то6ы BbI4HCJlHTb зна4енне 4HCJla, заrРV>Kаемые в SPBRG с тем, 4т06ы reHepHpo вать НУЖНУIO скорость в 60,lJ,ах. Так как TaMep скоростн HHcpopMau.HOHHoro 06мена 
[пава 8. ITpepbIBaHHSI 347 представлет c060 8-разр,lJ,НЫ TaMep, то самое 60JlbWOe 4HCJlO, которое может В Hero заноснтьс, равно OxFF (255) HJlH, еслн НСnОJlьзуетс HYJleBOe зна4енне, 256. nOKa занные трн ypaBHeHH НСnОJlЬЗУIOТС AfI Toro, 4тобы BbI4HCJlHTb зна4енне, которое нуж но заrрузнть в SPBRG AfI нзмененн ра604НХ YCJlOBH THna TaКТOBO 4астоты н жела- TenbHo скоростн HHcpopMau.HoHHoro 06мена. Е,о,ннственное раЗJlН4не между npHBeAeH нымн ypaBHeHHMH свзано с НСnОJlьзованнем констант 64 (называетс "медленно"), 16 (называетс "BЫCOKOCKOPOCTHO") н 4 (AfI ра60ТЫ в сннхронном режнме), которые YCTaHaBJlHBalOT BHyTpeHHH npe,lJ,BapHTeJlbHbI ,lJ,eJlHTeJlb 4ерез TaMep скоростн ннсрор- Mau.HoHHoro 06мена. Пример 8.4 ;синхронн peMM, СКОрОСТЬ MHopMaUMoHHoro 06мена HM3KaR (Х nporpaMMMpyeTcR s SPBRG) х= ( Fosc* J +641 скор.инф.обм. ACMHXPOHH peMM, СКОРОСТЬ MHopMaUMOHHoro 06мена BcOKaR (Х nроrрамммруеТСR з SPBRG) х= ( Fosc J +16-1 скор.инф.обм. =MHXpOHH peMM (Х nроrрамммруеТСR в SPBRG) Х= ( Fosc J +64-1 скор.инф.обм. YDpMMeqaHMe: Fosc = TaKTOBO qaCTOTe HanpHMep, дл TOrO, 4т06ы USART pa60TaJl в асннхронном режнме npH CKOpOCTLI1 в БО,lJ,ах, paBHO 9600, можно НСnОJlьзовать как уравненне дл MeAfleHHO скоростн, так LI1 уравненне AfI BЫCOKO скоростн С тем, 4т06ы onpe,lJ,eJlHTb зна4енне, заrружаемое в SP8RG. при нсnользованнн TaКТOBO 4астоты, paBHO 16 Mru., зна4енне AfI меAflенной скоростн 6У,lJ,ет равно 25, а зна4енне AfI BЫCOKO скоростн 6У,lJ,ет равно 103. Чт06ы вы- брать высокую скорость, 6нт BRGH в perHCTpe ТXSTA YCTaHaBJlHBaeTC в COCTOHHe ло rи4еско e,lJ,HHHu.bI. USART НСnОJlьзует ВЫВО,lJ, АС6 AfI nepe,lJ,a4H ,lJ,анных (ТХ) н ВЫВО,lJ, АС7 ДJl npHeMa данных (АХ) на МНКРОКОНТРОJlлере PIC18F2220. Друrне 4JleHbI ceMeCTBa PIC MOryr нсnользовать ,lJ,pyrHe ВЫВО,lJ,Ы, n03TOMY не06ходнмо CBepTbC со Cneu.HcpHKau.LI1 мн BbI6paHHoro YCTpOCTBa. Рнс. 8.5 НJlJlюстрнрует nO,lJ,KJl104eHHe PIC18F2220 к nосле доватеJlЬНОМУ HHTepcpecy с НСnОJlьзованнем мнкросхемы ynpaBJleHLI1 JlHHHe DS275. Эта V1C 06ecne4HBaeT nре06разованне ypOBHe ТТL в стаН,lJ,артные уровнн HHTepcpeca RS-232. СтаН,lJ,артные Jlоrнческне уровнн HHTepcpeca RS232C onpe,lJ,eJlIOTC как от 3 .0.025 В AfI лоrН4ескоrо HYJl н от -3.0.0 25 8 AfI лоrН4еско e,lJ,HHHu.bI. npaKTH4ecKH npH исnользованнн DS275, Hanp>KeHH JlOrH4eCKHX YPOBHe 6у,lJ,УТ равны +/-12 В. COe,lJ,LI1I1H TeJlbHbI разъем ОВ9 (9-BЫBO,lJ,HO разъем THna О) НСnОJlьзуетс дл nО,lJ,КЛI04еНLI1 к no СJlе,lJ,овательному COM-nopry nK. nоказанное на рнсунке 8.5 nО,lJ,КЛlO4енне предназна- чено AfI CTaH,lJ,apTHoro nOCJle,lJ,OBaTeJlbHOrO ка6ел (зто не ка6ель НУЛЬМО,lJ,ема). Как соеднннтеJlЬНЫ разъем nоказанно схемы, так н сое,lJ,нннтельны разъем СОМпорта ПК BJlIOTC oTBeTHbIMLI1 разъемамн. Coe,lJ,LI1HHTeJlbHbI ка6ель ,lJ,олжен нметь с 06eLl1x сторон вставные разъемы. 
кадр символа I I I I , '\t? стоп-биты стартовый бит стоп-бнты стартовый бит  I I I I , I  стоп-биты Пример передачи сим:вола "А". за I<Oторым: следует сишол "в., стоп-биты стартовый и т  А == Ох41 <.".J  00  в == Ох42 стоп-биты   "о ::s: ::  ::r:  ::r: ::s:  :: ::s:  "о О  О ::r: -d о    "о О се  n 00 Рис. 8.3. Асинхронные nосле,lJ,овательные данные, ИСnОЛЬЗУЮЩLl1е восемь LI1нформацнонных 6L11TOB LI1 OALl1H стоn-6ит. 
[пава 8. ITpepbIBaHHSI 349 Время Дата \. у А == Ох41 А у в == Ох42 ) Рис. 8.4. CHHxpOHHa nepeAa4a данных nporpaMMa ДЛ 3Toro HHTepcpeca npLl1BeAeHa в npLl1Mepe 8.5. nоследовательны интерсрес nporpaMMHpyeTc на aCLl1HXpOHHbI режнм ра60ТЫ с 8 6L11TaMLI1 данных npLl1 CKOpOCTLI1 LI1HcpopMau.HoHHoro 06мена в 60дах, paBHO 9600. 3то 06Ы4НО устанаВЛLl1ваеман по YMOJl4aHLI11O скорость HHcpopMau.LI10HHOrO 06мена nK. Функu.н OpenUSART nporpaM- MLI1pyeT USART в данном СЛУ4ае так, 4т06ы он ра60тал в режнме преРЫlзаНLI1 как от при eMlтKa, так н от nередаТ4ика, который разреwаетс YCTaHOBKO в СОСТОЯНLI1е лоrLl14е CKO e,lJ,LI1HHu.bI 6L11Ta 8RGH. Дn скоростн HHcpopMau.LI10HHOrO 06мена в 9600 60Д, раС4ет- ное зна4енне ДЛ SPBRG равно 25. npHBe,lJ,eHHbI npLl1Mep nporpaMMbI pearLl1pyeT на две коман,lJ,Ы, nOCbIJlaeMbIe нз nK: снмвол "С" AfI COe,lJ,LI1HeHLI1 н CHMBOJl "G" AfI OTCOeALl1He ни. Еслн МНКРОКОНТРОJlлер nОЛУ4ает CHMBOJl С, оно возвраw,ает снмвольнуlO последо- вательность со CJlOBOM "Неllо" (npHBeT) назад в nK в срорме CTaH,lJ,apTHO строкн CLI1MBO- nOB ASCII. СтаН,lJ,артные строкн снмволов ASCII завершаlOТС снмволом "возврат карет- KLI1" (ОхОО), который сопровождается СLI1МВОЛОМ "перевод CTpOKLI1" (охОА). ЕСЛLl1 микро контроллер nОЛУ4ает СLI1МВОЛ G от nK, то он посылает в nK строку СLI1МВОЛОВ ASCII, со- держаw,уlO слово "Goodbye" (До CBLI1,lJ,aHLI1). 3та nporpaMMa может служить основой ор- rаннзаu.LI1L11 свзн между nK н МLI1кроконтроллером. Мнкроконтроллер использует дне 04ере,lJ,Н для Toro, 4т06ы 6усреРНЗ0вать HHcpopMau.LI10HHbl 06мен с nK. Он также LI1СnОЛЬ зует npepbIBaHH AfI Toro, 4т06ы 06ра6атывать как пере,lJ,аваемые, так н попучаемые данные. 
350 ITpHMeHeHHe МИКрОКОНТроnnеров PIC18 +5V + С1 P/C1BF2220 0.1 uF R1 U1  10К 2 RAO О RBO 3  4 RA1 RB1 5 RA2 RB2 6 RA3 RВ3 7 RA4 RВ4 1 RA5 RB5 9 МCLR Reв 10 OSC1 RB7 OSC2 RCO 16 RC1 17 RC5 RC2 g; CnRСЗ 1 RC04 У1 О 11)  04Wiz Разъем DB9 С04 С3 1.0uF С2 0.1 uF 27 pF С5 27 PF Рис. 8.5. USART, ПО,lJ,КJlЮ4енны к стаН,lJ,артному разъему ОВ9, с u.еJlЬЮ орrаннзаu.нн HHcpOpMau.HOHHOrO 06мена 4ерез интерсрес RS-232C Пример 8.5 1* * npMMep МСnОЛЬЗ0ваНМR npepblBaHM npM ра60те USART *1 #include <p18cxxx.h> #include <usart.h> 1* Установка 6мтов KOHMrypaUMM *  установка peMMa reHepaTopa HS *  BKnqeHMe cTopoeBoro таймера * - вклqенме нмзковольтноrо nроrрамммроваНМR * - OTKnqeHMe с6роса по qастмqной потере nMTaHMR разреwенме 06ero с6роса *  *1 #pragma config OSC HS #pragma config WDT OFF #pragma config LVP OFF 
fnaBa 8. Прерывання 351 #pragma config BOR = orF #pragma config MCLRE ON void MyHighInt (void); void MyLowInt (void); #pragma interrupt MyHighInt #pragma code high vector=8 oid high vector (void) asm GOTO MyHighlnt endasm #pragma interruptlow MyLowInt #pragma code low vector=Ox18 void lowvector (void) asm GOTO MyLowInt endasm 1I AaHHe в naMRTM AaHHX har inQueue[16]; har outQueue[16]; har inPi; ::har inPo; ::har outPi; ::har outpo; fpragma code nt outlnQueue (void) int temp; if (inPi == inPo) return Ох100; temp = inQueue[inPo]; inPo = (inPo + 1) & oxor; return temp; int inInQueue (char data) if (inPi == ((inPo + 1) & OxOF)) return Ох100; inQueue[inPi] = data; inPi = (inPi + 1) & OxOF; return О; int outOutQueue (void) II npoToTMn npoueAYP 1I 06слумваНМR nрерванмй II MyHighInt  зто npepBaHMe II highvector по аАресу ОхООО8 II всокоnрмормтетнй вектор II nepexoA на nOAnporpaMMY 06ра60ТКМ I1 BcoKonpMopMTeTHX nрерывани I1 MyLowInt  зто npepBaHMe II HM3KonpMopMTeTH вектор II по аАресу ОхОО18 I1 нмзкоnрмормтетнй вектор II nepexoA на nOAnporpaMMY 06ра60ТКМ I1 HM3KonpMopMTeTHx npepBaHM II 3Аесь начмнаеТСR nporpaMMH КОА II еслм пусто II nOnY4eHMe AaHHX I1 еслм заnоnнено 
352 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 int temp; if (outPi == outPo) return Ох100; temp = outQueue[outPo]; outpo = (outpo + 1) & OxOF; return temp; } int inOutQueue (char data) II eCnM nYC'l'O II nOnY4eHMe AaHHX if (outPi == ((outPo + 1) & OxOF)) return Ох100; II еслм заnоnнено outQueue[outPi] = data; outPi = (outPi + 1) & OxOF; PIE1bits.TXIE = 1; II nepeAaTqMK вкл. return о; } void MyHighInt (void) int temp; if (PIR1bits.RCIF == 1) { PIR1bits.RCIF = о; inInQueue (RCREG); II с6рос npepBaHMR II сохраненме npMHRTX AaHHX II в OqepeAM } else if (PIR1bits.TXIF == 1 && PIE1bits.TXIE == 1) { PIR1bits.TXIF = о; temp = outOutQueue(); if (temp == Ох100) { II с6рос npepBaHMR } else while (TXSTAbits.TRМT == О).; PIE1bits.TXIE = о; II nереДdЧМК вкл. TXREG temp; void MyLowInt (void) II nepeAa4a AaHHX II в Аанном npMMepe 3Аесь HMqero не АелаеТСR II rnaBHaR nроррамма void main (void) int temp; ADCON1 = OxOF; TRISC = Ох80; IPR1bits.TXIP 1; IPR1bits.RCIP 1; inPo = inPi = outpo = outPi = о; OpenUSART (USART_TXINT_ON & USART RX INT ON &  -  USART ASYNCH МОDЕ & - - II все nopT UMpoBe II nроrрамммрованме порта С 1/ B60p BcOKoro npMopMTeTa II HaCTpOKa 04ереАей II USART ра60тает на скоростм 9600 60А 
rлава 8. ITрерывання 353 USART EIGHT BIT &   USAl<.T CONT RX & USAl<.TBRGHHIGH, 25) ; RCONbits.IPEN = 1; INTCONbits.GIEH 1; прерваНМR INTCONbits.GIEL О; while (1) { temp  outlnQueue(); lf (temp ! Ох100) if (temp == 'С') { inOutQueue ('Н' ) ; inOutQueue ( 'е' ) ; inOutQueue ( '1' ) ; inOutQueue ( '1' ) ; inOutQueue ( 'о' ) ; inOutQueue(13); inOutQueue(10); else if (temp == 'G') inOutQueue ( 'G' ) ; inOutQueue ( 'о' ) ; inOutQueue ( 'о' ) ; inOutQueue ( 'd' ) ; inOutQueue ( 'Ь' ) ; inOutQueue ('у' ) ; inOutQueue ( 'е' ) ; inOutQueue(13); inou tQueue (1 О) ; II IPEN = 1 AnR разреwенмя II npMopMTeToB npepBaHM II разреwенме BcoKonpMopMTeTHoro II разреwенме HM3KonpMopMTeTHoro II npepBaHMR II поnученме AaHHX от ОК И3 InQueue II еслм AaHHe обнаруены II eCnM КОА С (соеАмненме) II nepeAa4a Н II nepeAaqa е II nepeAa4a 1 II nepeAa4a 1 II nepeAa4a о II nepeAa4a CMMBona II "возврат кареткм" II nepeAa4a CMMBona II "nepeBoA строкм" 1I eCnM КОА G (O'I'coeAMHeHMe) II nepeAa4a G II nepeAa4a о II nepeAa4a о II nepeAa4a d II nepeAa4a Ь II nepeAa4a у 1I nepeAa4a е II nepeAa4a CMMBona II "возврат кареткм" II nepeAa4a CMMBona "nepeBoA строкм" Ал Toro, 4т06ы зта nporpaMMa ра60тала с nK, He06xo,lJ,LI1MO, 4т06ы в nK ра60тало cooTBeTCTBYIOw,ee nрнложеНLI1е. Дn 3TO u.елн может нспользоватьс nРLl1nожеt.те Hyperterminal, нлн же AfI 3TO u.елн может 6ыть HanHcaHa KopOTKa nporpaMMa на Visual С++. PLl1C. 8.6 показывает сннмок зкрана nРLl1ложенн на Visual С++, HanLl1CaHHOro ДЛ TeCTHpOBaHH МНКРОКОНТРОJlлера н проrраммы нз прнмера 8.5. 
354 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Рис. 8.6. CHLI1MOK зкрана. Visual С++ nporpaMMa на Visual С++ с LI1ЛLl1 6ез уnравлеНLI1 ActiveX, Tpe6yeMa дл выnолне HLI1 Ha3BaHHO за,lJ,а4L11, nоказана в npHMepe 8.6. 3та nporpaMMa ра60тает с лю60 Bep cLl1e Windows, Ha4L11Ha Windows 98 LI1 вnлоть,lJ,О Windows ХР. Все, 4ТО не06ХОДLl1МО  зто Visual Studio лю60 32разр,lJ,НО BepCLl1L11 (Visual С BepCLl1L11 5.0 LI1ЛLl1 60лее HOBO), а так>ке 3HaHLI1e Toro, как C03,lJ,aIOTC nРLl1ло>кеНLI1 на Visual С++. 3то nРLl1ло>кеНLI1е (npLl1Mep 8.6 (а)) LI1сnользует 06ъект Active-X с LI1MeHeM mscomm дл уnравленн последовательным ИН TepcpeCOM, он С03,lJ,ан в Visual Studio.net 2003. .цл Toro, 4т06ы зто nРLl1ло>кеНLI1е cpYHK u.LI10НLI1ровало в ДРуrLl1Х BepCLl1X Visual Studio, мо>кет nOTpe60BaTbc HeKOTopa ero МОДИ cpLl1Kau.LI1, поскольку Мiсrоsоft nOCTOHHO LI13MeHeT некоторые аспекты 3Toro naKeTa. 06ъект mscomm ActiveX HaXO,lJ,HTC ЛLl160 в самом BaweM naKeTe Visual Studio, ЛLl1бо ero мо>кно BbIrpY3L11Tb Н3 Internet. Скорость н ,lJ,PyrLl1e параметры устанаВЛLl1ваютс в окне уnравлеНLI1 CBOCTBaMH Visual С. npHBO,lJ,LI1Ma 3,lJ,есь nporpaMMa - зто просто д06авле HLI1e к простому ,lJ,LI1алоrовому nрLl1ло>кеНLI1IО, которое LI1сnользует Button1 дл COe,lJ,LI1HeHLI1, Button2 дл разъе,lJ,нненн LI1 List1 дл выда4L11 cnHcKa, в котором от06ра>каются ответы МLI1кроконтроллера. Чт06ы ,lJ,06aBLI1Tb хзндлер KHOnKLI1 в Visual Studio.net 2003, w,еЛКНLI1те на LI1KOHKe >келтоrо cBeTw,eroc 60лта. Аве CPYHKu.LI1L11 KOMMYHLI1Kau.LI10HHOrO порта добав- лены к KJlaccy ,lJ,LI1алоrа, LI1СnОЛЬ3У мастер д06авлеНLI1 CPYHKu.LI1. .цл Toro, 4тобы зта nporpaMMa CPYHKu.LI10HLI1pOBaJla nраВLI1ЛЬНО, МLI1кроконтроллер ,lJ,ол>кен быть ВКJlЮ4ен до Toro. как зта nporpaMMa на Visual С на4нет выnолнтьс. Так>ке ну>кно У,lJ,остовеРLl1ТЬСЯ в том, 4ТО порт СОМ 1 nO,lJ,КJl104eH к МLI1кроконтроллеру. 
fnaBa 8. ITрерывання 355 npLl1Mep 8.6 (Ь) nOKa3bIBaeT, как 06paTLI1TbC HenOCpe,lJ,CTBeHHo к ,lJ,PY Windows с тем, 4т06ы свзатьс С СОМ- портом. ЕСЛLl1 уnравлеНLI1е ActiveX ,lJ,OcrynHo, то LI1СnОЛЬЗУЙ те ero, ПОТОМУ 4ТО В зтом cnY4ae nporpaMMa 6У,lJ,ет HeMHoro КОр04е, кроме Toro, 6удет LI1MeTbC BepOTHOCTb Toro, nO,lJ,npOrpaMMa ра60ТЫ С ,lJ,POM смо>кет ра60тать LI1 с 6yдy ЩLl1МН BepCLl1MLI1 Windows. Пример 8.6 (а) Joid OpenComPort() mscomm1.putCommPort(1); mscomm1.putInputLen(1); mscomm1.putRThreshold(1); II B60p СОМ1 mscomm1.putPortOpen(true); II BbrrrOnHeHMe OnComm AJIR KaAOPO II npMHRToro CMMBona II OTKpTMe СОМl 70id CPICCDlg: :OnBnClickedButton1() II KHorrKa соедмнеНМR int temp; CString message; WriteComPort ("С"); II nередаqа "с" oid CPICCDlg: :OnBnClickedButton2() II кнопка разъедмнеНМR int temp; CString message; WriteComPort ("G"); I1 nередаqа "G" Jid CPICCDlg: :WriteComport (CString data) mscomml.put_Output(COleVariant(data)) ; 1I rrередаqа строкм oid CPICCDlg: :OnCommMscomml() CString temp; if (comm.get CommEvent() { 2 ) II 2 rrpMHRT симвоn event do { temp += comm.getInput(); }while (comm.getInBufferCount() > О); } Lis1.AddString (temp); 
356 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Пример 8.6 (б) HANDLE hPort; ОСВ dcb; II onpeAeneHMe x3HAnepa II onpeAeneHMe 6noKa ynpaBneHMR void CPICCDlg: :OpenCom (CString port, DWORD baudrate) СОММТIМЕОUТS Timeout; hPort = CreateFi1e ( port, GENERIC WRITE О, NULL, OPENEXISTING, О, NULL) ; GetCommState (hPort,&dcb); dcb.BaudRate = baudrate; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; SetCommState (hport,&dcb); GetCommTimeouts (hPort, &Timeout); Timeout.ReadIntervalTimeout = 500; Timeout.ReadTotalTimeoutConstant = 500; Timeout.ReadTotalTimeoutMultiplier = 100; Timeout.WriteTotalTimeoutConstant = 509; Timeout.WriteTotalTimeoutMultiplier = 100; SetCommTimeouts (hPort, &Timeout); II структура TaMaYTa II С03Аанме X3HAnepa AnR COMnopTa GENERICREAD, II установ COCTORHMR COMnopTa II скорость MH.06MeHa II 8 MHopMaUMoHHX 6мтов II 6ез napMTeTa II 1 cTon6MT II установка TaMaYTa COMnopTa void CPICCD1g: :SendPort (CString str) { DWORD byteswritten; WriteFile (hPort, str, 1, &byteswritten, О); return; CString CPICCDlg: : ReadPort (void) { char mes[100]; DWORD transferred; DWORD error; COMSTAT status; do { ClearCommError hport, &error, &status); mes[status.cbInQue] = о; ReadFile (hPort, &mes, status.cbInQue, &transferred, О); while (status.cbInQue == О); II пока AaHHe не 6УАУТ npMHRT return mes; II X3HAnep ComnopTa II указатеnь на KOA oWM60K II указатеnь на COcToRHMe 
[пава 8. ITрерывання 357 8.3. Прерывания по змененю состояния ВходаМL/1 npepbIBaHL/1 по L/1зменеНL/1Ю COCTOHL/1 влютс 6иты ОТ АВ4 до АВ7 nop та В. ЕСЛL/1 npepbIBaHL/1e по L/13MeHeHL/11O COCTOHL/1 разреwено, L/1 порт В заnроrраммиро ван как BXOДHO порт, то npepbIBaHHe 6удет nрОL/1СХОДНТЬ в СЛУ4ае L/1зменеНL/1Я СОСТОЯНИЯ лю60rо нз названных 4етырех выводов. 3то CBOCTBO мо>кет 6ыть полезно во MHOrL/1X npL/1JlO>KeHL/1x. ЕСЛL/1 nрОL/1СХОДL/1Т L/13MeHeHL/1e COCTOHL/1 лю60rо L/13 названных выводов, то прОL/1СХОДL/1Т npepbIBaHHe по L/1зменеНL/1Ю COCTOHH, n03TOMY не за6удьте проверять зти четыре штырька в npou.e,lJ,ype 06СЛУ>КL/1ваНL/1 npepbIBaHL/1 с тем, 4т06ы определить ТОЧ но, KaKO Т04НО вывод L/1змеНL/1Л свое COCTOHL/1e, еСЛL/1 nриложеНL/1е L/1сnользует 60лее ОДlюrо штырька. В rлаl3е 5 06суждалось nporpaMMHoe 06eCne4eHL/1e CL/1CTeMbI DСС (уnравлеНL/1е при nOMow,L/1 u.L/1CPPOBbIX коман,lJ, (макетом >келезно ,lJ,oporL/1)), а так>ке опрос BxoAHoro штырь ка с тем, чт06ы L/13MepL/1Tb WL/1pL/1HY L/1мnульса. О,lJ,нако ЛУ4WL/1 cnoc06 L/1змереНL/1 ШL/1рL/1НЫ импульса свзан с L/1СnОЛЬЗ0ванием npepbIBaHL/1 по L/1змененню состояни, а так>ке тай- мера. npL/1 таком подходе МL/1кроконтроллер мо>кет заНL/1матьс друrИМL/1 делами, изме p в то >ке BpeM ШНрL/1НУ L/1МnУЛЬСОВ СL/1rналов. V13 rлавы 5 вы узнали, 4ТО CL/1I"HaJl DСС исnользует СL/1rнал лоrL/14еско еДННL/1u.ы, KOTOPЫ L/1MeeT ШL/1рL/1НУ L/1мnульса ме>КДу l3ысо- KL/1M L/1 HH3KL/1M COCTOHL/1eM СL/1rнала, paBHYIO от 52 до 64 мкс. БL/1Т лоrL/14ескоrо нуля HaMHO ro 60nee WL/1POKL/1 L/1 L/1MeeT ШL/1рL/1НУ L/1мnульса между BbICOKL/1M L/1 НL/1ЗКL/1М состоянием сиr нала, равную от 90 мкс ДО 10000 мкс. nреДnОЛО>КL/1М, 4ТО схема, L/1з06ра>кенна на рис. 8.7, nО,lJ,КЛЮ4ена к рельсам в CL/1CTeMe ОСС. СL/1лова ML/1KpOCXeMa 75441 О 06eCne4L/1BaeT ток вплоть до 1 А, npH Hanp>KeHHH в 12 В на каждом L/13 ВЫХО,lJ,НЫХ выводов, KorAa она аКТL/1ВL/1рОl3ана СL/1rналом уnравлеНL/1, KOTOPЫ nередаетс по рельсам L/1 06нару>кивается МL/1КрОКОНТрОJlлером. Восемь выходных выводов уnравлют лю60Й ком6L/1наЦL/1ей из восьми отдельных устройств L/1ЛL/1 >ке 4eTыpbM двунаnравлеННЫМL/1 устройствами TL/1na стреЛ04НЫХ nрL/1ВОДОВ. Как L/1 ОnL/1сывалось в rлаве 5, СL/1rнал на рельсах злеКТРL/14еСКL/1 L/1ЗОЛL/1рован от cxe мы OnTL/14eCKO pa3B3KO. СL/1rнал на рельсах nоказан на рис. 5. 4, после ero КОНДL/1ЦИО- НL/1ровшт он npL/106peTaeT ВL/1Д ттл СL/1rнала, nрL/1ло>кенноrо к выводу АВ7 ML/1KpOKOH троллера. nporpaMMa, HanL/1CaHHa дл 3TO схемы, nрL/1ведена в npL/1Mepe 8.7. Кажды раз npH L/1зменеНL/1L/1 COCTOHL/1 АВ7 nрОL/1СХОДL/1Т npepbIBaтe. 04ень ва>кно, 4т06ы РОАТВ С4L/1тывалс перед 04HCTKO 6нта срлаrа RBIF в nроu.едуре 06СЛУ>КL/1ваНL/1Я прерывани. ЕСЛL/1 РОАТВ не 6удет C4L/1TaH перед 04L/1CTKO 6L/1Ta срлаrа RBIF, то УСЛОВL/1е L/1зменени OCTaHeTC L/1CTL/1HHbIM н 6L/1T RBIF 6удет немедленно установлен после ero с6роса. В про цедуре 06СЛУ>КL/1ваНL/1 npepbIBaHL/1 nереKJlЮ4еl:lL/1е L/13 нул в еДL/1НL/1u.у с6расывает таймер О, эту >ке onepau.L/11O выnолнет L/1 nереKJlЮ4еНL/1е L/13 еДL/1НL/1u.ы в ноль - раЗНL/1ца заключаст СЯ в том, 4ТО коrда вход L/1зменетс L/13 едютu.ы в ноль, то исследуется содержимое TaMepa О. TaMep О OTC4L/1TbIBaeT L/1HTepBanbI, равные OДHO 4етвертой 4aCTL/1 ML/1KpOCe кунды, при зтом, еСЛL/1 ero ОТС4ет 6удет HaXO,lJ,L/1TbC Me)l(,lJ,y 52*4 L/1ЛL/1 208 (52 мкс) и 64*4 ИЛL/1 256 (64 мкс), то содеРЖL/1мое 4eKL/1 naMTL/1 nepeMeHHo L/1змеНL/1ТСЯ на Ох01 и флаr R4eKL/1 naMTH 6удет установлен, YKa3ЫBa на актуальные данные. Аналor"L/1ЧНЫМ 06pa 30М, еслн TaMep О 6удет содер>кать 4L/1СЛО между 90*4 L/1ЛL/1 360 (90 мкс) L/1 10000*4 или 40000 (10 мс), то nepeMeHHa c6paCЫBaeTC в ноль, cpJlar устанаВЛL/1ваетс, указывая на pacn03HaHHbI лоrL/14еСКL/1 ноль. AaHHa CL/1CTeMa замерет только время BbIcOKoro co CTOHH входноrо снrнала, n03ToMY она реально oT06pa>KaeTC данные, nОЛУ4енные с рельсов. CL/1CTeMa, OnL/1CaHHa в rлаве 5, замерла как BpeM BbIcoKoro, так и НL/1зкоrо COCTOHL/1 СL/1rнала. 
Track +5У LМ78LО5СIТО92 8N1З7 4 U4 З I о I 1 I Vout Z Viп I J.. с!) .....r"' С5 N 100 uF ...J...... С1 ( R4 R5  PIC18F1220 0 .1 uF ( 101< 10К> :: U2 SN754410 RЗ U1 > 10К 1 RAO °RВO 8 2 1А 1У 3 8ЫХО 2 gRB1 9 7 6 SW1 6 RA1 17 10 2А 2У 11 выхо' ,...........+. RA2 RB2 18 15 ЗА ЗУ 14 8 Ь!ХО.  З RАЗ RВЗ  4А 4У ВЫХО + 4 RA4 REИ ............+ tlМCLR RB5 Rt: 112EN 16 OSC1 (l)Rвe  З/4ЕN реконфиryрирование < R 15 ОЗС2 RB7 13 1C 16 0000 <  УСС1 zzzz 8 11) УСС2 С!)С!)С!)С!) i 4MHz JII)JI 7 У1 6 Н О r-----  +12У UЗ SN754410 11) СЗ С2 2 1А 1У З ВЫХОД 7 6 .uf 127" 1, 10 2А 2У 11 ВЫХОД 15 ЗА ЗУ 14 ВЫХОД 27 pF 4А 4У выход  1I2EN  З/4ЕN 16 VCC1 0000 8 zzzz УСС2 с!)с!)с!)с!) .1I1)j11   Рис. 8. 7. 80СЬМИВЫХОДНОЙ контроллер периферийных устройств системы ОСС w VI 00 дО дl д2 дЗ :::! '"cj :s: :: (t) ::t: (t) ::t: :s: (t) :: :s: ::<: '"cj о ::<: о ::t: .а о   (t) '"cj о '= ""'о n 00 7 6 5 4 
fnaBa 8. ITрерывання 359 Рис. 5. 6 L/1ЛЛЮСТРL/1рует реальные данные, посыпаемые, на устройство управле ния. Проrрамма по примеру 8.7 paCn03HaeT акryальные зна4еНL/1Я данных в 6есконечном цикле while rлавно nporpaMMbI. 3та nporpaMMa дол>кна 6ыть cnoc06Ha распознавать два TL/1na naKeToB: пакеты, уnраВЛIOw,L/1е COCTOHL/1ML/1 восьмн выходов L/1 друrL/1е пакеты, проrраММL/1руюw,L/1е YCTPOCTBO. npOrpaMML/1pOBaHL/1e YCTpOCTBa оrраНL/1чено установкой адреса контроллера BCnOMoraTeJlbHoro YCTpOCTBa. Адрес BCnOMoraTeт)Horo устройст- ва coxpaHeTC в 4eKax naMTL/1 данных зсnnзу CV513 (управляюw,ая nеременная 513) L/1 CV521 , rде CV513 содеРЖL/1Т младшую 4асть адреса YCTpOCTBa (А5-АО), а CV521 содеРЖL/1Т старШL/1е TpL/1 6L/1Ta адреса YCTpOCTBa (A8A6). TpL/1 старшие 6ита адреса L/1H вертированы. TaKL/1M 06раЗ0М, при заnL/1СL/1 адреса всnомоrателы-юrо устройства Ох074 значеНL/1е в CV51 3 6удет равно Ох34, а 3Ha4eHL/1e в CV521  Ох06. На4аЛЫ.lые значения в CV513 L/1 CV521- ОхОО. 3то ОЗI-ta4ает, что nервоначалы-ю адрес всnомоrателы-юrо YCT ройства равен Ох1 СО L/1ЛL/1 448 В деСТL/14НО CL/1CTeMe С4L/1слеllL/1. 3тот адрес L/1ЗМGНЯGТСЯ передачей команд CV на 6лок командноrо уnравлеНL/1 CL/1CTeMbI. Всnомоrательное уст- POCTBO может 6ыть c6poweHo на заВОДСКL/1е YCTaHOBKL/1 командаМL/1 CV513 L/1 CV521 = ОхОО. nOBTOpHbI с6рос выnолнетс удер>каНL/1ем KHOnKL/1 npH ВKJlЮ4еНL/1L/1 системы. Биты ааа команды, L/1з06ра>кенные на pL/1CYHKe 5-6, L/1СnОЛЬ3УЮТС ДЛ Toro, 4т06ы вы6рать ОДL/1Н L/13 восьмн выходов CL/1CTeMbI. В данном СЛУ4ае 000 BbI6L/1paeT выход О. 001 BbI6L/1pa ет выход 1 L/1 т.Д. БL/1Т С  зто ,lJ,анные, посылаемые на выход. В 3TO CL/1CTeMe, еСЛL/1 С = 1, то на выход nодаетс 12 В npH токе до 1 А, а еСЛL/1 С = О, выход не 06есnеЧL/1вает никакоrо тока. 3TL/1 команды rенеРL/1РУЮТС 6локом командноrо уnравлеНL/1Я ТL/1па, которые ПрGД лаrаlOТСЯ TaKL/1ML/1 cpL/1pMaML/1, как Digitrax L/1ЛL/1 Lenz. nроеКТL/1рование также может 6ыть выполнено с L/1СnОЛЬЗ0ваНL/1ем ДРуrо МL/1кроконтроллерно CL/1CTeMbI. Пример 8.7 * Орммер АеКОАера BCnOMoraTenbHoro YCTpOCTBa DСС *1 finclude <p18cxxx.h> *inc1ude <timers.h> х Установка 6мтов KOHMrypaUMM  установка реима reHepaTopa HS ВЫКЛ4еIlме cTopoeBoro таймера вкnченме HM3KoBonbTHoro nроrрамммроваНМR ОТКn4ение с6роса по 4acTM4Ho потере nMTaHMR разреwенме 06ero с6роса "1 :tpragma :tpragma :tpragma tpragma 'pragma config OSC config WDT config LVP config BOR config HCLRE HS OFF OFF OFF ON oid MyHighInt (void); oid MyLowInt (void); II npoToTMn npoueAYP II 06cnYMBaHMR npepBaHM fpragma interrupt MyHighlnt :tpragma code highvector=8 70id highvector (void) II MyHighInt  зто nрервание II high_vector по аАресу ОхОО08 II всокоnриормтетн вектор 
360 ITpHMeHeHHe MHKpOKOHTpOnnepOB РI С 18 asm GOTO MyHighInt endasm всокоnриормтетнх nрервани } II nepexoA на nOAnporpaMMY 06ра60ТКМ #pragma iлtеrruрtlоw MyLowlnt #prgma code low vector=Ox18 II MyLowlnt  зто npepBaHMe 1I нмзкоnриормтетн вектор по аАресу ОхОО18 void lowvector (void) II HM3KOnpMOpMTeTHbrn вектор asm GOTO MyLowInt endasm II nepexoA на nОАnроrрамму 06ра60ТКМ II HM3KonpMopMTeTHx nрерванмй II naMRTb AaHHX char flag; char data; II nar AocTYnHocTM AaHHX II ******** npMcBoeHMe аАресов AaHHX в naMRTM AaHHX эсппзу ******** #define СVS1З О #define CV521 1 1I MnaAwaR qaCTb аАреса II cTapwaR qaCTb аАреса #pragma code II 3Аесь HaqMHaeTCR nроrраммньrn КОА II C4MTBaHMe М3 аАреса MeCTorronoeHMR RqeKM в nаМRТИ AaHHX эсппзу char eeRead (char address) { EECON1bits.EEPGD = о; EEAOR = address; EECON1bits.RD = 1; return ЕЕОАТА; II заnмсь AaHHX в R4eKY naMRTM AaHHX ЭСDDЗУ по аАресу void eeWrite (char address, char data) { INTCONbits.GIEH = о; INTCONbits.GIEL = о; EECON1bits.EEPGD = о; EECON1bits.WREN = 1; EEAOR = address; ЕЕОАТА data; EECON2 = OxSS; EECON2 = ОхАА; EECON1bits.WR = 1; while (PIR2bits.EEIF О); PIR2bits.EEIF = о; EECON1bits.WREN о; INTCONbits.GIEH 1; INTCONbits.GIEL 1; void MyHighlnt (void) 
[пава 8. ITpepbIBaHHSI 361 if (INTCONbits.RBIF == 1) { int temp = PORTB; II HYHO С4мтать PORTB AnR с6роса M3Me "eHMR INTCONbits.RBIF == о; if (PORTBbits.RB7 О) { II с6рос npepBaHMR if (ReadTimerO() { О) 1I nepBM4Hoe OpenTimerO (TIMERINTOFF & ТО 16BIT & ТО SOURCE INT &  - TOPS 1 256); } else if (ReadTimerO() < 4 * 52) WriteTimerO(O); 1I неверное 3HaqeHMe, с6рос TaMepa else if (ReadTimerO() >= 4 * 52 && ReadTimerO() <= 4 * 64) WriteTimerO(O); data 1; f1ag = 1; 1I KoppeKTHaR 1, с6рос таймера О } e1se if (ReadTimerO() >= 4 * 90 && ReadTimerO() <= 4 * 10000) WriteTimerO (О); data О; flag = 1; II KoppeKTH О, с6рос TaMepa О } else II bad data WriteTimerO (О); 1I с6рос TaMepa О } else WriteTimerO (О); 1I с6рос rro еДМНМ4НОМУ nepeKnqeHM oid MyLowlnt (void) I1 в этом npMMepe ЗАесь HMqerO не вnоnняется :har wait4Bit (void) while (flag  О) ; flag == о; return data; :har getByte (void) char temp = о; int а; for (а = о; а < 8; а++) temp «= 1; II OMAaHMe 6мта 1I npMeM 6айта 
362 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 temp 1= wait4Bit(); } return temp; 1I rnaBHaR nporpaMMa void main (void) char check; char со\ш t; char packctBytesl6]; in t а; char mask; ADCON1 = OxOF; TRISA о; TRISB = Ох80; PORTA  PORTB = flag if (PORTAbits.RA4 == eeWrite (CV513, О); eeWrite (CV521, О); } INTCON2bits.RBIP = 1; INTCONbits.RBIE = 1; WriteTimerO (О); RCONbits.IPEN = 1; INTCONbits.GIEH 1; INTCONbits.GIEL о; while (1) { count = О; whi1e (count != 10) 11 все порт ЦMpOBe 11 nроrрамммрованме наnравnенмя о; О) I1 eCnM BnonHReTcR реКОНМI'урирование 11 всокмй npMopMTeT 11 разреwенме nрерванмя по мзмеlIенмю БИ'l'а 11 мнмцмаnмзацмя TaMepa О 11 IPEN = 1 AnR разреwеНМR нрморите'l'ОВ nрерванмй 11 разреwенме ВСОКОnрИОрМ'l'еТНОI'0 nрерЫJ3аНМR 11 раэреwенме HM3KonpMOpMTe'l'HOrO npepBaHMR I1 pacn03HaBaHMe заrоnовка, COCTORero 11 по KpaHe мере мз 10 еАМНМЦ else if (wait4Bit() 1) count++; count = о; while (wait4Bit() == 1); 11 OMAaHMe AOnOnHMTenbHX еАМНМЦ 1I rrporrycK заrоnовка в это Т04ке count = о; do ( 1 I n0nyqeHMe всех 6aTOB naKe'J'a packetBytes[count++] while (wait4Bit = О); getByte(); I1 n0nyqeHMe всех 6айтов naKeTa count for (а = О; а < count; а++) check Л= packetBytes[a]; KOnM4eCTBY 6aTOB 
[пава 8. ITpepbIBaHHSI 363 if (check == О) { 1I npaBMnbHaR KOHTpOnbHaR сумма if ((packetBytes[O] & Ox3F) == eeRead(CV513) && (( (packetBytes [1] » 4) & Ох07) л Ох07) eeRead (CV521)) 1I соответСтвие аАрсса if (count == 3) 11 eCnM комаНАа ( mask = 1; mask «= packetBytes[l] & 3; if ((packetBytes[l] & 4) == О && (packetBytes[l] & 8) == О) PORTB &= mask л О xFF; e1se if ( (packetBytes [1] & 4) О && (packetBytes[l] & 8) 8) PORTB 1= mask; e1se if ( (packetBytes [1] & 4 ) 4 && (packetBytes[l] & 8) О) PORTA &= mask л OxFF; e1se PORTA 1= mask; } e1se if (count == 5) 11 ecnм комаНАа rrроrpамммроваНИR CV if ((packetBytes[l] & 3) == 2 && packetBytes[2] == О) I1 if CV513 eeWrite(CV513, packetBytes[3]); e1se if ((packetBytes[l] & 3) == 2 && packetBytes[2] == 8) 11 if CV521 eeWrite(CV521, packetBytes[3]); 111111111 О 10АААААА О OAAAllaa О аяяяяа О DDDDDDDD О хххххххх 1 i \ i preamble Data for CV CV address Рис. 8.8. Всnомоrательна команда ДЛ nроrраммирования реrистра CV Форматы naKeToB nроrраммировани а,о,ресов вспомоrательных устройств в CV513 (адрес Ох200) и CV521 (а,о,рес Ох208) nоказаны на рис. 8.8. 3ти пакеты содержат nTb байтов вместо трех байтов в СЛУ4ае команд декодера всnомоrатеЛЫ-lЫХ устройств. Адреса CV на4инаlOТС от CV1 (ОхООО), таким обраЗ0М, CV51 3 nроrраммируетс на aд рес 512 (Ох200). 
364 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 8.4. Примеры систем, работающих с прерываниями 3тот nодраздел nредставлет HecKonbKo систем, работаlOw,их с прерыванинмн с тем 4тобы вы моrли ИСnОnЬЗ0вать их nибо в ка4естве nрактических примеров, либо в качестве образu.ов реwений. Чем боnьwее КОЛИ4ество систем вы И3Уt.\ите, тем более опытными вы станете в nроrраммировании и орrанизации интерсрейсов. Пример системы 1 Первой системой, KOTOPYIO мы рассмотрим, будет система, о которой мы уже ro ворили в rлаве 2. 3та система реrистрнровала инсрормаЦLl1Ю Н3 идентнсрнкаЦLl10НIIЫХ карточек и nepeAaBana ее по последовательной линнн СВЗLl1 в центральную perHcTpH РУlOщую KOMnblOTepHYIO систему. 3та система содержит последовательный LI1IIlерсрейс, ЖКНIlДикатор и вспомоrательнуlO кnавиатуру. 3та система моrла бы ИСnОЛЬЗ0ваться либо как система табелироваНИ1 реrИСТРНРУlOща рабочие 4асы работника, либо как система реrистрации посещаемости У4еников в школе. Однако, как бы она не исnоль зоваnась, эта система нуждаетс в nрерываних дл работы таймера реальноrо BpeMe ни, обработки чисел, С4итанных с идентисрикаu.LI10ННОЙ карточки, а так>ке дл обработки ,lJ,анных, передаваемых по nосnедовательной линии СВ3И. 3та система исnользует MHoro nрерываний  она заслуживает более noAp06Horo иссnедовани. Теперь, KorAa вы имеете концептуальное видение системы, следует выбрать ее компоненты перед тем, как nрисrynнть к разработке. В зтой системе необходимы сле ДУlOщие компоненты: 1. Микроконтроллер (тип KOToporo будет опрделен позже). 2. ЖКV1 на две строки по 40 символов 13 строке. Две строки необходимы дЛЯ TOIO, чтобы отобразнть идентисрикационны код служащеrо н ero им, а также сообщеНLI1е, адресованное ему. З. Оптический считыватель карточе'к. Mor бы быть выбран маrнитный считьшатеllЬ каРТ04ек, однако он потребовал бы ИСnОЛЬЗ0вани сnеu.иальноrо оборудованн, пред Ha3Ha4eHHoro ДЛ изrотовлени маrнитных идентисрикационных карточек. В то же Bpe M ОnТИ4еские идентификаu.ионные карточки MOryт быть созданы на обычных COBpe менных nринтерах, единственное сnеu.иальное оборудование, которое необходимо в этом СJlучае  зто устройство ДЛ ламинированн каРТО4ек. 4. Простой совместимый с nK последовательный интерфейс, KOTOpЫ исnоnьзует витую пару npoBoAoB. Мо>кет nотребоватьс, чтобы линии 3Toro интерсрейса быnи дoc таТ04НО длинными, поэтому использование USB влетс неnриемлемым, ибо он дo пускает длину npOBO,lJ,a Bcero лишь 13 несколько метров. Выбор интерсрейса будет обсу ждатьс nозже в этом nодразделе. 5. Клавиатура. Поскольку дaHHa система должна быть леrка в ИСnОЛЬЗ0вании без nрименени какихлибо сnеu.иальных кодов, мала клавиатура телесронноrо стил Ile peKOMeHдyeTC, так как она не имеет достаточноrо КОnИ4ества клавиш. Необходимое 4ИСЛО кnавиw и их срункu.ии 6удут обсуждатьс позже в этом nодразделе. 6. V1сточник ЭJlектроnитани. Если исnользуетс источник электроnитани, YCTa новленный на расстонии, то исnользуйте ,lJ,ве витые пары npoBoAoB,  одну для nодво да электроnитани к 6локу, а ApyrylO - ДЛ передачи nоследователы-\ых данных. Две пары телесронных npoBoAoB илн провод типа САТ5 (катеrори 5) моrли бы быть xopo wим вы60РОМ дл кабеJl. Кабель СА Т5 широко распространен и содержит четыре пары npoBoAoB, что более, чем достаТ04НО ДЛ AaHHoro nрименени. В качестве соединн тельных разъемов дол>кны ИСnОЛЬЗ0ваться разъемы типа RJ-45. 
I  ;> R3 PIC18F2580 С2 ? 10К  0.1 uF 5х4 > U1 N Keypad 2 RAO Q RBO 21 1 2 3 Fl F21 3 Q 22 4 RA1 > RB1 23 L 5 RA2 RB2 24 4 5 6 F3 F4 6 RАЗ RB3 КА 7 RA4 RВ4 26 7 8 9 F5 F6 10 RA5 RB5 27 RA6 RB6 * О # F7 F8 JP1  RA7 RB7 28 1 MCLR RC4 15 I I 11 RCO RC5 16 1 , ....' 5 12 17 \'. 4. ) 13 RC1 RC6 П С3 .......... RC2 (J) (J) RC7 2 4 14 RC3   -..........:: 1.0 uF Т   (") 810t Reader ф Initialize --=-=- R4 10К Е RS МАХ1483 ..... О4 U4 ф L........... О5 U2 L7805/T0220 J1 ............... О6 LCD  О! u RO ....1......... О7  u 4 Q V. I 1 1 а> Vout 3 Qf. А 6 z In I   z  (!) .......1.... RE (!) В УОО УЕЕ VSS RJ#W 4 То САТ5 1 J 1 Т (") .5 \l) С1 I R1 10 uF .........L.  А 8 у...., I 10К 1 l  "" 1 RJ5 уу   120 R2 Рис. 8.9. Система С4итывания идеНТLI1фикационных карТ04ек. СхемотеХНИ4еское решеНLI1е '"1   t:P  ?о :::! "1:j (1) "1:j Е: t:P  :I: ::s:: ;:Q lN 0'\ v\ 
366 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Микропроцессоры PIC с 18 выводами, BepOTHO, не CMOryт обесnе4ИТЬ КОllичест во выводов, достаточное ДЛ 3Toro nрименени. Необходимо, следовательно исnоль З0вать микроконтроллер с 28 штырьками. ЖКиндикатор требует ИСnОЛЬЗ0вани шестн nОДКЛlO4ений, а клавиатура, BepOTHO, потребует ,lJ,евти nО,lJ,KJl104ений, если принть, 4ТО всnомоrательна клавиатура 5х4 будет достаТ04на. Еслн учесть, 4ТО несколько ВЫВО,lJ,ОВ nотребуlOТС ДЛ nоследовательноrо nОДKJl104ени и HCCKOllbKO  ДЛ оптиче- cKoro С4итывател каРТ04ек, то можно nреДnОЛОЖLl1ТЬ, микрокоlЛ роллер с 28 ШТЫРi)ка ми 6удет nриемлемым выбором ДЛ Toro, 4тобы уnравлть зтой системой. Вебсайт фирмы Microchip рекомендует микропроцессор PIC18F2580, который имеет 32кб rlамя- ти nporpaMMbI, 1536 байт СЗУПВ, и 256 байтов 3СППЗУ, 4ТО должно обесnеЧLl11Ъ доста- Т04НЫЙ объем nамти ДЛ этой системы. Предположим, 4ТО идентификаu.LI10нные номе- ра служаw,их оrраНИ4ены в длину 1 О anфавитноцифровыми символами. Еслн 412 бай тов СЗУПВ ИСnОЛЬ3УIOТС ДЛ резервноrо хранение идентнфикационных номеров, то это 0зна4ает, 4ТО имеетс место ДЛ сохранени 41 идентификаu.ионноrо номера. В редких СЛУ4ах, KorAa CB3b с ПК HapywaeTc, идентификационные номера должны временно coxpaHTbC в системе. ОстаlOw,иес 6айты СЗУПВ AalOT объем nамти, более 4ем достаТ04НЫЙ ДЛ реwени ЛlOбой зада4И, KOTopa должна выnолнитьс в данной системе. В ка4естве ОnТИ4ескоrо С4итывател каРТ04ек в этой системе выбран сканируlO w,ий модуль Opticon LCO SR, который имеет выходной сиrнan ТТЛуровн. Выход 3Toro модул noAaeTc на 5-выводной разъем типа DIN, на вывод 1 KOToporo nО,lJ,ается 5 В, на вывод 2  выходной TLL и на вывод 3  земл. Рис. 8.9 ИЛЛlOстрирует IIРИllциrlнальнуlO схему системы, ВКЛI04а nОДKJl104ение С4итывател каРТ04ек. Кабель САТ5 исnользует 7 И3 8 npOBOAOB, есЛи только в системе lIе ИСnОЛЬ3УIOТС nовторителн, - в этом СЛУ4ае nотребуетс одна доnолнительна лини. При зтом самые крайние проводники разъема (выводы 1, 2, 7 и 8) ИСnОЛЬ3УIOТС.o.n nода4И злектроnи- тани от блока nитани BeAyw,ero ПК на Ka>K,lJ,bI И3 16 С4итывателе идентифнкацион ных каРТ04ек, nОДКЛlO4енных к системе. Более 16 отводов Moryт ИСnОЛЬЗ0ватьс, еСJlН на линии установлен повторитель. Система ИСnОЛЬ3У8, CTaHдapTHЫ интерфейс RS 422, длина кабел KOToporo может достиrать вплоть до 4000 футов, Т.е. иметь в длнну почти МИЛIO. Аифференциальны сиrнал данных nepeAaeTc по центральным проводам (выводы 4 и 5). ОстаlOщиес nОДKJl104ени, за ИСКЛlO4ением вывода 3, который И,lJ,ет от модул nитани и BKJl104aeT линию на nовторителх, не НСnОЛЬ3УЮТС. 3та систсма сконфиrурирована как nолудуnлексна система, 4ТО 0значает, 4ТО одновременно ТОJlЬ- ко одно устройство может передавать данные, в то BpeM как все друrие YCTpOCTBa системы будут принимать данные. МАХ 1483  это микросхема драйвер лн- нии/приемник, выбранна ДЛ этой системы. Режим ее работы (драйвер ли- нни/nриемник), оnределетс состонием вывода ОА/НЕ. Если он находитс в COCTO нии лоrИ4еско единицы, то активируетс драйвер линии, и модуль посылает данные в ПК или на u.ентральный пульт. Если вывод ОА/НЕ nереводитс в СОстоние лоrическоrо нул, то приемник линии становитс активным и система nОЛУ4ает данные И3 ПК. Вывод АА6 уnравлет направлением переноса данных от МАХ 1483. Рис. 8.1 О ИЛЛlOстрнрует ра60ТУ ПК и Ka>K,lJ,OrO ее отвода или систем С4итывани идентификаu.ионных каРТ04ек, nОДКЛlO4енных к одному кабелlO. ФаКТИ4ески, имеетс один доnолнительны компонент системы, который 06ЪCHeTC в при мере снстемы 2, который nриводитс далее в этом nодразделе. Центральный пункт так>ке требует ис- nОJlЬЗ0вани системы, обесnе4иваюw,ей CB3b Me)l(,lJ,y ПК и ceTblO RS-422. 3та Apyra снстема, Ha3ЫBaeMa силовой системой, с одной стороны обесnе4ивает злектроnита- ние сети, а с Apyro - формирует интерфес Me)l(,lJ,y ПК и ceTblO. Минимальный вариант системы тре6ует наЛИ4И двух 4астей: силовой системы, KOTopa соединетс с ПК, и 
[пава 8. ITpepbIBaHHSI 367 ,:;нстемы С4итывани идентификационных каРТ04ек. 3та система может масштабиро- ваться nОЧТLI1 до ЛlOбых размеров, однако излаrаемый вариант nporpaMMHoro npoeKTa :::>rраНИ4ен обслуживанием до 1000 С4итывателей идентификационных каРТ04ек. 3то .:щлжно обеспечить возможность установки TaKoro 4исла блоков, которое ,lJ,олжно быть .:\остаточно n04ТИ дл ЛlOбоrо nриложени. Кюкда секци системы может иметь до 15 С4нтывателей И,lJ,ентификаu.нонных (аРТ048К плюс повторитель. Что не отображено на nриведенной схеме, так зто то, что В :;лучае НaJ1И4ИЯ повторителей нужно ИСnОЛЬЗ0вать доnолнительнуlO сиrнальнуlO лнниlO, (ОНТРОЛИРУlOщуlO направление работы nовторител. Более подробно этот вопрос будет знализнроваться nозже в данном nодразделе при рассмотрении силовых систем. ПК, 'lОДКЛlO4енный к силовой системе, оБЫ4НО находитс в режиме передачи информации, 3 все повторители и С4итыватели идентификационных каРТ04ек оБЫ4НО HaXOДTC в ;Jежиме приема информации. KorAa ПК опрашивает С4итыватель идентификационных карТ04ек, то лини реверсируетс и ПК становитс nрнемником данным, - линией при этом управляет один И3 считывателей идентнсрикационных каРТ04ек. 3то nОJlУ,lJ,уплекс- --IЫЙ режим работы. Таблица 8.1. Команды системы С4итывани ндентификационных каРТ04ек Байт Команда :06 АСК :21 NAK :117 TIME нн ММ SS ММ оо УУ УУ crc :'"( 18 READ addrcss crc :'"( 19 SEND packct crc :1la SEТID address newaddrcss crc :1"( 1 ь SEТIDL length crc Комментарий Подтверждение приема Неrативное подтверждение приема Трансляция даты и времени от ПК в считыватели информацион- ных карточек (уу уу) передается как 20 06 (посылается NoACКJNAK) Запрос данных из считывателя информационных карточек Адрес равен (LL НН) (передается ACКJNAK) Передает номер идентификационной карточки в форме rшкета на ПК ПРOI'})аммирует номер идентификационной карточки Адрес равен (LL НН) (передается No ACK,NAK ) Установка длины идентификационноrо номера (No ACКJNAK) J:римечания: crc == контрольная сумма; address == адрес; packet == пакет; new address == новый адрес; length = L1ННа. Чтобы уnравлть nереда4ей данных, в этой сети необходим набор команд, а так>ке ;юnолнитеJlьные средства уnравлени потоком данных в СЛУ4ае возникновеllИ ошибки. Эта система исnользует методику уnравлени потоком данных ACK/NAK (noATBep>KДe ...е/неrативное nодтвеР)l(,lJ,ение) ДЛ nодтвер>кдени корректности данных и уnравле ... потоком данных. Табл. 8.1 nере4ислет команды, исnользуемые в этой системе. 
центральный ПК повторитель Рис. 8.10. Система С4итываНLI1Я идентификаЦLl10ННЫХ карТ048К lN 0'\ 00 1\   "1:j ::s::  (1) ::z: (1) ::z: ::s:: (1)  ::s::  "1:j о  о ::z: .;j о :::J :::J (1) "1:j о IX' '1:::1 n 00 
[пава 8. ITрерывання 369 Являетс ли сеть этоrо типа надежной? Аа, еСJlИ в нее встроены определенные средства защиты. Аппаратный сбой приведет к краху системы, О,lJ,нако ero I1раК1НЧССКИ IЮВ03МОЖНО предотвратить, если только в систему не будет введена некоторая нзбы Т04НОСТЬ. ПОСJlе ВКЛ104ени ЛlOбоrо С4итыватеn идентификаu.ИОНIIЫХ карточек, elo nриемоnередатчик шины (МАХ 1483) устанавливаетс в режим приема данных. Если считыватель идентификационных каРТ04ек зависнет, то сторожево таймер (WDT) l.3ы полнит ero nерезаrрузку и установит С4итыватель идентификационных каРТ04ек в pe >кнм nОJlУ4ени данных. 3то npeAoTBpaw,aeT ЛlOбые проблемы со С4итывателмн HдeH тификационных каРТ04ек. ПК так>ке дол>кен обладать сnособностыо pacn03HaBaTb сракт Toro, 4ТО С4итыватель идентификаu.ионных каРТ04ек отказаJl в nроцессе nередачн дш ' ных. 3то возможно, если сторо>кевой таймер будет ИСnОЛЬЗ0ватьс также и в nporpaM- ме, KOTopa выnолнетс в ПК. V1СnОЛЬЗ0ваllие сторожевых таймеров предотвращает зависание системы. Кюкдое устройство в системе имеет свой адрес. Так, ПК имеет адрес ОхОООО, а кюкдый считыватель идентификационных каРТ04ек после nеРВИ4НОЙ установки в снс- теме имеет адрес ОхОО01. nporpaMMa nK nеРИОДИ4ески опрашивает систему на налн 4не новых С4итывателей идентификаu.ионных каРТ04ек и в СЛУ4ае их обнаружения прн сваивает им уникальные идентификаu.ионные номера. Оператор ПК может позже BBe сти адрес модул в 6анк данных. nporpaMMa ПК дол>кна оnраwивать сеть ДЛ обнару жения HOBoro С4итьшател идентисрикаu.ионных каРТ04ек один раз в мннуту. При этом HMeeTC HeBЫCOKa BepOTHOCTb Toro, 4ТО два С4итывател будут установлены одно- временно и оба nОЛУ4ат один и тот >ке адрес. 3то может nрОИЗ0ЙТИ, n03ToMY проrрамма в С4итыватеJlе идентисрикаu.ионных каРТ04ек nозволет выnолнть изменение адреса непосредственно со С4итывател идентификаu.ионных каРТ04ек. Обратите внимание на то, 4ТО И,lJ,ентификационный номер coxpaHeTC в 3СnПЗУ с тем, чтобы в СЛУ4ае отказа модуnя электропитания, С4итыватель идентисрикационных карточек все продол>кал хранить свой идентификаu.ионный номер. Возмо>кно, 4ТО было бы полезным имен) в зтой системе заnасной модуль nитани. nporpaMMa С4итывани идентификаu.ионных каРТ04ек nоказана в npHMepe 8.9. Так как 3ТО nporpaMMa.o.n u.елой системы, то она длиннее, 4ем все ApyrHe рассмотрен- ные к настощему времен н nрИКJlадные nporpaMMbI. Дл Toro, 4тобы зта nporpaMMa смоrла выnолнтьс, одно изменение должно быть сделано в файле KOMnoHoBw,HKa: еслн массив по объему nревосходит 256 байтов, то срайл комnоновw,ика должен быть модиФиu.ирован так, 4тобы быть cnoc06HbIM адресовать этот массив. В данном npHMe ре ИСnОЛЬ3УIOТС 412 6aTOB nамти .o.n локальноrо сохранени идентнфикаu.ионных номеров. Чтобы выполнить HY>KHYIO модисрикациlO, файл комnоновw,ика изменетс так, как nоказано в при мере 8.8. Ава оператора добавлены и несколько удалены. Подчерк- нутые операторы 6ыли д06авлены. Один И3 этих операторов оnределет "queue" HMe нем, ИСnОЛЬЗУlOщим 60ЛЬШУlO модель nамти ("bjg"), а друrой определяет SECTION как ААМ (ОЗУ). Что здесь не nоказано, так 3ТО то, 4ТО банки grp4 и grp5 БЫJlИ удалены. Еслн просмотреть фал комnоновw,ика И3 примера 8.9, то #pragma udata оnределет место, rAe coxpaHeTC массив dataQueue. 
370 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 Пример 8.8 11 $Id: 18f2580.1kr,v 1.2 2004/08/22 23:40:54 curtiss Ехр $ 11 Фаn: 18f2580.1kr 11 Орммер cueHapMR KOMrrOHOBKM ДnR rrpoueccopa PIC18F2580 LIBPATH . FILES c018i.o FILES clib .НЬ FILES p18f2580.1ib CODEPAGE CODEPAGE CODEPAGE CODEPAGE CODEPAGE CODEPAGE ACCESSBANK DATABANK DATABANK DATABANK DATABANK DATABANK DATABANK DATABANK DATABANK ACCESSBANK SECTION NAME=vectors NAME=page NAME=idlocs NAME::config NAME=devid NAМE::eedata NAME=accessram NAME=gprO NAME=gpr1 NAME=grp2 NAМE=grp3 NAME=big NAМE=sfr13 NAME=sfr14 NAМE=sfr15 NAМE=accesssfr NAME=CONFIG START=OxO START=Ox2A START=Ox200000 START=Ox300000 START=Ox3FFFFE START=OxFOOOOO START=OxO START=Ox60 START=Ox100 START=Ox200 START=Ox300 START=Ox400 START=OxDOO START=OxEOO START=OxFOO START=OxF60 ROM=config SECTION NAМE=queue RAM=big STACK SIZE=Ox100 RAM=grp3 END=Ox29 END=Ox7FFF END=Ox200007 END=Ox30000D END=Ox3FFFFF END=OxFOOOFF END=Ox5F END=OxFF END=Ox1FF END=Ox2FF END=Ox3FF END=Ox5FF END=OxDFF END=OxEFF END=OxF5F END=OxFFF PEO'l'CTO PRO'l'ECTE[) PROTECTED PROTECTED PROTECTED PROTECTED PROTECTED PROTECTED PROTECTED PROTECTED 3та система нсnользует wтрихкод, который Ha3ЫBaeTC "код 128". 3то 04ень распро- страненный wтрих-ко,lJ" BBe.o.eHHЫ в 1981 ,D,Л КО,lJ,Нровани aJlфавитных и 4ИСЛОВЫХ данных. Пренмуw,ество AaHHOro WTPHX-КО.ца заКJl104аетс в том, 4ТО при ИСnОЛЬЗ0вании Windows и на60ра шрифтов Truetype, идентисрикацнонные каРТ04КИ MOryr ne4aTaTbc в Мiсrosоft Word без npHMeHeHH каких-ли60 сnецнanьных nporpaMMHbIx naKeTOB. В рамках ко.ца 128 имеlOТС фаКТИ4ески три набора wтрих-кодов: А, В и С. WТРИХКО,lJ,b1 версии А ко.ца 128 BКnlO4alOT 4ас- ТИ4НЫ набор кодов ASCII, WTPHX-КО,lJ,b1 версии В ко.ца 128 ВКnЮ4аlOТ полный набор кодов ASCII, ШТРНХ-КО,lJ,b1 верснн С ко.ца 128 ВКJlЮ4ают TOJlbKO 4исла от О до 9. Рис. 8.11 ИJlJlЮСТРИРУ- ет пример 3Toro wтрих-ко.ца. В та6лнu.е 8.2 nриве,lJ,ен nолны CnHCOK wтрих-кодов, вхо,цяw,их в состав кода 128. Структура каждоro ко.ца yкa3ЫBaeTC как nОСJlедовательность символов Ь и s, rAe Ь 0зна4ает полосу, а s - nро6ел. ЬЬ 0зна4ает полосу .цвойной ширины, а ss  пробел двойно ширины. Каждый снмвол В данном коде составлетс из трех полос и трех nр06елов nepeMeHHO wирины. 
rnaBa 8. TIрерывання 371 11 11 111 1 1 I 1 PIC18F2580 Рис. 8.11. npLl1Mep WТрLl1хкода кода 128. Таблица 8.2. WТрLl1ХКОДЫ на60ра СLl1МВОЛОВ "Код 128" КодА Код В Код С Значение С тру кт ур а Пробел Пробел 00 О bbsbbssbbss 01 bbssbbsbbss 02 2 bbssbbssbbs # # 03 3 bssbssbbsss $ $ 04 4 bssbsssbbss % % 05 5 bsssbssbbss & & 06 6 bssbbssbsss 07 7 bssbbsssbss 08 8 bsssbbssbss * 09 9 bbssbssbsss * * 10 10 bbssbsssbss + + 11 11 bbsssbssbss 12 12 bsbbssbbbss 13 13 bssbbsbbbss 14 14 bssbbssbbbs 15 15 bsbbbssbbss О О 16 16 bssbbbsbbss 1 17 17 bssbbbssbbs 2 2 18 18 bbssbbbssbs 3 3 19 19 bbssbsbbbss 4 4 20 20 bbssbssbbbs 5 5 21 21 bbsbbbssbss 6 6 22 22 bbssbbbsbss 7 7 23 23 bbbsbbsbbbs 8 8 24 24 bbbsbssbbss 9 9 25 25 bbbssbsbbss 26 26 bbbssbssbbs 27 27 bbbsbbssbss < < 28 28 bbbssbbsbss 
372 TIрименение микроконтроnnеров PIC18 КодА Код В Код С Значение С труктур а Равно Равно 29 29 bbbssbbssbs > > 30 30 bbsbbsbbsss ? ? 31 31 bbsbbsssbbs @ @ 32 32 bbsssbbsbbs А А 33 33 bsbsssbbsss В В 34 34 bsssbsbbsss С С 35 35 bsssbsssbbs D D 36 36 bsbbsssbsss Е Е 37 37 bsssbbsbsss F F 38 38 bsssbbsssbs G G 39 39 bbsbsssbsss Н Н 40 40 bbsssbsbsss I I 41 41 bbsssbsssbs J J 42 42 bsbbsbbbsss К К 43 43 bsbbsssbbbs L L 44 44 bsssbbsbbbs М М 45 45 bsbbbsbbsss N N 46 46 bsbbbsssbbs О О 47 47 bsssbbbsbbs Р Р 48 48 bbbsbbbsbbs Q Q 49 49 bbsbsssbbbs R R 50 50 bbsssbsbbbs S S 51 51 bbsbbbsbsss Т Т 52 52 bbsbbbsssbs U' U 53 53 bbsbbbsbbbs V V 54 54 bbbsbsbbsss W W 55 55 bbbsbsssbbs Х Х 56 56 bbbsssbsbbs у у 57 57 bbbsbbsbsss Z Z 58 58 bbbsbbsssbs 59 59 bbbsssbbsbs 60 60 bbbsbbbbsbs 61 61 bbssbssssbs л л 62 62 bbbbsssbsbs 63 63 bsbssbbssss NUL 64 64 bsbssssbbss SOH а 65 65 bssbsbbssss 
fnaBa 8. TIpepbIBaHHSI 373 КодА Код В Код С Значение С тру кт ур а STX Ь 66 66 bssbssssbbs ЕТХ с 67 67 bssssbsbbss ЕОТ d 68 68 bssssbssbbs ENQ е 69 69 bsbbssbssss АСК f 70 70 bsbbssssbss BEL g 71 71 bssbbsbssss BS h 72 72 bssbbssssbs НТ 73 73 bssssbbsbss LF j 74 74 bssssbbssbs УТ k 75 75 bbssssbssbs FF 1 76 76 bbssbsbssss CR m 77 77 bbbbsbbbsbs SO n 78 78 bbssssbsbss SI о 79 79 bsssbbbbsbs DLE р 80 80 bsbssbbbbss ОСl q 81 81 bssbsbbbbss ОС2 82 82 bssbssbbbbs ОС3 83 83 bsbbbbssbss ОС4 84 84 bssbbbbsbss NAK u 85 85 bssbbbbssbs SYN v 86 86 bbbbsbssbss ЕТВ w 87 87 bbbbssbsbss CAN Х 88 88 bbbbssbssbs ЕМ у 89 89 bbsbbsbbbbs SUB z 90 90 bbsbbbbsbbs ESC { 91 91 bbbbsbbsbbs FS I 92 92 bsbsbbbbsss GS } 93 93 bsbsssbbbbs RS 94 94 bsssbsbbbbs US DEL 95 95 bsbbbbsbsss FNC3 FNC3 96 96 bsbbbbsssbs FNC2 FNC2 97 97 bbbbsbsbsss BepxH.per. BepxH.per. 98 98 bbbbsbsssbs Код переключения С Код переключения С 99 99 bsbbbsbbbbs Код переключения В FNC4 Код переключения В 100 bsbbbbsbbbs FNC4 Код переключения А Код переключения А 101 bbbsbsbbbbs FNCl FNCl FNCl 102 bbbbsbsbbbs 
374 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 КодА CTapTKOД А Сlарткод В CTapTKOД С СТОП-код Код В Код С Значение С тру кту р а Стаrпкод А CTapTKOД А 103 bbsbsbbbbss Старт,.код В Старт-код l3 104 bbsbssbssss Старт-код С CTapTKOД С 105 bbsbssbbbss СТОПкод СТОП-код 106 bbsssbbbsbsbb WТрL/1ХКОД всеrда nосылаетс, Ha4L/1Ha со cTapTOBOrO CL/1MBOJJa (в HaWeM npL/1Mepe  "А"), за которым следуlOТ СL/1МВОЛЫ тела кода. После nереда4L/1 тела кода nередаетс 6aT контрольно суммы modulo103, после 4ero следует стоnкод. Рисунок 8.12 пока- зывает nереда4У co06w,eHL/1 "WOW3". Код контрольно суммы reHepL/1pyeTc так, как nоказано на pL/1cYHKe. ДаТ4L/1К OnTL/14eCKoro С4L/1тывател L/1деНТL/1срL/1кационной карточки reHepL/1pyeT лоrL/14еСКL/1 ноль Щ1 темной nOJlOCbI L/1 лоrL/14ескуlO еДL/1НL/1u.у Щ1 Сl3еТJlОЙ по- лосы. nporpaMMa по npL/1Mepy 8.9 L/1сnользует CPYHKu.L/11O nрерывани по L/13MeHeHL/11O co CTOHL/1 npL/1 paCn03HaBaHL/1L/1 WТрL/1хкода L/1 nре06разовывает ero в 4L/1СЛО, которое со- xpaHeTC в 04ереДL/1 Щ1 nОСJlеДУIOw,е nереда4L/1 ero 4ерез сеть после соотвеТСТВУlOще ro заnроса. Start А w о w 3 Проnерка Стоп 103 55 47 55 19 81 106 \ 1   1 j j Проверка == 1(55) + 2 (47) + 3(55) + 4(19) == 390 nL уровни 390:103==3. Остаток 81 TIроверяется Рис. 8. 12. nереда4а co06w,eHL/1 WOW3 
rnaBa 8. TIрерывання 375 Пример 8.9 /1 Прммер CMCTeMHO nроrрамм 1I include <p18cxxx.h> #include <timers.h> #include <delays.h> #include <usart.h> include <string.h> :* Установка 6мтов KOHMrypaUMM  установка peMMa reHepaTopa HS ВКnЮ4енме cTopoeBoro TaMepa * . ВКnЮ4енме HM3KOBOnbTHoro nроrрамммроваНМR  ОТКn4ение с6роса rro 4acTM4Ho потере nMTaHMR разреwенме 06ero с6роса *1 #pragma config OSC = IRCI067 #pragma config WDT = ON #pragma config WDTPS = 256 #pragma config LVP = OFF pragma config BOR = OFF 4pragma config MCLRE = ON II ОАМН раз в сеКУНАУ 1I ********* ОЕРЕМЕННЫЕ В DАМЯТМ HHЫX ************ pragma udata queue :har dataQueue[312]; :har cardBuffer[200]; II 60nbwMe 6yepa (смотрмте. текст) II 04ереАЬ MAeHTMMKaTopOB II 6yep номера каРТ04КМ ipragma udata :har inQueue[16]; :har outQueue[16]; :har inPi; :I:.ar inPo; har outPi; :har outpo; II 04ереАЬ USART lnt dataQueuePtr; :har dataQueueBusy; char cardBufferPtr; :har cardBufferTimeOut; int oneBits; short 10ng time; char day = 1; char month = о; int year = 2225; II BpeMR II Аата char flag; char dataL; :har dataH; II nar AOCTYnHOCTM AaHHX :har alpha; char dirty; char idNumberCount; II peM anba-4Mcen II nar не4мтаемостм 
376 char idBuffer[10]; TIpHMeHeHHe MHKpOKOHTponnepOB PIC 18 char state; /! 6урер naKeTa char packetBuffer[10]; char packetPtr:; 1/ *********** стаТМ4ескме AaHHe в naMRTM nроrрамм *********** rom near char *mes1 "Welcomejust swipe your card."; rom near char *mes2 "Alpha AI"; rom near char *mes3 "Numeric"; rom near char *mes4 "ID Number = "; rom near char *mes5 rom near char *mes6 "Alpha JR"; rom near char *mes7 "Alpha SZ"; rom near char *mes8 "ID Number is too short! Reenter it."; rom near char *monthName [] "January ", "February ", "March ", "April ", "Мау", "June ", "July ", "August ", "September ", "October ", "November ", "December " } ; rom near char 100kupKey[] = 1, 4, 7, 10, 2, 5, 8, О, 3, 6, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19 } ; rom near int code128[] 0Ь11011001100, 0Ь11001101100, 0Ь11001100110, 0Ь10010011000, 0Ь10010001100, 0Ь10001001100, 0Ь10011001000, 0Ь10011000100, 0Ь10001100100, 0b11001001000, 0Ь11001000100, 0Ь11000100100, 0Ь10110011100, 0Ь10011011100, 0Ь10011001110, // neB стоn6ец // rrpaB стоn6ец // rrоисковаR та6nица КОАа 128 // rrp06en О // ! 1 // " 2 // # 3 // $ 4 // % 5 // & 6 // , 7 // 8 // 9 // * 10 // + 11 / / , 12 // - 13 // 14 
rnaBa 8. ПрерываннSI 377 ОЫО111001100, 11 1 15 ОЫОО11101100, 11 о 16 оыоо 111 00 110, 11 1 17 ОЫ1001110010, 11 2 18 ОЫ1001011100, 11 3 19 ОЫ1001001110, 11 4 20 ОЫ1011100100, 11 5 21 ОЫ1001110100, 11 6 22 Obl1l0 11 О 1110, 11 7 23 ОЫ1101001100, 11 8 24 ОЫ1100101100, 11 9 25 ОЫ1100100110, 11 26 ОЫ1101100100, 11 27 ОЫ1100110100, 11 < 28 ОЫ1100110010, 11 29 Obl101l011000, 11 > 30 ОЫ1011000110, 11 ? 31 ОЫ1000110110, 11 @ 32 ОЫО100011000, 11 А 33 ОЬ10001011000, 11 В 34 ОЫООО1000110, 11 С 35 ОЫО110001000, 11 О 36 оыо 00 11 О 1 000, 11 Е 37 ОЫООО1100010, 11 F 38 ОЫ1010001000, 11 G 39 ОЫ1000101000, 11 Н 40 ОЫ1000100010, 11 I 41 ОЫО110111000, 11 J 42 ОЫО110001110, 11 К 43 ОЫООО1101110, 11 L 44 ОЫО111011000, 11 М 45 ОЫО111000110, 11 N 46 ОЫООО1110110, 11 О 47 ОЫ1101110110, 11 Р 48 ОЫ1010001110, 11 Q 49 ОЫ1000101110, 11 R 50 ОЫ10 11101000, 11 S 51 ОЬ1 1 О 111 00 О 10, 1/ т 52 ОЫ1011101110, 1/ U 53 ОЬ11101011000, // V 54 ОЫ1101000110, // W 55 ОЫ1100010110, // Х 56 Obl1l01101000, // У 57 ОЫ1101100010, 11 Z 58 ОЫ1100011010, /1 [ 59 оЬ1 11 О 1111 О 10, 11 \ 60 ОЬ11001000010, 11 ] 61 ОЫ1110001010, // л 62 ОЬ10100110000, // 63 ОЫО100001100, 11 nu1 64 ОЬ10010110000, // soh 65 ОЫОО10000110, 11 stx 66 ОЫОООО101100, // etx 67 ОЫОООО100110, // eot 68 ОЫО110010000, 1/ enq 69 ОЬ10110000100, // ack 70 ОЫОО11010000, // bel 71 ОЫОО110000 10, /1 bs 72 
378 TIpHMeHeHHe MHKpOKOHTponnepOB PICl8 ОЫОООО110110, 11 ht 73 ОЫООО0110010, 11 lf 74 ОЫ1000010010, 11 vt 75 ОЫ1001010000, I1 ff 76 ОЬ11110111010, 11 cr 77 ОЫ1000010100, 11 so 78 оыоо 01111 О 10, I1 si 79 ОЫ0100111100, 11 dle 80 ОЫО010111100, 11 dc1 81 ОЫО010011110, 11 dc2 82 ОЫОl11100100, II dc3 83 Ob1001l110100, II dc4 84 0Ь10011110010, II nak 85 Ob1l110100100, II syn 86 ОЫ1110010100, 11 etb 87 ОЫ11100 100 10, 11 сап 88 ОЫ1 О 110 11110, 11 em 89 ОЫ1011110110, 11 sub 90 ОЫ1110110110, I1 esc 91 ОЫ0101111000, 11 fs 92 оыо 1 000 11110, 11 gs 93 ОЫОО01011110, I1 rs 94 ОЫО111101000, I1 us 95 ОЫО 11110 О О 10, I1 fnc3 96 ОЫ1110101000, 11 fnc2 97 ОЫ1110100010, II shift 98 ОЫ0111011110, I1 switch С 99 ОЫ0111101110, 1I switch в 100 ОЫ11 010 11110, 11 fnc4 101 ОЫ1110101110, 11 fnc1 102 ОЫ1010111100, 11 старт А 103 ОЫ1010010000, 1/ старт в 104 ОЫ1010011100, 11 старт С 105 ОЫ100011101011 11 останов 106 } ; II ******** pacnpeAeneHMe аАресов AaHHX в naMRTM дaHHX ЭСDПЗУ ******** #define timeMode О 11 О = 12 qac; 1 24 qac #define unitAddressL 1 #define unitAddressH 2 #define passWordO 3 #define passWord1 4 #define passWord2 5 #define passWord3 6 #define passWord4 7 #define idLength 8 11 ********* onpeAeneHMR npepBaHM ************ I1 ********* npOTOTMn *********** void MyHighInt (void); void MyLowInt (void); void timeTemp (void); int getTemp (void); void DoClock (void); int GetInQueue (void); 11 npOTOTMn npoueAYP 1I 06cnYMBaHMR npepBaHM 
rnaBa 8. ITрерывання 379 int SaveInQueue (char data); int GetOutQueue (void); lnt SaveOutQueue (char data); void abortCard (void); /1 ********** HaCTpOKa векторов npepBaHM **************** /1 *** сnецмаnьне npMMe4aHMR AnR PIC18F2580: 11 *** не06ХОАММО, 4T06 BcoKonpMopMTeTHoe npepBaHMe I1 *** onpeAenRnocb как HM3KonpMopMTeTHoe (смотрмте nMcToK I1 *** M3MeHeHM AnR AaHHoro MMKpOKOHTponnepa). #pragma interruptlow MyHighInt #pragma code high_vector=Ox08 11 high_vector по аАресу ОхОО08 void highvector (void) 11 BcoKonpMopMTeTH вектор asm GOTO MyHighlnt endasm I1 nepexoA на nOAnporpaMMY 06ра60ТКМ I1 BcoKonpMopMTeTHX npepBaHM #pragma interruptlow MyLowlnt #pragma code low vector=Ox18 1I MyLowlnt  зто npepBaHMe 1I HM3KonpMopMTeTH вектор по аАресу ОхОО18 void low vector (void) II нмзкоnрмормтетньш вектор asm GOTO MyLowInt endasm 11 nepexoA на nОАnроrрамму 06ра60ТКИ 11 HM3KonpMopMTeTHX npepBaHM #pragma code 11 3Аесь HaqMHaeTCR nporpaMMH КОА 1I процеАура 06cnYMBaHMR BcoKonpMopMTeTHoro npepBaHMR II  npepBaHMe по M3MeHeHM AnR CqMTBaTenR MAeHTMMKaUMoHHblX каРТ04ек void MyHighlnt (void) if (INTCONbits.RBIF = 1) { int temp = PORTB; 11 не06ХОАММО С4мтать PORTB AnR с6роса M3MeHeHMR INTCONbits.RBIF = О; if (ReadTimerO() == О) { I1 с6рос npepBaHMR 11 HaqanbHOe COCTORHMe OpenTimerO (TIMERINTOFF & ТО 16BIT & то SOURCE INT & - - TO_PS 1 256); cardBufferPtr = о; cardBufferTimeOut = 10; II пермод 128 мкс } else ( cardBuffer[cardBufferPtr++] = ReadTimerO(); cardBuffer[cardBufferPtr++] = ReadTimerO() » 8; cardBuffer[cardBufferPtr] = PORTBbits.RB7; cardBuffer [cardBufferPtr++ Л= Ох01; I1 мнвеprмpoвание 6и.rа if (cardBufferPtr >= (idLength + 3) * 6) abortCard(); 
380 Прнмененне MHKpOKOHTpOnnepOB PIC 18 11 npoueAypa 06сnуиваНМR HM3KonpMopMTeTHoro npepblBaHMR 11  npMeMHMK USART (самое BcoKonpMopMTeTHoe) I1 nередатqмк USART 11 TaMep 1 (RTC) (самое нмзкоnрмормтетное) void MyLowInt (void) { int temp; if (PIR1bits.RCIF == 1) { 11 зто npMeMHMK USART? PIR1bits.RCIF = О; SaveInQueue (RCREG); 11 с6рос npepBaHMR 11 сохраненме nрмнR'IыIx AaHHX в 04ереАМ } else if (PIR1bits.TXIF == 1 && PIE1bits.TXIE == 1)1/ зто nередаТ4МК? { PIR1bits.TXIF = О; temp = GetOutQueue(); if (temp == Ох100) { 11 с6рос npepBaHMR 11 rrOnY4eHMe AaHHX мз 04ереАМ while (TXSTAbits.TRМT == О); PIE1bits.TXIE = О; 11 rrередатqик BKn } else TXREG = temp; 11 rrередаqа дaHHX } else if (PIR1bits.TMR1IF == 1) { 11 3ТО 100 мс от таймера peanbHOro временм? if (cardBufferTimeOut О && ReadTimerO() != О) abortCard(); 11 eCnM TaMaYT else if (cardBufferTimeOut != О) саrdВuffеrТimеОut-; DoClock(); 11 взвод TaMepa 11 ************** ункuии *************** 11 TaMaYT сqитыватеnR идентиикационных KapTOqeK void abortCard (void) { CloseTimerO(); cardBufferTimeOut = О; WriteTimerO(O); if (cardBufferPtr >= (idLength + З) + 6) flag = 1; /1 C4MTBaHMe местоrrоnоеНИR Rqеки ЭСППЗУ из rrepeMeHHo адреса char eeRead (char address) { EECON1bits.EEPGD = о; EEADR = address; 
rnaBa 8. TIpepbIBaHHSI 381 EECON1bits.RD = 1; return ЕЕDАТА; 11 Заnмсь RqeKM эсппзу С AaHHM по аАресу void eeWrite (char address, char data) INTCONbits.GIEH = о; INTCONbits.GIEL = о; EECON1bits.EEPGD = о; EECON1bits.WREN = 1; EEADR = address; ЕЕDАТА data; EECON2  Ох55; EECON2 = ОхАА; EECON1bits.WR = 1; while (PIR2bits.EEIF О); PIR2bits.EEIF = О; EECON1bits.WREN о; INTCONbits.GIEH 1; INTCONbits.GIEL 1; 11 CqMTBaHMe InQueue, Ох100 ознаqает nYCTY RqeKY int GetlnQueue (void) { int temp; if (inPi == inPo) return Ох100; II eCnM пусто temp = inQueue[inPo]; II nonyqeHMe AaHHX inPo = (inPo + 1) & OxOF; return temp; 11 сохраненме дaHHX в InQueue, Ох100 03HaqaeT заnоnненме int SavelnQueue (char data) if (inPi == ((inPo + 1) & OxOF)) return Ох100; II eCnM заnоnнено inQueue[inPi] = data; inpi = (inPi + 1) & OxOF; return о; 11 CqMTBaHMe мз OutQueue, Ох100 ознаqает пусто int GetOutQueue (void) { int temp; if (outPi == outPo) return Ох100; temp = outQueue[outPo]; outpo = (outpo + 1) & OxOF; return temp; II eCnM пусто II n0nyqeHMe AaHHX 
382 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 11 сохраненме AaHHX OutQueue, Ох100 03HaqaeT заnоnненме int SaveOutQueue (char data) if (outPi == ((outPo + return Ох100; inQueue[outPi] = data; outPi = (outPi + PIE1bits.TXIE = 1; return О; 1) & OxOF)) 11 eCnM заrrоnнено 1) & OxOF; 11 nередатqмк BKn. 11 DepeAaqa 6aTa AaHHX на KMHAMKaTOp npM RS rs void SendLCDdata (char data, char rs) PORTA = data » 4; 11 nepeAaqa neBoro nony6aTa PORTAbits.RA5 rs; 11 установка RS PORTAbits.RA4 = 1; 11 VШnYnbc Е PORTAbits.RA4 = О; Delay10TCYx(8); 1I OMAaHMe 40 мкс PORTA = data & OxOF; 11 nepeAaqa npaBoro nony6aTa PORTAbits.RA5 rs; 11 установка RS PORTAbits.RA4 = 1; 11 VШnYnbc Е PORTAbits.RA4 = о; Delay10TCYx(8); 11 OMAaHMe 40 мкс 11 мнмuмаnмзаUМR K-MHAMKaTopa void InitLCD (void) 11 мнмuмаnмзаUМR KMHAMKaTopa { Delay1KTCYx(40); 11 OMAaHMe 20 мкс SendLCDdata(Ox20, О) ; I1 nepeAaqa Ох20 Delay1KTCYx(12); 11 ОЖМАанме {) мс SendLCDdata(Ox20, О) ; 11 nepeAaqa Ох20 Delay10TCYx(20); 11 OMAaHMe 100 мкс SendLCDdata(Ox20, О) ; 11 nepeAaqa Ох20 SendLCDdata(Ox08, О) ; 11 nepeAaqa Ох28 SendLCDdata(Ox01, О) ; 11 nepeAaqa Ох01 Delay1KTCYx(4)i 1I OMAaHMe 2 мс SendLCDdata(OxOC, О) ; 11 nepeAaqa Ох ОС SendLCDdata(Ox06, О) ; 11 nepeAaqa Ох06 11 OT06paeHMe строкм AaHHX (str) по аАресу 3УОВ AaHHX 11 Строка 1 HaxoAMTcR в n03MUMRX от Ох80 АО ОхА7 11 Строка 2 HaxOAMTCR в n03MUMRX от ОхСО АО ОхЕ7 void DisplayStringRam (char position, char *str) char ptr = о; SendLCDdata (position, О); 11 nepeAaqa n03MUMM while (str[ptr] != О) SendLCDdata (str[ptr++], 1); 11 nepeAaqa CMMBona 11 OT06paeHMe строкм (str) rro аАресу naMRTM nроrрамм 
[пава 8. TIрерываннSI 383 loid DisplayStringPgm (char position, rom char *str) char ptr = о; SendLCDdata(position, о); 11 nepeAaqa n03MUMM while (str[ptr! != О) SendLCDdata (str[ptr++], 1); 11 nepeAaqa CMMBona 006paeHMe временм м AaT в npaBo qaCTM СТрОКМ 2 oid DisplayTimeDate (void) 11 ОАМН раз в сеКУНАУ char timedatestring[19]; int а; char Mode; char ptr =о о; int hours = time 1 36000; 11 nonyqaeM qac char amPM =о 'А'; int minutes =о (time % 36000) 1 600; 11 n0nyqaeM MMHYT int seconds = ((time % 36000) % 600) 1 10; 11 n0nyqaeM ceKYHA int year1 = year; Mode = eeRead (timeMode); 11 n0nyqaeM timeMode М3 ЭСDDЗУ , 1 display time if (Mode == 1) 11 12qacoB peMM if (hours >= 12) { hours = 12; amPM = 'Р'; } if (hours == О) hours = 12; if ((hours 1 10) == о) timedatestring [ptr++] " ; else timedatestring[ptr++] hours 1 10 + Ох30; timedatestring[ptr++] hours % 10 + Ох30; timedatestring[ptr++] ':'; timedatestring[ptr++] minutes timedatestring[ptr++] minutes timedatestring[ptr++] ':'; timedatestring[ptr++] seconds timedatestring[ptr++] seconds 1 10 + Ох30; % 10 + Ох30; 1 10 + Ох30; % 10 + Ох30; if (Mode == 1) { timedatestring[ptr++] timedatestring[ptr++] timedatestring[ptr++] , ,. , amPM; 'м' ; } timedatestring[ptr] = о; DisplayStringRam (ОхеО, timedatestring); display date ptr = strlenpgm (monthName[month]); 
384 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 strcpypgm2ram (timedatestring, monthName[month]); if (day I 10 == О) timedatestring[ptr] = ' '; else timedatestring[ptr++] timedatestring[ptr++] day % timedatestring[ptr++] ','; timedatestring[ptr++] " ; for (а = 1000; а > о; а 1= 10) { day I 10 + Охзо; 10 + Охзо; timedatestring[ptr++] = year1 1 а + Охзо; year1 = year1 I а * а; } timedatestring[ptr] = о; DisplayStringRam (Охсс, timedatestring); II Increment the RTC clock I1 do not incrment date void DoClock (void) TaMepa 1 { PIR1bits.TMR1IF = О; WriteTimer1 (25000); time++; if (time == 864000) time = О; if ((time % 10) == О) Disp1ayTimeDate(); II CqMTBaHMe KnaBMWM с KnaBMaTYP unsigned char GetKey (void) { int а; unsigned char PORTC = ОхОО; do { I1 nOAnporpaMMa 06ра60ТКМ npepBaHMR от II с6рос запроса от TaMepa 1 II nерезаrрузка II мнкрементмрованме временм II ecnм новый день (864000&sim;1/10 sec) II с6рос в 0:00:00:0 keyCode; 1I B60p всех cTon6uoB KnaBMW 1I OMAaHMe oCB060AeHMR кnавмwи while ((PORTB & OxOF) ! = OxOF) ClrWdt(); 11 с6рос cTopoeBoro TaMepa Dеlау1КТСУх(ЗО); }whi1e ((PORTB & OxOF) ! = OxOF); do II OMдaHMe HaaTMR { while ((PORTB & OxOF) ClrWdt () ; Delay1KTCYx(30); }while «(PORTB & OxOF) == OxOF); PORTC = OxFE; while ((PORTB & OxOF) == OxOF) { OxOF) II с6рос cTopoeBoro TaMepa 1I B60p caMoro neBoro cTon6ua 1I пока KnaBMwa не 06HapyeHa PORTC = (PORTC « 1) I 1; I1 B60pKa cneAyeI'O стол6uа keyCode += 4; 11 npM6aBneHMe 4 к КОАУ KnaBMWM } for (а = 1; а != о; а «= 1 ) 
rnaBa 8. TIрерываннSI 385 I1 HaXOAeHMe строкм if ((PORTB & а) О) break; keyCode++; return 100kupKey[keyCode]; ,<ода KnaBMWM 11 nOMcK в 6a6nMue KoppeKTHoro :har GetCode (int ptr) int а; int currentTime; int temp = о; int oneHalfBits = oneBits 1 2; int oneAndOneHalfBits = oneBits + oneBits I 2; for (а = о; а < 6; а++) { currentTime = cardBuffer[ptr] + cardBuffer[ptr + 1] « 8; if (currentTime > oneHalfBits && currentTime < oneAndOneHalfBits) temp «= 1; if (cardBuffer[ptr+2] 1) temp 1= 1; } else if (currentTime > oneAndOneHalfBits && currentTime < (oneAndOneHalfBits + oneBits)) temp «= 2; if (cardBuffer[ptr+2] 1) temp 1= 3; } else if (currentTime > (oneAndOneHalfBits + oneBits) && currentTime < (oneAndOneHalfBits + oneBits * 2)) temp «= 3; if (cardBuffer[ptr+2] 1) temp 1= 7; } else if (currentTime > (oneAndOneHalfBits + oneBits * 2) && currentTime < (oneAndOneHalfBits + oneBits * 3)) temp «= 4; if (cardBuffer[ptr+2] 1) temp 1= OxOF; } ptr += 3; } for (а = о; а < 107; а++) if (code128[a] == temp) break; return а; :har GetCodeB (int ptr) 
386 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 int а; int currentTime; int temp = о; int oneHalfBits = oneBits 1 2; int oneAndOneHalfBits = oneBits + oneBits 1 2; for (а = о; а < 6; а++) currentTime = cardBuffer[ptr] + cardBuffer[ptr + 1] « 8; if (currentTime > oneHalfBits && currentTime < oneAndOneHalfBits) temp »= 1; if (cardBuffer[ptr+2] 1) temp 1= Ох8000; } else if (currentTime > oneAndOneHalfBits && currentTime < (oneAndOneHalfBits + oneBits)) temp »= 2; if (cardBuffer[ptr+2] 1) temp 1= Охсооо; } else if (currentTime > (oneAndOneHalfBits + oneBits) && currentTime < (oneAndOneHalfBits + oneBits * 2)) temp »= 3; if (cardBuffer[ptr+2] 1) temp 1= ОхЕООО; } else if (currentTime > (oneAndOneHalfBits + oneBits * 2) && currentTime < (oneAndOneHalfBits + oneBits * 3)) temp »= 4; if (cardBuffer[ptr+2] 1) temp 1== OxFOOO; } ptr += 3; } temp »= 5; for (а = о; а < 107; а++) if (code128[a] == temp) break; return а; void ProcessCard (void) { int ptr = о; char check; char temp; int mоd10З = о; char count = о; char buffer[10]; oneBits = cardBuffer[4] « 8 + cardBuffer[3]; flag = о; if (cardBuffer[2] == О && cardBuffer[S] == 1) { 11 could Ье good start temp = GetCode(ptr); 
[пава 8. TIрерываннSI 387 if (temp == 103) 1I eCnM стартовй КОА { while (count ,= eeRead (idLength)) { ptr += 18; buffer[count] = GetCode(ptr); mod103 = buffer[count] * (count + 1); buffer[count] += 32; count++; } ptr += 18; if ((mod103 % 103) GetCode (ptr)) 11 good check for (ptr = о; ptr < eeRead(idLength); ptr++) { dataQueue[dataQueuePtr++] dataQueue[dataQueuePtr++] dataQueue[dataQueuePtr++] 600; buffer [ptr]; time I 36000; (time % 36000) 1 } else if (temp == 107) II eCnM CTOn-КОА ptr += 3; 11 npOnYCK OCTanbHO qaCTM CTOnKOAa check = GetCodeB(ptr); while (count != eeRead(idLength)) { ptr += 18; buffer[count] = GetCodeB(ptr); mod103 = buffer[count] * (count + 1); buffer[count] += 32; count++; } ptr += 18; if ((mod103 % 103) == check) { II good check for (ptr = о; ptr < eeRead(idLength); ptr++) { dataQueue[dataQueuePtr++] dataQueue[dataQueuePtr++] dataQueue[dataQueuePtr++] 600; buffer [ptr]; time I 36000; (time % 36000) 1 } void ProcessNetData (char data) int а, checksum, tempPtr; if (state == о) { 1I 06ра60тка всех кома НА packetPtr о; if (data == Ох17) state = 1; 
388 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 else if (data Ох1А) state = 2; else if (data Ох18 ) state = 3; else if (data Ох1Ь) state 4; } else if (state  1) { II 06ра6отка  Ох17 (установка времени м дa'Ibl) packetBuffer[packetPtr++] = data; if (packetPtr == 8) { checksum = о; for (а = о; а < 8; а++) checksum Л= packetBuffer[a]; if (checksum == О) { 1/ good crc time = packetBuffer[O] * 36000 + packetBuffer[l] * 600 + packetBuffer[2] * 10; day = packetBuffer[3]; month = packetBuffer[4]; year packetBuffer[S] * 100 + packetBuffer[6]; } state = о; 1/ OMAaHMe cneAye KOMaHA } else if (state == 2) { /1 npouecc мзмеНRет аАрес MAeHTMMKaTopa packetBuffer[packetPtr++] = data; if (packetPtr == 5) { checksum = о; for (а = о; а < 8; а++) checksum Л= packetBuffer[a]; if (checksum == О) II npaBMnbHaR KOHTpOnbHaR сумма { if (eeRead(unitAddressL) == packetBuffer[O] && eeRead(unitAddressH) == packetBuffer[l]) eeWrite(unitAddressL, packetBuffer[2]); eeWrite(unitAddressH, packetBuffer[3]); } state о; } else if (state == З) // 06ра60тка запроса qTeHMR { packetBuffer[packetPtr++] = data; if (packetPtr == 3) { checksum = о; for (а = о; а < 8; а++) checksum Л= packetBuffer[a]; if (checksum == О) II npaBMnbHaR KOHTponbHaR сумма { PORTAbits.RA6 = 1; II настройка nepeAaqM if (eeRead(unitAddressL) == packetBuffer[O] && 
rnaBa 8. TIрерываннSI 389 eeRead(unitAddressH) == packetBuffer[l]) while (SaveOutQueue(Ox06) == OxlOO) 1I nepeAaqa nOATBepAeHMR ClrWdt () ; while (TXSTAbits.TRМT == О); 1I OMAaHMe заверwеНМR if (dataQueuePtr != О) { checksum = о; tempPtr = о; while (tempPtr ,= dataQueuePtr) { checksum Л dataQueue[tempPtr]; while (SaveOutQueue( dataQueue[tempPtr]) == Ох100) ClrWdt(); tempPtr++; } while (SaveOutQueue(OxFF) == Ох100) Ilnередаqа KOHua co06eHMR ClrWdt(); while (SaveOutQueue(checksum) == Ох100 ) Ilnередаqа KOHTponbHo CYMM ClrWdt () ; dataQueuePtr = о; SaveOutQueue (ОХ21); PORTAbits.RA6 о; state == о; 1 I nepeдaqa OTcyтCТВМR nOдrвep>1<ДeНМR II HaCTpOKa npMeMa } else if (state == 4) { packetBuffer[packetPtr++] if (packetPtr == 1) { data; eeWrite (idLength, packetBuffer[O]); state = 1; .oid SaveBigQueue (char data) if (data == OxFE) dataQueueBusy = 1; else if (data == OxFF) dataQueue[dataQueuePtr++] dataQueue[dataQueuePtr++] dataQueueBusy = о; time 1 36000; (time % 36000) I 600; } else dataQueue[dataQueuePtr++] data; 
390 TIpHMeHeHHe MHкpOKOHTpOnnepOB PIC 18 vold ProcessKey (void) int а; char temp = GetKey(); if (temp == О && idNumberCount < eeRead (idLength) && idNumberCount == о) DisplayStringPgm (Ох84, mes4); idBuffer[idNumberCount] = temp; SendLCDdata (Ох8С + idNumberCount++, О); SendLCDdata (temp + Охзо, 1); } else if (temp >= 1 && temp <= 9 && idNumberCount < eeRead(idLength)) { if (idNumberCount == о) DisplayStringPgm (Ох84, mes4); if (alpha == о) { idBuffer[idNumberCount] = temp; SendLCDdata (Ох8С + idNumberCount++, О); SendLCDdata (temp + Ох30, 1); } else { idBuffer[idNumberCount++] = alpha * 10 + temp; SendLCDdata (Ох8С + idNumberCount++, О); SendLCDdata (alpha * 10 + temp + Ох40, 1); } else if (temp == 10) 11 B60p возрастаНМR AnR nepeMeHHo alpha { if (alpha != О && alpha != 3) alpha++; if (alpha  1) Disp1ayStringPgm (ОхСО, mes2); else if (alpha == 2) DisplayStringPgm (Охсо, mes6); else if (alpha === 3) DisplayStringPgm (Охсо, mes7); } else if (temp == 11) 11 B60p YMeHbweHMR AnR nepeMeHHo alpha if (alpha ,= О && alpha != 1) alpha-; if (alpha  1) DisplayStringPgm (ОхСО, mes2); else if (alpha == 2) DisplayStringPgm ( О хС О, mes6); else if (alpha == 3) DisplayStringPgm (Охсо, mes7); } else if (temp === 12) I1 HaaTa F1 if (idNumberCount  1 == eeRead(idLength)) { SaveBigQueue (OxFE); 
rnaBa 8. Прерывания 391 for (а = О; а < idNumberCount; а++) if (idBuffer[a] >= 10 && idBuffer[a] <= 18) idBuffer[a] += Ох31; else if (idBuffer[a] >= 19 && idBuffer[a] <= 27) idBuffer[a] += Ох27; else if (idBuffer[a] >= 28) idBuffer[a] += Ох37; SaveBigQueue (idBuffer[a]); SaveBigQueue (OxFF); } DisplayStringPgm (Ох84, mes1); } else { DisplayStringPgm (Ох82, mes2); idNumberCount = о; } else if (temp == 13) II KnaBMwa F5  "war назад" if (idNumberCount != О) { SendLCDdata (Ох8С + idNumberCount, О); SendLCDdata (' , , 1); } else if (temp 14) { } else if (temp 15 ) II KnaBMwa qMCneHHoro вы60ра F7 a1pha = о; DisplayStringPgm (ОхСО, mes3); } e1se if (temp == 16) II KnaBMwa OqMCTKM F2 DisplayStringPgm (Ох84, mes1); idNumberCount = О; } else if (temp == 17) { } else if (temp { } else if (temp { 18) 19) I1 KnaBMwa F8  вы60Р симвоnов alpha = 1; DisplayStringPgm (ОхСО, mes2); ***************** rnaBHaR nроrрамма ******************** ;id main (void) int temp; 
392 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 II HaCTpOKa BBOAOB порта OSCCON = Ох72; ADCON1 = OxOF; TRISA = ОхОО; РОЕТА = ОхО о; онных карточек TRISB OxFF; TRISC ОхАО; POR'I'C ОхОО; 11 B60p BHYTpeHe TaKTOBO 4aCTOT 8 MrU I I порты - UИl'овые I1 порт А  выход II сеть RBnReTcR ВХОАОМ c4MTblBaTenR MHopMaUM I1 порт В  ВХОА 11 порт С  BXOA, за ИСКn4енмем lII'lъrрька 1\С7 II B60p всех cTon6UOB MaTpMubl KnaBMaTypbl II проверка установкм nepe4KM с6роса по YMOn4aHM if (PORTCbits.RC5 == О) 1I npM annapaTHO мнмuмаnмзаuмм { II с6рос установок по умоnчанм eeWrite (timeMode, 1); II установка peMMa AМ/pM eeWrite (unitAddressL, О); II установка аАреса 6nOKa на ОхОООО eeWrite (unitAddressH, О); II аАрес YCTaHOBneH на ОхОООО eeWrite (passWordO, О); II naponb YCTaHOBneH на 00411 eeWrite (passWord1, О); eeWrite (passWord2, 4); eeWrite (passWord3, 1); eeWrite (passWord4, 1); eeWrite (idLength, 10); II npMHMMaeMaR по YMOn4aHM длмна II MAeHTMMKaTopa = 10 II HaCTpOKa TaMepa time = о; IPR1bits.TMR1IP = о; Write1'imer1 (-25000); Open1'imer1 (1'IMER_IN1'ON & 1'1 16BI1' RW & - - 1'1 SOURCE IN1' &   1'1PS18); II HaCTpOKa USAR1' кзwnаМRТМ IPR1bits.1'XBIP = о; IPR1bits.RCIP = о; inPo = inPi = outpo = outPi = о; state = о; dataQueuePtr = dataQueueBusy = о; OpenUSAR1' (USAR1'TX_INTOFF & peanbHoro временм м npepblBaHM I 1.  времени: АО naПУНОqм I1 TaMep 1 ммеет HM3KM npMopMTeT II KaAЫe 100 мс II установка HM3Koro npMopMTeTa II 1'XBIP = oWM6Ka II HaCTpOKa 04epeAe II установка USART в О I1 USAR1' 6УАет ра60тать со II CKOpOCTb 9600 60Д USART RX IN1' OFF & -   USART_ASYNCHMODE & USAR1' EIGHT BIT &   USAR1' SINGLE RX & -  USAR1'BRGH_HIGH, 51) ; II HaCTpOKa npepblBaHMR OHHX каРТ04ек flag = alpha = о; INTCON2bits.RBIP = INTCONbits.RBIE = по M3MeHeHM AnR OnTMqeCKOrO C4MTblBaTenR MAeHTMMKauM 1; 1; II отсутствме AaHHX II BЫCOKM npMopMTeT II разреwенме npepBaHMR по M3MeHeHM II COCTORHMR 6мта II мнмuмаnмзаUМR таймера О Write1'imerO (О); II заnуск CMCTM npepblBaHM 
fnaBa 8. TIрерывания 393 INTCONbits.GIEH 1; II IPEN = 1 AnR разреwеНМR npMopMTeToB II nрерванмй II разреwенме BcoKonpMopMTeTHoro II npepbIBaHMR II разреwенме HM3KonpMopMTeTHoro nрерывания RCONbits.IPEN = 1; INTCONbits.GIEL 1; II едмнственнаR rлавнаR nporpaMMa CMCTeM lпitLСD () ; DisplayStringPgm (Ох84, DisplayStringPgm (ОхСО, DisplayTimeDate(); while (1) { mes1) ; mes3) ; II мнмuмаnмзаuмя от06раенмя дaT м временм II rnaBHbI UMKn II мниuмалмзацмя ЖК-мндикатора II установка связм с СО06щением ClrWdt(); II с6рос CTopoeBoro TaMepa if ((PORTB & OxOF) != OxOF) II eCnM HaaTa n6aR кnавмша ProcessKey() ; if (flag != О) ProcessCard(); II eCnM КОА каРТ04КМ temp = GetInQueue(); if (temp != Ох100) II не пуст ProcessNetData(temp); II 06ра60тка ceTeBX дaHHX Пример системы 2 npHMep 2  это nРОДОJlженне прнмера 1. npHMep 2 nocBw,eH орrаннзаu.нн CHCTe мы nHTaHH, ДЛ npHMepa 1. )J,n Toro, 4т06ы снстема C4HTЫBaHH HAeHTHcpHKau.HoHHbIX каРТ04ек pa60TaJla, она ДОJlжна 6ыть opraHH30BaHa в сеть. Сеть, рассматриваема здесь  это сеть RS422 сеть, KOTopa тре6ует НСnОЛЬЗ0ванн Cneu.HaJlbHO BCTaBHO карты nK, KOTOpЫ BJleTC хост-комnьютером сетн. Чт06ы сохранить систему Ha столько npocTo, HaCKOJlbKO зто возможно, в ее состав ВКnЮ4ен 6лок nHTaHH, который подает злектропнтанне на все c4HTbIBaTeJlH каРТ04ек. Аоnолнительна CPYHKu.H, KOTO рую BbInOJlHeT 6лок nHTaHH,  это пре06разованне YPOBHe снrналов Н3 RS2З2С (nK) в RS422 (сеть). Все, 4ТО не06ходнмо от хост-комnьютера  это разъем ПОСJlедователь- Horo СОМпорта HJlH USB a,o,anTep с u.еJlЬЮ ynpaBJleHH CHCTeMO от USB порта nK. В ЛlO60М CJlY4ae HHKaKa MOAHcpHKau.H nK не Tpe6yeTC. Рис. 8.13 nOKa3bIBaeT схему nрннu.НnНЭJIЬНУIO 6JlOKa 3JleKTpOnHTaHH, He06xoAHMoro ДЛ снстемы C4HTЫBaHH HдeH THcpHKau.HoHHbIX каРТ04ек. 06ратнте вннмание, 4ТО в 6JlOKe злектроnнтанн НСnОЛЬЗ0ван МНКрОКОНТрОЛllер, уnраВJlЮw,и ДВYM nоследоватеJlЬНЫМН nopTaMH. Один Н3 зтнх портов свзаll с COM портом RS2З2С на хосткомпьютере, а Apyro nОДКnЮ4ен к С4нтывателм идентнсрика u.HOHHbIX каРТ04ек в сетн RS422. МНКРОКОНТРОЛJlер так>ке уnравлет очередностыо нн- cpopMau.HoHHoro 06мена в сетн RS422, KOTopa ра60тает в полудуплексном режнме. Проrрамма ДЛ 6лока 3Jlектроnнтанн намноro КОр04е, 4ем nporpaMMa ДЛ модул C4HTЫBa HH ндентисрнкаu.нонных каРТ04ек, потому 4ТО все 6лок злектроnнтанн должен делать  зто nepeКnlO4aTb JlННИIO нлн peTpaHCJlHpoBaTb данные ме>кду nK н сетью RS422. 3та ретранслн u.H данных выnолнетс ДBYM nоследовательнымн ннтерсресами: nporpaMMHo UART н апnаратно USART в МНКрОКОНТрОJlлере. nporpaMMa UART по УМОЛ4аннIO установлсна на ИСnОJlЬЗ0ванне выводов АВ4 н АВ5 порта В, а аппаратные средства USART исnоль зуют WTbIPbKH АС6 н АС7. В npHMepe 8.1 О npHBeAeHa nporpaMMa ДЛ 6лока злектропн тани. 
с 1 :::: ::::: 1.0 uF ( R2 ( 10К > R1 3.9К >   .........t. .........g...   1.... 9 ......1Q.... PIC18F2220 U1  RAO RA1 RA2 RA3 RA4 RA5 МCLR 08С1 08С2 ----щ-. RC5 17 RC6 CI)  RC7  С2 30 pF Рис. 8.1 З. Орrанизация системы питания :::: L7S05IТО220 U2 2 I С1, I 1 I Vout  Vrn  С4 ..--...... (') 100 uF   С3 0.1 uF о  21 RBO RB1  RB2 RB3 RВ4 25 26 RB5 .....l:L....... RB6 RB7 R С О ....ц...... R С 1 ....1L.. R С 2 ....1L.. Cl)RC3   R С 4 ....1i...... cn со .... I С 5 ::::k 0.1 uF  Источник электропитания 12 В, 10А 1  R4 1К ..л..л. ...,..., .....l..... С6 МАХ1483  0.1 uF U4 со 4 DI u RO 1 3  6 .Qf. о А 2 z 7 RE с> В Il)  Lvr О2 1 2N222   u R3 120 U3 со  RXln u RXOut -+------ з TXln  TXOut 5 О 2 z VDRV с> 1 08275  > R5 220 > J1 1  з 4 5  r+ RJ-45 I I Р1 5  9 ,.., 4  8  3  7  2 ,.., 6  1   СОМпорт, подключаемый к пк t..J \о .+;.. .аз ::s:: :: (1) :I: (1) :I: ::s:: (1) :: ::s::  "о О  О :I: .;j О   (1) "о О t= ""о 'n 00 
[пава 8. TIpepbIBaHHSI 395 Пример 8.10 I Орммер nporpaM AnR 6nOKa зnектроnмтаНМR I t.пclude <p18cxxx.h> flnclude <sw uart.h> tlnclude <delays.h> tinclude <usart.h> * Установмть 6MT KOHMrypaUMM  Установмть RC reHepaTOp  OTKn4MTb CTopoeBO TaMep . OTKnqMTb HM3KOBOnbTHoe nроrрамммрованме OTKn4MTb с6рос по qaCTM4HO потере nMTaHMR .- Разреwмть 06 с6рос */ fpragma config OSC RC tpragma config WDT OFF fpragma cOnfig LVP OFF fpragma config BOR OFF fpragma config MCLRE == ON 1I ********* nepeMeHHble в naMRTM Аанных ************ tpragma udata har readQueue[32]; :har writeQueue[32]; har readlnptr; :har readOutPtr; :har wri teInPtr; :har writeOutPtr; II **************** ****************** YHKUMM void MyHighlnt (void); 'pragma interrupt MyHighInt tpragma code highvector=Ox08 void high_vector (void) asm GOTO MyHighInt endasm #pragma code int GetWriteQueue (void) int temp; if (writeInPtr == writeOutPtr) return Ох100; II temp = writeQueue[writeOutPtr]; writeOutptr = (writeOutPtr + 1) & return temp; eCnM пусто II Ox1F; nonyqMTb Аанные 
396 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 int SaveWriteQueue (char data) if (writeInPtr == ((writeOutptr + 1) & Ox1F)) return Ох100; I1 if full writeQueue[writeInPtr] = data; writeInPtr = (writeInPtr + 1) & Ox1F; return о; } inl GetReadQueue (void) int temp; if (readInptr == readOutPtr) return Ох100; temp = readQueue[readOutPtr]; readOutPtr = (readOutPtr + 1) return temp; II eCnM пусто II nоnучмть данные & Ox1F; } int SaveReadQueue (char data) if (readInPtr == ((readOutPtr + 1) & Ox1F)) return Ох100; II eCnM заnоnненно readQueue[readInPtr] = data; readInptr = (readInPtr + 1) & Ox1F; return о; void MyHighInt (void) int temp; if (PIR1bits.RCIF == 1) 1/ зто npMeMHMK USART? { PIR1bits.RCIF = о; II с6рос npepblBaHMR SaveWriteQueue (RCREG); } else if (PIR1bits.TXIF == 1 && PIE1bits == 1)1/ зто nepeAaTqMK USART? PIR1bits.TXIF = о; temp = GetReadQueue(); if (temp == Ох100) { II с6рос npepBaHMR II nOnY4eHMe AaHHX мз OqepeAM while (TXSTAbits.TRМT = о); PIE1bits.TXIE = о; 1I nepeAaTqMK BblKn. } else TXREG temp; 11 nepeAaqa данных II II ************ временные заАеркм AnR nporpa UART ****************** II Этм заАеркм AOnHbl BBOAMTbCR С uenb II 06eCneqeHMR B03MOHOCTM Mcnonb30BaHMR nporpaMMbl II UART 6и6nиотекм С18 I1 void DelayRXHalfBitUART (void) Delay10TCYx(1); 
rnaBa 8. ITрерывання 397 Delay1 ТСУ () ; Delay1 ТСУ () ; Delay1 ТСУ () ; Delay1 ТСУ () ; Delay1TCY () ; Delay1 ТСУ () ; Delay1TCY () ; Delay1TCY () ; \ Joid DelayRXBitUART (void) I Ое1ау10ТСУх(3) ; Delay1TCY () ; Delay1TCY () ; Delay1TCY(); Delay1TCY() ; Delay1TCY () ; Delay1 ТСУ () ; Delay1 ТСУ () ; Delay1TCY (); Delay1 ТСУ () ; Joid DelayTXBitUART (void) Delay10TCYx(4); Delay1TCY() ; 11 **************** rnaBHaR nporpaMMa ************************* -..oid main (void) char temp; char count = OxFF; ADCON1 = OxOF; TRISC Ох80; TRISB Ох20; PORTB 1; II 06ЪRвnенме BBOAOB порта uмровьшм II nроrрамммрованме портов II HaCTpOKa nepeAa4M в сеть RCONbits.IPEN = о; II TOnbKo BblcoKonpMopMTeTHoe npepBaHMe I1 HaCTpOKa USART м OqepeAM IPR1bits.RCIP = о; II TXBIP  6мт oWM6KM readInPtr = readOutptr writeInptr = writeOutptr о; OpenUSART (USARTTXINTOFF & IluSART ра60тает на скоростм 9600 60А USART RX INT OFF &  -  USART ASYNCH МОDЕ &   USART EIGHT BIT &  - USART SINGLE RX &  - USARTBRGHHIGH, 12) ; '1 OTKpTMe nporpaM UART OpenUART(); while (1) { 
398 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 if (PORTBbits.RBO == 1) { INTCONbits.GIE = 1; II разреwенме BcoKonpMopMTeTHblx II npepBaHM II n0nyqeHMe AaHHX от COMnopTa temp = GetWriteQueue(); if (temp != 100) { INTCONbits.GIE = о; WriteUART (temp); if (count != OxFF) { I I заnре'r II заnмсм в сеть count; if (count == О) { count = OxFF; PORTBbits.RBO О; II реверс nMHMM } if (temp Ох18) count = 3; } else { INTCONbits.GIE = О; temp = ReadUART(); SaveReadQueue (temp); PIE1bits.TXIE = 1; II nepeAaT4MK BKn. INTCONbits.GIE = 1; if (temp == OxFF I I temp. == 6 I I temp == Ох21) PORTBbits.RBO = 1; II реверс nMHMM V1, HaKoHeu., nOCJleAH paCCMaTpHBaeMa намн 4асть взтой в ка4естве npHMepa снстемы, не нмеет нн nporpaMMbI, нн MHKpOKOHTpOJlJlepa (см. рнс. 8.14). Модуль pacwH peHH нмеет два npHeMonepeAaT4HKa RS-422, уnравлемые CHrHaJlOM С вывода 3 ceTe BO WHHbI. AaHHЫ nOBTOpHTeJlb  зто HeAoporoe YCTPOCTBO. nHTaHHe дл Hero 6ерется С ceTeBO WHHbI н nOAaeTC на вход ста6нлнзатора L7805. Наnрженне +5 В С выхода ста6НJlнзатора, подаетс на выводы nHTaHH V1C МАХ148З. 
[пава 8. ITрерывання 399 u 3 L 780SIТ03 2 I С1 0.1 uF МА.Х1483 U1 4 DI RO 3 ОЕ А 6 2 RES В 7 R2 120 J 1 J4 ?ower ExpanS10n Side Station Slde RJ-45 МА.Х1483 U2 8 1 RO ; А В. S 8 HEADER R1 120 U4A .74НСТ04 ОЕ RE Рис.8.14.nовторнтель 8.5. Резюме 1. Структура npepbIBaHH MHKpOKOHTpOJlJlepa может ВКnЮ4ать как высоко, так LI1 HH3KonpHopHTeTHbIe прерыванн HJlH же TOJlbKO BbIcOKonpHopHTeTHbIe npepbIBaHH, как это onpeAeJleTC 6нтом IPEN perHcTpa уnравленн с6росом (RCON). 2. npHOpHTeTbI npepbIBaHH CTaHOBTC актнвнымн TOJlbKO TorAa, KorAa 06а тнпа npepbIBaHH npOHCXOAT одновременно,  в зтом СЛУ4ае высокопрнорнтетное npepbIBa нне нмеет npHopHTeT. З. V1нднвндуальные npepbIBaHH уnравлIOТС TpeM 6нтамн: IP, IE н IF. БLI1Т IP (npHopHTeT npepbIBaHLI1) BbI6L11paeT HH3KH (О) нлн BbICOKLI1 (1) nрноритет nрерывання, 6нт IE (разреwенне npepbIBaHH) вы6нрает разреwенное (1) HJlH за6Jlокнрованное (О) COCTOHHe nрерывани, а 6нт IF (cpJlar прерыванн) указывает, есть лн заnрос npepbIBa HH (1) HJlH нет (О). 4. npou.eAypa 06СJlужнванн npepbIBaHH YCTaHaBJlHBaeTC в nporpaMMY Н3 6н6- nHOTeKH С 18: (а) onpeAeJleHHeM npOTOTHna npepbIBaHH, (Ь) onpeAeJleHHeM nceBAOKOM- MeHTapH #pragma ДЛ BbICOKonpHopHTeTHoro (high) НJlИ HH3KonpHopHTeTHoro (Iow) npe pЫBaHH, (с) pa3Mew,eHHe команды ACCeM6Jlepa GOTO по а,о,ресу вектора прерывання н (d) YCTaHOBKO npou.eAypbI 06СJlужнванн npepbIBaHH по а,о,ресу вектора прерыванн. 5. npou.eAypa 06СЛу>Кнванн npepbIBaHH ДОJlжна распознать, какое Н3 УСТРОСТl3а l3ызвало npepbIBaHHe, npOBep COCTOHHe 6нта IF ДЛ npepbIBaHH,  зтот 6нт должсн 
400 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 c6paCЫBaTbC перед заверwеннем выnолненн npou.eAypbI оБСЛУЖLl1[ШНИ прерываllИЙ. 6. USART  зто annapaTHbI компонент микроконтроллера, который осуществляет npe06pa30BaHHe между nОСJlедовательнымн н параллеЛЬНЫМLI1 даннымн, LI1СllОЛЬ3УЯ CHHXPOHHЫ илн aCLl1HXpOHHbI срормат. Как н в СЛУ4ае друrих проrраммируемых YCT POCTB BHyrpH PIC, зто YCTPOCTBO reHepHpyeT прерывания. KorAa приемннк nриннмает последовательные данные, npHeMHHK вызывает nрерывание, а KorAa передатчик rOTOB передать данные, то nepeAaT4HK вызывает npepbIBallHe. Как nриеМIIИК, так LI1 передаТ4НК нмеет бнты уnравленн IP, IE LI1IF. Скорость ннсрормаu.ионноrо обмена USART nporpaM MHpyeTC. 7. Сnеu.нальный тнп nрерывани, Ha3ЫBaeMЫ прерываннем на нзменению co стояння, обнаружнвает, нзмеНLI1Л ли свое COCTOHHe ЛlO60Й И3 бнтов AB4AB7 порта В. KorAa 06наружено нзмененне состояни лю60rо Н3 названных 4етырех выводов, то npoHcxoAHT nрерывание по H3MeHeHHIO состоння. 3то CBOCTBO чрезвычаЙIIО rЮIlеЗIIО, Hapдy с TaMepOM, ДЛ 06наруженн BxoAHoro нмnульса нлн нмnульсов н измерення WHpHHbI входных нмnульсов, поскольку MHoro THnoB данных нсnользуют WHpOTHO HMnYJlbCHOe коднрованне HHcpopMau.HH. 8. MHorHe снстемы в CBoe ра60те НСnОJlЬ3УЮТ множественные npepbIBaHH, Ha npHMep снстема C4L11TbIBaHH HAeHTHcpHKau.HoHHbIX каРТ04ек, paCCMOTpeHHa в 3TO rла ве. Снстема C4HTЫBaHH HAeHTHcpHKau.HoHHbIX каРТ04ек исnользует прерыванн по Ta меру реальноrо временн, nрерывани по нзмененню состоянн, npepbIBaHLI1 от onTH4e CKoro счнтыватеJl WTpHxKoAa н два npepbIBaHH от USART, KOTOpЫ осуществлет HH cpopMau.HoHHbI 06мен 4ерез сеть. Все зтн npepbIBaHH коордннируютс через два npH орнтетных вектора npepbIBaHH в мнкроконтроллере. 9. В 3TO rлаве 6ыл рассмотрен WTpHXKOA "Код 128", поскольку он вляется oд ннм Н3 нанболее распространенных WTpHXKOAOB, нсnользуемых при контроле покупок н в ApyrHx nРНJlоженнх. npou.ecc CKaHHpOBaHH WTpHxKoAa и дeKOДHpOBaHH отскани pOBaHHO ннсрормаu.ин 6ыл рассмотрен в рамках npHMepa НСnОЛЬЗ0вання npepbIBaHH по нзмененню COCTOHH. 1 О. Mana nОЛУДУnJlексна сеть 6bIJla НСnОЛЬЗ0вана ДЛ орrаннзаu.нн инсрормаu.нонно ro 06мена между BCTpoeHHO CHCTeMO н nK. npH орrаннзаu.нн Hнтepcpeca НСnОЛЬЗ0Вanс как протокол RS2З2С, так н протокол RS422 (RS485) протоколы ДЛ Hнтepcpeca. Так>ке детanыю рассматрнвanось npe06pa30BaHHe CHrHanoB ме>кду HHTepcpeCOM RS2З2С н сетью RS422. RS422 6ыл вы6ран 3,D,eCb по TO nРИ4нне, 4ТО ,о,анный стандарт допускает нсnользо ванне ка6ел, длнна котороro мо>кет AOCTHraTb 4000 cpyrOB. 8.6. Вопросы  заданя 1. Вектор прерыванн, нсnользуемы BbIcoKonpHopHTeTHbIM npepbIBaHHeM, pac nоnожен в 4eKe naMTH 2. Вектор npepbIBaHH, нсnользуемы HH3KonpHopHTeTHbIM npepbIBaHHeM, распо ложен в 4eKe naMTH " З. Еслн nрноритетные npepbIBaHH за6локнрованы 6нтом IPEN, KaKO вектор HC nОJlьзуетс ДЛ всех npepbIBaHH? 4. rAe pa3Mew,aeTc бнт IPEN? 5. OnHwHTe назна4енне 6нтов уnравленн IP, IE н IF в связн с прерываннми. 6. Еслн noAnporpaMMa оБСJlу>кнванн BbIcoKonpHopHTeTHbIx nрерывани должна 06 слу>кнть npepbIBaHHe по нзмененню COCTOHH, за которым следует nрерывание от прнемнн ка USART, то какое Н3 зтнх npepbIBaHH 6удет нметь caMЫ BЫCOKH npHopHTeT? 7. Оnиwнте зна4ение 04НСТКН 6нта IF изнyrрн проu.едуры обслу>кивания npepbIBaHH. 
rnaBa 8. TIрерывання 401 8. Что выполняет оператор INTCONВlTS.GIEH = 1; в проrрамме? 9. Что выполняет оператор 'РА1 ВlTS.TMR1IP = о; в проrрамме? 10. Что выПолняет оператор INTCON3BITS.INT1IE = 1; оператор в проrрамме? 11. Наnиwите оператор, KOTOPЫ устанаВJlивает nрерывание от входа таймера 2 на низкоприоритетный уровень. 12. Наnиwите команду, которая разреwает прерывание от таймера 2. 13. Каково назна4ение реrистра RCON? 14. В каком реrистре размеw,ается бит cpJlara прерывания (IF) для прерывания по изменениlO состояния? 15. n04eMY команда RETFIE не ИСПОJlьзуется в процедуре обслу>кивания npepbIBa ния? 16. Что делает команда RETFIE? 17. Почему проrрамма из примера 8.3 ИСnОЛЬЗ0вание два таймера, и 4ТО исnоль- зует ка>кдый из зтих TaMepOB при выполнении проrраммы? 18. Каково назна4ение низкоприоритетно процедуры оБСJlу>кивания nрерываний из примера 8.3? 19. Оnиwите, как устанавливается время в проrрамме И3 примера 8.3. 20. Пример 8.3 ИСПОJlьзует МУJlьтиплексированные индикаторы; как 4асто BKJlIO 4ается позиция индикатора в 3TO проrрамме? 21. Объясните, как С4итывается температура в примере 8.3. 22. Что такое асинхронные последовательные данные? 23. Каково назна4ение cTapToBoro и стоповоrо битов в асинхронно-кодированном потоке данных? 24. НаиБОJlее современные срорматы асинхронных последовательных данных ВКЛlO4аlOТ стартовый бит, битов данных и стоповых битов. 25. Что такое скорость инсрормационноrо обмена при последовательной переда- 4е данных? 26. Какое YCTPOCTBO используется для Toro, 4тобы выполнять преобраЗ0вание между асинхронными последовательными данными и параллельными данными? 27. USART rенерирует два типа прерывани, 4ТО зто за прерывания? 28. Если имеется выбор, то какому из двух типов прерываний, вызванных USART, вы бы назна4ИnИ более высокий приоритет и П04ему? 29. Напиwите KOPOTKYIO ПОСJlедовательность операторов на языке С, которые ус- тановили бы низки приоритет прерываний как для передаТ4ика, так и для nрLl1емника USART. Не ИСПОJlьзуте срУНКЦИIO OpenUSART - взамен непосредственно адресуйте ре- rистры упраВJlения. 30. Как USART запроrраммировать на скорость инсрормационноrо обмена, рав- HYIO 1200 60Д? ОnредеJlите зна4ение, которое ну>кно занести в реrистр скорости в ин- срормационноrо обмена, еСJlИ тактовая 4астота равна 4 мrц. 31 . n04eMY 4асто с устроствами BBoдaBЫBoдa ИСПОЛЬ3УlOтся 04ереди? 32. Каков размер 04epeдe, ИСПОJlьзованных в примере 8.5? 33. n04eMY и коrда прерывание от передаТ4ика ВЫKJl104ается в процедуре обслу живания высокоприоритетных прерывани из примера 8.5? 34. В примере 8.5 прерывание от приемника обрабатывается в nроцедуре обслу живания высокоприоритетных прерываний; 4ТО выполняется при ero обслу>кивании? 35. Пример 8.6 изобра>кает проrрамму для nK, написаннуlO на Visual С++. Каково назна4ение ОСВ (блока управления данными) в срункции WriteComPort? 36. Мо>кно ли изменить срУНКЦИIO WriteComPort И3 примера 8.6 таким обраЗ0М, чтобы она записываJlа более одноrо бата данных? ЕСJlИ да, то объясните как. 37. Объясните, как в примере 8.7 замеряется wирина входноrо импульса системы 
402 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 ОСС? 38. Что является заrоловком пакета системы ОСС и какова ero длительность? 39. Что такое уnраВЛЯIOw,ая переменная (CV) системы ОСС? 40. Объясните, как выполняется доступ к зсnnзу данных в примере 8.7. 41. Какие nрерывания ИСnОЛЬ3УlOтся в проrрамме И3 примера 8.7? 42. Объясните, как срункция wait4Bit работает в проrрамме И3 примера 8.7. 43. Объясните работу срункции getByte в примере 8.7. 44. Аля 4ero используется TaMep О в примере 8.7? 45. Объясните, как реконсриryРИРУIOw,ая кнопка используется в примере 8.7 и 4ТО она делает. 46. n04eMY срал сценария компоновw,ика приведен в примере 8.8 и какие ero изменения были выполнены? 47. Что такое интерсрес RS-422 и n04eMY он выбран в примере системы, nриве- денном на рисунке 8.9? 48. Что такое МАХ1483? 49. Что nредставлет собо кабель САТ5? 50. Что представляет собо соединительны разъем RJ-45? 51. Что представляет собо набор wтрих-кодов "Код 128"? 52. Можно ли ИСnОЛЬЗ0вать набор wтрихкодов "Код 128" для Toro, 4тобы помес- тить Bawe имя в cooTBeTcTBYIOW,YIO ПОЗИЦИIO идентисрикационно каРТ04КИ? 53. Определите и выведите wтрих-коды набора "Код 128" для строки W4A. 54. Выполните поиск в Internet и составьте список по KpaHe мере из трех друrих наборов wтрихкодов, используемых с ОnТИ4ескими С4итывателями wтрихкодов. 55. n04eMY ОПТИ4еские wтрихкоды HaMHoro 60лее распространены, 4ем маrнит- ные коды? 56. Что озна4ает "по МОДУЛIO 103"? 57. Какая инсрормация сохраняется в зсnnзу данных nporpaMMo из при мера 8.9? 58. Объясните, rAe и как дата и время отобра>каlOТСЯ на ЖК-индикаторе в приме- ре 8.9. 59. Какие прерывания ИСПОЛЬ3УlOтся в примере 8.9? Какое из прерывани, имеет caMЫ высоки приоритет, какое - caMЫ низки? 60. Объясните, 4ТО выполняет OCHOBHO ЦИKJl в примере 8.9. 61. Каково назна4ение переменно idNumberCount в срункции ProcessKey И3 при- мера 8.9? 62. Как проrрамма из примера 8.9 определяет, какая команда поступила из сети? 63. Какие дополнительные команды рекомендуется ИСПОЛЬЗ0вать для Toro, 4тобы повысить полезность С4итыватеJlЯ идентисрикационных каРТ04ек соrласно рис. 8.9.? 64. Каково назна4ение интеrрально схемы DS275 (см. рис. 8.1 3)? 65. Каково назна4ение микросхемы L7805 (см. рис. 8.1 3)? 66. Каково назна4ение транзистора 2N2222 (см. рис. 8.1 3)? 67. nporpaMMa из примера 8.1 О использует как USART, так и UART; каково Ha3Ha 4eHLI1e кюкдоrо из зтих двух YCTPOCTB? 68. Каково назна4ение блока злектропитания, приведенноrо на рис. 8.1 3? 69. Как работает повторитель, показанны на рис. 8.14? 
rnaBa 9. Снстемы уnравnення 403 rлава 9. Смстемы управленмя Мноrие системы, которые содер>кат микроконтроллеры  зто системы ynpaBJ1e ния, упраВЛЯIOw,ие некоторым технолоrИ4еским nроцессом или nроцессами. Эта rлава представляет методику nроектирования систем управления технолоrИ4ескими nроцес сами, в He так>ке описаны несколько nрИKJlадных nporpaMM. Примерами оборудова- ния, которое использует системы управления техпроцессом, Moryт быть стиральная машина, nосудомое4ная машина, сБОР04ная линия на срабрике, система управления светосрорами и Т.д. Пере4исленные YCTpOCTBa после cBoero ВКЛlO4ения отрабатывают один и тот >ке процесс, при зтом cyw,ecTByeT метод nроектирования систем управления подобными nроцессами. После заверwения И3У4ения 3TO rлавы вы смо>кете: 1. 06ъяснить, как ну>кно срормаЛИЗ0вать процесс дnя системы управления. 2. Описать несколько простых систем управления. З. Разра60тать систему управления светосрорами. 4. Разработать систему, которая подобна системе управления санитарным ящи ком для котов, продаваемым срирмо Litter Maid. 5. Управлять AOMaWHe системо обоrрева/вентиляции. 9. 1 . Формализаця системы управления Чтобы упростить проектирование системы управления, следует срормаЛИЗ0вать зада4У, ИСnОЛЬ3УЯ npocTYIO BpeMeHHYIO диаrрамму событий. После 3Toro система мо>кет быть разработана и мо>кет быть написано ее nporpaMMHoe обесnе4ение. Предnоло>ким, что микроконтролnерная система управления дол>кна ИСnОЛЬЗ0ваться в посудомоечной маwине. Чтобы оrраНИ4ИТЬ трудоемкость ее разработки, nредnоло>ким, 4ТО это дол>кна быть максимально простая базовая система. Система nocYAoMoe4Ho маwины имеет только несколько компонентов, являю щихся объектами управления: 1. Клапан заполнения, KOTOPЫ nозволяет воде заnолнить бак nосудомое4НОЙ маwины. Это оБЫ4НО мехаНИ4ески nоплавковы KJlanaH, останавливаlOw,ий поток BO ды, KorAa бак заполнен. 2. Электромотор насоса, nроrОНЯIOw,еrо воду 4ерез nосудомое4НУЮ машину с тем, 4тобы ополаскивать и мыть посуду. Он так>ке выка4ивает воду из посудомоечной машины 4ерез дpeHa>KHЫ патрубок. З. nереnускной KJlanaH, KOTOPЫ управляется для Toro, 4тобы выбрать, работает ли электромотор насоса на мойку посуды ИJlИ отка4ивает воду И3 посудомоечной Ma шины 4ерез дренаж. 4. Наrревательны злемент, KOTOPЫ суwит посуду, а в более дороrих моделях HarpeBaeT воду, 4тобы стеРИЛИЗ0вать посуду. 5. Соленоид распределитеJlЯ MOIOw,ero средства, KOTOPЫ открывается мойке no суды и подает MOIOw,ee средство в MOIOW,YIO воду. 6. Некоторые nocYAoMoe4HbIe маwины имеlOТ так>ке небольwо вентилятор, кото- pы проrоняет воздух сквозь посуду для ускорения высыхания. 
404 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Соленоид заполнения Эnектромотор насоса Дренажный перепускной клапан Распредеnител моющеrо : средства I Наrреватель IIЫЙ Jлсмент о 5 10 15 20 25 30 35 40 45 50 мннуты Рис. 9.1. Аиаrрамма управления технолоrическим nроцессом AflЯ npocTo nocYAoMoe4Ho маwины Рис. 9.1 ИЛЛlOстрирует BpeMeHHYIO диаrрамму событий или диаrрамму теХНОJlоrи 4ecKoro nроцесса, npeAHa3Ha4eHHYlO разработки nporpaMMHoro обеспе4ения системы управления посудомое4НО маwино. На 3TO ди'аrрамме указаны все YCTpOCTBa, ко- торые дол>кны управляться, а так>ке моменты времени, KorAa события дол>кны nроисхо- ДИ1IJ. Эта диаrрамма представляет собой план системы и отражает зависимость всех событий от времени. nOcJle Toro, как зта диаrрамма разработана, как проrраммное обесnе4ение, так и систему будет разработать HaMHoro проw,е. V13 3TO диаrраммы может быть nОЛУ4ена слеДУIOw,ая инсрормаu.ия: 1. 1 МИНуТная временная задержка необходима для Toro, 4тобы заполнить бак. 2. 4МИНуТная временная задержка необходима для Toro, 4тобы поработал злек- тромотор насоса. З. ЗОМИНуТная временная задержка необходима для работы наrревательноrо злемента. 4. Короткая временная задер>кка необходима для Toro, 4тобы открыть pacnpeAe- литеnь MOIOw,ero средства (200 мс). Это YCTPOCTBO имеет только одну кнопку, заnускаlOw,уlO u.ИKJl мытья посуды. Единственный дополнтельным nереКJl104ателем ЯВJlяется переКЛlO4атель открытия дверцы, KOTOpЫ распознает, KorAa дверца маwины открывается, и при останавливает цикл мытья посуды. Эта маwина выполняет цикл nредварительноrо мытья посуды, за которым следует u.икл мытья посуды С МОIOw,им средством, после KOToporo следуlOТ два u.ИKJlа полоскания и u.икл суwки. 3лектромотор насоса, наrревательны злемент, дpeHa>KHЫ nepenycKHO KJlanaH и соленоид распределителя MOIOw,ero средства - 3ТО все выходы, управляемые интеrральными peJle. 3та система имеет два входа: кнопка запуска и БJlокировка ABepu.bI. Микроконтроллер, необходимы AflЯ управления 3TO системой, имеlOw,е два входа и пять выходов, может быть ЛlO6ым микроконтроллером ceMeCTBa PIC18, n03TOMY был использован caMЫ AeweBbI из них  PIC18F1220. Схемное реwение системы nоказано на рис. 9.2. КНОП04НЫ переKJl104атель открытия дверцы срормирует сиrнал лоrИ4еско единиu.ы, KorAa ABepu.a закрыта и сиrнал лоrИ4е cKoro нуля, KorAa ABepu.a открыта. 
Black Plug АС Male J1 5У@ 150 тА White + Power Supply Ground 2 R1 R2 RЗ 10К 10К 10К Green + MG1 Pump Мotor ;; L 1 р) t:a р) :о (J Fill Solenoid :s:: ('".) >-,j (1) L2 :: !?:: '<  'о Soap Solenoid р) t:a  (1) LЗ ::с :s::  Drain Solenoid .....Do:=o + Блокировка SS Relay Ground P1C18F1220 U1  "1' с 2 +0.1 uF + Мойка 1 RAO QRBO 8 2 9 6 RA1 gRB1 17 7 RA2 RB2 18 3 RA3 RВЗ 10 4 RA4 RB4 11 16 #MCLR RB5 12 15 OSC1  RB8 13 OSC2 > RB7 SS Relay Ground .....Do:=o SS Relay Ground It) + С1 1.0 uF SS Relay Ground + SS Relay Ground Heating Element Примечание: блокировка дверцы формирует лоrическую единицу, коrда дверца закрыта и ноль, коrда открыта Рис. 9. 2. Посудомоечная машина, управляемая микроконтроллером PIC18F1220 .j::. о va 
<106 llрименение микроконтроnnеров PIC 18 Проrрамма зтой системы исnользует nрерывание от переКЛlOчателя открытия дверей с тем, 4тобы прервать работу nосудомое4НО маwины, если ее дверца будет открыта в те4ение раб04еrо Ц(IJt!lа. Во всех OCT;':H:bIH::IY отноwениях проrрамма системы .LОВ()ЛЫIO проста,  она OTt)aoaTbIBaeT схему nlj.. .:J;,овательности оnераци nроцесса МЫТЫI посуды, приведеННУIJ на рис. 9.1. В примере 9.1 nриведена полная nporpaMMa './ПОСl!J\'НI/IЧ rюсудомое4НО маwино. Е,о,инственным тонким моментом является пере ключатель 01 к:рытия дверцы, KOTOPЫ дол>кен останавливать маwину в ЛlOбой момент, коrда ее дверца будет открыта. Korдa дверца будет закрыта, nосудомое4ная машина ДOJI>Кltа nродол>кить CBOIO работу И3 Т04КИ nрерывания. Здесь исnользуется nрерывание ДЛЯ Toro, 4тобы сиrнализировать об открытом состоянии дверцы маwины. Всякий раз, коrда дверца открывается, на вход nрерывани INTO на АВО поступает отрицательны срронт сиrнала. Это вызывает nроцедуру обслу>кивания прерывания в срункции MyHighlnt. В этой срункции сохраняется TeKyw,ee состояние маwины и разрешается бу- дущее nрерывание INTO, после 4ero срункция ожидает закрытия дверцы. Коrда дверца будет закрыта (обратите внимание на устранение дребезrа контактов переКЛlOчателя открытия двери), состояние маwины восстанавливается так, 4ТО ее работа мо>кет npo- дол>киться Т04НО с Toro момента, коrда была открыта дверца. Пример 9. 1 1* * DporpaMMa nосудомое4НО MaWMH *1 #include <p18cxxx.h> #include <delays.h> 1* Установка 6мтов KOHMrypaUMM *  установка BHYTpeHHe смнхронмзаuмм  ВКnЮ4енме cTopoeBoro TaMepa *  ВКnЮ4енме HM3KoBonbTHoro nроrрамммроваНИR  ОТКnЮ4енме с6роса по 4аСТИ4НО потере nMTaHMR разреwенме 06ero с6роса *  *1 #pragma #pragma #pragma #pragma #pragma config OSC config WDT config LVP config BOR config MCLRE INTI02 OFF OFF OFF ON void MyHighlnt (void); II rrpoToTMn npoueAYP o6cnYMBaHMR прерыванмй #pragma interrupt MyHighlnt #pragma code highvector=8 II MyHighInt  зто npepBaHMe II highvector по аАресу Ох08 void highvector (void) asm GOTO MyHighlnt endasm #pragma code II Interrupt service procedure II occurs anytime door is opened II 
oid MyHighlnt (void) rnaBa 9. Снетемы уnравnення 407 char а; а = PORTB; PORTB = о; do { while (PORTBbits.RBO == Delay100TCYx(10); }while (PORTBbits.RBO == О); INTCONbits.INTOIF = о; PORTB = а; II сохраненме TeKyero состоянмя II останов MaWMH О) ; II пока дверuа О'I'крЫ'l'а II устраненме дре6езrа . 16 мс II с6рос nara INTOIF II ABepua закрта cMcTeMHaR TaKTOBaR 4астота равна 250 KrU Т.е. ее nepMoA равен 4 мкс, 4ТО Аает KOMaHAH uMKn в 16 мкс :id Wait200ms (void) Delay100TCYx(12S); id WaitMinute (char howmany) 1I 16 * 125 * 100 200 мс int а, Ь; II 300 * .2 sec for (а = о; а < howmany; а++) . for (Ь = о; Ь < 300; Ь++) Wait200ms (); :id DoCycles (void) char а; for (а = о; а < 4; а++) { PORTBbits.RB2 1; WaitMinute(l); PORTBbits.RB2 о; PORTBbits.RB1 1; i f (а == 1) PORTBbits.RB3 Wait200ms () ; PORTBbits.RB3 } WaitMinute(3); PORTBbits.RB4 = 1; WaitMl.n'Jte(l); PORTB = о; } PORTBbits.RBS = 1; WaitMinute(30) ; PORTB = о; .:;id main (void) 1 ммнута II nOBTopMTb 4 раза II KnanaH заnоnненмн BKn. II OMAaHMe 1 ммнута II KnanaH заnоnнеНМR Bn. II мотор насоса BKn. II Tbe С MOM среАСТВОМ 1 ; о; II OMAaHMe 3 MMHYT II coneHoMA стока BOД вкл. 1I ОМАание 1ммнута I1 все BKn II HarpeBaTenb BKn II cYWKa в те4енмм 30 ммнут II все BKn. 
408 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 CiSCCON  Ох23; AIJCGN1  OxOF; l'1\r SA 2 ; ТЮ SB 1 ; i>OPTB о; I I внутренни '.raKToBbI l'eHCpa'I'Op на 250 KrU II все ВХОДЫ цифрове II порт А, би. .  ВХОД II порт в, бит   ВХОА II BKn4eHMe системы 1\CONbts.rPEN = о; INTCON2bits.INTEDGO = о; INTCONbits.INTOIE  1; INTCONbits.GIE = 1; II TOnbKO BcoKonpMopMTeTHoe npepBaHMe BKn. II актмвен oTpMuaTenbH pOHT INTO II разреwенме INTO II разреwенме npepBaHM whi le (1) { while (PORTAbits.RA1 DoCycles(); 1) ; II OMAaHMe uмкла MOKM Друrие ЦИKJlЫ Moryт быть добавлены в систему без необходимости написания большой доnолнительно nporpaMMbI. Например, мо>кет быть добавлен интенсивны цикл мойки кастрюль, посредством добавления сиrнала от BToporo распределителя MOIOw,ero средства на АВ6 и сиrнала от КНОП04ноrо nереKJl104ателя блокировки на ААО. Этот nереКЛЮ4атель Mor бы быть обозна4ен как "норма/кастрIOЛИ". В поло>кении 3Toro переКJ1Ю4ателя "кастрIOЛИ" BTOPO цикл мойки СО вторым распределителем МОlOщеrо средства обеспечил бы MbITblO кастрlOЛЬ с ИСПОЛЬЗ0ванием HeMHoro больwеrо КОЛИ4е ства MOIOw,ero средства. MHoro доnолнитеJlЬНЫХ срункци моrло бы быть добавлено в nосудомое4НУЮ маwину прн минимальных расходах, и больwе AeHer мо>кно было бы заработать при ее прода>ке. Кюкдая новая срункция требует использовани дополни- тельной схемы операци, которая ИЛЛlOстрировала бы работу системы и облеr4ала бы разработку nporpaMMHoro обесnе4ения. 9.2. Примеры CCTeMЫ в этом подразделе описана разработка нескольких последовательных систем управления с ИСllОЛЬЗ0ванием методики, описанно в nодразделе 9.1. Пример 1 Друrим рассматриваемым нами примером системы является система управле- ния доро>кным дви>кением. Система, разработанная здесь, предназначена ДЛ управ ления одним перекрестком, однако она имеет входы, исnользуя которые, ее мо>кно расширить для сети перекрестков, которые будуТ осуw,ествлять инсрормационны об мен между собой. Кроме Toro, MOryr быть введены правила, которые будуТ изменять характер базовых u.ИKJlОВ для кюкдоrо перекрестка в некоторых обстоятельствах. Рис. 9.3 показывает диаrрамму npou.ecca управления перекрестком. Наnравле ння обозна4ены как NS (ceBep/lOr) и 8/IJ (восток/запад). Времена YKa3bIBalOT, коrда кон- кретное направление активизируется и может nроrраммироваться. Диаrрамма следует стандартной nрактике ВKJl104ения KpacHoro света в обоих направлениях в те4ение ко- ро., Koro времени с тем, 4тобы предотвратить КОЛЛИ3ИИ. Времена на диаrрамме не npo ставлены, потому 4ТО они Moryт проrраммироваться. 
rnaBa 9. Снетемы управnення 409 Северюr красный CeBeplOr желты й CCBcplOr зеленый Востокзапад: красный : , I Востокзапад: желтый Восток-запад: зеленый Рис. 9.3. ТехнолоrИ4еская карта oAHoro цикла управления дорожным дви>кением Система использует микроконтроллер PIC18F4220, малую клавиатуру телесрон- Horo стиля 2х16, ЖКиндикатор для целе проrраммирования, входы от Дa-IЧИКОВ nOTo ка AOpO>KHOrO движения и кнопок newexoAoB, выходы управления wecTblO лампами, а также nоследовательны интерсрес для СЛУ4аев, KorAa взаимосвязаны HeCKOJlbKO пе реходов. Межсоединения переходов требуlOТ использования HeKoToporo стандарта интерсреса, KOTOpЫ может оБСJlуживать довольно больwие расстояния. V1HTepcpec RS422 или RS485 работает на расстоянии до 4000 сруТов, 4ТО П04ТИ равно миле, так ч ю любо этих стандартов мо>кет быть использован. Электронные схемы системы ил ЛЮСТРИРУlOтся двумя схемными реwениями: рис. 9.4 показывает OCHOBHYIO nечатнуlO плату контроллера системы, а рис. 9.5 показывает схему уnравлеIlИ, кнопку перехода и nepexoAHYIO плату (которые MorYT расnолаrаться на TO же caMO основной nечаТIIО плате). Система использует те же самые 4-выводные соединительные разъемы для ПОДKJl104ения всех ламп, даТ4ИКОВ и кнопок перехода. 3та система разработаllа для Toro, 4тобы, 4тобы управлять новым светосрором светодиодноrо стиля и nеwеходными светосрорами. Более новые лампы потребляlOТ MOW,HOCTb от 13 до 25 Ватт, при 3ТОМ использованные схемы упраВJlения обеспе4иваlOТ достаточны ток для двух наборов ламп. Красные и зеленые лампы потребляlOТ 13 Ватт моw,ности, а желтые  25 Ватт. nporpaMMa AflЯ 3TO системы ИЛЛlOстрируется в примере 9.2. 3та система реали зует больwинство не06ходимых срункци, однако только команды синхронизации CBe тосроров передаются по сети. nporpaMMa ка>кется довольно длинно, однако вс;е >ке она компилируется Bcero только в 2605 Я4еек памяти nporpaMM, так 4ТО П04ТИ 2000 ячеек остаlOТСЯ для дополнительных зада4. 
се8ер-юr красныll )1 сеnер--юr желтый се""р--юr зеленый Вt)сmJi.lЗпад красный ВОI.'10К-Зanад жеЛIЫЙ Jюсто)(-запад зспе:ный СlIср--юr. псреход  ссnср.-юr стоп ROcroK-З3l1ад переход BOCTOK-'I3I1аOI стоп +5V с Contrast л.л. f 10К I D4 VDD УЕЕ RfW  С2 D5 VS D6 2 Х 16 LCD J 0.1 и' и7 > R2 Е )R  < R1 PIC 1BF4220 RS VLED+ VLED- < - > < 10К ....N I I I U1 ......, I 2 RAO 00 RBO 33 ТRIP А 3  34 4 RA1 RB1 35 ) ТRIP В 5 RA2 RB2 36 WALK А 6 RA3 RB3 37 } WALK В 7 RA4 RB4 38 L...  RA5 RB5 39 11 1 2 3 OSC1 RВ'6  OSC2 RB7 40 4 5 6 1 15 19 MCLR RCO 16 8 20 ROO RC1 17 7 9 21 R01 RC2 18 О # 22 RD2 RC3 23 * 27 RDЗ RC4 16 I I 28 R04 RC5 17 29 RD5 тх 18 30 R06 RX ..4L R07 ин" RE2   ...L...... R3 J1 ::::r: С1 REO RE1 JOO. ,л. л.. 1.0 uF (%)1 "''' 1 N МАХ1483 120 ......, U2 4 01 () RO 1 """2" () -----т- SW2 :::: " p о> А 6  С3 2 RE z 7 5 л.л. MS  0.1 uF (.!) В .........g... .л.Vл.V ЛU  ..........f-..  Л.V л. v  Лl C::=r.:::J 1,() .........L "'" AL ..., v  10К  RJ-45 or RJ-11 SW DIP-4   MS = 1 Master Рис. 9.4. СхемотеХНLI1ческое решение системы управления доро>кным движением. Плата контроллера  о :::1 'о ::::: :: (1) ::r: (1) ::r: ::::: (1) :: ::::: ::о:: 'о о ::о:: о ::r: >-,j 'о О :::. :::. (1) 'о О t:a ""о n 00 
C":I"-'p 101 I . 1;/ V I<IIЩlkd ..l,IM 1It:I1J\:МIДОМ I О1 ТlP120 сt"I!l.:рюr Z tIOCIUKml(a...l. 1 +12 V RnСIОКlarШ..t 2 Рис. 9. 5. Схема ПОДКЛЮ4еНLI1Я светофоров на перекрестке +12 V R7 2К R8 1К R9 1К R10 1К  се..,р..юr пеf1C'O север.юr СТОП P,t)CTOK-11ШL'J, СТОП IЮсrо}."WI8.1 сroп '"1   '"   n :;;: а ...., (t) Е: е:: '-<  "1:j  '"  (t) :I: :;;:  .+::- 
412 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Пример 9.2 1* * Проrрамма CMCTeM уnравлеНМR дopOHM ABMeHMeM *1 #include <p18cxxx.h> #include <delays.h> #include <timers.h> #include <usart.h> 1* Установка 6мтов KOHMrypaUMM установка BHYTpeHHe смнхронмзаuмм выклчение C'l'opOeBOI'O '.raMepa ВЫКJIЮ'1:енме HM3KoBOnbTHoro nporpaMMMpoBaHMR О'l'КJIюченме с6роса по частмчно no'.repe nM'l'aHMR *  разрешенме 06ero с6роса #pragma config OSC INTI02 #pragma config WDT OFF #pragma config LVP OFF #pragma config BOR OFF #pragma config MCLRE = ON II ********* nepeMeHHe в naMRTM AaHHX ************ void MyHighInt (void); void MyLowInt (void); II npoTOTMn npoueAYP II 06cnYMBaHMR npepBaHM #pragma interrupt MyHighInt #pragma code highvector=8 II MyHighInt  3ТО npepBaHMe II highvector по аАресу Ох08 void highvector (void) { asm GOTO MyHighInt endasm #pragma interruptlow MyLowInt #pragma code low vectorOx18 II MyLowInt  зто npepBaHMe II нмзкоnрмормтетньщ вектор по аАресу ОхОО18 void low vector (void) II нмзкоnрморитетн вектор asm GOTO MyLowInt endasm HM3KonpMopMTeTHblx npepBaHM } II nepexoA на nОАnроrрамму 06ра60ТКМ II II nepeMeHHe в ЭСППЗУ AaHHX II #define BlinkStartHours О #define BlinkStartMinutes 1 #define BlinkStopHours 2 #define BlinkStopMinutes 3 #define EWYellowTime 4 #define NSGreenTime 5 #define NSYellowTime 6 #deflne EWGreeпTlme 7 
lnaBa 9. Системы управnения 413 II 1I Program memory data I! rom near char 100kupKey [] 1, 4, 7, 10, II neBbI cTon6eu 2, 5, 8, о, II срещщ cTon6eu 3, б, 9, 11 II npaBbl cTon6eu ; om near ch<1r str1 [] "Ready to control"; om near char str2 [] the traffic! ". om near char str3 [] ". ::-om near char str4[] " Enter the time " . , ::-om near char strS [] "Set blink start " . , ::-om near char strб [] "Set blink stop " . , ::-om near char str7 [] " Set EW ye110w ". ::-om near char str8 [] Set EW green "; ::-om near char str9 [] " Set NS yellow "; ::-om near char str10 [] Set NS green " . , ::-om near char str11[] "'I'he current time"; ::-om near char str12 [] Blink start " . , ::-om near char str13 [] BlinK stop " . , ::-om near char str14 [] EW yellow ". , :)m near char str1S [] EW green ". .:-:)m near char str1б[] NS yellow " . , :-om near char str17 [ ] NS green " . ::om near char str18 [] "Enter а command " . , ::-om near char str19[] 1  8 " . , nepeMeHHble в naMRTM AaHHX tpragma udata :ar trаnsmitQuеuе[lб]; :ar rесеivеrQuеuе[lб]; :r.ar inTrans; :ar outTrans; :ar inRecv; :ar outRecv; ::-.ar seconds; :::-.ar minutes; :ar hours; ::-.ar NSGreen; :ar EWGreen; ::--.ar state; ::-.ar buffer [4] ; :':-.t ptr; tpragma code poueAypa 06cnYMBaHMR npepBaHM вознмкаюх KaAY сеКУНАУ ! счмтвает по аАресу Rчеку ЭСDDЗУ AaHHX 
414 ITримененне мнкроконтроллероrз PIC 18 char eeRead (char address) EECON1bits.EEPGD  о; EEADR = address; EECON1bits.RD = 1; return ЕЕОАТА; II ЗаnМСLIвае'l' Rчеку ЭСПDЗУ Аанных по аАресу с .цаннымм void eeWrite (char address, char data) INTCONbits.GIEH = о; INTCONbits.GIEL  о; EECON1bits.EEPGD = о; EECON1bits.WREN  1; EEADR = address; ЕЕОАТА data; EECON2 = OxS5; EECON2 = ОхАА; EECON1bits.WR  1; while (PIR2bits.EEIF о); PIR2bits.EEIF  о; EECON1bits.WREN о; INTCONbits.GIEH 1; INTCONbits.GIEL 1; void sendLCDdata (char data, char rs) PORTC = data » 4; PORTCbits.RC5 PORTCbits.RC4 PORTCbits.RC4 Delay1 ТСУ () ; Ое1ау1 ТСУ () ; Delay1TCY() ; PORTC = data & OxOF; PORTCbits.RC5 rs; PORTCbits.RC4 1; PORTCbits.RC4 о; Delay1TCY() ; Delay1 ТСУ () ; Delay1TCY () ; PORTC  о; rs; 1; о; void initLCD (void) int а; Delay1KTCYx(2); for (а = о; а < 3; а++) { sendLCDdata (Ох20, О); DelaylKTCYx (1); } sendLCDdata (Ох28, О); sendLCDdata (Ох01, О); Delay1KTCYx (1); II nepeAaeT neBLI nоnубат II проверка RS II MMnYnbc Е II заАерка 48 мкс II nepeAaeT nравй попубайт II npoBepReT RS II MMnYnbc Е II заАерка 48 мкс II OMдaHMe 32 мс II nереАача Ох20 II OMAaHMe 16 мс II nереАача Ох28 II nереАача Ох01 II OMAaHMe 16 мс 
rnaBa 9. Системы управnения 415 sendLCDdata (ОхОС, :)); sendLCDdata (Ох06, О); II nереАача ОхОС II nереда4а Ох06 1 Отобраает в заАанно позмuмм строку cMMBonoB мз памятм IlpopaMM (sLr) 11 строка 1 ммеет nозмuмм от Ох80 АО ОхА7 '1 строка 2 ммеет nозмuмм от ОхСО АО ОхЕ7 / 1 О'l'обраае'.r в заАанно nозмuмма C'l'pOKY сммволов мз памя'.rм IIpol'paMM (s tr) void DisplayStringPgm (char position, rom char *str) char ptr = О; sendLCDdata(posltion, О); II nepeAa4a nозмuмм while (str [ptr] ! = О) sendLCDdata(str[ptr++], 1); II nepeAa4a сммвола oid getNumb (char count, char temp) if (ptr < count) if (temp >= О && temp <= 9) { sendLCDdata (ОхС6 + ptr, О); sendLCDdat (temp + Ох30, 1); buffer[ptr++] = temp; } else if (temp 1 О) II шаr назаА (*) if (ptr = О) ptr; sendLCDdata (ОхС6 + ptr, О); sendLCDdata (' " 1); :oid Disp3 (char temp) sendLCDdata (temp I 100 + Ох30, 1) ; temp %== 100; sendLCDdata (temp I 10 + Ох30, 1) ; sendLCDdata (temp % 10 + Ох30, 1) ; -:oid Disp4 (char first, char second) sendLCDdata (first I 10 + Ох30, 1) ; sendLCDdata (first % 10 + Ох30, 1) ; sendLCDdata ( ,., 1) ; . , sendLCDdata (second I 10 + Ох30, 1) ; sendLCDdata (second % 10 + Ох30, 1) ; t outTransQueue (void) int temp; 
416 ITрнменение мнкроконтролnеров РI С 18 if (in'l'rans  outTrans) return Ох1 00; II еслм nyc'.ro temp = transmitQueue[outTrans); II ПОJIУ4ение Аанных outTrans = (outTrans + 1) & OxOF; return temp; int inTransQueue (char data) if (outTrans == ((inTrans + 1) & OxOF)) return Ох100; II еслм заполнено transmitQueue[in'l'rans] = data; iп'l'rалs  (j nTrans  1) & ОхОЕ'; PJE1bit_s.TXIE = 1; II переАа'r4МК вкл rclurn о; int outRecvQueue (void) int temp; if (inRecv == outRecv) return Ох100; IlecnM пусто temp = receiverQueue[outRecv]; II nOnY4eHMe AaHHX outRecv = (outRecv + 1) & OxOF; return temp; inl inRecvQueue (char data) if (outRecv == ((inRecv return Ох100; receiverQueue[inRecv] inRecv = (inRecv + 1) return о; + 1) & OxOF)) II eCnM заnоnнен data; & OxOF; void MyHighlnt (void) char а, temp; if (INTCONbits.INTOIF == 1) { [N'l'CONbits.INTOIF = О; if (NSGreen > 10) NSGreen = 10; II 04мстка nara IN'l'OIF } else if (INTCON3bits.INT1IF 1) INTCON3bits.INT1IF = о; if (EWGreen > 10) EWGreen = 10; } else if (INTCONbits.RBIF 1) Delay1KTCYx(1) ; temp = о; if (PORTB & OxFO != OxFO) Ilкорректная кnавмша PORTC = OxEF; I I выбор caмOI'O левоrо c'l'on6ua 
rnaBa 9. Снетемы управnения <117 whi le (( PORTB & OxFO) == OxrO) II кnавмша не распознана { PORTC = (PORTC « 1) I 1; temp += 4; } for (а = Ох10; а != о; а «= 1) { II B3RTMe слеАyIOlцет'о с'.rоnбца II Асбавпени:е сrр:жм к коду КJ JдВИ.IJИ II нrаходенме строкм if ((РОНТВ & а) == О) break; temp++; } temp 100kupKey[temp]; switch (state) { case о: { if (temp == 10) DisplayStringPgm Disp1ayStringpgm state = 1; break; II n6aR комаНАа (Ох80, str18); (ОхСО, str19); } case 1: { if (temp >= 1 && temp <= 8) { ptr = о; DisplayStringPgm (Ох80, str4 + (state  1)* 17); DisplayStringPgm (ОхСО, str3); state = temp + 1; } else { Disp1ayStringPgm (Ох80, str1); DisplayStringPgm (ОхСО, str2); state = о; } break; } case 2: { II "установка TeKyero временм" (команда *1) getNumb (4, temp); if (temp == 11) II BBOAMTCR # { hours = buffer[O] * 10 + buffer[l]; minutes = buffer[2] * 10 + buffer[3]; DisplayStringPgm (Ох80, str1); DisplayStringPgm (ОхСО, str2); state = о; } break; } case 3: { II "установка MMraero старта" (комаНАа *2) getNumb (4, temp); if (temp == 11) { 
418 ITpHMeHeHHe MHKpOKOHlpOnnepOB PIC 18 } case 4: } case 5: } case 6: eeWrite (BlinkStartIIours, buffer[O] * 10 + buffer[lj); eeWrite(BlinkStartMinutes, bufferl7.] * ]0 + Ьuffеr[ЗI); DisplayStringPqm (Ох80, str1); DisplayStringPgm (ОхСО, str2); state = о; } break; / I "установка ммрающеро ОС'l'аlIоrза" (комаНАа *3) getNumb (4, temp); if (temp -=== 11) { eeWrite (BlinkStopHours, buffer[D] * 10 + buffer[l]); eeWrite (BlinkStopMinutes, butter[21 * 10 + buffer[3]); DisplayStringPgm (Ох80, str]); Disp1ayStringPgm (ОхСО, str7.); state = о; } break; // "установка enToro востокзаnаА" (команда *4) getNumb (3, temp); if (temp 11) { if (buffer[O] * 100 + buffer[l] * 10 + buffer[2] > 255) buffer[O] buffer[l] 2; buffer[2] = 5; } eeWrite (EWYe110wTime, buffer[O] * 1 О О + bu f f е r [ 1] * 10 + buffer[l]); DisplayStringPgm (Ох80, str1); DisplayStringPgm (ОхСО, str2); state = о; } break; // "установка зеленоrо Востокзаnад" (комаНАа *5) getNumb (3, temp); if (temp 11) { if (buffer[O] * 100 + buffer[l] * 10 + buffer[2] > 255) buffer[O] buffer[l] 2; buffer[2] 5; 
rnaBa 9. Снстемы управления <119 } case 7: { } case 8: { } case 9: { } eeWrite (EWGreenrime, buffcrlO] * 100 + buffer[l] * 10 + buffer[I]); DisplayStringPgm (Ох80, str1); Disp1ayStringPgm (ОхСО, str2); state = о; } break; II "установка en'.roI'O север -юр" (комаJща * 6) getNumb (3, l.emp); if (lcmp 11) { if (buffer[O] * 100 + butferl1] * 10 + buffer[2] > 255) buffer[O] buffer[l] 2; buffer[2] '" 5; } eeWrite (NSYellowTime, buffer[O] * 100 + buffer[l] * 10 + buffer[l]); DisplayStringPgm (Ох80, str1); DisplayStringPgm (ОхСО, str2); state '" О; } break; / / "установка зелеl!Оro ccheP---Юr''' ( команда *7) getNumb (3, temp); if (temp 11) { if (bиffer[O] * 100 + buffer[l] * 10 + buffer[2] > 255) buffer[O] buffer[l] 2; buffer[2] = 5; } eeWrite (NSGreenrime, buffcrlO] * 100 + buffer[l] * 10 + buffer[l]); Disp1ayStringPgm (Ох80, str1); DisplayStringPgm (ОхСО, str2); state = о; } break; // "Отобразмть все" (комаНАа *8) DisplayStringPgm (Ох80, strl1 + ptr * 17); DisplayStringPgm (ОхСО, str3); sendLCDdata (ОхС5, О); i f (ptr === О) Disp4(hours, minutes); else if (ptr === 1) 
420 ITрнменение микроконтроnnеров PIC 18 Disp4(eeRead(BlinkStartHours) , eeRead(BlinkStartMinutes)) ; else if (ptr == 2) Disp4 (eeRead(BlinkStopHours), eeRead(BlinkStopMinutes)) ; e1se if (ptr == 3) Disp3 (eeRead(EWYellowTime)); else if (ptr == 4) Disp3 (eeRead(EWGreenTime)); else if (ptr == 5) Disp3 (eeRead(NSYcllOW'l'ime)); else if (ptr == б) Disp3 (eeRead(NSGreenTime)); ptr++; if (ptr == 7) state 10; break; } case 10: { DisplayStringPgm (Ох80, str1); DisplayStringPgm (ОхСО, str2); state = о; break; } PORTC о; temp = PORTB; INTCONbi ts. RBIF о; II HYHO CqMTaTb PORTB AnR II с6роса M3MeHeHMR II с6рос npepBaHMR void MyLowlnt (void) int temp; if (PIR1bits.TMR1IF == 1) { II уста нов TaMepa peanbHoro времени II на 24-часово peMM PIR1bits.TMR1IF = о; WriteTimer1 (-15625); seconds++; if (seconds == 60) { seconds = о; minutes++; if (minutes == 60) { minutes = о; hours++; if (hours 24) hours = о; } else if (PIR1bits.RCIF == 1) PIR1bits.RCIF = о; II с6рос npepBaHMR 
rnaBa 9. Снетемы управnення 421 inRecvQueue (RCREG); 11 сохраненме очередм nРИ!!Н'l'ЫХ )\ан][ых } eLse if (PIRlbits.TXIF == 1) PIR1bils.TXIF = о; 11 сброс nрерванмя temp = outlransQueue(); if (temp == Ох100) PIE1bits.TXIE = о; 11 nереАатчмк BKn else TXREG = temp; :har HalfSecond (char count) int а, temp; for (а = о; а < count; at+) lemp = outRecvQueue(); if (temp ! Ох100 && PORTDbits.RD7 == О ((PORTD & OxFO) » temp & OxF7 == о) return 1; Delay1KTCYx (31); Delay10TCYx (25); return о; oid DoLights (void) 11 переда4а AaHHX && IlecnM веАомое устройство 4) == (temp & 7) && if ((hours >= eeRead(BlinkStartHours) && 11 MMraHMe hours < eeRead(BlinkStopHours)) && ( minutes > eeRead(BlinkStartMinutes) && minutes <= eeRead(BlinkStopMinutes))) PORTAbits.RA1 1; PORTAbits.RA5 1; PORTDbits.RD1 1; PORTDbits.RD3 1; Ha1fSecond(1); PORTAbits.RAl о; PORTAbits.RA5 о; PORTDbits.RD1 о; PORTDbits.RD3 о; HalfSecond(l); } else do { do { do { do { 11 cebep-r еnтй 11 востокзаrrаА зеnенй 11 ceBepr, стоп I1 востокзаrrаА, стоп II OMAaHMe 1/2 секунды 11 нормаnы!Ый uикn 11 смнхронмзаUМR 
422 IIрнменение микроконтролnеров PIC 18 do { do { NSGreen '" eeRead (NSGrССЕ1'irпс); WGreen  eeRead (EWGreenTime); POE'l'Abj ts. М4 1; I I ВОС'l'ок.заI1аА еЛ'l'Ы PORTAbits.RA5 = О; (HalfSecond (eeRead(EWYellowTime)) POR'l'Abits.RA4 О; РОRТЛЬits.RA3 1; POR'I'Abits.RAO О; РСЖ']'АЬ i ts . НА2 1 ; t>ORTI)bi ts . RI)2 1; POETUbiLs.RDl 1; ) while == 1); I I ВОС'l'окзапаА красный 11 север l' 3СЛСНЫ 11 ВОС'l'ок...заl!а).( персхоц 11 север ш' C'l'Ol! ) while (HalfSecond (eeRead(NSGreen/2)) == 1); PORTDbits.RD2 О; PORTDbits.RD3 = 1; ) while (HalfSecond (eeRead(NSGreen/2)) == 1); РОRТЛЬits.RA1 1; II северюr enT PORTAbits.RA2 = О; (HalfSecond (eeRead(NSYellowTime)) PORTAbits.RA1 О; POl\'l'Abi ts . МО 1; POETAbits.RA5 1; POE'l'l\bits . М3 О; PORTDbits.RD3 1; PORTDbits.RDO 1; ) while == 1); 11 ceBepr KpaCH I I восток.заI!аА зслеl!Ы: 11 востокзаrrаА стоп I1 ceBepr переход } while (HalfSecond (eeRead(EWGreen/2)) == 1); PORTDbits.RDO О; PORTDbits.RD1 = 1; } while (HalfSecond (eeRead(EWGreen/2)) 1); } vo i (j ma i n (void) int а; OSCCON ADCON1 TRISA 'I'RISB = Ох22; = OxOF; о; ОхП."; II внутреННЯR смнхронмзаuмн 250кrц II все BXOA uмфрове II все WTpbKM порта А  BXOA 11 все WTpbKM порта В  BXOA TRISC TEISD TRISE Ох80; OxI:'O; О; II все шIъJpы<м nopra С  ВblXOДoI, за Ж.'IOIICR<'.Нием ОС"! I I Ш'l'рькм 0-3 порта О  BЫXOД, 4 7  BXOД II все WTpbKM порта Е  BXOД if (PORTDbits.RD7 == О) РОЕТЕЫ ts. НЕ1 О; POETEbits.RE1 1; II ведомое YCTPOCTBO е]зе 1I BeAyee YCTPOCTBO 
rnaBa 9. Системы управления 1\23 POR'l'l\ POR1'C РОНТD state О; о; о; о; initI,CD () ; DisplayStringPgm (Ох80, str1); l)isp1aySLringPgm (ОхСО, str2); IN1ON?bits.RBPU  о; Open1'imerl ('I'IMERTN1' ON & Тl 8ВП' RW & 'л SOURCE IN'f &   '1' 1 Р S  1  4 ) ; Write'fimer1 (15625); IPR1bits.TMR1IP о; PIE1bits.TMR1IE 1; JN'I'CON3bits.INT11P 1; IN'fCON3bits.INT11E 1; INTCON2bits.IN'fEDGO = о; IN1'CONbits.IN'fOIE = 1; INTCON2bits.RBIP = О; INTCONbits.RВIE = 1; IPR1bits.TXIP IPR1bits.RCIP О; О; 1I все лампы вкл 1 I На .rрузки flOp'I'a В I3KJJ. II KaAY сеКУНАУ II TaMep 1 нмзкм rrpMopMTeT II npepBaHMe от TaMepa 1 I3Kn I1 INT1 имеет всоки прмормтет 11 разрешенме 11 06ЪR13nенме INTO пеРСКJJючасмым 110 II о'l'рмuателыIмуy фрОН'l'У II разреwенме INTO II нмзкм nриормтет II разреwенме rrpepBaHMe по мзмененмю БИ'l'а 11 B60p нмзкоrо npMopMTeTa 11 AnR USART II USAЮ' ра6отаеТ на екорос1'М 1200 6о,ц OpenUSAR'I' (USARTTX INTON & USART RX IN'I' ON & USAR'fASYNCHMODE & USART EIGH'I' BIT & .  USЛRТ CONT RX & USARTBRGHHIGH, 3) ; inRecv = outRecv = in'I'rans = outTrans = О; RCONbi ts. 1 PE;N = 1; INTCONbits.GIEH  1; INTCONbits.GIEL = 1; 1I Synchronize all slaves 11 for (а = О; а < 8; а-++) { II 06а npMopMTeTHble nрерывания uкл. 1I разреwенме npepbl13aHM while (inTransQueue(a) -== Ох100); II посылка адреса II все ведомые YCTpoeTBa nосьшаЮ'l' 0000 Оааи .ЦJ!Я 1I смнхронмзаu мм II мх 'l'aKMM 06разом, что мх UMKnbI БУДУ'l' СИНХРОННЫ 1I 0000 о  зто команда смнхронмзаu ми } while (1) 
424 ITрименение MHKpOKOHTpOnnepOB PIC18 DoLights() ; Прииер 2 Сейчас мы рассмотрнм снстему уnравлення сннскавшнм nОnУЛЯРIЮСТЬ CallH '.ap ным яw,LI1КОМ ,цля котов. nодо6ное нзделне nронзводнтся фнрмо Litter Maid. Ннкто не люБLl1Т 4L11CTHTb саннтарный яw,нк кота, однако все, 4ТО пользователь должен делать в случае CaHLI1TapHOro яw,нка  зто прн6лнзнтельно однн раз в неделю устанавлнвать в нем CMeHHЫ одноразовы KOHTeHep  YCTPOCTBO автомаТН4ескн 6удет заrружаП1 в Hero то, по остается после кота. HHKaKoro запаха, ннкакнх за60Т. 3та CLl1CTeMa довольно проста. Она содержнт сенсорные nереключателн, К010рые указывают, коrда nepeMew,aeMbI совок nознu.ноннрован в каком лн60 KOllu.e ящнка, электромотор, nеремеw,аюw,н совок, YCTPOCTBO звуково снrналнзацнн ЩIЯ про блемных СLl1туацн, а также пару фотодатчнков, оnределяюw,нх, находнтся лн кот в ca ннтарlЮМ яw,нке. Если кот заwел в caHHTapHЫ W,HK, то совок стоnорнтся в пластмас- совом блоке н OCTaeTC в зтом COCTOHHH ew,e по KpalIe мере 1 О МНIIУТ посnе Toro, как кот ПОКLI1нет яw,нк. (Мы, коне4НО, не хотнм травмнровать кота!) 3то простая СНС1ема, ее схемное решеНLI1е nоказано на рнс. 9.6. Не60льшое реле (выдеРЖLl1вает при6лнзнтелыю 40000 u.нклов сра6атывання) нсnользуетс ,цля nереключшщя наnравлення вращеllНЯ электромотора, потому 4ТО стонмость однонаnравленноrо электромотора Зl1a4нтельно н LI1>Ke , чем двунаnравленноrо. Наnравленне Bpaw,eHH так>ке мо>кет 6ыть нзменено Me ханичеСКLI1. Фотодатчнкн ВКЛЮ4ены последовательно, n03ToMY, коrда кот nepeKpbIBaeT ОДLl1Н ЛLl1бо 06а датчнка, мнкроконтроллер nОЛУ4ает на выводе АВ4 снrнал лоrнческо еДLl1НLI1ЦЫ. 3то последовательное ВКЛЮ4енне выnолнет ту же функu.ню, 4ТО н лоrН4е- ская схема И. Зуммер, nоказанны на схеме, представляет c060 СНПlaJlнзатор Мело pLl1, КO"Iорый совместнм с компонентамн схемы 6ез нспользовання какнхлн60 ДОIЮЛIIН тельных деталей. Проrрамма ,цля paCCMaTpHBaeMO снстемы короче, чем какне лн60 друrие про rpaMMbI, прнведеllные в 3TO rлаве. npHMep 9.3 показывает nporpaMMY уnравлення ca HLI1TapHbIM яw,нком кота. Одннм нз ее свойств вляется то, что в случае, коrда совок пытается nоднть 60ЛЬWО 06ьем Bew,ecTBa, он двнжется вперед н назад, нмея u.елыо протолкнуть ero к задне стенке w,HKa, rде расположен KOHTeHep. Еслн после 30 no пыток успех не достнrнуТ, то совок appeTHpyeTC н снстема 6удет ожндать следующеrо IlрLl1хода кота. 3то одна нз HeMHorHx снстем, которая не тре6ует вмешательства чело века во время CBoe ра60ТЫ. 
Зуммер R1 PIC18F1220 10К С1 1.0 uF U1 :! +5V Инфракрасные передатчики .1'1' С2 0.1 uF Il) О4 ТlP120 R2 330 Инфракрасные приемники Исходная позиция .....,Q""". с::::!:!:::::а R4 Конец "" "" R3 47К 01 L$.2 02 4 3 5 8 6 7 1 2 Реле АЗ 2N 2222 1К Рис. 9. 6. Схема управления «caHLI1TapHbIM ЯЩLl1КОМ» "J ::.  c:g   (') ::s.:: о  (1) s:: g: '<  "t:)  c:g ::. (1) :I: ::s.:: ;:Q .+::. N v1 
426 llрименение МИКрОКОНТроnnеров PIC 18 Пример 9.3 1* * CaHMTapHЫ RЩJ.1К KO'l'a *1 #include <p18cxxx.h> #include <dclays.h> 1* УС'l'ановк:а БИ'l'Оt3 KOHMl'ypaUMM YC'l'aH013Ka peMMa I'eHepa'l'Opa RC ныклчсние CTOpocuoro TaMcpa  BbJKn4eHMe НИЗКОВОJlьтноrо проrрамммрованмя о'['кnючс!!ие сброса по чаСТМ4НО потере nМ'l'ЮIМR разрешснме обеrо с6роса * * * *1 #pragma config OSC = INTI02 #pragma config WDT = ON #pragma config WDTPS = 256 #pragma config LVP = OFF #pragma config BOR = OFF #pragma config MCLRE = ON II одна ммнута #pragma code void main (void) unsigned int count, OSCCON = Ох22; ADCON1 == Ох7Е'; TRISA о; TIISB ::: ОхЗl:; РОНТВ = POI,TA О; while (1) { count1; II внутреИНRR СМНХР04астота 250 KrU II все входы uмфрове II nporpaMMMpoBaHMe порта В II останов зnектромотора whl.le (POH1'Bbits.I,B1 { 1 ) РОН'l'В = Ох80; ClrWdt () ; II совок в мсходное полоенме } РОНТВ ::: РОНТА = О; whi1e (PORTBbits.RB4 ClrWdt () ; while (POH.'I'Bbits.RB4 ClrWdt(); count = о; do { II останов ЭJ1eК'".rpcмлq>a J.1 звуковоro сиrна.JIа О) I I ОJ.щанме nрмхода KO'l'a 1 ) I I OAaHMe BXoдa KO'l'a count++; ClrWdt () ; Delay1KTCYx(3); if (PORTBbits.RB4 count = О; I1 12 мс О) } while (count != 50000); count = countl = о; while (PORTBbits.RB3 == 1) { II 10 ммнут I I nРОАвменмя совка к c'l'eHKe 
InaBa 9. Снстемы управnення 427 countt; 1>ОЕ1'В  ОхСО; !)е j ayl!<:TCYx (3) ; ClrWdt () ; if (cont  417) { 11 5 секун)"\ ()OJJeH ОС'j'UlIOВИ'!'ЬСН) POR'l'B '= Ох8 о; count '= о; coиntl++; Delay1KTCYx(25); 1I задерка } if (count1 == 30) { 1 I BblKJJ4eHMe зуммера РОР',ТА = 1; break; 1 I 30 ПОnЫ'l'ОК 1/ за'l'ем нодъем ) POI,'L'B о; 11 останов электромотора Пример 3 Еще одннм прнмером просто снстемы упраВJlення, которая мо>кет быть заllрО rpaMMHpoBalla в МНКРОКОlfтроллере, является домашняя система клима ,.контроля. Эта снстема должна контролнровать температуру в КОМlfате н управлять подачей rюремеll Horo напрження 13 24 В, которое запнтывает 060rреватеш> и/нлн установку КОIЩНЦИО- liнровання воздуха. nредположнм, что эта снстема HY>KДaeTC в не котором интеллекryалыюм Il01.еlf цнале с тем, 4то6ы она моrла автомаТН4ескн переКJlЮШТЬС от HarpeBa к КОtlДнu.ИОltи РОl3аlfИIO  эта функцня отсутствует в 60ЛЬWННСПЮ домаwннх снстем. Реаllнзацн ной ФУIfКu.нн тре6ует нсnользоваl!НЯ даТ4нка Hapy>KHO температуры какоrолн60 ТНllа. ч.l o бы разра60тать зry систему, мы ДОЛ>КНЫ ТО4НО определнть, 4ем мы 6удем УllравлЯ1Ъ н 4ТО 6удем замерять. Входамн этой снстемы 6удуТ cHrlfallbI от панели уrlраuлеllLl1Я, нмеюще клавнаryру ДЛ проrраммнровання, двух датчнков температуры (ОДНII - ДШI термостата н однн  для внеwней температуры) н двух He60J1biUHX реле ВКJlючення "а- rревател HnH КОНДИЦНОlюра воздуха. ПользоватеJ\I>СКИ nporpaMMHbI ннтерфес 06ecne4HBaeT спосо6 ввода временн ДНЯ н на60ра значенн временн ВКЛЮ4ення н UЫКJIЮ'lеIIН снстемы, блш-одаря чему снстема мо>кет nporpaMMHpoBaTbc на ВЫКЛIOlенне (нлн u ка4естве orщнн  lIa 11OlIнже нне темrюраl"УРЫ), коrда дома IIHKoro Ifе 6удет продолжительное время. Так>ке МОЖIfО создать rрасрик работы снстемы в ра60чне н выходные днн (э.IO'. '-расрик IIОЗUОШЮТ rlОJlьзоватеJ\IO, в частностн, ввести распнсаlfие выходных дней, I"IОТОМУ чю lIe у всех су660та н BocKpecellbe  I3ЫХОДlfые ДIIН). ПанеJlЬ управленн 3TO снстемы, открывающас прн открытнн дверцы, 1l0каза на lIа рнс. 9.7. Чнсло кнопок lIа lIe мнннмнзнровано. ОДllако нх достаТО'IIЮ JVI "po rраммнровання снстемы, которое ннтунтнвно 110HTHO почтн для всех rlОльзователе. Bc снстема для npocToTbI ра60ТЫ с ней сформнроваllа на OCIIOBe ИСI1QЛI)ЗOLШIIИЯ Bcel.o только трех кнопок (иР (Вверх), DOWN (ВIIНЗ) ENTER (Ввод)), а таюке ЖКИ, KOTOpЫ 'lОдсвечнваетс, KorAa ABepu.a, зэкрываюw,а кнопкн, открыта. (Некоторые lермостэIы размещены в темных местах н Н04ЬЮ НХ трудно вндеть npH npor-раммироваIlНН). ЖКИ представляет собо ЖКпаlfеnь 2х24, достаТОЧIlУIO, дли ннднкацин температуры и pe жнма проrраммнрованн. Прн нормально работе снстемы температура в 110меw,еllИН 
428 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 от06ра>кается в строке 1, а HapY>KHa температура oT06pa>KaeTC в строке 2. ЕСЛLl1 поль- зователь ВЫПОЛНЮI монта>к нару>кных проводов LI1 не ВЫПОЛНLI1Л LI1X ПОДКЛlOчение к датчи- ку HapY>KHO температуры, то функu.LI1 наrрева/КОНДLl1ЦLl10НLI1роваНLI1 воздуха не 6удет ра60тать, и HapY>KHa температура не 6удет oTo6pa>KaTbc. PLl1c. 9.8 LI1ЛЛIOСТРLl1рует пол ную 3JЮКТРLl1ческую схему CLl1CTeMbI. nОДКЛlOчеНLI1 к системе 060rpeBa в 60ЛЬWLl1нстве случаев стандартны, однако в некоторых системах мо>кет использоватьс отnичная от показанно на схеме u.BeToBa KOALl1pOBKa. 06ычно LI1спользуетс ПОДКЛlOчеНLI1е, которое с OДHO стороны BbIXOALl1T на 24вольтовы транссрорматор, а с Apyro имеет TpLl1 cLl1r- lIanbIbIe линни, передаlOw,ие СLl1rналы tlапр>кени на реле, которые управляют lIarpe вателем, воздуwным КОНДLl1цнонером LI1 злектромотором вентилятора. УпраВЛЯlOщее Hanp>KeHLI1e, равное 24 Вольт nepeMeHHoro тока, ПОЧТLI1 BcerAa LI1СПОЛЬ3У(НСЯ в CLl1CTCMaX 060rpeBa, веНТLI1ЛЦLl1L11 LI1 КОНДLl1ЦLl10НLI1роваНLI1 воздуха (HVAC). 730 12:00:00 АМ Рис.9.7.nанельуправлеНLI1 3лектромотор вентилятора управлетс переКЛlO4ателем, KOTOpЫ вы6ирает aB TOMaTLI14eCKLI1 pe>KLI1M (вентилтор ВКЛlO4ается только TorAa, коrда выrlOnняется 060rpeB LI1ЛИ КОНДLl1u.ионирование воздуха) или >ке режим ON (Вкл.), коrда злектромотор BeHTLI1 л'roра 6удет ра60тать непрерывно. nереКЛlO4атель на приведенно схеме показаll в поnо>кенни, соотвеТСТВУlOщем автомаТИ4ескому ре>киму. nporpaMMa ДJlя 3TO системы nоказана в примере 9.4. К 3TO nporpaMMe MHoroe моrло бы быть добавлено. Она обесnе4ивает только установку OДHO НО4tЮ темпера туры н O,lJ,HO TeMneparypbI ДJl ра604НХ ,lJ,He. Дополнительные ТОЧКLI1 YCTaHoBKLI1 темпе ратуры моrлн бы 6ыть до6авлены в СЛУ4ае не06ХОДИМОСТLI1 посредством ввода ДОIlОЛ- HHTenbHbIX COCTOHH в срункu.иlO GotKey. Что6ы зта nporpaMMa ра60тала, к системе ДОЛ>КНЫ 6ыть ПОДКЛlO4ены как BHyTpeHHLI1e, так LI1 нару>кные ,lJ,aT4L11KLI1. nporpaMMa LI1CnOnb зует 2841 слова из 4096 доступных 4eeK памятн, так 4ТО HaMHoro 60льwе срункци MO ryr 6ыть леrко до6авлены 6ез nOJlHoro НСПОЛЬЗ0вания Bcero пространства памяти. 
LM70 (внсш.) 2 с") S10 LM70 CS (внутр.) SC 5 4 R4 47К RЗ 1К PIC18F1220 U1 .  S10 RAO °R80 RA1 RB1 RA2 RB2 RАЗ RВЗ RA4 RВ4 #МCLR RB5 OSC 1 сп RВ6 OSC2  RB7 С2 1.0 uF  С1 0.1 uF 11 + 4 1 R1 2 2К R2 1К вверх жки VDD VLE VLED+ RS R/W VSS Рис. 9.8. ЭлеКТРИ4еская схема системы !(расный  общий ,еленый  вентилятор жеЛ1ЫЙ  кондиционер белый  на!'Рев '""1 :::i  t:!:I   n :s: а ....,  =:: Е!: '-<  "о  t:!:I :::i  :r :s:  4:>- N 1.0 
430 ITpHMeHeHHe MHKpoKoHTponnepoB PIC 18 Пример 9. 4 /* проррамма AOMaWHe смстемы 060roрева/КОНДМUМОllмроваНМR возцуха *1 #include <p18cxxx.h> #inc1ude <delays.h> #include <timers.h> #inc1ude <string.h> /* Установка 6мтов KOHMrypaUMM установка peMMa reHepaTopa RC  вкnченме C'l'OpOeBoro TaMepa выкnченме HM3KOBOnbTHoro nроrрамммрованмя OTKnqeHMe с6роса по qастмqной потере nмтанмя разреwенме 06ero с6роса *1 Jlpr:agma config OSC  INTI02 #pragma config WDT  ON #pragma config WDTPS = 256 // ОАна сеКУНАа #pragma config LVP = OFF 4tpragma config BOR = OFF #pragma config MCLRE = ON 1/****************** BeKTOp npepBaHM *********************** void MyHighlnt (void); #pragma interrupt MyHighInt #pragma code highvector=8 II npOTOTMn npoueAYP I1 06сnмванмя npepBaHM 1I MyHighInt  зто npepBaHMe II high_vector по аАресу Ох08 vojd highvector (void) asm GOTO MyHighInt endasm 1/****************** rrepeMeHHe в nамятм AaHHX ******************** short long time; char hours; char minutesi char day; char displayTimeFlag; char indoor; char outdoor; char setPoint; char timeOut; char state; 11******************** nepeMeHHe в naMRTM rrporpaMM ****************** char near rom da у s [] [1 О ] = { "Sunday " , "Monday " , "Tuesday "Wednesday", "Thursday " 
rnaBa 9. Снстемы уnравnення 43\ "Friday "Saturday " } ; char near rom strl[] "Indoor " . c::har near rom str2 [] "Outdoor "; .:har near rom str3 [] Set time of day "; char near rom str4[] "; c::har near rom str5 [] Set day of week "; char near rom str6 [] " Is а work day (MF)? " . , char near rom str7 [] Ор yes, Down = по "; ::har near rom str8 [] "1s " . ,: па r псаr rom str9l J " а work day? " . 11 прммеры нескольких случа(?в , cr1ar rear rom strl0[] Normal lemperaturc " . , char near rom stLll[] Setback temerature " . , char near rom str12[J Work day ON 1 time ". c::har near rom strlЗ [] Work day OF'F 1 time ": char near rom str14 [] Night OFF time " . , char near rom str15 [] Morning ON time " . /1***************** ЭСПDЗУ ДАННЫХ ************************************ define temperature О fdefine workday 1 #define dayO 2 :t de f' i n е da у 1 3 fdefine day2 4 'define day3 5 Idefine day4 6 tdefine day5 7 Idefine day6 8 ,define normaltemp 9 fdefine setbacktemp 10 tdefine workdayOn1h 11 fdefine workdayOn1m 12 fdefine workdayOff1h 13 tdefine workdayOff1m 14 tdefine nightOffh 15 #define nightOffm 16 tdcfine mornOnh 17 !define mornOnm 18 II установка TeMrrepaTYP термостата II pa60qM Аень (DНПТ) = 1 11 pa604M Аень = 1, MHaqe = О :1********************* YHKUMM ******************************* tpragma code IlcqMTBaHMe МЗ аАреса местоrrоnоенмя яqекм в rrамятм Аанных ЭСПDЗУ char eeRead (char address) EECON1bits.EEPGD = о; EEADR = address; EECON1bits.RD = 1; relurn ЕЕОАТА; I1 заrrмсь AaHHX в яqеку rrамятм AaHHX ЭСDDЗУ rro аАресу 
432 Прнмененне мнкроконтроnлеров PIC 18 void eeWrite (char address, char data) { INTCONbits.GIEH = о; EECON1bits.EEPGD = о; EECONlbits.WREN = 1; EEADR = address; ЕЕDАТА data; EECON2  Ох55; Er-:CON2 = ОхАА; ECON1bits.WR = 1; while (PIR2bits.EEIF О); PIR2bits.EEIF = о; EECON1bits.WREN о; INTCONbits.GIEH  1; void sendNib (char data, char rs) PORTI3 = data; PORTAbits.OSC2 PORTBbits.RB7 PORTBbits.RB7 Delay1TCY() ; Ое1ау1 ТСУ () ; = rs; 1; = о; 11 nepeAaqa rrony6aTa 11 проверка RS 11 MMnYnbc Е 11 заАерка 64 мкс void sendLCDdata (char data, char rs) sendNib (data » 1, rs); sendNib (data « 3, rs); void initLCD (void) int а; Delay1KTCYx(1); for (а  О; а < 3; а++) 11 OMAaHMe 32 мс sendLCDdata (Ох20, о) ; 11 rrepeAaqa Ох20 Delay100TCYx (2) ; 11 OMAaHMe 6.4 мс } sendLCDdata (Ох2 8, О) ; 11 nepeAaqa Ох28 sendLCDdata (ОхО 1, О) ; 11 rrepeAa4a Ох01 Delay100TCYx (1) ; 11 OMAaHMe 3.2 мс sendLCDdata ( ОхОС, О) ; 11 rrepeAa4a ОхОС sendLCDdata (Ох06, О) ; 11 nepeAaqa Ох06 11 OT06paeHMe строкм М3 nамятм rrporpaMM (str) в указанно n03MUMM 11 строка 1 занммает n03MUMM от Ох80 АО Ох97 11 строка 2 занммает n03MUMM от ОхСО АО ОхО7 11 OT06paeHMe строкм М3 rrамятм rrporpaMM (str) в указанно n03MUMM void DisplayStringPgm (char position, rom char *str) char ptr = о; sendLCDdata (position, о); while (str[ptr] != о) 11 rrepeAaqa n03MUMM 
lnaBa 9. Снстемы уnравnення 433 sendLCDdata(str[ptr++], 1); 11 пере.цача CMMBOJIa \/0 i,d Get'l'(mp (voj d) char а; char Ь, С; PORTAbits.OSC1 = о; for (а = о; а < 9; a+) 11 CS о Ь « 1; с «= 1; PORTAbits.l2  1; Ь 1= ORTAbits.RA3; С I РОRТАЫts.RА4; PORTAbits.RA2 = о; 11 SC 1 11 SC о } for (а = о; а < 7; а++) PORTAbi ts .12 PORTAbits.RA2 1; о; 11 SC 11 SC 1 О } PORTAbits.OSC1 = 1; i f (с === Ох f [) С = Ох80; indoor = Ь; outdoor = Ь; 11 CS 1 void GetTime (short long *temp) day  *temp 1 86400; hours = (*temp % 86400) 1 3600; minutes = ((*temp % 86400) % 3600) 1 60; void PutTime (char place) char temp; sendLCDdata (place, О); temp = hours; i f (hours >= 12) hours = 12; if (hours === О) hours = 12; if (hours < 10) sendLCDdata (' ',1); else sendLCDdata (hours 1 10 + ОхЗО, 1); sendLCDdata (hours % 10 + Ох30, 1); sendLCDdata (':', 1); sendLCDdata (minutes 1 10 + ОхЗО, 1); sendLCDdata (minutes % 10 + ОхЗО, 1); sendLCDdata (' " 1); if (temp > 11) sendLCDdata ('Р', 1); else sendLCDdata ('А', 1); 
434 Прнмененне MHKpOKOHTpOnnepOB PIC 18 void PutTemp (char where, char temp) sendLCDdata (where, О); if (temp < О) { temp = temp; sendLCDdata ('', 1); } if (temp >= 100) sendLCDdata (temp 1 100 + ОхЗО, 1); temp - 100; } sendLCDdata (temp / 10 + ОхЗО, 1); sendLCDdata (temp % 10 + ОхЗО, 1); sendLCDdata (OxDF, 1); void DisplayTimeDate (void) GetTemp (); GetTime (&time); DisplayStringPgm (Ох80, str1); PutTime (Охоо); PutTemp (Ох87, indoor); if (outdoor != 128) { DisplayStringPgm (ОхСО, str2); PutTemp (ОхС8, outdoor); } else DisplayStringPgm (ОхСО, str4); void DoThermostat (void) GetTime (&time); if (eeRead(nightOffh) = hours && eeRead (nightOffm) == minutes) setpoint = eeRead(setbacktemp); else if (eeRead(mornOnh) = hours && eeRead(mornOnm) == minutes) setPoint = eeRead (normaltemp); else if (eeRead(dayO + day) == 1 && eeRead(workdayOn1h) == hours && eeRead(workdayOn1m) == minutes) setPoint = eeRead(setbacktemp); else if (eeRead(dayO + day) == 1 && eeRead (workdayOff1h) == hours && eeRead (workdayOff1m) = minutes) setPoint eeRead (normaltemp); else setPoint eeRead (normaltemp); if (outdoor < 65) { if (indoor < setpoint) 
lnaBa 9. Снстемы уnравnення 435 PORTAbits.RAO 1; 1/ HarpeB BKn. PORl'Abits. RA1 о; } else { PORTAbits.RAO о; // HarpeB выкл. PORTAbi ts .11 о; } else { if ( i ndoor > setPoint) { PORTAbits.RAO о; PORTAbits.RA1 1; I1 В03АУХ BKn. } else { PORTAbits.RAO о; 1/ В03АУХ BKn. PORTAbits.RA1 о; void MyHighlnt (void) if (PIR1bits.TMR1IF == 1) { 1I 06ъявnенме 24peMMa II AnR TaMepa peanbHoro временм PIR1bits.TMR1IF = о; WriteTimer1 (-31250); time++; if (timeOut != О) timeOut; if (time == 604800) time = о; if (displayTimeFlag == 1 && time % 60 О) { DisplayTimeDate(); DoThermostat(); } char GetKey (void) { do { while ((PORTB & 7) != 7) { ClrWdt(); Delay100TCYx(5) ; if (timeOut == О) return 7; } while (( PORTB & 7) ! = 7); do { 
436 Прнмененне MHKpOKOHTpOnnepOB PIC 18 whlle ((PORTB & 7) 7) ClrWdt(); Delay100TCYx(5) ; if (timeOut == О) return 7; } while ((POR'l'B & 7) 7); return о; void GotKey (void) { l.n t (),; short long Ь; Delay100'l'CYx(5) ; lf (( POR'l'B & 7) ! = 3) return; displayTimeFlag = о; DisplayStringPgm (Ох80, DisplayStringPgm (ОхСО, timeOut = 5; while (GetKey() О) 11 16 мс //MrHopMpOBaHMe Bcero, кроме вборкм str3) ; str4); timeOut = 5; switch (state) { case о: GetTime (&time); PutTime (ОхС8); if (PORTBbits.RBO О) { time++; if (time > 604800) time = о; } else if (PORTBbits.RB1 О) { time; if (time < О) time = 604799; } e1se if (PORTBbits.RB2 == О) { state = 1; DisplayStringPgm (Ох80, str5); DisplayStringPgm (ОхСО, str4); а = о; } break; case 1: а &= 7; DisplayStringPgm (ОхС9, days[a)); if (PORTBbits.RBO == О ) 
rnaBa 9. Снстемы управnеlIНЯ 437 а++; else if (PORTBbits.RB1 О) a''.' ; else if (PORTBbits.RB2 О) time = time % 86400 + а * 86400; state = 2; DisplayStringPgm (Ох80, str6); DisplayStringPgm (ОхСО, str7); } break; casc 2: if (PORTBbits.RBO = О) { eeWrite (workday, 1); state = 4; DisplayStringPgm (Ох80, str10); DisplayStringPgm (ОхСО, str4); а = indoor; } else if (PORTBbits.RB1 = О) eeWrite (workday, О); state = 3; а = О; DisplayStringPgm (Ох80, str8); DisplayStringPgm (ОхСО, str7); } break; case 3: DisplayStringPgm (Ох83, days[a]); DisplayStringpgm (Ох83 + strlenpgm(days[a]), str9); if (PORTBbits.RBO == О) eeWrite (dayO + а, 1); else if (PORTBbits.RB1 == О) eeWrite (dayO + а, 1); e1se a; а++; if (а == 8) { state = 4; DisplayStringPgm (Ох80, str10); DisplayStringPgm (ОхСО, str4); а  indoor; } break; case 4: PutTemp (ОхСА, а); if (PORTBbits.RBO == О) { 
438 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 а++; if (а >= 100) a; ! else if (PORTBbits.RB О) { a; if (а <= 49) а++; } else if (PORTBbits.RB2 == О) { eeWrite (normaltemp, а); state = 5; DisplayStringPgm (Ох80, str11); DisplayStringPgm (Охсо, str4); } break; case 5: PutTemp (ОхСА, а); if (PORTBbits.RBO О) { а++; if (а >= 100) a; } e1se if (PORTBbits.RB1 О) { a-; if (а <= 49) а++; } else if (PORTBbits.RB2 == О) { eeWrite (setbacktemp, а); state = 6; DisplayStringPgm (Ох80, str12); DisplayStringPgm (ОхСО, str4); Ь = о; } break; case 6: GetTime (&Ь); PutTime (ОхС8); if (PORTBbits.RBO О) { time++; if (time > 604800) time = о; } else if (PORTBbits.RB1 О) { time; if (time < О) 
rnaBa 9. Системы уnравnения 439 time = 604799; } else if (PORTBbits.RB2 = О) { state = 7; DisplayStringPgm (Ох80, strlЗ); DisplayStringPgm (Охсо, str4); eeWrite (workdayOnlh, hours); eeWrite (workdayOn1m, minutes); ! break; case 7: GetTime (&Ь); PutTime (ОхС8); if (PORTBbits.RBO О) { time++; if (time > 604800) time  О; } else if (PORTBbits.RBl О) { time-; if (time < О) time = 604799; ! else if (PORTBbits.RB2 == О) { state  8; DisplayStringPgm (Ох80, str14); DisplayStringPgm (Охсо, str4); eeWrite (workdayOff1h, hours); eeWrite (workdayOfflm, minutes); ! break; case 9: GetTime (&Ь); PutTime (ОхС8); if (PORTBbits.RBO О) { time++; if (time > 604800) time = о; } else if (PORTBbits.RB1 О) { time; if (time < О) time = 604799; } else if (PORTBbits.RB2 == О) { state = 9; DisplayStringPgm (Ох80, str15); 
440 ITpHMeHeHHe MHKpOKOHTpOJInepOB PIC18 DisplayStringPgm (ОхСО, str4); ecWrite (mornOnh, hoиrs); eeWrite (mornOnm, inиtes); display'I'imeFlag .. .1; DisplayTimcDate(); retиrn; } break; } displayTimeFlag = 1; DisplayTimeDate(); void main (void) 11************************ rnaBH КОА заnуска ************************** OSCCON = Ох02; ADCON1 = OxOF; TRISA Ох18; TRISB Ох07; PORTA Ох80; PORTB 7; initLCD () ; displayTimeFlag = 1; DisplayTimeDate(); INTCON2bits.RBPU = о; OpenTimer1 (TIMERINTON & Т1 8BIT RW & Т1 SOURCE INT &   T1PS11); WriteTimer1 (31250 ); INTCONbits.GIEH = 1; while (1) { ClrWdt(}; state = о; if (( PORTB & 7) ! = 7) GotKey(); II BHYTpeHHRR TaKTOBaR qaCTOTa 32 мкс II все BXOA UMpOBbIe II nporpaMMMpoBallMe IIop'.t'a А II nporpaMMMpoBaHMe порта В II BKn4eHMe cna6x HarpY30K порта В II KaAY сеКУНАУ II разреwенме nрерыванм II oCTaeMCR 3Аесь до lIаа'l'ИЯ KJ]qa 9.3. Резюме 1. ТеХНОJlоrН4еская карта процесса помоrает спеu.нсрнu.нрооать проект системы уnравлення, YCTaHaOJlHOa заонснмость ме>кду со6ытими н моментамн времени, коrда зти co6ЫTH ДОЛ>КНЫ ПрОНЗ0ТН. 2. В прнмере снстемы nосудомоечно машины flрерывания исrЮЛЬЗУЮТС51 для nриостанооки ра60ТЫ MaWHHbI. З. В примере системы упраоnения светосрорамн используется последователы IЫЙ LI1/персрейс RS-422 ДЛ Toro, 4то6ы осуw,естолть ннсрормацнонный 06мен с системами Уflрашюни соетосрорами на ДРуrнх перекрестках с тем, что6ы ра60та соетосроров 6bIJla синхронно. 
rnaBa 9. Снстемы управлення 1\.11 4. КОlIтроллер светосроров использует u.елый ряд входо13, включая: КНОПКLI1 /юре хода и Ilереходные панели, а также совремеllllые светосрорные лампы С13еТОДLl10NЮ/0 типа. 5. ,Цля Toro, чт06ы сохранить себестоимость и КОЛLl1чеспю деталей Ila МИНИМaJlI)- 110М урошю, 13 Ilримере системы CaHLI1TapHOro ящика для котов ИС/lOJII:>эуе п;я реле, управляющее направлением вращеНИ51 электромотора вместо более доро/ой Iщу"а IlраВJЮIIНОЙ схемы Уllрашюния ЭJ1ектромотором. 6. Система обоrре13а/кондиционировани воздуха ИСnОJll,зует МИКрОКОIIТрОЛJ1Ср PIC18 дЛЯ TO/O, чтобы управлять как обоrревом 1l0мещени, так и КOIщиционироваllИСМ 13оздуха 13 домаШllей системе обоrрева/КОIIДИЦИОIIИРО13ания 13оздуха. 9.4. BonpocbI и задания 1. nеречисnите все входы и 13ыходы системы nосудомое41ЮЙ машины, оnисаllllOЙ 13 этой rлаве. 2. Что вляется u.елью исnользоваНИ51 nрерьшаний в системе посудомоечной Ma ШИIIЫ? З. Если Д13ерца посудомоечной MaLULI1HbI будет открыта в процессе МЫТЫI /lOсуды, что /Iроизойдеr с 13ремеllНЫМИ задер>кками? 4. Модисрицируйте диаrрамму управления процессом, приведеllllУЮ на рис. 9.1 так, 4тобы посудомоечная маwина имела бы настройку цикла стерилиэации, 13ыбирае- Moro ew,e одним переключателем, подключенным к WTbIPbKY АА2. Этот тумБJlер выби рает u.икл стерилизаu.ии, подавая на АА2 сиrнал лоrИ4еской единицы, и отключает elo, /10дaBa на этот 13ывод сиrнал лоrИ4ескоrо нуля. An51 ВЫ/10JIIЮНИЯ это/о обычно ИС/I01\L) зуются две диа/раммы, одна  )J.JIЯ u.икла без стерилизаu.ии и вторая  для цикла со сте- рилизаu. ией . 5. V1змените nporpaMMY И3 примера 9.1 таким обраЗ0М, чтобы как цикл сюрили зации, так и соответствующий nереКЛЮ4атель nра13ИЛЫЮ работали бы в системе. 6. 'цопустим, что имеется стиральна маwина, КОТОРШI имеет два цикла стирки  один )J.JIЯ нежной стирки в те/IЛОЙ воде и один - )J.JIЯ нормальной СlИРКИ 13 r'орячей воде. Разработайте технолоrИ4ескую карту, KOTopa ОnИСЫ13ает работу этой маШИIIЫ. Эле меllтами управлеllИЯ Я13ЛlOтс: электромотор Ilасоса/аКТИ13атора, Зal ЮЛIIИ 1 елы IЫЙ кланан ДЛ rОРЯ4ей 130ДЫ, заполнитеЛЫIЫЙ клапан )J.JIЯ холодной 130ДЫ, BЫCOKOCKOpOCT ной передаточный механизм )J.Jl u.икла отжима, уnравлемый соленоидом, а также дренажный соленоид для отвода воды из бака. V1MeeTc также меХallИЗМ блокировки ABepu.bI, который остана13ЛИ13ает маwину, но только в u.икле сушки. Цикл СIИРКИ ДOJlжен 13ключать стирку с преД13арительным отжимом, а затем полоскание и окончательный отжим. 7. Разра60тайте схему злеКТРИ4ескую системы стиральной машины, ИСПО1/1,зуя микроконтроллер PIC18 по вашему выбору. 8. Напишите nporpaMMY управления дл системы стиральной машины, разрабо lаIlНОЙ в рамках 13ыrюлнения последних Д13ух заданий. 9'nредположим, 4ТО нам НУ>КIШ система, уnра13ляющая блокировкой l\Iюрей al31 o моБИJlЯ. KorAa автомобиnь достиrнет скорости, рашюй 15 миль 13 Llac, двери ДОJl>КНЫ 6ЛОКИРО13атьс. Новый моментом в этой системе должно быть то, что коrда а13томоБИlll) останаВЛИ13аеТС51 и 13ыключаетс зажиrание, то двери дол>кны разблокироваться. ЕСJ1И а13томобиль будет все ew,e в движенин, KorAa зажиrание будет 13ыключеIЮ, то двери 110 должны разблокироваться до тех пор, пока автомобиль полностью IЮ осratЮВИIС51. Единственным эnементом управлени в системе вляется небольшой электромотор, используемый дл Toro, чт06ы отпереть двери. V1меются Д13а входа: сиrнал эаЖLl1I"atILl1Я 
442 ITримененне MHKpOKOHTpOnnepOB PIC 18 (лor"ический ноль, коrда зажиrание включено) и от даТ4ика скорости на коро6ке nepe да4. ДаТ4ИК скорости rенерирует импульсы по мере Toro, как поворачивается ведущий вал коробки nереда4. Соотноwение задаетс как 1 О импульсов на один ПО130рОТ wины. Если исnользуетс 16дюймовое колесо, то зто зна4ИТ, 4ТО датчик rенерирует 3961 О импульсов на милю (5280/1,333 х 10). Блок даТ4ика производит 11,0028 импульса в секунду (36610/3600) дл кюкдой мили В 4ас скорости. Таким образом, ПОРОI.ОВОМУ зна4ению 15 миль в 4ас соответствует 165 импульсов в секунду. nолна остановка 03 на4ала бы ЧТОlт6удь ниже 0,09 миль в 4ас. Разра60тайте схемное реwение дл зтой системы и технолоrИ4ескуlO карту проu.есса в CJlY4ae нео6ходимости. 10. Сколько nрерываний нео6ходимо использовать дл Toro, что6ы разра60тать проrрамму в заданин 9? 11. Разработайте nporpaMMY системы дл задани 9. 12. Какая мощность nотреблени требуетс дл KpacHoro свеТОДИОДllоrо индика тора светосрора? 13. Каков срок служ6ы KpacHoro светодиодноrо индикатора светосрора? 14. Какой стандарт интерсрейса исnользуетс дл Toro, чт06ы nОДКЛЮ4ИТЬ один КОНТРОJlлер светосрора к друrим в примере, рассмотренном в дaHHO rлаве? 15. Какие входные снrналы ИСПОЛЬЗУlOтс в системе уnраВЛСIIИ С13стосрорами, рассмотренной в данной rJlaBe? 16. KaKa команда от BeAyw,ero устройства к ПОД4иненным устройствам иллюст- рируетс в системе управлени светосрорами, рассмотренной в зтой rna13e? 17. Опиwите, какие друrие команды AOJl>KHbl 6blTb использованы в реальной MHO rоnерекрестной системе уnраВJlени AOPO>KHbIM движеннем. 18. Почему исnользуетс реле дл Toro, что6ы изменить напраВJlение враw,ени злектромотора в санитарном w,ике дл котов, описанном в 3ТОЙ rлаве? 19. Как реаrирует nporpaMMa, коrда совок в санитарном w,ике ,ЦЛ котов cTono ритс большим 06ъектом? 20. Предложите доnолнитеJlьные срункu.ии, которые моrли 6ы 6ыть реализованы 13 системе управления санитарным W,HKOM дл котов, описанной в данной rлаве. 21. Детализируйте, как сиrналы в домаwней системе обоrpe13а/КОНДИЦИОНИРО13ани воз духа управлют HarpeBaTeJleM, Koнднu.нOHepoM воздуха н ЭJlектромотором веmилятора циркул цин воздуха. 23. nOCKOJlbKY CHrHaJlbI упраВJlени в выеупомнутойй системе представлют co 60 сиrналы 24 В переменноrо тока, ДJl их KOHTpOJl НСnОJlЬ3УЮТС реле. V1MeeTc ли альтернатнвный дешевый н наде>кный метод упраВJlени зтимн сиrналами? 24. Если Зllа4ение нару>кной температуры в системе 060rрсва/КОНДli1u.нонировани ВО3дУ- ха не.цос-тyrlНо, то возможно ли упраШlЯlЪ как HarpeBoM, так и КОНДVlu.нОIIИРО13анием воздуха 6сз РУ4ной настройки? Арryменrnруйте Baw oтueT. 25. Полезно ли в некоторых CJlY4ax вводить наружны воздух в систему o6orpe- ва/конднu.ионировани воздуха? Если да, то 06ъсните ваш ответ, рассмотрев He CKOJlbKO CJlY4aeB. 26. Кaкa роль отводится ЗСnnЗУ данных в системе о6оrpeва/КОНДИЦНОllировar Iи возду- ха, описанной в данной rnaBe? 
lnaBa 1 О, Вопросы повышенной СnОIKНОСТИ 443 rЛАВА 10. Вопросы повышенной сло>кности в зтой rлаве рассматриваютс вопросы, которые не BcerAa свзаны с e>KCДHeB ным применением МИКРОКОНТРОJlлеров. nримером TaKoro вопроса может 6ыть исполь- зование дополнительной памти. V1з предwествуюw,их rлав вы уже 31-шете, что микро КОll1роллер имеет оrраНИ4еНlюе КОJlИ4ество памти, однако до сих пор очень мало ro- ворилось о возможностх расwнрени памти микроконтроллерной системы. Кроме Toro, поскольку встре4аютс случаи, KorAa встроенных устройств ввода-вывода Heдoc rаточно, ro в этой rлаве рассматриваетс на примерах то, как нужно ИСПОJJЬЗОВalЪ ИII терсрейс CAN (уnраВЛIOw,а локальная сеlЪ) и интерсрейс USB (универсаЛЫlaЯ 11OCJle доватеЛЫlа wина) ДJl расwирени возможностей BBoдaBЫBoдa микроконтроллерной системы. После завершени ИЗУ4ени данной rлавы вы сможете: 1. Расwирть 06ъем памтн микроконтроллерной системы; 2. V1СПОJlьзовать код UPC в системе уnравлени складскими запасами; 3. nроrраммировать микроконтроллер с использованием заrрузочноrо блока; 4. Создавать nporpaMMY на4алыю заrрузки; 5. Расширять ввод-вывод микроконтроллера; 6. V1СПОJlьзовать интерсрейс CAN ДJl объединени микроконтроллеров в сеть; 7. nроrраммировать и nОДКЛlO4ать USB к nерсоналыlOМУ компьютеру; 8. Детализировать расwиренный набор команд PIC18. 10. 1. Расширение памяти Одной нз np06JleM, свзанных с ИСПОЛЬЗ0ванием микроконтроллеров, явлется то, 4ТО они содержат оrраНИ4енный 06ъем памти. 3то ос06енно справедливо в СЛУ4ае СЗУnВ, 06ъем KOToporo 4асто находитс в диапазоне от 256 до 512 байтов. Некоторые ИСnОJlнени МИКрОКОНТрОJlJlеров имеlOТ 60ЛЬWИЙ 06ъем BHyтpeHHero СЗУnВ, но и эти устройства нмеют не 60лее, 4ем 3698 4eeK памти. 06ъем памтн nporpaMM так>ке может оrраничить возможности ПРИJlожений. Микроконтроллер может иметь только 2 или 4К 4eeK памти nporpaMM, 4ТО 4асто BneTc достаТ04НЫМ ДJl мноrих систем, oAllaKo если CHCTeMHa nporpaMMa 04ень велика, нли же имеется 60ЛЫUОЙ объем ста- ТИ4НЫХ данных, то может nOTpe60BaTbc расwирение памти. В данном подразделе исследуетс вопрос расwирени памти с использованием последователыюrо ЭСnnЗУ, которое BJleTC единственным типом последовательных ЗУ, которые MorYT НСПОЛЬЗ0ватьс ДJl расшнренн памти в микроконтроллерных системах. Добавление последовательноо ЭСППЗУ Микросхемы последоватеJlьноrо 3СnnЗУ преДJlаrаютс срирмой Microchip для расширени 06ъема памти МИКРОКОНТРОJlлеров. 3то не СЗУnВ и зти микросхемы имеют оrраНИ4енный срок сnуж6ы. 3СnnЗУ оБЫ4НО 06еспе4ивает один миллион циклов С4итываниязаписн, 4ТО 4асто достаТ04НО ДJl мноrих применений. An подключения ПОСJlедовательноrо 3СnnЗУ не06ходимо нспользовать интерсрейс 1 2 с или SPI. Может 6ыть напнсано nporpaMMHoe 06еспе4ение, исnользуюw,ее выводы BBoдaBЫBoдa 11C11O средственно, однако HaMHoro зсрсрективнее будет, если интерсрейсными Т04ками будут YCTpOCTBa 1 2 с или SPI, н60 в зтом СЛУ4ае 6удет Tpe60BaTbC ИСПОJlЬЗО13ание меныtюr-о коnичества выводов микроконтроллера ДJl орrанизации интерсрейса. 
444 Прнменение МНКрОКОНТролnеров PIC 18 Фирма Microchip производит весьма широки диапаЗОII микросхем 3СnnЗУ  ОТ TOHKLI1X 128битных (16 байтов) до микросхем lIа 512 килобит (64К байт). Еще одна срир- ма  Atmel производит устройства срлзшпамти, которые Moryr хранить 4 меrаБLl1rа LI1нсрормации (512К байт). Фирма Philips Semiconductors также производит cepLl1IO по- следовательных запоминаюw,их устройств. PDIP/SOIC TSSOPIМSOP · TSSOP AOf Vcc АО Vcc АО АО Vcc А1 WP А1 2 WP А1 WP NC NC А1 А2 3 SCL NC :J NC А2 А2 SCL NC NC I Vss Vss ;4 вОА Vss вОА А2 SCL Vss SDA DFN 1 .  8 2 >< 7 >< 3 N UI 6 Q') 4 5 Усе WP SCl вОА nримечаllие: выводы АО и А 1 не ПОДКЛЮ4ены только в корпусах MSOP. Рис. 10.1. Цоколевка выводов микросхем 1l0слеДО13атеЛЫIЫХ ЭСnnЗУ Микросхемы последовательных 3СnnЗУ иллюстрируются lIа рис. 10.1. Эl.LI1 rlрИ боры представляют с060Й 8разрдных V1C, и не заllимаlOТ Mlloro места lIа Ilлате. На уnомянyrом рисунке показаны корпуса устройств eMKocTblO 256К бит, ОДllако все I\PY rие устройства имеют аналоrИ4НУЮ u.околевку выводов. Входы А  зто не входы адреса; зто входы вы60РКИ микросхемы. Они называютс А-входами потому, 4ТО MOryT ИСIIОЛЬ- 30BaTbC ДЛ Toro, чт06ы вы6рать 60лее OAHoro nослеДО13атеJlыюrо 3СnnЗУ, слеДО13а- телыlO, они выбирают раЗЛИ4ные устройства. Рис. 10.2 иллюстрирует два таких устройства, nОДКЛlOченных к микроконтроллеру PIC 18F1220 с ИСПОJlьзованием АО в ка4естве входа адреса для вы60ра одной илн друrой микросхемы 3СnnЗУ. Активизаци А-входов происходит nyreM подключения их на 06- w,ий провод либо на wину nитани + 5 В. Три адресных входа позволяют nодключаrь к микроконтроnлеру системы вплоть до восьми устройств. Однако на самом деле, по причине оrраничений, связанных с Вllyrренней наrРУЗОЧIIОЙ способностыо rЮСJlсдова- rельных 3СПnЗУ, MOryT быть подключены только два УСТРОЙСI.13а (см. рис. 10.2). ЕСJlИ нужно 110ДКЛlO4ИТЬ ew,e YCTpOCTBa, то их нужно 6усреризовать. В зтой схеме микросхе ма памти U413ы6ираеТСJ KorAa АО = О, а микросхема U5 выбирается, коrда АО = 1, 11рИ зтом на А 1 и А2 должен 6ыть НУJlевой сиrнаJl. Вывод АВ6 - зто послеДО13ателыюе I10Д- КЛlO4ение данных ме>кду выводами SDA на 060ИХ микросхемах памяти и МИКрОКОНТрОJl лером, а ВЫ130Д АВ7 подает сиrllал тактовой частоты на ВЫ130ДЫ SCL 06еих микросхем 1 JaМЯТLI1. ЕСJlИ к микроконтроллеру nОДКЛlO4аетс только одна микросхема nамнrи, то TorAa вход АО nОДКЛЮ4аетс на землю. В лю60М СЛУLше необходим lIаrрузочный реэи стор 13 10 кОм, чт06ы памть ра60таJlа на рекомендуемой частоте, равной 100 кrц. Последовательный интерсреСJ исnользуемый микросхемами nОСJlеДО13ателы ЮIО ЭСnnЗУ, во MHorOM подо6ен мноrим друrим последоватеJlЫIЫМ интерсрейсам, которые уже 06су>кдаnись нами в 60лее ранних rлавах. При nрименеllИИ PIC 18F1220, I\о]/жна использоватьс npolpaMMa, rенеРИРУIOw,а TaKToBYIO 4астоту )J.J1Я 3СПnЗУ, а также по- сылаюw,а или получаюw,а инсрормацию из Hero. 3СnnЗУ обычно срункционирует lIa частоте 100 Kru.. Перед 06су>кдением скорости инсрормаu.ИОНllоrо обмена, мы СllачаJlа рассмотрнм ра60ТУ 3СППЗУ. Микросхема памть отвечает на передаваемый ей байт, который называется байтом opraHa Уl1равления (см. рис. 10.3). УпраВЛ51ЮЩИЙ байт со- CTOLl1T из cTapToBoro бита, 6итов состояний трех aApecllbIx входо13, бита чтения/записи и бита подтвер>кдеIlИЯ. 
rnaBa 10. Вопросы повышенной СnОIKНОСТИ 445 Стартовый бит  это ОТРL/1u.атеЛЫIЫЙ срронт сиrнала, BbIAa13aeMOrO на ML/1KpOCXCMY I13МЯТL/1 в момент, KorAa сиrнал TaKTOBO частоты наХОДИТС51 в СОСlОЯНИИ лоrической еI\ИНИЦЫ. После этоrо передается битова51 схема 101 О, а затем состояния адреСIIЫХ l3XOA013, выБL/1раюw,их устройство. Как только команда будет nослаllа, за ней следует адрес памти. 3та последовательность битов заносит адрес в памslТЬ. Второй CTapTO вый импульс nосылаетс ДJl С4итывани данных. Если данные заflисываются в IlaМSПЬ, то l3торой импульс заnИСL/1 не nepeAaeTc в память, nередаютс только даНllые. Сиrllал АСК принимаетс после передачи или считывания каждоrо байта из паМ5IТИ, OAllaKO этот сиrнал У4итываетс только после выполнения операu.ИL/1 записи в памsпъ. Памs1П> требует времени для Toro, чтобы заверwить операЦL/1Ю заПL/1СИ. После выnолнеllL/151 ОIЮ- раЦL/1И записи в память, сиrнал АСК контролируется ДJlSI Toro, чтобы убеДL/1IЬСSI 13 том, ч'то данные записаны в память. Если подтверждение не получено, то IlpOl.paMMa ДОЛЖllа ОЖL/1дать до тех пор, пока оно не будет получеllО от памяти. PL/1c. 10.4 L/1ЛЛIOС 1 рирут об мен данными, который nРОИСХОДL/1Т МЮКДУ nоследоватеЛЫ-JЫМ ЭСnnЗУ и МL/1КРОКOIIТРОЛ лером. npL/1 использовании 256килоБL/1тноrо устройства, обсуждаемоrо здесь, адрес будет 15разрдным (32 кбайт). При зтом данные будут адресоваться двумя байтами, а БL/1Т А15 не будет использоваться. Первый байт адреса содержит БL/1ТЫ адреса A15A8, а второй байт адреса  биты адреса А7 AO. +5У R1 ОК U4 24АА256 1 АО SDA  С1 2 0.1 uF 3 А1 А2 PIC18F1220 8 SCL U3 :t 7 WP RAO °RBO о gRB1 8 z RA1 УСС G RA2 RB2 RA3 RB3 С2 ..,. RA4 RB4 0.1 uF #МCLR RB5 OSC1 RB6 OSC2 > RB7 U 5 24М256 It) 1 АО SDA 5 2 3 А1 А2 6 SCL 7 WP Рис. 10.2. Пара микросхем последовательноrо ЭСnnЗУ, nОДКЛЮ4еНIIЫХ к микроконтроллеру PIC18F1220 
446 ITрнменение мнкроконтролnерон PIC 18 СтраНLI1чное С4итывание или запись так>ке возможны при выполнении ЧТСIILl1Я илн записи более одноrо 6айта. Адрес памти, который автомаТИ4ескн инкрементируется после кюкдоrо чтенн или записи, nозволет nередаВalЪ MHoro байто13 6ез повторной nереда4И адреса. Страниu.а зтой nамти по определению  это 64 байта. Страницы Ha ЧLl1наютс с адресов, соответствуюw,их нулевым значениям самых пра13ЫХ 6 6итов aдpe са. Так, страннца О расположена в диапазоне адресов OxOOOOOx003F, страница 1  в диаnаЗ0не адресов Ox0040-0хО07F и Т.д. При считывании более OAI юrо байта, a;pcc переКЛЮ4аетс на на4ало страниu.ы в конце страниu.ы. Например, если памяти (!Ослан адрес Ox007F и С4итываютс 2 6айта, то первым байтом будет содержимое ячейки по адресу Ox007F, а вторым - содержимое 51чейки по адресу ОхО040. Start 1 О 1 О Л2 Д] АО R/W лек Рис. 1 0.3. Уnравлюw,нй 6айт ПОСJlедовательноrо ЭСnnЗУ Запись адреса за которым следует считываемый байт оА AIA А D DD А S 1 О 1 2 1 О J С 7 6 54 3 2 1 О СР к К или за I<ОТОрЫМ следует записываемый байт s = стартбит р = стон-бит ЛСК = подтверждение Рис. 10.4. Сиrналы на С4нтывание или запнсь ПОСJlедоватеJlьноrо 3СnnЗУ nporpaMMHbIe срункu.ии, тре6уемые ДЛ Toro, 4т06ы 4итать или записать баты в naMTb, nоказаны в при мере 10.1. Функu.ии, которые 4итаlOТ ИJlИ записывают 6лок па МЯТLI1, в данном проrраммном при мере не nриводтс. В 3TO nporpaMMe операторы #define используютс с тем, чтобы выводы порта, используемые ДЛ свзи с памтью, можно 6ыло леrко изменть. Здесь АВ7 исnользуетс ДЛ СLl1rнэла SCK и АВ6 исnоnьзу- 
rnaBa 10. Вопросы повышенной CnOIKHOCTH 447 ется ДЛ сип-шла SDA. Дл Toro, 4то6ы интерсрейс срункu.ионировал nравилыlO, HarlpaB ление переноса ДJl сиrнала SDA изменетс на вход, KorAa naMHTb посылает СLl1ПlaЛ лоrической единиu.ы. 3то выполнетс потому, злектронна схема памяти требует ис IlOЛЬЗ0вания резистора наrрузки в 10 кОм на nОДКЛЮ4ении SDA с тем, чтобы праl3ИJ1ЫIO l3bIrIOJJHJlaCb запись лоrИ4еской единиu.ы. При nереKJlючении направления шIыькаa АВ6 на вход при переда4е лоrической единиu.ы на вывод SDA, схема будет соотвстст- вова rb требованим устройства nамти. KorAa упомнутый вывод UКJJlOчен как BbIXO/\, на SDA устанаВЛLl1вается сиrнал лоrИ4ескоrо нул; коrда же он ВКЛlOчен как ОХОД, SDA CT'a IIOВИТС WTbIPbKOM ввода  вывода. Пример 10.1 II ***************** KOHCTaHT ************************* #define SCL PORTBbits.RB7 #define SDA PORTBbits.RB6 #define SDATRIS TRISBbits.TRISB6 11 RB7 11 RB6 SCL SDA 11*************** YHKUMM pa60T с nocneAOBaTenbH ЭСDDЗУ ************** voj (1 SendStart (void) 1I посыпка c'1'ap'1'.6MTa SDA TRIS 1 ; 1I SDA 1 SCL = 1; I1 SCL 1 SDA TRIS о; II SDA о SCL = о; II SCL о void SendStop (void) II nepeAa4a cTon6MTa SCL = о; I1 SCL о SDA TRIS о; II SDA о SCL = 1; 1I SCL 1 SDA TRIS 1; 11 SDA 1 char SendSM (char data) II nepeAa4a 6aTa char а, Ь, с; с = о; for (а = о; а , 8; а++) { SCL = о; II SCL = о if ((data & Ох80) == Ох80) II CaMbrn neBbrn MHopMaUMoHH 6мт SDA TRIS 1; II SDA 1 else SDA TRIS data 1; SCL = 1; о; I 1 S DА О 11 neB CABMr AaHHX 11 SCL 1 ! SCL о; SDA TRIS 1; SCL = 1; if (SDA == 1) с = 1; SCL = о; retиrn с; 11 SCL о II SCL 1 II KOHTponb SDA на АСК II SCL = о I1 возврат АСК 
448 Прнменение МНКрОКОНТролnеров PIC 18 char ReadSM (void) I I чтение 6a'I'a char а; char Ь = ЗОА TE1S SCL = о; for (а о;  ]; о; а II уста нов ЗОА дNЯ чтенмя II SCL  О 8; а++) ь ,,= 1; SCL = 1; if (SOA == 1) Ь I  1; SCL = о; I I neB CABMr AnR сnеАующеl'О 6И'l'а II SCL = 1 II до6авnенме SOA, еслм 1 II SCL = О } ЗОА 'l'ElS о; ceturn Ь; II SDA  О II возврат мзвnеченнх данных void Ack (char control) II про верка АСК char а = 1; do { SendStart(); а  SendSM (control); II BBOA ynpaBnRero 6aTa } whi1e (а == 1); # SendStop(); II Eead а byte from memory II address is ОхОООО  OxFFFF char EeadByte (int address) char а = о; ЗОА = о; SendStart(); if ((address & Ох8000) а = 2; II установ SOA о Ох8000) else а = о; SendSM (ОхАО + а); SendSM (address » 8); SendSM (address); SendStart (); SendSM (ОхА1 I а); а  ReadSM (); SendStop (); return (а); II комаНАа (заnись аАреса) II комаНАа (4тенме Аанных) } void WriteByte (int address, char data) char а  о; SDA = о; SendStart (); II YC'I'aHOB SOA о 
rnaBa 10. Вопросы повышенной СnОIKНОСТИ 449 if «address & Ох8000) а = 2; SendSM (ОхАО I а); SendSM (address » 8); SendSM (address); SendSM (data); SendStop (); Ack (ОхАО I а); Ох8000) I1 ОИАание АСК Приложение, использующее дополнительную память Теперь, коrда мы можем леrко д06авлять ДОllолнителыюе пространство 11амяти к микроконтроллеру, мы нуждаемся в nрило>кении, которое ИСnОЛЬЗОВaJЮ бы э.ту llаМ5ПЪ. Предnоло>ким, 4ТО нам не06ходима система, nредназна4енная для реrИС1 рации и co хранения данных с целыо доступа к ним в 6удуw,ем. Данные, которые реrистрируетс, предназна4ены для системы уnравnения товарно-материальными ценностями в rac трономе. Модуль, разра60танны здесь,  зто калькуnяторо-nодобное устройство, KO торое находитс у кассира. Кассир сканирует код цены единицы товара (код UPC) на nOKYnKe ОnТИ4еским С4итывателем и вводит КОnИ4ество единиц товара в устройство контроля товаРllоматериальных цeHHOCTe. КОЛИ4ество единиц товара и COOTBeTCT ВУIOw,ие UРСкоды позднее заrру>каlOТСЯ в nK для 06новnения 6азы данных товарlЮ материальных цeHHOCTe. Если 6ы наше 06w,ecTBo 6ыло а6солlOТНО честным, то 118 было бы столь у>к 60ЛЬШО nотре6ности в веденин сло>кноrо У4ета товаров. Однако HeKo.ro рые оценки указываlOТ на потери вплоть до 10% товара в rастрономических маrазинах. Это ОЗIШ4ает, 4ТО вплоть ДО 10% товара никоrда не оnлачивались через кассу. CllpoeK lированная здесь система, по крайней мере, позволяет владельцу мarаЗИllа Оl1реде лить, 4ТО, с06ственно, пропадает и nереместить наи60лее 4асто похищаемые товары в более о>кивленные места ToproBoro зала. В ка4естве YCTpOCTBa ввода данных, данная система нуждается во всrюмоrа телыюй клавиатуре для ввода КОЛИ4ества единиц товара и ОnТИ4еском С4итьшателе ДJI сканирования стоимости. Она так>ке нуждаетс в свзи с nK с тем, 4т06ы количество единиц товара моrло 6ыть передано в nK дл контроля товарноматериалыых ценно- стей. Не60ЛЬШО зкран используется для Toro, 4т06ы от06разить UРСкод и количество единиц товара, введенное кассиром. YCTpOCTBO nодо6ноrо типа не имеет достаТОЧIIО- 1-0 06ъема BHYTpeHHero 3СnnЗУ с тем, 4т06ы сохранять позиции, которые БЫЛLl1 проска- нированы на nротя>кении 8-4асовоrо pa604ero дня, так 4ТО не06ходима доnолнителыш память. При нсnользовании OДHO микросхемы nоследователыюrо 3СПnЗУ 24М256 д06авляется 32 кил06ат памяти для хранения кодов позиций и количества единиц TO вара. Является ли 3ТОТ 06ъем памяти достаТ04НЫМ? nредnоло>ким, 4ТО кассир мо>кет сканировать, а затем С4итать единицы товара со CKOpOCTblO 1 вид товара в минуту. За 84aCOBЫ промежуток времени, ра60тая 6ез какнхли60 перерывов, кассир мо>кет У4есть 480 видов товаров. UРСкод является ли60 6разрядным, либо 1 Оразрдным кодом. nредnоло>ким, 4ТО все единицы товара имеlOТ 1 Оразрдный UРС-код. Дл xpa нения всех кодов зтом СЛУ4ае nотре6уется память 06ъемом 4800 6айт. ДоnолнитеЛЫlые 480 6aTOB, не06ходимы для сохранения КОЛИ4еств единиц товара, если nреДПОЛО>КИ1Ъ, 4ТО 3ТО КОЛИ4ество 6удет оrраНИ4ено 255 единицами. Память 06ъемом в 32 килобайта достаТ04НО велика для Toro, 4т06ы срункционировать без выrрузки кодов и количеств единиц товара в те4ении трех ра604ИХ смен nЛIOС ew,e имеетс хороший запас ДJ1Я 4pe3BЫ4aHO 6ыстрых ра60ТНИКОВ. 
450 ITрименение MHKpOKOHTpOnnepOB PIC18 Штрих-коды у>ке 06су>кдались в rлаве 8 в связи С ИСnОЛЬЗ0ванием штрихкодов кодировки "Код 128", которая распространена в nроизводственных системах уnравле ния склаДСКLI1МИ запасаМLI1. Штрих-коды, LI1сnользуемые в СЛУ4ае учета товаров, прода ваемых в racTpoHoMax, влются друrими. Они НСnОЛЬ3УlOт ли60 срормат UPCA, ли60 срормат UPC-E. Верси срормата UPCE оБЫ4НО исnользуется для 60лее мелких еДИllИЦ т'овара. Формат UPC-A это 1 О-разрядны КОД, а срормат UPCE  6разрядный код. Рис. 10.5 при водит при меры 060ИХ срорматов кодов. Основное различие мюкду KO/OM 128 и срорматами UPCA и UPC-E  это ТО, 4ТО UPCKOAbI позволяют oT06pa>KaТl> roлько числовые данные, в то BpeM как код -128 06есnе4ивает В03МОЖIЮСТЬ от06ра>кення как алсравитных, так и 4ИСЛОВЫХ данных. В срорматах UPCA и UPCE 4ИСЛО BcerAa окру>кается 6итамн синхронизации 101 (bsb, rAe Ь  4epHa полоса, а s - 6елое пространство). В срормате UPCA nGpBbI код, который nОl3лстс справа от краЙIIИХ левых 6нтов СИНХРОllизацни  зто код системы счисления (NS), за которым следует 5разрядны код изrотовителя. Справа от кода изrотовител располаrаlOТС среднне 6иты сннхроннзацни, которые имеlOТ структуру 0101 (sbsb). Справа от средней 6итовой структуры синхронизации расnолаrается 5 разрдный код продукта. V1, наконец, слева от самых npaBbI 6итов синхронизации на- ходится контрольный разряд. Дл ПОЛУ4ени 60лее ясноrо представления 06 описан- ной структуре кода, обращаемс к рис. 10.6. Код UPC-E является друrим, потому ЧlО он содержит подразумеваемое зна4ение NS = О, за которым следует 6раЗрЯДIIЫЙ код, содер>кащий как код изrОТОl3ителя, так н код продукта. После 3Toro ко/,а контролы IЫЙ разрд не следует. 3тот срормат кода так>ке ИЛЛlOстрируется на рис. 10.6. Формат UPCA исnользует кодировку 000000, за KOTOpO следует АААААА для от06ра>кення 12разрядных чисел (О = не4етное, R = nравый код и Е = 4етное, как nоказэно в табл. 10.1). Формат UPCE исnользует кодировку ЕЕЕООО И3 та6лицы 10.1 для кодиро вани 6 цисрр. В срормате UPC-E npaBoe поле синхронизации содер>кит 0101 (sbsb) вместо 101 (bsb), как зто имеет место в срормате UPCA. nре06раЗ0вание здесь выnолняетс noA06Ho nре06раЗ0ваниlO Koдa 128 в rлаве 8. Ра3ЛН4ие заКЛЮ4ается в том, 4ТО имеетс 6 поисковых та6лнц - 3 прямых и 306рат- ных ДЛ кодов UPCA и UPC-E. Как в rлаве 8, срункu.ия nрерывания по нзменеllИЮ co стояни вместе с таймером ИСnОЛЬЗУIOТС ДЛ Toro, 4т06ы измерить ШИРИIIУ каждоrо импульса. Рис. 10.7 иллюстрирует ПОЛНУIO схему злеКТРИ4ескуlO 3TO системы. Система ис nользует nporpaMMHoe 06еспе4ение UART ДЛ связи с nK схему управления на микро схеме DS-275. Оптический С4итыватель nOAKJl104eH к системе 4ерез nроrраММIIЫЙ no слеДОl3ательный интерсрес, который исnользует CPYHKu.HIO nрерывани по изменениlO состояння микроконтроллера. Внешняя naMTb представляет c060 одну микросхему на 32 кил06айта, KOTopa хранить данные 06 операциях, если система исnользуется дл реrистрации и подсчета nозиций товара в маrазине. В конце pa604ero дня содер>кание 3СnПЗУ системы nepeAaeTc в nK 4ерез nоследоватеЛЫ'IЫ интерсрес. Пример 10.2 показывает полную nporpaMMY для зтой системы. 
InaBa 10. Вопросы повышенной СnОIKНОСТИ 451 UРС-Л 6 1 UPCE о 1 1 1 Рис. 10.5. WTpHX КО,lJ,Ы u.eHbI единнu.ы товара (UPC) 
452 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 UPCA 1111 ! 1 !I' IIJ JIIIIJ 1 Jlll 1111111 8 8 j СИПIaJI lTL Сиrнал TTL UPCE 1111 ! 1 ! 1 '1 !1121111 Рис. 10.6. Кодировка UPCA н UPC-E Таблица 10.1. Кодировка UPC-A и UPCE. ЦMpa О 1 2 3 4 5 6 7 8 9 Нечет./Лев КОА sssbbsb ssbbssb ssbssbb sbbbbsb sbsssbb sbbsssb sbsbbbb sbbbsbb sbbsbbb sssbsbb Четны КОА sbssbbb sbbssbb ssbbsbb sbssssb ssbbbsb sbbbssb ssssbsb ssbsssb sssbssb ssbsbbb OpaBЫ КОА bbbssbs bbssbbs bbsbbss bssssbs bsbbbss bssbbbs bsbssss bsssbss bssbsss bbbsbss 
Р1 5  9  4 8 3 I I 7 I 2  6 ,..1.....- разъем DI39 1 2 3 456 789 '* О # DS275 U3 ID +5V l ( ( ( > R1  ( < ( > 10К > I --::L. С2 PIC18F1320 I 0.1 uF ..,.  U1 ...  I L.4-- RAO aRBO  I  АА1 AB1 17 7   18 3 R А4 R в4 ....щ.......... 4 #МCLR АВ5 11 .....12... OSC1 cf) RВ6 12 13 ,.......з3.. OSC 2  R В7 ц) ; R)(JN 8 RXOUT   1')(JN > а ТXOUT  2 VDRV а j( 0.1 uF С1  Т1.0 uF ..,.  ..;-- D7 VDD D6 D5 ,.............D4 o6kтpacТlIOCТI.. 1 T 1 УЕЕ RfW VSS Е I 1 Х 20 LCD RS R2 J\oA уу j 10К U2 24АА256  I ........+ АО SDA 2 А1 3 А2. 6 SCL 7 WP а 8 УСС z Тс С3 с) ' 0.1 uF Рис. 10.7. Система управления товарноматериальными ценностями  Оrпический считыватеnь ""1 :;;,  ф  +  t:!J о  "о О (") Е:  о t:I:' t:r Е (1) ::t ::t О ::S:C (") :;;, о  ::t О (") ...., ::S: .;::,. v\ VJ 
45.1 Прииер 10.2 ITpHMeHeHHe MHKpOKOHTponnepOB PIC 18 1* < 1 И( "I'('lv,) УllраШlенин '1'оварно-ма'l'ериаnьнми "3д;lа:ами" )lU(:'x:.{X .1-:':'- Ricjud llmEs.h> HLnclude <delays.h> #include <sw uarl.h> 1 * YC'l'aHOBKa бмтов KOHMrypaUMM установка внутренней смнхронмзаuмм 13ыкnчеl!ме C'l'OpOeBoro TaMepa выключенме HM3KoBonbTHoro nроrрамммроваНМR О'l'КJlючеl!ие сброса по чаС'I'мqно потере nM'l'aHMR разрешенме общеl"О с6роса *1 #pragma #pragma Jlpragma #pragma config OSC config WDT config LVP config MCLRE II program memory data lNTI02 OFF OFF ON rom near char str1[] "Uploading to the РС. " . , rom near char str2 [] "Ready to swipe code."; сот леаr char str3 [] Ct= ,1 .. , rom леаr char oddl] = ОЫОО10000, ОЬО1010100, ОЬ01000101, ОЬО0110000, ОЬООО01001, ОЬООО11000, ОЬОООООО11, ОЬО0100001, ОЬООО10010, ОЫОООООО1 } ; rom псас char oddbw[] ОЬОООО0110, ОЬОО010101, ОЬО1010001, ОЬОООО1100, ОЬО1100000, ОЬО0100100, OblJOOOOOO, ОЬОl001000, ОЫОООО100, ObOl000010 ) ; II Авомчне AaHHe ОЬхххххххх 
lnaBa 10. Вопросы повышенной сnожности .155 rom near char even[] ОЬОООО0110, ОЬОО010101, ОЬ01010001, ObOOOO1l00, ОЬ01100000, ОЬО0100100, ОЫ1000000, ОЬ01001000, ОЫОООО1 00, ОЬ01000010 , ; rom near char GvелЬw[]  ОЫОО10000, ОЬ01010100, ОЬ01000101, ObOO1l0000, ОЬООО01001, ObOOO1l000, ObOOOOOOll , ОЬО0100001, ОЬОО010010, ОЫОООООО1 } ; rom near char right[] ОЫОО10000, ОЬ01010100, ОЬ01000101, ObOO1l0000, ОЬООО01001, ObOOO1l000, ObOOOOOOll , ОЬО0100001, ОЬОО010010, ОЫОООООО1 } ; rom near char rightbw[j ObOOOOO1l0, ОЬОО010101, ОЬ01010001, ОЬООО01100, ОЬ01100000, ОЬО0100100, ОЫ1 000000, ОЬ01001000, ОЫОООО100, ОЬ01000010 } ; rom near char 100kupKey[] 
456 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 1, 4, 7, 10, :?, 5, 8, О, 3, 6, 9, 11 I I neB С'l'ол6ец I1 cpeДHM cTon6eu II npaB стоnбец } ; /. Ооедепенме пресоn EEPROM #defiпe ddcirl u i/dei iпe addrrl 1 / I llеременные в паМЯ'I'И данных char goodUPC; char timeOut; char pulse; inl ha1fPulseWidth; char ИРС [14 ] ; char UPCptr; char type; #pragma interrupt MyHighInt #pragma code high vector=Ox08 save=PROD II highvector по адресу ОхОО08 void high vector (void) II всокоnриормтетны вектор asm GOTO MyHighlnt endasm II nepexoA на nOAnpOI'paMMY обслумваlIМЯ IIBcoKonpMopMTeTHoro npepBaHMR # pri19ma code II счмтываНМR ячекм ЭСDDЗУ AaHHX по адресу char eeRead (char address) EECON1bits.EEPGD = о; EEADR = address; EECON1bits.RD = 1; return ЕЕDАТА; } II заnмсь Rчекм ЭСDDЗУ AaHHX по аАресу с AaHHM void eeWrite (char address, char data) char temp; temp  INTCONbits.GIEH; INTCONbits.GIEH = о; EECON1bits.EEPGD = о; EECON1bits.WREN = 1; EEADR = address; ЕЕDАТА data; EECON2 = OxS5; EECON2  ОхАА; EECON1bits.WR = 1; while (PIR2bits.EEIF о); PIR2bits.EEIF = о; EECON1bits.WREN = о; if (temp == 1) INTCONbits.GIEH 1; 
rnaBa 10. Вопросы повышенной CnOIKHOCTH 457 II DереАача 6aTa AaHHX на KMHAMKaTOp с RS rs #define RS PORTAbits.OSC1 #define Е PORTAbits.RAO void SendLCDdata (char data, char rs) PORTB = (data » 4) I Ох80 ; RS = 1; 1::  1; Е  о; Delay10TCYx(4); PORTB = (data & OxOF) I Ох80; RS == 1; Е = 1; Е = о; Delay10TCYx (4); II передача neBoro nony6aTa 11 установка RS II MMnYnbc Е II OMдaHMe 40 МКС 1I nереАача npaBoro nony6aa 11 установка RS 1I MMnYnbc Е II OMAaHMe 40 мкс 1I МнмuмаnмзаUМR KMHAMKaTopa void InitLCD (void) II мнмuмаnмзаUМR KM Delay1KTCYx (2 О) ; II OMдaHMe 20 мс SendLCDdata (Ох20, О) ; II передача Ох20 Delay1KTCYx (6) ; II OMAaHMe 6 мс SendLCDdata (Ох20, О) ; I1 передача Ох20 Delay10TCYx (10) ; II OMAaHMe 100 мкс SendLCDdata (Ох20, О) ; 1I nepeAa4a Ох20 SendLCDdata (Ох2 8, О) ; 1I передача Ох28 SendLCDdata (Ох01, О) ; 11 nepeAaqa Ох01 Delay1KTCYx (2) ; I1 OMAaHMe 2 мс SendLCDdata (ОхОС, О) ; 1I nepeAaqa Ох ОС SendLCDdata (Ох06, О) ; 11 nepeAaqa Ох06 / I 0'1'06paGI!Me в заданно nозмuмм строкм cMMBonoB МЗ naMRTM nporpaMM (str) void DisplayStringPgm (char position, rom char *str) char ptr = о; SendLCDdata (position, О); 11 nepeAaqa n03MUMM while (str[ptr] != О) SendLCDdata(str[ptr++], 1); 11 nepeAa4a CMMBona char lookup (rom char* table, char temp) char а; for (а = о; а < 10; а++) if (table[a] === temp) break; return а; void Abort (void) 
458 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 char temp = ОРС[О]; char а; char count = о; CloseTimerO (); WriteTimerO (О); i f (UPCptr > 5 && UPCptr < 7) I I 06ычаы ирс -р. { if (Lypc  1) II o6pa'1'l!bI ОРС-Е for (count = о; count < з; count++) UPC[count] = lookup(oddbw, UPC[count]); for (count = 3; count < 6; count++) UPC[count] = lookup(evenbw, UPC[countJ); for (count о; count < з; count++) temp ОРС[5  count]; ОРС[5  countJ = UPC[count]; UPC[count] = temp; goodUPC = 1; } else 1I npRMo OPCE for (count = о; count < з; count++) UPC[count] = lookup(even, UPC[count]); for (count = 3; count < 6; count++) UPC[countJ = lookup(odd, UPC[count]); goodUPC = 1; } else if (UPCptr > 7) for (а = о; а < 4; а++) { count += temp & з; temp »= 2; } if ((temp & 1) { о) for 11 06paTH UPCA (count = о; count < 6; count++) UPC[count] = 100kup(rightbw, UPC[count]); (count = 7; count < 13; count++) UPC[count  1] = lookup(oddbw, UPC[count]); (count о; count < 6; count++) for for { temp ОРС[11  count]; ОРС[11  count] = UPC[count]; UPC[count] = temp; ) goodUPC = 2; ) else 11064H OPCA for (count = о; count < 6; count++) UPC[countJ = lookup(odd, UPC[count]); for (count = 7; count < 13; count++) UPC[count  1] = lookup(right, UPC[count]); 
lnaBa 10. Вопросы повышенной сnожностн 459 goodUPC 2; void MyHighlnt (void) int temp; if (PIR1bits.TMR1IF == 1) { PIR1bits.TMR1IF = о; WriteTimer1(.12500 ); if (timeOut != О) { t_imеОut--; if (timeOut О) Abort(); } else if (INTCONbits.RBIF 1) temp = POITB; 1 I не06ХОАИМО C4M'1'a'I'b РОЕТJЗ ДЛН 1I с6роса M3MeHeHMR 11 с6рос npepBaHMR IlмнмuмаnмзаUМR INTCONbits.RBIF  о; if (ReadTimerO() == О) { OpenTimerO(TIMER_INTOFF & ТО 16BIT & ' ТО SOURCE INT &  - TO_PS 1 64); Write'I'imerO (1); timeOut = 3; pulse = UPCptr 1I nepMoA 64 мкс type О. , } else if (pulse == О) { halfPulseWidth ReadTimerO() I 2; WriteTimerO (1); pulse++; timeOut = 3; Write'I'imerO (1); } else if (pulse < 3) halfPulseWidth (halfPulseWidth + ReadTimerO() 1 2 ) I 2; Write'I'imerO (1); pulse++; timeOut = 3; } else { temp = ReadTimerO (); WriteTimerO (1); if (temp <= halfPulseWidth * 3) temp = о; else if (temp <= halfPulseWidth * 5) t emp = 1; else if (temp <= halfPulseWidth * 7) 
460 ITpHMeHeHHe MHKpoKoHTponnepoB PIC 18 temp 2; else temp 3; UPC[UPCptr] = UPC[UPCptr] « 2 I temp; pulse++; timeOut = 3; if (pulse % 4 == 3) { if (pulse == 7) { if ((UPC[UPCptr] & Ox3F) О) I1 OPCE 06ратнй { type 1; pulse = 3; UPC[UPCptr] >= 6; UPCptr; } } UPCptr++; 11 ***************** KOHCTaHT ************************* #define SCL PORTBbits.RB6 #define SDA PORTAbits.OSC1 #define SDA TRIS TRISAbits.TRISA7 11 RB6 = SCL 11 OSC1 = SDA 11*************** YHKUMM pa60T с nocneAOBaTenbHb ЭСDПЗУ ************** vold SendStart (void) { SDA TRIS 1; SCL = l' , SDA TRIS о; SCL = о; SCL = о; SDA TRIS о; SCL = 1; SDA TRIS 1; 11 nepeAa4a cTapToBoro 6мта 11 SDA 1 1I SCL 1 I1 SDA О 11 SCL О I1 nереАача cTon6MTa I1 SCL О 11 SDA О 11 SCL 1 11 SDA 1 11 nepeAa4a 6aTa void SendStop (void) char SendSM (char data) char а, Ь, с; с = о; for (а = о; а < 8; а++) SCL = о; if ((data & Ох80) == Ох80) SDA TRIS = 1; I1 SCL = О 1 I caM neB 6M'r Аанных 11 SDA = else 
rлава 10. Вопросы повышенной СЛОIKНОСТН 461 SOA TRIS о; data «= 1; SCL = 1; } SCL о; SOA TRIS SCL  1; if (SDA == 1) с = 1; l' , SCL = о; return с; =har ReadSM (void) char а; char Ь = о; SOA TRIS = 1; SCL = о; for (а = о; а < 8; а++) ь «= 1; SCL = 1; if (SOA == 1) Ь 1= 1; SCL = о; } SOA TRIS = о; return Ь; void Ack (char control) char а = 1; do { SendStart (); а = SendSM ( control); } while (а == 1); SendStop (); 1I C4MTBaHMe 6aTa М3 naMRTM 1I аАреса в AMana30He ОхОООО  OxFFFF char ReadByte (int address) char а = о; SOA = о; SendStart() ; if ((address & Ох8000) а 2; Ох8000) else а о; SendSM (ОхАО + а); SendSM (address » 8); SendSM (address); 1/ SOA = о 1/ neB CABMr r\aHHbIX I1 SCL 1 11 SCL О 1I SCL II проверка SDA на лек II SCL = О II B03Bpa'1' АСК II счмтваl!ме 6a'I'a 11 установка SOA на c4MTBaHMe I1 SCL = О 11 neB cABMr дnя cneAyero 6мта II SCL  1 11 A06aBneHMe SOA, еслм 1 I1 SCL О 11 SOA О 11 возврат мзвле4еннх Аанных 1I проверка АСК I 1 BAa4a уnравляеrо 6a'l'a II установка SOA о 11 комаНАа (аАрес заnмсм) 
462 ITpHMeHeHHe MHKpOKOHTpOnnepOR PIC 18 SendStart (); SendSM (ОхА1 I а); а = ReadSM (); SendStop (); ret..urn (а); 11 команда (Ч'l'снме JаНlfЫХ) vold WrlteByte (int address, char data) char а = о; S ОА '" о; SendStart (); if ((address & Ох8000) а = 2; SendSM (О хА О I а); SendSM (address » 8); SendSM (address); SendSM (data); SendStop (); А с k ( О хА О I а); #define KEYPORT ORTA #define DELAY 15 void Switch (char bit) do { 11 yc'raHoBKa SI)A о Ох8000) IloMAaJlMe АСК 11 M3MeHM'rb AnR соответс'rвмя 1I aKTM4ecKoMY порту I1 мзменмть в cnY4ae не06ХОАММОСТМ AnR I1 BpeMeHHO заАеркм 11 OMAaHMe oCB060AeHMR while ((KEYPORT & bit) != bit); Delay1KTCYx(DELAY) ; }whi1en ((KEYPORT & bit) ! = ЬН); do 1I OMAaHMe HaaTMR { while ((KEYPORT & bit) == bit); Delay1KTCYx(DELAY) ; }while ((KEYPORT & bit) == bit); } unsigned char Кеу (void) { #define МASK Ох1Е #define ROWS 4 int а; unsigned char keyCode; keyCode = о; PORTB = PORTB & OxF8; Switch (МASK); PORTB = PORTB & OxFE; while ((PORTA & МASK) II установка маскм 11 заАанме KOnM4ecTBa строк 11 04мстка порта В м keyCode I1 KOMneHcaUMR Аре6езrа контактов 11 м OMAaHMe Haa'l'MR KaKonM60 KnaBMWM 11 B60p caMoro neBoro cTon6ua МASK) II пока HMKaKO Kn4 1I не HaAeH } for (а = 1; а != о; а «= 1) PORTB = (PORTB « 1) I 1; keyCode += ROWS; 1I 6ерем cneAY cTon6eu 11 A06aBneHMe строкм к КОАУ KnaBMWM 
rлава 10. Вопросы повышенной сложностн 463 I I находеl!ие С'J'роки lf (( I:'OE'l'A & а) О) break; keyCode++; } return 100kupKey[keyCode]; I I наХОАение KoppeK'I'l!OI'O 11 КОАа KnaBMWM } int GetCount (void) char numЬеr[З]; int retval = о; char СОllлt  о; char temp  Кеу(); while (temp != 11) { if (temp == 10 && count ! о) { count; SendLCDdata (Ох90 I count + 1, о); SendLCDdata (' , , 1); SendLCDdata (Ох90 I count + 1, о); } else number[count] = temp; if (count != 2) count++; } temp Кеу(); } for (temp = о; temp < count; temp++) retval = retval * 10 + number[temp]; return retval; void SendPC (void) int addr; int addr1 = о; addr = eeRead (addrl); addr = (int) eeRead(addrh) « 8; while (ReadUART () ! = 1); WriteUAR'l'(l); while (addr != addr1) WriteUART(ReadByte(addr1++)); eeWrite (addr1, о); eeWrite (addrh, о); void GetUPC (void) int addr; int count; DisplayStringPgm (Ох80, strЗ); SendLCDdata (Ох80, о); for (count = о; count < 6; count++) SendLCDdata( UPC[count] + ОхЗО, 1); 
464 Прнмененне мнкроконтроnлеров PIC 18 if (goodUPC == 2) { SendLCDdata ('', 1); for (count = 6; count < 12; count++) SendLCDdata (UPC[count] + Ох30, 1); count GetCount(); if (count != О) ( addr  eeRead(addrl); addr  (int) eeRead(addrh) « 8; if (goodUPC = 1) { WriteByte (addr++, 1); for (count = о; count < 6; count++) WriteByte (addr++, UPC[count]); ) else WriteByte (addr++, ); for (count = о; count < 12; count++) WriteByte(addr++, UPC[count]); } WriteByte (addr++, count); WriteByte (addr++, count » 8); eeWrite (addrl, addr); eeWrite (addrh, addr » 8); } goodUPC = о; DisplayStringPgm (Ох80, str2); void DelayTXBitUART (void) Delay10TCYx(9); Delay1TCY(); Delay1TCY(); Delay1TCY(); void DelayRXHalfBitUART (void) Delay10TCYx(4); Delay1 ТСУ () ; Delay1 ТСУ () ; Delay1 ТСУ () ; Delay1 ТСУ () ; void DelayRXBitUART (void) Delay10TCYx(9); Delay1TCY () ; void main (void) OSCCON = Ох62; 11 внутренняя TaKToBaR qaCTOTa 4 Mru 
lлава 10. Вопросы повышенной CnOIKHOCTH 465 ADCON1  OxOF; TRI8A Ох7Е; Т1<.I8В ОхАО; PORTA Ох80; PORTB ОхАО; InitLCIJ () ; goodUPC  timeOut = о; WriteTimerO (О); OpenTimer1 (TIMERINTON & Т1 16BIT RW &   T1SOURCEINT & T1PS1_8) ; (12500) ; 11 UMpOBO BBOABЫBOA 11 KaAыe 8 МКС WriteTimer1 ОреnШ\Н.Т () ; INTCONbi ts. НВТЕ PIE1bits.TMR1IE INTCONbits.GIEH if (eeRead(addrl) { 1 ; 1; 1; OxFF && eeRead(addrh) OxFF) eeWrite (addrl, О); eeWrite (addrh, О); } if ((РОНТА & 6)  О && eeRead.(addrl) != О && eeRead(addrh) != О ) DisplayStringPgm (Ох80, str1); SendPC(); } DisplayStringPgm (Ох80, str2); while (1) { if (goodUPC != О) GetUPC() ; 10.2. 3аrрузочный блок МLI1кроконтроллеры семейства PIC18 содержат 6лок начальной зarpY3KLI1, который П03130лет МLI1кроконтроллеру самому nерепроrраММLI1роватьс в рамках CLl1CTeMbI. Это свойство 04ень nолезно в тех CLl1CTeMaX, которые Tpe6YlOT nрименеНLI1Я nporpaMMHbIX 06НО13леНLI1Й после CAa4L11 CLl1CTeMbI в зксnлуатаu.LI1IО. V1HorAa зто 1-la3ЫI3а10Т срлзшинrом системы LI1ЛLl1 самоnроrраММИРОl3аНLI1ем. ЕСЛLl1 вы коrдаЛLl160 nРLl106ретаЛLl1 материнскую плату ДJl KOMnblOTepa, вы, l3epOTHO, уже знакомы с СРЛ3ШLl1нrом системы npLl1 помощи BIOS. Проrрамма начальной заrрузки Блок начальной заrРУ3КLI1  зто 06ласть nамти 06ъемом 512 байт, KOTopa начи HaeTC с адреса ОхОООО LI1 закаНЧLl1l3аетс адресом Ох1 FF. (Некоторые микроконтролле ры ceMeCTBa PIC18 LI1MelOT 60ЛЬWУlO 06ласть 6лока начальной зarpY3KLI1, так 4ТО адрес KOHu.a 6лока может быть ОТЛLl14НЫМ от указанноrо). Блок начально заrрузки содеРЖLl1Т заw,LI1w,енны код, который не может быть nерезаnLl1сан, KorAa устройство nроrрамми pyeTC. Код 6лока начальной зarpY3KLI1, который заrружает HOI3YIO nporpaMMY 13 Сl30бод- 
466 ITpHMeHeHHe мнкроконтроллеРО8 PIC 18 ную 4асть naMTL/1, 4асто Ha3bIBalOT nроrраммой на4ально заrрузки L/1l1И Ha4aJlbHbIM за- rРУЗ4ИКОМ. nporpaMMa на4альной заrРУЗКL/1 заrружает, коrда зто требуется, HOBYIO one- p a u.L/10HHYIO CL/1CTeMY в устройство. TaKL/1M обраЗ0М YCTPOCTBO caMonpOrpaMML/1pyeTc. Дл Toro, 4тобы на4алыый заrРУЗ4L/1К срункu.L/10НL/1ровал, он должно L/1MeTb nоследова- теЛЫlOе соеДL/1нение с BHeWHL/1M ML/1pOM с тем, 4тобы в СЛУ4ае не06ХОДL/1МОСТL/1 HOBa про- rpaMMa моrла быть заrружена в микроконтроллер. Суw,ественной 4acTblO nporpaMMbI начальной заrРУ3КL/1 влетс nporpaMMHoe обесnе4ение, которое управляет УПОМЯIlУ тым последовательным LI1Iперсрейсом. Рис. 10.8 nOKa3bIBaeT блок наLlaJ1ЫЮЙ заrрузки, размеw,енный в rШМТL/1 nporpaMM CL/1CTeMbI. Выбор МL/1кроконтроллера ДJls-l проеК1а orl ределет 06w,L/1 06ъем naMTL/1, 110 во всех СЛУ4ах, по крайне мере первые 512 6айтов nаМЯТL/1 резеРВL/1РУIOТС под 6лок на4альной заrрузки. Ox3f'f'F Остальная чаС1Ъ памяти ПрOI'рамм Ох0200 ОхО 1 FF Бnок начальной ЗaI'РУЗКИ ОхОООО Примечание: верхни адрес naMTL/1 в устройствах ceMeCTBa PIC18 L/1зменяется. Рис. 10.8. Карта naMTL/1, L/1ЛЛIOСТрL/1РУIOw,а pa3Mew,eHL/1e 6лока на4aJlЬНОЙ заrрузки Блок на4альной заrРУ3КL/1 наХОДL/1ТС в заw,L/1w,енно 06лаСТL/1 naMTL/1,  зто ознаLШ- ет, LITO он не nерезаnL/1сываетс npL/1 npOrpaMML/1pOBaHL/1L/1 устройства. npOrpaMML/1pOBa ние внутренней naMTL/1 nporpaMM nодо6но nроrраммированиlO BHYTpeHHero эсnnзу данных, которое 06суждалось в rлаве 6. Основное ра3ЛL/14ие между зсnnзу данных L/1 срлзwnамтыо nporpaMM заКnlO4аетс в том, 4ТО срлзwnамть nporpaMM заw,иw,ена n06Л04НО, npL/1 зтом первый ее 6лок Ha3ЫBaeTC 6локом на4альной заrРУЗКL/1. эсnnзу данных не L/1MeeT TaKoro MeXaHL/13Ma заЩL/1ТЫ. Размеры L/1 4L/1СЛО друrL/1Х защиw,енных 6ло- ков определены 4леном ceMeCTBa микроконтроллера. Так, HanpL/1Mep, PIC18F1220 имеет 6лок на4ально заrРУ3КL/1 размером 512 6айтов L/1 два друrL/1Х заw,L/1w,енных 6110ка, которые pa3Mew,eHbI по адресам Ox0200Ox07FF L/1 Ox0800-0хОFFF. Два 6лока nOML/1MO 6лока на4альной заrрузки Ha3bIBalOTc блоком О L/1 блоком 1 соответственно. ДруrL/1М 
rnaBa 10. ВОПРОСЫ повышенной CnOIKHOCTH 467 Ilримером может 6ыть PIC18F4550, который L/1MeeT блок на4алыюй заrру3КL/1 объемом 2 килобайта (OxOOOOOx07FF) L/1 4етыре друrL/1Х блока по адресам Ox0800Ox1 FFF (блок О), Ox2000Ox3FFF (блок 1), Ox4000Ox5FFF (6лок 2) L/1 Ox6000Ox7FFF (6лок 3). 06ращаЙТССI) к спеЦL/1СРL/1каЦL/1L/1 TeXHL/14eCKL/1X данных на МL/1кроконтроллер, выбранный ДJl L/1СnОЛЬЗОlза ни в npoeKTe, с тем, 4т06ы nОЛУ4L/1ТЬ L/1нсрормаu.иlO о Т04НОМ месторасположеНИL/1 и раз мерах 6локов naMTL/1 nporpaMM. 3TL/1 6ЛОКL/1 заw,L/1w,ены 4ерез L/1СnОШ)30ВШtL/1е 6итов, размеw,енных в perL/1CTpaX KOHcpL/1rypau.L/1L/1, BКJlI04a 6лок на4альной заrРУ3КL/1. npL/1Mep 10.3 nOKa3bIBaeT 060ЛОIКУ nporpaMMbI на зыке С, KOTopa работает как пространство блока 1--la4алыюй заrРУ3КL/1. Эта nporpaMMa L/1сnользует nоследнlOlO 4eKY 3СnnЗУ дaH ных дл Toro, чт06ы оnредеЛL/1ТЬ, был ЛL/1 выполнен оБЫ4НЫ с6рос, L/1ЛL/1 же nроисходи.т начальна заrрузка naMTL/1 nporpaMM, Ha4L/1Ha с адреса Ох0200. Оператор #pragma codc MainCode = Ох0200 устанаВЛL/1вает адреса вектора npepbIBalт L/1 вектора запуска IlporpaMMbI. 3тот 06pa3eu. nporpaMMbI nОДХОДL/1Т для ИСnОJlЬ30ВШIL/1 в Jlю6ых ML/1KpOKOII троллерах ceMeCTBa PIC 18 npL/1 УСЛОВL/1L/1, 4ТО адрес 6лока MainCode 6удет изменен так, 4т06ы соответствовать карте naMTL/1 BbI6paHHoro МL/1КРОКОI.проллера. Например, )J,JIЯ PIC 18F4550 L/13MeHeHL/1e 6удет HOCL/1Tb слеДУIOw,L/1Й характер: #pragma code MainCode = Ох0800. Пример 10.3 1* * Это npMMep заrРУ304ноrо 6noKa *1 #include <p18cxxx.h> 1* Установка 6мтов KOHMrypaUMM YC'l'aHOBKa ;3HY'l'pel!He смнхронмзаuмм  ВКnЮ4енме cTopoeBoro TaMepa  BЫKnqeHMe HM3KoBonbTHoro nроrрамммроваНМR  OTKnqeHMe с6роса по 4acTM4Ho потере nMTaHMR разреwенме 06ero с6роса *  *1 #pragma config OSC HS #pragma config WDT OFF #pragma config LVP OF1. #pragma config MCLRE = ON II Define EEPROM addresscs #define bootControl OxFF void MyHighlnt (void); void MyLowlnt (void); 11 npoToTMn #pragma interrupt MyHighInt #pragma code high_vector=Ox08 save=PROD 1I high_vector по аАресу ОхОО08 void highvector (void) II BcoKonpMopMTeTHbI вектор asm GOTO MyHighInt endasm II nepexoA нак no.цI1PO:rpaм.1Y сбслуживaHMR 1I BcoKonpMopMTeTH npepBaHM } #pragma interruptlow MyLowInt #pragma code low vector=Ox18 1I MyLowlnt  зто npepBaHMe I1 lowvector  3ТО вектор ПО адресу Ох18 
468 ITрименение микроконтроллеров PIC 18 void low vector (void) asm GOTO MyLowlnt endasm #pragma code BootBlock void NormalReset (void); void maln (void) EECONlbi ts. EEPGlJ  о; 11 проверка заl'РУОЧ][ОI'О КО!! 'l'pOnbHoro ба'I'а EEADR = bootControl; EECONlbits.RD = 1; if (ЕЕDАТА != OxFF) II отра60тать HopManbH сброс { asm GOTO NormalReset endasm 11 CAa nepexoAMT nporpaMMa Ha4anbHo заrрузкм asm GOTO NormalReset endasm } #pragma code Main=Ox0200 1 I не MOAMMUMpY'I'e HM4ero от MyHighlnt АО NormalReset void Highlnt (void); void LowInt (void); void MyHighInt (void) 11 npoToTMnbl I I HOB MKCMpOBaHHЫ BeK'l'op 11 BbICOKonpMOpMTe'I'HOT'O nрерываl!МЯ asm GOTO HighInt endasm } void MyLowInt (void) II HOBblli MKCMpOBaHH вектор II HM3KonpMopMTeTHoro nрерываlIМЯ asm GOTO LowInt endasm void NormalReset (void) I I HOBЫ CМpoBaHHЫ век:roр сброса void HighInt (void) void Lowlnt (void) Запись во флэшпамять проrрамм Аля выполнения заnиси во срлзшnамять ИСnОJlьзуется практически -, о же самое nporpaMMHoe обесnе4ение, которое анanизировалось в rлаве 6 для случая записи дан- ных в ЗСnnЗУ данных. Основное ОТJlИ4ие заКJl104аетс в том, 4ТО блоки в памяти про rpaMM должны быть разблокированы ДЛ заnиси в них с ИСnОЛЬЗ0ванием бита СР (за 
rлава 10. Вопросы повышенной СnОIKНОСТИ 469 щита кода), 6ита WRT (заw,ита от записи) и 6ита ЕВТА (табличное считывание внешнerо блока). Эти 6иты заw,иты кодов pa3Mew,eHbI в реrистре консриrурации по 31pecy ОхЗОООО8. Эта ячейка заnисываетс точно так же, как друrие ЯLlейки памяти !lpOI'paMM. Биты заw,иты от записи размеw,ены в реrистре конфиrурации по адресу ОхЗООООА а биты EBTR  в ячейке по адресу ОхЗООООС. Это справедливо ДJlЯ МИКРОКОII rpoJlJlepa PIC18F1220. Друrие версии микроконтроллеров ИСПОЛЬ3УlOт также ИСПОЛI)ЗУЮТ пи ячейки, а некоторые ИСПОЛЬ3УlOт и друrие чейки. Обраw,айтесь к спецификации rехни ческих данных на микроконтроллер, выбранный для ИСПОЛЬЗ0вания в проектс. Проrрамма, показанна в примере 10.4, ИЛЛlOстрирует nporpaMMY 6лока IlачаJlЫ юй за rрузки, обеспечиваюw,уlO заrрузку или выrрузку содержимоrо nамти npolpaMM. Эта про r рамма ИСПОЛI)зует друryю версию nporpaMMbI заnуска, KOTopa поставляется cOBMecТl ю компилтором С18. Эта верси исnользует меньшее количество памяти, блаrодаР1 чему блок начальной заrрузки nOMew,aeTc в 512 6айтах. (Проrрамма требует 508 байт.) nporpaM ма, ИЛJllOстрируема в зтом примере, реаrируеттолько на три команды, передаваемые через последовательный интерфейс. Поскольку не все версии PIC18 имеlOТ аппаратный USART, эта проrрамма использует nporpaMMHbIe срункции UART, размещеНllые в файле за! оловка swuart.h. Команда Ох01 ПО3ВОllяет осуw,естl3ЛЯlЪ считывание памяти IlpolpaMM ДЛЯ 13I)IIРУЗКИ кодов В nK, команда Ох02 позволет осуw,ествлть запись в память nporpaMM ИJlИ заlРУЗКУ кодов nK, а команда ОхОЗ разрешает нормалЬНУIO начальную заrрузку. Единственный ПУIЪ lюзврата в nporpaMMY началыюй заrрузки состоит в том, чтобы заnисаlЪ знаLlение OxFF 13 ячейку ЭСnnЗУ с адресом OxFF,  зтот путь не ИЛЛlOстрируетс в данном примере. Встроен- ный ассемблер, который влетс частыо комnилтора С18, использует HeMHoro друrой формат команд ДЛ табличных команд, отличаlOw.ис от формата KOMal1Д 06ЫЧI юrо ассем6- лера, который деталыю рассматривалс в более ранних rлавах, а также освещается в дoкy МCllтации, nредоставлемой срирмой Microchip. Смотрите детали изменений 13 ЛИСТИllrе npo- ,раммы. Нео6ходимо использовать проrраммный код BCTpoeHHoro ассем6лера для 101'0, чтобы nporpaMMa начальной заrрузки поместилась в 512 байтов достуrll юй памяти. Пример 10.4 * Ha4anbHbl заrрузчмк АnЯ PIC18F1220 *1 11 Дпя Toro, чтобы зтот nроrраммн КОА Mor BnMcaTbcR в бnок начаnьно заrрузкм файл компоновщика бьm мзменен с 'l'ем, 4тоб МСПОnЬЗ0вать айл мнмuмаnизаuми сО18. о II вместо ana C018i.O I 1 /1 Эект от 3Toro заКn4ается в том, 4ТО В nporpaMMe 6УАет 1I отсутствовать мнмuмаnмзмруемая 06nacTb nамятм. II ЭТО не 04ень BaHoe CBOCTBO АnЯ боnьwмнства смстем. #include <p18cxxx.h> include <sw uart.h> #include <delays.h> :* Установка бмтов KOHMrypaUMM  установка BHYTpeHHe смнхронмзаuмм  BKn4eHMe cTopoeBoro TaMepa - BKn4eHMe HM3KoBonbTHoro nроrрамммрованмя  oTKn4eHMe сброса по 4acTM4Ho потере nмтанмя разреwенме общеrо сброса *  "1 
470 Примененне MHKpOKOHTpOnnepOB PIC 18 #pragma config osc HS #pragma config WDT OFF #praqma config LVP OFF #pragma config MCLRE = ON II внешняя 'l'aK'I'oBaH чаС'J'о'ра 01 Ml'JI / / [).:,f i.ne EEPROM addresses #dеiiпе bootControl OxFF 11 Data memory variable void MyHighInt (void); void MyLowlnt (void); I I npO'l'O'I'Mnbl #pragma interrupt MyHi.ghInt #pragma code highvector=Ox08 sаvе=РIШlJ II high_vector по аАресу ОхОО08 void highvector (void) II BblcoKonpMopMTeTH вектор asm GOTO MyHighInt endasm II nepexOA на nOAnporpaMMY 06сnумванмя II BcoKonpMopMTeTHoro nрерванмя #pragma interruptlow MyLowInt #pragma code low vector=Ox18 II MyLowInt  3ТО npepBaHMe II lowvector  3ТО вектор II по аАресу Ох18 void low vector (void) asm GOTO MyLowInt endasm #pragma code BootB10ck void NormalReset (void); void DelayTXBitUART (void) II npoToTMn II 93 мкс АnЯ UART Delay10TCYx(9); Delay1 ТСУ () ; Delay1 ТСУ () ; Delay1 ТСУ () ; void DelayRXHalfBitUART (void) II 44 мкс ЮIR UART Delay10TCYx(4); Delay1TCY () ; Delay1TCY(); Delay1TCY(); Delay1TCY(); void DelayRXBitUART (void) II 91 мкс AnR UART Delay10TCYx(9); Delay1 ТСУ () ; void main (void) 
I_1aBa 10. Вопросы повышенной СЛОIKНОСТИ 471 char temp; char command; char length; char addrl; char addrh; char addru; EECON1bits.EEPGD = о; 11 проверка КОН'l'РОЛЬНОJ'О ба'l'а 1 I заr'РУЗ0чноrо БJJOка EADR  bootControl; j;:ECON lb 1 t.s . 1<.1)  1; lf (ЕЕ.:ОА'l'А ! = Oxl7'F) 1 I ВЫIIОЛllение нормальноrо сброса { asm GOTO Normal1<.eset endasm } OpenUART() ; do command = 1<.eadUART(); length  ReadUA1<.T(); addrl ReadUART(); addrh ReadUART(); addru ReadUART(); asm MOVFF addrl,TBLPTRL MOVFF addrh,TBLPTRH MOVLW О MOVtF WREG,TBLPTRU endasm II read program memory II <01> <len> <addrl> <addrh> <addru> II <data byte(s» if (command == 1) { while (length != о) { asm II C4MTBaHMe nамятм nporpaMM TBL1<'DPOSTINC rvЮVFF TABLAT, temp endasm WriteUART(temp); leпgth; } II заnмсь в память nроrрамм II <02> <len> <addrl> <addrh> <addru> II <data byte(s» else if (command == 2) while (length != О) { temp  RcadUART(); asm MOVFF temp,TABLAT TBLWTPOSTINC endasm EECON1bits.EEPGD = 1; EECON1bits.WREN = 1; II выбор ЭСПl!ЗУ npol'paMM II снятме заuты от записм 
472 ITрименение микроконтроnnеров PICI8 EECON2 = Ох55; EECON2 = ОхАА; EECONlbits.WR = 1; 1 I стмранме '1'eKyero ба'l'а 1I выбор записи } 1 I уnра.l3ленме нормаJlЬНО заI'РУ'К:ОИ II <03> <data> <dummy> <dummy> <duJТlШУ> else if (comтand == 3) { EECON1bits.EEPGD = о; EECON1bits.WREN = 1; EEADR = bootControl; ЕЕDАТА о; EECON2 = Ох55; EECON2 = ОхАА; EECON1bits.WR = 1; while (PIR2bits.EEIF II выбор JСПDЗУ данных II снятме заМ'l'Ы 0'1' запмсм II заАанме адреса ЭСIIПЗУ I I заданме данных дЛЯ JСПIIЗУ II стмранме 'I'скуще.f'О баЙ'l'а О) ; II B60p onepauMM запмсм 1I OMAaHMe за.l3ерwенин } while (command != О); } II ло AononHMTenb КОА nомеwается nocne nporpaMMbI 6nOKa Ha4anbHo заrрузкм! II CneAY 6noK КОАа ммеет MMR Main. #pragma code Main=Ox200 void HighInt (void); void LowInt (void); void MyHighInt (void) asm GOTO HighInt endasm void MyLowInt (void) asm GOTO LowInt endasm void NormalReset (void) asm GOTO MAIN endsasm 1I place по code before this point! void MAIN (void) II новая YHKUMR Main void HighInt (void) II BCOKOnpMopMTeTHoe npepBaHMe void Lowlnt (void) II HM3KOnpMopMTeTHoe npepBaHMe 
rлава 10. Вопросы повышенной сложности 173 10.3. Расшрене ввода-вывода Хотя во мНоrих случах BBOДBЫBOД, в выбранной версии микроконтроллера, яв Л18ТСЯ адекватен, имеlOТС случаи, KorAa требуется ДОlюлнитеЛЫIЫЙ вво/\-вывод, rlрИ ЭТОм доступный BBOДBЫBOД должен быть расширен. Этот lюдраздел ИЛllЮСТРИРУС.' несколько методов расширени структуры BBoдaBЫBoдa микроконтроллерсш. Дополнительные выходные подключения ДоrюлнитеЛЫIЫС выходные цифровые подключения MOIYI. 6bIlb IЮЛУЧСI\Ы, еСl1И ИСПОJl[З0вать сдвиrовый реrистр для увеличения КОl1ичеспза выходных би, 013. В СХСМС, показаIIЮЙ на рис. 10.9, использован сдвнrовый реl-ИСТР дл Toro, чюбы 06ССllеЧИ'I 8 разрядный выходной порт на микроконтроллере PIC18F1 320. Три выЕ3//аa вво/\  IШВСЩ микроконтроллера, исnользуются ,цля TOIO, чтобы Уllpавлять этим интерфейс, lютому чистый вынrрыш составлет только пять доnолнитеЛЫIЫХ выходов. npolpaMMa, YllpaB ляюw,ая зтим простым интерфейсом, является достаточно короткой  она приведсна в I'римере 10.5. Этот при мер ИЛЛlOстрирует только функции инициализации интсрфсйса и вывода OAIIOIO бата через этот доnолннтеЛЫIЫЙ выходной порт. VCC R1 10К PIC18F1320 74НС594 U2 'ct U1 ...... 16 RAO °RBO 14 SER ОА 15 1 RA1 RB1 12 ОВ 2 RA2 RB2 11 RCLK ОС 3 RA3 RB3 SRCLK 00 4 RA4 RM 13 ОЕ 5 #MClR RB5 RCLR OF OSC1  RB6 10 SRCLR OG 6 OSC2 > RB7 ОН 7 ц) ОН' 9 Рис. 10.9. nрименение расширения. 8-разрядный выходной порт 
474 Применение микроконтроnлеров PIC 18 Пример 10.5 void IпitPort (void) TRISB PORTB TR1SB & OxF8; POR1'B & OxF8; II nроrраммируе НВО, RBl и НВ2 I1 04истка ННО, ЕН1, НВ2 void OutPort (char data) char а; for (а = Ох80; а != о; а » 1) 1I сдвмr nозмцмм биа if ((а & data) == а) PORTBbits.RBO 1; I1 nереда4а SER else PORTBbits.RBO PORTBbits.RB2 1; PORTBbits.RB2 = о; о; II смнхронмзаuмя SRCLK } PORTBbi ts .1B1 PORTBbits.RВl 1 ; о; I1 смнхронмзаuмя RCLK Микросхема 74НС594 имеет три входа. Первый И3 них, называемый SER,  это вход последовательных данных, связанный в рассматриваемой схеме со выводом RBO микроконтроллера. Вход SRCLK  зто последовательный вход тактовой 4астоты, а вход RCLK  зто вход TaКТOBO 4астоты реrистра. Внутри устройства имеетс сдвиrовы pe rистр и 6уферны реrистр. Чтобы обеспе4ИТЬ свободнуlO от сбоев ра60ТУ YCTpOCTBa, данные 3а1ЮСТС в сдвиrовый реrистр. После 3Toro 6уферный рсrистр по сиrналам тактовой 4астоты переносит данные И3 сдвиrовоrо реrистра на выходные выво/\ы, KO торые свзаны с буферным реrистром. Функu.и Initport инициаJlизнрует порт В, а функци OutPort ИСnОJ1ьзуетс Щ1 Toro, tпобы выдавать данные в порт. Обратите ВIIИ мание на то, 4ТО данные заностся в сдвиrовы реrистр таким образом, LПО первым идет caMЫ старши бит. Сдвиrовый реrистр ВlIется расширяемым, как это ИЛЛЮСТРИРУСIСЯ на рнс. 10.10. Выход ан при зтом nОДКЛlOчаетс ко входу SER слсдующей микросхемы схемы, а входы TaKTOBO 4астоты обеих микросхем объеДНIIЯIOТСЯ, формируя 16 разрядны BЫXOДHO порт. Если необходим ДВУХПрОВОДIIЫ интерфейс, то можно ис IIOJ!I>30BaTb YCTpOCTBa, выпускаемые Microchip и друrими изrотовитс)\ями, ко.roрые подключаются к интерфейсу 12С микроконтроллера. При зтом 3КОIЮМИТСЯ ОfJ.ин вывод, но проrрамма будет HaMHoro Щ1иннее, 4ем та, KOTopa показана в примере 10.5. 
rnaBa 10. Вопросы повышенной СnОIKНОСТИ 475 vcc R1 10К PIC18F1320 74НС594 U2 ..,. U1 ,.... 16 vcc RAO °RBO 14 SER од 15 1 RA1 RB1 12 ОВ 2 RA2 RB2 11 RCLK ОС 3 RA3 RB3 SRCLK 00 4 RA4 RВ4 13 ОЕ 5 #МCLR RB5 R'ё[R OF OSC1  RB6 10 SRCLR OG 6 7 OSC2 > RB7 ОН It) ОН' 9 8 GND  74Н С 594 UЗ 16 VCC 14 SER ОА 15 1 12 ОВ 2 11 RCLK ас з SRCLK 00 4 13 ОЕ 5 10 R'ёIR QF 6 'SRёCR OG 7 ОН 9 8 Рис. 10.1 О. 16разрдны BЫXOДHO порт 
476 Применение микроконтроnnеров PICl8 +5V 74НС7597 PIC18F1320 U2 '<t U1 ...... 16 vcc RAO CRBO 9 ЭОО ЭОI 14 RA1 RB1 15 RA2 RB2 00 1 RАЗ RB3 01 2 RA4 RM 02 3 #MCLR RB5 03 4 OSC1  RB6 04 5 OSC2 > RB7 05 6 06 7 ц) 07 SHCP 11 LE 12 MR 10 PL 13 8 GND Рис. 10.11. Добавление 8MH входных выводов Дополнительные входные подключения Та же самая методика, которая исnользуетс для д06авления дополнитеЛЫ1ЫХ I.ЗЫХО/l.ных выводов, может 6ыть nрименена ДЛ Toro, чт06ы добаВИТl.J дополнитеЛЫlые входные выводы. Единственное различие заКЛlOчается в том, что вмссто Toro, 4т06ы ИСПОЛЬЗ0вать nоследовательны сдвиrовый реrистр, Сl.Зязанны с буфером, как в 7 4НС594, исnользуетс Apyro сдвиrовы реrистр, который внутренне связан с 6уфс ром, заrружаюw,им сдвиrовый реrистр с тем, 4тобы последовательные данные моrли быть сrенерированы И3 входных битов. Рис. 10.11 НЛЛlOстрирует подключение, КО1-0РОС добавляет 8 дополнительных входных битов данных ДЛ МИКрОКОНТРОЛJюра. В этом Ilримере вывод микросхемы АВО  3ТО последовательный вход данных МИКрОКОНТрОJl лера, вывод RB1  это вход тактовой 4астоты сдвиrorюrо perHcTpa 74НС7595, а RB2  31'0 Ilараллельный вход наrрузки. Функция, инициализируюw,а и считываюw,ая байт данных от [3ходных выводов, иллюстрируетс примером 10.6. nоказанная [3 этом IlрИ мере проrрамма похожа на nporpaMMY ра60ТЫ с выходным портом, которая была рас- смо '"рсна рансе. 
rлава 10. Вопросы повышенной сложности 477 Пример 10.6 void InitPort (void) TRISB = TRISB & OxF8; TRISBbits.TRISBO = 1; PORTB PORTB & OxF8; PORTH  PORTB I 1; 1I nporpaMMMpyeT RBO, RB1 и RB2 char 1nPort (void) char а, Ь; PORTBbits.RB1 = о; PORTBbits.RB1 = 1; for (а  о; а <8; а++) 11 заrрузка сюзиrово ['О реI'ИС'l'ра 1 I nOJIY4aeM все 8 БИ'l'О13 Ь «= 1; Ь 1= PORTBbits.RBO; PORTBbits.RB2 1; PORTBbits.RB2 = о; } [eturn (Ь); Использование 2проводноrо интерфейса XOT уже рассмотренные методы расширения BBoдaBЫBoдa часто вполне IIРИСМ лемы, они требуlOТ трех nОДКnlO4ени к микроконтроллеру. В некоторых случаях требу eTC 2nроводный интерфейс. XOT ero ИСnОЛЬЗ0вание и свзано с повышением слож ности уnраВЛЯIOw,ей nporpaMMbI, однако оно nозволет сэкономить один вывод микро контроллера. Рис. 10.12 ИЛЛlOстрирует пару микросхем PCF8574S, nОДКЛlOченных к микрокон троллеру PIC18F1 320 с тем, 4тобы увеЛИ4ИТЬ число выводов BBoдaBЫBoдa. Микросхе мы PCF8574S 01 фирмы Texas Instruments используют 2nроводный интерфейс 12С. В отличие от друrих устройств расширения порта, эти устройства влются двунаправ ленными и иrраlOТ роль как входноrо, так н выходноrо интерфейса. Устройство форми- рует 8разрдный квази-двунаnравленный порт BBoдa вывода (выводы РО-Р7), ВКJIЮ ча триrrерные выходы с высокой TOKOBO наrРУЗ0ЧНОЙ cnoco6IOCTblO, 06есnеLlиваlO w,ие возможность неnосредственноrо уnравлени светодиодами. МаксимаЛL)НЫЙ BЫ ходной ток лоrическоrо нул на штырЬКе порта равен 25 мА, а максимальной ВЫХО/\IIОЙ ток лоrической единицы равен 300 мкА. Указанные значени тока вляютс достаточ- ными для уnравлени большинством светодиодов. Ка>кдый квази-двунаllраВJЮIlIlЫЙ вывод BBoдaBЫBoдa исnользуетс как вход или выход без nрименени реrистра TRIS, проrраММИРУIOw,еrо направление. Устройство U3 ВКnlOчено так, чтобы реаrироваlЬ на адрес 100, а U1  на адрес 000. nporpaMMa двухnортовоrо ре>кима для этих устройств использует файл заrоловка swj2c.h из библиотеки, поставляемой совместно с компи лятором С18. В двух функцих, nриведенных в примере 10.7, используется адрес О Иl1И 4 Дl1Я YCTPOCTB U1 и U3 соответственно. Выводы RB3 (TaKTOBa частота) и RB4 (данные) должны ИСnОЛЬЗ0ваться, если только файл swjc2.h не был перекомпилированпод дpy rие выводы. 
478 TIpHMeHeHHe мнкроконтроnлеров PIC18 PCF8574P +5V U3 15 SDA РО 4 5 14 Р1 6 SCL Р2 7 1 РЗ 9 2 АО Р4 10 3 А1 Р5 11 А2 Р6 12 16 Р7 VDD 13 8 PIC18F1320 PCF8574P U2 "It U1 ....... QRBO 15 SDA РО 4 RAO 5 RA1 R81 14 Р1 6 RA2 RB2 SCL Р2 7 RA3 R83 1 РЗ 9 RA4 RM 2 АО Р4 10 #MCLR R85 3 А1 Р5 11 OSC1  R86 А2 Р6 12 OSC2 > R87 16 Р7 VDD 13 Il) 8 Рис. 10.12. nримененне 2-nроводноrо ннтерсрейса Пример 10.7 11 не за6вате #include <sw i2c.h> char ReadPort (char address) char temp; SWStartI2C (); SWWriteI2C (ОхАО I address); SWAckI2C(); temp = SWReadI2C(); SWAckI2C(); SWStopI2C(); return temp; 11 упраВJIЯЩМ ба'I' 11 C4MBaHMe М3 О1 млм uз void WritePort (char address, char data ) SWStartI2C(); SWWriteI2C (ОхАО address); II ynpaBnR 6aT SWAckI2C(); SWWriteI2C (data); 11 запмсь в О1 MnM uз SWAckI2C () ; 
IлаRа 10. Вопросы повышенной сложности 479 SWStopI2C() ; Цифроаналоrовые преобразователи В микроконтроллсрах PIC цисрроаналоrовый преобразователь (ЦАП) ОТСУ1СП3У ст, В то >ке время эта срункция иноrда требуется. Фирма Microchip прсдлаrает СООНЮI с шующсе перисрерийное устройство, которое преобразует цисрровое значение в aHa JIOIOBOe нarlря>кение. Это устройство является недороrим и "ростым IIрИ IIOДКJIЮ'ЮНИИ И управлении со стороны микроконтроллера. Фирма Microchip выпускает IICСКОЛЬКО микросхем ЦАП с ПОСЛО/ователы IЫМИ BXO дами, которые доступны в 8BЫBOДHЫX корпусах тиrш POIP. В качестве IIримера MO>K11O наз[3аТЬ 8раЗрЯДIIЫЙ ЦАП ТС1320. Рис. 10.13 иллюстрирует ЦОКOJювку выводов ТС1320. В дополнение к ПОДКЛlOчениям VOD и VSS, вход V ret устанавливает nОЛlIомас штабное выходное напря>кение на выводе V out . вход SCL слу>кит для СИПlaла последова- телыюй синхронизации, а вход SOA  для ввода последовательных данных. Вывод OAC OUT обеспечивает выход непосредственно из ЦАП, но 06Ы4НО ДЛЯ снятия выходноrо сиrнала исrlOльзуется вывод V out ' Вывод OACOUT используется тоrда, коrда в системе применяется внешний операционный усилитель. 3то 6ывает довольно редко, потому что внутренний усилитель и усиленный выходной сиrнал, доступный на V ou !' обычно обеспечивает наrрузочнуlO спос06юсть, достаточную для большинс тва rtРИJIO>КСНИЙ. U1 1 Vref Vout 5 2 7 3 SOA DACOUT SCL ТС1320 Рис. 10.13. ЦАП ТС1320 Выходное напря>кение ТС1 320 дается первым уравнением из примера 10.8. ЕСJlИ на вход V ret подается опорное напря>кение, равное 5 В, то шаr выходноrо напря>кеllИЯ будет равен 0,00196 В, а максимальное выходное напря>кение будет равно 5 В. ДШI реrулирования шаrа выходноrо напря>кения и максимальноrо выходноrо сиrнала мо>кст использоваться друrое опорное напря>кение V ret . Второе уравнение из примера 10.8 мо>кет использоваться для Toro, 4тобы вычислить значение цисрровых данных, подar ' ных на АЦn с тем, чтобы сrенерировать конкретное выходное напря>кение. Пример 10.8 V out = Vref(AaHHe/256) Данные = (V out Х 256) IV ref nроrраммный интерсрес ТС1320 обычно ориентирован на SPI (последователь ный перисрерийный интерсрейс). При этом используется либо соответствующая CPYIIK цИЯ из библиотеки компилятора С18, или аппаратные средства SPI, продоставшюмые внутренним интерсрейсом MSSP. Схема, показанная на рис. 10.14, исrlOльзует PIC18F1220, который не имеет 6лока MSSP, поэтому используется проrраммная CPYIIK- 
480 TIрнменеине MHKpOKOHTpOnnepOB PIC 18 цИЯ SPI, добавляемая срайлом заrоловка swspi.h, который имеется LЗ библиотеке KOM ПИШlтора С18. Работа ЦАП требует, чт06ы он 6bIn переведен в нормальный ре>ким rlOсре/\стLЗОМ передачи в Hero значений Ох90 и Ох01, за которыми сnедует ОхОО. Адрес подчиненнorо устройства при этом запроrраммирован на предприятииизrОТОI3ИleJЮ как 1001 OOOw, при этом праLЗЫЙ бит (w) равен НУЛIO для операции заrlИСИ. Если необхсщим /\ру! ой aд рес nодчиненноrо устройства, то Microchip MO>Kel обеспечиТl) /o IЮСI>МИ различных адресов подчиненных устройств за отдеnьнуlO пnату. ПослеДОLЗal eJlbI IOСТl> значений Ох90, Ох01 и ОхОО проrраммирует ЦАП на работу в нормаnыюм ре>киме. С целыо жоно мии электропитания ЦАП переводится в ре>ким 6ездействия передачей в Hero ПОСJЮДО вателыюсти значений Ох90, Ох01 и Ох01. Чтобы преобразовать цисрровое значение в аналorовое напря>кение на ЦАП передается посnедовательность значений Ох80, ОхОО, которая сопровождается данными, подле>каw,ими преобразованию. Например, если V rct равно 5 В, а вывод V out YCTaHoBneH на 3 В, то nосnедоватеnыlOСТЬ Ох90, ОхОО сопрово>к дается зна4ением Ох9А. Ох9А вычисnяется из BToporo уравнения примера 10.8. R2 10К С2 0.1 uF :f :f PIC18F1220 U1  ТС1т> со RAO QRBO 8 RA1  RB1 7 RA2 R 82 RA3 R83 18 RA4 RB4 10 #MClR RB5 11 12 OSC1 RB6 13 OSC2 > R87 Q 5 Vref  Vout 7 SDA DACOUT SCl (/)  'ot \l) С1 1,0 uF -t-SV СЗ 0.1 uF R1 МG1 Рис. 10.14. V1споnьзование ЦАn для управnения эnектромотором постоянноrо тока nporpaMM8 уnравnения интерсрейсом по рисунку 10.14 приведена в приме ре 10.9. Схема демонстрирует зnектромотор постоянноrо тока на 3 В, связанный с BЫ ходом ЦAn. Скорость электромотора уnравnяется ЦАП и срункцией Speed, ВЮlюченной в проrрамму. V1ноrда зnектромотор мо>кет управnяться этим способом, потому что он мо>кет не запуститься наде>кно при испоnьзовании схемы ШИРОТlЮИМПУЛЬСIIЫЙ MOДY nятора, рассмотренной rnaBe 7. TIP120  это усиnитель на паре Дарnинrтона (падение напря>кення "6аза-змнттер" равно 1,4 В), П03ТОМУ выходной сиrнаn ЦАП доn>кен ле>кать Me)l(,lJ,y 1,4 В н 4,4 В, чт06ы управлять злектромотором с подачей на Hero от О до 3 В по стоянноrо тока. TIP120 используется как усилитель на эмиттерном повторителе. В спе цисрикациях выход ЦAn указывается дл максимальноrо тока, paBHoro 3 мА. Минималь ный коэсрсрициент усиления TIP120 равен 1000. 3то означает, что самый мощный элек тромотор, которым эта схема мо>кет управлять  это электромотор на 3 А. Функция 
rnaBa 10. Вопросы повышенной СnОIKНОСТИ 481 Speed использует скорости злектромотора от О до 152, rAe О означает останов Э)I8К т ромотора, а 152  ero максимальнуlO скорость. 3ти 153 прираw,ения скорости AOJI>Kl\bI обеспечить доста roчный уровень контроля скорости электромотора для большинства прило>кений. Пример 10.9 ,* * Орммер проrрамм управnеНМR зnектромотором nocToRHHoro тока *1 #include <p18cxxx.h> #inc1ude <sw_spi.h> / * YC'l'aHOBKa 6мтов конмrураuми установка BHYTpeHHe смнхронмзаuмм вкnченме cTopoeBoro TaMepa  вкnченме HM3KoBonbTHoro nporpaMMMpoBaHMR *  oTKn4eHMe с6роса по 4aCTMqHO потере nMTaHMR разреwенме 06ero с6роса *1 #pragma #pragma #pragma #pragma #pragma config OSC config WDT config LVP config BOR config MCLRE INTI02 OFF OFF OFF ON /1 function to control the speed of the motor 1I through the DАС. Speeds are О through 152 void Speed (unsigned char speed) if (speed >= О && speed <= 152) ( speed += 72; WriteSWSPI (Ох90); WriteSWSPI (ОхОО); WriteSWSPI (speed); 11 CMeeHMe скоростм на Ьу 1,4 Вольта 1I nepeAa4a скоростм #pragma code 11 OCHOBHaR nporpaMMa void main (void) ADCON1 = OxOF; 11 UMpoBe BBOA BBOAa-BBOAa TRISB = о; I1 Оорт в = BXOA OSCCON = Ох73; 11 BнyтpeННRR 01НХрОнизaци.sI 8 мru. intemal clock OpenSWSPI(); 11 KOHMrypMpoBaHMe WTpbKOB порта SPI WriteSWSPI (Ох90); 11 установ HopManbHoro peMMa WriteSWSPI (Ох01); WriteSWSPI (ОхОО); whi1e (1) 
482 TIpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 I1 выпоnненме ApyrMx ра60Т 10.4. Интерфейс CAN CAN  это уnраВЛЯIOw,ая локальная сеть, нспользуемая для Toro, чт06ы связать микроконтроллеры вместе 13 системе, 13 KOTOPO мнкроконтроллеры ДОЛ>КНЫ 06MeHH ваться даннымн Apyr с друrом. 3тот HHTepcpeCHЫ модуль называется модулем CAN или ECAN (расширенны CAN) имеется не 130 всех мнкроконтроллерах ceMeCTBa PIC18F. nервоначально CAN 6ыл разра60тан для автомобнльно nромышленностн, однако он нашел MHoro применений 13 различных 06ластях, в которых мно>кественные микроконтроллеры ДОЛ>КНЫ связываться друr с ApyroM. Структура САМ CAN очень nOXO>Ka на ЛlO6уlO HHYIO локальнуlO сеть, в которой данные nосылаlOТСЯ и nоnучаlOТСЯ Me)l(,lJ,Y комnыoерar,.ии и ЛlO6ымн YCTpOCTBaMH, которые содер>кат HHTep срейс. Основное отличне CAN заКnlOчается  том, 4ТО он разработнн ДЛS1 Toro, чтобы осуw,ествлть ннсрормационны 06мен Me)l(,lJ,Y мнкроконтроллерамн 13 ЛОКШIЫЮ облас ти 13 зашумленной среде, которая 6ыла 6ы noA06Ha сетям nK, если 6ы не высоки уро- ВШII помех. CAN разра60тан для ра60ТЫ 13 заwумленных средах, которые встречаются 13 автомобильных и иных подобных nрименениях. Модуль CAN содержит УСТРШIСТВО OT ра60ТКИ протокола, блок передачн со06w,ени 11 6лок управления, он nоnностыо интеr рирован в раЗЛИ4НЫХ микроконтроллерах семейства PIC 18. Как н друrие последова тельные сети, CAN срормирует сеть, которая для CBoe ра60ТЫ тре6ует использоваННfI двух выводов микроконтроллера. Компнnятор С18 nO,lJДep>KHBaeT работу этоrо интср срейса на языке С, за счет 4ero достнrается зсрсреКТНВНОС1Ь разрабоп-:и СООТВС I.СТВУЮ w,ero проrраммноrо 06еспечення. Вывод RB2 используется для переда4L1 даНI .IX (CANТX) н вывод R83 ис;rЮnЬЗУС'I- ся для приема данных (CANRX). 3ти два высода >ШЛЯIOТС едннственнымн подключе ниями микроконтроллера к данному ннтерфесу, они Связаны со внеШllей схемой управления WHHO, которая управляет CAN. CAN выnоr.няет инсрормаu.НОНIIЫЙ обмен Me)l(,lJ,y микроконтроnлерами 13 ЛlO60М напраялеННII. Мv:кроконтроллер может быть при емником со06w,ени нли ИСТ04ником/nрнемнV!ком co06w,eHH, что позвоnяет выnол нять nзаимную связь через CAN Me)l(,lJ,y HCCKOтJKHMH микроконтролnерами. Рис. 10.15 иллюстрирует типовое ПОДКЛlOчение. микроконтролnеров 4ерез CAN. Длина шины CAN мо>кет достиrать 1000 метров без нсnользования специальных схем управления при скорости инсрормаu.нонноrо 06мена 13 40 к6нт/с. Если длины WHHDI 6удет rvjeHCe 40 MeT rюв, то скорость инсрормацноноrо 06мена на wине будеr равна 1 м6ит/с. Эта скорость является достаточной для БОЛЬWИНС'lва nрнло>кенн, Tpe6YIOw,Hx ИСnОЛЬЗ0вания сетн. 
rnaBa 10. Вопросы повышенной СnОIKНОСТИ 483 МНКрОКОНтрOJшер 1200 1200 Узсn А резистор рези(.,'тор \ , 1  шина CAN    м икроконтро.1лер Мнкрокоюро.lлер М ИКрОКОIIТрOJШСр Узел В Узеn С УзеJl D Рис. 10.15. Мнкроконтроллеры, сое,lJ,нненные ме>кду собо 4ерез WHHY CAN Узлы шнны CB3bIBaIOTC ме>кду собо BHTO napo npOBO,lJ,oB (САТ5) как н в 60ЛЬ- шннстве ceTe. Узлы MOryr nOAKJlI04aTbC н OTKJlI04aTbC от сетн npH ВKJllOченном Ha nря>кеннн пнтанн 6ез какнхлн60 nOBpe)l(,lJ,eHH снстемы. К CAN мо>кет nОДКJlючаться IЗnJIОТЬ до 20 У3ЛОВ 6ез доnолннтельно 6усрернзаu.нн. На ка>кдом своем конце шина CAN ,lJ,ол>кна закаН4нватьс резнстором на 120 Ом. 3тот резнстор npeAoTBpaw,aeT OT ра>кенне CHrHaJlOB на WHHY  в 60льwннстве npHMeHeHH он 06Ы4НО ВКJl104ается между WHHHO napo на ка>кдом узле. Рнс. 10.16 НЛnlOстрнрует типово узел с MHKpOKoHTpon лером PIC18F2580 н микросхемои HHTepcpeca WHHbI CAN МРС2551 от срирмы Microchip. 3наченне M RS вы6ираетс такнм 06раЗ0М, 4т06ы сннзнть уровень злек TpOMarHHTHbIx помех. Чем 60льwе ero зна4енне, тем 60лее MHHHЫ cnaAalOw,H срронт 6удет нметь CHrHaJl шнны CAN н тем нн>ке 6удет уровень злектромаrннтных помех. +5V PIC18F2580 U1 о  С1 0.1 UF МРС2551 U2 с') 1 т)([) g САНН 7 4 RXD CANl 6 8 VREF u) RS  N R1 10К шина CAN со  Рис. 10.16. Узел CAN 
484 ITрнменение MHKpOKOHTpOnnepOB PIC 18 Приложение, использующее CAN Iипотетическим прило>кеннем дЛЯ CAN мо>кет 6ыть система управления лисртом. В этой системе ну>кно использовать какойли60 нндикатор на каждом зтаже, показы ваlOw,ий, rде находится ка6ина лисрта, а так>ке кнопки с тем, чт06ы пассажир MOI вызы rзаlЪ кабину лисрта, двиrаюw,уlOСЯ вверх ли60 вниз. В ка6ине lIисрта ДОЛ>КI-Ш быть IШIЮЛЬ Уllравления, чтобы пассажир Mor вводить тре6уемый зтаж, кроме Toro дол>кна иметься система управления, упраВЛЯIOw,ая nеремеw,ением ка6ины ЛИсрlа вверх и ЕЗниз ЕЗ шахте. Система, ИnЛlOстрируемая рис. 10.17, предназначена для работы в зданиях, число эта >кей которых достиrает 1 О, однако она леrко мо>кет 6ыть модисрицирована для ЛlOбоrо количества зтажей. Наи60лее значительным изменением в этом случае 6удет ИСПОЛL зование раЗВЯЗЫЕЗаlOЩИХ схем, поскольку количество ПОДКnlOчений к CAN Оlраничено 20. Каждый эта>к тре6ует наличия cBoero c06cTBeHHoro узла сети, что оrраничивает эrа>кность здания в сnучае отсутствия доnолннтельных развязываlOw,их схем. Каждый эта>к нуждается в 6локе управления, который является точно таким >ке, как на лю60М друrом эта>ке, за ИСКnlO4ением номера эта>ка. Бnок управления имееl ДЕЗе кнопки: одну, 060значеннуlO как UP (Вверх), и друrуlO, 060значеннуlO как DOWN (ВIIИЗ), а так>ке ЕЗнутренние диодные клlOЧИ, П03ВОЛЯIOw,ие устанавливать номер эта>ка. Единст ЕЗенные искnючения заКЛlOчаlOТСЯ в том, 4ТО самый верхний эта>к не имеет кнопки UP (Вверх), а самый ни>кний зта>к не имеет кнопки DOWN (Вниз). Блок управnения так>ке имеет боnьшие светодиодные индикаторы стреловидной срормы, которые указываlOТ направление движени ка6ины лисрта. Над входом в лисрт имеетс стол6ец больших СВОТОДИОДных индикаторов с цисррами, которые YKa3bIBalOT TeKyw,ee поnо>кение ка6ины nисрта. Рис. 10.17 ИЛЛlOстрирует компоненты систе.мы, ВКЛlO4ительно с микроконтрол- лером, которые расnоло>кены на каждом зта>ке. Рис. 10.18 ИЛЛlOстрирует микроконтроллер н компоненты контроллера, нсполь зуемоrо в системе управления JlИСРТОМ на каждом зта>ке. На плате установлены 4етыре интеrраnьных схемы: микроконтроллер PIC18F2580, ннтерсрейс CAN и две схемы управnения светодиодами. На60Р 4етырех переКЛlOчателей с двойным рядом ВЫВОДОЕЗ ИСlJользуется для Toro, чт06ы проrраммировать номер зта>ка в контроллере. Здания с больwей эта>кIюстыо Tpe6YlOT использования nереКnlO4ателей с 60nЬШИМ КOJIИЧОСТЕЗОМ выводов. Внутренние cna6bIe наrрузки ИСПОЛЬЗУlOтся в порте В для двух кнопок  UP (Вверх) и DOWN (Вниз), а так>ке дл четырех nереKJl104ателей с двойным рядом ЕЗыво- дов, предназначенных для установкн номера зта>ка. V1спользуема плата достаточно мала для Toro, чт06ы разместить ее nозадн кнопок илн ннсрормационной панели, co дер>каw,ей индикаторы зта>кей. Проrрамма для зтой системы использует 6и6лнотеку ECAN, предоставляемую на вебсайте срирмы Microchip. Блаrодар копированиlO срайлов ECAN.H, ECAN.DEF и ECAN.C в каталоr проекта и д06авленнIO оператора #include <ECAN.H> в срайл про rpaMMbI, система сможет проrраммнровать н использовать модуль ECAN, встроенный в микроконтроллер. Проrрамма контроллера зта>ка nисрта nриведена в примере 10.10. 3та система передает со06w,ение всякий раз, коrда на>ката кнопка UP (Вверх) или DOWN (Вниз) с тем, чт06ы со06w,ить контроллеру ка6ины nисрта (обсуждается поз>ке), что пасса>кир О>кидает на указанном зта>ке. Проrрамма так>ке nрослушивает шину CAN на наЛИ4ие со06w,ений от контроллеров зта>кей для контроплера ка6ины лисрта, в pe зуnьтате чеrо nравнльный номер зта>ка мо>кет нндицироваться на инсрормационной панели, расnоло>кенной над дверыо. 
rnaBa 10. Вопросы повышенной сnожности 485 Рис. 10.17. Лисрт н opraHbI управления им, располо>кенные на каждом зта>ке 53Ta>KHOrO дома. Пример 10.10 1* * KOHTponnep 3Taa смстемы управnеНМR nMTOM *1 #inc1ude <p18cxxx.h> #inc1ude <de1ays.h> #include <ECAN.h> 1* Установка 6мтов KOHMrypaUMM  установка BHYTpeHHe смнхронмзаuмм *  вкnченме cTopoeBoro TaMepa  BKn4eHMe HM3KoBonbTHoro nроrрамммроваНМR *  oTKn4eHMe с6роса по 4аСТИ4НО потере пмтаНМR  разрешенме 06ero с6роса *1 #pragma config OSC HS #pragma config WDT OFF #pragma config LVP OFF #pragma config BOR OFF 
486 TIpHMeHeHHe микроконтроnnеров PIC 18 #pragma config MCLRE = ON unsigned char floor[l]; char fired; unsigned long id; cnsigned 10ng iD; unslgned char data[l]; char dataLen; #pragma code 11 OCHOBHaR nporpaMMa void checkButton (void) if (PORTB & ОхСО != ОхСО) { if (fired == О) { Delay1KTCYx(15); if (PORTB & ОхСО { // KOMneHcaUMR дре6езrа контактов 1= ОхСО) fired = 1; if (PORTBbits.RB7 == О) { PORTCbits.RC6 = 1; floor[O] 1= Ох80; 1/ вверх } else { II внмз PORTCbits.RC7 = 1; floor[O] &= Ox7F; } while (!ECANSendМessage(iD, floor, 1, ECAN TXSTDFRAМE)); } else fired О; void main (void) { ECANRXMSGFLAGS flags; ADCON1 = OxOf; TRISA О; TRISB OxFB; TRISC О; fired PORTA = PORTC = iD = о; // светодмоды BblKn floor [О] = (PORTB & 3) I ((PORTB & Ох30) « 2); ECANInitialize(); 1/ мниuиаnмзаUМR CAN while (1) { // все выводы порта UMpoBble // nроrрамммрованме rropTOB checkButton(); if (ECANReceiveMessage (&id, data, &dataLen, &flags)) 
rnaBa 10. Вопросы повышенной сnожности 487 if (id == 1) { 11 eCnM ОТ KOHTponnepa кабмны PORTA = 1; 11 мзмененме мндмкацми Э'J'аЖiJ PORTA «= data[O]; lf (data[O] O= (Пооr[О] & ОхЛ')) POR'I'C = РОЕТС & ОхЗr"; 11 ВВЕ1-'Х и НIJИЗ в}'[КJI. Кабнна лнсрта так>ке Hy>кдaeTC в контроллере. 3тот контроллер AOn>KeH rIOЗВО .1ИТЬ пасса>киру вы6рать зта>к, он так>ке должен выравнивать ка6ину лисрта, коrда она останавливается на зтаже, nepeMew,aTb ее от oAHoro зта>ка к ApyroMY, а так>ке и пере J,aBaTb текуw,нй номер зта>ка всем контроллерам зта>кей, ПОДКЛlOченным к CAN с тем, -п06ы они моrлн от06ра>кать TeKYw,ylO n03Hu.HIO ка6нны лисрта. Контролnер кабины TaK ,.ке объявляет номер зта>ка и лю6ую друrую инсрормациlO через динамик в кабине J1Иср та. 3'1'0 придает системе "человеческое лицо". Anя выдачи зтих rолосовых сообщений ,1сrlOJ1ьзуется ЦАn, подаlOw,нй на дннамик человечески rOJ1oc, дискретизоuанный с '1aCTOTO в 2 Kru. н coxpaHeHHЫ в памятн. РНс. 10.19 нллюстрирует панет) управления, находяw,уIOС в ка6нне лнсрта. AaHHa nанель нсnользуется nасса>кирами для Toro, что бы вы6рать Tpe6yeMЫ эта>к н содер>кнт кнопкн, которые при на>катии ПОДсвечиuаются светоднодамн. Что не nоказано на 3TO НЛЛlOстрацни,  так зто динамик, 4ерез который 06ъявляlOТС зта>кн, а так>ке стрелкн "вверх/вннз" в ка6нне лнсрта, которые oT06pa>KalOT направленне ДBH>KeHH. Механнзм выравнивання nисрта и система управления эnек тромотором здесь так>ке не рассматрнваlOТСЯ. РНс. 10.20 ИЛЛlOстрнрует nринu.нпнаЛЫ-IУIO схему контроллера кабины ЛИфl а. ЭJlектромотор лнсрта, установленны на KpbIwe здання, управляется через подачу на Hel о уrlравляюw,нх снrналов наnря>кения 24 В переменноrо тока. 3ти сиrналы активи руются ннтеrраЛЫ"iЫМИ реле, располо>кенными на плате управления кабины лиф I а. Имеются два сиrнала: однн запускает злектромотор так, что кабина nисрта ДВИ>К(ПСЯ Ешерх, а Apyro запускает злектромотор так, что ка6ина лисрта дuи>кеТС1 UНИЗ. ВыраЕЗ нивание ВЫПОJlНЯТСЯ сротодетектором по меткам сннхронизации, которые имеЮТС1 в шахте лнсрта. CHrHanDI с сротодетектора расnознаlOТСЯ контролnером, в резулыате ЧШ'О I1ИСРТ останавливается на зтаже в правильной nознции. ЦАn нсnользуется, 4т06ы reHepHpoBaTb ре4Ь 4ерез динамик, KOTOpЫ управляеlСЯ ТlP120. TIP120 мо>кет формировать очень 60льшне токн, достаточные для упрашюния MOW,HbIMH динамнкамн, n03ToMY в схему ВКЛlO4ен резистор управления rpoMKocTblO, оrраничнваlOw,и ток, проходящи 4ерез дннамнк, а следователыю и rpoMKocTb рече вых со06w,ений. В срорме массива, расnоло>кенноrо в памяти nporpaMM, хранится дe СЯ1Ь речеuых со06w,ени. 3тн со06w,ения здесь не рассматриваlOТСЯ  они АОЛ>КIIЫ re нерироваться пользователем с использованием Apyroro РIСУСТРОЙСТl3а (здесь 110 [lo казано) н АЦn, rенеРИРУIOw,еrо бнтовый поток ДЛЯ пронзнесенных CJIOU. Амплитуда сиr налов 3Toro потока дол>кна ле>кать ме>кду 1,4 В и 3,6 В для правиnьной работы системы. 
5 В от светодиодов UЗ 120 В OUTA 'НА 1 1 OUTB INB 2 2 оите INC 3 4 3 оито 'НО 5 4 оиТЕ INE 6 5 OиТF INF 7 OUTG ING СОМ 9 вверх 16 OUTA 'НА 1б вниз 14 OUтa INB 13 ouтe INC 12 OUТO 'НО 11 OUТE 'НЕ 10 OUТF INF OUТG ING СОМ 9 082003 R2 10К + С1 PIC18F2S80 0.1 uF и1 о N МРС2б51 RAO а RBO 21 и2 1")  22 RA1 RB1 23 1 7 шина RA2 RB2 тхо с CANH  24 4  CANL 6 RA3 RB3 25 5 RXD CAN 'о RA4 RВ4 VREF  :s: 26 8 а:: RA5 RB5 27 RS (tI МCLR RB6 ::z: 08С1 RB7 28 N (tI 11 R1 ::z: 08С2 RCO :s: 12 10К (tI 16 RC1 13 а:: 17 RC5 RC2 14 :s: 18 RCS  RC3 15 :;.; RC7 > >RC4 'о о С2 :;.; с!о  О ::z: .OuF -d о   4 MHz .g - о Up IXI О ""о ......с:з..... n Down 00 С4 СЗ 27 pF 27 Р .+::. 00 00 +5V Рис. 10.18. На каждом зтаже имеется контроллер системы уnравлени лифтом 
rnaBa 10. Вопросы повышенной СnОIKНОСТИ 489 [[] o ЕЮ [[] *Ш [ш @]@] Рис. 10.19. nанель уnравлени в ка6ине лифта Выравнивание ка6ины лифта и индикаци зтажей нллюстрируютс на рис. 10.21. Дл целей указани зтажей исnользуютс со06w,ения, закодированные штрихкодами на пленке, KOTopa клеитс к стенке waxTbI лифта. Штрихкоды с4итывIoтс,' коrда Ka 6ина лифта движетс вверх и вниз по waxTe. Штрих код nозвоnет ка6ине ЛИфlа O(lPC делть номера зтажей, а так>ке останавливать ка6ину лифта, так что она будет на одном уровне с полом зтажа. Используемый wтриховой код кодирует номер этажа в двоичной системе С4исления, при зтом имеется та же центральна отметка, которая 110ЗВОJlяет системе оnределть уровень зтажа. Пример 10.11 показывает nporpaMMY контроллера ка6ИIIЫ лифта. Обратите uни- мание на то, 4ТО поскольку выводы порта С исnользуютс аппаратными средствами для управлени ЦАn, фал заrоловка swspi.h, должен быть модифицирован таким обра зом, чтобы выводы порта С ИСnОЛЬЗ0вались ДJl последовательной TaKTOBO частоты и передачи nоследователыых данных на ЦAn. Дл Toro, чт06ы эта nporpaMMa работала, с ве6сайта Microchip.com должен быть заrру>Кен 6и6лиоте4НЫ файл ECAN. 
R1 10К U4 120 На светОД;ЮДЫ СОМ 9 082003 +fN  N <')  Ш!)((ИТ открытия RВO RB1 CANТX CANRX RВ4 RB5 Rвe RB7 RCO RC1 RC2 SCK ЗDI SOO RCB RC7 RE1 RE2 101< R9 те 1320 UЗ Vre1 SDA ЗСL 50 Рис. 1 0.20. Электрическа схема 6лока управлени ка6ины лифта + СЭ 0.1 uF МРС2551 U2 ТXD CI CANH шина RXD g CANL 6 CAN VREF  R8 О1 llР120 LS1 динамик  \D О :::J "о :s: а::  :I:  :I: :s:  а:: :s: ::о: "о о ::о: о :I: -d о    "о О I:!' "i:I n 00 
fnaBa 10. Вопросы повышенной СnОIKНОСТИ 491 Вид Сllередн l' I I I..1JШШШ Вил: спереди м w Рис. 10.21. Соеднннтельные разъемы USB Пример 10.11 1* * IIро)'рамма КОН'l'роллера ка6ины лифта *1 #include <p18cxxx.h> #lnc1ude <delays.h> #include <ECAN.h> #inc 1 ude <spi. h> #inc1ude <timers.h> 1* Установка битов конфиrураuии *  установка BHYTpeHHe смнхронмзаuмм *  вкnqение CTopoeBoro TaMepa *  BЫKnqeHMe низковольтноrо проrрамммрования *  отклqение сброса rro qастиqно rrOTepe rrитаНИR разреwение 06щсrо с6роса *1 Jtpr agma config OSC HSPLL // 32 MrU #pragma config WDT OFF #pragma cOnfig LVP OFF #pragma config BOR OFF itpragma config MCLRE ON 1/ peqeBe сообеНИR в rrаМRТИ rrporpaMM / / мзсю ДJ1R 10 односекyн,J:::(l-Ь1X ре4еБых , 'циcкpe'IИ30ВсЗННЫх С qаCТO'I'ОЙ 2048 IlI. II / / Дискретиз.щия ау,ЦИосиrнапов дoтrжнa БbII lQ1IWlТЬСЯ I1fИ МИНИМд.Т1Ьн уровне 1, 4 В м II максимаnьном уровне 3,6 В, что6ы ЦАП функuионироваn rrравильно. II Лудмофал долсн 6ыть сформмрован rrользоватеnем как peqeBO массмв. II I1 о I1 1 1/ 2 I1 3 II 4 II 5 /1 6 // 7 1/ 8 // 9 подваn" "перв з'rа" "BTOpO 3Ta" "трети 3Ta" "qе'l'вертbIЙ 3Ta" ПR'l' 3Ta" "закроте Аверь" "лмфт МАет вверх" "nмфт МАет вниз" "мниuиализаUИR" 
492 IT рнмененне MHKpOKoHTponnepoB PIC 18 rom near char speech[10] [2048]; rom near char keyt [] 5, 3, 1, 6, 4, 2, О, 7 } ; void MyHighlnt (void); II прототмn II nepeMeHHe в naMRTM данных unsigned char fifo[16]; unsigned char tifoINP; unsigned char fifoOUTP; unsigned char SPlbusy; unsigned char speak; unsigned int speechCounter; unsigned int timeDe1ayCounter; unsigned char door; unsigned char callFloor[6]; unsigned char data[l]; unsigned char dataLen; unsigned currentFloor; unsigned int barcode[6]; unsigned char barcodePtr; unsigned char carMoving; char cal1Direction; char state; II 1 = вверх, 2 = внмз, О = останов II 1 = вверх, 2 = внмз, О = OMДaHMe #pragma interrupt MyHighInt #pragma code highvector=Ox08 save=PROD II highvector по адресу ОхОО08 void highvector (void) 1I BcoKonpMopMTeTHbl вектор asm GOTO MyHighlnt endasm II переход на 110ДIIроrрамму II 06ра60ТКИ II EblCOKOnpмopM'l'e'rнo.['o преР>IВанмя lpragma code void DoOptical (void); void DoTimer1 (void); void DoSPI (void); void MyHighInt(void) II HOBЫ фмксированны вектор 11 высокоприоритетноrо npepblBaHMR if (INTCONbits.INTOIF = 1) DoOptical(); else if (PIR1bits.TMR1IF == 1) DoTimer1() ; else if (PIR1bits.SSPIF == 1) DoSPI () ; II eCnM ОП'1'М4ескм счмтыва'rеПЬ II eCJIM 'l'aMep 1 1I еСnИ MH'l'epec SPI void SendFloor (void) 
fnaBa 10. Вопросы повышенной СnОIKНОСТИ 493 unsigned char floor[l]; floor[O] = currentFloor; while (!ECANSendMessage(l, floor, 1, ECAN ТХ STDFRAME)); void WriteFifo (unsigned char data) if (fifoINP = fifoOUTP && SPlbusy О) SPlbusy = 1; WriteSPI (data); } else fifo[ fifoINP++ fifoINP &= 15; data; unsigned int ReadFifo (void) ( unsigned int retval = Ох100; if (fifoINP != fifoOUTP) { retval = fifo[ fifoOUTP++ ]; fifoOUTP & 15; return retva1; void DoSPI (void) unsigned int data = ReadFifo(); PIR1bits.SSPIF == О; if (data != Ох100) WriteSPI(data) ; void DoOptical (void) INTCONbits.INTOIF = О; if (barcodeptr != О) barcode[barcodeptr] WriteTimerO (О); barcodeptr++; ReadTimerO(); void DoTimer1 (void) PIR1bits.TMR1IF == о; Wri teTimer1 (4 88) ; if (speak != О) WriteFifo (Ох90); WriteFifo (ОхОО); II ре4еВое co06eHMe 
494 Прнмененне MHKpOKOHTpOnnepOB PIC 18 WriteFifo (speech[ speak ] [ speechCounter++ J); if (speechCounter = 2047) speak = speechCounter  О; } if (timeDelayCounter ! = О) 11 шаl' мнкремеН'l'МРО13анмя  1/2048 'ц timеDе1ауСоuпtеr-; if (door == 1 && PORTBbits.RB1 == О) { PORTAbits.RA2 = О; door = о; } else if (door == 2 && PORTEbits.RE2 О) PORTAbits.RA1 О; door  О; void CloseDoor (void) while (door != О); PORTAbits.RA2 = 1; door = 1; II омдание остановкм дверм II закрытие двери void OpenDoor (void) while (door ,= О); PORTAbits.RA1 = 1; door = 2; 1I ОИАание остановкм двери 1/ OTKpTMe двери void CheckButtons (void) char but = о; char mask  Ох10; PORTC &= OxFC; if ((PORTC & OxFO) != OxFO) { Delay1KTCYx(140); if ((PORTC & OxFO) != OxFO) { PORTC != 1; if ((PORTC & OxFO)  OxFO) { PORTC 1= (PORTC & OxFC) I 2; but += 4; } while ((PORTC & mask) { mask) mask «= 1; but++; } but keyt[but]; if (but  6) { OpenDoor () ; timeDelayCounter 2048 * 5; 1I 5 sec 
rnaBa 10. Вопросы повышенной СnОIKНОСТИ 495 } e1se if (but == 7) CloseDoor() ; else cal1Floor[ but ] 1= 4; 1I данные ВЫЗ0ва 3Taa: 11 О ВЫЗ0ва He'J' 11 1 ДМС'l'анuмонный ВЫЗ0В вверх 11 2 ДMCTaHЦMOHHЫ ВЫ30В внмз 1/ 4 nOKanbHbI B30B void CheckCAN (void) ECANRX MSG_FLAGS flags; if (ECANReceiveMessage (О, data, &dataLen, &flags)) { if ((data[O] & Ох80) == Ох80) callFloor[ data[O] & Ox7F 1= 1; else callFloor[ data[O] 1= 2; void LevelCar (void) if (carMoving == 1) { barcodeptr = о; PORTAbits.RA3 = 1; while (barcodePtr == о); PORTAbits.RA3  о; barcodeptr = о; PORTAbits.RA4 = 1; while (barcodePtr == О); PORTAbits.RA4 = о; barcodeptr = о; PORTAbits.RA3 = 1; while (barcodeptr == о); PORTAbits.RA3 = о; } e1se barcodeptr = о; PORTAbits.RA4 = 1; while (barcodeptr = о); PORTAbits.RA4 = о; barcodeptr  о; PORTAbits.RA3 = 1; while (barcodePtr == о); PORTAbits.RA3 = о; barcodeptr = о; PORTAbits.RA4 = 1; while (barcodeptr == О); PORTAbits.RA4 = о; 
496 Прнменение микроконтроnnеров PIC 18 unsigned char ReadBarcode (void) { char а; unsigned int Ь  OxFFFF; for (а = О; а < 3; а++) if (barcode[a] < Ь) Ь = barcode[a]; Ь *= 3; а = О; if (barcode[O] > Ь) а 1= 4; if (barcode[l] > Ь) а 1= 2; if (barcode[2] > Ь) а 1= 1; a- ; return а; void DoE1evator (void) char а; if (state О) { for (а о; а < 6; а++) if (callFloor[a] != О) break; if (а != 6) { if (currentFloor < а) { PORTAbits.RA4 callDirection speak = 7; 1; 1; II nер:>..мещ::!ние кa6MH .вверх II сказать "вверх" } else PORTAbits.RA3 callDirection speak = 8; 1; 2; II nеремещение ка6ины вниз 1I сказать "внмз" state 1; timeDelayCounter 4092; } else if (state == 1) barcodeptr = о; state = 2; } else if (state == 2) if (barcodePtr == 4) { if (ReadBarcode() а) 
rnaBa 10. Вопросы повышенной СnОIKНОСТИ 497 currentFloor = а; callFloor[a] = О; PORTAbits.RA4 О; PORTAbits.RA3 = О; LevelCar(); OpenDoor(); speak = а; } else state 3; ) else if (state == 3); state = 1; timeDelayCounter 4096; void FindFloor (void) { unsigned char flr[l]; PORTAbits.RA4 = 1; timeDelayCounter = 4096; while (timeDelayCounter != О); PORTAbits.RA4 = О; barcodeptr = О; PORTAbits.RA3 = 1; while (barcodePtr != 4); flr[O]  ReadBarcode(); while (!ECANSendMessage(O, flr, 1, ECAN_TX STD FRAME)); О; II PORTAbits.RA3 = carMoving = 2; LevelCar() ; speak = flr[O]; currentFloor  flr[O]; carMoving = о; void main (void) char а; ADCON1 = OxOF; TRISA О; TRISB OxFB; TRISC о; TRISD о; TRISE 4; 11 сказать номер 3Taa I1 nepeMeeHMe Ka6MH вверх I1 2 ceKYHД II OMдaHMe II останов Ka6MH II nepeMeeHMe Ka6MH внмЗ II OMдaHMe штрмхкода останов Ka6MH 1I сказать номер 3Taa II вы60Р UMpoBoro BBOAaBЫBoдa II nроrрамммрованме порта А II nроrрамммрованме порта В II nроrрамммрованме порта С II nроrрамммрованме порта О II nроrрамммрованме порта Е PORTA PORTC = PORTD  SPlbusy = speak = о; timeDe1ayCounter = speechCounter = door = о; barcodeptr = carMoving = state = callDirection о; for (а = о; а < 6; а++) callFloor[a]  bar code[a] = о; 
498 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 ECANlnitialize() ; INTCON2bits.RBPU = о; OpenTimerl (TIMER_INT_ON & Т1 16BIT RW &  - Т1 SOURCE INT &   T1PS18); WriteTimer1 (488); OpenTimerO (TIMER_INT OFF & ТО 16BIT & то SOURCE INT &   ТО PS 1 256); PIEIbits.SSPIE = 1; RCONbits.IPEN = о; INTCON2bits.INTEDGO = о; INTCONbits.INTOIE  1; INTCONbits.GIE = 1; II мнмuмаnмзаuмя CAN II BKn4eHMe HarpY30K порта В II TaMep на 1 мкс timer II cpa6aTBaHMe KaAe 488 мкс II 1/2048 ru Аnя аУАМО II 32 мкс II разрешенме прерыванмя от SPl II талько ВЫСОКОnpМОрИI'е'I'Ные llре[ывIlияя BKJJ. II 06ъявnенме INTO переКJI4аемым по II oTpMuaTenbHoMY POHTY II разреwенме INTO II разреwенме npepBaHM OpenSPI (SPI FOSC16, MODEOO, SMPEND); WriteFifo (Ох90); WriteFifo (Ох01); WriteFifo (ОхОО); II KOHMrypMpoBaHMe WTpbKOB II порта SPI II установка HopManbHoro peMMa WriteFifo (Ох90); WriteFifo (ОхОО); WriteFifo (ОхОО); II Амнаммк BbIKn. speak = 9; II сказать "мнмuмаnмзаuмя" CloseDoor(); whi1e (door != О); II OMAaHMe заКРТМR ABepe FindFloor() ; OpenDoor() ; timeDelayCounter 2048 * 5; II 5 сеКУНА whi1e (1) { CheckButtons(); CheckCAN () ; if (timeDelayCounter { CloseDoor(); DoElevator () ; II проверка HaaTMR nOKanbHo KHonKM II проверка CAN О) II заnуск nMTa 
rnaBa 10. Вопросы повышенной CnOIKHOCTH 499 10.5. Интерфейс USB Универсальная последовательная WHHa (USB) 4асто способна реwить nроблему связи как для персональноrо компыоера,' так и для мноrих встроенных приложений. 31 а шина обеспечивает скоростной последовательный инсрормационный обмен, при зтом она подает злектропитания на все nОДКЛlOченные к ней устройства. Друrие npe имущества USB: леrкость ПОДКЛlO4ения устройств и ДОС1Уn к вплоть до 127 различным IIOДКЛlO4енным устройствам через последовательный кабель с четырьмя выво/\ами. 3тот интерсрейс идеален для внедренных микроконтроллеров, клавиатур, звуковых плат, простых видеовоспроизводяw,их устройств и модемов. Скорость передачи дaH НЫХ равна 480 мбит/с в СЛУ4ае работы на полной скорости по стандарту USB 2.0, 11 мбит/с для инсрормационноrо обмена в соответствии со стандартом USB 1.1 и 1,5 мбит/с при работе на минимальной скорости. В зависимости от версии PIC, ско- рость переда4И данных может устанавливатьс либо в соответствии с USB 1.0, либо в соответствии с USB 2.0. Алина кабел оrраНИ4ена TpeM метрами дл полноскоростноrо интерсрейса и пятыо метрами дл медленноrо интерсрейса. Максимальная MOW,HOCTb, доступная 4e рез зти кабели, может быть оценена как максимальный ток в 100 мА при напряжении 5 В. Если сила тока превысит 100 мА, то Windows отобразит желтый восклицательный знак рядом с устройством, указывая 3ТИМ состояние переrрузки устройства. Соединительный разъем USB Рис. 10.21 ИЛЛlOстрирует разводку выводов соединнтельных разъемов USB. On ределены два типа соединительных разъемов USB и оба они ИСПОЛЬ3УIOТС. В каждом СЛУ4ае в каждом соединительном разъеме имеется 4етыре WTbIpbKa, на которые пода IOтся сиrналы, указанные в табл. 10.2. Как уже упоминалось, +5 В и земля MOryT исполь зоваться для злектропитани устройств, ПОДКЛlO4енных к wине, если только сила тока не nревысит 100 мА на устройство. Сиrналы данных  зто двухсразные сиrналы. Коrда wина "+данные" находится в состоянии З,З В, wина "-данные" находитс в состоянии О В и наоборот. ТАБЛИЦА 10.2 . Цоколевка выводов USB Номер вывода 1 2 3 4 Сиrнал 5.0В Данные Данные Земля 
500 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 передача данных ОЕ 27 +DАТА данные USB DATA 27 прне-м данных + Рис. 10.22. Пример интерсрейса Передача данных через USB Сиrналы данных  зто двухсразные сиrналы, которые rенерируlOТСЯ с ИСПОЛЬЗ0ва нием схемы типа, ИЛЛlOстрируемоrо на рисунке 10.22. Приемник линии также ИЛЛlOст рируется на рис. 10.22. К паре передаlOw,их проводов ПОДКЛlOчена схема шумоnодав ления, изrотовленная срирмой Texas Instruments (SN75240). После установки приемо передатчика, срормирование интерсрейса USB заверwается. V1нтеrралышя схема 75773 от Texas Instruments в приведенно схеме может НСПОЛЬЗ0ваться как дисрсреренu.иаль ная схема управления линией н как приемник. Теперь рассмотрим, как сиrналы взаИМО,lJ,ействуlOТ на USB. 3ти сиrнanы позво ЛЯlOт передавать и получать данные из XOCTKoMnbIOTepa. При передаче инсрормаu.ион ных пакетов USB использует кодировку сиrналов NRZI (без возврата в ноль, инвертиро ванные). 3тот метод кодирования не изменяет уровень сиrнала при передаче лоrиче ской единиu.ы, но уровень сиrнала инвертируется при каждом изменении сиrнала в лоrически ноль. Рис. 10.23 ИЛЛlOстрирует поток u.исрровых данных и соотвеТСТВУIOw,ие сиrналы USB при ИСПОЛЬЗ0вании Ha3BaHHoro метода кодирования. ФаКТИ4ески передаваемые данные ВКЛlOчаlOТ биты синхронизации, при зтом ис- пользуется метод, называемый вставкой битов. Если лоrическая единиu.а передастся на протяжении более, чем wести битов в строке, то соrласно методики вставки битов, после wести непрерывных единиu. вставляетс дополнительный бит (лоrический ноль). Поскольку зто удлиняет поток данных, то 3ТОТ метод называется вставкой битов. Рис. 10.24 показывает последовательный поток данных со вставленными битами, а также алrоритм, используемый дл Toro, 4тобы создать 3ТОТ поток И3 необработанных цисрро вых последовательных данных. Методика вставки битов rарантирует, что приемник сможет сохранять синхронизациlO в случае длинных последовательностей единиц. 3та же методика подразумевает вставку одноro единичноrо бита в поток данных после wести непрерывных нулей в строке. Аанные всеrда передаlOТСЯ последовательно, Ha чиная с младwеrо бита. Команды USB ,Цл Toro, чтобы на4ать инсрормаu.ионный обмен, сначала передается байт син хронизаu.ии (80Н), за которым следует байт идентисрикации па кета (РID). РID содержит восемь битов, однако только самые npaBbIe четыре бита YKa3bIBalOT тип пакета, который будет следовать. Левые четыре бита РID  3ТО биты, ДОПОЛНЯIOw,ие правые четыре бита до единиц. Например, если передается команда 1000, то срактически в РID будет nepe дан байт 0111 1000. Табл. 10.3 демонстрирует доступные 4битные РID и COOTBeTCT 
rnaBa 10. Вопросы повышенной сnожностн 501 ВУlOщие им 8битные коды. 06ратите внимание на то, 4ТО РID используются в качеСТl3е индикаторов лексем, индикаторов данных, а так>ке для квитирования связи. цнфровые aHIIыe NRZ\ о о о о о о о ul IL Рис. 10.23. Данные в срормате NRZI Таблица 10.3. Коды РID (идентисрикаu.ии naKeToB) КОД иден'l'ИфИ хации Е1 02 СЗ А5 69 5А 4В ЗС 2О 1Е Имя ООТ АСК DataO SOF IN NAK Data1 PRE Setup Stall Тип Лексема Квмтмрованме CBR3M aHHe Лексема Лексема Квмтмрованме aHHe CneUManbH Лексема Лексема Описание Хосткомпьтер >  ункuмонаnьная операция Прмемнмк квмтмрует пакет Оакет AaHHX (РIО четный) Ha4ano peMa ФункuмонаnьнаR операuмя> X KOMnbTep Ормемнмк не npMHMMaeT naKeT Пакет AaHHX (PID нечетньrn) Преам6уnа хост-компьтера КомаНАа HaCTpOKM 3aMeAneHMe 
502 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 Исходные и передавае.мые ДaIшые данные ; !! . i цl данные в r---; '1  2  3 ; 4 ;  ;  ; +--i Н Ф ; L.J : :  !oJ:tJL.iJ  L....J i арМате: . . : : :. . 1. : . . : NRZI  j 1 I ' j jвJ<lв1l;ньiй бит; I Начало инвентирование выхода выход = о инкрементирование счетчика счетчик!= 6 передача нулевоrо бита Рис. 10.24. V1нсрормационный поток и 6лок-схема алrоритма, исnользуемоrо ДЛ rенерирования USВданных. 
lnaBa 10. Вопросы повышенной сnожностн 503 Рис. 10.25 ИЛЛlOстрирует срорматы данных, лексем, а также пакетов подтвержде ния СВЯ3И и naKeToB Ha4aJla сррейма, передаваемых 4ерез USB. В пакете лексемы ADDR (поле адреса) содержит 7 разрядный USBaдpec устройства. Как у>ке упоминалось pa lIее, до 127 устройств MOryT nРИСуТствовать на USB одновременно. ENDP (терминаль ная roчка)  4разрядное 4ИСЛО, используемое USB. Терминальная точка 0000 исnоль зуеlС для инициализаu.ии, в то время как друrие значения терминальных точек УIIИ кальны для каЖДоrо USВустройства. V1меIOТСЯ два типа САС (контроль u.ИКnИ4еским из6ыточным кодом), исrIOJlЬ3УО мых при передаче данных через USB: 56итный САС и 16 6итный CRC (используемый для naKeToB данных). 5-разрядный САС rенерируется соrласно мноr04лена Х5 + Х2 + 1; 16разрядный САС rенерируетс соrласно мноr04лена Х16 + Х15 + Х2 + 1. При срорми ровании злектронных схем, rенерируlOw,их или 06наруживаlOw,их CRC, знаки "+" пред ставляlOТ лоrИ4ескуlO схему "ИСКnlOчаlOw,ие V1ЛV1". CAC схема или nporpaMMa  это no следовательный механизм проверки. При ИСnОnЬЗ0вании 56ИТlюrо CRC остаТОЧIIЫЙ результат 011 00 получаетс для СЛУ4ая отсутствия ошибок во всех пяти битах CRC LI1 битах данных. При ИСnОЛЬЗ0вании 166итноrо САС в случае отсутствия ошибок ПОJlуча ется остаТ04НЫЙ резуль тат 10000000000011 01 . USB исnользует лексемы АСК и NAK д.!lя координирования обмена инсрормацион ными nакетами между хостсистемой и USВустройством. После Toro, как naKeT данных передан от хосткомnьютера на USB устройство, USB устройство передает обраТlIO I ш xocT-компыоерp либо лексему АСК (подтверждение), либо лексему NAK (О1СУТСПЗИО подтверждения). Если данные и САС nОЛУ4ены правильно, посылается АСК; если He nравнльно, то посылается NAK. Если хосткомпыоерp получает лексему NAK, то 011 бу дет повторно передавать naKeT данных до тех пор, пока приемник в конu.еконцов не получит ero nраВИJlЬНО. 3тот мето,lJ, nереда4И данных 4асто l-Iа3bIваlOТ методом управле ния потоком данным с остановом ножиданнем. xoct-комnыоерp должен ожидать, пока устройствоклиент не передаст АСК или NAK перед переда4ей последующих naKeTOB даНIIЫХ. 
504 ITpHMeHeHHe MHKpOKOHTpOnnepOB РI С 18 11aKeT лексемы 8 бнтов 7 бнтов РID L DDR 4 бнтов 5 бffi'OВ ENDP IR !Iачало пакета фрейма 8 бlrroв 11 битов 5 бнтов PID Frame Number САС5 8 бнтов Пакет данных от 1 до 1023 байт 16 бнтов PID Data САС16 Пакет подтверждения связи 8 битов PID Рис. 10.25. Пакеты USB PIC18 и USB USB HenOCpe,lJ,CTBeHHo поддер>киваетс неСКОJlЬКИМИ И3 микроконтроллеров PIC18. 3то позволет микроконтроллерам ПОДКЛlOчатьс к nK и USB срактически для ЛlOбоrо nрименени, при котором нео6ходима CB3b 3Toro типа. Предусмотрена соот  веТСТВУIOw,ая 6и6лиотека ДЛ КОМПИJlятора С18, однако она должна быть заrружена с вебсайта срирмы Microchip. 3та 6иблиотека имеет HM MCHPFSUSB и находится в сек- u.ии работы с BЫCOKOCKOpOCTHO USB ДЛ стеН,lJ,а PicDem. 3та секu.и предnолаrает, что необходимы cpaJl У>Ке заrру>кен и установлен, так 4ТО НJlЛlOстрируемое проrраммное обесnе4енне мо>кет ИСnОЛЬЗ0ваться ДЛ nроrраммировання микроконтроллера PIC18F4550, KOTOpЫ BKJl104aeT 6ЫСТРО,lJ,ествуlOw,и интерсрейс USB. naKeT содержит библноте4ные cpaJlbI ,lJ,JlЯ КОМnИJlтора С18, а так>ке дpaBep, устанавливаемы в ПК с тем, 4т06ы C,lJ,eJlaTb ВОЗМО>КНЫМ инсрормаu.нонны 06мен с микроконтроллером. 3ти СРункu.ин, а так>ке ,lJ,paBep НСnОЛЬ3УlOтс как основа ЛlO60rо USВинтерсрейса между ПК и микроконтроллером. 
PIC18FX455/X550 Famlly , I ,.  В;ен-иЙ   ,ИСТОЧНИК 3,3 в: \/REGEN EN стаБИJШзатор 3,3 В VUS8 I Дополниrельные I внешние I I I I 4r........................................ FSEN UPUEN 0+ o . <: ... нarpузки ,. '" 1 полная I I скорость I.. LJТRDIS I <;. низкая I скоросты ,.j шина USБ Тактовая частота. USБ (yf модуля reHepaтopa FS ОЕ  I ti  OE (1) J Бнешний приема-передатчик +-rZI ум(1) ..         '" шина USБ IVP(1) I  '  I +1ZI RCV(1) :... с> ·  1 ....c8I Y"10(1) I I I  po(1) 1.        .... J SPP7:SPPO СК I SPP CK2SPP CSSPP OESPP Управление и .. конфиrурирование USB . USB SIE w 3УПВ USБ на 1 кбайт 4 . Примечания: 1. Этот сиrнал может быть получен только при условии блокировки BHyтpeHHero приемо-передатчика (URDfS =1). 2. Внутренние наrрузочные резисторы должны быть отключены (UPUEN == О), если используются внешние наrрузочные рези сторы. 3. Не активируйте внутренний стабилизатор, KorAa используется внешнее питающее напряжение 3,3 В. Рис. 10.26. 8нvтоенняя CTOVKTvoa US8 (с оазоешени Фиомы Microchio) ;J  '"   Q:j о ::J 'о О (') е: ::J о '" е: Е (t) :r: :r: о :s:, (') ::;, о  :r;: о (') .... =:: v1 О v1 
506 ITрИМСIIСlIне микроконтроnnеров prc 18 VCC PIC18F4550 U1 Т"'С\! Т"'М RAO 00 RBO 00 RA1 » RB1 RA2 RB2 RАЗ RВЗ RA4 RB4 RA5 RB5 MCLR RB6 OSC1 RB7 USB OSC2 RCO RDO RC1 1 RD1 RC2 2 RD2 О. 3 RD3 0+ 4 RD4 RC6 RD5 RC7 RD6 VUSB RD7 (J)(J) RE1 (J)(J) REO » RE2 С\!Т'" Т"'М Рнс. 10.27. PIC18F4550, ПОДКЛЮ4енный к USB PLI1C. 10.26 LI1ЛЛЮСТРLl1рует внутреннюlO структуру интерсреса USB в микрокон- троллере PIC18F4550. Интерсрейс USB PIC18 LI1спользуется в зтом подраздеJlе ДЛ op rанизаЦИLl1 свзи ПК через usbser.sys, который являетс драйвером, ВКЛlO4енным в one рационную cLl1cTeMY Windows ХР (он также доступен в Windows 98SE LI1 Windows 2000). Блаrодаря ИСnОЛЬЗ0ваНLI11О этоrо ДРайвера, oTna,o,aeT неоБХОДLl1МОСТЬ в написаНLI1И HOBO ro дpaBepa для Windows. Далее рассмаТРLl1ваются wаrи, требуемые AflЯ Toro, чтобы nроилnюстрировать работу 3Toro npocToro интерсрейса с USB, а также то, как СКОНСРLl1rурировать nporpaMMY, как ДЛ микроконтролnера, так LI1 nK. Чтобы 06ЬЯСНLI1ТЬ ра60ТУ этоrо интерсреса ис- пользуется ЭМУЛЯЦLl1Я USB на RS-232C, LI1бо она наLl160лее проста в nОНLI1манни и приме- Ннма к интерсрейсу между ПК и микроконтроллером. Microchip на своем ве6сайте npe доставляет драйвер как для nK, так и дл PIC18, Hapдy с срайлами работы с высоко- скоростной USB ДЛ5i стенда PicDem. Проrрамма, представленна здесь, преДnОJlаrает, что ynoMHyтoe проrраммное обеспечеНLI19 уже заrружено, LI1 дpaBep AfI ПК установ- 
[лава 10. Вопросы повышенноЙ сложности 507 лен. H3XOДCb в интеrрированной среде разработки (IDЕ), заrрузите pa604YIO o6nacTb (MCHPUSB.MCP) в папке C:\MCHPFSUSB\fw\Cdc, еслн naKeT, ПОnУ4енный от Microchip, YCT3HoBneH. OTKpOTe сраЙJl user.c, в котором предусмотрено место ,lJ,JlЯ ввода npo rpaMMbI ПОnЬЗ0вателя, ИСnОЛЬЗУIOw,ей USB и ero nодключенне к nK. 3та nporpaMMa на- nLl1CaHa для МИКРОКОНТРОJlлера PIC18F4550. Файл user.c nриведен в при мере 10.12. Рис. 10.27 LI1nЛlOстрирует PIC18F4550, свзанны с nK при nOMow,H соедннитеnь Horo разъема интерсреса USB. Обратнте вниманне на то, 4ТО 04ень HeMHoro KOMnoHeH 10В требуются дл срормирования 3Toro LI1нтерсрейса, при зтом МLI1КРОКОНТРОJlлер P/C18F4550 может быть заnитан от соединительноrо разьема USB, при условии, 4ТО вся BCTpoeHHa система не nOTpe6yeT тока, nреВОСХОАяw,еrо 100 мА. В приведенной схеме для питания USB LI1спользуется напржение BHYTpeHHero ИСТ04НLI1ка З,З В(ВЫВО,lJ, VUSB). Пример 10.12 !*,********************************************************* DporpaMMHO anapaTHoe обеспеченме USB С18, Microchip версия 1.0 ******************************************************************* , ммя файnа * CCbIn=<M: :lPC:J,2C -.::ор: , :';:OMMn '(тор: , )ИРtJjд: \..:ser.c смотрите секим INСUDЕs,прмвеАенну РIС18 C182.30.01+ Microchip Techology, Iпс. HMe . Лмцензионное соrлашенме о nporpaMMHoM npoAYKTe *ПРОI'рамма, преосавnяемая настоямм Microchip Technology . I;,.corporated ("KOMnaH:M;") АnЯ ее lV:Ю<:рОКО"'!ТрОnJlера PICMICRO c *lреАназначена и nреАоставnяется Вам, KnMeHTY KOMnaHMM, Аnя *ее исnоnьзоваНМR еАмнственно м MCKn4MTenbHO с *ммкроконтроnnерами PICMICRo G Microchip. Эта проrрамма xpMHaAneMT KOMnaHMM MMnM ее nocTa8KY м замена cornacHo *рименммыIM законам 06 авторском npaBe. Все права *зарезервмрованы. Лбое Mcnonb30BaHMe в нарушенмм *реАшествумх orpaHM4eHM MoeT nOABeprHYTb nOnb30BaTenR yronoBHoMY преследозанмю COl'naCHO прмменммых законов, а *TaKe cAenaTb ero 06ъектом rpaAaHcKO ответственностм за 'нарушение усnовмй и оrраНИ4ени 3TO nMueH3MM. '-3':'1\ ПРО.'РАММА посrF.ВJ:ЯЕТСЯ НА УСЛОВИЯХ "КАК ЕСТЬ". НИКАКИЕ 'АРАТИИ НЕ DРЕО=ТАВЛЯIOТСЯ,  ТО ЛИ ЯВНЫЕ, ТО ЛИ . :10РАзуr1ЕВАЕМ::'!Е, ТО ЛИ УСТАrЮБЛЕННЫЕ ЗАКОНОМ, ВКЛЮЧАЯ, НО НЕ *0"i'РАНИЧI1ВАЯСЬ, ПОРАзУrv1ЕВАЕМЫЕ ::'АРАНТИМ DРмrоности ЭТОЙ < !1POrPAM!'11! дЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ. КОМПАНИЯ НЕ ОЛЖНА В ЛЮБЫХ 'ОБСТОЯТЕЛЬСТВАХ НЕСТИ ОТВЕТСТВЕННОСТЬ ЗА НАМЕРЕННЫЕ, *СЛУЧАЙНЫЕ МЛМ РЕЗУЛЬТИРУЮЩИЕ ПСIВРЕЖЕНИЯ, ВОЗНИКШИЕ ПО ЛЮБОЙ . lРИ.1И::i:: . ;: 1\E/1 O') Дзта. KOMMeHTapM . Рей зин Ройванмт 11/19/04 OpMrMHan. аr*жкkкА**********************************ж********j*****/ I x*k***k*****+********A*******k*****A***** ******************* 
508 ITрименение МИКрОКОНТроnnеров PIC 18 * УказаНМR по МСПОnЬЗ0ванм змуnяuмм СОС RS-232 A************************************************** ************************ , Обраайтесь к указанмям по npMMeHeHM AN9S6 Аnя сос class. * rrpeжце Bcero 06раТИJ'есь " Exercise Ехапрlе () м Юygмт8, как выIыыaюrсRR ун.'<ЦИМ. * Имеются пять упраненм, KaAoe ммеет peweHMe в ane CDC\user\solutions. х Оереместмте зкран ВНМ3 м HaAMTe Ехеrсisе_О1,02,ОЗ, 04 м OS. * Рекомендаuмм о том, что AenaTb npMBeAeH внутрм KaAO YHKUMM. ****************************************************** ***********************1 1** в"nчаеме an ****************************************************** **1 #include <p18cxxx.h> #include <usart.h> #include "system\typedefs.h" #include "system\usb\sb.h" #include "iocfg.h" #include "user\user.h" #include "user\temperature.h" II OT06paeHMe штрьков BBOAaBBOAa 1** nepeMeHHe ****************************************************** **1 #pragma udata byte 01dsw2,01dsw3; char inputbuffer[64]; char outputbuffer[64]; rom char welcome[]{"PIC18F4SS0 FullSpeed USB  СОС RS232 Emulation Сеrпо\r\:,\r\,,") ; Lот char ansi clrscr[]={"\x1b[2J"}; 1/ КомаНАа очмсткм зкрана ANSI 1'* rlРОТОТМП Knacca private ***************************************1 VJid IitidlizeUART (void); 'J,)id Blll1KUSBStatus (void); BOOL Switch2Ispressed (void); BOOL Switch3IsPressed (void); void ExerciseExample (void); void Exercise_01 (void); void Exercise02 (void); void Exercise03 (void); void Exercise_04 (void); void Exercise 05 (void); 1** 06ъявnеНМR **************************************************1 fpragma code void Userlnit (void) { mlnitAllLEDs(); mInitAllSwitches(); 01dsw2 = sw2; 01d_sw3 = sw3; InitTempSesor() ; InltializeUSART() ; }/Iend Userlnit void InitializeUSART (void) { 
[лава 10. Вопросы повышенной СЛОIKНОСТН 509 TRSCbits.TRISC7=1; TRISCbits.TRISC6=0; SPBRG = Ox71; SPBRGH = Ох02; ТХЗТА = Ох24; RC.3TA '" Ох90; BAUDCON  ОхО 8; } I/e:ca I:litializeUSART I1 прмем II nереАача II Ох0271 AnR 48MrU > 19200 60А 11 актмвмрованме nереАачм BRGH=l II неnрервнй npMeM II BRG16 = 1 /K************************************************* ********** ФУН:ЩИЯ: void ProcessIO (void) IIредзармтеЛЬ:-iые .усnовия: OTCYTCTBYT , вход: отсутствует , ВЫХОА: отсутствует * побочные зект: отсутствуют , обая характермстмка: зта ункuмя явnяеТСR "AepaTeneM места" Аnя ApyrMx nOnb30BaTenbcKMX nОАnроrрамм. Это ком6мнаuмя заАач, как связаннх с USB, так м несвязаннх с He * Dрммечанмя: нет *к'***************х*********************************************1 vOld ProcessIO (void) ( BlnkUSBStats() ; /,' поnьзоват.::льские :1pMKnaAHe USВзаАачм if ((usbdevicestate < CONFIGUREDSTATE) I1 (UCONbits.SUSPND==l)) reClr;.; Exercise  Exaтple () ; ExerciseOl(); Exercise02() ; ExrciseC3() ; Exercise04(); Ex-rcise  05 () ; //eпd ProcessIO vud Exercise Example (void) { static byte startupstate о; if (start up state == О) if (Switch2IsPressed()) start_upstate++; else if (startupstate == 1) if (mUSBUSARTIsTxTrfReady()) { putrsUSBUSART(ansi clrscr); start p state++; ) else if (start upstate 2) 
510 ITрименеllне МНКрОКОНТрOJ.лсров PIC 18 if (mUSBUSARTIsTxTrfReady()) { putrsUSBUSART("\rMicrochip Technology Inc., 2004\r\n"); start upstate++; } else if (start ир state == 3) if (тUSBUSARTIsTxTrfReady()) { putrsUSBUSART(welcome); start up state++; }llend ExerciseExample void Exercise 01 (void) 1* * Внесмте в 3ТУ YHKUM КОА, nocna nMTepanbHY СТРОКУ с HYnb оrранмчмтеnем * строка текста ("Hello World!\r\n") nереАается в ОК, KorAa HaaT nepe кnчатеnь 2 * * Done3He YHKUMM: Switch2IsPressed() B03BpaaeT '1', коrда HaaT nерекnючатеnь 2. putrsUSBUSART(...) ; * Смотрмте npMMep в ExerciseExample(); * Оомнмте, 4ТО B AOnHbJ KOHTponMpoBaTb rOTOBHOCTb cdctrf state Аnя вuпоnнения сnедуюше onepaUMM переноса AaHHX " KorAa rOToBHoCTb есть, значенме доnно bTЬ равно CDCTXREADY, * иnм мсnоnьзуйте макрос: mUSBUSARTIsTxTrfReady() *1 1* вставьте 3Аесь OA  3 строкм *1 1* End *1 }/Iend Exercise 01 rom char ехО2 string[]={"Type in а string here.\r\n"}; void Exercise02 (void) 1* * HanMWMTe в 3TO YHKUMM КОА, который переАает в ОК *nocne наатмя nерекnчатеnя 3 СТРОКУ с нуnьоrранмчмтеnем *CMMBonoB текста, сохраняемоrо в nамятм nporpaMM, начмная от *аАреса, на KOTOp указывает указатеnь ехО2 string. * * ех02 string 06ъявnяется HenocpeAcTBeHHo nepeA 3TO YHKUMe. * * one3He YHKЦMM: * Switch3IsPressed(} B03BpaaeT '1', KorAa переКn4атеnь 3 HaaT. * putrSUSbUSART(...); * MOTpMTe npMMepw в Exercise Example(); 
[лава 10. ВОПРОСЫ повышенной СЛОЖНОСТИ 511 * Помнмте, 4rO БЫ AOnH KOHTpOnMpOBaTb rOTOBHOCTb cdc trfstate АЛЯ "i.с(;л.е'ш;. слеАУЮЩЭЙ оnераи,мм переноса данных * orAa rOT03HOCTb есть, зна4енме AOnHO бть равно CDCTX_READY, * илм мспоnьзуте макрос: mUSBUSARTIsTxTrfReady() *1 i* вставьте здесь код  3 строкм *1 1* t:;;ld *1 ) I/ed Exercise С2 VQ1Q Exercise 03(void) 1* * Напмшмте КОА в ЭТО YHKUMM, KOTOpЫ счмтвает AaHHe с USB м ерекnючает состоянме свеТОАМОАа 04, KorAa C4MTblBaeTCR значенме AaH НШ:, равное cMMBOnY ASCII '1' (Ох31)О * Done3Hble YHKЦMM: * bytegetsUSBUSART (char *buffer, byte len) фаnу cdc.c * mLED4Toggle(); За детаnRММ 06paaTecь к * Исnоnьзуте input buffer[] AnR xpaHeHMR AaHHX, C4MTaHHX с USB. *1 1* вставьте 3Аесь КОА  3 строкм *1 1* r.::,d *1 J 1/ епс!. Exercise 03 "v)lQ t":xerclse 04 ("void) /* * Перед запуском Exercise 04(), раскомментмруйте 06paeHMe К :.:erclseOl () * в ProcessI(); зта УНКUМЯ понаА06мться прм контропе SWltch2IsPressed() . * Вставьте КОА в 3ТУ ункuмю, KOTOpЫ посыпает cneAYMe четыре 6aTa * дaHHX: Ох30,Ох31,Ох32,Ох33, KorAa nерекnчатеnь 2 HaaT. * Обратмте внмманме на ТО, что 3ТМ AaHHe не завершаются cMMBOnOM нуnя. Онм размещен в памятм AaHHX. * one3He YHKUMM: Switch2IsPressed() B03BpaaeT '1', KorAa nерекnчатеnь 2 HaaT. * mUSВUSARТТxRзm(Ьytе *pData, byte len) за Аетanями 06рa1l.\3Йrесь К айлу cdc.h. * * Исnоnьзуте outputbuffer[J Аnя храненмя четрех 6aTOB AaHHX. * Помнмте, 4ТО B AOnH KOHTponMpoBaTb rOTOBHOCTb cdc_trfstate Аnя выпоnненмя сnеАуей операuмм переноса AaHHX * KorAa rOTOBHOCTb есть, 3HaqeHMe AOnHO 6Tb равно CDC_TXREADY, * илм мсnоnьзуте макрос; mUSBUSARTIsTxTr:Ready() *1 
:; ! 2 ПрИ:V!СllеНJlС м IIKpOKOHTpO:I:1CpOB РТС 1 8 ,* зстазьте здесь OД  7 CTpO *1 1* End *1 }!/end Exercise 04 void Exercise 05 (void) ( 1* * ДeМOHcтpauмo стенд PICDEМ .дnя: nonнocкopocTHo USB о6оРУАОВан Aaтqмкcм * температуры. За Аетаnямм 06paaTecь к фаnам temperature.c м .h. * ВзваЮТСR все YHKUMM, He06XOAMMe Аnя сбора AaHHX О температуре * Этм YHKUMM 06новnят AaHHe HecKonbKo раз всеКУНАУ. * В АаННОМ варманте nporpaммa вьщаеТ АаННЬЕ О тeмnepaтype в nк через UART. * B MoeTe pOBepMTb зто, nОАКnЧМВ nocneAoBaTenbH Ka6enb м настромв осnедоватеnьн порт * на 19200 60А, 8 6мтов AaHHX, 1 cTon6MT, * 6ез napMTeTa. * * DporpaMMa npeAnonaraeT, 4ТО частота ЦО равна = 48 Mru * Аnя rенермрованмя * oppeKTHoro зна4енмя SPBRG Аnя nереАачм на скоростм 19200 60А. * MOAMMUMpYTe КОА Аnя nереАачм строкм CMMBOnOB ASCII, xpaHMMO в * empString в ОК 4ерез USB вместо UART. * ДaHHe О температуре хранятся в массиве tempString * 3 opMaTe ASCII с HyneBM orpaHM4MTeneM. * one3He YHKЦMM: tsU3bUSART(.. .); * Оомнмте, что B AOnH KOHTponMpoBaTb rOToBHoCTb cdc trfstate Аnя * выпоnненмя cneAye onepaUMM переноса AaHHX * KorAa rOTOBHoCTb есть, значенме AOnHo 6ыть равно CDCTXREADY, * MnM Mcnonb3YTe макрос: mUSBUSARTIsTxTrfReady() *1 static word exOScount; if (exOS count == О) { AcquireTemperatre() ; UpdateCelsisASCII () ; Ilсчмтванме TeMnepaTYP от Аатчмка II npe06разованме в ASСП cтpoкy, COXfJд.НReмyIO в II "tempString П , смотрмте  terтperature.c 1* МОАимuмруте КОА HMe  3 строкм *1 putsUSART (tempString); ех05 count = 10000; 1* End *1 } else ехОS_соunt-; }!Iend ExerciseOS !*AA*WK******************************************* *********** А Фун'щия: void BlinkUSBStatus (void) предвармтеnьные усnовия: отсутствую'l' 
[пава 10. Вопросы повышенной CnOIKHOCTH 513 ВХОА: отсутствует * ВЫХОА: отсутствует * п060чне зект: OTCYTCTBYT * Назначенме: BlinkUSBStatus вкnчает м BЫKnqaeT CBeTOAMOA В соответствмм с COcTORHMeM USB-устрОства. макрос mLED наХОАМТСЯ в ane заrоnовка io cfg.h usbdevice state 06ъявnяеТСR в usbmmap.c м МОАммuмруется в usbdrv.c, usbctrltrf.c м usb9.c ****************************************************** **********1 * Dрммечанме: void BlinkUSBStatus (void) { static word ledcount=O; if (ledcount = O)ledcount ledcount-; #deine mLEDBoth_Off() #define mLEDBoth_On() #define mLEDOnlylOn() #define mLEDOnly_2On() if (UCONbits.SUSPND == 1) 10000О; {mLEDlOff() ;mLED2_0ff();} {mLED_1_0n();mLED2_0n();} {mLED1On();mLED2_0ff(); } {mLED1Off();mLED2On() ;} if (ledcount=O) ( mLEDl_Toggle(); mLED 2 mLEDl; }llend if 1I06a MMraT ОАновременно } else { if (usb devicestate == DETACHEDSTATE) ( mLED_BothOff(); } else if (sbdevice state ( ATTACHEDSTATE) mLEDBothOn (); } else if (sbdevice state POWEREDSTATE) mLEDOnlylOn(); } else if (usbdevice state ( DEFAULT STATE) mLED_Only_2_0n(); } else if (usbdevicestate ( ADDRESS STATE) if (ledcount == О) mLEDlToggle(); mLE 0_2  О f f () ; }llend if } else if (usb_devicestate CONFIGUREDSTATE) 
514 Примеllенне МИКрОКОНТроллеров PIC 18 if (ledcount==O) { mLED1_Togg1e(); mLED 2 !mLED_1; }llend if }llend Н(...) }llend if (UCONbits.SUSPND...) II anbTepHaTMBHoe MMraHMe f 11 en,j BllnkUSBStatus BCL witch2IsPressed (void) { if (sw2 != 01dsw2) 01dsw2 = sw2; if (sw2 == О) retur:l TRUE; II сохраненме HOBoro значенмя II eCnM HaaTO II быnо HaaTO }/Iend if return FALSE; II не бnо наатмя }/Iend Switch2IsPressed BOOL Switch3IsPressed(void) if (sw3 != 01dsw3) 01dsw3 = sw3; if (sw3 == О) return TRUE; II сохраненме HOBoro значенмя II eCnM HaaTO II 6bIno HaaTO Jllend if return FALSE; }llend Switch3IsPressed II HaaTMe не 6no 1** EOF user.c ****************************************************** ********1 Чтобы nРОLl1ЛЛIOСТРLl1ровать LI1СnОЛЬЗ0ваНLI1е 3TO оБОnОЧКLI1, сначаnа Y,lJ,anLl1M все CTpOKLI1 nporpaMMHoro кода, за LI1CKJl104eHLI1eM тех, которые nоказаны в npLl1Mepe 10.1 З. Это УАаЛLl1Т все npLl1MepbI, которые не OTHOCTC к npLl1nO>KeHLI1IO, разра60танному в тек- сте, LI1 СфОрМLI1рует рабочуlO 060JlОЧКУ,дл разра60ТКLI1 USB nporpaMM, ocyw,ecTBJlIOW,LI1X CB3b с ПК. Как мо>кно ВИ,lJ,еть, 60JlbWa часть nporpaMMHoro КО,lJ,а Y,lJ,aJleTC, 06ecne4L11- вая рабочую оболочку,дл USBnpLl1nO>KeHLI1. Пример 10.13 /K**K********** Обоnочка npMnoeHM USB версмм 2.0 ***********************1 / к Доnжна исоnьзоваться С anaMM, nреАоставnяемьwм Microchip АnЯ USB *1 1** 8nючаеме anbl **************************а*************************** **1 ffirclJde <p18cxxx.h> II Аобавьте зту строку #iлсldе "system\typedefs.h" fflnclJde "system\usb\usb.h" #include "user\user.h" I*a переменные ****************************************************** **1 #pragma udata 
[пава 10. Вопросы повышенной СЛОIKНОСТН 515 II здесь оБЪЕЛЯТСЯ переменне IKW 05ъяnения ***k.**************.************.****************1 l)l аgП1ёl ::OQ;:? v):d fJserlni t (voic:i) i II 3Аесь аОnНRется мнмuмаnмзаUМR !//end Userlnit vOld ProcessIO (void) II ЗАесь вnоnнятся n6e заАачм BBOAaBBOAa }/Iend ProcessIO Apyro способ уnравnени USB состонт в том, чт06ы С03,lJ,ать 060nОЧКУ, KOTopa L/1сnоnьзует ВКnlOчаемые cpanbI naKeTa L/1 rnaBHYIO CPYHKu.L/11O main.c. 3та меТО,lJ,нка L/1C- пользуетс 3Аесь M Toro, чт06ы разра60тать простое npL/1nO>KeHL/1e, а 060n04Ka M mаiп.С показана в npL/1Mepe 10.14. К nporpaMMe L/13 npL/1Mepa 10.14 ,lJ,06aBJleHbI ВKJllOчае- мые файлы, L/1nЛIOСТРL/1руемые на pL/1c. 10.28. Пример 10.14 1 '" . Прммер обоnочкм, которая мсnоnьзует USАRТзмуnяuм USB w ! inclde ,p18cxxx.. h.rcae "system\typedefs.h u jtE!cjde "system\ust'\-csb.h/l l;,cl..lde "10 cfg.h u 1I НеоБХОАММ II Не06ХОАММ II Не06ХОАММ . YCTaHBKa бмтов кониrураuмм  yCTaHOBa BHYTpeHHe смнхронмзаuмм  зыnюченме cTopoeBoro TaMepa  зыкnюченме HM3KoBonbTHoro nporpaMMMpoBaHMR  oTKn4eHMe с6роса по частмчно потере nмтанмя  разреwенме 06ero с6роса kl ff9ragma config FOSC = HSPLL HS ff9ragma config PLLDIV = 1 pragma config VREGEN = ON ffpragma config WDT OFF #pragma config LVP = OFF ffрrаgrпа -::on::ig BOR = OFF Р1аgrпа config MCLRE ON v01d MYlghIt (void); II прототмnы ffpragma interrpt MyHighInt ii:)l agma code high'vector=OxO 8 \',)ld !;igil vector (void) save=PROD II high_vector по аАресу ОхОО08 II BcoKonpMopMTeTH вектор aSIl1 GOTO My:i ighlnt endasm I1 nepexOA на nOAnporpaMMY 
516 ITpHMeHeHHe МНКрОКОНТроллерОБ PIC18 обработки всокориоритетнх npepBaHM } #pragrna code vOld MyHighlnt (void) } 1/ main program void maEl (void) mlnitializeUSBDriver(); II смотрмте usbdrv.h  :1 : fj  I .: . t . : "1 .! 11 I  11 "1 '1 I 11 Бi т4550тср i3 SoUrce Files , cdc.c .. examplel,c usb9,c usbctrltrf . с usbdrv. с ... usbdsc.c :,Z. Header FUes Iocfg,h 'pl8f4550.h , typedefs,h usb,h usbcfg.h usbdrv .h usbmmap.h . Object Fifes . Llbr ary Fles [ linker Scripts 18f4550.11<.r Other Files fj :V ( : i'St"1C'i t\,;, ':  {, \ ;4;t Рис. 10.28. Снимок зкрана cpaJlOB npOeKTa (rJlaBHa npOrpaMMa HaXO,lJ,LI1TC в cpaJle 1.с) Теперь, KorAa мы LI1MeeM 060JlОЧКУ,lJ,Jl npOrpaMMLI1pOBaHLI1 USB, нам ну>кно pacno лаrать npLl1MepOM LI1HTepcpeca с тем, чт06ы npOLl1nJlIOCTpLl1pOBaTb ра60ТУ USB с nepco- нальным KOMnblOTepoM. nреДnОJlО>КLI1М, что нам He06xo,lJ,LI1Ma CLl1CTeMa ,lJ,Jl Toro, чт06ы проверть 6JlOKLI1 nLl1TaHLI1 nK в LI1CnOJlHeHLI1L11 АТХ. PaCCMaTpLl1BaeMa Аалее CLI1CTeMa раз- работана M Toro, чтобы npoBepTb БЛОКLI1 nLl1TaHLI1 мощностыо 250 Вт, О,lJ,нако она мо- 
[лапа 10. Вопросы повышенной CnOIKHOCTH 517 жет проверть L/1 более Mow,HbIe бnОКL/1 nL/1TaHL/1 ПК в pe>KL/1Me чаСТL/14НО HarPY3KL/1. Боnее новые бnОКL/1 nL/1TaHL/1 L/1MeIOT 24-WТbIрЬКОВbI coe,lJ,L/1HL/1TenbHbI разъем, n03ToMY Д,Jl L/1X ПОАКЛlOчени npL/1 проверке He06xo,lJ,L/1MO L/1CnOnb30BaTb cooTBeTcTBYIOW,L/1 OTBeTHЫ разъем. Посnе Toro, как оператор nО,lJ,КnlOчает 6noK зnеКТРОnL/1таНL/1, CL/1CTeMa npoBepeT elo L/1 отобра>кает значеНL/1 наnржеНL/1, nO,lJ,aBaeMbIe на ПК. Чт06ы CcpOpML/1pOBaTb зту CL/1CTeMY, L/1СnОJlьзуетс ML/1KpOKOHTponnep AfI Toro, 4т06ы KOHTpOnL/1pOBaTb Hanp>KeHL/1, кроме Toro HanL/1CaHO npL/1JlO>KeHL/1e на Visual С, oT06pa>KalOw,ee Hanp>KeHL/1 на ПК. ПрL/1 ло>кеНL/1е на Visual С трактует PIC как nOCne,lJ,OBaTenbHbI СОМ порт, n03ToMY нет He06xo ДL/1МОСТL/1 В L/1CnOJlb30BaHL/1L/1 сnеu.иаJlьноrо ,lJ,paBepa, 4т06ы заверWL/1ТЬ nрL/1JlожеНL/1е СО стороны ПК. E,D,L/1HCTBeHHoe, что стра,lJ,ает npL/1 L/1CnOnb30BaHL/1L/1 3TO MeTO,lJ,L/1KL/1 - так зто скорость nере,lJ,а4И, KOTopa OrpaHL/14eHa YCTaHOBKO CKOpOCTL/1 nepe,lJ,a4L/1 AfI СОМ порта В nporpaMMe на Visual С. 80 MHOrL/1X nРL/1nожеНL/1Х зто не вызывает HL/1KaKL/1X np06neM. PL/1c. 10.29 L/1ЛЛIOСТРL/1рует nOAКnI04eHL/1e PIC18F4550 Д,Jl 3Toro npL/1MeHeHL/1, а табл. 10.4 nOKa3bIBaeT u.oKOJleBKY ВЫВОАОВ разъема 6noKa зnеКТРОnL/1таНL/1 nK L/1CnOJlHe- HL/1 АТХ. БJlОК nL/1TaHL/1 АТХ L/1MeeT 4етыре ВЫХО,lJ,НЫХ Hanp>KeHL/1: + 12 8, -12 8, + 5 8 L/1 + З,З 8. Ka>KAЫ L/13 3TL/1X ВЫХО,lJ,ОВ HarpY>KaeTC cpe,lJ,He наrрузкой L/1 KOHTpOnL/1pyeTc АЦn BHYТpL/1 МL/1КрОКОНТрОЛJlера. АЦП мо>кет npL/1HL/1MaTb MaKCL/1MYM TOnbKO 5 8, так что ВХОАное Hanp>KeHL/1e YMeHbwaeTC, L/1CnOJlb3Y ,lJ,enL/1Tenb Hanp>KeHL/1. 8 СJlучае Hanp>KeHL/1 -12 8 операЦL/10ННЫ YCL/1JlL/1TeJlb L/13MeHeT nолрность L/1 CHL/1>KaeT Hanp>KeHL/1e. CL/1rHan + 12 8 CHL/1>KaeTC С L/1СnОJlЬЗ0ванием КОЗсрсрL/1u.L/1ента ,lJ,eneHL/1, paBHoro 4, CL/1rHaJl -128 CHL/1>KaeT- ся с L/1СПОЛЬЗ0ваНL/1ем К03СРСРИЦL/1ента AeneHL/1, paBHoro 3 L/1 L/1HBepTL/1pyeTc, CL/1rHaJl +5 8 СНL/1жаетс С L/1СnОЛЬЗ0ванием КОЭСРСРL/1ЦL/1ента ,lJ,еJlени, paBHoro 2, а CL/1rHaJl З,З 8 не CHL/1- жаетс. Это ,lJ,ает npe,lJ,eJlbHbIe Hanp>KeHL/1, равные 3 8, 4 8, 2,5 8 L/1 З,З 8 Д,Jl Hanp>Ke- ний элеКТРОnL/1таНL/1 КОНТРОЛL/1руемых МL/1КРОКОНТРОJlлером  все OHL/1 nOna,lJ,alOT в npL/1 е:v1лемые rраНL/1ЦЫ значеНL/1Й ВХО,lJ,НЫХ CL/1rHaJlOB АЦn. nporpaMMa, KOTopa C4L/1TbIBaeT Hanp>KeHL/1 6noKa nитаНL/1 АТХ L/1 посыпает L/1X 4е- рез US8 В ПК nоказана в npL/1Mepe 10.15. 3та nporpaMMa посыпает в nK СL/1МВОЛЬНУЮ строку с ЧL/1СnОМ 1 В КО,lJ,е ASCII В ка4естве nepBoro CL/1MBOna CTpOKL/1 ,lJ,n необра60танноrо отсчета по KaHany 12 В, СЧL/1танноrо с АЦП. Не06работанны отсчет по KaHany З,З 8 no- сылаетс в ПК, наЧL/1на с АSСIIкода u.исрры 2, не06ра60танный ОТС4ет по KaHany -12 8,  Ha4L/1Ha с ASCII-коАа u.L/1cppbI З, а необра60танны ОТС4ет по KaHaJlY +5V, - Ha4L/1Ha с ASCIIKo,lJ,a u.L/1CPPbI 4. Проrрамма, BbInOJlHIOw,ac В ПК, ДОJl>кна npe06pa30BaTb СЧL/1тан- ные с АЦП не06ра60танные ОТС4еты в cpaKTL/14eCKL/1e 3Ha4eHL/1 напр>кеНL/1. В зтом ПрL/1- мере Hanp>KeHL/1 С4L/1тываютс L/1 nOCbIJlaIOTC в ПК O,lJ,L/1H раз Ka>KAYIO nOJlOBL/1HY секун,lJ,Ы. Та6лнца 10.4. Цокоnевка ВЫВО,lJ,ОВ разъема бnока nL/1TaHL/1 А ТХ. Номер штырька Наnряенме Номер штырька Наnряенме 1 +3,3 В 13 +3,3 В 2 +3,3 В 14 12 В 3 Земnя 15 Земnя 4 +5 В 16 #PS ON 5 Земnя 17 Земnя 6 +5 В 18 Земnя 7 Земnя 19 Земnя 8 PWR ОК 20 Не мсnоnьзуется 9 TS В (AeypHЫ 21 +5 В peMM) 10 +12 В 22 +5 В 11 +12 В 23 +5 В 12 +3,3 В 24 Земnя 
518 ITрнменение микроконтроnлеров PIC18 Пример 10.15 I < c.vkTef.1 :",о:-!троnя hа:1РЯЖЕ:-IМЙ, снмыаемых с '5r:CK :1мrrанмя АТХ, С. И:1ьзованием USB , ! NLrclde <ulBcxxx. > #lclde "system\tyredeEs.h" hir.clde "system\usb\usb.h" #include "10 cfg.h" #include <timerS.h> #include <adc.h> ffinclude <stdlib.h> Ik Установка 6мтов KOHMrypaUMM  установка peMMa смнхронмзаuмм HS (4 MrU)  выкnченме cTopoeBoro TaMepa  вкnченме нмзковоnьтноrо nporpaMMMpoBaHMR  откnченме с6роса по частмqно потере nMTaHMR разреwенме 06wero с6роса *  * I ffpragma config FOSC = HSPLL HS  #pragma config PLLDIV = 1 #pr.agma config VREGEN = ON )l agтa config WDT OFF 1toragma config LVP = OFF :, :)1 agma cO:lfig BOR = OFF q ')1 а;;та '::оn: i 9 M-=L;.E . 'JN L::lc,r ])'.1f:er[4] [20]; C'lClr .sta'e  4; 'J,): d My!1ighlr.t (void); II npoToTMnbl #pragma interrupt MyHighInt #pragma code high vector=Ox08 save=PROD II highvector по адресу ОхОО08 void highvector (void) II BblcoKonpMopMTeTHbl вектор asm GOTO MyHighInt endasm II nepexoA на nOAnporpaMMY 06сnумванмя II BblcoKonpMopMTeTHoro nрерванмя ffpragma code void USBTasks (void) 1* * 06cnYMBaHe аппаратных среАСТВ *1 USBCheckBusStatus(); II Аоnжен мсnоnьзоваться меТОА опроса i (UCFGbits.rTEYE!=l) USHDri\erService(); II npepBaHMe MnM метод опроса #if defi:led(USBUSE СОС) CDCTxService() ; tle:ldi f I 11 e:-:'.d uS1JTasks 
rnaBa 10. Вопросы повышенной СnОIKНОСТИ 519 void GetADC (char channe1, char number) { char а; SetChanADC (channel); ConvertADC () ; for (а = о; а < 20; а++) buffer[number] [а] = о; while (BusyADC()); buffer[numbel] [О] = number + Ох31; itoa(ReadADC(), buffer[number] + 1); v)jd MyHighlnt (void) ;::h::i':: а; if (PIR1bits.TMR1IF == 1) PIR1bits.TMR1IF = о; WuteTH[1,er1 (62SQO ); GetADC (AOCCHO, о); GetADC (ADCCl, :); GetADC (AOCCH2, 2); GetADC (AOCCH3, 3); state о; 1I начаnо nереАачм // Пlаin program v('ld ma in (void) ОреnТiПlеr1 (TIMERINTON & Т1 8BIT RW & Т1 SOUP.CE INT &  - T1PS 1 8); vvriteTimer1 (62S00 ); Opr.ADC (ADCFOSC2 & hLC RIGHT JUST &   /1 HaCTpOKa TaMepa 1I Kaдy ПОЛОВИНУ сеКУНАЫ .LDC'OTAD, ,',ОС C:iO & ;,.DCINTOFF, ';.: JB) ; :NCONbi[.GIEH = 1; ,,: 1 : 1:" 1:. l 3 1 i z е U с: В J r i '" е r () ; \,,::.:. e (1) 1I смотрмте sbdrv. SBTas.s () ; 1 I неоБХОДИJ.-I() обесnечмвать nо.цкаЧI<:У jf (ffiUSБUSАТIsТхТ[fRеаdу() && state != 4) tsUSBU3AR'1' (lJuffer [state]); 'зtаtе++; 
'J\ \...) R10 1'-- .... U2 о б,8К LW41 л. З + + "'''' 2 ' 6 ...../vv R 11 ""'11) 10К < R9 > ЭК < J1 1 '"""t::Т""" 2 3 4 5 8 7 8 9 10 11 ......д... ......C::::L... AТXCONN PWR ..../V"v l R 12 30К 13 14 15 16 17 18 19  21 22 23 24  R7 < 1К  < R8 (1К < R5 > ( 10 ,.............. ( RЭ ? R4 < 1 (1 > > ............... < R2 ( 1 < R6 < 1К > ( R1 ; 10К PIC18Fo4550 U1 .....L с 1 =f 0,1 uF .....N ....t") 00 RBO    RB1 + RB2 RB3 '37"' RВ4 RB5 RB8 RB7 RCO 4--- RC1  RC2 D  D+ RC6 RC7 VUSB 8   RE1 10'" > > RE2""':'=-"" N..- ....t") Примечание: резисторы номиналом 1 Ом имеют мощность в 10 Вт, а резисторы номиналом 10 Ом должны иметь мощность минимум 15 Вт (внимание: резисторы в процессе работы наrреваются!). Рис 10.29. Система про верки напр>кений, снимаемых с блока питани АТХ С4 ::::::::: 21 pF 2 3 RAO 4 RA1 5  RA4 ........-:r RA5 МCLR 13 OSC1 14 OSC2 19 RDO 20 RD1 I  RD2  RD3  RD4  RD5  RD6 сз  RD1 :::: r::::: :::::::::: С2 ............... REO 27р 1,OuF 4 MHz. ..,D ....... 1 2 3 r J2 :::1 "о ::s:: з::   ;: (t> з:: ::s:: ::>:: '1::;j о ::>:: о ::I: .а о ;;;;< ;;;;< (t> "о О t;j "-rj n 00 USB 
rлава 10. Вопросы повышенной СЛОIKНОСТИ 521 ApaBep AfI ПК YCTaHaBJlL/1BaeTC, Kor,lJ,a ПК обнаРУЖL/1вает, 4ТО USBYCTPOCTBO ПОДКЛЮ4ено к USВпорту. На экране nовитс со06w,ение о новом 060РУ,lJ,оваНL/1И, Kor,lJ,a будет nОДKJlЮ4ена CL/1CTeMa, оnисанна 3,lJ,есь. В ,lJ,L/1aJlOrOBOM окне Add new hardware (Д06аВJlеНL/1е новых аппаратных среАСТВ) вы6ерите папку: C:\MCHPFSUSB\Pc\MCHPUSB Driver\Release и YCTaHOBL/1Te ,lJ,paBep L/1HTepcpeca USB СО стороны nK. Как TOJlbKO ,lJ,paBep 6У,lJ,ет YCTaHOBJleH, наnисанна nporpaMMa 6У,lJ,ет C4L/1 тывать наnржеНL/1 И3 системы npOBepKL/1 6JlOKOB эnеКТРОnL/1таНL/1 АТХ L/1 от06ражать их на экране ,lJ,L/1CnJle nK. ПРL/1мер COOTBeTCTBYIOw,ero nриnо>кеНL/1, наnисанноrо на Мiсrosоft Visual С, ПрL/1ве,lJ,ен в npL/1Mepe 10.16, а ,lJ,L/1aJlOrOBOe окно, ИСnОJlьзуемое AfI отобра>кеНL/1 3Ha4eHL/1 Hanp>KeHL/1, nоказано на pL/1c. 10.30. 3тот npL/1Mep ИСnОJlьзует L/1HTepcpec НID (4eJlobeko-маwинны L/1HTepcpec), KOTOpЫ BneTC 4aCTblO Windows L/1 не тре6ует HL/1KaKOrO сnеЦL/1аJlьноrо дpaBepa M nK и Windows. НID ЭМУnL/1рует USB как СОМ-порт L/1 06есnеЧL/1вает максимаnьнуlO скорость nepe,lJ,a4L/1 ,lJ,анных в 64 к6нт/с, 4ТО ЯВJlетс адекватным AfI 60JlЬШL/1нства ML/1KpOKOHTpOJlnepHbIX npL/1JlO>KeHL/1. E,lJ,L/1HCTBeH Ha nporpaMMa, которую нужно npeAOCTaBL/1Tb Windows  это cpan .inf, KOTOpЫ разме- LЦeH в naKeTe от Microchip,  он AOJl>KeH 6ыть YCTaHOBJleH как OnL/1CaHO выше. Kor,lJ,a .inf фаJl 6удет установлен в nроцессе д06аВJlени новых аппаратных сре,lJ,СТВ, co06w,eHL/1e о которых nOBJleTC, Kor,lJ,a PIC-СL/1Стема nOAKJlI04aeTC к порту USB, ПК BbI6L/1paeT CJle- АУЮw,и АОСТУnНЫЙ СОМ порт M nО,lJ,КJlЮ4еНL/1 USB. Проrрамма, L/1СПОJlьзуема в nepcOHanbHOM компьютере nоказана в npL/1Mepe 10.16. Эта nporpaMMa cpopML/1pyeT AL/1aJlOrOBOe окно, nоказанное на pL/1c. 10.30, npL/1Be- AeHHЫ ЛL/1СТL/1Нr проrраммы nOKa3bIBaeT TOJlbKO ту ее сеКЦL/1Ю, KOTopa ,lJ,06aBJleTC к стандартному AL/1aJlOrOBOMY ПРL/1nожеНL/1Ю. EAL/1HCTBeHHbIM L/1СКnЮ4еНL/1ем BneTC то, 4ТО ОАна строка КОАа  SetТimer (1, 1 О, О);  ,lJ,06aBJleHa к СРУНКЦИL/1 OnlnitDialog nOCJle опе- ратора ТООО:. Это запускает nporpaMMY, nоказанную в npL/1Mepe 10.16 таким 06раЗ0М, что по L/1CTe4eHL/1L/1 600 МL/1ллисеКУНА BbInOJlHeTC С4итывает 4ерез USB L/13 CL/1CTeMbI кон- Tpon Hanp>KeHL/1 блока эnеКТРОПL/1тани, OnL/1CaHHO в этом nО,lJ,раздеJlе. Проrрамма npeAnOJlaraeT, 4ТО СОМ3 постаВJlен в соответствие YCTPOCTBY аппаратным нумерато- ром Windows. An Toro, 4т06ы эта CL/1CTeMa срУНКЦL/10НL/1роваJlа npaBL/1JlbHO, МL/1КРОКОНТРОЛ- лер ,lJ,OJl>KeH 6ыть nОДКЛlO4ен к USB nepe,lJ, заnуском nporpaMMbI в nepCOHaJlbHOM комnью тере. Рнс. 10.30. CHL/1MOK экрана. Проверка BeJlL/14L/1H Hanp>KeHL/1 ИСТ04НL/1КОВ nL/1тани 
522 ПрЮvlенение микроконтроnnеров PIC18 Пример 10.16 )ld :P12sbDlg: :O:'Tlmer(UINT nIDEvent) II ynpaBneHMe nереАается СЮАа через "Jждые 6  О мс i сnзr n',-"mber; dOJble actJaleading; 1.1::' placehol\.3er; i:1t rawReadi:-:g; сlыr buffer[20]; iE (nIDEvent  1) Ki11Timer (1); II бnокмровка TaMepa number = ReadByte ("СОМ3"); II счмтванме бата MAeHTMMKaUMM p1aceHolder = о; do 1I nоnученме uenoro значенмя в КОАе A.:3CII buffer[placeHolder] = ReadByte ("СОМ3"); whi1e (b'Jffer [p1aceHolder++ ] ! = О ); rawReading atoi (buffer); if (number  '1') II обработка наnряенмя nмтанмя +12 В { dctualReadir.g rawReading * 4 * 0.00488759; gcvt (actua1Reading, 5, buffer); abe11.put_Caption (buffer); elsei!' (number== '2')1 ;1 обработка наnрRенмя nMTaHMR 3,3 В dc::.ualReading  rawReading * 0.00488759; gcvt (actualReading, 5, Ьиffеr); :.abe:14 .p'JtCap\::io" (buffer); else ir: (n'J:nber == '3') /1 обработка напряженмя MTaHMR 12 В actua1Reading = rawReading * 3 * 0.00488759; cvt (act'JdlReadir.g, 5, b\1f:er); abe12.p'Jt Caption (buffer); else II обра60тка наnрRенмя nMTaHhR 5 В actualReading = rawReading * 2 * 0.00488759; gcvt (actualReadi:1g, 5, buffcr); abe13.p'JtCaption (buffer); } Set1irner (1, 600, о); 1I TaMep nерезаПуска I CDialog: :OnTimer (nIDEvent); i:1t CpicusbDlg: :ReadByte (CString PortSpecifier) ОСВ dcb; i:1 I:. retVal; ВУТЕ Byte; DWJRD dw8yteTcansfe=red; DWORD dwСотт,\'юdеmS ta t u s; hANDLE hPort  CreateFi:e [о ccSpec i I ie, , GENERIC READ, J, 
rлава 10. Вопросы повышенной сложности 523 NULi., OPENEXISTING, О, NULL ) ; if (!GetCornm?tate (hPort, &dcb)) return OxlOO; dcb.BaudRate = CBR9600; 119600 baud dCb.ByteSize = 8; 118 data bits dcb.Parity = NOPARITY; Ilno parity dcb.StopBits = ONESTOPBIT; 111 stop i: (! SetCornm:tate (hPort, &dcb)) retc;rn Ох100; SetCommМask (hPort, EVRXCHAR I EVERR); Ilсобтме npMeMa CMMBona WaitCommEvent (hPort, &dwCommModemStatus, О); IloMAaHMe CMMBona if (dwComml'1oc!emStatus & EVRXCHAR) ReadFile (hPort, &Byte, 1, &dwВуtеsТrапsfеrrеd, О); Ilread else if (dwСсжтМоdеmStаtus & EVERR) rеtVзl  Oxl01; recVal  Byte:; CloseHandle(hPort) ; recurп retVal; Таблнца 1 0.5 Команды paCWLl1peHHOro на60ра комаНА PIC 18 ВОЗАе КОА onepa 16раЗРЯАное CTBye цмм, OnMcaHMe Цикnы комаНАное мое Ормм. o:!epaHД cnoBo СОСТОЯ нме ADDFSR f, k DрмбаВЛяеТ k к FSR 1 1110 1000 ffkk kkkk ADDULNK k Dрибавnяет k к FSR2 2 1110 1000 11kk kkkk aCld ret'Jrr1 CALLW ВЫЗЫЕает :10АПрО 2 0000 0000 0001 0100 l'рашv.у, МС:10nЬЗУЯ :vREl HOVSF zs, fd Пере::!\.Сещает z з fd 2 1110 1011 Ozzz zzzz 1111 ffff ffff ffff MOVSS zs, zd Oepe!\.CeaeT z" в z,J 2 1110 1011 1zzz zzzz 1111 хххх xzzz zzzz PUSHL k Сохраняе'r k по aд 1 1110 1010 kkkk kkkk рее:: FSR2, дeKpe ментирует FSR2 SUBFSR f, k ВЫЧ1тает k из f'SR 1 1110 1001 ffkk kkkk SUBUNLK k ВЫЧ"lтает k из FSR2, 2 1110 1001 llkk kkkk r.::t r!: f  8-раЗр,lJ,на чека реrИСТ.)Qвоrо срала ,lJ,анных (от ОхОО до OxFF) k - nLl1теральное значеНLI1е Zs  7 -разрдное значеНLI1е cMew,eHLI1 а,о,реса npLl1 KOCBeHHO аАресаЦLl1Н AfI LI1CT04HLI1Ka Zo - 7 -раЗРАное значеНLI1е cMew,eHLI1 аАреса npLl1 KOCBeHHO адресаu.LI1И,lJ,Jl npLl1eMHLI1Ka 
524 ITрименение микроконтроnnеров PIC18 1 0.6. Расшренный набор команд PIC18 Коман,lJ,Ы раСШL/1ренноrо на60ра комаНА L/1CnOnb3YIOTC с версие KOMnL/1JlTOpa С18, KOTopa может 6ыть npL/106peTeHa oTAenbHo. Бесnnатна BepCL/1 KOMnL/1JlTOpa не L/1сnользует команды раСШL/1ренноrо на60ра команд. PaCWL/1peHHbI на60Р коман,lJ, BKnlO чает восемь новых команд, которые nepe4L/1CneHbI в Ta6nL/1u.e 10.5. ЭТL/1 комаНАЫ по YMOn чаНL/1Ю заБЛОКL/1рованы L/1 4т06ы L/1X НСnОЛЬЗ0вать, OHL/1 AOn>KHbI 6ыть разреwены установ- KO 6L/1Ta КОНСРL/1rураЦL/1И XINST. nOCKonbKY 6ecnnaTHa BepCL/1 KOMnL/1nTOpa не noAЦep- >KL/1BaeT 3TL/1 команды, то 4тобы L/1X L/1СnОЛЬЗ0вать 6ез nOKYnKL/1 KOMnL/1nTOpa nporpaMMa Аол>кна 6ыть HanL/1CaHa на AcceM6Jlepe. Как мо>кно ВL/1деть L/13 та6л. 10.5, раСШL/1ренные коман,lJ,Ы L/1меют ,lJ,eno rJlaBHbIM 06 разом с perL/1CTpOM FSR2. OCHOBHa цепь paCWL/1peHHbIX коман,lJ, COCTOL/1T в том, 4тобы обесnе4L/1ТЬ зсрсреКТL/1ВНЫ метод а,lJ,ресаЦL/1L/1 nporpaMMHoro стека данных. Возмо>кно, 4ТО вы nOMHL/1Te L/13 rлавы 4, 4ТО в npL/1MepaX на npL/1MeHeHL/1e стека данных L/1CnOnb30Banc FSR2 в ка4естве указатеJl стека. npL/1 этом nporpaMMa, ра60тавша со стеком Аанных, ДЛ занесеНL/1 ЧL/1сла в стек ДоЛ>кна 6ыла ВЫnОЛНL/1ТЬ две команды: ЛL/1теральную KOMaH АУ, а затем команду move. PaCWL/1peHHbI на60Р коман,lJ, содерЖL/1Т комаНАУ PUSHL, кото- pa BbInOJlHeT ТУ >ке самую заАа4У, 4ТО L/1 две команды L/13 rJlaBbI 4. npL/1Mep 10.17 L/1nnю- CTpL/1pyeT оба меТО,lJ,а занесеНL/1 ЧL/1сnа 6 в nporpaMMHbI стек Аанных, a.o.pecyeMЫ 4ерез FSR2. 06paTL/1Te BHL/1MaHL/1e, 4ТО npL/1 L/1CnOnb30BaHL/1L/1 команды PUSHL в nporpaMMe эконо- ML/1TC ОАна комаН,lJ,а. Пример 10.17 ; КОА, котор,JЙ мсnonьзует CTaнAapтHe КомандР! AnR занесения qмcna 6 в стек AaннbIX: MOVLW 6 MOVWF РОЗТОЕС2 ;заносмт 6 в стек ; КОД, :<О'10р;,JЙ ИС1OJlьзуеl' расши[Je!-1ные KOW..aн,JJp! AnR занесенw:; чиcnа 6 3 стек дэнiiых: POSHL 6 код дnя мзвnе4ения 4Mcna 6 М3 стека: MO'JF PRl::INC2, О ;мзвnекает 6 мз стека ;м сохраняет ero в Я4еке О РаСШL/1ренны на60Р команд также cO,lJ,ep>KL/1T две новые L/1HAeKCHbIe команды пюvе. 06е этL/1 команды L/1СnОnЬ3УЮТ содеРЖL/1мое FSR2 с тем, 4т06ы L/1H,lJ,eKCL/1pOBaTb na- MTb, L/1 06е nозволют выnолнть оnераЦL/1Ю nеремещеНL/1 данных TL/1na "naMTb- naMTb". Команда MOVSS nеремещает данные L/13 OAHO L/1H,lJ,eKCL/1pOBaHHo 4eKL/1 naM- TL/1 в Аруrую. КомаНАа ВКЛЮ4ает 06а cMew,eHL/1 от 4eKL/1 naMTL/1, a,lJ,pecyeMO FSR2. Ко- маНАа MOVSF nepeMew,aeT CO,lJ,ep>KL/1MOe 4eKa naMTL/1, a,lJ,pecyeMO FSR2 nJlIOC cMew,e HV1e, в 4eKY naMTL/1 данных. Коман,lJ,Ы ADDFSR L/1 SUBFSR n03BOnIOT 6-разрдному nL/1Tepany CKJla.o.bIBaTbC L/1nL/1 BbI4L/1TaTbC L/13 Jlю60rо perL/1CTpa FSR. XOT зта KOHCTpYKЦH не L/1MeeT HL/1KaKOrO сnеЦL/1срL/1 ческоrо L/1CnOJlb30BaHL/1, она n03BOJleT ,lJ,06aBJlTb ManeHbKHe 4L/1CJla к perL/1CTPY FSR ,lJ,Jl nOL/1CKa ,lJ,анных в 6азе ,lJ,анных L/1nL/1 >ке AfI L/1HbIX nO,lJ,06HbIX u.eJle. Коман,lJ,Ы AODUNLK н SUBUNLK cpaKTL/14eCKL/1 npe,lJ,CTaBJlIOT c060 коман,lJ,Ы B03 врата, которые МОАL/1сриu.L/1РУЮТ cO,lJ,ep>KL/1MOe perL/1CTpa FSR2 с L/1СnОJlЬЗ0ванием 6- раЗр,lJ,ноrо JlL/1терала. 3TL/1 команды (особенно команда SUBUNLK) n03BOJlIOT BbInOJl- HL/1Tb npL/1 возврате автомаТL/1ческое L/13BJle4eHL/1e данных, занесенных в стек. npL/1Mep 
[пава 10. Вопросы повышенной СnОIKНОСТИ 525 10.18 L/1ЛJlЮСТрL/1рует, как комаН,lJ,а SUBUNLK L/1СnОJlьзуетс AfI Toro, 4т06ы Y,lJ,aJlL/1Tb И3 ФУНКЦL/1L/1 Аанные, занесенные в стек. Пример 10.18 ; ункuмя, которая заносмт трм значенмя в стек AaHHX, а затем BOCCTaHaBnMBaeT их KOMaHAO SUBUNLK HjFr.c: .PUSHL 6 PUSHL 8 PUSHL 3 ; do things SUBUNLK 3 ; возврат м разrрузка стека nОСJlедн команда paCWL/1peHHOro на60ра коман,lJ,  это комаН,lJ,а CALLW, KOTopa под06на CALL, но заменет 3Ha4eHL/1e в PCL 3Ha4eHL/1eM L/13 WREG вместо Toro, 4т06ы L/1C nOJlb30BaTb адрес СРУНКЦL/1L/1, как комаН,lJ,а CALL. Эта команда n03BOJleT L/1CnOnb30BaTb pa3JlL/14HbIe СРУНКЦИL/1 L/1nL/1 адреса перехода с 06paw,eHL/1eM к HL/1M И3 та6nL/1ЦЫ. npL/1Mep 10.19 L/1ЛЛЮСТРL/1рует cooTBeTcTBYIOw,ee npL/1nO>KeHL/1e. В этом npL/1Mepe 3Ha4eHL/1e И3 WREG задает адрес СРУНКЦL/1L/1 в nOL/1CKOBO Ta6JlL/1u.e. nporpaMMa L/1СnОJlьзует О, 4т06ы вы6рать functionO, 1, чт06ы вы6рать function1 L/1 Т.,lJ,. 3та nporpaMMa имеет некоторые OrpaHL/14e- HL/1. Ha4anbHbI а,lJ,рес ,lJ,OJl>KeH 6ыть YCTaHoBneH на чеку naMTL/1, а,lJ,рес KOTOpO закан- 4L/1BaeTC на ОхОО, а значеНL/1е во WREG npL/1 ВЫЗ0ве Sfunc ,lJ,OJl>KHO HaXO,lJ,L/1TbC Me>K,lJ,Y О L/1 ОхЗF. МаксимаJlьное 4L/1CJlO срУНКЦL/1 AfI 3TO nporpaMMbI равно 64. КомаН,lJ,а CALLW ко- nL/1PyeT коман,lJ,У BbI4L/1CneMOro GOSUB, имеlOw,уIOС в 3ЫKe Basic. Мо>кнО так>ке ИМН;-Н ровать коман,lJ,У BbI4L/1CJleMOrO GOSUB, замеНL/1В коман,lJ,У CALL KOMaH,lJ,aML/1 GOTO. Пример 10.19 ORG OxlOOO ;неоБХОАММО мсnоnьзовать начаnьн аАрес, KOTOp заканчмвается на 00 ункцмя sfunc может бть мсnоnьзована Аnя смстемных ВЫЗ0ВОВ coдepMMoe WREG AOnHO бть MeHbWMM, чем 64 S:uпc: RLNCF RLNCF ADDLW CA:"'LW WREG WREG 10 ;YMHoaeT WREG на 4 ;CMeaeT WREG на 8 ;ункuмя вызова CALL CA;"'L CA:"L FunctionO Fu:;ction1 Function2 ;Аnя WREG = О Аnя WREG 1 ; Аnя WREG = 2 ЗАесь вставnятся AOnOnHMTenbHe BЫ30B 
526 ПрИlеllенис МИКрОКОНТрОJISlСрОI3 PIC 18 10.7 . Резюме 1. В PIC18 naMTb paCWL/1peTC посредством ПО,lJ,КЛЮ4еНL/1 nOCJle,lJ,oBaTenbHoro эсппзу к HeCKOJlbKL/1M выводам порта. V1HTepcpec эсппзу ynpaBJleTC nporpaMMo, KOTopa rенерирует nOCJle,lJ,oBaTenbHbIe дaHHыeM 3Toro L/1HTepcpeca. 2. В pe,lJ,KL/1X сnучах, KOr,lJ,a ,lJ,ва ,lJ,OnOnHL/1TeJlbHbIX заnОМL/1наЮЩL/1Х YCTpOCTBa Heдoc таТ04НЫ, срормируетс BTOpO nосnедоватеnьный L/1нтерфейс, предназна4енны M ра60ТЫ с TpeTbL/1M L/1 4етвертым заnОМL/1наюw,L/1М YCTPOCTBOM. naMTb мо>ке! ,lJ,06aBJlTb C как отдеnЬНЫМL/1 заnОМL/1наюw,L/1МL/1 YCTpoCTBaML/1, так L/1 параМL/1 ЭТL/1Х YCTPOCTB, ynpaB лемых ОДНL/1М ПОСJlедоватеJlЬНЫМ L/1нтерфесом. З. НаL/160лее pacnpOCTpaHeHHbIML/1 ШТРL/1х-кодаМL/1, L/1СnОJlьзуеМЫМL/1 в универсаJlЬ ных Mara3L/1HaX, ВJlЮТС коды UPC-A L/1JlL/1 UPC-E. Код UPCA КОАнрует товары с L/1CnOJlb зоваНL/1ем 12-раЗРАНЫХ ЦL/1срр, а код UPC-E KO,lJ,L/1pyeT товары с L/1CnOJlb30BaHL/1eM 6 разрдных ЦL/1фР. 4. ФУНКЦL/1 npepbIBaHL/1 по изменеНL/1Ю COCTOHL/1, Hapдy с TaMepOM, L/1СПОJlЬ3У eTC с UPC-КОАаМL/1, ПОJlУ4еННЫМL/1 от OnTL/14eCKOro СЧL/1тывател. 5. Бnок Ha4aJlbHO заrРУ3КL/1  это сеКЦL/1 naMTL/1 nporpaMM (по KpaHe мере 512 байтов), KOTopa заЩL/1w,ена от nерезаnL/1СL/1 npL/1 nерепроrраММL/1роваНL/1L/1 МL/1КРОКОНТРОЛ- лера. Блок начаJlЬНОЙ заrРУ3КL/1 СО,lJ,ерЖL/1Т nporpaMMY, Ha3bIBaeMYlO начаJlЬНЫМ заrРУ34L/1 ком, KOTopa заrру>кает naMTb HOBO nроrраммой npL/1 nepenpOrpaMML/1pOBaHL/1L/1. 6. Памть nporpaMM BHYТpL/1 МL/1кроконтроллера pa3Mew,eHa в зспnзу, которое проrраММL/1руетс во MHoroM так же, как L/1 эспnзу данных. Основное pa3JlL/14L/1e COCTOL/1T в том, что HeCKOnbKO 6L/1TOB в perL/1CTpaX КОНсрL/1rураЦL/1L/1 разрешают L/1ЛL/1 заnреw,ают npo- rpaMML/1pOBaHL/1e. 3то 06еспеЧL/1вает заw,нту naMTL/1 nporpaMM. 7. Ввод-вывод раСШL/1ретс в тех CJlY4ax, коrда ВВОД-ВЫВОА МL/1КРОКОНТРОJlлера Влетс недостаточным. Такое расшнреНL/1е тре6ует L/1СnОЛЬЗ0вани HeCKOJlbKL/1X штырьков BBOAa-ВЫВОАа, фОРМL/1РУЮЩL/1Х nоследовательны V1нтерфес с YCTpOCTBaML/1 расширеНL/1 ввода-вывода, np0L/13BOAL/1MbIML/1 cpL/1PMO Microchip L/1JlL/1 OДHO L/13 MHOrL/1X друrL/1Х KOMnaHL/1. Как nраВL/1ЛО, 60nee эфсреКТL/1ВНО npL/1of5eCTL/1 60nЬШL/1 ML/1KpOKOHTpon- лер, 4ем npL/1MeHTb paCWL/1peHL/1e ввода-вывода, как ОПL/1сано в ,lJ,aHHO KHL/1re. Однако некоторые СL/1туаЦИL/1 тре6уют, 4т06ы 6ыло доступно 60nьшее КОJlL/1чество YCTPOCTB вво- да-вывода, чем 06eCne4L/1BaeTC Jl1060 BepCL/1e ML/1KpOKOHTponnepa, - в 3TL/1X СJlучах слеАует L/1СnОЛЬЗ0вать расширеНL/1е ввода  вывода. 8. V1HTepcpec CAN (уnраВJlюw,а Jlокальна сеть) ФУНКЦL/10НL/1р'Ует во MHoroM так >ке, как nOKanbHa сеть Ethernet, О,lJ,нако CAN спроеКТL/1рован M ра60ТЫ в заwумnенных средах. 9. nроrраммный слой уnравлеНL/1 CAN 06еспеЧL/1ваетс cpaJlOM заrОJlовка от Мiсюсhiр, KOTOpЫ Ha3ЫBaeTC ECAN.H. Этот фаJl обесnе4L/1вает все оБЫ4ные ФУНКЦL/1И управлеНL/1 L/1 срУНКЦL/1L/1 nередаЧL/1 данных, неоБХОДL/1мые AfI L/1СnОЛЬЗ0ваНL/1 CAN. 1 О, USB (YHL/1BepCaJlbHa nоследоватеJlьна WL/1Ha) БЫJlа разра60тан ,lJ,Jl Toro, 4TO бы замеНL/1ТЬ порты СОМ L/1 LPT в nK USB-nОртаМL/1, которые СРУНКЦИОНL/1РУЮТ со CKOpO CTML/1 В 1 M6L/1T/C, 11 M6L/1T/C L/1 480 M6L/1T/C. nOcneAH BepCL/1 USB 2.0 CPY HK u.L/10HL/1pyeT на CKOpOCTL/1 в 480 мБL/1Т/С, 4ТО достаТ04НО AfI npL/1eMa ВL/1Аеопотоков, а также О,lJ,новре- MeHHoro выпоnнеНL/1Я pдa друrL/1Х срУНКЦL/1. USB AonycKaeT nОДКnЮ4еНL/1е к OAHO ШL/1не впnоть АО 127 устройств. 11. USB уnравлетс nроrраммой, nоставлемой Microchip, она весьма просто ПОАключаетс к ПК. ПК тре6ует ли60 HaJlL/14L/1 драйвера, JlL/160 же он мо>кет 06paw,aTbC к USB, как будто зто СОМ-порт, - этот метод paCCMaTpL/1BaJlC в это KHL/1re. nOCKOJlbKY ПРL/1менеНL/1 МL/1кроконтроллера оБЫ4НО не свзаны в быстродеЙствующем KaHaJle CB3L/1 с ПК, то в БОnЬШL/1нстве сnучаев - это caMЫ nУ4ШИЙ метvД СВЯ3И микрокон-l ponnepa с 
[,1ава 10. Вопросы повышенной СЛОIKНОСТИ 527 ПК 4ерез USB. Это ос06енно cnpaBe,lJ,JlL/1BO в CL/1JlY Toro, 4ТО не нужно писать HL/1KaKL/1X ApaBepOB, 06есnе4L/1ваюw,L/1Х CB3b nK С ML/1KpOKOHTpOnJlepOM 4ерез зтот интерсрес. 12. Коман,lJ,Ы paCWL/1peHHOro на60ра коман,lJ, M PIC 18 ,lJ,06аВJlЮТ ,lJ,ОnОJlнитеJlЬНУЮ ФУНКЦL/10наJlЬНОСТЬ L/1ндексным perL/1CTpaM FSRO, FSR1 L/1 FSR2 н, в oc06eHHOCTL/1, - FSR2. ПреАстаВJlет L/1HTepeC комаН,lJ,а PUSHL, KOTopa 06eCne4L/1BaeT C03,lJ,aHL/1e стека ,lJ,анных С меньше nроrраммной L/1з6ЫТ04НОСТЬЮ. 1 З. Команды раСШL/1ренноrо на60ра коман,lJ, ,lJ,OcTYnHbI M L/1CnOJlb30BaHL/1 на 3ЫKe С только в CnY4ae, KorAa npL/106peTeHa nOnHa BepCL/1 KOMnL/1nTOpa С18. 10.8. Вопросы  заданя 1. KaKa naMTb мо>кет 6ыть L/1CnOJlb30BaHa ,lJ,Jl раСШL/1рени naMTL/1 ML/1KpOKOH- TpOnJlepa PIC18? 2. Поскольку ЭСnПЗУ BJleTC noCne,lJ,OBaTeJlbHbIM YCTPOCTBOM, KaKa L/1HTep- фейсна nporpaMMa AOJl>KHa L/1CnOJlb30BaTbC,D,Jl свзи 3СnnЗУ С ML/1KpOKOHTpOJlJlepoM? З. KaKL/1e 06ъемы 3СnnЗУ доступны M раСШL/1реНL/1 naMTL/1? 4. An KaKO цели в CL/1CTeMe L/1СnОJlЬ3УЮТС ABXOДЫ nOCJle,lJ,OBaTenbHoro ЭСnnЗУ? 5. Сколько nоследоватеJlЬНЫХ ЭСnnЗУ MorYT nОАКJlючатьс к одному nОСJlедова тельному L/1HTepcpecy 6ез 6усрерL/1заЦL/1L/1? 6. Какова скорость nереАаЧL/1 nocneAOBaTeJlbHOrO L/1HTepcpeca ЭСПnЗУ? 7. ЭСnnЗУ cOAep>KL/1T уnраВnЮЩL/1 6aT. Каково ero Ha3Ha4eHL/1e? 8. ОnL/1шите СРУНКЦL/1Ю L/1MnYJlbCa АСК nОСJlедоватеJlьноrо 3СnnЗУ. 9. Каково назна4еНL/1е ФУНКЦИL/1 АСК в npL/1Mepe 10.1? 1 О. AJl npL/1Mepa 10.1 ОnL/1ШL/1те, как а,lJ,рес выБL/1рает О,lJ,НО YCTPOCTBO naMTL/1 L/1JlL/1 ДРуrое. 11. Каково ра3ЛL/14L/1е Me>K,lJ,Y UPC-A L/1 UPCE? 12. BbIBe,lJ,L/1Te на npL/1HTep UPC-E код, nOnY4eHHbI L/13 4L/1Cna 123456. 1 3. KaKa ML/1KpOCXeMa cepL/1L/1 DS275 L/1СnОJlьзуетс в ка4естве схемы ynpaBJleHL/1 в L/1HTepcpece, nоказанном на pL/1cYHKe 10.7? 14. OCHOBHO ЦL/1КЛ nporpaMMbI по npL/1Mepy 1 0.2 4pe3BЫ4aHO короток. Каково ero Ha3Ha4eHL/1e в CL/1CTeMe? 15. Как в nporpaMMe L/13 npL/1Mepa 1 0.2 4L/1TaeTC UPC-кО,lJ, из ОnТL/1ческоrо С4итыватеJl? 16. KaKL/1e оnераЦL/1L/1 НСnОJlЬ3УЮТС срУНКЦL/1е GetUPC в nporpaMMe L/13 npL/1Mepa 10.2? 17. Как L/1нформаци, COXpaHeHHa в 6усрере UPC-КО,lJ,Ов, nOCbIJlaeTC в ПК в npL/1- мере 10.2? 18. Что npeACTaBneT c060 6noK начаnьно зarpY3KL/1, L/1меюw,L/1СЯ- во MHOrL/1X ML/1K РОКОНТРОJlлерах PIC18? 19. Каково Ha3Ha4eHL/1e nporpaMMbI Ha4anbHo заrРУ3КL/1? 20. П04ему важно L/1MeTb возмо>кность nepenpOrpaMML/1pOBaTb ML/1KpOKOHTpOJlJlep? 21. ОnL/1ШL/1те, как заw,L/1w,ен 6JlOK начаJlЬНО заrРУ3КL/1 в ML/1KpOKOHTpOJlJlepe. 22. ОПL/1Ш L/1Te , как в примере 10.3 nepeMew,eHbI векторы с6роса, BbICOKoypoBHeBoro прерываНL/1 L/1 HL/13KoypoBHeBoro npepbIBaHL/1. 23. Каково Ha3Ha4eHL/1e 6L/1Ta СР (заw,L/1та КО,lJ,а) , 6L/1Ta WRT (заw,L/1та от заnL/1СИ) L/1 6L/1Ta EBTR (таБJlL/1чное C4L/1TbIBaHL/1e внешнеrо БJlока). 24. 06bCHL/1Te раЗJlL/14L/1е Me>K,lJ,Y та6ЛL/1ЧНО KOMaHAO 3ЫKa BCTpoeHHoro Ассем6- лера с ее cpOpMO ,lJ,л CTaHAapTHoro AcceM6Jlepa в СЛУ4ае npL/1Mepa 10.4. 25. Кратко 06bCHL/1Te, как paCWL/1peTC BBOДBЫBOД в ceMeCTBe МL/1КРОКОНТРОЛ- леров PIC18. 26. Что nредставлет c060 интеrральна ML/1KpOCXeMa 74НС594? 
528 ITpHMeHeHHe МИКРОКОНТРО,1леров PIC18 27. Сколько ВЫВОАОВ BBOAaBЫBO,lJ,a МL/1КРОКОНТРОЛJlера Tpe6yeTC M nОАКЛI04е- HL/1 74НС5947 28. Что npeACTaBJleT c060 ABYXnpOBOAHbI L/1HTepcpeC, npeAHa3Ha4eHHbI M paCWL/1peHL/1 BBOAa-ВЫВО,lJ,а7 29. Каково Ha3Ha4eHL/1e ТС1 3207 30. 06bCHL/1Te, как ра60тает nporpaMMa, npL/1BeAeHHa в npL/1Mepe 10.9. 31. Что такое CAN7 32. Какова MaKCL/1ManbHa ,lJ,JlL/1Ha WL/1HbI CAN.o.n ра60ТЫ на CKOpOCTL/140 K6L/1T/C? 33. Какова маКСL/1мальна ,lJ,JlL/1Ha WL/1HbI CAN.o.n ра60ТЫ на CKOpOCTL/11 M6L/1T/C? 34. Сколько узnов Moryт 6ыть nОАKJlЮ4ены к WL/1He CAN АО Toro, как nOHaA06L/1TC 6усреРL/1заu.L/1? 35. Каков НОМL/1нал оконе4НЫХ pe3L/1CTOpOB, L/1сnользуемых на WL/1He CAN, L/1 каково L/1X назначеНL/1е? 36. KaKO 6L/16nL/10Te4HbI cpaJl заrОJlовка L/1сnользуетс M Toro, 4т06ы ynpaBJlTb WL/1HO CAN? 37. Каково назначеНL/1е узлов WL/1HbI CAN, L/1сnользуемых в CL/1CTeMe ynpaBJleHL/1 ЛL/1СРТОМ, OnL/1CaHHO в этой rлаве? 38. AaTe 06щее OnL/1CaHL/1e ра60ТЫ nporpaMMbI КОНТРОЛJlера зта>ка, nрL/1веАенную в npL/1Mepe 10.10. 39. Аайте 06щее OnL/1CaHL/1e ра60ТЫ nporpaMMbI КОНТрОЛJlера Ka6L/1HbI ЛL/1срта, npL/1Be- денную в npL/1Mepe 10.11. 40. Что такое USB L/1 каковы значеНL/1 CKOpOCTL/1 L/1HcpopMau.L/10HHOrO 06мена в L/1меЮЩL/1ХС ее BepCL/1x? 41. USB 06eCne4L/1BaeT Hanp>KeHL/1e nL/1TaHL/1 M Jlю60rо устройства, которое к He nОАключено, ОАнако nотре6леНL/1е тока оrраНL/1чено значеНL/1ем в мА. 42. USB nОАКJllOчаетс 4ерез nРОВОАНОЙ ка6ель. 43. Каков caMЫ npoCTo L/1HTepcpec с портом USB, еСЛL/1 paCCMaTpL/1BaTb ero с точ- KL/1 зреНL/1 разра60ТКL/1 nporpaMM ,lJ,л nK? 44. OnL/1WL/1Te ра60ТУ nporpaMMbI L/1HTepcpeca, npL/1BeAeHHo в npL/1Mepe 10.15. 45. npL/1 L/1CnOJlb30BaHL/1L/1 с USB 3Mynu.L/1L/1 RS-232 L/1 nporpaMMbI Арайвера Windows в ПК, KaKO COMnopT 6УАет L/1CnOJlb30BaTbC? 06bCHL/1Te Baw ответ. 46. nрL/1ло>кеНL/1е со стороны nK в npL/1Mepe 1 0.16 aKTL/1BL/13L/1pyeTc Ka)l(,lJ,bIe 600 мс npL/1 nереnолнеНL/1L/1 TaMepa. Что AeJlaeT CPYHKu.L/1 OnТimer Ka>KAЫ раз, KorAa зто npoL/1c- XOAL/1T? 47. Какова скорость nереАаЧL/1.o.n nОАКJlI04еНL/1Я 4ерез RS-232 к USB? 48. Как в ПК YCTaHaBJlL/1BaeTC cpaJl .inf M L/1HTepcpeca USB? 49. КомаНАЫ paCWL/1peHHOro на60ра команд ML/1KpOKOHTpOJlJlepOB ceMeCTBa PIC18 AOCTYnHbI на Ассем6лере. Как OHL/1 MoryT L/1СnОЛЬЗ0ватьс в КОМnL/1лторе С18? 50. С KaKL/1M FSR-реrL/1стром ра60тают MHOrL/1e L/13 комаНА paCWL/1peHHOro на60ра комаНА? 51. Каково назначеНL/1е комаНАЫ PUSHL? 52. Каково назначеНL/1е комаНАЫ CALLW? 53. Каково Ha3Ha4eHL/1e коман,lJ,Ы SUBUNLK? 
ПрнложеннSI 529 r Код операции, Описание LJ.иклы 16-битное Status Notes операlЩЫ командное слово Affected Байтово-ориентированные команды работы с реrистровым файлом ADDWF f, d, а СкладываетWRЕG и f 1 0010 01da ffff ffff С OCZOVN 1,2 ADDWFC f, d, а СкладываетWRЕG и f 1 0010 OOda ffff ffff С OCZOVN 1,2 сС ANDWF f, d, а И WREG с f 1 0001 01da ffff ffff ZN 1,2 CLRF f, а Очищаетf (ОхОО) 1 0110 1О1а ffff ffff Z 2 COMF f, d, а Дополнение f 1 0001 11da ffff ffff 4 (до 1) CPFSEQ f, а Сравнение f с WREG, 1-3 0110 001а ffff ffff 4 пропуск = CPFSGT f, а Сравнивает f с 1-3 0110 010а ffff ffff 4 WREG, пропvск> CPFSL Т f, а Сравниваетf с 13 0110 ОООа ffff ffff 4 WREG, пропуск < DECF f, d, а Дet<p3Crveн1V1p.,€тf 1 0000 01da ffff ffff С ОС Z OV N 1,2,3,4 DECFSZ f, d, а Декресментирует f, 13 0010 11da ffff ffff 1,2,3,4 пропуск, если О DCFSNZ f, d, а Декресментирует f, 13 0100 11da ffff ffff 1,2 пропуск, если""О liCF f, d, а ИНКf.X.-'СМен.тируетf 1 0010 10da ffff ffff С ОС Z О V N 1,2,3,4 INCFSZ f, d, а Инкресментирует f, 13 0011 11da ffff ffff 4 пропvск, если О INFSNZ f, d, а Инкресментирует f, 13' 0100 10da ffff ffff 1,2  пропуск, если"" О ilORWF ! f, d, а Исключающее или 1 0001 OOda ffff ffff ZN 1,2 I I WREG с f ! r'iO\/F ! f, d, а Пермосf 1 0101 OOda ffff ffff ZN 1 I MOVFF f" fd Пернос f, в fd 2 1100 ffff ffff ffff LI1сточник  Приемник  1111 ffff ffff ffff MOWJF f, а Перенос WREG в f 1 0110 111а ffff ffff MULWF f, а Ym-:QЖfНIe'v\fEGнз f 1 0000 001а ffff ffff NEGF f, а Отрицательное 1 0110 110а ffff ffff С OCZOVN 1,2 число oTf (Аополне ние До 2) RLCF f, d, а Циклический пере 0011 01da ffff ffff CZN нос f через С левый RLNCF f, d, а Циклический пере 1 0100 01da ffff ffff ZN 1,2 нос f левый RRCF f, d, а Циклический пере 1 0011 OOda ffff ffff CZN нос f через С правый RRNCF f, d, а Циклический пере 1 0100 OOda ffff ffff ZN носfправый SEТF f, а Уста нов f (OxFF) 1 0110 100а ffff ffff SUBFWB f, d, а Вычитание f из WREG 1 0101 01da ffff ffff COCZOVN 1,2 с заимствованием SUBWF f, d, а Вычитание f из VI/REG 1 0101 11da ffff ffff COCZOVN SUBWFB f, d, а Вычитание WREG из f 1 (Л 01 10da ffff fflt COCZOVN 1,2 с заимствованием lSWAPF f, d, а Своппинr полубайтов 1 0011 10da ffff ffff 4 Bf I TSTFSZ f, а Проверка f, пропуск, 13 0110 011а ffff ffff 1,2 если О ПРИЛОЖЕНИЕ А Набор команд семейства PIC18 
530 Применение микроконтроnлсров PIC18 Код операции, Описание Циклы 16битное Status Notes опер:шды командное слово Affected XORWF f, d, а L/1сключающее ИЛИ 1 0001 10da ffff ffff ZN WREG с f BCF f, d, а Очистка бита f 1 1001 ЬЬЬа ffff ffff 1,2 BSF f, d, а Установка бита f 1 1000 ЬЬЬа ffff ffff 1,2 BTFSC f, d, а Проверка бита f, 13 1011 ЬЬЬа ffff ffff 3,4 пропуск, если О BTFSS f, d, а Проверка бита f, 13 1010 ЬЬЬа ffff ffff 3,4 пропуск, если 1  BTG f, d, а Переключение бита f 1 0111 ЬЬЬа ffff ffff 1,2 I1 f<OMAHAbi УnРАВЛЕННЯ !ВС 11 Переход, если пере 12 1110 0010 пппп пппп I . нос BN п Перход, если отри 12 1110 0110 пппп пппп цаТеJlьное значение BNC п Переход, если нет 12 111 О 0011 пппп пппп переноса , БNN 11 nepxoA, если поло 12 1110 0111 пппп пппп жительное значение BNOV n Переход, если нет 12 1110 0101 пппп пппп переполнения BNZ n Переход, если HeHY 1-2 1110 0001 пппп пппп левое значение BOV п Переход, если пере 12 1110 0100 пппп пппп полнение BRA п Переход BcerAa 2 1101 Оппп пппп пппп BZ n Переход по нулю 12 1110 0000 пппп пппп CALL П,5 Вызов noAnporpaM 2 1110 1105 kkkk kkkk мы 1111 kkkk kkkk kkkk CLRWOT Очистка сторожевоrо 1 0000 0000 0000 0100 ТО РО таймера OAW Десятичная настрой 1 0000 0000 0000 0111 СОС ка WREG GOTO п nер,эход по адресу 2 1110 1111 kkkk kkkk 1111 kkkk kkkk kkkk NOP Нет операции 1 0000 0000 0000 0000 r I ,OP Нет операции 1 1111 хххх хххх хххх 4 Irop L/1ЗВJlечение BepxHero 1 0000 0000 0000 0110 1 I адр\;й стека B03BfJa та PUSH Занесение адреса на 1 0000 0000 0000 0101 вершину стека возврата RCALL n Относительный 2 1101 1ппп пппп пппп ВЫЗОВ (CALL) RESET Проrраммный сброс 1 0000 0000 1111 1111 AII (RESEТ) RЕ1ТFIЕ 5 Возврат с разрешен 2 0000 0000 0001 0005 ными прерываниями GIE/GIEH, PEIE/GIEL RETLW k Возврат с литералом 2 0000 1100 kkkk kkkk BoWREG RETURN 5 ВОЗlзрат из подпро 2 0000 0000 0001 0015 rpaMMbI SLEEP Вход в режим без 1 0000 0000 0000 0011 ТО РО действия 
ITрНnОlKення 531 Код операции, Циклы 16-битное Status Notes Описание Affected операнды командное слово ЛИТЕРАЛЬНЫЕ КОМАНАЫ ADDLW k Скпмывает k с 1 0000 1111 kkkk kkkk CDCZOVN WREG ANDLW k И kcWREG 1 0000 1011 kkkk kkkk ZN IORLW k Включающее LI1ЛИ k с 1 0000 1001 kkkk kkkk ZN I WREG rLSFR f, k Перенос k в FSR f 2 111 О 111 О 000 kkkk 1111 0000 kkkk kkkk MOVLB k Перенос k в BSR 1 0000 0001 0000 kkkk MOVLW k Перенос k во WREG 1 0000 1110 kkkk kkkk MULLW k Умножение WREG на 1 0000 1101 kkkk kkkk k RETLW k Возврат с k во WREG 2 0000 1100 kkkk kkkk : SUBLW k Вычитание WREG из 1 0000 1000 kkkk kkkk CDCZOVN k XORLW k LI1ск.пючительное 1 0000 1010 kkkk kkkk ZN или kcWREG ТАБЛНЧНЫЕ КОМАНДЫ TBLRD* Табличное 2 0000 0000 0000 1000 считывание TBLRD*+ Табличное 2 0000 0000 0000 1001 считывание с постинкресментиро- ванием TBLRD* Табличное 2 0000 0000 0000 1010 считывание с rк:x:;т- ЕМ I I TBLRD+* Табличное OWbВЭtИ3с 2 0000 0000 0000 1011 I ПМJД- i ЕМ : TBLWR* ТаБЛИ4ная запись 2 0000 0000 0000 1100 5 I TBLWR*+ Табличная запись с 2 0000 0000 0000 1101 5 I ПOCТV1нкрементирова- нием I TBLWR* Табличная запись с 2 0000 0000 0000 1110 5 I постдекрементиро- ванием !iBLWR+' таБЛИ'-lная запись с 2 0000 0000 0000 1111 5 I I преддекремеНn1рова - ! I нием КОМАНДЫ PACWHPEHHOrO НАБОРА КОМАНД ADDFSR f, k Складывает k с FSR 1 1110 1000 ffkk kkkk ADDU..NК k Складывает k с FSR2 и 2 111 О 1000 11kk kkkk возврат CALLW Вызов подпроrраммы 2 0000 0000 0001 0100 с использованием WREG MOVSF Z, f" Перенос Z в f 2 1110 1011 Ozzz иzz 1111 ffff ffff ffff MOVSS Z,Z Перенос z в Z 2 1110 1011 1zzz иzz 1111 хххх x:z:zz иzz PUSHL k Сохраl-lяет k в FSR2, 1 1110 1010 kkkk kkkk I декрементирvет FSR2 SUBFSR f, k Вычитает k из FSR 1 1110 1001 ffkk kkkk StJВlJ'U( k ' Вычи [ает k из FSR2, 2 111 О 1001 11kk kkkk возврат 
532 ITримененне МИКрОКОНТроnnеров PIC18 Прнмечания: 1. Kor,lJ,a perL/1CTp порта H3MeHeTC как CPYHKu.H от CBoero COCTOHH (HanpHMep, MOVF PORTB, 1, О), L/1СnОJlьзуемым значеНL/1ем 6У,lJ,ет значеНL/1е, npe,lJ,CTaBJleHHOe Heno- среАственно на wTbIpbKax. 2. ECnL/1 зта комаНАа BbInOJlHeTC С perHcTpoM TMRO (L/1 r,lJ,e зто npL/1MeHHMO, d = 1), то npeABapL/1TeJlbHbI ,lJ,eJlL/1TeJlb 6У,lJ,ет 04L/1w,aTbC, eCJlL/1 он L/1СnОJlьзуетс. З. ECnL/1 счеТ4L/1К комаНА L/13MeHeTC HJlL/1 проверка YCJlOBL/1 HCTL/1HHa, то комаН,lJ,а требует АВУХ ЦL/1КЛОВ. BTOpO ЦL/1КJl BbInOJlHeTC как комаН,lJ,а NOP. 4. Некоторые коман,lJ,Ы COCTOT L/13 АВУХ CJlOB. Второе CJlOBO BbInOJlHeTC как NOP, еСЛL/1 только первое CnOBO не L/13BneKaeT L/1нсрормаЦL/1IО, ВКJllOченную во второе CJlOBO. 3то rарантирует, что во всех чеках naMTL/1 nporpaMMbI L/1меютс корректные комаНАЫ. 5. ECnL/1 оnераЦL/1 та6JlИЧНО заnL/1СН L/1НL/1ЦL/1аJlН3L/1рует ЦL/1КJl заnL/1СL/1 во BHyTpeHHlO1O naMTb, то заnL/1СЬ 6УАет nРО,lJ,ОJlжатьс,lJ,О заверwенн операцнн. Обозначення в таблиu.е: f - 8-раЗР,lJ,ная ячейка perL/1CTpOBOro cpana ,lJ,анных (ОхОО через OxFF) d  БL/1Т приемника (О = coXpaHeHL/1e результата во WREG, 1 = сохранение pe3YJlbТa та в f) а  бит доступа (О = AOCTYn к 4eKe ЗУПВ, 1 = 6анк ЗУПВ, сnеЦНСРИЦL/1руемы BSR) С  перенос (перенос L/13 KpaHero neBoro раЗР,lJ,а) ОС  nОЛОВL/1ННЫЙ перенос (перенос Me>K,lJ,Y правым н JleBbIM поnу6атами) Z - нулево pe3YnbТaT (О = не HOJlb, 1 = HOnb) OV  nepenonHeHHe (О = нет nepenOJlHeHL/1, 1 = арнсрмеТL/1ческое nepenOJlHeHL/1e) N  отрL/1цатеnьны результат (О = nОJlОЖL/1теJlЬНЫ, 1 = отрнцатеJlЬНЫ) fs  12-БL/1ТНЫ а,lJ,рес L/1СТОЧНL/1ка perHcTpoBoro cpaJla ,lJ,анных (от ОхООО,lJ,О OxFFF) fd - .12-БL/1ТНЫ аАрес npHeMHL/1Ka perHCTpOBoro cpaJla ,lJ,анных (Охооо через OxFFF) n  OTHOCL/1TenbHbI а,lJ,рес ,lJ,n коман,lJ, nepeXO,lJ,a, HenOcpe,lJ,CTBeHHbI аАрес M ко- маНА CALL/BRA L/1 коман,lJ, возврата s  БL/1Т вы60ра 6bICTporo ВЫЗ0ва (CALL) (О = не 06новлть теневые реrистры, 1 = обновлть теневые perL/1CTpbI) ЬЬЬ - выбор 6L/1TOBO n03L/1ЦНL/1 (от 0.0.07) k - ЛL/1теральное значение (мо>кет 6ыть 8 , 12 -, L/1nL/1 20-разр,lJ,НЫМ) Ю - 6ит TaMaYTa ffi  БL/1Т откnючени зnеКТРОnL/1таНL/1 GIE - БL/1Т rnобаnьноrо разреwеНL/1 npepbIBaHL/1 GIEH  БL/1Т rлобальноrо разреwеНL/1 npepbIBaHL/1 (BbIcoKOnpHOpL/1TeTHOe npepbIBa- ние) GIEL - БL/1Т rлобальноrо разреwеНL/1 npepbIBaHL/1 (HL/13KOnpHOpL/1TeTHOe npepbIBa- HL/1e) PEIE - БL/1Т разреwеНL/1 npepbIBaHL/1 от пеРL/1фериных YCTPOCTB ZS  7 разрдное значеНL/1е cMew,eHL/1 а,lJ,реса нсточннка при KOCBeHHO аАресаЦL/1Н Zd - 7 -раЗРАное 3Ha4eHL/1e cMew,eHL/1 а,lJ,реса npL/1eMHL/1Ka npH KOCBeHHO а,lJ,реса- ЦИL/1 Х - БL/1Т, COCTOHL/1e KOToporo не учнтываетс 
ITрИnОlKення 533 ПРИЛОЖЕНИЕ В Обычно используемые библиотечные функции языка С Это ПрL/1nожеНL/1е содер>КL/1Т C>KaTЫ CnL/1COK 06ычно L/1спользуемых аппаратных L/1 npo- rpaMMHbIx ФУНКЦL/1 6и6nL/10текн 3ЫKa С, nocTaBneMO совместно с KOMnL/1nTOpOM С18. Это Хl}рошая основа наnисаНL/1 проrраммноrо 06ceCne4eHL/1 ДЛ МL/1кроконтролnерных CL/1CTeM. l<a>KAa L/13 nеречнсnенных срУНКЦL/1 conpOBO>KAaeTC O,lJ,HL/1M nL/160 ,lJ,BYM прнмерамн ее L/1C ПОnЬЗ0ваНL/1. Параметры некоторых срУНКЦL/1 6у,lJ,УТ L/13MeHTbC ДЛ ра3nL/1ЧНЫХ BepCL/1 PIC18, n03TOMY L/1X He06xOAL/1MO CBepTb с ,lJ,окументаЦL/1е, nOCTaBneMO cpHpMO Microchip. #include <adc.h> // аппаратный аналоrоu.иФровой преобразователь Фvнкция Параметры Назначение Пример char BusyADC (void) Возвращает 1, если АЦП Проверяет АЦП на while (BusyADC()); занят занятость void CloseADC (void) Закрывает АЦП и запре CloseADC(); щает прерывания от Hero void ConvertADC (void)  Запускает новое ConvertADC( ); преобразование void OpenADC (char Config 1 : Конфиrурирует АЦП Ореп АОС config1, Источник тактовой час- (ADCJOSC 16& char config2) тоты аналоrо-цифровоrо ADC8ANAOREF"'DC преобразования: CHO &АОС INTON); ADCJOSC2 ADCJOSC4 ADCJOSC8 ADCFOSC16 ADCFOSC32 ADCFOSC64 ADCJOSCRC Выравнивание резуль- тата АЦП- преобразования: АОСАIGНТ JUST ADCLEFТ JUSТ Источникопорноrо напряжения АЦП: ADC8ANAOREF ADC7ANA 1 REF I ADC6ANA2REF ADC5ANAJ REF ADC5ANAOREF AOC 4ANA2REF AOC 4ANA 1 REF АDСЗАNА2RЕF ADC3ANAOREF ADC2ANA2REF ADC2ANA 1 REF AOC 1ANA2REF AOC 1ANAOREF ADCOANAOREF Config2: канал: AOCCHO AOCCH1 AOCCH2 AOCCH3 AOCCH4 АОС СН5 
)34 Примеllение MHKpOKOHTpOnnepOB PIC18 Функция Параметры Назначение Пример AOCCH6 AOCCH7 Прерывания ДLJ.П: ! ADCJNTON ADCJNT OFF I ...............  ;п' t"<еэс!ЛОr. (\Ioi(!) Считывает результат result = ReadADC(); ............ преобразования JOicl SоtСllЗI1АDС Channel: Изменяет канал SetChanADC :cllar сhаlшеl) ADCCHO (АDССНЗ); ADCCH1 ADCCH2 AOCCH3 ADCCH4 ADCCH5 ADCCH6 АDС СН7 #include <capture.h> // Аппаратный блок ССР Функция Параметр Назначение Пример void CloseCapturex (void)  Закрывает блок C10seCapture 1 (); .1ЛИ ССР х или блок \lOid CloseECapture (void) расширения void O'penCapturex (char config) Config: Открывает блок OpenCapture 1 или разрешаетпрерывания ССР х или блок (CAPTUREJNTO void OpenECapture (char config) от ССР: расширения N& CAPTUREJNTON C1EVERYRIDE  CAPTUREJNTOFF EDGE); включает прерывания по: CxEVERYJALLEDGE CxEVERYRISEEDGE CxEVERY 4RISEEDGE CxEVERY 16RISEEDGE EC1EVERYJALLEDGE ЕС 1 EVERYRISEEDGE ЕС1 EVERY 4RISEEDGE EC1EVERY 16RISEEDGE unsigned int ReadCaptllrex (void)  Считывает триr value = ReadCap vlЛИ rep блока ССР х ture1(); unsigned int ReadECapture (void) или дополни тельноrо блока #iпсludе <ic2.h> // AnnapaTHbI модуль 1 2 С  Функция Параметры Назначение Пример void Ackl2C (void)  r енерирует сиrнал кви AckI2C(); или .IЛИ тирования шины (АСК) Ack12C2( ); void Ackl2Cx (void) void Closel2C (void)  ЗакрываетблокSSР CloseI2C(); или Closel2C1 (); ,IЛИ 'Joic! Closcl2Cx (void) Jnsigned cllar DataRdyi2C Возвращает 1, если в Проверяет буфер на if (DataRdyI2C(}) ,void) буфере есть данные наличие данных { ",ли /1 Получение данных LJnsigned char DataRdyl2Cx ivoj(j) lJnsiglled char getcl2C (void) Возвращает байт из Считывает буфер dat = getcI2C(); буфера .1ЛИ lJnsigned char. getcl2Cx (void) 
ПриложеllИЯ 535 #include ic2.h / / Аппаратный блок 1 2 С функция unsigned char getsl2C (ип- signed char *ptr, unsiglled char length) или unsigned char getsl2Cx (unsigned char *ptr, un. signed char length) void Idlel2C (void) bkb void Idlel2Cx (void) void NotAckl2C (void) или void NotAckl2Cx (void) void Openl2C (unsigne(i char sync, unsigned char :;Iew) ",ли void Openl2Cx (unsigned char sync, unsigned char slew) 'Jnsigned char putcl2C (ип- signed cl1ar data) или unsigned char putcl2Cx (ul1signed char data) unsigned char putsl2C (ип- signed cllar *ptr, unsigl1ed char length) ,1ЛИ unsigned char putsl2Cx (uпsigпеd char *ptr, ип. signed char length) void Restartl2C (void) или \/oid Restartl2Cx (void) voicl Startl2C (lIoid) или void Startl2Cx (void) void Stopl2C (void) ",ли JOid Stop!2Cx (void) vVтel2C i1ЛИ Writel2C Readl2C Параметры Считывает строку символов с шины 12С и сохраняет ее в ячейках памяти данных, адре- суемых ptr; возвращает О, если все байты были перенесены Sync: SLAVE7 SLAVE 1 О MASTER Slew: I SLEWOFF j SLEWON Возвращает О, если запись успешна Возвращает О, если запись успешна Смо rрите функции putcI2C() и putcl2Cx( ) Смотрите функции getcl2C() и qetcl2CCx() Назначение Reads а string from the 12C bus Ожидание, пока шина 1 2 С не бу дет свободна iенерирует сиrнал OTCYTCT вия подтвержде ния (NAK) Открывает под ключение 12С как ведущее или ведомое Записывает байт на шину "С Записывает строку симвоолв на шину 12С I iенерирует условия I перезапуска iенерирует условия запуска iенерирует I 'условия останова Пример getsl2C1 ( ЬоЬ, 6); IdleI2C(); NotAckl2C(); Openl2C (MASTER, SLEWOFF); putcl2C(Ox31 ); putsI2C(fred,3): Restartl2C( ); Startl2C 1 (), Stop2C2(}; 
536 ITримеllение микроконтроллеров PIC18 Функция Параметры Назначение Пример или Readl2Cx unsigned char EEAckPolling Параметр управления ОхАО ! 'нерирует ро\ = EEAckPolling (unsigned control) лоrически умножаетСя с адре- I rlОследователь- (ОхАО); о, сом устройства; возвраЩс.8Н,Я ность подтвер- unsigned crlar EEAck- О в случае отсутствия ОШviбок ждения опрос Pollingx (unsigned control) для памяти ЕЕ ! Microchip unsigned cllar EEByteWrite Записывает байт EEByteWrite (ОхАО, (unsigned char control, по адресу Ох10,Ох1А); unsigned char address, ЭСПnЗУ, опре- unsigned char data) деленному в функции or unsigned char EEByteWritex \Ullsigned char control, unsigned char address, unsigned char data) unsigned char ЕЕСurrеп- Считывает один EECurrentAddRead lAudRead (ur1sigr1ed ch.J( байт из ЭСППЗУ (ОхАО); control) по текущему or адресу unsigned char EECurrell- tAddReadx (unsigned char control) unsigned char EEPageWrite Записывает EEPageWrite1 (ОхАО, (unsigned char control, страницу памяти Ох1 О, buffer); unsigned char address, данных ЭСnПЗУ, unsigned char *ptr) адресованную or ptr, начиная от unsigned cllar EEPage- текущеrо адреса Writex (unsigned char соп- trol, unsigned char address, unsigned char *ptr) unsigned int EERandom- Считывает один EERandomRead Read (unsigned char соп- байт из памяти (ОхАО,Ох20); trol, unsigned char address) ЭСППЗУ, требу- or ет однобайтовый unsigned int EERandom- аДреС Readx (unsigned char соп- trol, Ullsigned char address) unsigned charEESequen- Считывает стро- EESequentia\Read tialRead (unsigned char ку данных из (ОхАО, ОхЗО, buffer, control, unsiglled char ad- ЭСППЗУ 5); dress, unsigned char *ptr, unsigned char length) or unsigned charEESeque/1- tialRead (Unsigrled char cOl1trol, unsiglled char иd- Jress, unsigned char *ptr, unsigned char length) 
ITрнnоження 537 #include <pwm.h> // Аппаратный модуль ШИМ Функция Параметры Назначение Пример void ClosePWMx (void) Закрывает ШИМ- ClosePWM1(}; канал void OpenPWMx (char Период ШИМ = (период + 1) х Открывает ШИМ OpenPWM1 (10); period) 4 х TOSC х предварительный модуль и задает ero делитель TMR2. (Таймер 2 период должен также быть открыт и запроrраммирован перед открытием модуля ШИМ). void SetDCPWNx (int duty_ LI1зменяется коэффициент Сиз меняет коэффи SetDCPWM1 (500); cycle) заполнения для выбранноrо циент заполнения ШИМмодуля ШИМмодуля void Config: Конфиrурирует BЫ SetOutputPWM 1 SetOutputPWMx (unsigllcd выход ШНМ: ход ШИМ (S\NGLEOUT, char config, unsigned cllar SINGLEOUT PWMMODE 1 ); lПоdе) FULLOUTFWD HALF OUT FULL OUT REV Mode: PWMMODE 1 PWMMODE2 PWММОDЕЗ PWM МООЕ 4 #include <spi.h> Функция Параметры Назначение Пример void CloseSPI (void)  Закрывает блок SPI unit CloseSPI(); or void CLoseSPlx (void) unsigned char Возвращает 1, если име Проверяет буфер SP\ if (DataRDYSPI(}) DataRDYSPI (void) ются доступные данные. на наличие доступ { or ных данных 11 обработка данных unsigned char } DataRDYSPlx (void) unsigned char getcSPI Rвозвращает данные с IИнициализирует dat = getc (SPI); (void) шины SPI считывание SP\ и возвращает данные or unsigned char getcSPlx (void) void getsSPI (unsigned Считывает данные с шины Считывает строку getsSPI (buffer, 1 О); char *ptr, unsigned char SPI в буфер, адресуемый данных с SPI length) *ptr для числа битов. YKa или занных параметром length void getsSP\x (unsign8(1 Sync: char * ptr, ul1sigl1ed char SPIFOSC 4 !el1gt\1) SP\JOSC  16 юiJ OpenSPl (unsigne(j SPIFOSC64 char sync, unsigned char SPIJOSC  ТМА2 !)us, unsigned char sтp) SLVSSON или SLVSSOFF SPI void Opel1SPlx (unsigned Bus: char sync, unsigned ch..r MOOEOO bus, unsigned char smp) MOOE01 MOOE 1 О MOOE 11 Smp: SMPEND SMPMID 
538 Примененис МИКрОКОllтролnеров PIC18 функция Параметры Назначение Пример Открывает шину SPI OpenSPI и конфиrурирует ее (SPIFOSC 4, MOOEOO, SMPMID); unsigned char putcSPI Возвращаемое значение Выдает символ на putcSPI (Ох2А); (unsigned char data) равно О для случая КОЛли шину SPI зии, приведшей к HeBЫ полнению записи Или Unsigned char putcSPlx (unsigned char data) void putsSPI (unsigned Записывает содержимое Записывает сим putsSPI (buffer); char .ptr) буфера, aApecyeMoro .ptr, вольную строку на или на шину SPI SPI void putsSPlx (unsigneu char .ptr) lJПsigпеd char ReadSPI Смотрите getcSP/ иЛи Считывает байт с SP\ х = ReadSPI(); (void) getcSPlx или unsigned char ReadSPlx (void) unsigned char WriteSPI Смотрите putcSPI или Записывает байт WriteSPI( Ох10 ); (unsigned char data) putcSPlx данных на шину SPI или unsigned char WriteSPlx (ul1signed char data) #include <timers.h> / /Управление аппаратным TaMepOM Функция Параметры Назначение Пример void CloseTimerx (void)  Закрывает BЫ CloseТimer20; бранный таймер void OpenTimerO (un- Config: Открывает таймер OpenTimerO signed char config) О и конфиrурирует (TIMERJNTON & ero TO16BIT & TOSOURCEJNT & TOPS116); Interrupt: (Конфиrурация) ТlMERJNTON I TIMERJNTOFF Width: (Ширина) TO8BIT TO 16BIT Clock Source: (Источник синхроимпуль сов) TOSOURCEEXT TOSOURCEJNT External Clock Trigger: (Вид переключения по внешнему синхроимпуль су) TOEDGEFALL TOEDGERISE Prescaler Value: (Коэффициент предвари тепьноrо деления) TOPSI 1 TOPS 1) ТО PS 1 4 
Приnоження 539 функция Параметры Назначение Пример TOPS18 TOPS116 TOPS132 TOPS164 TOPS1128 TOPS1256 void OpenTimer1 (ип Config: Открывает Таймер OpenТimer1 signed cllar config) (Конфиrурация) 1 и конфиrурирует (ТlMERjNT ON & ero T1 16BITRW & T1SOURCEjNT & T1PD11); Interrupt: (Прерывание) TIMERjNTON ТlMERJNTOFF Width: (Ширина) T18BITRW T116BITRW Clock Source: (Источник синхроимпульсов) T1SOURCEEXT T1SOURCEJNT Prescaler Value: (Коэффициент предвари тельноrо деления) T1PS11 T1PS 12 T1PS14 T1PS 18 Oscillator: (reHepaTop) T1OSC1ENON TlOSC1 ENOFF Synchronize Clock (Синхронизация таймера) Input: (Вход) TlSYNCEXТON Т1 SYNC EXT  OFF Use With 1 или 2 CCPs: (Использовать с 1 либо 2 блоками ССР) T3SOURCECCP T1CCP1T3CCP2 T1SOURCECCP For devices with more Than 2 CCPs: (Для устройств с более, чем 2 ССР) T34SOURCECCP T12CCP12 T34CCP3 45 T12CCP1T34CCP23 45 T12SOURCECCP void OpenTimer2 (ип Config: Открывает таймер 2 OpenТimer2 signed char config) (Конфиrурация) и конфиryрирует ero (ТlMERJNT ON & Interrupt: (Прерывания) 
)"+0 Прнменение микроконтроnnеров PIC 18 Функция Параметры Назначение Пример ТlMERJNTON T2PS 1 1 & ТlMERJNT _ OFF T2POST 1 1); Prescaler Value: (Коэффициент предвари тельноrо деления) T2PS11 T2PS 1 4 T2PS_116 Postscaler Value: (Коэффициент постделе ния) T2POST_11 T2POST 12 . . . . T2POST  1 15 T2POST1161:16 Use With 1 или 2 CCPs: (Использовать с 1 либо 2 блоками ССР) ТЗSОURСЕССР Т1ССР1ТЗССР2 T1SOURCECCP More than 2 CCPs: (Более, чем 2 ССР) ТЗ4SОURСЕССР Т12ССР12ТЗ4ССРЗ 45 Т12ССР1ТЗ4ССР2З 45 T12SOURCECCP void OpenТimer3 (ип- Config: Открывает таймер ОрепТimеrЗ signed char config) (Конфиrурация) 3 и конфиrурирует (ТlMERJNTOFF & Interrupt: ero (Прерывание) TIMERJNTON ТЗ8ВIТ RW & TIMERJNT OFF ТЗSОURСЕJNТ & Width: ТЗРS 1 1); (Ширина) ТЗ8ВIТRW ТЗ 16BITRW Clock Source: (Источник синхроимпуль сов) ТЗSОURСЕЕХТ ТЗSОURСЕJNТ Prescaler Value: (Коэффициент ПреДВари тельноrо деления) ТЗРS11 ТЗРS 12 ТЗРS14 ТЗРS18 Synchronize Clock (Синхронизация таймера) Input: (Вход) ТЗSYNСЕХТ_ОN ТЗSУNСЕХТОFF 
ПрИnОlKения 541 Функция Параметры Назначение Пример Use With 1 or 2 CCPs: (Использовать с 1 или 2 ССР) T3SOURCECCP T1CCP1T3CCP2 T1SOURCECCP More than 2 CCPs: (Более, чем 2 ССР) T34SOURCECCP T12CCP12 T34CCP3 45 T12 CCP1 T34 ССР23 45 T12SOURCECCP 'JOid OpenTimer4 (un- Config: Открывает таймер ОрепТiП1еr4 signed char config) (Конфиrурация) 4 и конфиrурирует (rIMER INT ON & Interrupt: ero (Прерывание) ТlMERJNTON T4PS 1 1 & ERJNTOFF T4POST 1 1); Prescaler Value: (Коэффициент предвари тельноrо деления) T4PS1 1 T4PS14 T4PS116 Postscaler Value: (Коэффициент постделе ния) T4POST1 1 T4POST12 . . . . T4POST 1 15 T4POST1161:16 unsigned int Возвращает значение Считывает отсчет х = ReadTimer2(); выбранноrо таймера. таймера ReadTimerx (void);  Записывает в выбранный таймер void WriteТimerx (ип- WriteTimer1 (12500); signed int) 
5t2 Прнмененне l\1HKpOKOHTpOJI:lepOB PIC 18 #include <usart.h> / / Аппаратный USART Функция Параметры Назначение Пример void Config: Устанавливает baudUSART baudUSART (unsigned (Конфиrурация) скорость информа (BAUD IDLE CLK HIGH    config) Clock Idle State: ционноrо обмена & или (Синхронизация состояния USARТ BAUD 16BITRATE & \/oid baudxUSART (un- паузы) BAUDJDLECLKHIGH BAUDWAKEUPON & signed config) BAUD JDLE CLKLOW BAUDAUTOON); Baud Rate Generation: (rенерация скорости ин формационноrо обмена) BAUD 16BITRATE BAUD8BITRATE RX Pin Monitoring: (Контроль состояния штырь ка АХ) BAUDWAKEUP ON BAUDWAKEUPOFF Baud Rate Measurement: (Замер скорости информа ционноrо обмена) (BAUD AUTO ON BAUDAUTOOFF '.:;har BusyUSART (void) Возвращает 1, если Проверяет while (BusyUSART()); или передатчик занят передатчик USART или char BusyxUSART (void) while (Busy2USART(}); void CloseUSART (void)  Закрывает USART CloseUSART(); или Или void ClosexUSART (void) Close1 USART(); char DataRdyUSART Возвращает 1, если были Проверяет while (!Da (void) приняты данные приемник USART taRdyUSART(}); Нли char DataRdyx- USART (void) char getcUSART (void) Возвращает символ, Считывает символ х = getcUSART(); или принятый USART из USAr, I char getcxUSART (void) void getsUSART (ип- Считывает символьную CTpO Считывает сим getsUSART (buffer, 4); signed ct1ar 'ptr, un- ку из USART и сохраняет ее в вольную строку из signed char length) ячейке памяти, адресуемой USART или .ptr для количества байтов, void getsxUSART (ип- специфицированноrо пара signed char 'ptr, ип- метром длины строки signed char length) (Iength). void OpenUSART (un- Config: Открывает и OpenUSART sigl1ed char config, (Конфиrурация) конфиrурирует (USARTТXJNTON & unsigned int brg) Interrupts: USART USARTRXJNTON & или (Прерывания) USART ASYNCHMODE void OpenxUSART (un- USARTТXJNTON & USARTEIGHTBIT & signcd cllr cO/lfig, USARTTXJNTOFF USARTSYNCMASTER unsigned int brg) USARTRXJNTON & USART  CONT RX & USARTRXJNTOFF USARTBRGHHIGH, Mode: 25 ); ( Режим) USART ASYNCHMODE USART SYNCHMODE Width: (Ширина) USARTEIGHTBIT USART NINEBIT 
ПрНnОlKення 543 Функция Параметры Назначение Пример Slave/Master: (Подчиненное/Ведущее) USARTSYNCSLAVE USART SYNCMASTER Reception mode: (Режим приема) USART SINGLERX USARTCONTRX Baud rate: (Скорость информационноrо обмена) USART BRGHHIGH USART BRGHLOW BRG: (reHepaTop скорости инфор мационноrо обмена) Определяет скорость информационноrо обмена char ReadUSART (void) Смотрите getcUSART() или Считывает USART х = ReadUSART(); или getCxUSART() char ReadxUSART (void) void WriteUSART (char Смотрите putcUSART() или Записывает в WriteUSART( Ох10); data) putcxUSART() USART или void WritexUSART (char' data) #include <swj2c.h>// Проrраммны ннтерфейс , 2 с По УМОn4аНLI1Ю, nporpaMMHbI LI1HTepcpeC 1 2 С LI1сnользует RB3,lJ,Jl TaKTOBO 4астоты и RB4 M ,lJ,анных. ЭТLI1 номера WTbIPbKOB MorYT 6ыть MO,lJ,LI1cpLl1u.LI1pOBaHbI посре,lJ,СТВОМ изменени срала swj2c.h с nосле,lJ,УlOще nOBTopHO KOMnLl1Jlu.LI1e CPYHKu.LI1. Функция Параметры Назначение Пример char Clock_test (void) Возвращает О в слу Используется для if (Clocktest()) чае отсутствия оши растяrивания во Bpe { бок мени импульсов TaK / / handle error товой частоты на } ведомом устройстве char SWAckl2C (void) Возвращает О, если rенерирует сиrнал if (SWAckI2C(}) or ведомое устройство АСК или NAK { char SWNotAckl2C подтверждает выпол / / handle error (void) нение операции } char SWGetcl2C (void) Возвращает байт Считывает шину 12С х = SWGetcI2C(); данных из 12С или  1 в случае ошибки char SWGetsl2C (un Считывает шину 12С и Считывает строку SWGetsl2C (buffer, 5); signed char *ptr, ип- сохраняет символы в символов с шины 12С signed char length) буфере, адресуемом *ptr; количество счи- танных байтов опре деляетсяпараметром длины (Iength). В случае ошибки возращается  1 
544 Примененнс МИКрОКОНТрОЛJIСрОВ PIC18 Функция Пара метры Назначение Пример char SWPutcl2C (ип- Посылает данные на Посылает байт на SWPutcl2C (Ох8А); signed char data) шину 12С, возвращает шину 12С О, если запись успеш на char SWPutsl2C (ип- Передает содержи- Передает символьную SWPLltsl2C (buffer, 10); signed char *ptr, un- мое области памяти, строку на шину 12С signed length) адресуемой *ptr, на шину 12С. Параметр длины (Iength) указы- вает количество пе- редаваемых байтов; в случае отсутствия ошибки возвращается О Функция Пара метры Назначение Пример char SWReadl2C (void) Смотрите Считывает байт с шины 1 2 С Х = SWReadI2C(}; SWGetcI2C() void SWRestar112C (void)  Перезапускает шину 1 2 с SWRestartI2C(); void SWStar112C (void)  Запускает шину 1 2 С SWStartI2C() ; void SWStopl2C (void)  Останавливает шину 1 2 С SWStopI2C(}; char SWWritel2C (unsigned Смотрите Записывает байт на шину S\fvWritel2C (Ох22); char data) SWPutcI2C() 1 2 С #include <swspi.h> // Проrраммный интерфейс SPI По умолчаНLI1Ю, nporpaMMHbI LI1HTepcpec SPI LI1спользует RB2 как WTbIpeK G&, RB3 как BXO,lJ,HO WTbIpeK ,lJ,анных, RB7 как ВЫХО,lJ,ной WTbIpeK Аанных LI1 RB6  как WTbIpeK тактовой частоты. Эти номера WTbIPbKOB MoryT быть МОАLI1фLl1u.ированы посре,lJ,СТВОМ изменени файла swspi.h с nосле,lJ,УlOще повторной комnилu.LI1е функu.LI1. функция Параметры Назначение Пример void ClearCSSWSPI (void)  Сбрасывает ШI:рек ClearCSSWSPI(); выбора микросхемы \loid OpenSWSPI (void)  Открывает интерфейс SPI OpenSWSPI(); char putcSWSPI (char data) Возвращает байт, Записывает байт на шину х = putcSWSPI (ох 66); сччитанный с SPI SPI void SetCSSWSPI (void)  Устанавливает штырек SetCSSWSPI(); выбора микросхемы char WriteSWSPI (char Смотрите putc- Записывает байт на шину х = WriteSWSPI (Ох33); data) SWSPI() SPI 
ПрИnОlKениSl 545 #include <swuart.h> // проrраммный ннтерфейс UART По УМОЛ4аНLI1IО, npOrpaMMHOe 06eCne4eHLI1e UART LI1СПОJlьзует штырек RB4 как WTbIpeK переАа4И Аанных, а WTbIpeK RB5  как WTbIpeK npLl1eMa ,lJ,анных. 3TLI1 номера WTbIPbKOB MorYT быть МО,lJ,LI1фLl1ЦLl1рованы посре,lJ,СТВОМ LI13MeHeHLI1 срала swuart.h с nОСJlе,lJ,УlOще повторно КОМnLl1ЛЦLl1е CPYHKu.LI1. Кроме Toro, cJle,lJ,YIOw,LI1e временные за,о,ерЖКLI1 M nepe,lJ,a4L11 LI1 npLl1eMa ,lJ,олжны 6ыть onpe,lJ,eJleHbI в nporpaMMe как СРУНКЦLl1L11: DelayTXBitUART, DelayRXHalfBitUART н DelayRXBitUART. Функu.н DelayТXnitUART срунк- ЦLl1 ,lJ,ОJlжна LI1MeTb BpeM за,о,ерЖКLI1, равное: [(Fosc/(Baud х 2))+1] х 0.5 - 12, CPYHKu.LI1 DelayRXHalfBitUART CPYHKu.LI1 ,lJ,ОJlжна LI1MeTb 8peM за,lJ,ерЖКLI1, равное: [(Fosc/(Baud х 4))+1] х 0.5 - 9, а CPYHKu.LI1 DelayRXBitUART ,lJ,OJl>KHa LI1MeTb BpeM за,lJ,ерЖКLI1, равное: [(Fosc/(Baud х 2))+1] х 0.5  14 функция Параметры Назначение Пример char getcUART (void)  Считывает байт из UART х = getcUART(); void getsUART (char *ptr,  Считывает строку символов getsUART (buffer, 1 О); unsigned char length) из UART Функция Параметры Назначение Пример void ОрепиААТ (void)  Открывает UART OpenUART(); \loid putcUART (char data)  Передает байт из UART putcUART (Ох3З); void putsUART (char *ptr) Записывает в UART Записывает строку putsUART (string1); строку символов, за символов в UART канчивающуюся нулем char ReadUART (void) Смотрите getcUART() Считывает байт из UART х = ReadUART(); lIoid WriteUART (char Смотрите put Записывает байт в UART WriteUART (OxOD); data) cUART(data) #include <delays.h> // Проrраммные временные задержки Функция Параметры Назначение Пример \loid Delay1 ТСУ (void)  Вводит задержку на 1 DelayHCY(); командный цикл void Delay1 ОТСУх (un- Параметр count  это Задержка равна 1 О х Delay10TCYx (10); signed char COu"t) значение между О и 255, count х длительность при этом О COOTBeTCTBy командноrо цикла ет 256. void Delay1 ООТСУх Параметр count  это Задержка равна 100 х Delay100TCYx (12); (unsigned char COU"t) значение между О и 255, count х длительность при этом О COOTBeTCTBY командноrо цикла ет 256 void Delay1 КТСУх Параметр count  это Задержка равна 1000 х Delay1 КТСУх (1 О); (unsigned char COU"t) значение между О и 255, count х длительность при этом О COOTBeTCTBY командноrо цикла ет 256 void Delay1 ОКТСУх Параметр count  это Задержка равна 10000 х Delay1 ОКТСУх (1); (unsigned char COu"t) значение между О и 255, count х длительность при этом О COOTBeTCTBY командноrо цикла ет 256 
546 Прнменение MHKpOKOHTpOJInepOB PIC18 ПРИЛОЖЕНИЕ С Ответы на збранные вопросы и задания с четными номерами r ЛАВА 1 2. ФL/1рма "Intel Corporation" 4. MawL/1Ha срон HeMaHa пре,lJ,стаВJlет c060 CTaH,lJ,apTHYIO архнтектуру, НСnОJlьзуемуlO в компыоерныыx CL/1CTeMax. 6. компыоерp с ПОJlНЫМ на60РОМ коман,lJ, 8. Е,lJ,L/1НL/1ца L/1ЛL/1 ноль 1 О. 1 024 К 12'nолу6ат - зто ПОЛОВL/1на 6aTa L/1JlL/1 46L/1Ta 14. А,о,рес, упраВJlение L/1 ,lJ,анные 16. СL/1rнал C4L/1TbIBaHL/1 L/1JlL/1 RG 18'nПЗУ CTL/1paeTC YJlbТpacpL/10JleTOBbIML/1 JlY4aMH вне снстемы, в ТО BpeM как 3СnnЗУ CTL/1paeTC злектричеСКL/1 в CL/1CTeMe. 20. 4К L/1ЛL/14096 22. СЗУПВ L/1JlL/1 АЗУПВ 24. (а) char резервирует 6aT паМТL/1 со знаком, (Ь) short резеРВL/1рует 16-разр,lJ,НУIO чейку naMTL/1 со знаком, (с) int резеРВL/1рует 16- разр,lJ,НУIO 4eKY памтн СО зна- ком, (d) float резеРВL/1рует 24- разр,lJ,НУIO 4eKY паМТL/1 AfI 4L/1CJla с ПJlаваlOw,е Т04- кой L/1 (е) doubIe резеРВL/1рует 24- разр,lJ,НУIO 4eKY паМТL/1 M 4L/1CJla с ПJlаваlOw,ей точкой. 26. (а) 13.25, (Ь) 57.125, (с) 43.3125 L/1 (d) 28. (а) 163.1875, (Ь) 297.75, (с) 172.859375, (d) 4011.1875 L/1 (е) 3000.05078125 30. (а) 0.10120.58 0.А 16 ., (Ь) 0.000000012 0.0028 0.0116' (с) 0.1010000120.5028 0.А1 16 , (d) 0.1120.68 0'С 16 И (е) 0.111120.748 0.F 16 32. (а) С2, (Ь) 10FD, (с) ВС, (d) 10 н (е) 8ВА 34. (а) 01111111, (Ь) 0101 0100, (с) 0101 0001 L/1 (d) 10000000 36. (а) ОАТА "FROG", О (Ь) ОАТА "Arc" , О (с) ОАТА "Water" , О (d) ОАТА "Well", О 38. ОАТА "What time is it?", О 40. (а) 00000011 1110 1000, (Ь) 1111 1111 1111 0100, (с) 00000011 00100000, (d) 1111 0011 О 111 01 00 42. char Fred1 = 34; 44. Формат с 06ратным ПОр,lJ,ком ,lJ,анных coxpaHeT MJla.o.WL/1 6aT в 6aTOBO 4eKe паМТL/1 с МL/1НL/1мальным а,lJ,ресом, а срормат с npMbIM ПОр,lJ,ком ,lJ,анных coxpaHeT CTapWL/1 6aT в чеке паМТL/1 с ML/1HL/1MaJlbHbIM а,lJ,ресом. 46. (а) упакованны: 0000 0001 0000 0010, неупакованны: 0000 0001 0000 0000 0000 0010, (Ь) упакованны: 0100 0100, HeynaKoBaHHbI: 0000 0100 0000 0100, (с) упако- BaHHЫ: 0000 0011 0000 0001, неупакованны: 0000 0011 0000 0000 0000 0001 L/1 (d) упакованны: 0001 0000 0000 0000, неупакованны: 00000001 000000000000 0000 0000 0000 48. (а) 89, (Ь) 9, (с) 32 L/1 (d) 1 50. (а) +3.5 (Ь) 1.0 (с) 12.5 r ЛАВА 2 2. rap8ap,lJ,cKa архитектура L/1СnОJlьзует отдельное пространство паМТL/1 AfI проrрамм L/1 ОТ,lJ,ельное  M ,lJ,анных. 4. Конвейерна обработка L/1нформаЦL/1L/1 свзана с тем, 4ТО L/1звле4еНL/1е коман,lJ, выnол- HeTC nараллельно с выnолнеНL/1ем коман,lJ" 4ТО позволет в Ka)l(,lJ,oM коман,lJ,НОМ 
ПрНJIОlKеннSI 547 u.ИKJlе выполнть О,lJ,ну коман,lJ,У, за С4ет 4erO nOBbIWaeTC зсрсреКТL/1ВНОСТЬ BbInOJlHeHL/1 nporpaMM. 6.8 8.0xOOOOOO(nepBoe)L/10x1FFFFF(nOCJle,lJ,Hee) 10. 12 12. 3СnПЗУ расnолаrаетс В cneu.L/1aJlbHO OT,lJ,eJlbHO 06JlaCTL/1 пространства naMTL/1 ,lJ,анных, а,о,ресуемой cneu.HaJlbHbIML/1 CPYHKu.HOHaJlbHbIML/1 perL/1CTpaML/1. 14. От ОхООО .0.0 Ox2FF 16.0x007FFF 18. PerHcTpbI TRIS, LAT L/1 РОАТ 20. Pa604L/1 perL/1CTp (W) L/1JlL/1 (WREG)  3ТО место, в котором 60JlbWL/1HCTBO apL/1cpMeTL/14e- CKL/1X L/1 лоrL/14еСКL/1Х коман,lJ, pa3Mew,alOT pe3YJlbТaT cBoero BbInOJlHeHL/1. 22. PerL/1CTp WREG pa3Mew,aeTc В ЗУnВ ,lJ,анных по а,о,ресу OxFE8. 24. PerL/1CTpbI FSR L/1CnOJlb3YIOTC AfI KOCBeHHO a,lJ,pecau.HH naMTL/1 ,lJ,анных. 26. PerL/1CTp COCTOHL/1. 28. ПОСКОJlЬКУ HOJlb BbI6L/1paeT ВЫХО,lJ" а e,lJ,L/1HHu.a  в ХО,lJ, , то TRISB заrру>каетс OxFE. 30. Ох33 пере,lJ,аетс В порт А посре,lJ,СТВОМ заrРУ3КL/1 WREG 3Ha4eHL/1eM Ох33 с после,lJ,УIO- w,e a,lJ,pecau.L/1e JlL/160 perL/1CTpa LATA HJlL/1 perHcTpa РОАТА L/1 ,lJ,aJlbHeWe BЫ,lJ,a4e Ох33 L/13 WREG. 32.3 34. IDЕ  ЭТО L/1HTerpL/1pOBaHHa снстема разра60ТКН, НСПОJlьзуема ,lJ,Jl nporpaMML/1pOBa- HL/1 МL/1КрОКОНТрОЛJlеров PIC как на 3ЫKe AcceM6Jlepa, так L/1 на 3ЫKe С, с nOCJle,lJ,YIO ще L/1ML/1Tau.L/1e ра60ТЫ nporpaMM. IDЕ может так>ке управлть nporpaMMaTopOM L/1 BHeWHL/1M 3MYJlTOpOM. 36. ЭМУЛЦL/1 L/1 npOrpaMML/1pOBaHL/1e. 38. Эмултор  ЭТО nporpaMMa, KOTopa CPYHKu.L/10HL/1pyeT так >ке, как L/1 МL/1КРОКОНТРОЛ- лер. 40. (а) Start:  ЭТО метка, KOTopa L/1СПОJlьзуетс AfI ссылкL/1 на коман,lJ,У, GOTO  3ТО MHeMOHL/14eCKOe 0603Ha4eHL/1e КО,lJ,а onepau.L/1L/1, а Heaven  3ТО 4eKa naMTL/1 , в KOTO PYIO комаН,lJ,а GOTO nepe,lJ,aeT уnравлеНL/1е в nporpaMMe. Она Ha3ЫBaeTC операн,lJ,ОМ. (Ь) ADDLW  ЭТО КО,lJ, onepau.L/1L/1, Ох29 - 3ТО OnepaH,lJ" за KOTOpbIML/1 CJle,lJ,yeT коммента- pL/1. (с) Loopy1: nре,lJ,ставлет c060 метку, MOVFF  ЭТО КО,lJ, onepau.HL/1, WREG L/1 Ох145 BJlIOTC onepaH,lJ,aML/1, за которымн CJle,lJ,yeT KOMMeHTapL/1. 42.Пр о u. есс acceM6JlL/1pOBaHL/1 заКJl104аетс В том, 4ТО acceM6Jlep 6ерет L/1CXO,lJ,HbI cpaJl L/1 nре06разует ero в 06beKTHЫ cpaJl. 44. 06beKTHЫ cpaJl  ЭТО cpaJl, KOTOpЫ СО,lJ,ерЖL/1Т HCXO,lJ,HYIO nporpaMMY на 3ЫKe Ас- сем6лера в ее ,lJ,B0L/14HO MaWL/1HHO BepCL/1L/1. Она BJleTC 06ъектом npou.ecca ас- ceM6JlL/1pOBaHL/1. 46. .Ikr cpaJl  ЭТО cpaJl KOMnOHOBKL/1, KOTOpЫ СО,lJ,ерЖL/1Т коман,lJ,Ы AfI nporpaMMbI ком- nОНОВЩL/1ка. 48. AL/1peKTL/1Ba СООЕ onpe,lJ,eJleT ceKu.L/1L/1 nporpaMMHoro КО,lJ,а L/1JlL/1 коман,lJ,. 50. AL/1peKTL/1Ba СООЕ Ох1 000 L/1HcpopML/1pyeT acceM6Jlep о том, 4ТО коман,lJ,Ы, которые CJle- ,lJ,YIOT ,lJ,aJlee в nporpaMMe, ,lJ,ОJlЖНЫ 6ыть pa3Mew,eHbI, Ha4L/1Ha с 4eKL/1 naMTH с a,lJ,pe сом Ох1000. 52. Этот оператор резеРВL/1рует 2 6aTa памтн AfI MeTKL/1 ОАТА 1. r ЛАВА 3 2. WREG 4. (а) MOVLW Ох34 (Ь) ADDLW 3 (с) IORLW 6 (d) MOVLB 2 (е) SUBLW 9 
548 Примененне МИКрОКОНТрОnJIеров PIC 18 6. MOVLW 3 ADDLW 9 IORLW 5 8. (а) BCF WREG, 2 (Ь) BSF Ох11, 3, ACCESS (с) BTG Ох1А, 5, ACCESS (d) BSF STATUS, 2 (е) BCF STATUS, N 10. КомаН,lJ,а BTFSS n03BOJleT проверТЬ 6нт perL/1CTpOBO 4eKL/1 naMTL/1 ,lJ,анных. ECJlL/1 npL/1 про верке окажетс, 4ТО 6L/1T YCTaHOBJleH (1), то cJle,lJ,YIOw,a комаН,lJ,а nporpaMMbI nponycKaeTc. 12. Банк ,lJ,OcTyna СО,lJ,ерЖL/1Т perL/1CTpOBbIe 4eKL/1 паМТL/1 ,lJ,анных в 06JlaCTL/1 от ОхООО .0.0 Ox07F L/1 от OxF80 АО OxFFF во MHOrL/1X BepCL/1X ML/1KpOKOHTpOJlJlepOB. 06paTL/1Te BHL/1Ma- HL/1e на то, 4ТО в некоторых BepCHX ML/1KpOKOHTpOJlJlepOB НСПОJlЬ3УIOТ ,lJ,Pyroe раз6L/1е- HL/1e пространства памтн. 14. ЛL/1тераJlьное СJlоженне ,lJ,06aBJleT константу, в то BpeM как 6aTOBoe СJlоженне .0.0- баВJlетпеременнуlO. 16. MOVLW Ох5А MOVWF Охl0, ACCESS MOVWF Ох20, ACCESS MOVEF ОхЗО, ACCESS 18. MUVLW WREG MOVF PRODL 20. PerL/1CTp COCTOHL/1 переноса cO,lJ,ep>KL/1T заL/1мствоваНL/1е ПОСJlе BbI4L/1TaHL/1. 22. MOVF Охl0, ACCESS ADDWF Ох20, ACCESS MOVWF Ох20, ACCESS MOVF Охll, ACCESS ADDWFC Ох21, ACCESS MOVWF Ох21, ACCESS MOVF Ох12, ACCESS ADDWFC Ох22, ACCESS MOVWF Ох22, ACCESS 24. AeKpeMeHTL/1pyeT perL/1CTpL/1pOBYIO 4eKY naMTH ,lJ,анных L/1 проnускает cJle,lJ,YIOw,ylO ко м ан,lJ,У, еСЛL/1 pe3YJlbТaT не равен HYJlIO. 26.0nepaH,lJ, POSTINC1 L/1СnОJlьзует FSR1 AfI Toro, 4т06ы a,D,pecOBaTb памть, а затем L/1HKpeMeHTL/1PyeT СО,lJ,еРЖL/1мое FSR1. 28. CO,lJ,ep>KL/1MOe WREG пре06разуетс в ,lJ,ОПОJlненне,lJ,О O,lJ,Horo, eCJlL/1 BbInOJlHeTC L/1C- КЛlO4аlOw,ее V1ЛV1 этоrо perHcTpa с OxFF. 30. КомаН,lJ,а GOTO П03ВОJlет проrрамме nрО,lJ,ОJlжатьс по Jl1060MY а,lJ,ресу в naMTL/1 nporpaMM, в то BpeM как комаН,lJ,а BRA L/1MeeT OrpaHL/14eHHYIO ,lJ,L/1CTaH u.L/1 10 переХО,lJ,а, paBHYIO :t 1024 от а,lJ,реса cJle,lJ,YIOw,e коман,lJ,Ы nporpaMMbI. 32. 3та комаН,lJ,а 06eCne4L/1BaeT TOJlbKO nepexo,lJ, от +127 .0.0  128 6aTOB от а,lJ,реса cJle ,lJ,YIOw,e коман,lJ,Ы проrраммы. 34. LFSR 1,ОхООО MOVLW WREG LOOPl: ADDWF POSTINCl CPFSEQ FSRIL BRA LOOPl 36. Kor,lJ,a BbInOJlHeTC комаН,lJ,а CALL, cOAep>KL/1MOe C4eT4L/1Ka коман,lJ, заНОСL/1ТС в стек. КомаН,lJ,а RETURN L/13BJleKaeT СО,lJ,еРЖL/1мое С4еТЧL/1ка коман,lJ, L/13 стека. Так как комаНАа CALL coxpaHeT адрес сле,lJ,УIOw,е за He коман,lJ,Ы nporpaMMbI в стеке, комаН,lJ,а 
ITрНnОlKення 549 RETURN B03Bpaw,aeT ynpaBneHLI1e комаН,lJ,е, сnе,lJ,УIOw,ей HenOCpe,lJ,CTBeHHO nocne ко- манды CALL. 38. npLl1Mep 3 17 LI1сnоnьзует коман,lJ,У DAW AfI Toro, чт06ы BbInOJlHLI1Tb npe06pa30BaHLI1e nOCpe,lJ,cTBoM A06aBneHLI1 6 к CO,lJ,ep>KLI1MoMY perLl1CTpa WREG, eCnLl1 значеНLI1е Mna,lJ,Wero nony6aTa npeBOCXO,lJ,LI1T 9. XOT К 6уквам ,lJ,On>KHO npLl16aBJlTbC ЧLl1СnО 7, npLl1 ,lJ,06aBne- HLI1L11 6 KOMaH,lJ,O DAW 7 nOnY4aeTc LI1HKpeMeHTLI1pOBaHLI1eM 3Ha4eHLI1 во WREG, eCnLl1 ero значеНLI1е равно Ох40 LI1JlLl1 60nbwe, как в СJlучае 6уквенных CLI1MBOnOB nOCJle npLl16aBne- HLI1 к HLI1M 6. 40. ;*********** Поисковая таблица Prime ************ PRIMES СООЕ РАСК Ox1FOO PRIME1 ОВ 1, 2, 3, 4, 5, 7, 11, 13, 17,19 ОВ 23, 29, 31, 37, 41, 43, 47, 53 ОВ 59, 61, 67, 71, 73, 79, 83, 89, 97 ОВ 101, 103, 107, 109, 113, 127 ОВ 131, 137, 139, 149, 151, 157, 163 ОВ 167, 173, 1 7 9, 181, 191, 193, 197, 199 ОВ 211, 223, 227, 229, 233, 239, 241, 251 ОВ О ;конец таблицы ************** Функция PRIME *************** Возвращает Carry 1, если WREG = prime Возвращает Carry О, если WREG не равен prime PRIME: MOVWF PROOL ;сохраняет число в PROOL MOVLW О ;адресует поисковую таблицу MOVWF TBLPTRL MOVLW Ox1F MOVWF TBLPTRH MOVLW О MOVWF TBLPTRU PRIME 1 : TBLRO*+ ;получение первичноrо числа MOVLW О CPFSEQ TABLAT BRA PRIME2 ;если не конец таблицы BCF STATUS, С ;сброс переноса MOVFF PROOL, WREG RETURN PRIME2: MOVFF PROOL, WREG CPFSEQ TABLAT BRA PRIME1 ;если не найдено BSF STATUS, С ;установка переноса для prime 
550 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 MOVFF PRODL, WREG RETURN 42. Памть, Tpe6yeMa npL/1 вызове макроса, реF.lна 06ъему naMTL/1, He06xo,lJ,L/1MOMY AfI XpaHeHL/1 команд макроса 6ез kaKL/1X-nL/160 м..;полнитеnьных 6aTOB AfI коман,lJ, call или return. r ЛАВА 4 2. Проrраммны стек  зто 06nacTb naMTL/1 BHYTpL/1 ML/1KpOKOHTponnepa, KOTopa СО,lJ,ер- >KL/1T адрес возврата L/1З Функu.L/1И L/1nИ nодnроrраммы. 4. (а) MOVWF POSTDEC1 (Ь) MOVF PREINC1, О (с) MOVFF PRODL, POSTDEC1 L/1 MOVFF PRODH,POSTDEC1 6. PRODL L/1звnекаетс первым, nOCKOJlbKY стек ,lJ,анных npe,lJ,CTaBneT c060 заnОМL/1- наюw,ее YCTPOCTBO, ра60таюw,ее по npL/1Hu.L/1nY "первым вошеn - nOCJle,lJ,HL/1M BbIWeJl". 8. Проrраммное 06есnечение ра60ТЫ с очере,lJ,МL/1 ,lJ,OJl>KHO распознавать COCTOHL/1e nYCTO L/1 заnоnненно очере,lJ,L/1. 10. 06JlaCTb naMTL/1, OTBe,lJ,eHHa no,lJ, очередь, L/1СnОJlьзуетс nporpaMMaML/1 вновь L/1 вновь, n03TOMY она paCCMaTpL/1BaeTC как u.L/1KJlL/1чна naMTb. 12. Упакованные ВСО (,lJ,ВОL/1ЧНО KO,lJ,L/1pOBaHHbIe ,lJ,еСТL/1чные ЧL/1сnа) coxpaHIOTC как ,lJ,ва 4L/1Cna на 6aT, в то BpeM как HeynaKoBaHHbIe 'BCD-ЧL/1СJlа coxpaHIOTC как О,lJ,НО ЧL/1СnО на 6aT. 14. BCD4L/1cna ВЫЧL/1таютс npL/1 L/1CnOnb30BaHL/1L/1 CnO>KeHL/1 с ,lJ,OnOnHeHL/1eM .0.0 ,lJ,eCTL/1, npL/1 этом команда DAW мо>кет L/1CnOnb30BaTbC AfI KOPpeKu.L/1L/1 pe3YnbTaTa. 16. ВСD-ЧL/1сnа L/1CnOJlb3YIOTC в nporpaMMax вместо ,lJ,ВОL/1ЧНЫХ AfI 3KOHOML/1L/1 BpeMeHL/1, He06xo,lJ,L/1MOrO AfI BbInOnHeHL/1 npe06pa30BaHL/1 ме)l(,lJ,У,lJ,ВОL/1ЧНЫМL/1 L/1 ВСDЧНСJlаМL/1. 18. Команда YMHO>KeHL/1 L/1СnОJlьзуетс AfI 16раЗр,lJ,ноrо YMHO>KeHL/1 COrJlaCHO aJlro- pL/1TMY nepeKpeCTHoro YMHO>KeHL/1, KOTOpЫ paCCMaTpL/1BaJlC в rnaBe 4 L/1 HJlJlIOCTpL/1pO- Banc npHMepoM 49. 20. ;************* функция MULTAB ************* MULTAB MULWF TABLAT MOVFF PRODL, WREG RETURN 22. Чт06ы YMHO>KL/1Tb ЧL/1сnа со знаком, 3TL/1 ЧL/1сnа сначаnа nроверютс L/1 в СJlучае OTpL/1- u.aTeJlbHOCTL/1 OHL/1 деnаютс nOnO>KL/1TeJlbHbIML/1. Pe3YJlbTaT 6удет OTpL/1u.aTenbHbIM, еСJlИ два 4L/1Cna, ВnIOЩL/1ес MHO>KL/1TeJlML/1, L/1MeIOT разные знаковые разр,lJ,Ы. V13MeHeHL/1e знака BbInOJlHeTC с L/1CnOnb30BaHL/1eM двух ,lJ,OnOJlHeHL/1. . 24. CaMЫ nУЧWL/1 метод ,lJ,eJleHL/1 на 4 заKJlючаетс в C,lJ,BL/1re ЧL/1СJlа вправо на ,lJ,ва раз- pдa. ПрL/1 зтом npe,lJ,nonaraeTC, что ЧL/1СnО BJleTC nOnO>KHTeJlbHblM L/1JlL/1 6еззнаковым. 26. Аа, L/1СnОnЬЗУ алrОРL/1ТМ, OnL/1CaHHbI в тексте, XOT в зтом СJlучае onepau.L/1 L/1 nOTpe- 6ует 60nbwero BpeMeHL/1, чем в сnучае L/1CnOJlb30BaHL/1 MeHbWHx ,lJ,enL/1TeJle. 28. E,o,L/1HCTBeHHoe L/1зменение, He06xo,lJ,L/1MOe AfI Toro, чт06ы BbInOJlHHTb восьмернчное npe06- разоваНL/1е - зто то, что коман,о,а MOVLW .10 ,lJ,OJl>KHa 6ыть L/13MeHeHa на MOVLW .8, 6Jlaro- Aap чему nporpaMMa 6У,lJ,ет reHepL/1pOBaTb восьмерL/1ЧНЫ pe3YnbTaT. 30. ЧL/1СnО nре06разуетс L/13 ,lJ,еСТL/1Чноrо в ,lJ,ВОL/1чное nOcpe,lJ,CTBOM YMHO>KeHL/1 на 1 О pe3YnbТaTa, KOTOpЫ BneTC nервоначаJlЬНО HYJleM, с nOCJle,lJ,YIOw,L/1M ,lJ,06aBJleHL/1eM АеСТL/1ЧНО u.L/1cppbI к pe3YJlbТaTY. 3TL/1 onepau.L/1L/1 YMHO>KeHL/1 L/1 ,lJ,06aBJleHH nOBTOp- ютс АО тех пор, пока НL/1какие ,lJ,OnOnHL/1TenbHbIe u.L/1cppbI не 6у,lJ,уТ nOBJlTbC в ,lJ,ec- TL/14HOM ЧL/1СJlе. 
ITрНnОlKення 551 32. КомаН,lJ,а Me)l(,lJ,Y BinBCDs LI1 BinBCDs1 тре6ует AfI CBoero BbInOnHeHLI1 4,5 мкс, ко- манда Me)l(,lJ,Y BinBCDs1 LI1 BinBCDs2 тре6ует AfI CBoero BbInOnHeHLI1 4,5 мкс nnlOc BpeM, ну>кное M BbInOJlHeHLI1 функu.LI1L11 Div в рамках LI1тераu. LI1 Й, nрОИСХОАw,LI1Х .0.0 тех пор, пока 4L11CnO не станет HyneBbIM. Функu.LI1 Div тре6ует M CBoero BbInOnHeHLI1 54 мкс, так 4ТО тре6уемое BpeM равно 59,5 мкс на LI1тераu.LI1Ю. BpeM, тре6уемое M BbInOnHeHLI1 команд Me)l(,lJ,Y BinBCDs2 LI1 оператором KOHu.a функu.LI1L11, равно 4,5 мкс. TaKLI1M 06раЗ0М, 06w,ee BpeM 6У,lJ,ет равно 9,0 мкс nnlOc 59,5, умно>кенное на ЧLl1СnО LI1Tepau.LI1. ECnLl1 тре6уютс TpLl1 LI1Tepau.LI1L11, то 06w,ee BpeM 6У,lJ,ет равно 187,5 мкс. 34. 3.5 мкс 36. MyFuI1c: CALL GetData SUBLW Ох59 BZ MyFunc1 ADDLW Ох59 SUBLW OxFO BZ RETURN ;сдвиТ' вправо ;отпускание клавиши MyFunc1 : CLRF Ох10, ACCESS REUTRN MyFunc2: SUBLW Ох59 BZ MyFunct3 RETURN MyFunc3: SETF Ох10, ACCESS RETURN r ЛАВА 5 2. Код AcceM6Jlepa в nporpaMMax на зыке С nOMew,aeTC ме>КАУ onepaTOpaMLI1 asm LI1 endasm. КОАЫ acceM6nepa, LI1СnОJlьзуемые в nporpaMMax на зыке С, не AOn>KHbI со- Аер>кать CHMBOnOB T04KLI1 с заnто LI1 ,lJ,on>KHbI ВKJlЮЧLl1ТЬ все non коман,lJ,. 4. Оператор #pragma config LI1СnОJlьзуетс AfI Toro, 4т06ы КОНФLl1rУРLl1ровать MLI1KpO- KOHTpOnJlep M ero nocne,lJ,YIOw,e ра60ТЫ. 6. Функu.LI1 Delay1 КТСУх вызывает временную за,о,ер>кку в 1000 командных u.LI1KJlOB. npH TaKTOBO частоте в 4 Mru., KOMaH,lJ,HЫ u.LI1KJl заннмает 1,0 мкс, так что Функu.н Delay1 КТСУх вызывает временную за,о,ер>кку, равную 1,0 мс. nOCKonbKY Tpe6yeTC 10 МС, то В nporpaMMe исnоnьзуетс комаН,lJ,а Delay1KTCYx (10);. 8. while (1) { PORTBbits.RBO Лl; // бит дополнения Delay10KTCYx (100); // ожидание одну секунду } 10. char bitpattern  О; PORTBbits.RB3  1; while (bitPattern ! 16) { PORTB  PORTB & OxFO I bitpattern; // выдача входных битов if (bitPattern ! OxOF && PORTAbits.RA4 I 1 
552 ITримененне МИКрОКОНТроnnеров PIC18 I I bitPattern ==== OxOF && PORTAbits.RA4 !== О) PORTBbits.RB3 == о; // плохо bitPattern++; } 12. Директива rom near onpe,lJ,eneT Аанные В паrv:ятн nporpaMM по адресам от ОхОООО АО OxFFFF (16-ра3flяДн!;1 указатеJlЬ), а ДL/1реКТL/1ва rom far onpe,lJ,eneT данные по а,lJ,- ресам от ОхОООООО до OxFFFFFF (24разрдны указатеnь). 14. Ka>KAЫ вход раздеnетс на ,lJ,ве 4aCTL/1. Самые npaBbIe TpL/1 6L/1Ta СОАер>кат значеНL/1е ЧL/1сла точек н TL/1pe, а KpaHL/1e левые nTb 6L/1TOB СО,lJ,ер>кат структуру точек L/1 TL/1pe ко- Аа Морзе. 16. while (PORTBbits.RB2 == 1); 18.0х101 20. nepeMeHHa count L/1сnоnьзуетс дn Toro, чт06ы указать, CKOJlbKO nерио,lJ,ОВ по 20 мкс заКJlючаетс В WL/1pL/1He L/1MnYnbca. ECnL/1 nepeMeHHa count равна 1 L/1nL/1 2, то зто 3Ha4L/1T, что L/1МnУЛЬС L/1MeeT COCTOHL/1e, cooTBeTCTBYIOw,ee nоrL/1ческо еДИНL/1u.е, а ес- ЛL/1 значенне count nреВОСХОДL/1Т 2, то зто знаЧL/1Т, что L/1MnYJlbC L/1MeeT COCTOHL/1e, со- ответствующее лоrН4ескому HYnlO. 22. Оператор states[state]()ccbInaeTc на nонсковую Ta6JlL/1u.y указатеnе на pa3nL/14HbIe ФУНКЦL/1Н L/1 вызывает L/1X, L/1CnOnb3Y nеременную state как ссыпку. 24. float хс [11] ; float сар == 0.000001; in t f; char count == о; for (f == 100; f <== 1000; f +== 100) xc[count++] == 1 / (6.2832 * f * сар); r ЛАВА 6 2. Корпус THna PDIP - зто nnacTMaccoBbI корпус С ,lJ,BOHЫM p,lJ,OM ВЫВО,lJ,ОВ, он HaL/160 лее 4асто нсnоnьзуетс npL/1 L/1зrотовnеНL/1L/1 опытных 06разu.ов. 4. Корпус THna SSOP - зто KOMnaKTHbI корпус He60nbWL/1X размеров с реnьефно структурой. 6. ВЫВОА VDD - зто ВЫ 80.0., nре,lJ,назначенны AfI nО,lJ,KJlючеНL/1 nOJlO>KL/1TenbHOro попюса элеКТРОnL/1таНL/1, которое часто равно 5 В, а ВЫВО,lJ, VSS зто ВЫВО,lJ, AfI nО,lJ,KJllOчеНL/1 землн. 8. 12 мА 10.8.5 мА 12.15мс 14. ОхОООО 16. CTOpO>KeBO TaMep L/1сnоnьзуетс AfI с6роса ML/1KpOKOHTponnepa BCKL/1 раз, коrда он nepenonHeTc. Ero назначеНL/1ем BneTc nерезаnуск CL/1CTeMbI в сnучае, eCnL/1 она "заВL/1сnа" по kaKL/1M-nL/160 npL/14L/1HaM. 18. 4. О мс 20. С6рос стека nрОИСХО,lJ,L/1Т в сnучае, коrда он nepenOnHeTc JlL/160 деnаетс попытка нзвnечеНL/1 ,lJ,анных L/1З nycToro стека, чеrо не npoL/1CXOAL/1T во BpeM HOpMaJlbHO ра- 60ТЫ nporpaMMHoro 06eCne4eHL/1, ОАнако зто мо>кет np0L/130TL/1, eCnL/1 ML/1KpOKOH троплер станет 06ьектом воздеСТВL/1 помех. 
ITрНnОlKення 553 22. 40 мrц 24. 4 26. КОА RCIO L/1СnОJlьзуетс npL/1 ра60те ML/1KpOKOHTpOJlnepa с тактовым RC-rенератором. В этом cnY4ae WTbIpeK OSC2 L/1сnоnьзуетс как WTbIpeK ввода-вывода. 28. Посредством НСПОnЬЗ0ваНL/1 оператора #pragmaconfig OSC = HSPLL. 32. CL/1CTeMa эnектронно L/1rpbI в KOCTL/1 вы6ирает сnучаные ЧL/1СJlа nocpe,lJ,cTBoM L/1HKpe- MeHTL/1pOBaHH ЧL/1сnа в то BpeM как nOnb30BaTeJlb YAep>KL/1BaeT кнопку в на>катом со- CTOHL/1H. Поскоnьку L/1HKpeMeHTL/1pOBaHL/1e ЧL/1сnа nрОL/1СХОДL/1Т с BЫCOKO скоростью, nОJlьзоватеnь не мо>кет BnL/1Tb на 3Ha4eHL/1e 4L/1Cna, nОДСЧL/1тыва, как ,lJ,onro он yдep >KL/1BaeT кнопку. 34. nОДСЧL/1танное значенне равно 475 Ом, однако nocKonbKY зто значеНL/1е не BneTc стаНАартным HOML/1HanOM pe3L/1CTOpa, то в u.enL/1 L/1сnоnьзуетс pe3L/1CTOp на 470 ОМ. 36.ADCON1 == Ox7f; // проrрамма для цифровых штырьков TRISB = О; // порт в  выходной 38. Прерывание  это annapaTHo L/1ЛН nporpaMMHO-L/1НL/1ЦL/1аnН3L/1рованны ВЫ30В функ- ЦL/1Н. 40. 3TL/1 операторы дают указаНL/1е KOMnL/1nTopy L/1CnOnb30BaTb вектор BbICOKOnpL/10pL/1TeT- Horo npepbIBaHL/1 по адресу ОхОО08 M функu.L/1L/1 MyHighlnt. 42. AaHHa команда разреwает 880.0. BbICOKOnpL/10pL/1TeTHbIX npepbIBaHL/1. 44. KBapцeBЫ reHepaTop на 32,768 Kru. nО,lJ,КnЮ4ен к WTbIPbKY TaKToBoro ВХОАа TaMepa 1, npL/1 зтом TaMep 1 npOrpaMML/1PyeTc на ,lJ,eneHL/1e отсчета на 32768, 4ТО вызывает npepbIBaHH с частото ровно 1 раз всеКУНАУ. 46. ECnL/1 фnаr npepbIBaHL/1 (IF) AfI npepbIBaHL/1 не c6poweH, то npepbIBaHL/1e B03HL/1KHeT HeMeAfleHHO после выхода L/13 nроu.едуры 06cnY>KL/1BaHL/1 npepbIBaHL/1. 48. 0.00323 В 50. Бнт GO perL/1CTpa ADCON YCTaHaBnL/1BaeTC в nOrL/14ecKYIO e,lJ,L/1HL/1u.y M заnуска npe06- pa30BaHL/1. 52. An счнтыванн нз 3СПnЗУ Аанных 6L/1T EEPGD c6paCЫBaeTC, а,lJ,рес noCbInaeTc в perL/1CTp EEADR, 6L/1T RD YCTaHaBJlL/1BaeTC, а данные затем СЧL/1тываютс L/13 perL/1CTpa ЕЕОА т А. 54. 4 мс 56. Вход ССР nporpaMMHpyeTc на nереКnЮ4еНL/1е по Ka)l(,lJ,OMY nOnO>KHTenbHoMY срронту CHrHaJla. Проrрамма nОАСЧL/1тывает paCCTOHL/1e Me)l(,lJ,Y ,lJ,BYM nоnо>китеJlЬНЫМL/1 фронтаМL/1 с waroM днскреТНОСТL/1 в 8 мс, затем по полученному отсчету onpe,lJ,eneT- c частота. r ЛАВА 7 2. От 1 О АО 20 мс 4. ПереКЛЮ4атеnь (Ох81); 6. НаrРУЗ0чные резнсторы вnютс не06ХО,lJ,ИМЫМL/1 всnеДСТВL/1е Toro, 4ТО разрыв u.enL/1 не влетс AonycTL/1MbIM COCTOHL/1eM ВХОАа ML/1KpOKOHTponnepa. "ВL/1СЧL/1" ВХО,lJ, B- летс 06ьектом воздеСТВL/1 помех. 8. / I 1/ коды клавиш для клавиатуры с матрицей 4 х 6, // сохраненные как константы в памяти проrрамм // rom near char lookupKey[] == 1, 4, 7, 10, 2, 5, 8, О, // левый столбец 
554 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 3, 6, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19 } ; // // использует функцию Switch из примера 71 // unsigned char Кеу (void) { #define MASK OxOf #define ROWS 6 int а; unsigned char keyCode; PORTB = keyCode = о; // Swi tch (MASK); PORTB = OxFEi / / while ((PORTA & MASK) MASK) PORTB (PORTB « 1) I 1; keyCode += ROWSi // установка маски // задание количества столбцов очистка порта В и keyCode / / компенсация дребезТ'а контактов и ожидание // нажатия какой-либо клавиши выбор самоТ'о левоТ'о столбца // пока не будет обнаружена клавиша // получение следующеТ'о столбца // добавление. строки к коду ключа } for (а = 1; а != о; а «= 1) { // нахождение строки if ((PORTA & а) == О) break; keyCode++; } return lookupKey [keyCode] ; } / / просмотр на нахождени:е правильноro кода клавиши 
ITpHnolKeHHSI 555 10. (CMOTpLl1Te pLl1CYHOK С-1) 5.0У R1 82 01 светодиод  R2 О1 2N2222 1ЭК Рисунок С-1 12. (CMOTpLl1Te pLl1CYHOK С-2) УСС R1 330 R2 330 О1 О2 светодиод RЗ RВO 01 2N2222 39К R4 RBI 02 2N2222 39К  PLI1CYHOK с- 2 
556 ITримененне МИКрОКОНТроnnеров PIC18 11 ****************** ФУНКЦИЯ Flash ******************* 1I 11 использует delays.h 11 void Flash (void) { char а; PORTB = 1; for (а  О; а < 20; а++) { Delay10KTCYx(50) ; PORTB I\ 3; 11 1/2 секунды } 14. БnаrОАар HHepu.HoHHOCTH чеJlове4ескоrо зреНLI1, Ka>KeTC, 4ТО OHLI1 CBeTTC nOCTO- HHO. 16. 6 18. 8ЫВОА VEE ЖК-ННДLl1катора nодсое,lJ,LI1нетс к ОТВОАУ nOTeHu.LI10MeTpa на 1 О кОм, подключенному Me)l(,lJ,Y 58 LI1 земnе. 20. 8XOДHO wTbIpeK Е ЖК-LI1НАLI1катора ра60тает как вход TaKTOBO 4астоты, CTp06L11pylO- W,H ввод данных в ЖК-LI1НДLl1катор через ЩТЫрЬКLI1 ВВОАа Аанных. 22. Курсор nepeMew,aeTc посредством nереАачи в ЖК-LI1Н,lJ,LI1катор ero nозиu.LI1L11 с norLl1- 4eCKO e,lJ,LI1HLI1u.e в 6L11TOBO n03L11u.LI1L11 7. 3та n03L11u.LI1 nepeAaeTc npLl1 COCTOHLI1L11 cLI1r- Hana на WTbIpbKe RS, равном nоrLl1ческому нуnю. 24. 1I ************ ФУНКЦИЯ Cursor ************ 11 I1 void Cursor (char position) PORTB  position » 4; PORTBbits.RB4  1; PORTBbits.RB4  о; PORTB  position & OxOF; PORTBbits.RB4 1; PORTBbits.RB4 о; } 26.0х01, как показано в ФУНКЦИИ Clear. 1I ************* ФУНКЦИЯ Clear ************ 1I 1I void Clear (void) PORTB  о; PORTBbits.RB4 1; PORTBbits.RB4 о; PORTB  1; PORTBbits.RB4 .1; PORTBbits.RB4 о; } 28. Основным npeLl1Myw,eCTBOM 8ФV1 (вакуумных cpnyopecu.eHTHbIX LI1H,lJ,LI1KaTOpOB BneTC нх pKOCTb AfI ЛlO60rо TLI1na oCBew,eHLI1 LI1 LI1X cnoc06HOCTb к СНLI1>кеНLI1Ю pKOCTLI1 све- 4eHLI1 в СJlучае He06xo,lJ,LI1MOCTLI1. 
ITрИnОlKеннSI 557 30. Шаrовые зnектромоторы называютс warOBbIMLI1 BCne,lJ,CTBLI1e TOrO, что LI1X Ban nOBO- раЧLl1ваетс ДLl1скретнымн WaraMLI1. 32. Полны war соответствует повороту BaJla waroBoro зnектромотора от O,lJ,HO nОJlЮС HO KaTYWKLI1,lJ,O друrой, в то BpeM как nOnOBLI1HHbI war соответствует повороту Bana АО ТОЧКLI1, pacnOJlO>KeHHO nocepe,lJ,LI1He Me)l(,lJ,y nОnЮСНЫМLI1 KaTywKaMLI1. nOJlOBLI1HHbI war BbInOnHeTc посредством заnLl1тываНLI1 npOTLI1BOnOnO>KHbIX nОnЮСНЫХ KaTyweK плюс сосеДНLI1Х каryшек. 34. Посре,lJ,СТВОМ LI13MeHeHLI1 WLl1pHHbI LI1MnYnbca, мо>кно изменть среднее КОJlLl1чество тока, nротекающеrо через 3JlenpOMOTOp, за счет чеrо LI13MeHeTc скорость Bpaw,e- HH Bana зnектромотора. 36. 06paTHЫ LI1ЛLl1 демпферный ДLl10,lJ, ШУНТLI1рует ток, reHepHpyeMbI возмуw,еНLI1ем зnек TpoMarHHTHoro nол 3JleKTpOMoTopa, репе LI1nLl1 ИН,lJ,уктнвностью, ВКЛЮ4енно napan- лельно TpaH3L11CTOPy, с u.елью nредотвраw,еНLI1 выхода Н3 CTpO злементов контура. 38. ПрLl1мерно nоловннна скорость. 40. (CMOTpLl1Te рнсунок С-3) 12У RВЗ L1 соnеноид 01 .u.HO.u. PLl1CYHOK сз 11 ************* ФУНКЦИЯ Fire ************* I1 11 uses delays.h 1I void Fire (void) { РОRТВЬits.RВЗ = 1; Delay10KTCYx(70) ; РОRТВЬits.RВЗ = О; } 42.0000,0001,0010,0011,0101,0111,0110,0100 44. 125 46. lеСJlИ caMЫ npaBbI 6L11T Ь 6удет в COCTOHLI1L11 JlоrLl1ческо e,lJ,LI1HLI1u.bI, то temp 6удет HHKpeMeHTLI1pOBaTbc с u.eJlblO oKpyrJleHLI1. 52. 38 KHz 
558 ITpHMeHeHHe МИКрОКОНТроnлеров PIC18 r ЛАВА 8 2. ОхО018 4. Бнт IPEN наХОДL/1ТС в perL/1CTpe RCON. 6. npepbIBaHHe по L/1зменеНL/1Ю COCTOHL/1 06CJlY>KL/1BaeTC первым, n03ToMY оно L/1MeeT BbICOKL/1 npHOpL/1TeT. 8. BbIcoKonpL/1opL/1TeTHbIe npepbIBaHL/1 разреwены. 10. Разреwенне ВХОАа INT1. 12. PIE1 bits.TMR21E = 1; 14. INTCON 16. Возврат L/1З npepbIBaHL/1 устанаВЛL/1вает 6L/1T фnаrа GIE/GEIH ,lJ,)I(n nOBTopHoro разре- шеНL/1 прерывани. ECnL/1 BbInonHeTc команда RETFIE 1, то 6нт фnаrа GEIL уста- HaBJlL/1BaeTC ДJl nOBTopHoro разреwеНL/1 HL/13KOnpL/10pL/1TeTHbIX nрерывани. 18. ННЗКОnРL/10РL/1тетное npepbIBaHL/1e в npL/1Mepe 8-3 ynpaBneT TaMepOM peaJlbHOrO BpeMeHL/1. 20. ОДL/1Н раз Ka)l(,lJ,bIe 1,024 мс. 22. Асннхронные nосnедоватеJlьные ,lJ,анные  зто данные, которые nОСЫJlаютс 6ез CHHXpOCL/1rHanoB. Вместо СL/1НХРОИМnУJlЬСОВ L/1сnоnьзуетс передача CTapToBoro L/1 CTOnOBoro 6L/1Ta в AOnOJlHeHL/1e к L/1нформаu.ионным 6L/1TaM. 24. 8 L/1нформаu.L/10ННЫХ 6L/1TOB L/1 1 cton-6L/1Т 26. UART L/1nL/1 USART 28. ПрL/1емннк BbICTaBJleT nрерывание, n03TOMY nриннмаемые ,lJ,анные не терютс. 30. Одно L/1З ypaBHeHH L/1З примера 8-4 нсnоnьзуетс ДJl расчета значеНL/1, nOMew,ae- Moro в perL/1CTp SPBRG. An YCTaHOBKL/1 CKOpOCTL/1 ннформаu.L/10нноrо 06мена, paBHO 1200, SPBRG nporpaMMHpyeTc на 51 AfI YCTaHOBKL/1 BЫCOKO CKOpOCTL/1, AfI установ- кн HL/13KO скоростн perL/1CTp SPBRG npOrpaMML/1pyeTc на 207. 32. Кажда 04ередь L/1MeeT 16. 34. Флаr npepbIBaHL/1 npHeMHL/1Ka c6paCЫBaeTC, а Аанные L/1З RCREG nOMew,aIOTC во входную 04ередь. 36. TpeTL/1 параметр в bool retVal = WriteFile(hPort,Data,l, &byteswritten,NULL) ; L/13MeHeTC  ero значенне ДОJl>КНО 6ыть равно ДJlL/1He CTpOKL/1 npL/1 заnиси 60nee од- Horo 6aTa. 38. Преам6ула COCTOL/1T по KpaHe мере L/13 nOCJleAOBaTenbHOCTL/1 AeCTH 1 О 6L/1TOB, нахо- дщнхс в eAL/1HL/14HOM COCTOHL/1L/1. 40. К ЭСППЗУ 06раw,аютс функu.ин EERead v1 EEWrite, nрL/1веденные в nporpaMMe. 42. Функu.L/1 wait4Bit npoBepeT COCTOHL/1e 6L/1Ta фnаrа с тем, чт06ы pacn03HaTb факт nостуnленн с рельс в DCCcL/1cTeMY 6L/1Ta данных. 44. TaMep О L/1сnоnьзуетс дл Toro, 4т06ы L/13MepL/1Tb WHPHHY L/1MnYJlbCa в DCC-сL/1стеме с днскретностью в j мкс. 46. BCKH раз, KorAa нсnользуетс MaCCL/1B, 60JlbWL/1 4ем 256 6aTOB, cu.eHapL/1 KOMnO- HOBw,L/1Ka AOn>KeH L/13MeHTbC с тем, чт06ы 6bIn 06bBneH 60nbWL/1 MaCCL/1B. 48. МАХ1483  зто схема ynpaBneHL/1/npL/1eMHL/1Ka nHHL/1H, KOTopa nOAAep>KL/1BaeT стан- Аарт ннтерфеса RS-422, 06есnеЧL/1ва nOCJle,lJ,oBaTenbHbI L/1нформаu.L/10ННЫ 06мен npL/1 AflL/1He nL/1НИL/1 BnnoTb .0.0 4000 фуТОВ. 50. COeAL/1HL/1TenbHbI разьем RJ-45  зто CTaH,lJ,apTHЫ разьем, исnоnьзуемы с ка6е- neM THna СА Т5, а так>ке в ceTX. 52. Аа,  wтрих-ко,lJ, "Ко,lJ, 128" nOAAep>KL/1BaeT ancpaBL/1THbIe ,lJ,анные. 56. Это проверка npOBepKL/1 npaBL/1nbHOCTH Аанных в WTpL/1X-КОАе KOAL/1pOBKL/1 "КОА 128". 58. BpeM от06ражаетс cneBa от nL/1HL/1H 2, а Аанные отобра>каютс справа от nL/1HL/1L/1 2. 
ITрНJIОlKення 559 60. OCHOBHO u.L/1KJl nporpaMMbI npoBepeT, на>ката JlL/1 KJlаВL/1ша, есть JlL/1 ,lJ,анные в сети L/1 6bIJla BCTaBJleHa JlL/1 каРТ04ка. 62. Она npOBepeT BXO,lJ,HYIO 04ере,lJ,Ь С тем, 4т06ы BL/1,lJ,eTb, npL/16bIJlL/1 JlL/1 ,lJ,анные L/13 CeTL/1. 64. DS275 cpopML/1PyeT L/1HTepcpec С nOCJle,lJ,OBaTeJlbHbIM COMnopToM ПК. YpOBHL/1 CL/1rHa Jla СОМ-порта равны +/- 12 В, OHL/1 ,lJ,OJl>KHbI 6ыть npe06pa30BaHbI ДJl ML/1KpOKOHTpOJl- Jlepa в ypOBHL/1 ПЛ. 66. TpaH3L/1cTop nOCbIJlaeT CL/1rHaJl, KOTOpЫ реверсирует JlL/1НИIO в nOJlY,lJ,YnJleKCHO CeTL/1. 68. MO,lJ,YJlb 3JleKTpOnL/1TaHL/1 06eCne4L/1BaeT ЭJlеКТРОnL/1тание CL/1CTeMbI, кроме Toro он cpopML/1PyeT L/1HTepcpec CL/1CTeMbI С СОМ-портом nK L/1 ynpaBJleT ceTblO. r ЛАВА 9 2. npepbIBaHL/1e L/1СnОJlьзуетс ДJl Toro, 4т06ы 06HapY>KL/1Tb сракт OTKpbITL/1 ,lJ,Bepu.bI в те4енне u.HKJla MЫTb nocY,lJ,bI. 4. (См. pL/1C. C4) I I I I заnОJ",wreль"ый UJJ соленоид I I ( t Элеl\ТрОIOТОр Ifасо<:а Дренажный клапан РаСПРl:делитель: МОlOщеrо : средства : I I Наrревательный: элемент : I о 10 15 20 25 30 35 40 45 50 минУ1Ы PL/1C. С-4. BpeMeHHa ,lJ,L/1arpaMMa u.L/1KJla стерL/1JlL/1заЦL/1L/1; ВО,lJ,а HarpeBaeTC 10. Ава. O,lJ,L/1H от даТ4L/1ка CKOpOCTL/1 Bpaw,eHL/1 BaJla nepe,lJ,aT04Horo механизма L/1 O,lJ,L/1H от за,lJ,аТЧL/1ка BpeMeHL/1 L/1JlL/1 TaMepa. 12. 13 Ватт 14. RS.422 L/1JlH RS.485 16. СL/1НХрОНL/1заu.L/1 всех nО,lJ,4иненных YCTPOCTB. 18. Реле НСnОJlьзуетс только по npL/14L/1He CTOL/1MOCTL/1 CL/1CTeMbI. KOHTpoJlJlep ЭJlектромо- тора, который n03BOJleT ynpaBJlTb Bpaw,eHL/1eM ЭJlектромотора в 060L/1X HanpaBJleHL/1- x, CTOL/1T 60Jlbwe. 22. YnpaBJleHL/1e CL/1CTeMO HarpeBa/KoH,lJ,L/1u.L/10HL/1pOBaHL/1 В03,lJ,уха (HVAC) ocyw,ecTBJleTC СL/1rналаМL/1 24 В nepeMeHHoro тока, которые cpOpML/1PYIOTC в ,lJ,анном npL/1JlO>KeHL/1L/1 за С4ет L/1CnOnb30BaHL/1 peJle, которые ynpaBJlIOTC ML/1KpOCXeMaML/1 уnраВJlени TIP120. 24. Нет. TeMnepTypa HapY>KHOrO В03,lJ,уха ,lJ,OJl>KHa 6ыть L/13BeCTHo ДJl Toro, ..4т06ы onpe- деJl, L/1Tb He06xo,lJ,L/1MO JlL/1 KOH,lJ,L/1u.L/10HL/1pOBaHL/1e В03,lJ,уха L/1JlL/1 ero HarpeB. 26. ЭСnnЗУ L/1СnОJlьзуетс ДJl coXpaHeHL/1 параметров HaCTpOKL/1 CL/1CTeMbI. 
560 ITpHMeHeHHe MHKpOKOHTpOnnepOB РI С 18 rЛАВА 10 2. V1HTepcpec С ЭСnnЗУ BJleTC nOCJle,lJ,OBaTeJlbHbIM, поэтому nporpaMMHoe 06ecne4e- HL/1e SPI L/1JlL/1 1 2 С мо>кет L/1CnOJlb30BaTbC ,lJ,Jl этоrо L/1HTepcpeca. 4. ABXO,lJ,Ы nporpaMMHpYIOTC так, 4т06ы вы6рать 3СnnЗУ. 6. 100 Kru. 8. СL/1rнал АСК npoBepeTc nOCJle заnL/1СL/1 в ЭСnПЗУ - он указывает на то, 4ТО заnL/1СЬ заверwена. 10. Первое 3СnnЗУ Bы6HpaeTC, eCnL/1 а,о,рес меньше, 4ем ох8000, а APyroe BbI6L/1paeTC, eCnL/1 а,lJ,рес ле>КL/1Т в ,lJ,L/1ana30He от Ох8000,lJ,О OxFFFF. 14. OCHOBHO ЦL/1КЛ nporpaMMbI npoBepeT, 6bIJl JlL/1 вве,lJ,ен npaBL/1JlbHbI UPC- КО,lJ,. 16. КОА oT06pa>KaeTC на экране ЖКL/1Н,lJ,L/1катора, nOnb30BaTeJlb заnраWL/1ваетс о KOJlL/1- честве e,lJ,L/1HL/1u. товара, вве,lJ,енное 3Ha4eHL/1e coxpaHeTC в 04epe,lJ,L/1 3СnnЗУ ДJl no сле,lJ,УIOw,е ero nepeAa4L/1 в nK 4ерез nOCJle,lJ,OBaTeJlbHbI L/1HTepcpec. 18. Бnок Ha4aJlbHO заrРУ3КL/1  это заЩL/1щенна 06naCTb naMTL/1, 06eCne4L/1BalOw,a npo странство ДJl XpaHeHL/1 nporpaMMbI Ha4aJlbHO заrРУ3КL/1. 20. Cnoc06HoCTb nepenpOrpaMML/1pOBaHL/1 naMTL/1 nporpaMM ML/1KpOKOHTpOJlJlepa 06ecne- ЧL/1вает возмо>кность 06HOBJleHL/1 nporpaMMHbIx сре,lJ,СТВ CL/1CTeMbI 6ез И3ВJlе4еНL/1 ML/1 KpOKOHTpOJlJlepa. 22. Проrраммное 06eCne4eHL/1e L/1СnОJlьзует коман,lJ,Ы goto ДJl Toro, 4т06ы nepeOpL/1eHTL/1- ровать вектор с6роса L/1 векторы npepbIBaHL/1 на 4eKL/1 naMTL/1, paCnOJlO>KeHHbIe вы- ше заЩL/1щенноrо 6JlOKa Ha4aJlbHO заrРУ3КL/1. 24. MHeMoHL/14ecKL/1e 0603Ha4eHL/1 КО,lJ,ОВ onepau.L/1 во встроенном acceM6Jlepe OTJlL/14a- ЮТС от мнеМОНL/1чеСКL/1Х 0603Ha4eHL/1 КО,lJ,ОВ onepau.L/1 в стаН,lJ,артном AcceM6Jlepe. 26. Эта L/1HTerpanbHa схема npe,lJ,CTaBJleT c060 C,lJ,BL/1rOBbI perL/1CTp, СО,lJ,ер>каЩL/1 napanJleJlb- HЫ TpL/1rrep, L/1сnользуемы как 6ycpep.o.n 06eCne4eHL/1 Haдe>KHO ра60ТЫ схемы. 28. ИСПОnЬЗ0ваНL/1е Авухnроводноrо L/1HTepcpeca 1 2 С nозволет 3KOHOML/1Tb OAL/1H WTbIpeK порта. 30. nporpaMMa nepeAaeT L/13MeHeHHoe 3Ha4eHL/1e скорости на ЭJlектромотор 4ерез ЦАП. 32. 1000 метров 34. 20 36. ECAN.H 38. Ka>KAЫ контролnер эта>ка KOHTpOJlL/1pyeT COCTOHL/1e кнопок UP (ВВЕРХ) v1 DOWN (ВНV1З) L/1 nOCbIJlaeT L/1HcpopMau.L/11O о L/1X Ha>KaTL/1L/1 в KOHTpOJlJlep ка6нны JlL/1cpTa, eCnL/1 ка- ка-nн60 Н3 названных кнопок на>ката. KOHTpoJlJlep эта>ка так>ке от06ра>кает номер эта>ка, на котором HaXO,lJ,L/1TC Ka6L/1Ha JlL/1cpTa, - эта L/1HcpopMau.L/1 nOJlY4aeTc от кон- Tponnepa Ka6L/1HbI nL/1cpTa. 40. USB  это YHL/1BepCaJlbHa nOCJle,lJ,OBaTeJlbHa WL/1Ha, AOCТYnHa в BepCL/1X 1.0 (1 M6V1T/C), 1.1 (11 M6L/1T/C) L/12.0 (480 M6L/1T/C). 42.4 44. Проrрамма С4нтывает Hanp>KeHL/1 с L/1HTepcpeca 4ерез Ka)l(,lJ,YIO nOJlOBL/1HY секун,lJ,Ы L/1 nepeAaeT C4L/1TaHHbIe 3Ha4eHL/1 в nK 4ерез USB. 46. Функu.н OnTimer BbI4L/1CJleT Hanp>KeHL/1e по не06ра60танным ,lJ,анным, nOJlY4eHHbIM 4ерез USB, L/1 от06ра>кает pe3YJlbTaT в pJlbIKaX Active-X, соотвеТСТВУIOЩL/1Х кажд,ому Hanp>KeHL/1IO. 48. ФаJl .inf YCTaHaBJlL/1BaeTC, KOr,lJ,a ML/1KpOKOHTpOJlJlep nepBbI раз nO,lJ,KJlI04aeTC к USB на ПК. Установка np0L/13BO,lJ,L/1TC aBTOMaTL/14eCKL/1, за L/1СKJllOчеНL/1ем указаНL/1 места, rAe в nK HaXO,lJ,L/1TC Tpe6yeMЫ cpaJl .inf. 50. FSR2 52. КомаНАа CALLW L/1сnоnьзуетс ДJl ВЫЗ0ва CPYHKu.L/1L/1, aApecyeMO счеТ4L/1КОМ комаНА, npL/1 этом самые npaBbIe 8 6L/1TOB равны cO,lJ,ep>KL/1MOMY perL/1CTpa WREG. 
ITрНJIОlKення 561 Прмло>кенме D PIC-сстема, спользующая нтерфейс USB В этом npLl1nO>KeHLI1H paCCMaTpLl1BaeTC схемное peWeHLI1e, а так>ке проrрамма ДЛ реаЛLl1заЦLl1L11 PICCLl1CTeMbI СО BCTpoeHHO nporpaMMO Ha4aJlbHO зarpY3KLI1, KOTopa со- еДLl1нетс с nK 4ерез WLI1HY USB. 3та CLl1CTeMa мо>кет LI1CnOJlb30BaTbc В Jla60paTopHO среде дn LI1зучеНLI1 MLI1KpOKOHTpOJlJlepOB PIC LI1JlLl1 >ке как He,lJ,OpOra снстема разра60ТКLI1 проrраммных сре,lJ,СТВ. AaHHa PIC-СLl1Стема CTOLl1T npLl16JlLl13L11TeJlbHO ОТ 30 до 40 ,lJ,OJlJlapOB CWA, 4ТО HaMHoro деwевле, 4ем 4TOJlLl160 nO,lJ,06HOe на рынке. Вместе с тем ее созда нне 06есnе4ИТ u.eHHbI опыт cpOpMLI1pOBaHLI1 ,lJ,остаТ04НО nOJlHO He60JlbWO CLl1CTeMbI. KOHCTPYKu.LI1 мо>кет 6ыть с06рана JlLl160 с LI1CnOJlb30BaHLI1eM меТО,lJ,а CKPyTKLI1 (4ТО HeCKOJlb- ко доро>ке) LI1JlLl1 >ке на 6азе KOMMYTLI1pyeMo naHeJlLl1 BBLI1,lJ,y OTHOCLI1TeJlbHO He60JlbWOrO KO ЛV14ества COe,lJ,LI1HeHLI1, He06xo,lJ,LI1MbIX AflЯ C03,lJ,aHLI1 CLI1CTeMbI. nOCKOnbKY эта CLI1CTeMa нс- nОJlьзует LI1HTepcpec USB, а MLI1KpOKOHTpOJlJlep PIC nporpaMMLI1pyeTc по месту, ТО она LI1деаnьно nОДХО,lJ,LI1Т ДЛ KaKOrOJlH60 COBpeMeHHoro эксnернмеНТLI1роваНLI1. EALI1HCTBeH HЫ раз, KOr,lJ,a MLI1KpOKOHTpOJlJlep ,lJ,OJl>KeH 6ыть YCTaHOBJleH В PICnporpaMMaTOp, - это момент Ha4aJlbHOrO проrраММLI1роваНLI1, KOr,lJ,a В PIC заnLl1сываетс nporpaMMa Ha4aJlb HO заrРУ3КLI1. nOCJle этоrо nepBLI14HOrO npOrpaMMLI1pOBaHLI1, PIC-nJlата nporpaMMLI1pyeTc с LI1CnOJlb30BaHLI1eM nporpaMMbI Ha4aJlbHO зarpY3KLI1, pe3L11,lJ,eHTHO В 6JlOKe Ha4aJlbHO за- rpY3KLI1. 3то n03BOJleT npOrpaMMLI1pOBaTb CLI1CTeMY по месту 6ез LI1CnOJlb30BaHLI1 PIC проrрамматора. An CLI1CTeMbI 6bIJl вы6ран MLI1KpOKOHTpOJlJlep PIC18F45501/P, LI1меIOЩLl1 nJlaCTMaC- COBЫ корпус TLI1na PDIP, nOCKOJlbKY о'н LI1MeeT BCTpoeHHЫ 6bICTpO,lJ,eCTBYIOW,LI1 LI1HTep- фес USB, KOTOpЫ ра60тает на CKOpOCTLI1 1 M6L11T/C LI1JlLl1 12 M6L11T/C (USB 2.0 COrJlaCHO Microchip). CLI1CTeMa заnнтываетс ОТ nK 4ерез Ka6eJlb USB, KOTOpЫ 06eCne4L11BaeT .0.0 ток BnnOTb 500 мА, nocne 4ero у>ке nOTpe6yeTc ДОnОJlннтеJlьное ЭJlеКТРОnLl1таНLI1е. Сам по се6е MLI1KpOKOHTpOJlnep PIC npLl1 nOJlHO HarpY3Ke мо>кет ВЫ,lJ,авать TOJlbKO 200 мА, Ta KV1M 06раЗ0М к nJlaTe n04TLI1 HLI14erO HeJlb3 nO,lJ,KJl104L11Tb 6ез LI1CnOJlb30BaHLI1 ,lJ,OnOJlHLI1TeJlb- Horo элеКТРОnLl1танн. 3,lJ,есь paCCMaTpLl1BaeTC caMa nОСJlедн BepCLl1 nporpaMMbI CLI1C- тема. Она LI1MeeTC так>ке на Be6caTe по а,о,ресу http://members.ee.net/brey В pa3,lJ,eJle "ТеХНLI1чеСКLI1е средства". Проrрамма BKJl104aeT He60JlbWYlO onepau.LI1OHHYIO CLI1CTeMY ре- альноrо BpeMeHLI1, а так>ке Ha4aJlbHbI заrРУ34L11К. PLl1CYHOK О-1 nOKa3bIBaeT схему npLl1Hu.LI1nHaJlbHYIO снстемы, KOTopa nOJlHOCTblO OT ла>кена LI1 6удет ра60тать, eCnLl1 с06рана в cOOTBeTCTBLI1L11 с nоказанно cxeMO. Все HeLl1C- поnьзуемые WTbIPbKLI1 BBoдaBЫBoдa (21 wTbIpeK) BCTaBJleHbI в 30rHe3,lJ,HbI разьем TLI1na SIP (корпус с O,lJ,HLI1M P,lJ,OM ВЫВО,lJ,ОВ) разъем, KOTOpЫ мо>кет 6ыть 06резан до размера, соотвеТСТВУlOщеrо 21 WTbIPbKY. ЭТLI1 разъемы MorYT 6ыть npLl106peTeHbI по а,lJ,ресу http://www.elexp.con1, так 4ТО 6У,lJ,ет ,lJ,OBOJlbHO просто эксnеРLl1меНТLI1ровать с ,lJ,aHHO пnато LI1 nO,lJ,KJl104aTb к He n04TLI1 все, 4ТО yrO,lJ,HO, LI1CnOJlb3Y npOBO,lJ,HLI1KLI1, nO,lJ,KJl104aeMbIe к WTbIpbKaM SIP. Все ,lJ,етаЛLl1 это CLI1CTeMbI MoryT 6ыть npLl106peTeHbI r,lJ,e yrO,lJ,HO, BKJlI04a http://www.mouser.com, http://www.digikey.com, http://www.allelectronics.com LI1 http://www.Elexp.com.HanJlaTeCMOHTLI1poBaHcoe.lJ.LI1HLI1TeJlbHbIpa3beMTLI1naAUSB.no- CKOJlbKY стаН,lJ,арт USB указывает, что npLl1 coe,lJ,LI1HeHLI1L11 KOMnblOTepa с KOMnblOTepOM по USB (ecJlLl1 C4L11TaTb PIC KOMnblOTepoM), 06е CLI1CTeMbI ДОJl>КНЫ LI1MeTb COe,lJ,LI1HLI1TeJlbHbI разъем THna А. V1СnОJlьзуетс USB-ка6еJlЬ А-А, KOTOpЫ LI1MeeT ДЛLl1НУ 6 сруТОВ (2 метра): В CLI1CTeMe мо>кет ра60тать MaJla KJlaBLI1aTypa TeJlecpoHHoro CTLI1Jl с MaTpLl1u.e 4 х 4 мат- PLl1u.bI JlLl160 с MaTpLl1u.e 3 х 4  в nOCJle,lJ,HeM CJlY4ae nOHa,lJ,06L11TC TOJlbKO He3Ha4L11TeJlbHa MOALI1cpLl1Kau.LI1 nporpaMMHoro 06есnечеНLI1. 
562 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC 18 S'N1 Q :<: 16 MHz <:J 5V Максимум 500 мА С2  PIC18F4550 0.1 U1 R80 R81 RB2 RB3 RB4 RB5 RB6 RB7 RCO RC1 RC2 о- Di- 25 RC6 26 RC7 18 VUSB 9 CI)CI) RE1 CI)CI) 10 » RE2 С4 0.22 SV US8 R7 10К ;!: У1 8 OUT >/0- [ ..oDo Rese\ С3 0.1 J1 14 (р RS "VDD 13 Dб н Р5 ЖКИ индикатор ':::!; D4 II,/W VSS R8 С1 10К 0.1 1 2 3 А 4 5 б В 7 8 9 С О F Е D 1\лавиа1)рU 4х4 Убе,Т"(итесь в том, что ИСПО.'Th:lусмые 1П1Ъ1рЬКИ COOТlk.'TCТByIOT выводам Жк.ии,Т"(икатора. R l\анной схеме ИСПОЛI.зуется рЗЗВОДJa\ 2х20, однако при мо,:{ификации "РОIРU"ШНЫХ средств мuже 1" ИСIIОJIЬЗОВUТы.:я любая друrая. Клавиша D исполиуется как клавиша Entel' (Ввод) Рисунок D 1 По npLl14L11He npocTOTbI LI1СnОJlьзуемо схемы, ne4aTHa nJlaTa не BJleTC не06хо- ДLl1МОЙ. Неnосредственны монта>к ра60тает Т04НО так >ке LI1 CTOLl1T rораз,lJ,О MeHbwe. ОnераЦLl10нна CLI1CTeMa 06CJlY>KLI1BaeT ЖК-LI1H,lJ,LI1катор, MaJlYIO KJlaBLI1aTYPY и BHyTpeHHLI1 TaMep peanbHoro BpeMeHLI1. Временные за,о,ер>ККLI1 в peaJlbHOM MacwTa6e BpeMeHLI1 Moryт LI1MeTb ДLl1апа30Н от МLI1nлисекун,lJ, .0.0 се КУН,lJ, , так 4ТО СLI1НХРОНLI1заu.LI1 так>ке BbInOJlHeTC очень просто. Так как временные за,lJ,ер>ККLI1 за,о,аlOТС в peaJlbHOM BpeMeHLI1, то ОНИ Т04НЫ АО +/- 1 МС, 4ТО достаТ04НО xopowo ДJl 60JlbWLl1HCTBa npLl1JlO>KeHLI1 типа ynpaBJlIOw,LI1X nporpaMM. Так как MLI1KpOKOHTpOJlJlep ра60тает с TaKTOBO 4aCTOTO, paBHO 16 Mru., то ОН BbInOnHeT 4000000 коман,lJ, за се КУН,lJ,У , 4ТО 06eCne4L11BaeT знаЧLl1теJlЬНЫ заnас MOW,HO CTLI1 ДJl ЛlO60rо MLI1KpOKOHTpOJlJlepHOOcHoBaHHoro npLl1JlO>KeHLI1. Оnераu.ионна CLI1CTeMa заrру>кает MLI1KpOKOHTpOnJlep, О,lJ,нако MeHbwe, чем 1 % ero BpeMeHLI1. Она так>ке ИСnОJlЬ- зует npLl16JlLl13HTeJlbHO 1 0% ,lJ,OcTYnHo nамти (как naMTLI1 nporpaMM, так и naMTLI1 ,lJ,aH ных). BpeM ,lJ,H мо>кет oT06pa>KaTbC как в 24-4асовом, так LI1 в 12-4асовом срормате  
TIрНnОlKення 563 " эта LI1Н,lJ,LI1каu.и в Jl1060e BpeM мо>кет 6ыть OTKJl104eHa LI1JlLl1 BKJl104eHa nporpaMMHbIM пере- КЛlO4атеJlем. Рисунок D2 PLl1CYHOK О-2 nOKa3bIBaeT сротоrрасриlO CLl1CTeMHO nJlaTbI. CBeTO,lJ,LI10,lJ,bI трех u.BeTOB nОДKJl104ены к штырькам порта АСО, АС1 LI1 АС2 с ИСnОJlЬЗ0ваНLI1ем трех 150OMHЫX то- кооrраНLI14L11ваlOЩLl1Х pe3L11CTOpOB. 3та CLI1CTeMa nоказаJlа ce6 весьма эсрсреКТLl1ВНО. Перечень компонентов: LJ.eHa: 1 МИКРОКОНтРоллер PIC18F4550 I/P PDIP $ 6.72 1 40 штырьковая панель DIP $ .25 1 14 штырьковая панель DIP (reHepaTop) $ .15 1 зо штырьковая панель SIP дЛЯ подключений BBoдaBЫBoдa $ 1.90 1 ЖКиндикатор 2 х 16 $ 7.50 1 малая клавиатура с матрицей 4 х 4 $ 5.95 1 резистор на 1 О кОм $ .06 1 потенциометр на 1 О кОм $ .45 1 кварцевый reHepaтop на 16 MrU $ 1.95 1 нормально разомкнvтый кнопочный выключатель $ .50 3 конденсатора на 0,1 мкФ $ .30 1 конденсатор на 0,22 мкФ $ .15 1 USВкабель длиной 2 метра типа А-А $ 3.50 1 соединительный разъем USB типа А $ .56 Итоrо $30.21 
564 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 npLl1Mep O1 LI1ЛnlOСТРLl1рует TeCTOBYIO npOrpaMMY 3TO CLI1CTeMbI. Она n03BOJleT вы- nолнV1ТЬ TeCTLI1pOBaHV1e CLI1CTeMbI nepe,lJ, aKTLI1BLI1pOBaHLI1eM USB. nO,lJ, ynpaBJleHLI1eM ЭТО nporpaMMbI CLI1CTeMa CPYHKu.LI1OHLI1PyeT как простые 4асы, nOCKOJlbKY Ha3Ha4eHLI1eM ,lJ,aHHO nporpaMMbI BJleTC LI1СКJl104итеJlЬНО тестироваНLI1е аппаратных сре,lJ,СТВ. nporpaMMa LI1сnоnьзует cpaJl заrОJlовка bIcd.h, KOTOpЫ 06есnе4ивает ynpaBJleHLI1e ЖКLI1Н,lJ,LI1катором LI1 реаnLl1зует Т04ные временные 3a,D,ер>кки. ДaHHЫ cpaJl заrОJlовка ,lJ,OcTyneH по а,о,ресу http://members.eenet/brey, он так>ке nриве,lJ,ен в примере О-2. npMep D-1 #include <p18f45S0.h> finclude <timers.h> #include <blcd.h> /* DporpaMMa nepBMqHOro TecTMpoBaHMR Copyright (с) 2006, Barry В. Brey Версмя 1.1 ... 5/26/06 требует: timers.h blcd.h KOMnOHoBK: *1 11 бмт KOHMrypMpoBaH nporpaM fpragma config WDT = OFF fpragma config WDTPS = 32768 #pragma config BOR = ON ffpragma config MCLRE  ON #pragma config PWRT = OFF #pragma config PBADEN = OFF #pragma config PLLDIV = 4 fpragma config FOSC = ECPLLIO ЕС fpragma config CPUDIV OSC1 PLL2 #pragma config USBDIV 2 #pragma config VREGEN ON #pragma config STVREN ON #pragma config LVP = OFF #pragma config WRTB = ON void HighInt (void); fpragma interrupt HighInt ffpragma code HIGH INTERRUPT VECTOR void highISR (void) - asm goto Highlnt endasm } 1* KOHCTaHT в naMRTM rom near char keyLookUp[] nporpaMM = {О, 7, 15, 8, 14, 9, 13, 12, AnR npoeKTa ЕЕТ-387 ynpaBneHMe TaMepOM KnaBMaTypa м BpeMeHHe заАеркм 18f4550.1kr II BKnqeHMe cTopoeBoro TaMepa 1I OTCqeT cTopoeBoro TaMepa (131 сеКУНАа) II HanpReHMe 4aCTMqHO nOTepM nMTaHMR II разреwенме 06ero с6роса II актмвмрованме TaMepa вкnqенмя rrмтанмя I1 порт В UMpOBO II TaKTOBaR qaCTOTa AnR nOnHocKopOCTHO USB II TaKTOBaR 4астота USB PIC равна 48 MrU II BHeIlIHMt1 reHepaTOp с :зо5лОК11рyrcIllV1M KOнтyp<:t4 I1 BcoKaR скорость USB II BKn4eHMe реrуnятора USB I1 с6рос по nepenonHeHM стека 1I нмзковоnьтное nporpaMMMpoBaHMe I1 замта от заnмсм 6noKa HaqanbHO заrрузкм 8 II nepexoA на nOAnporpaMMY 06ра60ТКМ II BcoKonpMopMTeTHX npepBaHM *1 4, 5, 6, 11, 1 , 1 I мажет noтpe6oBaTbcR мэмененме 2, 3, 1 О }; I1 это Аnя МНАмкатора 2 Х 20 rom near char mes 1а [] \\ The PIC 4550 Demo п. rom r.ear char mes1b[] Test program п. , rom near char mes1c [] \\ Enjoy the project! "; rom near char mes1d[] \\ (с) 2006 Ьу В. Brey " ; rom near char mes1 [] = \\ Set Hours: "; 
ITpHnolKeHHSI 565 rom near char mes2[] rom near char mes3[] rom near char mes4[] rom near char mes5[] 1* зто АnЯ МНАмкатора 2 х 16 rom near char mes1a[] "PIC 4550 Demo rom near char mes1b[] " Test program rom near char mes1c[] Enjoy!! rom near char mes1d[] "(с)2006 Ьу Brey "; rom near char mes1 [] Set Hours: rom near char mes2[] "Set Minutes: rom near char mes3 [] "0=24hr or 1=12hr "; rom near char mes4[] "The 4550 rules! rom near char mes5[] *1 1* Set Minutes: " 0=24hr or 1=12hr " The PIC4550 rules! "; "; "; "; "; ": ": "; "; ": " . , rn06anbHe nepeMeHHe в naMRTM AaHHX *1 11 BpeMR AHR int milli; char seconds; char minutes; char hours; char buffer [21]; char displayTimeFlag; char timeFormat; II 6yep строкм KMHAMKaTopa II nar временм oT06paeHMR II О = 24-qаСОВ, 1 = 124acoB #pragma code void ShowTime (void) char portDbuffer  PORTD; char temph = hours; if (displayTimeFlag != О) { if (temph > 12 && timeFormat 1) II ормироанме HaAnMCM 1 I AМ!FМ (АО naлy.цнR/nocnе nалу.цня:) temph  12; else if (temph == О && timeFormat = 1) temph = 12; buffer[O] = temph/10 I Ох30; if (buffer[O] == ОхЗО ) buffer [О] = Ох2 О; II npo6eл в наqa]JbНЬЙ НОЛЬ знаqeHMR qaCOB; buffer[l] temph % 10 I ОхЗО; bu f f е r [ 2 ] , : ' ; buffer[3] minutes 1 10 buffer[4] minutes % 10 bu f f е r [ 5 ] , : ' ;, buffer[6] seconds 1 10 buffer[7] seconds % 10 if (timeFormat == 1) { Ох30; ОхЗО; Ох30; Ох30; buffer[8] = Ох20; if (hours >= 12) buffer[9] 'Р'; else buffer[9] 'А'; buffer[10] 'М'; buffer[l1] = О; 
566 ITpHMeHeHHe MHKpOKOHTpOnnepOB РI С 18 AddrLCD (Охс) ; 1I OT06paeHMe временм } else { buffer[8] = О; AddrLCD (Охс6) ; putsLcr.: ffer); } PORTD = portDbuffer; ) void DoTime (void) milli++; if (delayms != О) { II BpeMeHHaR заАерка в 1 мс delayms; if (delayms == О) mflag О; } if (milli == 1000) { milli = о; seconds++; if (delaySec != о) { II ceKYHAHaR BpeMeHHaR заАерка delaySec--; if (delaySec == О) sflag = О; } if (seconds == 60) { seconds = О; minutes++; if (minutes == 60) { minutes = О; hours++; if (hours 24) hours = О; } if (milli == О) { 11 про верка на HOBY ceKHAY INTCONbits.GIEH ShowTime(); 1; I1 разpereНМе ЕЫСоkОnPМOI:итетнх npepoIВaНМЙ } void Highlnt(void) I1 npepBaHMe if (PIR1bits.TMR1IF == 1) { 1I peMM 24 qaCOB PIR1bits.TMR1IF = О; WriteTimer1(11810); DoTime(); 1 I повторное разpeIIEнме rIpeI:ыванмя: от тa:йtd=ра 1 1 I nеperrporpaм.1ИpOваНМе с:::мец=нноro ОТС4ета (190) 
ITрНnОlKення 567 char ReadKey (void) { char select = Oxef; char col = -4; char mask = 1; PORTD = О; do { while ((PORTD & OxOf) != OxOf) ClrWdt(); DelayMs(15); 11 15 мс } while (( PORTD & OxOf) 1= OxOf); do { while ((PORTD & OxOf) OxOf) ClrWdt(); DelayMs(15); } while ((PORTD & OxOf) OxOf); do { PORTD = select; select «= 1; col += 4; } while ((PORTD & OxOf) == OxOf); while ((PORTD & mask) == mask) { col++; mask «= 1; return keyLookUp[col]; } void SetTime (char* clock, char maxTensDigit) { char temp; do { *clock = О; ShowTime(); temp = ReadKey(); if (temp <= maxTensDigit) *clock += temp * 10; ShowTime(); temp = ReadKey(); if (temp < 10) *clock += temp; ShowTime(); temp = ReadKey(); } while (temp != 13); AddrLCD(Ox80); putrsLCD(mes2); ) void InitializeSystem (void) ADCON1 = Ox3f; PORTE = Ох80; TRISD = OxOf; WDTCONbits.SWDTEN = 1; milli = seconds = minutes II все BXOA UMpoBe II ВК11КНеНМе нarpузо резмcroров порта О II HaCTpOKa ВХОАОВ порта О II актмвмрованме cTopoeBoro TaMepa hours = О; II BpeMR = 00:00:00 
568 Прнмененне MHKpOKOHTpOnnepOB PIC18 displayTimeFlag = о; delayms = delaySec = о; OpenTimer1 (TIMERINTON & Т1 16BIT RW &  - Т1 SOURCE INT & - - Т1 PS :. 1 & :"1 fX:':LEN OFF & - - TlSYNEXT_OFF) ; WriteTimerl i1200iJ); RCONbits.IPEN = 1; IPR1bits.TMR1IP 1; INTCONbits.GIEH 1; OpenLCD(); II не OT06paaTb BpeMR II с6рос заАерек II nporpaMMMpoBaHMe таймера 1 1I установка OTCqeTa таймера 1 (1,0 мс) 1I IPEN = 1 II 06ъявnенме TaMepa 1 I1 всокоnрмормтетньш II paзpe1.IEНМе BbICOKOrrpмOpwreT npe I1 мнмuмаnмзаuмя ЖК-МНАмкатора } void ShowStrings (const rom char *line1, const rom char *line2, char delay) AddrLCD (Ох80); putrsLCD (line1); AddrLCD (охсо); putrsLCD (lie2); DelaySec (de1ay); 'Joid main (void) char а; InitializeSystem(); ShowStrings (mes1a, mes1b, 5 ); ShowStrings (mes1c, mes1d, 5 ); AddrLCD (охсо); putrsLCD (mes5); AddrLCD (Ох80); putrsLCD (mes1); timeFormat = о; displayTimeFlag = 1; SetTime (&hours, 2); AddrLCD (Ох80); putrsLCD (mes2); SetTime (&minutes, 5); AddrLCD (Ох80); putrsLCD (mes3); AddrLCD (Ох80); putrsLCD(mes3); а = ReadKey () ; if (а < 2) timeFormat а; AddrLCD (Ох80); pULrsLCD (mes5); AddrLCD (охсо); putrsLCD (mes5); ShowTime() ; for (а = о; а < 20; а++) AddrLCD(Ox80 I а); WriteLCD(mes4[a]); DelayMs(150); } for (а = о; а < 5; а++) II от06размть время 1I установка qaCoB II установка ммнут 
TIpHnolKeHHSI 569 AddrLCD (Ох80); putrsLCD (mesS); DelayMs (400); AddrLCD (Ох80); putrsLCD (mes4); DelayMs (400); } while (1) ( ClrWdt(); II с6рос cTopoeBoro TaMepa npMep D-2 1* BpeMeHHe заАеркм м yrrpaBneHMe K-MHAMKaTopOM (с) 2006, Barry В. Brey COAepMT: De1ayMs (unsigned int count) DelaySec (unsigned int count) II BbJ3bIBaeT 3аАерККУ от 1-К АО 64-К MV1J1JlMceJ<y1-U:t II BbI3bIBaeT 3аАерККУ от 1-К АО 64K ceJ<y1-U:t putsLCD (char *buffer ) putrsLCD (const rom char buffer) WriteLCD (char data ) II oтI<fыватT -МН,r::IИКд.ТОР ДJ1R ero MCnOflb30вaHMR II аАресует rr03MUM МНАмкатора II Ох80 - зто строка 1, ОхСО - 3ТО строка 2 II OT06paeHMe строкм CMMBOnOB М3 ЗУDВ II OT06paeHMe строкм CMMBOnOB М3 DЗУ II OT06paeHMe OAHoro CMMBona OpenLCD ( ) AddrLCD ( ) *1 #ifndef BLCD Н #define BLCD Н unsignеd-Тnt delayms; char mflag; unsigned int delaySec; char sflag; # pragma code void ShortDelay (void) { II MMnnMceKYHAHaR заАерка II ceKYHAHaR заАерка N ор () ; Nop () ; Nop () ; Nop () ; Nop () ; Nop () ; Nop () ; Nop () ; Nop () ; Nop () ; II OMAaHMe 6мта ) 1I OepeMeHHe mflag м sflag Aanee RBnRTcR не06ХОАММЬШМ BcneAcTBMe Toro, I1 4ТО комаНАа while (delaysm) II 6УАет MHorAa npepBaTbcR MeAY nonoBMHaMM uenx 4Mcen, II 4ТО B30BeT неверное YHKUMoHMpoBaHMe CMCTeM, rr03ToMY I1 HYHO Mcnonb30BaTb 6aTOBe narM. void DelayMs (unsigned int count) ( II BrrnoTb АО 64К MMnnMceKYHA delayms = count; DoTime () mflag = 1; II delayms M3MeHReTCR в YHKUMM 
570 TIpHMeHeHHe MHKpOKOHTpOnJIepOB PIC18 while (mflag); void DelaySec (unsigned int count) { delaySec = count; sflag = 1; while (sflag); void SendLCD (char command, char data ) ( char а; PORTEbits.REO = command; PORTD = data & OxfO; ShortDelay(); PORTEbits.RE1 1; ShortDelay(); PORTEbits.RE1 о; ShortDelay(); PORTD = data « 4; ShortDelay(); PORTEbits.RE1 1; ShortDelay(); PORTEbits.RE1 о; PORTE = Ох80; for (а = О; а < 27; а++) ShortDelay () ; } void OpenLCD (void) { char а; char reset[] = {Ох28, 1, 12, 6}; TRISE = TRISE & Oxfc; TRISD = TRISD & OxOf; PORTEbits.RE1 о; DelayMs(16); for (а = о; а < 3; а++) ( SendLCD(O, Ох20); DelayMs (5) ; } for (а = о; а < 4; а++) { SendLCD(O, reset[a]); DelayMs(2); void AddrLCD (char addr) { SendLCD (О, addr); void putsLCD (char *buffer) { while (*buffer) { SendLCD(l, *buffer); buffer++; II BrrnOTb АО 64К сеКУНА II dalaySec M3MeHMnacb в DoTime() II AnR BHYTpeHHero McrrOnb30BaHMR II установ nM60 с6рос 6мта RS II d7 == d4 на KM II KopoTKaR заАерка II установ Е II KopoTKaR заАерка II с6рос Е II d3 - dO на KM II KopoTKaR заАерка II установ Е II KopoTKaR заАерка II с6рос Е II OMAaHMe 40 мкс II OTKpTMe KM II opMMpOBaHMe комаНА II REO м RE1 RBnRTcR BXOAaMM II RD4 -- RD7 RBnRTcR BXOAaMM II с6рос Е II OMAaHMe 16 мс (BpeMR BKnqeHMR) II BAaqa комаНА с6роса II OMAaHMe 5 мс II BAaqa комаНА HaCTpOKM II установка аАреса МНАмкатора II строка 1 HaxoAMTcR от Ох80 АО Ох87 II строка 1 HaxoAMTcR от ОхсО АО Oxcf I I HMe СТрОКМ v13 rra.M>m1 .r:taHHbIX 
TIpHnolKeHHSI 571 void putrsLCD (const rom char *buffer) I I e СТрОКМ v13 na.MRTM IlpOrpaM.1 ( while (*buffer) { SendLCD(l, *buffer); buffer++; void WriteLCD (char data) { II OT06paeHMe OAHoro cMMBona SendLCD (1, data); #endif Как TOJlbKO nporpaMMa Н3 npHMepa 0-1 6У,lJ,ет пере несена в PIC, 4ТО nOTpe6yeT НС- nOJlb30BaHLI1 nporpaMMaTopa THna PICSTART PLUS, ну>кно заnнтать снстему, nO,lJ,KJl104HB ее к разьему USB nK. Первое, 4ТО вы УВН,lJ,нте на НН,lJ,нкаторе - зто <рраза "Set Hours:" (Установнте 4асы). Вве,lJ,нте BpeM в 24-4асовом срормате, BBO,lJ, ,lJ,анные с MaJlO KJla- BV1aTypbI н Ha>KHMa KJlaBHwy ENTER (Вво,lJ,) (HJlH Jl106yIO ,lJ,pyrylO KJlaBHWY, KOTopa на НС- nОJlьзуемо вамн KnaBHarype CPYHKu.HOHHpyeT как KJlaBHWa ENTER (Вво,lJ,)). MaJla KJla- BV1aTypa мо>кет нметь, а мо>кет н не нметь KJlaBHWH ENTER. (В схеме по рнсунку 0-1 в ка4естве KJlaBHWH ENTER НСnОJlьзуетс KJlaBHWa О.) Cne,lJ,YIOw,H war заКJl104аетс в разра60тке, HJlH по KpaHe мере MO,lJ,HcpHKau.HH, nporpaMMbI Ha4aJlbHO зarpY3KH, KOTopa ,lJ,OCTYnHa на caTe Microchip. Она мо>кет 6ыть BbIrpY>KeHa с 3Toro caTa, HMeeTC так>ке ее CKOMnHJlHpOBaHHa BepCH в WeCTHa,D,u.aTH- РН4НЫХ КО,lJ,ах. nepeA HCnOJlb30BaHHeM зта nporpaMMa Ha4aJlbHO заrрузкн ,lJ,OJl>KHa 6ыть MO,lJ,HcpHu.HpOBaHa с тем, 4т06ы она MOrJla ра60тать с BaWHMH annapaTHbIMH сре,lJ,ствамн. Снстема 06paw,aeTC к nporpaMMe Ha4MbHO заrрузкн BCKH раз, KOr,lJ,a Ha>KHMaeTC н Y,lJ,ep>KHBaeTC в на>катом COCTOHHH .0.0 момента с6роса HJlH BKJlI04eHH снстемы. ECJlH CV1CTeMa c6paCЫBaeTC 6ез Y,lJ,ep>KaHH в на>катом COCTOHHH KJlaBHWH KJlaBHaTypbI, то BbInOJlHeTC npHJlO>KeHHe, заrру>кенное в PIC. E,o,HHCTBeHHЫ cpaJl, He06XO,lJ,HMЫ AfI Toro, 4т06ы снстема CPYHKLJ.HOHHpOBaJla OnHcaHHbIM cnoc060M, - зто cpaJl, npHBe,lJ,eHHbI в npHMepe 0-3. OTKpOTe HOBЫ npoeKT LI1 HaCTpOTe ero так, как зто OnHcaHO в npHMepe 0-3. У,lJ,остоверьтесь в том, 4ТО nepe- 4V1CJleHHbIe cpaJlbI .заrру>кены с caTa срнрмы Microchip, а cu.eHapH KOMnOHOBUJ,HKa Н3- менен указанным 06раЗ0М, нна4е pe3YJlbТHPYIOW,H КО,lJ, не nOMeCTHTC в пространстве naMTH заrРУ304ноrо 6JlOKa 06ьемом 2К 6aT. Как TOJlbKO 6у,lJ,уТ BbInOJlHeHbI все HaCTpo- KV1 н nporpaMMa 6УАет HanLl1CaHa, BbInOJlHHTe компоновку nporpaMMbI (HJlH BbIrpY3HTe с caTa срнрмы Microchip ее CKOMnHJlHpOBaHHYIO WeCTHa,D,u.aTHpH4HYIO BepCHIO), а затем заnроrраммнруте PIC, HCnOJlb3Y nporpaMMaTOp THna PICSTART PLUS. npMep D-3 1* nR C03AaHMR 3TO nporpaMM 1. C03AaTe HOBY nporpaMMY, Mcrronb3YR мастер rrpoeKToB 2. 06aBbTe an KOMrrOHOBKa 18f4S50.1kr, HYHe an/narrKM HaxoARTcR в narrKe MCHPFSUSB\fw\Boot 3. CKonMpYTe смстему м rranKY autofile в Baw KaTanor 4. CKonMpYTe an io cfg.h в Baw KaTanor 5. 06aBbTe сnеАуе-мсхоАне an в rrpoeKT: boot.c, usb9.c, usbctrltrf.c, usbdrv.c, usbdsc.c м usbmmap.c 
572 ITpHMeHeHHe MHKpOKOHTpOnnepOB PIC18 6. 06aBbTe к npoeKTY cneAYMe an заrоnовков: boot.h, usb.h, usbcfg.h, usbdsc.h, usbmmap.h, io cfg.h, typedefs.h 7. В OnUMRX KOMnOHOBKM B6epMTe rrpoeKT, затем B6epMTe закnаАКУ MPLAB С18, enKHMTe на rr03MUMM Alternate (Мзменмть), а затем ввеАмте -scs BrronHMTe компоновку rrpoeKTa. Теперь *1 #include <p18f4SS0.h> #include "system\typedefs.h" #include "system\usb\usb.h" finclude "io_cfg.h" #pragma config WDT = OFF fpragma config WDTPS = 32768 #pragma config BOR = ON fpragma config MCLRE = ON #pragma config PWRT = OFF ffpragma config PBADEN = OFF #pragma config PLLDIV = 4 #pragma config FOSC = ECPLLIO ЕС #pragma config CPUDIV OSC1 PLL2 #pragma config USBDIV 2 flpragma config VREGEN ON #pragma config STVREN ON #pragma config LVP = OFF pragma config WRTB = ON I1 вектора npepBaHM ffpragma code HIGH INTERRUPT VECTOR void high_ISR (vold) ( asm goto Ох808 endasm #pragma code LOW INTERRUPT VECTOR void 10w_ISR-(vоId) { asm goto Ох818 endasm #pragma code void main (void) { I1 BKnqeHMe cTopoeBoro TaMepa I1 OTCqeT cTopoeBoro TaMepa (131 сеКУНАа) I1 HanpReHMe qaCTMqHO rrOTepM rrMTaHMR II разреwенме 06ero с6роса 11 актмвмрованме TaMepa BKn4eHMR rrMTaHMR 1I rropT В UMpOBO 11 TaKTOBaR 4астота AnR nOnHocKopOCTHO USB I1 TaKTOBaR qaCTOTa USB PIC равна 48 MrU II BHeIlIHMt1 reHepaTOp с <Pa3OOnOK11pyrcIllV1M КОНТурОМ II BcoKaR скорость USB II BKnqeHMe perYnRTopa USB II с6рос rro rreperronHeHM стека II HM3KoBonbTHoe rrporpaMMMpoBaHMe II замта от заnмсм 6noKa HaqanbHO заrрузкм ОхОООО08 II HOB аАрес вектора ОхОООО18 II HOB аАрес вектора char temp; II сохраненме COCTORHMR с6роса char temp1; char temp2; char temp3; temp2 = PORTE; PORTE = Ох80; II BKnqeHMe HarpY30K rropTa О temp = ADCON1; temp1 = TRISD; temp3 = PORTD; ADCON1 != OxOF; IluMpoBo BBOA-BBOA TRISD = OxOF; II HaCTpOKa KnaBMaTYP PORTD = о; II B60pKa всех KnaBMW KnaBMaTYP I1 проверка на peMM HaqanbHO заrрузкм (HaaTMe n60 II KnaBMWM KnaBMaTYP AnR с6роса)) if ((PORTD & OxOf) == OxOf) II eCnM HMKaKaR KnaBMwa не HaaTa, II B6MpaeTcR nOnb30BaTenbcKM peMM 
TIpHnolKeHHSI 573 PORTE = temp2; TRISD = temp1; ADCON1 = temp; PORTD = temp3; _asm goto Ох800 endasm } II peMM HaqanbHO заrрузкм mlnitializeUSBDriver() ; USBCheckBusStatus(); II BocCTaHoBneHMe 3Ha4eHM с6роса II HOB аАрес вектора с6роса I1 смотрмте usbdrv.h 11 MOAMMUMpoBaHo AnR rrOCTORHHoro 11 aKTMBMpoBaHMR MOAYnR USB while (1) ( USBDriverService() ; BootService(); II смотрмте usbdrv.c 1I смотрмте boot.c nOCJle заnНСLI1 npOrpaMMbI Ha4aJlbHO зarpY3KLI1, снстема 6У,lJ,ет rOTOBa к npOrpaM- MLI1pOBaHHIO 4ерез USB-nО,lJ,KJl104енне к nK. V1MeeTC TOJlbKO О,lJ,на np06neMa: npOrpaMMa AOn>KHa HanLl1CaHa так, 4т06ы она Ha4HHaJlaCb по а,lJ,ресу Ох800 вместо ОхООО. 3то ,lJ,ОСТН- raeTC nOCpe,lJ,CTBOM TaKoro LI13MeHeHLI1 cpaJla KOMnoHoBw,HKa, которое HJlJlIOCTpHpyeTc в npLl1Mepe О-4, xopowe LI1,lJ,ee BJleTC так>ке nepeLl1MeHOBaHHe 3Toro cpaJla, - HanpLl1- мер наЗ0вем ero boot18f4550.lkr вместо 18f4550.lkr. Первые ,lJ,ве строкн 06bBJleHLI1 КО,lJ,ОВЫХ CTpaHLI1u. (CODEPAGE) теперь 6у,lJ,УТ новымн, а TpeTb - закоммеНТLI1рована. Ко- AOBa cTpaHHu.a, Ha3BaHHa boot, - 3ТО заw,нw,енна nporpaMMa Ha4anbHO зarpY3KLI1, а CTpaHLI1u.a, Ha3BaHHa vectors nepeonpe,lJ,eJleT CTapTOBЫ а,lJ,рес как Ох800. npMep D-4 II $Id: 18f45S0.1kr,v 1.3 2004/08/23 18:08:22 II an: 18f4SS0.1kr I1 Орммер cueHapMR KOMnOHOBMKa AnR rrpoueccopa PIC18F4SS0 LIBPATH . FILES c018i. о FILES clib,lib fILES p18f4SS0.1ib CODEPAGE NAME=boot START=OxO CODEPAGE NAМE=vectors START=Ox800 II CODEPAGE NAME=vectors START=OxO I1 CODEPAGE NAME=page START=Ox2A CODEPAGE NAME=page START=Ox82A CODEPAGE NAME=idlocs START=Ox200000 CODEPAGE NAME=config START=Ox300000 CODEPAGE NAME=devid START=Ox3FFFFE CODEPAGE NAME=eedata START=OxFOOOOO ACCESSBANK NAМE=accessram START=OxO DATABANK NAME=gprO START=Ox60 DATABANK NAME=gpr1 START=Ox100 DATABANK NAME=gpr2 START=Ox200 DATABANK. NAME=gpr3 START=Ox300 DATABANK NAME=usb4 START=Ox400 DATABANK NAME=usbS START=OxSOO DATABANK NAME=usb6 SТАRТ=ОхБОО DATABANK NAME=usb7 START=Ox700 ACCESSBANK NAME=accesssfr START=OxF60 SECTION NAME=CONFIG ROM=config STACK SIZE=Ox100 RAM=gpr3 END=Ox7FF END=OxOx829 END=Ox29 END=Ox7FFF END=Ox7FFF END=Ox200007 END=Ox30000D END=Ox3FFFFF END=OxFOOOFF END=OxSF END=OxFF END=Ox1FF END=Ox2FF END=Ox3FF END=Ox4FF END=OxSFF END=Ox6FF END=Ox7FF END=OxFFF PROTECTED PROTECTED PROTECTED PROTECTED PROTECTED PROTECTED PROTECTED PROTECTED PROTECTED PROTECTED PROTECTED PROTECTED 
574 ITpHMeHeHHe МНКрОКОНТроnлеров PIC 18 nOcJle Toro, как nоказанные H3MeHeHH 6у,lJ,уТ npOBe,lJ,eHbI, Jl106a HanHcaHHa npo- rpaMMa ,lJ,OJl>KHa HCnOJlb30BaTb boot18f4550.lkr cpaJl Н3 npHMepa О-4 вместо cpaJla 18f4550.lkr. npHMep О-5 HJlJlIOCTpHpyeT H3MeHeHH, npOBe,lJ,eHHbIe в nporpaMMe по npH- меру О-1 с тем, 4т06ы она CPYHKLJ.HOHHpOBaJla в сре,lJ,е Ha4aJlbHO заrрузкн. (nepBbI no,lJ,- pa3,lJ,eJl L/13 О-1 Y,lJ,aJleH н заменен вторым nO,lJ,pa3,lJ,eJlOM). 3то H3MeHeT а,lJ,реса вектора с6роса L/1 BbIcoKonpHopHTeTHoro npepbIBaHH. В 3TO TeCTOBO nporpaMMe HH3KonpHopH- TeTHЫ вектор npepbIBaHH не НСnОJlьзуетс. npMep D-5 I1 opMrMHan мз npMMepa О-1 (YAaneH) I1 AoneH MCnOnb30BaTbCR MOAMMUMpoBaHH an KOMrrOHOBKa void HighInt (void); II rrpoToTMrr #pragma interrupt Highlnt #pragma code high_vector 8 void high_vector (void) II BcoKorrpMopMTeTHbI вектор asm GOTO Highlnt endasm II rrepexoA на rroArrporpaMMY 06ра60ТКМ II BcoKonpMopMTeTHx rrpepBaHM 11 replaces original in Example О-1 void Highlnt (void); extern void startup (void); II смотрмте c018i.c в KaTanore II KOMnoHoBMKa KOMnMnRTopa С18 #pragma code _RESET_INTERRUPT VECTOR = Ох800 void reset (void) _asm goto _startup _endasm } #pragma interrupt HighInt #pragma code _HIGH_INTERRUPT VECTOR void high_ISR (void) Ох808 asm goto Highlnt endasm II rrepexoA на nOAnporpaMMY 06ра60ТКМ II BcoKorrpMopMTeTHx rrpepBaHM WeCTHa.D.u.aTepH4HbI <paJl nporpaMMbI Ha4aJlbHO заrрузкн (KOTopa nporpaMMH- PyeTC с L/1CnOJlb30BaHL/1eM nporpaMMaTopa THna PICSTART PLUS) Ha3ЫBaeTC boot.hex на Ilttp:! /members.ee/net/brey, TeCTOBa nporpaMMa по npL/1Mepy О-1 Ha3ЫBaeTC test.hex, а TeCTOBa nporpaMMa, MO,lJ,HcpHu.HpoBaHHa AfI Ha4aJlbHO зarpY3KH, Ha3ЫBaeTC boottest.hex. Онн MorYT 6ыть BbIrpY>KeHbI AfI npOBepKL/1 снстемы. 
CoeplKaHHe KOMnaKT- .u.HCKa 575 СОАер>канме KOmnaKT-АМСка - CnpaB04HbIe ,lJ,анные на ceMeCTBO MHKpOKOHTpOJlJlepOB PIC 18  npHMepbI nporpaMM - Microchip MPLAB IDЕ BepCH 7-3 - Microchip MPLAB IDЕ BepCH 7-5 - ApaBepы USB - КОМnV1nятор С18  V1HTepcpec USB. nporpaMMbI