Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное_пособие.doc
Скачиваний:
70
Добавлен:
10.11.2019
Размер:
8.13 Mб
Скачать

5.7 Часы

Для реализации функции часов необходимо сформировать временной интервал длительностью в 1 сек. Временной интервал целесообразно формировать с помощью таймера/счетчика Т1 в режиме сброса по совпадению.

В соответствие с формулой (8), которая справедлива для любого таймера, при условии равенства коэффициента деления входного делителя значению 1024 и при тактовой частоте равной 16 мГц, получим значение в регистре совпадения для интервала в 1сек:

OCR1А = tинттакт * К = 1*24*106*2-10 = 56 = 15625.

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

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

Так как код четвертого режима (сброса по совпадению Т1) равен 0100, то младшие разряды его установлены в регистре TCCR1A по умолчанию.

.ORG 0

RJMP BEGIN

.ORG $C ;Адрес вектора прерывания по совпадению Т1

RJMP T1_COMP

BEGIN: LDI R16,3

OUT SPL,R16

LDI R16,$FF

OUT SPH,R16

LDI R16,0 ;Обнуление ячеек дисплея

STS $0068,R16

STS $0069,R16

STS $006A,R16

STS $006B,R16

SEI ;Общее разрешение прерываний

LDI R16,0B00010000;Разрешение прерываний сброса по совпадению Т1

OUT TIMSK,R16 ;

LDI R16,$3D ;3D09 = 15625 – константа задержки, соответствующая

OUT OCR1AH,R16 ;интервалу 1сек. К=1024,Fтакт=16мГц

LDI R16,9 ;

OUT OCR1AL,R16 ;

LDI R16,0B00001101;Режим сброса по совпадению Т1(4-й т.е.0100),

OUT TCCR1B,R16 ; К=1024 и пуск таймера

;*********Далее обработчик дисплея********

.

.

.

;***Подпрограмма прерываний по совпадению в Т1. Вызывается каждую секунду***

T1_COMP: LDS R22,$68 ;Ед. сек. в регистр

Inc r22 ;Увеличить значение единиц секунд

STS $68,r22 ;Новое значение в ячейку

CPI r22,10 ;Сравнить значение ед. сек. с 10

Brne Q_reti ;Если не равно 10, то выход из п/п по метке

Ldi r22,0 ;Если 10, то обнулить регистр

STS $68,R22 ;и копию в ячейку

.

. ;Аналогично с другими ячейками дисплея

. ;для десятков секунд, единиц и десятков минут

Q_RETI: RETI

5.8 Измерение временных параметров импульсов

Используется цифровой способ измерения периода импульсов: подсчет числа временных импульсов с эталонным периодом за время длительности измеряемого периода. При измерении периода импульсов с помощью таймера Т1 в режиме захвата требуются минимальные программные ресурсы, поэтому этот способ является предпочтительнее других. Таймер Т1 должен быть настроен в режим захвата с помощью регистра TCCR1B и на выполнение функции таймера. Значение коэффициента деления входного делителя частоты выбрать равным 8. При частоте тактового генератора 16мГц на вход таймера будут поступать импульсы с периодом 0,5мкс. Так период импульсов может быть определен как разность между соседними фронтами или срезами, то соответственно выбирается тип входа захвата (фронт или срез).

Рисунок 63

После включения таймера он начинает счет времени в единицах 0,5мкс. В режиме захвата фронтом измеряемого импульса содержимое таймера (время первого фронта tf1) аппаратно помещается из таймера в регистр захвата ICR1 и вызывается подпрограмма (предварительно прерывания по захвату разрешены), в которой необходимо освободить ICR1 в два регистра РОН. Таймер продолжает счет времени и в момент второго фронта tf2 фиксируется его время наступления в том же регистре захвата и опять вызывается подпрограмма прерывания. Теперь в ней период вычисляется как разность Т= tf2 - tf1.

Так как вход в подпрограмму прерываний производится два раза и, каждый раз выполняются в ней различные действия, то необходимо идентифицировать эти входы. Это может быть осуществлено проверкой значения бита Т в регистре состояния SREG в начале подпрограммы обработки прерываний. Исходное значение этого бита нулевое. Тогда при проверке, если его значение равно нулю, то это первый вход в подпрограмму. Следовательно, нужно сохранить содержимое ICR1, установить бит Т в единице и произвести выход из подпрограммы обработки прерываний. Если значение бита Т равно единице (зафиксировано время второго фронта), то необходимо остановить таймер Т1, запретить прерывание по захвату и выполнить вычитание для получения значения периода.

Значение периода после вычитания получится в единицах по 0,5мкс. Для перевода значения периода в микросекунды необходимо разделить полученное значение на 2. Для этого можно использовать сдвиг вправо значения в двух регистрах.

Для измерения длительности положительного импульса необходимо при первом входе в подпрограмму прерывания по захвату перенастроить вход захвата ICP на захват по срезу импульса.

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

.include "m16def.inc"

.org 0

rjmp start

.org $a ;адрес вектора прерывания по захвату Т1

rjmp save

start: ldi r16,4;

out sph,r16

ldi r16,0х5F

out spl,r16

sei ;Общее разрешение прерываний

ldi r16,$20;Разрешение прерывания по захвату Т1

out timsk,r16

ldi r16,0b01000010;Захват по фронту, вх. частота Т1 равна 2мГц

; или период вх. импульсов равен 0,5мкс

out tccr1b,r16

loop: rjmp loop

save: brts save1 ; если бит Т установлен, то второй вход в ПП, иначе

in r1,icr1l ; первый вход и сохраняем момент времени

in r2,icr1h ;первого фронта tf1

set ;установить бит Т

reti

save1: clt

ldi r29,$0 ;Остановить таймер Т1

out tccr1b,r29

out timsk,r29 ;Запретить прерывание по захвату

in r19,icr1l ; Момент времени второго фронта tf2

in r25,icr1h

sub r19,r1;Вычитание Т= tf2 - tf1. Значение периода в 0,5 мксекундах

sbc r25,r2

LSr r25 ;Деление на 2, для получения периода в микросек

ROr r19

ldi r24,50 ;Задержка перед следующим измерением

m2: ldi r27,250

m3: ldi r26,250

m4: dec r26

brne m4

dec r27

brne m3

dec r24

brne m2

sbr r16,0B00100000 ;Сброс флага прерывания по захвату

out tifr,r16

ldi r16,0b01000010;Включение Т1 для след. измерения

out tccr1b,r16

ldi r16,$20 ; Разрешение прерывания для след. измерения

out timsk,r16

sei

reti