Внешние прерывания и таймер

Обсуждаем контроллеры компании Atmel.
Ответить
Аватара пользователя
MrFarik
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн июн 24, 2013 08:22:05
Откуда: Узбекистан, г. Навои

Внешние прерывания и таймер

Сообщение 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 работают оба прерывания, т.е. идеально. В реальной железке работает только внешнее. Плата на предмет дефектов и замыканий проверялась неоднократно.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Внешние прерывания и таймер

Сообщение Z_h_e »

Приоритет внешних прерываний выше таймерных. По всей видимости частота возникновения внешнего прерывания быстрее чем контроллер обрабатывает их. Причина может быть, например, в дребезге контактов, плохом питании или ошибки в схеме.
Перед выходом из обработчика внешнего прерывания Вы можете сбросить соответствующий флаг события и может быть контроллер успеет обработать прерывание по таймеру, но это не выход, так попробовать для теста.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
MrFarik
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн июн 24, 2013 08:22:05
Откуда: Узбекистан, г. Навои

Re: Внешние прерывания и таймер

Сообщение MrFarik »

Внешнее прерывание выполняется при частоте 1 Гц (от DS1307 вывода SQW/OUT). А прерывание по таймеру выполняется с частотой 1000 Гц. Но внешнее прерывание почему то выполняется очень часто (около 100 Гц, может и больше). Хотя и DS1307 исправно выдает 1 Гц. Ищу ошибки в схеме.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Внешние прерывания и таймер

Сообщение Z_h_e »

Кондер попробуйте повесить на вход внешнего прерывания 200-400 пФ, подтяните вход к питанию небольшим сопротивлением. Грязь может какая между соседними ногами.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
MrFarik
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн июн 24, 2013 08:22:05
Откуда: Узбекистан, г. Навои

Re: Внешние прерывания и таймер

Сообщение MrFarik »

Вход к питанию подтянут сопротивлением 4,7кОм. А кондер то зачем вешать?
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Внешние прерывания и таймер

Сообщение Z_h_e »

Кондер срежет высокочастотные импульсы, если они есть конечно. Несколько завалит фронт и спад, но тут думаю не критично. DS1307 возможно не обидется на присутствие маленького кондера. Хотя я его предложил как то еще не осознав что импульсы формирует интегральная схема.
Запитайте схему от батарейки, может источник питания чего приносит.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
MrFarik
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн июн 24, 2013 08:22:05
Откуда: Узбекистан, г. Навои

Re: Внешние прерывания и таймер

Сообщение MrFarik »

Проблема решена правильной инициализацией DS1307. В управляющем регистре был установлен бит 7 - OUT. Из-за этого на выходе SQW/OUT постоянно присутствовала логическая единица, и прерывание работало постоянно.
Теперь другая проблема. С указанной вверху инициализацией таймера 0, прерывание не срабатывает с частотой ~1000 Гц. Прерывание происходит очень медленно, примерно 1 - 1.5 Гц. По этому прерыванию опрашивается энкодер. Поэтому я его инициализировал на 1000 Гц. А где же тут грабли?
----------
Сорри, прерывание выполняется с частотой 1000Гц, только если отключить внешние прерывания.
----------
Всем спасибо за помощь. Проблема решилась! Исправлены программные ошибки, и все заработало.
Не нашел в даташите... Бит OUT управляющего регистра DS1307 по умолчанию установлен в единицу или как?
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Внешние прерывания и таймер

Сообщение Z_h_e »

MrFarik писал(а):постоянно присутствовала логическая единица, и прерывание работало постоянно.
Вернитесь на шаг назад и разберитесь откуда у Вас внешние прерывания при постоянной лог 1 если должно по фронту.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
MrFarik
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн июн 24, 2013 08:22:05
Откуда: Узбекистан, г. Навои

Re: Внешние прерывания и таймер

Сообщение MrFarik »

Z_h_e писал(а):постоянно присутствовала логическая единица, и прерывание работало постоянно.

Самому интересно, но после сброса бита, все заработало. Наверное виною внешние помехи. Действительно, попробую повесить кондер.
Ответить

Вернуться в «AVR»