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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: ivan_fd  
Форум Picbasic.ru » Программирование МК » PicBasicPro » Прерывание в pic basic
Прерывание в pic basic
198022alex Дата: Пн, 24.02.2014, 23:21  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 2
Репутация: 0   ±
Замечания:   ±
На сайте с 03.02.2014

Статус: Offline

Люди добрые,помогите с прерыванием в PICBASICе.Не могу разобраться как оно работает. sad Если не затруднит выложите примерчик,только не сложный.
ЯНДЕКС Дата: 24.02.2014
ADMIN Дата: Вт, 25.02.2014, 03:24  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

А прерывание от чего вас интересует? 
Вообще, смысл прерывания состоит в том, чтобы вовремя обработать какое-либо событие, хоть внешнее, ну по изменению состояния порта, хоть внутреннее, по таймеру, например. Источников прерывания может быть несколько. Все зависит от того, какие прерывания разрешены. Чтобы разобраться с самыми простыми прерываниями, следует разобраться с регистром INTCON, хотя бы в том же самом 16F628.

RBIF = INTCON.0 ' Флаг внешнего прерывания по PORTB.4-PORTB.7
INTF = INTCON.1 ' Флаг внешнего прерывания по PORTB.0(INT)
T0IF = INTCON.2 ' Флаг переполнения TMR0
RBIE = INTCON.3 ' Бит разрешения прерывания по PORTB.4-PORTB.7
INTE = INTCON.4 ' Бит разрешения прерывания по PORTB.0(INT) 
T0IE = INTCON.5 ' Бит разрешения прерывания по переполнению TMR0
PEIE = INTCON.6 ' Бит разрешения прерывания от периферийных устройств
GIE = INTCON.7  ' Бит глобального разрешения прерываний
                                                                   
Таким образом, устанавливая биты, разрешающие прерывание и при условии выполнения прерывания, программа переходит на вектор обработки прерывания. В подпрограмме обработки прерывания проверяются флаги, вызвавшие прерывание и выполняются какие-то действия.                                                                  

GIE = 1    ' Разрешение глобального прерывания
INTE = 1 ' Разрешение прерывания по изменению на входе INT0
                                                                   
ON INTERRUPT goto  Int_Label 'Здесь мы указываем программе, по какому адресу располагается обработчик прерывания.
Goto  MainProgram

Int_Label:  'Обработчик прерывания
If INTF = 0 then  'Проверка флага
    INTF = 1   'Сброс флага обязателен
ENDIF

Retfie

MainProgram:  'Основная программа

Goto MainProgram
HCT Дата: Пт, 17.10.2014, 21:54  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 3
Репутация: 0   ±
Замечания:   ±
На сайте с 05.10.2014

Статус: Offline

Здоровья всем! Меня тоже интересуют прерывания. В частности, прерывания по переполнению TMR0. Начал недавно осваивать PicBasicPro, хочу "изобрести" программу секундомера, таймера или чего-то в этом роде. С динамической индикацией разобрался (надеюсь), "изобрел" программки увеличения и уменьшения по опросу кнопки (могу выложить для критики). Осталось разобраться с прерываниями. Ни у Хелибайка, ни у Хилинского примеров нет, в даташите на 62х (у меня 628а) прерывания на ассемблере.
Уважаемый ADMIN, у Вас проверка флага (If INTF = 0 then) в обработчике прерываний. Но если прерывание произошло, значит флаг поднят? зачем его проверять? Если можно, то подробней, пожалуйста.
И еще. Можно вместо
GIE = 1               'Разрешение глобального прерывания
T0IE = 1              'Разрешение прерывания по переполнению таймера TMR0
сделать так
INTCON = %10100000       'Разрешить глобаные прерывания и прерывания по                                    'переполнению таймера TMR0
С уважением, НСТ.

Сообщение отредактировал HCT - Пт, 17.10.2014, 22:37
MiXaS Дата: Вс, 19.10.2014, 11:22  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата HCT ()
у Вас проверка флага (If INTF = 0 then) в обработчике прерываний. Но если прерывание произошло, значит флаг поднят? зачем его проверять?
Дело в том, что причин прерывания может быть несколько, как уже говорилось выше, это таймера, усарт, мssp, portb ....
если вы используете только одно прерывание, то проверять нет смысла, а если 2 и более, то нужно знать, какое событие привело в подпрограмму, так как подпрограмма одна, а причин может быть несколько.Для этого и проверяются флаги.Если флаг таймера, значит прибавить к переменной значение, если усарт, значит читать входной буфер и записывать в массив, если портб.0 значит еще что–то. 

Чтобы все работало, нужно понять принцип работы. Я уже описывал в подобной ветке достаточно подробно как работает прерывание.

Добавлено (19.10.2014, 11:22)
---------------------------------------------
Господа, Админ написал 2 замечательные статьи по поводу прерываний. Я Вам их даже нашел, изучаем...
http://www.picbasic.ru/publ....1-0-111
http://www.picbasic.ru/publ....1-0-112

ADMIN Дата: Пн, 20.10.2014, 04:15  |                                                                                                                Сообщение # 5
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Цитата HCT ()
Уважаемый ADMIN, у Вас проверка флага (If INTF = 0 then) в обработчике прерываний. Но если прерывание произошло, значит флаг поднят? зачем его проверять? Если можно, то подробней, пожалуйста.
Здесь, во-первых, я ошибся. Должно быть наоборот:
Int_Label:  'Обработчик прерывания 
If INTF = 1 then  'Проверка флага 
    INTF = 0   'Сброс флага обязателен 
ENDIF 
Retfie
По поводу вопроса - я считаю, что лучше его проверять в любом случае, так как, я уже по-моему, писал об этом, прерывание может быть вызвано другим источником. И лучше уточнить этот момент при входе в обработчик прерывания.
По второму вопросу - разумеется можно и так. Мне проще так - наглядней, где какой бит устанавливается и где сбрасывается, так как из ряда нулей и единиц сложнее выдернуть визуально какой точно бит установлен, а какой сброшен.
Partisan Дата: Чт, 28.05.2015, 09:33  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Новенький
Сообщений: 2
Репутация: 0   ±
Замечания:   ±
На сайте с 14.02.2015

Статус: Offline

Приветствую, Господа.
Прошу помощи.
Подскажите, как сделать, чтобы при попадании на ногу единички(5 вольт)  с другой ноги пропадала единичка, после нажатия кнопки ресет устройство снова взводилось.
Matrix252005 Дата: Чт, 28.05.2015, 09:53  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 636
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Приятного времени суток!!!

Цитата Partisan ()
Прошу помощи.
....
Ну например так:

Если "нога" = 1 значит
         другая нога = 0
конец если

А по другому:

If portX.x = 1 then
    portX.x = 0
End If

Насчет "ресета" не понял...


THE TRUTH IS OUT THERE.

С уважением, Николай.
terrarus Дата: Чт, 28.05.2015, 10:35  |                                                                                                                Сообщение # 8
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 17   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Matrix252005, мне кажется, что Partizan всех нас пытается тролить, он описывает логику работы простого RS триггера.

Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Matrix252005 Дата: Чт, 28.05.2015, 10:44  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 636
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Возможно...

Человек попросил помощи, "мы" ему не отказали как на других форумах, а вот что он именно хотел сказать своим постом, тут либо пусть конкретно опишет что он имел ввиду, либо....


THE TRUTH IS OUT THERE.

С уважением, Николай.
MiXaS Дата: Чт, 28.05.2015, 11:29  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата Matrix252005 ()
If portX.x = 1 then     portX.x = 0
End If
Можно так, а можно Нога_1 = ~ Нога_2

Добавлено (28.05.2015, 11:29)
---------------------------------------------

Цитата MiXaS ()
Можно так, а можно Нога_1 = ~ Нога_2
Блин, не отображает символ "переменный ток" или буква Ё на английском.
Partisan Дата: Чт, 28.05.2015, 12:11  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Новенький
Сообщений: 2
Репутация: 0   ±
Замечания:   ±
На сайте с 14.02.2015

Статус: Offline

Уважаемые, просто только начал изучать пикбейсик, прошу прощения за банальщину, многое еще не понятно, не изза того чт оне умею читать инструкции, а не знаю как тот или иной способ называется, не кому направить в нужное русло.
варганю на кухню приборчик для пенсионера бабушки, она постоянно забывает газ выключать. да бы не лучилось беды,решил сделать датчик утечки газа, благо есть доступ к калибровочным воздушным смесям, чтобы откалибровать датчик метана.
ТЗ такое.
Имеем клапан электро, нормально закрытый.
схема, клапан постоянно под напряжением, т.е. открыт, управляется ногой пика N
имеем датчик газа., реагирует на утечку газа.
он выдает какой то диапазон напряжений t при достижении величны x   мне нужно, чтобы на ноге N  напряжение стало = 0. т.е .лог ноль.
if t=x then т=x.
Но мне нужна кнопка, чтобы можно было сбросить алгоритм, думаю банального ресета хватит.или просто можно прерывать питание.
ЯНДЕКС Дата: 28.05.2015
Matrix252005 Дата: Чт, 28.05.2015, 12:22  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 636
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Partisan, во-первых, если Вы только начинаете изучать, то лучше сразу начните с PROTON IDE, уже не однократно писалось на нашем форуме, что РВР это уже даже не вчерашний день!!!
Во-вторых, если Вы начинаете изучать МК, то не проще изучать с нуля, а не пытаться браться за то, что Вы еще не знаете, проще говоря (не примите за оскорбление!!!), если Вы не умеете ползать, то как Вы начнете летать???

Научитесь для начала мигать светиком, потом управлять кнопками, экраном и т.д...

Если хотите помощи в написании программы, то хотя бы выложите какой то проект (схему, наброски кода (не тупой набор команд, а что то похожее на программу)). Мы Вам укажем на ошибки и направим на верный путь.

Если хотите, чтобы мы разработали схему, программу, то тут на форуме есть отдельная ветка, называется: "Заказы".


THE TRUTH IS OUT THERE.

С уважением, Николай.
Gysmi Дата: Вт, 02.06.2015, 19:35  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 48
Репутация: 0   ±
Замечания:   ±
На сайте с 23.12.2011

Статус: Offline

Только могу добавить по техзаданию-делай искробезопасно,никаких реле не используй.
Max_Ostin Дата: Сб, 24.02.2018, 21:35  |                                                                                                                Сообщение # 14
Группа: Пользователи
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 29.10.2017

Статус: Offline

Вижу что, последнее обновление было в далёком 2015. Но всё таки хочется узнать мнение форума.
Как компилируется программы с прерываниями, а именно когда есть строка on interrupt goto.
Недавно мне потребовалось устройство которое при включении питания отсчитывало поминутные интервалы времени и в определённые промежутки времени выставляло или снимало сигналы на порт.
Выбор пал на 16f84а и решил счётчик времени сделать по прерываниям по переполнению таймера TMR0. Но при компиляции (у меня MPLAB v8.92 с интегрированным PBP v2.46) оказалось, что он не задействовал аппаратные возможности пика, а вместо настоящих прерываний создал некое программное подобие прерываний.
ля начала написал простую прогу: (смотрите рис1)

Компилируем и открываем хекс файл в WinPic800.
С помощью встроенной утилиты Дизассемблера смотрим что у нас получилось.(смотрите рис2)
О ужас!!! Компилятор не только не воспользовался аппаратными возможностями
самого Пика. Он создал сташное подобие программного эмулятора прерываний.
Рассказываю подробно:

1 В месте где должен находится вектор прерывания (0004h) даже не стоит
retfie (0009h) а просто return (0008h).

2 В начале программы разрешаются глобальные прерывания:
0x000B : 0x178B   bsf     0x0B , 7

3 Далее
0x000C : 0x2810   goto    0x10

...........

0x0010 : 0x200D   call    0x0D

4 Он начинает через определённые промежутки по ходу программы переходить
на подпрограмму:
call    0x0D, которая состоит из трёх строк:

0x000D : 0x1B8B   btfsc   0x0B , 7
0x000E : 0x0008   return
0x000F : 0x281C   goto    0x1C

Если 7 бит регистра Intcon установлен в 1, то следующую комманду пропустить.
Третья строка (goto 0x1C), это сам переход на подпрограмму обработки прерываний.
Этот переход часто втречается в теле всей программы. Он даже стоит в самой подпро-
грамме обработки прерываний. Она (call 0x0D) и есть само прерывание!?
Точно так же компилируют все бесплатные версии PBP и PBP3, а так же микробасик.
Протон не захотел компилировать, потребовал регистрацию. Это так специально
сделанно для бесплатно распространяемых ? Или есть ли нормальные компиляторы (бесплатно
распространяемые)? Или что-то ещё?
P.S. прошу прощения за ляпы в статье...
Прикрепления: 5542013.png (9.7 Kb) · 7053012.png (15.0 Kb)

Сообщение отредактировал Max_Ostin - Сб, 24.02.2018, 21:37
ADMIN Дата: Пн, 26.02.2018, 03:14  |                                                                                                                Сообщение # 15
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Попробуйте On_Interrupt goto. Есть компилятор Proton, альтернативный PBP.
Форум Picbasic.ru » Программирование МК » PicBasicPro » Прерывание в pic basic
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: