МИКРОКОНТРОЛЛЕР ЭТО ОЧЕНЬ ПРОСТО

 

Абрамов Сергей   г. Оренбург

 

Не так давно радиолюбители конструировали свои схемы на лампах, потом пришлось осваивать транзисторы и микросхемы. В восьмидесятые годы радиолюбители стали собирать свои первые конструкции на микропроцессорах. Чтобы не отставать от своего времени пришла пора освоить микроконтроллеры и ПЛИС. Целю данной статьи является преодоление барьера радиолюбителями от конструирования схем на обычной логике к микроконтроллерам. В статье будут рассмотрены вопросы поэтапной разработки схем на основе микроконтроллеров фирмы MICROCHIP, хотя в принципе они мало чем отличаются от микроконтроллеров АНГСТРЕМ, ATMEL или аналогичных.

Для начала поговорим об инструментах которые нам понадобятся для создания конструкций. Это прежде всего компьютер с модемом, без которого в наше время продвинутому радиолюбителю делать нечего, так как необходимо будет с интернета качать необходимые нам файлы. Какой покупать компьютер это зависит от возможностей конкретного человека. Автор рекомендует конфигурацию не ниже Pentium 2, ОЗУ- 32Мв, диск 10Гв, Видео –8Мв, Windows-98, Windows-2000, NT, ХР, модем в зависимости от телефонной линии, можно узнать у местных провайдеров. Следует предостеречь от покупки очень навороченной материнской платы, так как в последних отсутствуют СОМ порты. Принтер лучше покупать лазерный так как сегодняшние радиолюбители уже давно не рисуют платы рейсфедером, а изготавливают их утюжно-лазерным способом о чем позже будет рассказано подробнее. Необходим так же программатор при помощи которого мы будем записывать коды программы в микроконтроллер. Программаторов существует огромное множество. Автор считает что самый удачный программатор подходящий для радиолюбителей это JDM программатор с программной оболочкой ic-prog. А наиболее удачной схемой является программатор JonisProg. Данным программатором на существующий момент можно программировать достаточно большое количество PIC, ATMEL контроллеров, флеш- память, pic карточек, fun карточек, интерфейс phoenix, интерфейс season + loger. Автором программатора JonisProg  является JOnas Treciokas из литвы, его официальный сайт находится по адресу [1]. На данном сайте можно почитать подробную информацию по программатору. Автором были проведены небольшие доработки схемы программатора рис1. и  схемы адаптера рис2. Программатор запитывается от компьютера  через стандартный четырех контактный  разъём Х2, и подключается через интерфейс СОМ порта X1. Шлейф соединяющий компьютер с программатором лучше делать не длиннее 20-30см. Разъем Х4 программатора надо состыковать с разъемом Х1 адаптера. Для программирования PIC контроллеров переключатель SA1 необходимо установить в крайнее нижнее положение. О всех возможностях программатора для других целей можно посмотреть на авторском сайте [1].

Для изготовления печатных плат лучше использовать односторонний стеклотекстолит. Это  конечно усложняет разводку дорожек, но зато удобен в случае изготовления платы  методом термопереноса (утюжно-лазерным способом). Если дорожки разводиться трассировщиком будут плохо то можно поставить со стороны деталей перемычки. Таким способом мы избавляемся от проблемы совмещения слоев, в случае с двухсторонней разводкой. Итак нарисовав плату в каком либо редакторе ( удобен ACCEL 15, PCAD2001), устанавливаем лазерный принтер на максимальный выход тонера, отключаем все слои кроме дорожек и отверстий, инвертируем при необходимости и печатаем на термобумагу от факса, предварительно наклеенную на стандартный лист по контуру, чувствительным слоем наружу. Для этих целей удобно пользоваться карандашом для склейки бумаги. Подготавливаем стеклотекстолит (гетинакс): для этого замеряем размеры выведенного чертежа и ножницами,

 

Рис1.

 

Рис2.

 

предназначенными для резки металла вырезаем заготовку. Обрабатываем фольгу очень мелкой наждачной бумагой (нулёвкой) и протираем ацетоном или спиртом. Затем накладываем на стеклотекстолит, тонером к фольге. При помощи утюга разглаживаем около минуты ( это зависит от размеров платы). Утюг установлен на максимум. После этого кладут под струю теплой воды и замачивают минут 15-20. Затем пальцами стирают как резинкой бумагу, при этом на поверхности фольги остается тонер. Сцепление и кислотостоустойчивость тонера позволяют травить практически в любых известных растворах. Если тонер расплылся, операцию повторяют, предварительно уменьшив время или температуру утюга. На следующем этапе сверлят отверстия. Зачищают поверхность мелкой наждачной бумагой и протирают ацетоном. Маленькой кисточкой наносят на дорожки жидкую канифоль и небольшим количеством припоя облуживают поверхность. Таким методом удаётся получить печатную плату по качеству не уступающему промышленной.  Печатать на бумагу лучше из программы на которой разводится плата. В программе ACCEL 15 можно выводить дорожки 1:1, инвертировать, разворачивать, включать и отключать слои, при необходимости.

Печатные платы программатора изготовленные таким способом приведены на рис3. и адаптера рис4. и имеют соответственно размеры 110х75см и 118х60см. Файлы печатных плат в формате ACCEL 15, (PCAD2000) высланы в редакцию.

В схеме можно использовать микросхемы серий 555, 1533. Панельки лучше использовать цанговые. Диод VD5 любой c барьером шотки, в крайнем случае Д311. На коллекторе VT1 должно быть напряжение 13-14 вольт. Для этого при необходимости можно последовательно с диодами VD3,VD4 установить ещё один. Остальные детали не критичны.

 

Рис3.

 

 

Рис4.

 

На компьютере надо установить программу ic-prog. На момент написания статьи с сайта [2] из папки Download можно скачать последнюю версию icprog105D. Если на компьютере установлена Windows-2000, NT или ХР то дополнительно надо скачать и подключить драйвер icprog_driver.

Запустив программу и подключив программатор настраивают оболочку. В меню Settings необходимо выбрать Options. Далее в Language выбираем язык Russian и перезапускаем программу. После этого имеем меню на русском языке. Заходим в Настройки далее выбираем JDM programmer и устанавливаем номер COM порта к которому подключен программатор. Устанавливаем точку Используя драйвер Windows. Остальные все галочки должны быть сняты. Задержка Ввода/Вывода зависит от конкретного компьютера. При использовании Windows-2000, NT или ХР подключаем драйвер icprog_driver, для этого в Опциях на вкладке Общие надо установить галочку напротив NT/2000/XP драйвер. На этом настройка программатора завершена.

На следующем этапе освоения, выберем микроконтроллер и поговорим о том, что он из себя представляет. Из всего разнообразия микроконтроллеров необходимо выбрать тот, который будет наиболее отвечать поставленной задаче. Фирма микрочип на данный момент выпускает несколько семейств КМОП микроконтроллеров с внутренним ПЗУ, ОЗУ, таймерами, АЦП, ШИМ и другими периферийными модулями. Самые маленькие это PIC10  -3–6 вывода, PIC12 - 8 выводов, PIC16- 14-68 выводов, PIC17- 40-84 вывода, PIC18- 28-84 вывода, dsPIC30-28-64 вывода, rfPIC12- 18-20 выводов, со встроенным радиоканалом. Каждое семейство имеет свое назначение и область применения. Разработчик при выборе конкретного микроконтроллера исходит от количества необходимых выводов, скорости выполнения операции, встроенных периферийных модулях, условиях эксплуатации и стоимости. Поэтому сначала чертят предполагаемую схему всего устройства, и примерный алгоритм его работы. По результатам этого этапа выбирают микроконтроллер. При нехватке портов ввода/вывода, (схема постепенно разбухает как правило, так и бывает, поэтому надо выбирать контроллер с большим, чем предполагалось количеством выводов) заменяют на микроконтроллер, с другим количеством выводов. Печатную плату следует разрабатывать на самом последнем этапе, а отлаживать конструкцию лучше на макетной плате.

Идентифицируют тип микроконтроллера согласно коду, следующему за семейством. То есть в обозначении идут буквы указывающие на тип памяти программ : EPROM- обозначается индексом “С”, ROM- обозначается индексом “CR”, FLASH- обозначается индексом F. Если перед этими буквами стоит индекс “L” то это означает что данный микроконтроллер работает в расширенном диапазоне питания . Далее идет порядковый номер разработки, 2-4 цифры. Следующие 2 цифры обозначают

Табл1.

L

= PLCC (пластиковый выводной кристаллоноситель)

P

= пластиковый DIP

S

= кристалл в ячеистой упаковке

W

= кристалл в форме пластины

MR

= микромодуль на ленте, 8 контактный, 35 мм

MT

= микромодуль на подносе, 8 контактный

OT

= SOT-23, 5 контактный

SL

= SO 150 mil, 14 выводный

SM

= SO 207 mil, 8 выводный

SN

= SO 150 mil, 8 выводный

SO

= SOIC 300 mil

SS

= пластиковый узкий SSOP

ST

= тонкий узкий SO (4.4 мм)

TO

= пластиковый транзисторный, 3 выводный

TS

= тонкий SO (8x20 мм)

TT

= маленький пластиковый транзисторный, 3 выводный

VS

= очень маленький SO (8x12 мм)

WF

= нарезанная пластина

CL

= CERQUAD с окошком

JW

= CERDIP с окошком для УФ стирания

PQ

= PQFP (пластиковый, квадратный, плоский)

PT

= TQFP (тонкий, пластиковый, квадратный, плоский)

SP

= пластиковый DIP

SB

= COB (кристалл на плате)

максимальную частоту кварцевого генератора в мГц. Последующая буква означает рабочую температуру кристалла I=-40oC...+85oC,  E=-40oC...+125oC, при отсутствии буквы = 0oC...+70oC. И наконец последние буквы обозначают тип корпуса табл1. Например, PIC16F873-20/P означает микроконтроллер фирмы микрочип среднего семейства, с FLASH памятью программ (многократное перепрограммирование порядка 1000 циклов), максимальная частота кварца 20мГц, рабочий диапазон температур 0oC...+70oC, корпус пластиковый типа DIP.

Так как нашей целью является изучение микроконтроллера, другой задачи мы не ставим, поэтому его мы и будем рассматривать. Внутренняя структура микроконтроллера изображена на рис5. Для данного микроконтроллера нижним пределом напряжения

 

Рис5.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

питания будет 4 вольта при частоте кварца до 16мГц, при частоте кварца 20мГц от 4,5 вольт, верхний предел 5,5вольт (в модификациях PIC16LF873-04/P нижний предел 2 вольта при кварце 4мГц и верхний 5,5вольт). Общее потребление зависит от частоты работы тактового генератора, включенных периферийных модулях, и подключенных нагрузок, и может быть в пределах от 20мкА до 250-300ма. А в режиме сна (sleep) в

 

Табл2.

Обозначение
 вывода

№ вывода  DIP

Описание

OSC1/CLKIN

9

Вход генератора/ вход внешнего тактового сигнала

OSC2/CLKOUT                 

10

Выход генератора. Подключается кварцевый или керамический резонатор. В RC режиме тактового генератора на выходе OSC2 присутствует тактовый сигнал CLKOUT, равный Fosc/4

-MCLR/Vpp

1

Вход сброса микроконтроллера или вход напряжения программирования. Сброс микроконтроллера происходит при низком логическом уровне сигнала на входе.

 

 

Двунаправленный порт ввода/вывода PORTA.

RAO/AN0

2

RA0 может быть настроен как аналоговый канал 0

RA1/AN1

3

RA1 может быть настроен как аналоговый канал 1

RA2/AN2/Vref-

4

RA2 может быть настроен как аналоговый канал 2 или вход отрицательного опорного напряжения

RA3/AN3/Vref+

5

RA3 может быть настроен как аналоговый канал  или вход положительного опорного напряжения

RA4/TOCKI

6

RA4 может использоваться в качестве входа внешнего тактового сигнала для TMR0. Выход с открытым стоком.

RA5/-SS/AN4

7

RA1 может быть настроен как аналоговый канал 1 или вход выбора микросхемы в режиме ведомого SPI

 

 

Двунаправленный порт ввода/вывода PORTB. PORTB имеет программно подключаемые подтягивающие резисторы на входах.

RBO/INT

21

RBO может использоваться в качестве входа внешних прерываний

RB1

22

 

RB2

23

 

RB3/PGM

24

RB3 может использоваться в качестве входа для режима низковольтного программирования

RB4

25

Прерывания по изменению уровня входного сигнала.

RB5

26

Прерывания по изменению уровня входного сигнала.

RB6/PGC

27

Прерывания по изменению уровня входного сигнала или вывод для режима внутрисхемной отладки ICD. Тактовый вход в режиме программирования.

RB7/PGD

28

Прерывания по изменению уровня входного сигнала или вывод для режима внутрисхемной отладки ICD. Вывод данных в режиме программирования.

 

 

Двунаправленный порт ввода/вывода PORTC

RCO/T1OSO/T1CKI

11

RC0 может использоваться в качестве выхода генератора TMR1 или входа внешнего тактового сигнала для TMR1.

RC1 /Т1OSI/CCP2

12

RC1 может использоваться в качестве входа генератора для TMR1 или вывода модуля ССР2.

RC2/CCP1

13

RC2 может использоваться в качестве вывода модуля ССР1.

RC3/SCK/SCL

14

RC3 может использоваться в качестве входа/выхода тактового сигнала в режиме SPI и I2C.

RC4/SDI/SDA

15

RC4 может использоваться в качестве входа данных в режиме SPI или вход/выход данных в режиме I2C.

RC5/SDO

16

RC5 может использоваться в качестве выхода данных в режиме SPI.

RC6/TX/CK

17

RC6 может использоваться в качестве вывода передатчика USART в асинхронном режиме или вывода синхронизации USART в синхронном режиме.

RC7/RX/DT

18

RC7 может использоваться в качестве вывода приемника  USART в асинхронном режиме или вывода данных USART в синхронном режиме.

Vss

8,19

Общий вывод для внутренней логики и портов ввода/вывода

VDD

20

Положительное напряжение питания для внутренней логики  и портов ввода/вывода

 

зависимости от модификации  0,9-10мкА. В таблице 2 приведена цоколёвка и назначение ножек микроконтроллера.

  Микроконтроллер имеет 6 портов ввода/вывода канала “А” (RA0-RA5), 8 портов  канала “В” (RB0-RB7) 8 портов канала “C” (RC0-RC7). Некоторые порты кроме стандартных функций ввода/вывода имеют дополнительные возможности, которые мультиплицированы с периферийными модулями. В PIC-контроллерах каждому порту соответствует два регистра - данных и направления (TRIS). При этом в зависимости от содержания регистра направления каждый вывод может быть индивидуально запрограммирован или на ввод или на вывод. Максимальная нагрузочная способность портов 25 мА втекающий ток, 20 мА вытекающий ток, но с учетом, что общая нагрузка на порты не будет превышать 200ма. Входное напряжение порта не может быть более Uпит+0,3в и не менее Uпит –0,3в , так  как для защиты каждого порта на входе установлены диоды. Выход порта RA4 с открытым коллектором и триггером Шмидта на входе. Для формирования уровня логической 1 необходимо дополнительно навесить внешний резистор. Внутри микроконтроллера к каждому порту канала “B” подключены подтягивающие резисторы которые можно отключить с помощью программы. Четыре канала RB4-RB7 могут генерировать прерывания по изменению логического уровня на входах. RB0/INT может работать как вход внешнего источника прерывания. Все входы канала “С” имеют триггер Шмидта.

Кроме портов микроконтроллер содержит FLASH память программ, 14-разрядных слов расположенную по адресам с 0000H по 0FFFh (4 KB).  192 байта ОЗУ (память данных или регистры общего назначения и представляет собой статическую память, при отключении питания информация обнуляется). И 128 байт EEPROM (Электрически стираемая память данных ППЗУ, при отключении питания информация остаётся). ОЗУ или регистры общего назначения физически находятся в одном адресном пространстве с регистрами специального назначения и имеют общее количество более 256, поэтому адресное пространство разбито на 4 банка. Каждый банк имеет адреса от 00H до 7FH (128 байт) и для полной адресации необходимо 7 разрядное слово. Банки переключаются еще 2 разрядами. Адресация всех трех видов памяти находится в разном адресном пространстве и при изменении счетчика памяти программ не может изменить адреса регистров или EEPROM памяти. Такая архитектура основанная на концепции раздельных шин и областей памяти для данных и команд называется Гарвардской архитектурой. Шина данных и память  данных имеют ширину 8 бит, а программная шина и программная память имеют ширину 14  бит. Такая концепция  обеспечивает простую, но мощную систему команд, разработанную так, что битовые,  байтовые и регистровые операции работают с высокой скоростью и с перекрытием по  времени выборок команд и циклов выполнения. 14- битовая ширина программной памяти обеспечивает выборку 14-битовой команды в один цикл. Двухступенчатый конвейер  обеспечивает одновременную выборку и исполнение команды. Все команды выполняются за один цикл, (200нс при использовании кварцевого резонатора на частоту 20мГц) исключая команды переходов. Данный микроконтроллер имеет всего 35 команд ( инструкций ). Смысл и принципы работы команд будут рассмотрены позже.

Микроконтроллер имеет 8 уровневый стек, в котором хранятся адреса, и необходим в случае перехода по прерыванию или обработки подпрограммы. Он работает, как и во всех других микропроцессорах по принципу оружейного магазина, первым вошел, последним вышел.

Контроллер PIC16F873 имеет 8 разрядное арифметическо -логическое устройство (ALU) необходимое для проведения операций вычитания, сложения, операций “И”, “ИЛИ”  и некоторых других инструкций. А также аккумулятор, (в PIC контроллерах обозначается как “W”) 8 разрядный регистр, с которым ALU производит свои действия и иногда помещает результаты операции.

Не малым преимуществом микроконтроллера является встроенный тактовый генератор. Он может работать в одном из четырех режимов LP- низкочастотный резонатор, XT-обычный резонатор, HS- высокочастотный резонатор, RC- внешняя RC цепочка. А так же возможна работа генератора от внешнего тактового сигнала. В режимах LP, XT, HS,  кварцевый резонатор подключается к выводам OSC1/CLKIN и OSC2/CLKOUT, согласно схемы изображенной на рис 6. Параметры конденсаторов для керамического и кварцевого резонатора приведены в таблице 3. При подключении внешнего тактового сигнала, логический уровень соответствующий напряжению питания микроконтроллера подают на вход OSC1. В схемах не требующих высокостабильной тактовой частоты возможно использовать RC цепочку, которую подключают в соответствии с рис7. Частота RC генератора зависит от напряжения питания, значения сопротивления R1, емкости C1 и рабочей температуры. Значения, рекомендуемые для R1

 

                    

Рис6.                                                                         Рис7.

 

Табл3.

режим

частота

OSC1

OSC2

Керамический резонатор

XT

455кГц

68-100пф

68-100пф

2мГц

15-68пф

15-68пф

4мГц

15-68пф

15-68пф

HS

8мГц

10-68пф

10-68пф

16мГц

10-22пф

10-22пф

Кварцевый резонатор

LP

32кГц

33пф

33пф

200кГц

15пф

15пф

XT

200кГц

47-68пф

47-68пф

1мГц

15пф

15пф

4мГц

15пф

15пф

HS

4мГц

15пф

15пф

8мГц

15-33пф

15-33пф

20МГц

15-33пф

15-33пф

 

должны быть больше 3 ком но меньше 100ком. Конденсатор С1 должен быть больше 20пф. С вывода OSC2 можно снять частоту генератора, деленную на 4 для синхронизации с другими устройствами.

Кроме тактового, во всех контроллерах имеется внутренний RC-генератор, использующийся для работы "Сторожевого Пса" (Watch Dog " - WDT), или просто "собаки”. Этот генератор, если он включен при программировании, тактирует специальный счётчик, который должен периодически сбрасываться программой через определенные промежутки времени, не больше заданного. Если в результате зависания или некорректности работы программы счетчик не будет вовремя сброшен, произойдет перезапуск контроллера. Время сброса WDT можно увеличить подключив к нему предделитель.

Предделитель представляет собой 8 разрядный счетчик коэффициент деления, которого можно задать программным способом. Предделитель можно подключать как к WDT так и к TMR0. Для WDT коэффициенты деления будут- 1:1, 1:2, 1:4, 1:8, 1:16, 1:32, 1:64 и 1:128, для TMR0 - 1:2, 1:4, 1:8, 1:16, 1:32, 1:64, 1:128 и 1:256. Текущее состояние предделителя не возможно записать/прочитать программным способом.

Кроме того, PIC16F873 содержит три таймера TMR0, TMR1, TMR2. Таймер 0 (TMR0) представляет собой 8 разрядный таймер/счетчик. Его текущее состояние, возможно, прочитать/записать в любой момент времени. Возможно включить прерывание при переполнении (переходе от состояния FFH к 00H ). Счетчик может быть подключен к внешнему или внутреннему тактовому сигналу, при этом, возможно выбрать момент приращения счетчика от высокого к низкому или от низкого к высокому уровню. Возможность подключения перед счетчиком программируемого предделителя. Внешний тактовый сигнал заводится на ножку T0CKI, которая объединена с RA4.

Таймер 1 (TMR1) представляет собой 16 разрядный таймер/счетчик, состоящий из двух 8- разрядных регистров TMR1H (старший байт) и TMR1L (младший байт). Его текущее состояние возможно, прочитать/записать в любой момент времени. Данный таймер может быть дополнительно использован с модулем CCP. При переполнении (переходе от состояния FFFFH к 0000H ) возможно включить прерывание. Счетчик может быть подключен к внешнему или внутреннему тактовому сигналу, приращение счетчика происходит по каждому переднему фронту сигнала. У таймера TMR0 имеется свой программируемый предделитель, с коэффициентами деления 1:1, 1:2, 1:4, 1:8. Данный таймер может тактироваться от дополнительного встроенного низкочастотного генератора, максимальная частота которого может быть не более 200кГц. Схема включения кварцевого резонатора показана на рис7, а номиналы конденсаторов в таблице 4. Внешний кварц подключается к ножкам T1OSI и T1OSO, которые объединены с RC1, RC0.

       Рис7.

 

Табл4.

Кварцевый резонатор

LP

32кГц

33пф

33пф

100кГц

15пф

15пф

200кГц

15пф

15пф

 

Таймер 2 (TMR2) представляет собой 8 разрядный таймер с программируемым предделителем, выходным делителем и 8 разрядным регистром периода (PR2). Его текущее состояние возможно, прочитать/записать в любой момент времени. TMR2 может быть опорным таймером, для модуля ССР, при использовании его в ШИМ (широтно – импульсная модуляция) режиме. Входной тактовый сигнал (Fosc/4) поступает через программируемый предделитель, с коэфициентом деления 1:1, 1:4 или 1:16. TMR2 инкрементирует (увеличивает) значение от 00H до значения содержащегося в регистре периода, затем сбрасывается в 00H. Регистр периода PR2 также доступен для записи/чтения. Сигнал переполнения TMR2 проходит через выходной делитель с переключаемым коэффициентом деления 1:1 или 1:16 и при  необходимости вызывает прерывание.

Модуль (CCP) захват/сравнение/ШИМ содержит 16 разрядный регистр, который может быть использован в качестве 16 разрядного регистра захвата данных, 16 разрядного регистра сравнения или двух 8 разрядных регистров ШИМ. В микроконтроллере PIC16F873 имеются два модуля CCP1 и CCP2. Каждый  модуль ССР состоит из двух 8 разрядных регистров CCPR1L (CCPR2L) –младший байт, и CCPR1H (CCPR2H) –старший байт. Все регистры доступны для записи/чтения. Модули в режиме захвата/сравнения используют дополнительно таймер TMR1, поэтому он не может быть использован одновременно в других приложениях. В режиме ШИМ таймер TMR2, при этом, если будут использоваться оба модуля их частота и фаза будет одинаковая. В режиме захвата можно использовать предделитель, который используется в качестве счетчика событий  с программируемыми коэфициентами деления 1:1, 1:4 или 1:16. В режиме сравнения 16 разрядный регистр CCPR1 сравнивается со значением TMR1. Как только значения в регистрах становятся одинаковые, модуль CCP изменяет состояние вывода CCP1, в этот момент так же может быть установлено прерывание. Период ШИМ определяется значениями в регистре PR2, а скважность старшими 8–ю. битами в регистрах CCPR1L (CCPR2L) и 2- я младшими битами в регистре CCP1CON (CCP2CON). В режиме захвата/сравнение/ШИМ используются ножки CCP1 совмещенные с RC2 и CCP2 совмещенные с RC1.

Модуль ведущего синхронного, последовательного порта (MSSP) может использоваться для связи с периферийными устройствами. MSSP может работать в одном из двух режимов: Последовательный периферийный интерфейс –SPI и интерфейс I2c. В режиме SPI возможен одновременный синхронный прием/передача 8-разрядных данных. Модуль MSSP поддерживает четыре режима SPI с использованием трех выводов совмещенных с портами микроконтроллера. SDI/RC4 - вход последовательных данных, SDO/RC5 –выход последовательных данных, SCK/RC3- тактовый сигнал. Дополнительно может быть задействован четвертый вывод для работы в режиме ведомого –SS/RA5. В режиме I2c модуль MSSP полностью поддерживает все функции ведущих и ведомых устройств, включая поддержку общего вызова, аппаратные прерывания по детектированию битов START и STOP для определения занятости шины I2c в режиме ведущего. В модуле MSSP реализована поддержка стандартного режима 7, 10- разрядной адресации. Для работы с шиной I2c используется два вывода совмещенные с портами SCL/RC3 (сигнал синхронизации) и SDA/RC4 (данные). Выводы SDA и SCL автоматически настраиваются при включении режима I2c.

Универсальный синхронно-асинхронный приемопередатчик USART – это модуль последовательного ввода/вывода, который может работать в полнодуплексном асинхронном режиме для связи с терминалами, персональными компьютерами или синхронном полудуплексном режиме для связи с микросхемами ЦАП, АЦП и т.д. Модуль может работать в трёх режимах: асинхронный- полный дуплекс, ведущий синхронный – полудуплекс, ведомый синхронный – полудуплекс и использует выводы совместно с портами TX/CK/RC6 и RX/DT/RC7. USART поддерживает режим детектирования 9- разрядного адреса для работы в сетевом режиме. Для работы USART в синхронном ведущем и асинхронном режимах используется отдельный 8-разрядный генератор скорости обмена (BRG) в бодах, период которого определяется значением в регистре SPBRG. В синхронном режиме этот бит не используется.

Модуль аналого-цифрового (АЦП) 10 разрядного преобразователя имеет пять каналов, входы которых совмещены с портами ввода/вывода AN0/RA0, AN1/RA1, AN2/RA2, AN3/RA3, AN4/RA5. Физически в микроконтроллере преобразователь АЦП  один, но он может коммутироваться к разным входам. Модуль АЦП преобразует входное напряжение методом последовательного приближения, при этом возможно использовать опорное напряжение с выводов совмещенных с портами Vref-/RA2, Vref+/RA3 или выводов подключенных к напряжению питания Vss и Vdd. Модуль может быть тактирован частотой кварцевого резонатора  Fosc/2, Fosc/8, Fosc/32 или отдельным внутренним RC генератором. При использовании RC генератора ЦАП может преобразовывать напряжение в режиме сна. При преобразовании полных 10 разрядов этот режим часто используют для уменьшения наводок на вход аналогового канала. Данные преобразования сохраняются в регистрах ADRESH (старший байт) и ADRESL (младший байт). Так как данные 10 разрядные имеется возможность выравнивать данные влево в сторону старшего байта, или вправо в сторону младшего байта. Среднее время преобразования АЦП 30 мкс, включая время выборки. По окончании преобразования можно сгенерировать прерывание.

Микроконтроллер PIC16F873 имеет устройства повышающие надёжность системы и возможность защиты кода программы. Схема POR (сброс по включению питания) удерживает микроконтроллер в состоянии сброса, пока напряжение VDD не достигнет требуемого уровня (от 1.2В до 1.7В). Для включения схемы POR необходимо соединить вывод -MCLR с VDD через резистор, не требуя внешней RC цепочки, обычно используемой для сброса. Схема PWRT представляет собой таймер включения питания который обеспечивает задержку в 72мс по сигналу схемы сброса POR. Таймер включения питания работает от внутреннего RC генератора и удерживает микроконтроллер в состоянии сброса по активному сигналу от PWRT. Задержка PWRT позволяет достигнуть напряжению VDD номинального значения. Таймер запуска генератора (OST) обеспечивает задержку в 1024 такта генератора (вход OSC1) после окончания задержки от PWRT (если она включена). Это гарантирует, что частота кварцевого/керамического резонатора стабилизировалась. Задержка OST включается только в режимах HS, XT и LP тактового генератора после сброса POR или выхода микроконтроллера из режима SLEEP. Схема ВОР сбрасывает микроконтроллер если напряжение VDD опускается ниже 4.0В на время больше Tbor. Если длительность снижения напряжения питания меньше Tbor, сброс микроконтроллера не произойдет.

            Биты конфигурации Табл5. микроконтроллера располагаются по адресу 2007H и используются для указания режима его работы. Программируются биты конфигурации при помощи программатора.

 

Табл5.

СР1

СРО

DEBUG

-

WRT

CPD

LVP

BODEN

СР1

СРО

-PWRTE

-WDTE

FOSC1

FOSC0

Бит13                                                                                                                                                    Бит0

биты 13-10:

СР1:СРО: Биты защита памяти программ

биты 5-4:

11= защита памяти программ выключена
10 = защищена память программ с адресами 1F00h-1FFFh
10 = защищена память программ с адресами 0F00h-0FFFh
01 = защищена память программ с адресами 1000h-1FFFh
01 = защищена память программ с адресами 0800h-0FFFh
00 = защищена память программ с адресами 0000h-1FFFh
00 = защищена память программ с адресами 0000h-0FFFh  

бит 11:   

DEBUG: Бит включения режима внутрисхемной отладки
1 = внутрисхемная отладка выключена, выводы RB6 и RB7 работают как каналы вводы/вывода
0 = внутрисхемная отладка включена, выводы RB6 и RB7 используются отладчиком

бит 10:     

Не реализован: читается как '1'

бит 9:      

WRT: Бит разрешения записи во FLASH память программ
1 = разрешена запись во FLASH память программ через регистры управления EECON
0 = запрещена запись во FLASH память программ через регистры управления EECON

бит 8:      

CPD: Бит защиты EEPROM памяти данных
 1 = защита памяти данных выключена
 0 = защита памяти данных включена

бит 7:      

LVP: Бит разрешения низковольтного программирования
1 = вывод RB3/PGM работает как PGM, режим низковольтного программирования включен
0 = вывод RB3/PGM работает как цифровой порт ввода/вывода, вывод HV используется для
программирования микроконтроллера

бит 6:      

BODEN: Бит разрешения сброса по снижению напряжения питания
 1 = разрешен сброс BOR
 0 = запрещен сброс BOR

бит 3:     

 -PWRTE: Бит разрешения работы таймера включения питания
 1 = PWRT выключен
 0 = PWRT включен

бит 2:      

WDTE: Бит разрешения работы сторожевого таймера
1 = WDT включен
0 = WDT выключен

биты 1-0:

FOSC1:FOSC0: Биты выбора режима тактового генератора
11 = RC генератор
10 = HS генератор
01 = XT генератор
00 = LP генератор

 

 

В заключение данного раздела хочется сказать, что нет необходимости все это запоминать сразу, все встанет на свои места по мере практического освоения микроконтроллера. Для более подробного изучения можно скачать англоязычную документацию DS30292C доступная с сайта [5]. А также некоторые переводы документов на русский язык, в том числе и  для PIC16F873 на сайте [6]. При необходимости всегда можно задать вопрос на русскоязычной конференции [7] посвященной изделиям фирмы микрочип.

                                                                                 

На этом этапе мы рассмотрим среду разработки программ MPLAB для микроконтроллеров PICmicro фирмы Microchip, разрешённую для бесплатного коммерческого использования. Данная программа позволяет писать, отлаживать и оптимизировать программы для Ваших разработок. MPLAB включает в себя текстовый редактор, симулятор (виртуальный отладчик), менеджер проектов. Данная среда обеспечивает поддержку разнообразных отладочных средств фирмы Microchip (PICSTART Plus, PRO MATE II, ICD2 и т.д.) Среда разработки MPLAB IDE позволяет: ассемблировать, компилировать исходный текст; отлаживать логику работы, наблюдая с помощью симулятора или, в реальном времени, с использованием эмуляторов и внутрисхемных отладчиков; просматривать переменные в окнах просмотра; программировать кристаллы с помощью программаторов PICSTART Plus или PRO MATE II и многое другое. С ней неплохо интегрируются и программные продукты от других фирм производителей. На момент написания статьи доступна версия MPLAB IDE V7.11 с сайта [8]. Объем архива 29,895мб поэтому закачивать файл лучше всего специально предназначенными качалками например типа ReGet или ему подобными, они позволяют в случае обрыва связи продолжить закачку от места обрыва. Когда файл закачан его необходимо разархивировать программой WinZip или WinRar в отдельную папку например MPLAB IDE. Программу устанавливают запустив setup.

 Изучение MPLAB начнём с создания первого проекта, присвоим ему название- Micro. Создаём папку на диске C: (например C:/Micro) в которую будем помещать все файлы связанные с разрабатываемым проектом. Запускаем MPLAB IDE v7.11 нажав на ярлык установленный программой на рабочем столе. После запуска MPLAB появляется заставка, а затем окно с главным меню. А также два дополнительных окна Untitled Workspace и Output.  Нажимаем в главном меню закладку Fail  затем  New, откроется окно редактора программ Untitled. Сохраним даное окно под именем названия проекта, для этого в главном меню выберем закладку Fail  затем  Save As, в появившемся окне выберем нашу папку C:/Micro , в Имя файла напишем Micro.asm , а затем сохранить. В главном меню выбираем пункт Project  далее Project Wizard появится окно с приветствием помощника по созданию проекта. Нажимаем кнопку Далее (Next) и в следующем окне выбираем тип микроконтроллера Device. В данном случае PIC16F873 и кнопку Далее (Next). Появляется окно Select a language toolsuite. В окне Active Toolsuite: должно быть выбрано Microchip MPASM Toolsuite. В окне Toolsuite Contents будут указаны имена ассемблера, линкера и библиотеки, при установке курсора на данные имена в окне Location будет появляться путь размещения файлов, при необходимости их можно изменить нажав кнопку Browse. После этого нажимаем кнопку Далее (Next), появляется окно установки имени файла  и пути размещения проекта. В нашем случае Micro и C:\Micro.  Нажимаем кнопку Далее в появившемся окне Add any existing files to your project  слева выбираем папку Micro и файл Micro.asm а затем жмем кнопку Add. В появившемся справа окне пути ставим галочку (в квадратике) и нажимаем кнопку Далее. Появится окно Project Parameters, если выбранные параметры Вас устраивают то нажимают Готово. Окно Untitled Workspace изменит своё название на Micro.mcp. Так как у нас не имеется дополнительной отладочной платы (MPLAB ICD-2) поэтому включим программный симулятор (отладчик). Нажимаем в главном меню закладку Debugger потом Select Tool  и MPLAB SIM.  В главном меню появятся дополнительные кнопки симулятора. Для того чтобы симулятор правильно подсчитывал временные задержки необходимо установить частоту кварцевого резонатора который реально будет у нас стоять в проекте. Установим кварц 20мГц максимально возможная паспортная частота для данного контроллера (реально микроконтроллеры иногда работают с кварцами 30-60мГц) при этом каждый шаг программы будет выполняться за 200нс. Нажмем в главном меню закладку Debugger потом Setting  и в появившемся окне Simulator Setting выберем закладку Osc/Trace в окне напишем 20 и установим точку на MHz, а затем OK. Как уже описывалось ранее каждый процессор имеет свои биты конфигурации которые определяют режимы работы процессора, их необходимо установить. Нажимаем в главном меню закладку Configure потом Configuration Bits. В появившемся окне устанавливаем тип генератора OscillatorHS , для начала отключим Watchdog TimerOff , задержку по включению питания желательно включать всегда Power Up TimerOn , детектор по снижению питания без лишней необходимости тоже лучше не отключать Brown Out DetectOn , так как мы пока не будем пользоваться внутрисхемным программированием (программирование микроконтроллера в собранном устройстве и запаянном микроконтроллере позволяет модифицировать устройства непосредственно перед отправкой клиенту), поэтому данный режим отключим Low Voltage ProgramDisabled. Остальные три строки относятся к разрешению записи памяти программ и защиты адресного пространства от копирования, их можно оставить без изменения. На этом предварительная настройка проекта завершена. На время закроем проект. Для этого в главном меню выберем закладку File далее Exit. На вопрос Do you to save the workspace before closing ответим Да. Отладку программы рассмотрим позже. Подробнее про MPLAB IDE версии 4.00 можно почитать в русифицированном документе основанном на переводе DS51025D с сайта микрочип [9].

На следующем этапе нарисуем простейшую схему, рассмотрим команды процессора, некоторые регистры специального назначения и попробуем отладить схему в симуляторе MPLAB.

Многие программисты говорят научился мигать светодиодом, значит освоил микроконтроллер, далее идет этап совершенствования методов и навыков. Эта задача не имеет завершения, так как постоянно выпускаются все новые и новые микроконтроллеры с новыми модулями. Схема первого проекта представлена на Рис8. Как рекомендует фирма микрочип в качестве ZQ1 необходимо использовать кварц с параллельным резонансом. С1-С3 желательно чтобы были керамическими и располагались как можно ближе к ножкам микроконтроллера.

 

Рис8.

 

            Как уже упоминалось микроконтроллер PIC16F873 содержит 35 инструкций, полный список приведен в табл.6. Команды разделены на три группы: байт ориентированные, бит ориентированные, команды управления и операций с константами.

 

Табл.6

Мнемоника команды

Описание

Циклов

Изм. флаги

Байт ориентированные команды

ADDWF         f,d

Сложение W и f

1

C,DC,Z

ANDWF         f,d

Побитное 'И' W и f

1

z

CLRF             f

Очистить f

1

z

CLRW

Очистить W

1

z

COMF            f,d

Инвертировать f

1

z

DECF              f,d

Вычесть 1 из f

1

z

DECFSZ        f,d

Вычесть 1 из f и пропустить если 0

1(2)

 

INCF               f,d

Прибавить 1 Kf

1

z

INCFSZ         f,d

Прибавить 1 к f и пропустить если 0

1(2)

 

IORWF          f,d

Побитное 'ИЛИ' W и f

1

z

MOVF            f,d

Переслать f

1

z

MOVWF        f

Переслать W в f

1

 

NOP

Нет операции

1

 

RLF                f,d

Циклический сдвиг f влево через перенос

1

с

RRF                f,d

Циклический сдвиг f вправо через перенос

1

с

SUBWF         f,d

Вычесть W из f

1

C.DC.Z

SWAPF          f,d

Поменять местами полубайты в регистре f

1

 

XORWF        f,d

Побитное 'исключающее ИЛИ1 W и f

1

z

Бит ориентированные команды

BCF                 f,b

Очистить бит b в регистре f

1

 

BSF                 f,b

Установить бит b в регистре f

1

 

BTFSC           f,b

Проверить  бит b  в  регистре f,  пропустить если 0

1(2)

 

BTFSS            f,b

Проверить бит b  в  регистре f,  пропустить если 1

1(2)

 

Команды управления и операций с константами

ADDLW         k

Сложить константу с W

1

C,DC,Z

ANDLW         k

Побитное 'И' константы и W

1

Z

CALL             k

Вызов подпрограммы

2

 

CLRWDT

Очистить WDT

1

-TO,-PD

GOTO             k

Безусловный переход

2

 

IORLW          k

Побитное 'ИЛИ' константы и W

1

Z

MOVLW        k

Переслать константу в W

1

 

RETFIE

Возврат из  подпрограммы  с  разрешением прерываний

2

 

RETLW          k

Возврат    из    подпрограммы    с    загрузкой константы в W

2

 

RETURN

Возврат из подпрограммы

2

 

SLEEP

Перейти в режим SLEEP

1

-TO.-PD

SUBLW          k

Вычесть W из константы

1

C,DC,Z

XORLW         k

Побитное 'исключающее ИЛИ' константы и W

1

Z

 

В таблице w -означает рабочий регистр, в некоторых микроконтроллерах данный регистр называют аккумулятором. Например при выполнении команды над регистром w и константой результат будет помещен в w (аккумулятор). fозначает адрес регистра. dуказатель адресата результата операции, при d=0 –результат сохраняется в регистре w, при d=1 –результат сохраняется в регистре f. В кодах программы вместо d иногда напрямую указывают регистр f или w. bномер бита в 8 –разрядном регистре. kконстанта, под которой понимается метка или 8 –разрядные данные. Cфлаг признака переноса. DC- флаг признака вспомогательного переноса из младшего полубайта в старший. Zфлаг признака нулевого результата, выполненной арифметической или логической операции.  TO=1 – флаг выполнения команды clrwdt, sleep или включено питание, TO=0 – сработал wdt .    PD=1 - флаг выполнения команды clrwdt или включено питание, PD=0 – выполнена команда sleep .   

            Подробнее о действии команд на микроконтроллер будем рассматривать при практическом программировании.

            Микроконтроллер PIC16F873 содержит регистры специального назначения которые физически расположены в 4 банках, некоторые регистры повторяются в каждом банке. Табл7. С помощью регистров специального назначения выполняется управление функциями ядра и периферийными модулями микроконтроллера. Рассмотрим основные из них.

 

 

Табл7.

Адрес

Имя Регист.

Бит 7

Бит 6

Бит 5

Бит 4

БитЗ

Бит 2

Бит1

Бит0

Банк 0

00h

INDF

Обращение к регистру, адрес которого записан в FSR (не физический регистр)

01h

TMRO

Регистр таймера 0

02h

PCL

Младше биты счетчика команд PC

03h

STATUS

IRP

RP1

RPO

-ТО

-PD

Z

DC

С

04h

FSR

Регистр адреса при косвенной адресации

05h

PORTA

-

-

Зап. в вых. защелку PORTA чтение сост. выв. PORTA

06h

PORTB

Запись в выходную защелку PORTB, чтение состояния выводов PORTB

07h

PORTC

Запись в выходную защелку PORTC, чтение состояния выводов PORTC

08h

PORTD

Запись в выходную защелку PORTD, чтение состояния выводов PORTD

09h

PORTE

-

-

-

-

-

RE2

RE1

REO

0Ah

PCLATH

-

-

.-

Старшие биты счетчика команд PC

0Bh

INTCON

GIE

PEIE

TOIE

INTE

RBIE

TOIF

INTF

RBIF

0Ch

PIR1

PSPIF

ADIF

RCIF

TXIF

SSPIF

CCP1IF

TMR2IF

TMR1IF

0Dh

PIR2

-

  -

-

EEIF

BCLIF

-

-

CCP2IF

0Eh

TMR1L

Младший байт 16-разрядного таймера 1

0Fh

TMR1H

Старший байт 16-разрядного таймера 1

10h

T1CON

 -

 -

T1CKPS1

T1CKPSO

T1OSCEN

T1SYNC

TMR1CS

TMR1ON

11h

TMR2

Регистр таймера 2

12h

T2CON

-

TOUTPS3

TOUTPS2

TOUTPS1

TOUTPSO

TMR2ON

T2CKPS1

T2CKPSO

13h

SSPBUF

Буфер приемника MSSP / регистр передатчика

14h

SSPCON

WCOL

SSPOV

SSPEN

СКР

SSPM3

SSPM2

SSPM1

SSPMO

15h

CCPR1L

Младший байт захвата/сравнения/ШИМ ССР1

16h

CCPR1H

Старший байт захвата/сравнения/ШИМ ССР1

17h

CCP1CON

-

-

ССР1Х

CCP1Y

ССР1МЗ

ССР1М2

ССР1М1

ССР1МО

18h

RCSTA

SPEN

RX9

SREN

CREN

ADDEN

FERR

OERR

RX9D

19h

TXREG

Регистр данных передатчика USART

1Ah

RCREG

Регистр данных приемника USART

1Bh

CCPR2L

Младший байт захвата/сравнения/ШИМ ССР2

1Ch

CCPR2H

Старший байт захвата/сравнения/ШИМ ССР2

1Dh

CCP2CON

-

-

ССР2Х

CCP2Y |ССР2МЗ | ССР2М2|ССР2М1

ССР2МО

1Eh

ADRESH

Старший байт результат преобразования АЦП

1Fh

ADCONO

ADCS1

ADCSO

CHS2

CHS1

CHSO

GO/-DJNE 

  -

ADON

Банк 1

80h

INDF

Обращение к регистру, адрес которого записан в FSR (не физический регистр)

81h

OPTION_REG

-RBPU

INTEDG

T0CS

TOSE

PSA

PS2

PS1

PSO

82h

PCL

Младше биты счетчика команд PC

83h

STATUS

IRP

RP1

RPO

-ТО

-PD

Z

DC

C

84h

FSR

Регистр адреса при косвенной адресации

85h

TRISA

-

 -

 Направление выводов PORTA

86h

TRISB

Направление выводов PORTB

87h

TRISC

Направление выводов PORTC

88h

TRISD

Направление выводов PORTD

89h

TRISE

IBF

OBF

IBOV

PSPMODE

 -

Направление выводов PORTE

8Ah

PCLATH

  -

 -

 -

Старшие биты счетчика команд PC

8Bh

INTCON

GIE

PEIE

TOIE

INTE

RBIE

TOIF

INTF

RBIF

8Ch

PIE1

PSPIE

ADIE

RCIE

TXIE

SSPIE

CCP1IE

TMR2IE

TMR1IE

8Dh

PIE2

 -

  -

-

EEIE

BCLIE

-

-

CCP2IE

8Eh

PCON

-

-

-

-

-

-

-POR

-BOR

91h

SSPCON2

GCEN

ACKSTAT

ACKDT

ACKEN

RCEN

PEN

RSEN

SEN

92h

PR2

Регистр периода таймера 2

93h

SSPADD

Регистр адреса / Регистр генератора скорости обмена

94h

SSPSTAT

SMP

СКЕ

D/-A

Р

S

R/-W

UA

BF

98h

TXSTA

CSRC

ТХ9

TXEN

SYNC

-

BRGH

TRMT

TX9D

99h

SPBRG

Регистр генератора скорости USART

9Eh

ADRESL

Младший байт результат преобразования АЦП

9Fh

ADCON1

ADFM

-

-

-

PCFG3

PCFG2

PCFG1

PCFG0

Банк 2

100h

INDF

Обращение к регистру, адрес которого записан вFSR (не физический регистр)

101h

TMRO

Регистр таймера 0

102h

PCL

Младше биты счетчика команд PC

103h

STATUS

IRP

RP1

RPO

-ТО

-PD

Z

DC

С

104h

FSR

Регистр адреса при косвенной адресации

106h

PORTB

Запись в выходную защелку PORTB, чтение состояния выводов PORTB

10Ah

PCLATH

-

-

-

Старшие биты счетчика команд PC

10Bh

INTCON

GIE

PEIE

TOIE

INTE

RBIE

TOIF

INTF

RBIF

10Ch

EEDATA

Регистр данных, младший байт

10Dh

EEADR

Регистр адреса, младший байт

10Eh

EEDATH

-

-

Регистр данных, старший байт

10Fh

EEADRH

-

-

 -

Регистр адреса, старший байт

Банк 3

180h

INDF

Обращение к регистру, адрес которого записан вFSR (не физический регистр)

181h

OPTION_REG

-RBPU

INTEDG  

TOCS

TOSE

PSA

PS2

PS1

PS0

182h

PCL

Младше биты счетчика команд PC

183h

STATUS

IRP

RP1

RPO

-ТО

-PD

Z

DC

С

184h

FSR

Регистр адреса при косвенной адресации

186h

TRISB

Направление выводов PORTB

18Ah

PCLATH

 -

 -

 -

Старшие биты счетчика команд PC

18Bh

INTCON

GIE

PEIE

TOIE

INTE

RBIE

TOIF

INTF

RBIF

18Ch

EECON1

EEPGD

-

-

-

WREER

WREN

WR

RD

18Dh

EECON2

Регистр управления 2 (физически не реализован)

 

Регистр STATUS содержит флаги состояния АЛУ, флаги причины сброса микроконтроллера и биты управления банками памяти данных. Табл 8. Регистр INTCON содержит биты разрешения и флаги прерывания TMR0, изменение уровня сигнала на входах PORTB и внешнего источника прерывания RB0/INT. Регистр OPTION_REG содержит биты управления предделителем TMR0/WDT, активным фронтом внешнего прерывания RB0/INT и подтягивающими резисторами на входах PORTB. Регистр PIE1 содержит биты разрешения периферийных прерываний. Регистр PIR1 содержит флаги прерываний периферийных модулей. Регистр T1CON содержит биты управления таймером TMR1. Регистр T2CON содержит биты управления таймером TMR2. Регистр TRIS(A,B,C) содержит биты управления направлением портов ввода-вывода (1-вход, 0-выход). Полный список регистров относящихся к интересующему вас микроконтроллеру можно посмотреть открыв блокнотом файл. Для PIC16F873 это будет C:\Program Files\MPLAB IDE\MCHIP_Tools/ P16F873A.INC .

 

Табл8.

Имя бита

№ бита

Назначение

Регистр STATUS

IRP                            

7

Бит выбора банка при косвенной адресации

RP1                        

6

Биты выбора банка при непосредственной адресации

RP0                     

5

NOT_TO                   

4

Флаг переполнения сторожевого таймера
1-после POR или выполнения команды clrwdt, sleep
0-после переполнения WDT

NOT_PD                

3

Флаг включения питания
1-после POR или выполнения команды clrwdt
0-после выполнения команды sleep

Z                       

2

Флаг нулевого результата
1-нулевой результат после выполнения арифметической или логической операции
0-не нулевой результат после выполнения арифметической или логической операции

DC                        

1

Флаг десятичного переноса или заёма
1-был перенос из младшего полубайта
0-не было переноса из младшего полубайта

C                       

0

Флаг переноса или заёма
1-был перенос из старшего бита
0-не было переноса из старшего бита

Регистр INTCON

GIE                    

7

Глобальное разрешение прерывания
1-разрешены все немаскированные прерывания
0-все прерывания запрещены

PEIE                

6

Разрешение прерывания от периферийных модулей
1-разрешены все немаскированные прерывания от периферийных модулей
0-прерывания от периферийных модулей запрещены

T0IE  

5

Разрешение прерывания по переполнению TMR0
1-прерывание разрешено
0-прерывание запрещено

INTE    

4

Разрешение внешнего прерывания INT
1-прерывание разрешено
0-прерывание запрещено

RBIE   

3

Разрешение прерывания по изменению сигнала на входах RB7-RB4
1-прерывание разрешено
0-прерывание запрещено

T0IF   

2

Флаг прерывания по переполнению TMR0
1-произошло переполнение TMR0
0-переполнение TMR0 не было

INTF        

1

Флаг внешнего прерывания INT
1-выполнено условие внешнего прерывания на выводе RB0/INT
0-внешнего прерывания не было

RBIF        

0

Флаг прерывания по изменению уровня сигнала на входах RB7-RB4
1-произошло изменение уровня сигнала на одном из входов RB7-RB4
0-не было изменения уровня сигнала на одном из входов RB7-RB4

Регистр OPTION_REG

NOT_RBPU                  

7

Включение внутренних подтягивающих резисторов на входах PORTB
1-подтягивающие резисторы отключены
0-подтягивающие резисторы включены

INTEDG                  

6

Выбор активного фронта сигнала на входе внешнего прерывания INT
1-прерывание по переднему фронту сигнала
0-прерывание по заднему фронту сигнала

T0CS                

5

Выбор тактового сигнала для TMR0
1-внешний тактовый сигнал с вывода RA4/T0CKI
0-внутренний тактовый сигнал CLKOUT

T0SE                       

4

Выбор фролнта приращения счетчика TMR0 при внешнем тактовом сигнале
1- по спаду на выводе RA4/T0CKI
0- по фронту на выводе RA4/T0CKI

PSA                

3

Выбор включения предделителя
1-предделитель включен перед WDT
0-предделитель включен перед TMR0

PS2                 

2

Установка коэффициента деления предделителя
значение        для TMR0        для WDT
   000                  1:2                   1:1
   001                  1:4                   1:2
   010                  1:8                   1:4
   011                  1:16                 1:8
   100                  1:32                 1:16
   101                  1:64                 1:32
   110                  1:128               1:64
   111                  1:256               1:128

PS1                  

1

PS0                       

0

Регистр PIE1
1-прерывание разрешено,  0-прерывание запрещено

ADIE                   

6

Разрешение прерывания по окончанию преобразования  АЦП

RCIE       

5

Разрешение прерывания от приёмника USART

TXIE    

4

Разрешение прерывания от передатчика USART

SSPIE    

3

Разрешение прерывания от модуля синхронного последовательного
 порта

CCP1IE      

2

Разрешение прерывания от модуля CCP1

TMR2IE      

1

Разрешение прерывания по переполнению TMR2

TMR1IE    

0

Разрешение прерывания по переполнению TMR1

Регистр PIR1

ADIF          

6

Флаг прерывания от модуля АЦП
1-преобразование АЦП завершено
0-преобразование АЦП не завершено

RCIF       

5

Флаг прерывания от приёмника USART
1-буфер приёмника USART полон
0-буфер приёмника USART пуст

TXIF       

4

Флаг прерывания от передатчика USART
1-буфер передатчика USART  пуст
0-буфер передатчика USART полон

SSPIF     

3

Флаг прерывания от модуля MSSP
1-выполнено условие возникновения прерывания
0-условие возникновения прерывания не выполнено

CCP1IF     

2

Флаг прерывания от модуля CCP1
Режим захвата: 1-выполнен захват значения TMR1, 0-захвата не происходило
Режим сравнения: 1-значение TMR1 достигло указанного в регистрах CCPR1H, CCPR1L
0-значение TMR1 не достигло указанного в регистрах CCPR1H, CCPR1L

TMR2IF      

1

Флаг прерывания по переполнению TMR2
1-произошло переполнение TMR2
0-переполнение TMR2 не было

TMR1IF         

0

Флаг прерывания по переполнению TMR1
1-произошло переполнение TMR1
0-переполнение TMR1 не было

Регистр T1CON

T1CKPS1         

5

выбор коэффициента деления предделителя TMR1:
11-1:8  ; 10-1:4   ; 01-1:2  ; 00-1:1

T1CKPS0         

4

T1OSCEN             

3

Включение тактового генератора TMR1
0- генератор включен,  1-генератор выключен

 -T1SYNC              

2

Синхронизация внешнего тактового сигнала
1-не синхронизировать, 0 -синхронизировать

TMR1CS           

1

Выбор источника тактового сигнала
1-внешний источник с вывода RC0,  0-внутренний источник Fosc/4

TMR1ON   

0

Включение модуля TMR1:  1-включен; 0-выключен

Регистр T2CON

TOUTPS3    

6

выбор коэффициента деления выходного делителя TMR2:
 0000-1:1 ; 0001- 1:2  ; 0010- 1:3 ; 0011- 1:4;     и т.д.    
1111- 1:16 

TOUTPS2        

5

TOUTPS1       

4

TOUTPS0             

3

TMR2ON           

2

Включение модуля TMR2:  1-включен; 0-выключен

T2CKPS1      

1

выбор коэффициента деления  педделителя TMR2:
00-1:1  ; 01-1:4  ; 1х-1:16

T2CKPS0           

0

 

 

На следующем этапе рассмотрим редактор программ MPASM входящий в состав интегрированной среды разработки программ MPLAB, напишем первую программу и отладим.

Каждый программист имеет свой подчерк в написании программы. По этим причинам кому либо рекомендовать свой способ написания программы будет неправильным. Автор будет приводить один из вариантов, как можно сделать тот или иной модуль программы, может быть не совсем удачно, а вам предстоит в дальнейшем при необходимости его изменять.

Запустим MPLAB и откроем файл сохраненного проекта. Для этого в главном меню выберем закладку File далее Recent Workspaces и выберем наш файл C:\Micro\Micro. В  открывшемся окне редактора Micro.asm мы будем писать программу. Разобьём условно редактор на 4 вертикальные колонки. В первой (левой) пишут метки программы, во второй мнемоника команды, в третьей операнды команды и в четвёртой если необходимо комментарии. Символом- ; отделяют команды программы от комментариев. Подробно о всех командах ассемблера можно узнать из Руководства пользователя MPASM [10]. Кроме комментариев весь текст должен быть написан латинским алфавитом. Все колонки должны быть отделены друг от друга одним и более пробелом, удобно пользоваться табуляцией. Рассмотрим нашу программу с подробными комментариями.

 

#include<p16f873.inc> ;Данной директивой мы присоединяем файл p16f873 к нашему проекту.

list p=16f873                             ;Данная директива изменяет параметры компиляции исходного файла и генерации файла листинга.

__CONFIG   _CP_ALL  & _DEBUG_OFF & _WRT_ENABLE_ON & _CPD_OFF &  _LVP_OFF & _BODEN_ON  &  _PWRTE_ON  &  _WDT_OFF & _HS_OSC  ;Директива установки битов

                                  ; конфигурации. При программировании icprog данная конфигурация будет автоматически установлена в программаторе.

; вследующих строках необходимо указать КОНСТАНТЫ

MR          set           D'56'        ;Константа задержки младший разряд. D- указывает на то операнд записан в десятичной системе счисления

CR           set           D'67'        ;Константа задержки средний разряд

ST           set           D'16'        ;Константа задержки старший разряд

;а также обозначить РЕГИСТРЫ пользователя.Системные регистры мы уже присоединили командой  #include<p16f873.inc>    

                cblock H'30'            ;Директива позволяющая описывать регистры блоком констант

                cnt1                        ;Регистр временного хранения задержки для младшего разряда

                cnt2                        ;Регистр временного хранения задержки для среднего разряда

                cnt3                        ;Регистр временного хранения задержки для старшего разряда

                endc                        ;Директива конец описания блока констант

;-----------------------------------------------------------------------             

org 0                        ;Директива установки что следующая команда будет расположено по 0 адресу памяти программ. Её ещё называют ;вектором сброса так как счётчик программы микроконтроллера всегда начинает выполнять программу после сброса с ;0 адреса

goto START            ;Команда безусловный переход адреса программы на метку START. Переход необходимо устанавливать почти всегда ;так как по адресу 4 расположен вектор прерывания.

org 4                        ;Директива вектор прерывания. Происходит переход по данному адресу памяти программ при возникновении любого ;прерывания.

retfie                       ;Выход из прерывания если нет необходимости в прерываниях. Иначе здесь следует расположить команды обработки ;прерывания.

;-----------------------------------------------------------------------

START                                   ;Метка начала программы. В первую очередь обязательно надо произвести инициализацию регистров процессора.

                bcf           STATUS,RP0          ;Команда bcf записывает 0 в разряд RP0 регистра STATUS. см.Табл.8

                  bcf             STATUS,RP1     ;Команда bcf записывает 0 в разряд RP1 регистра STATUS. Эти две команды позволяют установить 0 банк.  

                                                               ;Поэтому будут доступны все регистры находящиеся в банке 0.см.табл.7.                 

                clrf          PORTA                   ;Во все разряды выходного порта  A записываются 0.

                clrf          PORTB                   ;Обнуляем порт B

                  clrf        PORTC                   ;Обнуляем порт C. Обнуление или установку в 1портов желательно произвести до указания направления                               ; ввода/вывода, чтобы не получить случайного импульса при переходе из высокоимпедансного состояния.

clrf           CCP1CON              ;Выключить модуль CCP

                clrf          INTCON                 ;Выключить прерывания

                bsf           STATUS,RP0          ;Команда bsf записывает 1 в разряд RP0 регистра STATUS, тем самым переключаемся на банк1, будут

                                                               ; доступны все регистры находящиеся в банке 1.см.табл.7.

                movlw     B'00000000'            ;Команда movlw записывает константу в регистр W. B- указывает на то операнд записан в двоичной системе

                                                               ; счисления.

                movwf     TRISA                     ;Команда movwf переписывает содержимое регистра W в регистр направления порта А. Порты RA0-RA5-

                                                               ; установить на вывод

                movlw     B'00000000'            ;

                movwf      TRISB                    ;Порты RB0-RB7, на вывод

                movlw     B'00000000'            ;Порты RC0-RC7, на вывод 

                movwf      TRISC

                movlw      B'10000000'           ;

                movwf     OPTION_REG         ;Нагруз.рез.порта B выкл,такт генер.на вход WDT,предд.перед TMR0,коэф.дел=1:1

                bcf           STATUS,RP0          ;Перекл. на банк0  

;-----------------------------------------------------------------------

CIKL                                                      ;Метка цикла программы. В этом цикле мы будем включать светодиод, делать задержку, выключать и опять

                                                               ; делать задержку. Тем самым обеспечим мигание светодиода.

                bsf           PORTC,1                                ;Записать 1 в первый разряд порта С

                call          delay                       ;Перейти к подпрограмме с меткой delay.В аппаратный стек заносится адрес следующей за call команды. В

                                                               ; програмный счетчик заносится адресс где расположена метка delay.

                bcf           PORTC,1                                ;Записать 0 в первый разряд порта С

                call          delay                       ;Перейти к подпрограмме с меткой delay

                goto         CIKL                       ;Безусловный переход на метку CIKL

;-----------------------------------------------------------------------

delay                                                       ;Метка подпрограммы задержки –1sec.

                movlw      MR                         ;Константу MR записать в регистр W

                movwf     cnt1                        ;Регистр W переписать в регистр cnt1

                movlw      CR                          ;Константу CR записать в регистр W

                movwf     cnt2                        ;Регистр W переписать в регистр cnt2

                movlw      ST                          ;Константу ST записать в регистр W

                movwf     cnt3                        ;Регистр W переписать в регистр cnt3     

dloop                                                      ;Метка dloop

                decfsz       cnt1,f                     ;Команда decfsz производит уменьшение регистра cnt1 на единицу. Операнд f- означает что содержимое

                                                               ; останется в регистре cnt1, если операнд будет -w то содержимое будет пересено в регистр w

                goto         $+2                         ;безусловный переход на адресс который будет больше данного на 2 единицы

                decfsz      cnt2,f                      ;Команда decfsz производит уменьшение регистра cnt2 на единицу

                goto         dloop                       ;безусловный переход на метку dloop

                decfsz      cnt3,f                      ;Команда decfsz производит уменьшение регистра cnt3 на единицу

                goto         dloop                       ;безусловный переход на метку dloop

                return                                      ;Возврат из подпрограммы. при этом происходит возврат на адресс входа в подпрограмму +1(в програмный

                                                               ; счетчик заносится адресс из аппаратного стека)

;-----------------------------------------------------------------------

                end                                          ;Конец программы. Данной директивой должны заканчиваться все программы

 

            После того как программа написана, ёё необходимо откомпилировать. Для этого в главном меню выбираем закладку Project затем Build All. В кратковременно появившемся окне MPASM v4.01 появится индикатор компиляции зеленого цвета, значит всё нормально. Если индикатор красного цвета, то будет указано количество ошибок. В окне Output при успешной компиляции будет текст что то типа:

 

Clean: Deleting intermediary and output files.

Clean: Deleted file "C:\ Micro \Micro.err".

Clean: Deleted file "C:\Micro\Micro.cod".

Clean: Deleted file "C:\Micro\Micro.hex".

Clean: Deleted file "C:\ Micro \Micro.lst".

Clean: Done.

Executing: "C:\Program Files\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F873 "Micro.asm" /l"C:\ Micro \Micro.lst" /e"C:\ \Micro \Micro.err"

Message[302] C:\MICRO\MICRO.ASM 31 : Register in operand not in bank 0.  Ensure that bank bits are correct.

Message[302] C:\MICRO\MICRO.ASM 33 : Register in operand not in bank 0.  Ensure that bank bits are correct.

Message[302] C:\MICRO\MICRO.ASM 35 : Register in operand not in bank 0.  Ensure that bank bits are correct.

Message[302] C:\MICRO\MICRO.ASM 37 : Register in operand not in bank 0.  Ensure that bank bits are correct.

Loaded C:\Micro\Micro.COD.

BUILD SUCCEEDED: Fri Jul 15 23:38:42 2005

Предупреждения Message[302] указывают на возможно неправильную установку банков. Проверить это необходимо вручную воспользовавшись таблицей 7. Данное предупреждение можно отключить вставив директиву errorlevel    -302    ;не выводить ошибки переключения банков, например после директивы __CONFIG .  Если компиляция будет неуспешной то в окне Output будут строки с комментариями ошибок. Подробно про типы ошибок можно посмотреть в [10]. Ошибки необходимо устранить иначе отладка будет не возможна. Для детальной отладки программы необходимо запустить симулятор. Для начала сбрасываем процессор. В главном меню выбираем закладку Debugger далее Reset и Processor Reset. Указатель выполняемой строки (зеленая стрелка) установится на начало программы. Для того чтобы мы знали, что творится в регистрах процессора необходимо открыть окно с регистрами процессора. Для этого выбираем в главном меню закладку View далее Special Function Registers. Так же можно открыть окно File Registers. Для отслеживания времени выполнения программы может быть полезен счетчик. Выбираем в главном меню закладку Debugger далее StopWatch. Все эти окна размещаем на экране, перетащив их в нужное место при помощи мышки. Для пошаговой отладки нажимаем кнопку F7  или Debugger далее Step Into. Для быстрого прохода подпрограммы служит кнопка F8 или Debugger далее Step Over. Для быстрого прохода программы в режиме просмотра регистров служит кнопка Animate. Если необходима ещё большая скорость то можно воспользоваться кнопками Run (F9) и Halt (F5).  Пиктограммы этих кнопок имеются в главном меню справа. Для остановки отладчика в нужном месте программы, в окне редактора необходимо щелкнуть два раза левой кнопкой мышки по команде. При этом в левом поле редактора  появится красный кружек с буквой B (Breac). Для удаления точки останова необходимо повторить процедуру щелкнув два раза мышкой. При пошаговой отладке автор рекомендует обратить внимание на окно Special Function Registers и отметить для себя, какая команда какие регистры изменяет. Когда программа будет полностью отлажена, необходимо повторить процедуру компиляции. Подробно о всех возможностях симулятора можно узнать прочитав [10].

На следующем этапе запрограммируем микроконтроллер ранее изготовленным программатором. Для этого запустим программу ic-prog. В правом верхнем окне выберем микроконтроллер PIC16F873. Загрузим только что отлаженную программу. Для этого в главном меню выберем закладку Файл далее Открыть файл. В появившемся окне найдем файл Micro.HEX и нажмем кнопку Открыть. В программатор вставим микроконтроллер SA1 установим в режим PIC и включим SA2. В главном меню выберем закладку Команды далее Программировать всё. Дождавшись окончания программирования выключаем SA2 и вынимаем микросхему из панельки. Устанавливаем микроконтроллер в устройство и получаем удовлетворение от первой программы.

            Несмотря на кажущуюся сложность освоения микроконтроллера по мере практического изучения всё встанет на свои места. Дальнейшим этапом по освоению микроконтроллеров автор предлагает изучать листинги программ различных конструкций, а готовые куски использовать в своих программах

Следует заметить что с некоторыми компьютерами программа ic-prog работает только в среде Windows –98.

 

Ссылки:

1. http://sat.riga.lv/jonis   -Официальный сайт разработчика программатора JonisProg.

2. http://www.ic-prog.com/index1.htm -Официальная страница программной оболочки IC-Prog.

3. http://www.ic-prog.com/icprog_driver.zip -Прямая ссылка для драйвера.

4. http://www.ic-prog.com/icprog105D.zip - Прямая ссылка для icprog105D.

5. http://www.microchip.com/ -Англоязычный сайт технической поддержки изделий фирмы MicroChip

6. http://www.microchip.ru/ -Русский сайт технической поддержки изделий фирмы MicroChip

7. http://www.microchip.ru/phorum/list.php?f=2 -Форум для тех кому нужна помощь в освоении PIC контроллеров.

8. http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB711.zip -адресс для закачки интегрированной среды разработки программ MPLAB IDE V7.11 -29,895мб.

9. http://www.microchip.ru/lit/?mid=1x0 - Руководство пользователя MPLAB IDE -2,838 мб.

10. http://www.microchip.ru/lit/?mid=1x0 - Руководство пользователя MPASM-921 кб.

11. А. Долгий. Разработка и отладка устройств на МК. РАДИО №5, 2001г, стр 17