роботы
робототехника
микроконтроллеры
Главная
Как сделать робота
Новости
Спорт
Статьи
Wiki
Форум
Downloads
Ссылки
Контакты  

Внешние прерывания


/*******************************************************************
 Title:		Использование внешнего прерывания
 Сopyright:	myROBOT, http://myrobot.ru
 Date:		Ноябрь 2006
 Software:	AVR-GCC (WinAVR)
 Hardware:	ATmega8, 8 MHz

 Description:
 Пример демонстрирует использование внешнего прерывания.
 В момент нажатия кнопки, вызывается внешнее прерывание INT0,
 которое реализует выключение светодиода на 1 сек.
 Кнопка подключается к выводу PD2 и отрицательному полюсу
 источника питания. Светодиод подключается к выводу PD1 
 и отрицательному полюсу источника питания.


*******************************************************************/

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>


//////////////////////////////////////////////////////////////////  
// Раздел функций
//////////////////////////////////////////////////////////////////  


// Функция задержки. Минимальная задержка с кварцем 8MHz, равна 1 ms 

   void delay_ms2(unsigned short ms) 
   {
   unsigned short i, j, k;
	for (i=0; i<ms; i++)   /*цикл формирования временной задержки*/
		for(j=0; j<185;j++) /* вложенный цикл */
			k++;          /* произвольное действие */
   }



// signal handler для внешнего прерывания int0

	SIGNAL(SIG_INTERRUPT0)     
	{

	PORTD &= ~_BV(PD1);	// Сбросить бит PD1 в "0" = 0V, 
				// светодиод выключен , pin=0V

	delay_ms2(1000);		// Ждем 1 сек.

	PORTD |= _BV(PD1); 	// Установить бит PD1 в "1" = 5V,
				// светодиод включен, pin=1V	
	}

//////////////////////////////////////////////////////////////////  
//          ОСНОВНАЯ ПРОГРАММА
//////////////////////////////////////////////////////////////////  

int main(void)			
{    

	DDRD |= 1<<1;		// вывод 1 порта D работает на вывод
	PORTD |= _BV(PD1);	// инициализировать начальное состояние,
				// установить бит PD1 в "1"

	DDRD &= ~(0<<2);	// вывод 2 порта D работает на ввод	
	PORTD |= _BV(PD2);	// активизировать подтягивающий резистор

	GIMSK = 1<<INT0;	// разрешить внешнее прерывание Int0
	MCUCR = 1<<ISC01;	// сигнал низкого уровня на Int0 вызовет 
				// внешнее прерывание

    sei();		// разрешить прерывания

    for (;;) {	}	// бесконечный цикл

}

Мой робот Wiki

Открытое информационное пространство по робототехнике, электронике, программированию микроконтроллеров, в рамках которого любой участник может добавлять или редактировать материалы сайта.

  1. Проекты
  2. Статьи
  3. Библиотека кодов
  4. Компоненты
  5. Эксперименты
  6. Советы и хитрости