реклама на сайте
подробности

 
 
> Прерывания в ATmega128
sf9
сообщение Sep 19 2008, 10:14
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 30-10-07
Из: Москва
Пользователь №: 31 896



Всем моё почтение.
Прошу помощи в изучени прерываний и их обработке.
Как их использовать,для чего в основном?
Начал работу с ATmega128. Среда разработки WinAVR(AVR-GCC).
help.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sf9
сообщение Sep 22 2008, 08:44
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 30-10-07
Из: Москва
Пользователь №: 31 896



a14.gif Ребят,спасибо огромное,что простыми словами и быстро разъяснили. a14.gif
Буду понимать далее.
А тема,действительно,должна повисеть в этой рубрике.
Если можно,выложите примеры с-кодов с функциями обработки прерываний.
smile3046.gif
Go to the top of the page
 
+Quote Post
mandrew
сообщение Sep 22 2008, 16:18
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 28-09-05
Пользователь №: 9 021



Цитата(sf9 @ Sep 22 2008, 12:44) *
Если можно,выложите примеры с-кодов с функциями обработки прерываний.


Ниже пример программы, показывающий как во время выполнения программы (мигание 1-ым светодиодом) зажечь 2-ой светодиод по нажатию кнопки. Короче говоря, показан обработчик внешнего прерывания. Компилятор - avr-gcc.

Код
#include <avr/io.h>
#include <avr/interrupt.h>

volatile uint8_t led2IsOn = 0;

int main(void)
{
  uint8_t led1IsOn = 0;

  // Конфигурируем порт на выход.
  DDRB |= (1 << DDB6) | (1 << DDB5);
  
  // Настраиваем порт на котором висит кнопка на вход.
  DDRE &= ~(1 << DDE6);
  PORTE |= (1 << PORTE6);
  // Прерывание по возрастающий фронту сигнала.
  EICRB = (1 << ISC61) | (1<< ISC60);

  sei(); // Глобальное разрешение прерываний.
  EIMSK |= (1 << INT6); // Разрешаем внешнее прерывание, заведенное на PORTE6.
  // Бесконечный цикл.
  while(1)
  {
    uint16_t i;

    // Задержка.
    for(i = 65535; i != 0; i--);
    if(led1IsOn)
    {
      led1IsOn = 0;
      PORTB &= ~(1 << PORTB5);  // Выключаем светодиод 1.
    }
    else
    {
      led1IsOn = 1;
      PORTB |= (1 << PORTB5);   // Включаем светодиод 1.
    }
  }
}

// Обработчик прерывания.
SIGNAL(SIG_INTERRUPT6)
{
  if(led2IsOn)
  {
    led2IsOn = 0;
    PORTB &= ~(1 << PORTB6);   // Выключаем светодиод 2.
  }
  else
  {
    led2IsOn = 1;
    PORTB |= (1 << PORTB6);   // Включаем светодиод 2.
  }
}


Сообщение отредактировал mandrew - Sep 22 2008, 16:20
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 09:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01395 секунд с 7
ELECTRONIX ©2004-2016