Автор работы: Пользователь скрыл имя, 26 Апреля 2013 в 11:42, курсовая работа
В данной курсовой работе будет реализовано устройство, формирующее прямоугольные сигналы, которые будут формироваться после выхода из режима ожидания с помощью нажатия на кнопку. Так же после нажатия кнопки прерывания устройство должно будет формировать пачки импульсов с определенным шагом и временем формирования. Количество сформированных пачек импульсов будут поступать в память EEPROM и оставаться там. К устройству будет подключен 7-ми сегментный индикатор, который будет выводить в десятичной системе счисления количество сформированных пачек.
ВВЕДЕНИЕ 3
1. ЗАДАНИЕ 4
2. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 5
3. РЕЗУЛЬТАТЫ ПРОДЕЛАННОЙ РАБОТЫ 15
ЗАКЛЮЧЕНИЕ 18
СПИСОК ЛИТЕРАТУРЫ 19
ПРИЛОЖЕНИЕ 20
Если активный перепад внешнего управляющего сигнала на выводе RB0/INT сформируется в интервале времени отработки “зоны” разрешения прерываний, то рабочая точка программы “прыгнет” на начало подпрограммы прерывания, после чего эта она начнет отрабатываться.
В “зоне” разрешения прерываний, могут наступить 2 события:
Переход на подпрограмму прерываний происходит по стеку, т.е. в стек записывается адрес следующей, после команды, во время исполнения которой произошло прерывание, команды. Это нужно для того, чтобы после отработки подпрограммы прерывания, произошел возврат на эту “следующую” команду. Таким образом, рабочая точка программы, на некоторое время, как бы “отлучается” из “основного тела” программы. На время этой “отлучки”, отработка “основного тела” программы приостанавливается, а после возврата снова возобновляется. Последней командой подпрограммы прерываний всегда должна быть команда retfie, которая используется только для возврата из подпрограммы прерывания. По этой команде, осуществляется возврат по стеку.
И еще одна очень важная “деталь”: в состав подпрограммы прерывания, в обязательном порядке, должна входить команда сброса флага задействованного источника прерываний (или флагов, если таких источников несколько). В нашем случае, используется прерывание по входу RB0/INT, поэтому команда сброса флага должна выглядеть так: bcf IntCon,1. В большинстве случаев, команду (команды) сброса флага (флагов) прерывания помещают непосредственно перед командой retfie.
При
отсутствии команды сброса флага
прерывания, рабочая точка программы,
после ухода в первое прерывания,
начнет неконтролируемо “метаться”
между подпрограммой прерывания
и “основным телом” программы (программа
“уходит в глюк”). Проще говоря,
если флаг прерывания “принудительно”
(программно) не сброшен, то это “воспринимается”
микроконтроллером как
В части касающейся заданного прерывания (т.е. по входу RB0/INT), для организации работы с прерываниями, необходимо:
Нам
уже известно, что команды ветвления
“порождают” 2 сценария работы программы.
А как быть, если нужно “компактно
разветвиться” на большее число
сценариев, например, на 4 сценария (для
того чтобы впоследствии “уйти” на
исполнение того или иного из этих
4-х сценариев). Нетрудно догадаться,
что для этого можно
Вычисляемый переход осуществляется при помощи команды addwf PC,F, которая формально описывается так: сложить содержимое регистров W и PC, с сохранением результата сложения в регистре PC (имеется ввиду младший байт счетчика команд с названием PCL). Для вычисляемого перехода адрес в PC на момент исполнения команды addwf PC,F является как бы начальной точкой отсчета, т.е. выбор дальнейшего сценария работы программы зависит от приращения счетчика команд PC.
Прежде чем вставить в текст программы команду addwf PC,F, необходимо определиться с критерием перехода, т.е. с содержимым чего-то, что определяет, какой именно из 4-х сценариев будет далее исполняться. Это “чего-то” есть регистр W, а критерием перехода является его содержимое, т.е. число, находящееся в регистре W на момент исполнения команды addwf PC,F, которое и будет приращением счетчика команд PC.
Какие числа должны быть записаны в регистр W? Для того чтобы процедура вычисляемого перехода получилась “компактной”, значения этих чисел, в данном случае (4 сценария), должны быть равны 0, 1, 2, 3 (почему именно такие значения, а не 1, 2, 3, 4, разберемся позже). Если сценариев больше чем 4, то этот числовой ряд нужно продолжить (количество этих чисел должно быть равно количеству сценариев).
Например, для случая 4-сценарной работы, перед исполнением команды addwf PC,F, нужно откуда-то (из регистра общего назначения, предназначенного для осуществления этой операции) скопировать в регистр W одно из чисел, находящихся в числовом диапазоне от нуля до трех включительно. Если это сделать, то после исполнения команды addwf PC,F произойдет переход (“прыжок”) рабочей точки программы на одну из четырех команд начала исполнения сценариев программы. В дальнейшем, после перехода на начало исполнения выбранного сценария, он и будет исполнен.
Командами начала исполнения сценариев могут быть:
Команды начала исполнения сценариев обычно “компактно” размещают сразу же после команды addwf PC,F, т.е. адреса этих команд в памяти программ “идут друг за другом” (команды не “разбросаны” по памяти программ). В любом случае, “прыжок” рабочей точки программы на одну из команд начала исполнения сценариев программы происходит по принципу: если в регистре W, на момент исполнения команды addwf PC,F, записано число N, то после исполнении команды addwf PC,F, произойдет переход рабочей точки программы на команду начала исполнения сценария программы, с номером N+1. Обратите внимание на то, что этот “прыжок” (переход) происходит без применения команды перехода, а за счет приращения содержимого счетчика команд PC, которое происходит после исполнения команды addwf PC,F. Итак, вычисляемый переход является третьей разновидностью переходов (после условных и безусловных переходов).
Если “привязаться”
к случаю управления сценариями работы
программы с помощью
В
большинстве случаев
В общем виде разберемся с таким понятием как динамическая индикация. Для определенности предположим, что в одном полном цикле индикации результаты кодового преобразования последовательно выводятся на индикацию, начиная с младшего десятичного разряда линейки 7-сегментных индикаторов. По окончании последовательного вывода результатов кодового преобразования во все 4 знакоместа линейки происходит переход (по кольцу) на вывод символа в младшее знакоместо линейки. После этого, все опять повторяется снова и снова.
Описанный случай является типичным примером “двойной закольцовки”: один “виток” большого кольца индикации равен 4-м “виткам” малого кольца индикации, “дислоцирующегося” внутри большого кольца индикации. Если речь идет о фиксированном количестве “витков” (4), то количество “витков” малого кольца индикации нужно “поставить на счетчик”. Количество “витков” большого кольца индикации тоже нужно “поставить на счетчик”, ведь нельзя же допустить, чтобы рабочая точка программы все время находилась в подпрограмме вывода данных на индикацию. В противном случае, “не будут делаться другие, важные дела”, например, замеры (или вычисления), для которых и нужна индикация.
Итак, должно быть “отмотано” фиксированное количество “витков” большого кольца индикации, после чего рабочая точка программы должна покинуть подпрограмму вывода данных на индикацию и “сделать другие, важные дела”. После того, как “она их сделает”, и в результате этого в наличии будет иметься то, что нужно вывести на индикацию, снова начинается отработка подпрограммы вывода данных на индикацию. Все повторяется снова. Ну и так далее. В интервале времени каждой такой “отлучки” 7-сегментные индикаторы “гасятся” вплоть до начала следующей отработки подпрограммы вывода данных на индикацию. Это и является причиной так называемых “мерцаний”, являющихся недостатком динамической индикации.
В отдельно взятом 7-сегментном индикаторе символ индицируется (“высвечивается”) в течение интервала времени формирования одного “витка” малого кольца индикации, в интервале которого он активен. В начале следующего “витка” малого кольца индикации этот 7-сегментный индикатор переводится из активного в пассивное состояние (“гасится”), а следующий по разрядности 7-сегментный индикатор активируется. Ну и так далее, до окончания активации последнего 7-сегментного индикатора линейки. Таким образом, речь идет о последовательном поразрядном выводе результатов измерения (счета) на индикацию.
“Привязка” конкретных десятичных разрядов результата измерения (счета) к конкретным знакоместам линейки 7-сегментных индикаторов, осуществляется путем последовательной (в порядке старшинства) “запитки” 7-сегментных индикаторов, входящих в состав линейки. В зависимости от того, какие именно 7-сегментные индикаторы применены (с общим катодом или с общим анодом), эта “запитка” осуществляется либо коммутацией точки соединения общих выводов сегментов на плюс источника питания, либо ее коммутацией на корпус. Остальные выводы сегментов объединяются в группы (по принципу одноименности секторов) и в пределах этих групп “параллелятся”. Получается 8 выводов, которые и подключаются к выводам порта, который задействован для управления линейкой. Сказанное относится к тому случаю, если линейка создается из отдельных, 7-сегментных индикаторов. Если речь идет о промышленных вариантах такой линейки (например, АЛС318), то ничего “параллелить” не нужно, так как это уже сделано разработчиками.
Динамическая индикация организуется тогда, когда линейка состоит из нескольких 7-сегментных индикаторов (знакомест), и выводов используемого микроконтроллера не хватает для индикации информации статическим способом.
Рассмотрим случай организации динамической индикации для линейки 7-сегментных индикаторов, состоящей из 4-х знакомест. Рассматриваемая подпрограмма динамической индикации достаточно универсальна, т.е. она может быть “врезана/встроена” в другие программы. Разрядность можно будет уменьшить (просто) или увеличить (сложнее). По ходу дела, разберемся с косвенной адресацией, который в нашем случае используется для записи константы в регистр.
В
качестве примера используем микроконтроллер
PIC16F84A, структурные возможности
EEPROM
память данных так же, как и
память программ, является энергонезависимой
памятью, но к памяти программ
она отношения не имеет, а
выполняет свои специфические
функции. Ее функции, в
Разберемся со структурой и основными принципами организации работы с EEPROM памятью данных. Объем EEPROM памяти данных микроконтроллеров не велик, например, для PIC16F84A, это – 64 ячейки, а в других типах микроконтроллеров может быть и больше. В каждую из этих ячеек может быть записан один байт (число от .00 до .255). После записи этот байт (байты) можно считать и результат этого считывания использовать в программе. Каждая из этих 64-х ячеек, в диапазоне адресов от .00 до .63 (00h .. 3Fh), имеет свой адрес, который обязательно нужно указывать как при чтении из EEPROM памяти данных, так и при записи в нее. По ходу составления программы программист определяет содержимое какой именно ячейки (ячеек) нужно считать и в какую именно ячейку (ячейки) нужно произвести запись, c “привязкой” этих действий к логике программы.
Информация о работе Разработка устройства, формирующего пачки импульсов