Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: demanik, ivan_fd  
Непонятки с прерываниями INT и TMR1
warstas Дата: Вс, 01.11.2015, 21:03  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 4
Репутация: 0   ±
Замечания:   ±
На сайте с 24.11.2011

Статус: Offline

Вот программа урезанная до минимума!
Суть проблемы в том что при запрещенном внешнем прерывании INTCON.4 = 0 и включенном TMR1 при нажатии на кнопку на входе инт программа обрабатывает внешнее прерывание INTCON.1 ???, при выключенном TMR1 при внешнем прерывании перехода на INTCON.1 нет! Собственно почему происходит переход при запрещенном внешнем прерывании?
Спасибо!

Device = 12F629
@ CONFIG_REQ 
@ __config MCLRE_OFF & INTRC_OSC_NOCLKOUT & WDT_OFF & CPD_OFF & BODEN_OFF & PWRTE_OFF & CP_OFF  
Xtal 4  ' Использовать кварцевый генератор на 4 МГц 
PIE1.0 = 1           ' ПРЕРЫВАНИЕ ПО ПЕРЕПОЛНЕНИЮ ТАЙМЕРА 1
CMCON = 7
OPTION_REG = %00000000  
INTCON.4 = 0    'ВНЕШНЕЕ ПРЕРЫВАНИЕ ОТ ИНТ ЗАПРЕЩЕНО
INTCON.6 = 1    'ПРЕРЫВАНИЕ ОТ ПЕРЕФЕРИИ
INTCON.7 = 1    'ГЛОБАЛЬНОЕ РАЗРЕШ ПРЕРЫВ 
TRISIO = %00001111
GPIO = %00000000
On Interrupt GoTo MYINT   'ПРИ ПРЕРЫВАНИИ ПЕРЕЙТИ
Enable
'---------------------------------------Главная программа ----------------------------------- 
T1CON.0 = 1     'ВКЛ ТАЙМЕР 1

MAIN:
If GPIO.0 = 0 Then 
GPIO.4 = 0
GPIO.5 = 0
EndIf
If GPIO.1 = 0 Then T1CON.0 = 0     'ОТК ТАЙМЕР 1
GoTo MAIN

'____________________ПРЕРЫВАНИЕ_______________________
Disable
MYINT:

If PIR1.0 = 1 Then    'ЕСЛИ БЫЛО ПРЕРЫВАНИЕ ОТ ТАЙМЕР 1
PIR1.0 = 0             'СБРОС ФЛАГА
GPIO.4 = 1
EndIf

If INTCON.1 = 1 Then    'ЕСЛИ ВНЕШНЕЕ ПРЕРЫВАНИЕ
INTCON.1 = 0             'СБРОС ФЛАГА
GPIO.5 = 1
EndIf

Resume
Enable
End
ЯНДЕКС Дата: 01.11.2015
anatol Дата: Пн, 02.11.2015, 11:32  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 471
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Проверьете по листингу на наличие "RETFIE" при возврате из прерываний
Цитата
При возврате из подпрограммыобработки прерывания, по команде RETFIE, бит GIE аппаратно устанавливается в
'1' разрешая все немаскированные прерывания.
Возможно обработав прерывание по таймеру происходит разрешение всех прерываний.
vladh Дата: Чт, 05.11.2015, 09:09  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

warstas, я не совсем понял суть вопроса но я Вам хочу сказать, что у Вас все работает так как написано в коде. Здесь я прикладываю модель в Протеусе Вашего кода. Прерывания у вас происходят от таймера TMR1 так как у Вас включено разрешение на эти прерывания (PIE1.0 = 1). Если их отключить то прерываний никаких не будет. Если Вам нужны прерывания по входу INT, то включите их(INTCON.4 = 1). И будут происходить прерывания от этого источника. Может быть я что то все таки не понял в вопросе? Попробуйте его уточнить.
Прикрепления: Vopros.rar (20.6 Kb)
warstas Дата: Пт, 06.11.2015, 00:19  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Новенький
Сообщений: 4
Репутация: 0   ±
Замечания:   ±
На сайте с 24.11.2011

Статус: Offline

Цитата vladh ()
Если Вам нужны прерывания по входу INT, то включите их(INTCON.4 = 1)
Они мне нужны но не всегда, допустим в какой то момент программы прерывания по входу INT необходимо запретить, пишем INTCON.4 = 0, но прерывания по INT продолжают происходить так как работающий таймер 1
Цитата anatol ()
При возврате из подпрограммыобработки прерывания, по команде RETFIE, бит GIE аппаратно устанавливается в'1' разрешая все немаскированные прерывания.
Пока как вариант нашел такое решение - в прерывании заодно проверять было ли оно разрешено If INTCON.1 = 1 And INTCON.4 = 1 Then и в обработке прерывания от таймера сбрасывать флаг от INT INTCON.1 = 0 иначе если нажатие INT случиться когда прерывание INT запрещено то при разрешении прерывания INT автоматом попадаем на прерывание INT так как INTCON.1 = 1 уже весит.
Собственно свою программу я переписал без применения INT в протеусе все работает как задумано, но интересен сам момент-нюанс, разобраться уяснить.
vladh Дата: Пт, 06.11.2015, 06:26  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата warstas ()
Они мне нужны но не всегда, допустим в какой то момент программы прерывания по входу INT необходимо запретить, пишем INTCON.4 = 0, но прерывания по INT продолжают происходить так как работающий таймер 1
Неправда. Если Вы запретите прерывания, в данном случае по INT, то программа будет переходить на обработку только разрешенных прерываний. В Вашем случае это TMR1.
Цитата warstas ()
Пока как вариант нашел такое решение - в прерывании заодно проверять было ли оно разрешено
 Можно и так делать. Т.е. не отключать обработку никаких прерываний, но в подпрограмме обаботке осуществлять проверку флагов произошедших прерываний. Это просто другой вариант решения задачи. Только нужно называть вещи своими именами. Переход на подпрограмму MYINT: - это переход на подпрограмму обработки всех(!) возникших (разрешенных) прерываний, а не так как Вы пишете "в обработке прерываний от таймера 1"

Сообщение отредактировал vladh - Пт, 06.11.2015, 06:27
  • Страница 1 из 1
  • 1
Поиск: