IVN2013 0 27 января, 2015 Опубликовано 27 января, 2015 (изменено) · Жалоба Доброго времени суток! Пишу программу на 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); ... ... ... } Подскажите из - за чего может быть такой результат. Спасибо! Изменено 27 января, 2015 пользователем IVN2013 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 3 27 января, 2015 Опубликовано 27 января, 2015 · Жалоба Гипотетически: в timer1_COMPB не останавливаете таймер перед сбрасыванием TCNT1 = 0x00 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IVN2013 0 27 января, 2015 Опубликовано 27 января, 2015 · Жалоба Спасибо, но это вряд ли, т.к. пробовал и с остановом (TCCR1B = 0x00; //stop timer )в процедуре прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexeyv 0 28 января, 2015 Опубликовано 28 января, 2015 · Жалоба 1. Попробуйте сделать не timer1_COMPB, а timer1_COMPА 2. Уменьшите период меандра до 5 мс 3. В прерывании необходимо останавливать таймер 4. А вообще зачем использовать таймер для подсчета каждого первого импульса? Заведите меандр на внешнее прерывание. T1(PortB.1) и INT2(PortB.2) находятся рядом, легко подпаять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RabidRabbit 0 28 января, 2015 Опубликовано 28 января, 2015 · Жалоба Как обычно, внимательно читаем даташит: • 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! :) Топику явно место в разделе для начинающих... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 28 января, 2015 Опубликовано 28 января, 2015 · Жалоба ... ... ... } Могу еще предположить, что вот этот участок кода слишком большой и обработчик просто не успевает закончиться до прихода следующего события. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pyroman 2 29 января, 2015 Опубликовано 29 января, 2015 · Жалоба по одному фронту есть, по следующему нет , потом опять есть Хочу уточнить у автора, что такое по-вашему фронт? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться