Программирование задержки без использования таймеров

 

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

счетчика показана на рис.

 

   

 

 

Уст.сч.1
Уст.сч.2
Уст.сч.1

 


С

Ввод исходных данных
Сч.1=FF? &&
Сч2=FF?
Сч.2 -1
Сч3.=ХХ?
Сч.1-1
Сч.3-1
нет
да
нет
да
нет
да

 

 

 


 Рассмотрим такой случай. Условия те же – величина задержки 500 мсек. Задержку можно получить за счет создания программного счетчика.  Время заполнения программного счетчика определяется как сумма времен запрограммированных операций. Основной операцией в данном случае является простое прибавление единицы к содержимому счетчика, после чего должна быть операция контроля достижения заданного значения счетчика. Поэтому общее время равно времени выполнения минимум двух операций. В микроконтроллерах PIC16F873 (887) при частоте генератора 4мггц время выполнения  указанных операций – Tclk – составляет 1мксек. Максимальная задержка счетчика первого (низшего) уровня будет равна: 

 

     T1 = 256 * 1*2 = 512мксек

Таким образом счетчик второго уровня заполняется с периодом Т1.

         

Поскольку время выполнения операций суммирования на втором уровне также составляет 2 мксек, то этим временем можно пренебречь. Тогда максимальное время задержки на двух уровнях программного счетчика составит:

  

Т2 = Т1*256 =  131072 мксек

    

Тогда с помощью счетчика третьего уровня можно осуществить задержку за счет следующего числа циклов работы:

 

500 000 / 131072 = 3,81

 

  Принимаем 4 цикла, вследствие чего общее время задержки составит:

 

Т3 = 131072 * 4 = 524288 мксек.

 

То есть необходимо компенсировать 24288 мксек. Это число можно распределить по разным уровням. На каждом цикле третьего уровня можно компенсировать:

 

 24288 / 4 = 6072 мксек.

Если первый уровень использовать для деления полностью (до состояния счетчика FF), то на втором уровне необходимо компенсировать:

 

 6072 / 512 = 12 или в шестнадцатиричной системе: 0C.

И программа формирования задержки  c помощью трехуровнего программного счетчика будет иметь вид:

#define XTAL_FREQ 4MHZ

 #define byte            unsigned char

#define word              unsigned int

 

#include <pic.h>

#include <stdio.h>

__CONFIG(HS & WDTDIS & PWRTEN & LVPDIS & DUNPROT & WRTEN);модуль

 

 char perep1;   // программный счетчик первого уровня

 char perep2;  // программный счетчик второго уровня

 char perep3;  // программный счетчик третьего уровня

 

void main() {

TRISC = 0x00;            // порт С на выход

PORTC = 0x01;           // включение индикатора начала задержки

for (perep3 =0; perep3 < 0x08; perep3++) {

for (perep2 =0x0B; perep2 < 0xFF; perep2++) {

for (perep1 =0; perep1 < 0xFF ; perep1++) {

}

}

     }

PORTC = 0x00;          // выключение индикатора

        } //конец main

 

 
 

2.2 . Модуль ССР.

Функциональный модуль ССР может работать в одном из трех режимов: захват, сравнение и широтно-импульсный модулятор (ШИМ). В микроконтроллере PIC16F873 имеется два модуля: ССР1 и ССР2. Рассмотрим работу модуля ССР1.

2.2.1. Режим «захват»: Структурная схема модуля в этом режиме показана на рис. 11 

 

 

 
 

RC2
Предделитель.
CCPRH
CCPRL
TMR1H
TMR1L
Выбор фронта
Разрешить
захват
Рис.12. Структурная схема модуля ССР1.

Принцип работы модуля заключается в следующем: Предварительно запускается в работу таймер TMR1 в режиме синхронного счетчика. При поступлении на вход RC2 сигнала от какого либо внешнего источника содержимое счетчика таймера (регистры TMR1H – старший байт, TMR1L – младший байт) переписывается в регистр модуля ССР1 (регистры CCPR1H– старший байт, CCPR1L– младший байт). Одновременно формируется флаг прерывания –CCP1IF от модуля CCP1 (см. раздел «регистры состояния …» - разряд 2 регистра PIR1). По этой команде содержимое регистра модуля должно быть прочитано, а флаг прерывания программно сброшен. Если содержимое регистра не будет прочитано, то оно будет потеряно при приходе следующего входного импульса. Содержимое счетчика таймера TMR1 не изменяется (таймер продолжает счет)

 Перед началом работы модуля ССР1 его необходимо настроить, для чего выполняются следующие операции:

- настройка и пуск таймера TMR1 (см. раздел «Таймеры» ),

- настроить вывод RC2 микроконтроллера на вход (записать 1 в разряд 2 регистра TRISC – адрес 87h),

- запрограммировать регистр CCP1CON в соответствии с выбранным режимом (см. таблицу 18

:

                                                                                                                     Таблица 21.

Номера разрядов 3 2 1 0
Обозначение сигналов CCO1M3 CCP1M2 CCP1M1 CCP1M0

 

С помощью разрядов 3 – 0 регистра CCP1CON (адрес 17h, 1Dh) задаются следующие режимы работы модуля:

0000 – модуль выключен (сброшен),

0100 – модуль включен, захват по каждому заднему фронту входного сигнала,

0101 – модуль включен, захват по каждому переднему фронту входного сигнала,

0110 – модуль включен, захват по переднему фронту каждого 4-го входного сигнала,

0111 – модуль включен, захват по переднему фронту каждого 16-го входного сигнала

 

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

 



Режим сравнения.

В этом режиме производится сравнение содержимого регистра модуля с содержимым счетчика таймера TMR1. При совпадении этих данных формируется сигнал прерывания –CCP1IF ( устанавливается «1» во втором разряде регистра PIR1) и в зависимости от выбранного подрежима устанавливается соответствующий сигнал на выводе RC2. Структурная схема модуля ССР1 в этом режиме показана на рис. 12.  

Триггер специального назначения  
Логика
Флаг CCP1IF
CCPR1H
CCPR1L
         Сравнение
Равноо
S Q R
RC2
TRISC<2>
Выбор режима
TMR1H
TMR1L
Рис. 13. Структурная схема модуля ССР1 в режиме сравнения.

 

Подрежимы работы модуля устанавливаются разрядами <3:0> регистра CCP1CON:

 

1000 – сравнение, вывод RC2 = 1, устанавливается флаг прерывания CCP1IF,

1001 – сравнение, вывод RC2 = 0, устанавливается флаг прерывания CCP1IF,

1010 – сравнение, вывод RC2 не меняется, устанавливается флаг CCP1IF,

1011 – сравнение, устанавливается триггер специальных функций, устанавливается флаг прерывания CCP1IF, сбрасывается счетчик таймера TMR1.

Настройка модуля в этом режиме производится в следующей последовательности:

- настройка вывода RC2 на выход («0» во 2-ой разряд регистра TRISC),

-настройка таймера TMR1,

- выбор подрежима установкой разрядов 3-0 регистра CCP1CON.

Момент совпадения содержимого счетчиков модуля и таймера TMR1 фиксируется установкой флага прерываний, который после отработки подпрограммы прерывания должен быть сброшен программным способом.

 

Дата: 2019-04-23, просмотров: 4.