1. Нам нужен кварц. Кварц желательно выбрать такой , который бы "делился" без остатка на один из коэффициентов деления таймера (коэффициент деления может быть: 8, 64, 256, 1024) . Очень хорошо для этих целей подходят т.н. "компьютерные" кварцы , например: 8,192 МГц ; 11,592 МГц .
Мы возьмем кварц с частотой : 8, 192 МГц .
2. Выбираем коэффициент деления таймера. Лучше конечно выбирать коэффициент 64 и выше (256, 1024), если конечно позволяет логика программы.
3. Считаем ! Чтобы получить сколько раз "выполнится" переполнение таймера 0 (Timer0) в секунду делим тактовую частоту (значение кварца) на коэффициент деления :
8192000 Гц/64 =128 000 , но переполнение для того и названого переполнение , что прерывание по переполнению будет вызвано , только тогда, когда произойдет переполнение специальной переменной-счетчика TCNT0 (для таймера 0 , из Bascom'а можно напрямую обращаться к ней по имени Timer0 , если нужно) и установиться специальный флаг переполнения , для Timer0 - это 256 (максимально возможное число для 8 бит + 1 ) , а для Timer1 - 65536 (16 бит) , т.е. полученное число надо поделить еще на 256. Итого :
128000/256 = 500 ... вот сколько всего прерываний по переполнению Таймера0 будет вызвано за 1 секунду.
4. Реализация. Сначала конфигурируем Таймер 0 . Итак :
Код: Выделить всё
$crystal = 8192000
Config Timer0 = Timer, Prescale=64
'Но нам надо, чтобы наша процедура выполнялась всего раз в 1 секунду ... Пожалуйста ! Для этого вводим 'дополнительный счетчик.
Dim Ncount as Word
Ncount=0
'А вот процедура самого Таймера0 .
Tim_0:
Incr Ncount
If Ncount = 500 then
Ncount=0
' а далее ваше тело процедуры
end if
ReturnПримечания :
Чтобы это все получить не в разах , а в секундах ... Соответственно надо поделить время на количество. Например : 1 сек = 1000 мс / 500 = 2 мс ... Это время через которое , будет происходить прерывание таймера .. А можно и сразу посчитать , берем коэффициент деления таймера / частоту кварца в кГц * 256 , в виде формулы :
t = Kдел / Fтак * 256 , время получается в миллисекундах ..
На этом все