Использование встроенного таймера в PIC16F628A
Регистры таймера:
* TMR0H (адрес 0x01): Старший байт 8-битного регистра счетчика таймера
* TMR0L (адрес 0x00): Младший байт 8-битного регистра счетчика таймера
* INTCONbits.TMR0IF (адрес 0x0B, бит 5): Флаг прерывания таймера
Прерывания таймера:
* Прерывание Timer0 (TMR0) срабатывает при переполнении регистра таймера (TMR0L:TMR0H = 0xFFFF). По умолчанию прерывание отключено.
Настройка таймера:
1. Включите тактовый модуль при записи 1 в бит SCS1 регистра OSCCON (адрес 0x02).
2. Выберите источник тактового сигнала таймера, записав соответствующее значение в биты T0CS регистра OPTION_REG (адрес 0x81):
* 00 = Внутренний тактовый сигнал (от генератора часов)
* 01 = Внешний тактовый сигнал (от вывода T0CKI)
* 10 = Запущен с вывода T0CKI
* 11 = Остановить
3. Установите прескалер таймера, записав соответствующее значение в биты PSA и PS регистра OPTION_REG :
* PSA = 0, PS = 000 = 1:1
* PSA = 0, PS = 001 = 1:2
* PSA = 0, PS = 010 = 1:4
* PSA = 0, PS = 100 = 1:16
* PSA = 0, PS = 101 = 1:32
* PSA = 0, PS = 110 = 1:64
* PSA = 0, PS = 111 = 1:128
* PSA = 1 — Режим 8-ми разрядного таймера
Использование таймера:
1. Сбросьте регистр счетчика таймера, записав 0 в TMR0L и TMR0H .
2. Запустите таймер, записав 1 в бит TMR0ON регистра OPTION_REG .
3. Для прерывания по переполнению включите бит TMR0IE в регистре INTCON (адрес 0x0B).
Пример кода:
«`c void main() { // Сброс таймера0 // Запуск таймера0 while (1) { Обработчик прерывания: «`c // Сброс флага прерывания таймера
include
// Настройка таймера0
TRISB = 0x00; // Выводы порта B как выходы
OSCCON = 0x60; // Внутренний генератор (8 МГц)
OPTION_REG = 0x07; // Таймер0, внутренний тактовый сигнал, прескалер 1:128
INTCON = 0x90; // Включение прерываний таймера0 (по переполнению)
TMR0L = 0;
TMR0H = 0;
TMR0ON = 1;
// Ваш код здесь
}
}
«`
void interrupt timer0_isr() {
// Ваш код обработки прерывания здесь
TMR0IF = 0;
}
«`