44952

Автоколебательный мультивибратор

Реферат

Информатика, кибернетика и программирование

Проанализируем нашу программу, реализующую функцию автоколебательного мультивибратора, с одним выходом. Форма сигнала меандр (скважность, т.е. отношение периода к длительности импульса – 2). Под этот выход можно назначить любой из выводов порта А или В...

Русский

2013-11-14

33.87 KB

3 чел.

  1.  Автоколебательный мультивибратор

Составим программу формирования прямоугольных сигналов вида меандр с частотой 5 kHz на основе микроконтроллера PIC16F84A.

; Multivibrator Meander 5.0 KHz

;========================

; Microcontroller PIC16F84A

; Clock Frequency 4.0 MHz

;========================

Sec  equ  0Ch

;-----------------------------------------

org  0

goto  Start

;-----------------------------------------

Start  bsf  Status,5

movlw .0

movwf TrisB

bcf  Status,5

movlw .32

movwf Sec

bcf  PortB,0

nop

nop

;-----------------------------------------

Pause_0 decfsz Sec,F

goto  Pause_0

movlw .30

movwf Sec

bsf  PortB,0

nop

nop

;-----------------------------------------

Pause_1 decfsz Sec,F

goto  Pause_1

goto  Start

;-----------------------------------------

end

Проанализируем нашу программу, реализующую функцию автоколебательного мультивибратора, с одним выходом. Форма сигнала  меандр (скважность, т.е. отношение периода к длительности импульса – 2). Под этот выход можно назначить любой из выводов порта А или В, в программе для этого выбран вывод RB0 порта В. Следовательно, необходимо установить режим работы вывода RB0 “на выход”.

В верхней части расположен так называемый “заголовок” программы. В нем в первую очередь указывается название проекта (т.е. моделируемого устройства), тип микроконтроллера (в данном случае, PIC16F84A) и частота тактового генератора, подключаемого к микроконтроллеру.

В следующей строке осуществляется присвоение имен используемым в программе регистрам общего назначения (в нашем случае – регистру, размещенному по адресу 0Ch). Этот регистр будет участвовать и в процессе формирования нулевого уровня, и в процессе формирования единичного уровня, он необходим для реализации задержки на 100 мкс. Для обеспечения такой малой задержки, достаточно одного регистра общего назначения.

Далее располагается директива, определяющая адрес размещения первой команды программы и команда перехода на начало исполнения программы (обычно, goto  Start). Так как команда goto Start расположена сразу же после директивы org 0 (у команды goto Start нулевой адрес в памяти программ), то с этой команды и начнется исполнение программы.

Тип микроконтроллера, присвоение имен регистрам, разрешение на начало выполнения программы и ориентир конца программы) вводятся так называемыми директивами (не путать с командами программы).

Для более сложных программ, “заголовок”, конечно же, более “объемен”, и он содержит в себе большее количество “поименованных” регистров и директив (в том числе и других типов).

Установка работы выводов RB0 “на выход” или “на вход” назначается с помощью регистра TrisB. Ввиду того, что этот регистр размещен в 1-банке, необходимо осуществить переключение банков (после инициализации микроконтроллера (т.е. по умолчанию), автоматически устанавливается 0-й банк). Для этого нужно установить 5-й бит регистра Status в единицу. Это реализуется командой bsf Status,5. Так как направления работы выводов порта В RB1…RB7 нас не интересуют (они не задействованы), то проще всего установить все биты регистра TrisB в ноль (все выводы порта В работают “на выход”), то есть, записать в этот регистр константу 0 (по умолчанию, все выводы портов настроены на работу “на вход”). Так как напрямую записать константу в регистр (любой) нельзя, то “транспортировка” этого нуля, в регистр TrisB, производится через аккумулятор (через регистр W), что Вы и видите в тексте программы (movlw .0 и movwf  TrisB). В этом случае, задействованы байт-ориентированные команды.

Другой способ: можно было задействовать бит-ориентированную команду bcf. В этом случае, в ноль устанавливаются не все биты регистра TrisB, а только бит с номером ноль: bcf  TrisB,0 (сброс нулевого бита регистра TrisB в 0). На практике, чаще применяется первый вариант, так как в тех случаях, когда нужно перенастроить направления работы более 2-х выводов портов (такие случаи часты), можно обойтись минимальным количеством команд.

Итак, теперь вывод RB0 работает “на выход”, т.е. к нему подключен выход “своей” защелки. Так как дальнейшие “манипуляции” будут производиться в нулевом банке, то возвращаемся в нулевой банк (устанавливаем 5-й бит регистра Status в 0: bcf   Status,5).

Все перечисленные выше операции, можно считать подготовительными.

Форма сигнала “меандр” предполагает одинаковое время формирования этих уровней. В нашей программе это время выбрано равным 100 мкс.

“Выстраиваем упрощенный скелет” программы. После перевода вывода RB0 на работу “на выход” на этом выводе в течение 100 мкс., необходимо формировать нулевой уровень, а затем в течение 100 мкс., формировать единичный уровень. После этого осуществляется переход на новый, полный цикл программы, то есть, на команду Start,  и так до “бесконечности” (пока питание не будет выключено).

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

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

В подпрограмме формирования нулевого уровня в регистр Sec заложено число (константа) .32. Рабочая точка программы войдя в подпрограмму задержки, не выйдет из нее до тех пор, пока задержка не будет полностью отработана. Смысл этой “закольцовки” заключается в том, что при выполнении команды decfsz и отсутствии нулевого результата операции декремента, переход, в конечном итоге, происходит на все ту же команду decfsz и все повторяется по новой, пока число в регистре не уменьшится до нуля. Вот и есть задержка. При нулевом результате операции, рабочая точка программы выходит из подпрограммы задержки и программа исполняется далее.

Зная длительность машинного цикла, можно точно просчитать время задержки. Для того чтобы осуществить декремент (или инкремент) содержимого регистра Sec, необходимо сначала определиться с его содержимым (какую “начальную точку отсчета” задавать?).

В нашем случае в регистр Sec записывается число .32. Число .32 (точка - атрибут десятичной системы исчисления) является константой (которая задается программистом).

“Напрямую” записать это число в регистр Sec (и вообще, в любой регистр) нельзя. Эта операция осуществляется через “посредника” в виде регистра W (movlw .32 и movwf Sec).

Точно таким же образом, как описано выше, для формирования на выводе RB0 единичного уровня, происходит запись в регистр Sec следующей константы (число .30).

Итак, все готово для управления защелкой RB0 порта В. Формируем нулевой уровень на выводе RB0. Применяем для этого бит-ориентированную команду bcf и указываем в ней нулевой бит регистра PortB, который нужно сбросить в 0 (bcf   PortB,0). На выводе RB0, ноль зафиксируется до тех пор, пока мы его не заменим на 1.

Теперь нужно сделать так, чтобы с момента установки, на выводе RB0, нуля и до момента смены этого нуля на единицу, прошло ровно 100 мкс. Предположим, что с учетом того, что в регистр Sec, ранее была записана “нужная” константа (.32), этот интервал времени сформирован.

Установка, на выводе RB0, единицы происходит так же, как и установка нуля, только применяется команда bsf (bsf PortB,0). Точно таким же образом, как описано выше, для формирования, на выводе RB0, единичного уровня, происходит запись, в регистр Sec, следующей константы.

Давайте разберемся, почему числовое значение константы, обеспечивающей формирование нулевого уровня, должно быть именно .32.

Применяется кварц на 4мГц., следовательно, один машинный цикл равен 1мкс. Таким образом, с момента установки на выводе RB0 нуля и до смены его на единицу должно пройти 100 машинных циклов. Подпрограмма задержки Pause_0 - циклическая. Если результат декремента содержимого регистра Sec не равен нулю, то один “виток” этой подпрограммы будет отработан за 3 машинных цикла: команда decfsz выполняется за один м.ц., а команда goto - за два. Таким образом, уменьшение содержимого регистра Sec на единицу происходит за 3 м.ц. (3 мкс.). Если результат декремента содержимого регистра Sec равен нулю, то команда goto не исполняется, и выход из подпрограммы Pause_1 происходит за 2 м.ц. Следовательно, константе .32 соответствует 32х3-1=95 м.ц. (95мкс.).

К 95-ти, плюсуем 2 м.ц. двух команд nop, 2 м.ц. команд установки константы в регистр Sec для формирования времени единичного уровня на выводе RB0 (movlw .30 и movwf Sec) и 1 м.ц. команды установки, на выводе RB0, единицы (bsf   PortB,0). Получаем ровно 100 мкс.

Теперь о двух командах nop, которые стоят перед подпрограммой Pause_1. Если сделать константу равной .33-м, то получится неустранимый “перебор”. Если константа равна .32-м, то получается устранимый “недобор” в 2 мкс., который устраняется добавлением двух команд nop (дополнительная задержка на 2 мкс.).

После того, как результат декремента содержимого регистра Sec станет равным нулю, рабочая точка программы выйдет из этой "закольцовки" по сценарию “программа исполняется далее”.

Различие числовых значений констант (.32 и .30) при формировании нулевого и единичного уровней, объясняется тем, что при формировании, на выводе RB0, единичного уровня, исполняется команда goto (2 м.ц.) и команды подпрограммы Start (в конце текста программы, осуществляется безусловный переход в подпрограмму Start).

Наш случай, конечно, простейший, так как для относительно больших задержек, при длительности машинного цикла 1 мкс (кварц 4 Мгц.), одного регистра не достаточно (необходимо несколько регистров с последовательным их декрементом).


 

А также другие работы, которые могут Вас заинтересовать

66858. Архитектура ЭВМ. Взаимодействие подсистем ЭВМ через магистраль. Структура магистрали 120.89 KB
  Шина данных шина предназначенная для передачи информации. На материнской плате шина может также состоять из множества параллельно идущих через всех потребителей данных проводников например в архитектуре IBM PC. Основной характеристикой шины данных является её ширина в битах.
66861. Экономика пожарной безопасности 51.89 KB
  Особенностями пожаров на металлургических предприятиях являются: быстрое распространение огня в маслопроводах кабельных туннелях и этажах транспортерных галереях на покрытиях большой площади и в системах гидравлики высокого давления...
66863. Створення додатку для роботи з базою даних 616.5 KB
  Створення бази даних База даних буда створена у СУБД MS SQL Server 2000 згідно до обраної предметної області пункт прийому сировини шляхом генерації з фізичної моделі побудованої за допомогою Erwin згідно методичних вказівок. Отриманий результат має вигляд...
66865. GREAT BRITAIN AND THE UNITED KINGDOM. THE SYSTEM OF GOVERNMENT IN THE UK 80.5 KB
  The British Isles today are shared by two separate and independent states. The smaller of these is the Republic of Ireland, with its capital in Dublin. The larger, with London as its capital, is the United Kingdom of Great Britain and Northern Ireland.