Перейти к содержанию
    

Срабатывает через раз прерывание по таймеру.

Доброго времени суток! Пишу программу на 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);
...
...
...
}

 

Подскажите из - за чего может быть такой результат. Спасибо!

Изменено пользователем IVN2013

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гипотетически: в timer1_COMPB не останавливаете таймер перед сбрасыванием TCNT1 = 0x00

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, но это вряд ли, т.к. пробовал и с остановом (TCCR1B = 0x00; //stop timer )в процедуре прерывания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Попробуйте сделать не timer1_COMPB, а timer1_COMPА

2. Уменьшите период меандра до 5 мс

3. В прерывании необходимо останавливать таймер

4. А вообще зачем использовать таймер для подсчета каждого первого импульса? Заведите меандр на внешнее прерывание. T1(PortB.1) и INT2(PortB.2) находятся рядом, легко подпаять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как обычно, внимательно читаем даташит:

 

• 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).

 

Жирным шрифтом выделена самая соль :) RTFM! :)

Топику явно место в разделе для начинающих...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...
...
...

}

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

по одному фронту есть, по следующему нет , потом опять есть

Хочу уточнить у автора, что такое по-вашему фронт?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...