Разработка устройства, формирующего пачки импульсов
Некоммерческое акционерное
«АЛМАТИНСКИЙ УНИВЕРСИТЕТ
Кафедра «Компьютерных технологий»
КУРСОВОЙ ПРОЕКТ
по дисциплине «ЦУиМП»
на тему: «Разработка устройства, формирующего пачки импульсов»
Специальность: Вычислительная техника и программное обеспечение
Выполнил: Лебедев О.Г. Группа:БВТ-10-04
Руководитель: проф. Шанаев О.Т.
« » 2013 г.
Алматы 2013
СОДЕРЖАНИЕ
ВВЕДЕНИЕ 3
1. ЗАДАНИЕ 4
2. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 5
3. РЕЗУЛЬТАТЫ ПРОДЕЛАННОЙ РАБОТЫ 15
ЗАКЛЮЧЕНИЕ 18
СПИСОК ЛИТЕРАТУРЫ 19
ПРИЛОЖЕНИЕ 20
ВВЕДЕНИЕ
В данной курсовой работе будет реализовано устройство, формирующее прямоугольные сигналы, которые будут формироваться после выхода из режима ожидания с помощью нажатия на кнопку. Так же после нажатия кнопки прерывания устройство должно будет формировать пачки импульсов с определенным шагом и временем формирования. Количество сформированных пачек импульсов будут поступать в память EEPROM и оставаться там. К устройству будет подключен 7-ми сегментный индикатор, который будет выводить в десятичной системе счисления количество сформированных пачек.
- ЗАДАНИЕ
Разработать устройство, режимы работы которого описываются следующим образом:
- при запуске программы к работе, устройство должно находиться в режиме ожидания сигнала управления от внешней кнопки;
- после поступления этого сигнала, устройство должно формировать прямоугольные импульсы (меандр) с частотой F0;
- по сигналу прерывания устройство должно прекратить формирование прямоугольных импульсов с частотой F0 и перейти к формированию последовательности пачек импульсов с длительностью паузы между ними T;
- число импульсов в пачках (т.е. при первом запуске программы) должно меняться от N0 (первоначальное значение) до N1 (конечное значение), изменяясь от пачки к пачке с шагом S;
- длительность формируемых в пачках импульсов должно быть равна T1, а длительность паузы между ними – T0;
- после завершения формирования очередной пачки импульсов, число сформированных в этой пачке импульсов должно быть отображено на 7-сегментных индикаторах (в виде двухразрядного десятичного числа) и оставаться там до следующего изменения его значения (т.е. до отображения числа импульсов в следующей пачке);
- после снятия сигнала прерывания устройство должно вернуться в основной рабочий режим, т.е. формировать импульсы с частотой F0;
- при следующем прерывании число формируемых в пачках импульсов должно быть продолжено с достигнутого при предыдущем прерывании числа импульсов в последней сформированной пачке (т.е. перед снятием сигнала прерывания).
Вариант 6
№ |
Студент |
F0, кГц |
T1, мкс |
T0, мкс |
T, мкс |
N0, ед |
N1, ед |
S, ед |
6 |
Лебедев О. |
2,00 |
50 |
190 |
820 |
3 |
19 |
4 |
- ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
Мультивибратор — релаксационный генератор сигналов электрических прямоугольных колебаний с короткими фронтами. Термин предложен голландским физиком Ван Дер Полем, так как в спектре колебаний мультивибратора присутствует множество гармоник — в отличие от генератора синусоидальных колебаний («моновибратора»).
Мультивибратор
является одним из самых распространённых
генераторов импульсов
Тональный вызов - специальный звуковой сигнал, используемый в конвенциональной радиосвязи. Частота тонального вызова обычно составляет 1750 Гц. При нажатии кнопки передачи тонального вызова (Burst button) излучается сигнал, модулированный звуковым тоном данной частоты, который принимается вызываемым абонентом и воспроизводится на динамике его станции.
Тональный набор, тональный сигнал (англ. Dual-Tone Multi-Frequency, DTMF) — двухтональный многочастотный аналоговый сигнал, используемый для набора телефонного номера. Сфера применения тональных сигналов: автоматическая телефонная сигнализация между устройствами, а также ручной ввод абонентом для различных интерактивных систем, например голосового автоответа. По используемой полосе частот сигнал соответствует телефонии.
Аналоговый сигнал — сигнал данных, у которого каждый из представляющих параметров описывается функцией времени и непрерывным множеством возможных значений.
Различают
два пространства сигналов — пространство
L (непрерывные сигналы), и пространство
l (L малое) — пространство последовательностей.
Пространство l (L малое) есть пространство
коэффициентов Фурье (счетного набора
чисел, определяющих непрерывную функцию
на конечном интервале области определения)
Аналоговые
сигналы описываются
- прямая: электрическое напряжение
- окружность: положение ротора, колеса, шестерни, стрелки аналоговых часов, или фаза несущего сигнала
- отрезок: положение поршня, рычага управления, жидкостного термометра или электрический сигнал, ограниченный по амплитуде
- различные многомерные пространства: цвет, квадратурно-модулированный сигнал.
МК подгруппы PIC16F8X имеют четыре источника прерываний:
- внешнее прерывание с вывода RB0/INT;
- прерывание от переполнения счетчика/таймера TMR0;
- прерывание от изменения сигналов на линиях порта RB<7:4>;
- прерывание по окончании записи данных в EEPROM.
Все прерывания имеют один и тот же вектор/адрес – 0004h. Однако в управляющем регистре прерываний INTCON соответствующим битом-признаком записывается, от какого именно источника поступил запрос прерывания. Исключение составляет прерывание по завершении записи в EEPROM, признак которого находится в регистре EECON1. Бит общего разрешения/запрещения прерывания GIE (INTCON <7>) разрешает (если = 1) все индивидуально незамаскированные прерывания или запрещает их (если = 0). Каждое прерывание в отдельности может быть дополнительно разрешено/запрещено установкой/сбросом соответствующего бита в регистре INTCON. Бит GIE при сбросе обнуляется. Когда начинает обрабатываться прерывание, бит GIE обнуляется, чтобы запретить дальнейшие прерывания, адрес возврата посылается в стек, а в программный счетчик загружается адрес 0004h. Время реакции на прерывание для внешних событий, таких как прерывание от ножки INT или порта B, составляет приблизительно пять циклов. Это на один цикл меньше, чем для внутренних событий, таких как прерывание по переполнению от таймера TMR0. Время реакции всегда одинаковое.
В подпрограмме обработки прерывания источник прерывания может быть определен по соответствующему биту в регистре признаков. Этот флаг-признак должен быть программно сброшен внутри подпрограммы. Признаки запросов прерываний не зависят от соответствующих маскирующих битов и бита общего маскирования GIE. Команда возврата из прерывания RETFIE завершает прерывающую подпрограмму и устанавливает бит GIE, чтобы опять разрешить прерывания. Внешнее прерывание на ножке RB0/INT осуществляется по фронту: либо по нарастающему (если в регистре OPTION бит INTEDG=1), либо по спадающему (если INTEDG=0). Когда фронт обнаруживается на ножке INT, бит запроса INTF устанавливается в единицу (INTCON <1>). Это прерывание может быть замаскировано сбросом управляющего бита INTE в ноль (INTCON <4>). Бит запроса INTF необходимо очистить прерывающей программой перед тем, как опять разрешить это прерывание. Прерывание INT может вывести процессор из режима SLEEP, если перед входом в этот режим бит INTE был установлен в единицу. Состояние бита GIE также определяет, будет ли процессор переходить на подпрограмму прерывания после выхода из режима SLEEP. Переполнение счетчика TMR0 (FFh->00h) устанавливает в единицу бит запроса T0IF (INTCON<2>). Это прерывание может быть разрешено/запрещено установкой/сбросом бита маски T0IE (INTCON<5>). Сброс запроса T0IF – дело программы обработки. Любое изменение сигнала на одном из четырех входов порта RB<7:4> устанавливает в единицу бит RBIF (INTCON<0>). Это прерывание может быть разрешено/запрещено установкой/сбросом бита маски RBIE (INTCON<3>). Сброс запроса RBIF – дело программы обработки. Признак запроса прерывания по завершении записи в EEPROM, EEIF (EECON1<4>) устанавливается в единицу по окончании автоматической записи данных в EEPROM. Это прерывание может быть замаскировано сбросом бита EEIE (INTCON<6>). Сброс запроса EEIF – дело программы обработки.
В устройстве должно осуществляться периодическое сканирование двух каналов передачи на наличие запроса на передачу, т.е. сигнала внешнего управления. При этом, сканирование каждого из каналов должно фиксироваться в течение некоторого оптимального интервала времени (слишком быстро или слишком медленно менять их нельзя). При поступлении запроса на передачу, устройство должно прекратить сканирование каналов и начинать передавать сигнал соответствующего (т.е. сканируемого в момент поступления запроса) канала. Сканирование каналов должно быть возобновлено после снятия сигнала запроса. Описанный процесс может быть программно реализован на основе микроконтроллера (например, микроконтроллера PIC16F84A) с помощью прерывания.
Определимся
с терминологией, применяемой при
описании программы работы устройства.
Для удобства объяснения и восприятия,
целесообразно разделить
Предполагаем, что выходной каскад переключающего устройства, с которого поступает сигнал прерывания, является каскадом с открытым коллектором (или с открытым стоком). Для приема сигнала внешнего прерывания используется вывод RB0/INT, напоминаем, что в микроконтроллере PIC16F84A есть и другие источники прерываний, что отражено в описании битов регистра INTCON (см. таблицу 3.1).
В программе должна быть “зона” разрешения прерываний, которая в идеале должна включать в себя всё “основное тело” программы, но специфика данного устройства такова, что возможен “ложный уход” в прерывание во время перестройки проверяемых каналов, которая происходит в течение некоторого интервала времени, чего допустить нельзя. Поэтому подпрограмма START должна начаться с команды запрета всех прерываний clrf IntCon. Уходы в прерывания должны происходить позднее. Далее, программа отрабатывается (исполняется) до начала “зоны” разрешения прерываний. В начале этой “зоны” прерывания по входу RB0/INT разрешаются, после чего программа исполняется далее, “в режиме ожидания прерываний”. В конце этой “зоны”, прерывания запрещаются, и рабочая точка программы переходит на новый “виток” полного цикла “основного тела” программы.
Таблица 1 - Регистр INTCON
Биты |
Название |
Описание |
7 |
GIE |
Глобальное разрешение прерываний: 1 – разрешены все 0 – все прерывания запрещены |
6 |
EEIE |
Прерывание по окончанию записи в EEPROM: 1 – прерывание разрешено 0 – прерывание запрещено |
5 |
T0IE |
Прерывание по переполнению TMR0: 1 – прерывание разрешено 0 – прерывание запрещено |
4 |
INTE |
Прерывание по входу RB0/INT: 1 – прерывание разрешено 0 – прерывание запрещено |
3 |
RBIE |
Прерывание по изменению уровней сигналов на выводах RB4…RB7: 1 – прерывание разрешено 0 – прерывание запрещено |
2 |
T0IF |
Флаг прерывания по переполнению TMR0: 1 – произошло переполнение TMR0 0 – переполнения TMR0 не было |
1 |
INTF |
Флаг прерывания по входу RB0/INT: 1 – произошло прерывание по входу RB0/INT 0 – прерывания по входу RB0/INT не было |
0 |
RBIF |
Флаг прерывания по изменению уровней сигналов на выводах RB4…RB7: 1 – зафиксировано изменение уровня сигнала на одном из входов RB4…RB7 0 – не было изменения уровня сигнала ни на одном из входов RB4…RB7 |
Если активный перепад внешнего управляющего сигнала на выводе RB0/INT сформируется в интервале времени отработки “зоны” разрешения прерываний, то рабочая точка программы “прыгнет” на начало подпрограммы прерывания, после чего эта она начнет отрабатываться.
В “зоне” разрешения прерываний, могут наступить 2 события:
- при отсутствии сигнала прерывания программа исполняется в пределах “основного тела” программы;
- при наличии сигнала прерывания (т.е. в случае, когда на выводе RB0/INT сформируется активный перепад), происходит переход рабочей точки программы на начало исполнения подпрограммы прерываний.
Переход на подпрограмму прерываний происходит по стеку, т.е. в стек записывается адрес следующей, после команды, во время исполнения которой произошло прерывание, команды. Это нужно для того, чтобы после отработки подпрограммы прерывания, произошел возврат на эту “следующую” команду. Таким образом, рабочая точка программы, на некоторое время, как бы “отлучается” из “основного тела” программы. На время этой “отлучки”, отработка “основного тела” программы приостанавливается, а после возврата снова возобновляется. Последней командой подпрограммы прерываний всегда должна быть команда retfie, которая используется только для возврата из подпрограммы прерывания. По этой команде, осуществляется возврат по стеку.
И еще одна очень важная “деталь”: в состав подпрограммы прерывания, в обязательном порядке, должна входить команда сброса флага задействованного источника прерываний (или флагов, если таких источников несколько). В нашем случае, используется прерывание по входу RB0/INT, поэтому команда сброса флага должна выглядеть так: bcf IntCon,1. В большинстве случаев, команду (команды) сброса флага (флагов) прерывания помещают непосредственно перед командой retfie.
При
отсутствии команды сброса флага
прерывания, рабочая точка программы,
после ухода в первое прерывания,
начнет неконтролируемо “метаться”
между подпрограммой прерывания
и “основным телом” программы (программа
“уходит в глюк”). Проще говоря,
если флаг прерывания “принудительно”
(программно) не сброшен, то это “воспринимается”
микроконтроллером как
В части касающейся заданного прерывания (т.е. по входу 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. Итак, вычисляемый переход является третьей разновидностью переходов (после условных и безусловных переходов).
Если “привязаться”
к случаю управления сценариями работы
программы с помощью
В
большинстве случаев
В общем виде разберемся с таким понятием как динамическая индикация. Для определенности предположим, что в одном полном цикле индикации результаты кодового преобразования последовательно выводятся на индикацию, начиная с младшего десятичного разряда линейки 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 “привязкой” этих действий к логике программы.
- РЕЗУЛЬТАТЫ ПРОДЕЛАННОЙ РАБОТЫ