МИКРОКОНТРОЛЛЕР ЭТО ОЧЕНЬ ПРОСТО
Абрамов Сергей г.
Оренбург
Не так давно радиолюбители конструировали свои схемы на лампах, потом пришлось осваивать транзисторы и микросхемы. В восьмидесятые годы радиолюбители стали собирать свои первые конструкции на микропроцессорах. Чтобы не отставать от своего времени пришла пора освоить микроконтроллеры и ПЛИС. Целю данной статьи является преодоление барьера радиолюбителями от конструирования схем на обычной логике к микроконтроллерам. В статье будут рассмотрены вопросы поэтапной разработки схем на основе микроконтроллеров фирмы 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=
защита памяти программ выключена |
||||||||||||
бит
11: |
DEBUG:
Бит включения режима внутрисхемной отладки |
||||||||||||
бит
10: |
Не
реализован: читается как '1' |
||||||||||||
бит
9: |
WRT:
Бит разрешения записи во FLASH память программ |
||||||||||||
бит
8: |
CPD:
Бит защиты EEPROM памяти данных |
||||||||||||
бит
7: |
LVP:
Бит разрешения низковольтного программирования |
||||||||||||
бит
6: |
BODEN:
Бит разрешения сброса по снижению напряжения питания |
||||||||||||
бит
3: |
-PWRTE: Бит разрешения работы таймера
включения питания |
||||||||||||
бит
2: |
WDTE:
Бит разрешения работы сторожевого таймера |
||||||||||||
биты
1-0: |
FOSC1:FOSC0:
Биты выбора режима тактового генератора |
В заключение данного раздела хочется сказать, что нет необходимости все это запоминать сразу, все встанет на свои места по мере практического освоения микроконтроллера. Для более подробного изучения можно скачать англоязычную документацию 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. В появившемся окне устанавливаем тип генератора Oscillator – HS , для начала отключим Watchdog Timer – Off , задержку по включению питания желательно включать всегда Power Up Timer –On , детектор по снижению питания без лишней необходимости тоже лучше не отключать Brown Out Detect – On , так как мы пока не будем пользоваться внутрисхемным программированием (программирование микроконтроллера в собранном устройстве и запаянном микроконтроллере позволяет модифицировать устройства непосредственно перед отправкой клиенту), поэтому данный режим отключим Low Voltage Program –Disabled. Остальные три строки относятся к разрешению записи памяти программ и защиты адресного пространства от копирования, их можно оставить без изменения. На этом предварительная настройка проекта завершена. На время закроем проект. Для этого в главном меню выберем закладку 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 |
Флаг переполнения
сторожевого таймера |
NOT_PD |
3 |
Флаг включения питания |
Z |
2 |
Флаг нулевого результата |
DC |
1 |
Флаг десятичного переноса
или заёма |
C |
0 |
Флаг переноса или заёма |
Регистр INTCON |
||
GIE |
7 |
Глобальное разрешение
прерывания |
PEIE |
6 |
Разрешение прерывания от
периферийных модулей |
T0IE |
5 |
Разрешение прерывания по
переполнению TMR0 |
INTE |
4 |
Разрешение внешнего
прерывания INT |
RBIE |
3 |
Разрешение прерывания по
изменению сигнала на входах RB7-RB4 |
T0IF |
2 |
Флаг прерывания по
переполнению TMR0 |
INTF |
1 |
Флаг внешнего прерывания
INT |
RBIF |
0 |
Флаг прерывания по
изменению уровня сигнала на входах RB7-RB4 |
Регистр OPTION_REG |
||
NOT_RBPU |
7 |
Включение внутренних
подтягивающих резисторов на входах PORTB |
INTEDG |
6 |
Выбор активного фронта
сигнала на входе внешнего прерывания INT |
T0CS |
5 |
Выбор тактового сигнала для
TMR0 |
T0SE |
4 |
Выбор фролнта приращения
счетчика TMR0 при внешнем тактовом сигнале |
PSA |
3 |
Выбор включения
предделителя |
PS2 |
2 |
Установка коэффициента
деления предделителя |
PS1 |
1 |
|
PS0 |
0 |
|
Регистр PIE1 |
||
ADIE |
6 |
Разрешение прерывания по
окончанию преобразования АЦП |
RCIE |
5 |
Разрешение прерывания от
приёмника USART |
TXIE |
4 |
Разрешение прерывания от
передатчика USART |
SSPIE |
3 |
Разрешение прерывания от
модуля синхронного последовательного |
CCP1IE |
2 |
Разрешение прерывания от
модуля CCP1 |
TMR2IE |
1 |
Разрешение прерывания по
переполнению TMR2 |
TMR1IE |
0 |
Разрешение прерывания по
переполнению TMR1 |
Регистр PIR1 |
||
ADIF |
6 |
Флаг прерывания от модуля
АЦП |
RCIF |
5 |
Флаг прерывания от
приёмника USART |
TXIF |
4 |
Флаг прерывания от
передатчика USART |
SSPIF |
3 |
Флаг прерывания от модуля
MSSP |
CCP1IF |
2 |
Флаг прерывания от модуля
CCP1 |
TMR2IF |
1 |
Флаг прерывания по
переполнению TMR2 |
TMR1IF |
0 |
Флаг прерывания по
переполнению TMR1 |
Регистр T1CON |
||
T1CKPS1 |
5 |
выбор коэффициента деления
предделителя TMR1: |
T1CKPS0 |
4 |
|
T1OSCEN |
3 |
Включение тактового
генератора TMR1 |
-T1SYNC |
2 |
Синхронизация внешнего
тактового сигнала |
TMR1CS |
1 |
Выбор источника тактового
сигнала |
TMR1ON |
0 |
Включение модуля TMR1: 1-включен; 0-выключен |
Регистр T2CON |
||
TOUTPS3 |
6 |
выбор коэффициента деления
выходного делителя TMR2: |
TOUTPS2
|
5 |
|
TOUTPS1
|
4 |
|
TOUTPS0
|
3 |
|
TMR2ON |
2 |
Включение модуля TMR2: 1-включен; 0-выключен |
T2CKPS1 |
1 |
выбор коэффициента
деления педделителя TMR2: |
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