Цитата(BVU @ Aug 17 2005, 18:01)
Всем, привет!
Для mega8 пытаюсь сделать прерывание по сравнению - используя 16-bit timer-B. Выполняю инициализацию, таймер начинает работать увеличивая программный счетчик в теле своего прерывания, но работа идет явно не по сравнению константного значения, а как бы по переполнению... Почему такие выводы спросите вы, потому что при изменении константы в регисте сравнения в два раза - частота прерываний не меняется...

. По всей видимости где-то, что-то я не доглядел или непонял.
Привожу пример своего кода:
void InitTimers(void)
{
/* Initialization Timer1 */
OCR1B = QUARTER_sec; // Set compare value on one second.
TIMSK = (1 << OCIE1B); // Set mask to enable Timer1B compare interrupt.
TCCR1B = ((1 << CS12) | (1 << CS10)); // Set prescaller on 1024.
}
Если Вы меняете константу сравнения, то частота прерываний не изменится, если Вы не установите бит WGM12(СTC) (сброс по совпадению ТС1) - но он работает только для OCR1A, а Ваш код для OCR1В. По этому частота прерываний менятся не будет. Вы только смещаете во времени начало прерывания от сброса счетчика в 0x0000.
Мой Вам совет - проэмулируйте все в AVRStudio - и все всанет на свои места.
Цитата(BVU @ Aug 17 2005, 18:01)
// IRQ TIMER1_COMPB
#pragma vector = TIMER1_COMPB_vect
__interrupt void timer1_compB_Processing(void)
{
char pd;
__disable_interrupt();
tick++;
... // обработка подпрограммы.
__enable_interrupt();
}
Ваши мнения корифеи программирования таймеров???
С уважением,
BVU
__disable_interrupt(); __enable_interrupt(); - это не нужно, при входе в прерывние бит глобальных прерываний автоматически сбрасывается. Так что это пустое.