Фанат науки

 
  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта
Управление частотой импульсов с помощью прерываний по двум каналам int0 и int1.
_________________________________________________________________________________________________________

    Управляем частотой мигания светодиода с помощью прерываний по каналам int0 и int1 микроконтроллера ATmega8515.
    Сигнал по int1 увеличивает частоту импульсов на пине порта С (увеличивает границу счёта), сигнал по int0 уменьшает частоту (уменьшает границу счёта).

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

#include <mega8515.h>
long i, x;  // i - счётчик циклов, x - граница, до которой счётчик считает.

//Обработчик прерываний по int1 ________________________________________________________________
  interrupt[3] void Ext_Int1(void //Обработчик прерываний на int1 (Порт D, вывод 3).
    {
      x = x + 200;  // При нажатии на кнопку увеличивем границу счёта на 200 (можно менять).
    }

//Обработчик прерываний по int0 ________________________________________________________________
  interrupt[2] void Ext_Int0(void //Обработчик прерываний на int0 (Порт D, вывод 2).

    {
      x = x - 200;  // При нажатии на кнопку уменьшаем границу счёта на 200 (можно менять).
    }

//Основная программа ________________________________________________________________________
void main(void)
  {
    DDRD=0b00000000;  // Выводы порта D настраиваем как вход (0-вход, 1-выход)
    PORTD=0b11111111;  /* Подключаем внутренние подтягивающие резисторы к выводам порта D.
                                              (0-высокоимпедансное состояние, 1-подтягивающий резистор) */  

    DDRC = 0b11111111;

    x = 10000; // Начальное значение границы (можно менять).

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

    MCUCR=0b00001010;  /* Регистр Micro Controller Unit Control Registr настраивает прерывание на срабатывание:
                                                 0000 10 00 - по спадающему фронту сигнала на выводе int1;
                                                 0000 11 00 - по нарастающему фронту сигнала на выводе int1;
                                                 0000 00 00 - по низкому уровню на выводе int1;
                                                 0000 01 00 - по любому изменению уровня на выводе int1 */

     SREG |= 0b10000000;  // Status Register, 7 бит разрешает общие прерывания.    


      while(1)
        {
           PORTC ^= 0b00000001; // На каждой итерации перекидываем пин порта на противоположный.
          
           for
(i=0; i<=x; i++)  // Цикл задержки, микроконтроллер выполняет счёт до "x".          
            {  
            }
        }
  }

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