Страница 1 из 1

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

Добавлено: Пт апр 22, 2011 14:59:34
ol1331
Привет всем котоводам :),
т.к. я начинающий программист, у меня возникла проблемка с внешними прерываниями,
облазил гугл, нашёл как работать примеру с INT1 [url]http://samou4ka.net/page/vneshnie-preryvanija-mk-avr[/url]

Код:

Код: Выделить всё

#include <iom8.h>
#include <avr/io.h>
#include <avr/interrupt.h>
//определяем биты регистров
#define ISC10 2
#define ISC11 3
#define INT1 7
unsigned char int1 = 0;
ISR(INT1_vect)
{
//обработка прерывания
        int1++;	
}
//функция инициализация внешнего прерывания
void INTinit()
{
	MCUCR = (1<<ISC10) | (1<<ISC11);//0b00001100
	GICR = (1<<INT1);//0b10000000
}
int main()
{
        INTinit();//вызываем функцию инициализации прерывания
        sei();//устанавливаем бит глобального разрешения прерываний
while(1);
}

Вроде бы всё понятно, но нифига не понятно как в функции INTinit() инициализировать к примеру сразу INT0 и INT1...
Сразу в нужных местах поменять нули на единички или для каждого INTx писать свою функцию инициализации ?

Вообще если у кого есть код как сразу инициализировать INT0, INT1 и INT2 - буду признателен тому человеку.

Тут много опытных программеров, народ, помогите если не затруднит... Вроде бы изучение контроллеров пошло хорошо, а на этом месте запнулся. :(

Re: ATMEGA16 - Внешние прерывания

Добавлено: Пт апр 22, 2011 15:51:39
Engineer_Keen
ol1331 писал(а): Вроде бы всё понятно, но нифига не понятно как в функции INTinit() инициализировать к примеру сразу INT0 и INT1...
Сразу в нужных местах поменять нули на единички или для каждого INTx писать свою функцию инициализации ?
Сразу, ведь за все 3 прерывания отвечает один регистр. Зачем лишний раз вызывать запись в него, если заранее известно что нужно включить.
ol1331 писал(а): Вообще если у кого есть код как сразу инициализировать INT0, INT1 и INT2 - буду признателен тому человеку.
следовательно: GICR = (1<<INT0)|(1<<INT1)|(1<<INT2);

Re: ATMEGA16 - Внешние прерывания

Добавлено: Пт апр 22, 2011 16:53:54
SubDia
Да, надо еще бы не забыть тогда дописать в начале "#define INT0 6" и "#define INT1 7"
Э. Стоп, нашальнике. Код-то под мегу 8-ю. Тогда и "define INT2 5", коль уж с мегой 16-й работаете. И еще вместо "#include <iom8.h>" нужно написать "#include <iom16.h>" - это ежели в WinAVR писать намерены.

Re: ATMEGA16 - Внешние прерывания

Добавлено: Чт апр 28, 2011 09:06:11
ol1331
Engineer_Keen и SubDia, спс за помщь,
теперь всё понятно 8)

Re: ATMEGA16 - Внешние прерывания

Добавлено: Чт апр 28, 2011 09:58:56
ARV
SubDia писал(а):И еще вместо "#include <iom8.h>" нужно написать "#include <iom16.h>" - это ежели в WinAVR писать намерены.
НЕ НУЖНО ТАК ПИСАТЬ!!!
в WinAVR достаточно написать #include <avr/io.h> и в параметрах проекта указать конкретный МК - все будет сделано автоматически.

Re: ATMEGA16 - Внешние прерывания

Добавлено: Чт апр 28, 2011 10:09:44
SubDia
ARV писал(а):в WinAVR достаточно написать #include <avr/io.h> и в параметрах проекта указать конкретный МК - все будет сделано автоматически.
Эм..не подумавши ляпнул. И то верно. =)