
6.1.4.1 Вивід імпульсних сигналів з використанням таймерів-лічильників
У разі жорстких вимог до використання часу виконання основної програми мікроконтролера для формування імпульсних сигналів застосовують таймери-лічильники.
Звичайно за допомогою таймерів вирішують наступні типи задач:
Формування тривалості затримки;
Формування імпульсів з заданою тривалістю;
Формування імпульсів з заданими тривалістю та періодом повторення.
Загальний алгоритм вирішення перших двох задач передбачає ініціалізацію обраного таймеру на реалізацію часу затримки, налаштування системи переривань та запуск таймеру.
Відмінності починаються у підпрограмі переривань. У першому випадку у підпрограмі переривань вимикається таймер. У другому випадку – виконуються також процедури маніпуляції з лініями портів, де формуються сигнали.
При вирішенні третього типу задач використовують PWM режим роботи. За рахунок ініціалізації таймера можливе безперервне формування PWM- сигналу на певних портах мікроконтролера.
Розглянемо два приклади реалізації задач другого та третього типів.
Приклад 4.1
У цьому прикладі забезпечується формування на лінії порту LED2 негативного імпульсу тривалістю 2с. Необхідна тривалість затримки забезпечується вибором коефіцієнту попереднього подільника 1/1024 таймера ТС1 та завантаженням у робочі регістри TCNT1 відповідного початкового значення.
;------------------------------------------------------------------
;Файл lab4.asm, приклад 2
;Процесор ATmega16-16PI, частота 10 МГц
;------------------------------------------------------------------
.include "m16def.inc" ;Файл опису процесора
;------------------------------------------------------------------
.equ ini_DDRA =0b11110000 ;1-передача, 0-прийом
.equ ini_PORTA =0b11000000 ;початковий стан порту PА
.equ LED2 =7 ;лінія керування світлодіодом VD2 (L_активна)
;------------------------------------------------------------------
.def TMP =R16 ;символічне ім`я регістру R16
;------------------------------------------------------------------
.equ TC1_ON_1024=0b00000111 ;вмикання ТС1/1024
.equ TC1_OFF=0 ;вимкнення ТС1
.equ count_2s = (0xffff-19531) ;затримка на 2 секунди до переривання (подільник /1024)
;------------------------------------------------------------------
;------------------------------------------------------------------
.CSEG
.ORG $0000
rjmp init ;Вектор розгалуження при рестарті
.ORG OVF1addr
rjmp INT_TC1_OVF ;Вектор переривань переповнення таймера ТС1
;------------------------------------------------------------------
.ORG $0030
init:
; Ініціалізація портів
ldi TMP,ini_DDRA ;визначення типу ліній порту PA - прийом/передача
out DDRA,TMP
ldi TMP,ini_PORTA ;визначення початкового стану ліній порту
out PORTA,TMP
; Ініціалізація стеку
ldi TMP,high(RAMEND) ;завантаження адреси початку стеку
sts SPH,TMP
ldi TMP,low (RAMEND)
sts SPL,TMP
; Ініціалізація таймера ТС1
ldi TMP,high(count_2s) ;завантаження ТС1 на затримку 2 секунди
out TCNT1H,TMP
ldi TMP,low(count_2s)
out TCNT1L,TMP
ldi TMP,(1<TOIE1) ;дозвіл переривань переповнення ТС1
out TIMSK,TMP
;-------
sei ;загальний дозвіл переривань
;------------------------------------------------------------------
;------------------------------------------------------------------
;Основна програма
;------------------------------------------------------------------
MAIN:
cbi PORTA,LED2 ;початок формування імпульсу на лінії LED2
ldi TMP,TC1_ON_1024 ;вмикання ТС1 з попереднім подільником 1/1024
out TCCR1B,TMP
MAIN1:
rjmp MAIN1
;------------------------------------------------------------------
;------------------------------------------------------------------
;Підпрограма переривань переповнення ТС1
INT_TC1_OVF:
sbi PORTA,LED2 ;кінець формування імпульсу на лінії LED2
ldi TMP,TC1_OFF ;вимкнення таймера ТС1
out TCCR1B,TMP
reti
;------------------------------------------------------------------
.exit
Приклад 4.2
У цьому прикладі забезпечується формування на лінії порту PWM (PD4 – OC1B) періодичної послідовності позитивних імпульсів з алгоритмом утворення “Fast PWM”.
Використана секція “В” таймера ТС1, попередній подільник 1/256. Реалізовано режим “Fast PWM”, 8 розрядів, порт встановлюється в «1» на інтервалі формування імпульсу.
Параметри імпульсів:
Частота імпульсної послідовності – 152,6 Гц. Частота визначається наступним чином
FOC=fCLK / (N*TOP),
де fCLK – частота генератора мікроконтролера; N – коефіцієнт ділення попереднього подільника; TOP – модуль рахування. Для 8-бітової “Fast PWM” величина TOP складає 256.
Тривалість – 3,25мс. Константа завантаження регістру OCR визначається у результаті співставлення константи, що відповідає за період («0» відповідає тривалості періоду 6,5 мс), та модулю рахування ТС1 (TOP =256).
Точність PWM – 8 біт.
;------------------------------------------------------------------
;Файл lab4.asm
;Процесор ATmega16-16PI, частота 10 МГц
;------------------------------------------------------------------
.include "m16def.inc" ;Файл опису процесора
;------------------------------------------------------------------
.equ ini_DDRD= (1<PD4) ;0b00010000 1-передача, 0-прийом
;------------------------------------------------------------------
.def TMP =R16 ;символічне ім`я регістру R16
;------------------------------------------------------------------
;Константи ініціалізації ТС1, секція "В", режим ""Fast PWM" 8 біт
;WGM10=WGM12=1 - 8 біт PWM
;COM1B1=COM1B0=1 - порт встановлюється в "1" після зрівняння
;CS12=1 - ТС1 увімкнено, попередній подільник 1/256
.equ ini_TCCR1A=(1<COM1B1)|(1<COM1B0)|(1<WGM10)
.equ ini_TCCR1B=(1<CS12)|(1<WGM12)
.equ ini_TCNT1=0 ;константа завантаження періоду 6,5мс
.equ ini_OCR1B=(0x00ff-127) ;константа завантаження тривалості імпульсів 3,25мс
;------------------------------------------------------------------
;Програма
;------------------------------------------------------------------
.CSEG
.ORG $0000
init:
; Ініціалізація портів
ldi TMP,ini_DDRD ;визначення типу ліній порту PA - прийом/передача
out DDRD,TMP
; Ініціалізація таймера ТС1
ldi TMP,high(ini_TCNT1) ;завантаження в ТС1 періоду
out TCNT1H,TMP
ldi TMP,low(ini_TCNT1)
out TCNT1L,TMP
ldi TMP,high(ini_OCR1B) ;завантаження в ТС1 тривалості імпульсів
out OCR1BH,TMP
ldi TMP,low(ini_OCR1B)
out OCR1BL,TMP
ldi TMP,ini_TCCR1B ;ініціалізація режиму роботи
out TCCR1B,TMP
ldi TMP,ini_TCCR1A ;ініціалізація режиму роботи, включення PWM
out TCCR1A,TMP
;------------------------------------------------------------------
;------------------------------------------------------------------
;Основна програма
;------------------------------------------------------------------
MAIN:
rjmp MAIN
;------------------------------------------------------------------
.exit