Примеры с сайта AVR+ Electronics

Автор: Internet. Опубликовано в Начинающим CV AVR

Содержание материала

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

Бывает когда надо выполнять, не зависимо от основной программы код, например та же динамическая индикация и тогда приходит в помощь прерывания по переполнению таймера. Когда происходит прерывание по переполнению таймера, то основная программа останавливается и начинает выполняться код, записанный в самом прерывание, после завершения исполнения прерывания, МК возвращается к исполнению основной программы в том месте, где остановился. Но если у нас кусков программы, требующих прерывания больше одного, а таймер всего один, тогда можно воспользоваться простенькой конструкцией с использованием оператора switch. То есть каждый раз, попадая в прерывания будет выполняться следующий кусок программы и так по кругу. Сначала первый кусок кода, в следующий раз - второй и т.д. главное чтобы куски кода не занимали много времени, так как мы всё же в прерываниях. Оператор switch имеет такой вид:

Code
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. Для начала настраиваем таймер на прерывание по переполнению, это всё делаем по даташиту, главное, что бы прерывания происходили по чаще. Код будет иметь приблизительно такой вид:

Code


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. Вот собственно и закончим на этом, так как рассказывать вроде больше нечего. Удачи в опытах и программных извратах.....