Вот кусок программы, микроконтроллер ATmega8, частота кварца 16 Мгц.
.include "m8def.inc"
;r31 - temp
rjmp init
.org $09
rjmp TIMER0_OVF
;конфигурирование
init:
;инициализация стека
ldi r31,HIGH(RAMEND)
out SPH,r31
ldi r31,LOW(RAMEND)
out SPL,r31
;конфигурирование таймера 100 мс
ldi r31, (1<<TOIE0) ;разрешение прерывание
out TIMSK, r31 ;по переполнению счетчика
ldi r31, $64 ;Устанавливаем переполнение
out TCNT0, r31 ;каждые 10 ms
ldi r31, (1<<CS02) | (1<<CS00) ; CK/1024 = 15625 Hz = 0,064 ms
out TCCR0, r31
sei ;разрешение глобальных прерываний
ldi r30, 10 ;количество переполнений
;основная часть
start:
rjmp label
TIMER_100ms:
nop
TIMER0_OVF:
dec r30
breq TIMER_100ms
ldi r31, 82 ;дополнительная задержка
TIMER0_OVF_1:
dec r31
brne TIMER0_OVF_1
;конфигурирование таймера 100 мс
ldi r31, (1<<TOIE0) ;разрешение прерывание
out TIMSK, r31 ;по переполнению счетчика
ldi r31, $64 ;Устанавливаем переполнение
out TCNT0, r31 ;каждые 10 ms
ldi r31, (1<<CS02) | (1<<CS00) ; CK/1024 = 15625 Hz = 0,064 ms
out TCCR0, r31
reti
На базе TIMER_COUNTER_0 выполнена задержка 100 мс, т.к. максимум переполнения счетчика могут
происходить через каждые 16 мс, время переполнения поставлено 10 мс, и переполнения
выполняются 10 раз.(TIMER_COUNTER_1 нужен для других целей, поставить частоту кварца меньше
нельзя).
Эмулирую все это дело на AVR STUDIO 4.12 (пробовал 4.11, 4.05, 3.56), первое переполнение
происходить как надо через 10 мс, а последующие через 9,98 мс.
Не знаю что это, глюк AVR STUDIO или моей программы?