Из полученной информации я понял, что данные прерывания позволяют опрашивать подключенные к МК устройства по мере необходимости. Правильно ли я это понял? + Еще столкнулся с таким понятием как "вектор прерывания". Залез в atmega8.h (я мучаю этот МК), нашел там эти вектора, так же залез в ДШ, там тоже нашел эти же вектора. Но на этом я так ничего и не понял. Соответствуют ли эти вектора портам, если да то каким, если нет, то что это за вектора и как их правильно использовать. И самое главное - обязательно ли использовать "глобальную систему прерываний", или можно как-то и без нее обойтись ? Заранее благодарю.
CVAVR: прерывания
- Сообщения: 18
- Зарегистрирован: Вс май 15, 2011 22:13:25
Докатился я по неплохому учебнику до неких "прерываний". В общем, автор видимо решил опустить общую суть для этих "прерываний".
Из полученной информации я понял, что данные прерывания позволяют опрашивать подключенные к МК устройства по мере необходимости. Правильно ли я это понял? + Еще столкнулся с таким понятием как "вектор прерывания". Залез в atmega8.h (я мучаю этот МК), нашел там эти вектора, так же залез в ДШ, там тоже нашел эти же вектора. Но на этом я так ничего и не понял. Соответствуют ли эти вектора портам, если да то каким, если нет, то что это за вектора и как их правильно использовать. И самое главное - обязательно ли использовать "глобальную систему прерываний", или можно как-то и без нее обойтись ? Заранее благодарю.
Из полученной информации я понял, что данные прерывания позволяют опрашивать подключенные к МК устройства по мере необходимости. Правильно ли я это понял? + Еще столкнулся с таким понятием как "вектор прерывания". Залез в atmega8.h (я мучаю этот МК), нашел там эти вектора, так же залез в ДШ, там тоже нашел эти же вектора. Но на этом я так ничего и не понял. Соответствуют ли эти вектора портам, если да то каким, если нет, то что это за вектора и как их правильно использовать. И самое главное - обязательно ли использовать "глобальную систему прерываний", или можно как-то и без нее обойтись ? Заранее благодарю.
- Реклама
На этом этапе понимания - лучше без них, по опросуPRStudio писал(а):Докатился я по неплохому учебнику до неких "прерываний". В общем, автор видимо решил опустить общую суть для этих "прерываний".
Из полученной информации я понял, что данные прерывания позволяют опрашивать подключенные к МК устройства по мере необходимости. Правильно ли я это понял? + Еще столкнулся с таким понятием как "вектор прерывания". Залез в atmega8.h (я мучаю этот МК), нашел там эти вектора, так же залез в ДШ, там тоже нашел эти же вектора. Но на этом я так ничего и не понял. Соответствуют ли эти вектора портам, если да то каким, если нет, то что это за вектора и как их правильно использовать. И самое главное - обязательно ли использовать "глобальную систему прерываний", или можно как-то и без нее обойтись ? Заранее благодарю.
Вектора привязаны не к портам, а к конкретным устройствам ( таймер, АЦП, УАРТ ). Пользоваться ими очень просто: а) прочитать в ДШ, какое прерывание с каким устройством связано б) определиться, а какое тебе нужно ( и нужно ли ) и написать свой обработчик, руководствуясь мудрыми примерами гуру, давно и успешно их применяющими
Но одно прерывание будешь использовать обязательно, хучь убей : RJMP START
это не прерывание, это относительный переход на метку START.Jack_A писал(а):Но одно прерывание будешь использовать обязательно, хучь убей : RJMP START
прерывание - это реакция на разрешенный запрос прерывания.
запрос прерывания - это аппаратно генерируемое событие в какой-либо периферии микроконтроллера.
например, переполнение таймера генерирует запрос прерывания по переполнению таймера. если конкретно этот запрос разрешен, и при этом разрешены вообще (глобально) прерывания - выполнение программы приостанавливается и аппаратно осуществляется переход на строго фиксированный адрес - вектор прерывания (у каждого запроса прерываний свой вектор). далее происходит выполнение подпрограммы обслуживания запроса, т.н. обработчика прерывания, после завершения которого происходит возврат в то место основной программы, где прерывание возникло.
все векторы прерываний в строго фиксированном порядке располагаются в младших адресах флеш-памяти - в т.н. таблице векторов прерываний.
таким образом, прерывание позволяет отреагировать на какое-либо событие (внешнее, если речь о внешних запросах прерывания, либо внутреннее - от таймера, АЦП, UART или еще чего-то встроенного) практически мгновенно, а не дожидаясь пока программа "дойдет" до места, в котором соответствующая аппаратура опрашивается. можно сказать и так: прерывания позволяют обрабатывать возникающие события незаметно для основной программы, в фоне. чтобы это было на самом деле так, обработчик прерывания должен быть как можно короче и как можно быстрее, т.е. делать только минимум необходимых действий по обслуживанию запроса.
битва с дураками проиграна, победители торжествуют. слава победителям!
Ох уж эти Atmel'ы - сами наделают, а потом черт те что пишут. Для тех, кто не в курсе - это обычное прерывание по включению питания, ресету или ошибке выполнения программы, имеет наивысший приоритет и не зависит от бита IE в SREG. И не обязательно RJMP - для МК с большим объемом памяти, где вектора 2-байтные, в этом векторе, как и в любом другом, может быть JMP.Мастер Ломастер писал(а):это не прерывание, это относительный переход на метку STARTJack_A писал(а):Но одно прерывание будешь использовать обязательно, хучь убей : RJMP START
Блин, сто раз уже зарекался не заниматься ликбезом.
может, тебе и вправду не стоит заниматься ликбезом?Jack_A писал(а):Ох уж эти Atmel'ы - сами наделают, а потом черт те что пишут. Для тех, кто не в курсе - это обычное прерывание по включению питания, ресету или ошибке выполнения программы, имеет наивысший приоритет и не зависит от бита IE в SREG. И не обязательно RJMP - для МК с большим объемом памяти, где вектора 2-байтные, в этом векторе, как и в любом другом, может быть JMP.Мастер Ломастер писал(а):это не прерывание, это относительный переход на метку START
Блин, сто раз уже зарекался не заниматься ликбезом.
поясни, как увязано понятие СБРОСА, т.е. прекращение дальнейшей работы с безусловным началом программы с нулевого адреса, с понятием ПРЕРЫВАНИЯ, т.е. с продолжением с того места, где прерывание возникло? сброс - это сброс, это не прерывание. не надо путать с прерыванием по событию WDT: хоть в данном случае и происходит обращение к нулевому вектору, но вот как раз в этом случае ВОЗМОЖНО ПРОДОЛЖЕНИЕ с места прерывания. кстати, в этом случае прерывание по WDT отлично маскируется битом IE.
ну и наконец, напоминаю: ВЕКТОР - это АДРЕС в памяти, а не КОМАНДА, которая по этому адресу находится. поэтому говорить, что RJMP START это ВЕКТОР - бред чистой воды.
битва с дураками проиграна, победители торжествуют. слава победителям!
- Реклама
другим объясни, я и сам в курсе того, что мне нужно.Jack_A писал(а):Мы с тобой на брудершафт не пили, и пояснять тебе я ничего не собираюсь.
битва с дураками проиграна, победители торжествуют. слава победителям!
Разодрались... Было б из-за чего...
- Вложения
-
- int.jpg
- (56.62 КБ) 674 скачивания
Docendo discimus
и что это поясняет?pyzh_man писал(а):Разодрались... Было б из-за чего...
битва с дураками проиграна, победители торжествуют. слава победителям!
Да нет, у меня все. В конце концов, есть же игнор-лист.pyzh_man писал(а):Разодрались... Было б из-за чего...
"Папаша ! Все в порядке !!! " (С) "Берегись автомобиля"
В итоге тс в полном ауте и отваливает в еще больших непонятках.
2Мастер Ломастер: вы, и только вы самый умный, эрудированный и знающий. Спасибо за ваши знания. Ценим и уважаем. Свет наш. Аминь.
2Jack_A: +1
2Мастер Ломастер: вы, и только вы самый умный, эрудированный и знающий. Спасибо за ваши знания. Ценим и уважаем. Свет наш. Аминь.
2Jack_A: +1
Docendo discimus
это типа ирония? если я что-то правильное сказал - над этим можно поёрничать? а лажу втирать - нормально? когда я по запарке написал OCR0A = 300; - мне указали на ошибку и я ее просто признал. если я и тут не прав, то просто укажите мне без всяких подколок, в чем я не прав? я признаю свою ошибку, если я ошибся. а если я прав, то можно так же с достоинством признать это, не унижаясь и не унижая.pyzh_man писал(а):В итоге тс в полном ауте и отваливает в еще больших непонятках.
2Мастер Ломастер: вы, и только вы самый умный, эрудированный и знающий. Спасибо за ваши знания. Ценим и уважаем. Свет наш. Аминь.
битва с дураками проиграна, победители торжествуют. слава победителям!
2Мастер Ломастер:
Вам дают понять. Четко и ясно.Jack_A писал(а):Мы с тобой на брудершафт не пили
Docendo discimus
тут такие китайские церемонии? извините, не знал. впредь буду исключительно на ВЫ.pyzh_man писал(а):2Мастер Ломастер:Вам дают понять. Четко и ясно.Jack_A писал(а):Мы с тобой на брудершафт не пили
кстати, воспитанные люди в подобных случаях говорят: мы с Вами на брудершафт не пили.
битва с дураками проиграна, победители торжествуют. слава победителям!
Извиняться надо перед Jack_A. Думаю, он оценит.
Docendo discimus
это оффтопpyzh_man писал(а):Извиняться надо перед Jack_A. Думаю, он оценит.
битва с дураками проиграна, победители торжествуют. слава победителям!
Вы тут немного путаете понятия RESET и POR(сброс по питанию), хотя обычно имеют один и тот же вектор. Так вот сброс можно вызвать программно или если на ножку RST пришел определенный импульс. Причем в некторых МК есть спецрегистр флажков, который определяет что имеенно вызвало прерывание (RESET,NMI,POR,WDT) и вот таким образом программа при включении МК может начаться в одном месте, а как только пришел сигнал сброса в другом. А вектора прерываний содержат либо адреса либо команды (JMP addr; MOV addr,PC) Так что Ломастер вы не правы.
пока не могу согласиться с Вашими аргументами.Psych писал(а):Вы тут немного путаете понятия RESET и POR(сброс по питанию), хотя обычно имеют один и тот же вектор. Так вот сброс можно вызвать программно или если на ножку RST пришел определенный импульс. Причем в некторых МК есть спецрегистр флажков, который определяет что имеенно вызвало прерывание (RESET,NMI,POR,WDT) и вот таким образом программа при включении МК может начаться в одном месте, а как только пришел сигнал сброса в другом. А вектора прерываний содержат либо адреса либо команды (JMP addr; MOV addr,PC) Так что Ломастер вы не правы.
путаете понятия RESET и POR - я не путаю.
сброс можно вызвать программно - в AVR программно сброс сделать невозможно. есть обходной маневр - при помощи WDT, но сброс при этом все равно получается АППАРАТНЫЙ.
программа при включении МК может начаться в одном месте, а как только пришел сигнал сброса в другом - нет, это невозможно. всегда НАЧАЛО программы происходит с адреса 0x0000. в ходе работы программа может перейти к любому доступному адресу, но к "вектору сброса" это не имеет никакого отношения
вектора прерываний содержат либо адреса либо команды - укажите, пожалуйста, как записать АДРЕС в ВЕКТОР? конкретно, как? повторяю: ВЕКТОР есть синоним АДРЕСА. по этому адресу может быть только КОМАНДА - любая команда, естественно.
битва с дураками проиграна, победители торжествуют. слава победителям!
опять или снова? в чем я не прав?Psych писал(а):Ага все понятно с вами.
битва с дураками проиграна, победители торжествуют. слава победителям!


