Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Прерывания по переполнению таймера в atmega128


Автор: Балабол 7.4.2009, 07:47
Ситуация, на мой взгляд, требует обсуждения. В качестве исполнения лабораторных работ мне потребовалось написать программы в которых требуется прерывание по переполнению таймера. Ознакомился с http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html материалами, нашел описание прерываний по переполнению как ISR(TIMERx_OVF_vect) и позаимствовал свои же прерывания по переполнению, исполненные на ассемблере в 16-разрядных регистрах, переписав и х с ассемблера на C. В результате получилось, что на контроллерах ничего не работает, а во время отладки в прерывание по переполнению можно попасть только тогда, когда перед бесконечным циклом принудительно во время инициализации параметров вбита макроконструкция

Код

cli(); // макрос запрета прерывания
  // инициализация нужных мне параметров
sei(); //разрешиние прерываний

Тогда в отладчике если переставить таймер счетчик вручную на 0xffff происходит переход в состояние прерывание. Пример придумать не сложно, на данном этапе я на стадии переписывания таймеров в компараторы, но исходник скину с другого компа.

Автор: Mazzi 7.4.2009, 10:42
Если я правильно понял, у тебя контроллер не входит в прерывание по переполнению таймера?

Попробуй
1) проверь запущен ли таймер
2) разрешено ли прерывание по переполнению этого таймера
3) посмотри какой выбран источник импульсов для таймера
4) разрешены ли общие прерывания
5) не перезагружается ли таймер новым значением до того, как переполнится

добавь в код прерывания зажигание светодиодика, так ты узнаешь происходит ли оно.

Если вопрос не решён, пиши. 

Можешь выложить код.

Автор: UniBomb 7.4.2009, 10:57
При старте программы флаг I регистра SREG сброшен, т.е. запрещены все прерывания. Посему таймер и не срабатывает. Посему заготовка программы должна выглядеть по типу такого:

Код

#include <avr/io.h>

int main()
{
 //инициализация мк
 //инициализация используемых переменных
 sei();
 for(;;)
  {
  }
}

Автор: Балабол 8.4.2009, 18:07
Кот запустил. Зачем-то потребовалось активировать бит перехода в регистре TIFR. Но это я говорю о случае использования компараторов. 
Mazzi, Насчет пунктов 1,2 и 4 я все проверил ещё до первого поста в тему. Предделитель у меня стоит на 5, таймер синхронный, то есть источником таковых импульсов должен быть процессор в режиме 4 Мгц.  Насчет пункта 5 дебаггер ничего не вскрыл. Возможно, но как проверить? 

Автор: Mazzi 9.4.2009, 09:38
Покажи код.

Автор: fresh2 13.5.2009, 16:22
Господа, есть ли у кого примеры использования прерывания по переполнению таймера в atmega128 (на С)? smile 

Автор: ОВиталий 13.5.2009, 22:00
это для atMeaga 8, но думаю и 128 подойдет:

Код



ISR(TIMER1_OVF_vect)
{
    PORTC=255;
    _delay_ms(1000);
    PORTC=0;
}

int main()
{
    DDRC=255;
    TIMSK=_BV(TOIE1);   // маска таймера. устанавливается бит разрешающий прерывания по переполнению. 
    TCCR1B=0b11;
    sei();
    for(;;){
        asm("nop");
        }

return 0;
}



Автор: cardinal 13.5.2009, 22:17
Код

ISR(TIMER1_OVF_vect)
{
      PORTC=255;
      _delay_ms(1000);
      PORTC=0;
}

int main()
{
      DDRC=255;
      TIMSK=_BV(TOIE1);   // маска таймера. устанавливается бит разрешающий прерывания по переполнению. 
      TCCR1B=0b11;
      sei();

      for(;;)
      {
         asm("nop");
      }

   return 0;
}


ОВиталий, форматируйте пожалуйста нормально свой код, чтобы его было проще воспринимать.

Автор: fresh2 14.5.2009, 14:49
О спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)