Прерывания по переполнению таймера…

Опубликовано: 01.08.2009
Автор: Krik99
Рубрики: Обучалка

Бывает когда надо выполнять, не зависимо от основной программы код, например таже динамическая индикация и тогда приходит в помощь прерывания по переполнению таймера. Когда происходит прерывание по переполнению таймера, то основная программа останавливается и начинает выполняться код, записанный в самом прерывание, после завершения исполнения прерывания, МК возвращается к исполнению основной программы в том месте, где остановился. Но если у нас кусков программы, требующих прерывания больше одного, а таймер всего один, тогда можно воспользоваться простенькой конструкцией с использованием оператора switch. Тоесть каждый раз, попадая в прерывания будет выполняться следующий кусок программы и так по кругу. Сначала первый кусок кода, в следующий раз - второй и т.д. главное чтобы куски кода не занимали много времени, так как мы всё же в прерываниях. Оператор switch имеет такой вид:
switch(i) {
       case 0: { какой-то код 0 }
       case 1: { какой-то код 1 }
       case 2: { какой-то код 2 }
       case 3: { какой-то код 3 }
       case 4: { какой-то код 4 }
}
Работать это будет так: сравнивается значение переменной i с case, тоесть если i=2, тогда будет выполняться код который записан в case 2. Тоесть зашли в прерывание сравнили переменную i с case и выполнили код, добавили 1 к переменной i и вышли, в следующий раз при входе в прерывание будет выполняться следующий код, так как переменная i стала больше на 1 и следовательно будет выполняться следующий case. Для начала настраиваем таймер на прерывание по переполнению, это всё делаем по даташиту, главное, что бы прерывания происходили по чаще. Код будет иметь приблизительно такой вид:


unsigned char i_vect;

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
       switch(i_vect){
              case 0: {
              //тут типа первый код,
              //который требует прерывания.
              break; }

              case 1: {
              //тут типа второй код,
              //который требует прерывания.
              break; }

              case 2: {
              //тут типа третий код,
              //который требует прерывания.
              break; }

              case 3: {
              //тут типа четвёртый код,
              //который требует прерывания.
              break; }

              case 4: {
              //тут типа пятый код,
              //который требует прерывания.
              break; }
       }
       i_vect++;
       if(i_vect==5) i_vect=0;
}

Главное правило кода, который набит в switch помнить, о том, что код не должен занимать много времени на выполнение, так как нормальная работа прерывания нарушится, а именно в case не должен тупиить в цикле и использовать delay. Не советую использовать в switch’е код, который требует большой точности по таймингу. И чем меньше будет нагружен таймер, а именно чем меньше будет case’ов в операторе switch и чем быстрее будем выходить из прерываний, тем быстрее будут выполняться остальные case. Вот собственно и закончим на этом, так как рассказывать вроде больше нечего. Удачи в опытах и программных изваратах :)

Оставить комментарий

Заметьте: Включена проверка комментариев. Нет смысла повторно отправлять комментарий.


Управление

Свежие записи

Разделы