Академический Документы
Профессиональный Документы
Культура Документы
Mikrokontrolleryi Dlya Nachinayuschih PDF
Mikrokontrolleryi Dlya Nachinayuschih PDF
382
ББК 32.85
Х86
ХофманнМ.
Х86 Микроконтроллеры для начинающих: Пер. с нем. - СПб.:
БХВ-Петербург, 2014. - 304 с.: ил. + CD-ROM - (Электроника)
ISBN 978-5-9775-0551-2
Рассмотрено программирование микроконтроллеров на примере PIC16F876A
компании Microchip. Подробно описаны основные команды языка ассемблер, а
также среда разработки МРLАВ. Показано программирование с помощью отлад
чика-программатора ICD 2, а также через последовательный интерфейс. На прак
тических примерах рассмотрено управление светодиодами и дисплеем, представ
ление аналоговых сигналов в цифровой форме, сохранение/запись данных во
внешнюю ЕЕРRОМ-память, управление выходами микроконтроллера с помощью
ИК-пульта дистанционного управления и др. На компакт-диске приведены приме
ры программ, чертеж для изготовления монтажной платы, электрические схемы,
техническая документация, справочная информация и программное обеспечение.
Для радиолюбителей
УДК 621.382
ББК 32.85
Группа подготовки издания:
Главный редактор Екатерина Кондукова
Зам главного редактора Игорь Шишигин
Зав редакцией ГригорийДобин
Перевод с немецкого Виктора Букирева
Редактор ЮрийРожко
Компьютерная верстка Ольги Сергиенко
Корректор Зинаида Дмитриева
Оформление обложки Елены Беляевой
Зав производством Николай Тверских
Die berechtigte UЬersetzung von deutschsprachiges Buch Mikrocontroller fur Einsteiger, ISBN 978-3-7723-4318-6 Copynght ©
2009 Franzis Verlag GmbH, 85586 Pomg Alle Rechte vorbehalten, auch die der fotomechanischen Wiedergabe und der Speiche
rung in elektronischen Medien Das Erstellen und Verbreiten von Kopien auf Papier, auf Datentrager oder im lntemet, insbesondere
als PDF, ist nur mit ausdrucklicher Genehmigung des Verlags gestattet und wird widngenfalls strafrechtlich verfolgt Die Russische
UЬersetzung ist von BHV St Petersburg verbreitet, Copynght © 201 О
Авторизованный перевод немецкой редакции книги Mikrocontrol\er fur Einsteiger, ISBN 978-3-7723-4318-6 Copynght ©
2009 Franzis Verlag GmbH, 85586 Pomg Все права защищены, вкточая любые виды копирования, в том числе фотомеха
нического, а также хранение и тиражирование на элекгронных носителях Изготовление и распространение копий на
бумаге, электронных носителях данных и публикация в Интернете, особенно в формате PDF, возможны только при нали
чии письменного согласия Издательства Franzis Нарушение этого условия преследуется в уголовном порядке Перевод на
русский язык "БХВ-Петербург" © 201 О
Подписано в печать 31 1 О 13
Формат 70х100 1 /16 Печать офсетная Усл печ л 24,51
Доп тираж 1000 экз Заказ № 1215
"БХВ-Петербург'', 191036, Санкт-Петербург, Гончарная ул. 20
Первая Академическая типография "Наука"
199034, Санкт-Петербург, 9 линия, 12/28
Предисловие ........................................................................................................... 1
Приложение........................................................................................................ 259
Распределение в памяти регистров микроконтроллера PIC16F876A .......................... 259
Обзор регистров управления и состояния ......................................................................260
Регистр состояния - STATUS ..............................................................................261
Регистр опций - OPTION_REG ........................................................................... 262
Регистр контроля прерываний - INTCON ..........................................................263
Первый регистр прерывания от периферии - PIRl ............................................ 264
Второй регистр прерывания от периферии - PIR2 ............................................ 265
Регистр разрешения периферийных прерываний - PIEl ................................... 266
Регистр разрешения периферийных прерываний - PIE2 ................................... 267
Регистр контроля питания - PCON .....................................................................268
Оглавление /Х
ОЗУ
13 бит RАМ-память
-:о Вектор сброса ОхОООО Память' данных
о;
са Стек
,::
о
(/)
Вектор
Ох0004
Уровень стека 1 "'
:,:
"'
:,:
"':,:
N
"'
С')
:,:
<(
_J
прерывания Уровень стека2 са са са са
!!::..
U] U] U] U]
::. Ох0005
::.
са
Страница О
о. Ox07FF
Адрес памяти
о. ОхОВОО Уровень стека В 9бит
,:: Страница 1
OxOFFF Мультиплексор
о;
::.
са Ох1000 адреса
,:: Страница2
3 Ox17FF 7 бит Прямой адрес
Косвенный
Ох1ВОО адрес
Страница З
Ox1FFF Регистр адреса
при косвенной
14 бит Шина команд адресации (FSR)
Мультиплексор
Порты
Таймеры
Интерфейсы
Вбит ЕЕРRОМ
Рабочий регистр память
(W-регистр)
1
Биты выбора банка памяти
ОЗУ при прямой адресации Бит переноса
,---_л----.. 1
IRP RP1 RPO ТО PD z ос с I
Бит7 Бито
Регистр состояния (STATUS register)
IRP RP1
Начало
Стек
Адрес возврата = 21
Конец
Уровень стека 2
Уровень стека 8
Начало
newValue
Прочитать порт А
movf PORTA, W и поместить
значение в рег. W
Поместить содер
movwf INDF жимое рег. W по
косвенному адресу
Увеличить
incf FSR, F косвенный
адрес на 1
Нет
btfss FSR, 3
goto newValue
Конец
только ссылку на этот адрес. Для этих целей применяется только так назы
ваемый указатель. Этот метод может использоваться, например, чтобы по
следовательно записывать или очищать несколько регистров. Следующий
пример показывает, как 8 значений по очереди считываются из входного пор
та А и заносятся в RАМ-память.
В описанном примере данные считываются с входов порта А и заносятся в
RАМ-память по адресам от Ох30 до Ох37.
Так как при косвенной адресации для определения адреса имеются в распо
ряжении только 8 битов регистра FSR, то при этом можно обращаться далеко
не ко всем регистрам RАМ-памяти, которая, как известно, имеет 9-разрядный
адрес. Поэтому при косвенной адресации снова используют регистр состоя
ния (STATUS), а точнее один старший его бит IRP (рис. 1. 7). Чтобы сделать
выбор между банками 0--1 и 2-3, нужно установить или сбросить бит IRP.
Так если бит IRP установить в О, то можно обращаться к банкам О и 1. Если
же бит IRP установить в 1, то адресуются банки 2 и 3. После этого содержи
мое 8-разрядного регистра FSR объединяется с битом IRP регистра состояния
и таким образом образуется 9-разрядный адрес памяти данных. Для осущест
вления косвенной адресации используют регистр косвенной адресации INDF,
адрес которого находится в каждом банке по адресу ОхОО. Регистр в микро
контроллере физически отсутствует, он используется только как вспомога
тельное средство для адресации. Если пишут что-то в этот регистр, то запись
осуществляется в физически имеющийся регистр, адрес которого находится
в регистре FSR. Это же самое происходит и при чтении регистра INDF.
IRP
�8�7�6�5�4�3�2�1�0
8 битов косвенного адреса
BANK 3
btfsc EECONl, WR Нет
goto $-1
BANK 2
movlw Ох24 Загрузить адрес в
movwf EEADR регистр EEADR
mov_lw Oxll Загрузить данные в
movwf EEDATA регистр EEDATA
BANK 3
Выбрать данные
bcf EECONl, EEPGD памяти EEPROM
movlw Ох55
movwf EECON2 Выполнить
movlw ОхАА последователь-
ность команд
movwf EECON2
bsf EECONl, WR
Запись в EEPROM
В фоновом режиме.
Длительность 4 мс
Конец
Начало
BANK 2
Загрузить адрес в
movlw Ох24
регистр EEADR
movwf EEADR
Чтение из памяти
bsf EECONl, RD
EEPROM
Конец
Прочие
пор - Нет операции (пустая операция)
2.2.1. Общее
При программировании на ассемблере команды записываются друг под дру
гом. Каждая команда стоит в новой строке. Метка (англ. label) может уста
навливаться перед каждой командой. Она может использоваться как признак
nередачи управления. С применением меток также улучшается удобочитае
мость кода. Метка может стоять перед каждой командой или находиться
в собственной строке. Она всегда относится к следующей команде.
Пример использования меток:
movlw ОхОА ;Загрузить в регистр W ОхОА (= 10)
movwf Ох20 ;Переместить содержимое регистра W в регистр ОЗУ Ох20
loop ;Метка перехода
nop ;Нет операции
decfsz Ох20 ;Уменьшать содержимое регистра Ох20 на 1, до тех пор
goto loop ;пока значение не будет равно О, конец цикла
Двоичный формат особенно хорошо подходит для установки или сброса от
дельных битов. Можно посмотреть первоначально, какие биты бьmи уста
.новлены в регистре, а какие нет. Применение для этой же цели числа 234,
представленного в десятичном формате, менее наглядно и поэтому более
сложно.
слева от числа добавить символ "D" (от англ. Decimal), а число заключить
между одинарными апострофами. Во втором случае перед числом ставится
только точка (которую можно легко перепутать с обычной десятичной
точкой).
23410� D'234' ИЛИ
23410� .234
В этой книге для десятичного формата выбран первый вариант с буквой "D",
поскольку это менее двусмысленно.
2.2.2.5. АSСll-формат
С помощью АSСП-формата можно представлять буквы. ASCII - это
American Standard Code for Information lnterchange (Американский стандарт
ный код для обмена информацией). Для того чтобы закодировать тот или
иной символ, в 8-битном коде ASCII имеется с�ециальная таблица символов
(табл. 2.2). Варианты этой таблицы кодов могут содержать символы для раз
ных национальных языков. В таблице кроме информационных символов
имеются и управляющие непечатные символы.
Ассемблер понимает символ как АSСП-код, если перед ним имеется символ
"А", а далее следует сам информационный символ, заключенный между оди
нарными апострофами. В другом варианте можно обойтись даже без сим
вола "А".
М � А'М' = Ox4D ИЛИ
М� 'М' = Ox4D
В приведенной таблице представлено только 128 символов, в то время как
с помощью 8 битов можно закодировать 256 символов. Здесь показаны толь
ко первые 128 символов, т. к. они используются на всех языках. Для симво
лов от 128 (Ох80) до 255 (OxFF) речь идет о национальных и специальных
символах.
Уже упомянутые управляющие символы в таблице имеют коды, начиная от
ОхОО до Ох 1 F. Самые важные управляющие символы - это символы перево
да строки LF (Line Feed) и возврата каретки CR (Carige Retum). В случае вы
вода текста при встрече символа LF курсор переходит на следующую строку,
а когда встречается символ CR, курсор переводится в начало строки. При об
работке текста функции этих обоих управляющих символов объединены
в одной клавише <Enter>.
2. Команды ассемблера PIC16F876A 29
.
Формат Синтаксис Пример
Двоичный В' ... В' 01101101'
Изменяемые флаги: Z
w F
'
w
о о о
о 1 о
1 о о
1 1 1
2. Команды ассемблера PIC16FB76A 31
Команда: andlw
Назначение: Побитная логическая операция И (AND) над содержи
мым регистра W и 8-битной константой k
Синтаксис: andlw k
Изменяемые флаги: Z
w k w
о о о
о 1 о
1 о о
1 1 1
Команда: iorwf
w F w
о о о
о 1 1
1 о 1
1 1 1
Команда: iorlw
w k w
о о о
о 1 1
1 о 1
1 1 1
Команда: xo:rwf
Пример:
movlw ОхЗА ;Загрузить значение ОхЗА в регистр W
movwf Ох20 ;Переместить это значение в F-регистр Ох20
movlw Ох4В ;Загрузить значение Ох4В в регистр W
xorwf Ох20, о ;Побитная операция XOR над содержимым
;регистра W и регистра с адресом Ох20
w F w
о о о
о 1 1
1 о 1
1 1 о
Команда: xorlw
Из.меняемые флаги: z
Для выполнения побитной логической операции "исключающее ИЛИ" над
содержимым регистра W и константой существует команда xorlw. При этом
результат сохраняется в регистре W. С помощью этой команды можно прове
рить, например, соответствует ли содержимое регистра W заявленному зна
с
чению. В приведенном примере (для упрощения) значение OxD4 помощью
команды movlw загружается в регистр W. В реальной программе значение
могло бы поступить откуда-нибудь, например, из последовательного порта.
2. Команды ассемблера PIC16F876A 35
Пример:
movlw OxD4 ;Загрузить значение OxD4 в регистр W
xorlw ОхDб ;Проверить, равно ли содержимое регистра W значению ОхDб
После того как над числами OxD4 и ОхDб была выполнена функция "исклю
чающее ИЛИ", результирующее значение Ох02 заносится в регистр W. Это
значение не равно О и, следовательно, оба значения не идентичны. При ра
венстве проверяемых значений в регистре состояния установился бы признак
нулевого результата.
Побитную логическую операцию "исключающее ИЛИ" над аргументами W и
k при присвоении результата W можно представить на примере следующей
таблицы истинности.
w k w
о о о
о 1 1
1 о 1
1 1 о
Команда: clrf
Изменяемые флаги: z
Содержимое регистра, адрес которого указан параметром f, очищается
командой clrf. При этом совершенно не важно, какое значение было раньше
в регистре, после выполнения команды в регистре будут только лишь нули.
Пример:
movlw Ох34 ;Загрузить значение Ох34 в регистр W
movwf Ох20 ;Переместить значение в регистр с адресом Ох20
clrf Ох20 ;Очистить содержимое регистра с адресом Ох20
36 2. Команды ассемблера PIC16F876A
Команда: clrw
Команда: comf
Назначение: Инвертировать все биты регистра, адрес которого ука
зан параметром f
Синтакс;ис: Comf f, d
Изменяемые флаги: Z
/(о.манда: bcf
Назначение: Очистить бит Ь регистра, адрес которого указан пара
метром f
Синтаксис: bcf f, d
Изменяемые флаги: Нет
Поскольку очень часто требуется, чтобы был сброшен отдельный бит числа,
т. е. в этом бите было установлено значение О, то для этого сделали персо
нальную команду bcf (от англ. Ьit clear). В этой команде указывается регистр
и бит, который должен быть сброшен. Кроме того, соответствующая позиция
бита показывается в регистре. В программе с помощью директивы EQU биту
можно назначить имя, посредством которого к нему можно будет потом об
ращаться.
Пример:
BIT4 EQU D'4' ;Присвоить имя 'BIT4' числу 4
movlw ОхЗF ;Загрузить значение ОхЗF в регистр W
movwf Ох20 ;Переместить это значение в регистр с адресом Ох20
bcf Ох20, BIT4 ;Очистить бит 4 в регистре с адресом Ох20
Как ожидалось, бит 4 очищается и значение Ox2F заносится в регистр с адре
сом Ох20.
38 2. Команды ассемблера PIC16F876A
Команда: bsf
Бит С (от англ. Carry) в регистре состояния (STATUS) - это бит переноса.
В нем, в принципе, может сохраняться 9-й бит значения. Бит С используется,
если 8 битов регистра недостаточно. После выполнения команды rlf (от англ.
Rotate Left) биты циклически сдвигаются влево на один разряд (рис. 2.1). При
этом старший разряд двоичного числа (MSB - Most Significant Bit), т. е.
бит 7, выдвигается в бит переноса С, который находится в регистре состояния
STATUS. Прежнее значение бита С выдвигается и сохраняется в F-регистре
на месте младшего бита О (LSB). Таким образом, осуществляется цикличе
ский сдвиг содержимого регистра влево на один разряд. В целом такой сдвиг
соответствует умножению содержимого регистра на 2.
2. Команды ассемблера PIC16F876A 39
1 Бит переноса
1
IRP RP1 RPO ТО PD z DC с
Бит 7 Бит О
Регистр состояния (STATUS register)
с
Бит 8 Бит 7 F-регистр Бит О
Пример:
movlw ОхВС ;Загрузить значение Ох8С в регистр W
movwf Ох20 ;Переместить это значение в регистр с адресом Ох20
rlf Ох20, О ;Умножить содержимое регистра с адресом Ох20 на 2
При умножении числа Ох8С (D'140') на 2, или иначе сдвиге на один разряд
влево без учета бита переноса С, в регистре W сохранялся бы результат рав
ный Ох18 (D'24'). Но поскольку фактически в итоге результат должен быть
больше чем 255, нужно обязательно в качестве старшего бита учитывать бит
переноса С (Carry) из регистра состояния (STATUS). Если же учесть бит
переноса вместе со значением регистра W, то в итоге получают действитель
ный полный результат операции умножения: Ох8С х 2 = Oxl 18 = D'280'
(1401 0 х 2 = 2801 0).
Если требуется умножить это значение еще раз на 2, чтобы получить умно
жение на 4, нужно временно сохранить бит переноса С в другом регистре и
очистить его после этого в регистре состояния. После циклического сдвига на
один разряд влево бит переноса (т. е. О) записывается в младший разряд дво
ичного числа (результата) в регистре с адресом, указанным f. Поскольку по
лучившееся число превышает значение 255, то при прочтении результата на
до учитывать текущий бит переноса и бит переноса, сохраненный в другом
регистре: Ох8С х 4 = Ох230 = D'560' (140 10 х 4 = 560 10).
С помощью команды r н достаточно просто могут считываться последова
тельные данные, поступающие на соответствующий вывод порта. Для этого
запрашивается вывод порта, и его значение перемещается в младшую пози
цию регистра. После циклического сдвига регистра можно снова считывать
40 2. Команды ассемблера PIC16F876A
Команда: rrf
Изменяемые флаги: С
Команду rrf (от англ. Rotate Right) используют для деления на 2. При этом
биты циклически сдвигаются или иначе перемещаются на одну позицию
вправо (рис. 2.2). Если требуется разделить на 2, то нужно обращать внима
ние на то, чтобы бит С был бы установлен перед делением, поскольку он пе
ремещается на позицию старшего бита (MSB) F-регистра. Младший бит
(LSB) этого же регистра выдвигается и помещается в позицию бита переноса
С регистра состояния.
с
Бит8 Бит 7 F-регистр Бит О
Пример:
movlw Ох73 ;Загрузить значение Ох73 в регистр W
movwf Ох20 ;Переместить это значение в F-регистр с адресом Ох20
rrf Ох20, О ;Сдвинуть все биты F-регистра на одну позицию вправо
2. Команды ассемблера PIC16F876A 41
Команда: movlw
Команда: movwf
Эта команда используется так же часто, как и команда movlw, поскольку в лю
бой программе все значения постоянно сохраняются в RАМ-памяти, чтобы
затем можно было продолжить с ними работу или применить к ним ту или
иную функцию. С помощью этой команды, например, осуществляют пере
сылку значения в регистр TRISA, который предназначен для управления на
правлением передачи данных порта ввода/вывода.
Команда: movf
Назначение: Выполнить пересылку содержимого регистра, адрес
которого указан параметром f (F-регистра), в регистр
адресата
Синтаксис: movf f, d
Изменяемые флаги: Z
Команда: swapf
Назначение: Поменять местами старший и младший полубайты ре
гистра, адрес которого указан параметром f
Синтаксис: swapf f, d
После сложения Ох39 и Ох14 результат Ox4D будет сохранен в регистре, адрес
которого Ох20 указан параметром f, т. е. иначе F-регистре. В этом примере
сложение выполняется без переноса в старших разрядах. Если же при сложе
нии двух значений в результате получается число, которое больше 255, то в
44 2. Команды ассемблера P/C16F876A
/(о.манда: addlw
После сложения обоих чисел в регистре W будет значение Ох43. В этом при
мере выполняется перенос в 4-й бит и поэтому в регистре состояния устанав
ливается флаг десятичного переноса DC (Digit Carry).
/(о.манда: suЬwf
Назначение: Вычесть содержимое регистра W из содержимого ре
гистра, адрес которого указан параметром f
Синтаксис: subwf f, d
Изменяемые флаги: С, DC, Z
Команда: suЫw
Назначение: Вычесть содержимое регистра W из 8-разрядной кон
станты k
Синтаксис: suЫw k
Изменяемые флаги: С, DC, Z
Команда: incf
Назначение: Прибавить 1 к содержимому регистра, адрес которого
указан параметром f
Синтаксис: incf f, d
Изменяемые флаги: Z
46 2. Команды ассемблера PIC16F876A
После выполнения первой команды incf в регистре, адрес Ох20 которого ука
зан параметром f, т. е. F-регистре, будет храниться значение OxFF. Это самое
большое отображаемое 8-битное значение. После следующей команды incf
этот регистр будет "переполнен" и в нем будут только лишь нули (ОхОО). По
этому после выполнения этой команды устанавливается флаг нулевого ре
зультата Z. Разумеется, команда не оказывает влияния на флаг десятичного
переноса (DC) и флаг переноса (С), поскольку речь не идет о переносе как
при сложении.
Команда: decf
Назначение: Вычесть 1 из содержимого регистра, адрес которого
указан параметром f
Синтаксис: decf f, d
Изменяемые флаги: Z
7 4 3 о
10 о
Программный сче�ик РС
Рис. 2.3. Команда перехода GOTO
48 2. Команды ассемблера PIC16F876A
Пример:
main
movlw Ох55 ;Загрузить в регистр W значение Ох55
movwf PORTC ;Вывести данные в порт С
movlw ОхАА ;Загрузить значение ОхАА в регистр W
movwf PORTC ;Вьrеести данные в порт С
goto main ;Перейти к метке main (бесконечный цикл)
Команда call очень похожа на команду goto, т. к. она также является коман
дой безусловного перехода. Особенность команды call состоит в том, что
перед самим переходом гарантированно сохраняется текущее содержимое
программного счетчика, что в дальнейшем позволяет возвращаться в исход
ную точку программы. Поэтому команда call используется для вызова под
программы. В ходе выполнения команды содержимое программного счетчи
ка сохраняется в стеке, а с помощью команды return, которая является по
следней в подпрограмме, снова загружается в программный счетчик.
Одиннадцать бит адреса перехода загружаются из кода команды в 13-разряд
ный счетчик команд (k�PC<IO:O>), а два старших бита получают из регистра
PCLATH (PCLATH<4:3>�PC<l2:l 1>). При выполнении этой команды тре
буется два командных цикла.
Пример:
mask ;Метк:а начала подпрограммы
andlw ОхОЗ ;Маскирование обоих младших битов содержимого регистра W
return ;Возврат из подпрограммы
main ;Метка начала основной программы
movlw Ох55 ;Загрузить значение Ох55 в регистр W
call mask ;Вызвать подпрограмму
movwf PORTC ;Вывести значения в порт С
goto main ;Перейти на метку main (бесконечный цикл)
2. Команды ассемблера PIC16F876A 49
Команда: return
Команда: retlw
Команда: retfie
Назначение: Выполнить возврат из подпрограммы обработки пре
рывания и разрешить прерывания
Синтаксис: retfie
Изменяемые флаги: Нет
Команда: incfsz
incfsz
Увеличить на 1
Да
Ближайшая
команда
nop
Ближайшая
команда
Пример:
movlw OxF9 ;Загрузить значение OxF9 в регистр W
movwf Ох20 ;Скопировать значение в регистр с адресом Ох20
counter ;Метка начала цикла
incfsz Ох20, 1 ;Увеличить на 1 содержимое регистра с адресом Ох20
goto counter ;Если результат не равен О, перейти на метку counter
Команда: decfsz
В отличие от команды incfsz при выполнении команды decfsz (рис. 2.5) со
держимое указанного F-регистра не увеличивается, а уменьшается на 1. Ре
зультат также сохраняется в регистре, указанном параметром d, т. е. в регист
ре W при d = О или в F-регистре при d = 1. После операции уменьшения на
единицу проверяется, равен ли О результат. Если это действительно так, то
следующая команда пропускается или иначе она меняется на команду nop.
Поэтому в команде используется 2 командных цикла в случае передачи
управления. Если же результат не равен О, то никакого перехода не происхо
дит, а выполняется следующая ближайшая команда, и в этом случае для
команды достаточно только одного командного цикла.
Пример:
movlw Ох09 ;Загрузить число Ох09 в регистр W
movwf Ох20 ;Загрузить его в регистр Ох20, используя как счетчик
movlw ОхАб ;Загрузить число ОхАб в регистр W
movwf Ох21 ;Загрузить его в регистр Ох21, используя как рабочий
shift ;Метка начала цикла
rlf Ох21, 1 ;Циклический сдвиг влево содержимого рабочего рег.
2. Команды ассемблера Р/С16FB76A 55
decfsz
Уменьшить на 1
Да
Ближайшая
nop
команда
Ближайшая
команда
Команда: btfss
Назначение: Проверить бит Ь в регистре, адрес которого указан па
раметром f. Пропустить следующую инструкцию, если
бит Ь равен 1
56 2. Команды ассемблера PIC16F876A
Синтаксис: btfss f, ь
Изменяемые флаги: Нет
btfss f, Ь
Проверить бит Ь
Да
Ближайшая nop
команда
Ближайшая
команда
Пример:
movlw ОхDб ;Загрузить значение ОхDб в регистр W
movwf Ох20 ;Скопировать его в регистр с адресом Ох20
2. Команды ассемблера PIC16F876A 57
Команда: btfsc
btfsc f, Ь
Проверить бит Ь
Да
Ближайшая
команда
пор
Ближайшая
команда
Команда: clrwdt
Пример:
main ;Главная программа
bsf STATUS, RPO ;Переключиться на Банк 1 (для выбора регистра)
bcf STATUS, RPl
movlw Ь'11001100' ;Установить коэффициент деления для предделителя
movwf OPTION REG ;сторожевого таймера WDT равный 1:16
bcf STATUS, RPO ;Переключ�ться на Банк О
bcf STATUS, RPl
new ;Метка new
movlw OxFF ;Загрузить в регистр W число OxFF
movwf Ох20 ;Переместить это число в регистр с адресом Ох20
wait ;Метка weit
decfsz Ох20 ;Уменьшить на 1 содержимое регистра Ох20 и
;пропустить следующую команду, если результат О
goto wait ;Если регистр Ох20 не равен О,
;то перейти на метку wait
clrwdt ;Очистить сторожевой таймер WDT
goto new ;Перейти на метку new
Сторожевой таймер работает от внутреннего RС-генератора и поэтому не
нуждается ни в каком внешнем тактовом генераторе. Типичное значение пе
риода этого генератора для микроконтроллера PIC16F876A составляет 18 мс,
но может быть изменено в пределах от 7 до 33 мс. Период этого генератора
определяется значениями сопротивления внешнего резистора, емкостью
внешнего конденсатора и рабочей температурой микроконтроллера. Таким
образом без предварительного делителя частоты самое длительное время до
сброса, при условии что сторожевой таймер не очищается, составляет около
18 мс. С помощью предварительного делителя частоты можно это время уве
личить максимум до 2,3 секунд (максимальный коэффициент деления 1:128,
поэтому 18 мс х 128 = 2304 мс� 2,3 с). Коэффициент деления предваритель
ного делителя частоты устанавливается в регистре OPТION_REG. В примере
это значение устанавливалось на значение 1:16, а это значит, что процессор
будет сбрасываться после 288 мс, если за это время не будет применена
команда clrwdt. В примере осуществляется обратный счет в цикле снова и
снова от значения OxFF до ОхОО.
Команда: sleep
После того как тип микроконтроллера был выбран, нужно установить, с по
мощью каких инструментов должна транслироваться написанная программа.
Чтобы программировать на ассемблере, выбирают комплект инструментов
Microchip МРASM Toolsuite. Где эти инструменты сохранены, уже задано
3. Программирование с помощью MPLAB 67
•
•
Ctr1+F10 Date:1na.m..e:
маkе Ds.tu.m.:'
•
FIO
Version:
•
flUid Conr�вtiol\
Вuild Optoos ••• Autor:
r
Save Poject Inter:t1et:
e-me.il:
Save l'foject As ...
После того как файл на ассемблере будет успешно вставлен в проект, он так
же появится в окне проекта (рис. 3.13). Обратите внимание на то, что за име
нем папки проекта стоит звездочка, которая указывает на то, что текущие из
менения еще не сохранены.
8 t:::J DemoProjekt.mcp"
�.,.С) Source Files
, 1.., .. � DemoProjel<t.asm
J... .,e) Header Files
;...С] Object Files
(.... CJ Library Files
i.'"CJ Linker Script
; ... С] Other Files
Breakpolnts
3.5.4. ЕЕРRОМ-память
Поскольку многие микроконтроллеры содержат внутреннюю ЕЕРRОМ
память, в среде проектирования MPLAB имеется возможность просматривать
данные, которые в ней хранятся. В окне EEPROM (ЭСПЗУ), в правой его
части, можно увидеть интерпретацию данных, представленную в АSСП
формате (рис. 3.22). Если, например, требуется найти содержимое ячейки па
мяти с адресом Ох93, то нужно сверху вниз просмотреть левый столбец
Address (Адрес) вплоть до строки 90 и далее в этой строке выбрать значение
в столбце 03. Именно здесь, на пересечении указанных строки и столбца, и
будет находиться содержимое ячейки с адресом Ох93.
точку останова перед требуемой частью кода. Далее можно запустить про
грамму при помощи команды Run (Выполнить), тогда отладчик (Debugger)
последовательно выполнит все команды и остановится на выбранном месте.
Следует иметь в виду, что для установки точек останова существуют различ
ные возможности. Можно, например, щелкнуть на кнопке Breakpoints (Точ
ки останова) и затем указать нужную позици:�р или же, в простейшем случае,
сделать двойной щелчок на команде в желаемой строке. При этом активная
точка останова будет обозначена красным кругом с символом "В" белого цве
та (рис. 3.23). Программа после запуска остановится на этом месте, а текущие
значения регистров будут показаны в окне наблюдения за переменными
Watch (Наблюдение). Далее можно выполнять программный код в пошаго
вом режиме и просматривать изменение регистров после каждого шага.
С помощью симулятора можно установить сколь угодно точек останова, в то
же время, как, в частности, в настоящем микроконтроллере, из-за ограничен
ных ресурсов в большинстве случаев возможна только одна точка останова.
Однако если нужно иметь несколько точек останова в программе, то после
первого останова надо удалить текущую точку останова и установить ее на
новое необходимое место.
goto ma:i.n
3.7. Симулятор
С помощью описанных ранее возможностей можно просматривать внутрен
ние регистры и интерпретировать их изменение. Поскольку микроконтроллер
располагает, как правило, и входами, то и они также должны иметь возмож
ность для симулирования, т. е. симуляции внешних воздействующих тести
рующих сигналов, иначе стимулов. Для осуществления симуляции, выберите
из меню Debugger (Отладчик) пункт Stimulus (Стимул), а затем New
Workbook (Новая рабочая книrа). В результате откроется новое окно
Stimulus (Стимул) с несколькими различными вкладками.
3. Программирование с помощью MPLAB 79
все доступные выводы для сигналов, которые могут быть добавлены в табли
цу после нажатия на кнопку Add (Добавить) в список выбранных выводов
для сигналов (Selected Signal(s)). После нажатия кнопки Remove (Удалить)
выводы могут быть удалены из списка. Последовательность выводов в списке
можно изменить с помощью кнопок Move Up (Переместить вверх) и Move
Down (Переместить вниз). Кнопка Move Up (Переместить вверх) перемещает
выбранный вывод для сигнала на одну позицию вверх, а кнопка Move Down
(Переместить вниз) - перемещает на позицию вниз.
Чтобы его открыть, нужно в меню View (Вид) выбрать пункт Simulator Logic
Analyzer (Логический анализатор симулятора). Прежде чем сигналы начнут
отображаться, нужно выбрать их с помощью кнопки Channels (Каналы). По
сле этого откроется диалоговое окно для добавления или удаления сигналов,
которое можно выполнить воспользовавшись соответствующими кнопками
Add (Добавить) и Remove (Удалить) (рис. 3.29).
После того, как нужные сигналы будут выбраны, они появятся в окне
Logic Analyzer (Логический анализатор) (см. рис. 3.28). Для более детального
84 3. Программирование с помощью MPLAB
Если же при подключении все же будут проблемы, то можно еще раз про
смотреть и исправить установки, сделанные при помощи мастера настроек
MPLAB ICD 2, воспользовавшись пунктом Settings (Параметры) из меню
Debugger (Отладчик). На вкладке Status (Состояние) можно увидеть, под
ключен ли отладчик ICD 2 и пройдено ли самотестирование (Self Test).
3.1 О. Программирование
Если после устранения всех ошибок в программе ее необходимо загрузить во
Flаsh-память, внутрисхемный отладчик ICD 2 должен быть установлен в ре
жим программирования. Для этого в меню Programmer (Программатор) вы
берите пункт Select Programmer (Выбор программатора), а затем MPLAB
ICD 2 (рис. 3.39). Дело в том, что внутрисхемный отладчик ICD 2 не может
функционировать одновременно в режиме отладки и программирования и
поэтому должен переключаться. Если микроконтроллер применяется в гото
вой схеме, которая предназначена для продажи, то большинство разработчи
ков заинтересовано в том, чтобы программный код не смог быть прочитан
конкурентами. Поэтому перед программированием нужно соответствующим
образом установить биты конфигурации. В частности, для защиты программ
ного кода от чтения бит конфигурации Code Protect (Код защиты) должен
иметь значение ON (Включено).
-
l
2 Voo
ICD2 PICxxxx
10к0м
--
1 MCLRNpp
5 PGC
4 PGD
1
3 V55/GND
r Сброс (Reset)
- -
Рис. 4.1. Схема подключения отладчика-программатора ICD 2
к РIС-микроконтроллеру
98 4. Программный интерфейс
4.3.1. Генератор
Микроконтроллер не может работать без тактовых импульсов, т. к. для обес
печения различных возможностей арифметического устройства необходима
синхронизация. Выбор типа генератора зависит от требований к временной
точности тактовых импульсов. Если требуется всего лишь подключать раз
личные выходы в зависимости от входных сигналов, то часто достаточно
простого RС-генератора (RC - резистивно-емкостной генератор). Если на
основе микроконтроллера выполнен секундомер для измерения скорости, то
требования к временной разрешающей способности значительно выше и по
этому требуется использовать кварцевый резонатор.
Таким образом, микроконтроллер PIC16F876A может работать в одном из
четырех режимов тактового генератора.
RC: Resistor/Capacitor (_RC_OSC)
LP: Low-Power Crystal (_LP_OSC)
ХТ: Crystal/Resonator (_XT_OSC)
HS: High-Speed Crystal/Resonator (_HS_OSC)
5.1. Описание
схемы аппаратных средств
Монтажная плата состоит из различных частей схемы, которые связаны с
микроконтроллером PIC16F876A. Плата сконструирована так, что имеется
возможность демонстрац�и многих свойств микроконтроллера. Обмен дан
ными между монтажной платой и персональным компьютером осуществля-
108 5. Монтажная плата
U+
U1
Xi LM7805
UIN -�--------=-
1 UI uo
GND
N
GND U+ Х2
PROGR/\MMIER-PORT
R9
10k .., N М � 1.11
U+ GND
!С1
1
2
�/UPP PGD
3
i'\N0 PGC
i'\N1 RB5
+ Ri'\2 RB"f
Рис. 5.2. Программный интерфейс
се LED 2 5
Ri'\2
�г-127р
Ri'\3
TASTER 1 6
Ri'\"f
TASTER 2 7 Ri'\5
о 8
N z g
USS1
c:;Ji=::i� OSC1
v- 10 OSC2
С9 TASTER 3 11
U+ U+
R2 Ri
ik ik
GND
l"IN1
Рис. 5.4. Аналоговые напряжения
5.1.5. Кнопки
При помощи кнопок Sl-S4 (рис. 5.5) на входы микроконтроллера можно
подавать четыре статических сигнала, низкого логического уровня при нажа
тии и высокого логического уровня при отпускании кнопок. Если же ни одна
U+ U+ U+ U+
R5 R6 R7 R8
10k 10k 10k 10k
TASTER_1
TASTER_2
ТАSТЕR_З
TASTER_4
U+ U+ U+ U+
OUT_i
OUT_2
оuт_з
OUT_4
Т4
U+ U+ U+
С6
1----1�ш
100n RЗ R4
00 4k7 4k7
IСЭ
о 1 u 6 SCL
z А0 u SCL
(!)
:::,
о 2 5 SOA
z А1 SDA
(!)
IC4 + 3 сп 7 о
::::> А2 сп L,JP z
ucc 2 +
::::>
:::, (!)
3 2-iLCЭ2A
OUT ....
1 о
GND z
TSOP1736 GND
5.1.8. ЕЕРRОМ-память
Для сохранения больших объемов данных применяется внешняя ЕЕРRОМ
память (рис. 5.8). В ней могут сохраняться данные посредством двухпровод
ного последовательного интерфейса 12 С, поддерживаемого микросхемой па
мяти. Керамический конденсатор С6 уменьшает высокочастотные помехи в
цепи питания и должен размещаться по возможности как можно ближе к вы
воду Vсе для подключения напряжения питания. Резисторы R3 и R4 нужны
для формирования высокого логического уровня на линиях шины 12С при
5. Монтажная плата 113
U+
С1
�Щ----1
(!)
100n
IC2 С2
С1+ 1
100n 2 u
U+
:!;� С1- 3 100n
100n 6
u-
�� С2+ 4
сэ
Х1 С2- 5
100n
T10UT T1IN
T20UT T2IN
R1IN С)
R10UT
R2IN (!) R20UT
МАХ232А
GND
GND
Рис. 5.9. Интерфейс RS-232
IJ+ GND
R18
39R
IJ+
.... N ....
(!) (S)
N
С?
100n
26
27
VDD
vss
....
<r:
....
u
*:1 N
u
N
<r:
23 о
21 PSB i--=�--iz
CAP1N (!)
DISP1
22 САР1Р
GND DISP_EIIOOG
� 40
+
::) VIN �
�....1
VOUT ''
(f)U
l'-\Ql!J,;-MN.-<IS\
1:з
00000000
'({)
waa �
IJ+
хз
TASTER 1 1 1 2 2 AN0
TASTER 2 з з ... ... AN1
TASTER 3 5 5 6 6 OUT 1
TASTER 4 7
7 в в OUT 2
о1 9 10 о
z 9 10 z
1 <.!)
<.!)
+
:::>
� 11 1112 12 ...
.... :::>
CSB 13 131'1 1'1 OUT 3
RS 15 1516 16 OUT.'I
CLK 17
1718 18 SDA
SI 19 1920 20 SCL
5.2.3. Определения
С помощью директивы #define можно определить замену текста в листинге.
Стоящий справа за директивой #define условный текст заменяется на сле
дующую далее и реально поддерживаемую ассемблером последовательность
символов, которая является подлинным текстом. Замена условного текста на
подлинный осуществляется перед процессом компиляции. Таким образом,
программный код на ассемблере может оформляться наиболее понятным об
разом.
,--------------------------
; Определения
,--------------------------
#define Taster 1 PORTA, 4 ;Кнопка Sl подключена к выводу RA4
#define Taster 2 PORTA, 5 ;Кнопка S2 подключена к выводу RA5
5. Монтажная плата 117
5.2.4. Переменные
В программном коде в секции Переменные (vARIAВLEN) указываются регистры,
которые используются в программе. В начале строки стоит идентификатор
переменной или имя самостоятельно определенного регистра. За директивой
EQU указывается значение или адрес регистра. Регистры специального назна
чения с фиксированными адресами (например, PORTA) определяются таким
же способом.
,---------------------------
; Переменные
,---------------------------
w_temp EQU Ох70
status_temp EQU Ох71
5.2.5. Макрокоманды
Другой вид замены текста- это макрокоманды (макросы), т. е. последова- -
тельность инструкций и директив, которые могут быть вставлены в код про
граммы, используя специальный запрос макроса. Большое преимушество
макросов состоит в том, что с их помощью можно передавать значения, кото
рые заменяются перед процессом трансляции. В начале строки стоит метка
или иначе имя макроса, с помощью которого вызывается макрокоманда. Ди
ректива macro обозначает начало макрокоманды. Затем указываются трансли
руемые данные, которые имеются в используемой макрокоманде. В следую
щих строках перечисляются коман__ды и директивы ассемблера, которые за
менят имя макроса, указанное в программном коде. Конец макрокоманды
обозначается с помощью директивы endm.
118 5. Монтажная плата
,---------------------------
; Макросы
,---------------------------
BANK О macro ;Выбор регистра из Банка О
BCF STATUS,RPO
BCF STATUS,RPl
endm
BANK 1 macro ;Выбор регистра из Банка 1
BSF STATUS,RPO
BCF STATUS,RPl
endm
BANK 2 macro ;Выбор регистра из Банка 2
BCF STATUS,RPO
BSF STATUS,RPl
endm
BANK 3 macro ;Выбор регистра из Банка 3
BSF STATUS,RPO
BSF STATUS,RPl
endm
Далее, как правило, следует метка перехода (в данном случае метка start),
которая указывалась в команде goto за командой ORG охооо. Отсюда собст
венно и начинается основная программа.
start ;Начало программы
;Инициализация
BANK О ;Включить при запуске Банк о
clrf PORTA ;Установить все биты PORTA в о
clrf PORTB ;Установить все биты PORTB в о
clrf PORTC ;Установить все биты PORTC в о
5.2.7. Инициализация
В начале инициализации в этом примере все выводы порта ввода/вывода
PORTA настраивают в качестве цифровых. Выводы этого порта могут ис
пользоваться и в качестве аналоговых входов или линий интерфейса РС, но
после соответствующей настройки во время выполнения программы. Затем
некоторые выводы портов ввода/вывода PORTA, PORTB и PORTC настраи
вают как входы, а некоторые как выходы.
BANK 1 ;Переключиться на Банк 1 для регистра TRIS и ADCONl
movlw Ь'00000110' ;Все выводы PORTA сделать цифровыми выводами I/0
movwf ADCONl
movlw b'llllOOll' ;Настроить биты <3:2> порта ввода/вывода PORTA
movwf TRISA ;как выходы, остальные как входы
movlw Ь'11000000' ;Настроить биты <7:6> порта ввода/вывода PORTB
movwf TRISB ;как выходы, остальные как входы
movlw b'llllllll' ;Настроить все выводы PORTC как входы
movwf TRISC
BANK О ;Переключиться обратно на Банк О
В конце программы на ассемблере нужно задать еще одну директиву END, ко
торая указывает на окончание команд программы. Код программы будет
транслироваться именно до этого места.
END ;Конец программы
6. Входы и выходы
RAO/ANO 2 27 RB6/PGC
RA5/AN4/SS/C20UT 7 22 R81
PIC16F876A
Vss 8 21 RBO/INT
RC2/CCP1 13 16 RC5/SDO
ПРИМЕЧАНИЕ
Символ #, установленный слева от сокращенного обозначения выводов и слева
от соответствующих сигналов, обозначает вывод или сигнал с активным низким
логическим уровнем.
На рис. 6.1 по обозначениям выводов микроконтроллера PIC16F876A можно
легко определить, сколько различных функций может выполнить каждый вы
вод. Поэтому требуется заранее определиться, какую именно функцию он
должен реализовать. Это решение далее отразится при разработке электриче
ской схемы и программного обеспечения. Как правило, это не вызывает про
блемы, если вначале для вывода назначают определенную функцию и уже
больше ее не изменяют. Однако может случиться так, что нужно обращаться
к внешнему элементу посредством шины I2C (Inter Integrated Circuit Bus -
последовательная шина данных для связи интегральных схем) и к другому
элементу через интерфейс SPI (Serial Peripheral Interface - последователь
ный периферийный интерфейс). Поскольку эти фун:кции для интерфейсов I2C
и SPI определены совместно на выводах 14 и 15, то в этом случае для них во
время выполнения программы требуется предусматривать переключение
функций. Однако, чтобы чип, к которому обращаются посредством шины 12С,
получал данные только этой шины, надо дополнительно предусмотреть
6. Входы и выходы 123
Пример:
movlw b'llllOOll' ;Настроить выводы RАЗ и RA2 на выход,
;а остальные на вход
movwf TRISA
movlw Ь'11000000' ;Настроить выводы RВ7 и RВб на вход,
;а остальные на выход
movwf TRISB
movlw b'llllllll' ;Все выводы порта С настроить на вход
movwf TRISC
Как видно из примера, для настройки направления для выводов всех портов в
принципе было бы достаточно всего шести команд. Однако некоторые выво
ды не только используются как цифровые входы или выходы, а могут приме
няться в качестве аналоговых входов. Поэтому помимо регистров, управ
ляющих направлением передачи для выводов портов, необходимы еще
дополнительные управляющие регистры, которые нужны для выбора анало
гового или цифрового режима, а для аналогового режима еще и для управле
ния АЦП.
Таким образом, чтобы использовать цифровые входы порта А, должен при
меняться еще один дополнительный регистр ADCONl (A/D Control
register 1). Этот регистр имеет 13 возможных вариантов для настройки выво
дов порта в качестве цифрового входа или выхода и 14 вариантов для опре
деления выводов в качестве входов для аналоговых сигналов. При настройке
функции выводов имеют значение только младшие 4 бита этого регистра,
а именно PCFG [3 ...0]. Старшие его два разряда требуются только, если
должно осуществляться аналого-цифровое преобразование. Все возможные
значения регистра можно взять из описания, представленного в табл. 6.2.
Следует заметить, что выводы AN7, AN6 и AN5 в контроллере PIC16F876A
отсутствуют и имеются только в однотипных контроллерах в корпусах
с большим количеством выводов (PIC16F874A, PIC16F877A). Кроме того,
вывод RA4 в отличие от всех других выводов порта А мультиплексирован не
с аналоговым входом АЦП (AN4-ANO), а с входом TOCKl, предназначен
ным для внешних тактирующих импульсов таймера ТimerO.
Пояснение условных обозначений (в табл. 6.2):
(J А (англ. Аnаlоg)-аналоговый вход;
(J D (англ. Digital)-цифровой вход или выход;
(J VREF+ (англ. Voltage Reference)- вывод для положительного опорного
напряжения;
(J VREF- (англ. Voltage Reference)-вывод для отрицательного опорного на
пряжения.
128 6. Входы и выходы
PCFG (3 ..• 0) AN7 AN6 AN5 AN4 АNЗ AN2 AN1 ANO
0000 А А А А А А А А
0001 А А А А VREF+ А А А
0010 D D D А А А А А
0011 D D D А VREF+ А А А
0100 D D D D А D А А
0101 D D D D VREF+ D А А
0110 D D D D D D D D
0111 D D D D D D D D
1000 А А А А VREF+. VREF- А А
1001 D D А А А А А А
1010 D D А А VREF+ А А А
1011 D D А А VREF+ VREF'- А А
1100 D D D А VREF+ VREF- А А
1101 D D D D VREF+ VREF- А А
1110 D D D D D D D А
1111 D D D D VREF+ VREF- D А
Чтобы использовать все выводы порта А как цифровые входы или выходы,
в младших 4 битах регистра ADCON1 должно быть двоичное значение О11О
или 0111. Если же используются 1 аналоговый вход (ANO) и 5 цифровых вхо
дов, можно применять установку в 1110. К сожалению, нельзя задать 2 анало
говых входа и 4 цифровых входа или выхода. На этом месте нужно решаться,
устанавливать ли 3 аналоговых входа (0100), или использовать 2 аналоговых
входа с выводом для опорного напряжения (0101).
В следующем примере выводы RAO, RA2 и RАЗ устанавливаются в качестве
цифровых входов, а выводы RAI, RA4 и RA5 в качестве цифровых выходов.
Пример:
movlw Ь'00000110' ;Все выводы порта А сделать цифровыми входами
;или выходами
movwf ADCONl
6. Входы и выходы 129
Выводы порта В могут использоваться только как цифровые входы или вы
ходы. Лишь во время процесса программирования или отладки у некоторых
этих выводов имеется еще и другое предназначение. Единственный вывод
с особенной функцией - это вывод RВO/INT. С помощью этого входа может
быть вызвано внешнее прерывание по фронту входного импульса сигнала.
Должно ли прерывание вызываться при возрастающем переднем фронте им
пульса (от низкого к высокому уровню) или при спадающем заднем фронте
импульса (от высокого к низкому уровню), может быть выбрано в регистре
OPТION_REG. В этом же регистре можно указать, должны ли для выводов
порта В использоваться внутренние подтягивающие резисторы. Запретить же
или разрешить внешнее прерывание можно с помощью специального управ
ляющего регистра IТCON. Чтобы установить, какие выводы порта В будут
входами, а какие выходами, нужно воспользоваться регистром TRISB. Для
того чтобы действовать наверняка и быть уверенным, что сделаны правиль
ные настройки для выполнения программы, нужно воспользоваться полным
описанием регистра OPTION_REG.
Пример:
movlw b'OlOOOOOO' ;Значение инициализации OPTION REG
movwf OPTION REG
movlw b'll001010' ;Выводы RВ7, RВб, RВЗ, RВl настроить как входы
movwf TRISB ;Выводы RВS, RВ4, RВ2, RВО настроить как выходы
Тогда, когда требуется меньшее количество выводов для портов, чем имеется
в микроконтроллере, неиспользуемые выводы нужно настроить в качестве
входов и предусмотреть для них в схеме подтягивающий или согласующий
резистор. В этом есть свой резон, поскольку в этом случае входной вывод
имел бы определенный логический уровень. Когда же вывод оставляют от
крытым, то экономят внешнее сопротивление, однако, тогда уже нельзя быть
уверенным в том, верное ли значение будет прочитано из порта. Это особен
но важно, например, если в программе выполняют сравнение некоторой
8-битной постоянной с полученным из порта значением, поскольку результат
тогда может быть совершенно непредсказуемым. Если же эта проверка важна
для последующего выполнения программы, тогда заранее даже не предста
вить, как она себя далее поведет.
t- временная задержка;
PS - значение предделителя (Prescale);
.ТMRlH- старший байт 16-битного таймера;
TMRlL- младший байт 16-битного таймера.
Для временной задержки на 0,4 секунды значения регистров рассчитываются,
как это показано далее:
ц , 4 с = 55 - 4 ·l06 ·О, 4 = 55 = СВ
ТМR=65536- МГ ·О
4
6 36 1 36 0х3 О
4·8 4 ·8
15536
TМRlH = -- = 60, 6875 � 60 = Ох3С
256
ТМRlL= 15536-60 · 256 = 178 = ОхВО
7. Таймер 139
t - временная задержка;
PRE - коэффициент деления предварительного делителя частоты;
POST - коэффициент деления выходного делителя.
Тактовый сигнал =
Fosc /4
Предцелитель
1:1, 1:4 или 1:16
Увеличить
Содержимое
содержимое
регистра PR2
регистра TMR2
Нет
Выходной делитель
ОТ 1:1 ДО 1:16
Установить флаг
прерывания TMR21F
в регистре PIR1
4·1·10 4-10
При коэффициентах деления делителей 1:1О и 1:1 получаются целочисленные
значения и при этом не возникают никаких ошибок при округлении. В сле
дующем примере программного кода с помощью модуля таймера Тimer2
осуществляется временная задержка на 1 мс.
Пример:
BANK 1 ;Переключиться на Банк 1
movlw d'99' ;Регистр периода PR2 загрузить значением 99
movwf PR2
ВАNК О ;Переключиться на Банк О
clrf ТМR2
movlw Ь'01001100' ;Задать коэффициент деления для предделителя
movwf T2CON ;частоты 1:1, выходного делителя 1:10, Timer2 вкл.
bsf PORTA, 2 ;Установить на выводе RA2 высокий лог. уровень
btfss PIRl, TМR2IF ;Проверить момент установки флага прерывания при
goto $-1 ;соответствии значений в регистрах ТМR2 � PR2
bcf PIRl, TМR2IF ;Сбросить флаг прерывания TМR2IF
bcf PORTA, 2 ;Установить на выводе RA2 низкий лог. уровень
8. Обработка
аналоговых сигналов
Многие микроконтроллеры могут обрабатывать не только цифровые, но и
аналоговые сигналы. Эти сигналы поступают, например, от датчика темпера
туры, который в зависимости от температуры выдает соответствующий ана
логовый сигнал. Чтобы сигналы от датчиков могли обрабатываться микро
контроллером, их зачастую надо дополнительно усиливать. При помощи
аналогового входа микроконтроллера можно, например, контролировать на
пряжение батареи и выводить предупреждение при уменьшении напряж'ения
ниже определенного уровня. Аналоговые входы могут использоваться для
сигналов, которые изменяются достаточно медленно с частотой примерно до
1-5 кГц. Измерение сигналов, изменяющихся с большей частотой, также
возможно, но, разумеется, тогда частота измеряемых сигналов будет сильно
зависеть от времени преобразования. Если же помимо измерения выполняют
ся еще и необходимые вычисления, то в этом случае имеет смысл измерять
сигналы с частотой около 100 Гц или даже меньше. Исходя из этих ограниче
ний, можно сказать, что микроконтроллер не подходит для обработки стан
дартных звуковых сигналов с частотой от 20 Гц до 20 кГц. Поэтому для оп
ределения максимальной частоты измеряемых аналоговых сигналов важно
учитывать не только время преобразования, но так же и время обработки в
программе. Если, например, различные значения при измерении записывают
ся во внутреннюю ЕЕРRОМ-память, то максимальная измерительная частота
составляет около 250 Гц, поскольку для сохранения во внутреннюю
ЕЕРRОМ-память требуется минимум 4 мс. Однако температура или напря
жение батареи питания, как правило, изменяются достаточно медленно, по
этому без проблем можно осуществлять измерения при секундном или ми
нутном тактовом сигнале.
Ох289
З 614 Ох256 (З·,17В)
(2,92 В)
Ох1С6
(2,22 В)
t,
Рис. 8.1. Процесс преобразования аналогового сигнала
В. Обработка аналоговых сигналов 147
8.1.1. АЦП-преобразование
методом поразрядного уравновешивания
Имеются различные способы преобразования аналогового напряжения в
цифровое значение, как, например, с помощью сигма-дельта-преобразования
(Sigma-Delta) или метода поразрядного уравновешивания (последовательных
приближений). Преобразование сигма-дельта (Sigma-Delta) выполняется от
носительно быстро, но в то же время очень дорогое при реализации, поэтому
в микроконтроллерах не применяется. В рассматриваемом в этой книге
микроконтроллере PIC16F876A используется АЦП поразрядного уравнове
шивания.
На рис. 8.2 представлена его принципиальная схема. Как можно заметить, на
входе схемы находится мультиплексор, с помощью которого можно выбрать
требуемый вывод в качестве аналогового входа. Поскольку в микроконтрол
лере имеется только одна схема АЦП, то нельзя одновременно измерить не
сколько входных напряжений. Поэтому, при необходимости таких измере
ний, их выполняют по очереди. Это, разумеется, может приводить к ошибкам
при быстром изменении аналоговых сигналов. Если, например, измеряется
мощность на нагрузке, то сначала должен измеряться ток, а затем напряже
ние. При измерении тока после считывания электрического сигнала требует
ся еще некоторое время на осуществление преобразования его аналогового
значения в цифровой код. Только после этого может начаться измерение на
пряжения. Однако в этот момент времени текущее значение напряжения уже
может быть изменено и, таким образом, после последующего измерения и
умножения в измеряемую в итоге мощность будет внесена ошибка. Выбор
аналогового канала осуществляется с помощью трех битов CHS2-CHSO
в регистре ADCONO.
После выбора канала мультиплексором аналоговый сигнал поступает на уст
ройство выборки и хранения (Sample and Hold). При замыкании ключа доста
точно быстро заряжается конденсатор хранения. После того как конденсатор
будет полностью заряжен, ключ размыкает цепь, и измеряемое напряжение
на некоторое время сохраняется на конденсаторе. Это становится возмож
ным, поскольку последующий операционный усилитель (компаратор) имеет
очень высокоомный вход, через который протекает ничтожно малый ток.
Чтобы конденсатор хранения мог быстро заряжаться, внутреннее сопротив-
148 8. Обработка аналоговых сигналов
I I
СН�2 .. О
1
o-----r:
AN7� 111
1
AN6 110
1
AN5� 101
Компаратор
� ...J.-""' 100 Ключ
AN4 v---1
1
1 Блок
управления
I
Конденсатор
хранения
AN1
ANO ООО
ЦАП
Voo
VREF+ О) о
f-
\О \О
�
VREF" Оцифрованное
значение в регистрах
ADRESH и ADRESL
uсравн.
u.x ............... .
о о о о о о 1
Рис. 8.3. Принцип метода поразрядного уравновешивания
150 В. Обработка аналоговых сигналов
Nрег
OxЗFF
ОхЗFЕ
ОхООЗ
Ох()О2
Ох001
ОхООО
а. а. а. а. а. а. а. а. а. а. а. а.
Аналоговое
� � � � � � � � � � � �
(') (') (') (') (') (') (') (') (') (') (')
входное
�
м м
N N
ll) ll) (') ll)
N
ll)
N
(')
N
ll)
напряжение
C\i
....
с:,
� ....
о N
Uвх
�
Рис. 8.4. Передаточная функция АЦП
8. Обработка аналоговых сигналов 151
Пример:
Для примера положим, что на вход подается аналоговое напряжение 0, 8 В и
опорное напряжение, равное рабочему напряжению (5 В).
Nper =( 0; : · 02 )-0,
8
1 4 5=163, 34=163
,5
+о
163
U вх = · 5 В= О ' 798 В
1 024
ции сдвига больше выполнять не нужно. Как можно видеть на рис. 8.5, неис
пользованные биты регистров ADRESH и ADRESL наполняются нулями.
ADRESH ADRESL
ADFM = 1
О О о о ! о о i
.______.....,___.....,_..._.,..__,...._.....,_..._.,...._..._.,...._.._.....,_... (Результат выровнен
по правому краю)
1_...._.___,I'
.__.,.._i _...._.__...._..,.....____
10-битный результат АЦП
ADFM=O
I (Результат выровнен
о ! о ! о о о о
r-- ADRESH r-- ADRESL по левому краю)
С)
s
...s С)
s
\О \О \О \О
Эти регистры могут использоваться как для сложения, так и для вычитания.
При сложении регистры CALC_H_ 1 и CALC_L_ 1 складываются с регистрами
CALC_Н_2 и CALC_L_2, а результат сложения сохраняется опять в регист
рах CALC_H_ 1 и CALC_L_ 1. Если арифметические регистры были загруже
ны необходимыми значениями, то подпрограмма может вызываться коман
дой call Addl 6.
Addlб
movf CALC_L_2, W ;Получить младший байт 2-го слагаемого
addwf CALC_L_l, F ;Сложить 1-е и 2-е слагаемое
btfsc STATUS, С ;Проверить, встретилось ли переполнение
incf CALC_H_l, F ;Если да, старший байт увеличить на 1
movf CALC_H_2, W ;Получить старший байт 2-го слагаемого
addwf CALC_H_l, F ;Сложить старшие байты слагаемых
return ;Готово, возврат в основную программу
В. Обработка аналоговых сигналов 157
movwf CALC Н 1
BANK 1
movf ADRESL, W ;Скопировать младшие разряды оцифрованного
;значения в арифметический регистр для вычислений
BANK О
movwf CALC L 1
movlw ОхОЗ ;Загрузить значение ОхОЗЗЗ = d'819',
movwf CALC Н 2 ;соответствующее 4 В, во 2-й арифметический рег.
movlw ОхЗЗ
movwf CALC L 2
call SuЫб
btfss STATUS, с ;Проверить, отрицателен ли результат
goto ledЗ an ;Если напряжение между 3 и 4 В,
;тогда включить светодиод LED 3
goto led4 an ;Если напряжение более 4 В,
;тогда включить светодиод LED 4
После этих описаний светодиод можно включать при помощи команды bsf
LED х и соответственно выключать - bcf LED х.
led aus ;Все светодиоды выключить и
bcf LED 1 ;снова вьmолнить измерение
bcf LED 2
bcf LED 3
bcf LED 4
goto main
ledl an ;Включить только светодиод LED 1 и
bsf LED 1 ;снова вьmолнить измерение
bcf LED 2
8. Обработка аналоговых сигналов 161
bcf LED 3
bcf LED 4
goto main
led2 an ;Включить только светодиод LED 2 и
bcf LED 1 ;снова вьшолнить измерение
bsf LED 2
bcf LED 3
bcf LED 4
goto main
LedЗ an ;Включить только светодиод LED 3 и
bcf LED 1 ;снова вьшолнить измерение
bcf LED 2
bsf LED 3
bcf LED 4
goto main
Led4 an ;Включить только светодиод LED 4 и
bcf LED 1 ;снова вьшолнить измерение
bcf LED 2
bcf LED 3
bsf LED 4
goto main
Ь?-Ь4
0008 0001 0010 0011 0100 0101 0110 0111 1000
il 1 1 1 1 1 1 1 1
Ь3-ЬО
1 1 1 1.. в 1 1 1 1
0000
·�
0001
� : .
0010
1 1 1 1 1 1 1 1' 1 '
0011
1 1 1 1 1 1 1 1. 1 -
0100
111111111
0101
11 1 1 1 1 1 1 1 1
Рис. 9.1. Часть набора символов жидкокристаллического индикатора
Символ 1 2 з 4 13 14 15 16
Строка1 ОхОО Ох01 Ох02 ОхОЗ ..... ОхОС OxOD ОхОЕ OxOF
26
+5V VDD
GND 1 ' 27 VSS
1.L CAP1N EADOG-M - +5V
PSB 23
� САР1Р SB
8 бит
25
RESET 40 - +5V
+5V VIN
24
+5V VOUT
rn
с3 :3 i3 8 Е! о 8 ш 1� ci::
t-.
С1
<1)
l11
re re о .... � � ; � � [:; �
<') ,...., g;i
GND
!о ш ....
С1
CD iJj
С1 С1
<')
� rn rn
N
С1
�
Q
о
С1
w 1� <1)
о:
}
v
к микроконтроллеру
+5V :: 26 VDD
GND 11 27 vss
EADOG-M
1L CAP1N PSB 23 - +5V
л._ САР1Р 58
,�
8 бит
25 VIN RESET 40 +5V
+5V
+5V - 24 VOUT
ь s
�1�1�1�
:3 � с5 8 Б 8 w 1� 11)
а:
"' "' "'С> �"'
со "' � !::; � �
> G-ND
"' со � wi 11)
о:
' С1 С1 С1
,
к микроконтроллеру
+5V 26 VDD
GND 27 VSS
EADOG-M
21 CAP1N PSB 23 GND
22 58
САР1Р
8 бит
25 VIN RESET 40 +5V
+5V
+5V 24 VOUT
1'-
С1 � 8 с5 8 s а 8 w 1� о:
(Гj
1�
re g: O _. N M
м (")
"f'
� � t;; � �
,�
('l) ('1') ('1')
:.::
1ii �
к микроконтроллеру
SI
CLK
RS
Команда Данные
Подача напряжения
Управление питанием/
изображением/контрастом
Ожидание минимум 40 мс для
Посьu,ка команды Ох52
стабилизации приложенного
напряжения
Управление Вкл./Выкл.
Ожидание минимум 26,3 мкс индикатором
Посылка команды ОхОС
Установка смещения
Посьu,ка команды Ох14 Ожидание минимум 26,3 мкс
Установка контраста
Посьu�ка команды Ох78 Ожидание минимум 1,08 мс
Конец инициализации
гического уровня. Это делается для того, чтобы иметь определенное условие
для начала запуска процесса передачи. Для осуществления передачи 8 битов
команды в регистр DISP _SHIFT_CNТ счетчика записывают 8. Теперь вся
подготовка закончена, и данные могут циклически сдвигаться влево, так что
старший бит будет поступать на место флага переноса. С помощью команд
btfsc STATUS, с и btfss sтAтus, с проверяется, имеет ли флаг переноса зна
чение О или 1. Проверка должна происходить дважды, поскольку следующая
команда, стоящая после команды проверки, в случае выполнения условия
пропускается. На выводе индикатора SI теперь будут присутствовать досто
верные данные, которые при следующем положительном (возрастающем)
фронте тактового сигнала CLK будут приняты индикатором. Затем после не
которой задержки тактовый сигнал можно вернуть на низкий логический
уровень, чтобы при выдаче следующего бита информации можно бьmо снова
формировать положительный фронт тактового импульса. Теперь после
успешного вывода бита информации счетчик DISP_SHIFT_CNT уменьшается
на 1. Если все 8 битов будут переданы, то все управляющие сигналы снова
возвращаются в исходное состояние, и выдерживается нужное время ожида
ния 26,3 мкс (в данном случае было выбрано 30 мкс). После этого подпро
грамма будет выполнена и осуществляется возврат в основную программу.
9.3.3. Макрокоманда
для инициализации индикатора
В следующем примере представленная макрокоманда выполняет инициали
зацию индикатора ЕА DOG-M компании Electronic AssemЬly для отображе
ния 2х 16 символов. Команды инициализации соответствуют блок-схеме,
приведенной на рис. 9.7. Данная макрокоманда может использоваться во всех
других программах. Предпосылкой использования макрокоманды, а не под
программы является то, что в случае макрокоманды применяется только
лишь ее подмена на последовательность заранее определенных команд.
Пример:
INIT DISPLAY macro ;Инициализация индикатора ЕА DOG-M
movlw ОхЗВ ;Команда: Function Set
call SchreibeDispKommando
movlw Ох39 ;Команда: Function Set
call SchreibeDispKommando ; (должна передаваться второй раз)
movlw Ох14 ;Команда: Bias Set
call SchreibeDispKommando
9. Отображение данных на индикаторе 175
1 Маска команды
+
АС6 АС5
I С
А 41
АС
З I АС2 АС1 АСО Адрес
Рис. 9.8. Генерация кода команды для установки адреса оперативной памяти индикатора
N
U :::;�·5В (10.2)
вх 1024
Nрег
U ·100=-·100·5В (10.3)
вх 1024
Nе 5 00 400+100
U · 100- р г · 100. 5 В- Nре . - Nре
вх 1024 г 1024 г 1024
400+100 = 100 + 100
U ·lOO=Nре ·( ) Nр ·( )
вх г 1024 ег 256 1024
U ·lOO=N ·(
25 + 25 = · 25 + 25 )
) N ( (10.4)
вх рег 64 256 рег 64 64·2·2
Из преобразования видно, что выходной цифровой код преобразователя нуж
но умножать на 25 и делить затем на 64. Деление на 64 может реализоваться
неоднократными смещениями вправо, т. к. речь идет о степени 2. Чтобы
лучше можно было понять последующую подпрограмму, выполним опреде-
ление следующих регистров:
ADC 1 EQU ОхЗО ;Копия значения АЦП
ADC Н EQU Ох31
ADC Lx25 EQU Ох32 ;Значение АЦП умноженное на 25
ADC Нх25 EQU ОхЗЗ
ADC Lx25 64 EQU Ох34 ;Значение АЦП умноженное на 25/64
ADC Нх25 64 EQU Ох35
ADC Lx25 64 EQU Ох36 ;Значение АЦП умноженное на 25/256
ADC Lx25 64 EQU Ох37
UxlOO 1 EQU Ох38 ;Значение напряжения умноженное на 100
UxlOO Н EQU Ох39
Чтобы реализовать умножение на 25, можно разделить это действие на сле
дующие операции:
25 = (2 +1) · 2 · 2 ·2 +1
Используя приведенные упрощения, можно написать подпрограмму аналого
цифрового преобразования AD_ konvertieren.
BANK 1
movf ADRESL, W ;Получить младший байт значения АЦП в регистре W
BANK O
;movlw ОхЕО ;Здесь можно перезаписать значение АЦП
;тестовым значением ОхЕО
movwf ADC L ;Младший байт значения АЦП скопировать
;в регистр ADC_L
movwf ADC Lx25 ;Младший байт значения АЦП еще раз скопировать
;в регистр ADC_Lx25
;Умножение на 25
bcf STATUS, с ;Сбросить флаг переноса перед операцией сдвига
rlf ADC_Lx25, F ;Умножить на 2 с помощью сдвига влево
rlf ADC_Hx25, F ;содержимого регистров ADC_Lx25 и ADC Нх25
movf ADC_L, w ;Сложение значений
addwf ADC_Lx25, F ·, (соответствует в общей сложности умножению на 3)
btfsc STATUS, с
incf ADC_Hx25, F
movf ADC_H, w
addwf ADC_Нх25, F
bcf STATUS, с ;Сбросить флаг перенос� перед операцией сдвига
rlf ADC_Lx25, F ;Вьmолнить операцию сдвига битов влево, что
rlf ADC_Hx25, F ;в общей сложности соответствует умножению на 6
bcf STATUS, с ;Сбросить флаг переноса перед операцией сдвига
rlf ADC_Lx25, F ;Выполнить операцию сдвига битов влево, что
rlf ADC_Hx25, F ;в qбщей сложности соответствует умножению на 12
bcf STATUS, с ;Сбросить флаг переноса перед операцией сдвига
rlf ADC_Lx25, F ;Выполнить операцию сдвига битов влево, что
rlf ADC_Hx25, F ;в общей сложности соответствует умножению на 24
movf ADC_L, w ;Добавить еще одно значение, что
;в общей сложности соответствует умножению 25
addwf ADC_Lx25, F ;Поместить младший байт результата умножения
;на 25 в регистр ADC Lx25
btfsc STATUS, С
incf ADC_Hx25, F
movf ADC_Н, W
addwf ADC_Hx25, F ;Поместить старший байт результата умножения
;на 25 в регистр в ADC_Hx25
movf ADC_Hx25, W ;Скопировать содержимое регистра ADC Нх25
movwf ADC Нх25 64 ;в регистр ADC Нх25 64
movf ADC_Lx25, W ;Скопировать содержимое регистра ADC Lx25
movwf ADC Lx25 64 ;в регистр ADC_Lx25_64
;Значение АЦП 25 раз делится на 64
; (выполнение операции сдвига вправо 6 раз)
bcf STATUS, С ;Сбросить флаг переноса перед операцией сдвига
1 О. Отображение на индикаторе аналогового напряжения 183
Пример:
Определение числа сотен.
321-100= 221 (1-е успешное вычитание)
221-100= 121 (2-е успешное вычитание)
121-100= 21 (3-е успешное вычитание)
21-100=-79 (Отрицательное значение. Вычитать больше не нужно).
Число 100 вычиталось три раза без возникновения отрицательного результа-
та. Поэтому значение числа сотен будет равно 3.
1 О. Отображение на индикаторе аналогового напряжения 185
1 =5...О,005А
!U=58 С>
х1
ANO
U =0,005 ...58
R =0,1 Ом
U = 0,5...0,0005 8
С>
х10
AN1
U =0,005...58
Загрузить множимое
и множитель
Присвоить Pn .1 = 1
Счетчик для подсчета
кол-ва операций сдвига
Сдвиг вправо
множимого
(МЗР-битС)
Нет
Добавить множитель
Сложение не
(М2п_ 1 ... М20)
и старшее слово требуется
результата (P2n _1 ... Рп)
Сдвинуть общий
результат вправо
Нет
Запрос того, выполнены
ли все действия
Конец вычислений
mullб rotate
rrf МUL_E_4, F ;Выполнить сдвиг вправо содержимого 32-битного
rrf MUL_E_З, F ;регистра временного хранения результата
rrf МUL_E_2, F
rrf МUL_E_l, F
btfss STATUS, С ;Если бит 7 из регистра МUL_E_2 поступил в иб т С,
;то в 32-битном регистре будет итоговый результат,
goto mull 6 _loop ;поскольку 16 операций сдвига выполнены и
;вычисление результата умножения завершено
return ;Возврат из подпрограммы
Загрузи,ь чиспитель
и знаменатель
Загрузи,ь счетчик
количеством
делящихся битов (n)
Сдвинуть влево
чиспитель и остаток
Вычесть знаменатель
изосrатка
(результат в осrатке)
Нет
Сбросиn, младший
Да бит чиспителя
Zo=O
Установи,ь младший
бит чиспителя Сложить осrаток и
знаменатель
(результат в осrатке)
Уменьши,ь счетчик на 1
Нет
Конец вь�испений
Сдвигвлево
-10101010101011111 Остаток - Знаменатепь
о Результат
Сдвигвпево
-10101010101011111 Остаток - Знаменатепь
о Результат
Результат отрицательный
n= 6 101010101010101111111111111010101 Остаток + Знаменатепь
Сдвигвпево
-1°1°1010101011111 Остаток - Знаменатепь
Результат
Результат положительный
n=5 101010101010101011111111101010111 МЗР числителя = 1
Сдвигвлево
-10101010101011111 Остаток - Знаменатель
о Результат
Сдвигвлево
-10101010101°11111 Остаток - Знаменатепь
Результат
Сдвигвлево
-10101010101°11111 Остаток - Знаменатепь
о Результат
Результат отрицатепьный
n= 2 101010101010101111101010111011101 Остаток + Знаменатепь
Сдвигвлево
-10101010101011111 Остаток - Знаменатепь
Результат
п =1 Результат положительный
101010101010101010101011101110111 МЗР числителя = 1
Сдвигвпево
-10101010101011111 Остаток - Знаменатель
о Результат
п О Результат отрицатепьный
=
101010101010101010101110111011101 Остаток + Знаменатепь
тат =
Р е з ул ь =
Остаток
Рис. 11.6. Пример деления
200 11. Измерение мощности и сопротивления
11.5. Отображение
рассчитанного сопротивления
После вывода на индикатор мощности можно приступить к отображению
значения сопротивления. Как и при измерении мощности, при определении
сопротивления также представляют интерес разряды после запятой. Чтобы
определить сопротивление с 3 разрядами после запятой, значение напряже
ния умножается на коэффициент 1 ООО. Чтобы сохранить 1 ООО-кратное значе
ние напряжения, требуется как минимум 19-разрядный регистр (500 х 1 ООО =
= 500000 = 1111010000100100000 ). Однако представленная ранее подпро
10 2
грамма Mull6 поддерживает только умножение двух 16-битных значений. Для
решения этой задачи имеются два варианта. С одной стороны, можно расши
рить ранее написанную подпрограмму таким образом, чтобы сделать воз
можным умножение регистров с большей разрядностью. Другая возмож
ность - написать новую подпрограмму, которую можно будет использовать
и для других приложений. Поскольку в программах часто требуется умноже
ние значения на 1О, то лучше написать собственную подпрограмму для ум-
ножения на 1О. Если нужно умножать число на известный коэффициент
(здесь 10), то можно существенно оптимизировать подпрограмму и вследст
вие этого значительно сэкономить на вычислениях. Операцию умножения на
10 можно разделить, например, на простые команды сдвига и сложения (10 =
= 2 х 2 х 2 + 1 + 1). Поэтому в следующей подпрограмме выполняются три
сдвига влево содержимого регистров, что означает умножение на 8. Затем
значение должно дважды суммироваться, чтобы в итоге реализовать умно
жение на 10. Следующая подпрограмма Mul_xlO требует три 8-разрядного
регистра для множимого (24 бита) (мuL_XlO_H, MUL_XlO_M, МUL_XlO_L) и три
аналогичных регистра для результата (мuL_x1o_н_ERG, МUL_x1o_м_ERG,
МUL_XlO_L_ERG).
206 11. Измерение мощности и сопротивления
Mul xlO
movf МUL_XlO_L, W ;Копировать входные данные в регистры
movwf МUL XlO L ERG ;МUL_XlO_H_ERG, МUL_XlO_M_ERG, МUL_XlO_L ERG
movf МUL_XlO_M, W ;для временного хранения промежуточных
movwf МUL XlO М ERG ;результатов
movf МUL_XlO_H, w
movwf МUL XlO Н ERG
movlw d'З' ;Содержимое регистров временного хранения
movwf COUNTER ;результата для выполнения операции умножения
;на 8 должно 3 раза сдвигаться влево
mul_x2_loop
bcf STATUS, С ;Очистить бит переноса С, чтобы он
;не повлиял операции умножения
rlf МUL_XlO_L_ERG, F ;Умножение на 2
rlf МUL_XlO_M_ERG, F
rlf МUL_XlO_H_ERG, F
decfsz COUNTER, F ;Уменьnмть на 1 счетчик количества умножений
goto mul_x2_loop ;Если значение счетчика не О, то повторить
;операцию умножения на 2
movlw d'2' ;Теперь значение умножено на 8
movwf COUNTER ;Задать в счетчике количество операций
;сложения числовых значений равное 2
add_loop
movf МUL_XlO_L, W ;Добавить младший байт числового значения
addwf МUL_XlO_L_ERG, F
btfsc STATUS, С ;Проверить, был ли перенос и, если был, добавить
incf МUL_XlO_M_ERG, F ;1 к содержимому следующего рег-ра результата
movf МUL_XlO_M, W ;Добавить средний байт числового значения
addwf МUL_XlO_M_ERG, F
btfsc STATUS, С ;Проверить, бып ли перенос и, если бьm, добавить
incf МUL_XlO_H_ERG, F ;1 к содержимому следующего рег-ра результата
movf МUL_XlO_H, W ;Добавить старпмй байт числового значения
addwf МUL_XlO_H_ERG, F
decfsz COUNTER, F ;Уменьnмть значение счетчика и проверить его
goto add_loop ;Повторить операцию сложения, если значение в
;счетчике не равно О
movf МUL XlO_L_ERG, W ;Если равно О, т. е. 2 операции уже выполнены,
movwf МUL XlO L ;то скопировать результат умножения на 10 из
movf МUL_XlO_M_ERG, W ;регистров, предназначенных для временного
movwf,МUL_XlO_M ;хранения, в регистры МUL_XlO_H, МUL XlO М и
movf МUL_XlO_H_ERG, W ;МUL_XlO_L, в которых изначально было множимое
movwf МUL XlO Н
return
11. Измерение мощности и сопротивления 207
После выполнения этой части программы разряды перед запятой будут хра
ниться в регистрах STELLE_1-STELLE_ з, а 3 разряда после запятой - в регист
рах STELLE_ 4-STELLE_ 6. Также как и при отображении на индикаторе мощно
сти, в этом случае, при отображении сопротивления, должны выводиться
только три значащих разряда. Перед выводом цифрового значения сопротив
ления должны отображаться символы "R = ". Они выводятся во второй стро
ке, начиная с десятой позиции. Вслед за этим проверяется, имеются ли в де
сятичном значении сопротивления стоящие впереди нули, которые не долж
ны отображаться на индикаторе. Для этого начинают проверку со старшего
разряда (sтELLE-1). Если проверенный разряд не равен нулю, то он выводится
'
schreibe Stelleб
movlw ОхЗО ;Преобразовать 3-й разряд после запятой
;в код ASCII
addwf STELLE 6, W
call SchreibeDispDaten ;Отобразить последний разряд после запятой
;это значение для мОм (миллиом)
schreibe Einheit
movlw OxCF ;Вывод символа единицы измерения
call SchreibeDispKommando ;сопротивлений
;Таким образом, последним выводится символ
;"r.l" (Ом)
movlw OxlE
call SchreibeDispDaten
Десятичная точка должна выводиться после разряда единиц. Если все разря
ды перед запятой бьmи нулями, то десятичная точка является первым симво
лом, который представляется. После десятичной точки все цифры могут вы
водиться без следующей проверки.
Теперь по окончании вьщачи значения сопротивления основная программа
может быть запущена с самого начала.
12. Передача данных
посредством последовательного
интерфейса
В предыдущих примерах микроконтроллер всегда использовался как само
стоятельный узел, сообщая сведения пользователю только с помощью жид
кокристаллического индикатора или светодиодов. Однако часто требуется
для обмена данными подключать микроконтроллер к персональному компь
ютеру (ПК). Может возникнуть, например, случай, когда микроконтроллер
только накапливает результаты измерения, которые должны передаваться в
персональный компьютер для дальнейшей обработки с более высокой вычис
лительной мощностью. Посредством значительно более высокой вычисли
тельной производительности компьютера можно представлять на мониторе
обработанные результаты измерения в виде графиков. Другой пример, при
котором наоборот персональный компьютер должен передавать данные в
микроконтроллер, - это пример управления внешними аппаратными средст
вами. В таком случае на персональном компьютере программируется графи
ческий интерфейс, с помощью которого управляют внешним устройством,
а подключают аппаратные средства к персональному компьютеру посредст
вом последовательного интерфейса. Теперь есть возможность, например,
управлять по радио регулированием температуры с помощью персонального
компьютера. Микроконтроллеру только лишь сообщаются параметры желае
мой температуры, а он далее сам обеспечивает регулирование.
Имеются различные последовательные интерфейсы, которые отличаются тем,
как они передают данные. Самые известные интерфейсы, имеющиеся в нали
чии на персональном компьютере по умолчанию, - это интерфейсы USB
(Universal Serial Bus) и RS-232 (от англ. Recommended Standard). Интерфейс
USB является более сложным, но с его использованием можно достичь высо
ких скоростей передачи. Интерфейс RS-232 применяется в большинстве слу
чаев лишь в настольных компьютерах и в очень немногих портативных ком
пьютерах. К сожалению, интерфейс USB является относительно комплекс-
214 12. Передача данных посредством последовательного интерфейса
12.1.1. Подключение
через последовательный интерфейс
К сожалению, в интерфейсе RS-232 передаваемые данные должны иметь бо
лее высокие уровни напряжения, чем уровни ТТЛ (транзисторно-транзис
торной логики). Для передачи отдельных битов используются положитель
ные и отрицательные напряжения. Причем уровень между +3 В и +15 В ин
терпретируется как низкий логический уровень (Low), а напряжения между
12. Передача данных посредством последовательного интерфейса 215
пк МАХ232А PIC16F876
5 15 15 19
5 GND GND
4
4 •
• 8 тх о з
з 13
IN OUT 12
18
RX
• 7 RX 7 о 2 14 11 17
2 OUT IN тх
• 6 6 о
1 • о
Четная о 1
Нечетная 1 о
:s: :s:
\О
•:S: ii' ii' \О
:оm ('") •:S:
:о
�а. 5
('")
�
о N ,-..
!О
(..)
1-
\О
1-
:s:
\О
1-
:s:
\О
1-
:s: �
(..)
Высокий лог. уровень --�
(High)
+ЭВ-------
O В -------
-38 --------
�58--------------------------------------------------
Рис. 12.2. Передача латинской буквы М
Как можно видеть на рис. 12.2, в режиме простоя на линии всегда имеется
отрицательный уровень сигнала, если никакие данные не передаются. Пере
дача начинается со стартового бита, который переключает отрицательный
уровень (высокий логический уровень) на положительный уровень (низкий
логический уровень). Затем посьmаются 8 битов данных. Если для передачи
требуется использовать бит четности, то он вставляется за СЗР (MSB) (бит 7).
В конце данных посылается стоповый бит, который снова возвращает уро
вень сигнала в состояние простоя. После этого может выполняться передача
следующего слова, которая снова начинается со стартового бита.
бит? бито
Рис.12.3. Регистры TXSTA и RCSTA
init serial
ВАNК 1
movlw D'12' ;Задать скорость обмена в бодах, равную 19,2 кбод
movwf SPBRG ; (точное значение 19 231 бод)
movlw В'00000100' ;Установить 8-битный, высокоскоростной режим
movwf TXSTA
BANK О
movlw В'10010000' ;Разрешить прием последовательных данных
movwf RCSTA
Если были нажаты другие цифры или буквы, то происходит возврат на нача
ло основного цикла программы без выполнения каких-либо действий.
ledl ;Включить светодиод LEDl
Ьtfsc LED 1 ;Проверить, включен ли светодиод или нет
goto ledl_aus
bsf LED 1 ;если светодиод выключен, включить его
goto main
ledl aus
bcf LED 1 ;если светодиод включен, то выключить
goto main
led2 ;Включить светодиод LED2
Ьtfsc LED 2 ;Проверить, включен ли светодиод или нет
goto led2_aus
bsf LED 2 ;если светодиод выключен, включить его
goto main
led2 aus
bcf LED 2 ;если светодиод включен, то выключить
goto main
LedЗ ;Включить светодиод LEDЗ
Ьtfsc LED 3 ;проверить, включен ли светодиод или нет
goto ledЗ_aus
bsf LED 3 ;если светодиод выключен, включить его
goto main
ledЗ aus
bcf LED 3 ;если светодиод включен, то выключить
goto main
Led4 ;Включить светодиод LED4
Ьtfsc LED 4 ;проверить, включен ли светодиод или нет
goto led4_aus
bsf LED 4 ;если светодиод выключен, включить его
goto main
224 12. Передача данных посредством последовательного интерфейса
led4 aus
bcf LED 4 ;если светодиод включен, то выключить
goto main
Старт 2 7 8 9 2 7 8 9 2 7 8 9 Стоп
2
Рис. 13.1. Последовательность передачи по шине 1 С
памяти. Этот буфер необходим в связи с тем, что процесс записи продолжа
ется дольше, чем чтение.
На рис. 13.2 и 13.3 представлены примеры последовательности сигналов для
записи данных в ЕЕРRОМ-память. Последовательность сигналов для чтения
данных приведена на рис. 13.4 и 13.5.
,,
Перед чтением данных из ЕЕРRОМ-памяти сначала нужно передавать адрес
ячейки памяти, из которой должно выполняться чтение. Поэтому первона-
чально в управляющем байте после 12 С-адреса нужно установить бит R/W на
Адрес Адрес
Старт ст. байт мл.байт Слово данных Стоп
SCL
Адрес Адрес
Старт ст байт мл байт Слово данных О Слово данных 31 Стоп
SDA
SCL
SDA
SCL
Старт Слово данных О Слово данных 1 Слово данных 2 Слово данных n Стоп
,---;
SDA
SCL
F = ___F=os=c___ 13.1)
4-(SSPADD+l)
Из этой формулы для частоты передачи 100 кГц при тактовой частоте микро
контроллера Fosc = 4 МГц необходимо значение регистра SSPADD равное 9.
и
Для данных, которые должны передаваться или же приниматься, использует
ся регистр SSPBUF. Кроме того, имеются еще 3 управляющих контроли
рующих регистра, с помощью которых может запрашиваться или изменяться
состояние процесса передачи. В регистре SSPSTАТ отображается, например,
определялся ли стартовый или стоповый бит, а также полон ли буфер
SSPBUF при передаче или приеме данных. С помощью регистра SSPCON
включается модуль MSSP и задается режим его работы, т. е. должен ли
РIС-контроллер работать как ведущее или ведомое устройство в режиме 12С.
Посредством регистра -SSPCON2 могут выводиться различные комбинации
сигналов SDA и SCL, соответствующие условиям: "Старт" (Start), "Стоп"
(Stop) или подтверждение- сигнал АСК (Acknowledge).
Чтобы использовать интерфейс 12С для передачи данных в ЕЕРRОМ-память,
в примере выполняется следующая последовательность команд инициали
зации:
init i2c ;Инициализация модуля I2C
ВАNК. 1
movlw d'9' ;Установить частоту синхронизации равную 100 кГц
movwf SSPADD ;F = Fosc/(4*(SSPADD+l))
ВАNК О
movlw Ь'00101000' ;Включить модуль МSSP и конфигурировать PIC
movwf SSPCON ;как ведущее устройство в режиме I2C
BANK 1
movlw Ь'10100000' ;Настроить состояния модуля MSSP в режиме I2C
movwf SSPSTAT ;с помощью регистра SSPSTAT
clrf SSPCON2 ;Очистить все биты в регистре SSPCON2
ВАNК. О
ВАNК 1
btfsc SSPSTAT, R w ;Ожидать до тех пор, пока не будет выведен
goto $-1 ;младший байт адреса ячейки памяти
btfsc SSPCON2, ACKSTAT ;Проверить бит подтверждения
goto $-1 ;Ожидание подтверждения от ведомого устройства
ВАNК О
bcf PIRl, SSPIF ;Сбросить флаг прерывания от модуля MSSP
movf DATEN_H, W ;Передать старший байт данных
movwf SSPBUF
ВАNК 1
btfsc SSPSTAT, R W
goto $-1
btfsc SSPCON2, ACKSTAT ;Проверить бит подтверждения
goto $-1 ;Ожидание подтверждения от ведомого устройства
ВАNК О
bcf PIRl, SSPIF ;Сбросить флаг прерывания от модуля MSSP
movf DATEN_L, W ;Передать младший байт данных
movwf SSPBUF
BANK 1
btfsc SSPSTAT, R W
goto $-1
btfsc SSPCON2, ACKSTAT ;Проверить бит подтверждения
goto $-1 ;Ожидание подтверждения от ведомого устройства
ВАNК О
bcf PIRl, SSPIF ;Сбросить флаг прерывания от модуля MSSP
ВАNК 1
bsf SSPCON2, PEN ;Сгенерировать условие "Стоп"
ВАNК О
btfss PIRl, SSPIF ;Проверить, были ли прочитаны данные
goto $-1
bcf PIRl, SSPIF ;Сбросить флаг прерывания от модуля MSSP
ВАNК О
btfss TASTER 2
goto $-1
nop
return
ВАNК 1
bsf SSPCON2, SEN ;Сгенерировать условие "Старт"
btfsc SSPCON2, SEN ;Ожидать до тех пор, пois:a условие "Старт"
goto $-1 ;не будет сгенерировано
ВАNК О
bcf PIRl, SSPIF ;Сбросить флаг прерывания от модуля MSSP
movlw EEPROM ADR S ;Передать I2С-адрес ЕЕРRОМ-памяти
movwf SSPBUF
ВАNК 1
btfsc SSPSTAT, R W ;Ожидать до тех пор, пока адрес
goto $-1 ;не будет выведен
ВАNК О
movf ADR_H, W ;Передать старший байт адреса ячейки памяти
movwf SSPBUF
ВАNК 1
btfsc SSPSTAT, R w ;Ожидать до тех пор, пока не будет выведен
goto $-1 ;старший байт адреса ячейки памяти
ВАNК О
movf ADR_L, W ;Передать младший байт адреса ячейки памяти
movwf SSPBUF
ВАNК 1
btfsc SSPSTAT, R w ;Ожидать до тех пор, пока не будет выведен
goto $-1 ;младший байт адреса ячейки памяти
bsf SSPCON2, RSEN ;Повторное генерирование условия "Старт"
btfsc SSPCON2, RSEN
goto $-1
ВАNК О
bcf PIRl, SSPIF ;Сбросить флаг прерывания от модуля MSSP
movlw EEPROM ADR L ;Передать адрес для чтения из ЕЕРRОМ-памяти
movwf SSPBUF
BANK 1
btfsc SSPSTAT, R W ;Ожидать до тех пор, пока адрес
goto $-1 ;не будет выведен
loop_read
movlw а'О' ;Вывод префикса "Ох" для шестнадцатеричных чисел
call SendeZeichen
movlw а'х'
call SendeZeichen
;Чтение старшего байта
BANK O
bcf PIRl, SSPIF ;Сбросить флаг прерывания от модуля MSSP
BANK 1
bsf SSPCON2, RCEN ;Переключиться в режим приема
240 13. Передача данных по шине /2С
BANK О
btfss PIRl, SSPIF ;Проверить, считались ли данные
goto $-1
bcf PIRl, SSPIF ;Сбросить флаг прерывания от модуля MSSP
ВАNК 1
bcf SSPCON2, ACKDT ;Установить бит подтверждения
; (Acknowledge)
bsf SSPCON2, АСКЕN ;Активизировать условие подтверждения
; (вывод сигнала АСК)
btfsc SSPCON2, АСКЕN ;Ожидать до тех пор, пока сигнал подтверждения
goto $-1 ;не будет выведен
ВАNК О
bcf PIRl, SSPIF ;Сбросить флаг прерывания от модуля MSSP
movf SSPBUF, W ;Получить данные из буфера I2C
movwf DATEN Н
call Bin2Ascii ;Преобразовать двоичное значение
;в АSСII-значение
movf НЕХ_Н, W ;Передать через последовательный интерфейс
call SendeZeichen ;старшие 4 бита АSСII-значения
movf HEX_L, W ;Передать через последовательный интерфейс
call SendeZeichen ;младшие 4 бита АSСII-значения
;Чтение младшего байта
BANK О
bcf PIRl, SSPIF ;Сбросить флаг прерывания от модуля MSSP
ВАNК 1
bsf SSPCON2, RCEN ;Переключиться в режим приема
BANK О
btfss PIRl, SSPIF ;Проверить, считались ли данные
goto $-1
bcf PIRl, SSPIF ;Сбросить флаг прерывания от модуля MSSP
ВАNК 1
bcf SSPCON2, ACKDT ;Установить бит подтверждения
; (Acknowledge)
bsf SSPCON2, ACKEN ;Активизировать условие подтверждения
; (вывод сигнала АСК)
btfsc SSPCON2, ACKEN ;Ожидать до тех пор, пока сигнал АСК
goto $-1 ;не будет выведен
BANK О
bcf PIRl, SSPIF ;Сбросить флаг прерывания от модуля MSSP
movf SSPBUF, W ;Получить данные из буфера I2C
movwf DATEN L
call Bin2Ascii ;Преобразование двоичного значения
;в АSСII-значение
13. Передача данных по шине / 2С 241
1" т
...j
Рис. 14.1. Соотношение пауза-импульс инфракрасного передатчика
f=ЗбкГц
11111111111111111111111111111111 11111111111111111111111111111111
1" 889 мкс "1... 889мкс "1 1... 889мкс .,! .. 889мкс "1
,,О" "
"1
Рис. 14.2 . Передача логических сигналов с модуляцией импульсами с частотой 36 кГц
.
о
Рис. 14.5. Выборки полученного инфракрасного сигнала
После того как основная программа определила, что было изменение, далее
проверяются оба стартовых бита. Таким способом проверяется, используется
ли в данном случае код RC5. Если синхронизация нарушена уже на этом мес
те, то обработка принятых данных прерывается.
252 14. Переключение с помощью инфракрасного дистанционного управления
startbits_prufen
movlw d'14' ;Задать в счетчике IR_COUNTER количество битов
movwf IR COUNTER ;для считывания кода нажатой кнопки, равное 14
bsf IR АВТАSТ ;Указать момент выборки
DELAY TМRl US d'445' ;Временная задержка, чтобы делать выборку
;в середине следующего сигнала
bcf IR АВТАSТ ;Указать момент выборки
btfsc IR RCV
goto fehler ;Первый стартовый бит определен
;с ошибкой
decf IR COUNTER ;Первый стартовый бит распознан и допустим
btfsc STATUS, Z ;Проверить, сосчитал ли счетчик IR_COUNTER
;до О, считая в обратном порядке
goto fehler ;Счетчик сосчитал до О
DELAY TМRl US d'889'
bsf IR АВТАSТ ;Указать момент выборки
btfss IR RCV ;Первая половина 2-го стартового бита
;доmкна быть высокого уровня
goto fehler ;Ошибка
DELAY TМRl US d'889'
bsf IR АВТАSТ ;Указать момент выборки
btfsc IR RCV ;Вторая половина 2-го стартового бита
;доmкна быть низкого уровня
goto fehler ;Ошибка
decf IR COUNTER ;Уменьшить содержимое счетчика IR COUNTER на 1
btfsc STATUS, Z ;Проверить, досчитал ли счетчик
;до О, считая в обратном порядке
goto fehler ;Счетчик сосчитал до О
ir Ьittest low
movlw OxOl ;Проверка логического О
subwf IR_FLANКE, W
btfss STATUS, z
goto ir_Ьittest_high
bsf IR_STATUS, О ;Если бит равен О, то установить бит О
bcf IR_STATUS, 1 ;в регистре IR_STATUS,
;а бит 1 ОЧИСТИТЬ
bcf IR_STATUS, 2 ;Очистить бит ошибки
return
ir_Ьittest_high
movlw Ох02 ;Проверка логической 1
subwf IR_FLANKE, w
btfss STATUS, z
goto ir_Ьittest_fehler
bcf IR_STATUS, о ;Если бит равен 1, очистить бит О
bsf IR_STATUS, 1 ;в регистре IR_STATUS,
;а бит 1 установить
bcf IR_STATUS, 2 ;Очистить бит ошибки
return
ir Ьittest fehler
bcf IR_STATUS, о ;Если возникла ошибка, т. е. бьmо 2 следующих
bcf IR_STATUS, 1 ;друг за другом одинаковых состояния сигнала,
bsf IR_STATUS, 2 ;очистить бит О и бит 1 в регистре IR_STATUS,
;а бит ошибки (бит 2 в регистре IR_STATUS)
;установить
return
toggleЬit_lesen
call IR Bittest ;Подпрограмма проверяет следующий бит
btfsc IR_STATUS, о
clrf IR TOGGLE ;Бит переключения о
btfsc IR_STATUS, 1
bsf IR_TOGGLE, О ;Бит переключения = 1
btfsc IR_STATUS, 2
goto fehler ;Перейти на подпрограмму обработки ошибки
decf IR COUNTER ;Уменьшить на 1 содержимое счетчика IR_COUNTER
btfsc STATUS, z ;Проверить, сосчитал ли счетчик до О,
;вьшолняя счет в обратном порядке
goto fehler ;Перейти на подпрограмму обработки ошибки
В это время уже 8 битов будет считано и останется еще 6 битов команды.
Проверка и считывание битов команды выполняются аналогично проверке и
считыванию адреса.
movlw d'б' ;Задать количество разрядов (=6) для
movwf COUNTER ;считывания команды
clrf IR BEFEHL
bcf STATUS, С ;Очистить бит переноса, ч�обы он
;не мешал при сдвиге
befehlbits lesen
rlf IR BEFEHL
call IR Bittest ;Подпрограмма проверяет следующий бит
btfsc IR_STATUS, О
bcf IR_BEFEHL, О ;Бит команды о
btfsc IR_STATUS, 1
bsf IR_BEFEHL, О ;Бит команды= 1
btfsc IR_STATUS, 2
goto fehler ;Перейти к обработке ошибок
decf IR COUNTER ;Уменьшить на 1 содержимое счетчика IR COUNTER
btfsc STATUS, Z ;Проверить, досчитал ли
;счетчик до О
goto ende_daten ;Счетчик досчитал до О
decfsz COUNTER
goto befehlbits lesen ;Если не все биты команды еще
;считаны, продолжить чтение битов команды
После того как цикл бу дет пройден 6 раз, код нажатой кнопки будет хранить
ся в регистре IR_BEFEHL. В это время все 14 битов будут считаны и можно
приступить к анализу отдельных регистров.
В приведенном примере оценивается только регистр для хранения команды
IR_BEFEHL. Поэтому адрес может выбираться любым. То есть безразлично,
нажата ли была кнопка на дистанционном управлении для спутникового при
емника или телевизора.
епdе daten ;Все биты данных считались и
;теперь анализируются
movlw VOL Р ;Значение для кнопки "Громкость +" OxlO (VOL +)
subwf IR_BEFEHL, W
Ьtfsc STATUS, Z
goto ledl_an ;Включить LED 1
movlw VOL М ;Значение для кнопки "Громкость -" Oxll (VOL -)
subwf IR_BEFEHL, W
Ьtfsc STATUS, Z
14. Переключение с помощью инфракрасного дистанционного управления 257
fehler
DELAY ТМR.1 US d'40000' ;Ожидание 40 мс после ошибки, вместе
;с тем на следуюшие сигналы больше
;не будет обращаться внимание
goto main ;Вернуться назад в основную программу
STAТUS
Бит7
IRP
Бит6
RPI
Бит5
RPO
Бит4
NOT ТО
Бит3
NOT PD
Бит2
z
Битl
DC
Бит О
с
�
о
:::, :а, о:,
-gа, �:s:
;::j �
g о
(1)�i(1) оО\
w
'О
,�
: :,:
...... � �
:s:, 'О
ОхОВ INТCON GIE PEIE ТМRОIЕ 1NТЕ RВIE ТМROIF INTF RВIF ф
§. � °'
� (')
�
ОхОС PIRI PSPIF ADIF RCIF ТXIF SSPIF CCPIIF ТМR2IF ТМRIIF
i::� -1
OxOD PIR2 - CМIF - EEIF BCLIF - - CCP2IF :,:
�: (1) о
g.
, о :а, .а -о
s'(1) :s:,� ;s '<:::tш
Г
OxlO ТICON - - ТICКPSI ТIСКРSО TIOSCEN NOT_ТISYNC ТМRICS ТМRIШ.
'"t:I °'
Ох12 Т2СОN - ТОUТРSЗ TOUТPS2 TOUТPSI TOUТPSO ТМR20N Т2СКРSI Т2СКРSО
Ох14 SSPCON WCOL SSPOV SSPEN СКР SSPMЗ , SSPМ2 SSPMI SSPMO �=i �
>т:100:
'О
f»
Ох17 CCPICON - - CCPIX CCPIY ССРIМЗ ССРIМ2 CCPIMI CCPIMO �?'r,
О'1 ::с 1» ш
:::i
z�(1) (1)е:а,
::r,. s,,
:s: � ф
Ох18 RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D ;.....
:s:
ж
OxlD CCP2CON - - ССР2Х ССР2У ССР2М3 ССР2М2 CCP2Ml ССР2МО ("'), s � ::а
:s:
OxIF ADCONO ADCSI ADCSO CHS2 CHSI снsо GO_DONE - ADON ::,: :,:е:
(')
;�(1) о
(')
Банкl °'
тосs .., "' о::а-1
:s: ;J
�-а ж:s:
Ох81 ОРТЮN REG NOT RВPU INТEDG TOSE PSA PS2 PSI PSO
Ох8С PIEI PSPIE ADIE RCIE ТХ1Е SSPIE CCPIIE ТМR21Е ТМRIIE "' "'
о -
- - - ::а
- ;j 8
(1) J::
Ox8D PIE2 СМIЕ EEIE BCLIE ССР21Е а, (1)
Ох8Е PCON - - - - - - NOT_POR NOT_BOR .., :s:
� �
Ох91 SSPCON2 GCEN АСКSТАТ
СКЕ
АСКDТ АСКЕN
р
RCEN
s
PEN RSEN SEN
i.., �g; о
°'
Ох94 SSPSTAT SМР D A R_W UA BF
Ох98 ТХSТА CSRC ТХ9 ТХЕN SYNC - BRGH ТRМТ ТХ9D
о
:,:
8 eJ
:,: :,:
Ох9С СМСОN С20UТ сюuт C2INV CIINV CIS СМ2 CMI смо (1)1».с: (1).с:
1»
:,: :,:
CVREN CVRR - CVR3 CVR2
;
-�; -а1
Ox9D CVRCON CVROE CVRI CVRO
Ox9F ADCONI ADFМ ADCS2 - - PCFGЗ PCFG2 PCFGI PCFGO "'
� :::, о
"О (1)
Банк3 ;j .g �
о .с:
Ох18С EECONI EEPGD - - - WRERR WREN WR RD
� �
Приложение 261
Бит 7: IRP: Бит выбора банка для регистра при косвенной адресации
1= банк 2, 3 (OxlOO-OxlFF)
О= банк О, 1 (OxOO-OxFF)
Бит 6-5: RPI:RPO: Бит выбора банка регистра при непосредственной адресации
11= банк 3 (Ox180-0x1FF)
10= банк 2 (Ох100-0xl 7F)
О1= банк 1 (Ox80-0xFF)
00= банк О (Ox00-0x7F)
Каждый банк содержит 128 байтов
Бит 4: NOT_TO: Флаг переполнения сторожевого таймера
1= после включения или выполнения команд CLRWDT и SLEEP
О= после переполнения сторожевого таймера WDT
Бит 3: NOT_PD: Флаг включения питания
1= после включения питания или выполнения команды CLRWDT
О= после выполнения команды SLEEP
Бит 2: Z: Флаг нулевого результата
1= нулевой результат математической или логической операции
О= не нулевой результат математической или логической операции
Бит 1: DC: Флаг десятичного переноса/заема (заем имеет инверсное значение)
1= был перенос из младшего полубайта (из бита 3 в бит 4)
О= не бьmо переноса из младшего полубайта
Бит О: С: Флаг переноса/заема (заем имеет инверсное значение)
1 = бьт перенос из старшего бита
О= не бьmо переноса из старшего бита
262 Приложение
Бит 1: UA: Флаг обновления адреса устройства (только для 10-битного ведомого
режима)
1 = показывает, что пользователь должен обновить адрес в регистре SSPADD
О = обновление адреса не требуется
Бит О: BF: Бит состояния заполнения буфера
В режиме приема:
1 = прием завершен, буфер SSPBUF полон
О = прием не завершен, буфер SSPBUF пуст
В режиме передачи:
1 = выполняется передача данных (исключая биты #АСК и STOP), буфер
SSPBUF полон
О= передача данных завершена (исключая биты #АСК и STOP), буфер SSPBUF
пуст
274 Приложение
Бит 7: WCOL: Бит распознавания конфликта данных при записи (только в режиме
передачи)
1 = запись в регистр SSPBUF во время передачи предыдущего байта
О = конфликта не бьmо
Бит 6: SSPOV: Бит переполнения приемника
1 = новый байт принимался, в то время как предыдущий байт находился еще
в регистре буфера приемника SSPBUF. Это может происходить только в ведомом
режиме. В ведущем режиме этот бит в 1 не устанавливается, поскольку каждая
операция инициализируется записью в регистр SSPBUF (сбрасывается
программно)
О = нет переполнения
Бит 5: SSPEN: Бит включения модуля MSSP
1 = модуль MSSP включен, выводы SCK, SDO, SDI и #SS используются модулем
MSSP
О = модуль MSSP выключен, выводы S,CK, SDO, SDI и #SS используются
в качестве цифровых выводов порта ввода/вывода
Бит 4: СКР: Бит выбора полярности тактового сигнала
1 = пассивный уровень тактового сигнала - высокий логический уровень
О = пассивный уровень тактового сигнала - низкий логический уровень
Бит 3-0: SSPMЗ:SSPMO: Биты выбора режима работы модуля MSSP
О1О 1 = ведомый режим SPI, вывод SCK применяется для тактового сигнала,
вывод #SS не используется модулем и может применяться в качестве цифрового
вывода порта ввода/вывода
О100 = ведомый режим SPI, вывод SCK применяется для тактового сигнала,
вывод #SS используется модулем MSSP
0011 = ведущий режим SPI, тактовый сигнал = выход таймера 2/2
0010 = ведущий режим SPI, тактовый сигнал = F0 ,/64
0001 = ведущий режим SPI, тактовый сигнал = F0,/l6
0000 = ведущий режим SPI, тактовый сигнал = F0,/4
Приложение 275
ADCONl ADCONO
Тактовый сигнал для преобразования
<ADCS2> <ADCSl:ADCSO>
о 00 F0,J2
о 01 F0,J8
о 10 F0,J32
о 11 FRc (В}!'уrренний RС-генератор)
1 00 F0,J4
1 01 F0,Jl6
1 10 F0,J64
1 11 FRc (внуrренний RС-генератор)
ADCONl ADCONO
Тактовый сиrнал для преобразования
<ADCS2> <ADCSl :ADCSO>
о 00 Fo,J2
о 01 Fo,J8
о 10 F0,J32
о 11 FRc (внутренний RС-генератор)
l 00 Fo,cl4
l 01 FosJ16
1 10 Fo,cl64
l 11 FRc (внутренний RС-генератор)
Бит 5-4: Не реализованы: читаются как О
Бит 3-0: PCFG3:PCFGO: Управляющие биты для настройки каналов АЦП
PCFG
AN7 AN6 AN5 AN4 АNЗ AN2 ANl ANO VREF+ VREF-
(3•••01
0000 А А А А А А А А Уоо Yss
0001 А А А А VREF+ А А А АNЗ Yss
0010 D D D А А А А А Уоо Yss
0011 D D D А VREF+ А А А АNЗ Yss
0100 D D D D· А D А А Уоо Yss
0101 D D D D VREF+ D А А АNЗ Yss
0110 D D D D D D D D - -
0111 D D D D D D D D - -
1000 А А А А VREF+ VREF- А А АNЗ AN2
1001 D D А А А А А А Уоо Yss
1010 D D А А VREF+ А А А АNЗ Yss
1011 D D А А VREF+ VREF- А А АNЗ AN2
1100 D D D А VREF+ VREF- А А АNЗ AN2
1101 D D D D VREF+ VREF- А А АNЗ AN2
1110 D D D D D D D А Уоо Yss
1111 D D D D VREF+ VREF- D А АNЗ AN2
Приложение 283
Описание компакт-диска
Далее в виде таблицы приведено описание компакт-диска.
(продолжение)
Папка Файл Описание
\Вeispiele\Кap_6_4_ Полные тексты программы из
LED-Muster разд. 6.4 "Пример программы
"Управление светодиодами""
\Вeispiele\Кap_7_2_ Полные тексты программы
Lauflicht "Бегущие огни" из разд. 7.2
\Вeispiele\Кap_8_2_ Полные тексты программы
Voltmeter "Вольтметр" из разд. 8.2
\Вeispiele\Кap_9_4_ Полные тексты программы для
HelloWorld вывода текста "Hello World!"
на ЖК-индикатор, рассмотренной
в разд. 9.4
\Вeispiele\Кap_1О_4_ Полные тексты программы для
Spanпungsaпzeige отображения напряжения на инди-
каторе, рассмотренной в гл. 1 О
\Вeispiele\Кap_11_ Полные тексты программы для
P-R-Messuпg измерения мощности и сопротив-
ления, рассмотренной в гл. 11
\Вeispiele\Кap_12_4_ Полные тексты программы для
PC-Steuerung управления микроконтроллером
с помощью компьютера посредст-
вом последовательного интерфейса,
рассмотренной в разд. 12.4
\Вeispiele\Кap_13_3_ Полные тексты программы из
Messwertspeicherung разд. 13.3 "Пример программы
"Сохранение измеренных значений
в ЕЕРRОМ-памяти""
\Вeispiele\Кap_14_2_ Полные тексты программы для
IR-Schalter инфракрасного управления, рас-
смотренной в разд. 14.2
\DatenЫaetter \l2C_Spec_NXP_UМ10204_3.pdf Спецификация и руководства поль-
зователя интерфейса 12С (англ.)
\PIC16F876A_DataSheet.pdf Технические характеристики
на микроконтроллер PIC16F876A
(англ.)
\PIC16F87XA_Errata.pdf Замеченные опечатки в документа-
ции по семейству микроконтролле-
ров PIC\6F87XA (англ.)
\PICmicro_MidRange_ Расширенное руководство по сред-
ReferenceMaнua\_33023a.pdf нему семейству микроконтролле-
ров Pl�micro (англ.)
\Entwicklungsboard Документация и ПО для изготовле-
ния монтажной платы
\Вestilckungsplan_PIC-Eval.pdf Схема расположения деталей
на монтажной плате
\Вottomlayer_PIC_Eval. pdf Чертеж печатной платы, вид снизу
Приложение 289
(продолжение)
Папка Файл Описание
\Schaltplan_PIC_Eval.pdf Принципиальная схема монтажной
платы
\Stiickliste_PIC-Eval. pdf Спецификация монтажной платы
(нем.)
\Top\ayer_PIC_Eval.pdf Чертеж печатной платы, вид сверху
(со стороны деталей)
\Entwicklungsboard \ВC547_Fairchi\d.pdf Технический паспорт на транзистор
\DatenЫaetter ВС547 компании Semicqnductor
(англ.)
\Display_EA_dog-m.pdf Технический паспорт на ЖКИ ЕА
DOGM162 (нем.)
\EEPROM _ 24LC32A _Microchip.pdf Технический паспорт на EEPROM-
память 24LC32A производства
компании Microchip (англ.)
\IR-Empfaenger- Технический паспорт на микросхе-
Modul_TSOP_1736_Vishay.pdf му инфракрасного приемника
TSOP1736 производства компании
Vishay (англ.)
\L 7805 _ST_Spaпnungsregler.pdf Технический паспорт на стабилиза-
тор L7805 (англ.)
\LM7805_Fairchild. pdf Технический паспорт на стабилиза-
тор LM7805 (англ.)
\PICl6F876A_DataSheet.pdf Технические характеристики на
микроконтроллер PIC16F876A
(англ.)
\PICl6F87XA_Eпata.pdf Замечен,ные опечатки в документа-
ции по семейству микроконтролле-
ров PIC16F87XA (англ.)
\RS232_Converter_ Техническое описание преобразо-
MAX220-МAX249.pdf вателей МАХ220-МАХ249 для
преобразования сигналов
ТТЛ/КМОП-уровня в сигналы
интерфейса RS-232 (англ.)
\ST7036_LCD- Техническое описание контроллера
Controller EADOG.pdf ST7036 для ЖКИ (англ.)
\Entwicklungsboard Рекомендации по установке ПО
\Layoutdaten_Eag\e Eag\e
\Мр\аЬ Документация и ПО для среды
программировани,я МРLАВ
\Mplab\Dokumente Документация для среды програм-
мирования МРLАВ
\МPASM_AssemЫer_UserGuide.pdf Руководство пользователя МРASM
(англ.)
\МPLAВ-IDE_UserGuide.pdf Руководство пользователя MPLAB-
IDE (англ.)
290 Приложение
(окончание)
Папка Файл Описание
\Мplab\Installation Дистрибугив для установки ПО
МРLАВ_v810
\Мplab\ReleaseNotes Обзор ПО MPLAB
\Progralllitlierung Документы и ПО для проrрамми-
рования микроконтроллера
\Programrnierung\ Документация по программирова-
MPLAB_ICD2 нию в среде MPLAB_ICD2
\FlashМemoryProgralllitling_Spec_ Описание программирования
PIC16F876A.pdf F!аsh-памяти (англ.)
\МРLАВ_ICD2_ In-Circuit- Руководство пользователя для
Debugger_UserGuide.pdf встроенного отладчика
MPLAВ_ICD2 (англ.)
\Progralllitlierung\ Документация и ПО для самостоя-
Selbstbau\ тельного изготовления проrрамма-
Programmiertool тора
\Кurzanleitung_WinPic_DE.pdf Краткая инструкция по работе
с проrрамматором WinPic (нем.)
\Кurzanleitung_WinPic_ru.pdf Краткая инструкция по работе
с проrрамматором WinPic (рус.)
\Progralllitlierung\ Дистрибугив для установки ПО
Selbstbau\ WinPic
Progralllitliertool
\WinPic
\Progralllitlierung\ \Мini_Pic_Programmer.pdf Принципиальная схема
Selbstbau\Schaltplan проrрамматора Mini_Pic
Предметный указатель
А G
Acknowledge238 GPIO121
ADC (Analog-to-Digital Converter) 149 GPR 11
н
ALU6
АRМ9 6
ASCII 28
АSСП-код28 HyperTerminal 221
AssemЫer1
в РС227,272
BGA6 РС-шина112
Breakpoints63 ICD5
BRG280 ICD2 1,85
Brown-Out Detect l02 Inteпupt51
IR-Protocol245
с L
ССР 141 Label25
CCPl 124, 264,266 LED126
ССР2 265 LIFO12
CISC21 Linker9
СISС-процессор 21 Low Voltage Program 103
Code Protection104 LSB38,147
Compiler9
СОМ-порт 214
м
D Master227
Microchip5
DAC (Digital-to-Analog Converter) 149 МРLАВ 1,63
DDRAM170 MSB38
MSSP229,232,264
Е о
EEPROM1, 16,112,229 Open Collector228
Electronic AssemЫy163 ОТР 105
F р
File Register9 Р С (Program Counter) 9, 47
Flash Program Memory8 PIC5
Flаsh-памятъ 8 PICIOF222 6
292 Предметный указатель
PIC16F876 6 Slave227
PIC16F876A 5 SLEEP 61,100
О блок-схема6 SMBu s 272
PIC24FJ128 6 SPI 166,271
РIС32 МХ460 6
Power U p Timer 102
Pull -Down R esis tor 96 т
РW М141 TWI 227
R u
R АМ8 USAR T 278,280
RС5 -код245
w
RISC 21
RISC -пpoцec cop 21
s Watchdog-Timer 101
SFR 11
Sit ronix 164
ж
Ведущее устройство227
Вершина стека12
Вложенная подпрограмма13
Внутрисхемный отладчик85 ЖКИ (жидкокристаллический индикатор) 114,
Вход126 163,164
Предметный указатель 293
з о
о
movlw41
movwf41
Защита: о nop53, 58
О кода104 о retfie 51
О чтения 104 о retlw50
О чтения данных из ЕЕРRОМ- памяти103 о return 49
о rlf38
и о
о
rrf40
sleep60
Инициализация119 о suЬ!w45
Интегрированная среда проектирования63 о subwf44
Интерфейс: о swapf42
О 12С 112 о xorlw 34
О RS -232 113, 213, 214 о xorwf33
О SPI 122 Компилятор9
О USB 213 Компоновщик9
О последовательный213 Контроллер индикатора164
О программирования108 Контрольные точки останова63
Инфракрасное дистанционное управление112 Косвенная адресация14
к л
Кварц100 Логичесl\ИЙ анализатор82
м
О часовой1 О1
Кварцевый резонатор100
Код:
О ASCII 28 Макрокоманда11, 21, 117, 139, 174
О RC5 245 Макросы117
О машинный9 Маскирование31
Команда: Метка25
О addlw44 МЗР 147
О addwf43 Микрокомпьютер3
О andlw31 Микроконтроллер3
О andwf30 О PIC10F222 6
О bcf37 О PIC16F876 6
О bsf38 О PIC16F876A1, 5
О btfsc57 О PIC24FJ128 6
О btfss55 О РIС32МХ460 6
О cal\ 48 О тип66
О clrf35 Младший разряд двоичного числа38
О clrw36 Монтажная плата107
О clrwdt59 М(!ЩНОСТЬ 191
н
О comf36
О decf46
О decfsz 54
О goto47 Наблюдение75
О incf45 Набор символов164
О incfsz 52 Напряжение:
О iotlw32 О питания108
О iorwf32 О программирования97
О movf42 Низковольтное программирование103
294 Предметный указатель
п О асинхронный79
Счетчик команд9
Память EEPROM1, 16, 112, 229
Персональный компьютер (ПК)213 т
Пиксел164 Таймер133
Подпрограмма12 О включения питания 102
О вложенная13 Текстовый редактор92
Подтягивающие резисторы228 Телеуправление112
Последовательный интерфейс213 Тип генератора100
Предварительный делитель частоты134, 141 Тип микроконтроллера66
Предделитель частоты134 Точки останова 78
Прерывание51
Приемник инфракрасного излучения112
Провал напряжения102 у
Программа для работы на терминале217 Указатель15
Программатор84, 91 Управляющие символы22�
Программирование:
О микроконтроллера91
О низковольтное103 ф
Программные настройки88
Флаг:
Программный интерфейс95
Программный счетчик9, 47 О десятичного переноса I О
Проект65 О нулевого результата10
Протокол инфракрасный (ИК)245 О переноса1 О
Процессор: О состояния I О
О CISC21 Флэш-память программ8
ц
О RISC21
Сброс118
я
Симулятор72, 78 ЯдроАRМ6