Проблемка с прерыванием...
|
|
Uncle_Dizel |
Дата: Пт, 18.11.2011, 00:10 | Сообщение # 16 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
40
Замечания:
±
На сайте с 09.06.2011
Статус:
Offline
|
Green var GPIO.0 Blue var GPIO.1 REd var GPIO.2 TRISIO=%111000 GPIO = %000000 'очистим от мусора OPTION_REG = %00000111 'Регистр настроек wpu = %00110000 'Регистор включение подтяжки резисторов INTCON = %10001000 'Регистр настроек прерывания IOCB = %00110000 'Регистр индивидуальной настройки прерывания портов clear pause 500 On Interrupt GoTo one start: Blue = 0 Green = 0 Red= 0 goto start
Disable 'разрешить прерывания One: if INTCON.0 = 1 then REd = 1 pause 1000 INTCON.0 = 0 endif Resume EnableДобавлено (18.11.2011, 00.10.01) --------------------------------------------- ну вот скажем моя программа, для прерывания по GPIO использую 2 вывода подцепляя на землю, я хочу узнать какой из выводов GPIO.4 или GPIO.5 сработало прерывание brown, в INTCON я могу узнать какое именно было прерывание, а порт какой сработал?
|
|
|
|
brown |
Дата: Пт, 18.11.2011, 00:22 | Сообщение # 17 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
333
Замечания:
±
На сайте с 18.09.2007
Статус:
Offline
|
Так в теле прерывания считайте порт.
Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
|
|
|
|
Uncle_Dizel |
Дата: Пт, 18.11.2011, 00:36 | Сообщение # 18 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
40
Замечания:
±
На сайте с 09.06.2011
Статус:
Offline
|
то есть Disable 'разрешить прерывания One: if INTCON.0 = 1 then
If GPIO.4 = 0 then goto label_1 endif
If GPIO.5 = 0 then goto label_2 endif
endif
NTCON.0 = 0 endif Resume Enable
|
|
|
|
brown |
Дата: Сб, 19.11.2011, 00:13 | Сообщение # 19 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
333
Замечания:
±
На сайте с 18.09.2007
Статус:
Offline
|
Да, как-то так. Только не надо проверять флаг в прерывании - его нужно сбрасывать при выходе из него. Так же смотрите, чтобы goto label не было выходом из прерывания.
Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
|
|
|
|
Uncle_Dizel |
Дата: Сб, 19.11.2011, 00:55 | Сообщение # 20 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
40
Замечания:
±
На сайте с 09.06.2011
Статус:
Offline
|
вот по поводу выхода из прерывания Так же смотрите, чтобы goto label не было выходом из прерывания. а что будет если оно будет выходом?
|
|
|
|
brown |
Дата: Сб, 19.11.2011, 01:31 | Сообщение # 21 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
333
Замечания:
±
На сайте с 18.09.2007
Статус:
Offline
|
Прога будет работать не понятно как или ... зависнет. Что- то было уже на форуме , лень искать.
Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
|
|
|
|
Uncle_Dizel |
Дата: Вт, 29.11.2011, 22:02 | Сообщение # 22 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
40
Замечания:
±
На сайте с 09.06.2011
Статус:
Offline
|
а как определить какое прерывание приоритетнее???? Добавлено (29.11.2011, 22.02.27) --------------------------------------------- я так понимаю алгоритм прерывания 1 происходит прерывание 2 переходим в подпрограмму прерывания 3 определяем какое прерывание было (IF INCON.6 then.....IF INCON.5 и так далее ) 4 тогда приобретене будет то прерывание которое мы поставим рание условие?
|
|
|
|
ivan_fd |
Дата: Ср, 30.11.2011, 10:35 | Сообщение # 23 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Приоритетные прерывания есть в 18-ых пиках, в ниже нету.
В Вашем случаи Quote (IF INCON.6 then.....IF INCON.5 и так далее ) это не приоритет. Здесь каждая обработка прерывания будет виполнятся в свое время.
Сообщение отредактировал
ivan_fd - Ср, 30.11.2011, 12:48
|
|
|
|
Uncle_Dizel |
Дата: Ср, 30.11.2011, 14:19 | Сообщение # 24 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
40
Замечания:
±
На сайте с 09.06.2011
Статус:
Offline
|
Здесь каждая обработка прерывания будет виполнятся в свое время. ну а если они все разом произошли?
|
|
|
|
ivan_fd |
Дата: Ср, 30.11.2011, 15:01 | Сообщение # 25 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Ну, а если вдруг и такое произойдет, то сначала обработается код, который стоит первым. И т. д... Но это не есть приоритет. В приоритетной системе прерываний, прерывание с высшим приоритетом, прервет процедуру прерывания с низшим.
|
|
|
|
ADMIN |
Дата: Ср, 30.11.2011, 15:46 | Сообщение # 26 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Если произойдет любое разрешенное прерывание, то программа перейдет в ПП обработки. В этой ПП можно самостоятельно задать приоритет, проверив в определенной последовательности флаги каждого прерывания, фигурирующего в программе. Это относится, в основном, к младшим семействам. В приоритетной (PIC18 и т.д) системе прерываний под обработку прерывания определенного приоритета выделено место в программе. Если одно прерывание имеет более высший приоритет, чем другое, при условии их одновременного возникновения, то программа переходит на обработку этого прерывания в первую очередь и именно на свое место в программе.
|
|
|
|
доцент2 |
Дата: Пн, 09.01.2012, 07:46 | Сообщение # 27 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
написал програмку с динамической индикацией на LED. использовал прерывание по переполнению таймера TMR0. проблемка в том, что в протеусе программа работает около 2,5...3 секунд и виснет. что это может быть: глюк протеуса или неправильное "оформление" прерывания?
|
|
|
|
retas |
Дата: Пн, 09.01.2012, 17:15 | Сообщение # 28 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
445
Замечания:
±
На сайте с 10.09.2007
Статус:
Offline
|
доцент2! Так Протеус вам и должен показать, посмотрите на собаку, стек. А быть может Протеус сильно нагружает процесор компа - тогда придётся отлаживать частями либо в реале. Удачи.
|
|
|
|
ADMIN |
Дата: Пн, 09.01.2012, 17:52 | Сообщение # 29 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Quote (retas) написал програмку с динамической индикацией на LED. использовал прерывание по переполнению таймера TMR0. проблемка в том, что в протеусе программа работает около 2,5...3 секунд и виснет. что это может быть: глюк протеуса или неправильное "оформление" прерывания? Больше похоже на "неправильное "оформление" прерывания"
|
|
|
|
доцент2 |
Дата: Пн, 09.01.2012, 19:43 | Сообщение # 30 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
может глянете что не так?
|
|
|
|