Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Срабатывает через раз прерывание по таймеру.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
IVN2013
Доброго времени суток! Пишу программу на mega16, компилятор image craft. На ножку таймера T1 извне подается меандр с периодом в 10 мс. Нужно чтобы прерывание таймера (по совпадению) срабатывало по каждому переднему фронту приходящего сигнала. Столкнулся с проблемой: прерывание по таймеру(по совпадению) срабатывает через раз(по одному фронту есть, по следующему нет , потом опять есть) или вообще беспорядочно.
Повторил код в отдельной программе - результат тоже. Использую 16-разрядный timer1. А нужно чтобы оно по каждому переднему фронту было.
А вот и куски кода связанные с таймером:
Код
#pragma interrupt_handler timer1_COMPB:8                - объявляю прерывание по совпадению

void timer1_init(void)                                        - инициализирую таймер      
{
TIMSK |= 0x08;//флаг OCIE1B в 1 Timer/Counter1, Output Compare B Match Interrupt Enable
TCCR1B = 0x00; //stop timer                                      
TCNT1 = 0x00; //set count value
OCR1B  = 0x01;
TCCR1B = 0x07; //start timer    External clock source on T1 pin. Clock on rising edge- 0x07   Clock on falling edge- 0x06
}

void timer1_COMPB(void)                            - обработчик прерывания
{
TCNT1 = 0x00; //set count value
TCCR1B = 0x07; //start timer    External clock source on T1 pin. Clock on rising edge- 0x07   Clock on falling edge- 0x06
...
...
...

}

void main( void )
{
timer1_init(void);
...
...
...
}


Подскажите из - за чего может быть такой результат. Спасибо!
megajohn
Гипотетически: в timer1_COMPB не останавливаете таймер перед сбрасыванием TCNT1 = 0x00
IVN2013
Спасибо, но это вряд ли, т.к. пробовал и с остановом (TCCR1B = 0x00; //stop timer )в процедуре прерывания.
alexeyv
1. Попробуйте сделать не timer1_COMPB, а timer1_COMPА
2. Уменьшите период меандра до 5 мс
3. В прерывании необходимо останавливать таймер
4. А вообще зачем использовать таймер для подсчета каждого первого импульса? Заведите меандр на внешнее прерывание. T1(PortB.1) и INT2(PortB.2) находятся рядом, легко подпаять.
RabidRabbit
Как обычно, внимательно читаем даташит:

• Bit 3 – OCF1B: Timer/Counter1, Output Compare B Match Flag
This flag is set in the timer clock cycle after the counter (TCNT1) value matches the Output Compare Register B (OCR1B).

Жирным шрифтом выделена самая соль sm.gif RTFM! sm.gif
Топику явно место в разделе для начинающих...
Сергей Борщ
Цитата(IVN2013 @ Jan 27 2015, 21:39) *
Код
...
...
...

}
Могу еще предположить, что вот этот участок кода слишком большой и обработчик просто не успевает закончиться до прихода следующего события.
piroman
Цитата
по одному фронту есть, по следующему нет , потом опять есть

Хочу уточнить у автора, что такое по-вашему фронт?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.