Разработка устройства, формирующего пачки импульсов

Автор работы: Пользователь скрыл имя, 26 Апреля 2013 в 11:42, курсовая работа

Краткое описание

В данной курсовой работе будет реализовано устройство, формирующее прямоугольные сигналы, которые будут формироваться после выхода из режима ожидания с помощью нажатия на кнопку. Так же после нажатия кнопки прерывания устройство должно будет формировать пачки импульсов с определенным шагом и временем формирования. Количество сформированных пачек импульсов будут поступать в память EEPROM и оставаться там. К устройству будет подключен 7-ми сегментный индикатор, который будет выводить в десятичной системе счисления количество сформированных пачек.

Содержание

ВВЕДЕНИЕ 3
1. ЗАДАНИЕ 4
2. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 5
3. РЕЗУЛЬТАТЫ ПРОДЕЛАННОЙ РАБОТЫ 15
ЗАКЛЮЧЕНИЕ 18
СПИСОК ЛИТЕРАТУРЫ 19
ПРИЛОЖЕНИЕ 20

Прикрепленные файлы: 1 файл

Kursovoy.docx

— 869.86 Кб (Скачать документ)

 

Если  активный перепад внешнего управляющего сигнала на выводе RB0/INT сформируется в интервале времени отработки  “зоны” разрешения прерываний, то рабочая  точка программы “прыгнет” на начало подпрограммы прерывания, после  чего эта она начнет отрабатываться.

В “зоне” разрешения прерываний, могут наступить 2 события:

  • при отсутствии сигнала прерывания программа исполняется в пределах “основного тела” программы;
  • при наличии сигнала прерывания (т.е. в случае, когда на выводе RB0/INT сформируется активный перепад), происходит переход рабочей точки программы на начало исполнения подпрограммы прерываний.

Переход на подпрограмму прерываний происходит по стеку, т.е. в стек записывается адрес  следующей, после команды, во время  исполнения которой произошло прерывание, команды. Это нужно для того, чтобы  после отработки подпрограммы прерывания, произошел возврат на эту “следующую”  команду. Таким образом, рабочая  точка программы, на некоторое время, как бы “отлучается” из “основного тела” программы. На время этой “отлучки”, отработка “основного тела” программы  приостанавливается, а после возврата снова возобновляется. Последней  командой подпрограммы прерываний всегда должна быть команда retfie, которая используется только для возврата из подпрограммы прерывания. По этой команде, осуществляется возврат по стеку.

И еще одна очень важная “деталь”: в состав  подпрограммы прерывания, в обязательном порядке, должна входить  команда сброса флага задействованного источника прерываний (или флагов, если таких источников несколько). В  нашем случае, используется прерывание по входу RB0/INT, поэтому команда сброса флага должна выглядеть так: bcf  IntCon,1. В большинстве случаев, команду (команды) сброса флага (флагов) прерывания помещают непосредственно перед командой retfie.

При отсутствии команды сброса флага  прерывания, рабочая точка программы, после ухода в первое прерывания, начнет неконтролируемо “метаться” между подпрограммой прерывания и “основным телом” программы (программа  “уходит в глюк”). Проще говоря, если флаг прерывания “принудительно” (программно) не сброшен, то это “воспринимается” микроконтроллером как управляющий  сигнал “ухода” в подпрограмму прерывания. Итак, при составлении  программы необходимо помнить, что  на момент возврата из подпрограммы прерывания, флаг (флаги) прерывания должен быть программно сброшен (установлен в 0).

В части касающейся заданного прерывания (т.е. по входу RB0/INT), для организации  работы с прерываниями, необходимо:

  • в “ заголовке” программы, назначить вектор прерывания;
  • назначить источник прерывания (INTCON);
  • определить активный фронт прерывания (OPTION);
  • создать “зону” разрешения прерываний;
  • в начале подпрограммы прерывания – сохранить, а в конце ее выполнения – восстановить содержимое регистров STATUS и W;
  • перед осуществлением возврата из подпрограммы прерывания – сбросить флаг прерывания выбранного источника прерываний;
  • в конце подпрограммы прерывания – исполнить команду retfie.

Нам уже известно, что команды ветвления  “порождают” 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 произойдет переход (“прыжок”) рабочей точки программы на одну из четырех команд начала исполнения сценариев программы. В дальнейшем, после перехода на начало исполнения выбранного сценария, он и будет исполнен.

 

Командами начала исполнения сценариев могут быть:

  • Команды goto. Такой вычисляемый переход применяется в тех случаях, когда выбор того или иного сценария работы программы нужно поставить в зависимость от внешнего управления (например, от состояния клавиатуры) или от результатов работы программы (например, от результата вычисления). Последним сценарием в этом случае может быть (а может и не быть. Зависит от задумки) сценарий “программа исполняется далее”;
  • Команды retlw. Такой вычисляемый переход применяется для выборок данных из таблицы данных (в том числе и для перекодировок).

Команды начала исполнения сценариев обычно “компактно” размещают сразу  же после команды addwf PC,F, т.е. адреса этих команд в памяти программ “идут друг за другом” (команды не “разбросаны” по памяти программ). В любом случае, “прыжок” рабочей точки программы на одну из команд начала исполнения сценариев программы происходит по принципу: если в регистре W, на момент исполнения команды addwf PC,F, записано число N, то после исполнении команды addwf PC,F, произойдет переход рабочей точки программы на команду начала исполнения сценария программы, с номером N+1. Обратите внимание на то, что этот “прыжок” (переход) происходит без применения команды перехода, а за счет приращения содержимого счетчика команд PC, которое происходит после исполнения команды addwf PC,F. Итак, вычисляемый переход является третьей разновидностью переходов (после условных и безусловных переходов).

Если “привязаться”  к случаю управления сценариями работы программы с помощью клавиатуры, реализующей одно из 4-х возможных  состояний, то для этого потребуется 2 кнопки. В конечном итоге, содержимое регистра W формируется по результатам  опроса клавиатуры. Можно опросить клавиатуру и из большего количества кнопок. В этом случае, количество возможных  состояний увеличится и можно  реализовать большее количество сценариев работы программы.

В большинстве случаев подпрограмма вычисляемого перехода, подобная подпрограмме TABLE, вызывается (call  TABLE) из циклических подпрограмм обработки содержимого неких регистров общего назначения, содержащих в себе данные, предназначенные для вывода на индикацию. Для краткости, эти регистры обозначим под названиями LED с соответствующей нумерацией. Например, если результат измерения (подсчета) нужно вывести на индикацию как 4-разрядное десятичное число, то двоичный результат измерения “прогоняется” через двоично-десятичное преобразование (о нем, позднее), в итоге которого результат измерения помещается в младшие полубайты 4-х регистров LED (от LED0 до LED3). Далее, содержимое этих регистров, с соблюдением порядка старшинства, поочередно копируется в регистр W и подвергается кодовому преобразованию (call TABLE) и выводится на индикацию в виде символов. Что касается последнего, то “технология” вывода на индикацию проста: результат кодового преобразования из регистра W копируется в регистр того порта, к выводам которого подключены выводы секторов 7-сегментного индикатора.

В общем виде разберемся с таким  понятием как динамическая индикация. Для определенности предположим, что  в одном полном цикле индикации  результаты кодового преобразования последовательно  выводятся на индикацию, начиная  с младшего десятичного разряда  линейки 7-сегментных индикаторов. По окончании  последовательного вывода результатов  кодового преобразования во все 4 знакоместа линейки происходит переход (по кольцу) на вывод символа в младшее  знакоместо линейки. После этого, все  опять повторяется снова и  снова.

Описанный случай является типичным примером “двойной закольцовки”: один “виток” большого кольца индикации равен 4-м “виткам” малого кольца индикации, “дислоцирующегося” внутри большого кольца индикации. Если речь идет о фиксированном количестве “витков” (4), то количество “витков” малого кольца индикации нужно “поставить на счетчик”. Количество “витков” большого кольца индикации тоже нужно “поставить на счетчик”, ведь нельзя же допустить, чтобы рабочая точка программы все время находилась в подпрограмме вывода данных на индикацию. В противном случае, “не будут делаться другие, важные дела”, например, замеры (или вычисления), для которых и нужна индикация.

Итак, должно быть “отмотано” фиксированное  количество “витков” большого кольца индикации, после чего рабочая точка  программы должна покинуть подпрограмму вывода данных на индикацию и “сделать другие, важные дела”. После того, как  “она их сделает”, и в результате этого в наличии будет иметься  то, что нужно вывести на индикацию, снова начинается отработка подпрограммы вывода данных на индикацию. Все повторяется  снова. Ну и так далее. В интервале  времени каждой такой “отлучки” 7-сегментные индикаторы “гасятся”  вплоть до начала следующей отработки  подпрограммы вывода данных на индикацию. Это и является причиной так называемых “мерцаний”, являющихся недостатком  динамической индикации.

В отдельно взятом 7-сегментном индикаторе символ индицируется (“высвечивается”) в течение интервала времени  формирования одного “витка” малого кольца индикации, в интервале которого он активен. В начале следующего “витка”  малого кольца индикации этот 7-сегментный индикатор переводится из активного  в пассивное состояние (“гасится”), а следующий по разрядности 7-сегментный индикатор активируется. Ну и так  далее, до окончания активации последнего 7-сегментного индикатора линейки. Таким  образом, речь идет о последовательном поразрядном выводе результатов  измерения (счета) на индикацию.

“Привязка”  конкретных десятичных разрядов результата измерения (счета) к конкретным знакоместам  линейки 7-сегментных индикаторов, осуществляется путем последовательной (в порядке  старшинства) “запитки” 7-сегментных индикаторов, входящих в состав линейки. В зависимости от того, какие именно 7-сегментные индикаторы применены (с общим катодом или с общим анодом), эта “запитка” осуществляется либо коммутацией точки соединения общих выводов сегментов на плюс источника питания, либо ее коммутацией на корпус. Остальные выводы сегментов объединяются в группы (по принципу одноименности секторов) и в пределах этих групп “параллелятся”. Получается 8 выводов, которые и подключаются к выводам порта, который задействован для управления линейкой. Сказанное относится к тому случаю, если линейка создается из отдельных, 7-сегментных индикаторов. Если речь идет о промышленных вариантах такой линейки (например, АЛС318), то ничего “параллелить” не нужно, так как это уже сделано разработчиками.

Динамическая  индикация организуется тогда, когда линейка состоит из нескольких 7-сегментных индикаторов (знакомест), и выводов используемого микроконтроллера не хватает для индикации информации статическим способом.

Рассмотрим  случай организации динамической индикации  для линейки 7-сегментных индикаторов, состоящей из 4-х знакомест. Рассматриваемая  подпрограмма динамической индикации  достаточно универсальна, т.е. она может  быть “врезана/встроена” в другие программы. Разрядность можно будет  уменьшить (просто) или увеличить (сложнее). По ходу дела, разберемся с косвенной  адресацией, который в нашем случае используется для записи константы  в регистр. 

В качестве примера используем микроконтроллер PIC16F84A, структурные возможности которого вполне хватают для управления четырьмя 7-сегментными индикаторами. PIC16F84A имеет 2 порта. Порт В, имеющий 8 выводов, “в полном составе” выделяется под управление сегментами 7-сегментных индикаторов (включая и запятую), а функция последовательной активации знакомест передается в порт А, имеющего 5 выводов. Таким образом, 8 выводов соответствующих запараллеленных секторов индикаторов подключаются к 8-ми выводам порта В, а 4 вывода общих катодов индикаторов подключаются к 4-м выводам порта A.

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

Разберемся  со структурой и основными принципами организации работы с EEPROM памятью данных. Объем EEPROM памяти данных микроконтроллеров не велик, например, для PIC16F84A, это – 64 ячейки, а в других типах микроконтроллеров может быть и больше. В каждую из этих ячеек может быть записан один байт (число от .00 до .255). После записи этот байт (байты) можно считать и результат этого считывания использовать в программе. Каждая из этих 64-х ячеек, в диапазоне адресов от .00 до .63 (00h .. 3Fh), имеет свой адрес, который обязательно нужно указывать как при чтении из EEPROM памяти данных, так и при записи в нее. По ходу составления программы программист определяет содержимое какой именно ячейки (ячеек) нужно считать и в какую именно ячейку (ячейки) нужно произвести запись, c “привязкой” этих действий к логике программы.

 

 

  1. РЕЗУЛЬТАТЫ ПРОДЕЛАННОЙ  РАБОТЫ

Информация о работе Разработка устройства, формирующего пачки импульсов