Прерывания в AVR

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

а по уму, надо стратегию другую применить: почитай про алгоритм конечных автоматов.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="BOB51",url="/forum/viewtopic.php?p=3315257#p3315257"]ROMan2947
Текстовку ставить под спойлер надо (выделяем текст - жмем Code, снова выделяем все что получилось/с окантовочными символами/ и жмем spoiler) - так основные тексты сообщений не будут загромождаться. А кому интереснт - откроют полный текст.
Для контроля результата перед окончательной отправкой есть кнопа "предпросмотр".
:beer:[/uquote] ОК, учту)

Добавлено after 1 minute 11 seconds:
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3315259#p3315259"]а по уму, надо стратегию другую применить: почитай про алгоритм конечных автоматов.[/uquote]
посмотрю, спасибо!
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Всегда следует придерживаться простого алгоритма создания вопроса на форуме:
1. описание того, что хочется
2. описание того, что сделано (и не только описание, но и демонстрация кода, схемы и т.п.)
3. описание того, что вышло с отличиями от п.1
каждый пункт должен быть конкретным, "светодиод мигает не раз 1 секунду, а раз в 10 секунд" - это конкретика, "светодиод мигает не так, как надо" - это хрень.
только в этом случае вы можете надеяться на какие-то конструктивные ответы.
в вашем конкретном случае без описания того, что и как у вас было, и что и как у вас стало после "прерываний" (с указанием того, что вы изменили в коде), никто ничего не посоветует дельного.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Правильно ли я понимаю,что при выполнении данного кода:
Спойлер

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

ISR(INT0_vect)
{
	// обработка прерывания
}

int main (void)
{
	sei();
	while ()
	{
		// основная программа
	}
}
при регистрации внешнего прерывания INT0 программа может переходить только в обработку ISR(INT0_vect)?


как будет обрабатываться прерывание если код таков:
Спойлер

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

//ISR(INT0_vect)
//{
//	// обработка прерывания
//}

int main (void)
{
	sei();
	while ()
	{
		// основная программа
	}
}
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

1. Не может, т.к. не задано (не запараметрировано) ни одно прерывание. Регистрации того же INT0 не будет.
2. То же самое.
Docendo discimus
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

распишу: если прерывание разрешено (как индивидуально, так и глобально) и установился его флаг (произошло вызывающее событие), то контроллер доделывает текущую инструкцию основного (кстати не обязательно основного, а вообще в любом месте, главное, чтобы условия соблюлись) кода и переходит на выполнение обработчика прерывания, выполнив его возвращается в ту же точку исходного кода и продолжает его выполнение (для этого в специальной области памяти, называемой стек, сохраняется адрес команды, к которой необходимо вернуться после завершения обработки прерывания). Чтобы меньше тревожить основной код, прерывания стараются делать быстроисполнимыми (короткий без циклов код).
как тебе уже написали SEI (установка бита I) разрешил глобально прерывания, а вот чтобы разрешить его индивидуально, нужно установить бит, отвечающий конкретно за это прерывание (смотри ДШ на свой контроллер)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="pyzhman",url="/forum/viewtopic.php?p=3315363#p3315363"]1. Не может, т.к. не задано (не запараметрировано) ни одно прерывание. Регистрации того же INT0 не будет.[/uquote]

Вы это к отсутствию этих строк?:

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

MCUCR=(1<<ISC01)|(1<<ISC00);
GICR=1<<INT0;
в вопросе выше скажем так будем считать что это предусмотрено, как в итоге будет обработка
Последний раз редактировалось ROMan2947 Пт фев 23, 2018 12:26:55, всего редактировалось 1 раз.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

ROMan2947 писал(а):при регистрации внешнего прерывания INT0 программа может переходить только в обработку ISR(INT0_vect)?
Опять какой-то непонятный вопрос. Все зависит от включенных масок разрешений прерываний конкретных периферий и событий.
ROMan2947 писал(а):как будет обрабатываться прерывание если код таков:
СпойлерИзображение
Последний раз редактировалось Z_h_e Пт фев 23, 2018 12:33:42, всего редактировалось 1 раз.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

Да.
Z_h_e, сию маску подставит сам ИДЕ (для того ему целевой МК и указывается)

Добавлено after 2 minutes 18 seconds:
есть маска включенных прерываний, их надо включать, а ещё есть (вот, согласен немного напутал) таблица переходов - что она отправит именно на этот обработчик и она уже прописана - это я имел в виду
Последний раз редактировалось Ivanoff-iv Пт фев 23, 2018 12:35:44, всего редактировалось 1 раз.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Z_h_e писал(а):
Все зависит от включенных масок разрешений прерываний конкретных периферий и событий.
Что если включить прерывание INT0 и при его регистрации оно может пойти по вектору INT2_vect?
Последний раз редактировалось ROMan2947 Пт фев 23, 2018 12:37:33, всего редактировалось 1 раз.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Да блин, Вы пост удалили и я отредактировал свой.

Не ставит Атмел Студия какие-то автомаски, слава богу.

Добавлено after 1 minute 5 seconds:
ROMan2947 писал(а):Что если включить прерывание INT0 и при его регистрации оно может пойти по вектору INT2_vect?
Это как?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

[uquote="ROMan2947",url="/forum/viewtopic.php?p=3315377#p3315377"]...скажем так будем считать что это предусмотрено...[/uquote]
Вам самому не надоело быть тыканным в собственные каки? Что вы там себе предусматриваете одному вам известно. Все остальные только догадываются. Прислушайтесь наконец к ARV.
Docendo discimus
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

нет, не пойдёт, но его флаг будет висеть до тех пор, пока прерывание не будет выполнено (ещё флаг можно сбросить принудительно, записав в его бит "1") и, если флаг ещё активен, то при разрешении прерывания оно тутже будет выполнено (даже если событие уже прошло)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

И так, вопрос остается открытым: Для чего прерывания вам?
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Запутался чет....
Спойлер

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

ISR(INT0_vect)
	{
	 //помигаем и выйдем 
	}
	
 int main(void)
 {
	 sei();
	 MCUCR=(1<<ISC01)|(1<<ISC00);
	 GICR=1<<INT0;
	
	 while ()
	 {
		 
	 }
 }
	
и \
Спойлер

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

//ISR(INT0_vect)
//	{
//	 //помигаем и выйдем
//	}
	
 int main(void)
 {
	 sei();
	 MCUCR=(1<<ISC01)|(1<<ISC00);
	 GICR=1<<INT0;
	
	 while ()
	 {
		 
	 }
 }
	

в первом варианте:

1. регистрируется INT0
2. флаг поднят аппаратно
3. переходим в ISR(INT0_vect)
4. выполняем то, что в ISR(INT0_vect)
5. выходим из ISR(INT0_vect)
6. флаг прерывания очищается аппаратно
7. возвращаемся в while(1)

во втором что происходит, когда ISR не прописан?

Добавлено after 4 minutes 57 seconds:
[uquote="Dimon456",url="/forum/viewtopic.php?p=3315414#p3315414"]И так, вопрос остается открытым: Для чего прерывания вам?[/uquote]
считать импульсы из вне
Друг Кота
Аватара пользователя
Сообщения: 15605
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Прерывания то хорошо...
С точки зрения учебна процессу...
НО...
Может сначала простой опрос события поставить, а когда все заработает привести к прерыванию?
Или вообще использовать внутреннюю сетку частот, а с RTCтолько "обмен данными при необходимости"?
:roll:
Или счетные импулься извне на таймер затащить...
Однако там те же прерывания, только внутренние и с иным приоритетом...
:dont_know:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="BOB51",url="/forum/viewtopic.php?p=3315430#p3315430"]Может сначала простой опрос события поставить[/uquote] что значит простой опрос события? ножку прослушивать?
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

про другие компиляторы не скажу, в кодевижн таблица переходов выглядит так:

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

;INTERRUPT VECTORS
	RJMP __RESET
	RJMP _ext_int0_isr
	RJMP _ext_int1_isr
	RJMP _timer1_capt_isr
	RJMP _timer1_a
	RJMP 0x00
	RJMP 0x00
	RJMP 0x00
	RJMP 0x00
	RJMP 0x00
	RJMP 0x00
	RJMP 0x00
	RJMP 0x00
	RJMP _timer0_a
	RJMP 0x00
	RJMP 0x00
	RJMP 0x00
	RJMP 0x00
	RJMP 0x00
там где нет обработчиков стоит ссылка на 0 адрес, а по этому адресу ссылка на RESET...

Добавлено after 1 minute 54 seconds:
если вам считать события - задействуйте таймер, настроив его на счёт внешних событий, и можно быть уверенным, что он событие не пропустит
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

там где нет обработчиков стоит ссылка на 0 адрес, а по этому адресу ссылка на RESET...
эта ссылка на 0 адрес где она хранится?что храниться по адресу 002(это адрес вектора прерывания INT0)

Добавлено after 3 minutes 42 seconds:
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3315437#p3315437"]если вам считать события - задействуйте таймер, настроив его на счёт внешних событий, и можно быть уверенным, что он событие не пропустит[/uquote]
это в режиме захвата? у меня три генератора импульсов + SWQ/out ds1307 ...

Добавлено after 10 minutes 6 seconds:
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3315437#p3315437"]там где нет обработчиков стоит ссылка на 0 адрес, а по этому адресу ссылка на RESET...[/uquote]

вывод,если настроить и включить прерывание при этом не прописав обработчик то МК при каждой регистрации INT будет сбрасываться....так?
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

это самое начало кода (ассемблер и прошивка на языке МК): сначала (h00) ссылка на начало исполнимого кода(reset), потом ссылки на начала подпрограмм прерываний (h02 - int0, h04 - int1 и т.д....) эти ссылки стоят здесь жестко (при компиляции меняется записанный в них вектор) т.е при вызове инт0 контроллер прыгнет на 2е слово (1слово = 2 байта) прошивки (это железно в нём заложено) и прочитает там команду перехода на обработчик прерывания.
распишу по кодевижну (думаю в других С компиляторах ненамного отличается): гдето недалеко от исполнимого файла есть папка "inc" в ней файлы по названиям микросхем, в них адреса перевода битов, регистров, переходов... для перевода с человеческого языка на машинный цифровой, покопайся, может станет понятней (только не меняй ничего), а ещё можно почитать книги, (наверно лучше или про устройство МК или по ассемблеру - он к железу ближе), (конкретных не посоветую, но думаю, сейчас коты помогут).
пс: тот кусок, что я приводил - это перевод из С в ассемблер готовой программы (а потом уже он превращается в прошивку) - если открыть этот файл целиком, то можно увидеть, насколько много скрыто от С программиста :)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ответить

Вернуться в «AVR»