Если тактовая частота генератора равна 20 МГц, то время выполнения одного такта равно 0,05 мкс. Время выполнения машинного цикла, состоящего из четырех тактов равно 0,2 мкс. Подсчитаем максимальную величину задержки внутреннего цикла в приведенной ниже программе 1.
Фрагмент одного внутреннего цикла таймера выполняет команду вычитания за два цикла и команду безусловного перехода за 2 цикла, т.е. в сумме за 4 цикла. Максимально во внутреннем цикле может быть выполнено 255 подциклов (предельное значение десятичного числа, которое может быть введено в 8-ми разрядный регистр). При вычитании 255-й раз результат равен 0. В этом случае по условию команды DECF пропускается следующая инструкция и выполняется следующая за ней инструкция, т.е. происходит выход из цикла. Общее время выполнения внутреннего цикла:
255*4*0,2 + 2 *0,2=204,4 мкс
При организации одного внешнего цикла в нем выполняется операция вычитания и две операции безусловного перехода, т.е. 4 цикла + внутренний цикл:
4*0,2 + 204,4 = 205,2 мкс
На основании приведенного примера, подбором числа повторений в каждом цикле, можно рассчитать общее время паузы, созданной таймером.
3 Пример создания программы «АПВ ВЛ» на Assembler для МК PIC16F877A
Задание: разработать программу, реализующую упрощенный вариант работы АПВ ВЛ со следующими исходными данными:
- время паузы 0,1 сек;
- сигнал на включение выключателя ВЛ выдается с 3-го бита PORTC;
- сигнал внешнего прерывания имитировать подачей энергии со 2-го бита
PORTD;
- задержку времени, необходимую для запуска схемы включения выклю-
чателя принять равную 200 подциклам Timer1.
Определение числа циклов и подциклов выполняем последовательно. Вначале проверим, можно ли выполнить такую задержку на втором внешнем цикле.
Nвторого внешнего цикла = 100000/205,2=487
Число подциклов второго внешнего цикла максимально 255. Подсчитаем примерно время второго внешнего цикла:
255*205 = 52275 мкс
Определим примерно число подциклов третьего цикла:
100000/52275 = 2
Приведенный расчет дает нам возможность рассчитывать примерное число подциклов третьего цикла для создания определенной паузы. Предпо-ложим, что нам задана выдержка 1,14 сек. Тогда приближенное количество подциклов третьего цикла определится по формуле:
1140/ 52=22
Программа РГР1
include "p16f877A.inc"
Sch_in EQU H'22'; счетчик внутреннего цикла задержки.
Sch_out equ H'23'; счетчик второго цикла задержки.
Sch3 equ H'24'; счетчик третьего цикла задержки.
org h'00'
nop
nop
nop
org h'05'
Nach
clrf STATUS
clrf PORTC; Очистка регистра порта С
bsf STATUS,5
movlw B'00001111'
movwf TRISB;настроить биты 0-3 PORTB на ввод
clrf TRISC;настроить PORTC на вывод
clrf TRISD;настроить PORTD на вывод
bcf STATUS,5
WaitPush
btfss PORTB,0; Ждать включение тумблера и подачи 1 в RB0-имитация
;отключения выключателя ВЛ
goto WaitPush
call Timer2; пауза АПВ в соответствии с заданием
bsf PORTC,3; подача энергии на бит включения выключателя в
;соответствии с заданием
call Timer1; выдержка, необходимая для включения выключателя
goto Nach
goto $
Timer1
movlw D'200'; для отладки принять 2
movwf Sch_in; устанавливаем значение счетчика.
N_in
decf Sch_in,F; уменьшаем значение счетчика Sch_in на 1.
btfss STATUS,Z; если счетчик Sch_in обнулился, пропускаем GOTO.
goto N_in; срабатывает только при Z=0
return
Timer2
MOVLW d'2';это же значение оставляем для отладки
MOVWF Sch3; значение W является аргументом для таймера.
N3
MOVLW D'255'; для отладки D'2'
MOVWF Sch_out; устанавливаем значение внешнего счетчика.
N_out; метка внешнего счетчика.
MOVLW D'255'; для отладки D'2'
MOVWF Sch_in; устанавливаем значение внутреннего счетчика.
N_in; метка внутреннего счетчика.
DECF Sch_in,F; уменьшаем значение счетчика Sch_in на 1.
BTFSS STATUS,Z; если счетчик Sch_in обнулился, пропускаем GOTO.
GOTO N_in; срабатывает только при Z=0.
DECF Sch_out,F; уменьшаем значение счетчика Sch_out на 1.
BTFSS STATUS,Z; если счётчик обнулился, пропускаем GOTO.
GOTO N_out; инструкция срабатывает только при Z=0.
DECF Sch3,F; уменьшаем значение счетчика Sch3 на 1,
BTFSS STATUS,Z; если оно равно нулю (Z=1), пропускаем GOTO.
GOTO N3; срабатывает только при Z=0.
RETURN; конец подпрограммы Timer2.
End
На рисунке 2 приведена схема включения соединений на УМК-7.
Рисунок 2 – Схема соединений на УМК-7 для РГР №1
На рисунках 3 и 4 приведены PrtSc для данного примера.
Рисунок 3 – Включение выключателя на заданном бите 0 PORTC
Рисунок 4 – На бите 0 PORTC нулевое значение, программа ожидает новый сигнал