реклама на сайте
подробности

 
 
> Срабатывает через раз прерывание по таймеру., Срабатывает через раз прерывание по таймеру.
IVN2013
сообщение Jan 27 2015, 19:39
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 12-08-13
Пользователь №: 77 889



Доброго времени суток! Пишу программу на 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 - Jan 27 2015, 19:42
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
megajohn
сообщение Jan 27 2015, 20:40
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



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


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
IVN2013
сообщение Jan 27 2015, 20:56
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 12-08-13
Пользователь №: 77 889



Спасибо, но это вряд ли, т.к. пробовал и с остановом (TCCR1B = 0x00; //stop timer )в процедуре прерывания.
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Jan 28 2015, 05:00
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



1. Попробуйте сделать не timer1_COMPB, а timer1_COMPА
2. Уменьшите период меандра до 5 мс
3. В прерывании необходимо останавливать таймер
4. А вообще зачем использовать таймер для подсчета каждого первого импульса? Заведите меандр на внешнее прерывание. T1(PortB.1) и INT2(PortB.2) находятся рядом, легко подпаять.
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Jan 28 2015, 07:32
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



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

• 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
Топику явно место в разделе для начинающих...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 28 2015, 12:37
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(IVN2013 @ Jan 27 2015, 21:39) *
Код
...
...
...

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
piroman
сообщение Jan 29 2015, 06:24
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 27-09-12
Пользователь №: 73 712



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

Хочу уточнить у автора, что такое по-вашему фронт?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 04:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01364 секунд с 7
ELECTRONIX ©2004-2016