Вот кусок программы, микроконтроллер 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 или моей программы?
|