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




 

В случае невозможности применения таймеров, например, все они применены в других участках программы, можно осуществить формирование задержки с помощью программных счетчиков. Рассмотрим такой случай.Условия те же – величина задержки 500 мсек. Задержку можно получить за счет создания программного счетчика. Дискрета времени в этом случае равна времени выполнения операции суммирования в каком либо регистре. Поскольку операция суммирования выполняется за один цикл, дискрета времени равна Tclk, т.е. 1мксек, поэтому для получения заданной задержки придется создать программный счетчик с многократным вложением. Максимальная задержка счетчика первого уровня будет равна: T1 = 256 * 1 = 256 мксек, полная задержка двух уровней составит: T2 = 256 * 256 = 65536 мксек., полная задержка трех уровней составит: T3 = 65536 * 256 = 16777216 мксек.

Таким образом для получения задержки в 500 000 мксек достаточно выполнить

500 000 / 65536 = 7,629 циклов на третьем уровне. Принимаем 8 циклов, второй уровень также обеспечивает полную задержку, а разность:

65536 * 8 – 500 000 = 24 288 мксек будем компенсировать на других уровнях.

Второй уровень уменьшит величину компенсации в 256 раз, поэтому окончательно для первого уровня получим:

:

(65536 -24288) / 256 = 161,125 или в шестнадцатиричной системе = АВ.

Разность первого уровня незначительна, ею можно пренебречь, тогда для первого уровня принимаем полное значение содержимого регистра: FF. И программа формирования задержки будет иметь вид:

#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 =0; perep2 < 0xAB; perep2++) {

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

}

}

}

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

} //конец main

Программирование задержки можно осуществить и путем использования специальной функции delay, например, void delay xx; где: xx – величина задержки в миллисекундах.


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

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

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

 

 

 

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

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

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

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

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

:

Таблица 18.

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

 

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

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

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

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

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

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

 

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

 

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

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

 

Подрежимы работы модуля устанавливаются разрядами <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 фиксируется установкой флага прерываний, который после отработки подпрограммы прерывания должен быть сброшен программным способом.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-02-25 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: