ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Государственное образовательное учреждение высшего профессионального образования САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ
ПРОЕКТИРОВАНИЕ СРЕДСТВ КОНТРОЛЯ И ДИАГНОСТИКИ С ЭЛЕМЕНТАМИ ВЫСОКОЙ ИНТЕГРАЦИИ Методические указания к выполнению лабораторных работ № 2–5
Санкт-Петербург 2005
Составители: кандидат технических наук, доцент С. И. Ковалев, кандидат технических наук, доцент В. А. Голубков
Даны методические указания к выполнению лабораторных работ по курсу «Проектирование средств контроля и диагностики с элементами высокой интеграции» и ориентированы на изучение основ программирования для микроконтроллеров фирмы Microchip Technology, аналого-цифрового преобразователя и подключения устройств вводавывода к микроконтроллерам. Методические указания предназначены для студентов специальности 190200 – «Приборы и методы контроля качества и диагностики». Подготовлены кафедрами электротехники и информационных систем и рекомендованы к изданию редакционно-издательским советом государственного образовательного учреждения высшего профессионального образования «Санкт-Петербургский государственный университет аэрокосмического приборостроения».
Подписано к печати 28.04.05. Формат 60×84 1/16. Бумага офсетная. Печать офсетная. Усл. печ. л. 2,09. Уч. -изд. л. 2,23. Тираж 100 экз. Заказ № Отпечатано с оригинал-макета, подготовленного автором Отдел оперативной полиграфии СПбГУАП 190000, Санкт-Петербург, ул. Б. Морская, 67
© ГОУ ВПО «СПбГУАП», 2005
Лабораторная работа № 2 Изучение основ программирования для микроконтроллеров фирмы Microchip Technology Цель работы: ознакомление с базовыми элементами архитектуры PICконтроллеров (на примере PIC16F84) и приемами программирования простейших алгоритмов. Методические указания PIC16F877 I/P – 8-разрядный микроконтроллер, выпускаемый фирмой Microchip Technology. Это специализированный микропроцессор, предназначенный в основном для программного управления автоматизированными системами, автомобильными и электрическими двигателями, устройствами передачи информации и измерительными приборами. В отличие от универсальных процессоров, он имеет развитые средства взаимодействия с внешними устройствами и более простую систему команд. PIC16F877 I/P представляет собой микросхему с 40 выводами, из которых 32 предназначены для передачи информации от внешнего устройства либо к внешнему устройству. Выполняемая программа хранится в перепрограммируемом ПЗУ, куда она заносится специальным устройством – программатором. Необходимые данные, переменные, результаты несложных расчетов и счетчики циклов хранятся в ОЗУ и теряются при выключении питания. Чтобы избежать потери данных при этом, можно использовать 256 ячеек энергонезависимой памяти данных. Основные характеристики PIC16F877 I/P: 1. Объем ПЗУ – 8192 слова по 14 бит. 2. Объем ОЗУ – 368 байт. 3. Объем энергонезависимой памяти данных – 256 байт. 4. Рабочая частота – от 0 до 20 МГц. 5. Минимальное время выполнения одной команды – 200 нс. 6. Система команд содержит 35 простых команд (высокоскоростная RISC-архитектура). Обозначение выводов PIC16F877 I/P представлено на рис. 1. Для начала работы контроллера достаточно выполнить следующее подключение его выводов: 1. VDD подключается к источнику питания (+5В). 2. VSS подключается к общему проводу, имеющему нулевой потенциал. 3. MCLR используется для внешнего сброса. В данной лабораторной работе подсоединен к +5В, внешний сброс не предусмотрен.
1
4. к OSC1, OSC2 подключается внешний кварц, задающий тактовую частоту внутреннего тактового генератора. В данной работе кроме вышеописанного подключения используются светодиоды портов В, С, D. Светодиоды подключаются к микроконтроллеру через резисторы для ограничения тока через светодиоды. Для повышения стабильности работы кварца, задающего тактовую частоту, служат конденсаторы C1,C2. В PIC16F877 программа и данные хранятся в разных областях памяти и имеют раздельные шины адреса для доступа к ним (гарвардская архитектура). Концепция разделения адресного пространства программ и данных обеспечивает высокую скорость работы микроконтроллера за счет одновременной выборки и исполнение команд. Все команды выполняются за один машинный цикл, исключая команды переходов, выполняющееся за 2 цикла. Машинный цикл – это промежуток времени, связанный с выборкой данных из ПЗУ и ОЗУ или записью в ОЗУ. Он состоит из четырех машинных тактов – временных интервалов, равных периоду тактовой частоты микроконтроллера. Период синхронизации – величина, обратная тактовой частоте. ОЗУ организовано в виде четырех страниц памяти по 128 адресов в каждой. Первые 32 адреса 0-й и 1-й страниц, а также первые 16 адресов 2-й и 3й страниц используется для обращения к регистрам специального назначения. Они предназначены для организации косвенной адресации (00h, FSR), работы с портами ввода-вывода (PORTA,PORTB, PORTC, PORTD, PORTE,TRISA,TRISB, TRISC, TRISD, TRISE,), с энергонезависимой памятью данных (EEDATA,EEADR,EECON1,EECON2), организации прерываний (INTCON), с аналого-цифровым преобразователем (ADRESH, ADRESL, ADCON0, ADCON1) и других целей. Остальная часть адресного пространства закреплена за ячейками памяти (регистрами общего назначения), предназначенными для хранения данных программы. Программист может использовать эти ячейки по своему усмотрению. Отметим, что регистры специального назначения – это одни и те же регистры, просто к ним можно обращаться в любой странице памяти. Но есть служебные регистры, адресуемые только в одной конкретной станице памяти. Поэтому при программировании надо четко понимать, какая страница активизирована в каждый момент времени, и выполнять переключение странице при необходимости обращения к данным, расположенным только в этой странице. Выполнение программы при подаче питания на микроконтроллер начинается с нулевого адреса ПЗУ. Команды располагаются в ПЗУ и выполняются последовательно. Адрес следующей выполняемой команды хранится в специальном регистре (программном счетчике, PC- program counter). Значение счетчика команд можно изменить командой безусловного перехода:
2
Структура оперативной памяти:
GOTO <адрес> Эта команда заносит в PC адрес, указанный в поле операнда. Выполнение программы продолжается с этого адреса. Для вызова подпрограмм используется команда
3
CALL <адрес> которая отличается от GOTO тем, что сохраняет в аппаратном стеке адрес следующей за ней команды (т.е. содержимое PC). Этот адрес используется командой RETURN для возврата из подпрограммы. Поскольку стек имеет ограниченную вместимость (8 адресов), то количество вложенных вызовов подпрограмм не должно превышать восьми. Каждая команда в PIC16F877 занимает 14 бит, из них 7 бит отведено под адрес операнда внутри страницы памяти. Активная страница задается битом RP0, RP1 регистра STATUS. Для формирования полного адреса операнда младшие 7 бит адреса берутся из кода команды. При включении питания активна нулевая страница. Для установки и сброса отдельных разрядов (битов) в PIC-ах используется 2 команды – BSF и BCF. Они имеют вид: BSF f, b (установка бита в 1) BCF f, b (сброс бита в 0) где f – номер регистра (адрес в ОЗУ), b – номер бита, нулевой номер соответствует самому младшему разряду байта. Номера битов регистра STATUS определены символическими константами, поэтому команда выбора первой страницы памяти будет выглядеть так: BSF STATUS, RP0 а выбор нулевой страницы: BCF STATUS, RP0 Здесь слово STATUS просто заменяет адрес 03, а слово RP0 – число 05. Вы можете сами выполнить удобные вам замены числовых констант на символьные, используя псевдокоманду EQU. В этой лабораторной работе используются следующие регистры: STATUS, TRISB, PORTB. Регистр STATUS: адрес – 3. 7 IRP
6 RP1
5 RP0
4 TO
3 PD
2 Z
1 DC
0 C
Бит 7: IRP – выбор номера банка для косвенной адресации. В семействе PIC168X не используется. Тип бита - (R/W-0). Эта запись означает, что бит можно программно читать(Read) , изменять (Write) и его исходное значение (после включения питания) – 0. Биты 6,5: RP1, RP0 – биты для выбора номера банка при прямой адресации. (R/W-00).
4
Их содержимое: 00 – bank0 01 – bank1 10 – bank2 11 – bank3 Бит 4: TO – указывает на то, что сработал WatchDog таймер. TO =1 после включения питания и обнуляется командой CLRWDT. Бит
3:
PD
–
указывает
на
выполнение
начального
сброса
микроконтроллера. PD = 1 после включения питания или после CLRWDT. Бит 2: Z – нулевой бит указывает на то, что результат последней арифметической операции равен нулю. Бит 1: DC – перенос или заем между младшей и старшей тетрадой. Бит 0: С – перенос или заем за пределами разрядной сетки контроллера. Логические уровни напряжения на выводах микросхемы RA0-RA4 определяет регистр PORTA: 7 6 5 4 3 2 1 0 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 Единица в соответствующем бите регистра вызывает появление на выводе микросхемы напряжения логической единицы, и светодиод загорается. Ноль соответствует низкому уровню напряжения (логический ноль), светодиод гаснет. Выводы порта А могут использоваться как для ввода, так и для вывода информации. Направление передачи информации через эти выводы задается битами регистра TRISA: 7 6 5 4 3 2 1 0 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 Единица в соответствующем разряде регистра TRISA соответствует вводу информации в микроконтроллер через соответствующий разряд порта А, ноль – выводу из порта А во внешний мир. Регистр TRISA находится в первой странице памяти. Как было указано, активной по умолчанию является нулевая страница. Поэтому перед его использованием нужно выбрать первую страницу, как было указано ранее. После занесения значения в регистр необходимо снова выбрать нулевую страницу.
5
Многие операции, связанные с занесением констант в память, пересылкой данных из одной ячейки в другую или выполнением арифметических действий, используют специальный регистр – аккумулятор (W). В названиях команд используются символьные обозначения используемых операндов: L – константа, W – аккумулятор, F – ячейка памяти. Например, команда MOVLW заносит константу в аккумулятор; MOVLW <конст>, где <конст> – значение константы. Еще один пример – обнуление аккумулятора: CLRW А обнулить ячейку памяти можно командой: CLRF f где f – адрес ячейки памяти. Занести другие значения в ячейку памяти одной командой нельзя. Это делают занесением константы или значения ячейки памяти в аккумулятор и записью значения аккумулятора в память. Для обмена данными между ОЗУ и аккумулятором используются команды MOVWF f (запись значения аккумулятора в ячейку памяти f) MOVFW f (запись значения ячейки памяти f в аккумулятор), Поскольку в микроконтроллерах используется относительно небольшой набор команд, для придания большей гибкости в некоторых командах есть возможность сохранять результат в памяти либо в аккумуляторе. Такие команды имеют признак d, принимающий значение W, если результат необходимо сохранить в аккумуляторе, и F, если в памяти. Примером такой команды является команда: DECF f, d Она уменьшает на единицу содержимое ячейки памяти f и сохраняет результат в памяти или в аккумуляторе в зависимости от значения d. Увеличение на единицу ячейки памяти выполняет команда INCF f, d Есть варианты этих команд INCFSZ и DECFSZ. Кроме описанных действий, они имеют еще одну особенность, которую можно использовать для в результате инкрементирования организации циклов: если (декрементирования) получено нулевое значение, то следующая за INCFSZ или DECFSZ команда не выполняется. Вместо нее микроконтроллер выполняет команду NOP, которая не производит никаких действий, но требует одного машинного цикла. Приведем пример простой программы, выдающей на вывод RB0 меандр (т.е. попеременно ноль – единицу- ноль – единицу- ноль – единицу и т.д.): #INCLUDE “P16F84.INC” COUNT
EQU ORG 0
6
20h
; Подключаем файл с символьными ; обозначениями специальных регистров и их битов ; Задаем символьное обозначение ячейки памяти, ; расположенной по адресу 20h ;Текущий адрес в ПЗУ - 0
START:
RUN:
BSF
CLRF BCF BCF CALL BSF CALL GOTO
STATUS, RP0 ; Делаем активной страницу 1, чтобы ; получить доступ к ; регистру TRISB TRISB ;Устанавливаем все выводы порта А на вывод STATUS, RP0 ; Возвращаемся на страницу 0 PORTB, 0 ; Выдаем логический ноль на вывод RA0 DELAY ; Вызываем подпрограмму задержки PORTB, 0 ; Выдаем логическую единицу на RA0 DELAY ; Снова вызываем подпрограмму задержки RUN ; Бесконечный цикл
; Подпрограмма задержки DELAY: MOVLW 50 MOVWF COUNT LOOP: DECFSZ COUNT,F равен
GOTO RETURN END
LOOP
; Заносим в аккумулятор число итераций цикла ; Записываем в счетчик цикла это значение ; Уменьшаем счетчик, если он после этого ; нулю, то ;следующая команда не выполнится – цикл ;будет завершен ; Переходим на очередную итерацию ; Возврат из подпрограммы ; Директива конца программы (ассемблирования)
Вычислим время выполнения подпрограммы задержки. Она состоит из двух команд пересылки, 80 итераций цикла, и команды возврата из подпрограммы. Последняя итерация цикла состоит фактически из команд DECFSZ и NOP, поэтому выполняется в два машинных цикла. Все остальные итерации выполняются в 3 машинных цикла. Как уже было указано, команды пересылки данных занимают один цикл, а команда RETURN – два цикла. Тогда время выполнения подпрограммы можно рассчитать по формуле: Тподпр=2*Tmov+Tgoto+79*Tdec,goto+Tdec,nop=2*1+2+79*3+2=243 цикла. Вычислим теперь период меандра. Один период меандра включает выполнение одноцикловых команд установки и сброса бита, двух вызовов подпрограмм и одного безусловного перехода. Вызовы подпрограмм и безусловный переход занимают по два цикла. Поэтому период меандра равен: Tмеандра=Tgoto+Tbcf+Tbsf+2*(Tcall+Tподпр)=2+1+1+2*(2+243)=494 цикла. Цикл состоит из 4 тактов, поэтому фрагмент выполняется за 4*494=1976 тактов. Если тактовая частота равна 32768 Гц, т.е. за одну секунду выполняется 32768 тактов. Значит, период меандра равен 1976/32768=0,06 c.
7
П р о г р а м м и р о в а н и е м и к р о к о н т р о л л е р а состоит из трех этапов: 1. Написание и отладка программы в пакете MPLAB (среда разработки и эмулятор); 2. Формирование с помощью MPLAB двоичного файла с кодом программы; 3. Занесение этого файла в ПЗУ с помощью программатора. Для написания программы в среде MPLAB необходимо создать проект. Это делается с помощью команды меню ProjectNew project. В появившемся окне нужно выбрать каталог, куда будет помещен проект, ввести имя файла проекта и нажать OK. В окне Edit Project, которое будет выведено на экран, необходимо с помощью нажатия кнопки Change вывести на экран окно Development mode и выбрать параметры PIC16F877 в списке Processor, MPLABSIM Simulator и указать тактовую частоту на вкладке Clock. Далее командой FileNew создается файл, в котором вводится текст программы. После ввода программы файл необходимо сохранить, и затем подключить его к проекту. Выбрав в меню пункт ProjectEdit project, в окне Edit project нажатием клавиши Add node подключаем файл с программой. Для формирования двоичного файла необходимо выбрать пункт меню ProjectBuild all или нажать Ctrl+F10. Электрическая схема лабораторной установки изображена на рис.2 Практическая часть: 1. Прочесть методичку и после собеседования с преподавателем, получить у него задание. 2. Написать и отладить программу в среде MPLAB. 3. С разрешения преподавателя занести программу в PIC16F877. 4. Проверить работу программы на лабораторной установке. Отчет должен содержать: - задание; - схему лабораторной установки; - расчет задержки; - блок-схему алгоритма; - комментированный листинг программы. Комментарии на английском языке предпочтительны.
8
Рис. 1. Обозначение выводов PIC16F877 I/P Здесь RA-выводы порта А, RB-выводы порта В, RC-выводы порта C, RDвыводы порта D, RE-выводы порта E, OSC1, OSC2 -выводы для подключения источника тактовой частоты, VDD-питание +5В, VSS-ноль, MCLR-сигнал сброса микроконтроллера.
9
Приложение Обзор команд и обозначения Каждая команда PIC16C84 – это 14-битовое слово, которое разделено по смыслу на следующие части: - 1. код операции, -2. поле для одного и более операндов, которые могут участвовать или нет в этой команде. Система команд PIC16C84 включает в себя байт-ориентированные команды, биториентированные, операции с константами и команды передачи управления. Для байт-ориентированных команд "f" обозначает собой регистр, с которым производится действие; "d" - бит определяет, куда положить результат. Если "d"=0, то результат будет помещен в W регистр, при "d"=1 результат будет помещен в "f", упомянутом в команде. Для бит-ориентированных команд "b" обозначает номер бита, участвующего в команде, а "f" – это регистр , в котором этот бит расположен. Для команд передачи управления и опреаций с константами, "k" обозначает восьми или одинадцатибитную константу. Байт ориентированные команды Мнемокод ADDWF f, d ANDWF f, d CLRF f CLRW – COMF f, d DECF f, d DECFSZ f, d INCF f, d INCFSZ f, d IORWF f, d MOVF f, d MOVWF f NOP – RLF f, d RRF f, d SUBWF f, d SWAPF f, d XORWF f, d ADDLW k
10
Название команды Сложение W с f Логическое И W и f Сброс регистра f Сброс регистра W Инверсия регистра f Декремент регистра f Декремент f, пропустить команду, если 0 Инкремент регистра f Инкремент f,пропустить команду, если 0 Логическое ИЛИ W и f Пересылка регистра f Пересылка W в f Холостая команда Сдвиг f влево через перенос Сдвиг f вправо через перенос Вычитание W из f Обмен местами тетрад в f Исключающее ИЛИ W и f Сложение константы с W
Примечания 2,3 2,3 3 – 2,3 2,3 2,3 2,3 2,3 2,3 2,3 3 – 2,3 2,3 2,3 2,3 2,3 –
ANDLW k IORLW k SUBLW k MOVLW k XORLW k OPTION TRIS f
Логическое И константы и W Логическое ИЛИ константы и W Вычитание W из константы Пересылка константы в W Исключающее ИЛИ константы и W Загрузка W в OPTION регистр Загрузка TRIS регистра
– – – – – 1 1
Бит ориентированные команды Мнемокод BCF f, b BSF f, b BTFSC f, b BTFSS f, b
Название команды Сброс бита в регистре f Установка бита в регистре f Пропустить команду, если бит равен нулю Пропустить команду, если бит равен единице
Примечания 2,3 2,3 – –
Переходы Мнемокод CALL k CLRWDT GOTO k RETLW k RETFIE RETURN SLEEP
Название команды Вызов подпрограммы Сброс Watchdog таймера Переход по адресу Возврат из подпрограммы с загрузкой константы в W Возврат из прерывания Возврат из подпрограммы Переход в режим SLEEP
Примечания – – – – – – –
Замечания и пояснения Примечание 1: Команды TRIS и OPTION помещены в перечень команд для совместимости с семейством PIC16C5X. Их использование не рекомендуется. В PIC16C84 регистры TRIS и OPTION доступны для чтения и записи как обычные регистры с номером. Предупреждаем, что эти команды могут не поддерживаться в дальнейших разработках PIC16CXX. Примечание 2: Когда модифицируется регистр ввода/вывода, например MOVF 6,1, значение, используемое для модификации считывается непосредственно с ножек кристалла. Если значение защелки вывода для ножки, 11
запрограммированной на вывод равно "1", но внешний сигнал на этом выводе "0" из-за нагрузки, подключенной к этой ножке, то будет считываться "0". Примечание 3: Если операндом этой команды является регистр f1 (и, если допустимо, d=1), то делитель, если он подключен к RTCC, будет обнулен.
Лабораторная работа № 3 Использование PIC16F877 для анализа нажатия кнопок, подключенных к портам ввода-вывода и изменения процесса вычисления Цель работы: изучение условных переходов и анализ нажатия кнопок для изменения процесса вычислений. Методические указания В процессе работы с ЭВМ возникает необходимость ввода или вывода информации. Для этого используются внешние устройства, такие как клавиатура, мышь, монитор и т. д. Существует несколько способов подключения устройств к ЭВМ, в зависимости от их быстродействия. В данной работе рассматривается подключение к микроЭВМ IBM PC простейшего устройства ввода данных – четырехкнопочной клавиатуры (RB4, RB5, RB6, RB7). Эта клавиатура предназначена для ввода пользователем информации. При работе с кнопками возникает другая проблема – так называемый дребезг контактов. Процесс замыкания и размыкания контактов кнопки является сложным механическим процессом и сопровождается множественными кратковременными замыканиями и размыканиями:
Фаза неустойчивости
Опрос состояния кнопки производится с большой частотой. Поэтому возможна ситуация, при которой кнопка будет считаться нажатой много раз. Для борьбы с этим явлением применяют следующий алгоритм. Проверяется
12
состояние кнопки. В случае если она нажата, после задержки ≈50мс производится повторный опрос (50 мс. соответствуют приближенно 409 циклам при тактовой частоте 32768 Гц). Если состояние клавиши не изменилось, то ее считают нажатой. Схема лабораторной установки представлена на рис. 1. Подключение выводов VDD, VSS, MCLR, OSC1 и OSC2 аналогично лабораторной работе №2. Кнопки соединены с выводами RB4, RB5, RB6, RB7. Остальные выводы порта не используются в данной работе. Рассмотрим работу кнопки. Конфигурируем вывод порта В на вывод данных. Устанавливаем на выводе уровень логической единицы. При отжатой в исходном состоянии кнопки на выводе RB4 установлен уровень логической единицы и при считывании порта определяется 1. При нажатии кнопки вывода RB4 оказывается соединенным с общим проводом, имеющим нулевой потенциал. На RB4 появляется логический ноль и при считывании порта в 4-м разряде определяется 0. В задачу контроллера входит опрос кнопок. Для опроса кнопок необходимо настроить выводы RB4, RB5, RB6, RB7 на вывод. Для этого используется регистр TRISB, имеющий структуру: 7
6
5
4
3
2
1
0
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0
Назначение его битов аналогично назначению битов регистра TRISA. Для проверки значения бита порта B (регистр PORTB) можно использовать команды: BTFSS f, b BTFSC f, b Команда BTFSC проверяет, равен ли нулю бит с номером b ячейки памяти (регистра) с адресом f. Если этот бит равен нулю, то вместо следующей команды выполняется команда NOP. Команда BTFSS отличается тем, что проверяет бит на равенство единице. С помощью этих команд можно организовать условный оператор. Иногда небольшой фрагмент программы, встречающийся несколько раз и отличающийся только обрабатываемыми данными, целесообразно представить в виде макроопределения (макроса). Его формат: <имя_макроса> MACRO параметр1, параметр2, … 13
тело макроса ENDM Параметры макроса являются необязательными. При обработке исходного текста макроассемблером MPASM вместо вызова макроопределения подставляется тело макроса с параметрами из строки вызова. Вызов макроса осуществляется следующим образом: <имя_макроса> параметр1, параметр2, … Пример работы с макросом: EXAMPLE
MACRO
PAR
MOVLW
PAR
; Определение макроса
ENDM ; Вызов макроса при ассемблировании =>
EXAMPLE 40
MOVLW 40
Заметим, что внутри макроопределения нельзя использовать метки, так как при нескольких его вызовах произойдет их дублирование в тексте программы. Для переходов внутри макроса удобно использовать символ $, обозначающий адрес текущей команды. К примеру, $-1 задает адрес предыдущей команды. Заметим, что символ $ можно использовать не только в макросах, но и в любом другом месте программы. Приведем пример программы, выполняющей опрос кнопки на выводе RB4, и изменяющей процесс вычислений, если кнопка нажата: #INCLUDE “P16F877.INC” EQU
COUNT
; Задаем символьное обозначение ячейки ; памяти, расположенной по адресу 21h MACRO TIME_OF_DELAY ; Макрос с задержкой (TIME_OF_DELAY+1)*3
DELAY
EQU
20
; Буферный регистр
BITS
21
MOVLW TIME_OF_DELAY ; Заносим параметр в аккумулятор
14
MOVWFCOUNT
; Переписываем в ячейку памяти
DECFSZ COUNT, F
; Декрементируем содержимое ячейки ; счетчика
GOTO
; Передача управления предыдущей ; команде
$-1
ENDM
; Конец макроса
ORG 0
; Программа начинается с адреса 0
START:
BSF
STATUS, RP0 ; Делаем активной страницу 1, чтобы ; получить ; доступ к регистру TRISB TRISB,4
BCF
STATUS, RP0 ; Возвращаемся на страницу 0
BSF
QUIT:
; Настраиваем вывод 4 порта B на вывод
BCF
PORTB, 4 ; Устанавливаем 1 на вывод 4 порта В
BTFSC PORTB, 4
; Проверяем, нажата ли кнопка
GOTO
; Если не нажата, то переходим на метку ;QUIT
QUIT
DELAY 135
; Задержка 50 миллисекунд, т. к. ; (135+1)*3=408 циклов
BTFSC PORTB, 4
; Проверяем нажатие снова
GOTO
QUIT
; Если кнопка не нажата, то переходим на ; метку QUIT
CALL
IZMENEN
; Если кнопка нажата, то переходим ;к подпрограмме IZMENEN
GOTO
QUIT
; Останов
END
; Конец программы
Симуляция подачи сигналов на выводы микроконтроллера и отладка программ в пакете MPLAB. Одним из способов отладки программ является пошаговая трассировка с проверкой значений переменных. Выполнить одну команду программы можно с помощью клавиши F7 либо F8. Различие между ними заключается в трассировке команды CALL. Нажатие F7 приводит к переходу на первую команду подпрограммы, а F8 – на следующую после CALL команду программы. Начать отладку заново можно клавишей F6. Содержимое оперативной памяти можно просмотреть с помощью окна, вызываемого командой WindowFile Registers, а содержимое регистров специального назначения – с помощью окна WindowSpecial Function Registers. Узнать, сколько циклов прошло с момента старта программы, можно с помощью окна WindowStopwatch. В процессе отладки программ возникает необходимость проверить алгоритмы, работающие с выводами, настроенными на ввод информации (в 15
нашем примере RB0, RB1). Для этого в состав интегрированной среды разработки MPLAB включена возможность эмулировать подачу сигналов на выводы микроконтроллера в произвольные моменты времени. Сигналы описываются в текстовом файле с расширением .sti. Его можно создать в любом текстовом редакторе или в самой интегрированной среде MPLAB. При создании его в MPLAB необходимо выполнить последовательность действий: создать новый файл (команда меню FileNew), набрать последовательность сигналов, сохранить как (FileSave As) файл с расширением sti. В файле сигналы, выводы, и время подачи указываются в следующем формате: CYCLE
RB0
RA1
12
1
0
234
0
1
…
…
…
Первый столбец (он обязателен) указывает на каком машинном цикле, считая с начала программы, подавать сигналы из соответствуюшей строки таблицы. Количество остальных столбцов равно количеству выводов, работу с которыми необходимо отладить. Каждый из них содержит сигналы, которые требуется подавать на вывод, указанный в заголовке столбца. Допустимые значения сигналов 0 или 1. К примеру, в 12 цикле на выводе RB0 будет установлена логическая единица, а на RA1 – ноль. Заметим, что сигналы остаются постоянными, пока не буду изменены на 234 цикле. После того, как файл с сигналами создан и сохранен, необходимо указать MPLAB, что этот файл следует использовать при отладке. Для этого нужно выбрать DebugSimulator StimulusPin StimulusEnable. В появившемся окне следует выбрать файл и нажать OК. Практическая часть: 1. Получить у преподавателя задание. 2. Написать программу. 3. Отладить программу в эмуляторе. 4. С разрешения преподавателя занести программу в PIC16F877. 5. Проверить работу на лабораторной установке. Отчет должен содержать: - задание; - схему лабораторной установки; - алгоритм программы; - комментированный листинг программы.
16
Рис. 1. Схема лабораторной установки
Лабораторная работа № 4 Работа с массивами. Динамическая индикация Цель работы: Ознакомление с методами адресации и особенностями организации массивов в ОЗУ и ПЗУ. Работа с массивами на примере организации динамической индикации данных с помощью двухразрядного семисегментного индикатора. Работа с массивами ПЗУ Работа с массивами в программах для однокристальных микроконтроллеров фирмы Microchip требует специальных приемов программирования. Дело в том, что для работы с массивами констант, записанных в ПЗУ, не предусмотрено никаких команд. В самых последних моделях PIC-контроллеров есть команды для работы с ПЗУ, однако для большинства микроконтроллеров фирмы Microchip такая возможность отсутствует, в том числе и для PIC16F877, на котором собран лабораторный макет. 17
Массивы в ПЗУ можно организовывать в виде подпрограмм и обращаться к ним как к подпрограммам. В данном случае используются подпрограммы, представляющие собой набор команд retlw K, где К означает байтовую константу. Команда retlw K выполняет возврат из подпрограммы с одновременным занесением числа К в аккумулятор. В начале подпрограммымассива стоит вычисляемый оператор GOTO, который передает управление на нужный нам оператор retlw. Вычисляемый оператор GOTO организован следующим образом. Считаем, что при обращении к подпрограмме в аккумуляторе передается индекс элемента массива, который надо выбрать из подпрограммы-массива. Этот индекс прибавляется к счетчику команд, точнее к его младшему байту PCL, что и вызывает переход на нужный нам оператор retlw К. Данный прием программирования иллюстрируется следующим примером. …………. movlw 5
; занесли число 5 в аккумулятор. Это индекс элемента массива
call MasRom ; обратились к подпрограмме-массиву ; после выхода из подпрограммы в W находится MasRom [5] …………. ; текст подпрограммы MasRom addwf PCL,F ; прибавили к младшему байту счетчика адреса константу, ; хранящуюся в W. Сразу перепрыгнули на несколько адресов ; вперед retlw 2
;
retlw 7
; Здесь перечислены все
retlw 4
; элементы массива, начиная с MasRom[0]
…….
; Массив содержит числа : 2,7,4….,9
retlw 9
;
Надо следить за тем, чтобы не происходило переполнение
18
PCL при сложении с индексом элемента массива. Сумма PCL и индекса должна быть в пределах байтового представления, т. е. не больше 255. Поэтому рекомендуется располагать подпрограммы-массивы в самом начале памяти программ и использовать массивы размера менее 250. Работа с массивами в ОЗУ Для работы с массивами в ОЗУ используется косвенная адресация через регистр FSR. В регистр FSR помещается адрес очередного элемента массива, а затем выполняется операция с операндом, расположенным по нулевому адресу. На самом деле при этом будет выполняться обращение не к операнду по нулевому адресу ОЗУ, а косвенное обращение к ячейке ОЗУ, адрес которой хранится в FSR (в текущей странице). Пример: -----------------------------------------------movlw 0х55 ; загрузили в акк. константу 0x55 movwf FSR ; переслали константу в FSR movfw 0
; загрузка в W ячейки ОЗУ с адресом 0х55 (косвенно через FSR)
----------------------------------------------Для обработки элементов массива в цикле следует организовать цикл по некоторой переменной, хранящейся в ОЗУ и использовать эту переменную для косвенной адресации к очередному элементу массива. Пример: Программа выполняет перенос массива констант из ПЗУ в ОЗУ. Листинг программы можно найти в Приложении 1. Семисегментный светодиодный индикатор Семисегментный индикатор предназначен для отображения цифровой информации. Изображение цифра формируется из нескольких светящихся сегментов (см. рис. 1). Если не считать сегмента-точки, то всего сегментов семь, откуда и произошло название этого типа индикаторов.
19
А
F
B
G
E C D ∆ H Рис. 1. Расположение сегментов индикатора С электрической точки зрения каждый сегмент представляет собой светодиод, излучающий свет при прохождении через него тока. Все светодиоды индикатора обычно имеют один вывод, к которому подсоединены либо все аноды светодиодов либо все катоды. Это сделано из соображения экономии выводов индикатора. Различают индикаторы с общим катодом (рис. 2.) или общим анодом (рис. 3). Принципиальной разницы между ними нет. Отличие заключается в уровнях входных сигналов, которые зажигают сегмент. Для индикатора с общим анодом для загорания сегмента надо подать на соответствующий светодиод логический ноль, а в случае общего анода – высокий уровень напряжения (логическая единица). Общий анод обычно соединяется с +5Вольт, а общий катод – с “землей”. Для защиты светодиодов от перегрузки по току, логические сигналы на них подаются через балластные резисторы, на которых падает излишек напряжения. Схема лабораторной установки приведена на рис. 4. Как видно на принципиальной схеме рис. 4, индикатор АЛС318А состоит из девяти семисегментных элемента, причем в лабораторной установке используются восемь младших разрядов. Каждый семисегментный элемент соответствует десятичному разряду, выводимых на индикацию цифр. В лабораторной установке используются светодиодные индикаторы с общим катодом и реализуется динамическая индикация цифр. Динамическая индикация основана на использовании инертности человеческого глаза. При таком типе индикации на каждый разряд индикатора выводиться информация поочередно. Смена разрядов индикатора происходит несколько сот раз в секунду, так что человеческий глаз не успевает заменить
20
очередность зажигания разрядов индикатора. Наблюдателю кажется, что все разряды индикатора светятся непрерывно. Для осуществления процесса индикации в лабораторной установке используются два порта – С и D. На порт C подается код высвечиваемой цифры и одновременно на порт D – подается 0 (низкий уровень) на тот разряд числа, который необходимо высветить (на остальные разряды индикатора должны быть поданы 1 – высокие уровни, чтобы они не высвечивались). В табл. 1 приведена распайка индикатора в соответствии с подключением его выводов к портам C и D: Таблица 1 PORT C Сегменты разрядов Разряд порта С индикатора 0 C 1 H 2 A 3 E 4 D 5 G 6 B 7 F
PORT D Разряд порта D
Разряд индикатора
0 1 2 3 4 5 6 7
7 6 5 4 3 2 1 0
Другими словами разряд порта C определяет, на какой сегмент всех разрядов индикатора в данной момент выводится информация. Если RС7=0, то на сегменты F всех разрядов подается 0, если RС7=1 – то на сегменты F всех разрядов подается 1, так как одноименные выводы разрядов индикатора соединены параллельно, т. е. информация поступает одновременно на все разряды (для примера приведем код цифры «1» – 01000001), но отображает информацию только активный в данный момент разряд. Активным разрядом является тот, на который через порт D подается логический 0. Таким образом чтобы периодически менять активный разряд необходимо обеспечить перемещение логического 0 (нуля) на выходе порта D. Если на выводы порта D подается комбинация 11111101 , то в соответствии с данными таблицы 1 активным является 6-й разряд индикатора.
21
Рис. 2. Индикатор с общим катодом
Рис. 3. Индикатор с общим анодом
Для отображения информации на индикаторе нужно выполнить следующие шаги: 1. Двоичное число, предназначенное для вывода, надо перевести в двоично-десятичное представление. Двоично-десятичное представление предполагает, что каждая цифра отображается четырьмя двоичными битами (например 0111=7). В байте можно хранить два двоичных четырехразрядных числа, поэтому байт может отображать две цифры. Например, имеем двоичное число 00110001. Десятичный эквивалент - 49. Имеем: 4= 0100, 9=1001, итак двоично-десятичное представление числа 49 имеет вид 01001001. Для наших целей удобнее иметь двоичное представление всех разрядов числа в отдельных байтах (4=00000100, 9=00001001) Сформировать двоичное представление старшей цифры можно путем вычитания десяти из исходного числа в цикле, пока остаток не станет меньше десяти. Количество проходов в этом цикле дадут старшую цифру, а остаток – младшую цифру двоично-десятичного представления исходного числа. Так можно поступать для числа с любой разрядностью.
22
Рис. 4. Схема индикаторной части лабораторной установки 2. Теперь надо отобразить полученные цифры на индикаторах. Для этого очень удобно воспользоваться подпрограммами-массивами, описанными выше. В качестве элементов массива надо использовать константы, которые будут определять своими нулевыми и единичными позициями, какие сегменты должны светиться при отображении того или иного числа. Индекс элемента массива должен совпадать с отображаемой цифрой. В этом случае для вывода на индикатор нужной цифры будет достаточно поместить эту цифру в аккумулятор, обратиться к подпрограмме-массиву, получить оттуда константу, которую осталось заслать в порт С индикатора для отображения этой цифры. 3. Последний нюанс связан с организацией динамической индикации, т. е. периодическое отображение цифр в разрядах индикатора. Для организации этого процесса удобно использовать перемещение 0 в разрядах порта D с реализацией задержки, чтобы яркость свечения цифр была достаточной для восприятия глазом. Последовательность сигнплов может быть следующей: 11111110 – задержка – 11111101 – задержка – 11111011 – задержка и т. д.
23
Приложение 1 list p=16f84 include
MasRAM
equ
0x0С
;Резервирование памяти в ОЗУ ;под массив и вспомогательные переменные
tmp
equ
counter
equ tmp+1
org
MasRAM +6
0x00 ; Set program memory base at reset
……………………………………… movlw MasRAM ; Занесли в акк. Адрес начала массива в RAM movwf FSR ; подготовились к косвенной адресации clrf tmp ; почистили индекс элемента массива в ROM movlw 6 ; готовим счетчик цикла counter movwf counter ; основной цикл
Loop movfw tmp
call MasROM ; выбрали из ROM очередной элемент movwf 0 ; заслали его косвенно в RAM incf tmp, F ; Увеличили индекс эл-та в ROM incf FSR, F ; Увеличили индекс эл-та в RAM decfsz counter, F ; уменьшили и проверили на ноль счетчик цикла goto Loop MasROM
; Подпрограмма – массив { 2, 3, 1, 2, 3, 4}
addwf PCL, F 24
retlw 2 retlw 3 retlw 1 retlw 2 retlw 3 retlw 4 end
Лабораторная работа № 5 Изучение работы аналого-цифровых преобразователей микроконтроллеров фирмы Microchip Technology. Цель работы: ознакомление с работой аналого-цифрового преобразователя PIC-контроллеров (на примере PIC16F877) и приемами программирования АЦП. Методические указания Модуль аналого-цифрового преобразования (АЦП) имеет пять каналов у 28-выводных микросхем и восемь каналов у 40/44-выводных микросхем. Входной аналоговый сигнал через коммутатор каналов заряжает внутренний конденсатор АЦП CHOLD. Модуль АЦП преобразует напряжение, удерживаемое на конденсаторе CHOLD в соответствующий 10-разрядный цифровой код методом последовательного приближения. Источник верхнего и нижнего опорного напряжения может быть программно выбран с выводов VDD, VSS, RA2 или RA3. Допускается работа модуля АЦП в SLEEP режиме микроконтроллера, при этом в качестве источника тактовых импульсов для АЦП должен быть выбран RC генератор. Для управления АЦП в микроконтроллере используется 4 регистра: ⋅ Регистр результата ADRESH (старший байт); ⋅ Регистр результата ADRESL (младший байт); ⋅ Регистр управления ADCON0; ⋅ Регистр управления ADCON1. 25
Регистр ADCON0 используется для настройки работы модуля АЦП, а с помощью регистра ADCON1 устанавливается какие входы микроконтроллера будут использоваться модулем АЦП и в каком режиме (аналоговый вход или цифровой порт ввода/вывода). В регистре ADRESH:ADRESL сохраняется 10-разрядный результат аналого-цифрового преобразования. Когда преобразование завершено, результат преобразования записывается в регистр ADRESH:ADRESL, после чего сбрасывается флаг GO/-DONE (ADCON0<2>) и устанавливается флаг прерывания ADIF. Структурная схема модуля АЦП показана на рис. 1. После включения и конфигурации АЦП выбирается рабочий аналоговый канал. Соответствующие биты TRIS аналоговых каналов должны настраивать порт ввода/вывода на вход. Перед началом преобразования необходимо выдержать временную паузу, расчет которой приведен в разделе 1.
ADCON0 (адрес 1Fh)
26
Рекомендованная последовательность действий для работы с АЦП: 1. Настроить модуль АЦП: ⋅ Настроить выводы как аналоговые входы, входы VREF или цифровые каналы ввода/вывода (ADCON1); ⋅ Выбрать входной канал АЦП (ADCON0); ⋅ Выбрать источник тактовых импульсов для АЦП (ADCON0); ⋅ Включить модуль АЦП (ADCON0). 2. Настроить прерывание от модуля АЦП (если необходимо): ⋅ Сбросить бит ADIF в '0'; ⋅ Установить бит ADIE в '1'; ⋅ Установить бит PEIE в '1'; ⋅ Установить бит GIE в '1'. 3. Выдержать паузу, необходимую для зарядки конденсатора CHOLD. 4. Начать аналого-цифровое преобразование: Установить бит GO/-DONE в '1' (ADCON0). 5. Ожидать окончания преобразования: ⋅ Ожидать пока бит GO/-DONE не будет сброшен в '0'; ИЛИ ⋅ Ожидать прерывание по окончанию преобразования. 6. Считать результат преобразования из регистров ADRESH:ADRESL, сбросить бит ADIF в '0', если это необходимо. 7. Для следующего преобразования необходимо выполнить шаги начиная с пункта 1 или 2. Время преобразования одного бита определяется как время TAD. Минимальное время ожидания перед следующим преобразованием должно составлять не менее 2TAD. 1. Временные требования к подключению канала АЦП Для обеспечения необходимой точности преобразования, конденсатор CHOLD должен успевать полностью заряжаться до уровня входного напряжения. Схема аналогового входа АЦП показана на рис. 2. Сопротивления RS и RSS непосредственно влияют на время зарядки конденсатора CHOLD. Величина сопротивления ключа выборки (RSS) зависит от напряжения питания VDD (см. рис. 2). Максимальное рекомендуемое значение внутреннего сопротивления источника аналогового сигнала 10кОм. При меньших значениях сопротивления источника сигнала – меньше суммарное время преобразования. После того, как будет выбран один из нескольких аналоговых входных каналов, но прежде чем будет производиться преобразование, должно пройти определенное время. Для нахождения данного времени воспользуетесь уравнением 1. Это уравнение дает результат с ошибкой в ½ LSb (2048 шагов АЦП). Ошибка в ½ LSb, это максимальная погрешность, позволяющая функционировать модулю АЦП с необходимой точностью.
27
ADCON1 (адрес 9Fh)
Уравнение 1. Вычисление временной задержки TACQ = Время задержки усилителя + Время заряда конденсатора CHOLD + Температурный коэффициент = TAMP + TC + TCOFF = 2мкс + TC + [(Температура - 25°C)(0.05мкс/°C)] TC = - CHOLD (RIC + RSS + RS) Ln(1/2047) = - 120пФ (1кОм + 7кОм + 10кОм) Ln(0.0004885) = 16.47мкс TACQ = 2мкс + 16.47мкс + [(50°C - 25°C)(0.05мкс/°C)] = 19.72мкс Примечания: 1. Напряжение источника опорного напряжения VREF не влияет на уравнение. 2. Конденсатор CHOLD после преобразования не разряжается. 3. Максимальное рекомендуемое значение внутреннего сопротивления источника аналогового сигнала 10кОм. Это необходимо для компенсации внутреннего тока утечки.
28
4. После того, как преобразование завершено, необходимо программно обеспечить задержку не менее 2.0TAD, прежде чем начнете следующее преобразование. В течение этого времени конденсатор CHOLD не подключен к выбранному входному каналу АЦП.
Рис. 1. Структурная схема модуля АЦП
Рис. 2. Схема аналогового входа АЦП
29
Обозначения: CPIN – входная емкость; VT – пороговое напряжение; ILEAKAGE – ток утечки вывода; RIC – сопротивление соединения; SS – переключатель защелки; CHOLD – конденсатор защелки. 2. Выбор источника тактовых импульсов для АЦП Время получения одного бита результата определяется параметром TAD. Для 10-разрядного результата требуется как минимум 12TAD. Параметры тактового сигнала для АЦП определяются программно, TAD может принимать следующие значения: . 2TOSC; . 8TOSC; . 32TOSC; Внутренний RC генератор модуля АЦП (2-6мкс). Для получения корректного результата преобразования необходимо выбрать источник тактового сигнала АЦП, обеспечивающий время TAD не менее 1.6 мкс. В таблице 1 указано максимальное значение тактовой частоты микроконтроллера для каждого режима синхронизирующего сигнала АЦП. Таблица 1 Максимальное значение FOSC удовлетворяющие требованию к TAD (для микроконтроллеров с нормальным диапазоном напряжения питания (F))
Примечания: 1. Типовое значение времени TAD RC генератора АЦП равно 4мкс, может варьироваться от 2мкс до 6мкс. 2. Когда тактовая частота микроконтроллера больше 1МГц, рекомендуется использовать RC генератор АЦП только для работы в SLEEP режиме. 3. Для микроконтроллеров с расширенным диапазоном напряжений питания (LF) данные параметры смотрите в разделе электрических характеристик. 3. Настройка аналоговых входов Регистры ADCON1, TRISA и TRISE отвечают за настройку выводов АЦП. Если выводы микросхемы настраиваются как аналоговые входы, то при этом должны быть установлены соответствующие биты в регистре TRIS. Если соответствующий бит сброшен в '0', вывод микросхемы настроен как цифровой 30
выход со значениями выходных напряжений VOH или VOL. Модуль АЦП функционирует независимо от состояния битов CHS2:CHS0 и битов TRIS. Примечания: 1. При чтении содержимого регистра порта нули будут установлены в тех разрядах, которые были настроены как аналоговые входы. Настроенные на цифровой вход каналы будут преобразовывать входные аналоговые уровни в цифровые, что однако не окажет влияния на точность преобразования. 2. Значения напряжений, подаваемых на выводы, настроены как аналоговые входы, включая выводы (AN7:AN0), могут влиять на ток потребления входного буфера, который может выйти за пределы значений, оговоренных в технической спецификации. 4. Аналого-цифровое преобразование Сброс бита GO/-DONE в '0' во время преобразования приведет к его прекращению. При этом регистры результата (ADRESH:ADRESL) не изменят своего содержимого. После досрочного завершения преобразования необходимо обеспечить временную задержку 2TAD. Выдержав требуемую паузу, можно начать новое преобразования установкой бита GO/-DONE в '1'. На рис. 3 показана последовательность получения результата после установки бита GO/-DONE в '1'. Примечание. Бит GO/-DONE и бит включения АЦП должны устанавливаться разными командами.
Рис. 3. Последовательность получения результата после установки бита GO/-DONE в '1'
31
Рис. 4. Выравнивание результата аналого-цифрового преобразования
Выравнивание результата преобразования 10-разрядный результат преобразования сохраняется в спаренном 16разрядном регистре ADRESH:ADRESL. Запись результата преобразования может выполняться с правым или левым выравниванием, в зависимости от значения бита ADFM (см. рис. 4). Не задействованные биты регистра ADRESH:ADRESL читаются как ‘0’. Если модуль АЦП выключен, то 8разрядные регистры ADRESH и ADREL могут использоваться как регистры общего назначения. Практическая часть: 1. Прочесть методичку и после собеседования с преподавателем получить у него задание. 2. Написать и отладить программу в среде MPLAB. 3. С разрешения преподавателя занести программу в PIC16F877. 4. Проверить работу программы на лабораторной установке. Отчет должен содержать: - задание; - схема лабораторной установки; - блок-схема алгоритма; - комментированный листинг программы. Комментарии на английском языке предпочтительны.
32