Страница 1 из 1
Внешние прерывания и таймер
Добавлено: Пн апр 27, 2015 17:06:09
MrFarik
Привет всем котам и кошкам!
Возникла проблема при одновременном использовании таймера и внешнего прерывания! МК ATmega16.
Использую Atmel Studio 6.
Собственно код инициализации:
Код: Выделить всё
// Инициализация портов
DDRD &= ~(1<<0);
DDRD &= ~(1<<1);
DDRD &= ~(1<<2);
DDRD &= ~(1<<3);
PORTD |= (1<<0)|(1<<1)|(1<<2)|(1<<3);
I2CInit();
// Инициализация таймера 0 (~1000 Гц), режим сброса по совпадению, предделитель на 1024
TCCR0 |= (1<<CS02)|(1<<WGM01);
OCR0 = 31;
TIMSK |= (1<<OCIE0);
// Инициализация таймера 1 в режиме Fast PWM
// Инициализация внешних прерываний
MCUCR |= (1<<ISC10)|(1<<ISC11);
GICR |= (1<<INT1);
// Инициализация АЦП
ADMUX |= (1<<REFS0)|(1<<REFS1);
ADCSRA |= (1<<ADEN);
При этом в МК бесконечно срабатывает внешнее прерывание, а таймер 0 молчит. Если закомментировать инициализацию внешних прерываний, то прерывание от таймера срабатывает нормально. Подскажите где тут грабли...
В Proteus работают оба прерывания, т.е. идеально. В реальной железке работает только внешнее. Плата на предмет дефектов и замыканий проверялась неоднократно.
Re: Внешние прерывания и таймер
Добавлено: Пн апр 27, 2015 17:52:55
Z_h_e
Приоритет внешних прерываний выше таймерных. По всей видимости частота возникновения внешнего прерывания быстрее чем контроллер обрабатывает их. Причина может быть, например, в дребезге контактов, плохом питании или ошибки в схеме.
Перед выходом из обработчика внешнего прерывания Вы можете сбросить соответствующий флаг события и может быть контроллер успеет обработать прерывание по таймеру, но это не выход, так попробовать для теста.
Re: Внешние прерывания и таймер
Добавлено: Пн апр 27, 2015 17:58:10
MrFarik
Внешнее прерывание выполняется при частоте 1 Гц (от DS1307 вывода SQW/OUT). А прерывание по таймеру выполняется с частотой 1000 Гц. Но внешнее прерывание почему то выполняется очень часто (около 100 Гц, может и больше). Хотя и DS1307 исправно выдает 1 Гц. Ищу ошибки в схеме.
Re: Внешние прерывания и таймер
Добавлено: Пн апр 27, 2015 18:02:57
Z_h_e
Кондер попробуйте повесить на вход внешнего прерывания 200-400 пФ, подтяните вход к питанию небольшим сопротивлением. Грязь может какая между соседними ногами.
Re: Внешние прерывания и таймер
Добавлено: Пн апр 27, 2015 18:10:23
MrFarik
Вход к питанию подтянут сопротивлением 4,7кОм. А кондер то зачем вешать?
Re: Внешние прерывания и таймер
Добавлено: Пн апр 27, 2015 18:17:50
Z_h_e
Кондер срежет высокочастотные импульсы, если они есть конечно. Несколько завалит фронт и спад, но тут думаю не критично. DS1307 возможно не обидется на присутствие маленького кондера. Хотя я его предложил как то еще не осознав что импульсы формирует интегральная схема.
Запитайте схему от батарейки, может источник питания чего приносит.
Re: Внешние прерывания и таймер
Добавлено: Пн апр 27, 2015 18:40:31
MrFarik
Проблема решена правильной инициализацией DS1307. В управляющем регистре был установлен бит 7 - OUT. Из-за этого на выходе SQW/OUT постоянно присутствовала логическая единица, и прерывание работало постоянно.
Теперь другая проблема. С указанной вверху инициализацией таймера 0, прерывание не срабатывает с частотой ~1000 Гц. Прерывание происходит очень медленно, примерно 1 - 1.5 Гц. По этому прерыванию опрашивается энкодер. Поэтому я его инициализировал на 1000 Гц. А где же тут грабли?
----------
Сорри, прерывание выполняется с частотой 1000Гц, только если отключить внешние прерывания.
----------
Всем спасибо за помощь. Проблема решилась! Исправлены программные ошибки, и все заработало.
Не нашел в даташите... Бит OUT управляющего регистра DS1307 по умолчанию установлен в единицу или как?
Re: Внешние прерывания и таймер
Добавлено: Пн апр 27, 2015 18:57:29
Z_h_e
MrFarik писал(а):постоянно присутствовала логическая единица, и прерывание работало постоянно.
Вернитесь на шаг назад и разберитесь откуда у Вас внешние прерывания при постоянной лог 1 если должно по фронту.
Re: Внешние прерывания и таймер
Добавлено: Пн апр 27, 2015 19:05:04
MrFarik
Z_h_e писал(а):постоянно присутствовала логическая единица, и прерывание работало постоянно.
Самому интересно, но после сброса бита, все заработало. Наверное виною внешние помехи. Действительно, попробую повесить кондер.