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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ivan_fd  
Подпрограмма прерывание выполняется постоянно
sandro37 Дата: Пн, 06.02.2012, 13:00  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 21
Репутация: 0   ±
Замечания:   ±
На сайте с 06.02.2012

Статус: Offline

камень 16f628a
Пытаюсь вникнуть в работу прерываний, в сети очень мало информации с примерами на PBP. Написал следующий код, в задумке он должен работать следующим образом: при запуске контроллера начинает мигать светодиод на выводе A2, а по нажатию кнопки на выводе B0, должен сменить свое состояние светодиод подключенный к выводу A3.
Code
TRISA = %00000000
PORTA = %00000000
TRISB = %11111111
PORTB = %00000000
Option_Reg.7=0
ON INTERRUPT GOTO myint ' При возникновении прерывания перейти на метку -  myint
INTCON = %10010000 ' Включить прерывание по выводу RB0    
main:
PORTA.2 = 1
Pause 500
PORTA.2 = 0     
Pause 500
goto main
DISABLE  ' Отключить обработку прерываний  
myint:
toggle PORTA.3  ' Включить/выключить LED при возникновении прерывания  
RESUME      ' Вернуться в основную программу  
ENABLE

но в Proteus происходит следующее: при запуске контроллера начинает мигать светодиод на выводе A2, а по нажатию кнопки на выводе B0, начинает мигать светодиод подключенный к выводу A3, как будто подпрограмма выполняется при каждом проходе основной программы. Где я не прав?
ЯНДЕКС Дата: 06.02.2012
ivan_fd Дата: Пн, 06.02.2012, 14:18  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Я думаю, что Вы забыли сбросить флаг прерывания. Почитайте о прерывании ПРЕРЫВАНИЕ
sandro37 Дата: Пн, 06.02.2012, 14:56  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 21
Репутация: 0   ±
Замечания:   ±
На сайте с 06.02.2012

Статус: Offline

Да, верно, вот так все заработало
Code

TRISA = %00000000
PORTA = %00000000
TRISB = %11111111
PORTB = %00000000
Option_Reg.7=0
ON INTERRUPT GOTO myint ' При возникновении прерывания перейти на метку -  myint
INTCON = %10010000 ' Включить прерывание по выводу RB0       
main:
PORTA.2 = 1
Pause 500
PORTA.2 = 0        
Pause 500
goto main
DISABLE  ' Отключить обработку прерываний     
myint:
toggle PORTA.3  ' Включить/выключить LED при возникновении прерывания    
INTCON = %10010000 ' сброс флага прерывания    
RESUME      ' Вернуться в основную программу     
ENABLE

Сообщение отредактировал sandro37 - Пн, 06.02.2012, 14:58
  • Страница 1 из 1
  • 1
Поиск: