Фанат науки

 
  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта
Обработка программных флагов (индикаторов) с помощью прерываний.
_________________________________________________________________________________________________________

Хе, выводы настолько чувствительные, что можно даже не замыкать их на общий провод, достаточно прикоснуться пальцем.

 

Программа на CodeVisionAVR:

//Внешние прерывания микроконтроллера ATmega8515 по внешним выводам  int0 и int1. Обработка программных флажков.
#include <mega8515.h>
#include <delay.h>

int A, B; //Описываем программные флажки A и B.                                                           

//Обработчики прерываний________________________________________________________________________

interrupt[2] void ExtInt0(void) //Обработчик прерываний на int0 (Порт D, вывод 2).
  {
     A = 1; //При нажатии на кнопку int0 во влажок A запис единица, во флажок B нуль.
     B = 0;
  }      

interrupt[3] void ExtInt1(void) //Обработчик прерываний на int1(Порт D, вывод 3).
  {
     A = 0; //При нажатии на кнопку int1 во влажок A запис нуль, во флажок B единица.
     B = 1;
  }     


//Настройки портов и регистров__________________________________________________________________
void main(void)
 {
    DDRC=0b11111111;  //Все выводы порта C настраиваем на выход.

    DDRD=0b00000000;  //Выводы порта D настраиваем как вход (0-вход, 1-выход).

    PORTD=0b11111111; /* Подключаем внутренние подтягивающие резисторы к выводам порта D.
                                    (0-высокоимпедансное состояние, 1-подтягивающий резистор, если при этом выставлен 0 на DDR в том же разряде) */  



   GICR=0b11000000;  /* Регистр General Interrupt Control Register разрешает внешние прерывания:
                                   10 000000 - по выводу int1;
                                   01 000000 - по выводу into;
                                   11 000000 - по обоим выводам */

    MCUCR=0b00001010; /* Регистр Micro Controller Unit Control Registr настраивает прерывание на срабатывание:
                                         0000 10 10 - по спадающим фронтам сигнала на выводах int0 и int1.

                                         0000 10 00 - по спадающему фронту сигнала на выводе int1;
                                         0000 11 00 - по нарастающему фронту сигнала на выводе int1;
                                         0000 00 00 - по низкому уровню на выводе int1;
                                         0000 01 00 - по любому изменению уровня на выводе int1 */



    A = 0; B = 0; //Обнуляем программные флажки на всякий случай.

    #asm("sei")   //Разрешаем общие прерывания.    


//Основная программа (пустой вечный цикл)__________________________________________________________

    while(1)
     {

         if(A == 1 & B == 0)  //Проверяем программные флажки.
          {
              PORTC.0 = 1; delay_ms(200); //Если флажок А равен единице и флажок B равен нулю, то делаем одно мигание светодиодом C0.
              PORTC.0 = 0; delay_ms(200);       
          }
        else
          {
             if(A == 0 & B == 1)  //Вложенный цикл для проверки другой комбинации программных флажков.
              {
                  PORTC.1 = 1; delay_ms(200); //Если флажок А равен нулю и флажок B равен единице, то делаем одно мигание светодиодом C1.
                  PORTC.1 = 0; delay_ms(200);
              }
          } 
     } 
}


 
   © Фанат науки 2010 - 2022.  Все права защищены.  При использовании материалов обязательна ссылка на сайт  www.fanatnauki.ru